From 354dbf332e9bd25ebde93d274c8b5f24b6ab8bc6 Mon Sep 17 00:00:00 2001 From: Profish <93366432+profishional@users.noreply.github.com> Date: Fri, 3 Feb 2023 12:42:36 +1100 Subject: [PATCH] [Documentation] Python Automation script and workflow for github wiki (#419) ## Description ### Motivation Create a [GitHub wiki](https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis) (a separate git repo relative to this repo) for the documentation across this GitHub repo. GitHub wikis have better visibility and navigation for users. ### Background GitHub wikis lack version control and are entirely separate relative to this source repository. To solve both of these issues, we use the documentation/markdown files from the main repo to update the Github wiki repository. To maximize the benefit of the wiki, a hierarchical view is created in a sidebar. However, the mapping of the markdowns files to the sidebar poses some challenges. The PR is an attempt at a very simple solution. A GitHub action that tracks changes to a set of files and triggers a python script. The script picks up pre-written comments in the set of files to generate a sidebar. From the sidebars linking reference, it copies over the files from the main repo to the wiki repo. ### Pre-Requisites to Merge this in - [ ] Create a repository secret. Based on the legacy access rules, tick the `repo` permission box. ### Outstanding issues - [ ] Improve the format of the sidebar, so categories don't repeat. Rolling the main README of a category into the category heading so that the heading is also a link and not just text. - [ ] Change the internal links of the Markdown files in the wiki to point to other paths in the wiki by either: 1. A regex change to the current wiki file names (aka wiki titles) 2. Changing the wiki file mapping to align with the internal links. ## Issue Fixes #133 Remaining/new issues ## Type of change Please mark the relevant option(s): - [x] New feature, functionality or library - [ ] Bug fix - [x] Code health or cleanup - [ ] Major breaking change - [x] Documentation - [ ] Other ## List of changes - (Apologies in advance) Some formatting changes from auto linting of markdowns files. I don't like this as it has blown out the diff. I can try to remove if it's too messy. - Added a GitHub action that tracks change to `.md` files, sets env variables and runs a python script - Added a python script in a new directory called tools. Finds the path of `.md` files, maps them to the specified format described in the files, generates a GitHub wiki sidebar file and respective wiki files. Pulls the current wiki, syncs the files and pushes them. - Added comments at the bottom of `.md` files found from `find . -name "*.md" | grep -v -e "vendor" -e "app"` in the form of ``. - Brief description of maintaining the wiki format comment in the `docs/development/readme` - Brief mention and linking to the wiki in the main readme. ## Testing - [ ] `make develop_test` - [ ] [LocalNet](https://github.com/pokt-network/pocket/blob/main/docs/development/README.md) w/ all of the steps outlined in the `README` d Screenshot of output from example wiki on a personal fork: [example wiki](https://github.com/profishional/pocket/wiki) image ## Required Checklist - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have tested my changes using the available tooling - [ ] I have updated the corresponding CHANGELOG ### If Applicable Checklist - [x] I have updated the corresponding README(s); local and/or global - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have added, or updated, [mermaid.js](https://mermaid-js.github.io) diagrams in the corresponding README(s) - [ ] I have added, or updated, documentation and [mermaid.js](https://mermaid-js.github.io) diagrams in `shared/docs/*` if I updated `shared/*`README(s) --- Co-authored-by: Daniel Olshansky Co-authored-by: Dmitry Knyazev Fixes https://github.com/pokt-network/pocket/issues/133 --- .github/workflows/wiki_sync_process.yml | 24 ++++ README.md | 6 +- build/config/README.md | 2 + consensus/doc/CHANGELOG.md | 2 + consensus/doc/PROTOCOL_STATE_SYNC.md | 2 + docs/contributing/README.md | 2 + docs/demos/iteration_3_end_to_end_tx.md | 2 + docs/deps/README.md | 2 + docs/development/FAQ.md | 2 + docs/development/README.md | 26 ++++ docs/learning/README.md | 2 + docs/releases/README.md | 2 + docs/roadmap/README.md | 2 + p2p/CHANGELOG.md | 2 + p2p/README.md | 2 + persistence/docs/CHANGELOG.md | 2 + persistence/docs/PROTOCOL_STATE_HASH.md | 2 + persistence/docs/README.md | 4 +- persistence/indexer/doc/README.md | 6 +- rpc/doc/CHANGELOG.md | 2 + rpc/doc/README.md | 2 + runtime/docs/CHANGELOG.md | 2 + runtime/docs/README.md | 2 + shared/CHANGELOG.md | 2 + shared/README.md | 2 + shared/docs/PROTOCOL_STATE_HASH.md | 2 + shared/docs/flows/README.md | 2 + shared/modules/doc/CHANGELOG.md | 2 + shared/modules/doc/README.md | 4 +- telemetry/README.md | 2 + tools/images/folder.png | Bin 0 -> 24509 bytes tools/images/sidebar.png | Bin 0 -> 19460 bytes tools/images/sidebar_format.png | Bin 0 -> 37935 bytes tools/wiki_sync.py | 178 ++++++++++++++++++++++++ utility/doc/CHANGELOG.md | 2 + utility/doc/PROTOCOL_RELAY.md | 4 +- utility/doc/PROTOCOL_SESSION.md | 2 + utility/doc/README.md | 4 +- 38 files changed, 301 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/wiki_sync_process.yml create mode 100644 tools/images/folder.png create mode 100644 tools/images/sidebar.png create mode 100644 tools/images/sidebar_format.png create mode 100644 tools/wiki_sync.py diff --git a/.github/workflows/wiki_sync_process.yml b/.github/workflows/wiki_sync_process.yml new file mode 100644 index 000000000..d1f7a7bf5 --- /dev/null +++ b/.github/workflows/wiki_sync_process.yml @@ -0,0 +1,24 @@ +name: Publish docs to Wiki + +on: + push: + branches: + - main # 1. When changes are merged to the main branch + paths: + - '**/*.md' # 2. It detects changes to Markdowns files in the repository + +env: # 3. Set variables which the Python script uses for git commands + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # TODO_IN_THIS_COMMIT: provision repo secret through Pocket account + USER_NAME: + USER_EMAIL: + OWNER: ${{ github.event.repository.owner.name }} + REPOSITORY_NAME: ${{ github.event.repository.name }} + +jobs: + publish_docs_to_wiki: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Generate and push Wiki + run: | # 4. Runs a python script that uploads md files to Pocket Github Wiki + python tools/wiki_sync.py diff --git a/README.md b/README.md index 003170e61..c15e87be5 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,9 @@ The official implementation of the [V1 Pocket Network Protocol Specification](ht --- -All the links you'll need are listed below. If you'd like to contribute to the Pocket V1 Protocol, start by: +Some relevant links are listed below. Refer to the complete ongoing documentation at the **[Pocket GitHub Wiki](https://github.com/pokt-network/pocket/wiki)**. + +If you'd like to contribute to the Pocket V1 Protocol, start by: 1. Get up and running by reading the [Development Guide](docs/development/README.md) 2. Find a task by reading the [Contribution Guide](docs/contributing/README.md) @@ -72,3 +74,5 @@ All the links you'll need are listed below. If you'd like to contribute to the P ## License This project is licensed under the MIT License; see the [LICENSE](LICENSE) file for details. + + diff --git a/build/config/README.md b/build/config/README.md index e1e5a18ff..383696015 100644 --- a/build/config/README.md +++ b/build/config/README.md @@ -47,3 +47,5 @@ The config and genesis files located in the `./build/config/` directory are need These builds currently expect four (validator) `config.json` file and a single `genesis.json` file. Until #186 is implemented, take caution when overwriting / deleting the files with different configurations. + + diff --git a/consensus/doc/CHANGELOG.md b/consensus/doc/CHANGELOG.md index 3b471e81a..40ae941ed 100644 --- a/consensus/doc/CHANGELOG.md +++ b/consensus/doc/CHANGELOG.md @@ -191,3 +191,5 @@ General - Benchmarking via `make benchmark_sortition` - VRF Wrapper library in `consensus/leader_election/vrf/` of github.com/ProtonMail/go-ecvrf/ecvrf - Implementation of Algorand's Leader Election sortition algorithm in `consensus/leader_election/sortition/` + + diff --git a/consensus/doc/PROTOCOL_STATE_SYNC.md b/consensus/doc/PROTOCOL_STATE_SYNC.md index 1b4df358f..2c6b0bced 100644 --- a/consensus/doc/PROTOCOL_STATE_SYNC.md +++ b/consensus/doc/PROTOCOL_STATE_SYNC.md @@ -396,3 +396,5 @@ Aptos follow an **async "fire-and-forget"** pattern as can be seen [here](https: - A detailed list of the type of requests Chia uses for communication between peers - [https://docs.chia.net/node-syncing](https://docs.chia.net/node-syncing) - An explanation of the configurations Chia exposes for node synching + + diff --git a/docs/contributing/README.md b/docs/contributing/README.md index 9c6cf50ca..1c60922f6 100644 --- a/docs/contributing/README.md +++ b/docs/contributing/README.md @@ -9,3 +9,5 @@ Once V1 is closer to mainnet launch, we will have an [extensive contribution gui ![](./badge.png) 3. Collaborate with the team and other core contributors on Discord in the [#v1-dev channel](https://discord.com/channels/553741558869131266/986789914379186226) or [#v1-research channel](https://discord.com/channels/553741558869131266/936666517498650644). + + diff --git a/docs/demos/iteration_3_end_to_end_tx.md b/docs/demos/iteration_3_end_to_end_tx.md index 873835ec4..a5de58019 100644 --- a/docs/demos/iteration_3_end_to_end_tx.md +++ b/docs/demos/iteration_3_end_to_end_tx.md @@ -163,3 +163,5 @@ go run app/client/*.go --path_to_private_key_file=/tmp/val2.json Account Send 67 ```bash make swagger-ui ``` + + diff --git a/docs/deps/README.md b/docs/deps/README.md index 34c0eb39d..5f44c5582 100644 --- a/docs/deps/README.md +++ b/docs/deps/README.md @@ -48,3 +48,5 @@ This is okay in the case of Pocket's Leader Election Algorithm because the seed 2. The network leverages consensus messages to distribute the keys throughout the network in `O(N)` 3. The VRF keys begin to be used for leader election at some `height (N+M)` where `M > 0` 4. The input to the VRF for each `height (N+M')` where `M' ≥ M` will use publicly known information (e.g. appHash, byzValidators, etc..) known at `height (N+M'-1)` and therefore satisfy the security notice above. + + diff --git a/docs/development/FAQ.md b/docs/development/FAQ.md index 25e5376d3..1c323072c 100644 --- a/docs/development/FAQ.md +++ b/docs/development/FAQ.md @@ -42,3 +42,5 @@ sudo chcon -Rt svirt_sandbox_file_t ./pocket ``` See [this stackoverflow post](https://stackoverflow.com/questions/24288616/permission-denied-on-accessing-host-directory-in-docker) for more details. + + diff --git a/docs/development/README.md b/docs/development/README.md index cf0017289..6a2a263aa 100644 --- a/docs/development/README.md +++ b/docs/development/README.md @@ -231,6 +231,30 @@ Pocket └── Makefile # The source of targets used to develop, build and test ``` +## Maintaining Documentation + +Documentation files currently found by the following command `find . -name "*.md" | grep -v -e "vendor" -e "app"` are added to the [Github Wiki Repository](https://github.com/pokt-network/pocket/wiki). The Wiki will be improved overtime but in its current form, provides an organized overview of the Repository. + +To keep the Wiki organized, a comment is added at the end of each `.md` file. For example, you can find the following one at the end of this file ``. The structure of the comment indicates the category (guides), subcategory(ies) (development) and filename (readme): ` diff --git a/docs/learning/README.md b/docs/learning/README.md index 8914e078e..8aedc7c17 100644 --- a/docs/learning/README.md +++ b/docs/learning/README.md @@ -218,3 +218,5 @@ We do not consider them bad, but time is limited so it is important to focus on - [Blockchains Meet Distributed Hash Tables: Decoupling Validation from State Storage](https://arxiv.org/abs/1904.01935) - An "extended abstract" of how Authenticated Data Structures (i.e. Merkle Trees) could be _"sharded"_ across nodes using Distributed Hash Tables (DHTs) to reduce the state required to be maintained and synched by each node. + + diff --git a/docs/releases/README.md b/docs/releases/README.md index 17f5b12f5..75dc6a6fa 100644 --- a/docs/releases/README.md +++ b/docs/releases/README.md @@ -43,3 +43,5 @@ Extended images with additional tooling are built to aid in troubleshoot and deb ## [TODO] Magefile build system Once the V1 implementation reaches the stage of testable binaries, we are looking to use [Mage](https://magefile.org/) which is being tracked in [pocket/issues/43](https://github.com/pokt-network/pocket/issues/43) that'll inject a version with the `-version` flag. + + diff --git a/docs/roadmap/README.md b/docs/roadmap/README.md index ea1cd2795..3be53b063 100644 --- a/docs/roadmap/README.md +++ b/docs/roadmap/README.md @@ -103,3 +103,5 @@ gantt ## M7. Pocket NoS (North Star) Shoot for the ✨ and we will land on the 🌕 + + diff --git a/p2p/CHANGELOG.md b/p2p/CHANGELOG.md index 67677fc9e..cd1acdbbe 100644 --- a/p2p/CHANGELOG.md +++ b/p2p/CHANGELOG.md @@ -131,3 +131,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [0.0.0.0] - 2022-06-16 - RainTree first iteration in Pre2P module (no cleanup or redundancy) + + diff --git a/p2p/README.md b/p2p/README.md index 2432ef2f5..a62937ff6 100644 --- a/p2p/README.md +++ b/p2p/README.md @@ -124,3 +124,5 @@ You can read the documentation in the [python simulator](https://github.com/pokt - **Deterministic Private Key Generation**: Since RainTree is dependant on the lexicographic order of the addresses, the generation of the private keys (and in turn the public keys and addresses) is important and cannot be randomized for the time being. - **Variable Coupling**:There is an implicit coupling between `validatorId`, `serviceUrl` and `genericParam` that requires understanding of the codebase. Reach out to @olshansk or @andrewnguyen22 for clarity on this. + + diff --git a/persistence/docs/CHANGELOG.md b/persistence/docs/CHANGELOG.md index ea362541e..18b007530 100644 --- a/persistence/docs/CHANGELOG.md +++ b/persistence/docs/CHANGELOG.md @@ -284,3 +284,5 @@ Pocket Persistence 1st Iteration (https://github.com/pokt-network/pocket/pull/73 - Update to the Persistence module interface to enable historical height queries - Library / infrastructure for persistence unit fuzz testing - Tests triggered via `make test_persistence` + + diff --git a/persistence/docs/PROTOCOL_STATE_HASH.md b/persistence/docs/PROTOCOL_STATE_HASH.md index 964eba1d9..5633208a8 100644 --- a/persistence/docs/PROTOCOL_STATE_HASH.md +++ b/persistence/docs/PROTOCOL_STATE_HASH.md @@ -136,3 +136,5 @@ _TODO: If an error occurs at any step, all of the operations must be reverted in ## Failed Commitments TODO: Failed commitments and the implementation of rollbacks is tracked in #327 and #329. + + diff --git a/persistence/docs/README.md b/persistence/docs/README.md index 19bc72381..0c295624a 100644 --- a/persistence/docs/README.md +++ b/persistence/docs/README.md @@ -225,7 +225,7 @@ Short-term (i.e. simpler starter) tasks: - [ ] DOCUMENT: Need to do a better job at documenting the process of paused apps being turned into unstaking apps. - [ ] CLEANUP: Remove unused parameters from `the PostgresContext` interface (i.e. see where \_ is used in the implementation such as in `InsertFisherman`) - [ ] IMPROVE: Consider converting all address params from bytes to string to avoid unnecessary encoding -- [ ] CLEANUP(https://github.com/pokt-network/pocket/issues/76): Review all the `gov_*.go` related files and simplify the code +- [ ] CLEANUP(#76): Review all the `gov_*.go` related files and simplify the code - [ ] REFACTOR/DISCUSS: Should we prefix the functions in the `PersistenceModule` with the Param / Actor it's impacting to make autocomplete in implementation better? - [ ] DISCUSS: Consider removing all `Set` methods (e.g. `SetAccountAmount`) and replace with `Add` (e.g. `AddAccountAmount`) by having it leverage a "default zero". - [ ] REFACTOR(https://github.com/pokt-network/pocket/issues/102): Split `account` and `pool` into a shared actor (e.g. like fisherman/validator/serviceNode/application) and simplify the code in half @@ -242,3 +242,5 @@ Long-term (i.e. design) tasks - [ ] INVESTIGATE: Expand the existing fuzzing approach to push random changes in state transitions to its limit. - [ ] INVESTIGATE: Use a DSL-like approach to design complex "user stories" for state transitions between protocol actors in different situations. + + diff --git a/persistence/indexer/doc/README.md b/persistence/indexer/doc/README.md index 45c1fd70d..3defe120a 100644 --- a/persistence/indexer/doc/README.md +++ b/persistence/indexer/doc/README.md @@ -9,8 +9,10 @@ | HASHKEY | `h/SHA3(TxResultProtoBytes)` | TxResultProtoBytes | store value by hash (the key here is equivalent to the VALs below) | | HEIGHTKEY | `b/height/txIndex` | HASHKEY | store hashKey by height | | SENDERKEY | `s/senderAddr` | HASHKEY | store hashKey by sender | -| RECIPIENTKEY | `r/recipientAddr` | HASHKEY | store hashKey by recipient (if not empty) +| RECIPIENTKEY | `r/recipientAddr` | HASHKEY | store hashKey by recipient (if not empty) ## ELEN Index -The height/txIndex store uses [ELEN](https://github.com/jordanorelli/lexnum/blob/master/elen.pdf). This is to ensure the results are stored sorted (assuming the `KVStore` uses a byte-wise lexicographical sorting). \ No newline at end of file +The height/txIndex store uses [ELEN](https://github.com/jordanorelli/lexnum/blob/master/elen.pdf). This is to ensure the results are stored sorted (assuming the `KVStore` uses a byte-wise lexicographical sorting). + + diff --git a/rpc/doc/CHANGELOG.md b/rpc/doc/CHANGELOG.md index 7cac8ca97..9baf6cdd1 100644 --- a/rpc/doc/CHANGELOG.md +++ b/rpc/doc/CHANGELOG.md @@ -48,3 +48,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Spec: basic Openapi.yaml - Codegen: code generation for the Server + DTOs - Codegen: code generation for the Client + + diff --git a/rpc/doc/README.md b/rpc/doc/README.md index 11eca4a09..fb3b6db4f 100644 --- a/rpc/doc/README.md +++ b/rpc/doc/README.md @@ -109,3 +109,5 @@ Definitely we'll need ways to retrieve transactions as well so we can envisage: └── v1 └── openapi.yaml # OpenAPI v3.0 spec (source for the generated files above) ``` + + diff --git a/runtime/docs/CHANGELOG.md b/runtime/docs/CHANGELOG.md index 6d6c0457d..ed2aaf1da 100644 --- a/runtime/docs/CHANGELOG.md +++ b/runtime/docs/CHANGELOG.md @@ -70,3 +70,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Modules now accept `interfaces` instead of paths. - Unmarshalling is done in a new `runtime` package (runtime because what we do in there affects the runtime of the application) - We are now able to accept configuration via environment variables (thanks to @okdas for inspiration and [sp13 for Viper]("github.com/spf13/viper")) + + diff --git a/runtime/docs/README.md b/runtime/docs/README.md index 5ad31181f..2c1f9987c 100644 --- a/runtime/docs/README.md +++ b/runtime/docs/README.md @@ -47,3 +47,5 @@ This module includes the following components: Clock is a drop-in replacement for some of the features offered by the `time` package, it acts as an injectable clock implementation used to provide time manipulation while testing. By default, the **real** clock is used and while testing it's possible to override it by using the "option" `WithClock(...)` + + diff --git a/shared/CHANGELOG.md b/shared/CHANGELOG.md index b6c0252b0..83fe46a1e 100644 --- a/shared/CHANGELOG.md +++ b/shared/CHANGELOG.md @@ -131,3 +131,5 @@ Configs: - Shared interfaces and general 'base' configuration located here - Moved make client code to 'debug' to clarify that the event distribution is for the temporary local net - Left multiple `TODO` for remaining code in test_artifacts to think on removal of shared testing code + + diff --git a/shared/README.md b/shared/README.md index dbe312a6e..58938f471 100644 --- a/shared/README.md +++ b/shared/README.md @@ -85,3 +85,5 @@ Intentionally left blank for now. Reach out to the team if you have questions. ## Interfaces Intentionally left blank for now. Reach out to the team if you have questions. + + diff --git a/shared/docs/PROTOCOL_STATE_HASH.md b/shared/docs/PROTOCOL_STATE_HASH.md index e7c3e4d52..a495ed6ed 100644 --- a/shared/docs/PROTOCOL_STATE_HASH.md +++ b/shared/docs/PROTOCOL_STATE_HASH.md @@ -173,3 +173,5 @@ sequenceDiagram %% Validate the computed hash C->>C: Compare local hash
against proposed hash ``` + + diff --git a/shared/docs/flows/README.md b/shared/docs/flows/README.md index cb4e5d663..e3054e725 100644 --- a/shared/docs/flows/README.md +++ b/shared/docs/flows/README.md @@ -1,3 +1,5 @@ # Flows The purpose of [shared/flows](./) is to document cross-module communication for end-to-end behaviour that has cross-module dependencies and and depends on the interfaces exposed by the interfaces exposed in [shared/modules](../modules). + + diff --git a/shared/modules/doc/CHANGELOG.md b/shared/modules/doc/CHANGELOG.md index 84f2420df..e0c000406 100644 --- a/shared/modules/doc/CHANGELOG.md +++ b/shared/modules/doc/CHANGELOG.md @@ -88,3 +88,5 @@ UtilityModule - Deprecated old build files - Use new config and genesis files for make compose_and_watch - Use new config and genesis files for make client_start && make client_connect + + diff --git a/shared/modules/doc/README.md b/shared/modules/doc/README.md index 19c652af8..adc964b82 100644 --- a/shared/modules/doc/README.md +++ b/shared/modules/doc/README.md @@ -103,4 +103,6 @@ err := newModule.Stop() if err != nil { // handle error } -``` \ No newline at end of file +``` + + diff --git a/telemetry/README.md b/telemetry/README.md index cb9e792e0..515de7419 100644 --- a/telemetry/README.md +++ b/telemetry/README.md @@ -194,3 +194,5 @@ const NODES_ALIVE_COUNTER_TIME_SERIES_DESCRIPTION = "Number of nodes online" ``` This makes referencing the metrics easier, and makes it easy to change the name of the metric later on, in addition to the fact that it gathers metric definitions in a single file. + + diff --git a/tools/images/folder.png b/tools/images/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9aab8d97a4c309fd308006468bc4a548ad8c20 GIT binary patch literal 24509 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 F{{b?CL-_yz literal 0 HcmV?d00001 diff --git a/tools/images/sidebar.png b/tools/images/sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..9f3e31483771fefc85a5543be00fa6eaf35eef7c GIT binary patch literal 19460 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ℜFHkQg`5 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 Hu0mjf`*m|3 literal 0 HcmV?d00001 diff --git a/tools/images/sidebar_format.png b/tools/images/sidebar_format.png new file mode 100644 index 0000000000000000000000000000000000000000..33864da29c23a0828f382e23c953bce115df15e1 GIT binary patch literal 37935 zcmZU*1z1#3*9J-o(%p@8GjxZ5NH-|m2vS3LqaY#OLr4kIDh&dI#L!4dcS)xVa1Z!> z|Nq~6eV%zZGbi>r>+HSOyWaIK-)pKXVPjBWARr)ME5CTIjevld1$@rtU2GkkY!DDwKYAugs>mS{MbS>M!fFbbSY7R(Rz44Bu;(p!$Js;l znW@TPqBG(5c@*kxWImIX^dbB<&0aQ5PdB}W&Bw4{3bW=Zt6rT;*6BD4E+t0Pp?QvFdnMOFwppIn1tu4IUebuKo>`h_3KE9`me#j1RJK)9 zLtqEC(Gd`%9S~4}Ekxi$0elb;kdvYi(15=Lz~^~B(tr0NX5}OQ&$jBrfwDUC%F4iB z9V>Sm8)vY+i$}`~iC@5_rW|w)Jq*=U#jIT3a$8utSlV#=ymfsz1wq0`4A^{Y<6%MP z^VZ23EaoH0@OXq6u>J5e4+GufAs&vB42Ei&bn-6lHgrPVyxhDDQW$h}bQ12?wqn}P z75{TO@J*7z-owLHjEBeD+nd`P#O>m4$HONoD$2vl&%@8p1suTz_I38K@ZoX>Gyc2C zf3Nf025jZ-;OgPv;!O8&T?6bQsG@p%0IZ_odZ_rxdnE>$77-C|XpAVD2Ok;?US;0-q3oTJY8eV+ zp`{#*4DUI#ri2)8Os_Kpv+NxPEBc%JbDGN8ymk|C>DC1-*Z)v-1T?Ymi@4*UO6OR7 z5Jmq(3`0ITD^g4dgXS}oG%oE{iZB2DfeyW_aEw$IUlWB0Q6aw!ee$KkDU{SKgH5MI z7lFH693Kup9kK0CVj^Ds{1iv}?yAW5bV!)PTCm(d5`FUVyigSMPgVB4s+rCg?RQf3 z@*U!Y){G|A@=;iPq-FtbkuQ=PgRfSiZP((2g@&?)g*mDk3w?nv>^?cg`P88`OBcQwsUyJ=y5C76uZ1Gs${-bEx-oZR!5*`}IM~A;xg@6Wzxr6~lX> zH#Yg&!uM2hX#!T8JEyN?q^$xzUWIP{GB6XozYM--adU3oDY2~|5=uVJc4?oj{5JRI zq-7=^cFSRc zEMA7(jTdu{&>@^lRDEUJgXB##+JM9+FBatm6A?-F$9aa1G?*UOtHQ^)SJmR|gB*)8pP2p!(T4rn?|gT|xV+bujNg8gPNyR%P}EzAJ4?WU!MR6gc7B-H zz}Nzq5FDp7RtcH0+|7Lfz`EEx48CuPn3h(M0Y)1@4AtGTA1IJJ4_oWcbnkAK?kU6@Y^3h4tm=O|x9DX(lce<%QJ*sPe_Oxc^*b{`>Th3z z)2ud;ycC#&wbNCiN2$Hp>koTOln1kF#&XhF(c?%Y`R3@|~`-U)D2aNlcr z4>r;@&Z$)x-6c2Mp-y1}6RC_JiS5!pjc=OzE98203RCrvyCrKc&ld_e!v5`XcM7@B z=uc)TEqX6m%h|GDM?R2QLkjVqNeFziqT=xW{(1{yoL9RQ2jUE=O)jfq17 z4Xaa&n-yHBD+V2|?yUx1@ULi@&oRu#AGDICKtuOaJ@CNu@jv>2&)FMlzd3Mhho7i` z9H%(LCDT>7o1P_qp^@|>gFj~~_ZJATnLf&Zl5=(kVRhWy-q;mxPgg^B7Ta1<5IG>M zs#}Q*C6fpxK za)*p`v_KB=6+#O`S424(mEu!Wh|pt@^zE2;XoKNy1#Pkp+7?#K2#U5Z1hWMlnR9G2 zD9T{-Av_DNG+kR#_t%?*r%zKp26Q2Q?`O{Lb6afn-Rx(9q?}ND%~-hi2nfZXnu?Hp z=A%LTrIEtIozpQeyu&5?jw1Eb!Pt@C7r^d%@^qdGAiFy`@O&bEiOaO)kp9qg)vE)7 zC|i-O)mR>qE*19LL7om{`>WhlWipdDi{&yapxBstEBTENg`sQ|ZeYBlbWsor>{jzB zcs*Lz*10pi3MKyf^jafn#I<1^e7%t_43jppay)SY+(+pL(o$Vk9tRoQ&kyVRD{iQ6 z^l*?#YY&z8Pjv9S`X9A)uP-m-Nm8yamx4P)H&S$9T1wP5iXX@<=%AI(1zny4j0UE3 z&`%1(qZxY(>y}nkuz8vGoo0!RJ!uE2_YeyhaH1KEr<4Cr%CpODw-8(<;)ewji2mub zeQ)r^*UXc1PVhOQRnKz-TO=v?8?Sy%tE#Xxw}}!po2w{gPe+m_>z&e%qs8f_Z>~Oi zb9x@s4RR9~VjJ{DW>A*lSs>zEuY;(#rsT|>xbdY6VZPje7k4nZo1n6Kt6PT8H%0ztF?qKLQ*by?Mr)~HhtjM zn&W^KyE!N-ojEkz((e?!LpQOKB)fU{ojHxT8NhiT7k0)}ncSj-u~z#whq4Em<;!#p z-6>0&-}joq92=qe?<|tv=xyYBFY*D<#w^l4soCJ24D|!zRA)^5Txevq5w$scs?G~J zJG5~Yu{8rvfU7g5?_ec8Jg9R}0m9J=10JilKl^Bi{0QSHg}D_zwmRf5t4m#59|pD+ zJO&NVhYLCAx+v7IETuX3{BGFEvSiLrnG%Y9%N#;qXTZhC*D{Z9h;A;VSjoq|#tOf= z_`~7sWWPUIo;-RZpNqRwO6Udm1_0WD?8qvsQRT5f!L;3_#HXwT$%_mW1auoG@|JlCK;`e+n= zHtR4W?uO1e*?!}eo-ES}wP8u~ zIJPQ>Ll?#eQPOBwG9>-I%!&2Qi8C5q0AxfkqC^`=G_!E@gW7wZ{=h3eAcRR>+>F2w zN`yrtVK{$XPi2X?(p3jwuP6GosA-ittF+=?mGc+S5jF8cqJX0xXe;*X68{6NcLk8j z>xHLZ2Z`3d-aG%3I7_>kTW&TuI_o}|7R6aRV~b=voWmxh7cfUtB}n#eg|)jT{mW#e z^G3sjI%tZs4uuiN{_G>6x`?bF54E_L03nNd3JpP;tck?yw_j7QDqvJ0J{Y&6a>Hd! zh$n=k9hewKwk=+N=501JCM5|qAA+h3e$7J`K~dEhCi>~Nq-$~hVD&ewqa(}aoAYet zGjr14st6dC|L~fdOHP`EDf=fFE3MVK_u18X>B=tnI=iY~FB+?S)WM=o6V5d5f zZnGLz#{Ffb`I@JuN)p394FP|k<+pS+GhfUaRR(@z4-Y&hR8)AJGnVwgEX_PScbYh^14hB6 z=AA#Au|umLd!_RF50qU-WYIGFY5vcX|DrYXz+?=X(|(J&pp!K$zgk_gZX4Bo&~ZZ2 zXI0+$D2MPr-yR?P)rr|1%TDI#i{!27%0&A4%W=67r-;*_c8#WuvbcK=pX14L=M#@MV|b?;K=>>gqkQX z--obgX%~KRV0%nJ&;X2RMJpy@`I8F#L3FROzRna8;-6O92L;lbH&>z-6PsO;mjwn_aPqD>pMTaWLDKpVGx=)TEVykxbSE<| zyEsi?2(4#h!C+CO<7@w){rV9h0DBKryug(>3gO%h@kt%3`!%-Q$5F)Q+q{|O81YNu zZ~M)>&P)BGazyk`?X8*oOMC~C^`qnYD8I}ZLeBUI5m2$_O)ZX_*3jlimFNj^*1)(o zD{vqKOxNddLTor$sJbib&^ED>GSBs#;+q*{i%NOz8>`j(x#ubNsM}9!JJXC*j-$6l*vv*-|`5F`@; z;!mTs`3LnBG12-&tJXVm0IJ*(bjzNBEV7jY?uoO30ba@@YNWCx1NSI(+AeRoFqS*X z-I5!Top#Wj>qv&ouM-gson&9l4~PoTTpH#{NnPU_Y8maAXK|(8hl`s9(KJalJndJO zy*=SPCdV0FwDL}g70s6+b)Aw*$mpogn_e0Az5_A|1?_MzbgFLvCPl{40HOjjDb~(v zZ;Siyx8L83XS>zLMf?`}?Zk)?N2$E_<37_akIl_eSy1&eMS7Lbq_hGZJyJPGRt1FI zWq77E+31)@t}o)cJjpw%qGm;II&iAe=!rPblywM}6|{*oi!7B$nq^pBEgFY9M`sHE z0>Mv5x5}{Mc^~eLQ6I;_@B!Am!|3qyTQjd&n<#qpSG_K6=laZn?51Vj@1hIZSGuF^ zimBUVc03OkP2g5s9`GxGbs&`%CO>(4+OWZ1%@fq6qrTZj_R{ZcOo_>4JD^O!0gLw= z?pIv*tz2&moeLo0EoS&LQJT=m61N3V5kuyv)OZ<;?H)~N*JXlBiS(jSuJoR3T4CoL zho$zwNOOtc6uk9HN&gFhbhDtQtI!{zc7vyTzrR;Eolm`n=GvVdb>qesMqX#DwW7P_ zi&)&Y@04Wsbg`ex0Opcj!jKc~BVAQ7aGsOSlYdK#;bHU3>KFbC&uy%dO^2mnzV9?G z)#L(RZ1mQ@>NA3|nqVj&Xe8(MzfPMH%<5=J>M>0W2IT0*H!$PB3VTtc7`IM#8=Hl^ zJ>OIx+LZY+GbVjtG;lv6?r*d`D1MRFMyaXn3Rr!<*H`7Lxfb8-r7#3(J2mNuW38Bg zX++xbHIC8f2QL*Dc(cwpwoNTtD6Bh@)YLv+Wc8iu1}tz@9H17~`|$FuAnF7fM9AKM zRMKyF9ZpsA$=q8#xsB)fhNWL3e$FrBP5B0pEtqTF<)wLVGFZK1F+1M}96RTDFZvRA zgkuZg75Ux6x1@)FS(wH5H4ahSk>y2YMWMO9b)%wcl273^c)HzVAt$Fvy+%)zz?K7#(JFZl{^vY(p!L`^XmTS#5Xoyytt z!=nie5MLKr472T#38KkBphRjK{)Qf!peHrRlM6B9~(Y2`bfgxK(s|vb|5}tkO}7k zw`&pzrv1Fe2{e*0a=RS*@AmstKFgtDxFdOa@9ND`p3xk+ajfQaF(R5ZCpF&wcJ0Pi zz;AH`NT8+%g3V*8DV*Hvl>zvdg?~odoU_y1myRk?*FiP+V#u!KqYEi`ud~whGC}0Z z&>?QgbJ`>diolA^jt0?O8Iu>eUQaG|e@MOpO`!`)hi2@jh^+ap#d{ppBNDPzT^5TW z^vs(y+ii{dqTP8|#Xo!&>TCvKRB1fiW)j&>b??t8w1fo2a<1TD$cdI|{Pl~R;FFOW z5-=V5Rx2s1&Zdnf_d43fGLgLTt23G%QBZ^LFFk|)MDjZ-DFOFRG@aGN+P^)dxIJH5 zD_FBhO?~JI=eL%85oo7*-JJb&Q3B9EiFtgx_{>2b)VEhrWx2^^Y^)uow#lBz(*f6( zQg6P8=UmM%+tN-2=@rSZi? zT_dO>@kYz?AOu(aq74MmS=g5!PdO9plNkU84er57^tf;!R{VFi^f-ymY z;UdtuI?+NcVnsSCp);9=ns5)XSQq{NPk_YU^7@LxoPyxsZbOD^u^WS%aE<|V>`iTM~`Bmaz{c)`V1DS{nXnvumL zh=M_@Z&*x`fA3;B6;sX(2-nCn8A4FQ+8T zEGG2eZ%toVBZ+sAdRK(KuJZAT*XrMp-c5I`nA{MrJB>2>{t%td3iTQDKV`k2bU*hk zN$(mr>m73-#-))E`2`~qztaW1j{9hl=-ih`AC(vK08iGV0bl`lWydswmR$09!EF#N zi9tVF2fqDw&Ngy0gl-EoGH9~k0hAOAO+CqfC@^`tUwU@G46xLU9&jIkUyL6(t11n} z)8fZ;g-ce3I4&?z3XC9iX*`l=Qv%PK^a3GPhEsX6$ZJ@YcaSAV>v z*q=2IMq7{9!@u}hlf?B|=huDAaN9yG0v`^U%-plC1D>=5L+caO)|HQ8wYvf}>xGU4IYy&0_2>x)pH zvMfK~j@Ehm(^v=QPVTGpRe46_A1n^ko|9U=O6(L+cE2G-#l|12D8}^UUz{x_SS4&m zpJ?ej4T(tAeew;LiptZ?!4uB0h2qhgbd0o-`HqV0F(WCAp)3vEKqu={<=cqUIM_Zv zno9t5`Gy)qh~TBGxxW*t2pwCH&)6Xgv7o0B^C;`wFS?9QKG?0OCW#mF8Wc~nW%u&K z2e^8h5+&qFOy~Ur7V7w)w85=Chae6*VV%E4t@~HeR#;xPJ$6x@O4GPjASXo4aZS^K zm54m;y{RwtegZXW%L(rF(P*X;+ZLJ^Znj9q#=znqcp6&BnpK5N!~feyJ!b+ug?O*Az z`Wa8270hn1$%78Eg^`83M?)~1{UAn&t8xx{sTU9*soOK1f)l&4kyO$&JHv*LHRMQs zTy72buFbOb-BB6?Dm?v9nUOU6hEos^a;*3fnkgEO^Jxo(*Fl8Kt4J=z$KLkawaq}h zRxSJy!;z6tCH=e7I9LI6k<6o-;13Z{a%yQZ8pcscm77%U^wyre?!BjX|FnfD&;J4D zYOiHs^Z_DJ-~XHde@IV(C7DdrY^JF*#?hDAo_1%3g7_?C+_-x=>{Pucq(<2o?632%0r<3vxyZ;{zChnV6P z3fv)u-=#i9Dre8KaVpT{?{m)nma^7EzLe!Pls({Ed*8K*U=IZ{`k>ptC*cC)C%Vde zQ%&MG0?Mb*pEM)}i1L`ULbS_p5iipj&+?wKM&)daLP8A*t?i?VH_RdK3(1HdyX>akzOJN!i!aTVD;= zU=?hui~mV^AKyxsLdu{L)qa8x3APX3w%`l!{7LOiM#P1QGM}SYb+VaUHG;eGiSrW_ zH$bZjYehD37sXPQ1w*}{%P*l)zt71%&cK@v%gWJBc;x%eOUY3yfzWc z4ySX=)IRTO+k{DxDgf@;uPQ_Ko#b0;98`VN3U8Bu?4^9BWhE!AteZxzm>_MnsdT)M z^l&A@2-?OEKHB~bS{u}G{>njC6$p8l@eVIMGOQ}5&U2&qBOzeoljbP-s@82ug?yq1 zc8obd^0$-Q-B3w4Q#gz%Ax`KP=lAc*M&r-Q>pdtS#0F!BS-#e;XY7(sApXOB1d9st5vCxm+nB-)jSm4caywoN=O2_zA*^EP5dQdP=I zISKBb=NSC7I}(fDom8`+*HkdLgXw2C5^;Wr zD3HBW!F$FwZ{X8UK!|QO_3|$eiB5mfE5k4nJ3cksyV=x9CL4lK+=3>&R4kbR*Ki2d z5U-{%TTqZu797;RHGt{XI>2M8gP{be(U_7V#kV{Ob_GpkZ9qk}Tz2H!jKCd`zETzF z&)vHRuxFLdMFC-C?&A4ZiGLM6a-`zya-RAyN3Tcv14v-Qfdj^uE6e{?YVGh@vkI>r zRv1pV%+_N!;;SA#yn*kGbk~UTTVX;3C>AAiZc1Hi4Y3Sna>6q~w9cr$Bj#6W`tnvf z7#6{C2_B%F_JqZytw+vUh7JFP$yn=O+7_MG%P+P!DrlJ|Rn4U-Hf$nXkJd1j17;k; zMs#{?o46B+wZ_wzZ=YTB$+gy@XA~oow5$g4kxwYxxgjrypjz zy2O5Ad=cw$lhQ<$qb<_R@|82{7x>g;lIw+{}`uYlncr`x}&|E!54?P-S594&br44Hg}S{XIOC2g_`cURp7m#|cjH@)BA_N9AFY z2zQUySjdOVPmhzFXOZpTB+5{{h$m&!E4rsVPqw=12Q#u_} zqJ2tV78}lJovbH_7BW`*K)zl5HZQ@!?42cJcs?ficUya}R(Ws(2!~!zHpBp;QLAyq zL)2jIo|VDRBpDA#-}Y~OJF+4>xcJt1q=y8I%0qW%ylbv4r{BJus@DP`7J~?7pzpXS z*p0E$+kmosSNzbRhJxA%N{JO#fCW|DBF4N4z@;>wMK$6K0yz|WW#90S(oF(`DYT1Feg?&(5%5H>I^%0LG1S+aAJe8K-B8?ZNY7+L`^U)7{(VB z_sK$Q?w*&z&vfD;d#G&J4xDH>{%pJO%K)EB==JyV>*b0}CLMt{%=sR+NEv7{qDSHF zQBcGT3mG6hP>nHm%VH^5%zU6{wJXp@n&}XFJJ+Zqs!cxe8Uxovmc1V@85Fr3&z%n} ziiHH4z&rA;Ri(ox?&_uXT^sJO!AEO#0Hi7ZMxhcJaq(>eL*caG(}%Lfw>mF7+o9Xp zfZOho&1t9#EQP!tHpNx{x(bT&^Pl53-EGc9NV^qFvyZCCuW|s8l)6afgy?Qrk@d`b zQ#IYfSuQ&^7c_}-5Q1bNdApsuFgF@H98XXS*IjDp2ifIgmfbJ$@v z5Lu2$LTT>(m3p=1=1cZrP9=9&q@timg-iwnuL%eHcd4UzCN+N>BqRR1(pUKHHxllpD7a zW%qW>92>C2zro2D8=G#}69e|_{-w;{FnGk)edwQ>$@2Sre{KJV3w%Qd9PnmYeuDF{ z1gx11pmQro+M@@ZM%D)*9%e^kl5U2ve)U&|p%5k6OC6772@V1x3B@3bdZfrt=^R+L z7&EwO)kj!eo9uMxL(`w++8wUo8;+Zuq*Aor?~JJv@91xuS>TX`Eh)tG{WnnAWmQP`BsH)c6c zk-h%bOEa7G|HKM4dBSxj?!R9fZ3LwE?OH4s-XoHi>oz4Jk}uJyTtgh@8p@3vic?|0 z`sZ?xB}ZvfXM08qLZfu53Dx|Y2zf}>!C_0>W;=6V9gAZw!*Qh&UH$@z%AoMv^E-8k z>Tf;)Iec$=}XzcB^ZQ`;X2tk&l{6Gx_>x=#wLmoq+UQ5UA?!cs^$SajHD;4(!Vgiu_PQRtV?;ggNv`r{K2CO2ZcI>>EfSD= z004e~qneW#jd&mwjV8kvtz4JPv`e}{#Cs|5`}}Dpz4<$so--@>f@*^Rl8J2p7RW`W zV4y@V!!nU%n47{aNa8^;G*B}MloF`p=XiUNuOBExD6a5|dw1L-3QA#VuGcGOEMFAT z$_(wG6x{+_oX+8uErRXw;#fqNltM;Mo1o}3O(`rBxvrOtSWroyBXf&;TYHRgJ(PQ( zuI{ZBlgl`5KPVEVew1+X+@Y)Kr~k@kRZZ7G0On@D|M@O4hRw6XF}R)YXlxETk-}KO z*^sv-!k5$Dy$w}~KiL^iLmVz+II4JAa{+2Z-BcaoU$E2Nxo7IJx(t0Dfbv0WE&zUF zF*Z?Pxy)#*J*zw^o!YL(L21rks@i5gE0JM{Id3fra?Iu5 zo%tS+`N*?MW8f0bt6D~LygdM2KCeb6(A+;7J>6K42B=hcP zCD;gW>3ReWjU@JmkujZF`=U75)$tnkNO9oJMN+UIJQ72a^@Wa>ZEGpaL5um5=iXG5 zDd9lsB`>GjHSW^%={&kFl{xH>bajiyi~^#`x3^Yl^_w46*xoS9454Vs@&=HTM9G$Y z>RQ{;-ApuO$e_&cl6CdoM4QL=j*8!YPuH$|e?*0x>Xws<9Hpx@&bk0dn$+08*6_ao z%BjQBarl0Ms&_>VT8i)X1S7V}?Z@P`Uv_`6&^;kaE4zNeZtNGe1qlx7rIhR*fKiQ( zzQZ_$2qdwFgP;iCc=g0ra%i57KqaS-!0SyB#r#Za#)je8JQC(*SOsIfNCbYl%h6q4 z1nI%v8VRY4iOtMc-CjQ+0p3YF<5hYa<)!=G{{r_304HoSpXM{TeRH1&m3k&9Bc!0o z3si-jXVTADC#zYLOWYMH_P0=5tbT%rE+zmU3UOZ z8?Pen_KJvX|CqeRa9mU7c8_#h%~L|=7cLpRFw`+eMrp3s-vqF}j3aM06((Asl}2}? z%lWiVqz9+tN^UAXNILFLtA|boxm>;(N&CN`^A;L!+5@32gEd%w71x$!hJe6bnJMbh zTp&a#N^Y!dUi^4IA?8sHv7KlA9V1wX#6;bWR|z;g_=zM^@_JPpdxQ56q+$s|#-Vve zS)Br^sBB!*`#LMR?Dv6DBsXU}$rFmWBD|u*uEgDD7Vp`~542Y5--TH)vmXP1`8E5S zsI_rkaAyFvVbYU0WRk|3#;5|BDA=p7Z=69e4C|Uqt(;*I(i-(UN-Y#3dR+kV#K>fXUrRS5r|N&~M%JyQ#7B!nSVS z-DIY?SC-%ur6)BiGu+s>5X(#JIV#U`KlmNS$RLi1VlLP;TuX%8wKJ}6gVF2wxjC`1 zIVq>L?`4yn?`JF0m!C6}y12arpe4ru6$tGu{q}QY712+}nY-v)y1}49%L5M>o@e(j zHN*~U-me>wK#nCO6Vuj0c|-94OXdhC;Ey$D&2GFGfqXL9938d>|6vLHfaH;lzmuZv zQN-a%4Ny!J7vo12Y+Wb%UfD`4uK-SN02)<$RKn+F!csugPwbuK&$(c8>F@J1DCuZp zHNCh;OFzuL|FzULLhyHT0or@$MYk!wD$eBdT`jgCWS1dU=Gg$;MpdQz*LtV7C$ z6r`2l!sq1SMkL3|z=Cu@HT?Qe<8)}j>dwYg*jXlSv2B{MTi zNemIcdjy?hjor3L%XE%FiF;B-xw;&_QpBEClbuCcanf!6{8FY)X&Mj^l?Z4q?2^h89 z8BbjkkH_kZs5VjUE+bYHA+uos?lQdkJ|l^n$tYf@HIT?&=TGUal%3E<@am$6_+ab` zE^p(0{>va6DD7x?LF*Z5R<3`Jo!6gI;s~6`&hUPfIJ;_0W?_dLANLKV+}Tfd%J=ee ze=6n0p9u`CZGb-`S6WLDm+v%JzAI>Ua|cM=0re~U1m@x3kvvIk>ra3HgGgfM3u8OH zlV}KRZ71mv4Iw{#GLl3?DSnrGwf%P?P;!dqfk@_>HXQQ!ZQ}^;r){MP1IjHM;H^YB2d&dfp=4H_!I>k6Ow{e z-A?76c4G06ZG|8Sh{{Hr5`RN|t z>L6|#Ejqt4qf=A}FQDyc76oMK5#x|E{C0BS9xjWP$eh^)NkesKvx9Hn){;A7=lyA% z{TtR7J<-8;O3Ed~F?~-<>Bv_Q){XvTs_kMspe`C=c2GHMl*^>n!?k}hcglR;*wu^Gt26`p*gABfMRmC$lK7I!k7mzme1 zVY}+E_YD^&Mo$F_?gI&c%U_M6CfoQqe90IuB8SehAen;w1zxj$LVK|_>|mthjLs=4 zH&yf0h9*T@adlM!pi~Q!5#TR0IlBOlG^8EBVfkSCVRYpYmN`dV( zz~{RbCwdIl{DN@-=nr1Wo;OBXqXQ@1n2Rdad37%Xu6&;i+z7zj~9Gs??27UKBoybloXSe9QjkrwAxe-MK3S}5->DNSqSSj+{a zFoqS{@+s-MLy^PXb9}?>saEzx{DPfo8fi*SRU#>s1`iLEjz6WpizCHqIo}?W-yG}e zw&TtbXFfk1#KolP@@c*b^jSS9+GF9wFetvDOI$Fnv}~GsWy5qjltVjI9h;t^pmN6x z+PbsW|7?)8h-Gy75RFJ*8NVuAN#n2@Y3Mbwb?AQztwN)1(Wq&X#SQKElNtu__VkwC ze1TjkgB4Xy9j|IcXCO3@*b9^|v9*SU`%}gQS5G4KnOrg8s2Z-Syz2q^MNDyj;}uil zZ4t4m&8tk^G}^9kJ;OdT?m2jk*)aIJ6h2058b6hnM@pu3U>p`qA}Uh6lZLbv6U`s0 z(csiH{(k)C2HxyZ)Bqn27Etq>K5HPyXxsfA${ZB`v?3!K?p+63Dh>#Er?0BV6U&?$xphCvAFm?9x}HEdfbj- z%x!$Mc)mzVB;t@Hv>N*}l4EL2X;8z@&BlDuq3wJsS%GMMVd(v+Oo0TJ8sAp8X!5bt zeNVz_34K@+SpHo*yk{d)#QqZ&8Lv##$%_dt_M@?LLd9Yd22HGQyOFWMxcdQWe1+UE zbNZ01qND?iVMOiDkUy)H5YBWJ2USKn_{F=v@ztm+>9XlT zzW5m%k?B_@eO$EV#1*Od9R(72ch-75PwkWHQ3WfKCov#G7u@bAedI2t>B@8l*-wGI zw&ksDq~#lY$LBFJ*m8hI6Wh-)OAnA}X`;MgKq}{cQuZFfKJPy?MocWg2(PYI)c#{J zw(wbF3XR~=Sx;SE^i2c^5#k1tm{h1x^u$VJ>qmw!Yj&dK_)!)xsjT5$4flY+V0@G} zM&^qG-Jf&kbV)uTd;hVJeBTkr@D|e>xL^y9&)qTG71x`7_D+ z&L8fdZN@jLyo1s@IDIZ=?Le3Ax$7+wGo&5Gtse#YaYv%JBCgL1(>5h+jBjj%NAH63|v_r-gDUE&cSukjmts73aOKPx(l`&y%WsjhiN#vC3- z+rl4D%fU9(KGMMxG#-78@G^i?RqXis5_;J6sBTSqFp|*}PHyYe77^%Rf~V(++GPu* zrrSO)X`>9I{gqKVK-ZfpwGH4=N>sf49y`L{?Ws z1edyRzv8eqe$f2V@jPgn8KKu+Y&%ui-vlN)?)%~2*1abdhkvEKe8hQ?n;b7K)CY}+ zP&gF`!(Xd5)Z@{aAxg7*Pj{Dd8WY^(N?qlzqfVf^dD*Uxza$7Y_VIj>P&=V$8wj8+ zT;)4>AHOYGS}PjjTEO8yH|QH#HTU|4(Q@+Wy3<|;unH2^Ov1UD6O`g8m^RDGYsiNy z)mNI#ohe?6uA@~HvOh@tEm55IKzi4=3DRMi(!-eh#%iCBNkIQ89kl|9mGSnoj`TyR ztaUyX%+Oin!A`20VDw~UpvmH(od#IKbm%F%^*u3dqw6thYi9dbm|Wk-_eo=NqI6IO z&;akSamvX)r2H>aC`SEooG)<0mtU650OSQg646bQ@h>e1%>o)=ViDg^AY_?6ItrrD z)dw+TJ zY!IT}K&M$~;3HxDsoV{a<)em%5f5dsO$;qgFWGr*e^2>3jd;@ens8{7be^HZ!bRP6 z*d{PymK3Mzfx+CE_{U(f=SW`6bPG66sR})*qolS-hXdRf+g36B2Iviftz#8#S< zYWw2pYkb5Qh;@S)F z7TZ1VwAA^_EB*fA$7i#Ctfta%sRF^u{1WxWF?}(WkW+?k=h^&co&0uRpi?0-H**UP zbnSi0qn^QB?b)K)GFSkl?(bw|V@eh=2D63#=Gn&onH0jTH%j}`)ISi1wVtJMd!ti- z^qtAJH{rAnPITJ!z#!z=nwq;j)UaxnCYr!@;X~;LrbcsRA-ty{$T*3MsH*)Ijw#co z{$DgNCiWVa!!XAq%vKqsAJnx|c-iEDO0O{&P?_4^-(HfQqGZ4QX4ET%BOIGc+aGcV zXjx?}Bq{np*_D&|NC7&w!+d*{wON@WYp+j_r|V%}UtVRg-K$M+zKDD-kAr0(%h#p( ztJ0_*CVh8|Yk_ys6dlGarUyb)St%q10j)8$T;X3xt$RO^+XC4~I%8CC9w4-Hi*`BK z%ytnW^myCp1=yYHrqto(`SDuA_)>Agl+ec8b7&#aDA%Pcs0PB{= zc_nh(L&#)8Wcup5pXm8xBNhpOSk%@Ov0<+vs>1i%Gy0rP!b4V2hN$ zSbEvGk@k8Zrfo=g$(Y77{D}%g6ioWiktrN6bzu!JwqQmGe*>u2i3m|^l#0+l{ypCt ztTk=(%OnnU*i>S8Z00*+&>W?T;}P1lO)UE6$kA;_8z?y8VP9^GROrKHSR)hV@z9IV z{h5h<-*~*iL8ts3BC&rqKC!+@KnsP@Jb7<~ zy6we&aY>sI@zygou3+wa*hG!r5zzEWP?7cN`12n)LH&^r20# zhf⁢ju~3F*%)E{H_O& znJT!lxF?ATHrB^b||;Zdl*P;-_}&k+@Sgghe|!{lmggN}(V;MQ@|d!;Pu6=#J{;r_TmDeGLzaZ+|jG^u|#R#)z!i zN<|e&5bc_HFEI6|@=H6UYpm&@yrDvZ=GWY9e24zvi4EdVoK$!}@wi|)2t5~6WllGT zkXsI!5TZqDPdR?TGC^wq8>OrZ7;2ww@u$xy;$-RK+dF3=vWg@SP~ zwmx2lZD344{im+wCkAU2q;M6S@E6mpy0({MWiV%}a(KXCJMy8Exz5-JkgFvZ)VUh^ zDPLnq5-`KMwT<8w9oIQGuAO3RlCj#D@+odfEznQG`FVU9<9SdX6W4&U$K2i`)Hy6Gc<&p=StCk*S?8SC#+clkD(bl+GI2Esuvi zeg^=;Lr;-*&t%6VofIR(05nP(HvX&M;Q?i^rcu7f9@yx<>o9hESO(vTRkez4;a$;X zg`bHN2&E=0`Vy-)xIcBe3RaPLTXv5@^LZKJkg^h63rQE^Pn|@>{={bd;UG&Y}-VBt#AEl=-pvjHT%W1T=H6{00YU2~^TVd^HC| z)5D_R4}Z6wI88n@Yo{OUZ1)RJ8(S^!SVLd!SR90S<2^I~;l^=- zIrFH=fGIpOVx#*Lfkz4}Hx5Mn@-bp?t9xSstrrGsUWY9=#Zq0MUS_E9q7UQwr$723 zl_G!ch%As?8x=6mRB2M>rT-h#nE|DNR?-JlgB>Bb)K+<*TsfEwoK!oLaP zM%qH23A|&#iAe9R@SrG>_|bqUjW8AYBG&2Rd!<_)l+RB?!=i>ivsI@uR{-h?N9O!-G=k%h zlNWU#LGOc!Mu1xBTTKaE$+N_rsV}dYJt0P+AENt|weLSJXQ~WjeQH&PPYi~_Qhc9_ ztl@~R$6b^5*|svgg0KIPYk}Zvb6m!;c;D6e8>(x zqQbb_A+H3al{qmoG4C5iG2@5ToQbY}8fz3F8L@2muD)lnz6&o(7J%Ua{qKE^@K6KK z^z=F!w;ufQSbsp`9|zjr9Kf=0JQHp92Xuum<78yz?TUx3+jsaPTmev!t)ngq_PATf7tr#u&Tc={1XPGySt^kM7j~_lI{kjL6J^r>Fx#vk&^E2RvM%Q=@1V2?8E2# zn`h>l`PU2K#D1^6;=W(2>eGbi+Q-5NTjn#j?nw+P(a}yeJu4bGLJD7vnKAf0_umSc zJXVqT@fK+v==^U7whnrz_s6T2fI%PoeN0$SiI{F;ft1ySP6CX8x7rb=> z+GW;&QbaGfJ~?fj~snCZOA6#}*Pc)~M=f)YAo- zE2LF(K%W0)E9tsS5sNhDZJY@ay*aXs7}zydqeVch*$EB?f-i04L$`)+Yn}RL6~EVZ zjk^lpSM3BnOAB>CU=vqd<6Qk^;(y<%t>)^OT8H@IeR7sTc~amv2{^@JV)s9jG>sdP ztgbiyz_CVe+^zfEEU29zhd7kzW$?DM$skTRko}E_M9}67YXxl4&oKQ1Qvl^5G{vUDm$wIl< z@v|ehiL)Z2NC^UHNr7;pKr+kWmQ2XSZqee&d07P1Yx^WIGGO>fq)_~BmzCDT)r3Kv zugQYt(8w$NBD5mDWtySl3o{%7b>6|)Pk!5Uk##=XJGWx}gKM{9qo3ZRnp~Xmv*Z$5 zW7uzAtbGa%GYgPKS#K(n+MITdl&FSkp6x?k_&t>^`vP!3-u~31@K4eAdHRQ8Tu=mA zL3H^v|0`oCp=Hbt`^`5toEzXr=JBTKCQ;f~nFnSN!5(Asm~w{P9*ln=Q`KgY(zrs! zDGLVI+N>Qssy3g?4$K3ucg#Y~)whx{NJHA;EhabC<2zTqK(rrsfM;Szqbk2Fes>~G z6ISOfV|ms@d@xABqf3iK{OM3*4)qKD`|sF+LQwcX_NzQ<+09Yd|3eqS4j4)M8?!j! z)I9{yz4SYebjppM6^(#I8$<_q-HBA6zoO1Cs|+E!@rfs_Y<#Fu$-g z;N_Z6ZPzbkaa&33XfMeqtWUy6U|vh$@nCwt;&*%4M#&>NvyTWVN5+4Y$PpqrDXA_$Pl!j%dzN;dImvsicN871SAiQF`W2|pXO{Y374E$} zv*NA0HJff>4h@Qq;!RD5x%=L7)a=rA_F>@bbGCN%EhH2A^u4^ICem)MGP`Az9B>%^Yql`K5eCi@jAcR4#$2RdrL`Mf@fo}@ zX(^(<9fgN_oxW^6(>4z+)OE2IEa7qK?jNmmXUr<3##Y3mRS0qW@U7<{S{GNj_NTT1 z$-$V3`;=@yu9P)#KG0HH?$3Sad{~Z;0@YPG*{LZnLPQi2zu9~-#l1MhZR7kH>bHQ> zOX_f#Y-9RUBTR@mxd&FbyU80gy=RJzSaTZ+no1oosWa3^|J5u;3li_V<3f?h&=n2= zSS=zpK|gT)Ld};^h!f2WhG2LmJ2m+%gUc)^Fmlz^iDcy99ke!4BX&GuV0HdO%R%XA z!JkgxnqoT>qSFt#3oDq_e0pFtWb;gAXAZ~XcRK$b^Sb%vH~|krw&y`x?AY~0JHKXo zj#Z_fd359Y!@5qb=9qKkAaQ|tBkB^Mt>&wq{!^dc>6_9GG6E35-v7n$Dk=NlJ09FGM~Fk z>4{Fpeh!&P4`2Nc=YxvOG^ZE%d&;}(%yNFZAp1|MVCsppPUW9H9B%Y}^4D*wATdFM z1Nh%LDHS(4wFwJl62%^;ME?AEN{sEO^CB5A@Lym)y-R#pPB;XtY)^|>vZuHNJ(9>E zQqgc-y!mfTOYIBt=%Uy!{bkVe8bFH;ZR8@Oi)ulic?q1?RN$ash_H&Y8xHp*`+bPQ zdwyqrFfI-?q2iu^IdY_7mD48^BOE2gD-?8HFOHnQvrhe|c`57uhs}LI1 z5qrFITVPH3?$3|XTJb(yqW7b8zy9sDPvqPrG$D@Rl6b?#+5o# z-TZhmvpo_Q9;PLq)ZO<^%IKw9^}GK!lPcwZCe?sRJlYZKv5cYi48Rf+8#nmoLMG<( z(HaXI{TGuJW1IIC|K!;gYt?hpulX$9p*pV>7Q_*FpBam~k1DFs?jn(R(Tk_LwS6Ci#u0Z#CB(o_7S`u_K>s#?{*p>% zBpb}E&NZW-(={Ds3;f9o9)+5xoq6Otis?|M!ifc4i=cYiGt~a8pWr4#J#L&3CAX7| z?6(2x*<`W|n+f4ApXrX&ru8)6G3ALi>xb(^F%`Q$8wQ{)K1u{xZ-Yre>NYNNW*AAc8M+4*VgX{Yc}qx5{Q zC!;AZ)<~IpAy1vWna7%^#^cmSmJ!ui|BSgwY4E=lLq$%MKp8L|RH%BxPA`v4{}CAf zcPT=extbYcJH@V?dl8sH${+CRQk#$L!Qp*`|4hld$n*dW{iTa^l#`~gz_R@&D^315 z<8DeA)=to_;ZX1HKzs(no&~TxLcA4;N&j+*Dh)@G0vOvw%RI1Ibdja)Xw(_UY2@w@L$_erFnhF-+rG@fqUxgCQW8ozIy>)WXKRTO>7 z<&qkuSJI$a7zM)s66HsU;U0vL%B0UWQ9&h0$d0DUg$Sn*kE=h-@#78+D+~|5{_S_b z959*%m?Po*MPs9`;oZD#&*Q)2B0rC$;mpFnYK-|kSjJv0qexd>}0}h0>Ock6x;Cr;ICGM zn2Rp7+HFzn#KZ{qg!MR#5%XZWg9rxRtcmdgCeHG*3xL329E_09M{51K2igPHhP+c% zsauomoo5GVEJ6V94 z^+XWpzj^1f48c$)@C6sqD9~1(2wzM}^IkbbaaXma1Qg;K=!JVCZuo)fDBEokJhYwq zTFLLqN8!#s2ei?@NETU$6lpxD8R=bNQR7B9g{HE`4)iofcYVc*UacnDO@r~fZ+9!` zqP2Ju7^`5!M*@jV6}qS45K^+VMkRGWrA6fWG&n5ryN$_nJQi6QjF_8mKqdLkO?R7J z`f3;l&JoubkMZI;Zf`0IFzk=%_Sv>kZX4J=n9Cj9;ZvlTtCHVp6SrfHDu?v_(}&ko z@^Gd)$dq>S;%GekuCj>%kBU>^be=M#m9Le!wexkt$1Hzg6ehF7kG>$PzZ~{7Ya|KYh5^f96fA|4aOq>Bqb~NaJosSGNop=KJgFz*^*}bnQ)&Jz4fjo z%NuK-WjS(}kn8u!&mnNn;YaPGw8z!??r$y=-IgK=mt+kC!VdSsy)QTcdy0Bkl|KBQ zdZ~5{UV3VNRd*)?Zz%(OJF?4V=qP_#+5}`b&nLnhcAwR5RI>RU-Qr^?#O;z3FyviF$#oPPK2*PW z56&wd+jDS;hDvQW+CA@X@gpa)xnA#E!~K6lKt?wJVJ96Wz3IdOqQdWxyso%cK&_%mPbE{ z4KX27r^q2513AfbGiXI&)PDet#NBh2qcrp1>D=%;z3VVJais}iRR=(A9GZK0PrM`@ zuNAU|vg}aU1vTR8;Vqfnt<-KnBoas&+uccydhVpMxD4?Lmo!FC=9=z!i#8NzcGpr> zb03}WT*~2JE;~z;9HH#KnDfkfeDO=dTJhZd>%1n-tz5A^ZT8p z=u3MF=I`I`YIlT*XS3KH~y*jcslBKXQfRl24QUK8u#Y=i={i@mf8AO zcf2!9KK2&lFQm2f2ovD}I5s%Tne4A-qlvkt%5Hs+K3NB#PH1`cb`du@$Y+AgTTuz= z#8oAOPkxYxrlLGP3Jqz8Qza<%zyU!t=EUP9LYz;7dbVV2Tgzk@Oobz1=v zqZ5^?0PQ%YXoMVZhZ4JgIJ*}(k0CMZA{$8OIIT!YVeVyd+1(a>1&7QwEV+gc>9GZH zbv@4$>PBoTuTPO5_`(a|azu80==XCy(N{g;tp-F0CdMNiwr$$*k`f`PJL@0)3!>z} zu~t>GmponR`k>M?@Q>f{;!HHOW5^I<#u44hL)F_7uV@>0rqVg@NVXFs=%%Dn@IKIO z;tDz6u~LZkhJE`iR-?4b#+$o_E20m%=`K;uxxP)1Sw~=E%1O-Ud))cmTE*)FU>arc z6 zX<7>$369gL>(oRDjF>=*AWwwi_F$OJt}aiXc>;xq{=B?FY22Sn(`J|%B&Ff7PdW6% zf!DeupQ=XZ#>tR#dZn@GQztvAMf|?tA5lpU8C|OZ8Tp`^? zr>wU)Q0t9;T`LybYv*lx415j@9Q|LF4TtBdvZi4MR!uw*_b4Qv2P2Zs0IeX?$P z_-JjaC%dAIkB3VQ9z(OPrvbUOuJR{`^ zpAf%NlY#25n0yIW@Rf`_D!l98>zIiwd7daQHs7una#HTVr#Xd3PWaE}wy5mqa=+c7Pe5*L6098V z*0a(un}Rb-n`|J^vrcHQ`PeuyFLJKXhdaDYh_RLUisNx>X3V6i(G}w1cP4nVW4qCv zfV3lYaH6t&sQYqtw^2L28M2?kB&ycv>vC(J?`Ys@GOst%skSq}{9fOV1`ybb=0pH&5K6hD|5=J8l>wDN~L zER1lmB(AU&Lw|Cw>Q~ZJc~X{$jNeL}r&3V-3BbLc3YKV~GwF@9gZZ!i38X`wWtQz} zb}g$eOqdlVZ6}^{_V{!agP#y;ugI1CS#Y3C_F19wIg!+Jn#k~;PtRBT9=TNjW1}q0YWbD+AjGCa>Prso&9nvJ8)*$8vue*L^@sLs#)_}%9@U_exzU{J z`{khu7Z{0L*v{X5`Hvr|EC+4j0EaknEhtfQ{2nc4zMcP~A1J}!fnmaLl{+xBZV;?H z`mk9*yyA)w>V&rF`JrAK!4EVU(cU-EljCzXF?DjQAiO}Dy`7w*PBGH{Al-Agwc*Oo zp{DJ!^NcRm~W zWRfshC=-?y4)p-VPm5nKmw7b@l+%S7KnJsgZ)Sda=$r++UM~`cqKad=zaeN)pV(xja zwHpaXeTr_>4lwHHyDS1`Geb|THUG!^ipD2Yh7=By#Z!OP8V*Wsgj(80kE;S>Q(UGV zQ(y4wj;HeuTpX`G`p5hm1;UUa<0|=tHugLHI$JZq&n37__|rVU^Q<6UUigvYq5OOM zqR9Ql%n{GeO;ABNl&ECu+ht)Vof%ToiJlEUA3Ip6WyR1;M{3;p{Y}xJvT27jpCG7# zgAH25i|W7+lYjw~vXwPl$@1jLiTCf>%AXn^prx2_ddM#Xv6`~$<(`N6s)#CH|M@Dj z9iWzaF{N!c?{BqR%uf~f;enOag!x!nmMhBRfM5?VN+Hx#ocm1~u2?*L^A-)8^k#6P}!VxZnj@Hm_KqRD91#{i>% z+K)J_C=EBH#gX(<)Zoqu5UL9f=;A<7dXEkLggAI%P3PZtN?R|DAZD&Rsj@H^i2?J+ zl@#x8T4Le)USHnpG&#w5YPBJO=EviX$5qo;B!Q_8p5@VBI=RpSevW9QW9c?Jn^koE zXuP`}#g>RY2RJt!7W1=5&|Q^p0&kRuyYB?Rq^(%&Sd5bXK;<2v4{TxVd#TlPf(PkT zf@8o2FjZCp*IY4QI?9JXpSfoHxT#JdHe#Rd;^eLjefA2l!DQ0N(^?G`F!@vy+QGDZ zEJpaqR_x}_^Yz*uZk?tyX)iG5=u_$iUT{kl!EOBDbrHtVb2UE#AmXErWBFnoOrXO> zW#nJ4*Ypr+eZXjvMtLP>7c>9Ct#;YOzNZh7FBOQicAh2dpmnRTkm#42b@{*~@5wV} zTh_0FO3aBd%Q>j-s2VGHh15&BiEcPKbWLg$sgpxlc2{7*Fk|YjP|epG8OnT4<`Si3 zxT}5)rp*@dta&o^662P^Sm~l?a+?_PGD;iG(rW$1&5gw*DRm}nyK{E6y*GuJE0^2 zior3^OtA-+PvI}UX@h;=)Xrfm&mvO7QchAo&=N(ZR+tvbDp_slZ=n&g4Wdd}eV#4X zQDymAk?Cp76(&Opjl0AnHevyhWX5%6GUpxrr0>F0ZAF+^stT`Mz$}wgTb4Uoruogz z#Vj^g4BlA;mHzdcei1SyOW}MGCf?nbJ{J%w(D*0z?%|(+Vk-ZI`0P!e z2N2wXCJ;WExMSI8o|dyl3jv4mo^2_hS45KknpmRzctv5~xE@N9wG35<{vd#kc705J z-tAiNaO$%)4EWv@lfN{vVb8sqU4g3R(e!@;(_P#;1@Hlq^O*TX(zF1QX_Vy4QaY3Y5fn&tCUtDo%T)gzJ6)}hP)Jk(hDq~<$VZQ~*nFK$ zOJLkjS*1Yz$xH=?>3=p#2cCUE&z;V5mTEHW>1+a$%Cc|B_!YLmH>h;&Rll%tm#G}4 zh?uTON#<}vQQx5F(iD{VI=bm8#JIraz)VHPt&Rc}ot1ee{SN?cOM;{}8p{|aK?51< zql-0inFtAGk=APS`*$R`Zri3R!I7jMa~5t_8!@`itp0q4Fej0_iS#8v9a-}~^ho|F zUPbec$5~A>jh%>5gc5j`fM&Fc@xRbCG;?lPfxNocnfapNxl*Au-6hrdf3PxYKz@Pv zA&s@FM^aB70z`$|E@s{^fev4G*Li(8>v6H{oxTp^4D?wro;+(QYLQy5zrt7Bp)=nN zhT9m?IpDH2)%mggcjYhWN|c+z311M9_5YhSU-6BpXT+O_u&y1lU4ds`byZrJGbPnK zg|Q8g(}`h$2Y@k?=tak*(pM}Jp5725^4U8LI~4rDMJVQR5n}kx_lvRD9)0a${gSpW zMCUJBCBhr{|F`d(X+_CbSxWZ&>;G;^r~^wQSmU|If0=K%be?VGPU)wp(Omy{<$iiY z3P-4uD4oYj;Zsp!b1iJ5(YXrsOo(gI8{FcxuwOesMOG2#^M6ernc$eI)v5|W>LB4~ zd>^|)vUaOodtV$3hz~1?QiL;6L0Sq2Qn3oSSHO$b36)F!^AQMz;pe1upOl=kjru@Q zyk=ujWJGE}(^hmuK&yuIbo*;a4%W@e^KVy#2a1)1Ql3qebdnIApYJ5k4v zbNi|^-#z7E)#-&B^8@5H|3DF^pJV54#;ajdLDRTnHMfe9pnzzH`s+l#WvzVaUZ=RPT$f)vlc>1 zHLc31_Dw?7ZLc_0f%tj~n~L3^{JuR(G4?4pNqPaNwV)*Qf2N8|{k}J{ll#kL+jIX4 zV7r=PTa%h}BJmVWi2?CatcyO?5cfYUZpvG_#JX(}w1c}>JB!&{f5#nN6iG>-Q-5Ls zXH)BjN8rbYyNwG58ZgGHB#7&HjPny6x0o^>&~cmUdb3w{4Go$JU1~)@2MM~z0NQ0S z-PHlR2MBbfUb}=f{RTvFvFpJgkOK(GsYV ziGxM$VJ4Lur~z>t>6c?f?>Tsnh$&mV^8jT>Z<6Ayv7B8{9filUmv1=OK<|wI$V7x6 zoBa&egQ&ww2(vqq0WT0pOu)ye7K)6|CuhOhqpRmzd{bh#sWsMI{+;&f<^RE6kV&1V zqcDM4yCF^fc-VD34JVtO`7$b6B(`!lc68_T2sutgZ=C94PD~uD5HG^|$NVmjjkG9W z2Wi}u?l|7~-==`=5D7^)zIHf!tHbfpjN4ksO<3-e&4roQI{ljg#|!dpw8Rqc#T}Re z&rE)Y3^w>qiba2PUrDE9Jo_0gtl)gM3iTQx_S9=z2wMKyL~;z2UJbJUr2hptC`d%m z`*Ga5bR;Y-yRvbF+*GIdg;UMjp-6d_D!UlS;b)X35c}17{x4Nz({trH< zYrw&ur7#qTFE=vLR&;U8AqMUM=x4KnjQ{Cx^!9`j3twGH_Pfj~J-ph!3R*X5tK{VP z9CYb-@*!OF-%&DetdKun=;+%O)2V;?Pb>YE07~h4%O210G+PG0OB)$q#9dpvcyjdV za|gRM*g;Gf{x@aY|5OZ@Q2?4mYg02#we^Q`VYH0)|K;28u!mDJFjI<8rv^XJ9j8o7 zloSaglO+-P&iv(ydm_y;AR#26>;uVixL{yL?pX2&N6VYATDw}P%&L6AJg9gh1OhW{ zEo-Pur2Wqq3}rQ<$FqfZ+qx&F;Zc4;Dv{YdvUD}D!c5Awzu{V40^>pI=bo5UPW9hB zm-coU=&YQ~c(*fWINEkKeK74^i?s58@s+}LSy+4gTA}UdXTcMqn>2liLEe0Y#yR%& zD}PaI^-5RM4@9^&OsuzeN-ghSb?8q$C^AT-XX!q0_f#1?KHS&3ZUK?V#a!RXde8Q@ z(?U(L-Ew1foQ3OOfCYVNzs&YY1|+k^O$*kUL+!a%DSEGz$b4@0N?lgZT>q}LG*l-E zc|w%;_m-SGk{hq)EwE}$yMh#gRnxe->^tuNX`p-qA|AvK2#i(s7O1o)^84Z(t6(t0 z5harxIezxL&vR@K@f@BFUmk%UHC&f9QI67+?p#dG6X=32lMzl=!(OboqIn(bTp||L z`xHX;cgE^{=@-th3o>IRe|_k`JleJbvcSZmlLu(BX8`jX?LPbWzeVp+*JPpGN}#Dt zCFqzC9nn-E0xEJ7A`X7Wf8^%%Z)dvi>TTs2Smh{cKBr#}9iDkVCbKH{AYP8fEIA}K znS8}Fz6PrmbY73|#>jb5yL>av^%ihdWT*S!Xlm0>y$F^g4A&!Ap@@Cn4(3f0$-DFi zX+UUH!k;Wk6Dxb92wHT{(6PmYLIo`Ltpm|wxy5P=IlKEAGStj)i77_)GWq)ftH>0- zW7(z=AaP-CoYIuYR~Hl}yeRVA^<^o6?F6dWnaPtu(C&=|4K&sEA%OK0WKE-QdEtWw zQGkvX3yugGG1Z)9Xd`Y zVobaL_tuGYmUE>oO~S(y0Eus>e3aOlF>~rIrh+v25X|YSgb9 zZpAsOD=2GY*;)MNPa*G-&q*I3Q-XOKngOg5YF!$RN%P5oLsb{zH0kqP=SFU}U^3Ld z(3LiBbNZ3zoGA0+x>&@&3P<1A4gzV*^AdbuKIt3!1kq3bc&jWBwx`nOk009pW7=|ocqYZvTzLIuT$#i~tIz8C7A z4;Q~09nDC1z$y}g)1_J))tO>NB3_pbnJ&Q!?6NIpJn<2woFV=s6)@W^>_s5N)XaTU z>J(A&VGyPK_#1YJN*(O;cs1@>|K_e0X^Y!_x@R}{WOmhv3Z@NJ##_W@}_gAX4YeQWiv~aG+_eKQKAlG zT44B2*sh$X8Dz(%;~u8O(YbRr*kNp#clTbxxkvmM{x~2z7xxOvBp@L^VOHLS{Cc#CX4C$C5tC?e%Y{vpz3Y4HRxv;8TO&gqY(qB_A` z$fxGEflX}0b9Mqw-j<~26B#zI8^OXK#c_vE%vYV{2aps~;a!T6?Ocfuf7q&eByh#< zi0&DD8AJ_BR5{E)X?;0 z13^(ZR&cuQp&UfO4n zwc7cfk3(6@8*BGdq>NZ*UumCo$ZISxcIoF2Tn*A_D<~7A>C6qugu z=1*At^&-VVrMSQ8%S<}j?>O48H&Bl%YZNmE8Wkc^1F&M(07ltNm;5(A1}AQ}0CO@f z=QH3JSz3+psX&+iM2~R}`=-~&S>4RGx0J1WuV5aVVGidkHs~A--$SA{ZJ(j($e&eQ zn-=0yj4+6A@!qZDAj%HLh9Z`byE2pF!${i$9C|U+vCC$^Y~omR{Wp{JFgIz}Wp{<~ zR4NvdFvfCNoKW2|`!x66^kdK^*k~VSDM#iNAi&0JV0!+N9M8|c*X@r}55`MAbl}2s zc>qHH2Nx+TqLhp<3x`XShRF#6eMtKLOq~ET6A5bzCH`<2;5-EQXo7?k2 z(k_sZiqPwA;$I9zbh~fd{#(B7YzZtF(jqc+=_4?Y4C!O$Lng8Qu#Mh!EH8Nv*3Z9sD+zr9CFer>aw;1S{!WHXWQej`sE zwglYr-$lHWFx%L3{WqjO8dq>_38Mj)PsL~v(y`X{%68Kh&mPXDYHZ>v)83ibWFDH% zHN?-mX&-K%edn1vUy*7PYogE0H@2L*0zS(>aU4k zK4{hkIhY+*9frnZ_jPRLpVaU)qmzrcjx>xvNEu-j(2t9ftEqmWDyM%TpqG z1)Ewm4|%ai-<)E2ZG62vZiW1?^=UY2coC&d4j*kIEZH8pZ5+^MH2x9Fc&ocS=+%!n zQ&5T6d}tn{I~k6%zQ;*b$O4a5#ke+9jWh#mR*++MPt( zhM)MgOu=~xiAXandj3=LX<4OMCt=wX{+*rImop-6ck(dh_FLE@qDmE9-C6#jgKF1F z!N)&%5-HUmnFxh-Y=~c3<|D3ElexOtZMltV5mj{t-Km%6k9L1<_1WNH6|YaIcwuf* z8DOGe7L*ymbL(P>a0!Hbs7CX~3ZGE=Cl66em0Xv8nIK#lVk!+U9(_n5V$g9IVH#l{ zLu05s6j5JQ-#K$K@C`il)DCBDZY&526CqDqM#%N)V@V5;-=u@Xoa#f7@7|oN@3&af zTv9}~XXUqZuYT~2f;AT<`i+bU2HBr#nq*<7xO{4-JcLpoZ9lHPI3~6JmFQz3ze<(r zIL&9+crv9!ME6az+ojoU2|4LztP<5-#q|QbP=&n$ZGbqk3Zk<@WMUoro~{nBA@LjR z$VxIcuk`$ipD+bhgtS7J<1u_sC})(-BYfUzhOdd1TZ=CfdsAxu9mT9l^3HmJu@b zoPfXFsI;_VQ(9(L2r{R{7Z}sejKfhQkuX=oQDcxkx->=w1QY~il6Cx+O-#;KH%d0r zGWvP%d#q)nZE0!QD_*`i!b!XN$SDtx+wopI;oDDzrwI-icaR6R3S^j!p&E!4o40C@ z3@`oZ{lY0~)S`=pV{AIO7{w*0-t1QH9sM4*H7K+9V_%xqO?u_pYuC?G**&Di_OJPB zzYtx^n1qe*`25NZ;H5I|Vz;trQxfyz1VWYEd;hKE%PPopkEeTw0M6?JTf$0R`ch>d zH5KBQqQzF5xjuT$E6%a^%NM;P%ma~^Xz$oQT72Uegs*y=bBS}bSthD0F%%e-AK{z`1j&Xo>k!6{svO<%GUjo zYJvHm!QPa{Y#DX-M+8wEZVnZ`!SOH}L;wF*v}IfWSR-ATCa5aZAf)TJSe^M`I=1tT z$6{T>^WVOI;_mmhH`W~bENk~wnJ#r|*wvt-FO3nuR=%w;iK?sK)$*;D~8+}2K_CykUKH#$4DDt;G*{))oB+^ z>k-GasTZlcj&6RncSZ6+6f7svP@%zf3DQHqtRc?6oj=nVKzCJjy_K|1!2}mHP97{AW8BTPOu# zn(aMBBEbG@z@Nd1el=+~sjl9hpVaWaB)GtWR=k<+cd#b1csgzy*D~(*7jv;sH^G60 zjgoN~?L4*Si#6QB6eRoTFUec2Cl>`uY>2(gLiyd#33_wg3rr)2+92o3)|#6P%`?$j517%{8S(dsY9}A_hr9W2RD;0*V#tV*xQe{!p;sG z4I-XrmSlZ6B${%=)|5!0Hg)#DlX|8?b|(rR6)QznesRG68@6)uyMqwvU3A&FZp1q{ zR3Cr4c~$>#5p`hTpKEB`Z$P*#EhY$K(%ewRhg6WXWywyT4%6SfzTEwB_=*H?&V>io zS({ru$|8U;TO}*zQ+@$BesP#*HBxD-x$jgn_=X~9T*Or8(qdDn7>VSLWAP;0NsQcS zY2+4BQt`>nlUCY&y<4^)Aj7*~)^t=2s?)^V?+j-!ltU>Tm2mhI!l#cDW0_!>kwf{{ zC7ut{c+q*C452zxjtA5WSldslMZhywxr8LBEp1}EUR(7CuG-cfcoSdFB7 z=*|%t|Gl|!C6nExnq)wb?YI1xz^dBt11T^|C__j5ei1Wu#cNgEAY{C8)65fcY%-{4 z_4o$6_oIGP;!|7mIhir!LwCmT-BjX0Jn3 zh|i}UHp^@u&$dUbz?`^V)4YI8QO-dHNv3p^|E+sv>m|}(9?WsjgM_{<|Krs*2fmRu z=W~&%cOf0O!;GrUUZEq-w+lPFBB3NbXGmf&Xk(JsV@E z)suT|JJCD-^!s0O)7z7Tt~XP1!>1O<$!n_uvMLA8X%}Jz@4MnohhVR#-L$xO;NAu+ z!Ned8bZH7Cwxq@W%Z;!Qk}Ml>Q5v6m6SkO@UkIwkdC%um>>YrV#gh@GA^O#&T}KsWA~o#TL?B+w&l3PEvN7^UX#Rg*K@5r=tqB49+n=U zl@9YvrC#9rglurQIYsFc{g@Ttlm1qOP@>j- zeGv=gcS+f)Vt4P2|$&q6t@mZKu%@=`4g_()vX z_k6OR26Y-wLyTEUkW!$lc~eiO{I4&(g$I5BBBL|%Kb2G*G{Nu#Z|7=>g&-Y9XN_)Y ze-Q7@dr{;2Z7SFxu`S=TQ zKvGHS_`=g6c=APealP{u4giH1&nsO}lK>`Z=$~cYkYV@9O3qM%Q6B|Lip%Lz=htqM8FNcw)3L(F`KaK?)n&B!tA)X->-Y; zgKyACg1R&&^!4sGS?Hi5)%SW*K53h@_2mA~sG)_!@COA$9sz~7a9_-3u`w-ZGxB-f zkVXu0T^N%0i5ZX+SjL3Mq>?>+1+m<&?B;< zgL8gia>fH|P07F|ZOyE_+~{Iqy5poVeQjQl(X-D3fXZ`Ue+e-ps)^y}lE!Q%>MbbMcj*8(Gt*FQLjZ)^-4!dOUCl;yAO-4U!; zl)u-GSyLrNTek8t76@RKManOQ-|r`_L}+a>oTY+$nUtXXEGNML&{UKQ zw_HYrz&=BKQ+H@1-L_eFn*Y9Qw3%gZp|-SmBuoQLv~AR?s!;s_^WvXCs|9o`PE5*L zaymR1bR#rqGV2WvVRWFSBd{)7Q$bk3R4yuhm#7nhw$hTf_)5aJjPwx)9cf zgUtz~k^8^FHh3)UN<+J=&zsc)fPR^73XG`#nzy*$=J020?fJaqgGzzL^@uFsAfAnAR~%V&}nCfWUQEaSz$Lp~GZX@fdj8W7UuZ6Py8a#(ew%%-bp2P#V6CYTaba*r{N^eitwhAy1fCee$tXV)`YFmb?pf!b z-&5sIz;}E<-%EbiRV^W@y71@6iGoXm<4Oe{3Q?>vM*r#Q=D-pW@@vK2q-DtDB_2Bs z|4wgrC>E8Y7DxW}ZnK!apH8Ubf6;^i{;d1`t6mER|1GNhLro=zF?l268>#WMhQVbu zJuQUVaR!#stRcZN3x3yM6;mG0xk91ZY~?Vb$k}GO0Ega@!M^k8%61pJItF%!XVgV{9M`aCH#%GK3;=`XrN8T1milxJtcyX|L0!iNp8fPmt5Zk&(A};`1kySdpDIQnF zC_yUN%aQA~|E1>bPnJxqra-VzRyzx?VKb2c3gq7c&wcHj7|_VF7fLKcz-0=aABlFH z*D{iLm9xAf;_=!@e96-Poa`^{^0M?aB``9ajTlt2m_lFZp?~hk!?LjbcNlpGJWc~8 zWT<}LH`}Qu95ItThQ|DRP|qfia*BTV*}!_qGpf`#_^_ z3|)z?&}aRByDJa_SK3rZyS^r9-%l`*=sX0Ck_&YTrGGu!y%p#-pAdg+6{xoktLBO42Gip}PNFXt{4DszB3I}L0+C^yRBG_~K6Et(gU$crMfJuos4!5M z+yyZ}EaAebD?1*%MxsZ3P}LFb#%Z<-62Q>7^s^zDRC7VWMGo;G_9goMTNu0Q7mJ~$ zI24b^dfzJ`p54U6#=_bu2<0~t<-VA!q12omr81_ zUZy^r1W;D_Hdb@2{lv_t=n4y!2Z+s)4GDMR4m?kt<{Erm6j1I)oPDCeU;mE%2HTevrrWP>eyAp zW6ub+pR&I|cmi4JpkG2x1(O53{_2HxcGiV( zwM$Pp%E}8Y6Yhs5|J{oar4YHIjPD$d+Y_!zHQl>|gGouGeWc``1GQ*C3Onzzdk!!T z>YFsrjNoVf26Dn&=7I9S-%|W2nTq7GWMGwanbfzFF6(eb#>)AI%L6-t$gR^~ z3_a-4F>Fg%i!MfQy#SDCHi*NBU8a@@jz@VyR;MqD)7}76X7K1mpR9#Xe;cRK_rj&qmZdm>_@n& zfN(o}Fbas?Sl8^=6vFdbrV0Z;U_;6=-xXlEEHnL#x$uL_M6`dxLf`Ge$Q%X7C)FN? zf@QiMAp~$wh=;zc&@a+U;qN!++S5nf!DKrcz!{=jIv#dn_`0k%!!24Dv(|>s1`*{CPdsCJw0Ev&VQ$=&phte_^y)O+csd3&ElFNyY0!ZZDxBROa$IYC z!VJ!LTCd!p-y&ZA%1C$Yo~lUsgC;C3L_Q#4jf$DX=D#NDscgAZ;`#Vp>RQ=D!^5_; zVG(wNO9@l?24z~r7-BSn-=^m4tyIkQ_hQ0*RXAScI~|P!;Qxx&@RKzB-h=AVu?jWL z&AEZhYk=Lq&@mf|*ZsC4|Dw_9j*cMz6+rGZq2mDHC*NlX6m4V~4~X%XR%&HjEUSGKva~v%<^}N@y3dgs)A} z1`Q7?WA{MuWg#5x(s>rnitf~l;FXqj8YtCU!#Tb}4S%Q{nR)!0Zu(=s-u_PfV$0OT zpZhg-f~VLTZ1~+Fy@(8;Tz#c6-s%&;213U%!7tyTalSuq9UXE-D-w*L_KFdyvNaO2|u@w697=csIZyEq@GiiUe2$=Lu3jY zO6P@}k0;{TIm65`GX*gzJrT>-zvLltH9h(4M7aT$A_$m(*}0b58*^SG`sefP%R~h1q)@{Ue&3SwUgF) zPsoGrbeNme>W|eaX6%?99Apy$>z2YKhY`JM;r||L2CP3AGaqq1BmAP}0_Xp`1?2W_ z;fp-o_+MhlkH8d9-@d-S<%{!8UAKt&VB@NAzmn}|fr5fItRirl?5sKC;g|kUIWV}@ zjfnQD(S4!#m`CtYJFVmX_9)SF_osdJV-M#Kq7SMSY)qckc3YkbxIA3FNi|;urT-Us C4Q)pN literal 0 HcmV?d00001 diff --git a/tools/wiki_sync.py b/tools/wiki_sync.py new file mode 100644 index 000000000..c558e1064 --- /dev/null +++ b/tools/wiki_sync.py @@ -0,0 +1,178 @@ +import os +import subprocess +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, List + +# directories used for copying over md files +WIKI_DIR = "tools/wiki" +TEMP_WIKI = "tools/temp_wiki" +# text included in the Github Wiki formatting comment +WIKI_TAG = "GITHUB_WIKI" + + +@dataclass +class DocumentationFile: + file_name: str + display_name: str + path: Path + + +def get_all_raw_markdown_file_paths() -> List[str]: + return os.popen('find . -name "*.md" | grep -v -e "vendor" -e "app"').readlines() + + +def get_all_markdown_file_paths() -> List[Path]: + for raw_path in get_all_raw_markdown_file_paths(): + path = Path(raw_path.strip()) + if path.is_file(): + yield path + + +def get_file_to_wiki_comment(file_path: Path) -> Path: + # gets the last line of the file and parses it for the formatting spec + with open(file_path) as file: + last_line = file.readlines()[-1] + if WIKI_TAG not in last_line: + return None + return Path(last_line.split(" ")[2].strip()) + + +def categorize_paths() -> Dict[str, List[DocumentationFile]]: + # Uses helper functions to find .md files and paths, to parse the Github Wiki formatting spec + # Creates a map of the formatting spec to document information + # Map is used to create a sidebar file, and a copy paste the files from the Pocket Repository to Github Wiki + + sidebar = defaultdict(list) + for path in get_all_markdown_file_paths(): + wiki_path_format = get_file_to_wiki_comment(path) + + if not wiki_path_format: + continue + + dirname = os.path.dirname(wiki_path_format) + file = os.path.basename(wiki_path_format) + categories = dirname.split("/") + display_name = " ".join([s.title() for s in file.split("_")]) + filename = f"{categories[-1].title()} {display_name.title()}" + + sidebar[dirname].append(DocumentationFile(filename, display_name, path)) + + return sidebar + + +def write_sidebar_file(sidebar: Dict[str, List[DocumentationFile]]) -> None: + sidebar_format = "'''Contents'''\n" + sidebar_format += "*'''[[ Home | Home ]]'''\n" + + depth = 1 # helps track the level of nesting in the wiki sidebar + for category, doc_files in sidebar.items(): + if category == "home": + continue + + subcategories = category.split("/") + for subcategory in subcategories: + sidebar_format += ("*" * depth) + f"'''{subcategory.title()}'''\n" + depth += 1 + + for doc in doc_files: + sidebar_format += ( + "*" * depth + ) + f"[[ {doc.file_name} | {doc.display_name} ]]\n" + + # reset depth for the next category + depth = 1 + + with open(f"{WIKI_DIR}/_Sidebar.mediawiki", "w") as f: + f.write(sidebar_format) + + +def write_wiki_pages(sidebar: Dict[str, List[DocumentationFile]]) -> None: + # open md files in the repo an prepare for migration process + + for category, doc_files in sidebar.items(): + for doc_file in doc_files: + with open(doc_file.path) as source: + target = f"{WIKI_DIR}/{doc_file.file_name}.md" + if category == "home": + target = f"{WIKI_DIR}/Home.md" + + with open(target, "w") as dest: + dest.write(source.read()) + + +def run_wiki_migration(): + os.makedirs(TEMP_WIKI, exist_ok=True) + + # repo env variables + github_actor = os.environ["GITHUB_ACTOR"] + github_token = os.environ["GITHUB_TOKEN"] + user_name = os.environ["USER_NAME"] + user_email = os.environ["USER_EMAIL"] + owner = os.environ["OWNER"] + repo_name = os.environ["REPOSITORY_NAME"] + + # init, pull, delete + subprocess.call(["git", "init"], cwd=TEMP_WIKI) + subprocess.call(["git", "config", "user.name", f"{user_name}"], cwd=TEMP_WIKI) + subprocess.call(["git", "config", "user.email", f"{user_email}"], cwd=TEMP_WIKI) + subprocess.call( + [ + "git", + "pull", + f"https://{github_actor}:{github_token}@github.com/{owner}/{repo_name}.wiki.git", + ], + cwd=TEMP_WIKI, + ) + + # sync the new and old wiki files + subprocess.call( + [ + "rsync", + "-av", + "--delete", + "tools/wiki/", + "tools/temp_wiki", + "--exclude", + ".git", + ] + ) + + # add, config, commit and push + subprocess.call(["git", "add", "."], cwd=TEMP_WIKI) + sha_hash = ( + subprocess.check_output( + ["git", "rev-list", "--max-count=1", "HEAD"], cwd=TEMP_WIKI + ) + .decode() + .strip() + ) + subprocess.call( + ["git", "commit", "-m", f"update wiki content - sha: {sha_hash}"], cwd=TEMP_WIKI + ) + subprocess.call( + [ + "git", + "remote", + "add", + "master", + f"https://{github_actor}:{github_token}@github.com/{owner}/{repo_name}.wiki.git", + ], + cwd=TEMP_WIKI, + ) + subprocess.call( + ["git", "push", "--set-upstream", "master", "master"], cwd=TEMP_WIKI + ) + + +if __name__ == "__main__": + # categorize and generate sidebar and updates wiki folder + os.makedirs(WIKI_DIR, exist_ok=True) + + sidebar_format_dict = categorize_paths() + write_sidebar_file(sidebar_format_dict) + write_wiki_pages(sidebar_format_dict) + + # perform a migration for the git wiki + run_wiki_migration() diff --git a/utility/doc/CHANGELOG.md b/utility/doc/CHANGELOG.md index ee9991cf2..5e5f6256b 100644 --- a/utility/doc/CHANGELOG.md +++ b/utility/doc/CHANGELOG.md @@ -182,3 +182,5 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Unpause - Send - Added initial governance params + + diff --git a/utility/doc/PROTOCOL_RELAY.md b/utility/doc/PROTOCOL_RELAY.md index 4cb9c4fc9..6181767f4 100644 --- a/utility/doc/PROTOCOL_RELAY.md +++ b/utility/doc/PROTOCOL_RELAY.md @@ -171,4 +171,6 @@ This algorithm is not yet documented anywhere, so the following links can act as **Source code references:** - Merkle: https://github.com/pokt-network/pocket-core/blob/staging/x/pocketcore/types/merkle.go - Claim: https://github.com/pokt-network/pocket-core/blob/staging/x/pocketcore/keeper/claim.go -- Proof: https://github.com/pokt-network/pocket-core/blob/staging/x/pocketcore/keeper/proof.go \ No newline at end of file +- Proof: https://github.com/pokt-network/pocket-core/blob/staging/x/pocketcore/keeper/proof.go + + diff --git a/utility/doc/PROTOCOL_SESSION.md b/utility/doc/PROTOCOL_SESSION.md index a30e3e010..cf1b87007 100644 --- a/utility/doc/PROTOCOL_SESSION.md +++ b/utility/doc/PROTOCOL_SESSION.md @@ -76,3 +76,5 @@ graph TD E --> A C --> |IF selection is maxed| F[done] ``` + + diff --git a/utility/doc/README.md b/utility/doc/README.md index 73d16953c..86925b3eb 100644 --- a/utility/doc/README.md +++ b/utility/doc/README.md @@ -202,4 +202,6 @@ utility │   ├── transaction.go # the finite unit of the block │   ├── util.go │   ├── vote.go # vote structure for double sign transaction -``` \ No newline at end of file +``` + +