From 9f8fd46644cebef191dfb146278d3cf958d7a3ac Mon Sep 17 00:00:00 2001 From: Stephen Curran Date: Sun, 11 Feb 2024 15:27:21 +0000 Subject: [PATCH 1/2] Major changes related to the ACA-Py docs reorg Signed-off-by: Stephen Curran --- docs/assets/README.md | 16 + docs/assets/deploymentModel-agent.puml | 78 ++ docs/assets/deploymentModel-controller.puml | 76 ++ docs/assets/deploymentModel-full.puml | 37 + docs/assets/endorse-cred-def.puml | 75 ++ docs/assets/endorse-public-did.puml | 53 + docs/assets/endorser-design.puml | 31 + docs/assets/genPlantuml | 8 + docs/assets/inbound-messaging.puml | 37 + docs/assets/mediation-message-flow.puml | 147 +++ docs/contributing/CODE_OF_CONDUCT.md | 18 +- docs/contributing/CONTRIBUTING.md | 10 +- docs/contributing/PUBLISHING.md | 5 +- docs/contributing/SECURITY.md | 2 +- docs/demo/AcmeDemoWorkshop.md | 6 +- docs/demo/AliceGetsAPhone.md | 43 +- docs/demo/AliceWantsAJsonCredential.md | 592 ---------- docs/demo/AriesOpenAPIDemo.md | 120 +- docs/demo/AriesPostmanDemo.md | 111 ++ docs/demo/README.md | 6 +- docs/deploying/AnonCredsWalletType.md | 41 +- .../ContainerImagesAndGithubActions.md | 57 +- docs/deploying/IndySDKtoAskarMigration.md | 2 +- docs/deploying/Poetry.md | 11 +- docs/deploying/RedisPlugins.md | 88 +- docs/deploying/UpgradingACA-Py.md | 35 +- docs/deploying/deploymentModel.md | 20 +- docs/design/AnoncredsW3CCompatibility.md | 664 +++++++++++ .../anoncreds-w3c-verification-flow.png | Bin 0 -> 22174 bytes docs/features/AdminAPI.md | 2 +- docs/features/DevReadMe.md | 23 +- docs/features/Endorser.md | 8 +- docs/features/JsonLdCredentials.md | 23 +- docs/features/Mediation.md | 85 +- docs/features/Multicredentials.md | 2 +- docs/features/Multiledger.md | 33 +- docs/features/Multitenancy.md | 32 +- docs/features/PlugIns.md | 37 +- docs/features/SelectiveDisclosureJWTs.md | 72 +- docs/features/SupportedRFCs.md | 32 +- docs/features/UsingOpenAPI.md | 6 +- docs/features/adminApi.png | Bin 84936 -> 0 bytes docs/features/adminApiAuthentication.png | Bin 85864 -> 0 bytes docs/features/deploymentModel-agent.png | Bin 64654 -> 0 bytes docs/features/deploymentModel-controller.png | Bin 30783 -> 0 bytes docs/features/deploymentModel-full.png | Bin 21156 -> 0 bytes docs/features/devcontainer.md | 82 +- docs/features/endorse-cred-def.png | Bin 134605 -> 0 bytes docs/features/endorse-public-did.png | Bin 93680 -> 0 bytes docs/features/endorser-design.png | Bin 25582 -> 0 bytes docs/features/inbound-messaging.png | Bin 55628 -> 0 bytes docs/features/mediation-message-flow.png | Bin 181492 -> 0 bytes docs/features/multitenancyDiagram.png | Bin 135104 -> 0 bytes docs/gettingStarted/AgentConnections.md | 8 +- docs/gettingStarted/AriesAgentArchitecture.md | 9 +- docs/gettingStarted/AriesBasics.md | 3 +- docs/gettingStarted/AriesBigPicture.md | 4 +- docs/gettingStarted/AriesDeveloperDemos.md | 12 +- docs/gettingStarted/AriesMessaging.md | 3 +- docs/gettingStarted/AriesRoutingExample.md | 12 +- docs/gettingStarted/ConnectIndyNetwork.md | 2 +- docs/gettingStarted/CredentialRevocation.md | 26 +- .../DecentralizedIdentityDemos.md | 35 +- docs/gettingStarted/IndyAriesDevOptions.md | 6 +- docs/gettingStarted/IndyBasics.md | 4 +- .../IssuingAnonCredsCredentials.md | 8 + docs/gettingStarted/IssuingIndyCredentials.md | 3 - .../PresentingAnonCredsProofs.md | 11 + docs/gettingStarted/PresentingIndyProofs.md | 3 - docs/gettingStarted/README.md | 13 +- docs/gettingStarted/RoutingEncryption.md | 4 +- docs/gettingStarted/YourOwnAriesAgent.md | 9 +- docs/release/CHANGELOG.md | 1012 ++++++++--------- docs/release/acapy-README.md | 58 +- docs/testing/AgentTracing.md | 10 +- docs/testing/INTEGRATION-TESTS.md | 4 +- docs/testing/Logging.md | 14 +- docs/testing/Troubleshooting.md | 10 +- mkdocs.yml | 8 +- scripts/copyFixMDs.sh | 400 +++---- 80 files changed, 2685 insertions(+), 1832 deletions(-) create mode 100644 docs/assets/README.md create mode 100644 docs/assets/deploymentModel-agent.puml create mode 100644 docs/assets/deploymentModel-controller.puml create mode 100644 docs/assets/deploymentModel-full.puml create mode 100644 docs/assets/endorse-cred-def.puml create mode 100644 docs/assets/endorse-public-did.puml create mode 100644 docs/assets/endorser-design.puml create mode 100755 docs/assets/genPlantuml create mode 100644 docs/assets/inbound-messaging.puml create mode 100644 docs/assets/mediation-message-flow.puml create mode 100644 docs/demo/AriesPostmanDemo.md create mode 100644 docs/design/AnoncredsW3CCompatibility.md create mode 100644 docs/design/anoncreds-w3c-verification-flow.png delete mode 100644 docs/features/adminApi.png delete mode 100644 docs/features/adminApiAuthentication.png delete mode 100644 docs/features/deploymentModel-agent.png delete mode 100644 docs/features/deploymentModel-controller.png delete mode 100644 docs/features/deploymentModel-full.png delete mode 100644 docs/features/endorse-cred-def.png delete mode 100644 docs/features/endorse-public-did.png delete mode 100644 docs/features/endorser-design.png delete mode 100644 docs/features/inbound-messaging.png delete mode 100644 docs/features/mediation-message-flow.png delete mode 100644 docs/features/multitenancyDiagram.png create mode 100644 docs/gettingStarted/IssuingAnonCredsCredentials.md delete mode 100644 docs/gettingStarted/IssuingIndyCredentials.md create mode 100644 docs/gettingStarted/PresentingAnonCredsProofs.md delete mode 100644 docs/gettingStarted/PresentingIndyProofs.md diff --git a/docs/assets/README.md b/docs/assets/README.md new file mode 100644 index 00000000..bfc63156 --- /dev/null +++ b/docs/assets/README.md @@ -0,0 +1,16 @@ +# Assets Folder for Documentation + +Put any assets (images, source for images, videos, etc.) in this folder to be referenced in the various documents for this repo. + +## Plantuml Source and Images + +Plantuml diagrams are stored in this folder in source form in files ending in `.puml` and are generated manually using the `./genPlantuml` script. The script uses a docker image from docker-hub and can be run without downloading any dependencies. + +If you don't want to use the script, download plantuml and a command line utility and use that for the plantuml generation. I preferred not having any dependencies used (other than docker) and couldn't find +a nice way to run plantuml headless from a command line. + +## To Do + +It would be better to use a local `Dockerfile` vs. one found on Docker Hub. The one I did find was simple and straight forward. + +I couldn't tell if the svg generation was working so just went with png. Not sure which would be better. \ No newline at end of file diff --git a/docs/assets/deploymentModel-agent.puml b/docs/assets/deploymentModel-agent.puml new file mode 100644 index 00000000..8603f8e3 --- /dev/null +++ b/docs/assets/deploymentModel-agent.puml @@ -0,0 +1,78 @@ +skinparam defaultTextAlignment center + +skinparam titleBorderRoundCorner 15 +skinparam titleBorderThickness 2 +skinparam titleBorderColor red +skinparam titleBackgroundColor White + +skinparam monochrome true + +skinparam componentStyle uml2 + +cloud "The Internet\n" { + + component "Distributed\nLedger" as DL + component "Other\nAgents" as others +} + +package "Aries Cloud Agent - Python" as vx { + package Core as core { + component "Transport Plugins" as tp + package "Conductor" as cond { + component "Msg Receiver\nGet Thread State" as mr + component "Msg Sender\nPut Thread State" as ms + } + component "Dispatcher" as disp + component "Handler API" as hapi + } + package "Protocols" as prot { + component "Protocol 1\nProtocol 2\n.\n.\nProtocol n" as protos + } + component "Controller\nREST API" as rest + package "Handler Plugins" as inthand { + component "VDR Manager\nStorage Manager\n.\n.\n." as intmgrs + } + package "Storage Implementation" as is { + database "Secure Storage" as storage + } + intmgrs --> storage + +} + +/' +package "Enterprise Services" { + package "Agent Controller" as per { + component "HTTP Handler" as http + component "Agent\nController\nConfiguration" as config { + database "Conf" as confdb + } + component "Initiator" as init + component "Responder" as resp + '' database "Configuration\nFiles" as configdb + component "Service\nIntegration" as si + '' config --> configdb + si --> init + resp --> si + config --> si + } + component "Service\nBusiness\nLogic" as back + back <--> si +} +'/ + +others -down-> tp +tp --> mr +ms --> tp +mr --> disp +hapi -> intmgrs +ms --> hapi +mr --> hapi +protos --> hapi +rest -right-> protos +'' protos --> http +disp <--> protos +disp --> ms +intmgrs -up-> DL +'' http --> resp +'' resp --> rest +'' init --> rest diff --git a/docs/assets/deploymentModel-controller.puml b/docs/assets/deploymentModel-controller.puml new file mode 100644 index 00000000..d9679f2c --- /dev/null +++ b/docs/assets/deploymentModel-controller.puml @@ -0,0 +1,76 @@ +skinparam defaultTextAlignment center + +skinparam titleBorderRoundCorner 15 +skinparam titleBorderThickness 2 +skinparam titleBorderColor red +skinparam titleBackgroundColor White + +skinparam monochrome true + +skinparam componentStyle uml2 + +/' +cloud "The Internet" { + package "DID Method Network" as SN { + component "Distributed\nLedger" as DL + } + component "Other Agents" as others +} +'/ +package "Aries Cloud Agent" as ica { +/' + package Core as core { + component "Transport Plugins" as tp + package "Conductor" as cond { + component "Msg Receiver\nGet Thread State" as mr + component "Msg Sender\nPut Thread State" as ms + } + component "Dispatcher" as disp + component "Handler API" as hapi + } +'/ + package "Protocols" as prot { + component "Protocol 1\nProtocol 2\n.\n.\nProtocol n" as protos + } + component "Controller\nREST API" as rest +/' + package "Handler Plugins" as inthand { + component "Storage Manager\nWallet Manager\nNode Pool Manager\n.\n.\n." as intmgrs + } + package "DID Method SDK" as is { + database "Secure Storage" as wallet + } + intmgrs --> wallet +'/ +} + + +package "Controller" as per { + component "HTTP Handler" as http + database "Agent\nController\nConfiguration" as config + component "Initiator" as init + component "Responder" as resp + '' database "Configuration\nFiles" as configdb + component "Business\nLogic" as si + '' config --> configdb + si --> init + resp --> si + config --> si +} + +'' others -down-> tp +'' tp --> mr +'' ms --> tp +'' mr --> disp +'' hapi -> intmgrs +'' ms --> hapi +'' mr --> hapi +'' mf --> hapi +rest -right-> protos +protos --> http: Web Hooks +'' disp <--> protos +'' disp --> ms +'' intmgrs -up-> DL +http --> resp +resp --> rest +init --> rest diff --git a/docs/assets/deploymentModel-full.puml b/docs/assets/deploymentModel-full.puml new file mode 100644 index 00000000..b7611a53 --- /dev/null +++ b/docs/assets/deploymentModel-full.puml @@ -0,0 +1,37 @@ +skinparam defaultTextAlignment center + +skinparam titleBorderRoundCorner 15 +skinparam titleBorderThickness 2 +skinparam titleBorderColor red +skinparam titleBackgroundColor White + +skinparam monochrome true + +skinparam componentStyle uml2 + +cloud "The Internet" { + package "DID Method Network" as SN { + component "Distributed\nLedger" as DL + } + component "Other Agents" as others +} + +package "Aries Cloud Agent" as vx { + component "Core Capabilities" as core + package "DIDComm Protocols" as prot { + component "Protocol 1\nProtocol 2\n.\n.\nProtocol n" as protos + } + component "Controller\nREST API" as rest +} + +package "Controller" as per { + component "Application \nBusiness\nLogic" as bl +} + +others -down-> core +protos -up-> core +rest -right-> protos +protos --> bl +bl --> rest +core <--> protos +core -up-> SN diff --git a/docs/assets/endorse-cred-def.puml b/docs/assets/endorse-cred-def.puml new file mode 100644 index 00000000..a1a78c77 --- /dev/null +++ b/docs/assets/endorse-cred-def.puml @@ -0,0 +1,75 @@ +@startuml +' List of actors for our use case +actor Admin +participant CredDefRoutes +participant RevocationRoutes +participant IndyRevocation +participant Ledger +participant TransactionManager +participant EventBus +participant OutboundHandler +participant EndorsedTxnHandler +boundary OtherAgent + +' Sequence for writing a new credential definition +Admin --> CredDefRoutes: POST /credential-definitions +group Endorse transaction process +CredDefRoutes --> Ledger: create_and_send_credential_definition() +CredDefRoutes --> TransactionManager: create_record() +CredDefRoutes --> TransactionManager: create_request() +CredDefRoutes --> OutboundHandler: send_outbound_msg() +OutboundHandler --> OtherAgent: send_msg() +OtherAgent --> OtherAgent: endorse_msg() +EndorsedTxnHandler <-- OtherAgent: send_msg() +TransactionManager <-- EndorsedTxnHandler: receive_endorse_response() +TransactionManager <-- EndorsedTxnHandler: complete_transaction() +Ledger <-- TransactionManager: txn_submit() +TransactionManager --> TransactionManager: endorsed_txn_post_processing() +TransactionManager --> EventBus: notify_cred_def_event() +end + +' Create the revocation registry once the credential definition is written +CredDefRoutes <-- EventBus: on_cred_def_event() +CredDefRoutes --> IndyRevocation: init_issuer_registry() +IndyRevocation --> EventBus: notify_revocation_reg_init_event() +RevocationRoutes <-- EventBus: on_revocation_registry_init_event() +RevocationRoutes --> RevocationRoutes: generate_tails() +group Endorse transaction process +RevocationRoutes --> Ledger:send_revoc_reg_def() +RevocationRoutes --> TransactionManager: create_record() +RevocationRoutes --> TransactionManager: create_request() +RevocationRoutes --> OutboundHandler: send_outbound_msg() +OutboundHandler --> OtherAgent: send_msg() +OtherAgent --> OtherAgent: endorse_msg() +EndorsedTxnHandler <-- OtherAgent: send_msg() +TransactionManager <-- EndorsedTxnHandler: receive_endorse_response() +TransactionManager <-- EndorsedTxnHandler: complete_transaction() +Ledger <-- TransactionManager: txn_submit() +TransactionManager --> TransactionManager: endorsed_txn_post_processing() +TransactionManager --> EventBus: notify_revocation_reg_endorsed_event() +end + +' Now create the revocation entry (accumulator) +RevocationRoutes <-- EventBus: on_revocation_registry_endorsed_event() +RevocationRoutes --> RevocationRoutes: upload_tails() +RevocationRoutes --> EventBus: notify_revocation_entry_event() +RevocationRoutes <-- EventBus: on_revocation_entry_event() +group Endorse transaction process +RevocationRoutes --> IndyRevocation: send_entry() +IndyRevocation --> Ledger: send_entry() +RevocationRoutes --> TransactionManager: create_record() +RevocationRoutes --> TransactionManager: create_request() +RevocationRoutes --> OutboundHandler: send_outbound_msg() +OutboundHandler --> OtherAgent: send_msg() +OtherAgent --> OtherAgent: endorse_msg() +EndorsedTxnHandler <-- OtherAgent: send_msg() +TransactionManager <-- EndorsedTxnHandler: receive_endorse_response() +TransactionManager <-- EndorsedTxnHandler: complete_transaction() +Ledger <-- TransactionManager: txn_submit() +TransactionManager --> TransactionManager: endorsed_txn_post_processing() + +' Notify that the revocation entry is completed (no one listens to this notification yet) +TransactionManager --> EventBus: notify_revocation_entry_endorsed_event() +end + +@enduml diff --git a/docs/assets/endorse-public-did.puml b/docs/assets/endorse-public-did.puml new file mode 100644 index 00000000..63de78bb --- /dev/null +++ b/docs/assets/endorse-public-did.puml @@ -0,0 +1,53 @@ +@startuml +' List of actors for our use case +actor Admin +participant WalletRoutes +participant IndyWallet +participant LedgerRoutes +participant Ledger +participant TransactionManager +participant EventBus +participant OutboundHandler +participant EndorsedTxnHandler +boundary OtherAgent + +' Sequence for writing a new DID on the ledger (assumes the author already has a DID) +Admin --> WalletRoutes: POST /wallet/did/create +Admin --> LedgerRoutes: POST /ledger/register-nym +group Endorse transaction process +LedgerRoutes --> Ledger: register_nym() +LedgerRoutes --> TransactionManager: create_record() +LedgerRoutes --> TransactionManager: create_request() +LedgerRoutes --> OutboundHandler: send_outbound_msg() +OutboundHandler --> OtherAgent: send_msg() +OtherAgent --> OtherAgent: endorse_msg() +EndorsedTxnHandler <-- OtherAgent: send_msg() +TransactionManager <-- EndorsedTxnHandler: receive_endorse_response() +TransactionManager <-- EndorsedTxnHandler: complete_transaction() +Ledger <-- TransactionManager: txn_submit() +TransactionManager --> TransactionManager: endorsed_txn_post_processing() +TransactionManager --> EventBus: notify_endorse_did_event() +end + +WalletRoutes <-- EventBus: on_register_nym_event() +WalletRoutes --> WalletRoutes:promote_wallet_public_did() +WalletRoutes --> IndyWallet:set_public_did() +group Endorse transaction process +WalletRoutes --> IndyWallet:set_did_endpoint() +IndyWallet --> Ledger:update_endpoint_for_did() +WalletRoutes --> TransactionManager: create_record() +WalletRoutes --> TransactionManager: create_request() +WalletRoutes --> OutboundHandler: send_outbound_msg() +OutboundHandler --> OtherAgent: send_msg() +OtherAgent --> OtherAgent: endorse_msg() +EndorsedTxnHandler <-- OtherAgent: send_msg() +TransactionManager <-- EndorsedTxnHandler: receive_endorse_response() +TransactionManager <-- EndorsedTxnHandler: complete_transaction() +Ledger <-- TransactionManager: txn_submit() +TransactionManager --> TransactionManager: endorsed_txn_post_processing() + +' notification that no one is listening to yet +TransactionManager --> EventBus: notify_endorse_did_attrib_event() +end + +@enduml diff --git a/docs/assets/endorser-design.puml b/docs/assets/endorser-design.puml new file mode 100644 index 00000000..39883ea6 --- /dev/null +++ b/docs/assets/endorser-design.puml @@ -0,0 +1,31 @@ +@startuml +interface AdminUser + +interface OtherAgent + +object TransactionRoutes + +object TransactionHandlers + +AdminUser --> TransactionRoutes: invoke_endpoint() + +OtherAgent --> TransactionHandlers: send_message() + +object TransactionManager + +object Wallet + +TransactionManager --> Wallet: manage_records() + +TransactionRoutes --> TransactionManager: invoke_api() +TransactionHandlers --> TransactionManager: handle_msg() + +object EventBus + +TransactionManager --> EventBus: notify() + +interface OtherProtocolRoutes + +OtherProtocolRoutes --> EventBus: subscribe() +EventBus --> OtherProtocolRoutes: notify() +@enduml diff --git a/docs/assets/genPlantuml b/docs/assets/genPlantuml new file mode 100755 index 00000000..82c59e34 --- /dev/null +++ b/docs/assets/genPlantuml @@ -0,0 +1,8 @@ +#!/bin/bash + +echo Generating images from plantuml source files + +for i in *.puml ; do + echo Generating image from: $i + cat $i | docker run --rm -i think/plantuml -tpng > `echo $i | sed "s/puml/png/"` +done diff --git a/docs/assets/inbound-messaging.puml b/docs/assets/inbound-messaging.puml new file mode 100644 index 00000000..4607463b --- /dev/null +++ b/docs/assets/inbound-messaging.puml @@ -0,0 +1,37 @@ +@startuml + +participant "Inbound\nMessage\nHandler" as oag +participant "http\nTransport" as ht +participant "Internal\nTransport\nManager" as itm +participant "Inbound\nSession" as is +participant "Conductor" as con +participant "Dispatcher" as disp +participant "Responder" as resp +participant "Message\nProtocol\nHandler" as mh + + +oag -> ht: "inbound_message_handler()" +ht->itm: "create_session()" +itm -> is: "create" +is --> itm +itm --> ht +ht --> is: "receive()" +is --> is: "parse_inbound()" +is --> is: "receive_inbound()" +is --> is: "process_inbound()" +is --> is: "inbound_handler()" +is --> con: "inbound_message_router()" +con --> disp: "queue_message()" +disp --> disp: "handle_message()" +disp --> disp: "make_message()" +disp --> resp: "create()" +disp --> mh: "handle()" +mh-->resp: "send_reply()" +mh --> disp: "" +disp --> con: "" +con --> con: "dispatch_complete()" +con --> is +is --> ht + + +@enduml diff --git a/docs/assets/mediation-message-flow.puml b/docs/assets/mediation-message-flow.puml new file mode 100644 index 00000000..32a17358 --- /dev/null +++ b/docs/assets/mediation-message-flow.puml @@ -0,0 +1,147 @@ +@startuml + +' Make the notes not look so awful + +actor Alice as Alice +entity Mediator as Med +actor Bob as Bob +autonumber + +== Arrange for Mediation with the Mediator == + +Alice <--> Med : Establish connection (details omitted) + +loop until terms are acceptable + Alice -> Med : Mediation Request + note over Alice, Med: Establish terms of Mediation... + Med -> Alice : Mediation deny + note over Alice, Med: Mediation counter terms from Mediator +end + +Alice <- Med : Mediation grant +note over Alice, Med +Mediator reports routing keys and endpoint to Alice. + +{ + "@type": ".../coordinate-mediation/1.0/grant", + "routing_keys": [""], + "endpoint": "" +} +end note + +... Some time later ... + +== Create a Mediated Connection == +group Invitation + Alice -> Alice : Create invitation + + Alice -> Med : Keylist update + note over Alice, Bob + Alice sends invitation key to mediator with keylist update message. + + { + "@type": ".../coordinate-mediation/1.0/keylist-update" + "updates": [ + { + "recipient_key": "", + "action": "add" + } + ] + } + end note + + Alice --> Bob : Transmit Invitation (Out of Band) + note over Alice, Bob + Mediator routing keys and endpoint used for invitation. + + { + "@type": ".../connections/1.0/invite", + "routingKeys": [""], + "recipientKeys": [""], + "serviceEndpoint": "" + } + end note +end + +group Connection Request + Bob -> Bob : Create connection request + Bob -> Bob : Prepare message for sending + note right of Bob + 1. Encrypt request for Alice + 2. Wrap message in Forward Message + 3. Pop key from "routingKeys", Encrypt message for key + 4. Repeat for each remaining key in "routingKeys" + end note + + Bob -> Med : Forward {Connection Request} + note right + Bob's response will be sent + to the mediator the mediator + will forward response to Alice + end note + Med -> Med : Process Forward + note right of Med + 1. Unpack message + 2. Inspect forward "to" field + 3. Look up key in routing tables + end note + Alice <- Med : Connection Request +end + +group Connection Response + Alice -> Alice : Create Response + Alice -> Med : Keylist Update + note over Alice, Bob + Alice sends updates to mediator, including adding + the new connection keys and removing invitation key. + + { + "@type": ".../coordinate-mediation/1.0/keylist-update" + "updates": [ + { + "recipient_key": "", + "action": "add" + }, + { + "recipient_key": " Bob : Connection Response + note left + Connection response sent to + Bob as normal. Sent DID Doc + includes routing keys from + the mediator and the mediator + endpoint for the service + endpoint. + end note +end + +== Mediation == + +Bob -> Med : Forward {Message} +note right +Messages are encrypted +for Alice and then wrapped +in a forward message for +the Mediator. +end note + +Alice <- Med : Message +note left +Mediator decrypts the forward +message, inspects the "to", +and forwards to Alice. +Alice decrypts final message. +end note + +Alice -> Bob : Message +note right +Outbound messages to Bob are sent +directly, not through Mediator. +end note + +@enduml diff --git a/docs/contributing/CODE_OF_CONDUCT.md b/docs/contributing/CODE_OF_CONDUCT.md index 82defcd4..c74f9bde 100644 --- a/docs/contributing/CODE_OF_CONDUCT.md +++ b/docs/contributing/CODE_OF_CONDUCT.md @@ -151,16 +151,18 @@ and any kind of face-to-face meetings or discussions. ## Incident Procedure To report incidents or to appeal reports of incidents, send email to Mike Dolan -(mdolan@linuxfoundation.org) or Angela Brown (angela@linuxfoundation.org). Please include any -available relevant information, including links to any publicly accessible material relating to the -matter. Every effort will be taken to ensure a safe and collegial environment in which to -collaborate on matters relating to the Project. In order to protect the community, the Project -reserves the right to take appropriate action, potentially including the removal of an individual -from any and all participation in the project. The Project will work towards an equitable resolution -in the event of a misunderstanding. +([mdolan@linuxfoundation.org](mailto:mdolan@linuxfoundation.org)) or Angela +Brown ([angela@linuxfoundation.org](mailto:angela@linuxfoundation.org)). Please +include any available relevant information, including links to any publicly +accessible material relating to the matter. Every effort will be taken to ensure +a safe and collegial environment in which to collaborate on matters relating to +the Project. In order to protect the community, the Project reserves the right +to take appropriate action, potentially including the removal of an individual +from any and all participation in the project. The Project will work towards an +equitable resolution in the event of a misunderstanding. ## Credits This code is based on the [W3C’s Code of Ethics and Professional Conduct](https://www.w3.org/Consortium/cepc) with some -additions from the [Cloud Foundry](https://www.cloudfoundry.org/)‘s Code of Conduct. \ No newline at end of file +additions from the [Cloud Foundry](https://www.cloudfoundry.org/)‘s Code of Conduct. diff --git a/docs/contributing/CONTRIBUTING.md b/docs/contributing/CONTRIBUTING.md index 1fc2001a..369ab200 100644 --- a/docs/contributing/CONTRIBUTING.md +++ b/docs/contributing/CONTRIBUTING.md @@ -1,4 +1,4 @@ -## How to contribute +# How to contribute You are encouraged to contribute to the repository by **forking and submitting a pull request**. @@ -21,12 +21,12 @@ A configuration for [pre-commit](https://pre-commit.com/) is included in this re On each commit, pre-commit hooks will run that verify the committed code complies with ruff and is formatted with black. To install the ruff and black checks: -``` -$ pre-commit install +```bash +pre-commit install ``` To install the commit message linter: -``` -$ pre-commit install --hook-type commit-msg +```bash +pre-commit install --hook-type commit-msg ``` diff --git a/docs/contributing/PUBLISHING.md b/docs/contributing/PUBLISHING.md index ec98ebdd..e44c2dfd 100644 --- a/docs/contributing/PUBLISHING.md +++ b/docs/contributing/PUBLISHING.md @@ -72,7 +72,7 @@ s/^/- / merged:>2022-04-07`) and for each page, highlight, and copy the text of only the list of PRs on the page to use in the following step. - For each page, run the command - `sed -e :a -e '$!N;s/\n#/ #/;ta' -e 'P;D' < Click here to view screenshot of the revocation registry on the ledger - Ledger + Ledger ## Accept the Invitation @@ -181,18 +190,18 @@ When the Faber agent starts up it automatically creates an invitation and genera
Click here to view screenshot - Accept Invitation + Accept Invitation
The mobile agent will give you feedback on the connection process, something like "A connection was added to your wallet".
Click here to view screenshot - Add Connection to Wallet + Add Connection to Wallet
Click here to view screenshot - Add Connection to Wallet + Add Connection to Wallet
Switch your browser back to Play with Docker. You should see that the connection has been established, and there is a prompt for what actions you want to take, e.g. "Issue Credential", "Send Proof Request" and so on. @@ -219,7 +228,7 @@ In the Faber console, select option `1` to send a credential to the mobile agent
Click here to view screenshot - Issue Credential + Issue Credential
The Faber agent outputs details to the console; e.g., @@ -239,15 +248,15 @@ The credential offer should automatically show up in the mobile agent. Accept th
Click here to view screenshot - Credential Offer + Credential Offer
Click here to view screenshot - Credential Details + Credential Details
Click here to view screenshot - Credential Acceptance + Credential Acceptance
## Issue a Presentation Request @@ -258,7 +267,7 @@ In the Faber console, select option `2` to send a proof request to the mobile ag
Click here to view screenshot - Request Proof + Request Proof
## Present the Proof @@ -267,15 +276,15 @@ The presentation (proof) request should automatically show up in the mobile agen
Click here to view screenshot - Proof Request Notice + Proof Request Notice
Click here to view screenshot - Proof Request Details + Proof Request Details
Click here to view screenshot - Proof Presentation + Proof Presentation
If the mobile agent is able to successfully prepare and send the proof, you can go back to the Play with Docker terminal to see the status of the proof. @@ -288,7 +297,7 @@ In the Faber console window, the proof should be received as validated.
Click here to view screenshot - Proof Validation + Proof Validation
## Revoke the Credential and Send Another Proof Request @@ -299,7 +308,7 @@ Once that is done, try sending another proof request and see what happens! Exper
Click here to view screenshot - Revocation + Revocation
## Send a Connectionless Proof Request diff --git a/docs/demo/AliceWantsAJsonCredential.md b/docs/demo/AliceWantsAJsonCredential.md index 6681fff2..e69de29b 100644 --- a/docs/demo/AliceWantsAJsonCredential.md +++ b/docs/demo/AliceWantsAJsonCredential.md @@ -1,592 +0,0 @@ - -# How to Issue JSON-LD Credentials using Aca-py - -Aca-py has the capability to issue and verify both Indy and JSON-LD (W3C compliant) credentials. - -The JSON-LD support is documented [here](../../features/JsonLdCredentials) - this document will provide some additional detail in how to use the demo and admin api to issue and prove JSON-LD credentials. - - -## Setup Agents to Issue JDON-LD Credentials - -Clone this repository to a directory on your local: - -```bash -git clone https://github.com/hyperledger/aries-cloudagent-python.git -cd aries-cloudagent-python/demo -``` - -Open up a second shell (so you have 2 shells open in the `demo` directory) and in one shell: - -```bash -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber --did-exchange --aip 20 --cred-type json-ld -``` - -... and in the other: - -```bash -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo alice -``` - -Note that you start the `faber` agent with AIP2.0 options. (When you specify `--cred-type json-ld` faber will set aip to `20` automatically, -so the `--aip` option is not strictly required). Note as well the use of the `LEDGER_URL`. Technically, that should not be needed if we aren't -doing anything with an Indy ledger-based credentials. However, there must be something in the way that the Faber and Alice controllers are starting up that requires access to a ledger. - -Also note that the above will only work with the `/issue-credential-2.0/create-offer` endpoint. If you want to use the `/issue-credential-2.0/send` endpoint - which automates each step of the credential exchange - you will need to include the `--no-auto` option when starting each of the alice and faber agents (since the alice and faber controllers *also* automatically respond to each step in the credential exchange). - -(Alternately you can run run Alice and Faber agents locally, see the `./faber-local.sh` and `./alice-local.sh` scripts in the `demo` directory.) - -Copy the "invitation" json text from the Faber shell and paste into the Alice shell to establish a connection between the two agents. - -(If you are running with `--no-auto` you will also need to call the `/connections/{conn_id}/accept-invitation` endpoint in alice's admin api swagger page.) - -Now open up two browser windows to the [Faber](http://localhost:8021/api/doc) and [Alice](http://localhost:8031/api/doc) admin api swagger pages. - -Using the Faber admin api, you have to create a DID with the appropriate: - -- DID method ("key" or "sov") -- key type "ed25519" or "bls12381g2" (corresponding to signature types "Ed25519Signature2018" or "BbsBlsSignature2020") -- if you use DID method "sov" you must use key type "ed25519" - -Note that "did:sov" must be a public DID (i.e. registered on the ledger) but "did:key" is not. - -For example, in Faber's swagger page call the `/wallet/did/create` endpoint with the following payload: - -``` -{ - "method": "key", - "options": { - "key_type": "bls12381g2" // or ed25519 - } -} -``` - -This will return something like: - -``` -{ - "result": { - "did": "did:key:zUC71KdwBhq1FioWh53VXmyFiGpewNcg8Ld42WrSChpMzzskRWwHZfG9TJ7hPj8wzmKNrek3rW4ZkXNiHAjVchSmTr9aNUQaArK3KSkTySzjEM73FuDV62bjdAHF7EMnZ27poCE", - "verkey": "mV6482Amu6wJH8NeMqH3QyTjh6JU6N58A8GcirMZG7Wx1uyerzrzerA2EjnhUTmjiSLAp6CkNdpkLJ1NTS73dtcra8WUDDBZ3o455EMrkPyAtzst16RdTMsGe3ctyTxxJav", - "posture": "wallet_only", - "key_type": "bls12381g2", - "method": "key" - } -} -``` - -You do *not* create a schema or cred def for a JSON-LD credential (these are only required for "indy" credentials). - -You will need to create a DID as above for Alice as well (`/wallet/did/create` etc ...). - -Congratulations, you are now ready to start issuing JSON-LD credentials! - -- You have two agents with a connection established between the agents - you will need to copy Faber's `connection_id` into the examples below. -- You have created a (non-public) DID for Faber to use to sign/issue the credentials - you will need to copy the DID that you created above into the examples below (as `issuer`). -- You have created a (non-public) DID for Alice to use as her `credentialSubject.id` - this is required for Alice to sign the proof (the `credentialSubject.id` is not required, but then the provided presentation can't be verified). - -To issue a credential, use the `/issue-credential-2.0/send-offer` endpoint. (You can also use the `/issue-credential-2.0/send`) endpoint, if, as mentioned above, you have included the `--no-auto` when starting both of the agents.) - -You can test with this example payload (just replace the "connection_id", "issuer" key, "credentialSubject.id" and "proofType" with appropriate values: - -``` -{ - "connection_id": "4fba2ce5-b411-4ecf-aa1b-ec66f3f6c903", - "filter": { - "ld_proof": { - "credential": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://www.w3.org/2018/credentials/examples/v1" - ], - "type": ["VerifiableCredential", "UniversityDegreeCredential"], - "issuer": "did:key:zUC71KdwBhq1FioWh53VXmyFiGpewNcg8Ld42WrSChpMzzskRWwHZfG9TJ7hPj8wzmKNrek3rW4ZkXNiHAjVchSmTr9aNUQaArK3KSkTySzjEM73FuDV62bjdAHF7EMnZ27poCE", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "givenName": "Sally", - "familyName": "Student", - "degree": { - "type": "BachelorDegree", - "degreeType": "Undergraduate", - "name": "Bachelor of Science and Arts" - }, - "college": "Faber College" - } - }, - "options": { - "proofType": "BbsBlsSignature2020" - } - } - } -} -``` - -Note that if you have the "auto" settings on, this is all you need to do. Otherwise you need to call the `/send-request`, `/store`, etc endpoints to complete the protocol. - -To see the issued credential, call the `/credentials/w3c` endpoint on Alice's admin api - this will return something like: - -``` -{ - "results": [ - { - "contexts": [ - "https://w3id.org/security/bbs/v1", - "https://www.w3.org/2018/credentials/examples/v1", - "https://www.w3.org/2018/credentials/v1" - ], - "types": [ - "UniversityDegreeCredential", - "VerifiableCredential" - ], - "schema_ids": [], - "issuer_id": "did:key:zUC71KdwBhq1FioWh53VXmyFiGpewNcg8Ld42WrSChpMzzskRWwHZfG9TJ7hPj8wzmKNrek3rW4ZkXNiHAjVchSmTr9aNUQaArK3KSkTySzjEM73FuDV62bjdAHF7EMnZ27poCE", - "subject_ids": [], - "proof_types": [ - "BbsBlsSignature2020" - ], - "cred_value": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://www.w3.org/2018/credentials/examples/v1", - "https://w3id.org/security/bbs/v1" - ], - "type": [ - "VerifiableCredential", - "UniversityDegreeCredential" - ], - "issuer": "did:key:zUC71Kd...poCE", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "givenName": "Sally", - "familyName": "Student", - "degree": { - "type": "BachelorDegree", - "degreeType": "Undergraduate", - "name": "Bachelor of Science and Arts" - }, - "college": "Faber College" - }, - "proof": { - "type": "BbsBlsSignature2020", - "proofPurpose": "assertionMethod", - "verificationMethod": "did:key:zUC71Kd...poCE#zUC71Kd...poCE", - "created": "2021-05-19T16:19:44.458170", - "proofValue": "g0weLyw2Q+niQ4pGfiXB...tL9C9ORhy9Q==" - } - }, - "cred_tags": {}, - "record_id": "365ab87b12f74b2db784fdd4db8419f5" - } - ] -} -``` - -If you *don't* see the credential in your wallet, look up the credential exchange record (in alice's admin api - `/issue-credential-2.0/records`) and check the state. If the state is `credential-received`, then the credential has been received but not stored, in this case just call the `/store` endpoint for this credential exchange. - - -## Building More Realistic JSON-LD Credentials - -The above example uses the "https://www.w3.org/2018/credentials/examples/v1" context, which should never be used in a real application. - -To build credentials in real life, you first determine which attributes you need and then include the appropriate contexts. - - -### Context schema.org - -You can use attributes defined on [schema.org](https://schema.org). Although this is *NOT RECOMMENDED* (included here for illustrative purposes only) - individual attributes can't be validated (see the comment later on). - -You first include `https://schema.org` in the `@context` block of the credential as follows: - -``` -"@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://schema.org" -], -``` - -Then you review the [attributes and objects defined by `https://schema.org`](https://schema.org/docs/schemas.html) and decide what you need to include in your credential. - -For example to issue a credetial with [givenName](https://schema.org/givenName), [familyName](https://schema.org/familyName) and [alumniOf](https://schema.org/alumniOf) attributes, submit the following: - -``` -{ - "connection_id": "ad35a4d8-c84b-4a4f-a83f-1afbf134b8b9", - "filter": { - "ld_proof": { - "credential": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://schema.org" - ], - "type": ["VerifiableCredential", "Person"], - "issuer": "did:key:zUC71pj2gpDLfcZ9DE1bMtjZGWCSLhkQsUCaKjqXtCftGkz27894pEX9VvGNiFsaV67gqv2TEPQ2aDaDDdTDNp42LfDdK1LaWSBCfzsQEyaiR1zjZm1RtoRu1ZM6v6vz4TiqDgU", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "givenName": "Sally", - "familyName": "Student", - "alumniOf": "Example University" - } - }, - "options": { - "proofType": "BbsBlsSignature2020" - } - } - } -} -``` - -Note that with `https://schema.org`, if you include attributes that aren't defined by *any* context, you will *not* get an error. For example you can try replacing the `credentialSubject` in the above with: - -``` -"credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "givenName": "Sally", - "familyName": "Student", - "alumniOf": "Example University", - "someUndefinedAttribute": "the value of the attribute" -} -``` - -... and the credential issuance *should* fail, however `https://schema.org` defines a `@vocab` that by default all terms derive from ([see here](https://stackoverflow.com/questions/30945898/what-is-the-use-of-vocab-in-json-ld-and-what-is-the-difference-to-context/30948037#30948037)). - -You can include more complex schemas, for example to use the schema.org [Person](https://schema.org/Person) schema (which includes `givenName` and `familyName`): - -``` -{ - "connection_id": "ad35a4d8-c84b-4a4f-a83f-1afbf134b8b9", - "filter": { - "ld_proof": { - "credential": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://schema.org" - ], - "type": ["VerifiableCredential", "Person"], - "issuer": "did:key:zUC71pj2gpDLfcZ9DE1bMtjZGWCSLhkQsUCaKjqXtCftGkz27894pEX9VvGNiFsaV67gqv2TEPQ2aDaDDdTDNp42LfDdK1LaWSBCfzsQEyaiR1zjZm1RtoRu1ZM6v6vz4TiqDgU", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "student": { - "type": "Person", - "givenName": "Sally", - "familyName": "Student", - "alumniOf": "Example University" - } - } - }, - "options": { - "proofType": "BbsBlsSignature2020" - } - } - } -} -``` - - -## Credential-Specific Contexts - -The recommended approach to defining credentials is to define a credential-specific vocaublary (or make use of existing ones). (Note that these can include references to `https://schema.org`, you just shouldn't uste this directly in your credential.) - - -### Credential Issue Example - -The following example uses the W3C citizenship context to issue a PermanentResident credential (replace the `connection_id`, `issuer` and `credentialSubject.id` with your local values): - -``` -{ - "connection_id": "41acd909-9f45-4c69-8641-8146e0444a57", - "filter": { - "ld_proof": { - "credential": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/citizenship/v1" - ], - "type": [ - "VerifiableCredential", - "PermanentResident" - ], - "id": "https://credential.example.com/residents/1234567890", - "issuer": "did:key:zUC7Dus47jW5Avcne8LLsUvJSdwspmErgehxMWqZZy8eSSNoHZ4x8wgs77sAmQtCADED5RQP1WWhvt7KFNm6GGMxdSGpKu3PX6R9a61G9VoVsiFoRf1yoK6pzhq9jtFP3e2SmU9", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "type": [ - "PermanentResident" - ], - "id": "did:key:zUC7CXi82AXbkv4SvhxDxoufrLwQSAo79qbKiw7omCQ3c4TyciDdb9s3GTCbMvsDruSLZX6HNsjGxAr2SMLCNCCBRN5scukiZ4JV9FDPg5gccdqE9nfCU2zUcdyqRiUVnn9ZH83", - "givenName": "ALICE", - "familyName": "SMITH", - "gender": "Female", - "birthCountry": "Bahamas", - "birthDate": "1958-07-17" - } - }, - "options": { - "proofType": "BbsBlsSignature2020" - } - } - } -} -``` - -Copy and paste this content into Faber's `/issue-credential-2.0/send-offer` endpoint, and it will kick off the exchange process to issue a W3C credential to Alice. - -In Alice's swagger page, submit the `/credentials/records/w3c` endpoint to see the issued credential. - - -### Request Presentation Example - -To request a proof, submit the following (with appropriate `connection_id`) to Faber's `/present-proof-2.0/send-request` endpoint: - -``` -{ - "comment": "string", - "connection_id": "41acd909-9f45-4c69-8641-8146e0444a57", - "presentation_request": { - "dif": { - "options": { - "challenge": "3fa85f64-5717-4562-b3fc-2c963f66afa7", - "domain": "4jt78h47fh47" - }, - "presentation_definition": { - "id": "32f54163-7166-48f1-93d8-ff217bdb0654", - "format": { - "ldp_vp": { - "proof_type": [ - "BbsBlsSignature2020" - ] - } - }, - "input_descriptors": [ - { - "id": "citizenship_input_1", - "name": "EU Driver's License", - "schema": [ - { - "uri": "https://www.w3.org/2018/credentials#VerifiableCredential" - }, - { - "uri": "https://w3id.org/citizenship#PermanentResident" - } - ], - "constraints": { - "limit_disclosure": "required", - "is_holder": [ - { - "directive": "required", - "field_id": [ - "1f44d55f-f161-4938-a659-f8026467f126" - ] - } - ], - "fields": [ - { - "id": "1f44d55f-f161-4938-a659-f8026467f126", - "path": [ - "$.credentialSubject.familyName" - ], - "purpose": "The claim must be from one of the specified issuers", - "filter": { - "const": "SMITH" - } - }, - { - "path": [ - "$.credentialSubject.givenName" - ], - "purpose": "The claim must be from one of the specified issuers" - } - ] - } - } - ] - } - } - } -} -``` - -Note that the `is_holder` property can be used by Faber to verify that the holder of credential is the same as the subject of the attribute (`familyName`). Later on, the received presentation will be signed and verifiable only if `is_holder` with ` "directive": "required"` is included in the presentation request. - -There are several ways that Alice can respond with a presentation. The simplest will just tell aca-py to put the presentation together and send it to Faber - submit the following to Alice's `/present-proof-2.0/records/{pres_ex_id}/send-presentation`: - -``` -{ - "dif": { - } -} -``` - -There are two ways that Alice can provide some constraints to tell aca-py which credential(s) to include in the presentation. - -Firstly, Alice can include the received presentation request in the body to the `/send-presentation` endpoint, and can include additional constraints on the fields: - -``` -{ - "dif": { - "issuer_id": "did:key:zUC7Dus47jW5Avcne8LLsUvJSdwspmErgehxMWqZZy8eSSNoHZ4x8wgs77sAmQtCADED5RQP1WWhvt7KFNm6GGMxdSGpKu3PX6R9a61G9VoVsiFoRf1yoK6pzhq9jtFP3e2SmU9", - "presentation_definition": { - "format": { - "ldp_vp": { - "proof_type": [ - "BbsBlsSignature2020" - ] - } - }, - "id": "32f54163-7166-48f1-93d8-ff217bdb0654", - "input_descriptors": [ - { - "id": "citizenship_input_1", - "name": "Some kind of citizenship check", - "schema": [ - { - "uri": "https://www.w3.org/2018/credentials#VerifiableCredential" - }, - { - "uri": "https://w3id.org/citizenship#PermanentResident" - } - ], - "constraints": { - "limit_disclosure": "required", - "is_holder": [ - { - "directive": "required", - "field_id": [ - "1f44d55f-f161-4938-a659-f8026467f126", - "332be361-823a-4863-b18b-c3b930c5623e" - ], - } - ], - "fields": [ - { - "id": "1f44d55f-f161-4938-a659-f8026467f126", - "path": [ - "$.credentialSubject.familyName" - ], - "purpose": "The claim must be from one of the specified issuers", - "filter": { - "const": "SMITH" - } - }, - { - "id": "332be361-823a-4863-b18b-c3b930c5623e", - "path": [ - "$.id" - ], - "purpose": "Specify the id of the credential to present", - "filter": { - "const": "https://credential.example.com/residents/1234567890" - } - } - ] - } - } - ] - } - } -} -``` - -Note the additional constraint on `"path": [ "$.id" ]` - this restricts the presented credential to the one with the matching `credential.id`. Any credential attributes can be used, however this presumes that the issued credentials contain a uniquely identifying attribute. - -Another option is for Alice to specify the credential `record_id` - this is an internal value within aca-py: - -``` -{ - "dif": { - "issuer_id": "did:key:zUC7Dus47jW5Avcne8LLsUvJSdwspmErgehxMWqZZy8eSSNoHZ4x8wgs77sAmQtCADED5RQP1WWhvt7KFNm6GGMxdSGpKu3PX6R9a61G9VoVsiFoRf1yoK6pzhq9jtFP3e2SmU9", - "presentation_definition": { - "format": { - "ldp_vp": { - "proof_type": [ - "BbsBlsSignature2020" - ] - } - }, - "id": "32f54163-7166-48f1-93d8-ff217bdb0654", - "input_descriptors": [ - { - "id": "citizenship_input_1", - "name": "Some kind of citizenship check", - "schema": [ - { - "uri": "https://www.w3.org/2018/credentials#VerifiableCredential" - }, - { - "uri": "https://w3id.org/citizenship#PermanentResident" - } - ], - "constraints": { - "limit_disclosure": "required", - "fields": [ - { - "path": [ - "$.credentialSubject.familyName" - ], - "purpose": "The claim must be from one of the specified issuers", - "filter": { - "const": "SMITH" - } - } - ] - } - } - ] - }, - "record_ids": { - "citizenship_input_1": [ "1496316f972e40cf9b46b35971182337" ] - } - } -} -``` - -### Another Credential Issue Example - -TBD the following credential is based on the W3C Vaccination schema: - -``` -{ - "connection_id": "ad35a4d8-c84b-4a4f-a83f-1afbf134b8b9", - "filter": { - "ld_proof": { - "credential": { - "@context": [ - "https://www.w3.org/2018/credentials/v1", - "https://w3id.org/vaccination/v1" - ], - "type": ["VerifiableCredential", "VaccinationCertificate"], - "issuer": "did:key:zUC71pj2gpDLfcZ9DE1bMtjZGWCSLhkQsUCaKjqXtCftGkz27894pEX9VvGNiFsaV67gqv2TEPQ2aDaDDdTDNp42LfDdK1LaWSBCfzsQEyaiR1zjZm1RtoRu1ZM6v6vz4TiqDgU", - "issuanceDate": "2020-01-01T12:00:00Z", - "credentialSubject": { - "id": "did:key:aksdkajshdkajhsdkjahsdkjahsdj", - "type": "VaccinationEvent", - "batchNumber": "1183738569", - "administeringCentre": "MoH", - "healthProfessional": "MoH", - "countryOfVaccination": "NZ", - "recipient": { - "type": "VaccineRecipient", - "givenName": "JOHN", - "familyName": "SMITH", - "gender": "Male", - "birthDate": "1958-07-17" - }, - "vaccine": { - "type": "Vaccine", - "disease": "COVID-19", - "atcCode": "J07BX03", - "medicinalProductName": "COVID-19 Vaccine Moderna", - "marketingAuthorizationHolder": "Moderna Biotech" - } - } - }, - "options": { - "proofType": "BbsBlsSignature2020" - } - } - } -} -``` - diff --git a/docs/demo/AriesOpenAPIDemo.md b/docs/demo/AriesOpenAPIDemo.md index 9c2e5a2f..deed6abb 100644 --- a/docs/demo/AriesOpenAPIDemo.md +++ b/docs/demo/AriesOpenAPIDemo.md @@ -49,11 +49,11 @@ What better way to learn about controllers than by actually being one yourself! We will get started by opening three browser tabs that will be used throughout the lab. Two will be Swagger UIs for the Faber and Alice agent and one for the public ledger (showing the Hyperledger Indy ledger). As well, we'll keep the terminal sessions where we started the demos handy, as we'll be grabbing information from them as well. -Let's start with the ledger browser. For this demo, we're going to use an open public ledger operated by the BC Government's VON Team. In your first browser tab, go to: [http://dev.greenlight.bcovrin.vonx.io](http://dev.greenlight.bcovrin.vonx.io). This will be called the "ledger tab" in the instructions below. +Let's start with the ledger browser. For this demo, we're going to use an open public ledger operated by the BC Government's VON Team. In your first browser tab, go to: [http://test.bcovrin.vonx.io](http://test.bcovrin.vonx.io). This will be called the "ledger tab" in the instructions below. For the rest of the set up, you can choose to run the terminal sessions in your browser (no local resources needed), or you can run it in Docker on your local system. Your choice, each is covered in the next two sections. -> Note: In the following, when we start the agents we use several special demo settings. The command we use is this: `LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg`. In that: +> Note: In the following, when we start the agents we use several special demo settings. The command we use is this: `LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg`. In that: > > - The `LEDGER_URL` environment variable informs the agent what ledger to use. > - The `--events` option indicates that we want the controller to display the webhook events from ACA-Py in the log displayed on the terminal. @@ -71,7 +71,7 @@ In a browser, go to the [Play with Docker](https://labs.play-with-docker.com/) h ```bash git clone https://github.com/hyperledger/aries-cloudagent-python cd aries-cloudagent-python/demo -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg ``` @@ -89,7 +89,7 @@ Once the Faber agent has started up (with the invite displayed), click the link
Show me a screenshot! - Swagger Page for Faber Agent + Swagger Page for Faber Agent
### Start the Alice Agent @@ -99,7 +99,7 @@ Now to start Alice's agent. Click the "+Add a new instance" button again to open ```bash git clone https://github.com/hyperledger/aries-cloudagent-python cd aries-cloudagent-python/demo -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo alice --events --no-auto --bg +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo alice --events --no-auto --bg ``` @@ -119,7 +119,7 @@ Once the Alice agent has started up (with the `invite:` prompt displayed), click
Show me a screenshot! - Swagger Page for Alice Agent + Swagger Page for Alice Agent
You are ready to go. Skip down to the [Using the OpenAPI/Swagger User Interface](#using-the-openapiswagger-user-interface) section. @@ -137,7 +137,7 @@ In the first terminal window, clone the ACA-Py repo, change into the demo folder ```bash git clone https://github.com/hyperledger/aries-cloudagent-python cd aries-cloudagent-python/demo -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber --events --no-auto --bg ``` @@ -155,7 +155,7 @@ If all goes well, the agent will show a message indicating it is running. Use th
Show me a screenshot! - Swagger Page for Faber Agent + Swagger Page for Faber Agent
### Start the Alice Agent @@ -163,7 +163,7 @@ If all goes well, the agent will show a message indicating it is running. Use th To start Alice's agent, open up a second terminal window and in it, change to the same `demo` directory as where Faber's agent was started above. Once there, start Alice's agent: ``` bash -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo alice --events --no-auto --bg +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo alice --events --no-auto --bg ``` @@ -184,7 +184,7 @@ If all goes well, the agent will show a message indicating it is running. Open a
Show me a screenshot! - Swagger Page for Alice Agent + Swagger Page for Alice Agent
### Restarting the Docker Containers @@ -229,12 +229,12 @@ In the Faber browser tab, navigate to the **`POST /connections/create-invitation
Show me a screenshot - Create Invitation Request - Create Invitation Request + Create Invitation Request
Show me a screenshot - Create Invitation Response - Create Invitation Response + Create Invitation Response
### Copy the Invitation created by the Faber Agent @@ -243,14 +243,14 @@ Copy the entire block of the `invitation` object, from the curly brackets `{}`,
Show me a screenshot - Create Invitation Response - Create Invitation Response + Create Invitation Response
Before switching over to the Alice browser tab, scroll to and execute the **`GET /connections`** endpoint to see the list of Faber's connections. You should see a connection with a `connection_id` that is identical to the invitation you just created, and that its state is `invitation`.
Show me a screenshot - Faber Connection Status - Faber Connection Status + Faber Connection Status
### Use the Alice Agent to Receive Faber's Invitation @@ -261,12 +261,12 @@ Switch to the Alice browser tab and get ready to execute the **`POST /connection
Show me a screenshot - Receive Invitation Request - Receive Invitation Request + Receive Invitation Request
Show me a screenshot - Receive Invitation Response - Receive Invitation Request + Receive Invitation Request
> A key observation to make here. The "copy and paste" we are doing here from Faber's agent to Alice's agent is what is called an "out of band" message. Because we don't yet have a DIDComm connection between the two agents, we have to convey the invitation in plaintext (we can't encrypt it - no channel) using some other mechanism than DIDComm. With mobile agents, that's where QR codes often come in. Once we have the invitation in the receivers agent, we can get back to using DIDComm. @@ -277,19 +277,19 @@ At this point Alice has simply stored the invitation in her wallet. You can see
Show me a screenshot - Invitation Status + Invitation Status
To complete a connection with Faber, she must accept the invitation and send a corresponding connection request to Faber. Find the `connection_id` in the connection response from the previous **`POST /connections/receive-invitation`** endpoint call. You may note that the same data was sent to the controller as an event from ACA-Py and is visible in the terminal. Scroll to the **`POST /connections/{conn_id}/accept-invitation`** endpoint and paste the `connection_id` in the `id` parameter field (you will have to click the `Try it out` button to see the available URL parameters). The response from clicking `Execute` should show that the connection has a state of `request`.
Show me a screenshot - Accept Invitation Request - Receive Invitation Request + Receive Invitation Request
Show me a screenshot - Accept Invitation Response - Receive Invitation Response + Receive Invitation Response
### The Faber Agent Gets the Request @@ -298,7 +298,7 @@ In the Faber terminal session, an event (a web service callback from ACA-Py to t
Show me the event - Connection Request Event + Connection Request Event
Note that the connection ID held by Alice is different from the one held by Faber. That makes sense, as both independently created connection objects, each with a unique, self-generated GUID. @@ -309,12 +309,12 @@ To complete the connection process, Faber will respond to the connection request
Show me a screenshot - Accept Connection Request - Accept Connection Request + Accept Connection Request
Show me a screenshot - Accept Connection Request - Accept Connection Request + Accept Connection Request
### Review the Connection Status in Alice's Agent @@ -325,14 +325,14 @@ Scroll to and execute **`GET /connections`** to see a list of Alice's connection
Show me a screenshot - Alice Connection Status - Alice Connection Event + Alice Connection Event
As with Faber's side of the connection, Alice received a notification that Faber had accepted her connection request.
Show me the event - Alice Connection Status + Alice Connection Status
### Review the Connection Status in Faber's Agent @@ -341,7 +341,7 @@ You are connected! Switch to the Faber browser tab and run the same **`GET /conn
Show me a screenshot - Faber Connection Status - Faber Connection Status + Faber Connection Status
## Basic Messaging Between Agents @@ -354,7 +354,7 @@ On Alice's swagger page, scroll to the **`POST /connections/{conn_id}/send-messa
Show me a screenshot - Alice Send Message + Alice Send Message
### Receiving a Basic Message (Faber) @@ -363,7 +363,7 @@ How does Faber know that a message was sent? If you take a look at Faber's conso
Show me a screenshot - Faber Receive Message + Faber Receive Message
Faber's controller application can take whatever action is necessary to process this message. It could trigger some application code, or it might just be something the Faber application needs to display to its user (for example a reminder about some action the user needs to take). @@ -374,7 +374,7 @@ How does Alice get feedback that Faber has received the message? The same way -
Show me a screenshot - Alice Receive Message Confirmation + Alice Receive Message Confirmation
Again, Alice's agent can take whatever action is necessary, possibly just flagging the message as having been `received`. @@ -401,14 +401,14 @@ You can confirm the schema and credential definition were published by going bac
Show me a screenshot - Faber Public DID + Faber Public DID
-On the ledger browser of the [BCovrin ledger](http://dev.greenlight.bcovrin.vonx.io), click the `Domain` page, refresh, and paste the Faber public DID into the `Filter:` field: +On the ledger browser of the [BCovrin ledger](http://test.bcovrin.vonx.io), click the `Domain` page, refresh, and paste the Faber public DID into the `Filter:` field:
Show me a screenshot - Search Ledger by DID + Search Ledger by DID
The ledger browser should refresh and display the four (4) transactions on the ledger related to this DID: @@ -420,26 +420,26 @@ The ledger browser should refresh and display the four (4) transactions on the l
Show me the ledger transactions - DID Transaction - DID Endpoint Transaction - Schema Transaction - Credential Definition Transaction + DID Transaction + DID Endpoint Transaction + Schema Transaction + Credential Definition Transaction
You can also look up the Schema and Credential Definition information using Faber's swagger page. Use the **`GET /schemas/created`** endpoint to get a list of schemas, including the one `schema_id` that the Faber agent has defined. Keep this section of the Swagger page expanded as we'll need to copy the Id as part of starting the issue credential protocol coming next.
Show me a screenshot - Search Schemas - Search Schemas + Search Schemas + Search Schemas
Likewise use the **`GET /credential-definitions/created`** endpoint to get the list of the one (in this case) credential definition id created by Faber. Keep this section of the Swagger page expanded as we'll also need to copy the Id as part of starting the issue credential protocol coming next.
Show me a screenshot - Search Credential Definitions - Search Credential Definitions + Search Credential Definitions + Search Credential Definitions
**Hint**: Remember how the schema and credential definitions were created for you as Faber started up? To do it yourself, use the **`POST`** versions of these endpoints. Now you know! @@ -458,7 +458,7 @@ First, get the connection Id for Faber's connection with Alice. You can copy tha
Click here to see a screenshot - Connection Id + Connection Id
For the following fields, scroll on Faber's Swagger page to the listed endpoint, execute (if necessary), copy the response value and paste as the values of the following JSON items: @@ -513,8 +513,8 @@ OK, finally, you are ready to click `Execute`. The request should work, but if i
Show me a screenshot - credential offer - Faber Submit Credential Offer - Faber Submit Credential Offer + Faber Submit Credential Offer + Faber Submit Credential Offer
To confirm the issuance worked, scroll up on the Faber Swagger page to the `issue-credential v2.0` section and execute the **`GET /issue-credential-2.0/records`** endpoint. You should see a lot of information about the exchange just initiated. @@ -527,7 +527,7 @@ Alice's agent first received a notification of a Credential Offer, to which it r
Show me a screenshot - issue credential - Issue Credential + Issue Credential
### Alice Stores Credential in her Wallet @@ -536,16 +536,16 @@ We can check (via Alice's Swagger interface) the issue credential status by hitt
Show me a screenshot - check credential exchange status - - + +
First, we need the `cred_ex_id` from the API call response above, or from the event in the terminal; use the endpoint **`POST /issue-credential-2.0/records/{cred_ex_id}/store`** to tell Alice's ACA-Py instance to store the credential in agent storage (aka the Indy Wallet). Note that in the JSON for that endpoint we can provide a credential Id to store in the wallet by setting a value in the `credential_id` string. A real controller might use the `cred_ex_id` for that, or use something else that makes sense in the agent's business scenario (but the agent generates a random credential identifier by default).
Show me a screenshot - store credential - - + +
Now, in Alice’s swagger browser tab, find the `credentials` section and within that, execute the **`GET /credentials`** endpoint. There should be a list of credentials held by Alice, with just a single entry, the credential issued from the Faber agent. Note that the element `referent` is the value of the `credential_id` element used in other calls. `referent` is the name returned in the `indy-sdk` call to get the set of credentials for the wallet and ACA-Py code does not change it in the response. @@ -556,16 +556,16 @@ On the Faber side, we can see by scanning back in the terminal that it receive e
Show me Faber's event activity - - + +
Note that once the credential processing completed, Faber's agent deleted the credential exchange record from its wallet. This can be confirmed by executing the endpoint **`GET /issue-credential-2.0/records`**
Show me a screenshot - - + +
You’ve done it, issued a credential! w00t! @@ -581,7 +581,7 @@ Those that know something about the Indy process for issuing a credential and th If you would like to perform all of the issuance steps manually on the Faber agent side, use a sequence of the other `/issue-credential-2.0/` messages. Use the **`GET /issue-credential-2.0/records`** to both check the credential exchange state as you progress through the protocol and to find some of the data you’ll need in executing the sequence of requests. -The following table lists endpoints that you need to call ("REST service") and callbacks that your agent will receive ("callback") that your need to respond to. See the [detailed API docs](../../features/AdminAPI). +The following table lists endpoints that you need to call ("REST service") and callbacks that your agent will receive ("callback") that your need to respond to. See the [detailed API docs](../features/AdminAPI). | Protocol Step | Faber (Issuer) | Alice (Holder) | Notes | | -------------------- | ---------------------- | ------------------ | ----- | @@ -663,8 +663,8 @@ Notice that the proof request is using a predicate to check if Alice is older th
Show me a screenshot - send proof request - Send Proof Request - Send Proof Request + Send Proof Request + Send Proof Request
### Alice - Responding to the Proof Request @@ -673,8 +673,8 @@ As before, Alice receives a webhook event from her agent telling her she has rec
Show me Alice's event activity - Proof Request - Proof Request + Proof Request + Proof Request
In a real scenario, for example if Alice had a mobile agent on her smartphone, the agent would prompt Alice whether she wanted to respond or not. @@ -687,9 +687,9 @@ You can see some of Faber's activity below:
Show me Faber's event activity - Receive and Verify Proof - Receive and Verify Proof - Receive and Verify Proof + Receive and Verify Proof + Receive and Verify Proof + Receive and Verify Proof
### Present Proof Notes @@ -700,7 +700,7 @@ As with the issue credential process, the agents handled some of the presentatio If you would like to perform all of the proof request/response steps manually, you can call all of the individual `/present-proof-2.0` messages. -The following table lists endpoints that you need to call ("REST service") and callbacks that your agent will receive ("callback") that you need to respond to. See the [detailed API docs](../../features/AdminAPI). +The following table lists endpoints that you need to call ("REST service") and callbacks that your agent will receive ("callback") that you need to respond to. See the [detailed API docs](../features/AdminAPI). | Protocol Step | Faber (Verifier) | Alice (Holder/Prover) | Notes | | -------------------- | ---------------------- | ------------------------- | ----- | diff --git a/docs/demo/AriesPostmanDemo.md b/docs/demo/AriesPostmanDemo.md new file mode 100644 index 00000000..7d5e85a9 --- /dev/null +++ b/docs/demo/AriesPostmanDemo.md @@ -0,0 +1,111 @@ +# Aries Postman Demo + +In these demos we will use Postman as our controller client. + +## Contents + +- [Getting Started](#getting-started) + - [Installing Postman](#installing-postman) + - [Creating a workspace](#creating-a-workspace) + - [Importing the environment](#importing-the-environment) + - [Importing the collections](#importing-the-collections) + - [Postman basics](#postman-basics) +- [Experimenting with the vc-api endpoints](#experimenting-with-the-vc-api-endpoints) + - [Register new dids](#register-new-dids) + - [Issue credentials](#issue-credentials) + - [Store and retrieve credentials](#store-and-retrieve-credentials) + - [Verify credentials](#verify-credentials) + - [Prove a presentation](#prove-a-presentation) + - [Verify a presentation](#verify-a-presentation) + +## Getting Started + +Welcome to the Postman demo. This is an addition to the available OpenAPI demo, providing a set of collections to test and demonstrate various aca-py functionalities. + +### Installing Postman + +Download, install and launch [postman](https://www.postman.com/downloads/). + +### Creating a workspace + +Create a new postman workspace labeled "acapy-demo". + +### Importing the environment + +In the environment tab from the left, click the import button. You can paste this [link](https://raw.githubusercontent.com/hyperledger/aries-cloudagent-python/main/demo/postman/environment.json) or copy the json from the [environment file](./postman/environment.json). + +Make sure you have the environment set as your active environment. + +### Importing the collections + +In the collections tab from the left, click the import button. + +The following collections are available: + +- [vc-api](https://raw.githubusercontent.com/hyperledger/aries-cloudagent-python/main/demo/postman/collections/vc-api.json) + +### Postman basics + +Once you are setup, you will be ready to run postman requests. The order of the request is important, since some values are saved dynamically as environment variables for subsequent calls. + +You have your environment where you define variables to be accessed by your collections. + +Each collection consists of a series of requests which can be configured independently. + +## Experimenting with the vc-api endpoints + +Make sure you have a demo agent available. You can use the following command to deploy one: + +```bash +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber --bg +``` + +When running for the first time, please allow some time for the images to build. + +### Register new dids + +The first 2 requests for this collection will create 2 did:keys. We will use those in subsequent calls to issue `Ed25519Signature2020` and `BbsBlsSignature2020` credentials. +Run the 2 did creation requests. These requests will use the `/wallet/did/create` endpoint. + +### Issue credentials + +For issuing, you must input a [w3c compliant json-ld credential](https://www.w3.org/TR/vc-data-model/) and [issuance options](https://w3c-ccg.github.io/vc-api/#issue-credential) in your request body. The issuer field must be a registered did from the agent's wallet. The suite will be derived from the did method. + +```json +{ + "credential": { + "@context": [ + "https://www.w3.org/2018/credentials/v1" + ], + "type": [ + "VerifiableCredential" + ], + "issuer": "did:example:123", + "issuanceDate": "2022-05-01T00:00:00Z", + "credentialSubject": { + "id": "did:example:123" + } + }, + "options": {} +} +``` + +Some examples have been pre-configured in the collection. Run the requests and inspect the results. Experiment with different credentials. + +### Store and retrieve credentials + +Your last issued credential will be stored as an environment variable for subsequent calls, such as storing, verifying and including in a presentation. + +Try running the store credential request, then retrieve the credential with the list and fetch requests. Try going back and forth between the issuance endpoints and the storage endpoints to store multiple different credentials. + +### Verify credentials + +You can verify your last issued credential with this endpoint or any issued credential you provide to it. + +### Prove a presentation + +Proving a presentation is an action where a holder will prove ownership of a credential by signing or demonstrating authority over the document. + +### Verify a presentation + +The final request is to verify a presentation. diff --git a/docs/demo/README.md b/docs/demo/README.md index 15ae3e9c..61a0fe5b 100644 --- a/docs/demo/README.md +++ b/docs/demo/README.md @@ -26,7 +26,7 @@ There are several demos available for ACA-Py mostly (but not only) aimed at deve - [Multi-ledger](#multi-ledger) - [Multi-tenancy](#multi-tenancy) - [Multi-tenancy *with Mediation*!!!](#multi-tenancy-with-mediation) - - [Other Environment Settings](#other-environment-settings) +- [Other Environment Settings](#other-environment-settings) - [Learning about the Alice/Faber code](#learning-about-the-alicefaber-code) - [OpenAPI (Swagger) Demo](#openapi-swagger-demo) - [Performance Demo](#performance-demo) @@ -43,7 +43,7 @@ In your browser, go to the docker playground service [Play with Docker](https:// ```bash git clone https://github.com/hyperledger/aries-cloudagent-python cd aries-cloudagent-python/demo -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber ``` Now to start Alice's agent. Click the "+Add a new instance" button again to open another terminal session. Run the following commands to start Alice's agent: @@ -51,7 +51,7 @@ Now to start Alice's agent. Click the "+Add a new instance" button again to open ```bash git clone https://github.com/hyperledger/aries-cloudagent-python cd aries-cloudagent-python/demo -LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo alice +LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo alice ``` Alice's agent is now running. diff --git a/docs/deploying/AnonCredsWalletType.md b/docs/deploying/AnonCredsWalletType.md index 2023faed..f61d4515 100644 --- a/docs/deploying/AnonCredsWalletType.md +++ b/docs/deploying/AnonCredsWalletType.md @@ -1,8 +1,8 @@ -# AnonCreds-Rs Support +# AnonCreds-RS Support A new wallet type has been added to Aca-Py to support the new anoncreds-rs library: -``` +```bash --wallet-type askar-anoncreds ``` @@ -16,7 +16,7 @@ Within the protocols, there are new `handler` libraries to support the new `anon The existing `indy` code are in: -``` +```bash aries_cloudagent/protocols/issue_credential/v2_0/formats/indy/handler.py aries_cloudagent/protocols/indy/anoncreds/pres_exch_handler.py aries_cloudagent/protocols/present_proof/v2_0/formats/indy/handler.py @@ -24,7 +24,7 @@ aries_cloudagent/protocols/present_proof/v2_0/formats/indy/handler.py The new `anoncreds` code is in: -``` +```bash aries_cloudagent/protocols/issue_credential/v2_0/formats/anoncreds/handler.py aries_cloudagent/protocols/present_proof/anoncreds/pres_exch_handler.py aries_cloudagent/protocols/present_proof/v2_0/formats/anoncreds/handler.py @@ -32,7 +32,7 @@ aries_cloudagent/protocols/present_proof/v2_0/formats/anoncreds/handler.py The Indy handler checks to see if the wallet type is `askar-anoncreds` and if so delegates the calls to the anoncreds handler, for example: -``` +```python # Temporary shim while the new anoncreds library integration is in progress wallet_type = profile.settings.get_value("wallet.type") if wallet_type == "askar-anoncreds": @@ -41,7 +41,7 @@ The Indy handler checks to see if the wallet type is `askar-anoncreds` and if so ... and then: -``` +```python # Temporary shim while the new anoncreds library integration is in progress if self.anoncreds_handler: return self.anoncreds_handler.get_format_identifier(message_type) @@ -49,20 +49,19 @@ The Indy handler checks to see if the wallet type is `askar-anoncreds` and if so To run the alice/faber demo using the new anoncreds library, start the demo with: -``` +```bash --wallet-type askar-anoncreds ``` There are no anoncreds-specific integration tests, for the new anoncreds functionality the agents within the integration tests are started with: -``` +```bash --wallet-type askar-anoncreds ``` Everything should just work!!! -Theoretically ATH should work with anoncreds as well, by setting the wallet type (see https://github.com/hyperledger/aries-agent-test-harness#extra-backchannel-specific-parameters). - +Theoretically ATH should work with anoncreds as well, by setting the wallet type (see [https://github.com/hyperledger/aries-agent-test-harness#extra-backchannel-specific-parameters](https://github.com/hyperledger/aries-agent-test-harness#extra-backchannel-specific-parameters)). ## Revocation (new in anoncreds) @@ -72,31 +71,29 @@ The changes are significant. Notably: - In the new way, the AnonCreds library expects the identifier for the revregentry used (aka the timestamp), the accumulator, and the full state (0s and 1s) of the revocation status of all credentials in the registry. - The conversion from delta to full state must be handled in the Indy resolver -- not in the "generic" ACA-Py code, since the other ledgers automagically provide the full state. In fact, we're likely to update Indy VDR to always provide the full state. The "common" (post resolver) code should get back from the resolver the full state. -The Tails file changes are minimal -- nothing about the file itself changed. What changed: - -- the tails-file-server can be published to WITHOUT knowing the ID of the RevRegEntry, since that is not known when the tails file is generated/published. See: https://github.com/bcgov/indy-tails-server/pull/53 -- basically, by publishing based on the hash. -- The tails-file is not needed by the issuer after generation. It used to be needed for (I think) issuing and revoking credentials. Those are now done without the tails file. See: https://github.com/hyperledger/aries-cloudagent-python/pull/2302/files. That code is already in Main, so you should have it. +The Tails File changes are minimal -- nothing about the file itself changed. What changed: +- the tails-file-server can be published to WITHOUT knowing the ID of the RevRegEntry, since that is not known when the tails file is generated/published. See: [https://github.com/bcgov/indy-tails-server/pull/53](https://github.com/bcgov/indy-tails-server/pull/53) -- basically, by publishing based on the hash. +- The tails-file is not needed by the issuer after generation. It used to be needed for issuing and revoking credentials. Those are now done without the tails file. See: [https://github.com/hyperledger/aries-cloudagent-python/pull/2302/files](https://github.com/hyperledger/aries-cloudagent-python/pull/2302/files). That code is already in Main, so you should have it. ## Outstanding work -* revocation notifications (not sure if they're included in `anoncreds-rs` updates, haven't tested them ...) -* revocation support - complete the revocation implementation (support for unhappy path scenarios) -* testing - various scenarios like mediation, multitenancy etc. +- revocation notifications (not sure if they're included in `anoncreds-rs` updates, haven't tested them ...) +- revocation support - complete the revocation implementation (support for unhappy path scenarios) +- testing - various scenarios like mediation, multitenancy etc. -- unit tests (in the new anoncreds package) (see https://github.com/hyperledger/aries-cloudagent-python/pull/2596/commits/229ffbba209aff0ea7def5bad6556d93057f3c2a) +- unit tests (in the new anoncreds package) (see [https://github.com/hyperledger/aries-cloudagent-python/pull/2596/commits/229ffbba209aff0ea7def5bad6556d93057f3c2a](https://github.com/hyperledger/aries-cloudagent-python/pull/2596/commits/229ffbba209aff0ea7def5bad6556d93057f3c2a)) - unit tests (review and possibly update unit tests for the credential and presentation integration) - endorsement (not implemented with new anoncreds code) - wallet upgrade (askar to askar-anoncreds) - update V1.0 versions of the Credential and Presentation endpoints to use anoncreds -- any other anoncreds issues - https://github.com/hyperledger/aries-cloudagent-python/issues?q=is%3Aopen+is%3Aissue+label%3AAnonCreds - +- any other anoncreds issues - [https://github.com/hyperledger/aries-cloudagent-python/issues?q=is%3Aopen+is%3Aissue+label%3AAnonCreds](https://github.com/hyperledger/aries-cloudagent-python/issues?q=is%3Aopen+is%3Aissue+label%3AAnonCreds) ## Retiring old Indy and Askar (credx) Code The main changes for the Credential and Presentation support are in the following two files: -``` +```bash aries_cloudagent/protocols/issue_credential/v2_0/messages/cred_format.py aries_cloudagent/protocols/present_proof/v2_0/messages/pres_format.py ``` @@ -105,7 +102,7 @@ The `INDY` handler just need to be re-pointed to the new anoncreds handler, and The new code is already in place (in comments). For example for the Credential handler: -``` +```python To make the switch from indy to anoncreds replace the above with the following INDY = FormatSpec( "hlindy/", diff --git a/docs/deploying/ContainerImagesAndGithubActions.md b/docs/deploying/ContainerImagesAndGithubActions.md index 359c22a9..bdc28e19 100644 --- a/docs/deploying/ContainerImagesAndGithubActions.md +++ b/docs/deploying/ContainerImagesAndGithubActions.md @@ -13,7 +13,6 @@ are now built and published directly from the Aries Cloud Agent - Python project repository and made available through the [Github Packages Container Registry](https://ghcr.io). - ## Image This project builds and publishes the `ghcr.io/hyperledger/aries-cloudagent-python` image. @@ -26,13 +25,13 @@ end, there are multiple variants of ACA-Py built to suit the needs of a variety of environments and workflows. There are currently two main variants: - "Standard" - The default configuration of ACA-Py, including: - - Aries Askar for secure storage - - Indy VDR for Indy ledger communication - - Indy Shared Libraries for AnonCreds + - Aries Askar for secure storage + - Indy VDR for Indy ledger communication + - Indy Shared Libraries for AnonCreds - "Indy" - The legacy configuration of ACA-Py, including: - - Indy SDK Wallet for secure storage - - Indy SDK Ledger for Indy ledger communication - - Indy SDK for AnonCreds + - Indy SDK Wallet for secure storage + - Indy SDK Ledger for Indy ledger communication + - Indy SDK for AnonCreds These two image variants are largely distinguished by providers for Indy Network and AnonCreds support. The Standard variant is recommended for new projects. @@ -58,30 +57,30 @@ There are several key differences that should be noted between the two image variants and between the BC Gov ACA-Py images. - Standard Image - - Based on slim variant of Debian - - Does **NOT** include `libindy` - - Default user is `aries` - - Uses container's system python environment rather than `pyenv` - - Askar and Indy Shared libraries are installed as dependencies of ACA-Py through pip from pre-compiled binaries included in the python wrappers - - Built from repo contents + - Based on slim variant of Debian + - Does **NOT** include `libindy` + - Default user is `aries` + - Uses container's system python environment rather than `pyenv` + - Askar and Indy Shared libraries are installed as dependencies of ACA-Py through pip from pre-compiled binaries included in the python wrappers + - Built from repo contents - Indy Image - - Based on slim variant of Debian - - Built from multi-stage build step (`indy-base` in the Dockerfile) which includes Indy dependencies; this could be replaced with an explicit `indy-python` image from the Indy SDK repo - - Includes `libindy` but does **NOT** include the Indy CLI - - Default user is `indy` - - Uses container's system python environment rather than `pyenv` - - Askar and Indy Shared libraries are installed as dependencies of ACA-Py through pip from pre-compiled binaries included in the python wrappers - - Built from repo contents - - Includes Indy postgres storage plugin + - Based on slim variant of Debian + - Built from multi-stage build step (`indy-base` in the Dockerfile) which includes Indy dependencies; this could be replaced with an explicit `indy-python` image from the Indy SDK repo + - Includes `libindy` but does **NOT** include the Indy CLI + - Default user is `indy` + - Uses container's system python environment rather than `pyenv` + - Askar and Indy Shared libraries are installed as dependencies of ACA-Py through pip from pre-compiled binaries included in the python wrappers + - Built from repo contents + - Includes Indy postgres storage plugin - `bcgovimages/aries-cloudagent` - - (Usually) based on Ubuntu - - Based on `von-image` - - Default user is `indy` - - Includes `libindy` and Indy CLI - - Uses `pyenv` - - Askar and Indy Shared libraries built from source - - Built from ACA-Py python package uploaded to PyPI - - Includes Indy postgres storage plugin + - (Usually) based on Ubuntu + - Based on `von-image` + - Default user is `indy` + - Includes `libindy` and Indy CLI + - Uses `pyenv` + - Askar and Indy Shared libraries built from source + - Built from ACA-Py python package uploaded to PyPI + - Includes Indy postgres storage plugin ## Github Actions diff --git a/docs/deploying/IndySDKtoAskarMigration.md b/docs/deploying/IndySDKtoAskarMigration.md index 964734c2..a95d8729 100644 --- a/docs/deploying/IndySDKtoAskarMigration.md +++ b/docs/deploying/IndySDKtoAskarMigration.md @@ -159,4 +159,4 @@ please use the Aries Cloud Agent Python channel on [Hyperledger Discord], or submit a [GitHub issue to the ACA-Py repository]. [Hyperledger Discord]: https://discord.gg/hyperledger -[GitHub issue to the ACA-Py repository]: https://github.com/hyperledger/aries-cloudagent-python/issues \ No newline at end of file +[GitHub issue to the ACA-Py repository]: https://github.com/hyperledger/aries-cloudagent-python/issues diff --git a/docs/deploying/Poetry.md b/docs/deploying/Poetry.md index 9bfde340..fc7dc44a 100644 --- a/docs/deploying/Poetry.md +++ b/docs/deploying/Poetry.md @@ -25,24 +25,28 @@ poetry shell ``` Alternatively you can source the environment settings in the current shell -``` + +```bash source $(poetry env info --path)/bin/activate ``` for powershell users this would be -``` + +```powershell (& ((poetry env info --path) + "\Scripts\activate.ps1") ``` ### Deactivating the Virtual Environment When using `poetry shell` + ```bash exit ``` When using the `activate` script -``` + +```bash deactivate ``` @@ -120,6 +124,7 @@ poetry install -E extras-name ``` for example + ```bash poetry install -E "askar bbs indy" ``` diff --git a/docs/deploying/RedisPlugins.md b/docs/deploying/RedisPlugins.md index da4ee090..e3428a12 100644 --- a/docs/deploying/RedisPlugins.md +++ b/docs/deploying/RedisPlugins.md @@ -1,13 +1,15 @@ # ACA-Py Redis Plugins -# [aries-acapy-plugin-redis-events](https://github.com/bcgov/aries-acapy-plugin-redis-events/blob/master/README.md) [`redis_queue`] + +## [aries-acapy-plugin-redis-events](https://github.com/hyperledger/aries-acapy-plugins/blob/main/redis_events/README.md) `redis_queue` -It provides a mechansim to persists both inbound and outbound messages using redis, deliver messages and webhooks, and dispatch events. +It provides a mechanism to persists both inbound and outbound messages using redis, deliver messages and webhooks, and dispatch events. -More details can be found [here](https://github.com/bcgov/aries-acapy-plugin-redis-events/blob/master/README.md). +More details can be found [here](https://github.com/hyperledger/aries-acapy-plugins/blob/main/redis_events/README.md). -### Plugin configuration [`yaml`] -``` +### Redis Queue configuration `yaml` + +```yaml redis_queue: connection: connection_url: "redis://default:test1234@172.28.0.103:6379" @@ -50,6 +52,7 @@ redis_queue: acapy::keylist::updated: keylist deliver_webhook: true ``` + - `redis_queue.connection.connection_url`: This is required and is expected in `redis://{username}:{password}@{host}:{port}` format. - `redis_queue.inbound.acapy_inbound_topic`: This is the topic prefix for the inbound message queues. Recipient key of the message are also included in the complete topic name. The final topic will be in the following format `acapy_inbound_{recip_key}` - `redis_queue.inbound.acapy_direct_resp_topic`: Queue topic name for direct responses to inbound message. @@ -59,24 +62,30 @@ redis_queue: - `event.event_webhook_topic_maps`: Event to webhook topic map - `event.deliver_webhook`: When set to true, this will deliver webhooks to endpoints specified in `admin.webhook_urls`. By default, set to true. -### Usage +### Redis Plugin Usage + +#### Redis Plugin With Docker -#### With Docker Running the plugin with docker is simple. An -example [docker-compose.yml](https://github.com/bcgov/aries-acapy-plugin-redis-events/blob/master/docker/docker-compose.yml) file is available which launches both ACA-Py with redis and an accompanying Redis cluster. +example [docker-compose.yml](https://github.com/hyperledger/aries-acapy-plugins/blob/main/redis_events/docker/docker-compose.yml) file is available which launches both ACA-Py with redis and an accompanying Redis cluster. ```sh -$ docker-compose up --build -d +docker-compose up --build -d ``` -More details can be found [here](https://github.com/bcgov/aries-acapy-plugin-redis-events/blob/master/docker/README.md). -#### Without Docker +More details can be found [here](https://github.com/hyperledger/aries-acapy-plugins/blob/main/redis_events/README.md). + +#### Without Docker + Installation -``` + +```bash pip install git+https://github.com/bcgov/aries-acapy-plugin-redis-events.git ``` + Startup ACA-Py with `redis_queue` plugin loaded -``` + +```bash docker network create --subnet=172.28.0.0/24 `network_name` export REDIS_PASSWORD=" ... As specified in redis_cluster.conf ... " export NETWORK_NAME="`network_name`" @@ -88,8 +97,10 @@ aca-py start \ ``` Regardless of the options above, you will need to startup `deliverer` and `relay`/`mediator` service as a bridge to receive inbound messages. Consider the following to build your `docker-compose` file which should also start up your redis cluster: + - Relay + Deliverer - ``` + + ```yaml relay: image: redis-relay build: @@ -139,8 +150,10 @@ Regardless of the options above, you will need to startup `deliverer` and `relay networks: - acapy_default ``` + - Mediator + Deliverer - ``` + + ```yaml mediator: image: acapy-redis-queue build: @@ -191,7 +204,7 @@ Regardless of the options above, you will need to startup `deliverer` and `relay Both relay and mediator [demos](https://github.com/bcgov/aries-acapy-plugin-redis-events/tree/master/demo) are also available. -# [aries-acapy-cache-redis](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/README.md) [`redis_cache`] +## [aries-acapy-cache-redis](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/README.md) `redis_cache` ACA-Py uses a modular cache layer to story key-value pairs of data. The purpose @@ -200,8 +213,9 @@ caching needs. More details can be found [here](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/README.md). -### Plugin configuration [`yaml`] -``` +### Redis Cache Plugin configuration `yaml` + +```yaml redis_cache: connection: "redis://default:test1234@172.28.0.103:6379" max_connection: 50 @@ -211,48 +225,57 @@ redis_cache: ssl: cacerts: ./ca.crt ``` + - `redis_cache.connection`: This is required and is expected in `redis://{username}:{password}@{host}:{port}` format. - `redis_cache.max_connection`: Maximum number of redis pool connections. Default: 50 - `redis_cache.credentials.username`: Redis instance username - `redis_cache.credentials.password`: Redis instance password - `redis_cache.ssl.cacerts` -### Usage +### Redis Cache Usage + +#### Redis Cache Using Docker -#### With Docker - Running the plugin with docker is simple and straight-forward. There is an example [docker-compose.yml](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/docker-compose.yml) file in the root of the project that launches both ACA-Py and an accompanying Redis instance. Running it is as simple as: ```sh - $ docker-compose up --build -d + docker-compose up --build -d ``` -- To launch ACA-Py with an accompanying redis cluster of 6 nodes [3 primaries and 3 replicas], please refer to example [docker-compose.cluster.yml](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/docker-compose.cluster.yml) and run the following: +- To launch ACA-Py with an accompanying redis cluster of 6 nodes (3 primaries and 3 replicas), please refer to example [docker-compose.cluster.yml](https://github.com/Indicio-tech/aries-acapy-cache-redis/blob/main/docker-compose.cluster.yml) and run the following: Note: Cluster requires external docker network with specified subnet ```sh - $ docker network create --subnet=172.28.0.0/24 `network_name` - $ export REDIS_PASSWORD=" ... As specified in redis_cluster.conf ... " - $ export NETWORK_NAME="`network_name`" - $ docker-compose -f docker-compose.cluster.yml up --build -d + docker network create --subnet=172.28.0.0/24 `network_name` + export REDIS_PASSWORD=" ... As specified in redis_cluster.conf ... " + export NETWORK_NAME="`network_name`" + docker-compose -f docker-compose.cluster.yml up --build -d ``` -#### Without Docker + +#### Redis Cache Without Docker + Installation -``` + +```bash pip install git+https://github.com/Indicio-tech/aries-acapy-cache-redis.git ``` + Startup ACA-Py with `redis_cache` plugin loaded -``` + +```bash aca-py start \ --plugin acapy_cache_redis.v0_1 \ --plugin-config plugins-config.yaml \ # ... the remainder of your startup arguments ``` + or -``` + +```bash aca-py start \ --plugin acapy_cache_redis.v0_1 \ --plugin-config-value "redis_cache.connection=redis://redis-host:6379/0" \ @@ -261,6 +284,7 @@ aca-py start \ --plugin-config-value "redis_cache.credentials.password=password" \ # ... the remainder of your startup arguments ``` -## RedisCluster -If you startup a redis cluster and an ACA-Py agent loaded with either `redis_queue` or `redis_cache` plugin or both, then during the initialization of the plugin, it will bind an instance of `redis.asyncio.RedisCluster` [onto the `root_profile`]. Other plugin will have access to this redis client for it's functioning. This is done for efficiency and to avoid duplication of resources. +## Redis Cluster + +If you startup a redis cluster and an ACA-Py agent loaded with either `redis_queue` or `redis_cache` plugin or both, then during the initialization of the plugin, it will bind an instance of `redis.asyncio.RedisCluster` (onto the `root_profile`). Other plugin will have access to this redis client for it's functioning. This is done for efficiency and to avoid duplication of resources. diff --git a/docs/deploying/UpgradingACA-Py.md b/docs/deploying/UpgradingACA-Py.md index c1ef8225..1b41c5e5 100644 --- a/docs/deploying/UpgradingACA-Py.md +++ b/docs/deploying/UpgradingACA-Py.md @@ -26,7 +26,7 @@ Once an upgrade is identified as needed, the process is: - Collect (if any) the actions to be taken to get from the version recorded in secure storage to the current [version.py] - Execute the actions from oldest to newest. - - If the same action is collected more than once (e.g., "Resave the + - If the same action is collected more than once (e.g., "Resave the Connection Records" is defined for two different versions), perform the action only once. - Store the current ACA-Py version (from [version.py]) in the secure storage @@ -60,35 +60,40 @@ connections), you may want to do a test upgrade offline first, to see if there is likely to be a service disruption during the upgrade. Plan accordingly! ## Tagged upgrades -Upgrades are defined in the [Upgrade Definition YML file], in addition to specifying upgrade actions by version they can also be specified by named tags. Unlike version based upgrades where all applicable version based actions will be performed based upon sorted order of versions, with named tags only actions corresponding to provided tags will be performed. Note: `--force-upgrade` is required when running name tags based upgrade [i.e. provding `--named-tag`] -Tags are specfied in YML file as below: -``` +Upgrades are defined in the [Upgrade Definition YML file], in addition to specifying upgrade actions by version they can also be specified by named tags. Unlike version based upgrades where all applicable version based actions will be performed based upon sorted order of versions, with named tags only actions corresponding to provided tags will be performed. Note: `--force-upgrade` is required when running name tags based upgrade (i.e. providing `--named-tag`). + +Tags are specified in YML file as below: + +```yaml fix_issue_rev_reg: fix_issue_rev_reg_records: true ``` -Example -``` +Example: + +```bash ./scripts/run_docker upgrade --force-upgrade --named-tag fix_issue_rev_reg -In case, running multiple tags [say test1 & test2]: +# In case, running multiple tags [say test1 & test2]: ./scripts/run_docker upgrade --force-upgrade --named-tag test1 --named-tag test2 ``` ## Subwallet upgrades + With multitenant enabled, there is a subwallet associated with each tenant profile, so there is a need to upgrade those sub wallets in addition to the base wallet associated with root profile. There are 2 options to perform such upgrades: - - `--upgrade-all-subwallets` - - This will apply the upgrade steps to all sub wallets [tenant profiles] and the base wallet [root profiles]. - - - `--upgrade-subwallet` - This will apply the upgrade steps to specified sub wallets [identified by wallet id] and the base wallet. +- `--upgrade-all-subwallets` + +This will apply the upgrade steps to all sub wallets (tenant profiles) and the base wallet (root profiles). + +- `--upgrade-subwallet` + +This will apply the upgrade steps to specified sub wallets (identified by wallet id) and the base wallet. - Note: multiple specification allowed +Note: multiple specifications allowed ## Exceptions @@ -126,4 +131,4 @@ options in future (post-0.8.1) ACA-Py versions. [CHANGELOG.md]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/CHANGELOG.md [version.py]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/version.py -[Upgrade Definition YML file]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/commands/default_version_upgrade_config.yml \ No newline at end of file +[Upgrade Definition YML file]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/commands/default_version_upgrade_config.yml diff --git a/docs/deploying/deploymentModel.md b/docs/deploying/deploymentModel.md index da9e0285..8d49bf80 100644 --- a/docs/deploying/deploymentModel.md +++ b/docs/deploying/deploymentModel.md @@ -7,7 +7,7 @@ This document is a "concept of operations" for an instance of an Aries cloud agent deployed from the primary artifact (a PyPi package) produced by this repo. In such a deployment there are **always** two components - a configured agent itself, and a controller that injects into that agent the business rules for the particular agent instance (see diagram). -![ACA-Py Deployment Overview](../../assets/deploymentModel-full.png "ACA-Py Deployment Overview") +![ACA-Py Deployment Overview](../assets/deploymentModel-full.png "ACA-Py Deployment Overview") The deployed agent messages with other agents via DIDComm protocols, and as events associated with those messages occur, sends webhook HTTP notifications to the controller. The agent also exposes for the controller's exclusive use an HTTP API covering all of the administrative handlers for those events. The controller receives the notifications from the agent, decides (with business rules - possible by asking a person using a UI) how to respond to the event and calls back to the agent via the HTTP API. Of course, the controller may also initiate events (e.g. messaging another agent) by calling that same API. @@ -23,7 +23,7 @@ The sections below detail the internals of the ACA-Py and it's configurable elem **Aries cloud agent** implement services to manage the execution of DIDComm messaging protocols for interacting with other DIDComm agents, and exposes an administrative HTTP API that supports a controller to direct how the agent should respond to messaging events. The agent relies on the controller to provide the business rules for handling the messaging events, and to initiate the execution of new DIDComm protocol instances. The internals of an ACA-Py instance is diagramed below. -![ACA-Py Agent Internals](../../assets/deploymentModel-agent.png "ACA-Py Agent Internals") +![ACA-Py Agent Internals](../assets/deploymentModel-agent.png "ACA-Py Agent Internals") Instances of the Aries cloud agents are configured with the following sub-components: @@ -41,7 +41,7 @@ Instances of the Aries cloud agents are configured with the following sub-compon A controller provides the personality of Aries cloud agent instance - the business logic (human, machine or rules driven) that drive the behaviour of the agent. The controller’s “Business Logic” in a cloud agent could be built into the controller app, could be an integration back to an enterprise system, or even a user interface for an individual. In all cases, the business logic provide responses to agent events or initiates agent actions. A deployed controller talks to a single Aries cloud agent deployment and manages the configuration of that agent. Both can be configured and deployed to support horizontal scaling. -![Controller Internals](../../assets/deploymentModel-controller.png "Controller Internals") +![Controller Internals](../assets/deploymentModel-controller.png "Controller Internals") Generically, a controller is a web app invoked by HTTP webhook calls from its corresponding Aries cloud agent and invoking the DIDComm administration capabilities of the Aries cloud agent by calling the REST API exposed by that cloud agent. As well as responding to Aries cloud agent events, the controller initiates DIDComm protocol instances using the same REST API. @@ -49,11 +49,11 @@ The controller and Aries cloud agent deployment **MUST** secure the HTTP interfa A controller implements the following capabilities. -* **Initiator** - provides a mechanism to initiate new DIDComm protocol instances. The initiator invokes the REST API exposed by the Aries cloud agent to initiate the creation of a DIDComm protocol instance. For example, a permit-issuing service uses this mechanism to issue a Verifiable Credential associated with the issuance of a new permit. -* **Responder** - subscribes to and responds to events from the Aries cloud agent protocol message handlers, providing business-driven responses. The responder might respond immediately, or the event might cause a delay while the decision is determined, perhaps by sending the request to a person to decide. The controller may persist the event response state if the event is asynchronous - for example, when the event is passed to a person who may respond when they next use the web app. -* **Configuration** - manages the controller configuration data and the configuration of the Aries cloud agent. Configuration in this context includes things like: - * Credentials and Proof Requests to be Issued/Verified (respectively) by the Aries cloud agent. - * The configuration of the webhook handler to which the responder subscribes. +- **Initiator** - provides a mechanism to initiate new DIDComm protocol instances. The initiator invokes the REST API exposed by the Aries cloud agent to initiate the creation of a DIDComm protocol instance. For example, a permit-issuing service uses this mechanism to issue a Verifiable Credential associated with the issuance of a new permit. +- **Responder** - subscribes to and responds to events from the Aries cloud agent protocol message handlers, providing business-driven responses. The responder might respond immediately, or the event might cause a delay while the decision is determined, perhaps by sending the request to a person to decide. The controller may persist the event response state if the event is asynchronous - for example, when the event is passed to a person who may respond when they next use the web app. +- **Configuration** - manages the controller configuration data and the configuration of the Aries cloud agent. Configuration in this context includes things like: + - Credentials and Proof Requests to be Issued/Verified (respectively) by the Aries cloud agent. + - The configuration of the webhook handler to which the responder subscribes. While there are several examples of controllers, there is no “cookie cutter” repository to fork and customize. A controller is just a web service that receives HTTP requests (webhooks) and sends HTTP messages to the Aries cloud agent it controls via the REST API exposed by that agent. @@ -63,5 +63,5 @@ The Aries cloud agent CI pipeline configured into the repository generates a PyP Current examples of deployed instances of Aries cloud agent and controllers include: -* [indy-email-verification](https://github.com/bcgov/indy-email-verification) - a web app Controller that sends an email to a given email address with an embedded DIDComm invitation and on establishment of a connection, offers and provides the connected agent with an email control verifiable credential. -* [iiwbook](https://github.com/bcgov/iiwbook) - a web app Controller that on creation of a DIDComm connection, requests a proof of email control, and then sends to the connection a verifiable credential proving attendance at IIW. In between the proof and issuance is a human approval step using a simple web-based UI that implements a request queue. \ No newline at end of file +- [indy-email-verification](https://github.com/bcgov/indy-email-verification) - a web app Controller that sends an email to a given email address with an embedded DIDComm invitation and on establishment of a connection, offers and provides the connected agent with an email control verifiable credential. +- [iiwbook](https://github.com/bcgov/iiwbook) - a web app Controller that on creation of a DIDComm connection, requests a proof of email control, and then sends to the connection a verifiable credential proving attendance at IIW. In between the proof and issuance is a human approval step using a simple web-based UI that implements a request queue. diff --git a/docs/design/AnoncredsW3CCompatibility.md b/docs/design/AnoncredsW3CCompatibility.md new file mode 100644 index 00000000..31a48c66 --- /dev/null +++ b/docs/design/AnoncredsW3CCompatibility.md @@ -0,0 +1,664 @@ +# Supporting AnonCreds in W3C VC/VP Formats in Aries Cloud Agent Python + +This design proposes to extend the Aries Cloud Agent Python (ACA-PY) to support Hyperledger AnonCreds credentials and presentations in the W3C Verifiable Credentials (VC) and Verifiable Presentations (VP) Format. The aim is to transition from the legacy AnonCreds format specified in Aries-Legacy-Method to the W3C VC format. + +## Overview + +The pre-requisites for the work are: + +- The availability of the AnonCreds RS library supporting the generation and processing of AnonCreds VCs in W3C VC format. +- The availability of the AnonCreds RS library supporting the generation and verification of AnonCreds VPs in W3C VP format. +- The availability of support in the AnonCreds RS Python Wrapper for the W3C VC/VP capabilities in AnonCreds RS. +- Agreement on the Aries Issue Credential v2.0 and Present Proof v2.0 protocol attachment formats to use when issuing AnonCreds W3C VC format credentials, and when presenting AnonCreds W3C VP format presentations. + - For issuing, use the (proposed) [RFC 0809 VC-DI] Attachments + - For presenting, use the [RFC 0510 DIF Presentation Exchange] Attachments + +[RFC 0809 VC-DI]: https://github.com/hyperledger/aries-rfcs/pull/809 +[RFC 0510 DIF Presentation Exchange]: https://github.com/hyperledger/aries-rfcs/blob/main/features/0510-dif-pres-exch-attach/README.md + +As of 2024-01-15, these pre-requisites have been met. + +## Impacts on ACA-Py + +### Issuer + +Issuer support needs to be added for using the [RFC 0809 VC-DI] attachment format when sending Issue Credential v2.0 protocol`offer` and `issue` messages and when receiving `request` messages. + +Related notes: + +- The Issue Credential v1.0 protocol will not be updated to support AnonCreds W3C VC format credentials. +- Once an instance of the Issue Credential v2.0 protocol is started using [RFC 0809 VC-DI] format attachments, subsequent messages in the protocol **MUST** use [RFC 0809 VC-DI] attachments. +- The ACA-Py maintainers are discussing the possibility of making pluggable the Issue Credential v2.0 and Present Proof v2.0 attachment formats, to simplify supporting additional formats, including [RFC 0809 VC-DI]. + +A mechanism must be defined such that an Issuer controller can use the ACA-Py Admin API to initiate the sending of an AnonCreds credential Offer using the [RFC 0809 VC-DI] attachment format. + +A credential's encoded attributes are not included in the issued AnonCreds W3C VC format credential. To be determined how that impacts the issuing process. + +### Verifier + +A verifier wanting a W3C VP Format presentation will send the Present Proof v2.0 `request` message with an [RFC 0510 DIF Presentation Exchange] format attachment. + +If needed, the [RFC 0510 DIF Presentation Exchange] document will be clarified and possibly updated to enable its use for handling AnonCreds W3C VP format presentations. + +An AnonCreds W3C VP format presentation does not include the encoded revealed attributes, and the encoded values must be calculated as needed. To be determined where those would be needed. + +### Holder + +A holder must support [RFC 0809 VC-DI] attachments when receiving Issue Credential v2.0 `offer` and `issue` messages, and when sending `request` messages. + +On receiving an Issue Credential v2.0 `offer` message with a [RFC 0809 VC-DI], the holder **MUST** respond using the [RFC 0809 VC-DI] on the subsequent `request` message. + +On receiving a credential from an issuer in an [RFC 0809 VC-DI] attachment, the holder must process and store the credential for subsequent use in presentations. + +- The AnonCreds verifiable credential **MUST** support being used in both legacy AnonCreds and W3C VP format (DIF Presentation Exchange) presentations. + +On receiving an [RFC 0510 DIF Presentation Exchange] `request` message, a holder must include AnonCreds verifiable credentials in the search for credentials satisfying the request, and if found and selected for use, must construct the presentation using the [RFC 0510 DIF Presentation Exchange] presentation format, with an embedded AnonCreds W3C VP format presentation. + +## Issues to consider + +- If and how the W3C VC Format attachments for the Issue Credential V2.0 and Present Proof V2 Aries DIDComm Protocols should be used when using AnonCreds W3C VC Format credentials. Anticipated triggers: + - An Issuer Controller invokes the Admin API to trigger an Issue Credential v2.0 protocol instance such that the [RFC 0809 VC-DI] will be used. + - A Holder receives an Issue Credential v2.0 `offer` message with an [RFC 0809 VC-DI] attachment. + - A Verifier initiates a Present Proof v2.0 protocol instance with an [RFC 0510 DIF Presentation Exchange] that can be satisfied by AnonCreds VCs held by the holder. + - A Holder receives a present proof `request` message with an [RFC 0510 DIF Presentation Exchange] format attachment that can be satisfied with AnonCreds credentials held by the holder. + - How are the `restrictions` and `revocation` data elements conveyed? +- How AnonCreds W3C VC Format verifiable credentials are stored by the holder such that they will be discoverable when needed for creating verifiable presentations. +- How and when multiple signatures can/should be added to a W3C VC Format credential, enabling both AnonCreds and non-AnonCreds signatures on a single credential and their use in presentations. Completing a multi-signature controller is out of scope, however we want to consider and ensure the design is fundamentally compatible with multi-sig credentials. + +## Flow Chart + +![image](https://github.com/Whats-Cookin/aries-cloudagent-python/blob/design/w3c-compatibility/docs/design/anoncreds-w3c-verification-flow.png?raw=true) + +## Key Questions + +### What is the roadmap for delivery? What will we build first, then second? + +It appears that the issue and presentation sides can be approached independently, assuming that any stored AnonCreds VC can be used in an AnonCreds W3C VP format presentation. + +#### Issue Credential + +1. Update Admin API endpoints to initiate an Issue Credential v2.0 protocol to issue an AnonCreds credential in W3C VC format using [RFC 0809 VC-DI] format attachments. +2. Add support for the [RFC 0809 VC-DI] message attachment formats. + 1. Should the attachment format be made pluggable as part of this? From the maintainers: _If we did make it pluggable, [this](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/messages/cred_format.py#L23) would be the point where that would take place. Since these values are hard coded, it is not pluggable currently, as noted. I've been dissatisfied with how this particular piece works for a while. I think making it pluggable, if done right, could help clean it up nicely. A plugin would then define their own implementation of [V20CredFormatHandler](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/formats/handler.py#L28). (@dbluhm)_ +3. Update the v2.0 Issue Credential protocol handler to support a "[RFC 0809 VC-DI] mode" such that when a protocol instance starts with that format, it continues with it until completion, supporting issuing AnonCreds credentials in the process. This includes both the sending and receiving of all protocol message types. + +#### Present Proof + +1. Adjust as needed the sending of a Present Proof request using the [RFC 0510 DIF Presentation Exchange] with support (to be defined) for requesting AnonCreds VCs. +2. Adjust as needed the processing of a Present Proof `request` message with an [RFC 0510 DIF Presentation Exchange] attachment so that AnonCreds VCs can found and used in the subsequent response. + 1. AnonCreds VCs issued as legacy or W3C VC format credentials should be usable in AnonCreds W3C VP format presentations. +3. Update the creation of an [RFC 0510 DIF Presentation Exchange] presentation submission to support the use of AnonCreds VCs as the source of the VPs. +4. Update the verifier receipt of a Present Proof v2.0 `presentation` message with an [RFC 0510 DIF Presentation Exchange] containing AnonCreds W3C VP(s) derived from AnonCreds source VCs. + +### What are the functions we are going to wrap? + +After thoroughly reviewing upcoming changes from [anoncreds-rs PR273](https://github.com/hyperledger/anoncreds-rs/pull/273), the classes or `AnoncredsObject` impacted by changes are as follows: + +[W3CCredential](https://github.com/hyperledger/anoncreds-rs/pull/273/files#diff-6f8cbd34bbd373240b6af81f159177023c05b074b63c7757fc6b3796a66ee240R424) + +- class methods (`create`, `load`) +- instance methods (`process`, `to_legacy`, `add_non_anoncreds_integrity_proof`, `set_id`, `set_subject_id`, `add_context`, `add_type`) +- class properties (`schema_id`, `cred_def_id`, `rev_reg_id`, `rev_reg_index`) +- bindings functions (`create_w3c_credential`, `process_w3c_credential`, `_object_from_json`, `_object_get_attribute`, `w3c_credential_add_non_anoncreds_integrity_proof`, `w3c_credential_set_id`, `w3c_credential_set_subject_id`, `w3c_credential_add_context`, `w3c_credential_add_type`) + +[W3CPresentation](https://github.com/hyperledger/anoncreds-rs/pull/273/files#diff-6f8cbd34bbd373240b6af81f159177023c05b074b63c7757fc6b3796a66ee240R791) + +- class methods (`create`, `load`) +- instance methods (`verify`) +- bindings functions (`create_w3c_presentation`, `_object_from_json`, `verify_w3c_presentation`) + +They will be added to [\_\_init\_\_.py](https://github.com/hyperledger/anoncreds-rs/blob/main/wrappers/python/anoncreds/__init__.py) as additional exports of AnoncredsObject. + +We also have to consider which classes or anoncreds objects have been modified + +The classes modified according to the same [PR](https://github.com/hyperledger/anoncreds-rs/pull/273) mentioned above are: + +[Credential](https://github.com/hyperledger/anoncreds-rs/pull/273/files#diff-6f8cbd34bbd373240b6af81f159177023c05b074b63c7757fc6b3796a66ee240R402) + +- added class methods (`from_w3c`) +- added instance methods (`to_w3c`) +- added bindings functions (`credential_from_w3c`, `credential_to_w3c`) + +[PresentCredential](https://github.com/hyperledger/anoncreds-rs/pull/273/files#diff-6f8cbd34bbd373240b6af81f159177023c05b074b63c7757fc6b3796a66ee240R603) + +- modified instance methods (`_get_entry`, `add_attributes`, `add_predicates`) + +#### Creating a W3C VC credential from credential definition, and issuing and presenting it as is + +The issuance, presentation and verification of legacy anoncreds are implemented in this [./aries_cloudagent/anoncreds](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/anoncreds) directory. Therefore, we will also start from there. + +Let us navigate these implementation examples through the respective processes of the concerning agents - **Issuer** and **Holder** as described in [https://github.com/hyperledger/anoncreds-rs/blob/main/README.md](https://github.com/hyperledger/anoncreds-rs/blob/main/README.md). +We will proceed through the following processes in comparison with the legacy anoncreds implementations while watching out for signature differences between the two. +Looking at the [/anoncreds/issuer.py](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/anoncreds/issuer.py) file, from `AnonCredsIssuer` class: + +Create VC_DI Credential Offer + +According to this DI credential offer attachment format - [didcomm/w3c-di-vc-offer@v0.1](https://github.com/hyperledger/aries-rfcs/pull/809/files#diff-40b1f86053dd6f0b34250d5be1319d3a0662b96a5a121957fe4dc8cceaa9cbc8R30-R63), + +- binding_required +- binding_method +- credential_definition + +could be the parameters for `create_offer` method. + +Create VC_DI Credential + +**NOTE: There has been some changes to _encoding of attribute values_ for creating a credential, so we have to be adjust to the new changes.** + +```python +async def create_credential( + self, + credential_offer: dict, + credential_request: dict, + credential_values: dict, + ) -> str: +... +... + try: + credential = await asyncio.get_event_loop().run_in_executor( + None, + lambda: W3CCredential.create( + cred_def.raw_value, + cred_def_private.raw_value, + credential_offer, + credential_request, + raw_values, + None, + None, + None, + None, + ), + ) +... +``` + +Create VC_DI Credential Request + +```python +async def create_vc_di_credential_request( + self, credential_offer: dict, credential_definition: CredDef, holder_did: str + ) -> Tuple[str, str]: +... +... +try: + secret = await self.get_master_secret() + ( + cred_req, + cred_req_metadata, + ) = await asyncio.get_event_loop().run_in_executor( + None, + W3CCredentialRequest.create, + None, + holder_did, + credential_definition.to_native(), + secret, + AnonCredsHolder.MASTER_SECRET_ID, + credential_offer, + ) +... +``` + +Create VC_DI Credential Presentation + +```python +async def create_vc_di_presentation( + self, + presentation_request: dict, + requested_credentials: dict, + schemas: Dict[str, AnonCredsSchema], + credential_definitions: Dict[str, CredDef], + rev_states: dict = None, + ) -> str: +... +... + try: + secret = await self.get_master_secret() + presentation = await asyncio.get_event_loop().run_in_executor( + None, + Presentation.create, + presentation_request, + present_creds, + self_attest, + secret, + { + schema_id: schema.to_native() + for schema_id, schema in schemas.items() + }, + { + cred_def_id: cred_def.to_native() + for cred_def_id, cred_def in credential_definitions.items() + }, + ) +... +``` + +#### Converting an already issued legacy anoncreds to VC_DI format(vice versa) + +In this case, we can use `to_w3c` method of `Credential` class to convert from legacy to w3c and `to_legacy` method of `W3CCredential` class to convert from w3c to legacy. + +We could call `to_w3c` method like this: + +```python +vc_di_cred = Credential.to_w3c(cred_def) +``` + +and for `to_legacy`: + +```python +legacy_cred = W3CCredential.to_legacy() +``` + +We don't need to input any parameters to it as it in turn calls `Credential.from_w3c()` method under the hood. + +### Format Handler for Issue_credential V2_0 Protocol + +Keeping in mind that we are trying to create anoncreds(not another type of VC) in w3c format, what if we add a protocol-level **vc_di** format support by adding a new format `VC_DI` in `./protocols/issue_credential/v2_0/messages/cred_format.py` - + +```python +# /protocols/issue_credential/v2_0/messages/cred_format.py + +class Format(Enum): + “””Attachment Format””” + INDY = FormatSpec(...) + LD_PROOF = FormatSpec(...) + VC_DI = FormatSpec( + “vc_di/”, + CredExRecordVCDI, + DeferLoad( + “aries_cloudagent.protocols.issue_credential.v2_0” + “.formats.vc_di.handler.AnonCredsW3CFormatHandler” + ), + ) +``` + +And create a new CredExRecordVCDI in reference to V20CredExRecordLDProof + +```python +# /protocols/issue_credential/v2_0/models/detail/w3c.py + +class CredExRecordW3C(BaseRecord): + """Credential exchange W3C detail record.""" + + class Meta: + """CredExRecordW3C metadata.""" + + schema_class = "CredExRecordW3CSchema" + + RECORD_ID_NAME = "cred_ex_w3c_id" + RECORD_TYPE = "w3c_cred_ex_v20" + TAG_NAMES = {"~cred_ex_id"} if UNENCRYPTED_TAGS else {"cred_ex_id"} + RECORD_TOPIC = "issue_credential_v2_0_w3c" + +``` + +Based on the proposed credential attachment format with the new Data Integrity proof in [aries-rfcs 809](https://github.com/hyperledger/aries-rfcs/pull/809/files#diff-40b1f86053dd6f0b34250d5be1319d3a0662b96a5a121957fe4dc8cceaa9cbc8R132-R151) - + +```json +{ + "@id": "284d3996-ba85-45d9-964b-9fd5805517b6", + "@type": "https://didcomm.org/issue-credential/2.0/issue-credential", + "comment": "", + "formats": [ + { + "attach_id": "5b38af88-d36f-4f77-bb7a-2f04ab806eb8", + "format": "didcomm/w3c-di-vc@v0.1" + } + ], + "credentials~attach": [ + { + "@id": "5b38af88-d36f-4f77-bb7a-2f04ab806eb8", + "mime-type": "application/ld+json", + "data": { + "base64": "ewogICAgICAgICAgIkBjb250ZXogWwogICAgICAg...(clipped)...RNVmR0SXFXZhWXgySkJBIgAgfQogICAgICAgIH0=" + } + } + ] +} +``` + +Assuming `VCDIDetail` and `VCDIOptions` are already in place, `VCDIDetailSchema` can be created like so: + +```python +# /protocols/issue_credential/v2_0/formats/vc_di/models/cred_detail.py + +class VCDIDetailSchema(BaseModelSchema): + """VC_DI verifiable credential detail schema.""" + + class Meta: + """Accept parameter overload.""" + + unknown = INCLUDE + model_class = VCDIDetail + + credential = fields.Nested( + CredentialSchema(), + required=True, + metadata={ + "description": "Detail of the VC_DI Credential to be issued", + "example": { + "@id": "284d3996-ba85-45d9-964b-9fd5805517b6", + "@type": "https://didcomm.org/issue-credential/2.0/issue-credential", + "comment": "", + "formats": [ + { + "attach_id": "5b38af88-d36f-4f77-bb7a-2f04ab806eb8", + "format": "didcomm/w3c-di-vc@v0.1" + } + ], + "credentials~attach": [ + { + "@id": "5b38af88-d36f-4f77-bb7a-2f04ab806eb8", + "mime-type": "application/ld+json", + "data": { + "base64": "ewogICAgICAgICAgIkBjb250ZXogWwogICAgICAg...(clipped)...RNVmR0SXFXZhWXgySkJBIgAgfQogICAgICAgIH0=" + } + } + ] + } + }, + ) +``` + +Then create w3c format handler with mapping like so: + +```python +# /protocols/issue_credential/v2_0/formats/w3c/handler.py + +mapping = { + CRED_20_PROPOSAL: VCDIDetailSchema, + CRED_20_OFFER: VCDIDetailSchema, + CRED_20_REQUEST: VCDIDetailSchema, + CRED_20_ISSUE: VerifiableCredentialSchema, + } +``` + +Doing so would allow us to be more independent in defining the schema suited for anoncreds in w3c format and once the proposal protocol can handle the w3c format, probably the rest of the flow can be easily implemented by adding `vc_di` flag to the corresponding routes. + +### Admin API Attachments + +To make sure that once an endpoint has been called to trigger the `Issue Credential` flow in `0809 W3C_DI attachment formats` the subsequent endpoints also follow this format, we can keep track of this [ATTACHMENT_FORMAT](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/message_types.py#L41-L59) dictionary with the proposed `VC_DI` format. + +```python +# Format specifications +ATTACHMENT_FORMAT = { + CRED_20_PROPOSAL: { + V20CredFormat.Format.INDY.api: "hlindy/cred-filter@v2.0", + V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", + V20CredFormat.Format.VC_DI.api: "aries/vc-di-detail@v2.0", + }, + CRED_20_OFFER: { + V20CredFormat.Format.INDY.api: "hlindy/cred-abstract@v2.0", + V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", + V20CredFormat.Format.VC_DI.api: "aries/vc-di-detail@v2.0", + }, + CRED_20_REQUEST: { + V20CredFormat.Format.INDY.api: "hlindy/cred-req@v2.0", + V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc-detail@v1.0", + V20CredFormat.Format.VC_DI.api: "aries/vc-di-detail@v2.0", + }, + CRED_20_ISSUE: { + V20CredFormat.Format.INDY.api: "hlindy/cred@v2.0", + V20CredFormat.Format.LD_PROOF.api: "aries/ld-proof-vc@v1.0", + V20CredFormat.Format.VC_DI.api: "aries/vc-di@v2.0", + }, +} +``` + +And this [\_formats_filter](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/routes.py#L442-L461) function takes care of keeping the attachment formats uniform across the iteration of the flow. We can see this function gets called in: + +- [\_create_free_offer](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/routes.py#L877) function that gets called in the handler function of `/issue-credential-2.0/send-offer` route (in addition to other offer routes) +- [credential_exchange_send_free_request](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/routes.py#L1229) handler function of `/issue-credential-2.0/send-request` route +- [credential_exchange_create](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/routes.py#L630) handler function of `/issue-credential-2.0/create` route +- [credential_exchange_send](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/issue_credential/v2_0/routes.py#L721) handler function of `/issue-credential-2.0/send` route + +The same goes for [ATTACHMENT_FORMAT](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/present_proof/v2_0/message_types.py#L33-L47) of `Present Proof` flow. In this case, DIF Presentation Exchange formats in these [test vectors](https://github.com/TimoGlastra/anoncreds-w3c-test-vectors/tree/main/test-vectors) that are influenced by [RFC 0510 DIF Presentation Exchange](https://github.com/hyperledger/aries-rfcs/blob/main/features/0510-dif-pres-exch-attach/README.md) will be implemented. Here, the [\_formats_attach](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/present_proof/v2_0/routes.py#L403-L422) function is the key for the same purpose above. It gets called in: + +- [present_proof_send_proposal](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/present_proof/v2_0/routes.py#L833) handler function of `/present-proof-2.0/send-proposal` route +- [present_proof_create_request](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/present_proof/v2_0/routes.py#L916) handler function of `/present-proof-2.0/create-request` route +- [present_proof_send_free_request](https://github.com/hyperledger/aries-cloudagent-python/blob/main/aries_cloudagent/protocols/present_proof/v2_0/routes.py#L998) handler function of `/present-proof-2.0/send-request` route + +#### Credential Exchange Admin Routes + +- /issue-credential-2.0/create-offer + +This route indirectly calls `_formats_filters` function to create credential proposal, which is in turn used to create a credential offer in the filter format. The request body for this route might look like this: + +```python +{ + "filter": ["vc_di"], + "comment: , + "auto-issue": true, + "auto-remove": true, + "replacement_id": , + "credential_preview": { + "@type": "issue-credential/2.0/credential-preview", + "attributes": { + ... + ... + } + } +} +``` + +- /issue-credential-2.0/create + +This route indirectly calls `_format_result_with_details` function to generate a cred_ex_record in the specified format, which is then returned. The request body for this route might look like this: + +```python +{ + "filter": ["vc_di"], + "comment: , + "auto-remove": true, + "credential_preview": { + "@type": "issue-credential/2.0/credential-preview", + "attributes": { + ... + ... + } + } +} +``` + +- /issue-credential-2.0/send + +The request body for this route might look like this: + +```python +{ + "connection_id": , + "filter": ["vc_di"], + "comment: , + "auto-remove": true, + "replacement_id": , + "credential_preview": { + "@type": "issue-credential/2.0/credential-preview", + "attributes": { + ... + ... + } + } +} +``` + +- /issue-credential-2.0/send-offer + +The request body for this route might look like this: + +```python +{ + "connection_id": , + "filter": ["vc_di"], + "comment: , + "auto-issue": true, + "auto-remove": true, + "replacement_id": , + "holder_did": , + "credential_preview": { + "@type": "issue-credential/2.0/credential-preview", + "attributes": { + ... + ... + } + } +} +``` + +- /issue-credential-2.0/send-request + +The request body for this route might look like this: + +```python +{ + "connection_id": , + "filter": ["vc_di"], + "comment: , + "auto-remove": true, + "replacement_id": , + "holder_did": , + "credential_preview": { + "@type": "issue-credential/2.0/credential-preview", + "attributes": { + ... + ... + } + } +} +``` + +#### Presentation Admin Routes + +- /present-proof-2.0/send-proposal + +The request body for this route might look like this: + +```python +{ + ... + ... + "connection_id": , + "presentation_proposal": ["vc_di"], + "comment: , + "auto-present": true, + "auto-remove": true, + "trace": false +} +``` + +- /present-proof-2.0/create-request + +The request body for this route might look like this: + +```python +{ + ... + ... + "connection_id": , + "presentation_proposal": ["vc_di"], + "comment: , + "auto-verify": true, + "auto-remove": true, + "trace": false +} +``` + +- /present-proof-2.0/send-request + +The request body for this route might look like this: + +```python +{ + ... + ... + "connection_id": , + "presentation_proposal": ["vc_di"], + "comment: , + "auto-verify": true, + "auto-remove": true, + "trace": false +} + +``` + +- /present-proof-2.0/records/{pres_ex_id}/send-presentation + +The request body for this route might look like this: + +```python +{ + "presentation_definition": , + "auto_remove": true, + "dif": { + issuer_id: "", + record_ids: { + "": ["", ""], + "": [""], + } + }, + "reveal_doc": { + // vc_di dict + } + +} + +``` + +### How a W3C credential is stored in the wallet + +Storing a credential in the wallet is somewhat dependent on the kinds of metadata that are relevant. The metadata mapping between the W3C credential and an AnonCreds credential is not fully clear yet. + +One of the questions we need to answer is whether the preferred approach is to modify the existing store credential function so that any credential type is a valid input, or whether there should be a special function just for storing W3C credentials. + +We will duplicate this [store_credential](https://github.com/hyperledger/aries-cloudagent-python/blob/8cfe8283ddb2a85e090ea1b8a916df2d78298ec0/aries_cloudagent/anoncreds/holder.py#L167) function and modify it: + +```python +async def store_w3c_credential(...) { + ... + ... + try: + cred = W3CCredential.load(credential_data) + ... + ... +} +``` + +**Question: Would it also be possible to generate the credentials on the fly to eliminate the need for storage?** + +**Answer: I don't think it is possible to eliminate the need for storage, and notably the secure storage (encrypted at rest) supported in Askar.** + +### How can we handle multiple signatures on a W3C VC Format credential? + +Only one of the signature types (CL) is allowed in the AnonCreds format, so if a W3C VC is created by `to_legacy()`, all signature types that can't be turned into a CL signature will be dropped. This would make the conversion lossy. Similarly, an AnonCreds credential carries only the CL signature, limiting output from `to_w3c()` signature types that can be derived from the source CL signature. A possible future enhancement would be to add an extra field to the AnonCreds data structure, in which additional signatures could be stored, even if they are not used. This could eliminate the lossiness, but it adds extra complexity and may not be worth doing. + +- Unlike a "typical" non-AnonCreds W3C VC, an AnonCreds VC is _never_ directly presented to a verifier. Rather, a derivation of the credential is generated, and it is the derivation that is shared with the verifier as a presentation. The derivation: + - Generates presentation-specific signatures to be verified. + - Selectively reveals attributes. + - Generates proofs of the requested predicates. + - Generates a proof of knowledge of the link secret blinded in the verifiable credential. + +### Compatibility with AFJ: how can we make sure that we are compatible? + +We will write a test for the Aries Agent Test Framework that issues a W3C VC instead of an AnonCreds credential, and then run that test where one of the agents is ACA-PY and the other is based on AFJ -- and vice versa. Also write a test where a W3C VC is presented after an AnonCreds issuance, and run it with the two roles played by the two different agents. This is a simple approach, but if the tests pass, this should eliminate almost all risk of incompatibility. + +### Will we introduce new dependencies, and what is risky or easy? + +Any significant bugs in the Rust implementation may prevent our wrappers from working, which would also prevent progress (or at least confirmed test results) on the higher-level code. + +If AFJ lags behind in delivering equivalent functionality, we may not be able to demonstrate compatibility with the test harness. + +### Where should the new issuance code go? + +So the [vc](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/vc) directory contains code to verify vc's, is this a logical place to add the code for issuance? + +### What do we call the new things? Flexcreds? or just W3C_xxx + +Are we defining a concept called Flexcreds that is a credential with a proof array that you can generate more specific or limited credentials from? If so should this be included in the naming? + +- I don't think naming comes into play. We are creating and deriving presentations from VC Data Integrity Proofs using an AnonCreds cryptosuite. As such, these are "stock" W3C verifiable credentials. + +### How can a wallet retain the capability to present ONLY an anoncred credential? + +If the wallet receives a "Flexcred" credential object with an array of proofs, the wallet may wish to present ONLY the more zero-knowledge anoncreds proof + +How will wallets support that in a way that is developer-friendly to wallet devs? + +- The trigger for wallets to generate a W3C VP Format presentation is that they have receive a [RFC 0510 DIF Presentation Exchange] that can be satisfied with an AnonCreds verifiable credential in their storage. Once we decide to use one or more AnonCreds VCs to satisfy a presentation, we'll derive such a presentation and send it using the [RFC 0510 DIF Presentation Exchange] for the `presentation` message of the Present Proof v2.0 protocol. diff --git a/docs/design/anoncreds-w3c-verification-flow.png b/docs/design/anoncreds-w3c-verification-flow.png new file mode 100644 index 0000000000000000000000000000000000000000..ee098f151a1124d7ff64bf7185bea64b356c38c9 GIT binary patch literal 22174 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 literal 0 HcmV?d00001 diff --git a/docs/features/AdminAPI.md b/docs/features/AdminAPI.md index d19f132b..464054a0 100644 --- a/docs/features/AdminAPI.md +++ b/docs/features/AdminAPI.md @@ -6,7 +6,7 @@ ACA-Py provides an OpenAPI-documented REST interface for administering the agent To see the specifics of the supported endpoints, as well as the expected request and response formats, it is recommended to run the `aca-py` agent with the `--admin {HOST} {PORT}` and `--admin-insecure-mode` command line parameters. This exposes the OpenAPI UI on the provided port for interaction via a web browser. For production deployments, run the agent with `--admin-api-key {KEY}` and add the `X-API-Key: {KEY}` header to all requests instead of using the `--admin-insecure-mode` parameter. -![Admin API Screenshot](../../assets/adminApi.png) +![Admin API Screenshot](../assets/adminApi.png) To invoke a specific method: diff --git a/docs/features/DevReadMe.md b/docs/features/DevReadMe.md index 6205c656..bfcfb013 100644 --- a/docs/features/DevReadMe.md +++ b/docs/features/DevReadMe.md @@ -1,6 +1,6 @@ # Developer's Read Me for Hyperledger Aries Cloud Agent - Python -See the [README](../../release/acapy-README) for details about this repository and information about how the Aries Cloud Agent - Python fits into the Aries project and relates to Indy. +See the [README](../../README.md) for details about this repository and information about how the Aries Cloud Agent - Python fits into the Aries project and relates to Indy. ## Table of Contents @@ -11,12 +11,13 @@ See the [README](../../release/acapy-README) for details about this repository a - [Docker](#docker) - [Locally Installed](#locally-installed) - [About ACA-Py Command Line Parameters](#about-aca-py-command-line-parameters) - - [Provisioning a Wallet](#provisioning-a-wallet) + - [Provisioning Secure Storage](#provisioning-secure-storage) - [Mediation](#mediation) - [Multi-tenancy](#multi-tenancy) - [JSON-LD Credentials](#json-ld-credentials) - [Developing](#developing) - [Prerequisites](#prerequisites) + - [Running In A Dev Container](#running-in-a-dev-container) - [Running Locally](#running-locally) - [Logging](#logging) - [Running Tests](#running-tests) @@ -32,12 +33,12 @@ Aries Cloud Agent Python (ACA-Py) is a configurable, extensible, non-mobile Arie The information on this page assumes you are developer with a background in decentralized identity, Aries, DID Methods, and verifiable credentials, especially AnonCreds. If you aren't familiar with those concepts and projects, -please use our [Getting Started Guide](../../gettingStarted/) +please use our [Getting Started Guide](../gettingStarted/README.md) to learn more. ## Developer Demos -To put ACA-Py through its paces at the command line, checkout our [demos](../../AriesDeveloperDemos) page. +To put ACA-Py through its paces at the command line, checkout our [demos](../demo/README.md) page. ## Running @@ -120,19 +121,19 @@ aca-py provision --wallet-type askar --seed $SEED For additional `provision` options, execute `aca-py provision --help`. -Additional information about secure storage options and configuration settings can be found [here](../../deploying/Databases). +Additional information about secure storage options and configuration settings can be found [here](../deploying/Databases.md). ### Mediation -ACA-Py can also run in mediator mode - ACA-Py can be run *as* a mediator (it can mediate connections for other agents), or it can connect to an external mediator to mediate its own connections. See the [docs on mediation](Mediation.md) for more info. +ACA-Py can also run in mediator mode - ACA-Py can be run _as_ a mediator (it can mediate connections for other agents), or it can connect to an external mediator to mediate its own connections. See the [docs on mediation](./Mediation.md) for more info. ### Multi-tenancy -ACA-Py can also be started in multi-tenant mode. This allows the agent to serve multiple tenants, that each have their own wallet. See the [docs on multi-tenancy](Multitenancy.md) for more info. +ACA-Py can also be started in multi-tenant mode. This allows the agent to serve multiple tenants, that each have their own wallet. See the [docs on multi-tenancy](./Multitenancy.md) for more info. ### JSON-LD Credentials -ACA-Py can issue W3C Verifiable Credentials using Linked Data Proofs. See the [docs on JSON-LD Credentials](JsonLdCredentials.md) for more info. +ACA-Py can issue W3C Verifiable Credentials using Linked Data Proofs. See the [docs on JSON-LD Credentials](./JsonLdCredentials.md) for more info. ## Developing @@ -142,7 +143,7 @@ ACA-Py can issue W3C Verifiable Credentials using Linked Data Proofs. See the [d ### Running In A Dev Container -The dev container environment is a great way to deploy agents quickly with code changes and an interactive debug session. Detailed information can be found in the [Docs On Devcontainers](devcontainer.md). It is specific for vscode, so if you prefer another code editor or IDE you will need to figure it out on your own, but it is highly recommended to give this a try. +The dev container environment is a great way to deploy agents quickly with code changes and an interactive debug session. Detailed information can be found in the [Docs On Devcontainers](./devcontainer.md). It is specific for vscode, so if you prefer another code editor or IDE you will need to figure it out on your own, but it is highly recommended to give this a try. One thing to be aware of is, unlike the demo, none of the steps are automated. You will need to create public dids, connections and all the other steps yourself. Using the demo and studying the flow and then copying them with your dev container debug session is a great way to learn how everything works. @@ -172,7 +173,7 @@ Refer to [the previous section](#running) for instructions on how to run ACA-Py. ### Logging -You can find more details about logging and log levels [here](../../testing/Logging/). +You can find more details about logging and log levels [here](../testing/Logging.md). ### Running Tests @@ -229,7 +230,7 @@ There are some good examples of various test scenarios for you to work from incl The test suite also displays the current code coverage after each run so you can see how much of your work is covered by tests. Use your best judgement for how much coverage is sufficient. -Please also refer to the [contributing guidelines](../../contributing/CONTRIBUTING/) and [code of conduct](../../contributing/CODE_OF_CONDUCT/). +Please also refer to the [contributing guidelines](../../CONTRIBUTING.md) and [code of conduct](../../CODE_OF_CONDUCT.md). ## Publishing Releases diff --git a/docs/features/Endorser.md b/docs/features/Endorser.md index 342292d6..a645309a 100644 --- a/docs/features/Endorser.md +++ b/docs/features/Endorser.md @@ -32,7 +32,7 @@ Web hooks will be triggered to notify each ACA-Py agent of any transaction reque The following start-up parameters are supported by ACA-Py: -``` +```bash Endorsement: --endorser-protocol-role Specify the role ('author' or 'endorser') which this agent will participate. Authors will request transaction endorsement from an Endorser. Endorsers will endorse transactions from @@ -71,13 +71,13 @@ The Endorser makes use of the [Event Bus](https://github.com/hyperledger/aries-c The overall architecture can be illustrated as: -![Class Diagram](../features/endorser-design.png) +![Class Diagram](../assets/endorser-design.png) ### Create Credential Definition and Revocation Registry An example of an Endorser flow is as follows, showing how a credential definition endorsement is received and processed, and optionally kicks off the revocation registry process: -![Sequence Diagram](../features/endorse-cred-def.png) +![Sequence Diagram](../assets/endorse-cred-def.png) You can see that there is a standard endorser flow happening each time there is a ledger write (illustrated in the "Endorser" process). @@ -95,7 +95,7 @@ Using the EventBus decouples the event sequence. Any functions triggered by an ... and an example of creating a DID and promoting it to public (and creating an ATTRIB for the endpoint: -![Sequence Diagram](../features/endorse-public-did.png) +![Sequence Diagram](../assets/endorse-public-did.png) You can see the same endorsement processes in this sequence. diff --git a/docs/features/JsonLdCredentials.md b/docs/features/JsonLdCredentials.md index 314dabdc..2f083129 100644 --- a/docs/features/JsonLdCredentials.md +++ b/docs/features/JsonLdCredentials.md @@ -16,6 +16,7 @@ By design Hyperledger Aries is credential format agnostic. This means you can us - [Issuing Credentials](#issuing-credentials) - [Retrieving Issued Credentials](#retrieving-issued-credentials) - [Present Proof](#present-proof) +- [VC-API](#vc-api) ## General Concept @@ -42,7 +43,7 @@ Contrary to Indy credentials, JSON-LD credentials do not need a schema or creden It is required that every property key in the document can be mapped to an IRI. This means the property key must either be an IRI by default, or have the shorthand property mapped in the `@context` of the document. If you have properties that are not mapped to IRIs, the Issue Credential API will throw the following error: -> "\ attributes dropped. Provide definitions in context to correct. [\]" +> ` attributes dropped. Provide definitions in context to correct. []` For credentials the `https://www.w3.org/2018/credentials/v1` context MUST always be the first context. In addition, when issuing BBS+ credentials the `https://w3id.org/security/bbs/v1` URL MUST be present in the context. For convenience this URL will be automatically added to the `@context` of the credential if not present. @@ -63,7 +64,7 @@ Writing JSON-LD contexts can be a daunting task and is out of scope of this guid - [Citizenship Vocabulary](https://w3c-ccg.github.io/citizenship-vocab/) - [Traceability Vocabulary](https://w3c-ccg.github.io/traceability-vocab/) -Verifiable credentials are not around that long, so there aren't that many vocabularies ready to use. If you can't use one of the existing vocabularies it is still beneficial to lean on already defined lower level contexts. http://schema.org has a large registry of definitions that can be used to build new contexts. The example vocabularies linked above all make use of types from http://schema.org +Verifiable credentials are not around that long, so there aren't that many vocabularies ready to use. If you can't use one of the existing vocabularies it is still beneficial to lean on already defined lower level contexts. [http://schema.org](http://schema.org) has a large registry of definitions that can be used to build new contexts. The example vocabularies linked above all make use of types from [http://schema.org](http://schema.org). For the remainder of this guide, we will be using the example `UniversityDegreeCredential` type and `https://www.w3.org/2018/credentials/examples/v1` context from the Verifiable Credential Data Model. You should not use this for production use cases. @@ -209,4 +210,20 @@ Call the `/credentials/w3c` endpoint to retrieve all JSON-LD credentials in your ## Present Proof -> ⚠️ TODO: https://github.com/hyperledger/aries-cloudagent-python/pull/1125 +> ⚠️ TODO: [https://github.com/hyperledger/aries-cloudagent-python/pull/1125](https://github.com/hyperledger/aries-cloudagent-python/pull/1125) + +## VC-API + +In order to support these functions outside of the respective DIDComm protocols, a set of endpoints conforming to the [vc-api](https://w3c-ccg.github.io/vc-api) specification are available. These endpoints should be used by a controller when building an identity platform. + +These endpoints include: + +- `GET /vc/credentials` -> returns a list of all stored json-ld credentials +- `GET /vc/credentials/{id}` -> returns a json-ld credential based on it's ID +- `POST /vc/credentials/issue` -> signs a credential +- `POST /vc/credentials/verify` -> verifies a credential +- `POST /vc/credentials/store` -> stores an issued credential +- `POST /vc/presentations/prove` -> proves a presentation +- `POST /vc/presentations/verify` -> verifies a presentation + +To learn more about using these endpoints, please refer to the available [postman collection](../demo/AriesPostmanDemo.md#experimenting-with-the-vc-api-endpoints). diff --git a/docs/features/Mediation.md b/docs/features/Mediation.md index ab9c7e33..8814f7bd 100644 --- a/docs/features/Mediation.md +++ b/docs/features/Mediation.md @@ -1,34 +1,35 @@ # Mediation docs ## Concepts -* **DIDComm Message Forwarding** - Sending an encrypted message to its recipient by first sending it to a third party responsible for forwarding the message on. Message contents are encrypted once for the recipient then wrapped in a [forward message](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0094-cross-domain-messaging/README.md#corerouting10forward) encrypted to the third party. -* **Mediator** - An agent that forwards messages to a client over a DIDComm connection. -* **Mediated Agent** or **Mediation client** - The agent(s) to which a mediator is willing to forward messages. -* **Mediation Request** - A message from a client to a mediator requesting mediation or forwarding. -* **Keylist** - The list of public keys used by the mediator to lookup to which connection a forward message should be sent. Each mediated agent is responsible for maintaining the keylist with the mediator. -* **Keylist Update** - A message from a client to a mediator informing the mediator of changes to the keylist. -* **Default Mediator** - A mediator to be used with every newly created DIDComm connection. -* **Mediation Connection** - Connection between the mediator and the mediated agent or client. Agents can use as many mediators as the identity owner sees fit. Requests for mediation are handled on a per connection basis. -* See [Aries RFC 0211: Coordinate Mediation Protocol](https://github.com/hyperledger/aries-rfcs/blob/master/features/0211-route-coordination/README.md) for additional details on message attributes and more. + +- **DIDComm Message Forwarding** - Sending an encrypted message to its recipient by first sending it to a third party responsible for forwarding the message on. Message contents are encrypted once for the recipient then wrapped in a [forward message](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0094-cross-domain-messaging/README.md#corerouting10forward) encrypted to the third party. +- **Mediator** - An agent that forwards messages to a client over a DIDComm connection. +- **Mediated Agent** or **Mediation client** - The agent(s) to which a mediator is willing to forward messages. +- **Mediation Request** - A message from a client to a mediator requesting mediation or forwarding. +- **Keylist** - The list of public keys used by the mediator to lookup to which connection a forward message should be sent. Each mediated agent is responsible for maintaining the keylist with the mediator. +- **Keylist Update** - A message from a client to a mediator informing the mediator of changes to the keylist. +- **Default Mediator** - A mediator to be used with every newly created DIDComm connection. +- **Mediation Connection** - Connection between the mediator and the mediated agent or client. Agents can use as many mediators as the identity owner sees fit. Requests for mediation are handled on a per connection basis. +- See [Aries RFC 0211: Coordinate Mediation Protocol](https://github.com/hyperledger/aries-rfcs/blob/master/features/0211-route-coordination/README.md) for additional details on message attributes and more. ## Command Line Arguments -* `--open-mediation` - Instructs mediators to automatically grant all incoming mediation requests. -* `--mediator-invitation` - Receive invitation, send mediation request and set as default mediator. -* `--mediator-connections-invite` - Connect to mediator through a connection invitation. If not specified, connect using an OOB invitation. -* `--default-mediator-id` - Set pre-existing mediator as default mediator. -* `--clear-default-mediator` - Clear the stored default mediator. +- `--open-mediation` - Instructs mediators to automatically grant all incoming mediation requests. +- `--mediator-invitation` - Receive invitation, send mediation request and set as default mediator. +- `--mediator-connections-invite` - Connect to mediator through a connection invitation. If not specified, connect using an OOB invitation. +- `--default-mediator-id` - Set pre-existing mediator as default mediator. +- `--clear-default-mediator` - Clear the stored default mediator. The minimum set of arguments *required* to enable mediation are: -```bash= +```bash aca-py start ... \ --open-mediation ``` To automate the mediation process on startup, *additionally* specify the following argument on the *mediated* agent (not the mediator): -```bash= +```bash aca-py start ... \ --mediator-invitation "" ``` @@ -38,37 +39,37 @@ If a default mediator has already been established, then the `--default-mediator ## DIDComm Messages See [Aries RFC 0211: Coordinate Mediation Protocol](https://github.com/hyperledger/aries-rfcs/blob/master/features/0211-route-coordination/README.md). - + ## Admin API -* `GET mediation/requests` - * Return a list of all mediation records. Filter by `conn_id`, `state`, `mediator_terms` and `recipient_terms`. -* `GET mediation/requests/{mediation_id}` - * Retrieve a mediation record by id. -* `DELETE mediation/requests/{mediation_id}` - * Delete mediation record by id. -* `POST mediation/requests/{mediation_id}/grant` - * As a mediator, grant a stored mediation request and send `granted` message to client. -* `POST mediation/requests/{mediation_id}/deny` - * As a mediator, deny a stored mediation request and send `denied` message to client. -* `POST mediation/request/{conn_id}` - * Send a mediation request to connection identified by the given connection ID. -* `GET mediation/keylists` - * Returns key list associated with a connection. Filter on `client` for keys mediated by other agents and `server` for keys mediated by this agent. -* `POST mediation/keylists/{mediation_id}/send-keylist-update` - * Send keylist update message to mediator identified by the given mediation ID. Updates contained in body of request. -* `POST mediation/keylists/{mediation_id}/send-keylist-query` - * Send keylist query message to mediator identified by the given mediation ID. -* `GET mediation/default-mediator` **(PR pending)** - * Retrieve the currently set default mediator. -* `PUT mediation/{mediation_id}/default-mediator` **(PR pending)** - * Set the mediator identified by the given mediation ID as the default mediator. -* `DELETE mediation/default-mediator` **(PR pending)** - * Clear the currently set default mediator (mediation status is maintained and remains functional, just not used as the default). +- `GET mediation/requests` + - Return a list of all mediation records. Filter by `conn_id`, `state`, `mediator_terms` and `recipient_terms`. +- `GET mediation/requests/{mediation_id}` + - Retrieve a mediation record by id. +- `DELETE mediation/requests/{mediation_id}` + - Delete mediation record by id. +- `POST mediation/requests/{mediation_id}/grant` + - As a mediator, grant a stored mediation request and send `granted` message to client. +- `POST mediation/requests/{mediation_id}/deny` + - As a mediator, deny a stored mediation request and send `denied` message to client. +- `POST mediation/request/{conn_id}` + - Send a mediation request to connection identified by the given connection ID. +- `GET mediation/keylists` + - Returns key list associated with a connection. Filter on `client` for keys mediated by other agents and `server` for keys mediated by this agent. +- `POST mediation/keylists/{mediation_id}/send-keylist-update` + - Send keylist update message to mediator identified by the given mediation ID. Updates contained in body of request. +- `POST mediation/keylists/{mediation_id}/send-keylist-query` + - Send keylist query message to mediator identified by the given mediation ID. +- `GET mediation/default-mediator` **(PR pending)** + - Retrieve the currently set default mediator. +- `PUT mediation/{mediation_id}/default-mediator` **(PR pending)** + - Set the mediator identified by the given mediation ID as the default mediator. +- `DELETE mediation/default-mediator` **(PR pending)** + - Clear the currently set default mediator (mediation status is maintained and remains functional, just not used as the default). ## Mediator Message Flow Overview -![Mediator Message Flow](/docs/assets/mediation-message-flow.png) +![Mediator Message Flow](../assets/mediation-message-flow.png) ## Using a Mediator diff --git a/docs/features/Multicredentials.md b/docs/features/Multicredentials.md index 1c9e1f72..9822438b 100644 --- a/docs/features/Multicredentials.md +++ b/docs/features/Multicredentials.md @@ -6,4 +6,4 @@ With the Present Proof Protocol v2, verifiers can ask for a combination of crede Moreover, it is possible to make similar presentation proof requests using the or logical operator. For instance, a verifier can ask for either an eID in AnonCreds format or an eID in W3C Verifiable Credential format. This has the potential to solve the interoperability problem of different credential formats and ecosystems from a user point of view by shifting the requirement of holding/accepting different credential formats from identity holders to verifiers. Here again, using Aries Cloud Agent Python as the underlying verifier agent can tackle such complex presentation proof requests since the agent is capable of verifying both type of credential formats and proof types. -In the future, it would be even possible to put mDoc as an attachment with an and or or logical operation, along with AnonCreds and/or W3C Verifiable Credentials. For this to happen, Aca-Py either needs the capabilities to validate mDocs internally or to connect third-party endpoints to validate and get a response. \ No newline at end of file +In the future, it would be even possible to put mDoc as an attachment with an and or or logical operation, along with AnonCreds and/or W3C Verifiable Credentials. For this to happen, Aca-Py either needs the capabilities to validate mDocs internally or to connect third-party endpoints to validate and get a response. diff --git a/docs/features/Multiledger.md b/docs/features/Multiledger.md index c83b368b..db70a3e4 100644 --- a/docs/features/Multiledger.md +++ b/docs/features/Multiledger.md @@ -7,7 +7,7 @@ More background information including problem statement, design (algorithm) and ## Table of Contents - [Usage](#usage) - - [Example config file:](#example-config-file) + - [Example config file](#example-config-file) - [Config properties](#config-properties) - [Multi-ledger Admin API](#multi-ledger-admin-api) - [Ledger Selection](#ledger-selection) @@ -25,8 +25,9 @@ Multi-ledger is disabled by default. You can enable support for multiple ledgers If `--genesis-transactions-list` is specified, then `--genesis-url, --genesis-file, --genesis-transactions` should not be specified. -### Example config file: -``` +### Example config file + +```yaml - id: localVON is_production: false genesis_url: 'http://host.docker.internal:9000/genesis' @@ -36,7 +37,7 @@ If `--genesis-transactions-list` is specified, then `--genesis-url, --genesis-fi genesis_url: 'http://test.bcovrin.vonx.io/genesis' ``` -``` +```yaml - id: localVON is_production: false genesis_url: 'http://host.docker.internal:9000/genesis' @@ -49,12 +50,15 @@ If `--genesis-transactions-list` is specified, then `--genesis-url, --genesis-fi - id: greenlightDev is_production: true is_write: true - genesis_url: 'http://dev.greenlight.bcovrin.vonx.io/genesis' + genesis_url: 'http://test.bcovrin.vonx.io/genesis' ``` -Note: `is_write` property means that the ledger is write configurable. With reference to the above config example, both `bcovrinTest` and `greenlightDev` ledgers are write configurable. By default, on startup `bcovrinTest` will be the write ledger as it is the topmost write configurable production ledger, [more details](#write-requests) regarding the selection rule. Using `PUT /ledger/{ledger_id}/set-write-ledger` endpoint, either `greenlightDev` and `bcovrinTest` can be set as the write ledger. +Note: `is_write` property means that the ledger is write configurable. With reference to the above config example, both `bcovrinTest` and (the no longer available -- in the above its pointing to BCovrin Test as well) `greenlightDev` ledgers are write configurable. By default, on startup `bcovrinTest` will be the write ledger as it is the topmost write configurable production ledger, [more details](#write-requests) regarding the selection rule. Using `PUT /ledger/{ledger_id}/set-write-ledger` endpoint, either `greenlightDev` and `bcovrinTest` can be set as the write ledger. -``` +> Note 2: The `greenlightDev` ledger is no longer available, so both ledger entries in the example above and below +intentionally point to the same ledger URL. + +```yaml - id: localVON is_production: false is_write: true @@ -64,12 +68,13 @@ Note: `is_write` property means that the ledger is write configurable. With refe genesis_url: 'http://test.bcovrin.vonx.io/genesis' - id: greenlightDev is_production: true - genesis_url: 'http://dev.greenlight.bcovrin.vonx.io/genesis' + genesis_url: 'http://test.bcovrin.vonx.io/genesis' ``` Note: For instance with regards to example config above, `localVON` will be the write ledger, as there are no production ledgers which are configurable it will choose the topmost write configurable non production ledger. ### Config properties + For each ledger, the required properties are as following: - `id`\*: The id (or name) of the ledger, can also be used as the pool name if none provided @@ -82,6 +87,7 @@ For connecting to ledger, one of the following needs to be specified: - `genesis_url`: The url from which to download the genesis transactions to use for connecting to an Indy ledger. Optional properties: + - `pool_name`: name of the indy pool to be opened - `keepalive`: how many seconds to keep the ledger open - `socks_proxy` @@ -91,7 +97,6 @@ Optional properties: Note: Both `endorser_did` and `endorser_alias` are part of the endorser info. Whenever a write ledger is selected using `PUT /ledger/{ledger_id}/set-write-ledger`, the endorser info associated with that ledger in the config updates the `endorser.endorser_public_did` and `endorser.endorser_alias` profile setting respectively. - ## Multi-ledger Admin API Multi-ledger related actions are grouped under the `ledger` topic in the SwaggerUI. @@ -110,6 +115,7 @@ Set active `write_ledger's` `ledger_id` ### Read Requests The following process is executed for these functions in ACA-Py: + 1. `get_schema` 2. `get_credential_definition` 3. `get_revoc_reg_def` @@ -125,9 +131,9 @@ If multiple ledgers are configured then `IndyLedgerRequestsExecutor` service ext #### For checking ledger in parallel - `lookup_did_in_configured_ledgers` function - - If the calling function (above) is in [1-4], then check the `DID` in `cache` for a corresponding applicable `ledger_id`. If found, return the ledger info, else continue. + - If the calling function (above) is in items 1-4, then check the `DID` in `cache` for a corresponding applicable `ledger_id`. If found, return the ledger info, else continue. - Otherwise, launch parallel `_get_ledger_by_did` tasks for each of the configured ledgers. - - As these tasks get finished, construct `applicable_prod_ledgers` and `applicable_non_prod_ledgers` dictionaries, each with `self_certified` and `non_self_certified` inner dict which are sorted by the original order or index. + - As these tasks get finished, construct `applicable_prod_ledgers` and `applicable_non_prod_ledgers` dictionaries, each with `self_certified` and `non_self_certified` inner dict which are sorted by the original order or index. - Order/preference for selection: `self_certified` > `production` > `non_production` - Checks `production` ledger where the `DID` is `self_certified` - Checks `non_production` ledger where the `DID` is `self_certified` @@ -144,7 +150,7 @@ If multiple ledgers are configured then `IndyLedgerRequestsExecutor` service ext ### Write Requests -On startup, the first configured applicable ledger is assigned as the `write_ledger` [`BaseLedger`], the selection is dependent on the order (top-down) and whether it is `production` or `non_production`. For instance, considering this [example configuration](#example-config-file), ledger `bcovrinTest` will be set as `write_ledger` as it is the topmost `production` ledger. If no `production` ledgers are included in configuration then the topmost `non_production` ledger is selected. +On startup, the first configured applicable ledger is assigned as the `write_ledger` (`BaseLedger`), the selection is dependent on the order (top-down) and whether it is `production` or `non_production`. For instance, considering this [example configuration](#example-config-file), ledger `bcovrinTest` will be set as `write_ledger` as it is the topmost `production` ledger. If no `production` ledgers are included in configuration then the topmost `non_production` ledger is selected. ## A Special Warning for TAA Acceptance @@ -173,9 +179,10 @@ There should be no impact/change in functionality to any ACA-Py protocols. Added `build_and_return_get_nym_request` and `submit_get_nym_request` helper functions to `IndySdkLedger` and `IndyVdrLedger`. -Best practice/feedback emerging from `Askar session deadlock` issue and `endorser refactoring` PR was also addressed here by not leaving sessions open unnecessarily and changing `context.session` to `context.profile.session`, etc. +Best practice/feedback emerging from `Askar session deadlock` issue and `endorser refactoring` PR was also addressed here by not leaving sessions open unnecessarily and changing `context.session` to `context.profile.session`, etc. These changes are made here: + - `./aries_cloudagent/ledger/routes.py` - `./aries_cloudagent/messaging/credential_definitions/routes.py` - `./aries_cloudagent/messaging/schemas/routes.py` diff --git a/docs/features/Multitenancy.md b/docs/features/Multitenancy.md index acefc3ea..07b63c32 100644 --- a/docs/features/Multitenancy.md +++ b/docs/features/Multitenancy.md @@ -11,9 +11,9 @@ This allows ACA-Py to be used for a wider range of use cases. One use case could - [Usage](#usage) - [Multi-tenant Admin API](#multi-tenant-admin-api) - [Managed vs Unmanaged Mode](#managed-vs-unmanaged-mode) - - [Managed](#managed) - - [Unmanaged](#unmanaged) - - [Usage](#usage-1) + - [Managed Mode](#managed-mode) + - [Unmanaged Mode](#unmanaged-mode) + - [Mode Usage](#mode-usage) - [Message Routing](#message-routing) - [Relaying](#relaying) - [Mediation](#mediation) @@ -76,11 +76,11 @@ See the SwaggerUI for the exact API definition for multi-tenancy. Multi-tenancy in ACA-Py is designed with two key management modes in mind. -### Managed +### Managed Mode In **`managed`** mode, ACA-Py will manage the key for the wallet. This is the easiest configuration as it allows ACA-Py to fully control the wallet. When a message is received from another agent it can immediately unlock the wallet and process the message. The wallet key is stored encrypted in the base wallet. -### Unmanaged +### Unmanaged Mode In **`unmanaged`** mode, ACA-Py won't manage the key for the wallet. The key is not stored in the base wallet, which means the key to unlock the wallet needs to be provided whenever the wallet is used. When a message from another agent is received, ACA-Py cannot immediately unlock the wallet and process the message. See [Authentication](#authentication) for more info. @@ -88,7 +88,7 @@ It is important to note unmanaged mode doesn't provide a lot of security over ma > :warning: Although support for unmanaged mode is mostly in place, the receiving of messages from other agents in unmanaged mode is not supported yet. This means unmanaged mode can not be used yet. -### Usage +### Mode Usage The mode used can be specified when creating a wallet using the `key_management_mode` parameter. @@ -309,7 +309,7 @@ After registering a tenant which effectively creates a subwallet, you may need t ### Update a tenant -The following properties can be updated: `image_url`, `label`, `wallet_dispatch_type`, and `wallet_webhook_urls` for tenants of a multitenancy wallet. To update these properties you will `PUT` a request json containing the properties you wish to update along with the updated values to the `/multitenancy/wallet/${TENANT_WALLET_ID}` admin endpoint. If the Admin API endoint is protected, you will also include the Admin API Key in the request header. +The following properties can be updated: `image_url`, `label`, `wallet_dispatch_type`, and `wallet_webhook_urls` for tenants of a multitenancy wallet. To update these properties you will `PUT` a request json containing the properties you wish to update along with the updated values to the `/multitenancy/wallet/${TENANT_WALLET_ID}` admin endpoint. If the Admin API endpoint is protected, you will also include the Admin API Key in the request header. Example @@ -352,7 +352,7 @@ echo $update_tenant | curl -X PUT "${ACAPY_ADMIN_URL}/multitenancy/wallet/${TEN } ``` -> An Admin API Key is all that is ALLOWED to be included in a request header during an update. Inluding the Bearer token header will result in a 404: Unauthorized error +> An Admin API Key is all that is ALLOWED to be included in a request header during an update. Including the Bearer token header will result in a 404: Unauthorized error ### Remove a tenant @@ -379,7 +379,7 @@ curl -X POST "${ACAPY_ADMIN_URL}/multitenancy/wallet/{wallet_id}/remove" \ ### Per tenant settings -To allow configurability of ACA-Py startup parameters/environment variables at a tenant/subwallet level. [PR#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) will provide the ability to update the following subset of settings when creating or updating the subwallet: +To allow the configuring of ACA-Py startup parameters/environment variables at a tenant/subwallet level. [PR#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) will provide the ability to update the following subset of settings when creating or updating the subwallet: | Labels | | Setting | |---|---|---| @@ -391,7 +391,7 @@ To allow configurability of ACA-Py startup parameters/environment variables at a | ACAPY_AUTO_PING_CONNECTION | auto-ping-connection | auto_ping_connection | | ACAPY_MONITOR_PING | monitor-ping | debug.monitor_ping | | ACAPY_AUTO_RESPOND_MESSAGES | auto-respond-messages | debug.auto_respond_messages | -| ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER | auto-respond-credential-offer | debug.auto_resopnd_credential_offer | +| ACAPY_AUTO_RESPOND_CREDENTIAL_OFFER | auto-respond-credential-offer | debug.auto_respond_credential_offer | | ACAPY_AUTO_RESPOND_CREDENTIAL_REQUEST | auto-respond-credential-request | debug.auto_respond_credential_request | | ACAPY_AUTO_VERIFY_PRESENTATION | auto-verify-presentation | debug.auto_verify_presentation | | ACAPY_NOTIFY_REVOCATION | notify-revocation | revocation.notify | @@ -405,7 +405,8 @@ To allow configurability of ACA-Py startup parameters/environment variables at a Added `extra_settings` dict field to request schema. `extra_settings` can be configured in the request body as below: **`Example Request`** - ``` + + ```json { "wallet_name": " ... ", "default_label": " ... ", @@ -434,7 +435,8 @@ To allow configurability of ACA-Py startup parameters/environment variables at a Added `extra_settings` dict field to request schema. **`Example Request`** - ``` + +```json { "wallet_webhook_urls": [ ... ], "wallet_dispatch_type": "default", @@ -446,11 +448,11 @@ To allow configurability of ACA-Py startup parameters/environment variables at a "ACAPY_PUBLIC_INVITES": false }, } - ``` +``` - ```sh +```sh echo $update_tenant | curl -X PUT "${ACAPY_ADMIN_URL}/multitenancy/wallet/${WALLET_ID}" \ -H "Content-Type: application/json" \ -H "x-api-key: $ACAPY_ADMIN_URL_API_KEY" \ -d @- - ``` +``` diff --git a/docs/features/PlugIns.md b/docs/features/PlugIns.md index 0ea508d2..7008dc02 100644 --- a/docs/features/PlugIns.md +++ b/docs/features/PlugIns.md @@ -4,15 +4,14 @@ Plug-ins are loaded on Aca-Py startup based on the following parameters: -* `--plugin` - identifies the plug-in library to load -* `--block-plugin` - identifies plug-ins (including built-ins) that are *not* to be loaded -* `--plugin-config` - identify a configuration parameter for a plug-in -* `--plugin-config-value` - identify a *value* for a plug-in configuration - +- `--plugin` - identifies the plug-in library to load +- `--block-plugin` - identifies plug-ins (including built-ins) that are *not* to be loaded +- `--plugin-config` - identify a configuration parameter for a plug-in +- `--plugin-config-value` - identify a *value* for a plug-in configuration The `--plug-in` parameter specifies a package that is loaded by Aca-Py at runtime, and extends Aca-Py by adding support for additional protocols and message types, and/or extending the Admin API with additional endpoints. -The original plug-in design (which we will call the "old" model) explicitly indluded `message_types.py` `routes.py` (to add Admin API's). But functionality was added later (we'll call this the "new" model) to allow the plug-in to include a generic `setup` package that could perform arbitrary initialization. The "new" model also includes support for a `definition.py` file that can specify plug-in version information (major/minor plug-in version, as well as the minimum supported version (if another agent is running an older version of the plug-in)). +The original plug-in design (which we will call the "old" model) explicitly included `message_types.py` `routes.py` (to add Admin API's). But functionality was added later (we'll call this the "new" model) to allow the plug-in to include a generic `setup` package that could perform arbitrary initialization. The "new" model also includes support for a `definition.py` file that can specify plug-in version information (major/minor plug-in version, as well as the minimum supported version (if another agent is running an older version of the plug-in)). You can discover which plug-ins are installed in an aca-py instance by calling (in the "server" section) the `GET /plugins` endpoint. (Note that this will return all loaded protocols, including the built-ins. You can call the `GET /status/config` to inspect the Aca-Py configuration, which will include the configuration for the *external* plug-ins.) @@ -22,7 +21,7 @@ If a setup method is provided, it will be called. If not, the `message_types.py This would be in the `package/module __init__.py`: -``` +```python async def setup(context: InjectionContext): pass ``` @@ -47,7 +46,7 @@ If `routes.py` is available, then Aca-Py will call the following functions to in If `definition.py` is available, Aca-Py will read this package to determine protocol version information. An example follows (this is an example that specifies two protocol versions): -``` +```json versions = [ { "major_version": 1, @@ -71,7 +70,6 @@ The attributes are: - `minimum_minor_version` - specifies the minimum supported version (if a lower version is installed in another agent) - `path` - specifies the sub-path within the package for this version - ## Loading Aca-Py Plug-Ins at Runtime The load sequence for a plug-in (the "Startup" class depends on how Aca-Py is running - `upgrade`, `provision` or `start`): @@ -150,7 +148,7 @@ Most Aca-Py plug-ins provide support for installing the plug-in using [poetry](h TBD -# Aca-Py Plug-ins +## Aca-Py Plug-ins This list was originally published in [this hackmd document](https://hackmd.io/m2AZebwJRkm6sWgO64-5xQ). @@ -163,28 +161,29 @@ This list was originally published in [this hackmd document](https://hackmd.io/m | Indicio | Question & Answer | Non-Aries Protocol | Aug 2022 | https://github.com/Indicio-tech/acapy-plugin-qa | | Indicio | Acapy-plugin-pickup | Fetching Messages from Mediator | Aug 2022 | https://github.com/Indicio-tech/acapy-plugin-pickup | | Indicio | Machine Readable GF | Governance Framework | Mar 2022 | https://github.com/Indicio-tech/mrgf | -| Indicio | Cache Redis | Cache for Scaleability | Jul 2022 | https://github.com/Indicio-tech/aries-acapy-cache-redis | +| Indicio | Cache Redis | Cache for Scalability | Jul 2022 | https://github.com/Indicio-tech/aries-acapy-cache-redis | | SICPA Dlab | Kafka Events | Event Bus Integration | Aug 2022 | https://github.com/sicpa-dlab/aries-acapy-plugin-kafka-events | -| SICPA Dlab | DidComm Resolver | Unversal Resolver for DIDComm | Aug 2022 | https://github.com/sicpa-dlab/acapy-resolver-didcomm | +| SICPA Dlab | DidComm Resolver | Universal Resolver for DIDComm | Aug 2022 | https://github.com/sicpa-dlab/acapy-resolver-didcomm | | SICPA Dlab | Universal Resolver | Multi-ledger Reading | Jul 2021 | https://github.com/sicpa-dlab/acapy-resolver-universal | | DDX | mydata-did-protocol | | Oct 2022 | https://github.com/decentralised-dataexchange/acapy-mydata-did-protocol | | BCGov | Basic Message Storage | Basic message storage (traction) | Dec 2022 | https://github.com/bcgov/traction/tree/develop/plugins/basicmessage_storage | | BCGov | Multi-tenant Provider | Multi-tenant Provider (traction) | Dec 2022 | https://github.com/bcgov/traction/tree/develop/plugins/multitenant_provider | | BCGov | Traction Innkeeper | Innkeeper (traction) | Feb 2023 | https://github.com/bcgov/traction/tree/develop/plugins/traction_innkeeper | - -# Reference +## References The following links may be helpful or provide additional context for the current plug-in support. (These are links to issues or pull requests that were raised during plug-in development.) Configuration params: - https://github.com/hyperledger/aries-cloudagent-python/issues/1121 - https://hackmd.io/ROUzENdpQ12cz3UB9qk1nA - https://github.com/hyperledger/aries-cloudagent-python/pull/1226 + +- https://github.com/hyperledger/aries-cloudagent-python/issues/1121 +- https://hackmd.io/ROUzENdpQ12cz3UB9qk1nA +- https://github.com/hyperledger/aries-cloudagent-python/pull/1226 Loading plug-ins: - https://github.com/hyperledger/aries-cloudagent-python/pull/1086 + +- https://github.com/hyperledger/aries-cloudagent-python/pull/1086 Versioning for plug-ins: - https://github.com/hyperledger/aries-cloudagent-python/pull/443 +- https://github.com/hyperledger/aries-cloudagent-python/pull/443 diff --git a/docs/features/SelectiveDisclosureJWTs.md b/docs/features/SelectiveDisclosureJWTs.md index ed21f047..23489fae 100644 --- a/docs/features/SelectiveDisclosureJWTs.md +++ b/docs/features/SelectiveDisclosureJWTs.md @@ -11,7 +11,8 @@ In addition, this implementation includes an optional mechanism for key binding, The issuer determines which claims in an SD-JWT can be selectively disclosable. In this implementation, all claims at all levels of the JSON structure are by default selectively disclosable. If the issuer wishes for certain claims to always be visible, they can indicate which claims should not be selectively disclosable, as described below. Essential verification data such as `iss`, `iat`, `exp`, and `cnf` are always visible. The issuer creates a list of JSON paths for the claims that will not be selectively disclosable. Here is an example payload: -``` + +```json { "birthdate": "1940-01-01", "address": { @@ -25,20 +26,22 @@ The issuer creates a list of JSON paths for the claims that will not be selectiv ``` -| Attribute to access | JSON path | -|--------------|-----------| -| "birthdate" | "birthdate" | -| The country attribute within the address dictionary | "address.country" | -| The second item in the nationalities list | "nationalities[1] | -| All items in the nationalities list | "nationalities[0:2]" | +| Attribute to access | JSON path | +| --------------------------------------------------- | -------------------- | +| "birthdate" | "birthdate" | +| The country attribute within the address dictionary | "address.country" | +| The second item in the nationalities list | "nationalities[1] | +| All items in the nationalities list | "nationalities[0:2]" | The [specification](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#name-nested-data-in-sd-jwts) defines options for how the issuer can handle nested structures with respect to selective disclosability. As mentioned, all claims at all levels of the JSON structure are by default selectively disclosable. ### [Option 1: Flat SD-JWT](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#section-5.7.1) + The issuer can decide to treat the `address` claim in the above example payload as a block that can either be disclosed completely or not at all. The issuer lists out all the claims inside "address" in the `non_sd_list`, but not `address` itself: -``` + +```json non_sd_list = [ "address.street_address", "address.locality", @@ -48,26 +51,28 @@ non_sd_list = [ ``` ### [Option 2: Structured SD-JWT](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#section-5.7.2) + The issuer may instead decide to make the `address` claim contents selectively disclosable individually. The issuer lists only "address" in the `non_sd_list`. -``` + +```json non_sd_list = ["address"] ``` ### [Option 3: SD-JWT with Recursive Disclosures](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#section-5.7.3) + The issuer may also decide to make the `address` claim contents selectively disclosable recursively, i.e., the `address` claim is made selectively disclosable as well as its sub-claims. The issuer lists neither `address` nor the subclaims of `address` in the `non_sd_list`, leaving all with their default selective disclosability. If all claims can be selectively disclosable, the `non_sd_list` need not be defined explicitly. - ## Walk-Through of SD-JWT Implementation ### Signing SD-JWTs -#### Example input to `/wallet/sd-jwt/sign` endpoint: +#### Example input to `/wallet/sd-jwt/sign` endpoint -``` +```json { "did": "WpVJtxKVwGQdRpQP8iwJZy", "headers": {}, @@ -99,42 +104,46 @@ The issuer lists neither `address` nor the subclaims of `address` in the `non_sd } ``` -#### Output: -``` + +#### Output + +```bash "eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJFZERTQSIsICJraWQiOiAiZGlkOnNvdjpXcFZKdHhLVndHUWRScFFQOGl3Slp5I2tleS0xIn0.eyJfc2QiOiBbIkR0a21ha3NkZGtHRjFKeDBDY0kxdmxRTmZMcGFnQWZ1N3p4VnBGRWJXeXciLCAiSlJLb1E0QXVHaU1INWJIanNmNVV4YmJFeDh2YzFHcUtvX0l3TXE3Nl9xbyIsICJNTTh0TlVLNUstR1lWd0swX01kN0k4MzExTTgwVi13Z0hRYWZvRkoxS09JIiwgIlBaM1VDQmdadVRMMDJkV0pxSVY4elUtSWhnalJNX1NTS3dQdTk3MURmLTQiLCAiX294WGNuSW5Yai1SV3BMVHNISU5YaHFrRVAwODkwUFJjNDBISWE1NElJMCIsICJhdnRLVW5Sdnc1clV0TnZfUnAwUll1dUdkR0RzcnJPYWJfVjR1Y05RRWRvIiwgInByRXZJbzBseTVtNTVsRUpTQUdTVzMxWGdVTElOalo5ZkxiRG81U1pCX0UiXSwgImdpdmVuX25hbWUiOiAiSm9obiIsICJmYW1pbHlfbmFtZSI6ICJEb2UiLCAibmF0aW9uYWxpdGllcyI6IFt7Ii4uLiI6ICJPdU1wcEhpYzEySjYzWTBIY2Ffd1BVeDJCTGdUQVdZQjJpdXpMY3lvcU5JIn0sIHsiLi4uIjogIlIxczlaU3NYeVV0T2QyODdEYy1DTVYyMEdvREF3WUVHV3c4ZkVKd1BNMjAifSwgeyIuLi4iOiAid0lJbjdhQlNDVkFZcUF1Rks3Nmpra3FjVGFvb3YzcUhKbzU5WjdKWHpnUSJ9XSwgImlzcyI6ICJodHRwczovL2V4YW1wbGUuY29tL2lzc3VlciIsICJpYXQiOiAxNjgzMDAwMDAwLCAiZXhwIjogMTg4MzAwMDAwMCwgIl9zZF9hbGciOiAic2hhLTI1NiJ9.cIsuGTIPfpRs_Z49nZcn7L6NUgxQumMGQpu8K6rBtv-YRiFyySUgthQI8KZe1xKyn5Wc8zJnRcWbFki2Vzw6Cw~WyJmWURNM1FQcnZicnZ6YlN4elJsUHFnIiwgIlNBIl0~WyI0UGc2SmZ0UnRXdGFPcDNZX2tscmZRIiwgIkRFIl0~WyJBcDh1VHgxbVhlYUgxeTJRRlVjbWV3IiwgIlVTIl0~WyJ4dkRYMDBmalpmZXJpTmlQb2Q1MXFRIiwgInVwZGF0ZWRfYXQiLCAxNTcwMDAwMDAwXQ~WyJYOTlzM19MaXhCY29yX2hudFJFWmNnIiwgInN1YiIsICJ1c2VyXzQyIl0~WyIxODVTak1hM1k3QlFiWUpabVE3U0NRIiwgInBob25lX251bWJlcl92ZXJpZmllZCIsIHRydWVd~WyJRN1FGaUpvZkhLSWZGV0kxZ0Vaal93IiwgInBob25lX251bWJlciIsICIrMS0yMDItNTU1LTAxMDEiXQ~WyJOeWtVcmJYN1BjVE1ubVRkUWVxZXl3IiwgImVtYWlsIiwgImpvaG5kb2VAZXhhbXBsZS5jb20iXQ~WyJlemJwQ2lnVlhrY205RlluVjNQMGJ3IiwgImJpcnRoZGF0ZSIsICIxOTQwLTAxLTAxIl0~WyJvd3ROX3I5Z040MzZKVnJFRWhQU05BIiwgInN0cmVldF9hZGRyZXNzIiwgIjEyMyBNYWluIFN0Il0~WyJLQXktZ0VaWmRiUnNHV1dNVXg5amZnIiwgInJlZ2lvbiIsICJBbnlzdGF0ZSJd~WyJPNnl0anM2SU9HMHpDQktwa0tzU1pBIiwgImxvY2FsaXR5IiwgIkFueXRvd24iXQ~WyI0Nzg5aG5GSjhFNTRsLW91RjRaN1V3IiwgImNvdW50cnkiLCAiVVMiXQ~WyIyaDR3N0FuaDFOOC15ZlpGc2FGVHRBIiwgImFkZHJlc3MiLCB7Il9zZCI6IFsiTXhKRDV5Vm9QQzFIQnhPRmVRa21TQ1E0dVJrYmNrellza1Z5RzVwMXZ5SSIsICJVYkxmVWlpdDJTOFhlX2pYbS15RHBHZXN0ZDNZOGJZczVGaVJpbVBtMHdvIiwgImhsQzJEYVBwT2t0eHZyeUFlN3U2YnBuM09IZ193Qk5heExiS3lPRDVMdkEiLCAia2NkLVJNaC1PaGFZS1FPZ2JaajhmNUppOXNLb2hyYnlhYzNSdXRqcHNNYyJdfV0~" ``` The `sd_jwt_sign()` method: + - Creates the list of claims that are selectively disclosable - - Uses the `non_sd_list` compared against the list of JSON paths for all claims to create the list of JSON paths for selectively disclosable claims - - Separates list splices if necessary - - Sorts the `sd_list` so that the claims deepest in the structure are handled first - - Since we will wrap the selectively disclosable claim keys, the JSON paths for nested structures do not work properly when the claim key is wrapped in an object + - Uses the `non_sd_list` compared against the list of JSON paths for all claims to create the list of JSON paths for selectively disclosable claims + - Separates list splices if necessary + - Sorts the `sd_list` so that the claims deepest in the structure are handled first + - Since we will wrap the selectively disclosable claim keys, the JSON paths for nested structures do not work properly when the claim key is wrapped in an object - Uses the JSON paths in the `sd_list` to find each selectively disclosable claim and wrap it in the `SDObj` defined by the [sd-jwt Python library](https://github.com/openwallet-foundation-labs/sd-jwt-python) and removes/replaces the original entry - - For list items, the element itself is wrapped - - For other objects, the dictionary key is wrapped + - For list items, the element itself is wrapped + - For other objects, the dictionary key is wrapped - With this modified payload, the `SDJWTIssuerACAPy.issue()` method: - - Checks if there are selectively disclosable claims at any level in the payload - - Assembles the SD-JWT payload and creates the disclosures - - Calls `SDJWTIssuerACAPy._create_signed_jws()`, which is redefined in order to use the ACA-Py `jwt_sign` method and which creates the JWT - - Combines and returns the signed JWT with its disclosures and option key binding JWT, as indicated in the [specification](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#name-sd-jwt-structure) - - + - Checks if there are selectively disclosable claims at any level in the payload + - Assembles the SD-JWT payload and creates the disclosures + - Calls `SDJWTIssuerACAPy._create_signed_jws()`, which is redefined in order to use the ACA-Py `jwt_sign` method and which creates the JWT + - Combines and returns the signed JWT with its disclosures and option key binding JWT, as indicated in the [specification](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-05#name-sd-jwt-structure) ### Verifying SD-JWTs -#### Example input to `/wallet/sd-jwt/verify` endpoint: +#### Example input to `/wallet/sd-jwt/verify` endpoint Using the output from the `/wallet/sd-jwt/sign` example above, we have decided to only reveal two of the selectively disclosable claims (`user` and `updated_at`) and achieved this by only including the disclosures for those claims. We have also included a key binding JWT following the disclosures. -``` + +```json { "sd_jwt": "eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJFZERTQSIsICJraWQiOiAiZGlkOnNvdjpXcFZKdHhLVndHUWRScFFQOGl3Slp5I2tleS0xIn0.eyJfc2QiOiBbIkR0a21ha3NkZGtHRjFKeDBDY0kxdmxRTmZMcGFnQWZ1N3p4VnBGRWJXeXciLCAiSlJLb1E0QXVHaU1INWJIanNmNVV4YmJFeDh2YzFHcUtvX0l3TXE3Nl9xbyIsICJNTTh0TlVLNUstR1lWd0swX01kN0k4MzExTTgwVi13Z0hRYWZvRkoxS09JIiwgIlBaM1VDQmdadVRMMDJkV0pxSVY4elUtSWhnalJNX1NTS3dQdTk3MURmLTQiLCAiX294WGNuSW5Yai1SV3BMVHNISU5YaHFrRVAwODkwUFJjNDBISWE1NElJMCIsICJhdnRLVW5Sdnc1clV0TnZfUnAwUll1dUdkR0RzcnJPYWJfVjR1Y05RRWRvIiwgInByRXZJbzBseTVtNTVsRUpTQUdTVzMxWGdVTElOalo5ZkxiRG81U1pCX0UiXSwgImdpdmVuX25hbWUiOiAiSm9obiIsICJmYW1pbHlfbmFtZSI6ICJEb2UiLCAibmF0aW9uYWxpdGllcyI6IFt7Ii4uLiI6ICJPdU1wcEhpYzEySjYzWTBIY2Ffd1BVeDJCTGdUQVdZQjJpdXpMY3lvcU5JIn0sIHsiLi4uIjogIlIxczlaU3NYeVV0T2QyODdEYy1DTVYyMEdvREF3WUVHV3c4ZkVKd1BNMjAifSwgeyIuLi4iOiAid0lJbjdhQlNDVkFZcUF1Rks3Nmpra3FjVGFvb3YzcUhKbzU5WjdKWHpnUSJ9XSwgImlzcyI6ICJodHRwczovL2V4YW1wbGUuY29tL2lzc3VlciIsICJpYXQiOiAxNjgzMDAwMDAwLCAiZXhwIjogMTg4MzAwMDAwMCwgIl9zZF9hbGciOiAic2hhLTI1NiJ9.cIsuGTIPfpRs_Z49nZcn7L6NUgxQumMGQpu8K6rBtv-YRiFyySUgthQI8KZe1xKyn5Wc8zJnRcWbFki2Vzw6Cw~WyJ4dkRYMDBmalpmZXJpTmlQb2Q1MXFRIiwgInVwZGF0ZWRfYXQiLCAxNTcwMDAwMDAwXQ~WyJYOTlzM19MaXhCY29yX2hudFJFWmNnIiwgInN1YiIsICJ1c2VyXzQyIl0~eyJhbGciOiAiRWREU0EiLCAidHlwIjogImtiK2p3dCIsICJraWQiOiAiZGlkOnNvdjpXcFZKdHhLVndHUWRScFFQOGl3Slp5I2tleS0xIn0.eyJub25jZSI6ICIxMjM0NTY3ODkwIiwgImF1ZCI6ICJodHRwczovL2V4YW1wbGUuY29tL3ZlcmlmaWVyIiwgImlhdCI6IDE2ODgxNjA0ODN9.i55VeR7bNt7T8HWJcfj6jSLH3Q7vFk8N0t7Tb5FZHKmiHyLrg0IPAuK5uKr3_4SkjuGt1_iNl8Wr3atWBtXMDA" } ``` -#### Output: +#### Verify Output + Note that attributes in the `non_sd_list` (`given_name`, `family_name`, and `nationalities`), as well as essential verification data (`iss`, `iat`, `exp`) are visible directly within the payload. The disclosures include only the values for the `user` and `updated_at` claims, since those are the only selectively disclosable claims that the holder presented. The corresponding hashes for those disclosures appear in the `payload["_sd"]` list. -``` + +```json { "headers": { "typ": "JWT", @@ -187,8 +196,9 @@ Note that attributes in the `non_sd_list` (`given_name`, `family_name`, and `nat ``` The `sd_jwt_verify()` method: + - Parses the SD-JWT presentation into its component parts: JWT, disclosures, and optional key binding - - The JWT payload is parsed from its headers and signature + - The JWT payload is parsed from its headers and signature - Creates a list of plaintext disclosures - Calls `SDJWTVerifierACAPy._verify_sd_jwt`, which is redefined in order to use the ACA-Py `jwt_verify` method, and which returns the verified JWT - If key binding is used, the key binding JWT is verified and checked against the expected audience and nonce values diff --git a/docs/features/SupportedRFCs.md b/docs/features/SupportedRFCs.md index f3c87e67..245f881c 100644 --- a/docs/features/SupportedRFCs.md +++ b/docs/features/SupportedRFCs.md @@ -28,15 +28,15 @@ A summary of the Aries Interop Profiles and Aries RFCs supported in ACA-Py can b ## Platform Support -| Platform | Supported | Notes | -| -------- | :-------: | ------- | -| Server | :white_check_mark: | | -| Kubernetes | :white_check_mark: | BC Gov has extensive experience running ACA-Py on Red Hat's OpenShift Kubernetes Distribution. | -| Docker | :white_check_mark: | Official docker images are published to the GitHub [hyperledger/aries-cloudagent-python] container repository. | -| Desktop | :warning: | Could be run as a local service on the computer | -| iOS | :x: | | -| Android | :x: | | -| Browser | :x: | | +| Platform | Supported | Notes | +| ---------- | :----------------: | -------------------------------------------------------------------------------------------------------------------------- | +| Server | :white_check_mark: | | +| Kubernetes | :white_check_mark: | BC Gov has extensive experience running ACA-Py on Red Hat's OpenShift Kubernetes Distribution. | +| Docker | :white_check_mark: | Official docker images are published to the GitHub container repository at `ghcr.io/hyperledger/aries-cloudagent-python`. | +| Desktop | :warning: | Could be run as a local service on the computer | +| iOS | :x: | | +| Android | :x: | | +| Browser | :x: | | ## Agent Types @@ -46,7 +46,7 @@ A summary of the Aries Interop Profiles and Aries RFCs supported in ACA-Py can b | Holder | :white_check_mark: | | | Verifier | :white_check_mark: | | | Mediator Service | :white_check_mark: | See the [aries-mediator-service](https://github.com/hyperledger/aries-mediator-service), a pre-configured, production ready Aries Mediator Service based on a released version of ACA-Py. | -| Mediator Client | :white_check_mark: | +| Mediator Client | :white_check_mark: | | | Indy Transaction Author | :white_check_mark: | | | Indy Transaction Endorser | :white_check_mark: | | | Indy Endorser Service | :white_check_mark: | See the [aries-endorser-service](https://github.com/hyperledger/aries-endorser-service), a pre-configured, production ready Aries Endorser Service based on a released version of ACA-Py. | @@ -74,7 +74,7 @@ A summary of the Aries Interop Profiles and Aries RFCs supported in ACA-Py can b ## Secure Storage Types | Secure Storage Types | Supported | Notes | - --- | :--: | -- | +| --- | :--: | -- | | [Aries Askar] | :white_check_mark: | Recommended - Aries Askar provides equivalent/evolved secure storage and cryptography support to the "indy-wallet" part of the Indy SDK. When using Askar (via the `--wallet-type askar` startup parameter), other functionality is handled by [CredX](https://github.com/hyperledger/indy-shared-rs) (AnonCreds) and [Indy VDR](https://github.com/hyperledger/indy-vdr) (Indy ledger interactions). | | [Aries Askar]-AnonCreds | :white_check_mark: | Recommended - When using Askar/AnonCreds (via the `--wallet-type askar-anoncreds` startup parameter), other functionality is handled by [AnonCreds RS](https://github.com/hyperledger/anoncreds-rs) (AnonCreds) and [Indy VDR](https://github.com/hyperledger/indy-vdr) (Indy ledger interactions).

This `wallet-type` will eventually be the same as `askar` when we have fully integrated the AnonCreds RS library into ACA-Py. | | [Indy SDK](https://github.com/hyperledger/indy-sdk/tree/master/docs/design/003-wallet-storage) | :warning: Deprecated | Full support for the features of the "indy-wallet" secure storage capabilities found in the Indy SDK. | @@ -87,7 +87,7 @@ A summary of the Aries Interop Profiles and Aries RFCs supported in ACA-Py can b ## Miscellaneous Features | Feature | Supported | Notes | - --- | :--: | -- | +| --- | :--: | -- | | ACA-Py Plugins | :white_check_mark: | The [ACA-Py Plugins] repository contains a growing set of plugins that are maintained and (mostly) tested against new releases of ACA-Py. | | Multi use invitations | :white_check_mark: | | | Invitations using public did | :white_check_mark: | | @@ -104,7 +104,7 @@ A summary of the Aries Interop Profiles and Aries RFCs supported in ACA-Py can b | SD-JWTs | :white_check_mark: | Signing and verifying SD-JWTs is supported | [ACA-Py Plugins]: https://github.com/hyperledger/aries-acapy-plugins -[Indy SDK to Askar Migration Guide]: ../../deploying/IndySDKtoAskarMigration/ +[Indy SDK to Askar Migration Guide]: ../deploying/IndySDKtoAskarMigration.md [Traction]: https://github.com/bcgov/traction ## Supported RFCs @@ -115,7 +115,7 @@ All RFCs listed in [AIP 1.0](https://github.com/hyperledger/aries-rfcs/tree/main provides notes about the implementation of specific RFCs. | RFC | Supported | Notes | - --- | :--: | -- | +| --- | :--: | -- | | [0025-didcomm-transports](https://github.com/hyperledger/aries-rfcs/tree/b490ebe492985e1be9804fc0763119238b2e51ab/features/0025-didcomm-transports) | :white_check_mark: | ACA-Py currently supports HTTP and WebSockets for both inbound and outbound messaging. Transports are pluggable and an agent instance can use multiple inbound and outbound transports.| | [0160-connection-protocol](https://github.com/hyperledger/aries-rfcs/tree/9b0aaa39df7e8bd434126c4b33c097aae78d65bf/features/0160-connection-protocol) | :white_check_mark: | The agent supports Connection/DID exchange initiated from both plaintext invitations and public DIDs that enable bypassing the invitation message. | @@ -125,8 +125,8 @@ All RFCs listed in [AIP 2.0](https://github.com/hyperledger/aries-rfcs/tree/main are fully supported in ACA-Py **EXCEPT** as noted in the table below. | RFC | Supported | Notes | - --- | :--: | -- | -| [0587-encryption-envelope-v2](https://github.com/hyperledger/aries-rfcs/tree/b3a3942ef052039e73cd23d847f42947f8287da2/features/0587-encryption-envelope-v2) | :construction: | Support for the DIDComm V2 envelope format is a work in progress | +| --- | :--: | -- | +| [0587-encryption-envelope-v2](https://github.com/hyperledger/aries-rfcs/tree/b3a3942ef052039e73cd23d847f42947f8287da2/features/0587-encryption-envelope-v2) | :construction: | Supporting the DIDComm v2 encryption envelope does not make sense until DIDComm v2 is to be supported. | | [0317-please-ack](https://github.com/hyperledger/aries-rfcs/tree/main/features/0317-please-ack) | :x: | An investigation was done into supporting `please-ack` and a number of complications were found. As a result, we expect that `please-ack` will be dropped from AIP 2.0. It has not been implemented by any Aries frameworks or deployments. | ### Other Supported RFCs diff --git a/docs/features/UsingOpenAPI.md b/docs/features/UsingOpenAPI.md index 45e75a40..c141e44e 100644 --- a/docs/features/UsingOpenAPI.md +++ b/docs/features/UsingOpenAPI.md @@ -2,13 +2,13 @@ ACA-Py provides an OpenAPI-documented REST interface for administering the agent's internal state and initiating communication with connected agents. -The running agent provides a `Swagger User Interface` that can be browsed and used to test various scenarios manually (see the [Admin API Readme](AdminAPI.md) for details). However, it is often desirable to produce native language interfaces rather than coding `Controllers` using HTTP primitives. This is possible using several public code generation (codegen) tools. This page provides some suggestions based on experience with these tools when trying to generate `Typescript` wrappers. The information should be useful to those trying to generate other languages. Updates to this page based on experience are encouraged. +The running agent provides a `Swagger User Interface` that can be browsed and used to test various scenarios manually (see the [Admin API Readme](./AdminAPI.md) for details). However, it is often desirable to produce native language interfaces rather than coding `Controllers` using HTTP primitives. This is possible using several public code generation (codegen) tools. This page provides some suggestions based on experience with these tools when trying to generate `Typescript` wrappers. The information should be useful to those trying to generate other languages. Updates to this page based on experience are encouraged. ## ACA-Py, OpenAPI Raw Output Characteristics -ACA-Py uses [aiohttp_apispec](https://github.com/maximdanilchenko/aiohttp-apispec) tags in code to produce the OpenAPI spec file at runtime dependent on what features have been loaded. How these tags are created is documented in the [API Standard Behaviour](https://github.com/hyperledger/aries-cloudagent-python/blob/main/AdminAPI.md#api-standard-behaviour) section of the [Admin API Readme](AdminAPI.md). The OpenAPI spec is available in raw, unformatted form from a running ACA-Py instance using a route of `http:///api/docs/swagger.json` or from the browser `Swagger User Interface` directly. +ACA-Py uses [aiohttp_apispec](https://github.com/maximdanilchenko/aiohttp-apispec) tags in code to produce the OpenAPI spec file at runtime dependent on what features have been loaded. How these tags are created is documented in the [API Standard Behavior](https://github.com/hyperledger/aries-cloudagent-python/blob/main/AdminAPI.md#api-standard-behaviour) section of the [Admin API Readme](./AdminAPI.md). The OpenAPI spec is available in raw, unformatted form from a running ACA-Py instance using a route of `http:///api/docs/swagger.json` or from the browser `Swagger User Interface` directly. -The ACA-Py Admin API evolves across releases. To track these changes and ensure conformance with the OpenAPI specification, we provide a tool located at [`scripts/generate-open-api-spec`](scripts/generate-open-api-spec). This tool starts ACA-Py, retrieves the `swagger.json` file, and runs codegen tools to generate specifications in both Swagger and OpenAPI formats with `json` language output. The output of this tool enables comparison with the checked-in `open-api/swagger.json` and `open-api/openapi.json`, and also serves as a useful resource for identifying any non-conformance to the OpenAPI specification. At the moment, `validation` is turned off via the `open-api/openAPIJSON.config` file, so warning messages are printed for non-conformance, but the `json` is still output. Most of the warnings reported by `generate-open-api-spec` relate to missing `operationId` fields which results in manufactured method names being created by codegen tools. At the moment, [aiohttp_apispec](https://github.com/maximdanilchenko/aiohttp-apispec) does not support adding `operationId` annotations via tags. +The ACA-Py Admin API evolves across releases. To track these changes and ensure conformance with the OpenAPI specification, we provide a tool located at [`scripts/generate-open-api-spec`](https://github.com/hyperledger/aries-cloudagent-python/blob/main/scripts/generate-open-api-spec). This tool starts ACA-Py, retrieves the `swagger.json` file, and runs codegen tools to generate specifications in both Swagger and OpenAPI formats with `json` language output. The output of this tool enables comparison with the checked-in `open-api/swagger.json` and `open-api/openapi.json`, and also serves as a useful resource for identifying any non-conformance to the OpenAPI specification. At the moment, `validation` is turned off via the `open-api/openAPIJSON.config` file, so warning messages are printed for non-conformance, but the `json` is still output. Most of the warnings reported by `generate-open-api-spec` relate to missing `operationId` fields which results in manufactured method names being created by codegen tools. At the moment, [aiohttp_apispec](https://github.com/maximdanilchenko/aiohttp-apispec) does not support adding `operationId` annotations via tags. The `generate-open-api-spec` tool was initially created to help identify issues with method parameters not being sorted, resulting in somewhat random ordering each time a codegen operation was performed. This is relevant for languages which do not have support for [named parameters](https://en.wikipedia.org/wiki/Named_parameter) such as `Javascript`. It is recommended that the `generate-open-api-spec` is run prior to each release, and the resulting `open-api/openapi.json` file checked in to allow tracking of API changes over time. At the moment, this process is not automated as part of the release pipeline. diff --git a/docs/features/adminApi.png b/docs/features/adminApi.png deleted file mode 100644 index dd2380b5120543df612d104651712df6c0a54ad6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84936 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 K!~Ao05C095ZT^S= diff --git a/docs/features/deploymentModel-agent.png b/docs/features/deploymentModel-agent.png deleted file mode 100644 index 9c3d2482b955412b90dfa11f578fa812416f4b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64654 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%0A) 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 SI+mR@;jUQy>4|`-J^ujg$d%^+ diff --git a/docs/features/devcontainer.md b/docs/features/devcontainer.md index e58ba071..719d0cea 100644 --- a/docs/features/devcontainer.md +++ b/docs/features/devcontainer.md @@ -1,11 +1,12 @@ -For information on running demos and tests using provided shell scripts, see [DevReadMe](../DevReadMe) readme. - # ACA-Py Development with Dev Container -The following guide will get you up and running and developing/debugging ACA-Py as quickly as possible. + +The following guide will get you up and running and developing/debugging ACA-Py as quickly as possible. We provide a [`devcontainer`](https://containers.dev) and will use [`VS Code`](https://code.visualstudio.com) to illustrate. By no means is ACA-Py limited to these tools; they are merely examples. +**For information on running demos and tests using provided shell scripts, see [DevReadMe](./DevReadMe) readme.** + ## Caveats The primary use case for this `devcontainer` is for developing, debugging and unit testing (pytest) the [aries_cloudagent](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent) source code. @@ -13,17 +14,18 @@ The primary use case for this `devcontainer` is for developing, debugging and un There are limitations running this devcontainer, such as all networking is within this container. This container has [docker-in-docker](https://github.com/microsoft/vscode-dev-containers/blob/main/script-library/docs/docker-in-docker.md) which allows running demos, building docker images, running `docker compose` all within this container. ### Files + The `.devcontainer` folder contains the `devcontainer.json` file which defines this container. We are using a `Dockerfile` and `post-install.sh` to build and configure the container run image. The `Dockerfile` is simple but in place for simplifying image enhancements (ex. adding `poetry` to the image). The `post-install.sh` will install some additional development libraries (including for BDD support). ## Devcontainer > What are Development Containers? -> +> > A Development Container (or Dev Container for short) allows you to use a container as a full-featured development environment. It can be used to run an application, to separate tools, libraries, or runtimes needed for working with a codebase, and to aid in continuous integration and testing. Dev containers can be run locally or remotely, in a private or public cloud. see [https://containers.dev](https://containers.dev). -In this guide, we will use [Docker](https://www.docker.com) and [Visual Studio Code](https://code.visualstudio.com) with the [Dev Containers Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) installed, please set your machine up with those. As of writing, we used the following: +In this guide, we will use [Docker](https://www.docker.com) and [Visual Studio Code](https://code.visualstudio.com) with the [Dev Containers Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) installed, please set your machine up with those. As of writing, we used the following: - Docker Version: 20.10.24 - VS Code Version: 1.79.0 @@ -45,11 +47,12 @@ To open ACA-Py in a devcontainer, we open the *root* of this repository. We can When the [.devcontainer/devcontainer.json](https://github.com/hyperledger/aries-cloudagent-python/blob/main/.devcontainer/devcontainer.json) is opened, you will see it building... it is building a Python 3.9 image (bash shell) and loading it with all the ACA-Py requirements (and black). We also load a few Visual Studio settings (for running Pytests and formatting with Flake and Black). ### Poetry + The Python libraries / dependencies are installed using [`poetry`](https://python-poetry.org). For the devcontainer, we *DO NOT* use virtual environments. This means you will not see or need venv prompts in the terminals and you will not need to run tasks through poetry (ie. `poetry run black .`). If you need to add new dependencies, you will need to add the dependency via poetry *AND* you should rebuild your devcontainer. In VS Code, open a Terminal, you should be able to run the following commands: -``` +```bash python -m aries_cloudagent -v cd aries_cloudagent ruff check . @@ -61,7 +64,7 @@ The first command should show you that `aries_cloudagent` module is loaded (ACA- When running `ruff check .` in the terminal, you may see `error: Failed to initialize cache at /.ruff_cache: Permission denied (os error 13)` - that's ok. If there are actual ruff errors, you should see something like: -``` +```bash error: Failed to initialize cache at /.ruff_cache: Permission denied (os error 13) admin/base_server.py:7:7: D101 Missing docstring in public class Found 1 error. @@ -78,7 +81,7 @@ More importantly, these extensions are now added to document save, so files will ### Running docker-in-docker demos -Start by running a von-network inside your dev container. Or connect to a hosted ledger. You will need to adjust the ledger configurations if you do this. +Start by running a von-network inside your dev container. Or connect to a hosted ledger. You will need to adjust the ledger configurations if you do this. ```sh git clone https://github.com/bcgov/von-network @@ -108,60 +111,61 @@ cd demo # follow the script... ``` - ## Further Reading and Links -* Development Containers (devcontainers): [https://containers.dev](https://containers.dev) -* Visual Studio Code: [https://code.visualstudio.com](https://code.visualstudio.com) -* Dev Containers Extension: [marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) -* Docker: [https://www.docker.com](https://www.docker.com) -* Docker Compose: [https://docs.docker.com/compose/](https://docs.docker.com/compose/) - +- Development Containers (devcontainers): [https://containers.dev](https://containers.dev) +- Visual Studio Code: [https://code.visualstudio.com](https://code.visualstudio.com) +- Dev Containers Extension: [marketplace.visualstudio.com](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) +- Docker: [https://www.docker.com](https://www.docker.com) +- Docker Compose: [https://docs.docker.com/compose/](https://docs.docker.com/compose/) ## ACA-Py Debugging To better illustrate debugging pytests and ACA-Py runtime code, let's add some run/debug configurations to VS Code. If you have your own `launch.json` and `settings.json`, please cut and paste what you want/need. -``` +```sh cp -R .vscode-sample .vscode ``` This will add a `launch.json`, `settings.json` and multiple ACA-Py configuration files for developing with different scenarios. - Faber: Simple agent to simulate an issuer - Alice: Simple agent to simulate a holder - Endorser: Simulates the endorser agent in an endorsement required environment - Author: Simulates an author agent in a endorsement required environment - Multitenant Admin: Includes settings for a multitenant/wallet scenario +- Faber: Simple agent to simulate an issuer +- Alice: Simple agent to simulate a holder +- Endorser: Simulates the endorser agent in an endorsement required environment +- Author: Simulates an author agent in a endorsement required environment +- Multitenant Admin: Includes settings for a multitenant/wallet scenario Having multiple agents is to demonstrate launching multiple agents in a debug session. Any of the config files and the launch file can be changed and customized to meet your needs. They are all setup to run on different ports so they don't interfere with each other. Running the debug session from inside the dev container allows you to contact other services such as a local ledger or tails server using localhost, while still being able to access the swagger admin api through your browser. For all the agents if you want to use another ledger (von-network) other than localhost you will need to change the `genesis-url` config. For all the agents if you don't want to support revocation you need to remove or comment out the `tails-server-base-url` config. If you want to use a non localhost server then you will need to change the url. +### Faber + +- admin api url = http://localhost:9041 +- study the demo to understand the steps to have the agent in the correct state. Make your public dids and schemas, cred-defs, etc. + +### Alice + +- admin api url = http://localhost:9011 +- study the demo to get a connection with faber +### Endorser -##### Faber: - - admin api url = http://localhost:9041 - - study the demo to understand the steps to have the agent in the correct state. Make your public dids and schemas, cred-defs, etc. +- admin api url = http://localhost:9031 +- This config is useful if you want to develop in an environment that requires endorsement. You can run the demo with `./run_demo faber --endorser-role author` to see all the steps to become and endorser. -##### Alice: - - admin api url = http://localhost:9011 - - study the demo to get a connection with faber +### Author -##### Endorser - - admin api url = http://localhost:9031 - - This config is useful if you want to develop in an environment that requires endorsement. You can run the demo with `./run_demo faber --endorser-role author` to see all the steps to become and endorser. +- admin api url = http://localhost:9021 +- This config is useful if you want to develop in an environment that requires endorsement. You can run the demo with `./run_demo faber --endorser-role author` to see all the steps to become and author. You need to uncomment the configurations for automating the connection to endorser. -##### Author - - admin api url = http://localhost:9021 - - This config is useful if you want to develop in an environment that requires endorsement. You can run the demo with `./run_demo faber --endorser-role author` to see all the steps to become and author. You need to uncomment the configurations for automating the connection to endorser. +### Multitenant-Admin - ##### Multitenant-Admin - - admin api url = http://localhost:9051 - - This is for a multitenant environment where you can create multiple tenants with subwallets with one agent. See [Multitenancy](./Multitenancy.md) +- admin api url = http://localhost:9051 +- This is for a multitenant environment where you can create multiple tenants with subwallets with one agent. See [Multitenancy](./Multitenancy.md) - ### Try running Faber and Alice at the same time. Add break points and recreate the demo! +### Try running Faber and Alice at the same time and add break points and recreate the demo To run your ACA-Py code in debug mode, go to the `Run and Debug` view, select the agent(s) you want to start and click `Start Debugging (F5)`. @@ -169,7 +173,7 @@ This will start your source code as a running ACA-Py instance, all configuration For example, open `aries_cloudagent/admin/server.py` and set a breakpoint in `async def status_handler(self, request: web.BaseRequest):`, then call [`GET /status`](http://localhost:9061/api/doc#/server/get_status) in the Admin Console and hit your breakpoint. -### Pytest +## Pytest Pytest is installed and almost ready; however, we must build the test list. In the Command Palette, `Test: Refresh Tests` will scan and find the tests. @@ -177,7 +181,7 @@ See [Python Testing](https://code.visualstudio.com/docs/python/testing) for more *WARNING*: our pytests include coverage, which will prevent the [debugger from working](https://code.visualstudio.com/docs/python/testing#_debug-tests). One way around this would be to have a `.vscode/settings.json` that says not to use coverage (see above). This will allow you to set breakpoints in the pytest and code under test and use commands such as `Test: Debug Tests in Current File` to start debugging. -*WARNING*: the project configuration found in `pyproject.toml` include performing `ruff` checks when we run `pytest`. Including `ruff` does not play nice with the Testing view. In order to have our pytests discoverable AND available in the Testing view, we create a `.pytest.ini` when we build the devcontainer. This file will not be commited to the repo, nor does it impact `./scripts/run_tests` but it will impact if you manually run the pytest commands locally outside of the devcontainer. Just be aware that the file will stay on your file system after you shutdown the devcontainer. +*WARNING*: the project configuration found in `pyproject.toml` include performing `ruff` checks when we run `pytest`. Including `ruff` does not play nice with the Testing view. In order to have our pytests discoverable AND available in the Testing view, we create a `.pytest.ini` when we build the devcontainer. This file will not be committed to the repo, nor does it impact `./scripts/run_tests` but it will impact if you manually run the pytest commands locally outside of the devcontainer. Just be aware that the file will stay on your file system after you shutdown the devcontainer. ## Next Steps diff --git a/docs/features/endorse-cred-def.png b/docs/features/endorse-cred-def.png deleted file mode 100644 index ceb3d2fbb1ae920ddc0a0f8654514612222eb6f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134605 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 z z5AA1RNNd;&k{74=s+*hR^r6uwH95Ix61H7|2UQFIut7igCn^DXh;9`Sb6TuD@-OeY!?PY99-WJS0Torvhe0qDCNz|?j_5$5 zHp!jZDl7&Xn4x2d)1Xl<-RLgNhpnNyYSjx#cm3;%ZkKOP9v%Vnu#iChzPzrWFblLp zvE)1YDy%My$2|vWVmR1ubilBrQk!{=KF-g01{{3h=`Wf>xY8#*cIId7=6(I*ZjGTe zd2zq@rQMBsMvZr1;pZ2if9$8FI~9LuP*Btmi}a{|p$;^?=wC zzSPhD{;G0a6CO=m&V8^kvN99G{F4Sb8*htf1`x8gYTA8{%QM;ryxLIKnEO(i0ERX* z$Xu*EoM=q>cAV#0w`5?Tto>xy>!WO%F;H8bj0_Jy$IiaXgOfZmE>3cMu8kP;#dJ5D z)ms=o`0NHb|G|IAFPJ5ShhJ`(Xtl!!T}%co7-dZBMM6Zfbk)-r~#HmoHVJ?=$zx!A~e?1Pcub zVQi67&mE4+$;kmKwXv}g(i^A?!O$Uvh7{P6Fh0zKZ$_k#CG#U3a&0h4LQ+afN?g1l z;jUdjG6@%kD8rO%%iGz;;2R6i^CC5C&&yKY2JzV z;vX@3m#ZnOnrgB(%Pv0k}S8=*Mk0sJM1m|5z7-oeJMPmLkr!=xJ{u z!}cVsi#hu==+g0*gDfTzJpx%^b5A;TAcP{;?Sf5<0as5w}xsk zfKv=bVHF$YJzJFLj{UUtI8R<$k2S}BqN*cZ91eZs|aCUxt9i<&*2uYPOuMt|1l!@}um;#rbT@#Y_Na>kkPh zGkND<=Uo!I{#_fUgjKfF;yH>YI*q<{)Ez z=+wLvQC!jzW~&A01FvpX(lYIDId3J_l;B`~VK2^eN|^Tq+0-ipm#TH_r}Ws41A)I( z8c8=+qSPvM%gGrW3y{pt);;YZyb&jqN^@1{7&2*d!4?0|;V0K^d$Mr1%dO>>`d9(ZB5Yjdi8Xz}C+X8C`S{ntL?%bnV# zDpVRULobUK+VN=@_{GDNwV#%d^f*uRo>0B(LI!&(o ze+4@+NP^{CWWbvqhGkfLgce4=SKZ9XoLJapTlEo%z>J-(~u)s@|LxTV{U$J0!0pR-wn(>UeRUbrrG2mW3|!iJFS0OZ#CO z;~-)8O< z%GYtD+VbXSv8JY`D$oH3@CyyT$QqazMKATAQZ!Cx9tP>IJUIFqd;sNAitZOupt7J; z2e~_JG@14Sl1ZK5`V6Fc4C*YzOt#N~f9?gJ?e3Xx_E{;deTfH0DL=E47#l4fjJrHK zZS_b%poO{sVUv_=Whm|*+eG=XP7&L#fi&16AlHH#u+Kn2fzSY*-!HsIr15y+Q7+i0 z)N2|T7>J9z=&1nO0biQ=9q~z&fD>R&@GNfVzd$XFQfm?q!w^V0{=5f(a>2#84v%TD z=t*6!J|=VF(S0XNUwzcqR@N^tPFdyV&4*wTW22PwI9?GQhsc_tA-spm%=RbnPi(%1 z4q@>yRv28aehojhcji9>7+f%;f0*q$3 zuR+>9=JCQ_U0v4-RgWHpxP1Le1S!dib+|ML#L`$K{DKJ(AimVWgZKBZ7B_#}Aau$* z>Y~w=@YXfS3mTh}K1Nz`a%K9jQn<__Zhj3&A-Xuse`Rn{oDGQznh0yv&R#joC-YVL zW;V`nGrC8+!awTWP_e7R2;nLGw0S!whzl12;)!8>XTiWHS8El`R=n|#-~u``IND&v zY!~|mIevR8hm-9m06y5W$u5$yi4Bim*G2A7W3)6-fyW~r17=L4)7^RN@8;^`D*?8|ntgktOI_xHQEh^Smi_<3i|qtbJ!bdMJZ#x6>n zg~NpkkrAUFmKgn}Vt+R?>Wb-UB=ZSaE1C~(^>dgJ!pdI-Fy23_tFG=Zd;wD?8>28b z5CRp8s)x|v6%ch+UP?9x#maX&mBfSx-UnlGEWS0@8)ZF4z^KzOeWs&KMvT<=Qd;8oH-pPcFZuY7&2EK`^DxS(? zc*@n(h{fMntQy={1R&bnybrg)uftvC10so95wi?TFwoy$yWq_(qo%@e45AuIwhIZ0 zI`C_zvYZ@0_QU;HbZ6izjqC2Xdn28iG0J`OJ0R|ZL(d8`Sy)a(+P30o-K@+^S6#!f zGe$RmSSGI6vn4i#d}M_HvzF0XoB4BQPDkOv2&o_L?~es4{;{#jI(XJ;x*oqG*XdFb zY@$xEtGkJl`vc+G7umn;wCI(Bw+zm$SaQ_eZ+R}nac?{w8bdpTQREjeE0602%hi5A zP0Zgv4&@^%?jYLW^}|Ia);zM~Zjntx_tnJJWr7vi5@gc7vou;*g%yTL6H(XjFT0&K z{rpyWy|C)Xv51|h7T41oD&w)UBd-7SZVo!N-)BqrwOmqcd_r%0MKFFi`EHQWcfX3= z{Pg-8EAKAYOdoa>vFG02#5#E*L5y+Ea^reBbvwIou-Ys;45gdyRFpbI|^=1XbmX#vIA&`t;W^<4WPCWSM?g_Q25y==wDW!g~t?|5j z7nq$`>X+mboERw3zb7M`RhLP-n<3_+h+i;8HJm?UPgMQvUq)9X8l@uYXOoo~OJp&- z;LlyfZo7wB2Xu@F$!>IS7NQN7Ona>oZ`z)cP_WG?FK?k!UVjj8q(PNonPJmT-q6Y5 zMk+XEx{Ole+`rYkH%xe&R$5-y?Vv-%^KPvn=Q^EnR#BqDRn_>jb^IF?@PE?$*oCf9 zGRKWUc8O?$f#I5m)FjcCmFS9mn~SPn29}k5w;^9}@qYvrlR8PjWl)Cl`AM<|NOA zuZ69}Sng8(j+OW?)sooC9cgHyzP^ylQx8HrP*qh0HYq&=hy)t9rluxkDjK?z_f3z{ z`Qg{En>&2d5~bMEtdmY5K|$ybvpb=6_@0+nXU3k<-L20%5zt-wQg?sU4`ink&6=KN z+AHb3c{-ipd6lsEp&NPCjNg75X=L&1zj^xbrLa#%Vc`=D_KEC7vj;3|m6)j^T+?t0 zM&3U>kz!lhn{185pt+0JajsiOY}^SA)%)6tz{o?gvaDElR4~xQ#S52W-LDUzGyKTU z{4499&6-cvN>xa8w)upu&j?Df5LZ2Yx(wpz^MU2f5+-eaTGG@OEbUvT?+{&ZavD|}#&|e^@Fi_T~siEOigl0B?2=#>J#73IY9of~dtsvNz(7Jh`oRuV4 zSs~>S$#2BEj6fgDlg#Uw?-yq8-ePX_RYCJE07aZZ-rnB7eqCrZ;qu8^HfQE}{Rim;sKP9I^t-BJDoJ9^;)@no{A zzL|s;Uett*(qvpXaryXMc$K_Ll=9(4a zmyPUy*brbbG;6uJM`M%_SCuK!{F`>b%C~cX*9*NK#$>H|k^qNvf|SB9TwLoxWzznI z_>M}YeY}5vQK9Z}*Oe7r7?iLFqJu;t*jS`j6%kECtCF@m^(N;vFnzo`j;T9rM66B7 z^xPh{amlh}m-!@#L(TfcZl!rU1)x0SRSM(e=KkE=83Lsm>ULNHsMr@THV6p`VHN^n zN-Qz!zn~tp#<84=+c*lRLnohfOd&``b`FhzB050~`uR1e*Kw z%&9OMnxsWIYCS8$v&8@O_J2CvtOQLGl$h$u0#In{mNF1$4nOhf`MU90tXyA%7=^J@H=>l2x{Q8jv1y~`M8YwpbHpGqAUF0C~mK_XwwBG>NT%sF|58a&t6zvFgjDlE0Nos6d;K6Uq( z>1Q~=JxB_vXN$!$FPysE5f_Mt;9}T5wNj{Usr6Q((p7dTRuKQ{$01a>Bw_D?bw?WZ zs7`!0hp?;3iw{vdBz&$Duh~{jY7qu6Ra(Qh!noi%oCPd>VZ6A_J}GTP4lz-j;Yaxn{8nOf4#6n2#dyO&Sivk=9(hKULY4m3LCUk#lp zSxY3^lUcWI<6ifrk$uu$2Y+uKO{P`L=O|s#ceBeTMojzv{WbV+Av<6I|&N7Nt8fLnMlzHAn?N8**wYyBCR zVA779jrl=`w%?w-wBV5n+JSDh;gg@f*DeL4#Eby?fu?m3x)ug?@^AaM0C1$?cEKhX+Z0La*%$D$0ChbjGO!*d;CJ2k_oZ67139~54s(s0bByNi>?-k~Ds_NFfO8)hvX$;qbF=Fr-^Zz zQGanpmkrJH#YReL1!lbsJ7kvoUaNa*ki7SkHSu`k=D6XvV@nbkk<8fU_+BE72NW@~ zCv#@EESPpAr7X;)q~nhdr4JKwd$+k2xyFhNLH#8&fRPFCvXoxUSHac=(?1zP9Vy)* zl%5dyRIC`yk^_-+1JTr8C$c-G%Zb9(gB3)ZOfCECRVBdYbe0%op)P?HgyX(C72K$U z!T_`Jr0QiY$_(&gJr8yBvD}o<2|7ng|wTv6X*)_XCHB$o@*zmbO}@uR95gLL}^;p zE0^Dowd~39vCn{dNsxhYLBAd*Q=TG%k!3xF^g&HGH@AAHZZK$(SbpgZLM!`Ex++<| zy`d;ly5ye*%4b%sTi(g@X!JPH-mk9>35ZWrpn}VA$zdgwLE>LVR~M#r6SU-JscTUM#Qr zlk%$#1^n6MN><8pp_VK6N**FhkS5;kI+gW!`O;0{N_KlRi(yK2$jn!U{ zUCgX@#4H@AHo5oPjaYN?#tZLXfjalOW}3uJ{opqjYX^U2TiFvgckW!@{uBwaTm)oh zY(;ACOVot}j=&}6?#{IX52?404+SQ=&tzTmN@o2x7tn9@FkGrSUGGg8OxcBjpbO+8PS zqdC{Fr?hX96X1yJZaV#DKl$UXX`esa%{Se=zu4p9!zCJR%N>8Z%OicY>mxGS=7sWX z+jh(-jn=42VRzm?PAf{b>XZm)D}brR*J(v-)-%oKqfN#=;>`%JxkGn*TRWYY+Q*da zRFyngX^U+|ZGIPw&w9Ds3k~}neJk*ie7_F4wrbz_!;(vS&FmOsd2Sx*IGBR;el@!i zlE9J=(heZas-+$9q%)f{20eLl2F4D!8K9B$DFE}ewzt~DiCh;#u0!Z8V4sA(YCcww zw*9o*aLpESII(Q^?U?CPjg;1a--R&-fkp?4XcEu#2NXssu^f(nNNg(us877;#R>h& zg}N5bdz{?QD#$k7KLBL;(YDL31$|J729&>K)gARDX#b3Sd^Evhl1G6tP2P4Fs?J$A zf4cTqI*!N;a2I%deX=@12oidWgifq#BT~H6(hf>VUHfsJ7F|7Ef})IwZ3`X(gk4%x zr8*O*)j21zC@YGkc0T9^gl*!iY{F0t%RqBs`2NnA5G-?(I3OdF$GW|X7h>9q9mJ6e zK)Jh2C;Vg2;qc4h!jD^IDebbv$&##&DJH%nPdO~7hyC_y{=@+9lC}D4UT@^*mt)ya zx!?7J;iP9oPSvIz84uK!@`RH^vTke(vJ|2i>T`@E2-ai|$gwix9&ET1#-z6I%1>?^ zlkj!ln}1DG+Bkc_s{uke{mU!NMdLD+YNCUlihj3JTDqvbt1mUhYv&%Nc~=-?*sd=( z%2zR#dq6ZdZ0KBBBsZmEKkJGC{U4)&uPRlQgg5P>M!I~{;YUJ~YRzs+CJ?)-Z#I^Q z1c@rU>g%Sxx0_5y#eNf?|DM_UB_La;Ps)?cQRhx#>y+7$CVyqt5dAksYBqGoUHo$y zcL^Gqe0~y5!IGf!8XA`qac8k^Mm-j*qp>$iFJ5i##I{vxyDQcH4 zB{XGqF&mN?<+Dw_Ej2jdDpET2Sc(CTs=l z&8Q>S&D&v2KiFLS|3MndFa?Eud3%jW9Ua*IyN-i{1HO60=YjbPQYkIDXNQsQOrGm=rL8 zwU9L{5*RClsj3T_ISlIDA9is`&jM~VO04`X==pOls=3HeL!-ubuY)U}>Zabk?GUQu zW68kx?~$e*b%5v7$cm~Kk#F9#z?3Bc3pO~hUv2XON)4;MC%(#&0dC_A3 zg=k%)EB)E#;;L+nUj=(<%LLZ~i=o~$Zxowr+RL@jqgEG&x$I3FK~8>)AfpJfhx5G% zgaU5iroAw3NKw?m$-`4Ws3_7@Nm^)zIKaq^do`DIbjA}@V7Yo0UzA-U2A-sNV10E~Icn47c~g%38r|}SA3e_?pth%o{x-7gPW!XJ^3!izof|S&3v9=s>>~%uN0_h7 zaOMMm10WO;Ay5dc6@I^h++3zPGwGqKlb2`j%}A4n8V)9ayqXzFw0P=l;x5!IN^;5s zDif+$uQY%Y4T*@{9zL{-AiyB5X4h}JkG)hprC{cNyKVUXts^IH*2rYhR^ZyS$#RXO zqWA63f4x}qq9(vNlc;=19uNK76QXqzZ5HJ1Wl208ZZH>c=^ZC03glD~_=4WZZ2eg_ z&G%`4PRtky(BfrJ?lK4_g*$Ly7swdssYiB&due>($Bul)IWzA+ctGr3y@1yj=h@+s z^V&2z4#`JvH;x~1hyp->^EkS39+r4)S>M$Vp4DfW5SlNJY~hrWwgNyebvw~B072*6Vv=EB7X*$|tt`-q#?=@kcqpN)JSxi^B_eedm*M$8#0+Z?FAmF)Ht@tB6;o zXp~EIMTc~dLvw_Q0{9_#pia)a5=lt7SE`(_%6Cf+de_CxDjIR`b|7&c%m<)Di_!G0 z*Q-N~2Oqbpt6%!Tz#vPI92dqG%icgSp7^-*Bs+?KV~b#Sm`-|^rj?OnPnhH}34KBk z?L6bj>`6LXsw~-KRKew&UsERXrqOY~q-|7LYbvc3IXC2!Sg7&83@6K)_iWB!BI!nu)zu+?H8=xT3hA7JJ{td^9%%dRuUec<+h0XSUIieIsTDpI$ZW(-YQL@RR=Ue_fz%3N zVck8q(&FOY3I{%WZ}@E#1(GhLo;wZLIi|*YvD;v?aw)%-Drn{|zTb6rBTjVcjomx& za&9Of(s8CE`D9o{Y|oY9CDMtWKtCKc{mGLbXcN4=ykLGh8E+ob0A8Vj+~12u4am}I z>q9Gn$-5{;eb1KOYf^heucoG-#>!%B*DjofbY~)KfA{J?-xXDtB#Kk|47MMNJvqqG z;4Url8t7}TEF3s+=8>Q+ft_sSj=e6JogyD|nE5-m<$Ad))7E}f{FpEuDyx0`s22>K7RmG?$zB|lz5+!4wVEYE=z zD-n^AwPt>=AU-r`91-SsxYc#J+=;RN?dKqmn?HZP$K%J-uYW+03o6oiD?FH3D1{yG$tg8i zJ|Pwx)~?6mF(~R(|t5a8qoDB zN{Dd|=lb>0QBi3bxOM{sZ-{u1{eOH&?i0#md7O|r#Hba%x3gOsl={`iwquo!%Hw2x z#JNC~iw@lI7$NmCNkVAapx^r8XOCF`B@6OladMnqxew!5v*O5!LTf)iS$NLQ_ETLM zl%gGd&hO5am-c5AW>DUme5F>;A3F!DC(Rz?pF)(&y+Q$b$ri@-wuBwYy(5uO1zcep zc(bNk7yBLysPbuyPcgX$e*6RV{jVqt%O%7Oq0am2ZEp@r&>DxVb-Z}?woGGWg#`}{b!Dc6@E4;-DhimSB0AeYKd+5P^*L*;vzBaip#LuspX z*Xo3sXxe7$DcjV6`B%ejz)hxk4JGow{#%CunJiCNE7y#vL4-6M{+$6|JSH_V5ikDq zC#_lok_4(kgJ^e%6S#$b@XiqbaE*3gup=5Dn)e(49S8+1KqZqX-s&yzTlM)N zAtxg*0j0*^jel_SVm~-a^3YIUuN;2iFk*e><-Y;RihcL4>J3I@Y^-rwEru{zXIb&? zDo_bk8r$^U2ac8yl~@w+EIS3*jN`h0L7_>v#D7=F+46V`M2~{3M*uT;+%^uI`cA4T z*+u(6ALFu`?^N%p^$Y?Bx*2x#4KX^;tQr}e8<^w>1>97c(?W^K)TEJ4={DyFYX5{; zK62|ynP4bQ*KgbyjOhjfwwM?tGn%w3jMR$TE(UzVchGiAKiK|#Tn!8lg3vvIw(>9! zM?LcJDE{`1y%-sD%Mk|?C2cUQcerZPrkBAei>`t|y9<}*OK2*kH3*NmlB)vF3roRi z^OSe3;Nr!L2iu>)Luv^xJi>v2DPOsLp&dA^om2BCxi%>!C7ldACiI4YU=ENNAZ_S< zODeSd<8+%zC_4QVaq;ppm$G3sus#&cl^cbU)qkXzr}EkymE`n(GYIuL~i;f2LP%6SFg$Pikx z5bXf~N<2^cIam7OhN)QpcEk*0ru4s6d?cwHnpp*Zi;b~#Z3;GGFI~D6+ks|Hzm8o( zs79&eVHJeE6XAO4J$mq<{qe0~T|`&a0T>3N$&PLs{++$K_$e?#m45$z6+5)}Pt*&E zWTIUIT>K4oIyk3YUDt^$$mg>(%6hbQe=!q4yz1U;j-*KyAR|-9(Klm8TB@r>AlC-k z8Yo-z4GeHg;kbW~?d*jKK(PULEkrqnB%JQ6_%W&?l1n?Mp%NyY+%cv1tyZG~U}{(d z7v30fGS7~)fjd&>vA}1@!E0)o%M(cQLvy-mF<43x{CFR;93Kd#^q$2W}t`oU>CmlOZJ zHpl89hh7~h5TklmM_UqQnr7%drMaR^7>C0<9QPaF@zf!;5aSt(ErD#}2dwIE-Pih1 zUVN!EA;gXTF5Y#>q;x0bhd~MTW))V(cQy!9KCbV_U%4VkRGn*4s6juscT<`Qb~Kz- zx>xk)gKA@Z$Ti(E)jtvV$=1p^QP)x=WIya1-@vTBEZ<>QUhL6%18t1eyWhw9WBn&V zFOH=Ezb+kzUl;yPf1KO0KkAc&7U>$(xW-`Qj{cZO6qn3R%NSV7oR9wBF4beE@JYyj zYI6>+@c)9!Q>)CtWPD=~-M~eq`LSxK6T?4@E$sWp0OSLM`edH(Q7jz64cIHJLjetw zm1J0bsI}H_mR>C!reP|Ow4Xk0S#RksFZx}~aoqDXg2`QyjBr_;eS=oPe8ptHK%DVNoQpy*C;NdMMJ$ik4?SUzK`ec-#4zc_z)>IcuAd)AO()L3MYB_@RRYdC9#%FT1$x#SEC$B>+X zn~Ec>0#>PQ3Z9O6NO$o1{dX%bO`bD5rQZTkG1qU2ehf<;0<@1>^6` z@SCnAH3qo<{C@+um);IAVbP5&dd3@6V~ehw#FqASgSoz~prKEYZtE3glz@ zp_04{eP0tOI0Uf3n*8}Ne|goLd%I4L7H7&-{pp^5-C9e!LUX7~*t2T@B>MQjq4dFH zQ2MmbU%uor;N!tWS8ybNyi}v4g_41B|=MMJ--XvK28+6QqhXgsZL%gI}G`IGS%gSDreNsT%RLJGSPEvSSP-QKZh0=qiEX)*mODY!|oP4(o-#|?Obd3kxY zE?t^8b2{`byxiQ*kSn^ugN0W?8avLfa%*6bNs;sus6s=rZL3fMd)Z-UA`%+KElzsM ziNNAwe|&u%t8kFfYlto`HQ#$znpmXIcY&5)%Z4uO?U}|>`HDM5XIg#io2@SUYDwdO zDRTIBHe)g%eLQ}l1@#V8Ebt(q1@7%^cJsp4GB_)sjDhTRD4axyC-%2hPzmDqUP*7q z9pZc6@^9P>$vwTx3R}taps-4Zn$Cq#PaixOFKpIbP<<>nxQC#kt6ns%Xl>Xq{OHpO-m1h{;Fs5 zB`n)0@7i0N@AeuFMKO(ZTrLOoo-U`2x!Ec>dpT`s{1||}$gHsUnM+8)Fisqcl#juz zl1{}=iER1MwN;4RBP-YN2Ct*thUNB>;YJpMBv#T>6ayQDNbAhh#fCNnv ziuqudK|_=AAxFOaf&cU1R)xA|Z_-OW*@)L>Zh=s84l=kP3tEJO*B!IU?~Gn6N)Gu$ zVXasFLQC_SfE&z@E_vfT3cepn^2pqz+P_ZxPs+353yT@@=qhk_MuVIk6%`*TwuKb~ zWCwi@nh(rG74k8Kzxi3xi^#ioZZgD{ML%A&DTa*dWO(QTgf%yOb zrPr7M>L+I}wG!E8wD&Ylz0s}-2@-ea7Mp+kBuBjlV`K$>!bNrI@&g9iBDZg&d=$yT z$x5G&+;bTPEWF-1WW6SW%9!>mTPVFirA9PBxdQqeW#yO6b|&`Wcb>9wkGwJjH8M(Q z%`o*Xc^)-?*@vwC zmoHz2hlej-v?z%m9)s#P_m<^RBhKXYe9?TsRe5m?o+s)- zSYnF<+Wv;i!-u67oux3E1UZm_R> z9BQEDkYI$k{Zu2+|8?Schz4z^pLV6o16Fp^)?*AmXY>BemoJAJ^)~43Ym|h>%qGmG z;LxE%xt%n&D~7vi>o=>$+b|oTs?^)j+S(dcenj`1;w{(*&npYiCDMJNS1X`1Ia?u# z=`$=?0-YHUl$&U0=3k;(Fn4|#VY$o?gUQz#^i2X+hEg&5&hj(IcjF93)Ykn*FfK*% zuJ`GdT_8o^`3mYX+E6S%5X{~#Mx(ZGYy}^8&;*@d*f_zk0PubM$Zr|G=-cpM-?~dV zO@0lZ7E#t?{m~A6tT3zf+-`7Q89TM|PP;TM9Cr9y8b&v15`$+UwyYv-()`ejd+k8sNZ-4f&M zhGr*@hBfG^9uKHsE%R#SF(! zP}IbU;0QtngRxm?m!n8khP*N-G!vS36&MsD`fv@zp zT00PC#*;I^NH3^v<+{JR*gP;Jh?XU?)bN?Pn&vm(k<=@g^cEL(}`3+Ze_kGm9p`~L9G zEHht)9G#QVe7-RjIzDFcKEBU$YDkUZ{k>is<-G>V)6F2D#hOaqjIfy^g z7~tfcK19m1e1?P(0mz>557G+4T;jR6F79r-Gm7zFe6O0Ojhnk-{*!QNSxm~vTnJOa z0fY^b{q?W!Q^`p7pY2{pKe_t1AAa;G)lFlRe8Iz-m-ZfF67Pl`#YBQ_%g3alx+8K@ z8yn*+Lke)0X4Mk1hF$Zk(zlMn<__<4oskN{eV@{cr%#{y`uT>=1b;Z*r>c}LA>I)G&$dYmHukcXWvnLT4>DDb&nHx>2vc+fgei~|aMcsrUl7jhgt0=asW=*eR>Dm44nNwWjs-XRtkL{Qob+6o zX2`B`xMBXsqnxlM4y*X?K&)4^jj{R}^WB;tQN9*df^K^t_w7p#hLnMt4)J}XoM zVXN#UU#&b0IRKGD6&o4({Y3*46H`HNu=3p`dUz9@wTYw&Bxs>Qi8Os3|yz(l)R(ThW(9cnT3w6Y}#Nw;qrCH59`&vM=-Dp&;eZC-ULY zc%fI*-%9;-uyp-+^tS_zotvK3st=oIq68tx1#@-^8COL`C+q#Y{(2(W`bl9IsyURg zfI$cn<=^>y!m9Bme?46MROG*@=`|Vtfl$}S$43Hz1n@3xS!DO0e^XN4{C;1UOYylx znykN_ut(B4(pTm*JqTK8#iQd8PD$A*f4B`@0WZ#E;)$ctk?%UaF-?B>5fn}p36x(n zRe_*wa&42FN4xB^@89n5eGew@jn&VX=r`TpTYf+titTcjM|S2Wqn*KXQ}t=q3UPnl zXx|Mfn*6J7WiR{J3;)~ZKy7op`K3QiW%E@smo2&;>u+wDm^)oax|}eI zon%w>9_5VIo*u@sQ}6z_NXj#YrLVQpOxtrh8Fr{j-xJozSHXqhKJ{l$*l&@bI~%2I zJ+^Fh=F1wTvk{!8ME~R|_1E=j6qm;sSXSEh8V5);s2;96`6@i{4xWFS6Zost_=HXG zNLKAu$NE`C_AoT}6nzm&Xxo|d`%!$JpFH!(_1(EyDSCh0)s#D{R88LSH^zHebv$|e zn8{dr+7Wo0i90m&>#cIjH|KIy56Y1wL~>X!_1?DH(bu*#+w~!bPtisv-d=sKAhcbK zgKZa^yYI4hwea0Xh6;rGOyqg$OD zD*|rj7|X9vcKs%#et~`Blg636p6H?wpnv6WrP$W53tiV#FTwS+ur8a5hBj4T!zLy% zTF@;c2jVovbkWQW+(Cc;i@+@gyDN9ik?xA``}Bt{M^V|hr6zqz{@JOn1e|1idu4k4 z;K2>VHBGVk%Qa;?qI6t!Vw=@L{7RfzOf(L7^oR#LS_do)@ZhIMG!Yzz{^x<$j2SZ! zVVVYwI!<(~`~}s_(VML31kE=Zh70G-d>9I(ah(}Hr8W70J_7?KRn}TKs4gu9N zG-?;%mI||ingInD=yfmDl)%pQ62p#~n3zENAdC#9jK=8l({gfpkjTYw$NxwzRioEJ z4iXm0)X-*lixuyX!?Hg~_OOk1&+KH(7?74f+^)B1jkGbwP_1)QbNcBTCdDdx!KuzrK@k0 z9F)T1N3<;u8xwCctoP$xyB&Er(MOR^UmudNsaW2^q8|d-MzOk5HTfUw@IIotFOr$E z;)rUPK;;VIB{nG{3Jo_T%wW>iXszE!Yvg_}?C6*4!PNH1Mfh3dA7mS&y4(K=RD86l!q$X-^F zjW4B6@@9JJltI!AqaR^M#JjbRePK=du7AJ%8FPdeprkggkkD;e7jz%>>;AC^)BE6^ z8ya&r^^tC<7=O_^6x$qJ%(~DjT|#7^E6eFW4vBoa3$;yZ=(W|g3$0m4PJZjJ6pAJ3 zCq+KCp0t1E{*rRx6RxKCj7Cn}heOwU&2aIzrWw%NeP}8vrnJRU-oMprVQp>va?L%B zN&XPZOUeA(Q&)seg#GJ8riH4*y3L{c%?2?x$&}RPubnE$+%|4_4858DU`mY zork!Wt>=EbWa@VF?OE5}SU#Vk_pzP3-Tut#`t|oG1*0!|%&AKR(MJtdxBtQj1`6>! z>*Rt#xj)2OLl=x@Gc<`)fDvdolFudH`>)E$IpvGbZ%0WJj@>Ldu5Rv7J41xi5;($S zg?HA5qL19OXK8R=|DKccz{^Y9Vx`Wg(kVRaQnJ6OFSU`x1(+j#VZ(+7 zF&yg1V~g%Q!$pmGCFY+=8(K%Zu-pZpHnmINeJ>+6@M>nWn=#l>^ZExrDDgcfYdA#r zEBCRKA@thPl8j*Bq+i&F#uM^>3xs{Z|JO>pqB5nHzD8`aii#N4sX*-xI5t%#+AEnK z`g(8&82&lUW@c|SYB-TyNqX&GVze|+Q&ZC&)+lHgA&9^#hlb|nX5{pA!eWN?fhMcEw-~Mh;TfY&}Y$0LRQZ0-A}QyMXNaKa8o4)N1GK{?&}vdFA3eq z#RX5VDFQ2#BU8!3H=I`7bf-0DJ|N7ZqpRx%eqzhg>~LJHEFSvRjM@aiH0I%%dAn=7 zC?->24e1#mXF*ff!#4nD99&Ugr@K$5jx!`o80KUV_1@R9O<_8p zLfI_yH{0tL!jSRW%ldIbOb^Npx;ajcqtv6826c(_6ohqLXmeFRjXUuCQ1FilxK zhyWE5t_t0&Y(r3js-mJXsX^&w&138uU3oziIK=z>l|)#0@UBlQ%)hWDiM}nCLYK8l zojdfAv-4RZ2;2^DJ@u@-XIN3wf-4f7L9E){3hh9l50cC8?h7vEjP}YQKUh&44c=^v;9X@=wOV0vrUT?U6iBS}*f_WWwU@wkU64Pn6|E#SMZGQ-4 z57?JiDO;8L;dg(tI!ge-;=sdplyPPFNKlX?nyncD%!iLpmH?9i&VJeo_|Gi(BOsGv zQ=8n)w7S}#h1(?5!uF~jSG6_%#+uzb>PiG9|#w5GuCpR zrx1JOKz%?sN$im;ir^+^lFsSig@Sq+SKIshz(Ha3G8IOOjmV9_$}(iGsd*l^Lc4;T z@RS9M7Sxv~ZFkHW-}97yV$9iGx#ExH#TyBBd@S@1t$fN+UwZDEC9=Gaq&@?7lI++e zgXh=H1BHG76MpD%rP3t%VuiwCetJp$vGF}|Z25i!!o$Rw8A`9;WcWa*f6kG0zwB?w z+C~uwh%=MV6jkoNSWz44c|b#9#SH(hoVL_&(J7g8^$*YcN-t3ko`Ha-2QZ+)d8*~J zTlD?~M4Y5mFRP*g5e_hC&R|DxJ@Z{lF@sSlS?XMog|4IN*A3Ef-HJKI|UWVAyN4b87nbEfqejKL8Q4OZGs7-PP%7gcD) zhtE$W7O|W@y{Q86C63eswMl=4Zjw|xHSphaDQpGU<_|{cM-N{VQ>hReTm94 z0FCB1&-xy5LXZ2#lou4gT!=TL4a6GrbdecyhLC=JzWKW8$yaY(c1?MUOdLr#6>)m5KjePT!y}e3 zaY02vkSliH1MP=Pf5mMQoQ^~W$Pq41ahb;QgakMgkXj%n76+k4aBxP^VU`z9p0L5@ zUmNJt)Z851qmJY6$3w-_kA(Hq5OaBdtu(0qs+X?9vB?7MalWC@Um=nY8g$zXqy_Mu zcyk5^opFg?3X(^Vd7$2y_x0;$sN#?%q&FAwDq&Uwphm@(z(bG1w2K7`YmM$b<-fCi zb)oIzVt1mv5ebhQ?POnLxFxNAUNh!Un_^h5+FleA-}9ntdkHoIV_S<>;g&)rC}0qZ z`1uLpXFnNvkmSHx1js_I1~xYcNwBCn&eyjB43)k@-_dBJ#kvwgQUa$fyVYN+3g!hX z3xV2!byD@6ArVReQNHiF+g-8ARo6laJVE5Zt5W?-tg|Es0$b=?p_3DXAzN0o^=70p z9zD1g-rfXtbjU|sg@g(*3Mg3@vx@Tq-EGJHf)z=Ezod3QJ;J%jS^Gc(8|a)PS%2(r z&`K5$_Q50M&PP2&nkWhVIswpth^8*CI96ZA(z=I8X&~60Bd<6pEAm)nnDip8usN%JESS8|LzivVlkG=s{ z?=H1ZSAJhR&mp6A&XIF80zyOcWd6{J=_d`>=DufoJNE9;N{dnsN)F{-*;>AOkOQhM zSVPv~-(JQe2;kz9wk7snBa{=}w#)5zjZwv~N?%ztctBAJf#sL9H1q;RNcL_p6p{L} z{N1YV3+I@rD9J^u1LpeZh>0GDMrDYx;Z(tzzpo+|6(!k!s%4ryeD$CPEnJ$iqKAZp zNI2_LqrA-NU6Qq<-C3Hi-Z^|{mw8)#Qxh5X+)XO)&a=L-5K8%lrVUykBwbVo6yy7T z)fN?EE=CAKYv_0KFl+*be%a6@c0f@>`C1aQEOYbEb10QUokdQGvl^`!G z4ld(8aRne$U-ut|RXdpO?!#w;N8^0p@MlwQy?zxj=p;7+R0({8b}MeGx>%!$hqHz+ zu3g^J(h`ZW5D1>v7}avHdc{1HVeuI3Er1YSK+{4}63SLh>b!Ksb;?2 zujg-mEDgqJ(Nq!xnepK1z8qbL@9-=%q3dXUX5rhE;kqK-BW!hld;g8hd~*a6bMuky z_o)4~SD|Y!;)JKjG;xQRiXV%ItIGH>_w&NW z#aDIXw}yuCH(F*>%B;w}Xi(&iKbU^#LzWO0g8oN$bBBa>#lLhtr7yifBj~`ixhdoR z)~pX|grBkR%Fk%lhQ7MaSO2*5h5remvLB0lc=sw>#{Z>fG5e!J@#n73R=KhE#VU?w zD}Xg`mBHh(%^5;<%m*l-W6fW>%8Dz~o)eMRGiMHB5!NBEJOTmqBy8|~Trb|QCmzI+_E+JDO|PRYI{x06QqXGb}p6}21Bh%Q)PGy)5DPq+3E z@LY0Ra?O+lbbM^000FpNIos&8gCKvQ%)dKMhK5t{hu=+2(F_c;PZ)&bQ0a3h}w zvNYSVSegmFm$Lf)yOLg|dY%I-?#*N|*^?TJ8^xmkHHesY?E|sRXVP}@*LFj@4Rj_C zo`;J#DjYi&dA0tynJj>1NrKDOz=>t8P+`I@C1W6x@Lo zA}{awWuK?`G}utYGVfNvP+!2stmNSvdN$DpN%yD}$eezckWgM%4(SNNV>oh%A7~iW z!l=+aK?h^Wl5%X$px$F`YxlD^Z@!ip@Vwv4Y%N4x#5?%jjpfn2_h>xSzX^W2kBG%| zTqPo@+_$mFcYl+@H~>Uhcf|%6O~HI)?8I+-x9hXz(%t|~Y;*8t=A>d9--(#+va(H? zClnM6dK;q^j~?~harK~%J*(y(Ck|$LDtAFz-MTOPVsp$A?`I1>%oq)QO@;tJs`wLSq!?@rhe{)pmW!D0n!vO22aU5MhDE6?b%I zT;Y-S4-6C`(ik{65^+gH_cL45j=m%)Cr9i0=CIu-u=1gHHVhNS4UAR>ntSF^p^1o2+bmX$x+G#nnID{PRMvzs z2iRMK2R3ZTp)M&XMbV`%DlI;>=im7N3KN1{H+JdxjBInuSxkOl+aCz zPCzz?Sw`FjrkwHRwFb~w{wpO8M=Ow0_V)A4RER9=wnBNB5s;qo@H-!Kt5C2_|Av{Z zq32M2^8&EzU&r(+Ql=()ETu@m9~(KeYw$`{PevyH|?ZE!L))n=<7gAt+#o(^^?kyUa^W z`F+IJ{--ww=6V-jn|;jIR-;d-u@$=EX>WV~9;>dhZ>yfI)?(44I2Ip#+~oeK<+008 z_veGlvnPFL*$wj=LSBT(IX`(#H#;etK+qp1ELze+b3(JZnh zwwI3j*eko&I!FmjNhbY|9LE2LYU$1vJJ#IHP36x;m+9=CSVL{^4q^ywT}NH*k9yDd zepWijQCN@WD3DvYXR=}oDOUF~?X2Ya3>7{+fpeUa-P&+^Nr{n1T6%Qf8jO@${| zWgk~Eva@>K6|zox^Zx3W<0tw9CgfmYy1i3Q^vQOl$%qQe*2Qn1K0S*K**HRQkPstv zLPCNSob-q*1=5Ysg=fc%YU}HXutXTfQ?LkerCQF8OstN85`F)jxr{d)$ zncI#&zFTnWonb99oq6iNtCHK?kf`t=Hu?Q?_oPf_K`o>k4zUww&LmFwd0z6? zi>tBcYm8SXW+8Y#fW|ZO*;Rr+xktasPdRYgh3F@C(`g{^NV{h9m_N|5ue?fEl9< z=x-fU#BY4krqijh|4gnUP~FmIOJks_z8lF)wX-=o?M&qO?YycBXJudOu69$$*Z%ZA zqU)S%iA>cTuVND_pHiNNeLRpBC|Sh*TK&!a#+|~8eA3BuMYtmAX=#}Z#84P%HKbY) zvX}W^zBhCN4}R3zwE~5K4mnyi$HOV$4pB!WQ~2_)k#APKxE1r2H^? z?amTnUwJd}Co82Zr9wA5iZt-8g2M^*cI4bvjR`AU4xqXw=fUiwelyZt6LgHS5nfz&t z5;r-9Mu`#0&5?@()Jf*)PBlqrWkFV`_agD)ctUZUsAHwn7-Hm#h~lBPX@^{~ifFyxL#!=`XAu~4oeFXAia5(Ad54?2F5g!#u=5ak_k<=jGIoSK6-iM3(EK%IKbCjo;u_EV^wj=M(tE`k)y!*1|)BB-8Tc%b&k|=^<*O zkL{yaNFA$@wYsqR_?0l)!!!L#T>RLQ%w8-4OhDQqoU#zMupbP|+33elyCOViN38PKBpPqix*!;#`1Ke5 zlzX=CGkH94!J@QuCJjw1Qe>$5e>S^{{QHZf3hny-w5G7$PCR?r00mxiNCw337@ICp+OYL5u{NFwVYLxKKtA#?tLm=>Y%@7U~)xC?FC_{ zZBir=7palKPm8hgA#WdU(jPIJbEhFI7qb;Kp z*8mC`fT9+0l4-1&5^pL_F?>T1Y`>zB+?3AR|NJ#~c!XY(MeLUNddO*48cToN%&*8| zKFrz>&x&}&MBU+j>aVp_ZA)AgEygCU5HHrGYpjt)id;9#-Nr|E!!QU2;o_hMrK>8v z_}M;Jfq>HWWP#f}-*f%CS^y4R*)w!7%{3%Yr{x__UhPw|G76B$B{5J8@eufKGC zsk~Z=RDA@uf)VRfsM?jCY8?RbPWFB(Hc{6Nkl;+0kKL-#v|8cC4;@13STba|v6dw? z!F=jj1pQ`gUVU9fwSN<_LCu;C6VJi2dU{R>p~tvwn6?(>WhmU`XewUO)+y9FZJ*s3 zTn^pYwl>f`n&Y3mK276Bil$XHrOc&+>mfJWnu-u%PH;d|5TE0)NE)4QS5WwF4Hdo# z56JN9jY(&haWhVr?*#Q;C)Bl+duQg{R-NL%bvHLYQ-uj z$sMB^EEy~b#J(821C7ou)A zDszzog-S^B4hsuIns~9fBmey`A(utfMO}5T4EbtC`fBIpK{uR%6FJ4@N zzlY?FU$ECtGY}O!fRaidO!BpjSYPw{Wz$#jUy~@32HGw*J$*4ljhH=OUPkF(TENCa9~~X7e0xb!jTyg`nXFnejyvJu zw@dXX?BBZ8(AyqWB5V#O)K*z?G$@r6+rw_*EBIpOs>b7rRw zxdm%?iG3r*d+dw}tq0M!81J<7} zL*h4(i?ad44RV1dSz?{oP=_>lOGq!WME`tQEGxREw{%lV;}4ym_7{Z}*S|Uy6ZYy= zL*ElDM-Z{8`eDQveLeVe+{sg^L^j+lx|->Y=g?4%@^10zQyUX|6UOLMDJ9*Hdyk38 zteSU=-Pty7e*+)bJi8?t$!mU&#`*_Q`=g5_E+WrHUD^Co+=fUQhfVh@5@cprjeha!nNLAMAabSQc4if_CGkH1&w(DvTNsH&G&#BdR9r@ zmI@DZDip}*;kb&$gG44gZ0MzlTv6b}xY@7BPm^L_6I`Ip?xzACaG|A<@%AF}F1rBh z4J(}_Hi?w((`=45AE65O$Ac<7pI}iyIvjl?wvkn#sO7Z`OG%HAVa2Idr&=S%l-O5? zQ*OQODCWacJc+gJW8*12^_&-8mm0|!#9Z2MCCnm@y@_%A&Ev7?jbIfSXAV`gd2cO3 zjblCbiR-5>3TGtN3lih=eub-Y)pR$b0X2Ec^d|SmR3D zXlMx8Dk&voOIbx|7)7BegtAAavPxyvWu_!oA&S%1AgfSGHrZv9Jcy*GxD#>UveEzmDTQl6baFHsn4ldji1>8z|KS_bJ( zX#7vWxG{j4H8FshZKTt3_^JAFF`LtHcgF4a8X;2rZ?96*YK0){64Jg=6BGE`gD0`Mg6%kMg=(8Qr$5eXm_Ty|Wrdv=df%mPtis z8U+Q5oY9zxil$zZq;F^j-t_ z7T>qexOd}^0abN%D|os={~*B-H%G z$^C{53cnH8|3M5$T7YveMdh(3%-GU#!IfYq6L{@0QnOD^#cx!QrmFu*I=S;{T z)>28`Y^e4f;v7v5*w)x;;$V>W+b>dRX_uJOGi5tRH0+%*JME1ikq0Wt;U>=@!q?KD zGpDAVv?rfHibc+%sz$~~fn{GhHmH9%*N@~4C4k5@tB07XHYAO@l|6U_WdY8KQ<7?y z{^y64Oo!vP)!HzNYOflyLz*IqX3aaZRWA>(r#Naz&s>M7&Ls$tBCT#lx zc3zB`mFjo2x<&fZ?@U6}nolypHSPJLL+*)k7y*REw&N8wu&qU3^sB(p)P8orr`gA&Z)omHXLAdVud^cwKZALCon9f&UQuibbj{JyMQa#+< z`Tnpic}3Ng42!Rkk(-;JY{g9#&I^*@J5)<_n+SiqF|DwvFGU8WrE`-Nl@HF1r-rQFdPzo`Dvjj4aRwZ8_mqv)_6u5?g5V9n)>haZ>nd|EWq!e!UkX#BIa zRs0mgd4szLO4pyTUOxj>jza@ne~G;tT5t2GP!N?9y3CZK#bXl~`plf(=5qJ6f9D3$ z%FC|=?VrX|LFD0HzTesI&JWq$+9?2fJ=HT#Uf-_$&PKfBrQexCVVYx%0rDsn?ddaT zzK^Pfb{!EsFb#J{*ioM5lMG6m^>Xgz4YqU7ZZSHrRJA^#ruo~q?7Td2sKS(=Gx#ZJ zz=xMh8cPifFQE$GAmr`tx8nAlCydu~%!GxMDhdjSxYf?HabsDkT~Z2RGg}bQ9+YMU zAfUT^=(;y*KIsZhf`?LP^P76ViO(>r$T?u~dxpQ*V&jK-=bulSMrE5S2BkSU5)*TL z>rAs83S>V4f$%42ZjtRYA%iG~s*CA)T5;#H^YfXv>Rv5oT(!y)3j3T&{&(-)OVH2u zz!(y~)zG|!Mxll=otR#x`wB6mIY6l^0MJYTXB5#+za2mz(4QT9g(SEwzSbR7ldFXh;|A3b=7!bH5ME9Kfl|3)PCLD^tNu(T0#GLiI zoWqUw1>P6QwbRw^DL6gRqaUOFooV0d-^jd)N^}w{gk3Q?ziNTh**oX4A1#$MfExn3 zo6C{V!NcGftiMD`ciuT_kRp*V*wdcmUQ7_o2<;)i8I=_-0HF1QOJcyK#|H{ZL@)mD zAu4UVp3kyORu6wN7Gk#}a7OaE~j{Qo2`U!@8nJWv`amUwl2e?=CR! z$sNc_0qA^sdudV84l&-`&VORh1Tg{h>NKwTiz*w_2n&*nf6c1Cc|HUALWX$W6)S)>l#Tv02r# zHbN?e0&(TgsIePWny>0MzPl#Cdl=djMX=T^0v#R_4N+~KX;0h&^8JPN45x7xyGyIP z9|F>O9?e|?M+@m|Z;lVFB+V*EgTB*PH_>*$)ZRYz91U+<*7dP({xiLI@(G16A%)&h zVi0G$WL?6@k*a|_i@Fp!9EJUF1yjF1zF(YhGpAKyH+RdO)k^6tbDrzCWsFTicp9Wy zJWpwrT0G5OX4YuXcDPmOB7`5<9#X&qdP4aU>Qs|KBl13$L21jb6taHB`PJ#q-}zp2 zO#Q)mUkQ`u=4j)c&S;+hd-gx?*i6~Ko+WWlD|&D77+N0YT52@nDQL2}`R<|G>Q{~s z;ee_YD6A4nesz|gOJ4*vgE<(lNWY9@`R_9Vw4lZ%4MS_+BQJ!gST?5!$aFIcf>vr9lbd_nq+ZB zFV1Rj9lvMpS0`W7$eUn3Nh(JIC!&TVb|EKA&nu@kp$Dw7KeRaP-W@i?OTf5~ONw3a*X5`=w^b&s3Z9 z)>viX+&j)V{Z(2Zv|q=5oF#b^ty3gDZ7ChTI!8}2+}wjcOo@r3%$vc?Lnxs1Op|xc zAhl7Xh_fBDsyftpr+VU-RD%)a09$ZOPl3t=4S-#w3X*L=o8ANt^7YjPHOq^v#&MGO zy;;U?WKFfQSkHlzCr=77+PB7jNoP3$T<-66gJ~{Q!r-S@r{`TWcKDP!7zfX9f4^r_ zLoDTVPFPo``82zBtf~kB(02w>EApO8g|zM6f>iwx24q=>;h}^3^b{!U)&5%4)=Qn< z6P`27d#-Fcj@hKOV=gR&Izla(R`g2CXrK_kEz#^A8hI=TDQ&eqZL(j`frLa zatbl9akt0O86EZ%W5hy!vjH7fH8w?{LxOS+{NY#nwS7GLMrJQafA}%4z)M3=SzxL7 zao3y!!HeHBTz8qKL&eHNB$*4TYMKVWNR0GpqNja10TT*Fgn89 za!EAL5ZLdj$6j55UNiU@>u!nls-s$IVUSgagH#ix1+3>Ut@`)P788+2b}wS0CnuM1 zlg`dNF9brx<}tN`^eru7m+855oF`keQGiz2HG>(ORN!7bcGGJfzEfd}VX%e|X#NuV zo4z{sCDFTZiZ_w<3kc7m2u+S5BBa6o2Mt=H$#d^ipjC|vmp&Ol!1`JBqwd{1g|sh< zG!(=@IH?j=NFg6iL)q)1#DQ@L1ttp4z)%FIXEW4HmrugOls=^EL;G;$f=oP#{$3fA zA(2}8t^1+x&{|Mhx~99~!2}1Q_*E)-pLb|WOD3bH&zhf|(E3MS$m9u&O3+vS{CV;A zJqpVyNgkI{PK{S+$cM*Z)FETiqyDhW%n8kr^XSsy&lyLfq}I5*Lzz6HN7wRiAn7fI zZGfodvzQqEjT@hUu-RUj5(BBGAW2X$a)s_zT}WV$+&POD)lR>^~6>(oV5pg}d;J^^=6N z4jnw0GCJ7YyN+NU5irXIUP1%Xw!d`-kn!ofqrXDH>+qDhc*cMp9HsFbwqOLTk{HiO zBcU~`dmef+KhRKYXHMyHXlfSWKlA((2&wEKu#{~2+CV^p6gsc^vzMi5iHW5_UUPGYpdg4e*?IUv1R67j*W1@ui$;bf_|Mlz_0o7c z+>*h1GTf5CnW0rfMCQQJj?Xw2A;PX4tM_3#f0ONw+*HseCSLWN#Iw9=V6a+!)# zA)L>iN_CH`H!;bkqT1D&K_f{U&Z8KLY5xM^Z>njk(k>B$79#chw?dwn(GjKb9sW+) z(O?FsTaiR#S|sLOIey&bH=!vM_6PzaTf$#>mV0sZwd`co{Y?~#{b&DyUGPL#9?xPO z)9%p8o*)$R-_Nl6r?Wew541-f7Gl@P8|8S|n6IPTI$cDH#lvG0!Uz>hLO+>65mV8k zQ%3brXf%z;RH)`IqX^_sQL&>TPL(|w3CTVi(olGfa zGWscKMH|R_@p(<%qR#2!SNNU?4V~9$iQ@x-m6%*3BeLNl(}?V;BvK*~hoQ@QPIGG{ zwg?)WPTjKi_h)0G)6(meUG~7dLcF$ud?2fca&RwWPR*} zmoJ_(R5Kp^?05kEPf#M%apTxu`3fqBR*)vxB2>rVheqWQ z-fcnd9ik38w?<9j#F&WSUZ{{rb`dK+LHZ%y<5FS04MkJwKjQfquM;M_So1V2@uXgI1_=5%ATVdak@Hks>g>+{OpbrUa#3N2f5 z)8!J&(vQWv%^vte3%p>J*%^=zrpzm8{JA^qdQGOu#SP~NvU@&T+~2b1z5M@F7* zDiTjK`|hunR#o|GSo8pKH7xT^E6#GJ4zeFS1AM;p?5a;UK=(KZufj}7HDO%zrJZ>8 zs*euOrEc%U)UU_GijU7?Aqlh7UJQn#^8{( zBbXiyl^Da>|FlRg=QtEHx{MBlAvz+q&sA(F$~1Aa@eea9OT0I~Xk!iIY6MYrl2L$| zDg+b(ez%d~;0xP4dYfYJr(ZVrK#3!_!c&;CMXY~BIWU}e$=@IOJzxVX_7sV{& z(Id{)?X9hL(BMc#ks4sbLYh3nIY7uB*e`S< zc3odg=ZB^*l8Sr)HRa{+NjRidwWpo`Dy^xhiPWoyo-P3b7Q5M-)-A-qHvH*R%zYmg z!@Y6CYP3TA#B9uA{kYDeyfb~7GC?x^d#Eg-p{uukmei*eg)d2LwNlEuX{$A&=4zQ5 zZFn*#YAx%{IW#`h$$1(l`akl8pHQWTm$r82=*Y19I7K&N&I32kCbAFdL*wF5F zSy4*q0k2np`SupH=HTs}R+R?g0m|8IOAPAe<+HQx!A-CN+BKq<+@V|cNB}BYnHX9^ zz`CwM4TUWP&2u^>YYw7OAZj=GqWo!iIM3$IAe$n={DMsZlT!98i&k!W7IZ%`aS+qc zoqS|YV(Nw2Qg=A}d5yW6Ka)-GWIcWB@p9dN*lMP4l+%=E`BiShVib81 zBlYZAPws;oZPQe+UfAgD*_c2FljhpuT3Dx%A(|A`BOzo4U0IRRmF6`E(U~RffH5aw z6x|PEEJlTiMP!~*Hd*&%LThA{>pq|?b&BO}9T+n%8KM1zRt_fGb;Yf%@d4$$N2UI< z6ZulE%>Rt{gmPZ>^EE#bjm|8#?ueBte+Z4Xy7*<$_x%0O{o&d}Dt&77-q4!hEW65m zPfLfBhbKHNOx8U^^4!j)=g*baGTZkbhejK6YhjDFa>#FP6u)ixnUEsc2NnHeo_FtZ z*W$6oAXvAcpr8XvP&vV6>q={V0QSJxMF57PfmTfg_xX*|42K?-WmmY< z<4BPIt5cs_6Qw>inV)}s(?~TZI~&~)XE9UcjpgNdrb21e*3rqvjj=867%tm?f+mDJ zn*O`&8Y<@m9va*T+4Q5 zSN-lC=;vA0n4lfmzkkcQ;%5L|xGJiDxky~0h2r7;M#h<~>_&omtMw06MB4DGuc=td zRJU*5?8`XFq1=;DQd;_VU|?lM1+U;Ns{0p%gdKiF@cQx{F>OP3wW3jZ9ThD#6I5-` z=*(Z8@ul|t(@6DbT~Mh^H_aQ57gtS<`bOWgF^#-W4sGlk&P$-7y42)mt>ro%4j#nl zFZdTg7GwD(0@2?h=7R5=?fZj$bq8Fb5L6sJMNS-eS%n=?aAoSA$3NpID*leTKLw-#+!GellUtFtzBpu@dW+4U9m8@K%7u1|YLn-$mp40Pk? z*M9z#{ZY^E?DWQ!Yc!g-S9uLPfA+C`V*7xDEBPfu3dg2yq`DqiX?)>;aq zX$&k^kSX2Qx4y4^ob4hmj^#>=Sa@GrXGOp*(e8mrhgfEU@Hr6^ydRUs$_>k+go+`- z#Y0AVujlk;KA@u7?-)lAmX1A+3iM1g%y~Ka??T$PHQq{%y+-`qRvCgjO#InO+Y`5( zdF^!~vO0NuyJmguW+9e!+ChQWjEC^09G@2TELDKp?MTNbIw~38u)+O-iK_+O{hmfe!LgJi zizW%$LoIZ~=j?PH%;&N_w~Cdh+ukTPgew&sGvaLMF)i1JAb8@%=9W8PbpVZ4%Em<3 zUAX$%v^A@LD-mS74@`O)qBuP6`xG4EYYf_1VDmReCZ$WB%dtc#1eyr*Mh{O8pZ0pS4O9LJ=|Ta6ftb zXhCyg=+>rJU*_3)LiEmEgw8KJJG<9e_Nv%tx_N&{G>`kjHf1y{$swKs` z=bzYb-2?RJ=$9=!k&K8F9j&q$syTtSUGl3hB+arZk3lmMnznEv%G!o+ec zi$?6n?Nxg*mjDxozsYO3HK7(h5j%`6sDcuQjtVTPA)IKh>L;iplEHLA(R1dL|2+6VaT zU-#75(4luwGv)5XhovEl$vgctVtNLHU*W*nulud;t&Ri#*EAy~USX0=ni+E;N=BRR z_kuvGqI_%n{C4|o#@`;5g|+p2N>qs^-_7%)j!u8Q=R1;ysRt&KpoLWPVweK0 zB|2X%dBYhn>LixOM%*E)PWQOwm()FIlnt3Wxr6M+ny!y{I=p$o`}WR zOKTV=qJO$%VVUYgTvm9*@O{M&)iC;LaYzBLnFzgJd-)1Co_mO{#mvR`|E+%~61j`$LDk?av8D0FbOyaivKr$E2QXwz6{E@W=%EHGDll9+k`cYBN-hRPrxrbUfb(_FNg zAcMauNuBt zyiwabC`bo*Yt~+~(blTb2xlT5%Gmcj(Xj(zB4wnPknhw!awPf8Cr+z6NSUW|ydCRi zZCbjLkB%-OS1GVSm!>p|71H1?$8>dT0xT*A7#unokODqqX8d88SfS!JeGC^-9@@atJ<4_j5e*p3rs#l9%~QTsIO9P zTEFs^$J|m?XU1t8o_;{>JczUqU+>1!V5Mb={vrbE*lnvOS{#E)|D1jiis=}e&krr* z6ppt9IYqus2fGEsQqyK4Umi6 zviR&f7tuk<%FS{S|0r;w2htrn9GRW_bw)nxxO74loYO+Mn9uN5aTKfbi(yEEd~0bL zF3Gp&>=j4Tsn^jlbsx!QkxATP9Xo;hAwm94wJdXcrw(k?j_ zH(0(vvqr;3iF|XOdYXr%56apS z7*vdzpwf3;2apUxe08ZaPOVEEEpc9sc3O{H8K}fD`!=_Ek{V*!?_R~G) za2$ZIRm`H6`)@#YD_vctZnKp-NV4V2uhTHw=kk)AjTw;@9@^gzj4iMG@E3=X!&}>$ znrLgm0~(sOawxQwZs=eOfpP7H4^Q?!tMdhL)=Bb!k9kg;lu zo|JLE6w^2E95g*z$8Na_$$~C~+bF@*O|~2|Ij9BlKo}4?OyC19_3zeN*m3(=nQGo? ziOkJIkMbLr={@eC^JzTjc&*tio`(hsU&+O+%C}m)+`hn`KqX^FFQU3NdPDm7#3QP1b~S*QI+n>X<^F@*dp3|Mr&ZSBwV6+S=Mz za`lAV%@nX)HET2BSCA2jDer18nwG4vtI}&N^Df^ZS|)Npf1*2M-&H3+G|Sy_ou5=Y zZ+c02;5JkLBD&SKZ|4POvRYiT*ZfW+>y%9FgQH%-2@C0NEvI~P^!O+D3^qq`#XH0m zLKudAP~t@s9`vqVZik+#Z|z`Lg+DYJHMU^)K#kS)C>Ue>nY3_g&czw_QtP>ZC$u3D%#758#|9;bx&8CXW3PJo*K z;8z+4?%MmtrX8!z&Xr~#jp4>j6xfwzeiB0^`7JiBnNE}TFWa@iv6?@om=a4M%C=!_ zQ~K7*89Ya8TtcF%vHRva5p(didQ(70&`P#6!D_0iegx)C>)^rq{uI+9`K!dx8`nTc zK?0RGicGz|G&Z+176##v5GpfD;uRAEjq4i_-qEcW9XjyLZs+BFZ{KkFa7mn@Uwpon zQ3A)tjf(b0q_S6_0O8@>@wI&v61Lp|?apOL=k1Vwo!IhY-%@cs_kAJ>iiOhUTBfEk zLbpbC)ljEyN#C7xq;j{f4P_(DpJSssXm9b6Zfe|?k#C{IZQ^_0h+AIs_T^hO+ilOd zF79ibArRf?y(UD6+VY;@e^9D=viD)+x8WHg+>20JCq$1Ip?gm%Y2_3L777H+a1va_ z#}U3h_`kqxv2cT(4l`dKk$S+jfrEjaHq$7j=a8O_>X!?nZ4cR|owgphWmM{QSNug` z+%PsMr804fTVB2X1!bDt5X}3R<$Ow3b4i%kmq-wa7=FzC*Uio;j`OPVaA6nOm4opQ zGIB^5oB;^0r)NlPpGiv1g5P>IA?&?|gtG*3jVI1&DVSvIR{FqE6~9(QDxEY9>e`&q z$$DcnAx+^d$0Iuv3 z^f3Bfw_r!naX^jV=j5#6*UthfQrBVLcXSML-@Sthr>>Hc5=>53Fr<@?ni%8qu03Xu z9_!Fey}a~P-V7ishz#UyT&T3yrfu8I@Wi6Lg1vT8w+xCQ_`)F2G=Km8H#}59veQ4J zZw!?bFcIw291sT~(&*8NnS_s*7sy@TF?hjDXF-KeVu`0n9_J2tzF7_aIJ33#*JLLW z&57@y59_R$6O_*|e{M?@edBT|EWUK%qWfe0$El02TQz1p$GhS+P)BOuBLNR(^9+At zV-LEcDJ}vR4&jw0%`GinwUR8y1gyKdx(K!$(Y?4|rYdODb=fc+lCfHT7{H|2W+~e0 z5#o|31UK;TWPgC`3ej628s${!Vx_8=oCTp*sdS^vNMLEZml=5(_KGlot z5sW}nrFE?R=4^xKgyuePeFN?$@bS4>S-1TF`M{EXS@*&Cn3LR6e1*SZA>5C=!2J!Q zQEweaehb$4rU%?wE7%6$y1co$Ic5Tj4;?t*+@8?;23ig7oND0J6%`cl)^jeutW2@N=08y$VRk@6Ll~OVY9r~3c9BByX|U=! zl%LBqhLNp?ey!o|bc-?wcor{BAZ+#Qf<=fATE&Xzk?3uXX)*Gy2+{WwGzPmfIlmFD z22|d@i+g)|&>VmfE+-e4^4%@RfyU==D-!1>t#t6US33!eMWI{ae)1x*QrHqdBoXz{r2CgqsgZ%aloWD@Jh$ArfQ~S-@R_xs#4Q|*Bp)RvucvGRd)YY<8l8yh*z8fWuwxz`#mt(Ybu7I)>2eY%;WXm4|-8S}(<)@ZK^{8I@tqZM!v(JQZchXV_y?ShNF>cn@@ysl# z&v>}uO$e)2+n}xJef_n;J^2}6Yj;$iqCQef5nq^G4tD08Z=$8)* zHe)&x9i7H|!p<Gonx=0uAN=vV6PgTkX9!J(GSxw!O@S9E(g(8$b%~I zg;{{xRqfRDVLlP?$IEESE;`AH2zyRz!;R+{7Q#%uj15EJB}^2@K-$?FN32ol3-q8doXM~bd<+s6hc*`~D~T`6o^n++zARwgH`Zq*t;*-;o{=LFaB&7J2l=5xd-ODl&Cj{ zXi>!OkU(U`Fdv34rj+hG|6NZ{v$`z0=DP+X`<@U;0iuN@xoZ6Q==}PBB(SEjwK`$G z{Qlmy%(3P(?L5kJcctzBWMHjw-*)odvvsBs7^M$Njd;k6@GMATmcPicoCO>*~5;Lu$ zhL@hk5fF}W&mt) zHp2YSr{!KxT2NKDNTax)<-P#HKW5QaRw6h~kD{ymi6|O>Lbdibb==AKr$@dG2Gb~K zuwQ&Ty}kD{nE%DQpHGkoALwhl44>-|i&_8e>t!0{8Pd<6xxdt+!i{sEZ0q^_v2inH0uE z%1wSH$}~f6glqlh4k)d1g!N{b&qtE}$&mj$L34p2Px^Y8mm0#n^pDY!fCK#3m7w4u zq*2DpQB2#3e1A$HB_0IWf>0{h#q5u+3Petx#-BA{AYO2qYx-&}e^#n$pC*CM!r;7$ zj~_wJ1)^odY1csl8}Thx*9}peN?u0l!0$yOQH2rU63Q{nv-#f009*U>wm3ZO7_p^3 z!PN5p{Z~vXyJjwnf0p-NYyOT4g~ZFPSOvk}-0=!!LG#w_K96M}!TM$u2z$kX%3KRkZ-Zo-4 zQ$uf8@I0$;!6c|555aobIqRrJ1;;$yZB4?IC@gJKhOX0-!%=Z<+r}pEN8LF(-)l1J z-Fi$HqCNk27{{-i>})XX-*>Z97`ok%^7F=p!eb&(+)mR7`Xb927{KoWwb=lGQMZ-6 z9-SD40y6mov;?%>Ak9<$Nm;@$<;YTYk}tJDmLhdZE3~Ge4DLAsG4L*cz^KI<5sfpB zhbaYkIB8fkcMr_Ie2GyJUwLjToxqn6}FK9~NCtf{{S-2Lc*M)+z)r8JCo1=G*7zA8+;h;{76jgEjj23iqlfa;f<;Q=Ssj9EobP|Bh& zZe*C4BKlZLduNkj-;W=n^cSRRNr+?F^|yyF4#9cdFP4K&2S|=@}gG(Iii!MLr2sZ3_J*DWR}o= z!ET>GB9f+(C8xrnREUa#fJ0Hrb;<#cu_kL%ah0JRa9-_P;_)dR`K8*%tNJ^ZPitTP zI)U5e=D)SN9WJWQcl35**5E(ey!)%)8Y>OX!Mwgv(7uB-$@fP-r!vIka)+TU0gesS`}D}=2#JVsOYWn0DEjp zUTY=!)jBmRQM5lLEyjyqD#1d#hT#vSxDHEnz$F=-f6LNU#({XhHNt9OL^|HA`@wtf z-v7G_^w+KYLoof>vG`LFJhg53=PQ{={Ko?9D(CTK!4mxpuvf$I#6Nwy*IiLj@yU}X zQB`9yDB8gJ5eLqE$EtQ^MaAc-CZuUFH%q0dkA+FLj7Pxw2%$E@XbM4-iHDch5Tf_8 ztco)S&1uQ0Np=l}Hq*Mga{B+-)onsXjovk|Kku@#)CqW+>n1qI?AW-`AnW#e-RDtJ z#t_T~_=1Or2Q2iyp^>gQ}lwL1gS{2`wUOD|g^rL@vSJpHUBkr?jP3P|R z8LK+cL&Un}5OY1*n`=(A#z6NBGA)Yk>kI>4C71JODT0fzZs!F#_l%LMXT0_1(C$bG zi;L@pteUBssXzOqX73+Ae(JtPJA4dLmPxl<16m1_aAdZy76ZzApS=8?P6TaDK9aW0 z`;mGnj>T;sd&^cjUR@g-TAugZfjkN$@|&x+vPwue04?l(SRUjFS$D>0*>u59BD}K4 z{5hqVeQYa+6w)Bc6oiGgj5mm9j<_px#v-o6w}yt3!s3=4!95#>Jogdf+45G=k7#(1 z49k4(+*vQUu1`lrWqqn+85@LDpavW*OFWD(9VvzL*w_~WUs-_0Liwr}pD1__3g-k+(EYVZ}8%QwO z36o8*m@6B*!6-$_s5oz3AM=dht{UY@ZDRu0({!D3xi#Jo?yWF^dFWknyF^Aesj*Sk zWlJ*xnI6uOc8~O9IIv2%54Dyg^YpIl4!I9Tiaaa(dR&=Q8Kew1uH9i{C0qdQn?XlGOp3r&$C!^6!nn&ctAO2E&3=x*6}1*G*?yNA0wh5bu! zj=&OauF*fGz;6CVka_fBQ@+HSgGOSayQd`*aR=glc4Jp`8<9-XY~~)BGx53iwr$+D6!17hzKlv zt3|$GP;{dxX!J^0C{@Pf-$VxEHS7>5IrmpXYwXvvVysoydN7rAymum7H7K_P@lL`X6xFJX0k*2GCStRr3GUZElClY<@7#*&P!#D1Rr!9(ZGT;> zf_rXqX>u(4|5*Spq?I?n&dT)<7qeVv{X@iWkjjNOV@4AhnQAXVJi&_rmVUX57?*xN zq;x=8{B}+5g7MneCIm_duz^HLHV8yNXnSudhmXR|tTy?A7DCCq{>EcyHKQEa^8=98>Vp;{ynoS!v zbPd?zz|&5%Pa&pN(+l0VyL*45?4{WbbioY~GGtI`IRxTSqW33Cv8%7IPbenovg|k^ zdU}ZG)mzsn&Dag_-%EF*8)$;D@3(zW_574FTEsZ% zRaHHNP61^jy6Ln>#=6bw&m@n?B{OuoKV1adq2xPTv{5TtT#sLEGuKFZ??oBLKPBnm zm-)AC6ErMEJqX`OT`><_tlE(yw(!OSqzM}OyqYiM@ZBJj`}xC%uYE(lyjnZXd}Lou zxKM(a2iPwJqJ$y+RS@BylcQkLk!@d74HlTj+g(3yF`8KMN-Z88j3R5keIwNR#eq-P z7?^kroQ32M9{g-bsyL*rZ4VT10#Ab<@l|{`X{c&yS|?V)tMla1tj6vXzb#Vk940&H zUdUE+rXP?^pPqqFN(2zd!y_V~{diSOU0uDnv~)uz@Wkr`&U!JrwOlke&oKe6-I@d0 z5-=zpwP?EInh{)wUKN>1t{;?jkMHS%Xsae4P3;REa*A^bM$&imOz25w^Y+EWA8$6< zV6wYen$pDza#uZ8q^|c3q^aP_RNcE76t2R4|2l2h)+`3ie z?K-hFHe4{k0*CIU$z8|VW6?aBMqJFRXa>8Y95jXF!~1H?=`&9ju)8hNAb%{dzmGA4 z_k!9wb$W+Wbqx)rZ0DEFKr$pMnn^7N!A&KTf;wi-J9qAk6bT8^D&yeei%Lk)aEH(L zszmSFUUhIQR9R?m*McY7%#JDYojLO95e6>ZvOI%06Q1DJ76wV6Zz%cg zct4mNhC2fqgBJ5_0XVgCDEegegDU|Q)rP(y!g)RNbO2!l`hD5a=CsEbBcN0FZg6q9 zpO~RcrCXUiqo0)LCZpoPb3C|V$2t#ZK;)xN9YmSu;@o42!@TjrYhEd+p@2Ps@&F4@ z5I^;wMMXs+eSG$8i?Fa2gp}a);%!2Ta~tu^iO_h?d0`{rSV0&!JPBH*PS%YK4?k0r z?o#85lOZxHill_hVViCLc^i>403#uXt1*R~$kUOkR~3b4*t)dKm1>F?|E+K01i|OM z3JR{4e1tRCv*T~{MQ3QXCqQ7~^(RURcqH|FcETL0nl+RI^Oc`Hd8i6$y}IAzL?SkJ z5f#4bcyfuB(!|dJ@9KJ z9Y25P$Oj4I{r@7fm~9*}r9ySDTCX|82^d_* z4EpD9j`!O48Y#N)4Un1BClZT`tIEh1M6P3~cSB61QlP$sTypO_x%5I=UDRl@9x;n9 zecbBMtlKe0PMet7^C$4uFMjoAQjyFsMr`xY?0VIz6C08`xTdQbIPc-+D~I{WLm3A8 zWsApH+rLmdQ--_@QZZbyANsNmF9}a~5pf+I{!!!*!z?*Y5E>hrcc~m?xk3TcOsk5= z`ZK;uc!p|KmQG;Ty(S(d0vt8gzKN|nOfy>0iM~Mk)}OuUEozk1gVo^+6V=4Lmk6Cd zt7ziqOTtsnh(VusduIfP&oIoLaZvrgZxj4H#HTFdB!KqxH25Uvj8{VBx>TD0F~HZX z-dB^R6mY-kw?Vfv^F#_qMWw7#H31Bx37s_D{)W;ezc)4Byz=}Uet`=zkQ z#>AQUREv~1#`uMOz1VCPqp3yWwA&n}>U^%fJmLA{$B1%JlC~Zh?BOr|@`Z$)0mNi5 zvQg|0jo7bdAeU(9=tw}v5|ccaWnAbNXZHgR1~T$p5OX0UY2EX^z>p{UFyl7R-AzNEe0!ZryPyW03DGAktqW4Lv6G?qfE4d3t_=mQtoi|Ez=MH^k`s zqz|l)mR6aLo|_IlxRzy(rYHP$!D4}mz|%}O6iG1J#kmYZo`7*>GRzCIkLK<w15VHI~1SOqoQ#kk%jix0Ha4Wu_p(dh8}4 z!357K1_+z&anF!1&s+WDEx=e2nc?XxA{N2gOt=(gmBPX$OfEL-|GA-lpL?Q20nT_T z3}k&w%Jib1ziEP9R{p^_#^M^`TCTpB(McF2_h@`l`ZYq8r+6&TqfL|*&2BG=Zg{M0 zjkfa!wnN+se>iQzJ}!A~2R0W0-O|_3dOyZycW-uYYAlk5`H_Kn+0u+UHH2GtCccLI$D^Xyl!cn6+uyPzQT?8_i5 z`1tzf#%nFYO&zcA8St?ye!PV*!a2J*ulSIQ&-xQCppG})gl3oqvzL)G?ZG`y_j~;s zXX4RKP5rINo`JK4gkgP&gH$Ej@2nqv7Fz4!vM6Cy0cbkl>(O-IvYKY@Y`{JZ4Gm47 z$Hoeb)e~Aqvz@p7Is@j6jP|AFXJ<$6n2h_v_>NWs+#6;)gIsX4{6&JtOBECtFBxIJ zt_$KNY%ty2+#H5$nMEw-DEI^C^~unaY*IrbLC#FcvvU^zbw*Hg%&iq|YKSxv@ay-}6bUwOR$2Z!{NzR%m#NTX-K<*I2O zxlgmi*3vcPcVru-r#*$xy!CkdUb`M|p%0i&?{=94PMJNK`|KgHC6`(d!L`;DfQ(1; z-maFlNd{0$a8y?7?5BvTq0b}agNwyiY1=mV2JPs&xq0W58Td55QD%B2^Qd6S?b5An z+2pVq@?iWkT?&W(9lgAaik93fNJ~4nZlz)36LT%jpszd zj#M02UVeLY(!n`Gf!9!9566_!vx+^vy{R3q7h!B|QE}0CmGi!4(Vw7b=VJ5%2nUD! z#f$xA>RgOjF?R?d>t^?0j)oNZy!kA{h6{fGQI+IhDcUEqC`)km%E6DMh8hbfW?;8;lDeM!~0Vc<)C# z{eg8ggG31^Pfs2^c+=j;2LV_p`SQa-=OYRyRNVofe}m0%=u}utjB2`a@3Kxp*KlY4 zyL;P|gT#3Sw@s<*-RsP0q+FKyczef^NN#J96eYsT1mWQpM0*7@@*j3R3ue%a(U(7S z=G!-W2s7Tj*o{(^c0R&T9_N)_XTRT(eZQw*SrOdVu3f{J($u!MrG&7pi|)^koIr{_ zn1mG52nZnB+U3@Ta*XGP`%Q#b!rUYfh$To0tKTtbBbNUw%EmhN^1Eer^RUwLMEy-F zdXM%08HP=E{mZFQ;#lrl^E2e0EfLy*Y={zc%WHJi+%skYGv=*#{C5a#4P$1kr28n9bn5|$PU(%Q zfcZB+4}GK*kf@(cpSg%YLQHF~V{;@_+|}FGbS-_KW)Lq&<+Y0)gzBK)+r`2@gv&OK z0u3*KETmgY=DdE?{*XV8_vcu6>e-dBB6P+Q+WgjtZwX51x2}^1-poHBDT6K(0_l)# zDp)v>Aj}Rf6PsIauIK(fn1SA+=iRn^O!krcCij*ayt%%_vs03V(0(W?;uM7V4Ek0{ zNlEo5Pft0JPS^FNk?o+_7@IJ82CkJPJq~sv&XY^0QhqOn?YbwOI2}EIjM~ObltP^7 zH&VT$LjWqvyguvr{{U80->bOt^0TRp>1j-o5bheq9bxG~u9-=k5<|>_^v3^s-0wf< zMqlR^nE=x@PVt$VEKi6#5Q*3ZcN=@>75@@T#kk{kyR?3OumM|w zY9$cU#3E1$nhZZ(IcZfGEj1TjT8I;#_%i{NB7QFTFp2H%E?0dfoZGdwj`h%t_3(HV z7)-nSjLid+FJ9Ns*|0Y1vu{kD|Mhuj2)DbZoBD@;gO$x&Sx+_?I+tHdF1xP9DX`S) zJW>}oZRPKpS�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 *y? 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

_%h8iDW>W$5 z@5tAwh<`J?g3Vw9AZ&@NMP93#)rb1OQ6bxq|464jtx-el-MxM2t%5k9n2?4-Uh%Kn zr~2B1QXX@kZ$>+iRA{z4)!zrsCnmxAqVOyR-3NQ1oUqf3B6* z{0)HHfM_LWFuM;*ACH)3{h+@e>#BwtpH7LZi=I_SbT)~Pp@pmtsQQFdF{p-FaQ(hb zns8*A0pky+e%EREZ``hC^4I=Mo%y@TDH#$WS4_`Sy{3e4i2v^m}qt-uOM_36AxzAI^CT*4T+PhKhi!CBRAKQxS)~m)B92N!m=<6 zSkQe_Lx(UihE;Xb29t|37q?LZJ_^&RWBOeVVWKtQRD)wzkIA{N~0>vuyBc)ngr%?B{bB6^%)A5my(|^F3GLzAB+udYWCgIxtZfx2z+V$Z$OAlbo+_7_I5l`p^gdH10@-jYZmd}md@grzxK8&Zr zka#my=y#CJ-my#ma%E|KT;tIp(uKd-y7)$3=nnX-!dU47rhJ-XB*1C?dyj>AQaiB- zVMg{$I*o9?)#+VKM&>_3qmXHFMJku(S8=e2vq+sCXtCbCdpA_sV@MOh zqH=Ux(iSu*=kVdvgjhN(JMv?z^ol?Thf1CuXN%V|p}3KE_uGs z()Q~mwDJFbojA@yt^O)__h2`pc|Eld&cjd|n&NWpKCCTfDSxZ3eZBXq0QJ+4rcq3` zrt!s=$q}RJNh+xK+stEpeqeUmY`thZJv6m~ewGw_P>a+{>OHBhdgx}pN~j#o`i6HP zGmnTxW!+3a;Z*vDP+IAFj9+>Bfo~`+Zg$#*iF93MpUB7tnC8$`N=D_|C{ArhbGtgh zdRn{ejtoG*Ji<$sj7_)!B>xx|4EY{P+i11Z|MXJA)z|MM%2B8UR3OJ|ZEb~7AL)*6 z&!k4jyX%NMYQ9dZ)Ql=R==fI`zA_g`O#UJh<;w%~*08TD=?IF5`-ZA>v`$$Uejhy} z)kwagdj_-iy{SaXPRqLIP=$=R^`(sDrVy6$!j3`Hs*Zt5r!9NZpc_VY@)`N^L2-{q z&T}X6;*YHHFo^kIC|Dd#Hd(LrzEd}0fBAA->k&#B9oypxhtmtam(5*^9C3~rkgLFv zj{UQnFDS5zsYt6Z+TDbuJWBZdjEJOR`x@>VlyjH z6Y3r%DsK98{erFr7V9C0YUPV>F5Sv7a(hqIEK#~Fm`ClNdg>w7Jq_5J>Q0Q2m&_l%xyxC2on7$hgvm+DJ7AUI$N zru^k`Js!PvK&>#2tr)lQx%cx{6{YvVFT3t?{gq}reA6m`vsV-R!|O5r%PuTnunEwr z2>)h4YE;CGg7q@)clU|&7{B)~`r!|HQapeO>Hj-F=_m})6hJ<*YW14He@>YE8{F;h zd?nizP;$Z3@NS^WjPCs5yT|{Yh^HN)1wMAQSS-)ox#$NWZkJ;{hQvaYQ&-cOTaySZ z=*6kY1K=|WDJh$kquA=J-v8TpxwzHT#rk5>Zc|X7$p&a;&<@#WFR&j0hQA|%TS5^a zPl3h)LNYr9IhCzl0 zeBCM-1{5MUF*ZJ{u%``h$P_UW8m$1fd@9z|z+l<^ew`l^RdMyP+utDmcX+0jz|hDm zDpCd1Wn*KOh)LjoIt6l|o@#{unRXj{RHoZ+^wj@I`3rkpf3Q-(C+zQ;20P!oe5II8 zKC;iOK0*|WPW9y`Htora(YPJ{&guESGyA}jq-DfbE$)W+kHwklIuf1PcvO#Mq}bGH zcs=b)7l`4A(IN(opWNqOJ{Ky2?bViZr5d8lH0Hx?5SE%!vcEW=j-l#!=3Exa_~Wol zTCd;e5#LQ7C?zChsKUMyRrO-e^yD#_nAE$}TrJzH;|3T(U$&K;KCa zm?W9D~hvp1t-NEu7){a0QMG_=Zbbgh~^Hc-WVWfJR0+5$W`P&kNHC}C{d zXRLm|TUeG9Ug)r6t5`7K;_<*LX#{@0rIe5FV09y^9+PF0FMZGAN~Y;T?ZgFKy&**kl#>wIDHO2R*&DB zka@r@d4K1n$~ImpgGMZoNj28=aM*1FgI65z3eErPV@7I!>6DQK~BV@Qoq_v z@gqb`W$gDZ2nfvC=ec&SyHh>3n`X~k%wsz)B#?Wp@GF5unAxI6$3z4?KgqpG&mK_|5zI z0eGBJqcKYTlzTLu-cxE)YAKa70*dPw{`0q=?#gWgqymLt&~drn*z}IbCi-Z2gUk%* z(d-Azro6P2lEjDwsh%a4T?C_m zY!7w1<0`cw3&dij>=HE9?zLxJZi6uE$|qQJ<9aiU?}HhTJ1`O2pd~11{8S_fN|1i5 zo=S^jfY)SzR^!GdU(nHWNPSRLvRoH1%mE_Kr0>$Z13awTe#kxg$nSmo?Gb(&ia=y; z0+EURQZD#n)RHAKp+IC-ibXSgxhsE&%&VR`Pd;8QZk$V81Bv^C{H((TQfSr|0JLFi zr&XROR^c{4DoVTi4uQdBhGaN!#{gpG=~Pw`^alx=?(znT=H1@E(~nI1dT;8}GgZAU z#cYWmi07YLq~A@`7vmKxX3Tu^3+tAm9^7y7FG&e1OfWpst|=TQ2F)HpK39XIU8z$E z9x>sIaYJocwUpZ;9kHNa#s&A~i|&y`rc=iKB_)elO^P9`uOJn52 zc8@UK_*_&IXfO=CDMl5Zp~shBP;gXurFO808FHPk%IwDklZSA%-fe@m-cjXPKMGVs zwYP|tFI(<0(l4NP(M2HJU58lB=JZyF9*UH~X}|o!8MKrNZi+WuOQEn&Im%vvO{sC8 zY|32@eL3spybb-^dKieB1!qi61CH&{_i(-pTPHN*P12pL*g!SLx3RDCQ(WI?!b3Ta z-A@SGsv*mU6I%p6F{ud=AjT!y@%CP)b>BoD88Ax3W2szLbcs%S2=Z+aoMt zTGuM@+muQ+!L4=aI~OaRAHCY}?ym?>530F?PsYuZn&P88^ptD9IUPH6(Vf&-J~F7A z>6{s;iHF4z`?9P(R<^XYPOe<7)im`LnKm6wP)Ziif7OQ}T=!zQ=jt(hcHD(ESI7d!7|2>}qck6JpQ?ECquU+lGP*yfLO=cfwZ=Y7KGqHH;_|TLmb~K_Zq2v1CBgMH~Y<3 z_ST1oBQ){Vo4t{at%6gM&T2qgav6}=x2aY5cfh8$V}21!j~|I4WodB|y-N_3U911G z{0^xw>)cYrts^N7Cu!cRn>94OR!A(=e<&fmV!gf{{KUO+1z zPTZYvgmH@hhW@n*?~$Q%?t{J7y711N$hsG7p{)7s+~#d4c5ZLQqLk-SBw7BQBl>uh!@c*Z=XqC!!^v=#aN zb&vdJ*C+ijdE!#MZCB`Z7zJsi+F3ln9a7lhb>=Os=HWGadsYYCCQXWy#?oKc(99yM zbB(u9xu(IeW$ugn3oFbW1^JM%bY`{bgB4Ana5pKXQ%#J*FGuYBku)bS6YGR9M9}sn zJDU#Na@28?qNLopzBzU&FBj_b5NwV>*_)uTywwe3XZ7JhT%gM%gR5%|MH}OBQXDU4 z6knPWDiYZ_>EQClqR~ZjS{M_)^Zv30DGXn`lgTiQDDUs=o$L`u;9mfUJ#FgFJmgw^ zV1~!Y%lLStW_wzY-wV0{4;1l<(Hwm*&rYuP3E4YOK;D0$F-Q`*-^L4ZUm`ptv8d?5 z{W}~lXt%7Q8!QwKhEd=NS!WotvnN3uaV%pt6m+{ZS2dR^(Z@q6cQ55W>1W080JRci z*erd%Jp<5rR?&gNf`a%;V9S7xJ2fD<70Zv{OJo-0YXQ)^qHWXj>(bS)fq_sp_yBpK zCMZReydS^OAXDQtFHYXiGXFGr@4R-kcVMEA5NY3EY8JEYZ=It`xx0;B6W-=#80K1X zuV;1TGS6HaXH2iQF;55ey>Mwj^+=fqoptv`Fvu?JL+c)(4xduOKtv8EaI?$WX1UZS z1FM2M24{RnjTH8MzHhLld)9r7Fjn(uwPDD4b<)bj*o~JNfy2u2tKU@1gxSGmdoAKN z>$$r0(*{MU%-KR{)Cu2r_UYxywaV9``u4b7fGE84cR(6#&wG?2Er7V${&WAx^Fqr2 zc+5s6Xl(x?+}ONIdcHF|E}(n5Blv|>O8%Vg)>bXK1pZU>eBB>Y1A7?@!}9YNRuROP zJwPKx#Zq|F^HMx>TlCXv_~?I@Ni#Ago)3|^Nquocl6d>tqXvW~?E&mEu*7N@#Z@NA zULxU?yqKs8X|-#vs9qdSKI}3Q;F)lu50g9YVnvqTo1m7G`l`X5C~$NH=m#Le7>3sr zmoYb9oV7E@Z7rX-ad&nUAF^L1xUMM4gH-*NpR(^tRl+)D8mjZ3PMUh4Umdl-3w;^h zURXk3VLC~+8Y13}oz24KQX>vfmOrvYb?LGBlSlzD3uutKhhc|f{Csl$HQUkNGJk`m4Ju~b10_@ZB`yzn% z0xDcPYaKc6tajNBzR4rA51ch-L^Sr(b~B!xClz!MjZY6+$%Paj_CCzGTJPcxSBej0 zsA`-#($? z3jnB!SOaG(@Zbos;~)>$ja2lVT9W|oub-K-@r)0_r3OLok)kWof+9iv6O&#l{$7bE z@H06GAi3I?Tw5OLj=dZNE8TCpux z-Qc^KT5l@5L!T2T=ReZT%5Bu{wJdPDi!5&)WW<&eK0Ja=T@O^Y_v{h+gQw9L9W>r! znqIR)I5bcNNlgu$IPRfZ=xXovX!d5Flh?rEJg4VPfPakzI2}OQglv7|1c?a77iduC z(640xS7*diwJ4UBL}e^O52rG>7gZ+Pm@*x-Wt8A^LGP8g^cxAnnZ`zSe*}$Ohk8gX zTJu`8--;$LUUqVFtMC6@`pyuyu3uYLo<}OP@rUCLNpIc!XaUr@2CrN72**%nanIM+KRFd)jilq>~PuHXJ8-4eJcQMI@2#w3S^}p6c^2o;MYCd z7&jh9pYXNZ+7}-Tf4O5b{JglD*m}=;*Mx>cn#{Esh&U?t+pYgqH-uaLM!^dec;~?? z($ei6L{zNZ@IlPe?h2XV(M7Tn14;k&dWxXXCO}igz-Y|{0N-pUUfkuTSSqh&AQLgP zFi_>SHhtN9@ceDOiJUdn)<|h{m2gpZf#fF-6@;fG1d?;{eqzAv{Rj6D753I=`IEJ2 zp-G?t*;G-k_TneCGr_;4?hU{3G5~NuZy6ebwmQ6$X79D;v8{!-p`RSm5#1;DwB(Pl*76 zlJ%C#NjFDz9)WZaE#-GE>DN~mrj1Q0z-5gnH(|<0sU-f=&VT+^!c;Ar#pjN%VM_Fw_+FFvmo0;|=VdTH`dpB_`Uh-o$OoV=@ z!~hmK_g~~IDx1$~<*fb2rB7SvdEFLiMrj!OWC8Dd85C80EBeRAaKbC@<3EhwNyhN3Lv&D&wm)di|KSzoLDmlD4+pFH)%PGLY$OR zk}6*hapx9#GDDij8nteDI;+`35lBX%mZbYAT`QlBn6?RA0kRnpeNNX?BAh3*y|mo( z4t2HXuB@rluhwvj>=`X^4<9B)75sEA&y)xiV%Em9faHVi_y-e z3$KqUI4Kaf*WPdmJ;GcNLEd-TR@7LVx5%2@<72(|3=C}#k>u&klV_C43+t&jvN5J4`E~MPgkoY_q%L{N!`5)SEQ)&1 zQJp*hBE|@E%E$>>uQ?*2DbGL&ur8M&%vBS+(=syN+gr?nlHujg$J?m03E6ncnbeVO zDlZ_MN{gcd$Lb~01IjfAl|tERH5NdlP9SBZZw+Jf@FIbm1D_HllchJwB;sOcb{DDm zdP19+p*w<0G~hdRV6~wzndOa|zuhYLUUaoHMPD_08M(m?p!iE0%f;4ABoE^af;o(i zi-}6fItj!k^T2)%8FjuB0_rn8|ZdRI#Sm$i047>1_j1;2=Wxf26ny6bW>xF`HCY7NT?!`}<9F;os%F1r4Msg*)?^T~g<-V{6ctQ@J za=-@d(8+#K__+##usAi@iGwxQV#enJ(6+dTDnjB-T5s9p{K2A_8!{7p&%a@=2#w?E9 z8W%G(yd^Dd9BA9mI$hPG>zT;g;hU`>RK=X}P@COEVs*fOMG{|E0R1Ob#s0O9miQoG zzF({!*?&;l@vIVQB-YZ;Dds{%ITpzJvBa%|GIf_$??jF*Pz9L=&(ntAJ|bUdW5+rN z&jw2=ggTys@WD$@sBhIY%ivE-6%(s)3P!{26yj8h%_Z24bD#J!1p)QhzUs5b9}68> zn90KP4U0Z37j5pVM-M8h_lM-YsKHOl?Y_%bB62+kh@n%ap!K{YoJJ7GoGcJ5v2qO? z{u@c0gUEmd5xsiaFZhlpHb?XlgdP(zz@^8~oZu#OW4c>Q>rLiYQNhl`y*u{o%hSSy z{zidXQ(Fs0)hQ05PL*tC`qqIm=G>fwpr7NdN8b|-6wQWT5Yr-OcS0XIua-TybM@b; z$zig5+(G@*gV>BAmaVn z=c-E)MxH1;#K$wl;?tsh1|~B~CUpDWp1Wx>#6wb(1+Ys+s6t4D4kjjyHD;j^Pco)ASa0Q$SoVKVbI&;BH+z>X}xKrQ}r;8>LVw16T0@l zg@12rxGvA|5n_3^U5Aq^fkTu$IOtAaJ}m#QcpcUP#Or7;|1J=3ioHp8a=cLCNTjdD zh(y_?Rwi-;6^}|!cs#b0*ck3_c8@KrSG2xf_RfpbQ5{Uu15$^5y?jzFy%$0Gm&7w zRyT;v?tYKR5`g5NpO<$5KDK8fZE}n{kEI28vY$bTn%%n939gkYbIVlF8tn+Q*3uab zx`~l|Ei_#qKmSX0^$^Qq#X$KF`29x!a-QEQL@N4k6DrSYNQRHp=W{Nm_jWTT$s=cJ zV<~9&?Kei7j6gc|o>NDSq7rgmX+m#{+}N0ZwEko2?Y3n%t3h4MI_H<_<{^5nG)e%Qzh3yE;RO|{kNY>me-_z zZnI0c{M1TbAF6Km2fY`JH+$B>a_q!n^VHyTZH0N7qL-phck-jwIL@+n84Itu(p~G-Mkrz~86d zMtxtWfU*>zU4}KtP=Ql(gx0mdJIM-;vu>dHKg)WV=DDbCw&e~PY2r@Wg0oAR^1!(9 z-%t7a$#cZl2T&?jDMMmj3i9=tB2sv~SfZ?=`X&OJd9%>0{+$wT7RJiZ%zCJ@sehVj=(i&I&3y z@MA$rAa}B@QTMh*RS89pUTRu30@m5;qS>5-<~JG8O}PRzEX8%@!v^yy`+#^cYk5rE z?ZK?u<_Ju~>6$T)Tc^n6Oe!r}0eT7qBNsnDpE8N1d3mzug+b4$bP12K4qtfP?#s{@ zsc-f$Scgv^cnFT_@VS;k$7?%>Pj^mlx9NpEijg}0j_P=if%ojeUy06mJ}ROqk2G3TeUP(KbdfI8!YPH_Fr9J z3zUUTb2Wahi*U64wOdN! zAkiREyN#zVK;DM0Mt{fF>XIuW9=R0iXm8qZ7gj(vY_7yz=KobO>9e-6!P~OVQwawY zU)kC1mcI!baJ!s!n|a1u;_a0qf1Z|`dT#Y+lhd!K;M(jLvb6@-Zx_bQJpHZyXrZxz zr0x=q+GW=ITWoFP)NcceiIU`i^}$yG>5bak(`o(z>Q)LTVl(q;>Fju&`1xHJh$`W& z#&6d675<1S%v@r&5A)jK3r2~SI$<7ZgRn?2w~N@98s;qa=~4>8Pu`N+JA>!DPwXO^?Z1&uchSqk&&Jr z5xe+UfyZvQq|c(`^@lhdr6fMbPwn!QS0!LHejCdJQ>eh4NXXV^O(Balg<0fxM~ejG zohj@-6#C??Q(fs)cYoA_)L?R&uu}Wz1Cp>b$DIo`3s8z2&+S|9=zIsaBoy=V&1Z82 zW~5e>O*MpK?q86!S|O20eqTi=Vl#DSgpxyR%$p<5Pbj}X!GT(lGEB2dJ`9972odE;kD{BxAhmdtd z<7B&ATB4qY2H|u29Q3_fSwSN$fJp*A))ylUGC>vV+sucxZ(#KZmp%OVbd7KUkIMyxK_e0BxT+I5@6_xPqkV zxW44+=^b3rsC!l-B@D-FmB5vPdwXX2Lkd^dOC8Hj+;ZVeW!jcYx*_M*L|+U4fdtAK zhjeD{+D)J45u384wFtkb@veZ;Sl*5~@B^WwE>HSK2XHzDgz@g>0JZqQCLC3vDqARY za;?RDUWpw)vbahsZ@&1<%yUSQSTv=(&Nnl6)~b=WI8i^=yKkXnFlH0|)vUyc;jr_L z@8$WrTm5e3r}UOowfX7}4cR!zCRW6}=p0U>VDUNnL)}>~mZ-FVCzsyK6Ma6IB+8se z!%(vx-d4_QI|Dqfy{ryHZ7fd2WHpQTK(|Yt71})M4?kGeEYK&TWsF%nsb+H-3Si9( zdrGuVe=OHmbh1|)WU(gz_r>XWiwtX5%87K9?w4AtKO$X`8sulBs?Ji${`2{2=Mcl zuLXKf9GX$|O`LzbEGdN<7kY5E`VXl44&Ll8f4;JsGf(tHV{PTk$)-iRkE%ep#+6q$ zU0ezmdwN|Ix2q?UrEuJB0$V+Tk;O9LI=vDSNLbkjP^Uzu&CWXay)YctP`)F5MdPj@ z>__FWq^Dps%2MjYXEm_C=ORIvm0{DZAth34$geHubfY~hv~SUKlZ(+>nHNU zJnfTLNOIv@f_KO+GE?!6oFvAfB$&y^uo^N-E}{) z8P?WQ)v7dzKlhGm(lgv`)((h#vZ|^l%+@pK))7uYZR-E+FH&G_l_=?xY1J)DKG4$q zTmI#j+uGZ~=3J~>>wU1+e)YP(z|8Yh@dZA_&xuWYN|CFVm&N8WrhEb(>tlqDpgf$C0j2OZ>tEfLV2-}ca{eckW9vVTNYI+DX32yC{f1us(oSa z8BGn;b9SOGNw9_a|9BaT7*mp5r)SPKjuz5*+_zZWPI%hD!7k-l)uK-6$L)s2RLaTZ zuk1fQtUu$R7QWg6PQ@{S(rUN^!K*#X_IUcn1a(b(jxzx92D7do^GaqcXM^y4euT$UrxSXC33 zd{C`{laskKC&ZF(+tNi}qaQyZ zB&)!n(({k6HK>(X`~cKus8&CxoNmMjczt}3uUh&8jeFDG;;&nKKk;ua>vu%3H7DQQ T^NE$LadkBHHA=4Befoa@d*{tf diff --git a/docs/features/endorser-design.png b/docs/features/endorser-design.png deleted file mode 100644 index 1c4b9fc55575268493640eeebf664f3796359300..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25582 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 diff --git a/docs/features/inbound-messaging.png b/docs/features/inbound-messaging.png deleted file mode 100644 index 804c291e86900a30d82b03f5954cb1f2a5b76394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55628 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 ZE5tviV8p^1DFPB%M9) zu(&Lfe!C=z)ejP^d{tOHSQCU^rO`qaKJ|=tmcNfTrv*5jpT3RdFo^~ySSu{3#?FSe z^hB$|-M2khXK2#jh*#IUJpXdp0OWTG@ls|*~6z3EwXzeo@JZsUUC!yn|(3)1@q zbO}5rLegc5vsrkq38nzO|DBnjD6^ z>y|BNs)dvk6(K_;q2tcOhf@$FbvuwJZvKdQ`P9@DbVR9-%*@PyV0iuwLSdSdbt1yU zqbXxmbCv*uSRuh(3G)H$vPBeqgy6GDPD*-xiaR?9qqL{uL%MN7`#0R~3iD8I0 z+G#+Nt^*gudhxwP!3>$1nF)~&_9g0ackX1|ucr;Hj7Ta46&z+i4My;hE8a870oG$* zz_O^Ju70gI5CROcCknBP+X0{qaWlAEt{^ODXYhCyt{KKSfAI4wVxV24Bw7Z>#^i+V zeAaMOt*orHpKI2U9g`Y{xTzNi8cyIKaA})|`tO6;Rq_{u#kUjH9LJAh_|Pr17(s6+ zurb1dE-X3~16h#C;PFfWuBe8FhQ59bOb`x8KqvW`e`Z;!rt-eAaijU{m-Cc!ky%hK zWypTLhD?YncMG3$bXfF&Idv(>#N|9#NPhhIvC>-4^jcX-iEL3i(kH?!1Mc-GrES>f z&yozdI5_(lJ94PW4xho?_8sJ!EA@rZx+rN{L3Clx0z%@&$#RHtLemS<;i6!9kvelP zWqG(=w2=JkV~#>*@X07iNI;y-hxhO2(Ni85oRr|S1mG#6tun1{l23qvCH%e(OkQ}X zRsUeomSjK9_lFtA%0AOZk_|=pj5kkIU30Tg?h}Q{K=Ci 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 diff --git a/docs/features/mediation-message-flow.png b/docs/features/mediation-message-flow.png deleted file mode 100644 index 1eebe68f2f292c69ff51213ef8fa66135cde773b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181492 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 z zlbc^UD%bpZr=Ec+gANVhG(b*7^g0OncidgU_duRAurhO1kcgi{Om_v6^~hc#Dq0z_ z;!_!|Ap3?`?e1_xcuZD_^1gnJF#Ho(5lalr%Y_c=C#!Ecs_wd3R2#c07WC=sJx{83 z{z)JG{P50^x7f*A)Hk~RQg^A^&^dNnI|Bm)9i0@hbYFk}RL3vBBF)PThAf_wI3wZj zE_SPOjt^A}Zrlr`MQmB`gm}ep$6*o>(5f=2^Lpm_IFulXd-m zcyM4kR6t5eDU>&0E%xen+B>r(UV8qt1i71(Fs9)7a{3>;&(YQ+b*X;k`!j<y{K* z$H_Q_ms~F|9Am2UJwiOH6D=?yEU0t*MCYHF{4OA1j``1y?&sBZsH3$fY-o$3@VCnf z7r7nwW=Mm-$Bg5}Z7{#T=TFS++04_Y++!vnAAhXWJCiPAP;h0aJsQm;l16!Mc^MBE z7Z(##_t9Mg%|B^za;o}hq>4*oVq*8<>C|-nnPA`H;`H}GZ}MS<+Q6_OiKLSz;_tHN zka>ty1;?BXjGgxdc$ABcWFdC>z1el*q`C3?1kv3t>D!M?b)%fg6d!rul@f3}Cj0h_ z`*Ne>vpej24_BwA96N9ACrG_yslE?GbtE33M&Cz>IwvQKr6+s+K8erMyxKLP<18r> zBhJ`)T+D~}UiXW)`0X^ild^5kH=!OVlkF_8zKMIs)kKaFl$)|<&wA*7(6%+(BA>00 zZ#Gu(>C-2$L8ZID+~Lj6+J0mU2H!ieV!HLgvwe4NGP6y;6ne=PD;_$Wj->hWTF-&qRo&mK!3nODR$+#l(*PEWXn7juGh zKhj-4IJal=qEEyLlA_fz5t|`J-hfr5{lV34{}OF8(QsjP|2M3aYZ>OzL!E+Tl7GEk3=eJk1h~@!#nMMGN*ESY32R@| zoS|xyNsp(w;d^JAn=uCH4T7PZdOs z*-=${G&eF!k#o(s1?D``+kD@?eH#$KeD_8y-S4P5S*u!1rmLFWugpDb_mWZUM8(!f zG-Ua${_ns3T$IHe@#9o>w?CtR;(l92f%RFJpsz@p$MigZKy;;X;|>j>=!JM{ zz%;$3(?Lx5$T1=X5~n0rQr_R;`s75sdE@u4ytm75kg}A94UwM@)}e_L!^XrcHXg_Y z!203ChtHos+w#pMQipL1UZ5cJ^7%6Xq|b%8yA2HuOS^~Q$_Nbza3S?|evQ0}58Xp9 zO8McT{bDIuH3xGsc{PXc?2tl?7djL1m`xrv83J~qe-FW(ndqi&;<1kj^5KNUqb;@q>OpSQW^)SXw0hYIye4SVJ34;NifqK z-olZn$lhM;)qrTzdK}uvZnL1V$sD&@=wpp4?%pb&qtv&*&uzaJyQ0R5pKn!^g+xgqI20j`DDypr8MbNAgPoZ7x_ix{t zSVI`}#b8lB8031*VS>U24fE}=4N4^@QJl_uE(cqJkBcqpJP||ihq0{I2V1k1_UpM~ zj|mAA>b$PE)GhU8nU7V-W~B@dS2=Fap1_%ytC{aR}jaPnX>!ali7L!kLVxoW6WA#Lbt#l>x3kbaRyHjd1lvG0e zwV%~`&IL{kjy;y!oy*iW(yVA0CP68i8TL?;hi0)aOaA0=cf#$+l;(V&xephJ1$8eW z-`M#1^XJx92*&gCMTt$+xWZ}NyL)%Poqb&(s!+e9xo%@)!>BJ4lUl)Iu{)LfbU%4G zIy5wN#TB-d{$)hi{?U4^v9h(LWm5uoZG9n}$X4bQMW7?=q<9<~sdv%6j%5D8{s4VE zevSTYML31;0r(?jmfEa-#b?Gy=Un#M>FJR<3k%EQ8(lRvjqpkn@*-bsIw5|w3LC@e z)sJ3Zy>H6jq>|4a{qXEkG&Y?!PYknZbnI0Ww0m!TeOux=kIqge&I}Q4!orHYN(8X?tk!zI2+{5N1ovh&l8_AVhIOkdo5hfoQ~>NtQ{cHeF4R~2zJHgLl&n${ z2-oKNib11PROWtG!^yAl>f)6m7GAkLwXv2K--vT_lWK!=Ox2EfypZ6NGGS|LTWvib z;P1J&-ND^Lnc%YJvuW4MqgZW~WHM9`0@{F)c~lsx~d#-Frr&~KT0OcWJp4oCYU%X&tV-qqd4DQ@?c1xhpr%kN`uNTK znvb7f*ep2Q(dKtTyNmrV__U9KiQQB8&zCbTdQ%{{6Vc)V1Q`bA6*=; zu9QxCbqVD>RY{#zuGdIMeNrkm+LCxv8;DVxnW)@5!dT zjh2>HFZSyTd6d52%VV#z#nEzcjqg=JMjU(Syt5D-`>dh%z!}(g?b)favjYUoZRr~h zX4C|)Knhtx0-3<&*;N?!T=)ZJ@0hOk29x3Cml!Dbs?U`%;NxQVUM6FMr2_Z;>~kqV z?L4yr!zM@j+;trc1$gyj{e>q^AOHY^h8HInuKXt67C(?+kiRcl>|BIE{UHnai6s&Y z@}C#sv%p|upCIwm{rAQH`E_{l|N1(-2w#U6|L50X+7>_lJMF(;=POtp%-7bc7-01v z_kTIBG2b5d8?>O~YWVu$G9Wq70#K;`MG#?~g5-?m=IdQZ@lhatg>;_p5Iktk6MB2b z7OBH8Rtpr<`-!hSks*UKhIPVuVFGXgxdeIjc>Nk>xWXs1B8cXbM zYiAeW<0E*4Xq%W&H(H*WdN4f+5jx$3xS+zRS-(A2Quqe4htgoui|a?F3|2D&in{w7 zQw=ek4jUR)#v$3iJ}f2YpPub9?1%|w^6S8Zfp7TvK>q8aTNR7vU|l6I0+=Q!3tqds zqxhmVj(y)0mQ-GIvhr$He%uZ;1dxuk7nGNbHsc?h}>`Py!>`1Y(zGV{%p^HS0QgOCoAp{-! z`nR{`b5$Oz$s>=dsi~D)%`S~spC3S90=z1lB}XGKFFz!Zz~!1Uh^_9DczOp1X9!*e zXwy8XT4KW0NbpGGrLV8A43qomalwxa>GY(eq;Z#RQHu4oH8sdUFJB@VhqE*xqoJV{ z;8UbUH1dfQyee)!hOnS?g2!l}5sTU@7KqQTm!msF+8E1Pm@V~DBJt;h`-BeWNXIuV zZKE{N7&2YRHYD4S=Yt$GVh*JtFi$wn<4?Or$@6-p!Ze2lUljBUZKaAx=kYWL5P`3A z$nvxxAuYy#^XxCPoKAY-+x%H+Ot7aRZFqmAscF%lWjv@W=Nl;m$?!IzM?tT$k0~BK z>YPC}k-E3`frMJ-m44K`z(|N>Z*i903w$me?Dgw?Uf<6p~YeFrl z<1hvy>OoJv4~D<6+sW<#{Y0s`dK4k6RZ1(JYK6?4^;~O)S%1?MapASms=G*p<5t3UEF(~?=DjoxlW0pX0!pcA9S z{7DW+mdtr?MLtiBDWmqA{Yg}*NUBiy%v6c#h=`ovR{49Dw8u?@kWoVGofo@F>FDSL znT#+IZNoifZXRHBQ;q zeT?UsA$3zefZ|8Q42&=plTJw_pApDq$*np`5e7>QX{?V|OQk`Q45yNJ+iqjgeUzhn z$v8Y;(tSE^*Z{{E(bhh%HTs@xxWtsoUFnm?Ge8sk{AbZAJZ0?zldD^cKP62aqIc^aPHZr zP=2jFaP@asG|^1KGZwJ6D%?GiB9eiE?NkxsJf3%fM8*hzd)AASssT;=X}5NxRLc+Z zE~)8ZG_xe%4x(1Auz4(QV6>m*Uy?`ehKQ$biebq+tU+PNP>N%-)!{=fqgMx81fv&6HgHZ~=`&s!EinCaW) zvhvibhfh8CW+T-z)2VSjpD)g@Ua5&AQvpbatho*io`MMuCi!`!nigkkqO{|}#@k$k zyqU>0K0ZExQA@(hc?^iHO`XfQ?^E@4_Wvvm?`P*Z?tu*ux*z7Q8v_|Cg^=QamLDBg zz~Fu&g?ZH`AMiK7NR>*v9EE%>DJ!tHtw#_b$-YX5lCs6E?GC8RCtTgy+_bc_i*WRD zBqJ5&1JU}FR4B~C-aazF_|PV3j|u&pI!Y$LIdrRSjbac+ZA1A&|8M|3da%S)86tJ> zUDbx6B?d_>Dsz$3Os+1Q!yQAx%x*dr@#BjK#Z-V`B~-+gJY$#{G8rLPz)EK|fx?L{8FpCb-%fZAoPIWMsq!&!YtroyZ&YND13MF$uMM;->Mik+^s80Z zDA?aY`U+x0&`?rR5)l#IaEKCZk`3j1TJVvM`_rCppZH=2_nC}2PtWr1_dr7Nf-1i^ zXZzDPqgb7GKH^?5wiITC^-q2EE>_VD1PGd8n#SfEUJmX8OgcVI7Y(0HXBDL~e$4u@ zell)Gf!sBTDpiLx|FE;AyRUYo8@r`CO&NQF7q~@PD6YN=HF~x&01dCFKFbpvTw0r^X{clDa zzI~s2PPKNoe*&aFo98}T1nmOy9k`1AX-nhhmiSJ1>Nf(aVnm?cPqZ9D`GscgCxUxI zrh%}6j@vE5lcij`X7E1{(_l;|5(mm({6wM&NGvpdp)V`a?>>kcoe+I#7lr2ARbT3x z|ETx*``jQE>@NvP{lI{|BOAkjex22%W3aS{7$fVL4IBP1Sq;#b0w6G`*kRqdLqgn$ zx!Bap%qfS|;T5Z5^{&Z>EImdoZ~j+}7G{?P^-N+=4>fnvyCjHMB-mKQ0hEh8iI{P}YQCwfx(wnzVY5-JO`{|u^AW$@^(&g93Q#iX9l z@~BMyOaFddSw-dE---TTIQ#z}(uD%o|BZD2gR|NCVmTbQAUN;QiTCq$$AIfZQUCz#I-yghwL9y|eL4-@AD069=+ zl>QW4MAwwAR}1{I*kq_%XX^Ep>-0K}8w*{@y_qxC#!E6LI61f9pyA`*xl@1lPqC`% zo@((Ijra7rLdkso1v*XL<<|Pf--JMZDKhA?Pf&ocP#jWA?sVuWS86sUnao#>i)c#` z4RJBDd*|y*C7am`AR;8DbH&l$kLqAFde|YIEW9Ya9ScwM=h~Q+Ndkvs$Ya{y)hGu< z#nQ)*9{~_ox*qM($F6p#`ucnJSK6C9GsA~g)vBF1U3rA1a0LzaMl%c2MWvn=MAhpx z848jyh6<6Da?zz^h*BEnw=?5Tl-*{tTiNedHh(}saGe34SYRd6@JTzHk*wcFq zJ`B>((vKffxhm!DaqPxZ^;IEuHGB=>jBcvbHCPQM9LW%P&~OkR0?nis3p(G#Llt+UpCue4Q0kMLN3^Nhh6~Xkq!Z^ZlLs)j@x>yu_@u>4%7ZY zLANq|Qm8}mqhz{g62Hys=G>kU4{6f@nXT_1r^*WLyoNI;I!r`jsgP*=AQGO~RrjUSq4Sv^n45z1}q9S5%j+vkQy@RhP5}WkHR=3eRczVBJT)~H!k~LP`Nae4r@=Vcu(a?q zT}IG;!s@)y@IxFCl=QU@n_9c%tEg^RREB59I%me3`r8ox3eB; zz4oleVycdSfZ&@icIlJDz`($c_m9u%L3ZjzV|IGlN6vdD+c&1?=gG5goH6j$||AR&bmj3ugd$rSw2AVU~LJ4WBeh6Y`Bt3*}MN~Bg1O5}#G{ne3?PDkS1~JFjX!rWNJNl_ot84-ehRwbj+tg@upfgJhRB zK@7luV)3+p6^KRs&0UX1Ea_Lp=ZpF=Jq>XPBycyxjYwM6YY4;v=+o0be!Rn`qYY=Z zTN(V~fl^&nB@{uOQS*#M5h3b2lWnuutz2Rf+@~wuZ3Y(AP1b-X@=VuH@Cw)2u{G1# zuyJ0K9fT}s7NQ*z^nzn4I%6t0EAAXT@LLfyAoJHd?i}7O7`$5GGE!m+MHV_W@baFThvM{V z!9*`&V`H)C)ToIUL9`KYw736BSF=w9+y(HR>?KP<56A7f@IH``bH{#ul*#B0dcZ3( zm$TYfwgEIwXL_!W3#3~-^Qy!p72q6#q6HGjJD8L*64$e2GLpEOb+tYEBbIF{kWq0P z`BKcFb}(9InOw|?Tk6w<9IA|?4Kj2nbCum{bnDUKq0qZf|3<3W>FMNOYoBKl>NnPG zjn^kZh@w5%_S92pNa+$G00&YczC$OqlZ=HgL;MyLBiF4aazD#wJeL3|1(8)4eWgR; zy;dB45!&xk4&BU0%WmW085c-2)B{3t-rq=cayZ!1^|=s;u|AMdN8ed%zdp`=cC4*J zeTBUs^oxeXSZ_3a7D(Kih& zP^kOL7^;N|MVBTXY=C;u@y^CzWQSn4!ntQRz4+> zZmqkov>484Jtu_MEaqb?D4>v|=opt} zEGRG25A53Suo0GdknynDOntXF6R|yJ=s!$UINGJ%C8`LhtkUMzRsnDZsu@RMu2Q8T zR#>{@Cw^huWsx`O^$fSVdl!Q&jAo3>GZdUxBXIwDHY-<26h`lx(|vbrFbs{0x_qbM zTCEHTT=V|qXMV-Kt>wF#|12o`*Mh!I&!Nm3&8;u&lH~L$t`9%0UBn(nS?o_Wt!+`f zKVMh7*_v;s5zv70rtJp-aF}zMDqdRN)$nLM0dGg1wQVAU`2p%8M|_jwhjyEOJSaC-wNe)UxPhe&f~P0)c|GxpeP3kBI%@OS3eE`u zZV+?E1g~;rMnID&Lqi#8kmuzs3{~6MDZZU5Tla)o5#_0H^6v+P4Du6Qsv3URf1~XG zNU#5|;wM1D|E1Z&2LFFaum90(?qAG<=f5RmovoV+$1%V320c&?8XB4C#P?y|V zaR~o%_a_D2Z4yQ}_+PXE)=h=T0nh}JD%75!Z_lZki!evUim0p|zd z(t#8sT0H6H%a>ur`YtZV&^!moif9|0BV6?0@X+dg>dSBag<~m+iHS?IM-c3Arqk9) zlX$$Yfd-eZfm3thw%6Ogx{qC}E~qx-^E z{@JP|Pj*vP@z!Fjzul)nC+29GW6+6Ahl_$Qf@-Mg7gG`W76P!~BeZ|@TvjLW^Irt1 zgCY?E8C7}P!ph2Mm7{f(BZ#B%oX#NUn|w#)xUlIb<4Xl~)<-Tan@Z{iosiB@mW=$(vOUmVk~%M@OTX zO`VSSH}$bQptDpewi95-dHW0kgRJqmIh+a_{sQo!I35-S)T?H@oqel!X2SjSKp#Yd z0=WokML?pd*KXi3xAMh4qNTf;%A|vdjg8$z3Hd`xd7&p=96A;Oq}uLE$OU@?sdon5 z3+gs%X(CZTJs^%rnr>v})nuxa7o^02))zAx62jK_?qGX9ves^~dsdHVdNoG=^WIW{ z1zfh;LHXSA*K5C0$NvBQ(Y%MfLdbjZy0JYAkH=&yZ;+cQ|+{mEq#$ znWj*B;%7Dh!SG!$geLRo>3B4(Y9z-uWZh-S_!b@7DPZus_|k386T|IZ)7r>eT&3R; zPZ_SLoSU-@s_iz&rr`$wpSda>$j->JKqohVFdyPYuM~a&^J}Rh@dP!QqvXiiKdL$vU9SQ2i77h+& z2Q{E{&$Y*8@w5ZDH!N`7zBZ`ly0%rdO*?&;a_WepQPWSrRiQJj|eWr*sOkPz$dQYJWsb74H@>pCvLMoy4MB9n@q+ zz?K@1K?U*0h!(mU(&mQ|U6HKo&Lchh-4BOY7tZ5QlxQfrNogtZ+PkxZ4tJeXFe7^P zG!dNe&U!$msqsr{vmkJoR1xoTb%5Wv9xkTS6XSIJ*?y=2>*#@UtAw*nT9OdxU4zAFsbM|SXjvgm?#U!srw*@N-G&UhPh%j#J zIllw+ZPUy+2#IpdAD^eMl^d>V{r55jY|+J4F!#4`kGCbR}q`vg8THCK8Y5SfXMfL7u3vZE@h=lJ|L< zo14q~=7!;DS^k}oO8Y#)91%(l=Uu=q;1itSdh~P%xi>3Ptu8*_$VqMG=qgG}e?pzh zZ$$HGZxw5q;(PigC7Hjrnl(Bu0`*rBlea?HU`bkhi3_yB5r}l@<#e-Y zyJq*uGecTd&1qJXTR$a(gJ7x=4QvEL^49sqfSkCo)nMYDHgWgtALx7xz{ve}qC7XQ73%*$`JkTyqNNBFos^hcC>>nB~NCmr{9M6o~??4A* zt#qeeNBDap|0<(Ca3y85h7fQ#9mu_+m^arLnF&plE**ad*!K@l@$;e z$nCH(3DSdUSQL;;zyP*vahr7@nKah{j~SBoh9>#OP**5fw{}2ceDY-Q^pL!?YE}P% zUh8{H&;|mY26g`a?0r+xBCuv~$rmRDioo}v&s8s9!3Ui*<+CROqlgqL0hZ92@!P%+_8W@`ydi9?P@8wxeH{?JO5Yz-{ zRtRnuSO{?ht@X4oLL`n&c9w10Gwq^62!cisBJ&!=&CF7d-m|Yaxx=E$%F2L<#}rk? z*%r3N`*S4gqd*t>ucWVb=$YoYG5M^-WGIEJ_IS(pn+b6_&uN8z2SITPkSp7z-Y)cE z*pX-!^LVICLYPLrawUTvA~>Lm3}0Vi5VqOu*Rn~AAV!Hs(Z2`}jsls3m7N{D))7cm zLH+md`~(%{;Q^CC5;hK)!tW9=n}Lh&YIZI!%i`>F2^9)ZiN%8{swzUSwoN z6Ei9O6%-WVYavks>h7w0xy?^lS&I$2h#ozXNQzA1hpGn|nI7~~N#SJFQj3_)UcdA3 zk>!u)#b1D7LyOzsFkeau@I#Oc62#I&>m9b|M14EZ&h7j+=q4#T%ZI-|uPzLJV%`rm zVE{D@^p$y-02h~A=Z9zJ)w}%=8)bQp;3|aQ z8k$=fDui|>&@q%V!=T3qaFKyHw_ZO>y8!>q&e}r137)b9LX@c4IIo)QHYw%a>t`^Zr|2~w4T7LT&U-t{qP$Bcln8~ z`|RwZJLGF4M^M)M))S*lo(C7}Xsj+RvFWwm{a+_~84muuj^3LHTXPcsX}_|YGO?)@ zN?WPNpESSfs0kZ@a(iCd2iX=v%#R;Giqz#ppUkhW;=_G_XP*8fM}`2F4y_jW1S)I_*d7mtdF@FF$Ip|apX8-myP$1B z@6jDRE|)TD8ARI;zP0gcs;E^sDrAo@Jw1hxSd9kA{--Toe*E|`PAjxA4QZ7?ea&2l zFK?hlL$aEX9^ig+R!U;eVs8%wy~Zep`38SHUASnJM?$*GbOOLrsqt5ptKl|+Su~n4 zcoyQGy36JZ@C|_MR4v3rMDOlU{Fs?ZG0QWY_3|Xd`IMO{mmxI^D9fnaG74Z|V;XcD z0y@EbDDm`S{LDuZDsE`#$l2N&IPdCgf+A=$fh*1;9FsmiN`9BqkG6gCm7y;Zx%qR{|6uV=i>fK|Nm5?{$P>|(5rMFTK-nO zU~SOb1p~um8_NFu3e5S2cq|Hw+20*dJMkn_rN+SM5q^vxRrL1H4sR@x7wzwNiHL|8 zx(Ho0L@N#uQ8*70=b+<$BG`2GzNej?Ypu*p!+*!dz>pR~k3M#GTJ?6rF+Sl~xE?2_ z|L86_3Xr~Sv>4Ub!{)p31QhrWX0RZBEpve38@1^29b>1nC@$(GN z)r7`#rTm?!fC0=#JRIIFU-Iw_+MDuBzwz(Km4>5Fj|xyqUi=L|Wuo%6_=#co_7rg>bGinksoreKj_c77&pK)7)y4x`MoQI(qQ<1e zL{7~+JBS>yI38mDey3(nJ#pRm`63;`WvDPs)N(g#U2oB3aB~?uBYXA!0<;}be+{Q1 zBxgw^9daV03Dt2#SE3vj{C6Lv9wb7ua8rDUni_}`axRCS5kK%O1?Bj3-(%D7uB(e? zn&x=TehPLkCJiMY=m`44m^k#Y%92MoJkp0^3OmbGOjDgs@Y#P(CSH(dq%6O%)IPB_ z3cAh50tn9pBK+=3whRq*wb58-NR>y>nNtaKomHu|MPJd?Ocip3@QzQT;<~RXdtNVV z_qtw5r`SErVN-0XEY)9JLM&URUTc)#BGvQtYq8a=i*kt#Q%1a_u9g-uqp=*dFjhLz zivpC(HobO?b|$O2sx6fjdTfpbwH(JQg%y{OWjf+UQdP=1ocDI3IV&?{3JkhdsN_ou zB?+em)A0stTo)l>H1_6eL!UPW7afbP(8G? zw&De@0(kqpl`!HOLbSUs=|zr?l)0s!FJ3r{d4C{RCN4&gI`Xo79-8oeL1pL(h~Xod zvOW`T%NYYVgGtq0x;{_To=kmpUFxUl{WN8)RMz~y>lx4RaIra)!A7)a1Re|5V?l%A zs&Dui7sbSIVp!-(%v8Nu#vk7AW5_5J)Lok(BrWIJYF)4WiOaaKdwif;y!zyc4wQ0} zW^$EF`5Jlo`B4xi+{c|S;%#$P6peZx-n!E(SVG*@$md!lcugi}=|M2Xqfg1tDWWpe zIBQoL5zr6~u(8mII)r6u2*M|vg~A0_6fRkK}r0L1AR`+3SE?ByxwX-~}Oyla| zuIJ9fE*ZJttNJ-y!z5EeLhT6?Je0f%3d7!)!1wG>b zxvcmvxl$Xfyhq9$Mj0*~pZz@gI`$iddx!2vrrUL1W1Ji+zL+hVv7JT7_YFz3`MmSB zjg`;Ws-psz3CIM=ikOVY!)OGUnj<@s$=uKO<}@4jr}znFbEHTUqSY&k{Dlnqmy$(| z_=AJjv%JyGXA*U2oY9B(R@a55Q1RGi+gH(VbxH~wU{U2I4Ubo^Lz5Sl`bFq$;+tJH z+}Mfe^ds(vUIJ8P2<(5%c#o)-;`!FgnalD6BFTJ?hP>{prwR&#&cmYdI1J}HfTSd$ zK-7ATF%S^N(cn0QXqI0EYO%&M;gN|aTH-u~3WTP^`N=V1Dka%DPGt_3#*X_fbYrW6 z1_eU{YSwfT_m!cYYkhq8ak;milw%(>rrS!~tUXAJa^xx8L%&<wCLtpuuMHOqr}zAu?m%kReI!+!`Mode>pQHrwaK6_Lqqw7JxTK& zH|0p(4^o|jiPj({VAGnAmM2+G6G@GajX5@l9V!;;QA(4Q;x4n8>?^@;>+V9}E3SNs zNi`=s5vs{yZpz=_ReM_DV=`Jb+z>8!%vOK8yNn%i*w}A1*IJ;-OCGxVo+HeYtfQAC zQ86oUlVm8(<$xnIhf==Xe)2Plkz=h}-%MgLRy+gwgG9l@@G??_#N5dV26}WebZ*re z$+8OyEg2v3`+ZC$Wn5KMa7KtIHS8-YXTj?8*4GnWhrRd*S8!$t z)_pBD{@OZm`0xTT?b^hIZvV2kfLKt}@&LD_7wODs4JVIlb)wvP%}k#@!%w6D-?oLe zFQKf-W~weoIPy)JnMaKL>3S`{k@{P6Q+js>Hq<{q7Y~17mZ}{Dytat>{x8PK`PyamhRkZuH z{ey!`4vFMwe=K;aPtX7=0Z-M1h8UqW<0YMtzVrlZk^o=@tLPYO9%on!F&k z9c~%?0d{X9pCmRpv}-(S{4AE<^MZV0RHQHYLRBXQznB`U*X;9%9#&e~fWNpAot&}4 z=steH|0O#GbwY{j9E|?H&it!j^XJw9&!xN5A)UW((F0V3iT=L3fI$6M?D_@c|4Ph% zq^-Y{KQb$;=67RM#?AAQ{-XPmQRsmI)ffZ{_y+)((paiP;Fl(eR z5(v70^hed!Kl&9eS*eTF@}*xh{iSD<6ft(m-n{puv#aYdZxVD%2`v;TWW!|^DGj(5 zHw@S3+Mhgm(pU!sk(}jrUyiap+&^Nzb`~$-{2rhgu#Df!+@OS>BllxVP-;LNQmu8X z7E*!RD3QgUWM@XgX<~7iR&ka*g|{6-!rvMVk!|xg6MyOhzd`oI;ieM<8-(6@_k%UGD=--dwzHYpm zui)s57p4Vdd4PE^T|6O>`}F;E?0@u*2qV>9Aj_3-5$lu27x)RP?@H9f2vd;If!l(7 z9PAy^L$BMsGiE=L;kgIWzQCK{jY7CYL=gnDfCirw=*g0Uo@^*9HGh!4_&(yT&J;At z^hJO!*8){UXvlGNc4jf^6^MxCa;*R{9i9yE^Q&?>D6l*LsjHcpRQ+6j3j0TX5~woi zN_wH8p#gP0QqE|OE5BA^jCXvz-2n&d0y;_f&wKdzET+TtmhJy2xqxMgb1NX!LNOrJ z2@42z_ggr}XSpCSg9Psz7)Z!y(5Y-*UF>$^6yE7}w8|0{oPGYU6Yz>efu{Q5GC`DL zl|%mU>&?plhqbp3i?WTrg|S5m1*AiekZzDxP>@zqTBKW$kX8{;kuGVGZloJu>28pr zB$dXY``aU;zVG!r-*vw89sWRJhM8yX=Z?MCUTf_OPyw+4n!rcB1^@xmylIzhdYh#= zLVO#Ody!CRYpDT;gmezT^PE?{K5vze;%Td^tDB;Kkl|m~tTFTzoS|tD6P|2Fw)F zslOpPqi*GabY*GN49iOpLj)OVgP!)}nG1Js0I>SJNvPnC4?av41AY~oyfLihFeGp!lv<#8$$$+22oO|$T>$Vvsit?==feTJ1Xi0( z0Owx_w?bCN!BY9M{=KIFNWZ@B_qw25W(IxHdO~A&iU?}MGBbrQ@sIdufR9;$Lj()U z63i=DrJ*NrzExCK*3{G(tj*5NnZ|ZP8CG8xkp0`N^z_cvcJpCOz>+^kl5oO)AxR3l zgFfNms!)D1h!;X{Q+Lf&9z~p`5O#r@5&b+APCc*vYi$H&^S3{qY)!wnJ)mE@BP>4t z_3OO^am+ZZ1)#vpRGSdF6h(QJqF@*yD5Nxt>ged8^T4s| z>f%!H5<(c7b>C}2evw=zR4pSTBh_0IKEVG(Rg=ObZr{eESEy}jlI)XUWTn2<^jM{@ z6zasV$`x9CTL3zh;4wI0%Is@+G;Lx27^=?-TOc!?IdAm4@^CetCMTnxd8B~SS&#m) z?vs~wsOmZJo2qx*KBwT3kT`?>agqjjVFOi{#v%cGl~xLl0A^qley?bgT+k^P3FEAG zP)5k!!nEjZs6h6w!A2qz!9hCu*Tms+E}s)HViB(paC7b7LDEIYu}(^lD|-L)5K;h8 zC-cbu^Y@A@LtPS{`jUl+w|X8Mo3kFe$&PIGih5$0m^YT}JGNWZ4`Jn|fWdH_ zaW24kY;{`@Iz&$bz0_4GmF^Quj!kPgMyo)&a@~-NB!$TGqIK`GKG?nB82Nn zOj4Mr z1vu({>gaBYCS;ube?3M2SD4YS&>ujr<12#;N%Ub~0%MThQH`5uFiRK&I!W*RWYll} z3fZ2n)L1|M}!^paT^b)zKAHyX{@?`zuqfudNLUf)npxT}<@u zu45+we+)zywRLrWLSI07SZU);C@rK9n}QPl3j)#08*{`AZNZ^GHEG4&e zzWfOI$-94p>O+bQqK3L9#j`1~y~A-GPhL8#pgoLvb$>TOdwi14m#%=0GE3#n@^4_Q z+e9?@H;!ZbGV5%oq+f1ubVUU~Bbi$^Bjg_+7zxBJ_vFM*q`4oOUSXJ;-g2}=Z`;7z zSP#N``TJ8l$ry9Yg_^$f-n=I*722!}s0hzzzt=>anQ9-I)S}ZJoJ6-rNz33>VA$p#S) zlK^_fIirpxCil?&_IF*4E(AR40!>;eF_R7T`MFy*6`%I-ad2=hUk)7p4IAF|M~4dE z*`=j+kF%95*ap!t^ol>>k;@x!x2Q83AMR|9Iim_^T7CNg>B>S3N{zrk7SJfR4?R)9 z^Eu4()HxMZje`lFvj+!@*c40GUZ?8T4Cudp8~QJxh@FLkfLE%BescZOCqE9q@QAs- z)eML4l0G>WrpNUZPzx~iKLOB^~Y9PaNaH>-quL!OMo2Gn?;ikryZ z-+&RH1b29C*DpvbXbO^28N}2duxLSbBBP1La+uIEq0nNPf00zA$e+lEwc(5=mC9If53*5$D=4e=q4{KvYC zs}5;I{<(d&t1~N*Y!44}Xt;z&s%VREEdsnF5~zb@ECFE$3|3Xg?UD(&J(xlO#Nopy z`7b7>@7uS%v$lUyr?WVbeJGoPa)sbOa14oVj@oK+D;{H50wmR@$W5ypFNE`Em6h|$ z{l(%onmwpSHXnssjg9Wb^poaCb-heA*;d?0b%)9N_L+;!mVbR1pRUi3MDw56O?p$f zDiy-rH+7rs=24dkT2V|_VsX6weD1R+9|9KHspK<$+>(z?`S@ZA7-Bx8eS1;S6Kq1#4 z0EOVT0O8{yIf?zkciQQ2X0wbiR_$SR@&lx_gELMfUhrqVhJGGxV?7TfSHs)w;uYuR z&|oj1?AWq$hwUS_Pm zOpxTGj@h15EZU@Vv$M3iOlqK+>@O0DuMGHk7gVZdyE^1?5WsIab?TJEA_7b+kI!6c zt`>BQ_UMjR7_wgSqj+Oqzx1F{cUF zx#zEm_jZea`3d$AQi`qC`}#E6I5>PmZEtOnX)+PRb8f0f$WhE z8_l7sWH(lxt6OT$fYP-wxizjX&V3{6e!?^L;)nm32lben--{K6O5gM>mx+Q>Q6>!+ zhyl{_>&~)k5A5OV*r@WlU1v`-RrWtLS{D5Dp`^b-_R5J{w=WB*+{UXrOZCOs_lz%Q z`D^3MXQg4O_Z8o=7d`c5HkDDrJN=RR<1jTXj-FU$qQ?09Uk@s3shGQ zJ(&HzD?B#I=?p151g8RH^9${BCf&XylZ+}%49vhe0Z{x$bEqmt@h-B(&LGFP$Yk7@ zWW=^AQY38Qjxc)xRJCOu;Cr1V1j7WcvmG(CZK7J3ui(bi;CK1#|K_4VP;K!iz zSiCv=Oi;+0jq4M5!?JNbwZ~wFavgAGL6Kv|S@$7z*6hU99C^}T&L;Nfa&0)`=VlbWdL=b03v zGOMUIw1AX9fYTFob>ia@Kl7ziK|z6j3m%`GA)}ia?6Mw>L7d7%zw|1syX8M`D z(F+-dFwia_USG4q`Z;9J;!jK!K`rv#iC?4rO!E<>|80jp)z#Hgx?tO}^5aKZ#K=qa z&@6PcGpn^kf=}6gehRp!rLy?$!3aT{w3z|#6BpKAuNG9>V-ga3px*LkSmT71LX-qc z-`)<}&3}ZfIewT8Jd0;P4}*0=|25MAZK30oLR${@DZF7^I^6#Ye~1=tiY7;jX2^<~ z(w~xuL6rDx@FHBw|H%V$!(Tx(1f;f!yC>+d(DDgT^OdC!|HlCC+k;u)$pDBVBPZ9- z91SEVJaEnF45|mkh^2u+5+V-tC@wA)(`3$w9ki*EPYY*Ys-j)kNa7b1)Wk@K)JyzO zJxS`y_B?3F3WFd!SJ%*x9tUJ5w!aeui6{wNGSWf5Q`_)?2zJ*zL%`%oHs=#Cd!J=$ zrvvrFc>N_5`=i*owpAH{XXU4UXP{GN0S5Yo3&dQ;_ns4OpX^n>+HmG*H146X z^a%VN2dzf|HBhWja(%#o0eFU5#;)(RiRZuE-1UkO1a*AXyZS~>lAMDfQ|}~NR}3R zdwZag^BNcf;l{If5Kz%xe;=P745%!E+6ef3k%u(kPmqQH$gY(HAp-PdVEj8fIW^A_ z5l13A;Ug)RmPAy9Sbi@o1p_xRF~!Qher~uCcDV0Q>1+(BSFhGIFxM3bNk}rZfdRJbCB6oXJJZcUkY}ct z83TFV%d5!!&@Jt-OM)T|i7m2sPn(vOR{fE2T3T9ve?Rbmlvxu#e0WP7nZ^>q&NY&K z^3M=>N!zKbt9!-Sgm^Xu(@7Ts+3v9Va5NN04CO`ydn3?w0RjSMzZ<|ouvR3`bd>_Z z8E(=m0$?(d5Z~9-jK-^PXz+28l-1Ax4)C(n_A{uWDreY(3{*%Us2)B86SsVvFtdgU z;N!smOzOlD!##QG6xhbV&VztBkLu2wSGh!paJWEIot%uDeiwi3CLC2tDJdgWC2rw+ zX6c_{4YwYWBVZ95P}0!cv7Lv(&m+afy_RvEPf|_}C`=I*c#HHPdj(iB@i82Ik2vPo z_scdj_xARBaV2gq0{@a`8aT^9*Y*OxH&8f+(9zO5IXVsw4yHM)sk`2)%`|L_oV#@h z^iDpI1~Uv~<%8Vbr1>!`i)KkDd_0hsz0$4PK$ubadd)}9!K7L*yD(LP)~byFc>GP!l-P0QwYzGGbCv&1$#(l(``KR);H%)+gRoq7ItJX>Kk(3nCYJmQoRl2h`vS$0MEw zTzuGRoB#p_XGLQRi!5^Xli2xnJn>QN*$P@rupquObZ#H-@QN5U z%2p2$MA93NzXGa{MSA1YGc-OBc>dgeqsx@cc-tP0sMnWpsTQ~M5L^)NKx?#qezZ+Z zZ6xh1=bEg!x17GEk5}Og#}I1wnrckq7h2rFwsOZ?9@Nbj%MEk2v^I^*+c&E}_l%U_ z=u_Mr)lAQEwYGInLGRkQ)n$L{F7cnYt*BNqEAH)WE4XM@#3}XXNI`BXxGwr6{Gb_{ zZeNZ+@#mO$%i1?)x8REdl$iIux4)O+W#irn+{jO-W9M^m+ZK_=R^_c^7Fn|^=W!PqFYLH}Q zY-lrjjVU~HvRzCYcN2%Nla;B9;eZ%j;#sy{Cov_7bqiy!);qh`OJM(za zA{;+IdlQq%{E5E7yaD74Y=!~v-n}~h0HY+4iSL3&$ZuQ%*B#|2*cTWwh!CYu#w`#^ z44PlsTQZDgTF2r_`Q3#plr!E0Y3^*nYRNAPBL(5Y`uadrDu3RkOZV#k`KQ05V=})( zJ0$4UtDBCq6AE{EKH6It(M!sa_hm&nfNqKga(IXb#>PGc+SAHo&Gj@43=SSF3?6Qu zP9BYWYcD@16N7l#c~yj$*Bd#lrJA#p+RQvSyfS{^6f<1J%tf6TP2FSAQs#2Ff4+vj z7f#2l)91o93Q~R5-Igm=WTV1(`Dx4auDA50c+0%I1TtpufNAOwSx#s+U^Ly!P-PXi zH6~LVV3QrN*>4G#XnFpQFaNc@zmiq$)U-5fU!MvoN8-jic1)&0>l!ihqn}_+U%#c={tf<14ofIaO7?yAtMGq>FGLdxVm|_h<)v$brD3G=GvQVhT}=FCLruXowK9>sIqxezs4)9uk)^xrE`ACL zVV|81P9&4e(bIFj>qdWZeJ(VJIo&=pE9>)T)7R9)l_c?WVvkz_kdl~cK~ znIf4YW5R@dc!Smn2HM`92h{wCic;qqucW%@qi zwEf_?&8+@(r26ni3a`^mqt^3*lv1)}2?Y)P{rtkhy+LHWg0;yz=7#OYx&>Ad#%#C} zV|&j?$geRo#dSMTnvUee<@B=Nkt;xY)8`gTz<>t?Cu8?7fJT%-QVh&7I)v=hGP-tAaru)bv??Yy`HjCEI zgNtC%nustN$j(c{UN&*(KnN)teR@`1J^Ey#mW_TaFR6Sws%J5AK^2q~)E!}X!>!-Y z3;Wv4>r&&1++^ffC9u)yHz7r5>WJuR?dp=l*EdRP!xlESIymK)x0I`EcRRXPySAtG z?E@R+^^bWDqb8JBrXD&vmP&0{HTjVU)r#-_9I_c>VP%hq8#^=ShLQ4ok%Mn6_vUr> z6EzP)4I*&zn9B9)J9`^tq6r^1p=M=2SUrLy0-{C;yHO@ACMG5oM!yb)SR$Zbxzf}O zl@%KOnDAp~7vd7zoeIv*yO$Oem1Bi|rK@X1iT~-=%EMK!je}i_JEDR@F$Q)CUdhBD z>RPs^4h#*?Gg%$0@7fRUTAJ;IVDkt0RSy+Py6 z%_*dyTul(3e+p{TkPy64PDra!Cu0YOtisTRE1GvGsc*TjT$NfTM%0Jg>yd~Y^n~No=tlh7C1ZE zDOrWHSeR|k*b1bLNaE5wwl9j~N(8ziWGG?mGRF|DMsr<>w zYz|yXlrF_w#9}FirSjvn6Bdejs)I`73%-MR2O z7m5vlkb!X`zN2?6!`M1SNVS>*_c+r#rUlw(Y%-W#3(5d;DI9 z76WB>w&~#qDzJa;E-WtQ#^Ef!VWjstY}EYx+{}#`W(6HA^?Q=1r<06t!U(OrA|Kg`dW~1k@@!4q(*i&R=yFholPDXvXqpOe4U;)H8M(As=TW{ zJFg)sG+b@J2*M9c<;rdZJ4U4l(PC_3k=?wL)6*N0x?LZz5Ha`{c~gd(NOc}yn6@xcNOJv2B>HZ-cJ3 zm80$@V7YcF>Vovl+pa1hWe+uxoiG{nRrltd5T12LQ?Jzqvq@Q5zJfkfxM|f12_t*kSvPh%j8I|kQSdwckV&nZ2Tnes z(SKqDoaN)laqv|bIXE649-L6KTKV!Zz9;$2yc^$}1poLSvFJw#FCp=*-w^3T1yc{I5yU0C;?i zkP7k?K%}v<@>sp11XGgXuMar&F69?7`8-sKI{k7Sb z+_kqvl=`WspU3O|8jOHVul_36Y0rxq!SOh!y}XX0R&o+VW1wAS%~S%)JMulxJ&y7{jBuOVoDxjYftNAsruKHsxuFYNsRxa3?zo!1rRh@qUS9t`6 zqjDnn-_Oa2Ce|W4T*7{^^&@_B=}vRCBT`@h-~MXHu8E^&weV8yYuz(K)$TkSR5?^4 zGO9oEcleYS660O>tW_BqGhp{^svdLYz02sn#WojZ^%*QJ`sQ-c=-P z)Z|vYOhExgKNm}biC8uI<@mv_$3OgAn;8+wP{LJyag_}!jScnXfEZz+iMT`affRpG zu#6|GY$IC^_II}Jmo)80%2*r)&gI?EVn0Uo-7salRp{t;eF!8Z8R#W*8DwP1aB&o} zb!)o8RKaP|*Kl!2HEeon>i%5L>({4f@)-TO5YJ^)Ij@{JVQ`zzX3T<^mxX|c=-q4a zJcocMPONKAQL~jic8%?E*x~KqcXr#vziVgA1$XAVF|SL>VQYjeDXICGd$k2i$BB_! zjT5$Y#|wI!yP(o}7dFa~5_W9`Ny+O;)XWwY;i~s5$0}k)szdKas$2G^E_`}kn3s1y zbTex1ndg3ipn^jE7lisZLe$CVsO_Ip1FW=%e0alS5D)LN!yAi57 zmqBt>HOEh@tY8r$g95|0$+2nxg+9-;ja;KTNk(d}rFlUaj$nI>Z#)(Zm1_!GS%s8h zrv5}dH}Ux$via>yCvSP|4G)txhdXFhmL;S=UeYYdRDdYp?n4;$rRY?SZa4&h{9f6*ixZuYSegW=UBBz@hd7SIU zhmh}>d0p0=xOwpd+842~b5tuz^uTWwi=4FJ;Vm=13s)HN_rE8wBxAiSQw|;1e$cHk zvSWC*^Sd#jkUm2zAp(*PbMs7yy%My^1$dN9=Zew>-ji|^ru1bHQ1BP{t!WM^j?|cz zGcd-&(kY4@^IU|ZC(aMYI0J{pwv(nyXl=b_U2g0k2CiL(ys9pP-g~p zNg1NjG;#lIo%E3WAFVcu#i5J>`jc|6Dep>UxmIUGezLUW3Cm`C*&TZfVrZuwYIJvZ z`L3WZU&uc&=3O1ESnF3RMcgto%gD`D4|*|Hic8s-IMpMsGhA8jufG~ObT=L&5>dc3 zG&opbp&@y@7#7Q|TL#M8BvxELeoM3ymq|6V9ak?jQ`nvx{A}GL%0qollnbzN?NG+@ zrgk3Vd;BcfDO}eZlo$vt?(v&9Y3qN1p`AI08d`D=X$)Dcq&>+tq3KnmP2C$Tagq@2 z?VYfd4SV^!=lAC_4!Xrgg!-`NN6IgI37DmS^YZwVPkIz8!#?Eor7)wo%)Kus&Pqw? znp%L8G7;kWDP7p@x_7x$AxQ~*j!IHma;gxGEiK9|)#os_c7?yZ#`TX2&oz+Vw5mc6 zKGWp1xlD0&hPFk*AFF9raDBA05yCezey#_*MM35c6Sap#yo22Iy;X??wk8^mz`MMv zIBj}vs4ye5x$cRr>&?y8=T2VuI0|wj_ait{A`%i}EGcT=7@)yYA#&4i|6a1cV^$06 ztP69o%O@`$$jYf$7(@!?ntb6J#k7riPjfOECv*#LUEHLq8J+9r6?v8{F18$?_Q*Kz z8j|j^bk-TiwB#gRk96cYiUQuU6of8!AxyK_MT+&>-+QvNvQWi+dW%BO8(%k(62 z@(i>JmKD>48|7yE?|Z7BWxYVj%4;!an67DcE_8}iSn!6JSWg%bx{?ewmaE5#TpU$l zcOfE5XxFnH2H1h7;SO)IjEQ+k{N-zV^S$(GVIq6E!5mx(nCc}2L>nr_Ri39(1&F=8 zTXDn$94r&}Ojc)>5Lpi$OWj-v5-_FC**Y84-|=0_OpDd~wNarBS{XB{*xoB{r)C@} z&WU4^i6d7?5Jy*gke>`{pe$wD^bv~SS3dLf=-Ka{RaUlzGUgB(ew38-uf{{&GP`-h zZRAF2L<*$XB*Mcw&fDt){>yQ%ScsDk=H~6^1f-D)rjZQ1Wgd~_OxnZsHe$iI`j<4@ z0G%6fEV$){ux{z>e9L3pbhInrW4(`!pCyB-yEtBx3O!`FC1l~~ifr)5=0<#-Zb`_> z%2LT$O4Js=eVSNEJK4VfZTu`2p5EOnk*Rh@OH0i`poEzS>RYfTezitg~%X6Pqe)uqgLHUhje40&76m#B{G$@Lo5nVSja&Ez7rcL%% z^7CD!bY^CTGblrzdJZekbJDOhKEjl(rZP9NxNM!7^rnzlkAVK1fQ`tZpvu0^GnxBp zJc9j?MmVrpwTSoUb3nZ@9m$>XF!`Tn&p2XZ+w8W-sv91rSnQk_H$hC69)lXSf*`HvgIQ+1nwa!#SIV7h>7vth)JSXB$j3=Hy%6eJXg*7`uBAn0*kQ@w3C992slIf*?8Onx*YU6Q=7}QH&TwfDHsE(974-F0Bv6$20WD9Y18v}*fZ=tUx#cf|fuYo5(l7-*& z3!~!CJ@A{SW#j!zbbl@Wxd1M$)Af6-5|R^chK!8A!Y0n^>710%fO0jC`1;-r6hy3UC( z_v&5CdqpX)S7!>}`Ys0gV$RfZ-esaVJy@2X?|S!cX*4-+!bfv8fkpJKLE&6JvcbM_ zQrGjoqq<}wRq;_#9!wcJqQ_A?n$2+M#H3hE^a3mFwfh6426Og><@xIO^*^ z6z1h>Id`k5%J_a%G+}WHcLByZmF1gLZd08yjrYYk1v9;|FzY*kC4gcZ*mQJmEG}^ikUsCT6K0jqPtvPBUe5+$Pr3TOM#!~$XI(4rN4$HPSJ=06 zR5|*%?960C|M?S@Yuumc4L6U9EzdyP?wCRydkjirCiatw8c>={$sjn40;EJhmnN2D~yb<&2CFe|j&eRy|^)iG}sS#}F z!k4QlbZsvs2E!)IrDyDw@x64=o5DVbj9#rx$FCLHapUFtl}l@sg4L3zN-@PcLPOX(gU2J z|CAq6TsSD;d#S0hI87}A!N8OmMx9n{CBL@0iO2g2wqUg!CNNKtLaL^zl-XXsk5vfm zCVcPkD0yjRgh_Z~DOc^=KLk!zr2u)Jxsg#%kwsElR5`Et1ODr&nL$Kw-j9whp`*v^ zxc2Gr7#;8gnyvsM9yC~NJZ^XBmWU@6K9xkh2^pI4+V>qeEu=xFPx(QY;UYoD$HGEC zf9%jU$EP=Zf8p|VC|q8!e5BU`KvF}DHYGt9!a^sz1~^DU=@s=4_Eg}M=~W5AdbPOl zr7Oe6fY)L3GbV9}ADq{EG~&9Z1p1`{nmxQSvBEEjdS~!X>?U7S#fk`uM zjD+Op2h9{4?r%OGt0W0LG!n(9duFOXkUjcn_E9V@-PzQohzrO3u&c|MSz6`IrrV#M zvq{PWt1<<^afFICx!{dPC2h;CL7vJA&F)8bW{=vV4Izif%Y{?UWYq&3p|N#K*hK$J zF8>7O2gab}jL%k8j>Gboub5a&))VNXVECq{1ZsNsZ!!1^<4`b0A>ZVz%sv9IwO;Y* zTRxT{id+c4s|6V2BTbHbkQ~oteMwWiQm6xSj77Em4$Xevn>Cf*#_ueztQvp9`R5u| zYTQs+fqhS1Qo#6gwkM=^*bdL%p{qrsmB}sw#+%sQ)C9xF&rSS|;`aQBU(Eza=5)r2O&PQJ6>J zppcjfokysok09*6ylq%pNmYA&D^DyVc)+^i9?@xMXOh`3HQx6P#qDa(AA%)d`ZTu4 zLLx@ncb4meH(Z|PI*K_T?ib~mpz_L*)c6QKKf|j2P!S{1e!6Ftjec8Ocn*(qV{Whm zV1U98#7;FXdu`Ma?9&KoP zLAUNi@j(OQIiAS1TY|SH;D%;ke^oO!7I&beH%Y~_939rG)T}7+jgN1-Y7FF$c8hp3 zV+3lk66%_ou7zplY6P>f1(_-Y1VMrapFLLqmu`-;jiZhy zp`wPfw!L<Q)#rLre0*K)TEJ(>^tz2u zPIV_18HNKpK($E^GB3N!+w&cJ0Xpu^4jP+8T6 zLXZ~B9~F5>t*1Wfi79XQX9-D%*#?n9^TIa@IxQ{W+xIILE6Ye2id;fEFBjU_6Qc_Ad ziz%g{A>wxMl2B>3`_9@U$G?J?rR-4$Gr^nN~dk(;+f;%=b2GI_)skfxjNl_@F1(P@zeh9xzrqNGCq#m ztdP*H7cf%@@Yo^>zRnLcP>P(frPXK8b2$0V@fqfEO0%-?Z`9abgm3Z~9Ylpsp~=8M zfJ8cXxJj6K!JcPH>wxH7p<=`?xz>STWGT-bcCO#`uWAxR1BJ*z+SoBnc%4z!U`wyZ z@X--1BCm32u*4yP#5-k#Rho)_=Lf4mL*067VP)fNLWG$jp4jB?`f7Q6U4u72-=I## z4XN(2o)n2GWjV04Ep2SPxoU@ldrnGFxj5f?nS&RLXeoS2PK|J`AtBB_YtM!2iN%{o z#=mQjZoGeCb=^8664v@u+#OPKR+3z%O7>qrsn3*KjE~NWJMAQ{&zI{@id~B}CAD>E z{(MO~a04cIM1p@wV_O3K$DeW1sfXhqX^+SLDLw`>v&G&Y5Kj2%rS&P^_n(If(v$!+ z3s>!W_pVwbqrdb?-)xTPv@i9x?v%KVpS4%=jvM< zZ7PK&&(@uslaINQZr4}*4uJ&wZc+apo@5MJR%+}pF7@uU`C)<66r07B&)1v%* zlcAz+KqX0dn8@&yR7N6xY;J~#fRCw9xx?n=ADuQ%^ib&~7an$pvl~**s~4Yk!1_ zQES}TTzkxGL^9xVcV2>SL%B3Bs@!=T)+J2Cki|FS?}#Z@C*Lm){ElF9zkao8i&AA9 zreB=|y5|*q6=|kvC@Z$H2?<7vzg-al6y!!LQ1UOXbqxca^(FcG_uAJd#If0rYbXCa zF){{Jnbxtir1oI{6g64+G#o#vf*N^7cIWhdMKM<$tCb#n{NOSEZ6fjD*$MZtE`IBY zADrYx=Cf{JKTXyrMKXZ#Nmhm6)5ih2a#kf-t*%!)*%H+*gMM|mwj}WsDqcBI<{3dn zEEkU=mT92$=P_m6RlVc;*3W<2x^qLij$>C3ahAV>%vw&&j zI&wO0u{GD%J0Yj8_CZfG_knP8ZEZ_LZyQ?*@34wJk-CeE@isDhV}plEtDC*Ddd|}6 zKk>=dgBw_YN~!QH&dxGrkZ^NdY>?>q2UtYmrc_~Gao9}nB@`o(Kj@dfJ`}K~64^Y? zSN~bHFrLe9fl7N@s!x~^9Svq^Gpg7=4P6}ABYQGTrNfJqu_-kndSTEhOi!qQj&&!( zzO5l*qM1g;gURr$0=K?;Y`_MuZfPvu&=6$(1;)YN+jMCdzsxInF~oCH?4Pr3J+M$!j3JyDUss&oP%DA?721NsxBvLs8Us{^P zYK~|P&KS3Jp)1SC4SS%m7>s}J#|Lif4|Yzh^nZ@)=R5S=FvUP_M=O5=h}wd zxM&Fm^si!JtyC)hO5T=JH8)mZ;&@p#0sA85??nq)Z&S~qxKuXNU}<5Y^3O7}>t0J^ zp{e6raxER@r@)PpliM(L+}~jddLj)Z@DVDilXg#b%It(-NhAgy;Wk0dyE|dIPNI~Wf zv2k4k(}|}SMGWmBHQIP*SJ~0^`cSjvQf#cSM*cOYT09{3@ABd(31Ym)V`P{VY6p~J|E_m(p|2LH|1K9I zI=g%5&YTH_IOT%QoooLpxN^PTSY*T|{SG3n8_0i^R;9(HWk|oz%-sBM!P0qiqwwR$ zgX!?s)M3$#wd@9JJfV^t17=r z@ujyF6uQBi9&7-qNi@P&TW9f#u+WhEAjvt8EV^oig~SgG3i_-;17HDM(G(8wKlp6F z2TbXrqoYSXiJh&o;5l`(O2m2!^VTT-RNJjls_yRYrx~XqQ$`c>(4+zaI7e<`Vq$G= ztt(%L`Q|fMw18!KQb)0X;xmp<0*YUOfAh-kt9d!44a}^dmo#*AaZQf+g98Gm(6$e1 z19?w7Y6S3}bM(0jSxy$t5xK2I=@c}~Jt9Mcqy+6ZrTTyQ0IDA^DpfrC7j=oKuRlNE zB&g!Rf{wUH%wn-NT<>e}2Y0z14i< z&jq7xiDUyY9Q}7=0LYW$^m}{@AZ{v3M^Wlg6smic%i&ppsQE(ms%b9 zdl!MjOD7-ODy7){8LWd_t*(fLk znKOE0$U2C@lTjCkC-_KD4~+G($OThXzb`H_PXldVrMTj@FSKnhc=*o?Xb}<0tO4^q z26~_qTmwZ+59mNbW36%b`pP5W?vKh(_WCe)?RijSH zf842^pl(cES#pvwTe+gj^$XedbVZH;O@r4@>84_&Dj7Z$)?)d8d@$_mgu0cCYl z)QtU6S(Y!g@p=eJg~NAYj-#Y*2mDYwhGKX`oUf5 zkOiFket2?aY%3>g^r#2m(os^5g9HeC;OOsvsEu&bfGzBeFQ zf~E+d90IpR@j_3X+y= zI?XcMCLFPr+h&M2qR_Ah7@&pri|S%xoaX=R5qv?-JDAgr1be$Uj9e{p!O?M}zN5u&@K|Q0*A|P|oMeqe3IHAuL)>pw2*%4f_kO zjJa-VfeZWgJUB)tPQj&?k#Lx!%A}~T{`xq4!1u`t~7*~2-4{D{^i3udKh1JYgzl__W z4y9v>O9}=fq%4q6f%&f;ul^U&eu_10_<)4Of&?p}){Rfd1)r{f)jLX^QRWHVRCl(& z#l@wQeSF{BtF(TGM+j_yGswk)n6uJwB^XjQj8M(fHZXbhtInW}ZlH7&sNwpbmiN)` z0ccKnne+A(^xZy^-5veFZv%IKxuCa^@ znLh5wTLAmvGH|3(ZRVWTO@-y>tq#I5F1F=Evq2EbGU-%lR)V0XG6Y^*-^yyeNa5>Q z5pS) zqwQ6^FA=ABGq?hQUataW_N`F_=4bP;Rknxip?WT|u&{veunpbl60{Xbl!EkJSyBZ< z*4`Z!E9@DAqT-)yh%Q`vDlrni}wPngG!u!#0ajY5vZ5B8_dVwAu>=H<@O*8#mLUV3>oFWunhhmOb0l$8HG zrm*v-!L7`z?M%dm&PA|6BiGkM`=B!$pYjQ`yqFX=t|~fAv;Z@I{Z3A{lgQEJ)`l%~Un`4S3HjMa014;xn($uQCY|DbNLFM2v;lk= zly?46?W+#qT^TFXCw)?xw?dA9h`^u#?g3rc)2YVGau3j+nS%}+?K+y*2KXII>yDJ! zwGkq~2CT0Ix&$`2fO5_i)D=PUEjG|J!fxJ&X??awq8VD*#!G>^ZfY6~hndtyTok>$ zk~fTzQz*--E4%?y+MHa9Lkf1#U)gE09@CLNQun~wIAZA9s>VnC73c&(>mGEF8V-6w zCGA8zWaZ{)@N~GglVsSnYuD^{t+wEU?0xmX)*tNaQ(krpUlN|flAdw${26D6O?q8J zyQ%Hk{3F3%IL`?wbbT5J1Pz?{p)wjmj**_IZsEnTf=Snym}HbyC;~X=IFnTd>SW*& z?LjY^h7xq5T7v+|nZvoQQ^vv!WWNeu5+!l_{L<(=^{xF|t?GjQQDrU$Sw;JG zm7`hup-B>EB8;VhsU5@%h>-hY&huHtiGJSR-X-4IFrE8B4GaO6QXzx^*ULE#j3Y*m zW&!j-odor*JF$R$=Jz*<<^~G)Xg)E{K6wj9*r7mmvm zZPlpIAMH%U;L-_d|Dp73cGi;`=MnM377Hv z*qaZa`voeV)dk5NOyxe_9Pr!hb&W@v3&!b}gFh#-8^{d3b7k*LqzGo;?a=l?5Eus5 zbC&k=O?rZfHgK4<*(yuM>|Bb8i;H_2$ONX)#%<~QZNE06Y6vQcxlL0=e^9MoVXgG| z@J-b4KtDY$FBF=fre`%;0_u){T_>vTb`BF47oXpUS08G9V9Tv`6G9zMgL1IVLVm;Y z#t7{KhtI-1`}qKo`y!PF#>T{`j!09B8oQXroX|rRB@KqWrpyyG+zD_w6%nY`KV|NK zp1oZ1Soh6_X(aE{WuaB+q-@VqW0zkdfp1y2_Z77Js0LY$*~_n@h#gC}Vxdm9Jpb5f z_nlZ}H--gl+f*hn+jh4m{p(ISg6y%;9$H6#CCE5&p`KOc)YSGh@oi`&4U^rc4^{C+ zWu1Rc8gRLoJUY`MnmMYX9UbJ+B4@lm9nySM^zWC?p+Bh1>2C&LkhvMMx_vR`W^+^Z?F`P zG^1!GN;OYj>VHDzpcm*+Ip{g2yc~zKf4#1dP|WYw{S~VH95l#2qi_6@Lqq-v;o?zZ z3gHqw^nc}n>vx$R1B9YUS3{pTIX;_bw)-!3#C?@qa16%`c?N`D7J+|_TixkvEXxWHlJ zsS0LWLxT~-fk>~opPJ8i(b26}QKLbqe%1@zdX=DY9~jPnjYMgAIW{5NS2$Y~$no)M zr(tO;WJKSv7S+yHFO<@l20x6vF6d<_sR-~PiQv=RJrfX8K|p3_V}o2-dG+d535db* zh*coToQ4?&@sCtEB;2P?o`i;jz4)?rOx~}2eSh+?4Xrk`qhMI*y&&8`>Cjs4pjymh zaKNp57H{y-*mUrpe^9SIH{J*$@c<+=TWzudPtiVx4;qiuV5jQae>(w34kSg)Eig(5 zXqvhwNgNoPsadKpCDnY#Ik7W0vi~y}q~96RFNN474_!h+!pv+Q@~4Q|2XeX4AA7Ji zCC;tc_9O=8yGmHautb5kzg)Q)%T&GAEuBY7L`2^Lfw;1E0fYr$pCMfc;R3OnPiseq zeAwo~V8W0a7{x%Z`b3xdw?yf;b0Yg+Aa6RRHG?B*s(G7CgU#KJ+t(tb;a2ApK$rsO zl@4KKH}n0gT9*~H@ra2T2vpU;ouAFh7?v1#BFyE?{XeXIWmr{f*Y5UpZ&3j;Q9wXJ zx}>F51f)diM(IY7M!+H@M7q1Ar8`8aMYlAP5(}gj(q~LU-S78Z=lnT;xV&&N*PPFM zo)P!B$33*X!N+b!eg`dpREs5MJ0+M;y+SP5`pY8OF5sX+BzX3jE5xWEFw4GqLpV`g z^HvToG~+6nb|y6!KbwYmh?@HPsbQwr$Y`m5n3$O4U;+;#G94^}#}%K5$TJGiH@Gj@ z2oG=KNa}z67~6e8w>8S7s|})Bszz9)p?srYmOO~~8eiQHrpG#Q0)j%JEV!gazBNo+ zn}pQcBO?%8Y!I07an+k_iF(i1ap3gtAEy`4^Z{wAL8V(#kmTF? zEW=qFC1B1op8oRoLcdS=4%qtH>svH5G=N={rx@BpEV}O_B8QiUSm7MO{lL#C9YMO= zF?#U8@RIj`Zv2M?_dokS01WtT(<_9ECr9{@KKFz7REL`ZbD3_09k_}8!+K)haKZLH zcohc^3jc<`K|n9i^MS=Y_=W>70YCTC7?N0gy4sgVpCx@i|~5L`9i9Nx|m9>xQ>p)yATwuSo+d1Y!|Y zfG$aN_raW}c6Q|-lXM3}l_&B@&yy>U~X=H>YplYRfx#2Y~o7tqE*? zCzsp(=0=KY{PN`y4&6IXSWM8_wrKP2%(ql_+z`(I(D%iKk1bTL% zZ(Z*cRa86|;Xq2xr-9!v%-|fh{R{>e#`!hG!r;}&$jA~;ouW8(QcKQ+(lSIpMkWm( zyoUEx07<@kln~{A)GA5y3=s{BI{_^f+%OTj{^Ot9gs&!X6Lfd@Ehg$ge4EvH8fJ^0 z_kklEVE-bP05V1Yu&`7W3v@sGT1-8N(x5c*PcUgzY(wf4qQpGVKJdYXxN{Qh0H^8T z<66JpCh(UX-Z$9$8xu%kusdCa<4zrz+=HK>XtN*EBas)^)0CEh(NX9EINHXOp7;FO zF8|(Mpj7uF1-nUo-(i80-T(YQG#e{TZl=arw zrrI)-0pnjXARq&`j06_C`VFL}Bg%P+viEn`eAzDl{^A$BH}f1WXHjAz3u;nQwnfLP z!_W!Ee@Uo4#%S(8Bxt}DtCxp<=e>h#l1--s z*>J9-myu^g59_~fYn7?nj_9iD{{0>tti4i1qG-4Em3QfLd#ZrN94dW9uND7r0}k(& ztl`@FL<_~;by&QC(fc(vB>8D)Hh;a0&tLHUJ$o-I2J&J0egFbdhS|<7~Z|;q- zC9JBpBX{_o(>2K)RB%pBa!-FhP{BEJYf|PZ52Q*RbsMI(6f(^(g312%yxFkoNF@tk z(}P<+^8Cm#MWEz^b%87G?}z`pclN$_VP8q-;61?4KU|p4g=PT%lai9AOh_RP1>Z%Z z3p?l6lfxK#(2#<{3p7^^RXUI8yMVTt1Jr;FH$J__f_Vg@_wU=L@aqa+ zB#_j43fa8`l5u|Q342uGaCd=7`Hab*o7R)D8_>W2ZxAIL>y#4M0XxQF{1xWP7_ho> zIPY!)`UO)X?yYA94F+}q5&ckgZhIXLMi# z0ArBd0Hdi4{qf(w1M$hbt?glRTf%XGPIF=p!iBo;*0}3u_RsJBk*#X8n3dk?(~EAv z-`U>2XAH$Y2IBYFKcJNIq^r#yw5nh@Fk=2(z%nB0c3+&4f$fukt@u?V13fLp9ZyKl z-}f>FY{cF*iJ`H8mzP)FX#@IEwc9Hp+!8v?q*`=MZT4&SH~_$q(IoX=n3?t>VC`DY zGw8fmo5x{dY^-iSL(xE@jgyEM7fGfCemhVAJzTCLecG3~xoy~fE(5TBFy@}iFgdjP zX{qr4c!Y9D7}wTv8P!V40AthS$)TSGj|HjIWEQ{~ou?~zFe-9;5cFF#2O+K=W>pHM zODOxF24OkO^78p^W*vPpaUE0uNNZKx_g$E3dX8%Migj^uNtuN4o}zk?WYJns?5omE zf^1ru&0>^g2TVWM%eA3=Di^r58>Dpm?DgBngr1W9U2{t4p-e=L#RDPp>SL$=xzluA zvXOhLyJ^`H)$~s3%-c?w=BSmTG;2Pu7*$El6+?3?J}z=$V^80%S50p*pEJAx{ew4p zv97h>)24imxW}|o$_TG^x*JWbKx3o|UVT3tzM1D?pECUM$?J%0z-Zx4mwzxhZ+P;0 zfhsY39;mv3z?p|*ipJ+6s7}z3UcEZ_!x>Vc$azqjRu%hHZ8 zYJn^MX9J}3vQLZ#3NkWdb#!%i=QQ?a0XBqu7jVvv#l7;zJV4D~SBG<&1?_-MuzLFR zmh*0zo#56wsZGZO#YlJe8r0hqBt^@w>l%YDyQECP`1rULE*fSLqtN_1pfGg(OK+lYh_9HSm{XIbGWf-XA@y&ZL7c zY*ijZW)Az*X?v+|#A%Cxj4TeO$smjI^NO-ix$N}xGy+m@ zu!Uu0n83WNh2Tab7!&~JX}PVnbrCW=7*Z~l3kL{f_X-R;DHEIEU};Z}>|!|cU7>!k zrXt*h2Aw?^P~4FH-~l|Bm9$wA94(%kH`|7X)pt&YdPG!1_;P0EYj(VB9D5$j2(@=` zXpByk&qy8S+{XcX5|~j$?3V;DYm=5xcP4{)mIoU$iC zz7i@V+8ajmi%4KG3nyA1FT6YmrBlh0~5} z1t*xS&cqE$u@)uPUcmaj^H6OkuLo(%c$=bXXQT=ck%hxps}^QEY}GN*322xMh(%qS zQyp-+#5LAAIvm}DUg=CDy*Q=z?d|bj@z)i?s-2!(?+Ud_LoSvyL$}3EzP&jGhu!Hy z=cO-@%T8=A$&JPr?H}<|hkg^_kJHi9 zL(?7H6(~Pkf1_B}CM&vSF?jV6JvPOm%>;Snvv=>iTnU?4O}gis*IHMmADeLaa$IB2 z-94E?Ex08hO0@Bc!tdx+lN;&Rz4PXBCTGiRw;OyQ>cK!ahwzlz+ENL1KAdqU%4|WtLc|)b}HtOD&Sy$cSKQH~_ zn3R~t*f>#`^1T96;`hGo%h%cSq&d|cMi+)oonM*6MFsT61ZKr5b@+NjMmBsDjBhPIG$IUlfIsWgWkK*Jg?Vruw?`tzT={|H%#bE*IS$~0{$d{NzbzG7N^Hjl`2Ln}dz z{tHh0&qzDM-z@t*;UBW*6+4=)Foup7mjl$lPdmHaIg z-lNPQ@bvMA<%fJX`N|V5dzzacZEk(SGS3mghzM^swETFw$W&n~U+9G?)bRcDZ#-jkX0{z#`~=9T&~p|wvcb6pq3q%9Gb$$uG8S#24rL4i4|3bHHH(RE+H z%Jx_AsXN5bANyQg2J;?QcGgc77t`eEEeu*4^{jGRXa~^yM%$+bnG&o$HArAn@A;y6 zGDkYVJ4rH4d|fhMq;MygF%k7N-;C6DMb|Z@J)E6RSUzvMC6U_5oQEgen`p}*jYU5p z)RlnkcIx@=jn&TGPoGFwwwl9x0oBdwA~({I@n&Y%Il&5{ZWt+FXnL&RXKi-p9s830 z(L1m22KtsgeWIBtaLd}*i}zxwxP;eDf!uXHVasUMlFPZ~*!d}s;yqN$QJ6e~3?a8J zZW9xegxoZFzRpZF1_PMv3#T&Ss}ePaOMQ0kUSV%iRBtUhz%Mpdsw-=;*zQ@SS*3UI z8QRF4gim<+u^Fnx9Ra`0z*D0BkzEc&`|EqOabyEIG0a-}rPjECEdG=`A~pe$Ikq5K z?4Ev7XJAxZMEldkw1NGL zInFm^d$Q3Wr`*zjlZMGKVc?34OwtyK04uqH(`t$3DGris=vzh(~wa6B4_1(&D7 zBPTDil%e>TSy>&Nb?>b==*((ztT2i|_NHB5?h{DD&nrf_(m++-+;l(tX#1OHH49|r zqXSYCqAIr&)9xhG8~hM7(FddrK@|(3q7S$-%-91Y_rM|WlDXoOjy$wye){-(%$->D z02ZoXGl_mkXhMXPk3omSWYdR-71a`R4bPm20`?)xEnoT&7}XM>nd2&BN)y5@<}myZ zwq_tjPEKuqp;^(=SVxiWimR?_ae|;*71*SI{vl9TZ}G&pqVItuCoMPK)zMKcai@kb ztfRBsVUb;Z{w@i$!!$}b;Pfwk*Qau;7c2bA9DD}?C~@vFG@3>4fyxRgBTMH^nd7(Y zE#KJ3ukEZmP}7+W)rN$!n7GuuOK^!#_AUywZTGmu7wuFMb<(RytToCik%Yj%y1Gdd z7tP<~o?;}uuE`h~n_@Lw!PnQ*qdVJ0&C06zjXuQrUGM@obGOk@By2~zI}Uaq4!58I zdX9AOr--^b$$n^11;Nl|rU&V&ed>erQqJ~bqHw%Z<*iDrP5e@XCR!qe_Ue@79ctIx zhV7D#vPt`b+2hjE1a)=kSVd+SeL??`#swOsGv+nG4Pc!2h`Lly3;K7Lc}r3#-7YP< z^}#HKMX@f8lcK8To3U!nhIN&P;414s)^8Pn0Z_MWpMJ=UrMZx;EvhHOs@XuV zxO|mq$VzjH#`vR5VPvutRU@lSUk=GE6+`}do5zk%hu{ul9n{e17Oem(H#0S5{IzBv zh4m;XWXzy{apnC3nnq%oXhCeeb$H`)@=bcJ{8VXD?Oc zD5pxnYMM-P*m5=}w&QKoU|DE;qWH&ju|UqBp@ikt)e;0)2I`eg*OL~)QV$nZl3mya zm3K**#Si~o)E#xZ#7GNlp^XA*6%``8A~5hPtPUe^T*KI`n2GWp0_bfhEVR*BEG?r_ zPm>2?G-LT@BTrKdzqj3-aalgzSAwkX#jUGMYgTasunUv=2?%DU=jK4KDZuM#AniLc zV_m|CApFqxXLnCtL6}W7ZSv`gzJY;jkiJe$OhAkd5F77lSISJCkBY_5sATZ%P@L5+ zE_PH@oH7`rLTJ(GEVIL%#J;kDZMc59iD!AGb*p{S>elAHD&z!+L+>)F})iRUw7*$u|#&}ys6sdABB zTe`5)2j_j0yB(ds@IVI5>-1c8Z})n0m|XPD*p1bhj2hnN?P(!bA>sLRH(^k9PssV3 zhlw_ci$*%*P}T>vqMPlHrxV3fPPA#gy+W`CL2^h_j&iZPC$B^Hf@JoD*Wa8)IFtw~4jIR%!(tm`EN6e`JSX95uyJjyEZoj{mPOm#vudG}RpK0OCzkZ)A&#(^8PHE}jzK~nj-LbWoS1-vUq9ghJ zl_4x% zInzZ$&0p~?MW%t?{*S9#ydxow47ma-CwTaLzb_2$4SAigp!=^A))KjA^fyT-r`cFR za_rMA6B=pTE%`3EAMJS$8y!xqYCAo2sazU!aL*bnYPtiiDAt+@f51{ zW`4?v^k-Gyn1htl@3hJ76wgpG?SyFhCyRT^#a44Kyu5-EKO{WIDvon_($+7%-rp4v zdCT{P_tHvQ9Q7O14Yg8NkX50g6fXOzNkm0eS~xswoK(Hcp6B<@M-C_BD@VW*jqu?a z%3E&e)xd-9zlK(+z;}&f5}1j}#1kjv*?%_A!QK<<2tdncY+pEEjk1tNb9WRS!!PJu zo|sDd+SfN&7)?sOHH0JcTD6wDS?ZpW{UeNc^>)Be3HwG<=yZXZ52u#?P-!o~U%4bX$xBQm;WCQo)-#LR^;x+}<$RPMza!xXaXXo<#Md&(!njwj%tDXZ_D_)i z@zc~Y0%Pd*#&!)oa9fQ|oVnXd$6>1J%1mUvV7xGY2eD4&MR%`N|JpZh4$ez8xjA)@ z-&@r+OHABjDmxn)(ACx0xY0lr{qvjK6C{YyjkQLn(#fx~v7bX_q-r`m5jD!6Y{rRM z(Et7*^gOGp^`saen9XA~kpXUCQ3L$?xp8S_cV<^-v}am8nF^TM>60>_X2cq7(e>&{ zNW6gV@XE>oDFN>uVp5s6@6OncdpoEp7TttON|@nJNh_tyid+d@D!ml*k*SlDZHaQs z1RIp5K=szDzQg3_4`DLn=CDf)COYO!;?jMj_)|j}Dv^toQuWP}p^*RK$0PaQoX|o3 zM>D6O#0(H8q8C!*Y% zLCvEf3L;7Cxt^Cf^zyx^eycKLV4YeoT)h!D5GUmQf!bMTZ?G8MlRiT+b{%^)IVzRH z0p|pwQaI}-@#gDzax@0-4CZ|chnc$8XV(hp*rt?=Z5a;f5C)d03K3^X)O`?@mww;kq^%C5|yyP^~4I#v5RVcF7?cVj+099(=NWKTg zQ0$hoc`lJC>`fcjbC9mqc5Qk`OX^Og4Q5dvt+oa$Vk~X(^U2tIti|2XK_fjnWjfC|~H9;N0ARiuU z9N+vToFzwos^udce-6Gq3JGl%ukn%V^2LUthBd^lev@ntM0EROuCL*Dl<%T1!R9#~lYaj?Na6 zCAuc5#JZGI7v%RZgEpWwn^!Vu8#cC(P&orWQ)o}8NaFPKiImJGR39-hI>8HLnvpV> z`;|_$lwnyWD=HakMKm_UIJI?6UtqS-xSoIL2JO%#7jj6Q_nj=B=CEU7xW$}Akj+2= zZjg5cpn{Hipa3LDh3b=E@(Zb5AzR5U|hhKMi^5^!-dS=t7*Me5Kl8zjqVObtU zaYvp&H~;yT$#X~=`>wE2=ZOc8D&=aDkv&h7H3!i*5&iEMu+Cg$up1vIf>~V*OpC(~ zpHE}6?(7U{55iQ(_RJT8cgrwnBB$N$Hwdmo{Cv|gXPMxm{TgqfF~P%!@3Wov+`(vD zULJ$6Gv;ejQlb#$jW^*V@}?(JNu{KNmcM-)?oKQ9;E3ScilDE^QVYM~ed_eG`@1vm zyDRfjb;K*Vtx_8v$ZUCEp0vQHDbT7rOF*p@reX?hNNc{;V5|~)rC)<0;qtqC=xZvs zOkpuoPJ5zVDBxHWKK%<9r};7J;xuR$wo3fqk*raWP`av^F>_sY<3ZSWVh=xe+_tKfCT%O?fefmmr#8ZF^r{dXTE zvm<*aWh2#{&f_RLmG}JaLBDl|l*9_sf&iL~Bq=k7#?tOIhlY}eJGGUOJfLAz0wyyx z`ei6bM!wg8f(C9!rbam1(i+A(J3B=-Kh=NJc{4Y+F5g5&=5*t(VK;4-#z=1wE}7eG z;n&c&U5n%6nocSK(m}a7radGuBtB%S*+_QtxIiWCm_d#Veo9;nss#Y#i~0T)C=M<4sFt_GzJ=zAIzUS{;NGBZ=_Vt9TZfZ3+#V1DjxF5Cu>TbWuu7g^PHSopmew-;(XuqDhIQm$nIH&x6 z(PpA=$)!}iVEcPoWn~e8i)w7_Ewu_o3r$ng$uMz3?j5Mw&q0V{|GD`mO*|1-q@~Ci zAMXr?ONO|T>wO748kfw4&K(AC&0)Se(I>q&H1PagM&T8>xP+oUfBE9RxyI+c_z0Lp zDGW(d9f`7&l(&VTRkHxaaA!P1Kmdr8Z%^>lh<9(X2F>>h0ezHCf(7NG2yeqVO zCLpgian60=l2i1a|*U#0W9p~HM=-&n2lK%Vb*#+#nH{=Ku=;C&`76Tq`%ot=7V zy?FuC4PgFx9uUxPHb1;PI z#YMNamm6(oenK!#*WYHn_~5;)DtS%YuxG`{^r4oR3W4`C21mYqZC#B{P)ozP3# z{x;?OWsnqR-6dOIHoO6u-chnhG6tb9uq>*0Y*;|()@Dw=9gkW_1nYwz3{Otq9B=>M zqDf5jE#HeoDjb~!r{MwuUj`VdrIP>UytI9V7NSokZh|9NjTf~*g`3FXvn zuPgUO!3nJop%o}7;CTD?+#%-8{DDrP<6bS8$Vn;a8=mjUI4)ExD;UmGI0Q})c%&4l z^)8uw?bfC7@#;Sze@#_y!VUMK-<1aGq>nc{2L^Ojzq`-Rn``R8d)!P5?Jf^uL?h+A z!*n^XuD8tNfc%ciyi0B#oP(HenJNbsx)j9Y?a?2rfHmk6wy-rjAs9Whq*gCn{A4XoZ}2m&Lb8m_lo6(5c)Y}#HMhL1vuz~m+UUWm400meE_Kf zGVtoC+>H52s2tA09v`<2V$r@}Z-oVo^q~$05d+NdtcH*jq{$J;a#uNjFh2gc_576_ zNOa9=a5d_na@4;=c;|dHQCv$;OA%L;0S~)1aP=cLS=u-is4})=Tzlx z(Q-4)H#feT9__(bulYJURcKu)G2O9(F~+6)xS0xMqX3*G{Ah_3{Lk?rG}*6s`2ht{uRj>RR7#>?rew8}fYgfD?J*}d{4IDMY!Urs zxZzjP$jrd7+!pKm=YfyEik@yG`D(dv_2QN9&|GhV|9l_U*~bSSwH!c5q}VhEkjP=F z`jEqbRJQGl?O4abe9@;Kpb%iq1#>OrGwf?&n=ffru=xJQl#Gs0mq&m{9HK$LQ5V|Z zU-27t@%a7MzfhMrvR}y4zfhNd{r(Ts<-;F$_6v29{f#^QMqMub#+-hkE`MJ2Pt@gK z&-(}JBKP~k`)Jw!6VS@bp%f5UgVzG}mE}c%zwxXz-VqZ$+qAS0!mEjA(_DWdOB&ti z^T(o3z7M2}4!X{F2)lgDk!6RhE9ZZNF;Y=|SS*_f9dTRJAsnHY=8K{KIfz zqt6jyhkjIF>%F6@dKEZCWjOO-=NqNv=6a415HK{V3v-s*P~E5PqM*NeaEWxjHopa; z0Gc(s#pKw)@kx=RmxrOA_~ijmRj9jtve~6Jbg9Sidj?Yjo$uaNR8o!mdO_*d#h{CH z^i3e@5H)#AEXZ=ik7d$SKS*K(azhwZeoBYn*>BTFVP}`3;lu?erb#k<695k-%$J(( zNN#q+(W-|qNo~BYPDhXGmyPeXnp-G0dVt@#v*iYT-3<+yfLFYFg)>>zmpefHk2dHN z_k4DBaj?DBojy}xtYl+VsVrQmOLOy?u7t93LROX$0w8eog+>iaKbV-BqMqIyeO;uf zHnuu5QGdS@I!o=y>~85wTv)3*M^2cSz{W{(+CcdE^Us$_u~dRC44t>ONx6$)9KKwl4nR)gC+?9YZU z0gE3{!qU>6v~pLeq)Z`%6nlHZA9+p40rb9@QEy^Qi%U#M={W^ZK|?hkM*${^@3WtO zxLno(?LVd?QP6+jldLznvBIMLi8Y)KDvLHLAlG_V>vjI%;U+E;h~c5joqy`gM$}WT&*GV?gDxHQ7|n@ z4?x!5i%s;LD@65Bd*LvhPtK)O88VvbFvWitj^pXBAIaSf6$yI9vkvI~8{-ZSOUfO- zx#*vxsEAuTueXiBo-Owc2|;J&x+KX6Yip-{8r zv=l@D5(PhD?vC=f(#@c9;>(x6-B+Z-E*j{bICT_ExVLzei3dN{ap=vAWf>hi4r%$h zUOzNYR;YP&QcR}MPjmR7u39SPhIiQ!?+aD*YEMvmh7!#+al1)tR3lU2GwTAT_R^~& z-iGwG=SdbAgr6i~16!ho6x>w##SoT6IjH<<(kFW6$=_q7t|!0wan_F_@=`AgJAG|A zl5@%zSWI^2FvJrQZoXN1Su%9lIjFX@m}?fEW^bW1?wsuwni1t>5X-v_h?A~x=__HY zfr3wDR*Z~iQc@TI`gu1^c=R;)8~ANtFqe=?2ys_&oV91>@FN41Z6c#o{aG5mzw7Sf0R07pQlwD#j z{u$2#8wmA1O70`!`DKP##q?O1vaH7y4{+gXnxdeL@Z-hdZzv~oR=Xnm{Nnb^qDO(b z0JA~)h=7RyR{?;gwk<$~0z9{z%H!#l>p3#ajN-Brqn~`Gof`aFpiYWo$YG{GE6K$Q zDwYMJBNez4A4~>LgwMQ!AhROJdG-5A<}_A4l)b=oPey~qX=eNejol78JGz)j*8)u; zDWY((I5t=th=xGN&03>`lEHa>h)e?}9+vmCNwL?3YFE>4YL_8^UQWoD3%G?kw>Ro zxP-5}xmDUQ*_EZ?o^razgn!HU#iStBwEf-=$=aO5iNA|xhEKD0mlAPyAX;n8pWQe+ zB2SvE9~Ck0uf)Y4hm!=r4l4=S+S8eQ+xP%pu;!MP2iY%;SxsJB8|qf-h!fFBfr%uS z{CeYE9KZeAVN2(GNImxxfeCd8H~sy?Q}7^rY*NyZrhz07ao$kgA@!dPT|D0c9>L;`1(qnS2wn zxF9d}dvCI`vgo7)5#SENq|QAnwxsF)8EG)xDs?k|Uf#6KJuQMaG~s!t)>}i4wN90q z9{IQn6qLe1JlXgt@$%04vu82^tz~Kz5lK!j-8Qas+c4I2E&2tHyF99Wgv54ZFL}oi z@3mj6S{P})8oY!xXxQ~Z^XxcY%_X9CaiEa_Fcq3^A<-w24?y*r_0`|!Ai8Wr7c^+M z?dg{Elb@DYNNnQa8v#gc|kmbL8y#sQm(m{z+oNaI1I@CexA70!RFOH$FC(;w}pipJ&Xit!j#iv0~7bZ zZJ!khHM)$5m9^g2P%T?tknw1CzIf{`?Z9SDcTp{e2NY*%@7lOGGKUTs36(B@_dhv5Wya*xUDi|#-N zC`p3Y{lC(}nFY>F|6h?}9v1bp=>nD9q+Vb0csOWLK((4Lc66{9ujP-53Y>0T1ihrU zbG_>f^i4?JSTV$=(A278kN-L+r_dIW{&Fv{yw1f!IECO%2rJ9;9~zy1k-_5Pw%0BT zra3UE^=Dj^yfot{)2PJ1x80Yag5^<6L#b;h&?))b7QKQY5C*6Kc~jGOIps#Z4+$`$ z{$$OSjgQ##7Axpz_b>x$0Xs*au>=k1mBkEZ*l$c)L%K6L&;^)&LootRekvu9MC-*N z?|Q$K*MA&37iU2)vlPOZhwt6u_(&aPS6$rTZREDK1uQ$PpHaYghBtf$Fv_6uK0duW zLwqa&rxnyhCsZM+;=IW$vlVLkD;CF$>Vlh^El;vr>8I<@eKvizj|;d9*|E3;9c^FR zklbpyF}RLqYh>RBi=lekEW_=8jNb1n24j-g1O=0e7g+P738;RRZt+Z!%#1uDuv>(l z4%mP#EmO;rc>{%1Zf*`R>X){|3N!zVh-0-JxHlKy?Xx}d%gSVr3(`^7pFF+%{`{$okNhcxqDfC zKTG|3eqjN6yG_(ouL6tEZwI)s2E%2-i2^@X(#WEc234?eEDH+@%*Dfyk?*Qu#@CP~Mng7^*+(7ml6UZ^& zu;>SN!R#(L7S*Dgk5r^@Oiwf<025`%z9mu|fhX51Q=qc(VPrAOJ7wp;@`i(!*8jcA zj=7Q;a}DIzEQ4fz|CN#eywdd_Ps7;hTrd5Z$+Y4L;5@U;mkEBJ3OQrBkUT$u&Q>0Yr6jS6O4Wp1>SFnb_8198T` zl1tr8weZ#1G^yfJ9<{Q1Hvq;EL%W}M8iHFPAX0H?3_6znN7lE`G5C`;jl^F6oyzjz zLwB?6GE~DUY!-9wALN)w5Z;_BDro`&gg447o^yE%{Q<1Ww?OrW83+kSvD^_kVZY9f z5FOy4?o%iZNDl{hiBKDkT*JR;4oGSK$g?B=K1$a1NfL({0hH{mF-7Ymi!Tu_#-StA z-GTD>~yS;`rpvX{hUq%*i7s&;0(zp4JM-&k(KXHhVm& z5&U)QVQVYE0KQ6$hAsP~{g2-Vu5?PpCteoV4f!v|1yl-QLUeD|ioqW%L-N9gOFm=P za-GrhPj*El(E2`5?=1|?{dn}pr_-Y|)m}qkoJlpLzT^+$g^}+1!ryp!RR88oXgKrL z_w-BwF7|IKL{4sFE8t6W)J!#oCKAiiNLiiO55VPw#xq;e7+k#PqqyGd(_K0e&OK;44sb zlkhFQVUKn7lk@+2c-MBUO3P{u<>_7)P>=0VmOe2#d2n6=I@$nfoD76Y*K6qC9oBsn z%u8N)?04-!L!E`cq^^!0F4eCtQRHK|fBmcP z1Gf0lG5QO-K8o!Bm#)&+ZvLPUGBnM)ySueG@_eNkI{i#XD%8yNib0JF#1!$;EZN^xHwm6lEJ{ zGi)c4X-cVdSL)ZB7V zw_!4mo~|zKfWz+XLdAy<+o1o9F4O7KYnJ}cjdww5q}+ZDUOCl3&K17}cXrWc&`ALC zLd?=qAJ9DC66&4;W^pjh?#}v%_nvI>17ZU~Sy@B{3|d8@6RY@2Kd2$l0=s(qr}^*O z+FB2WHniy;iMtWWkG*5 zzvCwFN)sz=nM1ROA#I8l&>+0VRF!o43XwAO=R^M=zkb^_1qFpAH&ACw0Sy_rcW*-W zO;F$LVqvQIsR?aqSy^V_JE7;wNM{e^U|Z+cZhZeZpT%<>% zFH1w9yRBkliU^wXpd(ppzfBr(JpFtXd%F%;SXfG&;WS#t`mhf`Ru%gE5beGp`?YQb zkk+$V{r@Dc$5C=D6)ZDcv`G!6_nz?XsD$$3?2zm}@3h(AXr z4uz0n>X#s13b)Gv`mSJApl3HtC(2=gtM4ooBJn1G9x7dj?mt}|$wJ(?S7THtNm?b7 z`y$r!U!PPsjh`V52K0xY!=U4yu{OLBME1uU1X*d!u63FC;HStlp4dn;-dlIxD>SZL zY2oSr56fuI3Q%Q((4bm&Un5|LER-y73ad``^Mh!91`=Qjt8q<0mtn0dC9c!XTCa{U zh>alfr##n^?5S8NsR9K+hg>emM$&B=SWXIY*w8yMP`?Iz|nnj}3?XUuz{jfn~a2(?Kl7%$8CN z({H40tKXdR=u_q&M>&v>I4trddSTSwy#i$y*g3x+4IO3QkOD0O(#FhMf-*Y7KUbpn z=sj&UG)6{8AEWKn7*;?_F^yvx4nH(*YqZdbSuc$VjaNg%tGB!R!vYH*ct1#fY=Q6a^?Oq=RGH#O6vE#+Y|m$O?e_Z@ImRH(7~Kj4idtB zAfr@J@PdpN<(TY87#8XZ=+>m#J1`ayX*yu~^u*c5b5dm-v>)p)X9a9@M(+YG<;aK& zY2cGhBMm>w`VMl~f-gHLDD;8^MMak@hvoM+X`+4+Qb%nqtrbuT zDJ?3}A2CQ#sZ2RTn0JRyH9P$hojmo{i1VJKU6I4ODGZkc99CL!BmV_xnba5K44(@1 z^?hPy79AOxait&ny#sbY*;rYyllUqtE-;kdsF&M|hQqx=Q~aZmLYlI*9+lMCNEn<{ zP($>4xih}=`z_T)h&|CqwzNHm=^*ug&R)2nrKgu%cIS~zIb&u%G!-wsht6DQXXkUT zI|%yUUl&Xe9lM#x3b~P)gRSlT=6*9rHo3z)F9V}^>z1MzXbG%>_E4k2avQ*`#J<;-WvLq#u4NNcKN%Vrwdk z#Rb_fSTuDo0vDus&k+-=#SvTvwHAt+ime46rRldpX|9-V1r1RfMvV%uqgTPZ;7Up7 z1hx`A&?=^_4>2*QFrhGJl{-oGQKh9@u;dIT98t#iTT2wGCziL3D;wcP%K%(Y&<`RYD9Y4P?6Y|8SAUnI1t%#2zORopetC~I8@V@ zVi$yzKpxUsxHk(8)~eSg6MA9E3<$2nWr)oP+1jjf4G@ zA0~Pmdra|uiwA>+x!5kxhu+o|1^g+sqqOEP5=RK=jyD#!R;Y}(*?XHbO1-vs92?YK zubMeg*mVHlAUOfj6Xp|!>S~Az8^e}uw z=BdLyI|hshs?4?Zk0uf9<6Q^w;h=(PRPm3M?ZAJyrWdCFeKB6@!?3;VG1_!ryyN0metWpy4fV&>vW!mXhhHK+ZHb-v& zQivYTyg?@6;0H$?t@{~aKyGY9rANXJ!^|Xfc!9O8uD-j!4G;Q@t#Bj*^O)+I&(-8S z{MX;fy2pyPJP)Jx!)%0HW(YWv7T8ZqFX`y-Q5leHe7yJjPf%RI8{vI!+oi>S5==eP zGt3+sBcfZ|Yzb{pO@QG$Z<%aENs_ltR1|n*rSZSoj0s&aq;`{m*8Y@2x_UmH3lV_T z&*wcg*#t048>$Kn{V-u&P+mUT?Zeh&_oypwd7Y2h=3~qwo;&hcKVFvHm9PR=Jq_$e zC>+TG669wsP^whBWcNMlh0n)WCB~!H+b8;azN3%v2!a4#?dI$26XoE@$?5=xx_C*G z$q@H7^7zEiYNTM9{#E1kiHie|aWbCM$e-;kxohPD>CG)jp60%OBq5FVM7FlZ^b z(mFu5otMY50xkm&56Df$paRjykEdm-*ev48LZehoZI88e0p6*l*@42BB~8G2=W(zm zO7t?mC%g$28J9zDGZi%c@>)K779jKd$DN4zhW~+``dEna{mGzqE<4^iDwSji1Uq0R zKR{usU9wFEdb&(r6nx6z`?C%Tb=QY|OnQ&F2V!3K*86%-Dvq<48|nk)LOe_3dA7H` zV8`SC>Kf+YFqyr4;lk*5{prO;3_t?jdMI1o=DfbHzYXGfaw#$%qNJjS?Z19}iiejR z#y%9xFqav?$(lQbHE8=TuRT&;CSD;jxxN6lQg+1%{tLcdlaW#vz$Ur~Cusv;0Co7*<%QE15+uBHWO= z3DrrO)C+&ouxaR<0_?S85iAqGEvG%tz-lr>N7~0*G7+IcPC5dg4y9fPBxw02D4W%?>hMM-^&9KH z${Ts}WUxS5mYN4Ry5}#D0}~@jtyH-qA1F*st?3)bIHSl-ER*GIR>kaRQn~C{QfwAC zt!8EYPau^HX^q6GQkwF!=Cst*B@djScH5N;O^cY@*YB^gugI84zj}&2?Z`A>`$-%*^-Xj4N9Mo8-Z>Y}{;vRWF+(=z%)+}ev8_({%nT>AhiYX1? zbW#ZUB*sliISQ4;oSo%HbVMXtN06J*YIl-Jt+|rv!8;(=Wv7Shv@=B|&36%(M?@@X z>SUG6TRsyOro7pv*3&E<8?A9kNw86RVEZ|NSF&k%v&4JCp@P7;yEFpY_XTzKzI~3@ z-h;9+hXArow|Ul&*2@qC122Tuv8W@f#6ojW2Ie!6)&|aOE!OP2*P&Dan5QevJ;c`1 zv91MxBp@S9K+y+Lt8Zv1wniV=g}+>NTiRf<_IsQbDA<>mML=ONo)98eJ_e#YcSv$x z$>!)vGU=3;LVw}PK0!<87JXb6~RYFzR!SCl5hZZz0kwo4(&HdnaYsq7Pc=QS=&4i@Cy!<-KYoASC)_IX^3u zFoCI6fHZNQl=qgbk-p(^dL>Xdh&0xcF@P>s)GlyclWvZ*H^V!CU@H+rzMOfFGnLWsiYW6*2Q`E+M%M*wVqFSC5-z_5N~Xro61*X9JEtK zqxr`2B+7vpKN1NIWo4TrwqfDFK*^?HcJ*!SPz7JHxmNUllcp11d{?!!tO7pY zJvD7f<1%%P!c3p}CZI;p3DFqn={?)92%Gmgs*}X6eUQC!apJl&!UXCX%t_P$B1VAJ zlwuKvT}JSLN~fb|Xozj_wj`jJqpCX45}KW|vgSaxVQ14tHf4-D%}^$z#Evx{2o*|v zbY@hn?DkOF1h!-cZOTKgZRj{Ke+x~JEz!}S4(}A`eqLtWAhkJ(^1gRUL15lp8q$L< zSc45<=Siza^i+qkTQR=o>JYY3wi3xo2+pJtq}!4+ObrL>HIQ&bkGtZTB{;-bU!}LZ zYk*hyv9BKkMLyt%Ysp+%lk`bb@Qlq+%qF9wn*+H^I5S5vtps7%@)_vw_0wslZG_J4 z+@$)p038hg!wXD|P=d_<|A)7?jH_x5+J}##qO^1)BA|eDNQr=ih@^xdARt{LB_XIF zoeBs@xC!Y_ML-(q?(XiE_|FE9N1x~YJs;n1$Ftdct#z;ap1Ee`nrlv3(<-*eHh@RH zH?%r3OVaTPr_-G#JktXBtuF>2E-%ZllsvTl@JSejrLW9tCh+?mJ4Z+LDf3rp6r!Rr za;1Z1@-#6hsNxLi3JYxho?}-Z!wJ8oG==sa`jRV(Ng@j-{O^QMdu#WTlj6JvXQxssUvgn0Q}`pr8TK%wvF_@e4Vi84(uZx` zKCP34&tM^d;ioC1IoI za|-hy{m~D;1`19iW(-J0ikx7-h7TQ`D=mTNvtK;X9y>lHUj>$D*%2Rtsi`A<3~VeB zvvlX-YbMtV!Lz7ukxi=GZJ-yCq&3pjvh?0-yr4Y-YGRlF!8!L zzsb!#1fEO4_tCK9+>34!zt8qs_kFJdCQ=`J4*krLK>84 zewQl$|7=%1>9zgMa`^wOBrGA2oydUCpA!686U#O3;(%5hA0j)Qzy7~sYUoc`H73M= z#fn^KP(ESN==Y<=|L-ZgWkKu!S>w6%$FFX6qxnC;*sNA)r)z9f2JXT_KbL9&bVf3|43+Q;D4n^JX= zK&hsW{@+5Dqv860T#wDC=b0SW*A*Zbf#zdzb<^@UszIE3#Y&9FZf;pQk(XCvVOyI?Y{X(H!U;Ib1BJC8+4A5#TZ8UEUo;nEO;3-Ke@bh4 zCxy4d<7>YQo7gX_YC-7e7imP1aJ)sZNBYYbOK2tnRTiORr_S{$%k?aPtR_9%GO`wP zlTT-+r&WQ-1uf9P`s4%zmS1p6#r)t`RP?nYv5=CRX|S>~S^vQfOuS`0pOgE3G7w@b zv9m~6HSj7guWonOy&9TpzwK!50G%ThTh9wA*p#-LK+}#sg&Fy`RMJC~Apgcl5}F6N z@tI@8CoNSS*(h&3I#$sg&#KRLV+FL#EZ^6>^^_!tiuX2*g(c{5N)vW^bMD}+!foA9Q-6jP+Q{YkxG^GZbK$wlZxn-^#j|K zm~^$A_}mkcrj&$^&e`Cf+$?2-&3%2E`Ijf4Rj*SpZcY8?L){xjy34~+<8Z{7WH4%- zMsBik8htr1fFjT4yRwwNTG#nL4JNXAJ=?bfOlyS%k?_Z z&^amSuvKak+y}8IKxgwF5y9M&iFta#Q7JDxu}&yHB-T&i;HD!;Rv-zvOwvTGc7v2g z8QJ}a|Ne{IvcdfJ5Uwa5;+;^s#(;WBA_KP2K~`ci-1~zglEGpl6AC8E(s$h~K#T=QL(sN5{{3}qhy&2MVXVf~)R4L{(J8fabZ3Dm zR-*{GuuB6x2Ou#g>f!!F=MXx;r|>{B>~Dpex&2BcC8;18+TAZ*8k;T*`S^N1F$Evx z(ka^%e-@7TU6wx@9dV3;l=DsJR1#&lrs5Q7+5dR*{;-9fj%ov$Xz6!|P_I^JOCRA8 zf}o$sX2ypNj~fcsK6yz?2|~NaNKp_aI1SL`;vi7dF;oZu4Yf#1Xe9rNYV1)_;ZyY_ z^fzUivdL4Rj^SW+Odh((rNi5e_cvXq{)vTYDgWHNEBvq>acVMnAxQLwqN!qnGZhul#z1WF z_@!~yew4p>sA>0Xy)SvbVc;j@T9<$P5SMT|DsoWzC3+IPzrE8VSI%n8$Rw`|Bt&Fe zOrq7V7D6(`!WCp2qP(>{KMa)A2d6YrUS9BA&(ZS!*2il$jGf#+I>RJu{LQY;v^y)v zsP}?p`63BTTQ6Vk;a)xkTdT)?{CKotuTLktJ-Tyv zAhg%W(E`QZ=E${!GW|G&;Q4H8BbHgWZS+j%nr(iE)iL%v`)ZsT}BrPn=r))f0 zK!$73;{RGz`N><_Qel}y#yr#?(8m!MSMnl{-4H3bB1*%Vmw0u$$!BA`AVz@KcyE0; zRi*a$aD{>kO;jK)O&Y$hRJ@x`8mCqEWX?S!@g{@QfXPFHST^sOZek2lV63#ZUWD1w zzK}s=QEjEYnclZL_F&j4w?rJ;j}&d?`{cuRt62!E%_k(C|*sbV~tpH1OP;(DOOzwiq{Q)u6c;n@qRHL6mo)*3ikK*R8ES7EB$1&cex(lh0K(tJk?lk}LrXD@daE^g{ zAEbs$qxQyqXdSX13dl#GAuj zc*#?lp#T5WZ8O`(Br`2dSuZuk`K5$WAGq}SuG}&wd#4aH7AM{1!DhYL*a&??KF6x> znR#(8$L_O!RaN4~WSY^3n(|!19j#KPcg|yN8Iz;XQeOGFgPnkA13DP2pP``=(TEdA zYggCTELMsVkG!-40&#H%I(iRf$$@L4AGuQF5)zV|_fm5-Z1r}xrQG%Fu8N8E-T$!7 zUe(I5YRra`+TKf}H}DAd5GxOlu9wTVEoQ}@7QQYWgTcN|?l%f*DfaWh(C`3E7?$$Q7a_2pAn8>}x z0AlQZo~vQp=?{!P-o!q9AeSbU?zpw%iNCLvykrsuZ5ddqtn`We{zW^(3u%Ui>xce# z%ithP9;%`(e0AixZ-zIiU02t3L&(P1T1}0Eh$t1VzcR%Cv^i1+bg@cHvF?X%w$B!J zBz9D-qGQ?44e&^^bK0Y@zSi*C_IUfneE8t8m#9WMJ!T(Hex>lt_fCsGkqTu#O(KVfS^-8+jSoOt7iaA z;~4`%57ADH2geQ|SVwjbu^X_*Gi+#}r|0bz#s6Loy6SDa${I233rb$DDWYX*CRb<_ zdw+D>#7B1q-I=i4FP^D79}z#Du_zlla~{xcdu=V{B{qiF{M5YSI%);ZavYqdXXBe& zS}rFG_0!3q{U9R0{q52_{rI1&dF|ZlGY$g3b}eREy}Yhg!vxhavD@CRj}gW{dmW1S zm=E#@Nv~wyHN)e?cwpIKUB5Fs#vxKu5^D_*v*+lcoQg zJqJqhkLKpbj!7n)Prb-uEpOFfOXt&t*kYIta9^x9HZu#29$p`>w)|sh+({#X!<@Gt zt+@^b#(D+Rv9Cc+b6Ag?)5u|aQ8nmxEcYIRHO5VjTqP+fJVW2jV1c%4z4DThW|tY2 z@e5J=?BxQ{pZ@6T+TZFKkfOuE8TDP?Ey$B4X=BaHH^Iv)(buo3JE9T@i!b~1<;x{y z1|cq$6#a!d-)6cbrG(xRce03@(ojI;G>ufOSDuc355%HyV!f%6lw6c4mcP(_SZ3vF z{PB~vA?z6C+gx0a`Mwky%45U783|Hsp-s?C)baT6)}kd34;hnYEW+s5gU=Gj>AbIJ zz0mq?^a&9n0CE0rP=nf(Lfulj-^ph_sPr&f;#bSG#=ybP8PI;jI4ejA$vR-%B7xx%Fv${2(p8 zDcYqpp~h#?&=Bd&Puw>qdtR|!?vpEE>1+Klgt4Vv$F&xJ&(&vExx%KQ2jG1bD?Ua~jVz%J;*0(MZ<6N z#AX+U=AWb?4?@D}`DJqy-7haJ$$jzp5(_Sc7#kWhrmM72s+U+9;1--Eg{1b7N&OM0&YhAA^;^`UKN`jV1MYA$U>mQetlst&kJ_PdjH{WjUSyNRY~MPcs4H7Y7c zMMd2;s)P0Z$&Qt8cqV3Mbb>jtT4kftO+)n3hHQFLCQpCtuZR{~8wuQYc+ndz$Uohg z+*ZfZMwvGB;|K1|Am)OqMr7AXz}vTT;GVAQYHPPAzt8L^Ndat9<$As0iD7%?eHh_H z^1`!OUqmcWu((Lo%Yc=%*VI1A?2V3+@la~6#3W)Pq`x%u>_F1{Pr3uy3u34#OA8RB zUn(c;(!uur8P(|^YDu1A7NKTOtoEYlqdy`!-FmKFla-_qU!_aRolfauJ_vp6I>UaALep-Tq>Y>d|qm2 zMOHz2J#aLd_r3DNV2y$ud>)f&bIBhN7uhg3k+NMCU~PSLJU7-p0g|=Mmg7~PG!hC7 z1@xGv1=JruX@%5~eec}%JW}!g`SrkZs{Y(zo6auX!+GW+JC^%PU1t>@f92F1w7RGg zWb3gl$KoPuOoiqBfT5DO_2R8`xyL}-;@J-H-ySdX`1d6A<57Yho%PDH5S02r|JKhJ zKUzln(?5W*nxiSy<S2}+bDioGfd~6yWlY1Q$rE%aXUj+m03rV*Zh|*jN z-V6VWw*-x{Ep?AoG`&Eunv*fLt2yePUg~5kA{dq@bmZ!mYL#xksW_$(Im3;rt(X&3 zj&xam|DtOo*6vrtfmbf!A3s>~@ogEX0pu`Z%z48*^J3ps?;ozbs^l`DL|c7|uD=-< zWLGRW?Xo(8h2gioc6&-!({eI~pNA0dVl>--c!WCiCZlula<*>en%zh#^;9xUZ1it; zOlVN72@K=S9opZz)J`*}<;2Fol4%iQBNiu~!OgAD#-^FDBpCGpOQ@ULCH(n$^9krU zX{hrA@!2r7s3|HDA{PIR^_-2>EE~JR*YQg2a+$tsTJjzN+jX*#;hQxqxBK)P26y2> z8AVn7W0WBOg%Z2*yT-gR{Pcq4WdeHmx+f4^{^-ilDeh)j%a z`s3@2jBZ%bS;2TirDL~$P)z)NH>G8;x_I&)fAB? zamQO8Y?yxkUHcB@!B!6nyt@mP((~k8)c%&U(P>Nn`w5= zxum|>IPPR|;SEt$o<@6d=~ z36W1DIj?C?t3O_Kk%#AFjo-p2v#{{+J~YOhT#nkWw*js{HQep~1;TrH=DNKCXe78p z&@jllUmWZbhJD|zsd^!NK|pY+iY#HP_-s=vZ+M)p;l9so5lO#0cTcizx-RM8&^y0G zZhX0t`Fnph2vjUgH?`c@&KiG{D4SSavo8|!##Li~8&iQJ4+3Hv+Y;)Ju1I8Vc!5y3 z32MEM+FBQEG`*VT zdZ@C&8@S9RbSv0Dyn0&-ecrB!nqRC`(@%e)5H%>YyRp05sXbouFt=&HGVH&wr|Z)l zZqug^O;$(c;!VIuUHKuZPzrG-Na7Y34}ALWiuyi+GkIdsl-EQVxPs)_`VX|$NFUpi z`Wfl!(mb7qiH@elwp)QXBSmcTniu9iIXA_=N=~+X9618sSFIq8j9|(uye>dgRHN8t z0~mml_dnF2i;5aAkL$eEn+kAg&D`ix(ao|A3K3y_Vh#KLQ@P}VqGF|N6sg}}UY6XR zSy{t}9q0uyCw2c!ID6I5{VxFi0OpMR3BaS2l9tXd4SD=8WPC`eY>NAoNnj9j%Vn#} z3Pey|NhXm*9A&UrTHQT&{tE^v{u|7-^_A7O>Afh%6H?xgwbF?d?(vR%UM>*M3G`z;@0f8xcJ`{gx0=#qE4!I+GYH` z@&2Z6ivUk(X0L?}bc=)i>fN`-!vBRo#-RwCIR!0gNZJyYcn@06G+(1hS|ep+uDuHjvT?jahMIMv+iudXQ^NF0$_EkT4I@>3}_ERW&im1>yo&$+-XUXuxa4y?c`eF$6-Bn5D1r z6{{fDscy7cz|HGWHrg+Dy;oBs{+?dq#|&e4TJ9)>WTft);e8CW376KL=jLpUZMJ8} zsPHGxK6-AG4`lcP1qQ1Bfy2L*EHyRyjv4hnJ3Qai^dL)NFZqiCm%71?rIJs|8$VZS z5kcnW+`Cfp7x0PjE1<<$u5v~6{ffg&E zi9mR*bEj*TblQ|xv46c%dcQ(C$d>F~0p;z;t5J*Xyk}w+a|;mn3?Oc5 zh16QH-A-X1=ON^9{P;H3_jR0&jc=X8ZjXE4`M`$$0lV$F|0nD&0FtyYX;fO9Y30rv zohH>xYlcNIH+6b<=C!NOS35uck`u7IJM0*BpObShqh}Z-_oHi_-9DD=={sJ&sorh# zEDMLolL6~yHKp8wG?(Z=so>=)B9`SFx1HDTt=)W<^yR=E7$qz;aca-xfm<`jt_EB~ zzQMq#t6GEK^%uxU{ez2c331Nt&8QoH)A9eqK*@>X74Dxqcgv!`6Po1GpsW~mJIXy= z^4ZXkS>P4TZ?~|*3w1~-$QPfFes2Z$gF#8|%_$%6%Exngt}`u2i;j-lxb^!zhtil$ zrdr^WspTat%owC=F{%prgN+iE`SKos+as6E)N0;G7$yjd{84 zJBiZXT}~UQiNxKtl7PFTu3NHP@5b-|@!nlhkrTk|)3OR?cy=dC=RJ_N-uhB;R4aWp zcJGF)#vyX$X0K9U-s!P-9Pl~%U=i%3mW|rUr|2yo7r||Q5K|lY{h5e}v5yq%aVrA9 z8bx@CSe`6fM=VLvIWz8C7OdPLa^;L*<&u-fSjxy>Zq0AF`>KCIy!9yl@}+N;O8j?H zL?4-y-tW1q@r7OZ<`~{_P{6gHjp3YYzU2yCY1{6pxF(9JR#l#>-|rY4didTCSh&7q zR0A14fAV|Di!#cl1!IoFar%boMGvqZ6?I+$8(KD6;`pfDb%+3E+i^zb^LPf&Q>*%I zLaswfR;R~aMNanL`WGq~SgiR5zeg$bHMx&7t96R9=Rs{!Lc(!vE; zl5Zg)b71WVl(Zj5#smbsOq3}NP|1zSD*2uiU)Rj++)Fn;-88LgnxCtDS4qNuCE8h>D3 zQhJTu$EYM!$5a3P6~U(?s3r9D&YTNXwIWg02#G__))p1Yw~Gpy|Kl0~ium~PFp=_= z2X<~x`u!r8vR$(;VV+)V>^wYcn|VLy5+#lWT~2{;Xy|8f;i)P@UsY2LS}uSa#3aVi z(berPNZ)}>X=qBd^x9=TQ1kH%^Lm(rM9QJRk#ceuBz}|TLsWF=WPBl0VKi8T6>)PK zNQ8uB3nqGcq~we3g%*LqqHzaMW0ntyi+fvG_)dc}32v+l9rNODK-u{~bbEdt6`KxHwY7bH z&ms5|I=ZFP6j7@BL9K~3FX?&U z{TU=2{ZJJC*_%BEd8?&?o_`l}X&{^wo+)+HBcmaAOS^PxY`AI;cDtyq?Lg9 zy0ta>ps+)PI8gcOgJAt-fTb^eCY=G6PR5*QmX8Cr1~4?^y@rtH_^3xa*U zs~$dllR25Hm`bAmM*q|Es!zhy3QBd#)g-RJa>th@`&5m`D$MtL5C|uQ_BakTi2y<& zMeVMX+r@T7nU|}p4)!)CRxMYCsrPyFj=t903V(9`q~;kJqqSCIYxpV<=SJ2%rQks| z9mHfnFkCJiq0=Gt`IIb2Q!Uf6jA~ST7v`O;RiFnUaVuHEkWl+_Hzh0Av%4fY^Q8P= zVGzx^guDXo`?41HYvZ?$IK&_mfkR4)KnQBQ#^=8Boh0g#EY1g&m&law#1s6wcVcO( zZR$c>E4^)~_Sc*$tE=aS?D*#f2)@-{o0qSE2hc#ZV~b$#vgw` zz~t-aMR=+0c2bdP^@%~|& zc}X6uoYgWMSyaO=LRhJ`R=MTl-tPKOjt#NHNN>eTG09a*5T&4D*=A?4wy`OkSZS!A zxNqkHW-&L`)eViJxDjQ$I~$il%KTb2C;mf_e0q=vUR2GX*P6axQXw@v);K5qy4>2D3<#B6ZWEudT@8k zI?3Nt4NEO9#$505A*!94+A6VO6iwGBR&#P{g>xh3S$i{SDt~Lf4;<#wV0iHR4iu~_ zEeKav4Uog|HiH}!{#4MY&dtE9!9upCx0HKQLOkF^6*ad8lJl`;%e!8XIe&i6xaHGG zQFhr_iC>e4-T4cAP_UVcp;6%A%$MnyMU@|$?^+9k2r$4lHr~rCsK{BNRQ|$t!1k-; z*ECYYGqf3B-F-7C_;Cjcw%jEdZ!@_elU=7_W!^IbuFv^N%VjE0qW3<5W2? z(nEb$pYcSc4BOLp_xDRn1G^EOm)To88F+K+!SOKRc91C#5<2&LUk{tW>CkWJ04Gch|AP`8GX!*%wj=x z$)97WA;VE^85Lj z7{j0WKj@OwehPHXZKJrx`TWi~vJqok07r3}f`mAW&IbU@^5BoBM^%5;?6+zmw?;v6 zQ}ZR4`we`k=l{M|7ZvCUvGMSXH3Xmj)USN^(e7O0L+geBA^#_Y)qnmJS1o9-K}b+# z;!gtC{(UD(8%q9AyeKGJ7^(Kb6y9re*w9Z^>17Ae^rW#amM5NHM$=5mk zG*3aXWHoU=G*)+KY8}H2VwaTW!F!obQWtN~3OuXp;C5J3d_#qQkTy9p({T#q>J1G& zu&HVS^k5R2^P}VYZ+RRrj#xw_Z;ZVbjZSIvp}Kq!Jc@c=i17onM(inW4sL5*<@f@< z-3OY;uGa*#OgC%Id#9IBOg=xAuGt`RXY$1DWX5nMlssN;iIzf;S0%~l6obe39m zeG?NB8+-NFlapXJ;e_^hKiR>pK=F9C8M;^Kb#nQj#GY1i3W@L zV%THnk1=HulkpsQ zIVNGE3UxWTFj5OVyC`8{FXx!Rg{0clDZZv&L2#2FJlr@;cZ268FPRcv3h6$f^2nZd z|K`#EY*n%8_XSb&e_b$8p^|9j^e%8u>UBpC@n9)%{54OgI2AF*C(r)Zzbe}9pWwt@ z#RqVUBDWkaAyMNW{{qt$EietGvyA7GNmG6PI46sXDQ7d^H_-<8XI% z@5Ml!(#UX4N`zBm=9doJ5 z3l9dcL6vkQgi*yfLX8PN1nu`*qzzhKHYA*!733d~&t9h+G{SA%X?VE51)c8$WiCS3 z(oeQ#w5lkK+l}NfkXh=_PatFS^YukabHsI4G&Nyj@;{%H6jP#o_WU_1kNM!<#thsW zFEhLhx4?+V5pL7o)r}URmWBq`cnT0-X-|Mm(0UbV|L)pEwkK$CKu>;8+9ROmr+~uC zA&mJ>)BG^opPw2PHH4INxE-r~i;hLB^s&7A_DndHVXg_0!VQYLqzSS7l~pG)M9C^YS7pV6gbTLVrrZ zh`_+nsVO}@Jpvq@S8-TNJRrxH%8EC9UCD90$}1;dYNQpU+KHrfOTuJiWqZuWKpO`} zw(IHY;!#rGhLuXwtMMfnPYn#jal-$g726kfH0p|-XEN~3ej~T#wmOK%I1xa+McCOl zT>lS+n5eG*{fiPT)RSyY7Gzw;=R|*If_^@{M)QG!C9UIqA~-(b?gh`rM1nI_GNX@F zW?EuASVsqjOB_MbMkHqRIlTFI*J>*&Vqv!Z_+BDXdSuXLvy9JfIkLF8*vsoj@D0VU zwoBf7@Hv4=dH-7Wz4vq$-`2#9jTz2OH?Wj}j3=|cKMBXQ4@+sF)|6_2@*G(|*dK&K zAhV)k$I?KdNgj?qE#YhPgoFfbzp&=II-LCQ@bIy?BAMsCS=wQQ>z|d?g@w-yO5?*Q z_~9h^I95d$N5;r}lb%@F(*1cxN}69U5zKe;7v!|yOoS6C5p0#IWj#4l`X3$8Sfy9Q?M6Nx8OMqKxXPo0ypT#N^~mmqNtRL1o839K=vASKn=-C5=!sd(xMq z*KYM_G;|#8M?DAUJc-rge~k+znJB;WK@mtjy?E~4tO8F~=|n|EwFXM$m{gA2i;uWP z@n(Xb+yMQY4lQ(iku~xN>o@mP3QW@#zG0iepX1P5Sy@?z#HpdHq^rH%i;j*SpZFx~ z3ip$bI1CC3;se@)$@`2eVjjpn-Ut#DTZM&ZR|Mmt*=lLs;-DR0lx8xUjdQjAK8yBc zUEK+4QFkWIZ@WWwBQKY~%!~>U@4y81U1QKuS-onx)0v~!P!FP5vN42Qo3m}YU}9F^ zgIt78X9%{DwgJ#_uRWdDavWFEA>Mw$B))dV^Do~{QUVkDwWeeLZ#e4|I z+k&R2r@=+q2CR_al(tPItzr{F#vBc3Sg6N22U8NX(=q;qenOKfYzVs46V{y4fkIVQr$; z#@vG+WQ+UxTNw(JXbVPM zl@{=jfBYr*@PEA>@;~9Y{B;fSi-3`k4ij7!^7CI$e!`XkNO9u0Pkc7=bJ+gIb+a$Q zNP`Jm87fYcp9Xa$SVt$=ajTV_pi={SAu+sG?l1Y_41f*Ep+bUbQc}DJ$UyPo_u01} zF)0Olo13x9ZozAT_i(Usd}MK`1GDjjUcP(@=e{O@>KL4fAQx9YD2GU<*LS46bXn`Q z`7Dzg7YD*nxl}us*Ta_4Pk6K^_Y|Gi#&6codC-lNtpU+6Qcgph&jcl@_dhUiZ*SAf zLjEzGa&)NgJ^-is;Z};{KKagD1d0Z&r%YvDw?TT@>x2Z{n_XpGO~|Ij>LX-gQN%#`K=DzsT+siAQ$0GXr#&Yq>RhQP@Bsg6l{ZlhI zIM~s#0s3b0gG8sSU|{#q#5;(yyaR$e)xqEkd;75!`WUBJEu@R7Qc*83l}`gi)mc|} zotKv+`FN<=cC{jATW{99 zuQm(dwNhiF;raSNOUEp(Rr2BtxHYf})ZXCXI!A~EG=H500EsDPo3IZ>u7LuS@u3(D z4%obtC@mv{RVosjsc#5UbOaqBt0X8@QER(0>{o@}0SZY$QnAxN-qXYU7O#MH#)Ukh zV6>;;@eDu@kBCEPf0ky=vi!~Y-4~(z{ErR1~=J((l3$2j+2u9l;=UH}Z_lwfFRjDBQ*cf^3y z-a8CO#iqokLWu4bL2Gf8auZl+bHn`&f}V^baZFK0QC+Dnzlt0z3cjbGU>Nm{#+$6H zI9kBm*nsx~D+X5K#8d=EusgKG2(e^X;8V3k@zXzdh|)QK{(PW!Z*MOy=7Y$>J$Ttu z=Sx8XZf>##P~@aL_lwmhe&?q^$qe;89G$B%mr|=5Y43-627uODg+wq@I^sr#hNT~0 zQ>condrfc(SpWsUd-#_xU&bc@L$L60&M}u)Ro&g=<*a6|R*>{DGd0z8S`(}GyZXy~ zfqCm9Bwgt~HN6y)5D(d)@xo%JK*v9+`F zIC}^ZW3c9Bb}N)p74-5mAb6N1`Sj^i*9(|ccz31r43V!pP9}GXAQZu7?Ebl%Y-_$t z^sv}&MckN?S(?DT8}K|pwm6{lU(iPrRZN=%d+>}qj5lqdqr(cEwT>Sjnb;p&)?l+D ze^pdhU*BDeJSc~;v~a&g=-5rIcVNJ0po_H)1|?foYpAOB0*X&~CwFV@r{2@2larHq zP}NHU;!T>WF~HpJ?(XvP^5c!3dkk>s6%`dN9Uiy{M{!4j3LwY}#-5?1q|BmgbbE27 z3yzkmO8zmS*QC7}3sQ=j_3 zcg7PQRL(D^LR5OO|MrXU7Ft`8f#q)`XnPgz9zxPU`X`&p7SD)IGom$j-{Vl;a_jVL zYtRM7Rp?&fJW|E2V0w>qz<>Vadhcmtil0!Z8*9TgcXjW%09QNU`cr(KhsojB3ty-`@1k*(hj}nxjdUbJj#3pdHa}t zUUbNe!CuSkO@^YihDa9f^IKZ#g#$I8jzl7r!|p~MnsWR+S-I2I3Y;e?Q7NPvNYDwqX;w^dHwG9V!4Y;as_D41xMTp-_EpW?7e@QdPBCKxINsME%|yl>W~>7vVZ&E zhMrSE60EaHNHDnD^DShD`LUkXzl#fx{V&jhJN>`lQ_WxLh~KZx4QIL#X(}gVxsXqZ zjDb&A^H((gYgtk*oxaAub_A~3(ZNOwXwTU~>;RZ0X}boRcr0oIsAgo4X$^QH)>_*5 z3x31LM=QtT4tbEo!ZdgR3Y)n{x|XOR?U@P-3kxC=E@EwU^~FQez2{D*T`3{%h}WQ-3Ut5nWrwYK7~~fW!C`-IFG$l)gMR^x9~v53 zT3QN?laP=qUVh|FdTDIJnevpq`kbBoY2n!2?tsMkk1i6B@lh-ru zH$ygH0w$Mn8fLj1AHhqArDQ^XpjK>qGY<_9G_Qz=?$rMTn&?jjOmDx3>MRUw{{sOY z&tz_xs@^E=&(T9~*D(ZgXBe;f;4MGBF7C)$A~>_Z!;HpRF$W4VGM^FB*>cFa1qJK& z*Vjw6wF2@DJdFG2?l?T_)qoX9WL;kc&oIHb+X&b#=(+YjY_!-$kc1Ws2i%~01Y#rc z#t7~A^s)sYfl&3S3e5&19gwRCZmTm3OD05Hx_tEXs8eIy-XWj9d3c}}oc(-l1?>>I z2ukB$<<>&15ud0rLEe%xUQ!w&CL+D8qTQk=mRQYT4Wi7w0BqgS(IGY+Z)muyR1dq-X*cU} zV0@(JW9mncXA?j6D2jQYISp|qD>rvEyB^wSq1{mw3kwTXD#9Q#H7|mB;)sXNok{W_ zd8tEc6vN7yFZG1$_3PKWXm9L5-|C*tronun6%2N|ZnZipOd-z}U;bPaZz{oIRDajA z-lpI_>Y+Gk`vz!KUJj+jUxsV}BuIV`QCGwbTf&GDyC*VbpI@Wsq<_y!q2Y>vRg^qirG;g zShTp=*+rh;AcRQj-2r)ott(90v6_(y*2;P6wOeG^cGYPx*C3z(F~`#$82y3i{^HrN zf-qpHu8^4<{;#_--K@ZYah^XR%K0uD=qW0a0lJqLM1Mk%azzqW0dk%;^73s#G!lSW z=<7KlT?$VKAQ#S->UrElfQbj+wM(*s!@`JRxP_%nEHy!BeJeg=xzlbVZ1=Wnva+(O zc!cti$=%JMY70R2K{$H?)Ef#43RVeG$e4IIgOjz&Zl?%Zj-Nx55Eth*Z2gCW3*$j{ z5UF6M#iLK4%c?qu+?!OQ8yGyC`Iz)zX$=jfIgwC6K|4+bxNL@yXE7Dd4vR$q1oER2 z(%cV=iD7a65?BP8BZ#kLCik0wlVD?0Ee(RnmfIH;sJl%pEQEAxFicDqKqwc5@u3N5 zW-fu;W3`m|@VB{{8IJ&nioi4wil^LCOpk)#b`FFk0HwEgbU=iS*20!mZe(QiAc8aK zcE#twMDOO>15gNOuuXH*q3P;o%$$Tgl-NY|CX{cmCPcIs75D5}?d|iCn;9Sw0>RdX z#5$7IzM4;G;H}<%Hu@br4dYV{P;M1@+b&_rJq>_Tz~u;f0uL?he?W{Q@|xB1=e8M> z-jlZk?F`Q*YA_E&7@9lH4Xmw^nZ<^VQRu6N{4A-aW_D15+6r(?66k+^AUXVd(K;kD zw{I#1+yHzI!yjwWS-!RA=-sEGp;>zokoY>$w(`>NG>N^4_zDmhz>e*@ZOwqnIMQH) zaAi~!h(a$X8e9>~CzJUTk0Bj766=XT8Dibde|R2q`Rpk|J54MElCnAcLRaoJRQE-~ z^l*`w;ZJNp$$wg1UaNhFqaTj^=s%|qX}?;SY=GPW2ie!$9?>B`LL!uZvpQ3MATHzv zxe-^GG+NV_@NxCm7k~XRIBE1!{+tYRJN%-9F3Qtu{<_Y?%6}nQ>E=s9E$U{bqj#rQ z{qOy}+ojol`23&oxo0AbRa@uzT0; zeD;9CFUuz0JANoticv*Z%MFz(OS-wJ}C1 zq`ooWJxSgD>oKc7wK>}SEU$++;1|{g>8VD=f|7RxF0@=*3~(FP`d0zlm9bzN8hGrF4pg^U;~3yKk1`$GrD*@W90pe& z9=(Fl?x%)VXQ&fp5<#Q<@ESdZ-EH@+Nu8}nv3EiD zeHGU#e}9YOr4#ultE-@7_?dyD8c87JVtw0Xs0zF|b@dIP>@|GxJ~|}Rp`xYZhQ^NW z^pcz$HFRO48Blux+|p&&Y;HFJAPekJJ3|3{0sMaESfh$9A}XzWA$}x@s7Zsz*vb(xS;m zlXC$#($DXav@hW22MG?pI?mw~*hgMQQh8XFr;-#S2xyL=ant?aaLeYgbV8`&tS zg~7g-_V&)&TJ5d*7jtgf(BOWJ{#Gw7F!ARvf5oL(;<7V0ke>!hF>qrDJG?{E)IZ?h zO`LzUe!^;exa9sIW*CwTXWy=Msax25k32YFD{(~S<9&2>e8ROkiY&F)IVv5bpRiQV z@1H52E7{>=BqcR|v6RmZ&aa3ULwxTLhSY9BCb=#2&+QeWXDBZpP31C(Nv$z{QI?g9 z%im`M26xMXD6afJ9MFH;8Gnxg1`z-a6?#lOp+S+5K+mT_Ts;2*HrCtuZ<`7xy$w?h z6K`*ahY_c1e7sUmOh)EMeEA3ldli_dVC$I=hF!F{glV(X-E{nOghA`~_c%i~Vld;ZrWV>u9~)8U#v6MaARn9~G_h-T5%pQ?1jLuKZHSpBom(O9NlA z@h_o0C*iz)&IdS42o(a%2NBAP_SH?=tPEAHp*Pi)W8+WE!D%R+%mg&|EXbMOKHGfd zi?FnB&*9JatcNvZOVGE)mTl7Wq%%C|G9pt!RatswCg62Q$)WAqj|3u3&&{>$57x9d z=Grh-Bm%G`1XGo_+DgOZG}BeLd`Xso?EYp#dw;ZCn-x!*>2dFa;73`Xd{YH%3!1Vl3shL<>hPbkiE*i*KHE zfIQzZ4^2(oTF5NyV%dN$eqG%-*tk-hoJNg#@?Zx;l2MBdvjN>=5C30dmgef}JPV|6VmNMWeC zy=Z+Kix7OldP#pAT8gQWEycfo=+DbpeJ~yI1Caj5~As_ace?zyvRZ)(vBM*OQKnmuy!5kF>9js%rhB)$6rE z6p%&)>F!ie4;>;%2na|Yx;wARL0UQm4=F9(qLid`N(e}oAR+zM!MO2z@2_{qa9j!Z zKKt8WtTor1bAgKZ4S8F=iazk)Q7Fs&e0pNiMStmMuy7QQd4paMW7EDA+>xd`;3nZU zQR-<7Jo;va^BUtf&_x&RId|VrcQ4h;bpG`^F!_*Zr_U*F3_C@zezwj(Rq#M)fE2=a z3>dG+M>-t*Dfp@aDkhK0If2tS%X1-s=*l&sxopq7Sd2C^vawEor0l089?BM%dEC;B zcMF>wt7f(yllP#Abz+NGzp=^0Kri`0_Mk8X#kaIRz1BV7!nopm05j@G@B-oFIzF+w zFM*DMfuO5Hc4M_k#1%nIsPX&fz|)@irS&!P{;5ik*2HK6-e{!_U}30y5UE0pfr%}S zIeWi8I{ZHzEA{Ly#xUpL9fs6)jL1rEk^&K|xhJi7zB~1>%(}hifLGxL4ijU`$2PNK zch{tiYyg+et+BGz_hofVC4X%2lUHtw?E^O7*w=L~qY^~0l){jzedI*s&8}K_N3BM0 zf!x|wWlI-kSPQrL4H;CS?dLv+#gjox_eTS{n`?{T4z`;~G9K2Uit+F$s-t%N*%HKd zx{@iXFPk-oY89Jm+;WRP=$*;P(QpN$1kNhAgI$dL4zy#>AC@e|fLG3B`-Sz&&3iAU zxi}d;o*eaLPlB%DcjiMw0>&tKsSot+7apdkp-fYB^%}Wh1Hak>v++Zoau{v!*hWNn zFA`iLOr$Pntvd%?Eo1%O@q$u^hqA7pmwP{Ars~i|V=aiM9DOV8pyTgBljG)oX*9CE z(04oeU8b`8*NgU(qKs)1hQOqaizdRT$-cCM0M4IqyM9067OCv7NMQ)JPf**+i9Yl3 z_6BM$M&Ih|avu{fe8rQHxM*p)7azZ}yLdMy<3VyycWimtLmsn-u0Za_2%vO+@cyOJ z?F1dS3X8Zm*Q_5_?{-~9!Jb`T?-Uak=j1Ycu<;LL{r&6vu|KVKI#~iq2cUu8$ulJC|B}Z}_L&P-4`;_fSB{qrZf#fca>c*QGy+99 z!#wJv2Uz{fnHgHWkr{t`#{@+{Jnx(5uzHPo<`rL3(oGsfmcl;^&H;03VA!rr;VTk~6v z`VFrvxfEsBuj{kf3F)SR~KUUe}wfRdCMRS{%5qGj>BJv6)>qg=62t+!wLQr`HJvD(IuZzNphB46;J$Co7w)qMpc4^Z z(>j`OGOY|$foK5LSn9<+5HBY&vxc$v+k}s%J?qhfM^Po{hI%K6x6k*?kufnn5JNoO zeDK6%tKX1>w$VNAHB`FB|Xn1?{tStLaE3 z`7H3-859gOTGRYS_tGg5wQu}DCz6`V<2n=LHQnlZ5s_v5uQ{WO1eSb32`_jC2T~3} z(N1)ESVb}eJbX`3d@5RlP_$0FdF4ye6DP20v9xpruNFAS%2^~0UhI;RlFB8JrBdDm zy;?W6r9Z*uWfU|C>UjJ|AG~h@*w8KUZ}VdGta;a+qS%57Wf;KiC$2LXESVRGo(xxj zJ5DTkWvH}w+U45dn}+mX;;WP3mP)@{MvP?+`_k7`Seg?R)h;~m3PAP`Mp~$i@)z-# ziL8qRt<&Z4T<|5j_twR}N*~FSa|8s#pUJ5+F4i(6R6~PAnMTjqYLtZ$o}U$l z-eTe2-o64Tuz%<()aII-o6^-Pk%L2Bt(LGXq&hU>eSX_4V*T3fNI5_l~%JA3f{T z$MzjhpPn9pPTthdHfAP4ycZf)ho5+Gjw0-y-8r4Y(o(4UhQ2+YtwkPe3DLHKr(IE$ zQ}%Ouyno6}FZA3t(Nag$k#KPRCy?Q8lep$NBTHhkb*ymsZg9ent8bX#%EZKsA(yj_ z(%rjna&iQo-HD&;(N^^)h2Q&TE2%ocLkxN?Ed-9-Zgbg!-x z>Rfz1-q%NBDxuunOy=CQ2s-TTaw*i-z_)|r*d_S&hvsG*&_p4F^YTs!t3QmkTlfN| z;QU>Z2Qen*Le4gJH6HKV<0=u7X|l%Ht~)ie;tRPl$?w3pxPv^MDcQWh7QC=U&Yth-RG4eJT8vAmkxG9I(RYU zsjiMogP$(+$d%0d*P;u1j8wi1GF3vOL68nif|Rp+hm8MPsK>GQoAwihlPURP0? zlszb!uXsV8O5^usYMSh!U$k9%`&(+fo^39rcX($n()zot8Otumd&!kI}j4DT+KxxLG@Sr&#z4Iv~=3oRD2qajT$HA z`CH5R_?vvZB#WoF>lXEmFTv3t?lEX64+?b`z&_QRW#qZD{+;oYR`w`B5AVD#U%6kI zSw!;E!Yw;_ALDZI^Ee95LQ7eHGemiNH-j{iwdgD)p^DeF1ImXwkMe!4{*GKT-*;}UQut{niut<`A(79)wgbEd0CEUV6gkuL z+eNSmwy8U)n*7+ubZ??eOZKiGh*_pjv zL1wjXnWOer=pB3FNri=GEr0-6+A?-U1DJ4WLuj=gqcHacSB>{Be(@SaBz^#xG&`nFyz~w9^If}3 z;qoJ-o7{r3M=$Tm0_d{GK7tb$yagCkYEKvk$Cw|B5}DHO=<6O7?slFBA;T7GSayjs zK&yz7xy}CD%xsZk*klDaD!;KT0;ft^5Hzem!BoXQpib+Qrlg2V@`Z>;eNS8jOT{H{ zE_-Fv1Pq^oy1G&DTd@IC!EZVkQ$g#$2)acff&=fBn(vcC4$BLa^C0(6NVPrb{9%UjcqS{a@zojYp)nAsy?9Yp3%pY&3U}J)zuA10w&FH z82LCe!MK^eV1bm6lY7{A_{BW9P2!NwEtw7dF!LL&*trqH^To}Z(lkS3fFR*Ifit+a zu>ToS?}Mt)6+?bYm6@{t=<#^Cx0j#wqa^?U;I9zqw_Y!6=Oih){Oj zVta+0s#~-yG1?P6O_FKB(9+#;UJ(Q-Xu54+8};h9kGuTR@D;mR9^}2x7z+@qfpNQnlRo#p$*IltJ_- zA(6XLv-3nG4uSl(n?FIWzl86+r0^J24u4 z{QAkc3m7FUN!<0=Z~(-*!b~bP%_GklK!I`#!K)%#HUJBSaRlk896fMM5O!{Oq*{o zBB>t*li&4FUT{dk!)WO}N(k6I?7nr-CE9)X03b+r^K~4GdtCyhH&R1E;RvSE z=gRj=%%6Ta8anEd(6qlWJH6T9Mm=O`*ht74z!ZTd9{gxS65FW$7ztf#CGVfbz7Rqh zYp2+B86o89kq!FR_;`uZm^;m1P>~URnXl<9;e3&i>49Ez%m|~TOb}i7H#Ra02^EB5 zVUs^mW?HCtByjv>b`|+hGVT{MsYY|*O%eFBJ$krw*Rs0r4pHo|Mfby~Np@bV5tRiU zj70cHFqO&0o#N8e{DR+NxOW^h-CsXT7*T?FUh>{0uKLcEvG( zoRpMh^}Q-|-hCEEV#F{4!;mb%4$uY;Ij>cIc@190Pa%b4<@q@rcrQekcHj5+lhMBV z_8*fI*ne5Xc0C{%-6DJ&DsuboH4?oW!ouJz-$hk_iUptVq+G3q4S13{JpwBgl+~gN z>a7j^ibe6A)SkdpPGCd!pMlzAihI2M*HfgXw8?ge5qK+>~mSpzh=7; zl3Zx_v&4t7vD)TlPKJySyFQhkGz-8kNOh6tQe0pfn;wWwH6FE&#k^BiSjKropk}~B zpr)_Td+xI1>0bPXTaG=VBZPNlPc!tiCG@q<7RtE`GZh$hkc(z8Gihh|`Z1Uck1M{% zE?rEx_^^8WXnqjv@rAZ+)bM*(w{3;p3_rHT@4U3_Xp3j#a?G7w8NE?dC(7`luI^4_ z8Y^oFVAj0M?96Ql=N#{VE(0Rk)Y^PgFa6iTJxEFVvm7Y=6##SU} z4kG^~`3F1mh+TX|R`WSw&h9KFl;Mn4%7yL}#g~JFx7D;wkyOpFmiqf6TjYpFyY12; zf9ijauGpga>tK%$*U~>QEjdMw7-r-u&}A2UV?}S2YaVje|~ZC zLMLVC;4;23#TA^sw+eD+Q;7qWCqBRDn0(O^i<{yUt0R-?G14d)p~XeA=M~`o7A2Q5 zOp+O+D?B`f?9b*^{II)e8v8vuz@4nIB46NOE8&_7vptPxGdUb1CduobTHhGCHN-sZE(IH~nGNulS_8C0qJikM>Hn_3~|t4Gm{SucOIoJE{+ zI)@GYam$vLJgz?c46i&*J{X8;Ae3C#F8@LeTLHy`=lmL~VqbBAX7aPGOUaBaJT!3y@@MJ_Jw`qumx0Vrf@)lZ?S?4hJ=GnCK z9iARG<8MPE_*ri{+f*ech6T%GTUttl6zx&mPW7ZT`53=7oS4emA-G*rkm|RPcvN*D z)Y?7tWfi(%F{KjAkzE>=V9nE#bDr>4QB#{fK#f)BvK_x+xF?Pm`X$V!>+i&Jh0o#y zF|4WjK7H~?$o>MfRE*e!P6wZEk?&7`p_WwC3{My<7RQd8oGfY~iB_pVi;3+RkLPG7 z*spjR$Xx9kE*=N@Q68S+LKYCV{(b$`sCQ>NA3 zwWra&r^{76Ij`p0mx&3h!+p{D#7UNEwocJ>#zJ&^OwZWIkLs(Dszb4<|G3>LLnNHt z?eEdMgxWVX84+Q<*=j6Op8Mx4bw32%;grNaXVu(Pw%7J>d&NFo&Ywh(d!(FQ3!@+?z$?&mLm^1)!t#<}lqM}ZGY z^mA$6aJS_Rn5?Mx(S<>O5|EN2EiE-`Jmhw)QlFqq&^*9V52Fr^;nE;AMZ}PErG+@u zP1FH+5l6x+y0kO7rrvXl%qp02YmgN7+uEqWTYiyuU!`{EPb!TLh_7B)F z>3n5qXh=bPxm9$kajfOk3*4vPV#NTs=~uaKn)t0~h__))&9pOMle$z?ev*pt{I1gr zTXw{_Xk=(k4$IW!6NoBV(uOl5@)mOFmdDt%6U?$B^xfFruFa<(q&gc&$i?-yv@9@P zjasYDf4#9{N_;V`-adsDjSlY1noW2)YT1+azB^z&pM z0^B-V>O3TZsHOY*bC-=KgW?6+kx9yInz3d}$$83IsMmP~&HilSz8jeind{skZdyqz zN&SlMJ(@DbYAO0%hh51xa44?PsW`xNADe!TJ_#+#$oRiXlE#+#U?CEnX_d8Lydxv~?BP7HHCfD^=iu;Y z(F{`6HV2|t&I0ambsRF)VswF?MZnGJSz=;OgMXO5dXZXxSFv<;W7mU=eUGIdNjwRu z-alA<8DXD-9Y{Rf6oM^wDYd=n5?xrmb*bOL}6EM_&NJr79&QV!@`tWn^z3a3P8K+l`pJ{g=F2#8s zv=wGdTorpL@OV1y{l}MeBO^-{4mrvCteP%+%eHs!u5deAWOE>Ta`o;p z1zsZu=k@fJ^kkw~lc~83ZxeQ!+#5M5pX_L{+8Z0C34Hk?2T@eUVCjR1f_u!a zFuEszrX+JgLYo)Cq>R@*@glTaxBfZQ`iBYcMrNvs&fdK{V&JZ(epniCd@{h1{Pi*E zFz{@5KaC4ANTJ@?Y{m!_ZXO;ax9wbms^l$wcj5*UOA==F-l2L)K{m^0Hd%MUBu7Zk+c5_sPQl5qLWc_zn z6C|y$3r7*5R@q+0t#7igbD_~aW;UI^`7Bv%JKI1!H6A z3WPa0Pkes&m&9aar9`}!&0LvXEim0B#1!>*!#FMd$=Nf$}17Up0y9-nsFS^olHO?k!e$`DuWzF`QC zswk_7h{C1IYAJh+SFo@Vr=WQ?ztv|2KJMvjQT?4HJnQQlcI@UzqYh!!EER0n>u!Jh zI$>=-{9Wcer<1*Hp+;d^9_Ltu&CQ!+)IALi4t<$po>lYrJPn9@ODrj_3w-=oQfOFg zZS`6U&WGtk<=b9`#l@*MXQlW8$v@Fk)jkknn)=+?`5~OGN$Tyn^iT?d8T1~3&yjmn za=DIVVbgaFh7nkJPO)0eFol?yNLTJ!u4d+>R0a{L>!(B|po#sZ9T9qP5Pd`=rbJ8P zxYrWc(ep*d3PC|>j8qPcf=ZacdGbyl34{FAAF;BzvuzS*$cB2~pak1{Ns7pKx_YM! z+;h&k*&fv%aN;NYzY~mQ^c0#htt%N24RlA~zN)r^2>|cb#>42~a6L>2%M- zRh*b&VgkgJCu*LILcqFX%59>gU+uE8-GiqjvP;UB_S!=~bwSC%f{H6nEIGz$Rro%< zAjB!?hj+~wk@b4qj&`(z8+ji&kZTVR_E3>A%SHdnydipd+=$}RQkA#Kl6bf3+o7cn zs_`}+{6nXASP*~m_gJE+mAx@hv0>YDVoqvip5lg?_O)p?tL>F5J?RpOLfd3=8&-T5 zQD=xqPRU{V&!6P_pO90WDg;&$7Pc1$>j@NmAxT8?7>UJw67$VKQ7Rowe0c(Ruyuw= zYFuBXiSsbM0{^0gjpcss7}Kd6#MhdyOQEEhPM&DN{(YlYOVxaIbaX;OuAo(?IC(

b|9wJXrav`{8Hsae4WtNQu!^KT;mpj6fF7QNrZSN zE{fLkn`(fT&d{W`Zyo_YK9V~Y%v>(rg0V#Cy*hvVF;iMNxTPc_gVlAqbnD7Qn!QN> za}`-cnB83B4bg643NF0={7fHQB~k*N&i~`v?+)0Do}T?cCX$d61?OS?Em!eJW$ah< zx=gA1W;jERUXc#JTuliS?f%E}IUroYD>saeFKS~ZE+3fH{Tt8sed%r{xR>N>K~IJ1 zF9pyWZ#$&8K)`m`$Z(6p?8mh(6Adq~rm!IXc`X$Lbcn&mvNIm)E_Jb&VPf)!G&`cd z^X-n|n@1%!Hn`W+5dMDaGIHi?w~1oiWUqdgBCcd|Rqg(M4_@J~sn+rsc|)8#+!qv{ zEqz8U;gP94MUa-XqSE?4+CkSc>E|lm&w%E_q(Nk8LBp8v;<8Fe%|mleb2l#X--AKM zf5L#H2+kQ67M4indCH#Cr#rS5lsnqn?5dU? z{)BXaWJ6!0v=#MTMk_oZSmNbXfnXUt0f(&|M=J+j3KsVPX)GwH4~Lw@@w*i!195QZ zKY5asnAnj5Ux`JOH=dV8+H!#QZp5Zh+w&OijPj@`J<(^gDC|>m__-t~-eQyKy^liV z5yrk%a-^OHf?S32c14K=d8%5*klb*YHR9IMD}T-Glb15qF*Tk3qK}6=dDtZ}x?0Ee z0wh(is3d<47U+oSz0nN~r`unWekwA~iDYrN9Eny`3Ww5P->W-v9G8jLj)Urk24g?< z=MBD^%-Umx=AVX>E)7pjAXRLc!JKZ(mmnDpQM+>2 z_rtS@7H$A$MU{tduHQ2(wWP=l*qfS4yuS{>G6M*lxBJ~YKf=MrA9~Kq*XIPJzba`p zdn;Q(P`Ox!t$31=v)XjPO3(ZC%COyQc%fABoCgb8=72v0ioGU5t>gk`?h_H=J*Vd4 z!pG3x)1w3XdY25tgK|FQGYGD18DE`nMyI|7)$b32fSLmgx+oAlc^vG5W(f8zCe>Uk zC0*pt9UHSbX*@wQ$P0MvEk9m+aq`qP?TQVCa;)i@OAk~oPlOCzWpbHk_|P8rfSH8_ z(#lkg*mDTU=at#xIT}#836=9aEi;om zkYQypMQso@Cb%$uNsUSp%LQ) z@-zO3)d1umM}hxNh3#UMXw7NT-i1-Ga&}O!04wlL0j9I203M_HLz(YGiSc&_f)%% zLe3+n5hH*~%kdY`iKeJJkLVeDTPY$hz^YaC(77L2Sa3+ZNX9*m0AM$K_t&Y7FE!SLJzdci{yVmkmWkl=qIAzua;q$bTuR4H=e0i=%lj8lhauuY&tI?xEu1Ju)8 zro9~%1xU#i<)#k#@Kji`K$>D)+ft}QB~VhXEDqqjSU1pyERKXp)P5ih!J~xVSF2pd zzTd|`tr8*IS`ryaz_~Xab*j}2iLz(l2v9t2+17am$0Nx?lP}P4@_?i0DwE1{G>cjR zH5ZpH5K}?yLl%K)ynB2STq1k59r+m9@`()qUf{ff#DAIZ&z9RF+#4J;B2=}u5D%yq zJFPblU%PgRfS?Z$2i2T~9F5+cZ+NFpY3hgMX?66TUrQ}+Sx!zJ!wPWJv2%Mdnjn=KV-6#X6tBu+mdUSe{+c=>j*pF1 zsFGs%DJCg~6Op}f`rSzgd1{XjV2GmMb!K7_vT2Rfc-AZ=O-|~nN#iLKh>3}TXuQ7j zI7~Xm>D#qN(hNa2V9`YModbbV=(lc+VyN1!yxzsh zsVz}NJEj^GqKkPohZ{Zet;A-a11&UcZ|UgByFf7swmP7))i|^%N^AnzC=MC_{i~TJ zuGsspN8&Z)TA%K!^*&z>gDoF6Hl-C7}6Q*-qUUkt)L3T8mRdJ)HpCtndW9>@h# z3qW-a>Q}5oryW{!BZD&2x5DC^O9*a4p;qym( zHAi7c5S)gFg<-tGz{aWqlwvm6x#3=pBX@*I$;n?vMyed@PUD@wbZG_LaNs}g=UAMX zcY&Eb0{t3n;hQa-MJ?_=A8Nf{ekm-oU)Zaf-TgFI*9=wc`C=~kS&Bv(7 zs3^Y2@4P@))_i5O#?y0D3_MuEW!Fldp2Yz>u={DHP|{pD1=^{+3xSW@I>A^M6owJ= z_g)J6md=f-?SfuX?xvTjAyyrGigK0;!sk-XSIt&BPLtl(M&dfinH2CRcXYIo(z72x?r=$zl#*#Q%m#ZL6o>goef`Hkgi zizp*Z$EwQL-Cin5t2nJS5Gs?t7i|MO7g;H(we@w}2N-_`xmgO3aDutZ$B(S+?CeZT zGR-%g*Hfb3`1trJrNdxO-g}TH8)6KRc+3H)pCkTAZ85kg-q#skagp|q9`oBn(oYmf z?hF61oc;|&yQU)KeRqWqHhRGE;M3sX_uXATU#TFSW&LnH0|Wc1#=rt%_14I@=g;e; zk~lA#>kcd8d(s3k4d-3wOpz#G`LV|y(296appa9l%pcc^f*hzgPD)vPQ(`t@& z_3d7+EJm>$raBXi8z&8v#qo&68@vBxit!44S|4i4+>{WHOJ>VXDTRC~f z_zYhoRMnXln?wPi#x-#&`+xzsGh3tu9;BC$@U!=JO4H$ zu8|4q_pfKtFM;hVQ~2}J(xanGptlb#bl-DOgJ#BJEf?UWg{u+2VtUe5Zfiv22`Qk8 zib|4^4Q03+C{L|@K@bThIE!N>q460H(gg(sjH@Lzo;W=T-+zCWg1#_QUH}?s72-y( zlj*s*RAgV*AnvcVgSK0xZ|xT&WiiH8xCy+tb^GR@N}5rVkyKeW#!>UPT({_BGBPq; zg!)`B-8V%VoD*Ng%h);#;`z+(>zRMWAa5%p9VomhrdO)B2@8)X->bIGv;3R|%d3IqEyoX=XHy zRIFfH_A^q=)SfITD7Z}g9a=}ff1kUu;_wpz_Vy1WViJ8O`Xt<3fg1tGV$|29Ox{fp$~lnXAB;S7c{uq+S=3Rfi~!ftDKyiN+g|C z(c>QK$IKxOQ4{cgV4Pg#)nFU(lRt(%Ru5mQn46(}1_ zR<2qQ(qz7Iw%uQ!zO~A|XN8cN@6QRMBC7L|_`V~cS;a4vHtt#DpUvh1Cf-E;ve0*) zu#WBkD^UO(+t35h!Klde6{@Kv-_SPQDfm09@|SC^MAa+qxi49XsEUyIeE zyigEcU^71-ZeFd#c(7~qdh_xS@{Q9NR zi=94QjzS5ir9?2f#yDM>oa+jKk_KZB6u0E^@%!%LYYvs$MjOk-h=_a~A0KLMRp3=E z#>b1`Sz9jn*T!Cg2BS-5)FGJ8sU{eQ&+B~%V(=FaAfk)`Q!xidR>mAKaCt079`2n9f{=O1LSKn076n3|eG+`S84XDOujr;+vUn?yj#} zPzXa3t6~Tw(`0n2*~s^REv+6X0NSxM#J9xq7D<%+<0wU;uNt$GA2?O-_q7rVWNg(S zYglP+fPQ6p7O!GJJwy$!c}1TH3?O$q9}YhhlI;yQ3m0C8b~p zR*Ez8^BFfM={X^@W|D!xP}_Bx2Vy~RMInlOV>ZN@kFO?I8_j9pmx-1--?I4Uk?pJ| zAr)^6jyHoh7<{QYw{^rvV{Ed0>+Rl_CEB3y)9r0-;RU_a#~jfn>G&&CQ#TT}0D0{H zYQiL|dF{k;pT@t;U$>ojnB39z)5x$jstO zw;h}N_g}OP4-Y#m4X$m>_q4>i6o+9OWP$4(q?f-_q9j@E|3`8bJ6Io`I#MMdmVJY| z-u+;P?E`XC{Ho%`U?qilELYDRE-SzBAHSbYBMIs4Lhjkfb0-G;{O>s<+g_APHXHs5;F zgpi4NJPPS{?ed!WGtK;VHQV}Vg?;N+A-%>6<>0Y5aW*Aq6zV^4c@|+eaO5i>9*$(e zFsU%?4^2YiJRexmL}mc+K=ngN{%G{9Se56}mR&R-}rnLi%7=`TS zFurcKE_s<~2Fr789rDbKyQ@N^AmIi4{K-7UeD|mNhZR;jlWS8_(`1XJ1U3gQnGQ(seba%*i@5{QgXfq9f)_ygI9gJfYm%c|mwz|6uBr%EO`;ZL(2YRL0(kW@z76 zqHn=X1Ke$tc8>@Hh)H~({Y>g^N}|#ndt|%S^F9)PT<+v@@;a>XLIdLcBR%xd4{#l5 zF|qHv7bb}#UHdz$!=T+_u`(jn#cu9TPYxa4dTYYNS-1AFox3$sqI;lA_)z3?M+~?ats#)XMt#2#L?q~TzP8RO|h+SRS`wF zH?vU$SEr+5hilysGV-hH$tXE%Yjv8~W`rS9K;V36%bN+Wlfg1VSl9NSL2>fH>Nxd* z_Qt zbax{o@8BvMgTq3vN`VAa1p`T4v+7>oVHgw){LXab2VNZLX#a3kNS|YQF<{DF&!Gfs>2ICc$S6rN#RPmPx!DOmfw@ zwnYh>MMNauan;3sq0IbKqtCYZ~cqP2F9YYdAc>M;ic$;!xB+!cyIluPYNn8 zyu=j5gM)6mImILU04ORZRaaM+WQQhmW}iw*==)P;!ej?N4i9s(vLc~g*dE)bXp*j8 zmTgIdvcL_)y7+CbJ2i;gSVyP8_vJz=(8YwIvYWj+JKGCY?|D)*pXI#}`;pOQ;CX=g za&mw6JQHao5h*6y_*sAQy1-im{ck|oNofKkBDu!JgoI0=dGM_s{G`F;=m92%p^X8? z)K5}mEk^}KS&cAItsx=v^ROXcyD-K%F5sIPVo8U_&n8;Vf6-6IzOC_u{#p3`n5(9& z$n@*VX2rT+TGNbrk%_N=Tm2?!PO zf)QqA6Tfj@1HP{k*{4`5* z6D=rb>H(Jd2`<7BNQEt@C>x;NkwB??rP49@vK;Pd2(5Nb_ z{U@tydX;vQgb)XF_Wn<9sWoM;^~_iU}8$}wpO4&y1Iu{>GRle(_c zE&6&CN#WP0pF5C@A-Kr@J8z&JP1Xpbg4PMpP*4_XdkDPQM}c!@CO+wZ;oS8L7pmLk z>R*I(Nu&Wd^*kOEeG*`Zgv@9Mb0f71XInP_=hqU!J#=SAS@QYb?&c|K>hr5jA@y0R z4@4z_R77(|Tbpil?;bWuFF<$EU!Wx{ZKFLfAmCvj4}zIOGlV?fTCBH8z)Ne}o= zytw6;Zfx71vq*2xnX>Zc;sx?CMaW+z-`9^3p9*KUP9IQ&*0^q;>w`zTp3wRB zV0m^U{-wDQY^I;@S9=`9qG;Uqt#P_=)mZqCkN-^cyt&QyuVuXE`v!6s{eK1ww>&*` zAHVX4fDBVMcbcqs%4y~{`7#Y#m_MM%#e9ox8KZHQjnZwLI@wlr>>IUX1vJ7y#Tgz} zEDu4Nr4Li*M!dM38~5N*{LJcVb`^EcppVnn&qT%!sShayPHaSc?oz!nN}OvBz}Gag6Z0lv+t={Dae3bn3?* z^pnqe94j0zVy{zY*|~8s_3xk6d-w|TtC&9+{Q8CtlDhlgUof-uN;M~Y=tKxssQ&9B z+|OE=8b16s6yqy~B z;_qLrw3)sjL4yHiF?0iX=(+0MrrT=CT}{u+UqSB?FIV3Uj(Owm@sxq9SFc+CyZ-e5 zT^v6NsQtUnGNn`Oji+C2|M7!T{PXXB7tC+3o(9SS#1)SNTK{^`{HV&w8cgSkPE`}a zKgax}P0$J~!<@e~g>Y{=Wb z%*}zVn&)Kwd9^PNK9CZEK^o&?;!S5o>dv~ly8iwWfPtZA5$X(%y=7(mLPFp(`wkeH z2JP}92St#LL)r_5lo(Llw+$D&{ULh=2RMs4!Qe^1{n8{L7o%0_U=Du6vTd;S0&tD% zASzm~s_ky@@Ja73fScrkc5g~cJ@?l>>}@Xkpsk0`{&+K9d-}-9YfvywGLn*#3MD2W zFx1frdGX>p?j{)9ahvo?GK+192guOIavQIMjk14}n7DXFWhIz4Z-WEhBLG^!dXIJo zW4@oi16FxqVPVzP)v4Ugg#M&L4rX`myoZr+-&r@%i$UevFZ9l9JAx%fRzZXby9)R{J?DCCRV&UBQ` zdBTvoPX6UnKjs}!8o0r$RDnTF&TJL{48JTp$b!{$z&*48iGezoYP~NSIDpMLbUz96 z?d??>?S`ra#TCZ#@68*~Pejzr&CM<4>&VEX<=9O4m;ypV12qUcyCUDm8@gI0W-;Ks zJs0x`MKj*hV+-!wQ1t;pFd=DgBpbl6_v~$KfKFKQCx8#l7JIgAQD#B^w?&SF2jR`3MS3M|8bHF<`7Lzkf$u z9HnakscM)Q_@!fvJymA0xHffrTwA&x!oc~*`2vnqQ3N?B7_Y9sphP6NEHDi9*VRoy z*(2;K7^>Io?Ctr-O24i^rLo-UYK6<_A>+4z;c{Ge^V%~(4zHp!NQS|gF7+AsXww%0 z2!U>!8M#B7CKs1hiMGL6hI$R(NXT5^qf6vJkgT2&f`79(N?%f=W6xD#<+t{-G8#Ha0dX1D1l&+u*IoLB;xX z(N7$yKV;J&9oEEUBO&OmA)dUpxk=7v5s#l0tCoZ&zS!9L1Iw})^IX~g>IEH5+FBYO z8Wt85=)1t)G3lxZJ9k78)OmixS*GRu)IZlbX0b@~TY(?D(z0il2S;0d5-v8&&6_s` z1k{9>SgE79Q(r)*Brsc4Z5Dy%NKhmUKW^#4-ONl+fBz#TEO@|O!7TQF!IOem6GLB= zAr(<|wCDGUvuczyG-5Fk{9qCrAwec~Lr+i7AOqUznC4Z_eE!_|>dvV;T<~u)w6tW) zk|Ki2(ffal>s3K3aGP{I+;^^X3lz77#v9dbfOf~>Q2e|D=jT2wPP5%GgOBvteq4f&*8#Q4@WX%-$!*4rYxp(_2$-PVeIU zTJx_wKPy>G-Z*i5P#r(gJ5QYWUzkj8aer*Ti~UC{3)Sz<1j7)nV4jtoo3-ym1Xts& z^}~veg>7veYmIJB%}+Os;m&Z~V-niyFC4jJEXDf`iJj8_{`N}9_JF~dvuRWH-YxEb z-1j!arFhJP&*oHkOfs9Fh8PG&mxv_Fxk5CtJQEb3c3%~=6}yD_M)R0aLNa+++L!EOstqcg(34~5e`ff_*9s; zpVGotwC^d)9Fg+-hW|Oh<9Tu;gz-Zs z^|Cg<3bi?gCil6q=s#C5MTTy@6_Tc2{>H&2Cqt6%j+q;ni5VzbF^i%#?htaMHm{eV zr4Brv&c`1~oN5#Y5msdR9@!K6|zy z3OEEJH#QlO3seDp5zEFsNsvUOzie+O=e0M`i^t*0_+d$+*FWywmj^Wp2JtUmZB3$K(doHgIScHUx=;$O=yMG^?H~mm)DHk}3Rz?>; zMqlAFR^Hc+FovK2N{+ zJSzjRH`5de!_rI(?n%5@vRmujGF`sDfu{XMn8*W2%Dep<Yt#<(tIyD`2d5td;v5%RRF(sm9pLAc3RuSROtNOz=#XL@0ph zety>}FS1NQw#4YoZLZG5lw}F}mHH5U@5xE-p+{yWAA-Fs^>}FLfY+RajCh`=ogS4|!4`TRp;6_u28jlAFHD4{E%)zR zO}AYA9qtmTJ7cr_yY5!Jv$iHba!@>3eZxQkLv@R^0^<2Glww!;V)ZR4m5hDsKqR}3 zJ|ZOPs};@~x1Ri6heZ{Ma!;OLYL3!dU}Rk>8Kat)M(^!!U_M61mP_AL>3|)z>F#F2 zZLw5suJL3g*%uX)c~V9}@#FZ>n3`IVl@47)r_#2!FA(@ftvkSbn}-DZ?^TtfkFa$t zm66?FRjuvrsT36YMB<@gwleZi6VWp>UM0}b-F?^jUE=I#(K782p_kO`N)LC15lZxtQabe!uVHMd%H$-bI zDW#D5o9h-+jYj&D)!P=N15oS1pBO5b-eO^>8`zdP|5F_i&OjR3-Wk59ehiHyet?1} zIeAukYBA>Reg&W$*jw<-3~?YN>#X*{yxHBjYpU6o5gG;hQig^z5MTkt`k(8NR?vE; z?OAsATbr*I!`u(kBKD=iV(F-#k>(za*tX--l|zXX@GIHT3Ja*Gh9i+bKn&=Ni-*EG zALe!?4%Sb>hqg9hDxa<{k000wfFjaPWj>{)VCpvto}O$9&~sHyV|{Zm zW7xH0S~AimNwTn2Wj{sO=Lks|1M^Ln?S~>)g)Gf|?*zm9p&8%&JRoxZ1RgP%YmJq#ph3)J>#-_RUa9<3fDorpO2$EP zTn1TTx_vJ(!D?&CcDw1Uz65N9^D{_pJZ$aTNwLPvk7+Nfz&wb zF(RveJTBMdzXI1jmF&-f*Wq0JnMU0A{-tKc$5}rzwdC31;NC6?^D@Yj9lEAqjeeS)IY6OMr>WT7mgmi2f%oHiP#ztw|yRwH@KyY z$_C(6mb|OU-{%F9-*G$u$RZ~;FtBuH+WKME1XGNE`DA%Eia*+8xwr&y=4=xehxIQ` zA|iBv6afWzk|hH7>DFwfJ=f7rM|wC#Y*>wu0~SvqeUHYxvIEFjV`AJ}zTUe1pF8Ae zR(d^q_SN~@WVqv;<)_HUF6`t)bDU-mMNzh-NG>HxiGS8_*7 z5>UV6a=m?XWR-XsTiAGtPyYzmFqM|4Xw3?4sTja*zirqN-4ZNN#A+v#M-FxKQBum< zca>QO)*~2Ixs<#ycDTThjR%bmfva{ zYf4a1ked>=#oSZAd zIdtmXHJ+#P@ijEEK>q}M<_C)EO+{g0fo&ce3XY>MepXg0!^8@WO2guxJTY?J%$%Ju zq|1;`+#Me8jl@V#d8{7426(nHuo_dR31t(2f+AB7jC4}+f&L^gi1;j5ZU|xjIJdE7 z`0bD*5Mboz|FyN%4?D@y{~_$HjsIp_J~{k>b|;)=D_oO8@E#stY%*gUM&D0yd> z=15VnuvLGK)he-)#iT5MR`4Nf=AN*D(o5PP52G1mEh$E7@?V#v$L{X zU9c1~<1L^o34RAMvt>^5aCRfa@kUo5j_b;0{U;7r)Rbird?#J>D%%*9V!QR&`5VuMrh&oj3@W8u zuj^c1WIA~W-{-nq`22Y5&quN4UMeWFlOmanW^x`KLZo*O>i_`Vq~C>sZaOEYgLluS z=HlsQD-0q2P)yIT>+3D&n;W)-f)dFn_TDoUf-uwK1qd^@^5-y>?{gY} zcdl-@&pW3wSsWf6JSW2KBBXiHh=)lYj2@~2OyzG^$=PF zi(+C*3M^mw-x2pyKpUMBf?FrNd6N`*l#gcwtL6&Zqonb0Cfnd4sJ#r29)d;@`Gj|i z$__Y_vk76KVs~}mUjhAa5cB6YW|o;D6X1~pnIiTfP|kyK0ID&WlujF{hVPP^k?|R{ z4NXzmstT8Za!s=N*-JKgI!ZHHu{}i}6RrOxh)X2k(jkMr?5ZI(CQDP$J?6_f@Uuau zR*>^dR%gKpFCdUTr(PRMF*Y|hJu*TwFoA$4W$(a;Kvs*N`GPJnv_RmE|L@I)hS~1z zynOP+WaXC#|FhXhC%mUsATY#{tAoHj=6n)s(5IUhB63@A8MNQMXm_>7*}C#yQb&#i z8J(&bMJVjaT?mC;p0;^Dgcx}KJl2?}9Z0K01|Me%bn}bJ1gWw!Gtv94kU%LHnFK4k z^tqz$MiKsI8{&6g+b%7oIfKJ zvGBwEel$pvKD#r@^f$2Ajtway6)9-Zc8LQ&2(T(=q?DptDr=gXf4sD1bRH;~BLRyy zgo2I&cPxa)P*V!Qq--z}h<6FNSN;+YzMOLDENyd1$pbLp!ZYk~89Jbqzi{D8m%OJpqF1b?vIlNF=D2Vd zG*@`2UP+>4S7~Hq$zKt4>-6*9_k-lJF0l1+ye#M*OD^()SR*z%k&tXU(5vYu*+65$ zhg1pC8->-An8+^V>s|ZbuQw~X&s@LTI4_?M1_;~RkILSedMDaIYe;1jGOW5UwqkSs zMbhkYqA_Arp`6TN+?h1=B7`#DPM`*wka-f6tSa7GRNKEzVc(n}u)%*jm9YjNIW1g` zkS;yar0;H!w$~S3vG5lBH#YO<_aAmMI?h1D0>TVn<=-1__5T^b`4gNm=Fp45SM`bC z9N|l>dY<1qwOR_e$G$f4Zbm*WSAIVTuE9TYt}((;R<<9`qm<%4^Uky{GTU4_mlSso z7~Rr-tiAPxqZCC`?8lY+jCjTcBNa?G@^ZIY$a}I)|`J1l-*Tay;zpT!OZnE$zEKeyKJyANST5 z5FxHsoxVX%1T1p6vDh8XY3OV!#+)NT7ONV8)d&S|Fu;c%At7e>-v~c0 zpLuc`W&Z2)<1QRWJol$!hVgQN(+dy;^Se@A;4a$W2b55c)DNp#IwYDxd(ihzzMni}00`r#saO|Q z&3%6PtA6sl2o;jw1W4VI66yCX3UIwdfN1?6ifsI5*nzOCRFMIk3lc9#)6u|4l+ng0 z;Shsvq{~;^nV(?-s-u<3Ty5<&P?LR|7ON|<3XM=pP5Fl#OCSks?yl%=SyBgGQlVpT z-bXxnLe9%A7P+v!;q*sBYtA3U%L6W9^>uZ5CS$)Zs&;Cl(Tdr)o+n^nuvqo(tBQN8~wHxT;z=2wLwE= z_cg76a06OCXWyNXJ2RRepc*DV|2uKq`z*hAR^Aakz}i|*hJUJsw!?JjbL`i?p^sFv z%JGya7)u2v2AZlEjMg-5MUDSW;iQmYeUa=Wwo|QaKDHYW)|Uu&hG?Hab+C_!ek}kH z1&$0-(u9k}@tSC~us<)=X*;MvQL@YYT5^fwD0)@U*cEB6LX~~F+Y^LNBsKqb{l}kT zM(7s){)hKzbh;UIUckgq0ne0yf%zD|Ovatt^t}_gCK_(Uf#z56-6YufnS1hmqVuts zabVyZM`wh;e+0|Nd*NZnAKW# zhmr59hg<+-|wi-%v;;D7ncjQ&S98^MNEx>e*R-AztGfk{cwx z5WJ_uRf|ti6%BmLIC##N|C$aIuN^oC#DEKoOsr(d&U`b#?h-$xm)CufWPu$P~)X>$YXE+Z_K51}Id=JlzmKD*5(? z8*F&)-3T23L}dn-BU2Z_aRjN6|EBB~vPBVfIbu^SC8V5++jPicDV$*McQtz%YiMPQ z@Ae|`-Qcf7HX{#%$tpuUXssNmMGJ0g^fNB10 zo1uvY9a(u>tokL8{GU3NR|!N@M8Fomb`5IFgWCFTO#?WR?1G3Qgv+riwlKI@m&)8? z^w-}@OTr>YHd9>EK-+_NB_N=KqFMdNkV;y5sgJ4^PVBFXVLrL$5T$@vM!I#4qgNdZ z%i9-k2M7t(ThgVOb{kY>!C9>O{J=y=^)G^|@F4WPNDkw98TZqE21X{Ig`^!4U)~%8 zrvH`r8(p`20}KM#M*A2wPwZjL{*SBF>1@&e!&U073&p=deZM3>q}TzX{YMf|g76s+ zP;=%2^$3h7*tf{SiM=@)f@=g5v zWxBR;=(;;Zh}Ldng@Ws!+cQ1SeW8eih~o)R)NOjdf4 zmYyzmTpA~mT`1J&3+>Lch{l&kt>V|x*hwJUXSjVN+mAohL>eV7RPVEE`6o*0?i^M% zF9$>fj+}iWLj2q1#}nR7%u)6*4f`KdAFhUTsM1IJDu}Pa5iQ{G|3_Yyn=tD!4W(mN zcK`-KKETW0$iITWv4ZUC`(+~J3ja_$4*v>P)=`^c{~Q4l2SQOexWLiHkk;(TAoMVVWW^vSsb;>}1gMxh7-D%K2H_BL#?V z(Bdw-@i4LDxT1x7EubT}t6~#g&Y7Q0f3pf8}ccAx=((S0xyoE4_ufr^qX z1fs=%2o6+B!&TmcelRZ>q;}Bn#$rx};UaJk z53^k#a7=4~$()EpP;t5HW@u$NGQadCoqR5^KGbQES#S#;PSm1-$oTCv8hU!*R^>sf zKOi7LoeLNX)ztADX-*%#IqKK??L&iur)Oq%Lb+5uV4#Glg+(Zr#Vm|X%rWe}*QpFk z2Uz~l>o+kmfp&HR0f*i8dfG`1G};l5!mn4*mWclO3;MgBjGdl7vV!*#qUX?Ke zSonq8i#0-TLBg@Nw#F{|@e$o9ClKzT`^8vZ<9|muT5Sfl%0Yki&6BzY-o0%TQc}{! zv#pe(mdB)~f4*#l{yPd75H3EQFd4pj8hXQ*Xmxw@R-k*Yxe1FL6m{(+foi)jMOw3j z4*)wv#-X7S4VxiCGdenYaz=WN^L`Q{AL8LpIFMIZvnLrhyvBn|MV}pC&A$~KnI0tg`Nsb0VL^`h-m!S zR0{GQhAvPJ`Q#$XAz4dlrkgioGBD9SD674lH8U)K;~OSj89EpYn_PaLF(6Cbj1EL>!YYm`!_edHh8yg>A|A}=cwhb4y(7}QA zx&vEuTKEwPV$H?p2;o6tVjbUEmt1OscquEmfa87FT#}asrQs+VAG7RTb~;=6`fs^A(5mmd#g3q{DOUVSl;niSm~I4MX7t0&A#5EGAMRgb%{U|_Y~Y_jc}DVM z$u{qmfY**d9%OhMcLC_9-w}A6 zb(w^F9)1k|H-GnS*bj$luDODxVG0=6%mI`gP`o`5Xn>zNariU$QS-l;>%q7|F$=tb zp+_F`_3JTyhtuxBx&%d;778UOxBDblUNUI|C@Kik^4Kxo_pUl9O}ZgP;t`zwKF(q)@|8?}9Py*!_m2q3qwdK8N{U_ayA@&w3$KD7%EYDy{^Ib@CHBM2=eFr!1XsQGTNIXa`HHQ4t(BuD?TR^;! z=3`6nh7L2N-w*!gKLLD_gR26t^ac{C)3}Ej(*N6EIP7W9iTsYgwZup7lK77P+8LUh zHy^+L{`A{<5c9z~Iy~pjM;aO_T?H++fH;HE$bg+zcZ>(sIXU?+Tx^AGzeT<<%`ou9J+?T8SNg4dd%YkFa zfA~a(!6@ex*6%})ZBA00I{pUhG>5gzFGZumGL{R+s^h|{DB{i`U)BBw9L^=kpJjqi zsQ}MuiKjktIZW4z-iebQ`~CBHUEj~4!9ig0e%E+`X6i0FCGm9l7i|J_5Z;Yr@Vm5) z8YQ%N_mK!NnrK9wG7jWC4Wee(D7|a#5 zNR3wm=S$AZu1;LS_3OIr$%Oz-K`!mm zwKCVgw>VOBl9#G`5{wcO5)xQAAcV?f<5KXFQBcfHO@XH*#rgAB?G>Z;fYaJUM@wKN z9mHd`jBd0-q0tDx7bTxXR|699XzTSd5W6q^VwQ=Q_KbPR&u_-Q2GaBQj*c!OSw{W4 zkRQ@7=I9vyd~Ppv;uQkwg6WzFP7(w|bu^M>XCu_W?yQ|5ioF*e$A7G5rCZHSSC6Zz=y@JEiS5=f4Vmg=}*ntF>t#g89h@R8NgX^Gr2@5yx!o+(v* zq8?@-*F8e)kTD@jSaw-mZZUjv`eYAqk$=_U83Eiwgo`O_xoK|XZ{ zq1;q*XI|O_Y@lBPoMJUY<4i?DTeG{nD?rL#D|&fKoOU9>^#nd*R0nr;j7EcB5#}{5 zUdsUbY+;N~=-p3FPLkx#aw$a>=(i~{#wg!GSA9}G|W+T4hd z--|}8V_@KWwEAX6nFWN*v!i!Rh!IW>pnQkrJLOD1gz$%PKD_qoR#b;H%R; zzGmMG=1;?Mz;ALkqoMFoD6+9^#GZj-M+i$f-&`3^kJzUm{q;#uMBHDt4MKRVv$oZI z7r`}3aG+V7FKO#6gH9GKp;ggqFm2jv1nL1OBKR7xHe}L*I zZYD#wRp^Ts(J6Vcr%xMtDVMBcbI)q*(8}}BmDGQMLk>9>Rp67|WtmZZN$5F0KQF-- zGBP$6VW~tS{%4#z+FCfxbS_zr%fMWC=NMXayn5Ih@o=S~gWA=t1Ao5tstC*RoR@FXi4d?P>DVKMVfQZZ=vk?T&khqt z_F|4OHJ zsIRaFFoBu1esKV$KBDJGyNdPgo#VhdzGt;e^Mvd!%kOEVNdxC0y=uIPu`vJ=Sq6Ye z5K&O1Y_*IxMkFOB`t(~at*!$7JxdD<5f&5|+mBTHK9iC{gcz{zyk4%FfaEdh)gkKuj6(E*x~VpI(wZ2%w`+@{9H z=diJrfb;KzPL9<wNEtA8)q94;CM5z+kBt2o&tWN@g@ zA{3uybA7!l#{n2BcscM+VK2&GCGf7=yOkQ_K6J^_;mZ@k>^0;z_*c~rg-Y7o{sKpBj5^5~XW zPnLuhA{6*pXvoU?olyhRELT=Tu|42gACwWlqw-$xgGmy9l#uUmT)a$zv-9QToYxEL zma;u1pTpp-3Cbh(CoKdNTi|9ia#F<)io3`*0{b8q9q_U8UX)l<{uC_-?m$27k?`uX zhOe7UBkuIl8SS(?VP*z8o$5tAzU`~N?TPZ~;DjO%v+~w_7f)glR+hjAr(FSLY6HNg z>cxbVB3&b+y}8qK8Z7!f!MniYhL;Yz?7Ohp56tS^>9r5TWgSgTQq85qw6yiVezAZ7 za=EKzhodiDlvZsZ>(tI^R1!q*6j=OUzI<8qi4G%Hl&o*CTAQ_ndINmE01pgQk@TU3 zWAKZ!n_Hprh_jj;;3)RhyJ7)M0y=6ScoNFZ3E&5V(N4v@jwn zH#{tiHk5x0ETf{*XuKyb?X9HPSKTOSY+Qg{$38vjN%=&x3|@p1UYTtExf0jlbWwf8sRDi_oT-q&($#>c{JQ0}zL<@PccB2*G&yh0V4=QUR#>4Z<9cn+?iH8i?Rv7b02=blRZ9OW&U0s9NZ zQeSi%!#_x=tEmCmOJhXL{~7{D&^RyhYrdmLkkMDU4Gj%GJ_MQ3G{MFv1s#%;li^4p zvUd9PNwzHz;1~x7ez3b}A&^{NT1tl@0c^TC;b-~ttyUo4lM#q2^~aVgcr^r8S**ih zNl6BdxL2Uqk0eomLV$;xdpNGzmo9-K4?oPy(kV?3l12`j^>0$i`FfBnL@z55y0WUg z`0xIKY$eTp&u*nefqEU_VJh-P@V22*HABA(VmDGLcrBSd3`uslF6?7|@h>u@+%V-F zR9IT-0?dp`3!5ublNf1!Qf4hzQx&6#Ne*Ba1?F;=l)H4=!ybiKgmf-{M{T-)n9V2r zH}vAXanh1!vftf?vy=(<-xTZEetbrL4pP3|r*~RWq__tIE%pm^2I@c&lehnbK=@~3 z%16=XMR*kp(SD#qeilB<@0OFuF#(Fe|F^#>X?WvA-K+%Z%E5W^M#?g-u0Ge!s*`%d zUx(pX48zOS13H0Er?6SwCw@{Jji{ex^%hLEC*kUcInEoV*T_%pu36IYrnEo#;zbs^ zN87CQ$F03?xzozYg*!vMY#eRUUGETD8{cE-i%M^%u>ZkA^yV26hxI|1io91i)2dlt zxwS6nomEoWCy$>pvKOL~wBeyS!Haoc88Tih?Qg*GHykdotC4tUuNuE(l5FqK0+q~+ zkc(rRk9?e2^s^u=`_3Qh$N_YaKc13cyVE+>Zd;fuIVe=4C6&{aOyz}~QHOE$K5?=1 z-kM*R!m|6w!(914AM$nFsbdUe|9&VWr#?CyS@)~tgV25qGJOWJ!)w3zGxh$@<=~?o zrABa-yN&dS16wg1`vDe1P<=qkc0wELkLO;!(+ZA!Jm7ztTsl)dL|PV-mMyN zun7QvJWx}eYc2Hf@L<#^r>QX+{Ux7msN8670#P^Ab~Rx0B^<0Eeqyv=0R&z(*-#_@ ztP;n5F9`n6{kUT3vEgATrz4>LGdG7e>O!EImzURY#vHgHj;2GmrMj|G!Vkoda?tJp zi4;L6khmyY+gLi6;BIb#X6nnAWL~8_QymCoLJbWf`Xrx+kO?)&<}d3+erMp)4CX*po2!93aU(~5U^M>0Q3|R)p>H8&vw%kRGl0_#l?H@8lxVOe}V%s z>8|N`1GpAW5F(c`T5J7#+opMX1pK1dE|Uc+_SJSAnKZSLOM87<6q0pqSMyYWL*03 z0#mlflw97cskYmmsq^zMEp?YhYncYl6Fk3?|UCXV~m)>Un$7!M5fqXIn z(WubyI80Dm&x1OaKW~IhuZ^BI6|MvSGcoZ->FMd!GOJ=6z-NLefxjhHjClpgcbd?C z(&6~)mk2G?r8wu#U7UiKg``2ti6Tbw^fZuXba`gB7*Q~)p_}TV{kt*%spq3BI6*sO ze0$I|gCb(VsqOglQ(E$O!#D5PyShqM58V^x4AJHW z@Q?#f;%vxix;i@{#T)A1%Pq@5H(oESM!E}&kWk1bK3{-ZD;j5}A8$6YO8@&owjswV zSV$WE1oBMCb6Xq{H@`Dq)Y753DmlAOizP2FFSLtjPh5!w!c7|{D(SwLit)orLtD|C-H*X96tLR7>hUm~NTpt(><_Rwk( znqb12Vf>EqwE&l`!47RwP*)EJ3G*UpXLty-`XEbAN~9u>z1#&G5Tyo97cdd^*Mzf=VSr#KNUq_X24omS<<)#d5*W3&=B~r zEgHdD0!WrLzh1|;FmMrNd7f*GS}E$h8ESJqi`v(BP4^atdiBzkE4LAx2VS7*%a>=) zonz{O*ZtnOZpOr4oI$~2O^V^b7XeP9?;3kj%FjWIAJ>y4Ma-!F2#&E|N;{BBG`&*^ zd)fk?nlRdfy;i35;@WI4SZZ+a5Pwur9NC8DIW zSAFam?24W-IR6q#x?`USREXVaFo%NZu>BTW)E$ia;Mf7^f@g4saPmp&fcy8jvZ;|g z4;$HpE%9{!u`#8JhBtg$`&IEVdk*B}nFlpJEY8)B+0b`G(iCIrHwj?@KbuW|5Yah@rexGG$d1FkYQ(c?k_O`HXt8}tYYUt$3AW2YeBK}32wpd0+e|4vu^saEIgdraQSGBsooQ+QbiMRW|Bqq}P(GQ~u$^ zb|=iXfp`sR4mm4~$Vy7S9A?q%`af4S49(weo*uF6B+7mH&)a}^f&dHqsmC1v`Ts$~ z{y#%90s$T5RDS{v|Cb-R|3G^#rQQC={_WAM$f-U&bFK8(_FWCe{bK+A1W6aPipj3M zKQHxSm`WqlU}-L<@aRokczA}^nm>QOY(88NJU5Ui2LltYMZU)o-Icj9lOmV`JxPeo z!((FytKkLu{rQL0Tzl{1 z7q%nUgb`tV(zKt_9=n_I5Nup8XxCHw*B61%X?A`fOuPy6Wm=8Cq&ZDwwXx%I=yda0 z{%8HO=ua>z`+!Chz1VBvP~mQrXTSHN_ovkg_hWa%So-=ey$o~-Pc|mz-<`ZN;$EIo z%*#o7Ye~(f)G?%?vLImqGQ*?^O|uEK5|dYW5RcX5YTTscP2G9uoB((m4WH z{maW*mjl(zXGMGnOz5bZo-(c_f9F?93!z^mmLcP}){IHz#K`s~(@IGJm?+4+5pW0z zVb`J=lu7h7G^ikI)Kv-IUX*?=#e%x^Q(>f{A&`AdPz0NHlw5~RN{X>D;31AiocUto zWrct}yr15-!mI8&=;(BVS#=FBkSgpiP~zIDldto{5XYpuq&24HQMx_Hb3?INH9k^6S;LFFaGR%*wTXX86PtTWyMX zYkIRi zn`OzwR34^Y{*uRO=}#)kPUhux34)zH!1Co4$&pJi${2{QrWV;LifeJb`KRlG+ErG6 z_7}rL^on4oq!u>wl#WivrHTo0c~c84PvB3FKVMj1kSwpe*IP@>H5jNJIIE*GT^X3} zUe0#QR<gJ9158qW@Vqk14&uu>0N85;Lge zNLXUSb5MiGe8r7#u9c)WHD2a9tk2z+x?Zekps9YbD5*UEySsF8wMR zG+F)ky&I(wCSwZu=2R*<9^tu9POeI%T!_1K#iP?kRu-@EmOQ$nL0EyUz*iH6x^^7~ z))eZtnR-$-<-BUm)Uy`i8q_Gqw3qfxkk9_L*7E3P)DkE6#5<+1jirGeUcd{sJtW@t^Zx%9|6Jm1m z->`kFSCthWZZp>tKvR=a(A3q}r$87fC#5#us%xSnRV%D7G1jt_wVuTUyY`oDOHZt; zuk`LxC|AHz^rPMd#;nFCZNyT%I0n!n2nBjH(oCG~4GIadg&yN!d`Nn8<3@{jLW+3k z?;=}=?yME>5tv3Tdbz8Dg73CjTZ((T!6Vv4$r37#by_O;vJ(bRse6teH&Zoq)L=WQ3l?%=U$Vy%wX6)O#nK!YxDB#Hoo18r!yILJe!_ z7kD_No%w5Oryp4l4^;cUqJD&0pTD~@ItKiFa3V`*rd}1xe!#pYo$jq=CnmBq-Nb|J z7*3dWihN@82NuPyf}R8Gm%GO)$FXVaG0}ReQ0wtS-}CV7m;Ii?2IhS(L4~Udq*S7T z(n(64s~~dzdmrG3Qa_r>NX0q;%QnRuJi(TA&Bvy6mQ zNfZCcCv0EBK-Q&XnHrf5FV}~}fvE$nJzTw~YCE6dhqN$fWMo7;IfV(_Wr3}nl9o!T z_?tJ7qc)IjWp&wSb2Fx$7A74=Ews3=Amj|b)da7fHZy+I?DhH z9ua(>c@lr?o8IUv#10s})$c@fanLik=P7NwGOxM*qoHycI_~e?`Ch-iP}ms!rjZvG z(!4k^shh1OD&DJQV)ATfhpy%s0B$qgTcKR+qkO7tv8jHuS>Tdq{xUX}{*Gdss8+I6 zu9hg#iru?ZKQqc&*|@>0W}tbDLMiiO;jJyt=j=(3RA)`P;nw0f-ObRm*i-%r#A;@( z3@??|xS`~p$%Q2oD3qlQ<1f#8a`Lq3J@TQ14TgFT5TNnz@8?ToOrHp1-=_cdtiHh& zCuOv6f(hM-}hFRf6{-ug;tNKaCZlXS?IK;q-v0g2Q)nl z7W(6D1(S9GChmIn^3nEKEDkr{SmY@D2`+WM-4cOSRf4|fFeB0JO|>)K6M?EcMu{jG zfhWQ;on$=pFmkyi?#77qUsyd2AFybd9{7LIYj0|~UHx7$HBlV5Y6% zVjqdkrJ+CP{4M6BIq3`HF z6JmAmWmnYi>97Vf&f_N@HZ=zs^!J6yRRyR-ldqE*45U$^##(d^HNxx`Q$ZfCup3}COH0p^- zMVkKUBnixFhwYW8XH}Sj?*eINKaHbHg#_eRTU&Ki74_BcGZF6UzO=t9JqL7jM0t3w zz|vS8@wfE}yeW3WY+RzGuCA*-#aJu4d@EC3Lr*-25LM@V;Q}u*KHM@(JoLp#dn%Q@ zJP)=#$JFvfW1-bakQqPai}JR#oRIn)!gG&-p`o=^3_K>UtoTQ}uKd_8(lKm&=@a>5 zqFM3Q3RX99?b)@?^eWLHtKwxTVT~)^j+BqzC(z-NEAdf9rP3#=QczqPfmCs1XlQxJ zy#$B-+71lF+B?jpCW=D10|>6n044AW!Ej%?_7zcnZ?l`C&K@Vm4pN~&4H~m(F*gw* z-SJsN)$G}4`4)J=>?yXHx^=s|zWxj|TIxOb%o8~+jj_xW(=LsK&AuU>DlmOKVH0w1 zmLJ37;Skkn**rtgalFL)$IJIMOK15Hz~Z|Z##aJbFz;WR&ME=Bp%jZq%7^xAW+qBR z#H}?UpIt{vMqlXMTyKpBZG?zDDA7L$_f&$XxydYg)Y*3H6kWYa5qI*>6Q8b-Uc*CW z-P3>m*)YgrPE5bytMh-7EJ(s`K&BLaUfq<5*!Kelr%;o>d{ZJ8UZkXnkB^h_g?kzt z14UM>GFDAlN&T>~%I~cXx=4nr5#5QVAxEK5sfNl0`pP2Ut@sW9=HsgOyzFvAM5)?! z`h~hOAeH7Xvx5WNQ2lr7V<*#e;`6r*^ z2^jHiCCb$XGBAB{Bb5Wjc#LZp&3mU;_$l~ClHA)dp^qyu!0UW4*XOA<7WL!z@0h<% z^ujjU+noAar|0>YX!f%gr?JIPm0V!RzKLB84v72PlgDq)*wuNl&_p|&zIahc4-`!D z>!U%(jXzY2m_o>)ljWwYfyN43FjrviU>d4dvxvqj3&NRvg3u*Li#{jM+@i#Ai~jra zw%hA_oHYG**2OP>y!%vLvazHwJTTjP!fho?!nV05+-dC{VHmTO1Dh%OL_nJhZdHb& zMas%OzYrdUQ!^{=-9jJ6zUa-4jnOX|GoD9su`(k3yS6^4*C;RwAjLm%eaX7B4F<}H z7S~9&0gx2!lzht!2DC;ca=m_O3$i#kwKQQ0MV-``zbf@*Qg%sE&+w6&P``(q=dLRU zYN0wTC*EYtkMUXD`nD9^%@}hcaPCD5>A<4p&#xi}xasAtp&d?eVGj4z8ALK9IkX!I z1CyFenyyT+Q*O${rLtPhSK6!lw2h5DW+!P`)neYhZ(zgz zpqf9Rx4OiaZpiiM@g;9P)LuS?%y*T&VAk0Eprny-Ebdta&z(EUrzS`I730#E-W+3( zyHkIQU1WK2HlGp77;CG0LJq)R?qEk57aR3oU81UZE@w7{O+nuF^}!|72I%B(VPGe9 zWiGjVTJ`URlEr?hc6I+@<>esB!Vz6McB$idq4xum_cb&B?xBkB4W*tUE`E!l%aA5j z{hGT=^Rg_KreFKZS&w_Caj`GRcv}KP!yuq~N~Sw?XxGhC(EGY6RxvEFbN=*BGURsi z4~Q&jSh4ibf%_l#;OPv8E9ap?t4xPfv$>E;odd1czUpI49OZoJc6|tG#MaLF>vEqy zU1DYmoJzWG5T9KJP6T>g4Y=fF*L~$uW|Mu2cg!9CLY@+fg#~|zdd%U2z)8k)ryZRq zx7e^)64JH3QAuSk`SBFr=+naB$$Gtibe!=Y+dsnr7XSeU%m-M}Z8xv25@cmGkl_uv zbpCgi&a=6Kg5{m9)1lk}nxCNGy3i`8NVhk2rv`GR%!~{V#~}78d)9Y}bz#kX^$8=G+eq4c$0#iGm_Bks+RPX%TEqHL*u%dyOy>UXWK!YNJ-pGkS&dN3G((#&< zeyGj83$B^4sZGUCX;3QhieDB~P-reKmFPi)J^;$_(-n87MihsJrXv$uDX!iqrR2=@ zTm+xmMqJ!WdrPQS5#X#q-5w`mqpUmwF3fT5Vqvn}rsKOaBmwld%t+Xi6{4JX70GY>g8R|$BD{MPEDR{yTFfywbTOU#Y5D@oJ>mR%=naIy1%B@QSkA`%cXpM>{b94 zxZEfqEJhLh6Na0|0%qULR=v=FUo&==@+{t(j~Gn zt>$O}oXh9EzVzwCv5bA@CiX$x zfVCZT_pp&f>L~v@xZ3_!f~z6<)qxi3pMMQ^clZkt6FRuy59s_N>+LS`JNGY+?8E(A z`9Bghv<6%q9ZR~6EMD9b_~Y`Z zVAwNbznruf{`034?CkjhF87%IukSzHzL{!9nm9losy2+yxdeaQxv%X#v-pkCpqT(+ zc!;CtR3O%FiJkv`KU*=I`tEQK=h5am#}z)_|Gf}IA<%Ovj!GT8=zY%|*;QD2 z!Muf3CjWV$Ee@`3@L-|;pFahAN6KqqFhr(GBKHIBkXTqGi;GuJAFT3t$ADN0K9bHa$3-w{*Ve=dT_dP zIL#oe;7Urx_(kNCAS>_7Fum$-hEhCI)FIhZtY3d2*8-Sb{0brEv9+qfAss~Zt$yT^ z$j~iMGgRJozEsa0cuo1+*9gAb(6B zY?n<&2yfdoHwRq`^Ypqh+|-9v*hgrY;&vs?`=)m!b6=k?!H0&#JphHKXObLou&gJd z{NR8Bi!+VzA6~2(KR<~FTvm8%OEXG^L0mcZOARXTB*iTlU^+Y+T@81{Obg}J%2Gn& zT2MP|ZkI?}5Mm>>0fBZz-qO<&+|QljOC|#koqc`FD7QA=4))jHWveXHZ(e>&Q>Q|( z=X2M#657+RXL~-U6bao`Lo4UC==S%i%G)iJ(TIybk*|5~5DoLy3mJTdeAm|r23}u! z{rJ)te6b^l`l8EvhrjA-uEiaVoz2&%$6R3gGJ^RYC9E-4?{2xf@sUb+c5fFHPOT7P zdDR{=D=N}~7r~oj+3vi~GYw(oA1@5(>H#DLqhINStxm2sZ`;g2@Q2*E#gS=ix|QxJbwnCv8c{VVNBW<@ zYJ}K`n{N%SSRg@TjQBTzV}>f8{BH$emQ3F&-R?UAwuYK>kH}#H$@TmQAK?$tqJ>e+ zM;PunPTFWrz(;-bWJ_gaBxZJY)ohA4(|YZ@J!LMfgV<}JCA4wc>0oMb~w*j~tb>^3WIfHJ=GOo|ro?810YF3^{ph!`RZ*42GP z9^X+BksNgakY%c^jBZITfDwSmS0e8A6^*mGeyf z%=HtKV^e?>4~}ZFTbt+46;otsiPmp#V+%h293x_qo@Q04FGHxwcBhaPY<0eV5cmLv zwB|kQrP06RsHs3mH4P$jO@+idU$e1=G+-_g<3Hnnlr88T57nm7#;<@Rxg=-&1&^~< zL2Rv2kBmHO$=H>5JWgC&T|WeKLkxOyCc83uq8@NYOFc+`F!7DkTJnXF*;Eku{o2O6 z+?p_=h)l>*h;xmg)58%4HL$gPZ7Km|0!7x9wUTek)!XsyGe?P;dtzR(`fiD%V+aSM zkp4|}b{P{JSD?QOg|}4$|MK>u@|IPc6l(m6gwlE%B%UEXGGBQ%gUO_x;>q?qU{OC> z&2zjA9PiEVJL0k~_c8cFZ84e%wk5KDq1MT{kO|$}n+53B_FIYLoc-GOm{9XQsCCk= zHdg=~RHO9F5Bj-EUDiJS{wi@^wS9#SE#h=l<`wRHq3I9JMbEY3(SpSgC7#6`IXY3P z^T($vdbdWHYFk&1_pSv^)DA_2+xX_=A7aMYcLos<)Aey@V2lu$;j%Mn;WL@8goU1=96LC3zsra zTE+(Z1>#hhwrI^MzxOyt2Kd(PE|aHBv9n#)+!EL@Fy2+aQR{Ieu0PQ=&x#sTBi-kx45aG zpdb=Ru&_|ER!pD#7{?!KNuNZ8OLAS-2!L;66WkJz&~&01i-I03MM^bq2#wK1lXBk*n1kFRe?hy zE$PR%{VhQq9f%W{OLTHoHoGX`L@XBx#u27VaJ^FZ;m))&vsjV+#;uf<7?gSnH3c4y zQcuwvb=zQwQi{bsx+UGl0>Hy!`uS2BQ3N2Ej zf?omw2_1Vdu>T{Gx(D@DQ`fL445hW|0sbF6nki8y>FBUVt~lj6=)-w$gf1tce|hKE zM3SK`^J$6thGpDUAfBX8+Cs{#(U60se^w607W1U2s z;3y-mrVpoMn&Gl}JznNQThG&OQ|&{@RH&HCBsThCl6`lkqp`of9vOSFgZ&H6sbQ=B zw5XKXZC36caH{(8GyEX}7Vj;Gaxel)t1Bg6eNb)bbe#6&Us0SEdDN96RrX^!jV4M& z8`YPXKbWdPiPT;L$00u{ZH|bUwF*VTJ?004ljBIV7~j!aOU4F~XOi4GJrc%2C%Kl3pCAFei;E0O(I)^-oTPVT{|T6=X+#gn!$g|xHF~3 zbb;IK7TE3aTXN_>fBxcY&;XA!bTmy9;&K5_%RMX6Ww|jTTYdXMiBcZR>f*>Ns}F-w zlRLyF)n=3!iQ!PC{Fm1RsN2%6@+R87`p|dPzdVPS4PB@5xwHEx?u)mMzk-8#c@(e< zKI4$!x(pB-ZW7VAs4<#XU9JIq7e`zefBzH9Y7_h$wuSmE$9CCq;M_|!Mk#4&xwH47 zwZqe5KNS|P1ameD?DF(C38$z$m~{MFso{B%PqWNOVhP*chxVo%{yz(a33{&z-@a-{ zNtJ~0lNLa83ZE5^?DFDIEKj*)*JhIf$exKGFaG@qezJ5=<7ev;3in4@))gUYXgC?h z&krs0k$#981nHS@yvFerD^iDWo9n-CY23PT@sB!&hg`mBTW5qldbl6D!G!6oy`iLU zv+J@96{t4RD-{tM0AmLE4gWBvmpw}KYUs52uj8*E+BvB+Fn zIx2i>7H>z0qj3IE*b;30CZ+VgXBw-ftvxd)C%+@0KOrdXlj7#)>+bHo$n_HwA|k98 z=pli3aC7^GtoZAA*(4S--N-ak;kxb5ynIv7%404|`xzuj)1 z6zFzK8E>!0dYpH!3(=eD@_h{%{bf1Wl%=z)|A5Ss!(-a7UvmIHXFga;lbY7kBRyl; zRGkAQsRmTUhvoK+yB>OHi?6`IY<+&`&J0Y8oxLuX_U)ybw#J-s!5@8O{~`8%Y>(>e z#@*R#L{r`)0ASVR!J$CHwtUfr?%^0CRNO~}YZpaX!#>Rf>b1tECiSMsGi8aZGo)Z1 z1?3Fol$F)Jw%7q66j0dP?2(d;bRI_an9qv$-vn_(J3h&U=owPO!xf>yrt8TeekK4?@xu7wjRCVs6kL94tNZSjpj(46sZf7YyMIO3k$DE7_Td(dpAvkm+9d<+ke9M+O>gSWa2rVKbQXaX;oazFj5aa zFz|((d@VFysZ+MlC`(_SJ(V@LPp{21;BHueI$B+IrfZ`L3~d0jN+Kh>1!pURuf_B@ z3^#+^Ij%q+QYAmo*hLOPWMGlfFCoP3? zuf%MT9@E|VSyaP#J81$A4UUh0;2t+Q^FsOQvYnjb2FAvEiVFEET=s#WeSBi|#@JDx z4f#Tc)%HF-bATQKYJ`AE2(Xi}7~GxRj6hKw$e$f0Rj%n!qyYA9R9x%dh5yH2Bq9Y6 zoSLpD{s4QbdBJ)LtTeUA{`h^et2#}Qli)qah>P6#QLAk0|6%VfqoNMG=utaCR0IhD zY3T+90g+TfxR|oBU45bt0~-zgbx{=X7zp#?SW` zj{@KaB5gpJ>;D<{EGFUn9cKs8>gPw_gGf)W57J?se@8ckh!MJfzl=rCANK<6j6YeP zxep-$kFjF+NR`?@zd*rZhZr96j6OtYdPl?i``h_nyN`{>*H`#%FQ^h7;4iI&o|Fca zQSJPj-|zf9fA|pA;&e8b62~8X0gh-Kb*LvM_vG~H=&asyi6lu>=k{%h#SdPS4E*ti z+ny?URHcD`v!==ZH^%38wW-*85g^`25N*3&hLNgABq-;Aurt4xoWwk+hk5<&d-vl746(PgTzsP-ordR^}GZ5EG(oecCwpc zeb01#AA)f_L~@(|fC9Ju+GF_9xwwpYE9yc+F@`=snjYF+ikZ6+~}mHozrDdf{WAuQJ1$OCD~O3p*9vzU%?J*jWbMZ@Lz;V#YS zP>LMDO`zk`j>{Z$XT{*NS(_{@yr-bR^#GbUw+~gabe>&Cas%H+KRP;H>&P8KK|Xu``zo0 z9L)X>eav@H`F~<;{&3Tli8JduO8>>KordvhI(z~f-Pg;($qNyBl{XMF2_MfTYpb-| zE>1F-iRfPtcEo26c=84J&MYl)olO88Ylu9di!js-Yp9AMbMv%ob!lCdTy5Hrj=i>x zzC={MAA}a|(yLbBqg(&*bf_GSExWpXd>)wH#|(}`M`|~Ala$x)4mD$gmGs(rzQM^m zAXyB$08xB@bF-4)>yLsCG$abK?q1Ovbbe9R|29W@|8T~kcw@OYH2Sn)G zX_P$}3P1FXj!FKwip;K8CHj%V5Tx>o>J@B>aCWF=fae_?j19WN$zY@Ww1N>hM_;kA zLg!Bd`St3MEOhHR66;htw)od|Y7fgITe(g>90qJ7@byPn|Kks3Vhvq}-V#`8xy!$73LK0H zOo#lhuU8otkKzxspZmQQ5m!0wz{^Fi20+_w6b* zb=`WX-if%T=O_6EIwB&B;am`Z z!AUWL8+8@Cbi@=1?hw?PkA?*fVx(R9ed63D;g{iYzV;skAlWNG6JcvH?<2#R2H&7& zRVaFqe76k?8uYPTkMF%{$O+oaQWnn9!E9RxoHNg;WMV81yW27=79bzbzFP~)Ecr12 zvJnwcZnEGI5oxFKwY-I7IGooiI~{{}77u4~VrFIq$OUo5cUkIXTZTsC?0&TM2xJT8 zZxBP{nAZHdEW(wosU5cfr+oYu-NsU*4hy+K3#D5}zg{h29i;N$vKp3_x~W6#@Bm`l z_c(QVNM$r+`(WN72HV=gf^>D*0~5My(YVrsbO0LJLN{cY3%&&SP@gC_-bY(nMngrk z(4r=#+l>lvE@jI@R+_3{%VDgVqcd>9@~05jZCTlc;f>8Z(8HBpwY%tZl-J!i_yA7q zZ;U?G!uJ=8>c4-Xz1nQ zAny#Mz8%F75r(Ulg&A&8WQm4ULrHwNDWnRt;F*EWiCTj`6as~7J$&UC(9>VHjQ zwF>gc*BBUVQtE^@(SKtzAwu2FrR|CnPQW^E+BQc$uQD)%?xui@Jj}!poSX*zczpJ- zV|V+~)qdwc0lScAxb@5k!42vtNPhQjf+4tb z9C_8l+bRWXtG}MsG>QlDo_n=h?hT0WRZMEIv1C2s^>$V0&--iBacDLvu6SII>6Y zLcw(o#8?lkyelzjX@sGn+}bfu_!+Wp#`_#q6|n(EOuv zB-|j*#H2NT!xTbb^*7*#2lW?(ZvBN!dqqFPxIl2egiPajuaAD`VB4h!2Ro!Jc=z;0 zPU>-_%-|aUF4WclTLqQK9bm`B+9kz$&G%4pm({^W{j`Xa;^*9}FESnM`J$$hg=*Q< ziP@N7v43u#( zv9^B$JyzTdXrcjeEw#5Sm6Z@lQYgtcl8{J=iWwh|?@AgbNhP|&Y_-4lr7_IDD`lMe z)dYT+u`|%%F!zB#W6@%OcDn*}NW$MeQ#^2KD3M46BvU{bN{}*l0{*pQ{`3FNr3-mHz7(h>J!H>dM%7d6B*0$A#n%j?j35D>=xd7z&gW?mT_`Mmj?U30)Xy z#L~&3jHQJuq$nf8F;jg%C|wtyyu`0nWn1V_qX%MMD1=}r$ElJ$nz7A7Z-aZ#R2njUoPYBfFvcoW z9T;-ueH(N1opAL)k_L~iV&`jO%aH-eUm6@&EXtmPUxURvek}b_;y6Ckjq>H(FW*x zIe6x4Y21-v6!4_?k_nXK8)ajZ}ZU zXzbK{Owo(E8;Fp*YC{G&4_zKbluQpjP?DDCpMo$f47UX^Qu!FqehUZrwML%05 zTR}@3jZ6u@0u_qbhku|pyrSrT(qkd~|4NVPrGB_K+_+$w0w@lxN@w~h;o67+jzkF$ zeB}q;)UamYBuA=b#$5hi0GIPkBc*5lWqnx;dyeUfDw6}dbKIE;b2%!(om5hwr zc29Q$1FPNni3ddBbpG*Xs;CDFID%Y24*$5YKFqNzORKRqKqZN;riKQi0}I_&qfX~+ zJR@uSs24+2M_O#j!0c>`x%u;q3>$xNX-TRGO6-YlC6q&+mj@aak>UAJfZlKzZwe%| zbC|vj@o==t-H+lv84!SPZ-3|EE8rr5Kd)+RG==B~&L(5np&!W|I8?NI0O9QZ^a+b5 z%3z?l*xS2fb;h9BTD#7)J6rloZ!a@NLN#1X;jGDcQ04H7#FLnqFp{gQH;-oV>#J*R z?l!B2DY^ZJs$KRKQ0=zHdtG1PuwK&k2bl)ICwMt!LFRx~v0L_QD+&leY`(gd!Kx>* z0&W243w#Fi1MSIvBodzEdn;|{aCaa}L8!GnUH>cYB_)N*@Z=07VKp@$3B~t%5V$}^ z6!-}vE27-1puL=*^vE(Azn-_2Co`XvAFR*;u-HE``qEe14 zAhBRGEZo?Xi{j-KGN%LCL!m8D7guRifJsmamO{VeQukD_ap1aZa1+EY`khh=`)hsM zq@N(?jaPNJg(AQ;bL+nyZcQNKuQ)SpY>aMeR8r0p_kPgsNVy#kWzlwR?g{jN0qFq? zs5Fz0V4*Dj4h>g>O8_fAJ8EQr#{-b9HZ~0$K_356QCN!XZRY=pP>I;fwvsAQN z&rsv409tA4ZAr;)xLG~}`0hG$2<1;g(b2ZthZrhSXq#{|UbSD0FhkYA@IMD8X&O|z z??O3nfy-tkTBN7} z3WOP%Qh^S>W{E(?(&3l2{B|~*BLfRggqcBoicQX^q?->%e@HTcU;(Jufe^KTCh~$C{W9~V&=-GFG+s$GsLZf zAmInWHIF^>gA4ozbw91h96L0SCc3Cq#t(`hAshh%GMmrOE{FEhR5+w{wix%kWPwsI z6rW3(2dNu@^{k>ysh~Y+bQU_CK^q&lYootxY~0jB_w0j;ioTtg02AkpCtaWKacF2z zHmW?SUYqYsKMz4eYbc-Fv=QOCfq~|RSzt0sp!5^Xu1-FH%znppG&A z*S|5D15I5n4~jPB>jVHEdN|L!djklf@&w{Aqz2fV>o8^;^qY$EV)A_VKhje-ovN>w zegMu$!h5>rRjOV0=AHK0DyX#!lKSywOK6~kyb2n6$UAH6*xYz=X(rh}@? zfnXCE;{`UVkc;k|?FZf}?)o>3DlD89QAfuakfz^JB*(E7%0s58?)XP85~(p1oPR55 z=xbeb^TvG17Y6{jt)BEjC|d){MfD2u|8?B%Nz%uuo4_U*SqP%$Dwx7jo#s3R8A%NJ^N1zIA1`NnO2 zy@6socyx)6e1mz<3Hx4RXfHaUwP?s zwV=+u=rWe$nN!O6pU{}=M97%mkZHodw<41F8}MEjk~3lW3HgbnDicipC|%fIKWa~fst&IOeD$QjQ(f##nAidfNF#FrxRg=%0PgELRZWadgI#a2w+NyHOf@9m30`O9PdHEf1Ir$jtOk^LI z5vW?iUS!bLJ3nueqiel2U*c!fNfsES<9X$kyMxsNVXm{I#e)Z7Yi1v66Twi+8?U3G zc8c;6DQ081qsQkY&d$zYbMxapJdN)N! zlYxt^irLR5;^bsHC~jo420w|)OrAZvdyhY)8ViCDyfZ`mU4vkjm^O_% zZ<_w{#20DPr*xWD1 z>Ua_wQCsg=Awlr}RS~aPSAV3VPmw*>Udzj#KR8~G%VyNOKh6*-{?ErPXBo6%E;W97 z{KcCKO|NM-3C(1tQ-CUhnf&1p;wonN!ISzLG&Ek8KPl8p z*zeFbATxQ^iH$|dt_<W3gf-j6Ad0gYv>7!8>7Ua{2O3and>wy*D+6{B{$0b zlr%A+3-zKeBnX&t-<*3yz|Z2BUiqG>F%Cp?+HFR}=T00JSdh-k2L{G@q|{axSzx+^i1C!bCNk=!iGl2$cJNvWoSMI^g!tirgSBIo1DeA9~Py-|Dh^}gRg!z;-=kC4Br~ZHeaxSyIZ0#K#YpYrioA)}wEA zp?@6G_3fEVtJ8d!|K`3uQu4vLSmSN6!j~cOhx6rksvbl%P<)z#@^vKV>NPdKqodUw z8z(O*?rp_5I-qf+=EKy$z#o%(lY3;=*l~*$ zBj%qE$AjnX>z!WUvU~5JR~?;9_>>cWN)qM`cUEMk3x+O*Y^*9cxFLUaP`;Vk{+=-= z2$toI^q)=QaU2Iv1I3O%^x4^o!NEg*xr5#$?l6cyr_(8Sq06ZA)*Zs+C;F$5vxaQa zg@gC}@XwGx{^wVJ|8tNf9=!K&^7;3B9Q>9R@^FmqF(E-SB`i1sX4-F}e>})<* zIrDd9FqFRogC8UB0pz#_$_kzCjJC#Gosm8m;K7>*5rJd3wRN8J@GG3^|M(4DG+9|$ zoaQ9n!`FU)0DP<8OKJg@6mta0!D2=&^VG5KLi2Z!UR8PB_5M94$gE!e^t^?YdDiZ# zg1gK=pH2W9NJ@%_+u_vWtv}O?{ETto0@LTUwNDZyxU1fH{(eZvf(d3)28N!Fj^M0+ z#&mR5{l{nAc=bwae3IrCPSewW-)Qvfs|T57Yj5DFnQFWH@}B`GXX!Qn>h5-!>B7*a z6+E0q6hMKR-^1O795QNx|L1Rz*flJb-}~rZ6&iB;-<%ggg__6vna0GZeu~~Psw-lt z$DvWsJ$}!A`1AAE1`7v`cnev^#>b%xJiSJ_lZW|W#9fo~#{w}g-LUIkQ@;~bb6!w_ z23#W!MuQdi;ln+NU?`alVwu?%df&n_<$UZG<&E3FBZ_gj#8Wgw7ts?~O{h+6sk`nH}ultT*^Ox#YOb~ z{#i1xIoxP_l$=tkkh#^CP$d@8-P_j2bhmU(FB+X$OLF_dRF zR#SNVBpwvdclRnoG@?-+;TJ_n)drG7<`V4(3>`m28S+vUnR|(?6U035SZ`IfWNpRp zYoSl%n5yl+$I$?8o`@)s$OR`}>FIQPK6peIfs^Rw9R}t0Sj}1-0M3v!b?%$il6!dzBKG}$Zl44C!dZ@*Nd+jvRrhgSrCS)E=_q_E;)&JwgmAb6l- zi<^HnYD2A|n#AW0jY1YsPr}^aMI;Sw>|{jHXjiVWDH5MD2QCvSp39h{j;qt!p;1h+ zZe?Y8)tD>w6?BIkTC$b=Y6qS#GQ+?i7>3l^-XA!0MAmpW}OtMZDum9Q}Q+jyMkhbk&^a|8clEIjrWrEe#=te23} zH+WZ3S*3Ji{bvX^{VZ_~=!Ap25bZkAo698z9Q1P{G2K4p?D`o>1{{jdwV~nU7bn(` zbl9rxEm;n_y7<68UU08}0l1bNEpBABc-#{baxKwNXym`g+Sx&oKiM=mj%=`Pov8(0 zV-FsjKYA2cy>5biRU`f20T`TUF{nM3f4J##@` znUgQ^%LOtmvBzi=mW!Ij`ppnde@ufuVX?v-ZM5AnOL_D7w@EQotSE<83N7MskoI-Zu)ch2I(1}3^XOqTbty7aqdAbNEGNe# zFT6&eE93bH*^(bxC;xrJWSiwgCFgBf4mJAuuJW>IR?R0;u!&6@ z!%k7%efro6GFI8q!9ljlw)Q+WS6AQ`>rY=So?%rS)XwEE@%iG^6cGwen_gi1rffa0 zy3n0P$>t7?Q4?Rkc5@mV(F~6qC^%7zW7Pk+K>wpEa-~M@wHLij-u26(D|T}a4hquw zg;sZDL$RK;ZL3ANE(~7TGW*4Km}czZ?9TR_7xqn<9@4d+ZkOQ4> z+_OMTUeGfw9!+YZG_va^L8=ZEhTs+R2dBOEvjp|DK+1Xe> zv%L37Yh345m_}&BH1WidzCMDEnx1gI*T~mudMrBd+7_hFw(Q5n_w}>|>Q*3c&Es_* z54r?RC=4aUm;1oS6+EMmX}??-;>1a{nGQ>Xw(3L&Yf;Eazkbca32Vx{01T18qNG_qje_{Pc03@hA2?} zkH~vIsnwm`$xbE|+Oxf(g^h=gCeGEFKEp7O?d+I6fxgPgkj9}$NAkJ0Hl`ZQq~;wX zn=_nT4}|2`>u3nj@WMR8CJHGI^MOBNyS~b)S0(;mRqQ(8jU)0 zq0+q5hk$?3E;dK|mV0b|jiP1&(o5!Qynq9go2fF(Umn$|W_op`tg;rtQ}USWPB zGwrW-P}^g`-E}JTlKg_Z>L&4Qu{g4>MBqjyOjXJxJ0%-`@2>%C9P zd#2$2Dd|%Wn0v~(i{i){bHyKM>*o7)Boi&MKhfu8Ycy_C3;_%T36!;({l&>}wp*V5 z*&6d1F`Jury3%K8>v=Y{z3M|)@=Zkjr|g%DQ$TT5T{{bpBk(yH1-sO^SdfNW|ivG4Yso+OpyWo1Th&g;)(vFhtHF_n+JX6DusItxu&LK!2$DspW^Q*t`$ z8x)8;J4ZG}mc;lhl=rD&UwOsy{(Y!B#fjxs(K#}5kM*GnbHVwU%z$=hHFG&bB!JCoJ69n{Zf?oJARdMw#HaGp6;Xec0Z>gMfkH8l@N z6B}2SALrE;`xiOOvjTkk^paS)j&U3I5eoQ(ZKf)&nz z5p09au(#`x{OY1(&1`472j>}SNk-K=s7Z+~Xg2Fzd3lXq5uuiVgv+iFTa%kWOhZ7B zs;8UJ)P`tisJy|?60BG>=uDCtEHu%)kdSe^_T?Rw7&LLqxt3h<-JNAS5Q{^|IM9l) zG7RfU$fB1EPgv-KBNBCd9_u&a56Ify+a=A(9x>|3HtXwLM?qm-llnujo@WQSX_;HO zZq3Fl2yGdC1KJhG?(P?h2)ouZOb1Q&Q`BbA*H#dCTj%zi zyZph$OHNdqo^-3~WehrDf1HbRL2K*zGuss!74EMuc?SvcYCA3uv! zTLZhdb+WOPVz+mJ$D2|D-o3Hjyz|%T#h{r6>~EO%4_DFBd&PHlBZc4UZ|$ygsOR3& zT8D?0au=fQDDH1;Br7$f);fh|a8XuOv2&@c6SLw@+D?x#h~DAqlZYM!Cf?zjI~zcb zHxr1x-V8!dC*-xb+I9|oRYcq*CILD;1fA~4%@WI(i z@?}?60h2T0!3xI%fHwk8YgkYRI3j`E{G1y9-9P8pGe;AB3h1fLN^tgaSFsfpG%#-X z_F6`)bS5*7O#H0~MN?$B-P-KJb)Sc#l==zv_*`}gy%zW&)uZ`qfx z&|)Qm`Hk(uo3qW_b$u9EUNc=R93~DU;I*w$9Owg}&e=<-bnDk=JgClzw6NHcd)%Ow zp>Z|fJx6A0-1L>2N_02G*O=@6ju()=O&{$ksQg?yi4dt=yMij*IJu;Rd=a za?$=h_aR4qmE0s@Z#;I$MJz%{|76z~g)svxEG-blZdEBC|`1&`3p6V>E@LFZN zOGu+ARMz_A3rDVc*)((><7!;VHDJP|%!gKhXc(EhJ$i1kn|`FDXVCP=hKC=6zTw8K z%ch09Pbgdh<(s>g8)xO^)CHCH*tpm^VF1|e`!E~_ZaBi z7+5$|J3lU&b$^1LC$6L9JleYQttB=&UB$6tL$id}rB&G$U&jV^W7uiv9q~xi$i5yu zny0MH%PZZ9+6Y=x#BT21?1*yZ;Utf@Zwy=W#_#IQ(yGBXvswcq2Zd&xsn$VQ17IJG z+)LDWVfp&Cxu7{zRlR3pGbEorEg-llGMr}=5YC=HH*d-T$vKpAL2JSnTRl2+r)S!e ziJ3nnL_6oF>pv@Yx^`uls)OCw&UmyMI=m9rAu=?YuU)*l+*4#JVrY1gfkAjR6`}bI z=mh`_vG_PGbzgjurK3$DCx7MH3eGBI2C9_|l!?(BzG6VP#m}E)egF2on0}HlT$p_Y zlp%p}p*h3;(jp@1XVCjCEw^1)J02@Vekoy<SaH0nmPXbdB)OpCbKWO#(HlDS<>Pycgd5uYCW5lGSD@T(++Eb6bwXpm zw{gYNDtq?L6>%g7b}Pv)jGDF3yQ*qbAarjf5x?t8luNO9MMX|h;2nG(2P+nX(o%T1 z4r^%A=b>H0{LBn^&? zW(*ZePo7bd&v4S2lP6S>xkgQ$r-D4@jahmk4~3+Q;uM`pc(u*@W#;BrL!s?-`B(RZ zis9C+xO)Ks*_+fW;Kd70sC%s7! zH%gsaADlT7i7G&g{?+REI7mOm@OxRBchrYHDDMYe!@7nRaylnxJ7o##Ts}IZo9ykF zo*7CdR)>Cm+$=fXQ?eXpgtXqY>iwdPpbqEPC708xy~QsoW~{mAPQ)E%_(aO2>vz{k3@uI{9u@%EG6Y9 zF_jeQWobI&t z@mU+lCYQP^yuy#`o?{ncdjKSM{^)Ze$BtX&IHtN6n#_Ge0EN#EEV*7VFe=8s3;i-ge@NOJQv1 z^NhIOe6FnS47l%o&G{FfSr&m3H6uc98&CGha5t3cYs+Ip9a2CQ^1eQ45DKlop`;^f zZI#?D`Qe*)FJHDxE4_N%1;rnQQ`-5a;(!(++o1YZ!@&U&1_9#-DKBjG(eDKjoO$UY z2_9(zs#Sr8ow*7NTJ1wZjou;BVD09cs$|LT)bL(6`}z3X**QZ^ec+haBV(|xT?6|_ zMxMRuxrCEv&=7l*X0F?Pjj4XI>N{@WcR5*r$TLz{#Ga!O-QVh}fR_Hyx8o7!^+i?z zK|yp}<}sg4Wi;qd=f^B1FFyey<7M>65}NDJsQu3z9Kdkcur7~|)h+_5pflSBhYtSE z3LI#S+e6mSDhX2Ry=GzHHCY+@7+EADM7B47F6vT{y4YnzdV;^gxGBnXxR#y_Z z$L@0jx8=k05{bME#)Wrwe?8tI45QU-K&&kcnQ8JVy=u1y>o;^42XLM*cit`@AR{J@ ziHj2m0viMsCkAfrfws0BgSG^umE@EK)3?IH+gw~=4Kq>B_(C(?hiK%SvRnD&s1bSgD$S`jEU*tytDWnwnff?$=r9|y%?o>Fcs!C z?q*a_P~hdQ0PiaWS{gTRe6f>%Fy)ey?rWE;M}1$fOkQENw+IiWn^9EU**oLYm#YdY z6v*g^@}o*c-LY|TH^GwJxG#SW>3Xjr+0j#I9=j*Jzw?tfoXx1S(0tUFXGtQ)J$9mseE0l^QSyW|kRQmD++N z-e9>#MNf~N&gr^Ws@n$T-on0642idS;!0I9sFUq;n2~@Hr1}TgBr96_i^W>XlZoP9 z4<24-=CwmVc9Gg&9i&W-6q@}>8cx|;c|zEr(8ZA-`39aB+~Sj^CG=+ zt_aUn4uqNIcOL={jd5m;Mx-(Cgrl%6)vi8RaT?CSsg_qz(53&@Wpiz=PX}qPC{8Pt zFPc!XyQU)d-p?;4M>?|P2HOFsDZb1&_!gI?efQ-V%mClgvNFNk%By)Q@AAmV$&;tx zj1V1%=?&ySJvTQqOEmOD^aZG4J{DGV-n|VZy&?;x<&Ug+{PRRM!LbJY#zh*1!5zQi z0YmvpeqFF)jHi?Mif>jLW1_z`o)Y=_^Jfazo2fFdKs1#VdN2@^AD^Ft5g3>P!&6UO zJ2Op|5SR?BZb>Rry-XsSC%wV|zCifOPjK6zc^8C)Ga;DyI~c&^_IJ#$OzrP2>|51| zii!#nYHDe%Uhm1)@uJO!2f?-to};zK@W}0zBv?R}@9%Ac%wa4IrU~i4L`yIJz+D=LkZ>L%XouwkM{o5a3qfj13W_sl&+dcM3@5t$O5UUv{!L12xk0c;DRW#;5d;gq*4Ebc6^*^6>u1lN zZ5tnPnMUM%`gB=J75t)HO?fD~puGvN%ZINjcg2e|W$!o|I^o@n z8(eZL^TJ&cQ7FA^i5h=B0D4I;q+9aS&4h&FJnA?@6;AWVvMf}q`BYz?gQk9F?c-E! zJK(8_{iwUbwZZ`_hCT67G!N7n%@IXkr&qmgKJrrHiGe}#tpEuMI2uq!N1yz-g5FM5 z0@QJxs-0e{t1`|KZ9+aHZ3UmBh4)#^my^{V==Rxq8QEsGhRdc9voq#;;wy)<^8gB{ z`>={G6E75#0*`6AH}FeC>Wi3`(Dhct4~ZD(E)vM!3cfv}VXteV%F37Tw`C|-k>9$A zR0}9?qR~OfbkG(WqL5mD^@r5eZw=VZHI2Xm0}$wFXLgYeT3WHGR`So#6?$k$XVviJ zdj0CO+&*BOGSXpPX$C`u=II1n?xl-Ddc3?p9adF?>E}#7`hENu2qZN$odk`Rn23Io z-vxtT@gcp*oXjo7c?EHJ*b|FWiN3fErG<8?PEIE|IJi7qcJT~dC{%hwnaK?iA1(`j zpN5;eqe-bkNzS!57iX7{F_<#aBW7TsA(Cr7;1N#@*dspU`q~`5pgNA=sb^-cr>0JI zXrJhojT8mH9FVyupoyR90U-`lIhhPasY?4N#C-*YHa-1Kt`f6Ud1T>J+^?-wu`6h} zTMPYn$k_5;LGz$5dKsWT(VpE~{C*OU-hqKRXju;#{|i?73s2InEWQR|j*`tc_wVec zH^`bk_+6O0C<#0fF%69isEt}$%6;!jEATF7XNwsK=aNBMGwF#;Ysigc=Rk5U`tX8U zLB@WS*HrJF84jbgvtnZp^njhj!FzW6L5^W;Mq+xlcT0I3N^+rFhd>*AfBj!_O3Z23 z+CP_;bo)Rvwla}PhTaz98O7}uh=KMW`GAJd@)`UqU*35j>42g4iLPEhHkSjC`2=K| zE)#wE~CcCjHQYSk1$ zQV|%<%_aY!DqF`nZv5G?u0ya)ytLrykCWY$&LFl$s^7HBmHBl{3j7b?!hLQ>4CI;><-?JKUFIR zc}w$O!tb8Ngc|7s#U>{Ds#uf7)rEs)h}KM!8jT$ZvRyzX5k1Hxf&nX>ojaz8mDN&L z*d!UDU2ebpI6248oPn+6=@X35fnv6nm$EoUhu;yfeTY<@xuG|qX%PQ*dRbfi*igmp zvMCA%x%=Lo-R^0?*6IL&EbrfW0^sOHb_%5&`vuV2K*?)>3*+y+n~wbVUX}p*qw#4sUrFyw1|~UVWBzcS;O}b8h%ftRswLt?9#10;`~AL_60p z3?d0Cn)=f5+uH}!&)~!(ttk$R@rUjc&hynD0j8S0kA$gi(c#qZRC?q_yAqnYFrNu$ z!=4!1WV8j^15P*o`XH@Dmx$Hj@e#~*3#7Q<$8$E;7lnO)@F%1u2>x?OYA~`Qg?R@+ zAY-nhf&L*RRfo5zQ4s~WIHra(+Xj&PeP(l?pSKk3i{Ko2ryyPZYL~p8i1%!%G7=IM z7c#d%L2_(?`aK1e`e1xl`Zd3~??&hZrTrpd0%mn zRw0J|2CxEq^!g0({O+@*4$ukvyv1ky;0OF-9JRfAdBhV5ouN+C0?Kd3YTjVc5JLOV z44is~3Nc!m`oOIbi#vCA1t_&Y+FLSM8+}}3qj8(L8UuB~lY`v)+iPR~{;YEmuv(}3 z3iu@7g*%bqX*tjx5;n2)>N^V;1>v%N@0Qin@-j^s4HDfqKotin4#bCP3v>uj z1X=BFjOtSjmD+!@DfmB0m1~MkLop7SJgBYtvB#bZHT3?1Aawo)#{!80GXyk@@fUzk zQOJ}Co&qgQcb`iA%Qw$u6+e9_*;Dh8=4HzApdKo*eHoak++m9Zjzrnyczz$xLx`0w zoh|zBEwSMqL@5SsMpKaCH3zc*L9T2}SgJUl9$eUga?c9HxwC zwIXBp2QMKDbEiW?O&VsUJ^qmwcg*?qT9dgN2+(##@M0f%Ovjm6S4(9MhzbUcrtUIF zMJXxI^F}EuU3WNpZR>+81-%?R1N8BgK@np+hv%>~whzs9h6WRe&$B%=TVpLG5%C1{80ue;$oN%=N};&2<)J5ETrhHYLpBNN+${q+V7$ActTG8)MxqwJ~5$~2Nc8zJAB-s zBh2a>`_8+tcGszR8;Z`LC_)1x zqwz6qz;nxiM?gD^(h#GvV!L1Ha}ezMk@#gqa=ivs$uID3+bIVu?H|}bX~q~}uca1u zbYGMH+qY;N__g$gReJ zTE+};|3`yv_hEQCzx9Y1zS1roK<3wq{HGv-qB8RISS)j}&K7G%)kY{&RF1@b zeQ|nVb-^NV3*tRl@LVE|bLvPb@5>+1S4~M?DzY5awgGAR7QoZ=^A-@p{YF&aNdW8b zOMCS|7bPe!U+Tlx7)6kp_JFECLyaFDFDzjXs0}(gIuO-Kd;k2ouddNAhSF7WuR91`+*Oz6Ov3Jfal_}`x*FnP$)AD+AXxi_R z4egiNpg}#G(bYJplO=^rCxuZ@BF&B8nr-*X*|Mq+aTbq17&$n^<;Osm)T!a&o8E#bQtd7S#jGB57rYyM& zvSdd$rWn8D_FQ3q|DN5sqoJIc{$GyrXp9KwB$x$&I_S3`gpm~~75Y6wIPhO2rTvW| zS-;h+hd6oF+J-vC>KyNzxlUU>KIqBu)g?mKr zYUB3e#fi-eDkV1QXdy#q3l(biC>$ea9kb5{2L^&z_>Z1;?#$A75J;PcG~q3Kj;&wl z8Pd)SaDKG*xwTdLs5ork1AwyS6@aQEMa?iGZP$Qbx%J2a31V{VILmrr{TA>ww^oobRSU>h7oxTemq-- zb+7s^99aEl;SfD`?AI^&!+RZUxg0}I%YM9X-n@CokX8*AwGbDbzlW9J%0|R_9F)%8 zjx-J6Gz}4K(nt3MZzulR^*|?;T3dPSdsw=s;U%DaBtIsH ze@CwEJW4z57+&*UScr#t4{%f6_H)PNS`hHf*-d(Lfuh;`>Ol120%@Y*;Rl+X#hv^8 z=TuZr4*ndBz~95XYRIAHRSxIxTXWUu3s>J|Uh-RfWMDuQD|9T$(_LO#nnXkT^y$;^ zY{QSGFj}M>3cS~C-nIC=wbvda9gPNKJVwJ)&rGSL0@*bsBIWq)r^mV-k0Ub{P<|uT;unzz;?tBfAR~Xga2lyIzb$tX z#NwaUPr!}!IT;V;7Ip*jOap;AJRsytU=9-vks|Unb!06L=*#cPaX)1@8{GNI-wfbz zZPd3e9%Ow7y#B)y#*M`QLkw<)@(mKlOB&m#4kd|(&r&o&&BOGFH&8%WSWDk&?&RSR zQ-WhWQX?F1`JsPDZ1kQz9MWTbxf+B!8m@mxh=Qc#(_cTnfa^TW%qP;tJdDHd@EJk< z9dQN?=N&v*pbmC+ocwZOIoptxul@eYP&R?142I>fiOS)T`sKcO@xtH#>VN%-lhY2; z{=3z}(h|I}J-xho{Em(#$R;Efr+0gyB04g%3_i;3EJpT`fh65`w^_q5RniXwLv*W! zLFc`lO~W-e44!u|=&Q>rNuQzi^zTfZtwR817~kL7xmM#xni2=Q2+L-!x5MdlT}{n9 zK??D(xPe(97mQpkVkw^DA2lL6d>p@y;f4JIpfANAa3VPiF86%h#xSsXkG^gGwUPuJ zwL$Q?HR8q4pmFf351x3+Y|w6FNeh9XrKKHWeItl z3WYwF?`_T0)QAAU414Yp0jEBGSgt%6vo2KZt0(CA!3W*BecR5?E-o=Kn#Wn0D!|*@ zn|5Soh6`*wA_ZaBkfAF@=Hyt;bfzn0s;3X6-PR6gH|ZZ3z{JFS6v?Sm9<#bIa#3=Hf0am4mm4~J-h%@ z5%&w|G8J&(*0$*{G^deIL#U5Uw#0rkneOn?v}(;B%Ln`LIY;JraiE1l)ytjii!x&9 zfY)HQ2bR^+(z0T60^bG=T3a4Ro=rho`qOPxG6@Y4cVu>iPYG%1!{-G}ArOeUz5=ho z8Y?esx;WJiD0R34rn(KD4?|rpiLaO;KJZCz0ArNo|LGHBCl|ZEe`N$0Rr1t4|9bJ5~rPG|w2|vP5~%(a_K^Fc#VpeY?G? z5rKW@uw8%r{7E?u)K|z?SUt%$Z_B7)DX~&fJ!nkn!!t9`H}rjp8KG2~RpwAlX^p&^Z+ z#JIQ`W1ve+hY)d?gAOz4xGcINmzFZq-Vk_XIv+cRDLba-gM)`Uh>A$v*LsaIADqU( zz+hrB0of>Z3V6LWtj+dVetB`)75raiWMq(z$N`rwT}n}gMHx7N%aWUK(pUFVBt%SD zNQjWjMvThB_$n#%wjgnt5B_JT=H7%Nbe)4R)xW7g3*6?ehTwY*( zGP8#6!Ax!~ekWS^;U!&(z@}Ba=?`aiDF*M3$LB{OCq9=!_VIdJE_g?i z4S7)6&RkDDj=C9;!Ofqe3l4w&lLx0Ovit~2A*=r!{6C&EH@m_Xw7& zM-W;t9{s_{=S|>$GZ5^ou$37Qehjye%ZZ%046>-Yj(zE^{bsKvsl#Cpq!c^e|p{a1y=% z6kfo4y9>#lhoUXtp}^dV#D-h+^z@Ld(9n$DJaP0-d}0j9=5n$ai0;~5{`bWRP_(t% zC*qfj9;+eH3PHs0;O|P1@j=BFsR0Bazw6lEs8mk1J(?Tf8kxrpd+A_)&L2ud4~F;5 z(eSr;9ttkV=_tyJ6wxEq(~Zuj z&jiyA)i<{Lu$wsf2kYW$qu!r+W|tz`U^FraoHwCq|(6 zjzKqHSJx0IB2VT7^^>p1VqR9((xN$RPbrEE8V<>7Go6FrBLJecXqT<`)Zl_)d;qJu zqZ?f!8kFr!(*Cw%ZSeYw+{(0^Yh7RxpWFQ#1gZ7YX!&UbXJ|x7|FgP1l$Ay0^!}q%i~j-u^YH}WHECc7EL^oe74<`@$j$=*z!tK& zDKm&`Ay^fGzD>shDj9-%t+%w8e;*db)M90}Qk zjAL)%*sGGgj-6c@AtO74-~G^he?Pz1AFs>n((81_^Z9r_9{0!Xe!blu^JQqr_B;kO zaCbK;2UDzCW!c1_O+6!`+(SsYMfCk$h&NDr3m*9yTzQOoF7B?81nU?0YztSsXlU24@C}$EVMk-#Y&jb8o?V>h@|JHKV1kTc7D^`~| z4|i}j+1f6`498dX`{}$_OfcumMip^-7kDTLT)?5&hI{I)&z~M!m>7)kW(jZ(q%(=t zof!SyR-;hdOrmH9HvTf@gjR&(RPL=(Y>90v0L zf$i#fz5`CpSfeaGXncVkQX4<8(LZef8Jq8Rq8-2t4Jm3CzUxXDFtV5{Y0&o7LPCF%O;zrMFRMF$sw+pheX^>qb& zJ?Z5KFZ_@dLWnX_CJrAmqAX;|*%x`jT7mir!>d(KcKh~`e)Vg4ShzfUklz)IBx)t5>gbt2Q%AN?!i``)aW}OA(Z)HL#v?teiU+Je`$AiAs5j zeti$8{ctc*P3)ygyo=-{0h%vJQ(HT;E#_-Fz9=5P7>|I%QiL&t5v3~FEPT9O3BAA> zofqJ%G4FUM^Au+){Y>dual0eSVY(sgtt#{$)12bSEHoE%Uf^9t@^XNP#FdlslV4wr zKCs$>~uVgmZ{O`W-pr{AN`%&2f`Xeb5KQ_+z?AVT*pW}kn%`kHlF zT|Z%BNe%lVgrPo8z<5TY5~gD$_KnW2d;_%UYM=H{UMyS~?`G^)m;}J?^t9`)y%jDE z@8_%vyWrve2R{}Ase~TWD_D2s8(+ZpHHX9$^`Q6jcb`=Q_1zwO!Q!)K;T9b(l=cAF zo?+X5y#clMzX;dcE>0gIR}^jq-0ZQDtJrqDV{PrZCoAo*#1c3-b9(aX<1p#vJ&uks?^j$rQJ2BzwRDL7ZK z25gbIZj)hv4uq>RGNkGyBYh&P7u@26X&rgXKo0v=OWc?s8%PinGVgwk^F;G_?;JkH z6OP{f_*Tx3Utu4@SCy7oS_+1rjEeyI`RJ?GV&U*pdK0^?1r|(RUhwPUVzuf7HT^H8 zl+}yIvN8jhMJf4{+?<21Yh#AR)bvWw*ZozA+;$+e+FV(KZiImvSiCq*9Ycfvu~DaO ztY!nJuMkNL>159m4ObD~bu*Y{@O}fPu7yeS_S+eC$@IPXC5TklB|Rnz0@Q}UUw8fb zc_T*6RYao!CbpAWm3~V z+V69XXP@k^3QtOvkcK8PPw<;yx=NKI!#b`mo2I)4b-kHBX;@+uI^O?5SyKA{2iCtu z97syaJf%AVz0qin@Rx6!1{Ptaf%#Xoos?yUG0dXR@xj&{pOmh72EH|3xr*mkViHeJ zj15>?^Ve{0I40hg8IgZIXkR=&!G#q|;&6-urvO;O&RI{w=?+|F=^Y_-OFN#KiDoK1JJ90ny$b#-vWb`W+xrQzYQ0 zaVlyIEpZ}x;tp^FsvVk)vnD@%f;g!KWIp6%^yaVww8xlr!kl({c4lU?Q-)0+Nl#z} zd00!{x)mi6Q932x>gAu62!2xH7c9@c>iIRB6<%sj*Mu8&<;iF%@Sh5AB44{< zOxy1%ayOPjxB^&7ri$;j^``qr3G%jSl)hDIojtKPHxUqid@FJf(m?>agBGO(;LAJP zTNa+cf>aA_&BDO%otZv^kMFCRsWx4F>dYAx&`0Wb@76v)tJ;d4>CN7%qqIThhe05? zT$h{6c*E&_F2*dHbNwLh7#kYeZ?2dTw7x{^RJ}S4{iO?YaO&VQ=wONM_kQ~xka1#o zN2ZwZXkt?sHH&kqe{`Hg`(53O0;yE;_$M8q7L3nQ?A28XO{h$O zZHiO@j$*h>huBZLiegVLbAa=?p%Mu8Ni=kLqQ$X~B5|?BaeWBQdk>vvb-lTGR`c{e z9WAX9zVpDOB~=TMX!q^g)SEtoQ$C+`HF^NA*+1D_et#B%<&J0vw~=SR_wfx#d*nof zWb8M#5~V`urO*w7C_+jPV7Echgu-tf3bGHc^;OX%VC63_-%1ek#o%^oZUTmN1j+FO zsFcx$VT7p;P5_~er1toJ5YhDlND(jZ-SuHAjx3_%>B&3yl&av~slpNGLEv!pw6)D1 zA7`Hnh7}odL3=Xs3nMyXg@5*swSdEUmOAW4^hrZ=W^z|k+D`tKt}PV#_nUoL-Bg-3u+N- zE33KBpX~sL>}saq!hi&{IycxiM-R#g9UWaph10?aD5E&;{lbL{(Y!W0kk^uF#|S6+ zJc-(wN(?YCFfcOMT$v6E3Icb+r%#{Y5Y$o+d~YIZ904rgG;e8R13cvz3|LAoOmDWf z#XM!GWnw~tb(MyJ_f<2{Fo9az1Zc}h zd=J{tT&1JkH>XpTh)GH5 z*HlyGFLW@Fum1q+2)KyB7qPu12YMkrol>@Dfk}ewXDu2kjt&@7p4(sbmK2f5G%qhP zI4@_a)i6Ma-kjFUv^`cef)R9Z+5&_7i4p6%H)%g>)bL%#%)tCs6d5Kc04M{}8VzSgf%5Z)MvHwu5M8jRPs8W#;} zFxhCc?}PPR^l4REzu`MtkKzth$LuY3@GmMOg!b#ZkMdI>Gh}z8-E(cZ+*T%d%KIjQ zNlI+s8n>&bdse!kwHlEKGp)gApu^6=Y| z{p8;l!ZjyqPehUpY*X1(Ux9eR4G4g%1w2-6T2xjJ zJmBE&2nwkBu_V*Fng?T;oD1W=wKnWlaOXvoI~;39FfwrkkB$Y}Hr?sk;2aTfc#r1^ z@nSI+a2DQH&W=eF4acPY{rhf{k*0oUDOxt(`;d^5l5&`<_{zp!*W99r+9?B@;500< z>ltSR{K+_d;2<3dO`Nrl6R2*9?n!SzXGO$^gf=Z6$O#) zBw=FB;CB$61Drk7B$yI^eu(~6BPAmvBOzJdULVB`2I#S->s42kk)|3VbE|jC%3iF* zMK5d@Lk5f{xw_e_Z;1iI#G@f8Sy@@Ms@tTZnDH*F!J@|3va*fwXl|PkH<-=_Q1m3q zDY8LLB=oZ1+o>Z;-(x-Ct)YR1M@ZoYexu;mv}~2OfQ>Jv!80t45*8MQxid_RfRv({ zpM#^btIK|-JN@$;Zu9Q%o@;G~nV(zCjWJ&cr@1Kh{GsG=n#VLcr%p4+)5PCA>UTku zVEC@D58X8n^MpkT{0?No@rd23qmbzd3@3$0O9IZ3@lHsHiAtwFGlp4q&7Zh$lif;>xen^^#}kkJb6# zvFTSvWMpJq3BFvLFflZAXW&~~Ox@e`tgMywb<+h;$PH$?a;3y|J*TjcJ3Avi9opS6 z0sB8+G?D&lFD6zCj;7(EA<6&XAVM+vMuE%yq|HgMpp8|76%8pacGiljxA&VY$j37` zOXuM-s<@TsY()T9PMWfM=T%$zT-oAa?(b19L{OqQcs=B)GWMH+F<3nC$$2jns zxU5WF%FaGUM8yoJ4j#!3s}L?H*zvGL>Clv#0n_}Po%#tFHet(QtHb= zl{;0ltU)HLM_HM9Muv1z(I);myxa1|6XUPh1%-qhq(6OH8`3UK%Wjd)O}iq2zMbsq z6w)q?Z?F+sGvX-6$i_BQUw=m{F@gJ)2({CvTW)vb!%(RFCr@sQJ{8JEchDD@Y`m{` z;$_D^_?o>2;)QM*CfCdBMOfH8itx#f^R&I&?ZCpavi#&^YwP)tEfM?^H16)LX4Ne% z7|(5o$9}RSIZEpqqqB2_buZ?`pVVyD4fb-Lq%S;*0FxcA*I&VStj(WV;RjYwSi4_P z`(se{Y@upR@yzHkcG29x;c}<;NKOVG9-hmWpHy<39%I zK)*cKwKSGTH!jiF`CK>s@VZz-yDzu8dHy5ada7!0;NqB068BXtgq77*Zc+Yn$I414 zn=}2VbJ2F5qdwm>W-6Zy?^|8cJQ!eL(m69eo48;6gXxuCJ!-bckH9ScC4FwE48p}>V)(14{ol|WUpDLg%sK7$@J{(s~a8f zeR60eEjO@evizVhrmei5vrLc8RvUskva(^==l$@fJQlC6O8Yszm2+PyZM55kUzRkV-hVW|ZBp|w8#B4u zHcLuc(Q)@-OD1Z44?7crf$Rwj^L;;muioCdSaT#K{=Z~Sz^q&-k`}m`sa^Ecr%=pV z995)W6aV&!m1*me&x?5uyvq5RnCgTlZ&u~BwA=Z9KeunbdVcKg z8``j%p1e?WdSmX%vj3*YX`ZtSOwL>E!tsRL{hp4{hNfuL$5iEsjdXz$FAU{o<)BM#f&R<&>0#M03%LMXP>Kj{hDP@UX19*9TNB ze^T?;-7PxVthV+z=@D-$*3P~rTGyCLzUbqaVNMe5U8m#HAL8o-8nDED%#Y|fpA^9 z62oC-wdyo~ULIC&y^>Q38{>*+&n|Xf zWoYAIuRXae7>I!F0$!+9;9iN0`K*D~#*CXEF|r&rId1ea5R0&LZVbL5CwDgQ9qn27 zO%0yPm-1HgcSNq4lq~twGlWggt=qflb5at&{hp@N3M#_mv`NCAUv7yOTDXVZ(LBV~n z=vg#xNLJQ;GgUdcbQ`@)CiRrt*G6Q`bc8&Gtv|4PQwhnY$U8(|tBF3c6!%5^dGYEU zJg^zTGzBC10fOk&*R2=lqP&Z~yCV-^@DLU^Va}yJi}o5U4zU@Q4mJ&$nR!3z8Mm20 z>Hh7azw3c*PI~jtOB1^p87cHq`8p%A{W_~_JPRYkqK?{ZF6>}j0fYo}&%TYlwcFac z?Fm!gHMNg~*SL}8q|? zlQ%P?s;%v?%Guq233P6uE%y+837}xO6Gx&B;QAvd)KiGohgY0J9>OtQy?2p-Mq2hN zGsPN~*^Uh>r`Fx{-v7CWD3`j1efjTph*V<=xE47I2QM%1P@}oxfAG1#)C$623IY z310_FIPeud^&<8NuHBsb1nuk+Ra+;}Xod`4cu300wHeX8@eLueW^Js92vK~Jh8E)X z`JcaJHG+jFrn@^7Q>Y4qwl9~+7{y~2Y+;vQo|lL1??<-BUYUQa@n^NN=F3F~aR(V( z5I9p~mnP4~#@U8_U{P}Kk}x|~8iDA4`}QKuyI4*P7TX4nCEqagQ70$m8Pokmw{>u? zsi{$4-_gZoCiGp+TmLlPCJktoSL3?g;kHL zg}}cUFZkNIbB5-&eL2PJ^Zqmk#|Y$BltzAR?DY5R!`TAMi`N#0%M*=?zkcORqq3{0 zsJLe*qBS)#{8Y4c+>`HMqx5$)sjJ6EqNowt%d4ASk3sOdrY6{gJG4UFI4^?C) zsxH0bbM2!REX3Qe^9K|<2ujqiF&mqDFH#Jwj|RjC4;G1$ks-$?QTC`h?Ze82hV>&s zR!H!0S?Z$=Et!*AoeBL_b+tB=sO&hkl2hU)-ZJ3MmxZcq|7m!@jUv4;ELMchW4a4H z(THtk2@bBM%oi6N1ny%wxVqiGv+K-KL}?Hj8yhlm{+z2NJF(B7i`(_}ld=+=;^xX3 z1nN0~<7=;1KAaSOtaIkk;SP4Le{S|Q1jM?@d}(vx=9c0hnCnPfu^#rb+?z;s)gv5# ze1D05?lXK7cRDdj=(?5`-RsTQzybN#Nb2HkY?m^?3b#73!rPb*EUS+6#o>%J)Jg} zQ`1BehPr%RpZSw?>gtAmUw!^^K}L zqp$o*u7js`sQ*9%!TeY~B8Pi{;2l z(C9(;-q_eUbIb0aREqu!w-M|+N`;C`cp2%3UJSdeSgDbS!O&v+wT*>#(=RLM4|i= z5`rKyy3A9gu;)e5`1$gom1s<=G{yce+rMHKviPLmQkLkeEFYLr>@kO3396u z{yL8kdhJf!9l6Ge`{`h=Hv~oFg4Zyo>E=EDiHXHS2PYVZN*1l{4?Ee|EMvHc$h~Bw z4Hye`5EjD94?TPjs^gSW3#HGtwCy=FCB0 z7z_=Gnz@-dFp$yxesdKas;tQm$8*RlD8wi|DA`VyQSe9TuhqD&OyvMptEn+% zWK1|d=XvvHQf_W(Mn-UC6r{gCYAPgUI*=7Xs^%H$GMZfUt+9>iJ0ZfgxA*hm&+bEgDRnaqZU1Je?d26N|k;j#d&LEO3|g*T6}YJ1`0oZdy^kU zR;RlYG=MpF4cSmpXW&>@RwA|>rD|-ta`i-AfKz{k^RsGCiL3Ts{LCHdvK?H6{JHJIfZ_#i!;drZv^n{+sApm-#HG zcZ|D9r#$4xV^NF1MKO3dp%+sOEdvPo2@ekk5f!?KpZBKGpYxb40uK2-ea6jZkW~L} zd{8uH8~Fg7yqj_qwu3KT%xN~Yoirr1o&6w~|JNoQ!=H=JgJhbxZp4e5ncWz_Q41-H zsNy*0g7}L{YlqJwZdrniGc(gkK*%lf1FMiv;FFn zA$`vs<3NnfRS+OT?1vg!8?ZcQc&Z6URTM%X^J`mPQ97wWm9M$h>8-9M$ucc43ga3&S#W*%@ii zQaMzfOp!>G&}!*Mp`|E|%uw{ZB`g{r+jH7FI2@D|^A=f7xUP#get-PlJa7#+B8x2h zZ{d_06l^#^ZHDsV?*WO~<-jP2SaD%wB8ab?U>J>`*sCpd;k55BUrcXi9(wdRHg*%{ zky&1OqjR&@w$sz8?tGjdH)@FGyVcwAr`k+SPdBi!d6Q$IsWo$ji77vmmzE3$biY0G zs~CUzS7gmDwLO<3lek+4+o63}R_btf6&A;!)I~L6_cGqIa2VX_1k~h=xg|19st_h) z+rA*tEze~WIO~%2>}_S`nZds29Ed28=IQ?j!Zq6AL9SJJm{Uh|5c5+{Mq~DV?>=L z-W4)3s;WLlhcNfH965U443kPyHC%s`ye}SH^)xl&V(C|K+?d*Q(6kw)5*ev&lh<34 zZ-6O2FGqSU?t1tjx0wxpNS5eMTeD>A1z!H@iyIP@P@w&)qcG~wKCz|o?84sGt>C*| zXVZhLhJTe&cadzDWB9H)PRdfRxmdHZ=uzF#AoF<(5Z6Ppb3bb~oNVw{d8Ml+;Ob~l z;9*zS*%~bcE!yl%nMBWpQ3ZFjHoOw*pac7bSX2byEFlr+Mo3*p@<&U-Tsu~tp%6zU zu}dW+u<2zDx-S$ZKg&c5-K8}i1)1dsbaD})@0HALH^RvW*5-m>e{zmZp1u#_uaDa~ zBJ7x;2!~P+SIRu(u|c*k(PZ@wsWoe@uW|+VyyfMnk_tYFx|c z&j0>RHFG2y9fOk*0~W0B#xM42&jp+(ue@)jhmU`OiD{US5^sB1c;b8fMGFT9V;LD} zM=&^@B|Rg$xfzw2aWyj1YcjI_yDzh<}F-BDy^ ztpl%@5wgOnal?XD3sxk8lSOTf)FT zez4Hn`V3_Z)valpA8bM&&(K!hx8q2IXMO&RTq4&J_HZKzh_z%?NSBtis)2-28av{evQAUMN zpbTGI*db%_G=+BY$qB0%c)(OlX`y zy2Y=j3n_!DlWO}%u3l^9^;bBADYE`D^&vKSc9uPbh#>s}HHi$`u_&#lXnv+ChP4<}1%at?pE0H*5%Uh=V z;OLI4gxs)QhN2R;(R=gN5IOs<4c1dEc7GeB_Cj zvaj3NM3-+F^gzDQa~{27*3fJ?!8TAWeb?q08sZD502?rf^pv_-`l+7U6SxR9O-;tA zQe+2BQj$mXV#s|bIigD;ZbrexirSR~$gffWgbn_E*T)rnB{<%*+z}AC(^@@Om*ySE- z^0NW62~v)T%x`(QAYS#k*6K=kv6XL$GiPIybc9+@cj)F?VVRxriL+y^v|p#X>Vu1V zIuxS?`xKOwYez;N3QZXNEpTgJQQ7#SkNRw-NWc30zP#fXv4{xf<4LF_2cP4?nVFE7 zK<}QEnHe6!sUrRr%59LK-+XpeR%Th^a?D6vZ7xiHe*UK#Z*MQ|5ne%v+w2H{I)8aYL^hg74uL>O zNTj0CkNU7vdaR}+70#9fVjx9s4&r|{E;{<_LS#2%#}$gL>40;)xc1GdDb$Uo!pKBb zl_s5nWvD8Kc_STq#4smt41geB5)k0*>&n_s=Xg95eJL@4rm9MKEZtRldY~{JntV)- z+KE$>6@sjZZUv|^%^o#%hMk=)74qooV-Jenm7h<)C50e?DM?J_;d3buQETu3_N=Ic zU1qLtYik=EjON7no@0Z!!pzJ}ZB5OIFJB5c0CBMbZcjy3wY8-MU;|$ANN|C!e)|R` zg}tNW&V2cTh6%_%;5n9}xN!b_T>!NL3kTDf75<-%9ouz(vQK>X;^kb*QlqtxJ^IK< zgdyW;`IN365*21t&AwTv(C&U+yA*vv*i8f8YnDn<5dopm0S@=?6O)jbgm{$*m;AXg zUxZ_``?2O07U18IlasRaY?@Wx#nsy!>;U-ir; z0yTLJ0hiHp_0L{`HmR>3D;{9&_Vo=UsU}-B6Ij7@m&;YX!p_bPd8uCrteV4FFxYhE zRMuT^iElY|Iq(Y#3T|HE;#vVKX4ch_790Qu986tZ9n7~}Y8#7V^|b`hF2vPP`+^PP zmdgbKD+px`U6`DtH`F#k(n?-{%LZ^A8vO}^LoYcJTD3-T2UB*^W6s?|f2&*{2?^hT zJmbzuIC^foe7g8v3pOJ&^XQ?2{)Y!?g@klgC@5_H`UF?$pB?l4L(-s?ZWfviQ7YRKU$jM}4WQ^pur!SSeapM4sUfF%0EiQKU*VAY1GoiKW zxx0LS2gJeZ-O?5@)Y|t&L&)%i-yB@Ixw#3clS<~oPT7b=AAp|t=>h$ zxpxYymVhKd_(or!I-G1LAiDva6kHchla`B_-JP8@`iZh5Mc>qkeqWgortCZY0hK0N z%)2u^jFXcCDJfd?^tXaB>IR28H`m;{6h!=`q-;ez-25=6fy`Rn5MFcMVC@b;cGYBC zt-s*3UfvJbLikoLLRhW8`^v|+hgDTooA@E9(h`?_O3nh$nc}Eq9+IDzH-e|aJ~gkj zsY%+?b2ml(;(seED^QBek5pP%S;=LZo15Rfc@v=ML<6W}bXthvVVP`?%S}(8{`m2m zQ&+)xpdIHYC&h2^0a1*;-GBp6c4iL#mRs75ZbErhh*6=W;Lt@M=W51E<8-q4uunCk z32Lw)(6nMJDqFicuU|B2MC;zJyhlv zQkXn~<2Jv4UzzGaIR16REzn16YfFQZE3`E`N49yI2?*z|yB68}-6sq8+|%05^84(8AeBi+LFiA-%oHCnu*j^2 zT3|v&P5vZ)L06Y@>KQ6)&uOJYeWE5Q>MEg$x6?W+%NtGOj^?>FEiM<_Z3fkHwzjEL zpt0xPj@v6t)!DszS~=n;Ao5{8HO1w2Ax^FP1f{O=eGO*!C8+~eFT=P4DYS~1pY>tW zyu0m-+!jBN>(`tI>A{T2JTr&YpQHI7fv`p&=@)gFfrv0VHgSYWy*X~lUZpZ~$NeL> zU@%~ELZ)r6K79D#=jVs;KKV(3@{e#!+ZwkJ7jpsPm-y_^Bb9=7QQ+VuJ8u~i!U=%) zNnKr&eJRZyW6?JVd)^>sDGDtpIVreN`%JO)NwTo#xQMyIQD^-y$pz}9 zmt+haY5FxI26A_*cUZR=JNgS?l0IVgRVZ4p7eAQ&mmyJLya3>iQ(;@`dz@(o#oI-6~LZEFvzU^2RHxJwS3pjO%x+ zK^i0?BYZX@YiX*Zy|_OMa!KgL)yKnV8*q-Y&F5 zzhk9_=rUv6PV$6ifg3VX;9?E-B$Z_r58Xs{U7T^S8|gU-ILs|+`lzPih!M13ZkgYF z=Zr&04t#Xr#I%bL6}`q@;~~}3E+z@1mggj8J86WfWB&Xh&uN?&V^c*gYb-4jXL&0F zv4@Uu-~5A)NId{4j)0;&vWT0jJ1e(6Fg1i@Q=G=gB2yvr(j}gr9v|2~ihGN7fw*!- z7c@-cLN>A^UnM&1ybF_PfKCWpqauLzoO2{D9(2UQ( zxwv>uU5OZ1Jhfu4ILxLYY60yj$iF4|0M-i!2Qy%DkRedff;LrGQ`2219w0=EXo0|h zZ>Hx$KNu39J$n>W=42E4DkikI7&ci_kFH+*oGuS&$h>sKhogCIF{>Yz$&By6l#z*8 zOFno>Va)Et37T|%bM?9fEK(K+GJ5RS))!+8MdS+#dqzv``M7Vk>Huis6|&dR{H*z6 zh_0}2N%O`2!b^4pl4kttv694_D|wbKF*%UM=K*TL+8SQy!X8%gBuo=To261}zo1vQ zH{@dml2cs1Q4AzW<+Qc!?v4`>6G2aTc7r<96YA4&wt*wbAqq=s~E zI__ygIXB|tQ&PH%b9=&=lxYj$#Mxi%)JSI^XQbAn z@>LE@QjUS!A8$rsj$xZ6VR%;W3a@HDc6AnD%(j81a{jvSoty-k*yEp;XI^89({!qL zax~~y=awdp3{6~dUF+=|;xE4bvK zQiKG5_5e(vL$>2sJskT9Yx@spv6;>h$6=SwzbRH)GnNteJoQ7kw%nhY$+ZkkNWDYK zhYCEjf7r8@T9KP6W-s-`^cFvr%A(fx3WB8fLKB+E$h# zeDK?KVs$auKUoqzVb-=V$KC!xcO0`xwUsdV*N-Qdo5oot55l?#%Y9>1I1B#gLf@b0 z2a8?>pYsRyV+e%YKvS<;bq;Ix^hERG&6~Y5Gfm;)Wu>Lpd5`FpoT4T}iV;tJynE`j zemgnE0;)ppHZ=!lWkSMvuUlvJ^n86tbV{4*{cPoB?;9GM{1$*<^k9@jBcW-vinPd7 zQvKTJtt7wKSK^mS|Jhdh3dc*}7|#{PFufA?8wR=ngM1|D(;UAIy^UvET!7)|9-Y z^Njmtj;f=7X^>!Bf}GjlclS3V!a+|&8=vShCL4JB8@OiC9YAEXv}Rt9`YA?EO)*rb2s)Ub?V5~$)Y`A!lTk)Qh3#0KeKkDcx#G~}Xt(JZB1sR!un z@F8Zi$a2@fzC92pjPc5|Gucm#Vco^;?UfuIUm_2Zu2T!Hy?9Ca&AMUmY0_Narw@aa z-95?V5SjiR9cL6N5zq4jVTA9*Piiz zEQNA1CqaKYS%Z<7-CGNjy(WR=NxvcAcDty|QZsO>hcb`QIXVy%^W(>VSH)ex%Jg8O z=}aR>RtK=MkoLI+|YDF zKRPMJrQ!QOSF#ArqB9V2SIxZgF~yl->$+pyDR_%%H}AF#JW%)5G2$8rWP@SUY~VJtCUIJN`a4?iRMxqQ0wOorwwfsG>UwxY zSVryEPpPcpa?PMUu$|ld|I2o&YyjK2fMwDd$<;Ty?7D0HD*L zFY7_qlVfHPtc#va<+$&UtKJ0#-5V{G$0LD+ojo3yuzv8lNiQh!iS6sGRY3MBUDhgb z7u;}GW##AC8^*)bfLOpoJifd6*E6S;i>_P}-AO^CD<0T>Ty{sSe2o$Jy9dW!(8H-W zt=Ug*#J@I{`Os_$N16T_`s|p#UMzIE1npA-rUIs}?00UClZ1pj&XNhkCQjB*Su0Ay z)^QK3P8|5t(bpG0fK-3FQn-Kk<&x}XIQ+!zDGB_{A~Cjj5zhU@plJ3msBd;?O$qw|lZ&l2QBf3sdTbx%crma` zKJfyq0n*aa&ksB(#bzazN^k~F>RVZ{{At8~OQEFjs>Lx-)O!rn$BA17FD9v4Z$x>o zuC4;N1ohBfIUj9}Jn;X|Kfw=%ZwZLg&j$71{1aR!-1{6p_KSalXha;0yH6n%lJOlCPV-!O1M-;sH1K~$5mpUKV5N2!hul-yrIJR36MG?Tz@=(bG5Y<{DbMg z@c|e0!WKSfA58;<814_{Kyr4-MYBH)8!&N7ne1Gf#Rkn!S)Nmgyl>A0L<~$oxw-Y1 zh~O9eW`r+QQUKVbzxQ4+4_x6ktdR3(}F z0lTBuS=aXXpFj8i$v{=Sn)(62uR;vPF&VS%(QX;wvPYBrpZxV=T@plQx>OWrYTw7V zMThY|0G?BL@$o`u?Y*V(c{T*oUj9r_D}qFjQ|dgqF0m^xt|t;G`V$)sOiTi?;y{Tl)?9r)T6_1Zj5CY4^Z=S zxJ-9eb(8ORNAoy<9Q&*4{e&Y!I{W(WsH!%$$ZqxNF*GzlU>#0h!Yu69p=%-aDz5?z z-3y9&FDfTo({~T4W?_{&nT0tx&do(ZCnk1qP}7W3dMibgWWl=go5?RM3)5WT$`JKn zJ=BS5giXipN|XZ;#0u)e@#}wIv^oMSs2lTR!0qBw+Z$SHAjZz(G!-v4P_vY(u%7ZV zmft5N8@P`<7Eu$&a>}@y$&FfT`^=pkZ{P-V6=qDCn!2 z_2j#R{)Hq#Y?Ysm9ol6oQKx)lq@4FT2D%k#4?+4k^BH=oL71tpndPMp4ebH(9>GMn z51L0Ed1yHUT8t4IbkC+Fc?t@1`IjG+bg3k)@4>zjBP+f9Wy{pmJ4RUO1wnz+!i%gV zkQM|5x8J>M*xr&*6ww?VxA|HfEA@T!Fq7edS^|G@%f-((24H0^06g2+vSCZkNA*f+ zv?XHS!IV-Dtab3uD<+%dJ{@eIrHKok(nECO)|`E=-l`qjn?-&@9He9=uI0|;BTcV3 zQzHn%f-9P@?e{dz&s$YFe8nQX4MbN1LIZGG56d9Vb<}tb`I8BspR5GJyP>K%sEF`* zp8kem9ba@bxK?9Y=Ef>r(~lAHta+~_0#)_n=^j-z0j5RCyP}>h_0f%VOCe@m*9!|( z%_1`rT&lh&RBONwm8r{i=fJz&f<+z>bnHeeq{>b!sz=ZpB1UYU7c(T3H}cGa+N3=> zESR@NMz^jqpjM&h(ro>GoWKhFix4LYhc=i3Z)0q13^V->#UCRch@9qM|7=HY1DYHOEYZPL|N-Y4m?ot;h^!sLgtfefP`#Fn_=w57KKzLNnLT)(8F z>Z}CyAIpIFX1USKhIon2+tK)43zKmk17dOW*^yk>$#flWYyq7rC5M6%Kb<&*6(g9i z)v%haX(h$UMSi%!H3HQC7fMRR1k^j>euU1|jCm*MoRlpQW^m_d_kY+XC&d65fvY!X zG9g?E(oS)n{FD?tPeQnlm`^vB;TSA9wJEU028rae8*hM6!z8Qk5a*bhoUE#*_S^(c zV0*@qE>9qg<8Dt7W~b2m+`8weM;@W1Gz6TT=av<*a{Bs+EAiWa^V3(%kweL3d4LXE zGM7u);VQ+~*25vxr?YWQTB7sM!WCI;UbkIsX>_(rH|@`l4=1N6M-`Z>dXAW?2Oa}{ z5&)@A4qxEoBbI=VzdK{MVfXk(d|=qwciVxoD-=;btb8aacwcki!EWLTA-RFflf4@& zjo}#?J~Mc`Zlv*pvYB=xJ68vP?@;-9IE1Ty-T`!fAe!Il;Zg~$*s!om#$*O(k;!96A0h z1x2!g@bP$&9%}dQ@**aTIr%0SPeQCJ!3kV;Z4Q_A>KDJbf*f&)P3s2$@e2VKo5q$B&&c~}@BuI+|%E0c@^Y73Q z3ZP0>PRY*RX^W{zr|jN@B0p52{Ep&j1tDI}u2_&(c|Ntav=XMeEG@lj^i1Q#)#&Gv z!P}Xa2PHofN9Ro$nJ~N%o!H<4mONSkxQOtOpa|{ZY{*40d&~`5JaCO}{t&nxO`I(^ zVEtUjEo4ZrL;3-3Bz0EZ&*Sf9MhxZ~l|3Q%jDjL}xbmW|i8k&HD7m?$ z0bWhY&X&&OqkA6krDa-GZ+G1G49=rLZWiot1W${OcIBhW%pc7x&+G9lDC`szJmKBA zlHW=3%sk)@G5GuJ7E`$v0|P>9B6bm1+=uhR?%_hBbc1-wR}}--OJywNQNF%;FVWmW zGVD0#f?B#67+h!Sfc8;SE5k_Z4(!WxX=FC^$Hn7>!!g+}Uf}e>ZeG|KtjXdNC;e;h zB5mpk*C3|UFgtw31etZfiqHB^v7SfdMMH$y=$VM5xs<7IOY<>Ey3RFNh0OHIKHP@x z4~ zyoia3DK6$UMZ(Y|IC)Y{UA;Izzp1_5)VOMUZBVz;B|Re}Dl!uO+lGVV3#6fa`h-qN znVg;dG3+#&*Yf=Nb2uK;93FW-K0j)aSS=$pTvHZGJwym;H~699^u;45=J|QYI%~YA zaYj~GB5g6T>r4u#H^8Z-ay;U4R7NI==dOFks~%|?BC4cCVT-Dx)4kcWdH52bD26gR zc%=*8N znoUklu7H)?!nv64-_Eq0n3ypn+O%MyGrfENYp=iMOlq7*!XbKkdX>p`kzFn>u2)=U zO2)<$5Ch=3KCfdI`CfwBJrtU=aH7ul%}u-`M_vc(l-FDUBvv6>Y z6oH%IV2ds}3f29Y%i!tQn@2p;)3Mgp7mgf?WpKV&Ier8u6n@*J9B7T^1$z6^nG^l3 z#9;b%aB!$VK^j1uKRIVzL&Frbcp*3ifg@SbX?V~M-&9BkPH z?y{?FEG!c$`08X2ZeM(GRscZ zk(qTmj*Om%WM)-3i0r)^2vL$vwv1$tWAE|a2T!l(`RDz-=kt7?KXT4*eD{6b*LB^i zBfow<(9zN1ykgyR)tn$HmE^p0=g$56_g}=sG|+<8j!uNDRAWkw6xh}_YZ|LTW!wdD zCK(0u`+FM2;e-mWmoH!T^Y>3V38Q#!uqx1(HX?tgRnF3VMuVz_un`ne061JTxpkuu z4sI>`RrIv0#F7!%n8_?=5#y&(E+$C~FS~N^O1nd7r?? zF-5huwjT0u-#U_~1P%#u1ZnC~2t58MZKUas34-$MuBs|O*g)Gw0-HdamG7R0k<%t_?!b)ycO6YYa#la&r3PV+_AnuJ=CV&j-8brt3iI-PF3YXK(-3P^@QUWDo?V-0bY5Fd5YSL_*@Z2&wpiQnC4w2B0=O*xIfX zL3RMf7~0dp^J(&MJWp7dbG(`Uv#pV3HPQ$#5-Hju|9i-2_RzIKx9DDio`hm5rSGj@4nPe% z(P?BIc-ccLFHtEH>M$vLNM}1vXu8yZQs}YF`+N+q((PLyv~H-?QZuk0S*44Rz^6Jt zq=jQ{$GxOiSuzi%3cYwhFb>q9kqXMqjw$XqFIJ*9n^nwjL*% zlaoVBOAAbr&v(gf``tx+`bxz=YP9g`G+orG=F<6MVQ~Lx2a6DfeCo63N|`hl2poX} z?R^Z(lS@f4wE=c)_h_~2YZrWc?5IgK02Sxr4WuN^g|)gc|3_Wj6FcIceugMH|Or; zdG)x60B;%BJt(T}rea}YnkQH^KxNM(YpYt>CS8B~r|!b@$)duk%@L;r1an!}E*xj@ zF%-@J@ah$<8LD`Yw_*7v8AM)!hxQWtc=wy#YB_r=&Mr>i?f{x9_b$eYc>Z{5-2W%9tlqz?X8c$7d3-{EJpjF5 z-P$BZIB{!eq`;v##d8@Z?V+8J8eI>g!*9PRi{7@n2(E3!yD8Y2|hB z^nD2V+)YI@(Rj_GEuHP%#oIB{R)(<^V#E7+r}-J9$#cSNrYI0kfgG`ErkN8H;o}36 z>+;&hWWDOySMylhAI;09m!NqGJx66O!zp~8pnxSHz|_ z^un2fTfX%fhgLvDgYf1j&(nXoZlX$X?Tz=m-GJDrEF@^X8finMM!Qb|5)MM(x$RM| zOO;=Hd*5X8)HU9jhgtS}d$sM?7Y{|tdr&!9SxouDwKQXX?kxtoy8?KgdErV6RBht> zx#k-h`J%`jok@NxF!zaw=s>N2i=7Q9#q|vWy01nFz5oPGNp(ky=E}L-XZN8qVdGk^ z>-`xKuEazMs`Une+o8f(7I34ryzJTkkC+1<*@?oeHFYa)5kS$$t?ZEER(%GE{F(7P zuC7O{_zj=>LRUj#R{K6w)bo#{YsdT61R zJoAr)0~ws2v@6Mo@bz=(7Yo5nGSYWz+?ILU1{z}u=V&5a$KG3ro?+PcS46b?zVuST$h zNTU{Tj^-}rsqiZ#LA!Qw|}CxQRaBZO#j`ogn}oCrqMJH~;>U&@SIWJscE{y<(hEU{EfH!SdQj9QNSAqgbybcYG|Dl&rKT)XK zw~wo~Q~EBZ=s^?^n)UXrFglY-$O?QVM9()bsas0x>iL^j?eEr^W$<0tMmM!PhPBp3 zl{EK0Tk5|?w|vKOwIxFb`HI)q#&N3a$3%M{4OaJ(=#3|chQFji*_M;na;C0xmvCy2 zRozu8voNV~Wa!Z{6}*XsBP7i8%NT4V8gD(-IQ3eW`^+>) z@3Vd82MzX1l8gSWyaGWrASi%b8GD4N)v;&^%ftIM z%w>~S30_XWDm%gjo^)`%mdmm(VGPbTs+#G{dt&qe*W4@t1P?}B9YXo zucPBzO7sUScW)ENa@@~INs0YdkefSqZvQtyMZE8u{}-lDD223#=I=;iU|vD;VV`Vz zUrqsT|8Lp!zMKN#g&}PKC#78l?|*X&kT4*u`@5=}eK`ff{Ry|&V`UKL^}p`lUjR6c z$@aX|_Fs<x=G&BSml+4V`2df?)9#CP&5^DSa{qu~` zQGFv97Z++88UcQOS%K2^Y4Puq%?S#5sj6yfP|?03=Wtggjtv}UJMr&K5=FW-3t_$Ua z#6BIGnHzC|C!VmaJt;Fj(RZaqR5MMgs=1L>V zlAjh@pen&~uF?+bh)_aEj)a_Y!v{qbnL%#WLU2fu!SJ?JOGenHdzi({Lph7M`E3Y~ zaz|c|Vh##W?L4sO41ubvg@F<`)XyU#BDO}Pwg(WWpn8n!k7O0g53#X^U;SvI^&r^= zjDDRGXCV_wfE9Uo0yxcqaH^`>4A9;4oTFAe+KWp|i4_At05%d8M^959I}+LeF&akS zz(BdmJ32Z#CubI_NM*&veWr~V&B+7qHlPO+nv-5E8Ld-;k4o z*o5*T2_ayfk)RcKx-9n$f?#0(CU&ULDb`w8sPnV3CT3^9xbOvB$g-W;EeQm2Fl0+e zP6kiQTYlUq`=;^Nd`2G~CrpiuD(r3qGER+*h`6lS);Gr2&6AvBeG&Ghs>;mF4D0ON zd~oM&1RnjWgz`wghlWZ3-B2Hf@e+y|ZDfYxN@{8?yrmm<(7)-z0Ny@)0tScF(jhDa z%6A$l11f;IzAy>8kji&N(U0m|{w}p0IHY7A(EwJAgTr}#w15+to0`515ATHPRS{o% zwqd^P9O=pc7KLFrCa75BaLBZmrModxujmGw9Wb7oobQ?5x<#tv=;XAtyj(T&v=9ZS z$IEXH4}duvWB@;Y{Al1Zd(;foJiH2s0kYwS-`Vmx==Jo})bAFkb0F79(7ajQkvggu zP`bS(UU2fniE>RKxy#M+(NOsZ0<1Rk#AAeigk~!i>~tw8DCTO*U^3W>$T)%VPfN?G zy&mWxm>rK*D)NnXvW^yWQIkT48=vihIy};mm)O{R+ba0Y?MGO_FtL*H-2rJGzWlj4 zyNFt_!~-_FIOa^}nVn|@fP&p^tT{nfBd%2D6e567FzV6ZS76dpp1b;j!8zFLtF^=y z^y7!F(TmgDvNJfM8J7`>I-ZC!XvUVNrm>$z%MklU3LPH&^(!ZaO;d_fS2stE<`NI0Z$5#?DXx z!&B8QQ1n8}GfKHmLWB(X6mV3F zY6)DCl#C_?Iw0|1yQB3S3_nurdP{;Eh(6VzT%J{kAqpnMA&)m8B8bxf<32Uhn>UZ$ zpeZKuDg?A*sg#D`rkWg!j2v0U6G9OsMMYyME~XD4`Ab2tcRrMAzqz(Jc{R>t+RPHX zZ+lEeAalGn8inpPOoM5mPLEe1DYF;M2Ye>tF*KD$8~G%F@9Rrbe8D@_>l&T~O0Id6 z`ym>__!#J$VO=`6vD)EUdm%SS9tYMjb7 zd*kCnTGs(UBBkVt`)?~)yUrqaC(B=;y0*2=zGteh&lu$g0HtEhll3K7vrK{G0SFg$ zUhp>+q>@q{W`20{rvt6wWJiueVWOg#oBj3xskDvs|++BBE zMrOuS($d~$t1fJsyNQ&@B^4Lr5LD#u?KHiZ+f~;ATLgf~#70L=t%4_X6EX%4N1lJ0 zUj~auFM;E2it z8vKEZqX(*((9=P|Qx0c&oJgJ~xam-cBIe0-z5hIK#6i!%ZY83|@D*9rVYjUn@)8YBDbA4*lv*jc~!9_GuQGh`o-A_Rr3+^mrEZh-Uefh%y3|U42%yp%bBlpD_a#Z zL3qA{>#^vCf|9-&uMef$*`AVs9LuQL@=^S`l=GWvYlooX8aaM=NwdOSvqCR?pt#ek zurQe1ZQvYWNzq&O*3_Vn!{G;Y#B!C-N$TMg)rMnGl z)mdh^_#7^CsrXGw9@zsMoy0psYXgUI6N++fDBh06B|YRs4v8EOFMc$*U4Y)sQE5Y; zD|?0F_qXPw@7}0jQ7B~5d2l);=P2>P3*%Q>zVRkq#fiz0oKMd42|3T7WcoElN0{i8 zj%z{tXADiJq3_Y#?M9)7t0rL;i4QZ5IU0RQq4A!?E|+y`YJOKS{Z*p>;l;$_*yf`F zNjz3+S)$ME(S@L!398|WU$@kKDz{43;}Wi|+1U=NP@-#j0?@d{D4aEVkbnMQE(D&9XzFo6ZAb)>;9kaY8A5sk> zg1;QkTv<9OC^*XMW{5L#oz_K+exKA5e5I7Rv&8DWw>5-q1ab+iA+!8*;mgi)Rx8^v zbePTOKk{tTm_#_Rnhi?mss}j`SxoTUpFE60H7c2{_m1b~O}Ljnp77Ie7TXYxY%w^e zFN#O1D4pn7hQQYLv*s$qXp{mjOkVH+y3Gmg}s-|l{o zbgW>F&%)`7&-j=mZH~@Z|IocnJYbZd_LW0;bDcr^ix5k%?Ai4LbaV^D84Pu4Y`u3e zYcJTd=ihyAAvROK{*7ViD`cCYIPiNfwVP|J2_>gpToR#F&+*~M} zd_eR{nWv7Uh68cow}S*DWu%r@KwPsyyG+`~xM$c9q-1xxwyF{Acbl6}9(w$x0bd`@ zDd41i6AVs=H$~Zc!lm3?q0ZQaAaA>_1ROhO(*tG;FJ<=kv7V)MjB>)J5n;1C-FvkV zq?sUFq$*3Zspk=SwbB{I90n0d%r_GBXX5Y1{Nc9};&8|5yF+fxc9fzG9+b%qWXulx zc*5{3{Qb)kAr1;?Wn~m!B{TClGlQg3VL^ds z-EYA!!>u1?XWH&Pst;T?c^Hruy*c9lF|2P5xkOcEfzNdk-F-W=`PvW6sUo2gr!R=Q zxTM#Rpxd$x`g(hL;yFxt{WwYR0cM{bA^Q}xlg$j*EfMQm8qhRtJXIaUjg9@;KP^P8 ziqKnpHmgFfDmDw$7)PDge}5eiEy<=1JdFQjAU>Hm8kzs;+;qoFU6+;aJbXZ=OI&T& z(9V0fq+5_Lw{uG*op~8Im-Wu6-492%xosfe@;S3BL0<3a_LNXgg~DGh)6X;xSB*?` zLT#;&jK5G*c7zV~|7BvviF=RopL1N6_%vB_F%EreBYhwxsNE)<&!W4;zOWvrCuOY) zvvv}!I*Ect(AIBK1>pu&ZZZz9hy>v5k__Cbo zz1ctB;Z1L3l=S7RQlK@BQ4%);!f|#eO8)(!D&e)Oh#Y&{Zn1<^%U(DUSe5qin3NZB zMb>8`!@TSqXRp2chiEi^c3TJipd#xj(tBc2^#(H{Zk>HI_g6GJ&RY&6o)W%SKAV$# zhPth#tGio<*uvbr+TnyNIi;7u>UrPY%Mg`y5DN-YwI0|R58e+C_&wQqmYuc8Bbo5$ z#>RjB8J1@iihuo?{RVwz7Q?Mc;A-ujuHChZ{qm;;F)LZ7OeFrS`X~ZjBT5&djDsZ`c7Rh&}}wk zQq!q@#gl%q13_KE&ss$3MXVtcxN!a8&XePGv$$_-MmxJ68*b-%SP{q^3=_1F_h#j7 zT53k!#WeZxi3u6?XT%9YJC9zD%zyW&YEIyp=S|nKcCtCq5{TMhZR(;8{JV-vnJL%l z+GSbC$9J?3?_T{fzF<02ay|G(RV4ngg!84Cmb$vSF^9GAH2il)BKx+ZV@bgSmtv<9 zWqvB3!bh~IT#_$!Ud@_Fm6W=QEx;j{N8DI44(_bkw{N-z4cR8i-{Lx(e@nQmtYy|Kkl zTPl&iziK>{m_oUXNW#W1l8N*&MaPblRlLj6X4|_VX^tEIQvCiV<; zX#tn$idTh&3q$AjLpRRd-PK^KugIpt(Z1K>=aW%Xd)f1o?|6wbW!=`h6tdD87i%&a zvZOLgkM2Hm(p&w*NqBKtvhEXPyFa&4Vc_VGf11fAAS=5&lCBM?{B)K*$kFY1E&FNA zk==)?P>H&GuX4C$?MMvq&cD3vc>6K!>AcXb30Dj!%rRI!FSK^*NlAt!?=~WY4HOi6 e|8vjWA{$r>{H6J3?h+xKK+4^g&Afj9>Hh%f@J}cJ diff --git a/docs/features/multitenancyDiagram.png b/docs/features/multitenancyDiagram.png deleted file mode 100644 index 73c605ae6b021809f4a57ead351274fe8c1c5058..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135104 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 z 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

;X4K$=4YS0aD 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 Back to the [Aries Developer - Getting Started Guide](README.md). \ No newline at end of file +> Back to the [Aries Developer - Getting Started Guide](./README.md). +> \ No newline at end of file diff --git a/docs/gettingStarted/AriesBasics.md b/docs/gettingStarted/AriesBasics.md index 23bebb3b..f8693df7 100644 --- a/docs/gettingStarted/AriesBasics.md +++ b/docs/gettingStarted/AriesBasics.md @@ -13,4 +13,5 @@ The concepts and features that make up the Aries project are documented in the [ The Aries Cloud Agent Python currently only supports Hyperledger Indy-based verifiable credentials and public ledger. Longer term (as we'll see later in this guide) protocols will be extended or added to support other verifiable credential implementations and public ledgers. -> Back to the [Aries Developer - Getting Started Guide](README.md). \ No newline at end of file +> Back to the [Aries Developer - Getting Started Guide](./README.md). +> \ No newline at end of file diff --git a/docs/gettingStarted/AriesBigPicture.md b/docs/gettingStarted/AriesBigPicture.md index f7fd77a2..982ff3f6 100644 --- a/docs/gettingStarted/AriesBigPicture.md +++ b/docs/gettingStarted/AriesBigPicture.md @@ -8,7 +8,7 @@ The agents in the picture shares many attributes: - They have some sort of storage for keys and other data related to their role as an agent - They interact with other agents using secure. peer-to-peer messaging protocols -- They have some associated mechanism to provide "business rules" to control the behaviour of the agent +- They have some associated mechanism to provide "business rules" to control the behavior of the agent - That is often a person for phone, tablet, laptop, etc. based agents - That is often backend enterprise systems for enterprise agents - Business rules for cloud agents are often about the routing of messages to and from edge agents @@ -25,4 +25,4 @@ Note the many caveats in this section - "most common", "commonly", etc. There ar We also recommend **not** digging into all the layers described here. Just as you don't have to know how TCP/IP works to write a web app, you don't need to know how indy-node or indy-sdk work to be able to build your first Aries-based application. Later in this guide we'll covering the starting point you do need to know. -> Back to the [Aries Developer - Getting Started Guide](README.md). +> Back to the [Aries Developer - Getting Started Guide](./README.md). diff --git a/docs/gettingStarted/AriesDeveloperDemos.md b/docs/gettingStarted/AriesDeveloperDemos.md index 0f38143f..69fde702 100644 --- a/docs/gettingStarted/AriesDeveloperDemos.md +++ b/docs/gettingStarted/AriesDeveloperDemos.md @@ -6,16 +6,18 @@ Here are some demos that developers can use to get up to speed on Aries. You don This demo uses agents (and an Indy ledger), but doesn't implement a controller at all. Instead it uses the OpenAPI (aka Swagger) user interface to let you be the controller to connect agents, issue a credential and then proof that credential. -[Collaborating Agents OpenAPI Demo](../../demo/AriesOpenAPIDemo) +[Collaborating Agents OpenAPI Demo](../demo/AriesOpenAPIDemo.md) ## Python Controller demo Run this demo to see a couple of simple Python controller implementations for Alice and Faber. Like the previous demo, this shows the agents connecting, Faber issuing a credential to Alice and then requesting a proof based on the credential. Running the demo is simple, but there's a lot for a developer to learn from the code. -[Python-based Alice/Faber Demo](../../demo/) +[Python-based Alice/Faber Demo](../demo/README.md) -## Web App Sample - Email Verification Service +## Mobile App and Web Sample - BC Gov Showcase -This live service implements a real credential issuer - verifying a user's email address when connecting to an agent and then issuing a "verified email address" credential. This service is used the [IIWBook Demo](https://vonx.io/how_to/iiwbook). +Try out the [BC Gov Showcase] to download a production Wallet for holding Verifiable Credentials, +and then use your new wallet to get and present credentials in some sample scenarios. The end-to-end +verifiable credential experience in 30 minutes or less. -[Email Verification Service](https://github.com/bcgov/indy-email-verification) +[BC Gov Showcase]: https://digital.gov.bc.ca/digital-trust/showcase/ diff --git a/docs/gettingStarted/AriesMessaging.md b/docs/gettingStarted/AriesMessaging.md index 150f39fa..c1ec2ab2 100644 --- a/docs/gettingStarted/AriesMessaging.md +++ b/docs/gettingStarted/AriesMessaging.md @@ -14,4 +14,5 @@ Code for protocols are implemented as externalized modules from the core agent c Developers building Aries agents for a particular use case will generally focus on building controllers. They must understand the protocols that they are going to need, including the events the controller will receive, and the protocol's administrative messages exposed via the REST API. From time to time, such Aries agent developers might need to implement their own protocols. -> Back to the [Aries Developer - Getting Started Guide](README.md). +> Back to the [Aries Developer - Getting Started Guide](./README.md). +> diff --git a/docs/gettingStarted/AriesRoutingExample.md b/docs/gettingStarted/AriesRoutingExample.md index e0eaeed6..c3914c6c 100644 --- a/docs/gettingStarted/AriesRoutingExample.md +++ b/docs/gettingStarted/AriesRoutingExample.md @@ -4,13 +4,13 @@ In this example, we'll walk through an example of complex routing in Aries, outl We'll start with the Alice and Bob example from the [Cross Domain Messaging](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0094-cross-domain-messaging) Aries RFC. -![Cross Domain Messaging Example](https://github.com/hyperledger/aries-rfcs/blob/master/concepts/0094-cross-domain-messaging/domains.jpg "Cross Domain Messaging Example") +![Cross Domain Messaging Example](https://raw.githubusercontent.com/hyperledger/aries-rfcs/main/concepts/0094-cross-domain-messaging/domains.jpg "Cross Domain Messaging Example") What are the DIDs involved, what's in their DIDDocs, and what communications are happening between the agents as the connections are made? ## The Scenario -Bob and Alice want to establish a connection so that they can communicate. Bob uses an Agency endpoint ("https://agents-r-us.com), labelled as 9 and will have an agent used for routing, labelled as 3. We'll also focus on Bob's messages from his main iPhone, labelled as 4. We'll ignore Bob's other agents (5 and 6) and we won't worry about Alice's configuration (agents 1, 2 and 8). While the process below is all about Bob, Alice and her agents are doing the same interactions within her domain. +Bob and Alice want to establish a connection so that they can communicate. Bob uses an Agency endpoint (`https://agents-r-us.ca`), labelled as 9 and will have an agent used for routing, labelled as 3. We'll also focus on Bob's messages from his main iPhone, labelled as 4. We'll ignore Bob's other agents (5 and 6) and we won't worry about Alice's configuration (agents 1, 2 and 8). While the process below is all about Bob, Alice and her agents are doing the same interactions within her domain. ## All the DIDs @@ -73,7 +73,7 @@ We'll start the process with Alice sending an out of band connection invitation - The Routing Agent sends the data to Bob's iPhone agent. - Bob's iPhone agent fills in the rest of the DIDDoc: - the public key for the Routing Agent for the Alice relationship - - the `did-communication` service endpoint is set to the Agency public DID and + - the `did-communication` service endpoint is set to the Agency public DID and - the routing keys array with the values of the Agency public DID key reference and the Routing Agent key reference **Note**: Instead of using the DID Bob created, the Agency and Routing Agent might use the public key used to encrypt the messages for their internal routing table look up for where to send a message. In that case, the Bob and the Routing Agent share the public key instead of the DID to their respective upstream routers. @@ -84,6 +84,6 @@ At this time, there are **not** specific DIDComm protocols for the "set up the r Based on the DIDDoc that Bob has sent Alice, for her to send a DIDComm message to Bob, Alice must: -* Prepare the message for Bob's Agent. -* Encrypt and place that message into a "Forward" message for Bob's Routing Agent. -* Encrypt and send the "Forward" message to Bob's Agency endpoint. +- Prepare the message for Bob's Agent. +- Encrypt and place that message into a "Forward" message for Bob's Routing Agent. +- Encrypt and send the "Forward" message to Bob's Agency endpoint. diff --git a/docs/gettingStarted/ConnectIndyNetwork.md b/docs/gettingStarted/ConnectIndyNetwork.md index a4be1650..005a4648 100644 --- a/docs/gettingStarted/ConnectIndyNetwork.md +++ b/docs/gettingStarted/ConnectIndyNetwork.md @@ -1,3 +1,3 @@ # Connecting to an Indy Network -To be completed. \ No newline at end of file +To be completed. diff --git a/docs/gettingStarted/CredentialRevocation.md b/docs/gettingStarted/CredentialRevocation.md index 1967a688..b8a68668 100644 --- a/docs/gettingStarted/CredentialRevocation.md +++ b/docs/gettingStarted/CredentialRevocation.md @@ -15,8 +15,8 @@ revocations be published? Here is a summary of all of the AnonCreds revocation activities performed by issuers. After this, we'll provide a (much shorter) list of what an ACA-Py -issuer controller has to do. For those interested, there is a more [complete -overview of AnonCreds revocation], including all of the roles, and some details +issuer controller has to do. For those interested, there is a more +[complete overview of AnonCreds revocation], including all of the roles, and some details of the cryptography behind the approach: - Issuers indicate that a credential will support revocation when creating the @@ -98,12 +98,12 @@ enabled. You will need to have the URL of an running instance of Include the command line parameter `--tails-server-base-url ` -0. Publish credential definition +0. Publish credential definition Credential definition is created. All required revocation collateral is also created and managed including revocation registry definition, entry, and tails file. - ``` + ```json POST /credential-definitions { "schema_id": schema_id, @@ -119,12 +119,12 @@ Include the command line parameter `--tails-server-base-url @@ -152,8 +152,9 @@ Include the command line parameter `--tails-server-base-url **Note:** The optional `~please_ack` is not currently supported. - ### Issuer Role To notify connections to which credentials have been issued, during step 2 @@ -220,7 +220,7 @@ above, include the following attributes in the request body: Your request might look something like: -``` +```json POST /revocation/revoke { "rev_reg_id": @@ -262,7 +262,7 @@ There are several endpoints that must be called, and they must be called in this - here you need to provide the full URI that will be written to the ledger, for example: -``` +```json { "tails_public_uri": "http://host.docker.internal:6543/VDKEEMMSRTEqK4m7iiq5ZL:4:VDKEEMMSRTEqK4m7iiq5ZL:3:CL:8:faber.agent.degree_schema:CL_ACCUM:3cb5c439-928c-483c-a9a8-629c307e6b2d" } diff --git a/docs/gettingStarted/DecentralizedIdentityDemos.md b/docs/gettingStarted/DecentralizedIdentityDemos.md index 62bed219..c46fb398 100644 --- a/docs/gettingStarted/DecentralizedIdentityDemos.md +++ b/docs/gettingStarted/DecentralizedIdentityDemos.md @@ -2,31 +2,24 @@ The following are some demos that you can go through to see verifiable credentials in action. For each of the demos, we've included some guidance on what you should get out of the demo - and where you should **stop** exploring the demos. Later on in this guide we have some command line demos built on current generation code for developers wanting to look at what's going on under the hood. -### Alice and Faber - edX Version +## BC Gov Showcase -The Hyperledger Indy community is littered with "Alice and Faber" demos. Alice is a former student of [Faber College](https://en.wikipedia.org/wiki/Animal_House) (motto: Knowledge is Good), and is offered from Faber a verifiable credential that she can use to prove her educational accomplishments. Alice proves the claims in the credential to get a job at ACME Corp, and then uses a credential about her job at ACME Corp. to get a loan from Thrift Bank. +Try out the [BC Gov Showcase] to download a production Wallet for holding Verifiable Credentials, +and then use your new wallet to get and present credentials in some sample scenarios. The end-to-end +verifiable credential experience in 30 minutes or less. -The edX course version of the Alice/Faber story is good if you are new to Indy because in going through the story you get a web interface to see the interactions/technical steps in establishing connections between agents and the process for issuing and verifying credentials. **DO NOT** look into the underlying code because it is not maintained, and it is out-of-date. +[BC Gov Showcase]: https://digital.gov.bc.ca/digital-trust/showcase/ -We recommend using the "In Browser" steps to run the demo vs. getting things running on your local machine. +## Traction AnonCreds Workshop -Link: [Alice and Faber - edX Version](https://github.com/hyperledger/education/blob/master/LFS171x/indy-material/nodejs/README.md) +Now that you have a wallet, how about being an issuer, and experience what is needed on that side of an exchange? +To do that, try the [Traction AnonCreds Workshop]. Get your own (temporary -- it will be gone in a few weeks!) +Aries Cloud Agent Python-based issuer/verifier agent. Connect to the wallet on your mobile phone, issue a credential +and then present it back. Lots to learn, without ever leaving your browser! -### BC Gov's OrgBook and Greenlight +[Traction AnonCreds Workshop]: https://github.com/bcgov/traction/blob/main/docs/traction-anoncreds-workshop.md -BC Gov's Verifiable Organizations Network (VON) project implemented the first production Indy app (TheOrgBook, and now just "OrgBook") that exists to bootstrap verifiable credentials ecosystems. The Greenlight use case is a demo showing how verifiable credentials can be used for reducing the red tape businesses face in trying to get a government permit (for example, to open a restaurant). The business challenge addressed by Greenlight is figuring out what other permits and licenses need to be in place before a business can get the permit it actually wants. The demo simulates a business identifying their goal permit, seeing a roadmap of the prerequisite credentials already collected and still needed, and using links to get the needed credentials. Since in these early days of decentralized identity, business don't have their own digital wallet, in applying for each credential, each permitting service is using OrgBook to get proof of the prerequisite credentials, and issuing the new credential back to the OrgBook. +## More demos, please -If you are interested in using/contributing to VON and OrgBook, contact the folks from BC Gov using links on https://vonx.io. - -Link: [Greenlight](https://greenlight.orgbook.gov.bc.ca/) - choose the "City of Surrey - Business License" -Link: [Information about Verifiable Organizations Network (VON)](https://vonx.io) -Link: [OrgBook BC - Production Instance](https://orgbook.gov.bc.ca/) - -### The ConfBook Mobile Agent Demo - -The ConfBook demo was presented during the [Internet Identity Workshop](https://internetidentityworkshop.com/) (IIW) 28. The demo uses instances of the Aries Cloud Agent - Python-based services interacting with a mobile agent to issue and verify credentials. Follow along with the demo to get an Aries Mobile Agent and use it to get a verifiable credential that you control your email address, and proof the claims from that credential to get a verifiable credential that you attended a -conference. - -Link: [ConfBook Demo](https://vonx.io/how_to/confbook) - -> Back to the [Aries Developer - Getting Started Guide](README.md). +Interested in seeing your demos/use cases added to this list? Submit an issue or a PR and we'll see about +including it in this list. diff --git a/docs/gettingStarted/IndyAriesDevOptions.md b/docs/gettingStarted/IndyAriesDevOptions.md index 474dd328..9416b6dd 100644 --- a/docs/gettingStarted/IndyAriesDevOptions.md +++ b/docs/gettingStarted/IndyAriesDevOptions.md @@ -8,7 +8,7 @@ In the following, we go through the layers from the top of the stack to the bott ## Building Decentralized Identity Applications -If you just want to build enterprise applications on top of the decentralized identity-related Hyperledger projects, you can start with building cloud-based controller apps using any language you want, and deploying your code with an instance of the code in this repository ([aries-cloudagent-python](https://github.com/hyperledger/aries-cloudagent-python)). +If you just want to build enterprise applications on top of the decentralized identity-related Hyperledger projects, you can start with building cloud-based controller apps using any language you want, and deploying your code with an instance of the code in this repository ([aries-cloudagent-python](https://github.com/hyperledger/aries-cloudagent-python)). If you want to build a mobile agent, there are open source options available, including [Aries-MobileAgent-Xamarin](https://github.com/hyperledger/aries-mobileagent-xamarin) (aka "Aries MAX"), which is built on [Aries Framework .NET](https://github.com/hyperledger/aries-framework-dotnet), and [Aries Mobile Agent React Native](https://github.com/hyperledger/aries-mobile-agent-react-native), which is built on [Aries Framework JavaScript](https://github.com/hyperledger/aries-framework-javascript). @@ -43,7 +43,3 @@ If you are interested in getting into the public ledger part of Indy, particular ## Working in Cryptography Finally, at the deepest level, and core to all of the projects is the cryptography in [Hyperledger Ursa](https://github.com/hyperledger/ursa). If you are a cryptographer, that's where you want to be - and we want you there. - - - - diff --git a/docs/gettingStarted/IndyBasics.md b/docs/gettingStarted/IndyBasics.md index 500f14b9..b20b9737 100644 --- a/docs/gettingStarted/IndyBasics.md +++ b/docs/gettingStarted/IndyBasics.md @@ -2,7 +2,7 @@ > **NOTE:** If you are developer building apps on top of Aries and Indy, you **DO NOT** need to know the nuts and bolts of Indy to build applications. You need to know about verifiable credentials and the concepts of self-sovereign identity. But as an app developer, you don't need to do the Indy getting started pieces. Aries takes care of those details for you. The introduction linked here should be sufficient. -If you are new to Indy and verifiable credentials and want to learn the core concepts, this [link](https://github.com/hyperledger/education/blob/master/LFS171x/docs/introduction-to-hyperledger-indy.md) provides a solid foundation into the goals and purpose of Indy including verifiable credentials, DIDs, decentralized/self-sovereign identity, the Sovrin Foundation and more. The document is the content of the Indy chapter of the Hyperledger edX [Blockchain for Business](https://www.edx.org/course/blockchain-for-business-an-introduction-to-hyperledger-technologies) course (which you could also go through). +If you are new to Indy and verifiable credentials and want to learn the core concepts, this [link](https://github.com/hyperledger/education/blob/master/LFS171x/docs/introduction-to-hyperledger-indy.md) provides a solid foundation into the goals and purpose of Indy including verifiable credentials, DIDs, decentralized/self-sovereign identity, the Sovrin Foundation and more. The document is the content of the Indy chapter of the Hyperledger edX [Blockchain for Business](https://www.edx.org/course/blockchain-for-business-an-introduction-to-hyperledger-technologies) course (which you could also go through). Feel free to do the demo that is referenced in the material, but we recommend that you **not** dig into that codebase. It's pretty old now - almost a year! We've got much more relevant examples later in this guide. @@ -12,4 +12,4 @@ As well, **don't** use the guidance in the course to dive into the content about Indy provides an implementation of the basic functions required to implement a network for self-sovereign identity (SSI) - a ledger, client SDKs for interacting with the ledger, DIDs, and capabilities for issuing, holding and proving verifiable credentials. -> Back to the [Aries Developer - Getting Started Guide](README.md). +> Back to the [Aries Developer - Getting Started Guide](./README.md). diff --git a/docs/gettingStarted/IssuingAnonCredsCredentials.md b/docs/gettingStarted/IssuingAnonCredsCredentials.md new file mode 100644 index 00000000..8fe7c50e --- /dev/null +++ b/docs/gettingStarted/IssuingAnonCredsCredentials.md @@ -0,0 +1,8 @@ +# Issuing AnonCreds Credentials + +Become an issuer, and define, publish and issue verifiable credentials to a mobile wallet. +Run the [Traction AnonCreds Workshop]. Get your own (temporary -- it will be gone in a few weeks!) +Aries Cloud Agent Python-based issuer/verifier agent. Connect to the wallet on your mobile phone, issue a credential +and then present it back. Lots to learn, without ever leaving your browser! + +[Traction AnonCreds Workshop]: https://github.com/bcgov/traction/blob/main/docs/traction-anoncreds-workshop.md diff --git a/docs/gettingStarted/IssuingIndyCredentials.md b/docs/gettingStarted/IssuingIndyCredentials.md deleted file mode 100644 index 320985d7..00000000 --- a/docs/gettingStarted/IssuingIndyCredentials.md +++ /dev/null @@ -1,3 +0,0 @@ -# Issuing Indy Credentials - -To be completed. \ No newline at end of file diff --git a/docs/gettingStarted/PresentingAnonCredsProofs.md b/docs/gettingStarted/PresentingAnonCredsProofs.md new file mode 100644 index 00000000..76beba12 --- /dev/null +++ b/docs/gettingStarted/PresentingAnonCredsProofs.md @@ -0,0 +1,11 @@ +# Presenting AnonCreds Proofs + +Become a verifier, and construct a presentation request, send the request to a +mobile wallet, get a presentation derived from AnonCreds verifiable credentials +and verify the presentation. Run the [Traction AnonCreds Workshop]. Get your own +(temporary -- it will be gone in a few weeks!) Aries Cloud Agent Python-based +issuer/verifier agent. Connect to the wallet on your mobile phone, issue a +credential and then present it back. Lots to learn, without ever leaving your +browser! + +[Traction AnonCreds Workshop]: https://github.com/bcgov/traction/blob/main/docs/traction-anoncreds-workshop.md diff --git a/docs/gettingStarted/PresentingIndyProofs.md b/docs/gettingStarted/PresentingIndyProofs.md deleted file mode 100644 index 5eee3d5d..00000000 --- a/docs/gettingStarted/PresentingIndyProofs.md +++ /dev/null @@ -1,3 +0,0 @@ -# Presenting Indy Proofs - -To be completed. \ No newline at end of file diff --git a/docs/gettingStarted/README.md b/docs/gettingStarted/README.md index a9962781..ef585997 100644 --- a/docs/gettingStarted/README.md +++ b/docs/gettingStarted/README.md @@ -2,7 +2,8 @@ This guide is to get you from (pretty much) zero to developing code for issuing (and verifying) credentials with your own Aries agent. On the way, you'll look at Hyperledger Indy and how it works, find out about the architecture and components of an Aries agent and its underlying messaging protocols. Scan the list of topics below and jump in as soon as you hit a topic you don't know. -Note that in the guidance we have here, we include not only the links to look at, but we recommend that you **not** look at certain material to which you might naturally gravitate. That's because the material is out of date and will take you down some unnecessary rabbit holes. Keep your eyes on the goal - developing with Indy and Aries. +Note that in the guidance we have here, we include not only the links to look at, but we recommend that you **not** look at certain material to which you might naturally gravitate. That's because the material is out of date and will take you down some unnecessary rabbit holes. Keep your eyes on the goal - developing with Aries to interact with other agents +to (amongst other things) connect, issue, hold, present and verify verifiable credentials. * [I've heard of Indy, but I don't know the basics](IndyBasics.md) * [I know about Indy, but what is Aries?](AriesBasics.md) @@ -11,16 +12,16 @@ Note that in the guidance we have here, we include not only the links to look at * [Aries Internals - Deployment Components](AriesAgentArchitecture.md) * [An overview of Aries messaging](AriesMessaging.md) * [Demos - Aries Developer](AriesDeveloperDemos.md) -* To Do: [Establishing a connection between Aries Agents](AgentConnections.md) -* To Do: [Issuing an Indy credential: From Issuer to Holder/Prover](IssuingIndyCredentials.md) -* To Do: [Presenting an Indy credential: From Holder/Prover to Verifier](PresentingIndyProofs.md) -* To Do: [Next steps: Creating your own Aries Agent](YourOwnAriesAgent.md) +* [Establishing a connection between Aries Agents](AgentConnections.md) +* [Issuing an AnonCreds credential: From Issuer to Holder/Prover](IssuingAnonCredsCredentials.md) +* [Presenting an Indy credential: From Holder/Prover to Verifier](PresentingAnonCredsProofs.md) +* [Next steps: Creating your own Aries Agent](YourOwnAriesAgent.md) * [What should I work on? Options for Aries/Indy Developers](IndyAriesDevOptions.md) * [Deeper Dive: DIDComm Messages](DIDcommMsgs.md) * [Deeper Dive: DIDComm Message Routing and Encryption](RoutingEncryption.md) * [Deeper Dive: Routing Example](AriesRoutingExample.md) * To Do: [Deeper Dive: Running and Connecting to an Indy Network](ConnectIndyNetwork.md) * [Steps and APIs to support credential revocation with Aries agent](CredentialRevocation.md) -* [Deeper Dive: Aca-Py Plug-Ins](../features/PlugIns/) +* [Deeper Dive: Aca-Py Plug-Ins](../features/PlugIns.md) Want to help with this guide? Please add issues or submit a pull request to improve the document. Point out things that are missing, things to improve and especially things that are wrong. diff --git a/docs/gettingStarted/RoutingEncryption.md b/docs/gettingStarted/RoutingEncryption.md index 20409f5d..93b82076 100644 --- a/docs/gettingStarted/RoutingEncryption.md +++ b/docs/gettingStarted/RoutingEncryption.md @@ -1,9 +1,9 @@ # Deeper Dive: DIDComm Message Routing and Encryption -Many Aries edge agents do not directly receive messages from a peer edge agent - they have agents in between that route messages to them. This is done for many reasons, such as: +Many Aries edge agents do not directly receive messages from a peer edge agent - they have agents in between that route messages to them. This is done for many reasons, such as: - The agent is on a mobile device that does not have a persistent connection and so uses a cloud agent. -- The person does not want to allow correlation of their agent across relationships and so they use a shared, common endpoint (e.g. https://agents-R-Us.com) that they are "hidden in a crowd". +- The person does not want to allow correlation of their agent across relationships and so they use a shared, common endpoint (e.g. `https://agents-R-Us.ca`) that they are "hidden in a crowd". - An enterprise wants a single gateway to the many enterprise agents they have in their organization. Thus, when a DIDComm message is sent from one edge agent to another, it is routed per the instructions of the receiver and for the needs of the sender. For example, in the following picture, Alice might be told by Bob to send messages to his phone (agent 4) via agents 9 and 3, and Alice might always send out messages via agent 2. diff --git a/docs/gettingStarted/YourOwnAriesAgent.md b/docs/gettingStarted/YourOwnAriesAgent.md index 9efb9d52..cbd2ae86 100644 --- a/docs/gettingStarted/YourOwnAriesAgent.md +++ b/docs/gettingStarted/YourOwnAriesAgent.md @@ -1,3 +1,8 @@ -# Starting Your Own Aries Agent +# Creating Your Own Aries Agent -To be completed. \ No newline at end of file +Use the "next steps" in the [Traction AnonCreds Workshop] and create your own +controller. The [Aries ACA-Py Controllers] repository has some samples to get +you started. + +[Traction AnonCreds Workshop]: https://github.com/bcgov/traction/blob/main/docs/traction-anoncreds-workshop.md +[Aries ACA-Py Controllers]: https://github.com/hyperledger/aries-acapy-controllers diff --git a/docs/release/CHANGELOG.md b/docs/release/CHANGELOG.md index 5465d9b9..5a0f30a8 100644 --- a/docs/release/CHANGELOG.md +++ b/docs/release/CHANGELOG.md @@ -1,5 +1,3 @@ -# Release Notes - # Aries Cloud Agent Python Changelog ## 0.12.0rc0 @@ -23,80 +21,80 @@ There are no breaking changes in 0.12.0rc0. #### 0.12.0rc0 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - fix: save multi_use to the DB for OOB invitations [\#2694](https://github.com/hyperledger/aries-cloudagent-python/pull/2694) [frostyfrog](https://github.com/frostyfrog) - - Connection and DIDX Problem Reports [\#2653](https://github.com/hyperledger/aries-cloudagent-python/pull/2653) [usingtechnology](https://github.com/usingtechnology) - - Feat: DIDX Implicit Request auto-accept and Delete OOB Invitation related records [\#2642](https://github.com/hyperledger/aries-cloudagent-python/pull/2642) [shaangill025](https://github.com/shaangill025) + - fix: save multi_use to the DB for OOB invitations [\#2694](https://github.com/hyperledger/aries-cloudagent-python/pull/2694) [frostyfrog](https://github.com/frostyfrog) + - Connection and DIDX Problem Reports [\#2653](https://github.com/hyperledger/aries-cloudagent-python/pull/2653) [usingtechnology](https://github.com/usingtechnology) + - Feat: DIDX Implicit Request auto-accept and Delete OOB Invitation related records [\#2642](https://github.com/hyperledger/aries-cloudagent-python/pull/2642) [shaangill025](https://github.com/shaangill025) - DID Peer and DID Resolver Updates and Fixes - - Integration test for did:peer [\#2713](https://github.com/hyperledger/aries-cloudagent-python/pull/2713) [ianco](https://github.com/ianco) - - Feature/emit did peer 4 [\#2696](https://github.com/hyperledger/aries-cloudagent-python/pull/2696) [Jsyro](https://github.com/Jsyro) - - did peer 4 resolution [\#2692](https://github.com/hyperledger/aries-cloudagent-python/pull/2692) [Jsyro](https://github.com/Jsyro) - - Emit did:peer:2 for didexchange [\#2687](https://github.com/hyperledger/aries-cloudagent-python/pull/2687) [Jsyro](https://github.com/Jsyro) - - Add did web method type as a default option [\#2684](https://github.com/hyperledger/aries-cloudagent-python/pull/2684) [PatStLouis](https://github.com/PatStLouis) - - feat: add did:jwk resolver [\#2645](https://github.com/hyperledger/aries-cloudagent-python/pull/2645) [dbluhm](https://github.com/dbluhm) - - feat: support resolving did:peer:1 received in did exchange [\#2611](https://github.com/hyperledger/aries-cloudagent-python/pull/2611) [dbluhm](https://github.com/dbluhm) + - Integration test for did:peer [\#2713](https://github.com/hyperledger/aries-cloudagent-python/pull/2713) [ianco](https://github.com/ianco) + - Feature/emit did peer 4 [\#2696](https://github.com/hyperledger/aries-cloudagent-python/pull/2696) [Jsyro](https://github.com/Jsyro) + - did peer 4 resolution [\#2692](https://github.com/hyperledger/aries-cloudagent-python/pull/2692) [Jsyro](https://github.com/Jsyro) + - Emit did:peer:2 for didexchange [\#2687](https://github.com/hyperledger/aries-cloudagent-python/pull/2687) [Jsyro](https://github.com/Jsyro) + - Add did web method type as a default option [\#2684](https://github.com/hyperledger/aries-cloudagent-python/pull/2684) [PatStLouis](https://github.com/PatStLouis) + - feat: add did:jwk resolver [\#2645](https://github.com/hyperledger/aries-cloudagent-python/pull/2645) [dbluhm](https://github.com/dbluhm) + - feat: support resolving did:peer:1 received in did exchange [\#2611](https://github.com/hyperledger/aries-cloudagent-python/pull/2611) [dbluhm](https://github.com/dbluhm) - Ledger Agnostic AnonCreds RS Changes - - Upgrade anoncreds to 0.2.0.dev7 [\#2719](https://github.com/hyperledger/aries-cloudagent-python/pull/2719) [jamshale](https://github.com/jamshale) - - Improve api documentation and error handling [\#2690](https://github.com/hyperledger/aries-cloudagent-python/pull/2690) [jamshale](https://github.com/jamshale) - - Add unit tests for anoncreds revocation [\#2688](https://github.com/hyperledger/aries-cloudagent-python/pull/2688) [jamshale](https://github.com/jamshale) - - Return 404 when schema not found [\#2683](https://github.com/hyperledger/aries-cloudagent-python/pull/2683) [jamshale](https://github.com/jamshale) - - Anoncreds - Add unit testing [\#2672](https://github.com/hyperledger/aries-cloudagent-python/pull/2672) [jamshale](https://github.com/jamshale) - - Additional anoncreds integration tests AnonCreds [\#2660](https://github.com/hyperledger/aries-cloudagent-python/pull/2660) [ianco](https://github.com/ianco) - - Update integration tests for anoncreds-rs AnonCreds [\#2651](https://github.com/hyperledger/aries-cloudagent-python/pull/2651) [ianco](https://github.com/ianco) - - Initial migration of anoncreds revocation code AnonCreds [\#2643](https://github.com/hyperledger/aries-cloudagent-python/pull/2643) [ianco](https://github.com/ianco) - - Integrate Anoncreds rs into credential and presentation endpoints AnonCreds [\#2632](https://github.com/hyperledger/aries-cloudagent-python/pull/2632) [ianco](https://github.com/ianco) - - Initial code migration from anoncreds-rs branch AnonCreds [\#2596](https://github.com/hyperledger/aries-cloudagent-python/pull/2596) [ianco](https://github.com/ianco) + - Upgrade anoncreds to 0.2.0.dev7 [\#2719](https://github.com/hyperledger/aries-cloudagent-python/pull/2719) [jamshale](https://github.com/jamshale) + - Improve api documentation and error handling [\#2690](https://github.com/hyperledger/aries-cloudagent-python/pull/2690) [jamshale](https://github.com/jamshale) + - Add unit tests for anoncreds revocation [\#2688](https://github.com/hyperledger/aries-cloudagent-python/pull/2688) [jamshale](https://github.com/jamshale) + - Return 404 when schema not found [\#2683](https://github.com/hyperledger/aries-cloudagent-python/pull/2683) [jamshale](https://github.com/jamshale) + - Anoncreds - Add unit testing [\#2672](https://github.com/hyperledger/aries-cloudagent-python/pull/2672) [jamshale](https://github.com/jamshale) + - Additional anoncreds integration tests AnonCreds [\#2660](https://github.com/hyperledger/aries-cloudagent-python/pull/2660) [ianco](https://github.com/ianco) + - Update integration tests for anoncreds-rs AnonCreds [\#2651](https://github.com/hyperledger/aries-cloudagent-python/pull/2651) [ianco](https://github.com/ianco) + - Initial migration of anoncreds revocation code AnonCreds [\#2643](https://github.com/hyperledger/aries-cloudagent-python/pull/2643) [ianco](https://github.com/ianco) + - Integrate Anoncreds rs into credential and presentation endpoints AnonCreds [\#2632](https://github.com/hyperledger/aries-cloudagent-python/pull/2632) [ianco](https://github.com/ianco) + - Initial code migration from anoncreds-rs branch AnonCreds [\#2596](https://github.com/hyperledger/aries-cloudagent-python/pull/2596) [ianco](https://github.com/ianco) - Hyperledger Indy ledger related updates and fixes - - fix: update constants in TransactionRecord [\#2698](https://github.com/hyperledger/aries-cloudagent-python/pull/2698) [amanji](https://github.com/amanji) - - Cache TAA by wallet name [\#2676](https://github.com/hyperledger/aries-cloudagent-python/pull/2676) [jamshale](https://github.com/jamshale) - - Fix: RevRegEntry Transaction Endorsement 0.11.0 [\#2558](https://github.com/hyperledger/aries-cloudagent-python/pull/2558) [shaangill025](https://github.com/shaangill025) + - fix: update constants in TransactionRecord [\#2698](https://github.com/hyperledger/aries-cloudagent-python/pull/2698) [amanji](https://github.com/amanji) + - Cache TAA by wallet name [\#2676](https://github.com/hyperledger/aries-cloudagent-python/pull/2676) [jamshale](https://github.com/jamshale) + - Fix: RevRegEntry Transaction Endorsement 0.11.0 [\#2558](https://github.com/hyperledger/aries-cloudagent-python/pull/2558) [shaangill025](https://github.com/shaangill025) - JSON-LD Verifiable Credential/DIF Presentation Exchange updates - - feat: make VcLdpManager pluggable [\#2706](https://github.com/hyperledger/aries-cloudagent-python/pull/2706) [dbluhm](https://github.com/dbluhm) - - fix: minor type hint corrections for VcLdpManager [\#2704](https://github.com/hyperledger/aries-cloudagent-python/pull/2704) [dbluhm](https://github.com/dbluhm) - - Remove if condition which checks if the credential.type array is equal to 1 [\#2670](https://github.com/hyperledger/aries-cloudagent-python/pull/2670) [PatStLouis](https://github.com/PatStLouis) - - Feature Suggestion: Include a Reason When Constraints Cannot Be Applied [\#2630](https://github.com/hyperledger/aries-cloudagent-python/pull/2630) [Ennovate-com](https://github.com/Ennovate-com) - - refactor: make ldp_vc logic reusable [\#2533](https://github.com/hyperledger/aries-cloudagent-python/pull/2533) [dbluhm](https://github.com/dbluhm) + - feat: make VcLdpManager pluggable [\#2706](https://github.com/hyperledger/aries-cloudagent-python/pull/2706) [dbluhm](https://github.com/dbluhm) + - fix: minor type hint corrections for VcLdpManager [\#2704](https://github.com/hyperledger/aries-cloudagent-python/pull/2704) [dbluhm](https://github.com/dbluhm) + - Remove if condition which checks if the credential.type array is equal to 1 [\#2670](https://github.com/hyperledger/aries-cloudagent-python/pull/2670) [PatStLouis](https://github.com/PatStLouis) + - Feature Suggestion: Include a Reason When Constraints Cannot Be Applied [\#2630](https://github.com/hyperledger/aries-cloudagent-python/pull/2630) [Ennovate-com](https://github.com/Ennovate-com) + - refactor: make ldp_vc logic reusable [\#2533](https://github.com/hyperledger/aries-cloudagent-python/pull/2533) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Remove exception on connectionless presentation problem report handler [\#2723](https://github.com/hyperledger/aries-cloudagent-python/pull/2723) [loneil](https://github.com/loneil) - - Ensure "preserve_exchange_records" flags are set. [\#2664](https://github.com/hyperledger/aries-cloudagent-python/pull/2664) [usingtechnology](https://github.com/usingtechnology) - - Slight improvement to credx proof validation error message [\#2655](https://github.com/hyperledger/aries-cloudagent-python/pull/2655) [ianco](https://github.com/ianco) - - Add ConnectionProblemReport handler [\#2600](https://github.com/hyperledger/aries-cloudagent-python/pull/2600) [usingtechnology](https://github.com/usingtechnology) + - Remove exception on connectionless presentation problem report handler [\#2723](https://github.com/hyperledger/aries-cloudagent-python/pull/2723) [loneil](https://github.com/loneil) + - Ensure "preserve_exchange_records" flags are set. [\#2664](https://github.com/hyperledger/aries-cloudagent-python/pull/2664) [usingtechnology](https://github.com/usingtechnology) + - Slight improvement to credx proof validation error message [\#2655](https://github.com/hyperledger/aries-cloudagent-python/pull/2655) [ianco](https://github.com/ianco) + - Add ConnectionProblemReport handler [\#2600](https://github.com/hyperledger/aries-cloudagent-python/pull/2600) [usingtechnology](https://github.com/usingtechnology) - Multitenancy Updates and Fixes - - Improve Per Tenant Logging: Fix issues around default log file path [\#2659](https://github.com/hyperledger/aries-cloudagent-python/pull/2659) [shaangill025](https://github.com/shaangill025) + - Improve Per Tenant Logging: Fix issues around default log file path [\#2659](https://github.com/hyperledger/aries-cloudagent-python/pull/2659) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, DevContainer and Documentation Fixes - - Update devcontainer documentation [\#2729](https://github.com/hyperledger/aries-cloudagent-python/pull/2729) [jamshale](https://github.com/jamshale) - - Update the SupportedRFCs Document to be up to date [\#2722](https://github.com/hyperledger/aries-cloudagent-python/pull/2722) [swcurran](https://github.com/swcurran) - - Fix incorrect Sphinx search library version reference [\#2716](https://github.com/hyperledger/aries-cloudagent-python/pull/2716) [swcurran](https://github.com/swcurran) - - Update RTD requirements after security vulnerability recorded [\#2712](https://github.com/hyperledger/aries-cloudagent-python/pull/2712) [swcurran](https://github.com/swcurran) - - Update legacy bcgovimages references. [\#2700](https://github.com/hyperledger/aries-cloudagent-python/pull/2700) [WadeBarnes](https://github.com/WadeBarnes) - - fix: link to raw content change from master to main [\#2663](https://github.com/hyperledger/aries-cloudagent-python/pull/2663) [Ennovate-com](https://github.com/Ennovate-com) - - fix: open-api generator script [\#2661](https://github.com/hyperledger/aries-cloudagent-python/pull/2661) [dbluhm](https://github.com/dbluhm) - - Update the ReadTheDocs config in case we do another 0.10.x release [\#2629](https://github.com/hyperledger/aries-cloudagent-python/pull/2629) [swcurran](https://github.com/swcurran) + - Update devcontainer documentation [\#2729](https://github.com/hyperledger/aries-cloudagent-python/pull/2729) [jamshale](https://github.com/jamshale) + - Update the SupportedRFCs Document to be up to date [\#2722](https://github.com/hyperledger/aries-cloudagent-python/pull/2722) [swcurran](https://github.com/swcurran) + - Fix incorrect Sphinx search library version reference [\#2716](https://github.com/hyperledger/aries-cloudagent-python/pull/2716) [swcurran](https://github.com/swcurran) + - Update RTD requirements after security vulnerability recorded [\#2712](https://github.com/hyperledger/aries-cloudagent-python/pull/2712) [swcurran](https://github.com/swcurran) + - Update legacy bcgovimages references. [\#2700](https://github.com/hyperledger/aries-cloudagent-python/pull/2700) [WadeBarnes](https://github.com/WadeBarnes) + - fix: link to raw content change from master to main [\#2663](https://github.com/hyperledger/aries-cloudagent-python/pull/2663) [Ennovate-com](https://github.com/Ennovate-com) + - fix: open-api generator script [\#2661](https://github.com/hyperledger/aries-cloudagent-python/pull/2661) [dbluhm](https://github.com/dbluhm) + - Update the ReadTheDocs config in case we do another 0.10.x release [\#2629](https://github.com/hyperledger/aries-cloudagent-python/pull/2629) [swcurran](https://github.com/swcurran) - Dependencies and Internal Updates - - Fix subwallet record removal [\#2721](https://github.com/hyperledger/aries-cloudagent-python/pull/2721) [andrewwhitehead](https://github.com/andrewwhitehead) - - chore(deps): Bump jinja2 from 3.1.2 to 3.1.3 dependencies [\#2707](https://github.com/hyperledger/aries-cloudagent-python/pull/2707) [dependabot bot](https://github.com/dependabot bot) - - feat: inject profile [\#2705](https://github.com/hyperledger/aries-cloudagent-python/pull/2705) [dbluhm](https://github.com/dbluhm) - - Remove tiny-vim from being added to the container image to reduce reported vulnerabilities from scanning [\#2699](https://github.com/hyperledger/aries-cloudagent-python/pull/2699) [swcurran](https://github.com/swcurran) - - chore(deps): Bump jwcrypto from 1.5.0 to 1.5.1 dependencies [\#2689](https://github.com/hyperledger/aries-cloudagent-python/pull/2689) [dependabot bot](https://github.com/dependabot bot) - - Update dependencies [\#2686](https://github.com/hyperledger/aries-cloudagent-python/pull/2686) [andrewwhitehead](https://github.com/andrewwhitehead) - - Fix: Change To Use Timezone Aware UTC datetime [\#2679](https://github.com/hyperledger/aries-cloudagent-python/pull/2679) [Ennovate-com](https://github.com/Ennovate-com) - - fix: update broken demo dependency [\#2638](https://github.com/hyperledger/aries-cloudagent-python/pull/2638) [mrkaurelius](https://github.com/mrkaurelius) - - Bump cryptography from 41.0.5 to 41.0.6 dependencies [\#2636](https://github.com/hyperledger/aries-cloudagent-python/pull/2636) [dependabot bot](https://github.com/dependabot bot) - - Bump aiohttp from 3.8.6 to 3.9.0 dependencies [\#2635](https://github.com/hyperledger/aries-cloudagent-python/pull/2635) [dependabot bot](https://github.com/dependabot bot) + - Fix subwallet record removal [\#2721](https://github.com/hyperledger/aries-cloudagent-python/pull/2721) [andrewwhitehead](https://github.com/andrewwhitehead) + - chore(deps): Bump jinja2 from 3.1.2 to 3.1.3 dependencies [\#2707](https://github.com/hyperledger/aries-cloudagent-python/pull/2707) [dependabot bot](https://github.com/dependabot bot) + - feat: inject profile [\#2705](https://github.com/hyperledger/aries-cloudagent-python/pull/2705) [dbluhm](https://github.com/dbluhm) + - Remove tiny-vim from being added to the container image to reduce reported vulnerabilities from scanning [\#2699](https://github.com/hyperledger/aries-cloudagent-python/pull/2699) [swcurran](https://github.com/swcurran) + - chore(deps): Bump jwcrypto from 1.5.0 to 1.5.1 dependencies [\#2689](https://github.com/hyperledger/aries-cloudagent-python/pull/2689) [dependabot bot](https://github.com/dependabot bot) + - Update dependencies [\#2686](https://github.com/hyperledger/aries-cloudagent-python/pull/2686) [andrewwhitehead](https://github.com/andrewwhitehead) + - Fix: Change To Use Timezone Aware UTC datetime [\#2679](https://github.com/hyperledger/aries-cloudagent-python/pull/2679) [Ennovate-com](https://github.com/Ennovate-com) + - fix: update broken demo dependency [\#2638](https://github.com/hyperledger/aries-cloudagent-python/pull/2638) [mrkaurelius](https://github.com/mrkaurelius) + - Bump cryptography from 41.0.5 to 41.0.6 dependencies [\#2636](https://github.com/hyperledger/aries-cloudagent-python/pull/2636) [dependabot bot](https://github.com/dependabot bot) + - Bump aiohttp from 3.8.6 to 3.9.0 dependencies [\#2635](https://github.com/hyperledger/aries-cloudagent-python/pull/2635) [dependabot bot](https://github.com/dependabot bot) - CI/CD, Testing, and Developer Tools/Productivity Updates - - Tweak scope of GHA integration tests [\#2662](https://github.com/hyperledger/aries-cloudagent-python/pull/2662) [ianco](https://github.com/ianco) - - Update snyk workflow to execute on Pull Request [\#2658](https://github.com/hyperledger/aries-cloudagent-python/pull/2658) [usingtechnology](https://github.com/usingtechnology) + - Tweak scope of GHA integration tests [\#2662](https://github.com/hyperledger/aries-cloudagent-python/pull/2662) [ianco](https://github.com/ianco) + - Update snyk workflow to execute on Pull Request [\#2658](https://github.com/hyperledger/aries-cloudagent-python/pull/2658) [usingtechnology](https://github.com/usingtechnology) - Release management pull requests - - 0.12.0rc0 [\#2732](https://github.com/hyperledger/aries-cloudagent-python/pull/2732) [swcurran](https://github.com/swcurran) + - 0.12.0rc0 [\#2732](https://github.com/hyperledger/aries-cloudagent-python/pull/2732) [swcurran](https://github.com/swcurran) ## 0.11.0 @@ -171,83 +169,83 @@ not be answered for a long time, and the holder responds after the delete. See #### 0.11.0 Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - Change arg_parse to always set --emit-new-didcomm-prefix and --emit-new-didcomm-mime-type to true [\#2517](https://github.com/hyperledger/aries-cloudagent-python/pull/2517) [swcurran](https://github.com/swcurran) + - Change arg_parse to always set --emit-new-didcomm-prefix and --emit-new-didcomm-mime-type to true [\#2517](https://github.com/hyperledger/aries-cloudagent-python/pull/2517) [swcurran](https://github.com/swcurran) - DID Handling and Connection Establishment Updates/Fixes - - Goal and Goal Code in invitation URL. [\#2591](https://github.com/hyperledger/aries-cloudagent-python/pull/2591) [usingtechnology](https://github.com/usingtechnology) - - refactor: use did-peer-2 instead of peerdid [\#2561](https://github.com/hyperledger/aries-cloudagent-python/pull/2561) [dbluhm](https://github.com/dbluhm) - - Fix: Problem Report Before Exchange Established [\#2519](https://github.com/hyperledger/aries-cloudagent-python/pull/2519) [Ennovate-com](https://github.com/Ennovate-com) - - fix: issue #2434: Change DIDExchange States to Match rfc160 [\#2461](https://github.com/hyperledger/aries-cloudagent-python/pull/2461) [anwalker293](https://github.com/anwalker293) + - Goal and Goal Code in invitation URL. [\#2591](https://github.com/hyperledger/aries-cloudagent-python/pull/2591) [usingtechnology](https://github.com/usingtechnology) + - refactor: use did-peer-2 instead of peerdid [\#2561](https://github.com/hyperledger/aries-cloudagent-python/pull/2561) [dbluhm](https://github.com/dbluhm) + - Fix: Problem Report Before Exchange Established [\#2519](https://github.com/hyperledger/aries-cloudagent-python/pull/2519) [Ennovate-com](https://github.com/Ennovate-com) + - fix: issue #2434: Change DIDExchange States to Match rfc160 [\#2461](https://github.com/hyperledger/aries-cloudagent-python/pull/2461) [anwalker293](https://github.com/anwalker293) - DID Peer and DID Resolver Updates and Fixes - - fix: unique ids for services in legacy peer [\#2476](https://github.com/hyperledger/aries-cloudagent-python/pull/2476) [dbluhm](https://github.com/dbluhm) - - peer did 2/3 resolution enhancement [\#2472](https://github.com/hyperledger/aries-cloudagent-python/pull/2472) [Jsyro](https://github.com/Jsyro) - - feat: add timeout to did resolver resolve method [\#2464](https://github.com/hyperledger/aries-cloudagent-python/pull/2464) [dbluhm](https://github.com/dbluhm) + - fix: unique ids for services in legacy peer [\#2476](https://github.com/hyperledger/aries-cloudagent-python/pull/2476) [dbluhm](https://github.com/dbluhm) + - peer did 2/3 resolution enhancement [\#2472](https://github.com/hyperledger/aries-cloudagent-python/pull/2472) [Jsyro](https://github.com/Jsyro) + - feat: add timeout to did resolver resolve method [\#2464](https://github.com/hyperledger/aries-cloudagent-python/pull/2464) [dbluhm](https://github.com/dbluhm) - ACA-Py as a DIDComm Mediator Updates and Fixes - - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) - - fix: mediation routing keys as did key [\#2516](https://github.com/hyperledger/aries-cloudagent-python/pull/2516) [dbluhm](https://github.com/dbluhm) - - refactor: drop mediator_terms and recipient_terms [\#2515](https://github.com/hyperledger/aries-cloudagent-python/pull/2515) [dbluhm](https://github.com/dbluhm) + - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) + - fix: mediation routing keys as did key [\#2516](https://github.com/hyperledger/aries-cloudagent-python/pull/2516) [dbluhm](https://github.com/dbluhm) + - refactor: drop mediator_terms and recipient_terms [\#2515](https://github.com/hyperledger/aries-cloudagent-python/pull/2515) [dbluhm](https://github.com/dbluhm) - Fixes to Upgrades - - 🐛 fix wallet_update when only extra_settings requested [\#2612](https://github.com/hyperledger/aries-cloudagent-python/pull/2612) [ff137](https://github.com/ff137) + - 🐛 fix wallet_update when only extra_settings requested [\#2612](https://github.com/hyperledger/aries-cloudagent-python/pull/2612) [ff137](https://github.com/ff137) - Hyperledger Indy ledger related updates and fixes - - fix: taa rough timestamp timezone from datetime [\#2554](https://github.com/hyperledger/aries-cloudagent-python/pull/2554) [dbluhm](https://github.com/dbluhm) - - 🎨 clarify LedgerError message when TAA is required and not accepted [\#2545](https://github.com/hyperledger/aries-cloudagent-python/pull/2545) [ff137](https://github.com/ff137) - - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) - - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) - - Issue #2419 InvalidClientTaaAcceptanceError time too precise error if container timezone is not UTC [\#2420](https://github.com/hyperledger/aries-cloudagent-python/pull/2420) [Ennovate-com](https://github.com/Ennovate-com) + - fix: taa rough timestamp timezone from datetime [\#2554](https://github.com/hyperledger/aries-cloudagent-python/pull/2554) [dbluhm](https://github.com/dbluhm) + - 🎨 clarify LedgerError message when TAA is required and not accepted [\#2545](https://github.com/hyperledger/aries-cloudagent-python/pull/2545) [ff137](https://github.com/ff137) + - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) + - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - Issue #2419 InvalidClientTaaAcceptanceError time too precise error if container timezone is not UTC [\#2420](https://github.com/hyperledger/aries-cloudagent-python/pull/2420) [Ennovate-com](https://github.com/Ennovate-com) - OpenID4VC / SD-JWT Updates - - chore: point to official sd-jwt lib release [\#2573](https://github.com/hyperledger/aries-cloudagent-python/pull/2573) [dbluhm](https://github.com/dbluhm) - - Feat/sd jwt implementation [\#2487](https://github.com/hyperledger/aries-cloudagent-python/pull/2487) [cjhowland](https://github.com/cjhowland) + - chore: point to official sd-jwt lib release [\#2573](https://github.com/hyperledger/aries-cloudagent-python/pull/2573) [dbluhm](https://github.com/dbluhm) + - Feat/sd jwt implementation [\#2487](https://github.com/hyperledger/aries-cloudagent-python/pull/2487) [cjhowland](https://github.com/cjhowland) - JSON-LD Verifiable Credential/Presentation updates - - fix: report presentation result [\#2615](https://github.com/hyperledger/aries-cloudagent-python/pull/2615) [dbluhm](https://github.com/dbluhm) - - Fix Issue #2589 TypeError When There Are No Nested Requirements [\#2590](https://github.com/hyperledger/aries-cloudagent-python/pull/2590) [Ennovate-com](https://github.com/Ennovate-com) - - feat: use a local static cache for commonly used contexts [\#2587](https://github.com/hyperledger/aries-cloudagent-python/pull/2587) [chumbert](https://github.com/chumbert) - - Issue #2488 KeyError raised when Subject ID is not a URI [\#2490](https://github.com/hyperledger/aries-cloudagent-python/pull/2490) [Ennovate-com](https://github.com/Ennovate-com) + - fix: report presentation result [\#2615](https://github.com/hyperledger/aries-cloudagent-python/pull/2615) [dbluhm](https://github.com/dbluhm) + - Fix Issue #2589 TypeError When There Are No Nested Requirements [\#2590](https://github.com/hyperledger/aries-cloudagent-python/pull/2590) [Ennovate-com](https://github.com/Ennovate-com) + - feat: use a local static cache for commonly used contexts [\#2587](https://github.com/hyperledger/aries-cloudagent-python/pull/2587) [chumbert](https://github.com/chumbert) + - Issue #2488 KeyError raised when Subject ID is not a URI [\#2490](https://github.com/hyperledger/aries-cloudagent-python/pull/2490) [Ennovate-com](https://github.com/Ennovate-com) - Credential Exchange (Issue, Present) Updates - - Default connection_id to None to account for Connectionless Proofs [\#2605](https://github.com/hyperledger/aries-cloudagent-python/pull/2605) [popkinj](https://github.com/popkinj) - - Send Problem report when CredEx not found [\#2577](https://github.com/hyperledger/aries-cloudagent-python/pull/2577) [usingtechnology](https://github.com/usingtechnology) - - fix: clean up requests and invites [\#2560](https://github.com/hyperledger/aries-cloudagent-python/pull/2560) [dbluhm](https://github.com/dbluhm) + - Default connection_id to None to account for Connectionless Proofs [\#2605](https://github.com/hyperledger/aries-cloudagent-python/pull/2605) [popkinj](https://github.com/popkinj) + - Send Problem report when CredEx not found [\#2577](https://github.com/hyperledger/aries-cloudagent-python/pull/2577) [usingtechnology](https://github.com/usingtechnology) + - fix: clean up requests and invites [\#2560](https://github.com/hyperledger/aries-cloudagent-python/pull/2560) [dbluhm](https://github.com/dbluhm) - Multitenancy Updates and Fixes - - Feat: Support subwallet upgradation using the Upgrade command [\#2529](https://github.com/hyperledger/aries-cloudagent-python/pull/2529) [shaangill025](https://github.com/shaangill025) + - Feat: Support subwallet upgradation using the Upgrade command [\#2529](https://github.com/hyperledger/aries-cloudagent-python/pull/2529) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, DevContainer and Documentation Fixes - - fix: wallet type help text out of date [\#2618](https://github.com/hyperledger/aries-cloudagent-python/pull/2618) [dbluhm](https://github.com/dbluhm) - - fix: typos [\#2614](https://github.com/hyperledger/aries-cloudagent-python/pull/2614) [omahs](https://github.com/omahs) - - black formatter extension configuration update [\#2603](https://github.com/hyperledger/aries-cloudagent-python/pull/2603) [usingtechnology](https://github.com/usingtechnology) - - Update Devcontainer pytest ruff black [\#2602](https://github.com/hyperledger/aries-cloudagent-python/pull/2602) [usingtechnology](https://github.com/usingtechnology) - - Issue 2570 devcontainer ruff, black and pytest [\#2595](https://github.com/hyperledger/aries-cloudagent-python/pull/2595) [usingtechnology](https://github.com/usingtechnology) - - chore: correct type hints on base record [\#2604](https://github.com/hyperledger/aries-cloudagent-python/pull/2604) [dbluhm](https://github.com/dbluhm) - - Playground needs optionally external network [\#2564](https://github.com/hyperledger/aries-cloudagent-python/pull/2564) [usingtechnology](https://github.com/usingtechnology) - - Issue 2555 playground scripts readme [\#2563](https://github.com/hyperledger/aries-cloudagent-python/pull/2563) [usingtechnology](https://github.com/usingtechnology) - - Update demo/playground scripts [\#2562](https://github.com/hyperledger/aries-cloudagent-python/pull/2562) [usingtechnology](https://github.com/usingtechnology) - - Update .readthedocs.yaml [\#2548](https://github.com/hyperledger/aries-cloudagent-python/pull/2548) [swcurran](https://github.com/swcurran) - - Update .readthedocs.yaml [\#2547](https://github.com/hyperledger/aries-cloudagent-python/pull/2547) [swcurran](https://github.com/swcurran) - - fix: correct minor typos [\#2544](https://github.com/hyperledger/aries-cloudagent-python/pull/2544) [Ennovate-com](https://github.com/Ennovate-com) - - Update steps for Manually Creating Revocation Registries [\#2491](https://github.com/hyperledger/aries-cloudagent-python/pull/2491) [WadeBarnes](https://github.com/WadeBarnes) + - fix: wallet type help text out of date [\#2618](https://github.com/hyperledger/aries-cloudagent-python/pull/2618) [dbluhm](https://github.com/dbluhm) + - fix: typos [\#2614](https://github.com/hyperledger/aries-cloudagent-python/pull/2614) [omahs](https://github.com/omahs) + - black formatter extension configuration update [\#2603](https://github.com/hyperledger/aries-cloudagent-python/pull/2603) [usingtechnology](https://github.com/usingtechnology) + - Update Devcontainer pytest ruff black [\#2602](https://github.com/hyperledger/aries-cloudagent-python/pull/2602) [usingtechnology](https://github.com/usingtechnology) + - Issue 2570 devcontainer ruff, black and pytest [\#2595](https://github.com/hyperledger/aries-cloudagent-python/pull/2595) [usingtechnology](https://github.com/usingtechnology) + - chore: correct type hints on base record [\#2604](https://github.com/hyperledger/aries-cloudagent-python/pull/2604) [dbluhm](https://github.com/dbluhm) + - Playground needs optionally external network [\#2564](https://github.com/hyperledger/aries-cloudagent-python/pull/2564) [usingtechnology](https://github.com/usingtechnology) + - Issue 2555 playground scripts readme [\#2563](https://github.com/hyperledger/aries-cloudagent-python/pull/2563) [usingtechnology](https://github.com/usingtechnology) + - Update demo/playground scripts [\#2562](https://github.com/hyperledger/aries-cloudagent-python/pull/2562) [usingtechnology](https://github.com/usingtechnology) + - Update .readthedocs.yaml [\#2548](https://github.com/hyperledger/aries-cloudagent-python/pull/2548) [swcurran](https://github.com/swcurran) + - Update .readthedocs.yaml [\#2547](https://github.com/hyperledger/aries-cloudagent-python/pull/2547) [swcurran](https://github.com/swcurran) + - fix: correct minor typos [\#2544](https://github.com/hyperledger/aries-cloudagent-python/pull/2544) [Ennovate-com](https://github.com/Ennovate-com) + - Update steps for Manually Creating Revocation Registries [\#2491](https://github.com/hyperledger/aries-cloudagent-python/pull/2491) [WadeBarnes](https://github.com/WadeBarnes) - Dependencies and Internal Updates - - chore: bump pydid version [\#2626](https://github.com/hyperledger/aries-cloudagent-python/pull/2626) [dbluhm](https://github.com/dbluhm) - - chore: dependency updates [\#2565](https://github.com/hyperledger/aries-cloudagent-python/pull/2565) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 dependencies [\#2552](https://github.com/hyperledger/aries-cloudagent-python/pull/2552) [dependabot bot](https://github.com/dependabot bot) - - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 in /demo/playground/scripts dependencies [\#2551](https://github.com/hyperledger/aries-cloudagent-python/pull/2551) [dependabot bot](https://github.com/dependabot bot) - - chore: update pydid [\#2527](https://github.com/hyperledger/aries-cloudagent-python/pull/2527) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump urllib3 from 2.0.5 to 2.0.6 dependencies [\#2525](https://github.com/hyperledger/aries-cloudagent-python/pull/2525) [dependabot bot](https://github.com/dependabot bot) - - chore(deps): Bump urllib3 from 2.0.2 to 2.0.6 in /demo/playground/scripts dependencies [\#2524](https://github.com/hyperledger/aries-cloudagent-python/pull/2524) [dependabot bot](https://github.com/dependabot bot) - - Avoid multiple open wallet connections [\#2521](https://github.com/hyperledger/aries-cloudagent-python/pull/2521) [andrewwhitehead](https://github.com/andrewwhitehead) - - Remove unused dependencies [\#2510](https://github.com/hyperledger/aries-cloudagent-python/pull/2510) [andrewwhitehead](https://github.com/andrewwhitehead) - - Use correct rust log level in dockerfiles [\#2499](https://github.com/hyperledger/aries-cloudagent-python/pull/2499) [loneil](https://github.com/loneil) - - fix: run tests script copying local env [\#2495](https://github.com/hyperledger/aries-cloudagent-python/pull/2495) [dbluhm](https://github.com/dbluhm) - - Update devcontainer to read version from aries-cloudagent package [\#2483](https://github.com/hyperledger/aries-cloudagent-python/pull/2483) [usingtechnology](https://github.com/usingtechnology) - - Update Python image version to 3.9.18 [\#2456](https://github.com/hyperledger/aries-cloudagent-python/pull/2456) [WadeBarnes](https://github.com/WadeBarnes) - - Remove old routing protocol code [\#2466](https://github.com/hyperledger/aries-cloudagent-python/pull/2466) [dbluhm](https://github.com/dbluhm) + - chore: bump pydid version [\#2626](https://github.com/hyperledger/aries-cloudagent-python/pull/2626) [dbluhm](https://github.com/dbluhm) + - chore: dependency updates [\#2565](https://github.com/hyperledger/aries-cloudagent-python/pull/2565) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 dependencies [\#2552](https://github.com/hyperledger/aries-cloudagent-python/pull/2552) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 in /demo/playground/scripts dependencies [\#2551](https://github.com/hyperledger/aries-cloudagent-python/pull/2551) [dependabot bot](https://github.com/dependabot bot) + - chore: update pydid [\#2527](https://github.com/hyperledger/aries-cloudagent-python/pull/2527) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump urllib3 from 2.0.5 to 2.0.6 dependencies [\#2525](https://github.com/hyperledger/aries-cloudagent-python/pull/2525) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump urllib3 from 2.0.2 to 2.0.6 in /demo/playground/scripts dependencies [\#2524](https://github.com/hyperledger/aries-cloudagent-python/pull/2524) [dependabot bot](https://github.com/dependabot bot) + - Avoid multiple open wallet connections [\#2521](https://github.com/hyperledger/aries-cloudagent-python/pull/2521) [andrewwhitehead](https://github.com/andrewwhitehead) + - Remove unused dependencies [\#2510](https://github.com/hyperledger/aries-cloudagent-python/pull/2510) [andrewwhitehead](https://github.com/andrewwhitehead) + - Use correct rust log level in dockerfiles [\#2499](https://github.com/hyperledger/aries-cloudagent-python/pull/2499) [loneil](https://github.com/loneil) + - fix: run tests script copying local env [\#2495](https://github.com/hyperledger/aries-cloudagent-python/pull/2495) [dbluhm](https://github.com/dbluhm) + - Update devcontainer to read version from aries-cloudagent package [\#2483](https://github.com/hyperledger/aries-cloudagent-python/pull/2483) [usingtechnology](https://github.com/usingtechnology) + - Update Python image version to 3.9.18 [\#2456](https://github.com/hyperledger/aries-cloudagent-python/pull/2456) [WadeBarnes](https://github.com/WadeBarnes) + - Remove old routing protocol code [\#2466](https://github.com/hyperledger/aries-cloudagent-python/pull/2466) [dbluhm](https://github.com/dbluhm) - CI/CD, Testing, and Developer Tools/Productivity Updates - - fix: drop asynctest 0.11.0 [\#2566](https://github.com/hyperledger/aries-cloudagent-python/pull/2566) [dbluhm](https://github.com/dbluhm) - - Dockerfile.indy - Include aries_cloudagent code into build [\#2584](https://github.com/hyperledger/aries-cloudagent-python/pull/2584) [usingtechnology](https://github.com/usingtechnology) - - fix: version should be set by pyproject.toml [\#2471](https://github.com/hyperledger/aries-cloudagent-python/pull/2471) [dbluhm](https://github.com/dbluhm) - - chore: add black back in as a dev dep [\#2465](https://github.com/hyperledger/aries-cloudagent-python/pull/2465) [dbluhm](https://github.com/dbluhm) - - Swap out flake8 in favor of Ruff [\#2438](https://github.com/hyperledger/aries-cloudagent-python/pull/2438) [dbluhm](https://github.com/dbluhm) - - #2289 Migrate to Poetry [\#2436](https://github.com/hyperledger/aries-cloudagent-python/pull/2436) [Gavinok](https://github.com/Gavinok) + - fix: drop asynctest 0.11.0 [\#2566](https://github.com/hyperledger/aries-cloudagent-python/pull/2566) [dbluhm](https://github.com/dbluhm) + - Dockerfile.indy - Include aries_cloudagent code into build [\#2584](https://github.com/hyperledger/aries-cloudagent-python/pull/2584) [usingtechnology](https://github.com/usingtechnology) + - fix: version should be set by pyproject.toml [\#2471](https://github.com/hyperledger/aries-cloudagent-python/pull/2471) [dbluhm](https://github.com/dbluhm) + - chore: add black back in as a dev dep [\#2465](https://github.com/hyperledger/aries-cloudagent-python/pull/2465) [dbluhm](https://github.com/dbluhm) + - Swap out flake8 in favor of Ruff [\#2438](https://github.com/hyperledger/aries-cloudagent-python/pull/2438) [dbluhm](https://github.com/dbluhm) + - #2289 Migrate to Poetry [\#2436](https://github.com/hyperledger/aries-cloudagent-python/pull/2436) [Gavinok](https://github.com/Gavinok) - Release management pull requests - - 0.11.0 [\#2627](https://github.com/hyperledger/aries-cloudagent-python/pull/2627) [swcurran](https://github.com/swcurran) - - 0.11.0rc2 [\#2613](https://github.com/hyperledger/aries-cloudagent-python/pull/2613) [swcurran](https://github.com/swcurran) - - 0.11.0-rc1 [\#2576](https://github.com/hyperledger/aries-cloudagent-python/pull/2576) [swcurran](https://github.com/swcurran) - - 0.11.0-rc0 [\#2575](https://github.com/hyperledger/aries-cloudagent-python/pull/2575) [swcurran](https://github.com/swcurran) + - 0.11.0 [\#2627](https://github.com/hyperledger/aries-cloudagent-python/pull/2627) [swcurran](https://github.com/swcurran) + - 0.11.0rc2 [\#2613](https://github.com/hyperledger/aries-cloudagent-python/pull/2613) [swcurran](https://github.com/swcurran) + - 0.11.0-rc1 [\#2576](https://github.com/hyperledger/aries-cloudagent-python/pull/2576) [swcurran](https://github.com/swcurran) + - 0.11.0-rc0 [\#2575](https://github.com/hyperledger/aries-cloudagent-python/pull/2575) [swcurran](https://github.com/swcurran) ## 0.10.5 @@ -265,9 +263,9 @@ of ACA-Py as soon as possible. #### 0.10.5 Categorized List of Pull Requests - JSON-LD Credential Exchange (Issue, Present) Updates - - fix(backport): report presentation result [\#2622](https://github.com/hyperledger/aries-cloudagent-python/pull/2622) [dbluhm](https://github.com/dbluhm) + - fix(backport): report presentation result [\#2622](https://github.com/hyperledger/aries-cloudagent-python/pull/2622) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.5 [\#2623](https://github.com/hyperledger/aries-cloudagent-python/pull/2623) [swcurran](https://github.com/swcurran) + - 0.10.5 [\#2623](https://github.com/hyperledger/aries-cloudagent-python/pull/2623) [swcurran](https://github.com/swcurran) ## 0.10.4 @@ -285,9 +283,9 @@ Thanks to [codespree](https://github.com/codespree) for raising the issue and pr #### 0.10.4 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) + - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.4 [\#2539](https://github.com/hyperledger/aries-cloudagent-python/pull/2539) [swcurran](https://github.com/swcurran) + - 0.10.4 [\#2539](https://github.com/hyperledger/aries-cloudagent-python/pull/2539) [swcurran](https://github.com/swcurran) ## 0.10.3 @@ -309,9 +307,9 @@ instance to be upgraded: #### 0.10.3 Categorized List of Pull Requests - Credential Exchange (Issue, Present) Updates - - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) + - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) - Release management pull requests - - 0.10.3 [\#2522](https://github.com/hyperledger/aries-cloudagent-python/pull/2522) [swcurran](https://github.com/swcurran) + - 0.10.3 [\#2522](https://github.com/hyperledger/aries-cloudagent-python/pull/2522) [swcurran](https://github.com/swcurran) ## 0.10.2 @@ -342,14 +340,14 @@ library version dependency was updated in [PR \#2500]. #### 0.10.2 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - LegacyPeerDIDResolver: erroneously assigning same ID to multiple services [\#2475](https://github.com/hyperledger/aries-cloudagent-python/pull/2475) [dbluhm](https://github.com/dbluhm) - - fix: update pydid [\#2500](https://github.com/hyperledger/aries-cloudagent-python/pull/2500) [dbluhm](https://github.com/dbluhm) + - LegacyPeerDIDResolver: erroneously assigning same ID to multiple services [\#2475](https://github.com/hyperledger/aries-cloudagent-python/pull/2475) [dbluhm](https://github.com/dbluhm) + - fix: update pydid [\#2500](https://github.com/hyperledger/aries-cloudagent-python/pull/2500) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) - Release management pull requests - - 0.10.2 [\#2509](https://github.com/hyperledger/aries-cloudagent-python/pull/2509) [swcurran](https://github.com/swcurran) - - 0.10.2-rc0 [\#2484](https://github.com/hyperledger/aries-cloudagent-python/pull/2484) [swcurran](https://github.com/swcurran) - - 0.10.2 Patch Release - fix issue #2475, #2477 [\#2482](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - 0.10.2 [\#2509](https://github.com/hyperledger/aries-cloudagent-python/pull/2509) [swcurran](https://github.com/swcurran) + - 0.10.2-rc0 [\#2484](https://github.com/hyperledger/aries-cloudagent-python/pull/2484) [swcurran](https://github.com/swcurran) + - 0.10.2 Patch Release - fix issue #2475, #2477 [\#2482](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) ## 0.10.1 @@ -416,50 +414,50 @@ deleted from ACA-Py storage. #### 0.10.0 Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - fix: outbound send status missing on path [\#2393](https://github.com/hyperledger/aries-cloudagent-python/pull/2393) [dbluhm](https://github.com/dbluhm) - - fix: keylist update response race condition [\#2391](https://github.com/hyperledger/aries-cloudagent-python/pull/2391) [dbluhm](https://github.com/dbluhm) + - fix: outbound send status missing on path [\#2393](https://github.com/hyperledger/aries-cloudagent-python/pull/2393) [dbluhm](https://github.com/dbluhm) + - fix: keylist update response race condition [\#2391](https://github.com/hyperledger/aries-cloudagent-python/pull/2391) [dbluhm](https://github.com/dbluhm) - DID Handling and Connection Establishment Updates/Fixes - - fix: handle stored afgo and findy docs in corrections [\#2450](https://github.com/hyperledger/aries-cloudagent-python/pull/2450) [dbluhm](https://github.com/dbluhm) - - chore: relax connections filter DID format [\#2451](https://github.com/hyperledger/aries-cloudagent-python/pull/2451) [chumbert](https://github.com/chumbert) - - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) - - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) - - fix: more diddoc corrections [\#2446](https://github.com/hyperledger/aries-cloudagent-python/pull/2446) [dbluhm](https://github.com/dbluhm) - - feat: resolve connection targets and permit connecting via public DID [\#2409](https://github.com/hyperledger/aries-cloudagent-python/pull/2409) [dbluhm](https://github.com/dbluhm) - - feat: add legacy peer did resolver [\#2404](https://github.com/hyperledger/aries-cloudagent-python/pull/2404) [dbluhm](https://github.com/dbluhm) - - Fix: Ensure event/webhook is emitted for multi-use invitations [\#2413](https://github.com/hyperledger/aries-cloudagent-python/pull/2413) [esune](https://github.com/esune) - - feat: add DID Exchange specific problem reports and reject endpoint [\#2394](https://github.com/hyperledger/aries-cloudagent-python/pull/2394) [dbluhm](https://github.com/dbluhm) - - fix: additional tweaks for did:web and other methods as public DIDs [\#2392](https://github.com/hyperledger/aries-cloudagent-python/pull/2392) [dbluhm](https://github.com/dbluhm) - - Fix empty ServiceDecorator in OobRecord causing 422 Unprocessable Entity Error [\#2362](https://github.com/hyperledger/aries-cloudagent-python/pull/2362) [ff137](https://github.com/ff137) - - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) + - fix: handle stored afgo and findy docs in corrections [\#2450](https://github.com/hyperledger/aries-cloudagent-python/pull/2450) [dbluhm](https://github.com/dbluhm) + - chore: relax connections filter DID format [\#2451](https://github.com/hyperledger/aries-cloudagent-python/pull/2451) [chumbert](https://github.com/chumbert) + - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) + - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) + - fix: more diddoc corrections [\#2446](https://github.com/hyperledger/aries-cloudagent-python/pull/2446) [dbluhm](https://github.com/dbluhm) + - feat: resolve connection targets and permit connecting via public DID [\#2409](https://github.com/hyperledger/aries-cloudagent-python/pull/2409) [dbluhm](https://github.com/dbluhm) + - feat: add legacy peer did resolver [\#2404](https://github.com/hyperledger/aries-cloudagent-python/pull/2404) [dbluhm](https://github.com/dbluhm) + - Fix: Ensure event/webhook is emitted for multi-use invitations [\#2413](https://github.com/hyperledger/aries-cloudagent-python/pull/2413) [esune](https://github.com/esune) + - feat: add DID Exchange specific problem reports and reject endpoint [\#2394](https://github.com/hyperledger/aries-cloudagent-python/pull/2394) [dbluhm](https://github.com/dbluhm) + - fix: additional tweaks for did:web and other methods as public DIDs [\#2392](https://github.com/hyperledger/aries-cloudagent-python/pull/2392) [dbluhm](https://github.com/dbluhm) + - Fix empty ServiceDecorator in OobRecord causing 422 Unprocessable Entity Error [\#2362](https://github.com/hyperledger/aries-cloudagent-python/pull/2362) [ff137](https://github.com/ff137) + - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) - Upgrading to Aries Askar Updates - - Add symlink to /home/indy/.indy_client for backwards compatibility [\#2443](https://github.com/hyperledger/aries-cloudagent-python/pull/2443) [esune](https://github.com/esune) + - Add symlink to /home/indy/.indy_client for backwards compatibility [\#2443](https://github.com/hyperledger/aries-cloudagent-python/pull/2443) [esune](https://github.com/esune) - Credential Exchange (Issue, Present) Updates - - fix: ensure request matches offer in JSON-LD exchanges, if sent [\#2341](https://github.com/hyperledger/aries-cloudagent-python/pull/2341) [dbluhm](https://github.com/dbluhm) - - BREAKING Extend --preserve-exchange-records to include Presentation Exchange. [\#2352](https://github.com/hyperledger/aries-cloudagent-python/pull/2352) [usingtechnology](https://github.com/usingtechnology) - - Correct the response type in send_rev_reg_def [\#2355](https://github.com/hyperledger/aries-cloudagent-python/pull/2355) [ff137](https://github.com/ff137) + - fix: ensure request matches offer in JSON-LD exchanges, if sent [\#2341](https://github.com/hyperledger/aries-cloudagent-python/pull/2341) [dbluhm](https://github.com/dbluhm) + - BREAKING Extend --preserve-exchange-records to include Presentation Exchange. [\#2352](https://github.com/hyperledger/aries-cloudagent-python/pull/2352) [usingtechnology](https://github.com/usingtechnology) + - Correct the response type in send_rev_reg_def [\#2355](https://github.com/hyperledger/aries-cloudagent-python/pull/2355) [ff137](https://github.com/ff137) - Multitenancy Updates and Fixes - - Multitenant check endorser_info before saving [\#2395](https://github.com/hyperledger/aries-cloudagent-python/pull/2395) [usingtechnology](https://github.com/usingtechnology) - - Feat: Support Selectable Write Ledger [\#2339](https://github.com/hyperledger/aries-cloudagent-python/pull/2339) [shaangill025](https://github.com/shaangill025) + - Multitenant check endorser_info before saving [\#2395](https://github.com/hyperledger/aries-cloudagent-python/pull/2395) [usingtechnology](https://github.com/usingtechnology) + - Feat: Support Selectable Write Ledger [\#2339](https://github.com/hyperledger/aries-cloudagent-python/pull/2339) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, and Documentation Fixes - - Redis Plugins [redis_cache & redis_queue] documentation and docker related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) [shaangill025](https://github.com/shaangill025) - - Chore: fix marshmallow warnings [\#2398](https://github.com/hyperledger/aries-cloudagent-python/pull/2398) [ff137](https://github.com/ff137) - - Upgrade pre-commit and flake8 dependencies; fix flake8 warnings [\#2399](https://github.com/hyperledger/aries-cloudagent-python/pull/2399) [ff137](https://github.com/ff137) - - Corrected typo on mediator invitation configuration argument [\#2365](https://github.com/hyperledger/aries-cloudagent-python/pull/2365) [jorgefl0](https://github.com/jorgefl0) - - Add workaround for ARM based macs [\#2313](https://github.com/hyperledger/aries-cloudagent-python/pull/2313) [finnformica](https://github.com/finnformica) + - Redis Plugins [redis_cache & redis_queue] documentation and docker related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) [shaangill025](https://github.com/shaangill025) + - Chore: fix marshmallow warnings [\#2398](https://github.com/hyperledger/aries-cloudagent-python/pull/2398) [ff137](https://github.com/ff137) + - Upgrade pre-commit and flake8 dependencies; fix flake8 warnings [\#2399](https://github.com/hyperledger/aries-cloudagent-python/pull/2399) [ff137](https://github.com/ff137) + - Corrected typo on mediator invitation configuration argument [\#2365](https://github.com/hyperledger/aries-cloudagent-python/pull/2365) [jorgefl0](https://github.com/jorgefl0) + - Add workaround for ARM based macs [\#2313](https://github.com/hyperledger/aries-cloudagent-python/pull/2313) [finnformica](https://github.com/finnformica) - Dependencies and Internal Updates - - chore(deps): Bump certifi from 2023.5.7 to 2023.7.22 in /demo/playground/scripts dependencies [\#2354](https://github.com/hyperledger/aries-cloudagent-python/pull/2354) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump certifi from 2023.5.7 to 2023.7.22 in /demo/playground/scripts dependencies [\#2354](https://github.com/hyperledger/aries-cloudagent-python/pull/2354) [dependabot bot](https://github.com/dependabot bot) - CI/CD and Developer Tools/Productivity Updates - - Fix for nightly tests failing on Python 3.10 [\#2435](https://github.com/hyperledger/aries-cloudagent-python/pull/2435) [Gavinok](https://github.com/Gavinok) - - Don't run Snyk on forks [\#2429](https://github.com/hyperledger/aries-cloudagent-python/pull/2429) [ryjones](https://github.com/ryjones) - - Issue #2250 Nightly publish workflow [\#2421](https://github.com/hyperledger/aries-cloudagent-python/pull/2421) [Gavinok](https://github.com/Gavinok) - - Enable Snyk scanning [\#2418](https://github.com/hyperledger/aries-cloudagent-python/pull/2418) [ryjones](https://github.com/ryjones) - - Remove Indy tests from workflows [\#2415](https://github.com/hyperledger/aries-cloudagent-python/pull/2415) [dbluhm](https://github.com/dbluhm) + - Fix for nightly tests failing on Python 3.10 [\#2435](https://github.com/hyperledger/aries-cloudagent-python/pull/2435) [Gavinok](https://github.com/Gavinok) + - Don't run Snyk on forks [\#2429](https://github.com/hyperledger/aries-cloudagent-python/pull/2429) [ryjones](https://github.com/ryjones) + - Issue #2250 Nightly publish workflow [\#2421](https://github.com/hyperledger/aries-cloudagent-python/pull/2421) [Gavinok](https://github.com/Gavinok) + - Enable Snyk scanning [\#2418](https://github.com/hyperledger/aries-cloudagent-python/pull/2418) [ryjones](https://github.com/ryjones) + - Remove Indy tests from workflows [\#2415](https://github.com/hyperledger/aries-cloudagent-python/pull/2415) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.1 [\#2454](https://github.com/hyperledger/aries-cloudagent-python/pull/2454) [swcurran](https://github.com/swcurran) - - 0.10.0 [\#2452](https://github.com/hyperledger/aries-cloudagent-python/pull/2452) [swcurran](https://github.com/swcurran) - - 0.10.0-rc2 [\#2448](https://github.com/hyperledger/aries-cloudagent-python/pull/2448) [swcurran](https://github.com/swcurran) - - 0.10.0-rc1 [\#2442](https://github.com/hyperledger/aries-cloudagent-python/pull/2442) [swcurran](https://github.com/swcurran) - - 0.10.0-rc0 [\#2414](https://github.com/hyperledger/aries-cloudagent-python/pull/2414) [swcurran](https://github.com/swcurran) + - 0.10.1 [\#2454](https://github.com/hyperledger/aries-cloudagent-python/pull/2454) [swcurran](https://github.com/swcurran) + - 0.10.0 [\#2452](https://github.com/hyperledger/aries-cloudagent-python/pull/2452) [swcurran](https://github.com/swcurran) + - 0.10.0-rc2 [\#2448](https://github.com/hyperledger/aries-cloudagent-python/pull/2448) [swcurran](https://github.com/swcurran) + - 0.10.0-rc1 [\#2442](https://github.com/hyperledger/aries-cloudagent-python/pull/2442) [swcurran](https://github.com/swcurran) + - 0.10.0-rc0 [\#2414](https://github.com/hyperledger/aries-cloudagent-python/pull/2414) [swcurran](https://github.com/swcurran) ## 0.10.0 @@ -535,57 +533,57 @@ about changes you might need to make to your deployment. #### Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - BREAKING: feat: get queued outbound message in transport handle message [\#2170](https://github.com/hyperledger/aries-cloudagent-python/pull/2170) [dbluhm](https://github.com/dbluhm) + - BREAKING: feat: get queued outbound message in transport handle message [\#2170](https://github.com/hyperledger/aries-cloudagent-python/pull/2170) [dbluhm](https://github.com/dbluhm) - DID Handling and Connection Establishment Updates/Fixes - - Allow any did to be public [\#2295](https://github.com/hyperledger/aries-cloudagent-python/pull/2295) [mkempa](https://github.com/mkempa) - - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) - - Add Goal and Goal Code to OOB and DIDex Request [\#2294](https://github.com/hyperledger/aries-cloudagent-python/pull/2294) [usingtechnology](https://github.com/usingtechnology) - - Fix routing in set public did [\#2288](https://github.com/hyperledger/aries-cloudagent-python/pull/2288) [mkempa](https://github.com/mkempa) - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - BREAKING: Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) [mepeltier](https://github.com/mepeltier) - - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) [dbluhm](https://github.com/dbluhm) + - Allow any did to be public [\#2295](https://github.com/hyperledger/aries-cloudagent-python/pull/2295) [mkempa](https://github.com/mkempa) + - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) + - Add Goal and Goal Code to OOB and DIDex Request [\#2294](https://github.com/hyperledger/aries-cloudagent-python/pull/2294) [usingtechnology](https://github.com/usingtechnology) + - Fix routing in set public did [\#2288](https://github.com/hyperledger/aries-cloudagent-python/pull/2288) [mkempa](https://github.com/mkempa) - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - BREAKING: Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) [mepeltier](https://github.com/mepeltier) + - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) - - Update to indy-credx 1.0 [\#2302](https://github.com/hyperledger/aries-cloudagent-python/pull/2302) [andrewwhitehead](https://github.com/andrewwhitehead) - - feat(anoncreds): Implement automated setup of revocation [\#2292](https://github.com/hyperledger/aries-cloudagent-python/pull/2292) [dbluhm](https://github.com/dbluhm) - - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) [dbluhm](https://github.com/dbluhm) - - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) - - Feature: JWT Sign and Verify Admin Endpoints with DID Support [\#2300](https://github.com/hyperledger/aries-cloudagent-python/pull/2300) [burdettadam](https://github.com/burdettadam) + - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) + - Update to indy-credx 1.0 [\#2302](https://github.com/hyperledger/aries-cloudagent-python/pull/2302) [andrewwhitehead](https://github.com/andrewwhitehead) + - feat(anoncreds): Implement automated setup of revocation [\#2292](https://github.com/hyperledger/aries-cloudagent-python/pull/2292) [dbluhm](https://github.com/dbluhm) + - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) [dbluhm](https://github.com/dbluhm) + - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) + - Feature: JWT Sign and Verify Admin Endpoints with DID Support [\#2300](https://github.com/hyperledger/aries-cloudagent-python/pull/2300) [burdettadam](https://github.com/burdettadam) - Multitenancy Updates and Fixes - - Fix: Track endorser and author roles in per-tenant settings [\#2331](https://github.com/hyperledger/aries-cloudagent-python/pull/2331) [shaangill025](https://github.com/shaangill025) - - Added base wallet provisioning details to Multitenancy.md [\#2328](https://github.com/hyperledger/aries-cloudagent-python/pull/2328) [esune](https://github.com/esune) + - Fix: Track endorser and author roles in per-tenant settings [\#2331](https://github.com/hyperledger/aries-cloudagent-python/pull/2331) [shaangill025](https://github.com/shaangill025) + - Added base wallet provisioning details to Multitenancy.md [\#2328](https://github.com/hyperledger/aries-cloudagent-python/pull/2328) [esune](https://github.com/esune) - Other Fixes, Demo, and Documentation Fixes - - Add more context to the ACA-Py Revocation handling documentation [\#2343](https://github.com/hyperledger/aries-cloudagent-python/pull/2343) [swcurran](https://github.com/swcurran) - - Document the Indy SDK to Askar Migration process [\#2340](https://github.com/hyperledger/aries-cloudagent-python/pull/2340) [swcurran](https://github.com/swcurran) - - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) - - chore: add indy deprecation warnings [\#2332](https://github.com/hyperledger/aries-cloudagent-python/pull/2332) [dbluhm](https://github.com/dbluhm) - - Fix alice/faber demo execution [\#2305](https://github.com/hyperledger/aries-cloudagent-python/pull/2305) [andrewwhitehead](https://github.com/andrewwhitehead) - - Add .indy_client folder to Askar only image. [\#2308](https://github.com/hyperledger/aries-cloudagent-python/pull/2308) [WadeBarnes](https://github.com/WadeBarnes) - - Add build step for indy-base image in run_demo [\#2299](https://github.com/hyperledger/aries-cloudagent-python/pull/2299) [usingtechnology](https://github.com/usingtechnology) - - Webhook over websocket clarification [\#2287](https://github.com/hyperledger/aries-cloudagent-python/pull/2287) [dbluhm](https://github.com/dbluhm) + - Add more context to the ACA-Py Revocation handling documentation [\#2343](https://github.com/hyperledger/aries-cloudagent-python/pull/2343) [swcurran](https://github.com/swcurran) + - Document the Indy SDK to Askar Migration process [\#2340](https://github.com/hyperledger/aries-cloudagent-python/pull/2340) [swcurran](https://github.com/swcurran) + - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) + - chore: add indy deprecation warnings [\#2332](https://github.com/hyperledger/aries-cloudagent-python/pull/2332) [dbluhm](https://github.com/dbluhm) + - Fix alice/faber demo execution [\#2305](https://github.com/hyperledger/aries-cloudagent-python/pull/2305) [andrewwhitehead](https://github.com/andrewwhitehead) + - Add .indy_client folder to Askar only image. [\#2308](https://github.com/hyperledger/aries-cloudagent-python/pull/2308) [WadeBarnes](https://github.com/WadeBarnes) + - Add build step for indy-base image in run_demo [\#2299](https://github.com/hyperledger/aries-cloudagent-python/pull/2299) [usingtechnology](https://github.com/usingtechnology) + - Webhook over websocket clarification [\#2287](https://github.com/hyperledger/aries-cloudagent-python/pull/2287) [dbluhm](https://github.com/dbluhm) - ACA-Py Deployment Upgrade Changes - - Add Explicit/Offline marking mechanism for Upgrade [\#2204](https://github.com/hyperledger/aries-cloudagent-python/pull/2204) [shaangill025](https://github.com/shaangill025) + - Add Explicit/Offline marking mechanism for Upgrade [\#2204](https://github.com/hyperledger/aries-cloudagent-python/pull/2204) [shaangill025](https://github.com/shaangill025) - Plugin Handling Updates - - Feature: Add the ability to deny specific plugins from loading 0.7.4 [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) [frostyfrog](https://github.com/frostyfrog) + - Feature: Add the ability to deny specific plugins from loading 0.7.4 [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) [frostyfrog](https://github.com/frostyfrog) - Dependencies and Internal Updates - - upgrade pyjwt to latest; introduce leeway to jwt.decodet [\#2335](https://github.com/hyperledger/aries-cloudagent-python/pull/2335) [ff137](https://github.com/ff137) - - upgrade requests to latest [\#2336](https://github.com/hyperledger/aries-cloudagent-python/pull/2336) [ff137](https://github.com/ff137) - - upgrade packaging to latest [\#2334](https://github.com/hyperledger/aries-cloudagent-python/pull/2334) [ff137](https://github.com/ff137) - - chore: update PyYAML [\#2329](https://github.com/hyperledger/aries-cloudagent-python/pull/2329) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump aiohttp from 3.8.4 to 3.8.5 in /demo/playground/scripts dependencies [\#2325](https://github.com/hyperledger/aries-cloudagent-python/pull/2325) [dependabot bot](https://github.com/dependabot bot) - - ⬆️ upgrade marshmallow to latest [\#2322](https://github.com/hyperledger/aries-cloudagent-python/pull/2322) [ff137](https://github.com/ff137) - - fix: use python 3.9 in run_docker [\#2291](https://github.com/hyperledger/aries-cloudagent-python/pull/2291) [dbluhm](https://github.com/dbluhm) - - BREAKING!: drop python 3.6 support [\#2247](https://github.com/hyperledger/aries-cloudagent-python/pull/2247) [dbluhm](https://github.com/dbluhm) - - Minor revisions to the README.md and DevReadMe.md [\#2272](https://github.com/hyperledger/aries-cloudagent-python/pull/2272) [swcurran](https://github.com/swcurran) + - upgrade pyjwt to latest; introduce leeway to jwt.decodet [\#2335](https://github.com/hyperledger/aries-cloudagent-python/pull/2335) [ff137](https://github.com/ff137) + - upgrade requests to latest [\#2336](https://github.com/hyperledger/aries-cloudagent-python/pull/2336) [ff137](https://github.com/ff137) + - upgrade packaging to latest [\#2334](https://github.com/hyperledger/aries-cloudagent-python/pull/2334) [ff137](https://github.com/ff137) + - chore: update PyYAML [\#2329](https://github.com/hyperledger/aries-cloudagent-python/pull/2329) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump aiohttp from 3.8.4 to 3.8.5 in /demo/playground/scripts dependencies [\#2325](https://github.com/hyperledger/aries-cloudagent-python/pull/2325) [dependabot bot](https://github.com/dependabot bot) + - ⬆️ upgrade marshmallow to latest [\#2322](https://github.com/hyperledger/aries-cloudagent-python/pull/2322) [ff137](https://github.com/ff137) + - fix: use python 3.9 in run_docker [\#2291](https://github.com/hyperledger/aries-cloudagent-python/pull/2291) [dbluhm](https://github.com/dbluhm) + - BREAKING!: drop python 3.6 support [\#2247](https://github.com/hyperledger/aries-cloudagent-python/pull/2247) [dbluhm](https://github.com/dbluhm) + - Minor revisions to the README.md and DevReadMe.md [\#2272](https://github.com/hyperledger/aries-cloudagent-python/pull/2272) [swcurran](https://github.com/swcurran) - ACA-Py Administrative Updates - - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) + - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) - CI/CD and Developer Tools/Productivity Updates - - Cancel in-progress workflows when PR is updated [\#2303](https://github.com/hyperledger/aries-cloudagent-python/pull/2303) [andrewwhitehead](https://github.com/andrewwhitehead) - - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) [dbluhm](https://github.com/dbluhm) - - Add devcontainer for ACA-Py [\#2267](https://github.com/hyperledger/aries-cloudagent-python/pull/2267) [usingtechnology](https://github.com/usingtechnology) - - Docker images and GHA for publishing images help wanted [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) [dbluhm](https://github.com/dbluhm) - - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) [dbluhm](https://github.com/dbluhm) + - Cancel in-progress workflows when PR is updated [\#2303](https://github.com/hyperledger/aries-cloudagent-python/pull/2303) [andrewwhitehead](https://github.com/andrewwhitehead) + - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) [dbluhm](https://github.com/dbluhm) + - Add devcontainer for ACA-Py [\#2267](https://github.com/hyperledger/aries-cloudagent-python/pull/2267) [usingtechnology](https://github.com/usingtechnology) + - Docker images and GHA for publishing images help wanted [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) [dbluhm](https://github.com/dbluhm) + - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.9.0 [\#2344](https://github.com/hyperledger/aries-cloudagent-python/pull/2344) [swcurran](https://github.com/swcurran) - - 0.9.0-rc0 [\#2338](https://github.com/hyperledger/aries-cloudagent-python/pull/2338) [swcurran](https://github.com/swcurran) + - 0.9.0 [\#2344](https://github.com/hyperledger/aries-cloudagent-python/pull/2344) [swcurran](https://github.com/swcurran) + - 0.9.0-rc0 [\#2338](https://github.com/hyperledger/aries-cloudagent-python/pull/2338) [swcurran](https://github.com/swcurran) ## 0.8.2 @@ -616,44 +614,44 @@ There are no breaking changes in this release. #### Categorized List of Pull Requests - Connections Fixes/Updates - - Resolve definitions.py fix to fix backwards compatibility break in plugins [\#2255](https://github.com/hyperledger/aries-cloudagent-python/pull/2255) [usingtechnology](https://github.com/usingtechnology) - - Add support for JsonWebKey2020 for the connection invitations [\#2173](https://github.com/hyperledger/aries-cloudagent-python/pull/2173) [dkulic](https://github.com/dkulic) - - fix: only cache completed connection targets [\#2240](https://github.com/hyperledger/aries-cloudagent-python/pull/2240) [dbluhm](https://github.com/dbluhm) - - Connection target should not be limited only to indy dids [\#2229](https://github.com/hyperledger/aries-cloudagent-python/pull/2229) [dkulic](https://github.com/dkulic) - - Disable webhook trigger on initial response to multi-use connection invitation [\#2223](https://github.com/hyperledger/aries-cloudagent-python/pull/2223) [esune](https://github.com/esune) + - Resolve definitions.py fix to fix backwards compatibility break in plugins [\#2255](https://github.com/hyperledger/aries-cloudagent-python/pull/2255) [usingtechnology](https://github.com/usingtechnology) + - Add support for JsonWebKey2020 for the connection invitations [\#2173](https://github.com/hyperledger/aries-cloudagent-python/pull/2173) [dkulic](https://github.com/dkulic) + - fix: only cache completed connection targets [\#2240](https://github.com/hyperledger/aries-cloudagent-python/pull/2240) [dbluhm](https://github.com/dbluhm) + - Connection target should not be limited only to indy dids [\#2229](https://github.com/hyperledger/aries-cloudagent-python/pull/2229) [dkulic](https://github.com/dkulic) + - Disable webhook trigger on initial response to multi-use connection invitation [\#2223](https://github.com/hyperledger/aries-cloudagent-python/pull/2223) [esune](https://github.com/esune) - Credential Exchange (Issue, Present) Updates - - Pass document loader to jsonld.expand [\#2175](https://github.com/hyperledger/aries-cloudagent-python/pull/2175) [andrewwhitehead](https://github.com/andrewwhitehead) + - Pass document loader to jsonld.expand [\#2175](https://github.com/hyperledger/aries-cloudagent-python/pull/2175) [andrewwhitehead](https://github.com/andrewwhitehead) - Multi-tenancy fixes/updates - - Allow Configuration Settings on a per-tenant basis [\#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) [shaangill025](https://github.com/shaangill025) - - stand up multiple agents (single and multi) for local development and testing [\#2230](https://github.com/hyperledger/aries-cloudagent-python/pull/2230) [usingtechnology](https://github.com/usingtechnology) - - Multi-tenant self-managed mediation verkey lookup [\#2232](https://github.com/hyperledger/aries-cloudagent-python/pull/2232) [usingtechnology](https://github.com/usingtechnology) - - fix: route multitenant connectionless oob invitation [\#2243](https://github.com/hyperledger/aries-cloudagent-python/pull/2243) [TimoGlastra](https://github.com/TimoGlastra) - - Fix multitenant/mediation in demo [\#2075](https://github.com/hyperledger/aries-cloudagent-python/pull/2075) [ianco](https://github.com/ianco) + - Allow Configuration Settings on a per-tenant basis [\#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) [shaangill025](https://github.com/shaangill025) + - stand up multiple agents (single and multi) for local development and testing [\#2230](https://github.com/hyperledger/aries-cloudagent-python/pull/2230) [usingtechnology](https://github.com/usingtechnology) + - Multi-tenant self-managed mediation verkey lookup [\#2232](https://github.com/hyperledger/aries-cloudagent-python/pull/2232) [usingtechnology](https://github.com/usingtechnology) + - fix: route multitenant connectionless oob invitation [\#2243](https://github.com/hyperledger/aries-cloudagent-python/pull/2243) [TimoGlastra](https://github.com/TimoGlastra) + - Fix multitenant/mediation in demo [\#2075](https://github.com/hyperledger/aries-cloudagent-python/pull/2075) [ianco](https://github.com/ianco) - Other Bug and Documentation Fixes - - Assign ~thread.thid with thread_id value [\#2261](https://github.com/hyperledger/aries-cloudagent-python/pull/2261) [usingtechnology](https://github.com/usingtechnology) - - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - - Provide an optional Profile to the verification key strategy [\#2265](https://github.com/hyperledger/aries-cloudagent-python/pull/2265) [yvgny](https://github.com/yvgny) - - refactor: Extract verification method ID generation to a separate class [\#2235](https://github.com/hyperledger/aries-cloudagent-python/pull/2235) [yvgny](https://github.com/yvgny) - - Create .readthedocs.yaml file [\#2268](https://github.com/hyperledger/aries-cloudagent-python/pull/2268) [swcurran](https://github.com/swcurran) - - feat(did creation route): reject unregistered did methods [\#2262](https://github.com/hyperledger/aries-cloudagent-python/pull/2262) [chumbert](https://github.com/chumbert) - - ./run_demo performance -c 1 --mediation --timing --trace-log [#2245](https://github.com/hyperledger/aries-cloudagent-python/pull/2245) [usingtechnology](https://github.com/usingtechnology) - - Fix formatting and grammatical errors in different readme's [\#2222](https://github.com/hyperledger/aries-cloudagent-python/pull/2222) [ff137](https://github.com/ff137) - - Fix broken link in README [\#2221](https://github.com/hyperledger/aries-cloudagent-python/pull/2221) [ff137](https://github.com/ff137) - - fix: run only on main, forks ok [\#2166](https://github.com/hyperledger/aries-cloudagent-python/pull/2166) [anwalker293](https://github.com/anwalker293) - - Update Alice Wants a JSON-LD Credential to fix invocation [\#2219](https://github.com/hyperledger/aries-cloudagent-python/pull/2219) [swcurran](https://github.com/swcurran) + - Assign ~thread.thid with thread_id value [\#2261](https://github.com/hyperledger/aries-cloudagent-python/pull/2261) [usingtechnology](https://github.com/usingtechnology) + - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) + - Provide an optional Profile to the verification key strategy [\#2265](https://github.com/hyperledger/aries-cloudagent-python/pull/2265) [yvgny](https://github.com/yvgny) + - refactor: Extract verification method ID generation to a separate class [\#2235](https://github.com/hyperledger/aries-cloudagent-python/pull/2235) [yvgny](https://github.com/yvgny) + - Create .readthedocs.yaml file [\#2268](https://github.com/hyperledger/aries-cloudagent-python/pull/2268) [swcurran](https://github.com/swcurran) + - feat(did creation route): reject unregistered did methods [\#2262](https://github.com/hyperledger/aries-cloudagent-python/pull/2262) [chumbert](https://github.com/chumbert) + - ./run_demo performance -c 1 --mediation --timing --trace-log [#2245](https://github.com/hyperledger/aries-cloudagent-python/pull/2245) [usingtechnology](https://github.com/usingtechnology) + - Fix formatting and grammatical errors in different readme's [\#2222](https://github.com/hyperledger/aries-cloudagent-python/pull/2222) [ff137](https://github.com/ff137) + - Fix broken link in README [\#2221](https://github.com/hyperledger/aries-cloudagent-python/pull/2221) [ff137](https://github.com/ff137) + - fix: run only on main, forks ok [\#2166](https://github.com/hyperledger/aries-cloudagent-python/pull/2166) [anwalker293](https://github.com/anwalker293) + - Update Alice Wants a JSON-LD Credential to fix invocation [\#2219](https://github.com/hyperledger/aries-cloudagent-python/pull/2219) [swcurran](https://github.com/swcurran) - Dependencies and Internal Updates - - Bump requests from 2.30.0 to 2.31.0 in /demo/playground/scripts dependenciesPull requests that update a dependency file [\#2238](https://github.com/hyperledger/aries-cloudagent-python/pull/2238) [dependabot bot](https://github.com/dependabot) - - Upgrade codegen tools in scripts/generate-open-api-spec and publish Swagger 2.0 and OpenAPI 3.0 specs [\#2246](https://github.com/hyperledger/aries-cloudagent-python/pull/2246) [ff137](https://github.com/ff137) + - Bump requests from 2.30.0 to 2.31.0 in /demo/playground/scripts dependenciesPull requests that update a dependency file [\#2238](https://github.com/hyperledger/aries-cloudagent-python/pull/2238) [dependabot bot](https://github.com/dependabot) + - Upgrade codegen tools in scripts/generate-open-api-spec and publish Swagger 2.0 and OpenAPI 3.0 specs [\#2246](https://github.com/hyperledger/aries-cloudagent-python/pull/2246) [ff137](https://github.com/ff137) - ACA-Py Administrative Updates - - Propose adding Jason Sherman [usingtechnology](https://github.com/usingtechnology) as a Maintainer [\#2263](https://github.com/hyperledger/aries-cloudagent-python/pull/2263) [swcurran](https://github.com/swcurran) - - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) + - Propose adding Jason Sherman [usingtechnology](https://github.com/usingtechnology) as a Maintainer [\#2263](https://github.com/hyperledger/aries-cloudagent-python/pull/2263) [swcurran](https://github.com/swcurran) + - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) - Message Tracing/Timing Updates - - Add updated ELK stack for demos. [\#2236](https://github.com/hyperledger/aries-cloudagent-python/pull/2236) [usingtechnology](https://github.com/usingtechnology) + - Add updated ELK stack for demos. [\#2236](https://github.com/hyperledger/aries-cloudagent-python/pull/2236) [usingtechnology](https://github.com/usingtechnology) - Release management pull requests - - 0.8.2 [\#2285](https://github.com/hyperledger/aries-cloudagent-python/pull/2285) [swcurran](https://github.com/swcurran) - - 0.8.2-rc2 [\#2284](https://github.com/hyperledger/aries-cloudagent-python/pull/2283) [swcurran](https://github.com/swcurran) - - 0.8.2-rc1 [\#2282](https://github.com/hyperledger/aries-cloudagent-python/pull/2282) [swcurran](https://github.com/swcurran) - - 0.8.2-rc0 [\#2260](https://github.com/hyperledger/aries-cloudagent-python/pull/2260) [swcurran](https://github.com/swcurran) + - 0.8.2 [\#2285](https://github.com/hyperledger/aries-cloudagent-python/pull/2285) [swcurran](https://github.com/swcurran) + - 0.8.2-rc2 [\#2284](https://github.com/hyperledger/aries-cloudagent-python/pull/2283) [swcurran](https://github.com/swcurran) + - 0.8.2-rc1 [\#2282](https://github.com/hyperledger/aries-cloudagent-python/pull/2282) [swcurran](https://github.com/swcurran) + - 0.8.2-rc0 [\#2260](https://github.com/hyperledger/aries-cloudagent-python/pull/2260) [swcurran](https://github.com/swcurran) ## 0.8.1 @@ -670,12 +668,12 @@ Key points about upgrading for those with production, pre-0.8.1 ACA-Py deploymen - Upgrades now happen **automatically** on startup, when needed. - The version of the last executed upgrade, even if it is a "no change" upgrade, is put into secure storage and is used to detect when future upgrades are needed. - - Upgrades are needed when the running version is greater than the version is + - Upgrades are needed when the running version is greater than the version is secure storage. - If you have an existing, pre-0.8.1 deployment with many connection records, there may be a delay in starting as an upgrade will be run that loads and saves every connection record, updating the data in the record in the process. - - A mechanism is to be added (see [Issue #2201]) for preventing an upgrade + - A mechanism is to be added (see [Issue #2201]) for preventing an upgrade running if it should not be run automatically, and requires using the `upgrade` command. To date, there has been no need for this feature. - See the [Upgrading ACA-Py] document for more details. @@ -693,7 +691,7 @@ We have also noted that in some container orchestration environments such as install correctly in other environments (such as in `docker compose` setups). [\#2116]: https://github.com/hyperledger/aries-cloudagent-python/issues/2116 -[Upgrading ACA-Py]: ../../deploying/UpgradingACA-Py +[Upgrading ACA-Py]: ./UpgradingACA-Py.md [Issue #2201]: https://github.com/hyperledger/aries-cloudagent-python/issues/2201 [Aries Askar]: https://github.com/hyperledger/aries-askar [Red Hat's OpenShift]: https://www.openshift.com/products/container-platform/ @@ -704,22 +702,22 @@ install correctly in other environments (such as in `docker compose` setups). #### Categorized List of Pull Requests - Fixes for the `upgrade` Command - - Change upgrade definition file entry from 0.8.0 to 0.8.1 [\#2203](https://github.com/hyperledger/aries-cloudagent-python/pull/2203) [swcurran](https://github.com/swcurran) - - Add Upgrading ACA-Py document [\#2200](https://github.com/hyperledger/aries-cloudagent-python/pull/2200) [swcurran](https://github.com/swcurran) - - Fix: Indy WalletAlreadyOpenedError during upgrade process [\#2196](https://github.com/hyperledger/aries-cloudagent-python/pull/2196) [shaangill025](https://github.com/shaangill025) - - Fix: Resolve Upgrade Config file in Container [\#2193](https://github.com/hyperledger/aries-cloudagent-python/pull/2193) [shaangill025](https://github.com/shaangill025) - - Update and automate ACA-Py upgrade process [\#2185](https://github.com/hyperledger/aries-cloudagent-python/pull/2185) [shaangill025](https://github.com/shaangill025) - - Adds the upgrade command YML file to the PyPi Release [\#2179](https://github.com/hyperledger/aries-cloudagent-python/pull/2179) [swcurran](https://github.com/swcurran) + - Change upgrade definition file entry from 0.8.0 to 0.8.1 [\#2203](https://github.com/hyperledger/aries-cloudagent-python/pull/2203) [swcurran](https://github.com/swcurran) + - Add Upgrading ACA-Py document [\#2200](https://github.com/hyperledger/aries-cloudagent-python/pull/2200) [swcurran](https://github.com/swcurran) + - Fix: Indy WalletAlreadyOpenedError during upgrade process [\#2196](https://github.com/hyperledger/aries-cloudagent-python/pull/2196) [shaangill025](https://github.com/shaangill025) + - Fix: Resolve Upgrade Config file in Container [\#2193](https://github.com/hyperledger/aries-cloudagent-python/pull/2193) [shaangill025](https://github.com/shaangill025) + - Update and automate ACA-Py upgrade process [\#2185](https://github.com/hyperledger/aries-cloudagent-python/pull/2185) [shaangill025](https://github.com/shaangill025) + - Adds the upgrade command YML file to the PyPi Release [\#2179](https://github.com/hyperledger/aries-cloudagent-python/pull/2179) [swcurran](https://github.com/swcurran) - Test and Documentation - - 3.7 and 3.10 unittests fix [\#2187](https://github.com/hyperledger/aries-cloudagent-python/pull/2187) [Jsyro](https://github.com/Jsyro) - - Doc update and some test scripts [\#2189](https://github.com/hyperledger/aries-cloudagent-python/pull/2189) [ianco](https://github.com/ianco) - - Create UnitTests.md [\#2183](https://github.com/hyperledger/aries-cloudagent-python/pull/2183) [swcurran](https://github.com/swcurran) - - Add link to recorded session about the ACA-Py Integration tests [\#2184](https://github.com/hyperledger/aries-cloudagent-python/pull/2184) [swcurran](https://github.com/swcurran) + - 3.7 and 3.10 unittests fix [\#2187](https://github.com/hyperledger/aries-cloudagent-python/pull/2187) [Jsyro](https://github.com/Jsyro) + - Doc update and some test scripts [\#2189](https://github.com/hyperledger/aries-cloudagent-python/pull/2189) [ianco](https://github.com/ianco) + - Create UnitTests.md [\#2183](https://github.com/hyperledger/aries-cloudagent-python/pull/2183) [swcurran](https://github.com/swcurran) + - Add link to recorded session about the ACA-Py Integration tests [\#2184](https://github.com/hyperledger/aries-cloudagent-python/pull/2184) [swcurran](https://github.com/swcurran) - Release management pull requests - - 0.8.1 [\#2207](https://github.com/hyperledger/aries-cloudagent-python/pull/2207) [swcurran](https://github.com/swcurran) - - 0.8.1-rc2 [\#2198](https://github.com/hyperledger/aries-cloudagent-python/pull/2198) [swcurran](https://github.com/swcurran) - - 0.8.1-rc1 [\#2194](https://github.com/hyperledger/aries-cloudagent-python/pull/2194) [swcurran](https://github.com/swcurran) - - 0.8.1-rc0 [\#2190](https://github.com/hyperledger/aries-cloudagent-python/pull/2190) [swcurran](https://github.com/swcurran) + - 0.8.1 [\#2207](https://github.com/hyperledger/aries-cloudagent-python/pull/2207) [swcurran](https://github.com/swcurran) + - 0.8.1-rc2 [\#2198](https://github.com/hyperledger/aries-cloudagent-python/pull/2198) [swcurran](https://github.com/swcurran) + - 0.8.1-rc1 [\#2194](https://github.com/hyperledger/aries-cloudagent-python/pull/2194) [swcurran](https://github.com/swcurran) + - 0.8.1-rc0 [\#2190](https://github.com/hyperledger/aries-cloudagent-python/pull/2190) [swcurran](https://github.com/swcurran) ## 0.8.0 @@ -836,15 +834,15 @@ ACA-Py, adding you wallet settings: #### Categorized List of Pull Requests - Verifiable credential, presentation and revocation handling updates - - **BREAKING:** Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](https://github.com/victorlee0505) - - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) - - feat: add verification method issue-credentials-2.0/send endpoint [\#2135](https://github.com/hyperledger/aries-cloudagent-python/pull/2135) [chumbert](https://github.com/chumbert) - - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) - - Feature: enabled handling VPs (request, creation, verification) with different VCs [\#1956](https://github.com/hyperledger/aries-cloudagent-python/pull/1956) ([teanas](https://github.com/teanas)) - - fix: update issue-credential endpoint summaries [\#1997](https://github.com/hyperledger/aries-cloudagent-python/pull/1997) ([PeterStrob](https://github.com/PeterStrob)) - - fix claim format designation in presentation submission [\#2013](https://github.com/hyperledger/aries-cloudagent-python/pull/2013) ([rmnre](https://github.com/rmnre)) - - \#2041 - Issue JSON-LD has invalid Admin API documentation [\#2046](https://github.com/hyperledger/aries-cloudagent-python/pull/2046) ([jfblier-amplitude](https://github.com/jfblier-amplitude)) - - Previously flagged in release 1.0.0-rc1 + - **BREAKING:** Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](victorlee0505) + - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) + - feat: add verification method issue-credentials-2.0/send endpoint [\#2135](https://github.com/hyperledger/aries-cloudagent-python/pull/2135) [chumbert](https://github.com/chumbert) + - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) + - Feature: enabled handling VPs (request, creation, verification) with different VCs [\#1956](https://github.com/hyperledger/aries-cloudagent-python/pull/1956) ([teanas](https://github.com/teanas)) + - fix: update issue-credential endpoint summaries [\#1997](https://github.com/hyperledger/aries-cloudagent-python/pull/1997) ([PeterStrob](https://github.com/PeterStrob)) + - fix claim format designation in presentation submission [\#2013](https://github.com/hyperledger/aries-cloudagent-python/pull/2013) ([rmnre](https://github.com/rmnre)) + - \#2041 - Issue JSON-LD has invalid Admin API documentation [\#2046](https://github.com/hyperledger/aries-cloudagent-python/pull/2046) ([jfblier-amplitude](https://github.com/jfblier-amplitude)) + - Previously flagged in release 1.0.0-rc1 - Refactor ledger correction code and insert into revocation error handling [\#1892](https://github.com/hyperledger/aries-cloudagent-python/pull/1892) ([ianco](https://github.com/ianco)) - Indy ledger fixes and cleanups [\#1870](https://github.com/hyperledger/aries-cloudagent-python/pull/1870) ([andrewwhitehead](https://github.com/andrewwhitehead)) - Refactoring of revocation registry creation [\#1813](https://github.com/hyperledger/aries-cloudagent-python/pull/1813) ([andrewwhitehead](https://github.com/andrewwhitehead)) @@ -855,13 +853,13 @@ ACA-Py, adding you wallet settings: - Send webhooks upon record/credential deletion [\#1906](https://github.com/hyperledger/aries-cloudagent-python/pull/1906) ([frostyfrog](https://github.com/frostyfrog)) - Out of Band (OOB) and DID Exchange / Connection Handling / Mediator - - UPGRADE: Fix multi-use invitation performance [\#2116](https://github.com/hyperledger/aries-cloudagent-python/pull/2116) [reflectivedevelopment](https://github.com/reflectivedevelopment) - - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) ([dbluhm](https://github.com/dbluhm)) - - Fix for mediator load testing race condition when scaling horizontally [\#2009](https://github.com/hyperledger/aries-cloudagent-python/pull/2009) ([ianco](https://github.com/ianco)) - - **BREAKING:** Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) ([mepeltier](https://github.com/mepeltier)) - - Do not reject OOB invitation with unknown handshake protocol\(s\) [\#2060](https://github.com/hyperledger/aries-cloudagent-python/pull/2060) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - fix: fix connection timing bug [\#2099](https://github.com/hyperledger/aries-cloudagent-python/pull/2099) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) - - Previously flagged in release 1.0.0-rc1 + - UPGRADE: Fix multi-use invitation performance [\#2116](https://github.com/hyperledger/aries-cloudagent-python/pull/2116) [reflectivedevelopment](https://github.com/reflectivedevelopment) + - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) ([dbluhm](https://github.com/dbluhm)) + - Fix for mediator load testing race condition when scaling horizontally [\#2009](https://github.com/hyperledger/aries-cloudagent-python/pull/2009) ([ianco](https://github.com/ianco)) + - **BREAKING:** Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) ([mepeltier](https://github.com/mepeltier)) + - Do not reject OOB invitation with unknown handshake protocol\(s\) [\#2060](https://github.com/hyperledger/aries-cloudagent-python/pull/2060) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - fix: fix connection timing bug [\#2099](https://github.com/hyperledger/aries-cloudagent-python/pull/2099) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) + - Previously flagged in release 1.0.0-rc1 - Fix: `--mediator-invitation` with OOB invitation + cleanup [\#1970](https://github.com/hyperledger/aries-cloudagent-python/pull/1970) ([shaangill025](https://github.com/shaangill025)) - include image\_url in oob invitation [\#1966](https://github.com/hyperledger/aries-cloudagent-python/pull/1966) ([Zzocker](https://github.com/Zzocker)) - feat: 00B v1.1 support [\#1962](https://github.com/hyperledger/aries-cloudagent-python/pull/1962) ([shaangill025](https://github.com/shaangill025)) @@ -871,12 +869,12 @@ ACA-Py, adding you wallet settings: - Feat/public did endpoints for agents behind mediators [\#1899](https://github.com/hyperledger/aries-cloudagent-python/pull/1899) ([cjhowland](https://github.com/cjhowland)) - DID Registration and Resolution related updates - - feat: allow marking non-SOV DIDs as public [\#2144](https://github.com/hyperledger/aries-cloudagent-python/pull/2144) [chumbert](https://github.com/chumbert) - - fix: askar exception message always displaying null DID [\#2155](https://github.com/hyperledger/aries-cloudagent-python/pull/2155) [chumbert](https://github.com/chumbert) - - feat: enable creation of DIDs for all registered methods [\#2067](https://github.com/hyperledger/aries-cloudagent-python/pull/2067) ([chumbert](https://github.com/chumbert)) - - fix: create local DID return schema [\#2086](https://github.com/hyperledger/aries-cloudagent-python/pull/2086) ([chumbert](https://github.com/chumbert)) - - feat: universal resolver - configurable authentication [\#2095](https://github.com/hyperledger/aries-cloudagent-python/pull/2095) ([chumbert](https://github.com/chumbert)) - - Previously flagged in release 1.0.0-rc1 + - feat: allow marking non-SOV DIDs as public [\#2144](https://github.com/hyperledger/aries-cloudagent-python/pull/2144) [chumbert](https://github.com/chumbert) + - fix: askar exception message always displaying null DID [\#2155](https://github.com/hyperledger/aries-cloudagent-python/pull/2155) [chumbert](https://github.com/chumbert) + - feat: enable creation of DIDs for all registered methods [\#2067](https://github.com/hyperledger/aries-cloudagent-python/pull/2067) ([chumbert](https://github.com/chumbert)) + - fix: create local DID return schema [\#2086](https://github.com/hyperledger/aries-cloudagent-python/pull/2086) ([chumbert](https://github.com/chumbert)) + - feat: universal resolver - configurable authentication [\#2095](https://github.com/hyperledger/aries-cloudagent-python/pull/2095) ([chumbert](https://github.com/chumbert)) + - Previously flagged in release 1.0.0-rc1 - feat: add universal resolver [\#1866](https://github.com/hyperledger/aries-cloudagent-python/pull/1866) ([dbluhm](https://github.com/dbluhm)) - fix: resolve dids following new endpoint rules [\#1863](https://github.com/hyperledger/aries-cloudagent-python/pull/1863) ([dbluhm](https://github.com/dbluhm)) - fix: didx request cannot be accepted [\#1881](https://github.com/hyperledger/aries-cloudagent-python/pull/1881) ([rmnre](https://github.com/rmnre)) @@ -886,35 +884,35 @@ ACA-Py, adding you wallet settings: - Use did:key for recipient keys [\#1886](https://github.com/hyperledger/aries-cloudagent-python/pull/1886) ([frostyfrog](https://github.com/frostyfrog)) - Hyperledger Indy Endorser/Author Transaction Handling - - Update some of the demo Readme and Endorser instructions [\#2122](https://github.com/hyperledger/aries-cloudagent-python/pull/2122) [swcurran](https://github.com/swcurran) - - Special handling for the write ledger [\#2030](https://github.com/hyperledger/aries-cloudagent-python/pull/2030) ([ianco](https://github.com/ianco)) - - Previously flagged in release 1.0.0-rc1 + - Update some of the demo Readme and Endorser instructions [\#2122](https://github.com/hyperledger/aries-cloudagent-python/pull/2122) [swcurran](https://github.com/swcurran) + - Special handling for the write ledger [\#2030](https://github.com/hyperledger/aries-cloudagent-python/pull/2030) ([ianco](https://github.com/ianco)) + - Previously flagged in release 1.0.0-rc1 - Fix/txn job setting [\#1994](https://github.com/hyperledger/aries-cloudagent-python/pull/1994) ([ianco](https://github.com/ianco)) - chore: fix ACAPY\_PROMOTE-AUTHOR-DID flag [\#1978](https://github.com/hyperledger/aries-cloudagent-python/pull/1978) ([morrieinmaas](https://github.com/morrieinmaas)) - Endorser write DID transaction [\#1938](https://github.com/hyperledger/aries-cloudagent-python/pull/1938) ([ianco](https://github.com/ianco)) - Endorser doc updates and some bug fixes [\#1926](https://github.com/hyperledger/aries-cloudagent-python/pull/1926) ([ianco](https://github.com/ianco)) - Admin API Additions - - fix: response type on delete-tails-files endpoint [\#2133](https://github.com/hyperledger/aries-cloudagent-python/pull/2133) [chumbert](https://github.com/chumbert) - - OpenAPI validation fixes [\#2127](https://github.com/hyperledger/aries-cloudagent-python/pull/2127) [loneil](https://github.com/loneil) - - Delete tail files [\#2103](https://github.com/hyperledger/aries-cloudagent-python/pull/2103) [ramreddychalla94](https://github.com/ramreddychalla94) + - fix: response type on delete-tails-files endpoint [\#2133](https://github.com/hyperledger/aries-cloudagent-python/pull/2133) [chumbert](https://github.com/chumbert) + - OpenAPI validation fixes [\#2127](https://github.com/hyperledger/aries-cloudagent-python/pull/2127) [loneil](https://github.com/loneil) + - Delete tail files [\#2103](https://github.com/hyperledger/aries-cloudagent-python/pull/2103) [ramreddychalla94](https://github.com/ramreddychalla94) - Startup Command Line / Environment / YAML Parameter Updates - - Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](https://github.com/victorlee0505) - - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) - - Add missing --mediator-connections-invite cmd arg info to docs [\#2051](https://github.com/hyperledger/aries-cloudagent-python/pull/2051) ([matrixik](https://github.com/matrixik)) - - Issue \#2068 boolean flag change to support HEAD requests to default route [\#2077](https://github.com/hyperledger/aries-cloudagent-python/pull/2077) ([johnekent](https://github.com/johnekent)) - - Previously flagged in release 1.0.0-rc1 + - Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](victorlee0505) + - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) + - Add missing --mediator-connections-invite cmd arg info to docs [\#2051](https://github.com/hyperledger/aries-cloudagent-python/pull/2051) ([matrixik](https://github.com/matrixik)) + - Issue \#2068 boolean flag change to support HEAD requests to default route [\#2077](https://github.com/hyperledger/aries-cloudagent-python/pull/2077) ([johnekent](https://github.com/johnekent)) + - Previously flagged in release 1.0.0-rc1 - Add seed command line parameter but use only if also an "allow insecure seed" parameter is set [\#1714](https://github.com/hyperledger/aries-cloudagent-python/pull/1714) ([DaevMithran](https://github.com/DaevMithran)) - Internal Aries framework data handling updates - - fix: resolver api schema inconsistency [\#2112](https://github.com/hyperledger/aries-cloudagent-python/pull/2112) ([TimoGlastra](https://github.com/chumbert)) - - fix: return if return route but no response [\#1853](https://github.com/hyperledger/aries-cloudagent-python/pull/1853) ([TimoGlastra](https://github.com/TimoGlastra)) - - Multi-ledger/Multi-tenant issues [\#2022](https://github.com/hyperledger/aries-cloudagent-python/pull/2022) ([ianco](https://github.com/ianco)) - - fix: Correct typo in model -- required spelled incorrectly [\#2031](https://github.com/hyperledger/aries-cloudagent-python/pull/2031) ([swcurran](https://github.com/swcurran)) - - Code formatting [\#2053](https://github.com/hyperledger/aries-cloudagent-python/pull/2053) ([ianco](https://github.com/ianco)) - - Improved validation of record state attributes [\#2071](https://github.com/hyperledger/aries-cloudagent-python/pull/2071) ([rmnre](https://github.com/rmnre)) - - Previously flagged in release 1.0.0-rc1 + - fix: resolver api schema inconsistency [\#2112](https://github.com/hyperledger/aries-cloudagent-python/pull/2112) ([TimoGlastra](https://github.com/chumbert)) + - fix: return if return route but no response [\#1853](https://github.com/hyperledger/aries-cloudagent-python/pull/1853) ([TimoGlastra](https://github.com/TimoGlastra)) + - Multi-ledger/Multi-tenant issues [\#2022](https://github.com/hyperledger/aries-cloudagent-python/pull/2022) ([ianco](https://github.com/ianco)) + - fix: Correct typo in model -- required spelled incorrectly [\#2031](https://github.com/hyperledger/aries-cloudagent-python/pull/2031) ([swcurran](https://github.com/swcurran)) + - Code formatting [\#2053](https://github.com/hyperledger/aries-cloudagent-python/pull/2053) ([ianco](https://github.com/ianco)) + - Improved validation of record state attributes [\#2071](https://github.com/hyperledger/aries-cloudagent-python/pull/2071) ([rmnre](https://github.com/rmnre)) + - Previously flagged in release 1.0.0-rc1 - fix: update RouteManager methods use to pass profile as parameter [\#1902](https://github.com/hyperledger/aries-cloudagent-python/pull/1902) ([chumbert](https://github.com/chumbert)) - Allow fully qualified class names for profile managers [\#1880](https://github.com/hyperledger/aries-cloudagent-python/pull/1880) ([chumbert](https://github.com/chumbert)) - fix: unable to use askar with in memory db [\#1878](https://github.com/hyperledger/aries-cloudagent-python/pull/1878) ([dbluhm](https://github.com/dbluhm)) @@ -928,8 +926,8 @@ ACA-Py, adding you wallet settings: - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) ([dbluhm](https://github.com/dbluhm)) - Unit, Integration, and Aries Agent Test Harness Test updates - - Additional integration tests for revocation scenarios [\#2055](https://github.com/hyperledger/aries-cloudagent-python/pull/2055) ([ianco](https://github.com/ianco)) - - Previously flagged in release 1.0.0-rc1 + - Additional integration tests for revocation scenarios [\#2055](https://github.com/hyperledger/aries-cloudagent-python/pull/2055) ([ianco](https://github.com/ianco)) + - Previously flagged in release 1.0.0-rc1 - Fixes a few AATH failures [\#1897](https://github.com/hyperledger/aries-cloudagent-python/pull/1897) ([ianco](https://github.com/ianco)) - fix: warnings in tests from IndySdkProfile [\#1865](https://github.com/hyperledger/aries-cloudagent-python/pull/1865) ([dbluhm](https://github.com/dbluhm)) - Unit test fixes for python 3.9 [\#1858](https://github.com/hyperledger/aries-cloudagent-python/pull/1858) ([andrewwhitehead](https://github.com/andrewwhitehead)) @@ -937,44 +935,44 @@ ACA-Py, adding you wallet settings: - Update pip-audit.yml [\#1944](https://github.com/hyperledger/aries-cloudagent-python/pull/1944) ([ryjones](https://github.com/ryjones)) - Dependency, Python version, GitHub Actions and Container Image Changes - - Remove CircleCI Status since we aren't using CircleCI anymore [\#2163](https://github.com/hyperledger/aries-cloudagent-python/pull/2163) [swcurran](https://github.com/swcurran) - - Update ACA-Py docker files to produce OpenShift compatible images [\#2130](https://github.com/hyperledger/aries-cloudagent-python/pull/2130) [WadeBarnes](https://github.com/WadeBarnes) - - Temporarily disable multi-architecture image builds [\#2125](https://github.com/hyperledger/aries-cloudagent-python/pull/2125) [WadeBarnes](https://github.com/WadeBarnes) - - Fix ACA-py image builds [\#2123](https://github.com/hyperledger/aries-cloudagent-python/pull/2123) [WadeBarnes](https://github.com/WadeBarnes) - - Fix publish workflows [\#2117](https://github.com/hyperledger/aries-cloudagent-python/pull/2117) [WadeBarnes](https://github.com/WadeBarnes) - - fix: indy dependency version format [\#2054](https://github.com/hyperledger/aries-cloudagent-python/pull/2054) ([chumbert](https://github.com/chumbert)) - - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) ([dbluhm](https://github.com/dbluhm)) - - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) ([dbluhm](https://github.com/dbluhm)) - - Update github actions dependencies \(for node16 support\) [\#2066](https://github.com/hyperledger/aries-cloudagent-python/pull/2066) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Docker images and GHA for publishing images [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) ([dbluhm](https://github.com/dbluhm)) - - Update dockerfiles to use python 3.9 [\#2109](https://github.com/hyperledger/aries-cloudagent-python/pull/2109) ([ianco](https://github.com/ianco)) - - Updating base images from slim-buster to slim-bullseye [\#2105](https://github.com/hyperledger/aries-cloudagent-python/pull/2105) ([pradeepp88](https://github.com/pradeepp88)) - - Previously flagged in release 1.0.0-rc1 + - Remove CircleCI Status since we aren't using CircleCI anymore [\#2163](https://github.com/hyperledger/aries-cloudagent-python/pull/2163) [swcurran](https://github.com/swcurran) + - Update ACA-Py docker files to produce OpenShift compatible images [\#2130](https://github.com/hyperledger/aries-cloudagent-python/pull/2130) [WadeBarnes](https://github.com/WadeBarnes) + - Temporarily disable multi-architecture image builds [\#2125](https://github.com/hyperledger/aries-cloudagent-python/pull/2125) [WadeBarnes](https://github.com/WadeBarnes) + - Fix ACA-py image builds [\#2123](https://github.com/hyperledger/aries-cloudagent-python/pull/2123) [WadeBarnes](https://github.com/WadeBarnes) + - Fix publish workflows [\#2117](https://github.com/hyperledger/aries-cloudagent-python/pull/2117) [WadeBarnes](https://github.com/WadeBarnes) + - fix: indy dependency version format [\#2054](https://github.com/hyperledger/aries-cloudagent-python/pull/2054) ([chumbert](https://github.com/chumbert)) + - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) ([dbluhm](https://github.com/dbluhm)) + - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) ([dbluhm](https://github.com/dbluhm)) + - Update github actions dependencies \(for node16 support\) [\#2066](https://github.com/hyperledger/aries-cloudagent-python/pull/2066) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Docker images and GHA for publishing images [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) ([dbluhm](https://github.com/dbluhm)) + - Update dockerfiles to use python 3.9 [\#2109](https://github.com/hyperledger/aries-cloudagent-python/pull/2109) ([ianco](https://github.com/ianco)) + - Updating base images from slim-buster to slim-bullseye [\#2105](https://github.com/hyperledger/aries-cloudagent-python/pull/2105) ([pradeepp88](https://github.com/pradeepp88)) + - Previously flagged in release 1.0.0-rc1 - feat: update pynacl version from 1.4.0 to 1.50 [\#1981](https://github.com/hyperledger/aries-cloudagent-python/pull/1981) ([morrieinmaas](https://github.com/morrieinmaas)) - Fix: web.py dependency - integration tests & demos [\#1973](https://github.com/hyperledger/aries-cloudagent-python/pull/1973) ([shaangill025](https://github.com/shaangill025)) - chore: update pydid [\#1915](https://github.com/hyperledger/aries-cloudagent-python/pull/1915) ([dbluhm](https://github.com/dbluhm)) - Demo and Documentation Updates - - [fix] Removes extra comma that prevents swagger from accepting the presentation request [\#2149](https://github.com/hyperledger/aries-cloudagent-python/pull/2149) [swcurran](https://github.com/swcurran) - - Initial plugin docs [\#2138](https://github.com/hyperledger/aries-cloudagent-python/pull/2138) [ianco](https://github.com/ianco) - - Acme workshop [\#2137](https://github.com/hyperledger/aries-cloudagent-python/pull/2137) [ianco](https://github.com/ianco) - - Fix: Performance Demo [no --revocation] [\#2151](https://github.com/ hyperledger/aries-cloudagent-python/pull/2151) [shaangill025](https://github.com/shaangill025) - - Fix typos in alice-local.sh & faber-local.sh [\#2010](https://github.com/hyperledger/aries-cloudagent-python/pull/2010) ([naonishijima](https://github.com/naonishijima)) - - Added a bit about manually creating a revoc reg tails file [\#2012](https://github.com/hyperledger/aries-cloudagent-python/pull/2012) ([ianco](https://github.com/ianco)) - - Add ability to set docker container name [\#2024](https://github.com/hyperledger/aries-cloudagent-python/pull/2024) ([matrixik](https://github.com/matrixik)) - - Doc updates for json demo [\#2026](https://github.com/hyperledger/aries-cloudagent-python/pull/2026) ([ianco](https://github.com/ianco)) - - Multitenancy demo \(docker-compose with postgres and ngrok\) [\#2089](https://github.com/hyperledger/aries-cloudagent-python/pull/2089) ([ianco](https://github.com/ianco)) - - Allow using YAML configuration file with run\_docker [\#2091](https://github.com/hyperledger/aries-cloudagent-python/pull/2091) ([matrixik](https://github.com/matrixik)) - - Previously flagged in release 1.0.0-rc1 + - [fix] Removes extra comma that prevents swagger from accepting the presentation request [\#2149](https://github.com/hyperledger/aries-cloudagent-python/pull/2149) [swcurran](https://github.com/swcurran) + - Initial plugin docs [\#2138](https://github.com/hyperledger/aries-cloudagent-python/pull/2138) [ianco](https://github.com/ianco) + - Acme workshop [\#2137](https://github.com/hyperledger/aries-cloudagent-python/pull/2137) [ianco](https://github.com/ianco) + - Fix: Performance Demo [no --revocation] [\#2151](https://github.com/ hyperledger/aries-cloudagent-python/pull/2151) [shaangill025](https://github.com/shaangill025) + - Fix typos in alice-local.sh & faber-local.sh [\#2010](https://github.com/hyperledger/aries-cloudagent-python/pull/2010) ([naonishijima](https://github.com/naonishijima)) + - Added a bit about manually creating a revoc reg tails file [\#2012](https://github.com/hyperledger/aries-cloudagent-python/pull/2012) ([ianco](https://github.com/ianco)) + - Add ability to set docker container name [\#2024](https://github.com/hyperledger/aries-cloudagent-python/pull/2024) ([matrixik](https://github.com/matrixik)) + - Doc updates for json demo [\#2026](https://github.com/hyperledger/aries-cloudagent-python/pull/2026) ([ianco](https://github.com/ianco)) + - Multitenancy demo \(docker-compose with postgres and ngrok\) [\#2089](https://github.com/hyperledger/aries-cloudagent-python/pull/2089) ([ianco](https://github.com/ianco)) + - Allow using YAML configuration file with run\_docker [\#2091](https://github.com/hyperledger/aries-cloudagent-python/pull/2091) ([matrixik](https://github.com/matrixik)) + - Previously flagged in release 1.0.0-rc1 - Fixes to acme exercise code [\#1990](https://github.com/hyperledger/aries-cloudagent-python/pull/1990) ([ianco](https://github.com/ianco)) - Fixed bug in run\_demo script [\#1982](https://github.com/hyperledger/aries-cloudagent-python/pull/1982) ([pasquale95](https://github.com/pasquale95)) - Transaction Author with Endorser demo [\#1975](https://github.com/hyperledger/aries-cloudagent-python/pull/1975) ([ianco](https://github.com/ianco)) - Redis Plugins \[redis\_cache & redis\_queue\] related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) ([shaangill025](https://github.com/shaangill025)) - Release management pull requests - - 0.8.0 release [\#2169](https://github.com/hyperledger/aries-cloudagent-python/pull/2169) ([swcurran](https://github.com/swcurran)) - - 0.8.0-rc0 release updates [\#2115](https://github.com/hyperledger/aries-cloudagent-python/pull/2115) ([swcurran](https://github.com/swcurran)) - - Previously flagged in release 1.0.0-rc1 + - 0.8.0 release [\#2169](https://github.com/hyperledger/aries-cloudagent-python/pull/2169) ([swcurran](https://github.com/swcurran)) + - 0.8.0-rc0 release updates [\#2115](https://github.com/hyperledger/aries-cloudagent-python/pull/2115) ([swcurran](https://github.com/swcurran)) + - Previously flagged in release 1.0.0-rc1 - Release 1.0.0-rc0 [\#1904](https://github.com/hyperledger/aries-cloudagent-python/pull/1904) ([swcurran](https://github.com/swcurran)) - Add 0.7.5 patch Changelog entry to main branch Changelog [\#1996](https://github.com/hyperledger/aries-cloudagent-python/pull/1996) ([swcurran](https://github.com/swcurran)) - Release 1.0.0-rc1 [\#2005](https://github.com/hyperledger/aries-cloudagent-python/pull/2005) ([swcurran](https://github.com/swcurran)) @@ -1100,128 +1098,128 @@ stuff needed for a healthy, growing codebase. #### Categorized List of Pull Requests - Hyperledger Indy Endorser related updates: - - Fix order of operations connecting faber to endorser [\#1716](https://github.com/hyperledger/aries-cloudagent-python/pull/1716) ([ianco](https://github.com/ianco)) - - Endorser support for updating DID endpoints on ledger [\#1696](https://github.com/hyperledger/aries-cloudagent-python/pull/1696) ([frostyfrog](https://github.com/frostyfrog)) - - Add "sent" key to both Schema and Cred Defs when using Endorsers [\#1663](https://github.com/hyperledger/aries-cloudagent-python/pull/1663) ([frostyfrog](https://github.com/frostyfrog)) - - Add cred_def_id to metadata when using an Endorser [\#1655](https://github.com/hyperledger/aries-cloudagent-python/pull/1655) ([frostyfrog](https://github.com/frostyfrog)) - - Update Endorser documentation [\#1646](https://github.com/hyperledger/aries-cloudagent-python/pull/1646) ([chumbert](https://github.com/chumbert)) - - Auto-promote author did to public after endorsing [\#1607](https://github.com/hyperledger/aries-cloudagent-python/pull/1607) ([ianco](https://github.com/ianco)) - - DID updates for endorser [\#1601](https://github.com/hyperledger/aries-cloudagent-python/pull/1601) ([ianco](https://github.com/ianco)) - - Qualify did exch connection lookup by role [\#1670](https://github.com/hyperledger/aries-cloudagent-python/pull/1670) ([ianco](https://github.com/ianco)) - - Use provided connection_id if provided [\#1726](https://github.com/hyperledger/aries-cloudagent-python/pull/1726) ([ianco](https://github.com/ianco)) + - Fix order of operations connecting faber to endorser [\#1716](https://github.com/hyperledger/aries-cloudagent-python/pull/1716) ([ianco](https://github.com/ianco)) + - Endorser support for updating DID endpoints on ledger [\#1696](https://github.com/hyperledger/aries-cloudagent-python/pull/1696) ([frostyfrog](https://github.com/frostyfrog)) + - Add "sent" key to both Schema and Cred Defs when using Endorsers [\#1663](https://github.com/hyperledger/aries-cloudagent-python/pull/1663) ([frostyfrog](https://github.com/frostyfrog)) + - Add cred_def_id to metadata when using an Endorser [\#1655](https://github.com/hyperledger/aries-cloudagent-python/pull/1655) ([frostyfrog](https://github.com/frostyfrog)) + - Update Endorser documentation [\#1646](https://github.com/hyperledger/aries-cloudagent-python/pull/1646) ([chumbert](https://github.com/chumbert)) + - Auto-promote author did to public after endorsing [\#1607](https://github.com/hyperledger/aries-cloudagent-python/pull/1607) ([ianco](https://github.com/ianco)) + - DID updates for endorser [\#1601](https://github.com/hyperledger/aries-cloudagent-python/pull/1601) ([ianco](https://github.com/ianco)) + - Qualify did exch connection lookup by role [\#1670](https://github.com/hyperledger/aries-cloudagent-python/pull/1670) ([ianco](https://github.com/ianco)) + - Use provided connection_id if provided [\#1726](https://github.com/hyperledger/aries-cloudagent-python/pull/1726) ([ianco](https://github.com/ianco)) - Additions to the startup parameters, Admin API and Web Hooks - - Improve typing of settings and add plugin settings object [\#1833](https://github.com/hyperledger/aries-cloudagent-python/pull/1833) ([dbluhm](https://github.com/dbluhm)) - - feat: accept taa using startup parameter --accept-taa [\#1643](https://github.com/hyperledger/aries-cloudagent-python/pull/1643) ([TimoGlastra](https://github.com/TimoGlastra)) - - Add auto_verify flag in present-proof protocol [\#1702](https://github.com/hyperledger/aries-cloudagent-python/pull/1702) ([DaevMithran](https://github.com/DaevMithran)) - - feat: query connections by their_public_did [\#1637](https://github.com/hyperledger/aries-cloudagent-python/pull/1637) ([TimoGlastra](https://github.com/TimoGlastra)) - - feat: enable webhook events for mediation records [\#1614](https://github.com/hyperledger/aries-cloudagent-python/pull/1614) ([TimoGlastra](https://github.com/TimoGlastra)) - - Feature/undelivered events [\#1694](https://github.com/hyperledger/aries-cloudagent-python/pull/1694) ([mepeltier](https://github.com/mepeltier)) - - Allow use of SEED when creating local wallet DID Issue-1682 Issue-1682 [\#1705](https://github.com/hyperledger/aries-cloudagent-python/pull/1705) ([DaevMithran](https://github.com/DaevMithran)) - - Feature: Add the ability to deny specific plugins from loading [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) ([frostyfrog](https://github.com/frostyfrog)) - - feat: Add filter param to connection list for invitations [\#1797](https://github.com/hyperledger/aries-cloudagent-python/pull/1797) ([frostyfrog](https://github.com/frostyfrog)) - - Fix missing webhook handler [\#1816](https://github.com/hyperledger/aries-cloudagent-python/pull/1816) ([ianco](https://github.com/ianco)) + - Improve typing of settings and add plugin settings object [\#1833](https://github.com/hyperledger/aries-cloudagent-python/pull/1833) ([dbluhm](https://github.com/dbluhm)) + - feat: accept taa using startup parameter --accept-taa [\#1643](https://github.com/hyperledger/aries-cloudagent-python/pull/1643) ([TimoGlastra](https://github.com/TimoGlastra)) + - Add auto_verify flag in present-proof protocol [\#1702](https://github.com/hyperledger/aries-cloudagent-python/pull/1702) ([DaevMithran](https://github.com/DaevMithran)) + - feat: query connections by their_public_did [\#1637](https://github.com/hyperledger/aries-cloudagent-python/pull/1637) ([TimoGlastra](https://github.com/TimoGlastra)) + - feat: enable webhook events for mediation records [\#1614](https://github.com/hyperledger/aries-cloudagent-python/pull/1614) ([TimoGlastra](https://github.com/TimoGlastra)) + - Feature/undelivered events [\#1694](https://github.com/hyperledger/aries-cloudagent-python/pull/1694) ([mepeltier](https://github.com/mepeltier)) + - Allow use of SEED when creating local wallet DID Issue-1682 Issue-1682 [\#1705](https://github.com/hyperledger/aries-cloudagent-python/pull/1705) ([DaevMithran](https://github.com/DaevMithran)) + - Feature: Add the ability to deny specific plugins from loading [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) ([frostyfrog](https://github.com/frostyfrog)) + - feat: Add filter param to connection list for invitations [\#1797](https://github.com/hyperledger/aries-cloudagent-python/pull/1797) ([frostyfrog](https://github.com/frostyfrog)) + - Fix missing webhook handler [\#1816](https://github.com/hyperledger/aries-cloudagent-python/pull/1816) ([ianco](https://github.com/ianco)) - Persistent Queues - - Redis PQ Cleanup in preparation for enabling the uses of plugin PQ implementations \[Issue\#1659\] [\#1659](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) + - Redis PQ Cleanup in preparation for enabling the uses of plugin PQ implementations \[Issue\#1659\] [\#1659](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) - Credential Revocation and Tails File Handling - - Fix handling of non-revocable credential when timestamp is specified \(askar/credx\) [\#1847](https://github.com/hyperledger/aries-cloudagent-python/pull/1847) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Additional endpoints to get revocation details and fix "published" status [\#1783](https://github.com/hyperledger/aries-cloudagent-python/pull/1783) ([ianco](https://github.com/ianco)) - - Fix IssuerCredRevRecord state update on revocation publish [\#1827](https://github.com/hyperledger/aries-cloudagent-python/pull/1827) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix put_file when the server returns a redirect [\#1808](https://github.com/hyperledger/aries-cloudagent-python/pull/1808) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Adjust revocation registry update procedure to shorten transactions [\#1804](https://github.com/hyperledger/aries-cloudagent-python/pull/1804) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - fix: Resolve Revocation Notification environment variable name collision [\#1751](https://github.com/hyperledger/aries-cloudagent-python/pull/1751) ([frostyfrog](https://github.com/frostyfrog)) - - fix: always notify if revocation notification record exists [\#1665](https://github.com/hyperledger/aries-cloudagent-python/pull/1665) ([TimoGlastra](https://github.com/TimoGlastra)) - - Fix for AnonCreds non-revoc proof with no timestamp [\#1628](https://github.com/hyperledger/aries-cloudagent-python/pull/1628) ([ianco](https://github.com/ianco)) - - Fixes for v7.3.0 - Issue [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597) [\#1711](https://github.com/hyperledger/aries-cloudagent-python/pull/1711) ([shaangill025](https://github.com/shaangill025)) + - Fix handling of non-revocable credential when timestamp is specified \(askar/credx\) [\#1847](https://github.com/hyperledger/aries-cloudagent-python/pull/1847) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Additional endpoints to get revocation details and fix "published" status [\#1783](https://github.com/hyperledger/aries-cloudagent-python/pull/1783) ([ianco](https://github.com/ianco)) + - Fix IssuerCredRevRecord state update on revocation publish [\#1827](https://github.com/hyperledger/aries-cloudagent-python/pull/1827) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix put_file when the server returns a redirect [\#1808](https://github.com/hyperledger/aries-cloudagent-python/pull/1808) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Adjust revocation registry update procedure to shorten transactions [\#1804](https://github.com/hyperledger/aries-cloudagent-python/pull/1804) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - fix: Resolve Revocation Notification environment variable name collision [\#1751](https://github.com/hyperledger/aries-cloudagent-python/pull/1751) ([frostyfrog](https://github.com/frostyfrog)) + - fix: always notify if revocation notification record exists [\#1665](https://github.com/hyperledger/aries-cloudagent-python/pull/1665) ([TimoGlastra](https://github.com/TimoGlastra)) + - Fix for AnonCreds non-revoc proof with no timestamp [\#1628](https://github.com/hyperledger/aries-cloudagent-python/pull/1628) ([ianco](https://github.com/ianco)) + - Fixes for v7.3.0 - Issue [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597) [\#1711](https://github.com/hyperledger/aries-cloudagent-python/pull/1711) ([shaangill025](https://github.com/shaangill025)) - Fixes Issue 1 from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): Tails file upload fails when a credDef is created and multi ledger support is enabled - - Fix tails server upload multi-ledger mode [\#1785](https://github.com/hyperledger/aries-cloudagent-python/pull/1785) ([ianco](https://github.com/ianco)) - - Feat/revocation notification v2 [\#1734](https://github.com/hyperledger/aries-cloudagent-python/pull/1734) ([frostyfrog](https://github.com/frostyfrog)) + - Fix tails server upload multi-ledger mode [\#1785](https://github.com/hyperledger/aries-cloudagent-python/pull/1785) ([ianco](https://github.com/ianco)) + - Feat/revocation notification v2 [\#1734](https://github.com/hyperledger/aries-cloudagent-python/pull/1734) ([frostyfrog](https://github.com/frostyfrog)) - Issue Credential, Present Proof updates/fixes - - Fix: Present Proof v2 - check_proof_vs_proposal update to support proof request with restrictions [\#1820](https://github.com/hyperledger/aries-cloudagent-python/pull/1820) ([shaangill025](https://github.com/shaangill025)) - - Fix: present-proof v1 send-proposal flow [\#1811](https://github.com/hyperledger/aries-cloudagent-python/pull/1811) ([shaangill025](https://github.com/shaangill025)) - - Prover - verification outcome from presentation ack message [\#1757](https://github.com/hyperledger/aries-cloudagent-python/pull/1757) ([shaangill025](https://github.com/shaangill025)) - - feat: support connectionless exchange [\#1710](https://github.com/hyperledger/aries-cloudagent-python/pull/1710) ([TimoGlastra](https://github.com/TimoGlastra)) - - Fix: DIF proof proposal when creating bound presentation request \[Issue\#1687\] [\#1690](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) - - Fix DIF PresExch and OOB request_attach delete unused connection [\#1676](https://github.com/hyperledger/aries-cloudagent-python/pull/1676) ([shaangill025](https://github.com/shaangill025)) - - Fix DIFPresFormatHandler returning invalid V20PresExRecord on presentation verification [\#1645](https://github.com/hyperledger/aries-cloudagent-python/pull/1645) ([rmnre](https://github.com/rmnre)) - - Update aries-askar patch version to at least 0.2.4 as 0.2.3 does not include backward compatibility [\#1603](https://github.com/hyperledger/aries-cloudagent-python/pull/1603) ([acuderman](https://github.com/acuderman)) - - Fixes for credential details in issue-credential webhook responses [\#1668](https://github.com/hyperledger/aries-cloudagent-python/pull/1668) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: present-proof v2 send-proposal [issue\#1474](https://github.com/hyperledger/aries-cloudagent-python/issues/1474) [\#1667](https://github.com/hyperledger/aries-cloudagent-python/pull/1667) ([shaangill025](https://github.com/shaangill025)) + - Fix: Present Proof v2 - check_proof_vs_proposal update to support proof request with restrictions [\#1820](https://github.com/hyperledger/aries-cloudagent-python/pull/1820) ([shaangill025](https://github.com/shaangill025)) + - Fix: present-proof v1 send-proposal flow [\#1811](https://github.com/hyperledger/aries-cloudagent-python/pull/1811) ([shaangill025](https://github.com/shaangill025)) + - Prover - verification outcome from presentation ack message [\#1757](https://github.com/hyperledger/aries-cloudagent-python/pull/1757) ([shaangill025](https://github.com/shaangill025)) + - feat: support connectionless exchange [\#1710](https://github.com/hyperledger/aries-cloudagent-python/pull/1710) ([TimoGlastra](https://github.com/TimoGlastra)) + - Fix: DIF proof proposal when creating bound presentation request \[Issue\#1687\] [\#1690](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) + - Fix DIF PresExch and OOB request_attach delete unused connection [\#1676](https://github.com/hyperledger/aries-cloudagent-python/pull/1676) ([shaangill025](https://github.com/shaangill025)) + - Fix DIFPresFormatHandler returning invalid V20PresExRecord on presentation verification [\#1645](https://github.com/hyperledger/aries-cloudagent-python/pull/1645) ([rmnre](https://github.com/rmnre)) + - Update aries-askar patch version to at least 0.2.4 as 0.2.3 does not include backward compatibility [\#1603](https://github.com/hyperledger/aries-cloudagent-python/pull/1603) ([acuderman](https://github.com/acuderman)) + - Fixes for credential details in issue-credential webhook responses [\#1668](https://github.com/hyperledger/aries-cloudagent-python/pull/1668) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: present-proof v2 send-proposal [issue\#1474](https://github.com/hyperledger/aries-cloudagent-python/issues/1474) [\#1667](https://github.com/hyperledger/aries-cloudagent-python/pull/1667) ([shaangill025](https://github.com/shaangill025)) - Fixes Issue 3b from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): V2 Credential exchange ignores the auto-respond-credential-request - - Revert change to send_credential_ack return value [\#1660](https://github.com/hyperledger/aries-cloudagent-python/pull/1660) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix usage of send_credential_ack [\#1653](https://github.com/hyperledger/aries-cloudagent-python/pull/1653) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Replace blank credential/presentation exchange states with abandoned state [\#1605](https://github.com/hyperledger/aries-cloudagent-python/pull/1605) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Revert change to send_credential_ack return value [\#1660](https://github.com/hyperledger/aries-cloudagent-python/pull/1660) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix usage of send_credential_ack [\#1653](https://github.com/hyperledger/aries-cloudagent-python/pull/1653) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Replace blank credential/presentation exchange states with abandoned state [\#1605](https://github.com/hyperledger/aries-cloudagent-python/pull/1605) ([andrewwhitehead](https://github.com/andrewwhitehead)) - Fixes Issue 4 from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): Wallet type askar has issues when receiving V1 credentials - - Fixes and cleanups for issue-credential 1.0 [\#1619](https://github.com/hyperledger/aries-cloudagent-python/pull/1619) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: Duplicated schema and cred_def - Askar and Postgres [\#1800](https://github.com/hyperledger/aries-cloudagent-python/pull/1800) ([shaangill025](https://github.com/shaangill025)) + - Fixes and cleanups for issue-credential 1.0 [\#1619](https://github.com/hyperledger/aries-cloudagent-python/pull/1619) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: Duplicated schema and cred_def - Askar and Postgres [\#1800](https://github.com/hyperledger/aries-cloudagent-python/pull/1800) ([shaangill025](https://github.com/shaangill025)) - Mediator updates and fixes - - feat: allow querying default mediator from base wallet [\#1729](https://github.com/hyperledger/aries-cloudagent-python/pull/1729) ([dbluhm](https://github.com/dbluhm)) - - Added async with for mediator record delete [\#1749](https://github.com/hyperledger/aries-cloudagent-python/pull/1749) ([dejsenlitro](https://github.com/dejsenlitro)) + - feat: allow querying default mediator from base wallet [\#1729](https://github.com/hyperledger/aries-cloudagent-python/pull/1729) ([dbluhm](https://github.com/dbluhm)) + - Added async with for mediator record delete [\#1749](https://github.com/hyperledger/aries-cloudagent-python/pull/1749) ([dejsenlitro](https://github.com/dejsenlitro)) - Multitenacy updates and fixes - - feat: create new JWT tokens and invalidate older for multitenancy [\#1725](https://github.com/hyperledger/aries-cloudagent-python/pull/1725) ([TimoGlastra](https://github.com/TimoGlastra)) - - Multi-tenancy stale wallet clean up [\#1692](https://github.com/hyperledger/aries-cloudagent-python/pull/1692) ([dbluhm](https://github.com/dbluhm)) + - feat: create new JWT tokens and invalidate older for multitenancy [\#1725](https://github.com/hyperledger/aries-cloudagent-python/pull/1725) ([TimoGlastra](https://github.com/TimoGlastra)) + - Multi-tenancy stale wallet clean up [\#1692](https://github.com/hyperledger/aries-cloudagent-python/pull/1692) ([dbluhm](https://github.com/dbluhm)) - Dependencies and internal code updates/fixes - - Update pyjwt to 2.4 [\#1829](https://github.com/hyperledger/aries-cloudagent-python/pull/1829) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix external Outbound Transport loading code [\#1812](https://github.com/hyperledger/aries-cloudagent-python/pull/1812) ([frostyfrog](https://github.com/frostyfrog)) - - Fix iteration over key list, update Askar to 0.2.5 [\#1740](https://github.com/hyperledger/aries-cloudagent-python/pull/1740) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: update IndyLedgerRequestsExecutor logic - multitenancy and basic base wallet type [\#1700](https://github.com/hyperledger/aries-cloudagent-python/pull/1700) ([shaangill025](https://github.com/shaangill025)) - - Move database operations inside the session context [\#1633](https://github.com/hyperledger/aries-cloudagent-python/pull/1633) ([acuderman](https://github.com/acuderman)) - - Upgrade ConfigArgParse to version 1.5.3 [\#1627](https://github.com/hyperledger/aries-cloudagent-python/pull/1627) ([WadeBarnes](https://github.com/WadeBarnes)) - - Update aiohttp dependency [\#1606](https://github.com/hyperledger/aries-cloudagent-python/pull/1606) ([acuderman](https://github.com/acuderman)) - - did-exchange implicit request pthid update & invitation key verification [\#1599](https://github.com/hyperledger/aries-cloudagent-python/pull/1599) ([shaangill025](https://github.com/shaangill025)) - - Fix auto connection response not being properly mediated [\#1638](https://github.com/hyperledger/aries-cloudagent-python/pull/1638) ([dbluhm](https://github.com/dbluhm)) - - platform target in run tests. [\#1697](https://github.com/hyperledger/aries-cloudagent-python/pull/1697) ([burdettadam](https://github.com/burdettadam)) - - Add an integration test for mixed proof with a revocable cred and a n… [\#1672](https://github.com/hyperledger/aries-cloudagent-python/pull/1672) ([ianco](https://github.com/ianco)) - - Fix: Inbound Transport is_external attribute [\#1802](https://github.com/hyperledger/aries-cloudagent-python/pull/1802) ([shaangill025](https://github.com/shaangill025)) - - fix: add a close statement to ensure session is closed on error [\#1777](https://github.com/hyperledger/aries-cloudagent-python/pull/1777) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) - - Adds `transport_id` variable assignment back to outbound enqueue method [\#1776](https://github.com/hyperledger/aries-cloudagent-python/pull/1776) ([amanji](https://github.com/amanji)) - - Replace async workaround within document loader [\#1774](https://github.com/hyperledger/aries-cloudagent-python/pull/1774) ([frostyfrog](https://github.com/frostyfrog)) + - Update pyjwt to 2.4 [\#1829](https://github.com/hyperledger/aries-cloudagent-python/pull/1829) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix external Outbound Transport loading code [\#1812](https://github.com/hyperledger/aries-cloudagent-python/pull/1812) ([frostyfrog](https://github.com/frostyfrog)) + - Fix iteration over key list, update Askar to 0.2.5 [\#1740](https://github.com/hyperledger/aries-cloudagent-python/pull/1740) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: update IndyLedgerRequestsExecutor logic - multitenancy and basic base wallet type [\#1700](https://github.com/hyperledger/aries-cloudagent-python/pull/1700) ([shaangill025](https://github.com/shaangill025)) + - Move database operations inside the session context [\#1633](https://github.com/hyperledger/aries-cloudagent-python/pull/1633) ([acuderman](https://github.com/acuderman)) + - Upgrade ConfigArgParse to version 1.5.3 [\#1627](https://github.com/hyperledger/aries-cloudagent-python/pull/1627) ([WadeBarnes](https://github.com/WadeBarnes)) + - Update aiohttp dependency [\#1606](https://github.com/hyperledger/aries-cloudagent-python/pull/1606) ([acuderman](https://github.com/acuderman)) + - did-exchange implicit request pthid update & invitation key verification [\#1599](https://github.com/hyperledger/aries-cloudagent-python/pull/1599) ([shaangill025](https://github.com/shaangill025)) + - Fix auto connection response not being properly mediated [\#1638](https://github.com/hyperledger/aries-cloudagent-python/pull/1638) ([dbluhm](https://github.com/dbluhm)) + - platform target in run tests. [\#1697](https://github.com/hyperledger/aries-cloudagent-python/pull/1697) ([burdettadam](https://github.com/burdettadam)) + - Add an integration test for mixed proof with a revocable cred and a n… [\#1672](https://github.com/hyperledger/aries-cloudagent-python/pull/1672) ([ianco](https://github.com/ianco)) + - Fix: Inbound Transport is_external attribute [\#1802](https://github.com/hyperledger/aries-cloudagent-python/pull/1802) ([shaangill025](https://github.com/shaangill025)) + - fix: add a close statement to ensure session is closed on error [\#1777](https://github.com/hyperledger/aries-cloudagent-python/pull/1777) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) + - Adds `transport_id` variable assignment back to outbound enqueue method [\#1776](https://github.com/hyperledger/aries-cloudagent-python/pull/1776) ([amanji](https://github.com/amanji)) + - Replace async workaround within document loader [\#1774](https://github.com/hyperledger/aries-cloudagent-python/pull/1774) ([frostyfrog](https://github.com/frostyfrog)) - Documentation and Demo Updates - - Use default wallet type askar for alice/faber demo and bdd tests [\#1761](https://github.com/hyperledger/aries-cloudagent-python/pull/1761) ([ianco](https://github.com/ianco)) - - Update the Supported RFCs document for 0.7.4 release [\#1846](https://github.com/hyperledger/aries-cloudagent-python/pull/1846) ([swcurran](https://github.com/swcurran)) - - Fix a typo in DevReadMe.md [\#1844](https://github.com/hyperledger/aries-cloudagent-python/pull/1844) ([feknall](https://github.com/feknall)) - - Add troubleshooting document, include initial examples - ledger connection, out-of-sync RevReg [\#1818](https://github.com/hyperledger/aries-cloudagent-python/pull/1818) ([swcurran](https://github.com/swcurran)) - - Update POST /present-proof/send-request to POST /present-proof-2.0/send-request [\#1824](https://github.com/hyperledger/aries-cloudagent-python/pull/1824) ([lineko](https://github.com/lineko)) - - Fetch from --genesis-url likely to fail in composed container [\#1746](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([tdiesler](https://github.com/tdiesler)) - - Fixes logic for web hook formatter in Faber demo [\#1739](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([amanji](https://github.com/amanji)) - - Multitenancy Docs Update [\#1706](https://github.com/hyperledger/aries-cloudagent-python/pull/1706) ([MonolithicMonk](https://github.com/MonolithicMonk)) - - [\#1674](https://github.com/hyperledger/aries-cloudagent-python/issue/1674) Add basic DOCKER_ENV logging for run_demo [\#1675](https://github.com/hyperledger/aries-cloudagent-python/pull/1675) ([tdiesler](https://github.com/tdiesler)) - - Performance demo updates [\#1647](https://github.com/hyperledger/aries-cloudagent-python/pull/1647) ([ianco](https://github.com/ianco)) - - docs: supported features attribution [\#1654](https://github.com/hyperledger/aries-cloudagent-python/pull/1654) ([TimoGlastra](https://github.com/TimoGlastra)) - - Documentation on existing language wrappers for aca-py [\#1738](https://github.com/hyperledger/aries-cloudagent-python/pull/1738) ([etschelp](https://github.com/etschelp)) - - Document impact of multi-ledger on TAA acceptance [\#1778](https://github.com/hyperledger/aries-cloudagent-python/pull/1778) ([ianco](https://github.com/ianco)) + - Use default wallet type askar for alice/faber demo and bdd tests [\#1761](https://github.com/hyperledger/aries-cloudagent-python/pull/1761) ([ianco](https://github.com/ianco)) + - Update the Supported RFCs document for 0.7.4 release [\#1846](https://github.com/hyperledger/aries-cloudagent-python/pull/1846) ([swcurran](https://github.com/swcurran)) + - Fix a typo in DevReadMe.md [\#1844](https://github.com/hyperledger/aries-cloudagent-python/pull/1844) ([feknall](https://github.com/feknall)) + - Add troubleshooting document, include initial examples - ledger connection, out-of-sync RevReg [\#1818](https://github.com/hyperledger/aries-cloudagent-python/pull/1818) ([swcurran](https://github.com/swcurran)) + - Update POST /present-proof/send-request to POST /present-proof-2.0/send-request [\#1824](https://github.com/hyperledger/aries-cloudagent-python/pull/1824) ([lineko](https://github.com/lineko)) + - Fetch from --genesis-url likely to fail in composed container [\#1746](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([tdiesler](https://github.com/tdiesler)) + - Fixes logic for web hook formatter in Faber demo [\#1739](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([amanji](https://github.com/amanji)) + - Multitenancy Docs Update [\#1706](https://github.com/hyperledger/aries-cloudagent-python/pull/1706) ([MonolithicMonk](https://github.com/MonolithicMonk)) + - [\#1674](https://github.com/hyperledger/aries-cloudagent-python/issue/1674) Add basic DOCKER_ENV logging for run_demo [\#1675](https://github.com/hyperledger/aries-cloudagent-python/pull/1675) ([tdiesler](https://github.com/tdiesler)) + - Performance demo updates [\#1647](https://github.com/hyperledger/aries-cloudagent-python/pull/1647) ([ianco](https://github.com/ianco)) + - docs: supported features attribution [\#1654](https://github.com/hyperledger/aries-cloudagent-python/pull/1654) ([TimoGlastra](https://github.com/TimoGlastra)) + - Documentation on existing language wrappers for aca-py [\#1738](https://github.com/hyperledger/aries-cloudagent-python/pull/1738) ([etschelp](https://github.com/etschelp)) + - Document impact of multi-ledger on TAA acceptance [\#1778](https://github.com/hyperledger/aries-cloudagent-python/pull/1778) ([ianco](https://github.com/ianco)) - Code management and contributor/developer support updates - - Set prefix for integration test demo agents; some code cleanup [\#1840](https://github.com/hyperledger/aries-cloudagent-python/pull/1840) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Pin markupsafe at version 2.0.1 [\#1642](https://github.com/hyperledger/aries-cloudagent-python/pull/1642) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - style: format with stable black release [\#1615](https://github.com/hyperledger/aries-cloudagent-python/pull/1615) ([TimoGlastra](https://github.com/TimoGlastra)) - - Remove references to play with von [\#1688](https://github.com/hyperledger/aries-cloudagent-python/pull/1688) ([ianco](https://github.com/ianco)) - - Add pre-commit as optional developer tool [\#1671](https://github.com/hyperledger/aries-cloudagent-python/pull/1671) ([dbluhm](https://github.com/dbluhm)) - - run_docker start - pass environment variables [\#1715](https://github.com/hyperledger/aries-cloudagent-python/pull/1715) ([shaangill025](https://github.com/shaangill025)) - - Use local deps only [\#1834](https://github.com/hyperledger/aries-cloudagent-python/pull/1834) ([ryjones](https://github.com/ryjones)) - - Enable pip-audit [\#1831](https://github.com/hyperledger/aries-cloudagent-python/pull/1831) ([ryjones](https://github.com/ryjones)) - - Only run pip-audit on main repo [\#1845](https://github.com/hyperledger/aries-cloudagent-python/pull/1845) ([ryjones](https://github.com/ryjones)) + - Set prefix for integration test demo agents; some code cleanup [\#1840](https://github.com/hyperledger/aries-cloudagent-python/pull/1840) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Pin markupsafe at version 2.0.1 [\#1642](https://github.com/hyperledger/aries-cloudagent-python/pull/1642) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - style: format with stable black release [\#1615](https://github.com/hyperledger/aries-cloudagent-python/pull/1615) ([TimoGlastra](https://github.com/TimoGlastra)) + - Remove references to play with von [\#1688](https://github.com/hyperledger/aries-cloudagent-python/pull/1688) ([ianco](https://github.com/ianco)) + - Add pre-commit as optional developer tool [\#1671](https://github.com/hyperledger/aries-cloudagent-python/pull/1671) ([dbluhm](https://github.com/dbluhm)) + - run_docker start - pass environment variables [\#1715](https://github.com/hyperledger/aries-cloudagent-python/pull/1715) ([shaangill025](https://github.com/shaangill025)) + - Use local deps only [\#1834](https://github.com/hyperledger/aries-cloudagent-python/pull/1834) ([ryjones](https://github.com/ryjones)) + - Enable pip-audit [\#1831](https://github.com/hyperledger/aries-cloudagent-python/pull/1831) ([ryjones](https://github.com/ryjones)) + - Only run pip-audit on main repo [\#1845](https://github.com/hyperledger/aries-cloudagent-python/pull/1845) ([ryjones](https://github.com/ryjones)) - Release management pull requests - - 0.7.4 Release Changelog and version update [\#1849](https://github.com/hyperledger/aries-cloudagent-python/pull/1849) ([swcurran](https://github.com/swcurran)) - - 0.7.4-rc5 changelog, version and ReadTheDocs updates [\#1838](https://github.com/hyperledger/aries-cloudagent-python/pull/1838) ([swcurran](https://github.com/swcurran)) - - Update changelog and version for 0.7.4-rc4 [\#1830](https://github.com/hyperledger/aries-cloudagent-python/pull/1830) ([swcurran](https://github.com/swcurran)) - - Changelog, version and ReadTheDocs updates for 0.7.4-rc3 release [\#1817](https://github.com/hyperledger/aries-cloudagent-python/pull/1817) ([swcurran](https://github.com/swcurran)) - - 0.7.4-rc2 update [\#1771](https://github.com/hyperledger/aries-cloudagent-python/pull/1771) ([swcurran](https://github.com/swcurran)) - - Some ReadTheDocs File updates [\#1770](https://github.com/hyperledger/aries-cloudagent-python/pull/1770) ([swcurran](https://github.com/swcurran)) - - 0.7.4-RC1 Changelog intro paragraph - fix copy/paste error [\#1753](https://github.com/hyperledger/aries-cloudagent-python/pull/1753) ([swcurran](https://github.com/swcurran)) - - Fixing the intro paragraph and heading in the changelog of this 0.7.4RC1 [\#1752](https://github.com/hyperledger/aries-cloudagent-python/pull/1752) ([swcurran](https://github.com/swcurran)) - - Updates to Changelog for 0.7.4. RC1 release [\#1747](https://github.com/hyperledger/aries-cloudagent-python/pull/1747) ([swcurran](https://github.com/swcurran)) - - Prep for adding the 0.7.4-rc0 tag [\#1722](https://github.com/hyperledger/aries-cloudagent-python/pull/1722) ([swcurran](https://github.com/swcurran)) - - Added missed new module -- upgrade -- to the RTD generated docs [\#1593](https://github.com/hyperledger/aries-cloudagent-python/pull/1593) ([swcurran](https://github.com/swcurran)) - - Doh....update the date in the Changelog for 0.7.3 [\#1592](https://github.com/hyperledger/aries-cloudagent-python/pull/1592) ([swcurran](https://github.com/swcurran)) + - 0.7.4 Release Changelog and version update [\#1849](https://github.com/hyperledger/aries-cloudagent-python/pull/1849) ([swcurran](https://github.com/swcurran)) + - 0.7.4-rc5 changelog, version and ReadTheDocs updates [\#1838](https://github.com/hyperledger/aries-cloudagent-python/pull/1838) ([swcurran](https://github.com/swcurran)) + - Update changelog and version for 0.7.4-rc4 [\#1830](https://github.com/hyperledger/aries-cloudagent-python/pull/1830) ([swcurran](https://github.com/swcurran)) + - Changelog, version and ReadTheDocs updates for 0.7.4-rc3 release [\#1817](https://github.com/hyperledger/aries-cloudagent-python/pull/1817) ([swcurran](https://github.com/swcurran)) + - 0.7.4-rc2 update [\#1771](https://github.com/hyperledger/aries-cloudagent-python/pull/1771) ([swcurran](https://github.com/swcurran)) + - Some ReadTheDocs File updates [\#1770](https://github.com/hyperledger/aries-cloudagent-python/pull/1770) ([swcurran](https://github.com/swcurran)) + - 0.7.4-RC1 Changelog intro paragraph - fix copy/paste error [\#1753](https://github.com/hyperledger/aries-cloudagent-python/pull/1753) ([swcurran](https://github.com/swcurran)) + - Fixing the intro paragraph and heading in the changelog of this 0.7.4RC1 [\#1752](https://github.com/hyperledger/aries-cloudagent-python/pull/1752) ([swcurran](https://github.com/swcurran)) + - Updates to Changelog for 0.7.4. RC1 release [\#1747](https://github.com/hyperledger/aries-cloudagent-python/pull/1747) ([swcurran](https://github.com/swcurran)) + - Prep for adding the 0.7.4-rc0 tag [\#1722](https://github.com/hyperledger/aries-cloudagent-python/pull/1722) ([swcurran](https://github.com/swcurran)) + - Added missed new module -- upgrade -- to the RTD generated docs [\#1593](https://github.com/hyperledger/aries-cloudagent-python/pull/1593) ([swcurran](https://github.com/swcurran)) + - Doh....update the date in the Changelog for 0.7.3 [\#1592](https://github.com/hyperledger/aries-cloudagent-python/pull/1592) ([swcurran](https://github.com/swcurran)) ## 0.7.3 @@ -1250,45 +1248,45 @@ release and later, and "as-is" connections made using earlier releases of ACA-Py candidates. A new "Upgrade deployment" capability ([#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557), described below) must be executed to update your deployment to add tags for all existing connections. -The [Supported RFCs document](../../features/SupportedRFCs) has been updated to reflect the addition of the +The [Supported RFCs document](/SupportedRFCs.md) has been updated to reflect the addition of the AIP 2.0 RFCs for which support was added. The following is an annotated list of PRs in the release, including a link to each PR. - **AIP 2.0 Features** - - Discover Features Protocol: v1_0 refactoring and v2_0 implementation [[#1500](https://github.com/hyperledger/aries-cloudagent-python/pull/1500)](https://github.com/hyperledger/aries-cloudagent-python/pull/1500) + - Discover Features Protocol: v1_0 refactoring and v2_0 implementation [[#1500](https://github.com/hyperledger/aries-cloudagent-python/pull/1500)](https://github.com/hyperledger/aries-cloudagent-python/pull/1500) - Updates the Discover Features 1.0 (AIP 1.0) implementation and implements the new 2.0 version. In doing so, adds generalized support for goal codes to ACA-Py. - fix DiscoveryExchangeRecord RECORD_TOPIC typo fix [#1566](https://github.com/hyperledger/aries-cloudagent-python/pull/1566) - - Implement Revocation Notification v1.0 [#1464](https://github.com/hyperledger/aries-cloudagent-python/pull/1464) - - Fix integration tests (revocation notifications) [#1528](https://github.com/hyperledger/aries-cloudagent-python/pull/1528) - - Add Revocation notification support to alice/faber [#1527](https://github.com/hyperledger/aries-cloudagent-python/pull/1527) + - Implement Revocation Notification v1.0 [#1464](https://github.com/hyperledger/aries-cloudagent-python/pull/1464) + - Fix integration tests (revocation notifications) [#1528](https://github.com/hyperledger/aries-cloudagent-python/pull/1528) + - Add Revocation notification support to alice/faber [#1527](https://github.com/hyperledger/aries-cloudagent-python/pull/1527) - **Other New Features** - - Multiple Indy Ledger support and State Proof verification [#1425](https://github.com/hyperledger/aries-cloudagent-python/pull/1425) + - Multiple Indy Ledger support and State Proof verification [#1425](https://github.com/hyperledger/aries-cloudagent-python/pull/1425) - Remove required dependencies from multi-ledger code that was requiring the import of Aries Askar even when not being used[#1550](https://github.com/hyperledger/aries-cloudagent-python/pull/1550) - Fixed IndyDID resolver bug after Tag 0.7.3rc0 created [#1569](https://github.com/hyperledger/aries-cloudagent-python/pull/1569) - Typo vdr service name [#1563](https://github.com/hyperledger/aries-cloudagent-python/pull/1563) - Fixes and cleanup for multiple ledger support with Askar [#1583](https://github.com/hyperledger/aries-cloudagent-python/pull/1583) - - Outbound Queue - more usability improvements [#1501](https://github.com/hyperledger/aries-cloudagent-python/pull/1501) - - Display QR code when generating/displaying invites on startup [#1526](https://github.com/hyperledger/aries-cloudagent-python/pull/1526) - - Enable WS Pings for WS Inbound Transport [#1530](https://github.com/hyperledger/aries-cloudagent-python/pull/1530) + - Outbound Queue - more usability improvements [#1501](https://github.com/hyperledger/aries-cloudagent-python/pull/1501) + - Display QR code when generating/displaying invites on startup [#1526](https://github.com/hyperledger/aries-cloudagent-python/pull/1526) + - Enable WS Pings for WS Inbound Transport [#1530](https://github.com/hyperledger/aries-cloudagent-python/pull/1530) - Faster detection of lost Web Socket connections; implementation verified with an existing mediator. - - Performance Improvement when using connection reuse in OOB and there are many DID connections. ConnRecord tags - their_public_did and invitation_msg_id [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) + - Performance Improvement when using connection reuse in OOB and there are many DID connections. ConnRecord tags - their_public_did and invitation_msg_id [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) - In previous releases, a "their_public_did" was not a tag, so to see if you can reuse a connection, all connections were retrieved from the database to see if a matching public DID can be found. Now, connections created after deploying this release will have a tag on the connection such that an indexed query can be used. See "Breaking Change" note above and "Update" feature below. - Follow up to [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) - Adding invitation_msg_id and their_public_did back to record_value [#1553](https://github.com/hyperledger/aries-cloudagent-python/pull/1553) - - A generic "Upgrade Deployment" capability was added to ACA-Py that operates like a database migration capability in relational databases. When executed (via a command line option), a current version of the deployment is detected and if any storage updates need be applied to be consistent with the new version, they are, and the stored "current version"is updated to the new version. An instance of this capability can be used to address the new feature #1543 documented above. [#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557) - - Adds a "credential_revoked" state to the Issue Credential protocol state object. When the protocol state object is retained past the completion of the protocol, it is updated when the credential is revoked. [#1545](https://github.com/hyperledger/aries-cloudagent-python/pull/1545) - - Updated a missing dependency that recently caused an error when using the `--version` command line option [#1589](https://github.com/hyperledger/aries-cloudagent-python/pull/1589) + - A generic "Upgrade Deployment" capability was added to ACA-Py that operates like a database migration capability in relational databases. When executed (via a command line option), a current version of the deployment is detected and if any storage updates need be applied to be consistent with the new version, they are, and the stored "current version"is updated to the new version. An instance of this capability can be used to address the new feature #1543 documented above. [#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557) + - Adds a "credential_revoked" state to the Issue Credential protocol state object. When the protocol state object is retained past the completion of the protocol, it is updated when the credential is revoked. [#1545](https://github.com/hyperledger/aries-cloudagent-python/pull/1545) + - Updated a missing dependency that recently caused an error when using the `--version` command line option [#1589](https://github.com/hyperledger/aries-cloudagent-python/pull/1589) - **Critical Fixes** - - Fix connection record response for mobile [#1469](https://github.com/hyperledger/aries-cloudagent-python/pull/1469) + - Fix connection record response for mobile [#1469](https://github.com/hyperledger/aries-cloudagent-python/pull/1469) - **Documentation Additions and Updates** - - added documentation for wallet storage databases [#1523](https://github.com/hyperledger/aries-cloudagent-python/pull/1523) - - added logging documentation [#1519](https://github.com/hyperledger/aries-cloudagent-python/pull/1519) - - Fix warnings when generating ReadTheDocs [#1509](https://github.com/hyperledger/aries-cloudagent-python/pull/1509) - - Remove Streetcred references [#1504](https://github.com/hyperledger/aries-cloudagent-python/pull/1504) - - Add RTD configs to get generator working [#1496](https://github.com/hyperledger/aries-cloudagent-python/pull/1496) - - The Alice/Faber demo was updated to allow connections based on Public DIDs to be established, including reusing a connection if there is an existing connection. [#1574](https://github.com/hyperledger/aries-cloudagent-python/pull/1574) + - added documentation for wallet storage databases [#1523](https://github.com/hyperledger/aries-cloudagent-python/pull/1523) + - added logging documentation [#1519](https://github.com/hyperledger/aries-cloudagent-python/pull/1519) + - Fix warnings when generating ReadTheDocs [#1509](https://github.com/hyperledger/aries-cloudagent-python/pull/1509) + - Remove Streetcred references [#1504](https://github.com/hyperledger/aries-cloudagent-python/pull/1504) + - Add RTD configs to get generator working [#1496](https://github.com/hyperledger/aries-cloudagent-python/pull/1496) + - The Alice/Faber demo was updated to allow connections based on Public DIDs to be established, including reusing a connection if there is an existing connection. [#1574](https://github.com/hyperledger/aries-cloudagent-python/pull/1574) - **Other Fixes** - - Connection Handling / Out of Band Invitations Fixes + - Connection Handling / Out of Band Invitations Fixes - OOB: Fixes issues with multiple public explicit invitation and unused 0160 connection [#1525](https://github.com/hyperledger/aries-cloudagent-python/pull/1525) - OOB added webhooks to notify the controller when a connection reuse message is used in response to an invitation [#1581](https://github.com/hyperledger/aries-cloudagent-python/pull/1581) - Delete unused ConnRecord generated - OOB invitation (use_exising_connection) [#1521](https://github.com/hyperledger/aries-cloudagent-python/pull/1521) @@ -1298,25 +1296,25 @@ The following is an annotated list of PRs in the release, including a link to ea - fix: use invitation key for connection query [#1570](https://github.com/hyperledger/aries-cloudagent-python/pull/1570) - Fix the inconsistency of invitation_msg_id between invitation and response [#1564](https://github.com/hyperledger/aries-cloudagent-python/pull/1564) - chore: update pydid to ^0.3.3 [#1562](https://github.com/hyperledger/aries-cloudagent-python/pull/1562) - - DIF Presentation Exchange Cleanups + - DIF Presentation Exchange Cleanups - Fix DIF Presentation Request Input Validation [#1517](https://github.com/hyperledger/aries-cloudagent-python/pull/1517) - Some validation checking of a DIF presentation request to prevent uncaught errors later in the process. - DIF PresExch - ProblemReport and "is_holder" [#1493](https://github.com/hyperledger/aries-cloudagent-python/pull/1493) - Cleanups related to when "is_holder" is or is not required. Related to [Issue #1486](https://github.com/hyperledger/aries-cloudagent-python/issues/1486) - - Indy SDK Related Fixes + - Indy SDK Related Fixes - Fix AttributeError when writing an Indy Cred Def record [#1516](https://github.com/hyperledger/aries-cloudagent-python/pull/1516) - Fix TypeError when calling credential_definitions_fix_cred_def_wallet… [#1515](https://github.com/hyperledger/aries-cloudagent-python/pull/1515) - Fix TypeError when writing a Schema record [#1494](https://github.com/hyperledger/aries-cloudagent-python/pull/1494) - Fix validation for range checks [#1538](https://github.com/hyperledger/aries-cloudagent-python/pull/1538) - Back out some of the validation checking for proof requests with predicates as they were preventing valid proof requests from being processed. - - Aries Askar Related Fixes: + - Aries Askar Related Fixes: - Fix bug when getting credentials on askar-profile [#1510](https://github.com/hyperledger/aries-cloudagent-python/pull/1510) - Fix error when removing a wallet on askar-profile [#1518](https://github.com/hyperledger/aries-cloudagent-python/pull/1518) - Fix error when connection request is received (askar, public invitation) [#1508](https://github.com/hyperledger/aries-cloudagent-python/pull/1508) - Fix error when an error occurs while issuing a revocable credential [#1591](https://github.com/hyperledger/aries-cloudagent-python/pull/1591) - - Docker fixes: + - Docker fixes: - Update docker scripts to use new & improved docker IP detection [#1565](https://github.com/hyperledger/aries-cloudagent-python/pull/1565) - - Release Adminstration: + - Release Adminstration: - Changelog and RTD updates for the pending 0.7.3 release [#1553](https://github.com/hyperledger/aries-cloudagent-python/pull/1553) ## 0.7.2 @@ -1328,61 +1326,61 @@ With usage in the field increasing, we're cleaning up edge cases and issues rela The most significant new feature for users of Indy ledgers is a simplified approach for transaction authors getting their transactions signed by an endorser. Transaction author controllers now do almost nothing other than configuring their instance to use an Endorser, -and ACA-Py takes care of the rest. Documentation of that feature is [here](../../features/Endorser). +and ACA-Py takes care of the rest. Documentation of that feature is [here](Endorser.md). - Improve cloud native deployments/scaling - - unprotect liveness and readiness endpoints [#1416](https://github.com/hyperledger/aries-cloudagent-python/pull/1416) - - Open askar sessions only on demand - Connections [#1424](https://github.com/hyperledger/aries-cloudagent-python/pull/1424) - - Fixed potential deadlocks by opening sessions only on demand (Wallet endpoints) [#1472](https://github.com/hyperledger/aries-cloudagent-python/pull/1472) - - Fixed potential deadlocks by opening sessions only on demand [#1439](https://github.com/hyperledger/aries-cloudagent-python/pull/1439) - - Make mediation invitation parameter idempotent [#1413](https://github.com/hyperledger/aries-cloudagent-python/pull/1413) + - unprotect liveness and readiness endpoints [#1416](https://github.com/hyperledger/aries-cloudagent-python/pull/1416) + - Open askar sessions only on demand - Connections [#1424](https://github.com/hyperledger/aries-cloudagent-python/pull/1424) + - Fixed potential deadlocks by opening sessions only on demand (Wallet endpoints) [#1472](https://github.com/hyperledger/aries-cloudagent-python/pull/1472) + - Fixed potential deadlocks by opening sessions only on demand [#1439](https://github.com/hyperledger/aries-cloudagent-python/pull/1439) + - Make mediation invitation parameter idempotent [#1413](https://github.com/hyperledger/aries-cloudagent-python/pull/1413) - Indy Transaction Endorser Support Added - - Endorser protocol configuration, automation and demo integration [#1422](https://github.com/hyperledger/aries-cloudagent-python/pull/1422) - - Auto connect from author to endorser on startup [#1461](https://github.com/hyperledger/aries-cloudagent-python/pull/1461) - - Startup and shutdown events (prep for endorser updates) [#1459](https://github.com/hyperledger/aries-cloudagent-python/pull/1459) - - Endorser protocol askar fixes [#1450](https://github.com/hyperledger/aries-cloudagent-python/pull/1450) - - Endorser protocol updates - refactor to use event bus [#1448](https://github.com/hyperledger/aries-cloudagent-python/pull/1448) + - Endorser protocol configuration, automation and demo integration [#1422](https://github.com/hyperledger/aries-cloudagent-python/pull/1422) + - Auto connect from author to endorser on startup [#1461](https://github.com/hyperledger/aries-cloudagent-python/pull/1461) + - Startup and shutdown events (prep for endorser updates) [#1459](https://github.com/hyperledger/aries-cloudagent-python/pull/1459) + - Endorser protocol askar fixes [#1450](https://github.com/hyperledger/aries-cloudagent-python/pull/1450) + - Endorser protocol updates - refactor to use event bus [#1448](https://github.com/hyperledger/aries-cloudagent-python/pull/1448) - Indy verifiable credential/presentation fixes and updates - - Update credential and proof mappings to allow negative encoded values [#1475](https://github.com/hyperledger/aries-cloudagent-python/pull/1475) - - Add credential validation to offer issuance step [#1446](https://github.com/hyperledger/aries-cloudagent-python/pull/1446) - - Fix error removing proof req entries by timestamp [#1465](https://github.com/hyperledger/aries-cloudagent-python/pull/1465) - - Fix issue with cred limit on presentation endpoint [#1437](https://github.com/hyperledger/aries-cloudagent-python/pull/1437) - - Add support for custom offers from the proposal [#1426](https://github.com/hyperledger/aries-cloudagent-python/pull/1426) - - Make requested attributes and predicates required on indy proof request [#1411](https://github.com/hyperledger/aries-cloudagent-python/pull/1411) - - Remove connection check on proof verify [#1383](https://github.com/hyperledger/aries-cloudagent-python/pull/1383) + - Update credential and proof mappings to allow negative encoded values [#1475](https://github.com/hyperledger/aries-cloudagent-python/pull/1475) + - Add credential validation to offer issuance step [#1446](https://github.com/hyperledger/aries-cloudagent-python/pull/1446) + - Fix error removing proof req entries by timestamp [#1465](https://github.com/hyperledger/aries-cloudagent-python/pull/1465) + - Fix issue with cred limit on presentation endpoint [#1437](https://github.com/hyperledger/aries-cloudagent-python/pull/1437) + - Add support for custom offers from the proposal [#1426](https://github.com/hyperledger/aries-cloudagent-python/pull/1426) + - Make requested attributes and predicates required on indy proof request [#1411](https://github.com/hyperledger/aries-cloudagent-python/pull/1411) + - Remove connection check on proof verify [#1383](https://github.com/hyperledger/aries-cloudagent-python/pull/1383) - General cleanups and improvements to existing features - - Fixes failing integration test -- JSON-LD context URL not loading because of external issue [#1491](https://github.com/hyperledger/aries-cloudagent-python/pull/1491) - - Update base record time-stamp to standard ISO format [#1453](https://github.com/hyperledger/aries-cloudagent-python/pull/1453) - - Encode DIDComm messages before sent to the queue [#1408](https://github.com/hyperledger/aries-cloudagent-python/pull/1408) - - Add Event bus Metadata [#1429](https://github.com/hyperledger/aries-cloudagent-python/pull/1429) - - Allow base wallet to connect to a mediator after startup [#1463](https://github.com/hyperledger/aries-cloudagent-python/pull/1463) - - Log warning when unsupported problem report code is received [#1409](https://github.com/hyperledger/aries-cloudagent-python/pull/1409) - - feature/inbound-transport-profile [#1407](https://github.com/hyperledger/aries-cloudagent-python/pull/1407) - - Import cleanups [#1393](https://github.com/hyperledger/aries-cloudagent-python/pull/1393) - - Add no-op handler for generic ack message (RFC 0015) [#1390](https://github.com/hyperledger/aries-cloudagent-python/pull/1390) - - Align OutOfBandManager.receive_invitation with other connection managers [#1382](https://github.com/hyperledger/aries-cloudagent-python/pull/1382) + - Fixes failing integration test -- JSON-LD context URL not loading because of external issue [#1491](https://github.com/hyperledger/aries-cloudagent-python/pull/1491) + - Update base record time-stamp to standard ISO format [#1453](https://github.com/hyperledger/aries-cloudagent-python/pull/1453) + - Encode DIDComm messages before sent to the queue [#1408](https://github.com/hyperledger/aries-cloudagent-python/pull/1408) + - Add Event bus Metadata [#1429](https://github.com/hyperledger/aries-cloudagent-python/pull/1429) + - Allow base wallet to connect to a mediator after startup [#1463](https://github.com/hyperledger/aries-cloudagent-python/pull/1463) + - Log warning when unsupported problem report code is received [#1409](https://github.com/hyperledger/aries-cloudagent-python/pull/1409) + - feature/inbound-transport-profile [#1407](https://github.com/hyperledger/aries-cloudagent-python/pull/1407) + - Import cleanups [#1393](https://github.com/hyperledger/aries-cloudagent-python/pull/1393) + - Add no-op handler for generic ack message (RFC 0015) [#1390](https://github.com/hyperledger/aries-cloudagent-python/pull/1390) + - Align OutOfBandManager.receive_invitation with other connection managers [#1382](https://github.com/hyperledger/aries-cloudagent-python/pull/1382) - Bug fixes - - fix: fixes error in use of a default mediator in connections/out of band -- mediation ID was being saved as None instead of the retrieved default mediator value [#1490](https://github.com/hyperledger/aries-cloudagent-python/pull/1490) - - fix: help text for open-mediation flag [#1445](https://github.com/hyperledger/aries-cloudagent-python/pull/1445) - - fix: incorrect return type [#1438](https://github.com/hyperledger/aries-cloudagent-python/pull/1438) - - Add missing param to ws protocol [#1442](https://github.com/hyperledger/aries-cloudagent-python/pull/1442) - - fix: create static doc use empty endpoint if None [#1483](https://github.com/hyperledger/aries-cloudagent-python/pull/1483) - - fix: use named tuple instead of dataclass in mediation invite store [#1476](https://github.com/hyperledger/aries-cloudagent-python/pull/1476) - - When fetching the admin config, don't overwrite webhook settings [#1420](https://github.com/hyperledger/aries-cloudagent-python/pull/1420) - - fix: return type of inject [#1392](https://github.com/hyperledger/aries-cloudagent-python/pull/1392) - - fix: typo in connection static result schema [#1389](https://github.com/hyperledger/aries-cloudagent-python/pull/1389) - - fix: don't require push on outbound queue implementations [#1387](https://github.com/hyperledger/aries-cloudagent-python/pull/1387) + - fix: fixes error in use of a default mediator in connections/out of band -- mediation ID was being saved as None instead of the retrieved default mediator value [#1490](https://github.com/hyperledger/aries-cloudagent-python/pull/1490) + - fix: help text for open-mediation flag [#1445](https://github.com/hyperledger/aries-cloudagent-python/pull/1445) + - fix: incorrect return type [#1438](https://github.com/hyperledger/aries-cloudagent-python/pull/1438) + - Add missing param to ws protocol [#1442](https://github.com/hyperledger/aries-cloudagent-python/pull/1442) + - fix: create static doc use empty endpoint if None [#1483](https://github.com/hyperledger/aries-cloudagent-python/pull/1483) + - fix: use named tuple instead of dataclass in mediation invite store [#1476](https://github.com/hyperledger/aries-cloudagent-python/pull/1476) + - When fetching the admin config, don't overwrite webhook settings [#1420](https://github.com/hyperledger/aries-cloudagent-python/pull/1420) + - fix: return type of inject [#1392](https://github.com/hyperledger/aries-cloudagent-python/pull/1392) + - fix: typo in connection static result schema [#1389](https://github.com/hyperledger/aries-cloudagent-python/pull/1389) + - fix: don't require push on outbound queue implementations [#1387](https://github.com/hyperledger/aries-cloudagent-python/pull/1387) - Updates/Fixes to the Alice/Faber demo and integration tests - - Clarify instructions in the Acme Controller Demo [#1484](https://github.com/hyperledger/aries-cloudagent-python/pull/1484) - - Fix aip 20 behaviour and other cleanup [#1406](https://github.com/hyperledger/aries-cloudagent-python/pull/1406) - - Fix issue with startup sequence for faber agent [#1415](https://github.com/hyperledger/aries-cloudagent-python/pull/1415) - - Connectionless proof demo [#1395](https://github.com/hyperledger/aries-cloudagent-python/pull/1395) - - Typos in the demo's README.md [#1405](https://github.com/hyperledger/aries-cloudagent-python/pull/1405) - - Run integration tests using external ledger and tails server [#1400](https://github.com/hyperledger/aries-cloudagent-python/pull/1400) + - Clarify instructions in the Acme Controller Demo [#1484](https://github.com/hyperledger/aries-cloudagent-python/pull/1484) + - Fix aip 20 behaviour and other cleanup [#1406](https://github.com/hyperledger/aries-cloudagent-python/pull/1406) + - Fix issue with startup sequence for faber agent [#1415](https://github.com/hyperledger/aries-cloudagent-python/pull/1415) + - Connectionless proof demo [#1395](https://github.com/hyperledger/aries-cloudagent-python/pull/1395) + - Typos in the demo's README.md [#1405](https://github.com/hyperledger/aries-cloudagent-python/pull/1405) + - Run integration tests using external ledger and tails server [#1400](https://github.com/hyperledger/aries-cloudagent-python/pull/1400) - Chores - - Update CONTRIBUTING.md [#1428](https://github.com/hyperledger/aries-cloudagent-python/pull/1428) - - Update to ReadMe and Supported RFCs for 0.7.2 [#1489](https://github.com/hyperledger/aries-cloudagent-python/pull/1489) - - Updating the RTDs code for Release 0.7.2 - Try 2 [#1488](https://github.com/hyperledger/aries-cloudagent-python/pull/1488) + - Update CONTRIBUTING.md [#1428](https://github.com/hyperledger/aries-cloudagent-python/pull/1428) + - Update to ReadMe and Supported RFCs for 0.7.2 [#1489](https://github.com/hyperledger/aries-cloudagent-python/pull/1489) + - Updating the RTDs code for Release 0.7.2 - Try 2 [#1488](https://github.com/hyperledger/aries-cloudagent-python/pull/1488) ## 0.7.1 @@ -1392,8 +1390,8 @@ A relatively minor maintenance release to address issues found since the 0.7.0 R Includes some cleanups of JSON-LD Verifiable Credentials and Verifiable Presentations - W3C Verifiable Credential cleanups - - Timezone inclusion [ISO 8601] for W3C VC and Proofs ([#1373](https://github.com/hyperledger/aries-cloudagent-python/pull/1373)) - - W3C VC handling where attachment is JSON and not Base64 encoded ([#1352](https://github.com/hyperledger/aries-cloudagent-python/pull/1352)) + - Timezone inclusion [ISO 8601] for W3C VC and Proofs ([#1373](https://github.com/hyperledger/aries-cloudagent-python/pull/1373)) + - W3C VC handling where attachment is JSON and not Base64 encoded ([#1352](https://github.com/hyperledger/aries-cloudagent-python/pull/1352)) - Refactor outbound queue interface ([#1348](https://github.com/hyperledger/aries-cloudagent-python/pull/1348)) - Command line parameter handling for arbitrary plugins ([#1347](https://github.com/hyperledger/aries-cloudagent-python/pull/1347)) - Add an optional parameter '--ledger-socks-proxy' ([#1342](https://github.com/hyperledger/aries-cloudagent-python/pull/1342)) @@ -1406,11 +1404,11 @@ Includes some cleanups of JSON-LD Verifiable Credentials and Verifiable Presenta [#1366](https://github.com/hyperledger/aries-cloudagent-python/pull/1366), [#1371](https://github.com/hyperledger/aries-cloudagent-python/pull/1371)) - Add `inject_or` method to dynamic injection framework to resolve typing ambiguity ([#1376](https://github.com/hyperledger/aries-cloudagent-python/pull/1376)) - Other fixes: - - Indy Proof processing fix, error not raised in predicate timestamp check ([#1364](https://github.com/hyperledger/aries-cloudagent-python/pull/1364)) - - Problem Report handler for connection specific problems ([#1356](https://github.com/hyperledger/aries-cloudagent-python/pull/1356)) - - fix: error on deserializing conn record with protocol ([#1325](https://github.com/hyperledger/aries-cloudagent-python/pull/1325)) - - fix: failure to verify jsonld on non-conformant doc but vaild vmethod ([#1301](https://github.com/hyperledger/aries-cloudagent-python/pull/1301)) - - fix: allow underscore in endpoints ([#1378](https://github.com/hyperledger/aries-cloudagent-python/pull/1378)) + - Indy Proof processing fix, error not raised in predicate timestamp check ([#1364](https://github.com/hyperledger/aries-cloudagent-python/pull/1364)) + - Problem Report handler for connection specific problems ([#1356](https://github.com/hyperledger/aries-cloudagent-python/pull/1356)) + - fix: error on deserializing conn record with protocol ([#1325](https://github.com/hyperledger/aries-cloudagent-python/pull/1325)) + - fix: failure to verify jsonld on non-conformant doc but vaild vmethod ([#1301](https://github.com/hyperledger/aries-cloudagent-python/pull/1301)) + - fix: allow underscore in endpoints ([#1378](https://github.com/hyperledger/aries-cloudagent-python/pull/1378)) ## 0.7.0 @@ -1441,11 +1439,11 @@ This is a significant release of ACA-Py with several new features, as well as ch #### Mediator support -While ACA-Py had previous support for a basic routing protocol, this was never fully developed or used in practice. Starting with this release, inbound and outbound connections can be established through a mediator agent using the Aries (Mediator Coordination Protocol)[https://github.com/hyperledger/aries-rfcs/tree/master/features/0211-route-coordination]. This work was initially contributed by Adam Burdett and Daniel Bluhm of [Indicio](https://indicio.tech/) on behalf of [SICPA](https://sicpa.com/). [Read more about mediation support](../../features/Mediation). +While ACA-Py had previous support for a basic routing protocol, this was never fully developed or used in practice. Starting with this release, inbound and outbound connections can be established through a mediator agent using the Aries (Mediator Coordination Protocol)[https://github.com/hyperledger/aries-rfcs/tree/master/features/0211-route-coordination]. This work was initially contributed by Adam Burdett and Daniel Bluhm of [Indicio](https://indicio.tech/) on behalf of [SICPA](https://sicpa.com/). [Read more about mediation support](./Mediation.md). #### Multi-Tenancy support -Started by [BMW](https://bmw.com/) and completed by [Animo Solutions](https://animo.id/) and [Anon Solutions](https://anon-solutions.ca/) on behalf of [SICPA](https://sicpa.com/), this feature allows for a single ACA-Py instance to host multiple wallet instances. This can greatly reduce the resources required when many identities are being handled. [Read more about multi-tenancy support](../../features/Multitenancy). +Started by [BMW](https://bmw.com/) and completed by [Animo Solutions](https://animo.id/) and [Anon Solutions](https://anon-solutions.ca/) on behalf of [SICPA](https://sicpa.com/), this feature allows for a single ACA-Py instance to host multiple wallet instances. This can greatly reduce the resources required when many identities are being handled. [Read more about multi-tenancy support](./Multitenancy.md). #### New connection protocol(s) diff --git a/docs/release/acapy-README.md b/docs/release/acapy-README.md index 37624496..ddd5e475 100644 --- a/docs/release/acapy-README.md +++ b/docs/release/acapy-README.md @@ -8,35 +8,42 @@ > An easy to use Aries agent for building SSI services using any language that supports sending/receiving HTTP requests. Full access to an organized set of all of the ACA-Py documents is available at [https://aca-py.org](https://aca-py.org). -Check it out! It's much easier to navigate than finding all the documentation here. +Check it out! It's much easier to navigate than this GitHub repo for reading the documentation. ## Overview Hyperledger Aries Cloud Agent Python (ACA-Py) is a foundation for building Verifiable Credential (VC) ecosystems. It operates in the second and third layers of the [Trust Over IP framework (PDF)](https://trustoverip.org/wp-content/uploads/2020/05/toip_050520_primer.pdf) using [DIDComm messaging](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0005-didcomm) and [Hyperledger Aries](https://www.hyperledger.org/use/aries) protocols. The "cloud" in the name means that ACA-Py runs on servers (cloud, enterprise, IoT devices, and so forth), and is not designed to run on mobile devices. -ACA-Py is built on the Aries concepts and features that make up [Aries Interop Profile (AIP) 1.0](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0302-aries-interop-profile#aries-interop-profile-version-10), and most of the features in [AIP 2.0](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0302-aries-interop-profile#aries-interop-profile-version-20). [ACA-Py’s supported Aries protocols](https://github.com/hyperledger/aries-cloudagent-python/blob/main/SupportedRFCs.md) include, most importantly, protocols for issuing, verifying, and holding verifiable credentials using both [Hyperledger AnonCreds](https://www.hyperledger.org/use/anoncreds) verifiable credential format, and the [W3C Standard Verifiable Credential](https://www.w3.org/TR/vc-data-model/) format using JSON-LD with LD-Signatures and BBS+ Signatures. +ACA-Py is built on the Aries concepts and features that make up [Aries Interop Profile (AIP) 2.0](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0302-aries-interop-profile#aries-interop-profile-version-20). [ACA-Py’s supported Aries protocols](docs/features/SupportedRFCs.md) include, most importantly, protocols for issuing, verifying, and holding verifiable credentials using both [Hyperledger AnonCreds] verifiable credential format, and the [W3C Standard Verifiable Credential Data Model] format using JSON-LD with LD-Signatures and BBS+ Signatures. Coming soon -- issuing and presenting [Hyperledger AnonCreds] verifiable credentials using the [W3C Standard Verifiable Credential Data Model] format. -To use ACA-Py you create a business logic controller that "talks to" ACA-Py (sending HTTP requests and receiving webhook notifications), and ACA-Py handles the Aries and DIDComm functionality. That controller can be built in any language that supports making and receiving HTTP requests; knowledge of Python is not needed. Together, this means you can focus on building VC solutions using familiar web development technologies, instead of having to learn the nuts and bolts of low-level cryptography and Trust over IP-type Aries protocols. +[Hyperledger AnonCreds]: https://www.hyperledger.org/use/anoncreds +[W3C Standard Verifiable Credential Data Model]: https://www.w3.org/TR/vc-data-model/ -This [checklist-style overview document](../../features/SupportedRFCs) provides a full list of the features in ACA-Py. +To use ACA-Py you create a business logic controller that "talks to" an ACA-Py instance (sending HTTP requests and receiving webhook notifications), and ACA-Py handles the Aries and DIDComm protocols and related functionality. Your controller can be built in any language that supports making and receiving HTTP requests; knowledge of Python is not needed. Together, this means you can focus on building VC solutions using familiar web development technologies, instead of having to learn the nuts and bolts of low-level cryptography and Trust over IP-type Aries protocols. + +This [checklist-style overview document](docs/features/SupportedRFCs.md) provides a full list of the features in ACA-Py. The following is a list of some of the core features needed for a production deployment, with a link to detailed information about the capability. ### Multi-Tenant -ACA-Py supports "multi-tenant" scenarios. In these scenarios, one (scalable) instance of ACA-Py uses one database instance, and are together capable of managing separate secure storage (for private keys, DIDs, credentials, etc.) for many different actors. This enables (for example) an "issuer-as-a-service", where an enterprise may have many VC issuers, each with different identifiers, using the same instance of ACA-Py to interact with VC holders as required. Likewise, an ACA-Py instance could be a "cloud wallet" for many holders (e.g. people or organizations) that, for whatever reason, cannot use a mobile device for a wallet. Learn more about multi-tenant deployments [here](../../features/Multitenancy). +ACA-Py supports "multi-tenant" scenarios. In these scenarios, one (scalable) instance of ACA-Py uses one database instance, and are together capable of managing separate secure storage (for private keys, DIDs, credentials, etc.) for many different actors. This enables (for example) an "issuer-as-a-service", where an enterprise may have many VC issuers, each with different identifiers, using the same instance of ACA-Py to interact with VC holders as required. Likewise, an ACA-Py instance could be a "cloud wallet" for many holders (e.g. people or organizations) that, for whatever reason, cannot use a mobile device for a wallet. Learn more about multi-tenant deployments [here](docs/features/Multitenancy.md). ### Mediator Service -Startup options allow the use of an ACA-Py as an Aries [mediator](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0046-mediators-and-relays#summary) using core Aries protocols to coordinate its mediation role. Such an ACA-Py instance receives, stores and forwards messages to Aries agents that (for example) lack an addressable endpoint on the Internet such as a mobile wallet. A live instance of a public mediator based on ACA-Py is available [here](https://indicio-tech.github.io/mediator/) from Indicio Technologies. Learn more about deploying a mediator [here](../../features/Mediation). See the [Aries Mediator Service](https://github.com/hyperledger/aries-mediator-service) for a "best practices" configuration of an Aries mediator. +Startup options allow the use of an ACA-Py as an Aries [mediator](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0046-mediators-and-relays#summary) using core Aries protocols to coordinate its mediation role. Such an ACA-Py instance receives, stores and forwards messages to Aries agents that (for example) lack an addressable endpoint on the Internet such as a mobile wallet. A live instance of a public mediator based on ACA-Py is available [here](https://indicio-tech.github.io/mediator/) from Indicio Technologies. Learn more about deploying a mediator [here](docs/features/Mediation.md). See the [Aries Mediator Service](https://github.com/hyperledger/aries-mediator-service) for a "best practices" configuration of an Aries mediator. ### Indy Transaction Endorsing -ACA-Py supports a Transaction Endorsement protocol, for agents that don't have write access to an Indy ledger. Endorser support is documented [here](../../features/Endorser). +ACA-Py supports a Transaction Endorsement protocol, for agents that don't have write access to an Indy ledger. Endorser support is documented [here](docs/features/Endorser.md). ### Scaled Deployments ACA-Py supports deployments in scaled environments such as in Kubernetes environments where ACA-Py and its storage components can be horizontally scaled as needed to handle the load. +### VC-API Endpoints + +A set of endpoints conforming to the vc-api specification are included to manage w3c credentials and presentations. They are documented [here](docs/features/JsonLdCredentials.md#vc-api) and a postman demo is available [here](docs/features/JsonLdCredentials.md#vc-api). + ## Example Uses The business logic you use with ACA-Py is limited only by your imagination. Possible applications include: @@ -58,7 +65,7 @@ For those new to SSI, Aries and ACA-Py, there are a couple of Linux Foundation e The latter is the most useful for developers wanting to get a solid basis in using ACA-Py and other Aries Frameworks. -Also included here is a much more concise (but less maintained) [Getting Started Guide](../../gettingStarted/README) that will take you from knowing next to nothing about decentralized identity to developing Aries-based business apps and services. You’ll run some Indy apps, ACA-Py apps and developer-oriented demos. The guide has a table of contents so you can skip the parts you already know. +Also included here is a much more concise (but less maintained) [Getting Started Guide](docs/gettingStarted/README.md) that will take you from knowing next to nothing about decentralized identity to developing Aries-based business apps and services. You’ll run an Indy ledger (with no ramp-up time), ACA-Py apps and developer-oriented demos. The guide has a table of contents so you can skip the parts you already know. ### Understanding the Architecture @@ -66,32 +73,35 @@ There is an [architectural deep dive webinar](https://www.youtube.com/watch?v=FX ![drawing](./aca-py_architecture.png) -You can extend Aca-Py using plug-ins, which can be loaded at runtime. Plug-ins are mentioned in the [webinar](https://docs.google.com/presentation/d/1K7qiQkVi4n-lpJ3nUZY27OniUEM0c8HAIk4imCWCx5Q/edit#slide=id.g5d43fe05cc_0_145) and are [described in more detail here](../../features/PlugIns/). +You can extend ACA-Py using plug-ins, which can be loaded at runtime. Plug-ins are mentioned in the [webinar](https://docs.google.com/presentation/d/1K7qiQkVi4n-lpJ3nUZY27OniUEM0c8HAIk4imCWCx5Q/edit#slide=id.g5d43fe05cc_0_145) and are [described in more detail here](docs/features/PlugIns.md). An ever-expanding set of ACA-Py plugins can be found +in the [Aries ACA-Py Plugins repository]. Check them out -- it might have the very plugin you need! + +[Aries ACA-Py Plugins repository]: https://github.com/hyperledger/aries-acapy-plugins ### Installation and Usage -An ["install and go" page for developers](https://github.com/hyperledger/aries-cloudagent-python/blob/main/DevReadMe.md) is available if you are comfortable with Trust over IP and Aries concepts. ACA-Py can be run with Docker without installation (highly recommended), or can be installed [from PyPi](https://pypi.org/project/aries-cloudagent/). In the [/demo directory](/demo) there is a full set of demos for developers to use in getting started, and the [demo read me](../../demo/) is a great starting point for developers to use an "in-browser" approach to run a zero-install example. The [Read the Docs](https://aries-cloud-agent-python.readthedocs.io/en/latest/) overview is also a way to reference the modules and APIs that make up an ACA-Py instance. +Use the ["install and go" page for developers](docs/features/DevReadMe.md) if you are comfortable with Trust over IP and Aries concepts. ACA-Py can be run with Docker without installation (highly recommended), or can be installed [from PyPi](https://pypi.org/project/aries-cloudagent/). In the [/demo directory](demo) there is a full set of demos for developers to use in getting started, and the [demo read me](docs/demo/README.md) is a great starting point for developers to use an "in-browser" approach to run a zero-install example. The [Read the Docs](https://aries-cloud-agent-python.readthedocs.io/en/latest/) overview is also a way to understand the internal modules and APIs that make up an ACA-Py instance. -If you would like to develop on ACA-Py locally note that we use Poetry for dependency management and packaging, if you are unfamiliar with poetry please see our [cheat sheet](/docs/Poetry.md) +If you would like to develop on ACA-Py locally note that we use Poetry for dependency management and packaging, if you are unfamiliar with poetry please see our [cheat sheet](docs/deploying/Poetry.md) ## About the ACA-Py Admin API -The [overview of ACA-Py’s API](https://github.com/hyperledger/aries-cloudagent-python/blob/main/AdminAPI.md) is a great starting place for learning about the ACA-Py API when you are starting to build your own controller. +The [overview of ACA-Py’s API](docs/features/AdminAPI.md) is a great starting place for learning about the ACA-Py API when you are starting to build your own controller. -An ACA-Py instance puts together an OpenAPI-documented REST interface based on the protocols that are loaded. This is used by a controller application (written in any language) to manage the behaviour of the agent. The controller can initiate actions (e.g. issuing a credential) and can respond to agent events (e.g. sending a presentation request after a connection is accepted). Agent events are delivered to the controller as webhooks to a configured URL. +An ACA-Py instance puts together an OpenAPI-documented REST interface based on the protocols that are loaded. This is used by a controller application (written in any language) to manage the behavior of the agent. The controller can initiate actions (e.g. issuing a credential) and can respond to agent events (e.g. sending a presentation request after a connection is accepted). Agent events are delivered to the controller as webhooks to a configured URL. Technical note: the administrative API exposed by the agent for the controller to use must be protected with an API key (using the --admin-api-key command line arg) or deliberately left unsecured using the --admin-insecure-mode command line arg. The latter should not be used other than in development if the API is not otherwise secured. ## Troubleshooting There are a number of resources for getting help with ACA-Py and troubleshooting -any problems you might run into. The [Troubleshooting](../../testing/Troubleshooting) -document contains some guidance about issues that have been experienced in the -past. Feel free to submit PRs to supplement the troubleshooting document! -Searching the [ACA-Py GitHub -issues](https://github.com/hyperledger/aries-cloudagent-python/issues) will -often uncover challenges that others have experienced, often with answers to -solving those challenges. As well, there is the "aries-cloudagent-python" +any problems you might run into. The +[Troubleshooting](docs/testing/Troubleshooting.md) document contains some +guidance about issues that have been experienced in the past. Feel free to +submit PRs to supplement the troubleshooting document! Searching the [ACA-Py +GitHub issues](https://github.com/hyperledger/aries-cloudagent-python/issues) +may uncovers challenges you are having that others have experienced, often +with solutions. As well, there is the "aries-cloudagent-python" channel on the Hyperledger Discord chat server ([invitation here](https://discord.gg/hyperledger)). @@ -101,15 +111,15 @@ The initial implementation of ACA-Py was developed by the Government of British [BC Digital Trust]: https://digital.gov.bc.ca/digital-trust/ -See the [MAINTAINERS.md](/Maintainers.md) file for a list of the current ACA-Py +See the [MAINTAINERS.md](./MAINTAINERS.md) file for a list of the current ACA-Py maintainers, and the guidelines for becoming a Maintainer. We'd love to have you join the team if you are willing and able to carry out the [duties of a -Maintainer](/MAINTAINERS.md#the-duties-of-a-maintainer). +Maintainer](MAINTAINERS.md#the-duties-of-a-maintainer). ## Contributing -Pull requests are welcome! Please read our [contributions guide](https://github.com/hyperledger/aries-cloudagent-python/blob/main/CONTRIBUTING.md) and submit your PRs. We enforce [developer certificate of origin](https://developercertificate.org/) (DCO) commit signing — [guidance](https://github.com/apps/dco) on this is available. We also welcome issues submitted about problems you encounter in using ACA-Py. +Pull requests are welcome! Please read our [contributions guide](CONTRIBUTING.md) and submit your PRs. We enforce [developer certificate of origin](https://developercertificate.org/) (DCO) commit signing — [guidance](https://github.com/apps/dco) on this is available. We also welcome issues submitted about problems you encounter in using ACA-Py. ## License -[Apache License Version 2.0](https://github.com/hyperledger/aries-cloudagent-python/blob/main/LICENSE) +[Apache License Version 2.0](LICENSE) diff --git a/docs/testing/AgentTracing.md b/docs/testing/AgentTracing.md index 819d9af6..2c2dabd2 100644 --- a/docs/testing/AgentTracing.md +++ b/docs/testing/AgentTracing.md @@ -10,7 +10,7 @@ Tracing is configured globally for the agent. The following options can be specified when starting the aca-py agent: -``` +```bash --trace Generate tracing events. --trace-target Target for trace events ("log", "message", or http @@ -31,7 +31,7 @@ The `run_demo` script supports the following parameters and environment variable Environment variables: -``` +```bash TRACE_ENABLED Flag to enable tracing TRACE_TARGET_URL Host:port of endpoint to log trace events (e.g. logstash:9700) @@ -43,7 +43,7 @@ TRACE_TAG Tag to be included in all logged trace events Parameters: -``` +```bash --trace-log Enables tracing to the standard log output (sets TRACE_ENABLED, TRACE_TARGET, TRACE_TAG) @@ -53,7 +53,7 @@ Parameters: When running the Faber controller, tracing can be enabled using the `T` menu option: -``` +```bash Faber | Connected (1) Issue Credential (2) Send Proof Request @@ -85,7 +85,7 @@ When `Exchange Tracing` is `ON`, all exchanges will include tracing. ## Logging Trace Events to an ELK Stack -You can use the `ELK` stack in the [ELK Stack sub-directory](./elk-stack) as a target for trace events, just start the ELK stack using the docker-compose file and then in two separate bash shells, startup the demo as follows: +You can use the `ELK` stack in the [ELK Stack sub-directory](https://github.com/hyperledger/aries-cloudagent-python/blob/main/demo/elk-stack) as a target for trace events, just start the ELK stack using the docker-compose file and then in two separate bash shells, startup the demo as follows: ```bash DOCKER_NET=elknet TRACE_TARGET_URL=logstash:9700 ./run_demo faber --trace-http diff --git a/docs/testing/INTEGRATION-TESTS.md b/docs/testing/INTEGRATION-TESTS.md index dadf204a..b304050d 100644 --- a/docs/testing/INTEGRATION-TESTS.md +++ b/docs/testing/INTEGRATION-TESTS.md @@ -85,7 +85,6 @@ AGENT_PORT_OVERRIDE=8030 ./run_bdd -t (Note that since the test run multiple agents you require up to 60 available ports.) - ## Aca-py Integration Tests vs Aries Agent Test Harness (AATH) Aca-py Behave tests are based on the interoperability tests that are implemented in the [Aries Agent Test Harness (AATH)](https://github.com/hyperledger/aries-agent-test-harness). Both use [Behave (Gherkin)](https://behave.readthedocs.io/en/stable/) to execute tests against a running aca-py agent (or in the case of AATH, against any compatible Aries agent), however the aca-py integration tests focus on aca-py specific features. @@ -111,7 +110,7 @@ Aca-py integration tests use the same configuration approach as AATH, documented In addition to support for external schemas, credential data etc, the aca-py integration tests support configuration of the aca-py agents that are used to run the test. For example: -``` +```behave Scenario Outline: Present Proof where the prover does not propose a presentation of the proof and is acknowledged Given "3" agents | name | role | capabilities | @@ -176,4 +175,3 @@ To run a specific set of Aca-py integration tests (or exclude specific tests): ## Aries Agent Test Harness ACA-Py Tests This [video](https://youtu.be/1dwyEBxQqWI) is a presentation by Aries Cloud Agent Python (ACA-Py) developer @ianco about using the Aries Agent Test Harness for local pre-release testing of ACA-Py. Have a big change that you want to test with other Aries Frameworks? Following this guidance to run AATH tests with your under-development branch of ACA-Py. - diff --git a/docs/testing/Logging.md b/docs/testing/Logging.md index 006b95dc..587657c5 100644 --- a/docs/testing/Logging.md +++ b/docs/testing/Logging.md @@ -1,16 +1,16 @@ # Logging docs -Acapy supports multiple configurations of logging. +ACA_Py supports multiple configurations of logging. ## Log level -Acapy's logging is based on python's [logging lib](https://docs.python.org/3/howto/logging.html). +ACA-Py's logging is based on python's [logging lib](https://docs.python.org/3/howto/logging.html). Log levels `DEBUG`, `INFO` and `WARNING` are available. Other log levels fall back to `WARNING`. ## Per Tenant Logging -Supports writing of log messages to a file with `wallet_id` as the tenant identifier for each. To enable this, both multitenant mode [`--multitenant`] and writing to log file option [`--log-file`] are required. If both `--multitenant` and `--log-file` are not passed when starting up ACA-Py, then it will use `default_logging_config.ini` config [backward compatible] and not log at a per tenant level. +Supports writing of log messages to a file with `wallet_id` as the tenant identifier for each. To enable this, both multitenant mode (`--multitenant`) and writing to log file option (`--log-file`) are required. If both `--multitenant` and `--log-file` are not passed when starting up ACA-Py, then it will use `default_logging_config.ini` config (backward compatible) and not log at a per tenant level. ## Command Line Arguments @@ -60,9 +60,9 @@ Find an example in [default_logging_config.ini](https://github.com/hyperledger/a You can find more detail description in the [logging documentation](https://docs.python.org/3/howto/logging.html#configuring-logging). -For per tenant logging, find an example in [default_per_tenant_logging_config.ini](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/config/default_per_tenant_logging_config.ini), which sets up `TimedRotatingFileMultiProcessHandler` and `StreamHandler` handlers. Custom `TimedRotatingFileMultiProcessHandler` handler supports the ability to cleanup logs by time and maintain backup logs and a custom JSON formatter for logs. The arguments for it such as `file name`, `when`, `interval` and `backupCount` can be passed as `args=('acapy.log', 'd', 7, 1,)` [also shown below]. Note: `backupCount` of 0 will mean all backup log files will be retained and not deleted at all. More details about these attributes can be found [here](https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler) +For per tenant logging, find an example in [default_per_tenant_logging_config.ini](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/config/default_per_tenant_logging_config.ini), which sets up `TimedRotatingFileMultiProcessHandler` and `StreamHandler` handlers. Custom `TimedRotatingFileMultiProcessHandler` handler supports the ability to cleanup logs by time and maintain backup logs and a custom JSON formatter for logs. The arguments for it such as `file name`, `when`, `interval` and `backupCount` can be passed as `args=('acapy.log', 'd', 7, 1,)` (also shown below). Note: `backupCount` of 0 will mean all backup log files will be retained and not deleted at all. More details about these attributes can be found [here](https://docs.python.org/3/library/logging.handlers.html#timedrotatingfilehandler) -``` +```ini [loggers] keys=root @@ -92,9 +92,9 @@ args=('acapy.log', 'd', 7, 1,) format=%(asctime)s %(wallet_id)s %(levelname)s %(pathname)s:%(lineno)d %(message)s ``` -For `DictConfig` [`dict` logging config file], find an example in [default_per_tenant_logging_config.yml](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/config/default_per_tenant_logging_config.yml) with same attributes as `default_per_tenant_logging_config.ini` file. +For `DictConfig` (`dict` logging config file), find an example in [default_per_tenant_logging_config.yml](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/config/default_per_tenant_logging_config.yml) with same attributes as `default_per_tenant_logging_config.ini` file. -``` +```yaml version: 1 formatters: default: diff --git a/docs/testing/Troubleshooting.md b/docs/testing/Troubleshooting.md index 206730a5..cdd3321e 100644 --- a/docs/testing/Troubleshooting.md +++ b/docs/testing/Troubleshooting.md @@ -28,11 +28,13 @@ If that is the cause -- have you started your local ledger, and did it startup p - Any errors in the startup of von-network? - Is the von-network webserver (usually at `https:/localhost:9000`) accessible? If so, can you click on and see the Genesis File? - Do you even need a local ledger? If not, you can use a public sandbox ledger, - such as the [Dev Greenlight ledger](), likely by just prefacing your ACA-Py - command with `LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io`. For example, - when running the Alice-Faber demo in the [demo](../../demo) folder, you can run (for + such as the [BCovrin Test ledger], likely by just prefacing your ACA-Py + command with `LEDGER_URL=http://test.bcovrin.vonx.io`. For example, + when running the Alice-Faber demo in the [demo](../demo/README.md) folder, you can run (for example), the Faber agent using the command: - `LEDGER_URL=http://dev.greenlight.bcovrin.vonx.io ./run_demo faber` + `LEDGER_URL=http://test.bcovrin.vonx.io ./run_demo faber` + +[BCovrin Test ledger]: http://test.bcovrin.vonx.io ### Any Firewalls diff --git a/mkdocs.yml b/mkdocs.yml index 1c6ff200..0e5fd425 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,10 +115,10 @@ nav: - Aries Architecture: gettingStarted/AriesAgentArchitecture.md - Aries Messaging: gettingStarted/AriesMessaging.md - Aries Developer Demos: gettingStarted/AriesDeveloperDemos.md - - TODO Agent Connections: gettingStarted/AgentConnections.md - - TODO Issuing AnonCreds Credentials: gettingStarted/IssuingIndyCredentials.md - - TODO Presenting AnonCreds Proofs: gettingStarted/PresentingIndyProofs.md - - TODO Making Your Own ACA-Py Agent: gettingStarted/YourOwnAriesAgent.md + - Agent Connections: gettingStarted/AgentConnections.md + - Issuing AnonCreds Credentials: gettingStarted/IssuingAnonCredsCredentials.md + - Presenting AnonCreds Proofs: gettingStarted/PresentingAnonCredsProofs.md + - Making Your Own ACA-Py Agent: gettingStarted/YourOwnAriesAgent.md - Aries Developer Options: gettingStarted/IndyAriesDevOptions.md - DIDComm Messaging: gettingStarted/DIDcommMsgs.md - DIDComm Message Routing: gettingStarted/RoutingEncryption.md diff --git a/scripts/copyFixMDs.sh b/scripts/copyFixMDs.sh index 904a880f..419a18a4 100755 --- a/scripts/copyFixMDs.sh +++ b/scripts/copyFixMDs.sh @@ -32,79 +32,79 @@ echo Building pages for ACA-Py Version ${VERSION} rm -rf docs/* # Replace the nav with the one for main -sed '/^nav:/,$d' mkdocs.yml >mkdocs.yml.tmp -cat << EOF >>mkdocs.yml.tmp -nav: -- Welcome!: - - Welcome: README.md - - ACA-Py README: release/acapy-README.md - - Release Notes: release/CHANGELOG.md -- Features: - - Developer Introduction: features/DevReadMe.md - - DevContainer Support: features/devcontainer.md - - Supported Aries Interop Profiles and RFCs: features/SupportedRFCs.md - - The Admin API: features/AdminAPI.md - - ACA-Py Plugins: features/PlugIns.md - - Multitenant ACA-Py: features/Multitenancy.md - - DID Methods: features/DIDMethods.md - - DID Resolution: features/DIDResolution.md - - Configuring Multiple Indy Ledgers: features/Multiledger.md - - Automatically Endorsing Indy Transations: features/Endorser.md - - Using W3C JSON-LD Signed Credentials: features/JsonLdCredentials.md - - Using SD-JWTs: features/SelectiveDisclosureJWTs.md - - AnonCreds Presentation Validation: features/AnoncredsProofValidation.md - - Multiple Credential Types: features/Multicredentials.md - - Code Generation with the Open API: features/UsingOpenAPI.md - - ACA-Py as a DIDComm Mediator: features/Mediation.md -- Demos: - - The Alice-Faber Demo: demo/README.md - - Open API Tutorial: demo/AriesOpenAPIDemo.md - - Alice Gets a Phone: demo/AliceGetsAPhone.md - - Hyperledger Indy Endorser In Action: demo/Endorser.md - - Using W3C JSON-LD Credentials: demo/AliceWantsAJsonCredential.md - - DIY -- ACME Controller Workshop: demo/AcmeDemoWorkshop.md -- Getting Started: - - Becoming an Indy/Aries Developer: gettingStarted/README.md - - Hyperledger Indy Basics: gettingStarted/IndyBasics.md - - Hyperledger Aries Basics: gettingStarted/AriesBasics.md - - Decentralized Identity Demos: gettingStarted/DecentralizedIdentityDemos.md - - Aries - The Big Picture: gettingStarted/AriesBigPicture.md - - Aries Architecture: gettingStarted/AriesAgentArchitecture.md - - Aries Messaging: gettingStarted/AriesMessaging.md - - Aries Developer Demos: gettingStarted/AriesDeveloperDemos.md - - TODO Agent Connections: gettingStarted/AgentConnections.md - - TODO Issuing AnonCreds Credentials: gettingStarted/IssuingIndyCredentials.md - - TODO Presenting AnonCreds Proofs: gettingStarted/PresentingIndyProofs.md - - TODO Making Your Own ACA-Py Agent: gettingStarted/YourOwnAriesAgent.md - - Aries Developer Options: gettingStarted/IndyAriesDevOptions.md - - DIDComm Messaging: gettingStarted/DIDcommMsgs.md - - DIDComm Message Routing: gettingStarted/RoutingEncryption.md - - DIDComm Message Routing Example: gettingStarted/AriesRoutingExample.md - - TODO Connecting to an Indy Network: gettingStarted/ConnectIndyNetwork.md - - AnonCreds Credential Revocation: gettingStarted/CredentialRevocation.md -- Deploying: - - Deployment Model: deploying/deploymentModel.md - - Upgrading ACA-Py: deploying/UpgradingACA-Py.md - - Indy SDK to Askar Migration: deploying/IndySDKtoAskarMigration.md - - The Use of Poetry in ACA-Py: deploying/Poetry.md - - ACA-Py Container Images: deploying/ContainerImagesAndGithubActions.md - - Databases: deploying/Databases.md - - Persistent Queues and Caching: deploying/RedisPlugins.md - - The askar-anoncreds Wallet Type: deploying/AnonCredsWalletType.md -- Testing/Troubleshooting: - - Running and Creating Unit Tests: testing/UnitTests.md - - Managing Logging: testing/Logging.md - - ACA-Py Integration Tests: testing/INTEGRATION-TESTS.md - - Protocol Tracing: testing/AgentTracing.md - - Troubleshooting: testing/Troubleshooting.md -- Contributing: - - How to Contribute: contributing/CONTRIBUTING.md - - Maintainers: contributing/MAINTAINERS.md - - Hyperledger Code of Conduct: contributing/CODE_OF_CONDUCT.md - - Security Vulnerability Reporting: contributing/SECURITY.md - - Publishing an ACA-Py Release: contributing/PUBLISHING.md -EOF -mv mkdocs.yml.tmp mkdocs.yml +# sed '/^nav:/,$d' mkdocs.yml >mkdocs.yml.tmp +# cat << EOF >>mkdocs.yml.tmp +# nav: +# - Welcome!: +# - Welcome: README.md +# - ACA-Py README: release/acapy-README.md +# - Release Notes: release/CHANGELOG.md +# - Features: +# - Developer Introduction: features/DevReadMe.md +# - DevContainer Support: features/devcontainer.md +# - Supported Aries Interop Profiles and RFCs: features/SupportedRFCs.md +# - The Admin API: features/AdminAPI.md +# - ACA-Py Plugins: features/PlugIns.md +# - Multitenant ACA-Py: features/Multitenancy.md +# - DID Methods: features/DIDMethods.md +# - DID Resolution: features/DIDResolution.md +# - Configuring Multiple Indy Ledgers: features/Multiledger.md +# - Automatically Endorsing Indy Transations: features/Endorser.md +# - Using W3C JSON-LD Signed Credentials: features/JsonLdCredentials.md +# - Using SD-JWTs: features/SelectiveDisclosureJWTs.md +# - AnonCreds Presentation Validation: features/AnoncredsProofValidation.md +# - Multiple Credential Types: features/Multicredentials.md +# - Code Generation with the Open API: features/UsingOpenAPI.md +# - ACA-Py as a DIDComm Mediator: features/Mediation.md +# - Demos: +# - The Alice-Faber Demo: demo/README.md +# - Open API Tutorial: demo/AriesOpenAPIDemo.md +# - Alice Gets a Phone: demo/AliceGetsAPhone.md +# - Hyperledger Indy Endorser In Action: demo/Endorser.md +# - Using W3C JSON-LD Credentials: demo/AliceWantsAJsonCredential.md +# - DIY -- ACME Controller Workshop: demo/AcmeDemoWorkshop.md +# - Getting Started: +# - Becoming an Indy/Aries Developer: gettingStarted/README.md +# - Hyperledger Indy Basics: gettingStarted/IndyBasics.md +# - Hyperledger Aries Basics: gettingStarted/AriesBasics.md +# - Decentralized Identity Demos: gettingStarted/DecentralizedIdentityDemos.md +# - Aries - The Big Picture: gettingStarted/AriesBigPicture.md +# - Aries Architecture: gettingStarted/AriesAgentArchitecture.md +# - Aries Messaging: gettingStarted/AriesMessaging.md +# - Aries Developer Demos: gettingStarted/AriesDeveloperDemos.md +# - Agent Connections: gettingStarted/AgentConnections.md +# - Issuing AnonCreds Credentials: gettingStarted/IssuingAnonCredsCredentials.md +# - Presenting AnonCreds Proofs: gettingStarted/PresentingAnonCredsProofs.md +# - Making Your Own ACA-Py Agent: gettingStarted/YourOwnAriesAgent.md +# - Aries Developer Options: gettingStarted/IndyAriesDevOptions.md +# - DIDComm Messaging: gettingStarted/DIDcommMsgs.md +# - DIDComm Message Routing: gettingStarted/RoutingEncryption.md +# - DIDComm Message Routing Example: gettingStarted/AriesRoutingExample.md +# - TODO Connecting to an Indy Network: gettingStarted/ConnectIndyNetwork.md +# - AnonCreds Credential Revocation: gettingStarted/CredentialRevocation.md +# - Deploying: +# - Deployment Model: deploying/deploymentModel.md +# - Upgrading ACA-Py: deploying/UpgradingACA-Py.md +# - Indy SDK to Askar Migration: deploying/IndySDKtoAskarMigration.md +# - The Use of Poetry in ACA-Py: deploying/Poetry.md +# - ACA-Py Container Images: deploying/ContainerImagesAndGithubActions.md +# - Databases: deploying/Databases.md +# - Persistent Queues and Caching: deploying/RedisPlugins.md +# - The askar-anoncreds Wallet Type: deploying/AnonCredsWalletType.md +# - Testing/Troubleshooting: +# - Running and Creating Unit Tests: testing/UnitTests.md +# - Managing Logging: testing/Logging.md +# - ACA-Py Integration Tests: testing/INTEGRATION-TESTS.md +# - Protocol Tracing: testing/AgentTracing.md +# - Troubleshooting: testing/Troubleshooting.md +# - Contributing: +# - How to Contribute: contributing/CONTRIBUTING.md +# - Maintainers: contributing/MAINTAINERS.md +# - Hyperledger Code of Conduct: contributing/CODE_OF_CONDUCT.md +# - Security Vulnerability Reporting: contributing/SECURITY.md +# - Publishing an ACA-Py Release: contributing/PUBLISHING.md +# EOF +# mv mkdocs.yml.tmp mkdocs.yml # Root folder -- README.md # For debugging the "sed" command, you can uncomment the "diff" at the end of the @@ -122,146 +122,150 @@ fi # Release documents FOLDER=docs/release mkdir ${FOLDER} -FILE=README.md; sed -e 's#\./\(SupportedRFCs\).md#../../features/\1#' \ - -e 's#\./\(Multitenancy\).md#../../features/\1#' \ - -e 's#\./\(Mediation\).md#../../features/\1#' \ - -e 's#\(Endorser\).md#../../features/\1#' \ - -e 's#\(Troubleshooting\).md#../../testing/\1#' \ - -e 's#/demo/\(README\).md#../../demo/#' \ - -e 's#/docs/GettingStartedAriesDev/\(README\).md#../../gettingStarted/\1#' \ - -e 's#/docs/GettingStartedAriesDev/\(PlugIns\).md#../../features/\1/#' \ - tmp/${FILE} > ${FOLDER}/acapy-${FILE}; # diff tmp/${FILE} ${FOLDER}/acapy-${FILE} +FILE=README.md; cp tmp/${FILE} ${FOLDER}/acapy-${FILE} +# FILE=README.md; sed -e 's#\./\(SupportedRFCs\).md#../../features/\1#' \ +# -e 's#\./\(Multitenancy\).md#../../features/\1#' \ +# -e 's#\./\(Mediation\).md#../../features/\1#' \ +# -e 's#\(Endorser\).md#../../features/\1#' \ +# -e 's#\(Troubleshooting\).md#../../testing/\1#' \ +# -e 's#/demo/\(README\).md#../../demo/#' \ +# -e 's#/docs/GettingStartedAriesDev/\(README\).md#../../gettingStarted/\1#' \ +# -e 's#/docs/GettingStartedAriesDev/\(PlugIns\).md#../../features/\1/#' \ +# tmp/${FILE} > ${FOLDER}/acapy-${FILE}; # diff tmp/${FILE} ${FOLDER}/acapy-${FILE} cp tmp/aca-py_architecture.png ${FOLDER} # Special handling for ChangeLog -- add a title at the top of the file # echo "# Release Notes" >${FOLDER}/CHANGELOG.md -FILE=CHANGELOG.md; sed -e '1s/^/# Release Notes\n\n/' \ - -e 's#\(Endorser\).md#../../features/\1#g' \ - -e 's#./\(Mediation\).md#../../features/\1#g' \ - -e 's#./\(Multitenancy\).md#../../features/\1#g' \ - -e 's#\/\(SupportedRFCs\).md#../../features/\1#' \ - -e 's#.\/\(UpgradingACA-Py\).md#../../deploying/\1#' \ - -e 's#(victorlee0505)#(https://github.com/victorlee0505)#' \ - -e 's#^ - # - #' \ - tmp/${FILE} >${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +cp tmp/CHANGELOG.md ${FOLDER} +# FILE=CHANGELOG.md; sed -e '1s/^/# Release Notes\n\n/' \ +# -e 's#\(Endorser\).md#../../features/\1#g' \ +# -e 's#./\(Mediation\).md#../../features/\1#g' \ +# -e 's#./\(Multitenancy\).md#../../features/\1#g' \ +# -e 's#\/\(SupportedRFCs\).md#../../features/\1#' \ +# -e 's#.\/\(UpgradingACA-Py\).md#../../deploying/\1#' \ +# -e 's#(victorlee0505)#(https://github.com/victorlee0505)#' \ +# -e 's#^ - # - #' \ +# tmp/${FILE} >${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} + +cp -r tmp/docs/assets tmp/docs/demo tmp/docs/deploying tmp/docs/design tmp/docs/gettingStarted tmp/docs/features tmp/docs/testing docs/ # Assets -FOLDER=docs/assets -mkdir ${FOLDER} -cp tmp/docs/assets/*.png ${FOLDER} +# FOLDER=docs/assets +# mkdir ${FOLDER} +# cp tmp/docs/assets/*.png ${FOLDER} # ACA-Py Features -FOLDER=docs/features -mkdir ${FOLDER} -FILE=DevReadMe.md; sed -e 's#(README.md)#(/README.md)#' \ - -e "s#\(Databases\).md#../../deploying/\1#g" \ - -e "s#\(Logging\).md#../../testing/\1/#g" \ - -e "s#/docs/GettingStartedAriesDev/README.md#../../gettingStarted/#" \ - -e "s#/\(CONTRIBUTING\).md#../../contributing/\1/#" \ - -e "s#/\(CODE_OF_CONDUCT\).md#../../contributing/\1/#" \ - -e "s/#Running/#running/g" \ - -e "s#(/README.md)#(../../release/acapy-README)#" \ - -e "s#/docs/GettingStartedAriesDev/\(AriesDeveloperDemos\).md#../../\1#" \ - -e "s#\(aries_cloudagent/transport\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -FILE=devcontainer.md; sed -e "s#(\(.devcontainer/devcontainer.json\))#(https://github.com/hyperledger/aries-cloudagent-python/blob/main/\1)#" \ - -e "s#(./\(aries_cloudagent\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/main/\1)#" \ - -e "s#(/\(DevReadMe\).md)#(../\1)#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -FILE=SupportedRFCs.md; sed -e "s#./\(IndySDKtoAskarMigration\).md#../../deploying/\1/#g" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -FILE=AdminAPI.md; sed -e "s#/docs/assets/#../../assets/#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -cp tmp/Multitenancy.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/SelectiveDisclosureJWTs.md ${FOLDER} -cp tmp/DIDMethods.md ${FOLDER} -cp tmp/DIDResolution.md ${FOLDER} -cp tmp/Multiledger.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/PlugIns.md ${FOLDER} -cp tmp/Mediation.md ${FOLDER} -FILE=Endorser.md; sed -e 's#\./docs/assets/endorse#../features/endorse#' \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -cp tmp/docs/assets/*.png ${FOLDER} -cp tmp/JsonLdCredentials.md ${FOLDER} -cp tmp/AnoncredsProofValidation.md ${FOLDER} -FILE=UsingOpenAPI.md; sed -e 's#AdminApi.md#AdminAPI.md#' \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -cp tmp/Multicredentials.md ${FOLDER} +# FOLDER=docs/features +# mkdir ${FOLDER} +# FILE=DevReadMe.md; sed -e 's#(README.md)#(/README.md)#' \ +# -e "s#\(Databases\).md#../../deploying/\1#g" \ +# -e "s#\(Logging\).md#../../testing/\1/#g" \ +# -e "s#/docs/GettingStartedAriesDev/README.md#../../gettingStarted/#" \ +# -e "s#/\(CONTRIBUTING\).md#../../contributing/\1/#" \ +# -e "s#/\(CODE_OF_CONDUCT\).md#../../contributing/\1/#" \ +# -e "s/#Running/#running/g" \ +# -e "s#(/README.md)#(../../release/acapy-README)#" \ +# -e "s#/docs/GettingStartedAriesDev/\(AriesDeveloperDemos\).md#../../\1#" \ +# -e "s#\(aries_cloudagent/transport\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FILE=devcontainer.md; sed -e "s#(\(.devcontainer/devcontainer.json\))#(https://github.com/hyperledger/aries-cloudagent-python/blob/main/\1)#" \ +# -e "s#(./\(aries_cloudagent\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/main/\1)#" \ +# -e "s#(/\(DevReadMe\).md)#(../\1)#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FILE=SupportedRFCs.md; sed -e "s#./\(IndySDKtoAskarMigration\).md#../../deploying/\1/#g" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FILE=AdminAPI.md; sed -e "s#/docs/assets/#../../assets/#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# cp tmp/Multitenancy.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/SelectiveDisclosureJWTs.md ${FOLDER} +# cp tmp/DIDMethods.md ${FOLDER} +# cp tmp/DIDResolution.md ${FOLDER} +# cp tmp/Multiledger.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/PlugIns.md ${FOLDER} +# cp tmp/Mediation.md ${FOLDER} +# FILE=Endorser.md; sed -e 's#\./docs/assets/endorse#../features/endorse#' \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# cp tmp/docs/assets/*.png ${FOLDER} +# cp tmp/JsonLdCredentials.md ${FOLDER} +# cp tmp/AnoncredsProofValidation.md ${FOLDER} +# FILE=UsingOpenAPI.md; sed -e 's#AdminApi.md#AdminAPI.md#' \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# cp tmp/Multicredentials.md ${FOLDER} # Deploying -FOLDER=docs/deploying -mkdir ${FOLDER} -cp tmp/ContainerImagesAndGithubActions.md ${FOLDER} -cp tmp/IndySDKtoAskarMigration.md ${FOLDER} -cp tmp/UpgradingACA-Py.md ${FOLDER} -cp tmp/docs/Poetry.md ${FOLDER} -FILE=deploymentModel.md; sed -e "s#/docs/assets/#../../assets/#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -FILE=Databases.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -cp tmp/RedisPlugins.md ${FOLDER} -cp tmp/AnonCredsWalletType.md ${FOLDER} +# FOLDER=docs/deploying +# mkdir ${FOLDER} +# cp tmp/ContainerImagesAndGithubActions.md ${FOLDER} +# cp tmp/IndySDKtoAskarMigration.md ${FOLDER} +# cp tmp/UpgradingACA-Py.md ${FOLDER} +# cp tmp/docs/Poetry.md ${FOLDER} +# FILE=deploymentModel.md; sed -e "s#/docs/assets/#../../assets/#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FILE=Databases.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# cp tmp/RedisPlugins.md ${FOLDER} +# cp tmp/AnonCredsWalletType.md ${FOLDER} # Demos -FOLDER=docs/demo -mkdir ${FOLDER} -cp tmp/demo/AcmeDemoWorkshop.md ${FOLDER} -cp tmp/demo/AliceWantsAJsonCredential.md ${FOLDER} -FILE=AliceWantsAJsonCredential.md; sed -e "s#../\(JsonLdCredentials\).md#../../features/\1#" tmp/demo/${FILE} > ${FOLDER}/${FILE} -FILE=README.md; sed -e "s#runners/#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/runners/#g" \ - -e "s#:uhttps#https#" \ - tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -cp tmp/demo/Endorser.md ${FOLDER} -FILE=AliceGetsAPhone.md; sed -e 's#\./collateral#../../demo/collateral#g' \ - -e "s#(/demo)#(../../demo)#" \ - tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -FILE=AriesOpenAPIDemo.md; sed -e 's#\./collateral#../../demo/collateral#g' \ - -e 's#\.\./\(AdminAPI\).md#../../features/\1#' \ - tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -cp -r tmp/demo/collateral ${FOLDER} +# FOLDER=docs/demo +# mkdir ${FOLDER} +# cp tmp/demo/AcmeDemoWorkshop.md ${FOLDER} +# cp tmp/demo/AliceWantsAJsonCredential.md ${FOLDER} +# FILE=AliceWantsAJsonCredential.md; sed -e "s#../\(JsonLdCredentials\).md#../../features/\1#" tmp/demo/${FILE} > ${FOLDER}/${FILE} +# FILE=README.md; sed -e "s#runners/#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/runners/#g" \ +# -e "s#:uhttps#https#" \ +# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} +# cp tmp/demo/Endorser.md ${FOLDER} +# FILE=AliceGetsAPhone.md; sed -e 's#\./collateral#../../demo/collateral#g' \ +# -e "s#(/demo)#(../../demo)#" \ +# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} +# FILE=AriesOpenAPIDemo.md; sed -e 's#\./collateral#../../demo/collateral#g' \ +# -e 's#\.\./\(AdminAPI\).md#../../features/\1#' \ +# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} +# cp -r tmp/demo/collateral ${FOLDER} # Getting Started -FOLDER=docs/gettingStarted -mkdir ${FOLDER} -FILE=README.md; sed -e 's#DIDCommMsgs.md#DIDcommMsgs.md#g' \ - -e "s#PlugIns.md#../features/PlugIns/#g" \ - tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -cp tmp/docs/GettingStartedAriesDev/IndyBasics.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/AriesBasics.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/DecentralizedIdentityDemos.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/AriesBigPicture.md ${FOLDER} -FILE=AriesAgentArchitecture.md; sed -e 's#../\(deploymentModel\).md#../../deploying/\1#g' \ - -e "s#/docs/assets/#../../assets/#" \ - tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -cp tmp/docs/GettingStartedAriesDev/AriesMessaging.md ${FOLDER} -FILE=/AriesDeveloperDemos.md; sed -e 's#../../demo#../../demo#g' \ - -e "s#\(AriesOpenAPIDemo\).md#\1#" \ - -e "s#demo/README.md#demo/#" \ - tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -cp tmp/docs/GettingStartedAriesDev/AgentConnections.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/IssuingIndyCredentials.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/PresentingIndyProofs.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/YourOwnAriesAgent.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/IndyAriesDevOptions.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/DIDcommMsgs.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/RoutingEncryption.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/AriesRoutingExample.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/ConnectIndyNetwork.md ${FOLDER} -cp tmp/docs/GettingStartedAriesDev/CredentialRevocation.md ${FOLDER} +# FOLDER=docs/gettingStarted +# mkdir ${FOLDER} +# FILE=README.md; sed -e 's#DIDCommMsgs.md#DIDcommMsgs.md#g' \ +# -e "s#PlugIns.md#../features/PlugIns/#g" \ +# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} +# cp tmp/docs/GettingStartedAriesDev/IndyBasics.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/AriesBasics.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/DecentralizedIdentityDemos.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/AriesBigPicture.md ${FOLDER} +# FILE=AriesAgentArchitecture.md; sed -e 's#../\(deploymentModel\).md#../../deploying/\1#g' \ +# -e "s#/docs/assets/#../../assets/#" \ +# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} +# cp tmp/docs/GettingStartedAriesDev/AriesMessaging.md ${FOLDER} +# FILE=/AriesDeveloperDemos.md; sed -e 's#../../demo#../../demo#g' \ +# -e "s#\(AriesOpenAPIDemo\).md#\1#" \ +# -e "s#demo/README.md#demo/#" \ +# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} +# cp tmp/docs/GettingStartedAriesDev/AgentConnections.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/IssuingIndyCredentials.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/PresentingIndyProofs.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/YourOwnAriesAgent.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/IndyAriesDevOptions.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/DIDcommMsgs.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/RoutingEncryption.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/AriesRoutingExample.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/ConnectIndyNetwork.md ${FOLDER} +# cp tmp/docs/GettingStartedAriesDev/CredentialRevocation.md ${FOLDER} # Testing and Troubleshooting -FOLDER=docs/testing -mkdir ${FOLDER} -cp tmp/UnitTests.md ${FOLDER} -FILE=Logging.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ - -e "s#(\(aries_cloudagent/config/default_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ - -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ - -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.yml\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -FILE=AgentTracing.md ; sed -e "s#./\(EFK-stack\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/\1#" \ - tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -cp tmp/demo/INTEGRATION-TESTS.md ${FOLDER} -FILE=Troubleshooting.md; sed -e "s#(demo)#(../../demo)#" \ - tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FOLDER=docs/testing +# mkdir ${FOLDER} +# cp tmp/UnitTests.md ${FOLDER} +# FILE=Logging.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ +# -e "s#(\(aries_cloudagent/config/default_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ +# -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ +# -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.yml\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} +# FILE=AgentTracing.md ; sed -e "s#./\(EFK-stack\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/\1#" \ +# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} +# cp tmp/demo/INTEGRATION-TESTS.md ${FOLDER} +# FILE=Troubleshooting.md; sed -e "s#(demo)#(../../demo)#" \ +# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} # Contributing FOLDER=docs/contributing From 58b6ab3bb51ac41e4b58ea7c1b93897ad5c32877 Mon Sep 17 00:00:00 2001 From: Stephen Curran Date: Sun, 11 Feb 2024 20:14:45 +0000 Subject: [PATCH 2/2] Another set of changes in testing with ACA-Py main Signed-off-by: Stephen Curran --- docs/UpdateRTD.md | 66 ++ docs/contributing/PUBLISHING.md | 2 +- docs/demo/AriesPostmanDemo.md | 2 +- docs/features/DevReadMe.md | 4 +- docs/release/CHANGELOG.md | 1012 ++++++++++++++++--------------- docs/release/acapy-README.md | 30 +- featuresDevReadMe.md | 245 ++++++++ mkdocs.yml | 2 + scripts/copyFixMDs.sh | 271 ++------- 9 files changed, 879 insertions(+), 755 deletions(-) create mode 100644 docs/UpdateRTD.md create mode 100644 featuresDevReadMe.md diff --git a/docs/UpdateRTD.md b/docs/UpdateRTD.md new file mode 100644 index 00000000..22ad323e --- /dev/null +++ b/docs/UpdateRTD.md @@ -0,0 +1,66 @@ +# Managing Aries Cloud Agent Python `Read The Docs` Documentation + +This document describes how to maintain the `Read The Docs` documentation that +is generated from the ACA-Py code base. As the structure of the ACA-Py code +evolves, the RTD files need to be regenerated and possibly updated, as described here. + +## Generating ACA-Py Read The Docs (RTD) documentation + +### Before you start + +To test generate and view the RTD documentation locally, you must install [Sphinx](https://www.sphinx-doc.org/en/master/) and the +[Sphinx RTD theme](https://pypi.org/project/sphinx-rtd-theme/). Follow the instructions on the respective pages to install +and verify the installation on your system. + +### Generate Module Files + +To rebuild the project and settings from scratch (you'll need to move the generated index file up a level): + +`rm -rf generated; sphinx-apidoc -f -M -o ./generated ../aries_cloudagent/ $(find ../aries_cloudagent/ -name '*tests*')` + +Note that the `find` command that is used to exclude any of the `test` python files from the RTD documentation. + +Check the `git status` in your repo to see if the generator updates, adds or removes any existing RTD modules. + +### Reviewing the files locally + +To auto-generate the module documentation locally run: + +``` bash +sphinx-build -b html -a -E -c ./ ./ ./_build +``` + +Once generated, go into the `_build` folder and open `index.html` in a browser. Note that the `_build` is +`.gitignore`'d and so will not be part of a git push. + +### Look for Errors + +This is the hard part; looking for errors in docstrings added by devs. Some tips: + +- missing imports (`No module named 'async_timeout'`) can be solved by adding the module to the +list of `autodoc_mock_imports` in the `conf.py` file in the ACA-Py `docs` folder. +- Ignore any errors in .md files +- Ignore the warnings about including `docs/README.md` +- Ignore an dist-package errors + +Other than that, please investigate and fix things that you find. If there are fixes, it's usually +to adhere to the rules around processing docstrings, and especially around JSON samples. + +### Checking for missing modules + +The file `index.rst` in the ACA-Py `docs` folder drive the RTD generation. It picks up all the modules +in the source code, starting from the root `../aries_cloudagent` folder. However, some modules +are not picked up automatically from the root and have to be manually added to `index.rst`. To do that: + +- Get a list of all generated modules by running: `ls generated | grep "aries_cloudagent.[a-z]*.rst"` +- Compare that list with the modules listed in the "Subpackages" section of the left side menu in your browser, including any listed below the "Submodules". + +If any are missing, you likely need to add them to the `index.rst` file in the `toctree` section of the file. +You will see there are already several instances of that, notably "connections" and "protocols". + +### Updating the [readthedocs.org](https://readthedocs.org) site + +The RTD documentation is **not** currently auto-generated, so a manual re-generation of the documentation +is still required. + +> TODO: Automate this when new tags are applied to the repository. diff --git a/docs/contributing/PUBLISHING.md b/docs/contributing/PUBLISHING.md index e44c2dfd..24b41edc 100644 --- a/docs/contributing/PUBLISHING.md +++ b/docs/contributing/PUBLISHING.md @@ -145,7 +145,7 @@ Once you have the list of PRs: "Packages"). Additional information about the container image publication process can be - found in the document [Container Images and Github Actions](docs/deploying/ContainerImagesAndGithubActions.md). + found in the document [Container Images and Github Actions](../deploying/ContainerImagesAndGithubActions.md). [publish.yml]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/.github/workflows/publish.yml [publish-indy.yml]: https://github.com/hyperledger/aries-cloudagent-python/blob/main/.github/workflows/publish-indy.yml diff --git a/docs/demo/AriesPostmanDemo.md b/docs/demo/AriesPostmanDemo.md index 7d5e85a9..03fccec7 100644 --- a/docs/demo/AriesPostmanDemo.md +++ b/docs/demo/AriesPostmanDemo.md @@ -32,7 +32,7 @@ Create a new postman workspace labeled "acapy-demo". ### Importing the environment -In the environment tab from the left, click the import button. You can paste this [link](https://raw.githubusercontent.com/hyperledger/aries-cloudagent-python/main/demo/postman/environment.json) or copy the json from the [environment file](./postman/environment.json). +In the environment tab from the left, click the import button. You can paste this [link](https://raw.githubusercontent.com/hyperledger/aries-cloudagent-python/main/demo/postman/environment.json) which is the [environment file](https://github.com/hyperledger/aries-cloudagent-python/blob/main/demo/postman/environment.json) in the ACA-Py repository. Make sure you have the environment set as your active environment. diff --git a/docs/features/DevReadMe.md b/docs/features/DevReadMe.md index bfcfb013..77feaa63 100644 --- a/docs/features/DevReadMe.md +++ b/docs/features/DevReadMe.md @@ -1,6 +1,6 @@ # Developer's Read Me for Hyperledger Aries Cloud Agent - Python -See the [README](../../README.md) for details about this repository and information about how the Aries Cloud Agent - Python fits into the Aries project and relates to Indy. +See the [README](../release/acapy-README.md) for details about this repository and information about how the Aries Cloud Agent - Python fits into the Aries project and relates to Indy. ## Table of Contents @@ -230,7 +230,7 @@ There are some good examples of various test scenarios for you to work from incl The test suite also displays the current code coverage after each run so you can see how much of your work is covered by tests. Use your best judgement for how much coverage is sufficient. -Please also refer to the [contributing guidelines](../../CONTRIBUTING.md) and [code of conduct](../../CODE_OF_CONDUCT.md). +Please also refer to the [contributing guidelines](../contributing/CONTRIBUTING.md) and [code of conduct](../contributing/CODE_OF_CONDUCT.md). ## Publishing Releases diff --git a/docs/release/CHANGELOG.md b/docs/release/CHANGELOG.md index 5a0f30a8..9806fa40 100644 --- a/docs/release/CHANGELOG.md +++ b/docs/release/CHANGELOG.md @@ -1,3 +1,5 @@ +# Release Notes + # Aries Cloud Agent Python Changelog ## 0.12.0rc0 @@ -21,80 +23,80 @@ There are no breaking changes in 0.12.0rc0. #### 0.12.0rc0 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - fix: save multi_use to the DB for OOB invitations [\#2694](https://github.com/hyperledger/aries-cloudagent-python/pull/2694) [frostyfrog](https://github.com/frostyfrog) - - Connection and DIDX Problem Reports [\#2653](https://github.com/hyperledger/aries-cloudagent-python/pull/2653) [usingtechnology](https://github.com/usingtechnology) - - Feat: DIDX Implicit Request auto-accept and Delete OOB Invitation related records [\#2642](https://github.com/hyperledger/aries-cloudagent-python/pull/2642) [shaangill025](https://github.com/shaangill025) + - fix: save multi_use to the DB for OOB invitations [\#2694](https://github.com/hyperledger/aries-cloudagent-python/pull/2694) [frostyfrog](https://github.com/frostyfrog) + - Connection and DIDX Problem Reports [\#2653](https://github.com/hyperledger/aries-cloudagent-python/pull/2653) [usingtechnology](https://github.com/usingtechnology) + - Feat: DIDX Implicit Request auto-accept and Delete OOB Invitation related records [\#2642](https://github.com/hyperledger/aries-cloudagent-python/pull/2642) [shaangill025](https://github.com/shaangill025) - DID Peer and DID Resolver Updates and Fixes - - Integration test for did:peer [\#2713](https://github.com/hyperledger/aries-cloudagent-python/pull/2713) [ianco](https://github.com/ianco) - - Feature/emit did peer 4 [\#2696](https://github.com/hyperledger/aries-cloudagent-python/pull/2696) [Jsyro](https://github.com/Jsyro) - - did peer 4 resolution [\#2692](https://github.com/hyperledger/aries-cloudagent-python/pull/2692) [Jsyro](https://github.com/Jsyro) - - Emit did:peer:2 for didexchange [\#2687](https://github.com/hyperledger/aries-cloudagent-python/pull/2687) [Jsyro](https://github.com/Jsyro) - - Add did web method type as a default option [\#2684](https://github.com/hyperledger/aries-cloudagent-python/pull/2684) [PatStLouis](https://github.com/PatStLouis) - - feat: add did:jwk resolver [\#2645](https://github.com/hyperledger/aries-cloudagent-python/pull/2645) [dbluhm](https://github.com/dbluhm) - - feat: support resolving did:peer:1 received in did exchange [\#2611](https://github.com/hyperledger/aries-cloudagent-python/pull/2611) [dbluhm](https://github.com/dbluhm) + - Integration test for did:peer [\#2713](https://github.com/hyperledger/aries-cloudagent-python/pull/2713) [ianco](https://github.com/ianco) + - Feature/emit did peer 4 [\#2696](https://github.com/hyperledger/aries-cloudagent-python/pull/2696) [Jsyro](https://github.com/Jsyro) + - did peer 4 resolution [\#2692](https://github.com/hyperledger/aries-cloudagent-python/pull/2692) [Jsyro](https://github.com/Jsyro) + - Emit did:peer:2 for didexchange [\#2687](https://github.com/hyperledger/aries-cloudagent-python/pull/2687) [Jsyro](https://github.com/Jsyro) + - Add did web method type as a default option [\#2684](https://github.com/hyperledger/aries-cloudagent-python/pull/2684) [PatStLouis](https://github.com/PatStLouis) + - feat: add did:jwk resolver [\#2645](https://github.com/hyperledger/aries-cloudagent-python/pull/2645) [dbluhm](https://github.com/dbluhm) + - feat: support resolving did:peer:1 received in did exchange [\#2611](https://github.com/hyperledger/aries-cloudagent-python/pull/2611) [dbluhm](https://github.com/dbluhm) - Ledger Agnostic AnonCreds RS Changes - - Upgrade anoncreds to 0.2.0.dev7 [\#2719](https://github.com/hyperledger/aries-cloudagent-python/pull/2719) [jamshale](https://github.com/jamshale) - - Improve api documentation and error handling [\#2690](https://github.com/hyperledger/aries-cloudagent-python/pull/2690) [jamshale](https://github.com/jamshale) - - Add unit tests for anoncreds revocation [\#2688](https://github.com/hyperledger/aries-cloudagent-python/pull/2688) [jamshale](https://github.com/jamshale) - - Return 404 when schema not found [\#2683](https://github.com/hyperledger/aries-cloudagent-python/pull/2683) [jamshale](https://github.com/jamshale) - - Anoncreds - Add unit testing [\#2672](https://github.com/hyperledger/aries-cloudagent-python/pull/2672) [jamshale](https://github.com/jamshale) - - Additional anoncreds integration tests AnonCreds [\#2660](https://github.com/hyperledger/aries-cloudagent-python/pull/2660) [ianco](https://github.com/ianco) - - Update integration tests for anoncreds-rs AnonCreds [\#2651](https://github.com/hyperledger/aries-cloudagent-python/pull/2651) [ianco](https://github.com/ianco) - - Initial migration of anoncreds revocation code AnonCreds [\#2643](https://github.com/hyperledger/aries-cloudagent-python/pull/2643) [ianco](https://github.com/ianco) - - Integrate Anoncreds rs into credential and presentation endpoints AnonCreds [\#2632](https://github.com/hyperledger/aries-cloudagent-python/pull/2632) [ianco](https://github.com/ianco) - - Initial code migration from anoncreds-rs branch AnonCreds [\#2596](https://github.com/hyperledger/aries-cloudagent-python/pull/2596) [ianco](https://github.com/ianco) + - Upgrade anoncreds to 0.2.0.dev7 [\#2719](https://github.com/hyperledger/aries-cloudagent-python/pull/2719) [jamshale](https://github.com/jamshale) + - Improve api documentation and error handling [\#2690](https://github.com/hyperledger/aries-cloudagent-python/pull/2690) [jamshale](https://github.com/jamshale) + - Add unit tests for anoncreds revocation [\#2688](https://github.com/hyperledger/aries-cloudagent-python/pull/2688) [jamshale](https://github.com/jamshale) + - Return 404 when schema not found [\#2683](https://github.com/hyperledger/aries-cloudagent-python/pull/2683) [jamshale](https://github.com/jamshale) + - Anoncreds - Add unit testing [\#2672](https://github.com/hyperledger/aries-cloudagent-python/pull/2672) [jamshale](https://github.com/jamshale) + - Additional anoncreds integration tests AnonCreds [\#2660](https://github.com/hyperledger/aries-cloudagent-python/pull/2660) [ianco](https://github.com/ianco) + - Update integration tests for anoncreds-rs AnonCreds [\#2651](https://github.com/hyperledger/aries-cloudagent-python/pull/2651) [ianco](https://github.com/ianco) + - Initial migration of anoncreds revocation code AnonCreds [\#2643](https://github.com/hyperledger/aries-cloudagent-python/pull/2643) [ianco](https://github.com/ianco) + - Integrate Anoncreds rs into credential and presentation endpoints AnonCreds [\#2632](https://github.com/hyperledger/aries-cloudagent-python/pull/2632) [ianco](https://github.com/ianco) + - Initial code migration from anoncreds-rs branch AnonCreds [\#2596](https://github.com/hyperledger/aries-cloudagent-python/pull/2596) [ianco](https://github.com/ianco) - Hyperledger Indy ledger related updates and fixes - - fix: update constants in TransactionRecord [\#2698](https://github.com/hyperledger/aries-cloudagent-python/pull/2698) [amanji](https://github.com/amanji) - - Cache TAA by wallet name [\#2676](https://github.com/hyperledger/aries-cloudagent-python/pull/2676) [jamshale](https://github.com/jamshale) - - Fix: RevRegEntry Transaction Endorsement 0.11.0 [\#2558](https://github.com/hyperledger/aries-cloudagent-python/pull/2558) [shaangill025](https://github.com/shaangill025) + - fix: update constants in TransactionRecord [\#2698](https://github.com/hyperledger/aries-cloudagent-python/pull/2698) [amanji](https://github.com/amanji) + - Cache TAA by wallet name [\#2676](https://github.com/hyperledger/aries-cloudagent-python/pull/2676) [jamshale](https://github.com/jamshale) + - Fix: RevRegEntry Transaction Endorsement 0.11.0 [\#2558](https://github.com/hyperledger/aries-cloudagent-python/pull/2558) [shaangill025](https://github.com/shaangill025) - JSON-LD Verifiable Credential/DIF Presentation Exchange updates - - feat: make VcLdpManager pluggable [\#2706](https://github.com/hyperledger/aries-cloudagent-python/pull/2706) [dbluhm](https://github.com/dbluhm) - - fix: minor type hint corrections for VcLdpManager [\#2704](https://github.com/hyperledger/aries-cloudagent-python/pull/2704) [dbluhm](https://github.com/dbluhm) - - Remove if condition which checks if the credential.type array is equal to 1 [\#2670](https://github.com/hyperledger/aries-cloudagent-python/pull/2670) [PatStLouis](https://github.com/PatStLouis) - - Feature Suggestion: Include a Reason When Constraints Cannot Be Applied [\#2630](https://github.com/hyperledger/aries-cloudagent-python/pull/2630) [Ennovate-com](https://github.com/Ennovate-com) - - refactor: make ldp_vc logic reusable [\#2533](https://github.com/hyperledger/aries-cloudagent-python/pull/2533) [dbluhm](https://github.com/dbluhm) + - feat: make VcLdpManager pluggable [\#2706](https://github.com/hyperledger/aries-cloudagent-python/pull/2706) [dbluhm](https://github.com/dbluhm) + - fix: minor type hint corrections for VcLdpManager [\#2704](https://github.com/hyperledger/aries-cloudagent-python/pull/2704) [dbluhm](https://github.com/dbluhm) + - Remove if condition which checks if the credential.type array is equal to 1 [\#2670](https://github.com/hyperledger/aries-cloudagent-python/pull/2670) [PatStLouis](https://github.com/PatStLouis) + - Feature Suggestion: Include a Reason When Constraints Cannot Be Applied [\#2630](https://github.com/hyperledger/aries-cloudagent-python/pull/2630) [Ennovate-com](https://github.com/Ennovate-com) + - refactor: make ldp_vc logic reusable [\#2533](https://github.com/hyperledger/aries-cloudagent-python/pull/2533) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Remove exception on connectionless presentation problem report handler [\#2723](https://github.com/hyperledger/aries-cloudagent-python/pull/2723) [loneil](https://github.com/loneil) - - Ensure "preserve_exchange_records" flags are set. [\#2664](https://github.com/hyperledger/aries-cloudagent-python/pull/2664) [usingtechnology](https://github.com/usingtechnology) - - Slight improvement to credx proof validation error message [\#2655](https://github.com/hyperledger/aries-cloudagent-python/pull/2655) [ianco](https://github.com/ianco) - - Add ConnectionProblemReport handler [\#2600](https://github.com/hyperledger/aries-cloudagent-python/pull/2600) [usingtechnology](https://github.com/usingtechnology) + - Remove exception on connectionless presentation problem report handler [\#2723](https://github.com/hyperledger/aries-cloudagent-python/pull/2723) [loneil](https://github.com/loneil) + - Ensure "preserve_exchange_records" flags are set. [\#2664](https://github.com/hyperledger/aries-cloudagent-python/pull/2664) [usingtechnology](https://github.com/usingtechnology) + - Slight improvement to credx proof validation error message [\#2655](https://github.com/hyperledger/aries-cloudagent-python/pull/2655) [ianco](https://github.com/ianco) + - Add ConnectionProblemReport handler [\#2600](https://github.com/hyperledger/aries-cloudagent-python/pull/2600) [usingtechnology](https://github.com/usingtechnology) - Multitenancy Updates and Fixes - - Improve Per Tenant Logging: Fix issues around default log file path [\#2659](https://github.com/hyperledger/aries-cloudagent-python/pull/2659) [shaangill025](https://github.com/shaangill025) + - Improve Per Tenant Logging: Fix issues around default log file path [\#2659](https://github.com/hyperledger/aries-cloudagent-python/pull/2659) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, DevContainer and Documentation Fixes - - Update devcontainer documentation [\#2729](https://github.com/hyperledger/aries-cloudagent-python/pull/2729) [jamshale](https://github.com/jamshale) - - Update the SupportedRFCs Document to be up to date [\#2722](https://github.com/hyperledger/aries-cloudagent-python/pull/2722) [swcurran](https://github.com/swcurran) - - Fix incorrect Sphinx search library version reference [\#2716](https://github.com/hyperledger/aries-cloudagent-python/pull/2716) [swcurran](https://github.com/swcurran) - - Update RTD requirements after security vulnerability recorded [\#2712](https://github.com/hyperledger/aries-cloudagent-python/pull/2712) [swcurran](https://github.com/swcurran) - - Update legacy bcgovimages references. [\#2700](https://github.com/hyperledger/aries-cloudagent-python/pull/2700) [WadeBarnes](https://github.com/WadeBarnes) - - fix: link to raw content change from master to main [\#2663](https://github.com/hyperledger/aries-cloudagent-python/pull/2663) [Ennovate-com](https://github.com/Ennovate-com) - - fix: open-api generator script [\#2661](https://github.com/hyperledger/aries-cloudagent-python/pull/2661) [dbluhm](https://github.com/dbluhm) - - Update the ReadTheDocs config in case we do another 0.10.x release [\#2629](https://github.com/hyperledger/aries-cloudagent-python/pull/2629) [swcurran](https://github.com/swcurran) + - Update devcontainer documentation [\#2729](https://github.com/hyperledger/aries-cloudagent-python/pull/2729) [jamshale](https://github.com/jamshale) + - Update the SupportedRFCs Document to be up to date [\#2722](https://github.com/hyperledger/aries-cloudagent-python/pull/2722) [swcurran](https://github.com/swcurran) + - Fix incorrect Sphinx search library version reference [\#2716](https://github.com/hyperledger/aries-cloudagent-python/pull/2716) [swcurran](https://github.com/swcurran) + - Update RTD requirements after security vulnerability recorded [\#2712](https://github.com/hyperledger/aries-cloudagent-python/pull/2712) [swcurran](https://github.com/swcurran) + - Update legacy bcgovimages references. [\#2700](https://github.com/hyperledger/aries-cloudagent-python/pull/2700) [WadeBarnes](https://github.com/WadeBarnes) + - fix: link to raw content change from master to main [\#2663](https://github.com/hyperledger/aries-cloudagent-python/pull/2663) [Ennovate-com](https://github.com/Ennovate-com) + - fix: open-api generator script [\#2661](https://github.com/hyperledger/aries-cloudagent-python/pull/2661) [dbluhm](https://github.com/dbluhm) + - Update the ReadTheDocs config in case we do another 0.10.x release [\#2629](https://github.com/hyperledger/aries-cloudagent-python/pull/2629) [swcurran](https://github.com/swcurran) - Dependencies and Internal Updates - - Fix subwallet record removal [\#2721](https://github.com/hyperledger/aries-cloudagent-python/pull/2721) [andrewwhitehead](https://github.com/andrewwhitehead) - - chore(deps): Bump jinja2 from 3.1.2 to 3.1.3 dependencies [\#2707](https://github.com/hyperledger/aries-cloudagent-python/pull/2707) [dependabot bot](https://github.com/dependabot bot) - - feat: inject profile [\#2705](https://github.com/hyperledger/aries-cloudagent-python/pull/2705) [dbluhm](https://github.com/dbluhm) - - Remove tiny-vim from being added to the container image to reduce reported vulnerabilities from scanning [\#2699](https://github.com/hyperledger/aries-cloudagent-python/pull/2699) [swcurran](https://github.com/swcurran) - - chore(deps): Bump jwcrypto from 1.5.0 to 1.5.1 dependencies [\#2689](https://github.com/hyperledger/aries-cloudagent-python/pull/2689) [dependabot bot](https://github.com/dependabot bot) - - Update dependencies [\#2686](https://github.com/hyperledger/aries-cloudagent-python/pull/2686) [andrewwhitehead](https://github.com/andrewwhitehead) - - Fix: Change To Use Timezone Aware UTC datetime [\#2679](https://github.com/hyperledger/aries-cloudagent-python/pull/2679) [Ennovate-com](https://github.com/Ennovate-com) - - fix: update broken demo dependency [\#2638](https://github.com/hyperledger/aries-cloudagent-python/pull/2638) [mrkaurelius](https://github.com/mrkaurelius) - - Bump cryptography from 41.0.5 to 41.0.6 dependencies [\#2636](https://github.com/hyperledger/aries-cloudagent-python/pull/2636) [dependabot bot](https://github.com/dependabot bot) - - Bump aiohttp from 3.8.6 to 3.9.0 dependencies [\#2635](https://github.com/hyperledger/aries-cloudagent-python/pull/2635) [dependabot bot](https://github.com/dependabot bot) + - Fix subwallet record removal [\#2721](https://github.com/hyperledger/aries-cloudagent-python/pull/2721) [andrewwhitehead](https://github.com/andrewwhitehead) + - chore(deps): Bump jinja2 from 3.1.2 to 3.1.3 dependencies [\#2707](https://github.com/hyperledger/aries-cloudagent-python/pull/2707) [dependabot bot](https://github.com/dependabot bot) + - feat: inject profile [\#2705](https://github.com/hyperledger/aries-cloudagent-python/pull/2705) [dbluhm](https://github.com/dbluhm) + - Remove tiny-vim from being added to the container image to reduce reported vulnerabilities from scanning [\#2699](https://github.com/hyperledger/aries-cloudagent-python/pull/2699) [swcurran](https://github.com/swcurran) + - chore(deps): Bump jwcrypto from 1.5.0 to 1.5.1 dependencies [\#2689](https://github.com/hyperledger/aries-cloudagent-python/pull/2689) [dependabot bot](https://github.com/dependabot bot) + - Update dependencies [\#2686](https://github.com/hyperledger/aries-cloudagent-python/pull/2686) [andrewwhitehead](https://github.com/andrewwhitehead) + - Fix: Change To Use Timezone Aware UTC datetime [\#2679](https://github.com/hyperledger/aries-cloudagent-python/pull/2679) [Ennovate-com](https://github.com/Ennovate-com) + - fix: update broken demo dependency [\#2638](https://github.com/hyperledger/aries-cloudagent-python/pull/2638) [mrkaurelius](https://github.com/mrkaurelius) + - Bump cryptography from 41.0.5 to 41.0.6 dependencies [\#2636](https://github.com/hyperledger/aries-cloudagent-python/pull/2636) [dependabot bot](https://github.com/dependabot bot) + - Bump aiohttp from 3.8.6 to 3.9.0 dependencies [\#2635](https://github.com/hyperledger/aries-cloudagent-python/pull/2635) [dependabot bot](https://github.com/dependabot bot) - CI/CD, Testing, and Developer Tools/Productivity Updates - - Tweak scope of GHA integration tests [\#2662](https://github.com/hyperledger/aries-cloudagent-python/pull/2662) [ianco](https://github.com/ianco) - - Update snyk workflow to execute on Pull Request [\#2658](https://github.com/hyperledger/aries-cloudagent-python/pull/2658) [usingtechnology](https://github.com/usingtechnology) + - Tweak scope of GHA integration tests [\#2662](https://github.com/hyperledger/aries-cloudagent-python/pull/2662) [ianco](https://github.com/ianco) + - Update snyk workflow to execute on Pull Request [\#2658](https://github.com/hyperledger/aries-cloudagent-python/pull/2658) [usingtechnology](https://github.com/usingtechnology) - Release management pull requests - - 0.12.0rc0 [\#2732](https://github.com/hyperledger/aries-cloudagent-python/pull/2732) [swcurran](https://github.com/swcurran) + - 0.12.0rc0 [\#2732](https://github.com/hyperledger/aries-cloudagent-python/pull/2732) [swcurran](https://github.com/swcurran) ## 0.11.0 @@ -169,83 +171,83 @@ not be answered for a long time, and the holder responds after the delete. See #### 0.11.0 Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - Change arg_parse to always set --emit-new-didcomm-prefix and --emit-new-didcomm-mime-type to true [\#2517](https://github.com/hyperledger/aries-cloudagent-python/pull/2517) [swcurran](https://github.com/swcurran) + - Change arg_parse to always set --emit-new-didcomm-prefix and --emit-new-didcomm-mime-type to true [\#2517](https://github.com/hyperledger/aries-cloudagent-python/pull/2517) [swcurran](https://github.com/swcurran) - DID Handling and Connection Establishment Updates/Fixes - - Goal and Goal Code in invitation URL. [\#2591](https://github.com/hyperledger/aries-cloudagent-python/pull/2591) [usingtechnology](https://github.com/usingtechnology) - - refactor: use did-peer-2 instead of peerdid [\#2561](https://github.com/hyperledger/aries-cloudagent-python/pull/2561) [dbluhm](https://github.com/dbluhm) - - Fix: Problem Report Before Exchange Established [\#2519](https://github.com/hyperledger/aries-cloudagent-python/pull/2519) [Ennovate-com](https://github.com/Ennovate-com) - - fix: issue #2434: Change DIDExchange States to Match rfc160 [\#2461](https://github.com/hyperledger/aries-cloudagent-python/pull/2461) [anwalker293](https://github.com/anwalker293) + - Goal and Goal Code in invitation URL. [\#2591](https://github.com/hyperledger/aries-cloudagent-python/pull/2591) [usingtechnology](https://github.com/usingtechnology) + - refactor: use did-peer-2 instead of peerdid [\#2561](https://github.com/hyperledger/aries-cloudagent-python/pull/2561) [dbluhm](https://github.com/dbluhm) + - Fix: Problem Report Before Exchange Established [\#2519](https://github.com/hyperledger/aries-cloudagent-python/pull/2519) [Ennovate-com](https://github.com/Ennovate-com) + - fix: issue #2434: Change DIDExchange States to Match rfc160 [\#2461](https://github.com/hyperledger/aries-cloudagent-python/pull/2461) [anwalker293](https://github.com/anwalker293) - DID Peer and DID Resolver Updates and Fixes - - fix: unique ids for services in legacy peer [\#2476](https://github.com/hyperledger/aries-cloudagent-python/pull/2476) [dbluhm](https://github.com/dbluhm) - - peer did 2/3 resolution enhancement [\#2472](https://github.com/hyperledger/aries-cloudagent-python/pull/2472) [Jsyro](https://github.com/Jsyro) - - feat: add timeout to did resolver resolve method [\#2464](https://github.com/hyperledger/aries-cloudagent-python/pull/2464) [dbluhm](https://github.com/dbluhm) + - fix: unique ids for services in legacy peer [\#2476](https://github.com/hyperledger/aries-cloudagent-python/pull/2476) [dbluhm](https://github.com/dbluhm) + - peer did 2/3 resolution enhancement [\#2472](https://github.com/hyperledger/aries-cloudagent-python/pull/2472) [Jsyro](https://github.com/Jsyro) + - feat: add timeout to did resolver resolve method [\#2464](https://github.com/hyperledger/aries-cloudagent-python/pull/2464) [dbluhm](https://github.com/dbluhm) - ACA-Py as a DIDComm Mediator Updates and Fixes - - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) - - fix: mediation routing keys as did key [\#2516](https://github.com/hyperledger/aries-cloudagent-python/pull/2516) [dbluhm](https://github.com/dbluhm) - - refactor: drop mediator_terms and recipient_terms [\#2515](https://github.com/hyperledger/aries-cloudagent-python/pull/2515) [dbluhm](https://github.com/dbluhm) + - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) + - fix: mediation routing keys as did key [\#2516](https://github.com/hyperledger/aries-cloudagent-python/pull/2516) [dbluhm](https://github.com/dbluhm) + - refactor: drop mediator_terms and recipient_terms [\#2515](https://github.com/hyperledger/aries-cloudagent-python/pull/2515) [dbluhm](https://github.com/dbluhm) - Fixes to Upgrades - - 🐛 fix wallet_update when only extra_settings requested [\#2612](https://github.com/hyperledger/aries-cloudagent-python/pull/2612) [ff137](https://github.com/ff137) + - 🐛 fix wallet_update when only extra_settings requested [\#2612](https://github.com/hyperledger/aries-cloudagent-python/pull/2612) [ff137](https://github.com/ff137) - Hyperledger Indy ledger related updates and fixes - - fix: taa rough timestamp timezone from datetime [\#2554](https://github.com/hyperledger/aries-cloudagent-python/pull/2554) [dbluhm](https://github.com/dbluhm) - - 🎨 clarify LedgerError message when TAA is required and not accepted [\#2545](https://github.com/hyperledger/aries-cloudagent-python/pull/2545) [ff137](https://github.com/ff137) - - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) - - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) - - Issue #2419 InvalidClientTaaAcceptanceError time too precise error if container timezone is not UTC [\#2420](https://github.com/hyperledger/aries-cloudagent-python/pull/2420) [Ennovate-com](https://github.com/Ennovate-com) + - fix: taa rough timestamp timezone from datetime [\#2554](https://github.com/hyperledger/aries-cloudagent-python/pull/2554) [dbluhm](https://github.com/dbluhm) + - 🎨 clarify LedgerError message when TAA is required and not accepted [\#2545](https://github.com/hyperledger/aries-cloudagent-python/pull/2545) [ff137](https://github.com/ff137) + - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) + - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - Issue #2419 InvalidClientTaaAcceptanceError time too precise error if container timezone is not UTC [\#2420](https://github.com/hyperledger/aries-cloudagent-python/pull/2420) [Ennovate-com](https://github.com/Ennovate-com) - OpenID4VC / SD-JWT Updates - - chore: point to official sd-jwt lib release [\#2573](https://github.com/hyperledger/aries-cloudagent-python/pull/2573) [dbluhm](https://github.com/dbluhm) - - Feat/sd jwt implementation [\#2487](https://github.com/hyperledger/aries-cloudagent-python/pull/2487) [cjhowland](https://github.com/cjhowland) + - chore: point to official sd-jwt lib release [\#2573](https://github.com/hyperledger/aries-cloudagent-python/pull/2573) [dbluhm](https://github.com/dbluhm) + - Feat/sd jwt implementation [\#2487](https://github.com/hyperledger/aries-cloudagent-python/pull/2487) [cjhowland](https://github.com/cjhowland) - JSON-LD Verifiable Credential/Presentation updates - - fix: report presentation result [\#2615](https://github.com/hyperledger/aries-cloudagent-python/pull/2615) [dbluhm](https://github.com/dbluhm) - - Fix Issue #2589 TypeError When There Are No Nested Requirements [\#2590](https://github.com/hyperledger/aries-cloudagent-python/pull/2590) [Ennovate-com](https://github.com/Ennovate-com) - - feat: use a local static cache for commonly used contexts [\#2587](https://github.com/hyperledger/aries-cloudagent-python/pull/2587) [chumbert](https://github.com/chumbert) - - Issue #2488 KeyError raised when Subject ID is not a URI [\#2490](https://github.com/hyperledger/aries-cloudagent-python/pull/2490) [Ennovate-com](https://github.com/Ennovate-com) + - fix: report presentation result [\#2615](https://github.com/hyperledger/aries-cloudagent-python/pull/2615) [dbluhm](https://github.com/dbluhm) + - Fix Issue #2589 TypeError When There Are No Nested Requirements [\#2590](https://github.com/hyperledger/aries-cloudagent-python/pull/2590) [Ennovate-com](https://github.com/Ennovate-com) + - feat: use a local static cache for commonly used contexts [\#2587](https://github.com/hyperledger/aries-cloudagent-python/pull/2587) [chumbert](https://github.com/chumbert) + - Issue #2488 KeyError raised when Subject ID is not a URI [\#2490](https://github.com/hyperledger/aries-cloudagent-python/pull/2490) [Ennovate-com](https://github.com/Ennovate-com) - Credential Exchange (Issue, Present) Updates - - Default connection_id to None to account for Connectionless Proofs [\#2605](https://github.com/hyperledger/aries-cloudagent-python/pull/2605) [popkinj](https://github.com/popkinj) - - Send Problem report when CredEx not found [\#2577](https://github.com/hyperledger/aries-cloudagent-python/pull/2577) [usingtechnology](https://github.com/usingtechnology) - - fix: clean up requests and invites [\#2560](https://github.com/hyperledger/aries-cloudagent-python/pull/2560) [dbluhm](https://github.com/dbluhm) + - Default connection_id to None to account for Connectionless Proofs [\#2605](https://github.com/hyperledger/aries-cloudagent-python/pull/2605) [popkinj](https://github.com/popkinj) + - Send Problem report when CredEx not found [\#2577](https://github.com/hyperledger/aries-cloudagent-python/pull/2577) [usingtechnology](https://github.com/usingtechnology) + - fix: clean up requests and invites [\#2560](https://github.com/hyperledger/aries-cloudagent-python/pull/2560) [dbluhm](https://github.com/dbluhm) - Multitenancy Updates and Fixes - - Feat: Support subwallet upgradation using the Upgrade command [\#2529](https://github.com/hyperledger/aries-cloudagent-python/pull/2529) [shaangill025](https://github.com/shaangill025) + - Feat: Support subwallet upgradation using the Upgrade command [\#2529](https://github.com/hyperledger/aries-cloudagent-python/pull/2529) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, DevContainer and Documentation Fixes - - fix: wallet type help text out of date [\#2618](https://github.com/hyperledger/aries-cloudagent-python/pull/2618) [dbluhm](https://github.com/dbluhm) - - fix: typos [\#2614](https://github.com/hyperledger/aries-cloudagent-python/pull/2614) [omahs](https://github.com/omahs) - - black formatter extension configuration update [\#2603](https://github.com/hyperledger/aries-cloudagent-python/pull/2603) [usingtechnology](https://github.com/usingtechnology) - - Update Devcontainer pytest ruff black [\#2602](https://github.com/hyperledger/aries-cloudagent-python/pull/2602) [usingtechnology](https://github.com/usingtechnology) - - Issue 2570 devcontainer ruff, black and pytest [\#2595](https://github.com/hyperledger/aries-cloudagent-python/pull/2595) [usingtechnology](https://github.com/usingtechnology) - - chore: correct type hints on base record [\#2604](https://github.com/hyperledger/aries-cloudagent-python/pull/2604) [dbluhm](https://github.com/dbluhm) - - Playground needs optionally external network [\#2564](https://github.com/hyperledger/aries-cloudagent-python/pull/2564) [usingtechnology](https://github.com/usingtechnology) - - Issue 2555 playground scripts readme [\#2563](https://github.com/hyperledger/aries-cloudagent-python/pull/2563) [usingtechnology](https://github.com/usingtechnology) - - Update demo/playground scripts [\#2562](https://github.com/hyperledger/aries-cloudagent-python/pull/2562) [usingtechnology](https://github.com/usingtechnology) - - Update .readthedocs.yaml [\#2548](https://github.com/hyperledger/aries-cloudagent-python/pull/2548) [swcurran](https://github.com/swcurran) - - Update .readthedocs.yaml [\#2547](https://github.com/hyperledger/aries-cloudagent-python/pull/2547) [swcurran](https://github.com/swcurran) - - fix: correct minor typos [\#2544](https://github.com/hyperledger/aries-cloudagent-python/pull/2544) [Ennovate-com](https://github.com/Ennovate-com) - - Update steps for Manually Creating Revocation Registries [\#2491](https://github.com/hyperledger/aries-cloudagent-python/pull/2491) [WadeBarnes](https://github.com/WadeBarnes) + - fix: wallet type help text out of date [\#2618](https://github.com/hyperledger/aries-cloudagent-python/pull/2618) [dbluhm](https://github.com/dbluhm) + - fix: typos [\#2614](https://github.com/hyperledger/aries-cloudagent-python/pull/2614) [omahs](https://github.com/omahs) + - black formatter extension configuration update [\#2603](https://github.com/hyperledger/aries-cloudagent-python/pull/2603) [usingtechnology](https://github.com/usingtechnology) + - Update Devcontainer pytest ruff black [\#2602](https://github.com/hyperledger/aries-cloudagent-python/pull/2602) [usingtechnology](https://github.com/usingtechnology) + - Issue 2570 devcontainer ruff, black and pytest [\#2595](https://github.com/hyperledger/aries-cloudagent-python/pull/2595) [usingtechnology](https://github.com/usingtechnology) + - chore: correct type hints on base record [\#2604](https://github.com/hyperledger/aries-cloudagent-python/pull/2604) [dbluhm](https://github.com/dbluhm) + - Playground needs optionally external network [\#2564](https://github.com/hyperledger/aries-cloudagent-python/pull/2564) [usingtechnology](https://github.com/usingtechnology) + - Issue 2555 playground scripts readme [\#2563](https://github.com/hyperledger/aries-cloudagent-python/pull/2563) [usingtechnology](https://github.com/usingtechnology) + - Update demo/playground scripts [\#2562](https://github.com/hyperledger/aries-cloudagent-python/pull/2562) [usingtechnology](https://github.com/usingtechnology) + - Update .readthedocs.yaml [\#2548](https://github.com/hyperledger/aries-cloudagent-python/pull/2548) [swcurran](https://github.com/swcurran) + - Update .readthedocs.yaml [\#2547](https://github.com/hyperledger/aries-cloudagent-python/pull/2547) [swcurran](https://github.com/swcurran) + - fix: correct minor typos [\#2544](https://github.com/hyperledger/aries-cloudagent-python/pull/2544) [Ennovate-com](https://github.com/Ennovate-com) + - Update steps for Manually Creating Revocation Registries [\#2491](https://github.com/hyperledger/aries-cloudagent-python/pull/2491) [WadeBarnes](https://github.com/WadeBarnes) - Dependencies and Internal Updates - - chore: bump pydid version [\#2626](https://github.com/hyperledger/aries-cloudagent-python/pull/2626) [dbluhm](https://github.com/dbluhm) - - chore: dependency updates [\#2565](https://github.com/hyperledger/aries-cloudagent-python/pull/2565) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 dependencies [\#2552](https://github.com/hyperledger/aries-cloudagent-python/pull/2552) [dependabot bot](https://github.com/dependabot bot) - - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 in /demo/playground/scripts dependencies [\#2551](https://github.com/hyperledger/aries-cloudagent-python/pull/2551) [dependabot bot](https://github.com/dependabot bot) - - chore: update pydid [\#2527](https://github.com/hyperledger/aries-cloudagent-python/pull/2527) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump urllib3 from 2.0.5 to 2.0.6 dependencies [\#2525](https://github.com/hyperledger/aries-cloudagent-python/pull/2525) [dependabot bot](https://github.com/dependabot bot) - - chore(deps): Bump urllib3 from 2.0.2 to 2.0.6 in /demo/playground/scripts dependencies [\#2524](https://github.com/hyperledger/aries-cloudagent-python/pull/2524) [dependabot bot](https://github.com/dependabot bot) - - Avoid multiple open wallet connections [\#2521](https://github.com/hyperledger/aries-cloudagent-python/pull/2521) [andrewwhitehead](https://github.com/andrewwhitehead) - - Remove unused dependencies [\#2510](https://github.com/hyperledger/aries-cloudagent-python/pull/2510) [andrewwhitehead](https://github.com/andrewwhitehead) - - Use correct rust log level in dockerfiles [\#2499](https://github.com/hyperledger/aries-cloudagent-python/pull/2499) [loneil](https://github.com/loneil) - - fix: run tests script copying local env [\#2495](https://github.com/hyperledger/aries-cloudagent-python/pull/2495) [dbluhm](https://github.com/dbluhm) - - Update devcontainer to read version from aries-cloudagent package [\#2483](https://github.com/hyperledger/aries-cloudagent-python/pull/2483) [usingtechnology](https://github.com/usingtechnology) - - Update Python image version to 3.9.18 [\#2456](https://github.com/hyperledger/aries-cloudagent-python/pull/2456) [WadeBarnes](https://github.com/WadeBarnes) - - Remove old routing protocol code [\#2466](https://github.com/hyperledger/aries-cloudagent-python/pull/2466) [dbluhm](https://github.com/dbluhm) + - chore: bump pydid version [\#2626](https://github.com/hyperledger/aries-cloudagent-python/pull/2626) [dbluhm](https://github.com/dbluhm) + - chore: dependency updates [\#2565](https://github.com/hyperledger/aries-cloudagent-python/pull/2565) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 dependencies [\#2552](https://github.com/hyperledger/aries-cloudagent-python/pull/2552) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump urllib3 from 2.0.6 to 2.0.7 in /demo/playground/scripts dependencies [\#2551](https://github.com/hyperledger/aries-cloudagent-python/pull/2551) [dependabot bot](https://github.com/dependabot bot) + - chore: update pydid [\#2527](https://github.com/hyperledger/aries-cloudagent-python/pull/2527) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump urllib3 from 2.0.5 to 2.0.6 dependencies [\#2525](https://github.com/hyperledger/aries-cloudagent-python/pull/2525) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump urllib3 from 2.0.2 to 2.0.6 in /demo/playground/scripts dependencies [\#2524](https://github.com/hyperledger/aries-cloudagent-python/pull/2524) [dependabot bot](https://github.com/dependabot bot) + - Avoid multiple open wallet connections [\#2521](https://github.com/hyperledger/aries-cloudagent-python/pull/2521) [andrewwhitehead](https://github.com/andrewwhitehead) + - Remove unused dependencies [\#2510](https://github.com/hyperledger/aries-cloudagent-python/pull/2510) [andrewwhitehead](https://github.com/andrewwhitehead) + - Use correct rust log level in dockerfiles [\#2499](https://github.com/hyperledger/aries-cloudagent-python/pull/2499) [loneil](https://github.com/loneil) + - fix: run tests script copying local env [\#2495](https://github.com/hyperledger/aries-cloudagent-python/pull/2495) [dbluhm](https://github.com/dbluhm) + - Update devcontainer to read version from aries-cloudagent package [\#2483](https://github.com/hyperledger/aries-cloudagent-python/pull/2483) [usingtechnology](https://github.com/usingtechnology) + - Update Python image version to 3.9.18 [\#2456](https://github.com/hyperledger/aries-cloudagent-python/pull/2456) [WadeBarnes](https://github.com/WadeBarnes) + - Remove old routing protocol code [\#2466](https://github.com/hyperledger/aries-cloudagent-python/pull/2466) [dbluhm](https://github.com/dbluhm) - CI/CD, Testing, and Developer Tools/Productivity Updates - - fix: drop asynctest 0.11.0 [\#2566](https://github.com/hyperledger/aries-cloudagent-python/pull/2566) [dbluhm](https://github.com/dbluhm) - - Dockerfile.indy - Include aries_cloudagent code into build [\#2584](https://github.com/hyperledger/aries-cloudagent-python/pull/2584) [usingtechnology](https://github.com/usingtechnology) - - fix: version should be set by pyproject.toml [\#2471](https://github.com/hyperledger/aries-cloudagent-python/pull/2471) [dbluhm](https://github.com/dbluhm) - - chore: add black back in as a dev dep [\#2465](https://github.com/hyperledger/aries-cloudagent-python/pull/2465) [dbluhm](https://github.com/dbluhm) - - Swap out flake8 in favor of Ruff [\#2438](https://github.com/hyperledger/aries-cloudagent-python/pull/2438) [dbluhm](https://github.com/dbluhm) - - #2289 Migrate to Poetry [\#2436](https://github.com/hyperledger/aries-cloudagent-python/pull/2436) [Gavinok](https://github.com/Gavinok) + - fix: drop asynctest 0.11.0 [\#2566](https://github.com/hyperledger/aries-cloudagent-python/pull/2566) [dbluhm](https://github.com/dbluhm) + - Dockerfile.indy - Include aries_cloudagent code into build [\#2584](https://github.com/hyperledger/aries-cloudagent-python/pull/2584) [usingtechnology](https://github.com/usingtechnology) + - fix: version should be set by pyproject.toml [\#2471](https://github.com/hyperledger/aries-cloudagent-python/pull/2471) [dbluhm](https://github.com/dbluhm) + - chore: add black back in as a dev dep [\#2465](https://github.com/hyperledger/aries-cloudagent-python/pull/2465) [dbluhm](https://github.com/dbluhm) + - Swap out flake8 in favor of Ruff [\#2438](https://github.com/hyperledger/aries-cloudagent-python/pull/2438) [dbluhm](https://github.com/dbluhm) + - #2289 Migrate to Poetry [\#2436](https://github.com/hyperledger/aries-cloudagent-python/pull/2436) [Gavinok](https://github.com/Gavinok) - Release management pull requests - - 0.11.0 [\#2627](https://github.com/hyperledger/aries-cloudagent-python/pull/2627) [swcurran](https://github.com/swcurran) - - 0.11.0rc2 [\#2613](https://github.com/hyperledger/aries-cloudagent-python/pull/2613) [swcurran](https://github.com/swcurran) - - 0.11.0-rc1 [\#2576](https://github.com/hyperledger/aries-cloudagent-python/pull/2576) [swcurran](https://github.com/swcurran) - - 0.11.0-rc0 [\#2575](https://github.com/hyperledger/aries-cloudagent-python/pull/2575) [swcurran](https://github.com/swcurran) + - 0.11.0 [\#2627](https://github.com/hyperledger/aries-cloudagent-python/pull/2627) [swcurran](https://github.com/swcurran) + - 0.11.0rc2 [\#2613](https://github.com/hyperledger/aries-cloudagent-python/pull/2613) [swcurran](https://github.com/swcurran) + - 0.11.0-rc1 [\#2576](https://github.com/hyperledger/aries-cloudagent-python/pull/2576) [swcurran](https://github.com/swcurran) + - 0.11.0-rc0 [\#2575](https://github.com/hyperledger/aries-cloudagent-python/pull/2575) [swcurran](https://github.com/swcurran) ## 0.10.5 @@ -263,9 +265,9 @@ of ACA-Py as soon as possible. #### 0.10.5 Categorized List of Pull Requests - JSON-LD Credential Exchange (Issue, Present) Updates - - fix(backport): report presentation result [\#2622](https://github.com/hyperledger/aries-cloudagent-python/pull/2622) [dbluhm](https://github.com/dbluhm) + - fix(backport): report presentation result [\#2622](https://github.com/hyperledger/aries-cloudagent-python/pull/2622) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.5 [\#2623](https://github.com/hyperledger/aries-cloudagent-python/pull/2623) [swcurran](https://github.com/swcurran) + - 0.10.5 [\#2623](https://github.com/hyperledger/aries-cloudagent-python/pull/2623) [swcurran](https://github.com/swcurran) ## 0.10.4 @@ -283,9 +285,9 @@ Thanks to [codespree](https://github.com/codespree) for raising the issue and pr #### 0.10.4 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) + - fix: routing behind mediator [\#2536](https://github.com/hyperledger/aries-cloudagent-python/pull/2536) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.4 [\#2539](https://github.com/hyperledger/aries-cloudagent-python/pull/2539) [swcurran](https://github.com/swcurran) + - 0.10.4 [\#2539](https://github.com/hyperledger/aries-cloudagent-python/pull/2539) [swcurran](https://github.com/swcurran) ## 0.10.3 @@ -307,9 +309,9 @@ instance to be upgraded: #### 0.10.3 Categorized List of Pull Requests - Credential Exchange (Issue, Present) Updates - - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) + - Feat: Upgrade from tags and fix issue with legacy IssuerRevRegRecords [<=v0.5.2] [\#2486](https://github.com/hyperledger/aries-cloudagent-python/pull/2486) [shaangill025](https://github.com/shaangill025) - Release management pull requests - - 0.10.3 [\#2522](https://github.com/hyperledger/aries-cloudagent-python/pull/2522) [swcurran](https://github.com/swcurran) + - 0.10.3 [\#2522](https://github.com/hyperledger/aries-cloudagent-python/pull/2522) [swcurran](https://github.com/swcurran) ## 0.10.2 @@ -340,14 +342,14 @@ library version dependency was updated in [PR \#2500]. #### 0.10.2 Categorized List of Pull Requests - DID Handling and Connection Establishment Updates/Fixes - - LegacyPeerDIDResolver: erroneously assigning same ID to multiple services [\#2475](https://github.com/hyperledger/aries-cloudagent-python/pull/2475) [dbluhm](https://github.com/dbluhm) - - fix: update pydid [\#2500](https://github.com/hyperledger/aries-cloudagent-python/pull/2500) [dbluhm](https://github.com/dbluhm) + - LegacyPeerDIDResolver: erroneously assigning same ID to multiple services [\#2475](https://github.com/hyperledger/aries-cloudagent-python/pull/2475) [dbluhm](https://github.com/dbluhm) + - fix: update pydid [\#2500](https://github.com/hyperledger/aries-cloudagent-python/pull/2500) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - Bugfix: Issue with write ledger pool when performing Accumulator sync [\#2480](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) - Release management pull requests - - 0.10.2 [\#2509](https://github.com/hyperledger/aries-cloudagent-python/pull/2509) [swcurran](https://github.com/swcurran) - - 0.10.2-rc0 [\#2484](https://github.com/hyperledger/aries-cloudagent-python/pull/2484) [swcurran](https://github.com/swcurran) - - 0.10.2 Patch Release - fix issue #2475, #2477 [\#2482](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) + - 0.10.2 [\#2509](https://github.com/hyperledger/aries-cloudagent-python/pull/2509) [swcurran](https://github.com/swcurran) + - 0.10.2-rc0 [\#2484](https://github.com/hyperledger/aries-cloudagent-python/pull/2484) [swcurran](https://github.com/swcurran) + - 0.10.2 Patch Release - fix issue #2475, #2477 [\#2482](https://github.com/hyperledger/aries-cloudagent-python/pull/2480) [shaangill025](https://github.com/shaangill025) ## 0.10.1 @@ -414,50 +416,50 @@ deleted from ACA-Py storage. #### 0.10.0 Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - fix: outbound send status missing on path [\#2393](https://github.com/hyperledger/aries-cloudagent-python/pull/2393) [dbluhm](https://github.com/dbluhm) - - fix: keylist update response race condition [\#2391](https://github.com/hyperledger/aries-cloudagent-python/pull/2391) [dbluhm](https://github.com/dbluhm) + - fix: outbound send status missing on path [\#2393](https://github.com/hyperledger/aries-cloudagent-python/pull/2393) [dbluhm](https://github.com/dbluhm) + - fix: keylist update response race condition [\#2391](https://github.com/hyperledger/aries-cloudagent-python/pull/2391) [dbluhm](https://github.com/dbluhm) - DID Handling and Connection Establishment Updates/Fixes - - fix: handle stored afgo and findy docs in corrections [\#2450](https://github.com/hyperledger/aries-cloudagent-python/pull/2450) [dbluhm](https://github.com/dbluhm) - - chore: relax connections filter DID format [\#2451](https://github.com/hyperledger/aries-cloudagent-python/pull/2451) [chumbert](https://github.com/chumbert) - - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) - - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) - - fix: more diddoc corrections [\#2446](https://github.com/hyperledger/aries-cloudagent-python/pull/2446) [dbluhm](https://github.com/dbluhm) - - feat: resolve connection targets and permit connecting via public DID [\#2409](https://github.com/hyperledger/aries-cloudagent-python/pull/2409) [dbluhm](https://github.com/dbluhm) - - feat: add legacy peer did resolver [\#2404](https://github.com/hyperledger/aries-cloudagent-python/pull/2404) [dbluhm](https://github.com/dbluhm) - - Fix: Ensure event/webhook is emitted for multi-use invitations [\#2413](https://github.com/hyperledger/aries-cloudagent-python/pull/2413) [esune](https://github.com/esune) - - feat: add DID Exchange specific problem reports and reject endpoint [\#2394](https://github.com/hyperledger/aries-cloudagent-python/pull/2394) [dbluhm](https://github.com/dbluhm) - - fix: additional tweaks for did:web and other methods as public DIDs [\#2392](https://github.com/hyperledger/aries-cloudagent-python/pull/2392) [dbluhm](https://github.com/dbluhm) - - Fix empty ServiceDecorator in OobRecord causing 422 Unprocessable Entity Error [\#2362](https://github.com/hyperledger/aries-cloudagent-python/pull/2362) [ff137](https://github.com/ff137) - - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) + - fix: handle stored afgo and findy docs in corrections [\#2450](https://github.com/hyperledger/aries-cloudagent-python/pull/2450) [dbluhm](https://github.com/dbluhm) + - chore: relax connections filter DID format [\#2451](https://github.com/hyperledger/aries-cloudagent-python/pull/2451) [chumbert](https://github.com/chumbert) + - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) + - fix: ignore duplicate record errors on add key [\#2447](https://github.com/hyperledger/aries-cloudagent-python/pull/2447) [dbluhm](https://github.com/dbluhm) + - fix: more diddoc corrections [\#2446](https://github.com/hyperledger/aries-cloudagent-python/pull/2446) [dbluhm](https://github.com/dbluhm) + - feat: resolve connection targets and permit connecting via public DID [\#2409](https://github.com/hyperledger/aries-cloudagent-python/pull/2409) [dbluhm](https://github.com/dbluhm) + - feat: add legacy peer did resolver [\#2404](https://github.com/hyperledger/aries-cloudagent-python/pull/2404) [dbluhm](https://github.com/dbluhm) + - Fix: Ensure event/webhook is emitted for multi-use invitations [\#2413](https://github.com/hyperledger/aries-cloudagent-python/pull/2413) [esune](https://github.com/esune) + - feat: add DID Exchange specific problem reports and reject endpoint [\#2394](https://github.com/hyperledger/aries-cloudagent-python/pull/2394) [dbluhm](https://github.com/dbluhm) + - fix: additional tweaks for did:web and other methods as public DIDs [\#2392](https://github.com/hyperledger/aries-cloudagent-python/pull/2392) [dbluhm](https://github.com/dbluhm) + - Fix empty ServiceDecorator in OobRecord causing 422 Unprocessable Entity Error [\#2362](https://github.com/hyperledger/aries-cloudagent-python/pull/2362) [ff137](https://github.com/ff137) + - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) - Upgrading to Aries Askar Updates - - Add symlink to /home/indy/.indy_client for backwards compatibility [\#2443](https://github.com/hyperledger/aries-cloudagent-python/pull/2443) [esune](https://github.com/esune) + - Add symlink to /home/indy/.indy_client for backwards compatibility [\#2443](https://github.com/hyperledger/aries-cloudagent-python/pull/2443) [esune](https://github.com/esune) - Credential Exchange (Issue, Present) Updates - - fix: ensure request matches offer in JSON-LD exchanges, if sent [\#2341](https://github.com/hyperledger/aries-cloudagent-python/pull/2341) [dbluhm](https://github.com/dbluhm) - - BREAKING Extend --preserve-exchange-records to include Presentation Exchange. [\#2352](https://github.com/hyperledger/aries-cloudagent-python/pull/2352) [usingtechnology](https://github.com/usingtechnology) - - Correct the response type in send_rev_reg_def [\#2355](https://github.com/hyperledger/aries-cloudagent-python/pull/2355) [ff137](https://github.com/ff137) + - fix: ensure request matches offer in JSON-LD exchanges, if sent [\#2341](https://github.com/hyperledger/aries-cloudagent-python/pull/2341) [dbluhm](https://github.com/dbluhm) + - BREAKING Extend --preserve-exchange-records to include Presentation Exchange. [\#2352](https://github.com/hyperledger/aries-cloudagent-python/pull/2352) [usingtechnology](https://github.com/usingtechnology) + - Correct the response type in send_rev_reg_def [\#2355](https://github.com/hyperledger/aries-cloudagent-python/pull/2355) [ff137](https://github.com/ff137) - Multitenancy Updates and Fixes - - Multitenant check endorser_info before saving [\#2395](https://github.com/hyperledger/aries-cloudagent-python/pull/2395) [usingtechnology](https://github.com/usingtechnology) - - Feat: Support Selectable Write Ledger [\#2339](https://github.com/hyperledger/aries-cloudagent-python/pull/2339) [shaangill025](https://github.com/shaangill025) + - Multitenant check endorser_info before saving [\#2395](https://github.com/hyperledger/aries-cloudagent-python/pull/2395) [usingtechnology](https://github.com/usingtechnology) + - Feat: Support Selectable Write Ledger [\#2339](https://github.com/hyperledger/aries-cloudagent-python/pull/2339) [shaangill025](https://github.com/shaangill025) - Other Fixes, Demo, and Documentation Fixes - - Redis Plugins [redis_cache & redis_queue] documentation and docker related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) [shaangill025](https://github.com/shaangill025) - - Chore: fix marshmallow warnings [\#2398](https://github.com/hyperledger/aries-cloudagent-python/pull/2398) [ff137](https://github.com/ff137) - - Upgrade pre-commit and flake8 dependencies; fix flake8 warnings [\#2399](https://github.com/hyperledger/aries-cloudagent-python/pull/2399) [ff137](https://github.com/ff137) - - Corrected typo on mediator invitation configuration argument [\#2365](https://github.com/hyperledger/aries-cloudagent-python/pull/2365) [jorgefl0](https://github.com/jorgefl0) - - Add workaround for ARM based macs [\#2313](https://github.com/hyperledger/aries-cloudagent-python/pull/2313) [finnformica](https://github.com/finnformica) + - Redis Plugins [redis_cache & redis_queue] documentation and docker related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) [shaangill025](https://github.com/shaangill025) + - Chore: fix marshmallow warnings [\#2398](https://github.com/hyperledger/aries-cloudagent-python/pull/2398) [ff137](https://github.com/ff137) + - Upgrade pre-commit and flake8 dependencies; fix flake8 warnings [\#2399](https://github.com/hyperledger/aries-cloudagent-python/pull/2399) [ff137](https://github.com/ff137) + - Corrected typo on mediator invitation configuration argument [\#2365](https://github.com/hyperledger/aries-cloudagent-python/pull/2365) [jorgefl0](https://github.com/jorgefl0) + - Add workaround for ARM based macs [\#2313](https://github.com/hyperledger/aries-cloudagent-python/pull/2313) [finnformica](https://github.com/finnformica) - Dependencies and Internal Updates - - chore(deps): Bump certifi from 2023.5.7 to 2023.7.22 in /demo/playground/scripts dependencies [\#2354](https://github.com/hyperledger/aries-cloudagent-python/pull/2354) [dependabot bot](https://github.com/dependabot bot) + - chore(deps): Bump certifi from 2023.5.7 to 2023.7.22 in /demo/playground/scripts dependencies [\#2354](https://github.com/hyperledger/aries-cloudagent-python/pull/2354) [dependabot bot](https://github.com/dependabot bot) - CI/CD and Developer Tools/Productivity Updates - - Fix for nightly tests failing on Python 3.10 [\#2435](https://github.com/hyperledger/aries-cloudagent-python/pull/2435) [Gavinok](https://github.com/Gavinok) - - Don't run Snyk on forks [\#2429](https://github.com/hyperledger/aries-cloudagent-python/pull/2429) [ryjones](https://github.com/ryjones) - - Issue #2250 Nightly publish workflow [\#2421](https://github.com/hyperledger/aries-cloudagent-python/pull/2421) [Gavinok](https://github.com/Gavinok) - - Enable Snyk scanning [\#2418](https://github.com/hyperledger/aries-cloudagent-python/pull/2418) [ryjones](https://github.com/ryjones) - - Remove Indy tests from workflows [\#2415](https://github.com/hyperledger/aries-cloudagent-python/pull/2415) [dbluhm](https://github.com/dbluhm) + - Fix for nightly tests failing on Python 3.10 [\#2435](https://github.com/hyperledger/aries-cloudagent-python/pull/2435) [Gavinok](https://github.com/Gavinok) + - Don't run Snyk on forks [\#2429](https://github.com/hyperledger/aries-cloudagent-python/pull/2429) [ryjones](https://github.com/ryjones) + - Issue #2250 Nightly publish workflow [\#2421](https://github.com/hyperledger/aries-cloudagent-python/pull/2421) [Gavinok](https://github.com/Gavinok) + - Enable Snyk scanning [\#2418](https://github.com/hyperledger/aries-cloudagent-python/pull/2418) [ryjones](https://github.com/ryjones) + - Remove Indy tests from workflows [\#2415](https://github.com/hyperledger/aries-cloudagent-python/pull/2415) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.10.1 [\#2454](https://github.com/hyperledger/aries-cloudagent-python/pull/2454) [swcurran](https://github.com/swcurran) - - 0.10.0 [\#2452](https://github.com/hyperledger/aries-cloudagent-python/pull/2452) [swcurran](https://github.com/swcurran) - - 0.10.0-rc2 [\#2448](https://github.com/hyperledger/aries-cloudagent-python/pull/2448) [swcurran](https://github.com/swcurran) - - 0.10.0-rc1 [\#2442](https://github.com/hyperledger/aries-cloudagent-python/pull/2442) [swcurran](https://github.com/swcurran) - - 0.10.0-rc0 [\#2414](https://github.com/hyperledger/aries-cloudagent-python/pull/2414) [swcurran](https://github.com/swcurran) + - 0.10.1 [\#2454](https://github.com/hyperledger/aries-cloudagent-python/pull/2454) [swcurran](https://github.com/swcurran) + - 0.10.0 [\#2452](https://github.com/hyperledger/aries-cloudagent-python/pull/2452) [swcurran](https://github.com/swcurran) + - 0.10.0-rc2 [\#2448](https://github.com/hyperledger/aries-cloudagent-python/pull/2448) [swcurran](https://github.com/swcurran) + - 0.10.0-rc1 [\#2442](https://github.com/hyperledger/aries-cloudagent-python/pull/2442) [swcurran](https://github.com/swcurran) + - 0.10.0-rc0 [\#2414](https://github.com/hyperledger/aries-cloudagent-python/pull/2414) [swcurran](https://github.com/swcurran) ## 0.10.0 @@ -533,57 +535,57 @@ about changes you might need to make to your deployment. #### Categorized List of Pull Requests - DIDComm Messaging Improvements/Fixes - - BREAKING: feat: get queued outbound message in transport handle message [\#2170](https://github.com/hyperledger/aries-cloudagent-python/pull/2170) [dbluhm](https://github.com/dbluhm) + - BREAKING: feat: get queued outbound message in transport handle message [\#2170](https://github.com/hyperledger/aries-cloudagent-python/pull/2170) [dbluhm](https://github.com/dbluhm) - DID Handling and Connection Establishment Updates/Fixes - - Allow any did to be public [\#2295](https://github.com/hyperledger/aries-cloudagent-python/pull/2295) [mkempa](https://github.com/mkempa) - - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) - - Add Goal and Goal Code to OOB and DIDex Request [\#2294](https://github.com/hyperledger/aries-cloudagent-python/pull/2294) [usingtechnology](https://github.com/usingtechnology) - - Fix routing in set public did [\#2288](https://github.com/hyperledger/aries-cloudagent-python/pull/2288) [mkempa](https://github.com/mkempa) - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - BREAKING: Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) [mepeltier](https://github.com/mepeltier) - - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) [dbluhm](https://github.com/dbluhm) + - Allow any did to be public [\#2295](https://github.com/hyperledger/aries-cloudagent-python/pull/2295) [mkempa](https://github.com/mkempa) + - Feat: Added support for Ed25519Signature2020 signature type and Ed25519VerificationKey2020 [\#2241](https://github.com/hyperledger/aries-cloudagent-python/pull/2241) [dkulic](https://github.com/dkulic) + - Add Goal and Goal Code to OOB and DIDex Request [\#2294](https://github.com/hyperledger/aries-cloudagent-python/pull/2294) [usingtechnology](https://github.com/usingtechnology) + - Fix routing in set public did [\#2288](https://github.com/hyperledger/aries-cloudagent-python/pull/2288) [mkempa](https://github.com/mkempa) - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - BREAKING: Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) [mepeltier](https://github.com/mepeltier) + - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) [dbluhm](https://github.com/dbluhm) - Credential Exchange (Issue, Present) Updates - - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) - - Update to indy-credx 1.0 [\#2302](https://github.com/hyperledger/aries-cloudagent-python/pull/2302) [andrewwhitehead](https://github.com/andrewwhitehead) - - feat(anoncreds): Implement automated setup of revocation [\#2292](https://github.com/hyperledger/aries-cloudagent-python/pull/2292) [dbluhm](https://github.com/dbluhm) - - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) [dbluhm](https://github.com/dbluhm) - - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) - - Feature: JWT Sign and Verify Admin Endpoints with DID Support [\#2300](https://github.com/hyperledger/aries-cloudagent-python/pull/2300) [burdettadam](https://github.com/burdettadam) + - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) + - Update to indy-credx 1.0 [\#2302](https://github.com/hyperledger/aries-cloudagent-python/pull/2302) [andrewwhitehead](https://github.com/andrewwhitehead) + - feat(anoncreds): Implement automated setup of revocation [\#2292](https://github.com/hyperledger/aries-cloudagent-python/pull/2292) [dbluhm](https://github.com/dbluhm) + - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) [dbluhm](https://github.com/dbluhm) + - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) + - Feature: JWT Sign and Verify Admin Endpoints with DID Support [\#2300](https://github.com/hyperledger/aries-cloudagent-python/pull/2300) [burdettadam](https://github.com/burdettadam) - Multitenancy Updates and Fixes - - Fix: Track endorser and author roles in per-tenant settings [\#2331](https://github.com/hyperledger/aries-cloudagent-python/pull/2331) [shaangill025](https://github.com/shaangill025) - - Added base wallet provisioning details to Multitenancy.md [\#2328](https://github.com/hyperledger/aries-cloudagent-python/pull/2328) [esune](https://github.com/esune) + - Fix: Track endorser and author roles in per-tenant settings [\#2331](https://github.com/hyperledger/aries-cloudagent-python/pull/2331) [shaangill025](https://github.com/shaangill025) + - Added base wallet provisioning details to Multitenancy.md [\#2328](https://github.com/hyperledger/aries-cloudagent-python/pull/2328) [esune](https://github.com/esune) - Other Fixes, Demo, and Documentation Fixes - - Add more context to the ACA-Py Revocation handling documentation [\#2343](https://github.com/hyperledger/aries-cloudagent-python/pull/2343) [swcurran](https://github.com/swcurran) - - Document the Indy SDK to Askar Migration process [\#2340](https://github.com/hyperledger/aries-cloudagent-python/pull/2340) [swcurran](https://github.com/swcurran) - - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) - - chore: add indy deprecation warnings [\#2332](https://github.com/hyperledger/aries-cloudagent-python/pull/2332) [dbluhm](https://github.com/dbluhm) - - Fix alice/faber demo execution [\#2305](https://github.com/hyperledger/aries-cloudagent-python/pull/2305) [andrewwhitehead](https://github.com/andrewwhitehead) - - Add .indy_client folder to Askar only image. [\#2308](https://github.com/hyperledger/aries-cloudagent-python/pull/2308) [WadeBarnes](https://github.com/WadeBarnes) - - Add build step for indy-base image in run_demo [\#2299](https://github.com/hyperledger/aries-cloudagent-python/pull/2299) [usingtechnology](https://github.com/usingtechnology) - - Webhook over websocket clarification [\#2287](https://github.com/hyperledger/aries-cloudagent-python/pull/2287) [dbluhm](https://github.com/dbluhm) + - Add more context to the ACA-Py Revocation handling documentation [\#2343](https://github.com/hyperledger/aries-cloudagent-python/pull/2343) [swcurran](https://github.com/swcurran) + - Document the Indy SDK to Askar Migration process [\#2340](https://github.com/hyperledger/aries-cloudagent-python/pull/2340) [swcurran](https://github.com/swcurran) + - Add revocation registry rotate to faber demo [\#2333](https://github.com/hyperledger/aries-cloudagent-python/pull/2333) [usingtechnology](https://github.com/usingtechnology) + - chore: add indy deprecation warnings [\#2332](https://github.com/hyperledger/aries-cloudagent-python/pull/2332) [dbluhm](https://github.com/dbluhm) + - Fix alice/faber demo execution [\#2305](https://github.com/hyperledger/aries-cloudagent-python/pull/2305) [andrewwhitehead](https://github.com/andrewwhitehead) + - Add .indy_client folder to Askar only image. [\#2308](https://github.com/hyperledger/aries-cloudagent-python/pull/2308) [WadeBarnes](https://github.com/WadeBarnes) + - Add build step for indy-base image in run_demo [\#2299](https://github.com/hyperledger/aries-cloudagent-python/pull/2299) [usingtechnology](https://github.com/usingtechnology) + - Webhook over websocket clarification [\#2287](https://github.com/hyperledger/aries-cloudagent-python/pull/2287) [dbluhm](https://github.com/dbluhm) - ACA-Py Deployment Upgrade Changes - - Add Explicit/Offline marking mechanism for Upgrade [\#2204](https://github.com/hyperledger/aries-cloudagent-python/pull/2204) [shaangill025](https://github.com/shaangill025) + - Add Explicit/Offline marking mechanism for Upgrade [\#2204](https://github.com/hyperledger/aries-cloudagent-python/pull/2204) [shaangill025](https://github.com/shaangill025) - Plugin Handling Updates - - Feature: Add the ability to deny specific plugins from loading 0.7.4 [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) [frostyfrog](https://github.com/frostyfrog) + - Feature: Add the ability to deny specific plugins from loading 0.7.4 [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) [frostyfrog](https://github.com/frostyfrog) - Dependencies and Internal Updates - - upgrade pyjwt to latest; introduce leeway to jwt.decodet [\#2335](https://github.com/hyperledger/aries-cloudagent-python/pull/2335) [ff137](https://github.com/ff137) - - upgrade requests to latest [\#2336](https://github.com/hyperledger/aries-cloudagent-python/pull/2336) [ff137](https://github.com/ff137) - - upgrade packaging to latest [\#2334](https://github.com/hyperledger/aries-cloudagent-python/pull/2334) [ff137](https://github.com/ff137) - - chore: update PyYAML [\#2329](https://github.com/hyperledger/aries-cloudagent-python/pull/2329) [dbluhm](https://github.com/dbluhm) - - chore(deps): Bump aiohttp from 3.8.4 to 3.8.5 in /demo/playground/scripts dependencies [\#2325](https://github.com/hyperledger/aries-cloudagent-python/pull/2325) [dependabot bot](https://github.com/dependabot bot) - - ⬆️ upgrade marshmallow to latest [\#2322](https://github.com/hyperledger/aries-cloudagent-python/pull/2322) [ff137](https://github.com/ff137) - - fix: use python 3.9 in run_docker [\#2291](https://github.com/hyperledger/aries-cloudagent-python/pull/2291) [dbluhm](https://github.com/dbluhm) - - BREAKING!: drop python 3.6 support [\#2247](https://github.com/hyperledger/aries-cloudagent-python/pull/2247) [dbluhm](https://github.com/dbluhm) - - Minor revisions to the README.md and DevReadMe.md [\#2272](https://github.com/hyperledger/aries-cloudagent-python/pull/2272) [swcurran](https://github.com/swcurran) + - upgrade pyjwt to latest; introduce leeway to jwt.decodet [\#2335](https://github.com/hyperledger/aries-cloudagent-python/pull/2335) [ff137](https://github.com/ff137) + - upgrade requests to latest [\#2336](https://github.com/hyperledger/aries-cloudagent-python/pull/2336) [ff137](https://github.com/ff137) + - upgrade packaging to latest [\#2334](https://github.com/hyperledger/aries-cloudagent-python/pull/2334) [ff137](https://github.com/ff137) + - chore: update PyYAML [\#2329](https://github.com/hyperledger/aries-cloudagent-python/pull/2329) [dbluhm](https://github.com/dbluhm) + - chore(deps): Bump aiohttp from 3.8.4 to 3.8.5 in /demo/playground/scripts dependencies [\#2325](https://github.com/hyperledger/aries-cloudagent-python/pull/2325) [dependabot bot](https://github.com/dependabot bot) + - ⬆️ upgrade marshmallow to latest [\#2322](https://github.com/hyperledger/aries-cloudagent-python/pull/2322) [ff137](https://github.com/ff137) + - fix: use python 3.9 in run_docker [\#2291](https://github.com/hyperledger/aries-cloudagent-python/pull/2291) [dbluhm](https://github.com/dbluhm) + - BREAKING!: drop python 3.6 support [\#2247](https://github.com/hyperledger/aries-cloudagent-python/pull/2247) [dbluhm](https://github.com/dbluhm) + - Minor revisions to the README.md and DevReadMe.md [\#2272](https://github.com/hyperledger/aries-cloudagent-python/pull/2272) [swcurran](https://github.com/swcurran) - ACA-Py Administrative Updates - - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) + - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) - CI/CD and Developer Tools/Productivity Updates - - Cancel in-progress workflows when PR is updated [\#2303](https://github.com/hyperledger/aries-cloudagent-python/pull/2303) [andrewwhitehead](https://github.com/andrewwhitehead) - - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) [dbluhm](https://github.com/dbluhm) - - Add devcontainer for ACA-Py [\#2267](https://github.com/hyperledger/aries-cloudagent-python/pull/2267) [usingtechnology](https://github.com/usingtechnology) - - Docker images and GHA for publishing images help wanted [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) [dbluhm](https://github.com/dbluhm) - - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) [dbluhm](https://github.com/dbluhm) + - Cancel in-progress workflows when PR is updated [\#2303](https://github.com/hyperledger/aries-cloudagent-python/pull/2303) [andrewwhitehead](https://github.com/andrewwhitehead) + - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) [dbluhm](https://github.com/dbluhm) + - Add devcontainer for ACA-Py [\#2267](https://github.com/hyperledger/aries-cloudagent-python/pull/2267) [usingtechnology](https://github.com/usingtechnology) + - Docker images and GHA for publishing images help wanted [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) [dbluhm](https://github.com/dbluhm) + - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) [dbluhm](https://github.com/dbluhm) - Release management pull requests - - 0.9.0 [\#2344](https://github.com/hyperledger/aries-cloudagent-python/pull/2344) [swcurran](https://github.com/swcurran) - - 0.9.0-rc0 [\#2338](https://github.com/hyperledger/aries-cloudagent-python/pull/2338) [swcurran](https://github.com/swcurran) + - 0.9.0 [\#2344](https://github.com/hyperledger/aries-cloudagent-python/pull/2344) [swcurran](https://github.com/swcurran) + - 0.9.0-rc0 [\#2338](https://github.com/hyperledger/aries-cloudagent-python/pull/2338) [swcurran](https://github.com/swcurran) ## 0.8.2 @@ -614,44 +616,44 @@ There are no breaking changes in this release. #### Categorized List of Pull Requests - Connections Fixes/Updates - - Resolve definitions.py fix to fix backwards compatibility break in plugins [\#2255](https://github.com/hyperledger/aries-cloudagent-python/pull/2255) [usingtechnology](https://github.com/usingtechnology) - - Add support for JsonWebKey2020 for the connection invitations [\#2173](https://github.com/hyperledger/aries-cloudagent-python/pull/2173) [dkulic](https://github.com/dkulic) - - fix: only cache completed connection targets [\#2240](https://github.com/hyperledger/aries-cloudagent-python/pull/2240) [dbluhm](https://github.com/dbluhm) - - Connection target should not be limited only to indy dids [\#2229](https://github.com/hyperledger/aries-cloudagent-python/pull/2229) [dkulic](https://github.com/dkulic) - - Disable webhook trigger on initial response to multi-use connection invitation [\#2223](https://github.com/hyperledger/aries-cloudagent-python/pull/2223) [esune](https://github.com/esune) + - Resolve definitions.py fix to fix backwards compatibility break in plugins [\#2255](https://github.com/hyperledger/aries-cloudagent-python/pull/2255) [usingtechnology](https://github.com/usingtechnology) + - Add support for JsonWebKey2020 for the connection invitations [\#2173](https://github.com/hyperledger/aries-cloudagent-python/pull/2173) [dkulic](https://github.com/dkulic) + - fix: only cache completed connection targets [\#2240](https://github.com/hyperledger/aries-cloudagent-python/pull/2240) [dbluhm](https://github.com/dbluhm) + - Connection target should not be limited only to indy dids [\#2229](https://github.com/hyperledger/aries-cloudagent-python/pull/2229) [dkulic](https://github.com/dkulic) + - Disable webhook trigger on initial response to multi-use connection invitation [\#2223](https://github.com/hyperledger/aries-cloudagent-python/pull/2223) [esune](https://github.com/esune) - Credential Exchange (Issue, Present) Updates - - Pass document loader to jsonld.expand [\#2175](https://github.com/hyperledger/aries-cloudagent-python/pull/2175) [andrewwhitehead](https://github.com/andrewwhitehead) + - Pass document loader to jsonld.expand [\#2175](https://github.com/hyperledger/aries-cloudagent-python/pull/2175) [andrewwhitehead](https://github.com/andrewwhitehead) - Multi-tenancy fixes/updates - - Allow Configuration Settings on a per-tenant basis [\#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) [shaangill025](https://github.com/shaangill025) - - stand up multiple agents (single and multi) for local development and testing [\#2230](https://github.com/hyperledger/aries-cloudagent-python/pull/2230) [usingtechnology](https://github.com/usingtechnology) - - Multi-tenant self-managed mediation verkey lookup [\#2232](https://github.com/hyperledger/aries-cloudagent-python/pull/2232) [usingtechnology](https://github.com/usingtechnology) - - fix: route multitenant connectionless oob invitation [\#2243](https://github.com/hyperledger/aries-cloudagent-python/pull/2243) [TimoGlastra](https://github.com/TimoGlastra) - - Fix multitenant/mediation in demo [\#2075](https://github.com/hyperledger/aries-cloudagent-python/pull/2075) [ianco](https://github.com/ianco) + - Allow Configuration Settings on a per-tenant basis [\#2233](https://github.com/hyperledger/aries-cloudagent-python/pull/2233) [shaangill025](https://github.com/shaangill025) + - stand up multiple agents (single and multi) for local development and testing [\#2230](https://github.com/hyperledger/aries-cloudagent-python/pull/2230) [usingtechnology](https://github.com/usingtechnology) + - Multi-tenant self-managed mediation verkey lookup [\#2232](https://github.com/hyperledger/aries-cloudagent-python/pull/2232) [usingtechnology](https://github.com/usingtechnology) + - fix: route multitenant connectionless oob invitation [\#2243](https://github.com/hyperledger/aries-cloudagent-python/pull/2243) [TimoGlastra](https://github.com/TimoGlastra) + - Fix multitenant/mediation in demo [\#2075](https://github.com/hyperledger/aries-cloudagent-python/pull/2075) [ianco](https://github.com/ianco) - Other Bug and Documentation Fixes - - Assign ~thread.thid with thread_id value [\#2261](https://github.com/hyperledger/aries-cloudagent-python/pull/2261) [usingtechnology](https://github.com/usingtechnology) - - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) - - Provide an optional Profile to the verification key strategy [\#2265](https://github.com/hyperledger/aries-cloudagent-python/pull/2265) [yvgny](https://github.com/yvgny) - - refactor: Extract verification method ID generation to a separate class [\#2235](https://github.com/hyperledger/aries-cloudagent-python/pull/2235) [yvgny](https://github.com/yvgny) - - Create .readthedocs.yaml file [\#2268](https://github.com/hyperledger/aries-cloudagent-python/pull/2268) [swcurran](https://github.com/swcurran) - - feat(did creation route): reject unregistered did methods [\#2262](https://github.com/hyperledger/aries-cloudagent-python/pull/2262) [chumbert](https://github.com/chumbert) - - ./run_demo performance -c 1 --mediation --timing --trace-log [#2245](https://github.com/hyperledger/aries-cloudagent-python/pull/2245) [usingtechnology](https://github.com/usingtechnology) - - Fix formatting and grammatical errors in different readme's [\#2222](https://github.com/hyperledger/aries-cloudagent-python/pull/2222) [ff137](https://github.com/ff137) - - Fix broken link in README [\#2221](https://github.com/hyperledger/aries-cloudagent-python/pull/2221) [ff137](https://github.com/ff137) - - fix: run only on main, forks ok [\#2166](https://github.com/hyperledger/aries-cloudagent-python/pull/2166) [anwalker293](https://github.com/anwalker293) - - Update Alice Wants a JSON-LD Credential to fix invocation [\#2219](https://github.com/hyperledger/aries-cloudagent-python/pull/2219) [swcurran](https://github.com/swcurran) + - Assign ~thread.thid with thread_id value [\#2261](https://github.com/hyperledger/aries-cloudagent-python/pull/2261) [usingtechnology](https://github.com/usingtechnology) + - Fix: Do not replace public verkey on mediator [\#2269](https://github.com/hyperledger/aries-cloudagent-python/pull/2269) [mkempa](https://github.com/mkempa) + - Provide an optional Profile to the verification key strategy [\#2265](https://github.com/hyperledger/aries-cloudagent-python/pull/2265) [yvgny](https://github.com/yvgny) + - refactor: Extract verification method ID generation to a separate class [\#2235](https://github.com/hyperledger/aries-cloudagent-python/pull/2235) [yvgny](https://github.com/yvgny) + - Create .readthedocs.yaml file [\#2268](https://github.com/hyperledger/aries-cloudagent-python/pull/2268) [swcurran](https://github.com/swcurran) + - feat(did creation route): reject unregistered did methods [\#2262](https://github.com/hyperledger/aries-cloudagent-python/pull/2262) [chumbert](https://github.com/chumbert) + - ./run_demo performance -c 1 --mediation --timing --trace-log [#2245](https://github.com/hyperledger/aries-cloudagent-python/pull/2245) [usingtechnology](https://github.com/usingtechnology) + - Fix formatting and grammatical errors in different readme's [\#2222](https://github.com/hyperledger/aries-cloudagent-python/pull/2222) [ff137](https://github.com/ff137) + - Fix broken link in README [\#2221](https://github.com/hyperledger/aries-cloudagent-python/pull/2221) [ff137](https://github.com/ff137) + - fix: run only on main, forks ok [\#2166](https://github.com/hyperledger/aries-cloudagent-python/pull/2166) [anwalker293](https://github.com/anwalker293) + - Update Alice Wants a JSON-LD Credential to fix invocation [\#2219](https://github.com/hyperledger/aries-cloudagent-python/pull/2219) [swcurran](https://github.com/swcurran) - Dependencies and Internal Updates - - Bump requests from 2.30.0 to 2.31.0 in /demo/playground/scripts dependenciesPull requests that update a dependency file [\#2238](https://github.com/hyperledger/aries-cloudagent-python/pull/2238) [dependabot bot](https://github.com/dependabot) - - Upgrade codegen tools in scripts/generate-open-api-spec and publish Swagger 2.0 and OpenAPI 3.0 specs [\#2246](https://github.com/hyperledger/aries-cloudagent-python/pull/2246) [ff137](https://github.com/ff137) + - Bump requests from 2.30.0 to 2.31.0 in /demo/playground/scripts dependenciesPull requests that update a dependency file [\#2238](https://github.com/hyperledger/aries-cloudagent-python/pull/2238) [dependabot bot](https://github.com/dependabot) + - Upgrade codegen tools in scripts/generate-open-api-spec and publish Swagger 2.0 and OpenAPI 3.0 specs [\#2246](https://github.com/hyperledger/aries-cloudagent-python/pull/2246) [ff137](https://github.com/ff137) - ACA-Py Administrative Updates - - Propose adding Jason Sherman [usingtechnology](https://github.com/usingtechnology) as a Maintainer [\#2263](https://github.com/hyperledger/aries-cloudagent-python/pull/2263) [swcurran](https://github.com/swcurran) - - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) + - Propose adding Jason Sherman [usingtechnology](https://github.com/usingtechnology) as a Maintainer [\#2263](https://github.com/hyperledger/aries-cloudagent-python/pull/2263) [swcurran](https://github.com/swcurran) + - Updating Maintainers list to be accurate and using the TOC format [\#2258](https://github.com/hyperledger/aries-cloudagent-python/pull/2258) [swcurran](https://github.com/swcurran) - Message Tracing/Timing Updates - - Add updated ELK stack for demos. [\#2236](https://github.com/hyperledger/aries-cloudagent-python/pull/2236) [usingtechnology](https://github.com/usingtechnology) + - Add updated ELK stack for demos. [\#2236](https://github.com/hyperledger/aries-cloudagent-python/pull/2236) [usingtechnology](https://github.com/usingtechnology) - Release management pull requests - - 0.8.2 [\#2285](https://github.com/hyperledger/aries-cloudagent-python/pull/2285) [swcurran](https://github.com/swcurran) - - 0.8.2-rc2 [\#2284](https://github.com/hyperledger/aries-cloudagent-python/pull/2283) [swcurran](https://github.com/swcurran) - - 0.8.2-rc1 [\#2282](https://github.com/hyperledger/aries-cloudagent-python/pull/2282) [swcurran](https://github.com/swcurran) - - 0.8.2-rc0 [\#2260](https://github.com/hyperledger/aries-cloudagent-python/pull/2260) [swcurran](https://github.com/swcurran) + - 0.8.2 [\#2285](https://github.com/hyperledger/aries-cloudagent-python/pull/2285) [swcurran](https://github.com/swcurran) + - 0.8.2-rc2 [\#2284](https://github.com/hyperledger/aries-cloudagent-python/pull/2283) [swcurran](https://github.com/swcurran) + - 0.8.2-rc1 [\#2282](https://github.com/hyperledger/aries-cloudagent-python/pull/2282) [swcurran](https://github.com/swcurran) + - 0.8.2-rc0 [\#2260](https://github.com/hyperledger/aries-cloudagent-python/pull/2260) [swcurran](https://github.com/swcurran) ## 0.8.1 @@ -668,12 +670,12 @@ Key points about upgrading for those with production, pre-0.8.1 ACA-Py deploymen - Upgrades now happen **automatically** on startup, when needed. - The version of the last executed upgrade, even if it is a "no change" upgrade, is put into secure storage and is used to detect when future upgrades are needed. - - Upgrades are needed when the running version is greater than the version is + - Upgrades are needed when the running version is greater than the version is secure storage. - If you have an existing, pre-0.8.1 deployment with many connection records, there may be a delay in starting as an upgrade will be run that loads and saves every connection record, updating the data in the record in the process. - - A mechanism is to be added (see [Issue #2201]) for preventing an upgrade + - A mechanism is to be added (see [Issue #2201]) for preventing an upgrade running if it should not be run automatically, and requires using the `upgrade` command. To date, there has been no need for this feature. - See the [Upgrading ACA-Py] document for more details. @@ -691,7 +693,7 @@ We have also noted that in some container orchestration environments such as install correctly in other environments (such as in `docker compose` setups). [\#2116]: https://github.com/hyperledger/aries-cloudagent-python/issues/2116 -[Upgrading ACA-Py]: ./UpgradingACA-Py.md +[Upgrading ACA-Py]: ../deploying/UpgradingACA-Py [Issue #2201]: https://github.com/hyperledger/aries-cloudagent-python/issues/2201 [Aries Askar]: https://github.com/hyperledger/aries-askar [Red Hat's OpenShift]: https://www.openshift.com/products/container-platform/ @@ -702,22 +704,22 @@ install correctly in other environments (such as in `docker compose` setups). #### Categorized List of Pull Requests - Fixes for the `upgrade` Command - - Change upgrade definition file entry from 0.8.0 to 0.8.1 [\#2203](https://github.com/hyperledger/aries-cloudagent-python/pull/2203) [swcurran](https://github.com/swcurran) - - Add Upgrading ACA-Py document [\#2200](https://github.com/hyperledger/aries-cloudagent-python/pull/2200) [swcurran](https://github.com/swcurran) - - Fix: Indy WalletAlreadyOpenedError during upgrade process [\#2196](https://github.com/hyperledger/aries-cloudagent-python/pull/2196) [shaangill025](https://github.com/shaangill025) - - Fix: Resolve Upgrade Config file in Container [\#2193](https://github.com/hyperledger/aries-cloudagent-python/pull/2193) [shaangill025](https://github.com/shaangill025) - - Update and automate ACA-Py upgrade process [\#2185](https://github.com/hyperledger/aries-cloudagent-python/pull/2185) [shaangill025](https://github.com/shaangill025) - - Adds the upgrade command YML file to the PyPi Release [\#2179](https://github.com/hyperledger/aries-cloudagent-python/pull/2179) [swcurran](https://github.com/swcurran) + - Change upgrade definition file entry from 0.8.0 to 0.8.1 [\#2203](https://github.com/hyperledger/aries-cloudagent-python/pull/2203) [swcurran](https://github.com/swcurran) + - Add Upgrading ACA-Py document [\#2200](https://github.com/hyperledger/aries-cloudagent-python/pull/2200) [swcurran](https://github.com/swcurran) + - Fix: Indy WalletAlreadyOpenedError during upgrade process [\#2196](https://github.com/hyperledger/aries-cloudagent-python/pull/2196) [shaangill025](https://github.com/shaangill025) + - Fix: Resolve Upgrade Config file in Container [\#2193](https://github.com/hyperledger/aries-cloudagent-python/pull/2193) [shaangill025](https://github.com/shaangill025) + - Update and automate ACA-Py upgrade process [\#2185](https://github.com/hyperledger/aries-cloudagent-python/pull/2185) [shaangill025](https://github.com/shaangill025) + - Adds the upgrade command YML file to the PyPi Release [\#2179](https://github.com/hyperledger/aries-cloudagent-python/pull/2179) [swcurran](https://github.com/swcurran) - Test and Documentation - - 3.7 and 3.10 unittests fix [\#2187](https://github.com/hyperledger/aries-cloudagent-python/pull/2187) [Jsyro](https://github.com/Jsyro) - - Doc update and some test scripts [\#2189](https://github.com/hyperledger/aries-cloudagent-python/pull/2189) [ianco](https://github.com/ianco) - - Create UnitTests.md [\#2183](https://github.com/hyperledger/aries-cloudagent-python/pull/2183) [swcurran](https://github.com/swcurran) - - Add link to recorded session about the ACA-Py Integration tests [\#2184](https://github.com/hyperledger/aries-cloudagent-python/pull/2184) [swcurran](https://github.com/swcurran) + - 3.7 and 3.10 unittests fix [\#2187](https://github.com/hyperledger/aries-cloudagent-python/pull/2187) [Jsyro](https://github.com/Jsyro) + - Doc update and some test scripts [\#2189](https://github.com/hyperledger/aries-cloudagent-python/pull/2189) [ianco](https://github.com/ianco) + - Create UnitTests.md [\#2183](https://github.com/hyperledger/aries-cloudagent-python/pull/2183) [swcurran](https://github.com/swcurran) + - Add link to recorded session about the ACA-Py Integration tests [\#2184](https://github.com/hyperledger/aries-cloudagent-python/pull/2184) [swcurran](https://github.com/swcurran) - Release management pull requests - - 0.8.1 [\#2207](https://github.com/hyperledger/aries-cloudagent-python/pull/2207) [swcurran](https://github.com/swcurran) - - 0.8.1-rc2 [\#2198](https://github.com/hyperledger/aries-cloudagent-python/pull/2198) [swcurran](https://github.com/swcurran) - - 0.8.1-rc1 [\#2194](https://github.com/hyperledger/aries-cloudagent-python/pull/2194) [swcurran](https://github.com/swcurran) - - 0.8.1-rc0 [\#2190](https://github.com/hyperledger/aries-cloudagent-python/pull/2190) [swcurran](https://github.com/swcurran) + - 0.8.1 [\#2207](https://github.com/hyperledger/aries-cloudagent-python/pull/2207) [swcurran](https://github.com/swcurran) + - 0.8.1-rc2 [\#2198](https://github.com/hyperledger/aries-cloudagent-python/pull/2198) [swcurran](https://github.com/swcurran) + - 0.8.1-rc1 [\#2194](https://github.com/hyperledger/aries-cloudagent-python/pull/2194) [swcurran](https://github.com/swcurran) + - 0.8.1-rc0 [\#2190](https://github.com/hyperledger/aries-cloudagent-python/pull/2190) [swcurran](https://github.com/swcurran) ## 0.8.0 @@ -834,15 +836,15 @@ ACA-Py, adding you wallet settings: #### Categorized List of Pull Requests - Verifiable credential, presentation and revocation handling updates - - **BREAKING:** Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](victorlee0505) - - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) - - feat: add verification method issue-credentials-2.0/send endpoint [\#2135](https://github.com/hyperledger/aries-cloudagent-python/pull/2135) [chumbert](https://github.com/chumbert) - - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) - - Feature: enabled handling VPs (request, creation, verification) with different VCs [\#1956](https://github.com/hyperledger/aries-cloudagent-python/pull/1956) ([teanas](https://github.com/teanas)) - - fix: update issue-credential endpoint summaries [\#1997](https://github.com/hyperledger/aries-cloudagent-python/pull/1997) ([PeterStrob](https://github.com/PeterStrob)) - - fix claim format designation in presentation submission [\#2013](https://github.com/hyperledger/aries-cloudagent-python/pull/2013) ([rmnre](https://github.com/rmnre)) - - \#2041 - Issue JSON-LD has invalid Admin API documentation [\#2046](https://github.com/hyperledger/aries-cloudagent-python/pull/2046) ([jfblier-amplitude](https://github.com/jfblier-amplitude)) - - Previously flagged in release 1.0.0-rc1 + - **BREAKING:** Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](https://github.com/victorlee0505) + - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) + - feat: add verification method issue-credentials-2.0/send endpoint [\#2135](https://github.com/hyperledger/aries-cloudagent-python/pull/2135) [chumbert](https://github.com/chumbert) + - Respect auto-verify-presentation flag in present proof v1 and v2 [\#2097](https://github.com/hyperledger/aries-cloudagent-python/pull/2097) [dbluhm](https://github.com/dbluhm) + - Feature: enabled handling VPs (request, creation, verification) with different VCs [\#1956](https://github.com/hyperledger/aries-cloudagent-python/pull/1956) ([teanas](https://github.com/teanas)) + - fix: update issue-credential endpoint summaries [\#1997](https://github.com/hyperledger/aries-cloudagent-python/pull/1997) ([PeterStrob](https://github.com/PeterStrob)) + - fix claim format designation in presentation submission [\#2013](https://github.com/hyperledger/aries-cloudagent-python/pull/2013) ([rmnre](https://github.com/rmnre)) + - \#2041 - Issue JSON-LD has invalid Admin API documentation [\#2046](https://github.com/hyperledger/aries-cloudagent-python/pull/2046) ([jfblier-amplitude](https://github.com/jfblier-amplitude)) + - Previously flagged in release 1.0.0-rc1 - Refactor ledger correction code and insert into revocation error handling [\#1892](https://github.com/hyperledger/aries-cloudagent-python/pull/1892) ([ianco](https://github.com/ianco)) - Indy ledger fixes and cleanups [\#1870](https://github.com/hyperledger/aries-cloudagent-python/pull/1870) ([andrewwhitehead](https://github.com/andrewwhitehead)) - Refactoring of revocation registry creation [\#1813](https://github.com/hyperledger/aries-cloudagent-python/pull/1813) ([andrewwhitehead](https://github.com/andrewwhitehead)) @@ -853,13 +855,13 @@ ACA-Py, adding you wallet settings: - Send webhooks upon record/credential deletion [\#1906](https://github.com/hyperledger/aries-cloudagent-python/pull/1906) ([frostyfrog](https://github.com/frostyfrog)) - Out of Band (OOB) and DID Exchange / Connection Handling / Mediator - - UPGRADE: Fix multi-use invitation performance [\#2116](https://github.com/hyperledger/aries-cloudagent-python/pull/2116) [reflectivedevelopment](https://github.com/reflectivedevelopment) - - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) ([dbluhm](https://github.com/dbluhm)) - - Fix for mediator load testing race condition when scaling horizontally [\#2009](https://github.com/hyperledger/aries-cloudagent-python/pull/2009) ([ianco](https://github.com/ianco)) - - **BREAKING:** Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) ([mepeltier](https://github.com/mepeltier)) - - Do not reject OOB invitation with unknown handshake protocol\(s\) [\#2060](https://github.com/hyperledger/aries-cloudagent-python/pull/2060) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - fix: fix connection timing bug [\#2099](https://github.com/hyperledger/aries-cloudagent-python/pull/2099) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) - - Previously flagged in release 1.0.0-rc1 + - UPGRADE: Fix multi-use invitation performance [\#2116](https://github.com/hyperledger/aries-cloudagent-python/pull/2116) [reflectivedevelopment](https://github.com/reflectivedevelopment) + - fix: public did mediator routing keys as did keys [\#1977](https://github.com/hyperledger/aries-cloudagent-python/pull/1977) ([dbluhm](https://github.com/dbluhm)) + - Fix for mediator load testing race condition when scaling horizontally [\#2009](https://github.com/hyperledger/aries-cloudagent-python/pull/2009) ([ianco](https://github.com/ianco)) + - **BREAKING:** Allow multi-use public invites and public invites with metadata [\#2034](https://github.com/hyperledger/aries-cloudagent-python/pull/2034) ([mepeltier](https://github.com/mepeltier)) + - Do not reject OOB invitation with unknown handshake protocol\(s\) [\#2060](https://github.com/hyperledger/aries-cloudagent-python/pull/2060) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - fix: fix connection timing bug [\#2099](https://github.com/hyperledger/aries-cloudagent-python/pull/2099) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) + - Previously flagged in release 1.0.0-rc1 - Fix: `--mediator-invitation` with OOB invitation + cleanup [\#1970](https://github.com/hyperledger/aries-cloudagent-python/pull/1970) ([shaangill025](https://github.com/shaangill025)) - include image\_url in oob invitation [\#1966](https://github.com/hyperledger/aries-cloudagent-python/pull/1966) ([Zzocker](https://github.com/Zzocker)) - feat: 00B v1.1 support [\#1962](https://github.com/hyperledger/aries-cloudagent-python/pull/1962) ([shaangill025](https://github.com/shaangill025)) @@ -869,12 +871,12 @@ ACA-Py, adding you wallet settings: - Feat/public did endpoints for agents behind mediators [\#1899](https://github.com/hyperledger/aries-cloudagent-python/pull/1899) ([cjhowland](https://github.com/cjhowland)) - DID Registration and Resolution related updates - - feat: allow marking non-SOV DIDs as public [\#2144](https://github.com/hyperledger/aries-cloudagent-python/pull/2144) [chumbert](https://github.com/chumbert) - - fix: askar exception message always displaying null DID [\#2155](https://github.com/hyperledger/aries-cloudagent-python/pull/2155) [chumbert](https://github.com/chumbert) - - feat: enable creation of DIDs for all registered methods [\#2067](https://github.com/hyperledger/aries-cloudagent-python/pull/2067) ([chumbert](https://github.com/chumbert)) - - fix: create local DID return schema [\#2086](https://github.com/hyperledger/aries-cloudagent-python/pull/2086) ([chumbert](https://github.com/chumbert)) - - feat: universal resolver - configurable authentication [\#2095](https://github.com/hyperledger/aries-cloudagent-python/pull/2095) ([chumbert](https://github.com/chumbert)) - - Previously flagged in release 1.0.0-rc1 + - feat: allow marking non-SOV DIDs as public [\#2144](https://github.com/hyperledger/aries-cloudagent-python/pull/2144) [chumbert](https://github.com/chumbert) + - fix: askar exception message always displaying null DID [\#2155](https://github.com/hyperledger/aries-cloudagent-python/pull/2155) [chumbert](https://github.com/chumbert) + - feat: enable creation of DIDs for all registered methods [\#2067](https://github.com/hyperledger/aries-cloudagent-python/pull/2067) ([chumbert](https://github.com/chumbert)) + - fix: create local DID return schema [\#2086](https://github.com/hyperledger/aries-cloudagent-python/pull/2086) ([chumbert](https://github.com/chumbert)) + - feat: universal resolver - configurable authentication [\#2095](https://github.com/hyperledger/aries-cloudagent-python/pull/2095) ([chumbert](https://github.com/chumbert)) + - Previously flagged in release 1.0.0-rc1 - feat: add universal resolver [\#1866](https://github.com/hyperledger/aries-cloudagent-python/pull/1866) ([dbluhm](https://github.com/dbluhm)) - fix: resolve dids following new endpoint rules [\#1863](https://github.com/hyperledger/aries-cloudagent-python/pull/1863) ([dbluhm](https://github.com/dbluhm)) - fix: didx request cannot be accepted [\#1881](https://github.com/hyperledger/aries-cloudagent-python/pull/1881) ([rmnre](https://github.com/rmnre)) @@ -884,35 +886,35 @@ ACA-Py, adding you wallet settings: - Use did:key for recipient keys [\#1886](https://github.com/hyperledger/aries-cloudagent-python/pull/1886) ([frostyfrog](https://github.com/frostyfrog)) - Hyperledger Indy Endorser/Author Transaction Handling - - Update some of the demo Readme and Endorser instructions [\#2122](https://github.com/hyperledger/aries-cloudagent-python/pull/2122) [swcurran](https://github.com/swcurran) - - Special handling for the write ledger [\#2030](https://github.com/hyperledger/aries-cloudagent-python/pull/2030) ([ianco](https://github.com/ianco)) - - Previously flagged in release 1.0.0-rc1 + - Update some of the demo Readme and Endorser instructions [\#2122](https://github.com/hyperledger/aries-cloudagent-python/pull/2122) [swcurran](https://github.com/swcurran) + - Special handling for the write ledger [\#2030](https://github.com/hyperledger/aries-cloudagent-python/pull/2030) ([ianco](https://github.com/ianco)) + - Previously flagged in release 1.0.0-rc1 - Fix/txn job setting [\#1994](https://github.com/hyperledger/aries-cloudagent-python/pull/1994) ([ianco](https://github.com/ianco)) - chore: fix ACAPY\_PROMOTE-AUTHOR-DID flag [\#1978](https://github.com/hyperledger/aries-cloudagent-python/pull/1978) ([morrieinmaas](https://github.com/morrieinmaas)) - Endorser write DID transaction [\#1938](https://github.com/hyperledger/aries-cloudagent-python/pull/1938) ([ianco](https://github.com/ianco)) - Endorser doc updates and some bug fixes [\#1926](https://github.com/hyperledger/aries-cloudagent-python/pull/1926) ([ianco](https://github.com/ianco)) - Admin API Additions - - fix: response type on delete-tails-files endpoint [\#2133](https://github.com/hyperledger/aries-cloudagent-python/pull/2133) [chumbert](https://github.com/chumbert) - - OpenAPI validation fixes [\#2127](https://github.com/hyperledger/aries-cloudagent-python/pull/2127) [loneil](https://github.com/loneil) - - Delete tail files [\#2103](https://github.com/hyperledger/aries-cloudagent-python/pull/2103) [ramreddychalla94](https://github.com/ramreddychalla94) + - fix: response type on delete-tails-files endpoint [\#2133](https://github.com/hyperledger/aries-cloudagent-python/pull/2133) [chumbert](https://github.com/chumbert) + - OpenAPI validation fixes [\#2127](https://github.com/hyperledger/aries-cloudagent-python/pull/2127) [loneil](https://github.com/loneil) + - Delete tail files [\#2103](https://github.com/hyperledger/aries-cloudagent-python/pull/2103) [ramreddychalla94](https://github.com/ramreddychalla94) - Startup Command Line / Environment / YAML Parameter Updates - - Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](victorlee0505) - - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) - - Add missing --mediator-connections-invite cmd arg info to docs [\#2051](https://github.com/hyperledger/aries-cloudagent-python/pull/2051) ([matrixik](https://github.com/matrixik)) - - Issue \#2068 boolean flag change to support HEAD requests to default route [\#2077](https://github.com/hyperledger/aries-cloudagent-python/pull/2077) ([johnekent](https://github.com/johnekent)) - - Previously flagged in release 1.0.0-rc1 + - Update webhook message to terse form [default, added startup flag --debug-webhooks for full form [\#2145](https://github.com/hyperledger/aries-cloudagent-python/pull/2145) by [victorlee0505](https://github.com/victorlee0505) + - Add startup flag --light-weight-webhook to trim down outbound webhook payload [\#1941](https://github.com/hyperledger/aries-cloudagent-python/pull/1941) [victorlee0505](https://github.com/victorlee0505) + - Add missing --mediator-connections-invite cmd arg info to docs [\#2051](https://github.com/hyperledger/aries-cloudagent-python/pull/2051) ([matrixik](https://github.com/matrixik)) + - Issue \#2068 boolean flag change to support HEAD requests to default route [\#2077](https://github.com/hyperledger/aries-cloudagent-python/pull/2077) ([johnekent](https://github.com/johnekent)) + - Previously flagged in release 1.0.0-rc1 - Add seed command line parameter but use only if also an "allow insecure seed" parameter is set [\#1714](https://github.com/hyperledger/aries-cloudagent-python/pull/1714) ([DaevMithran](https://github.com/DaevMithran)) - Internal Aries framework data handling updates - - fix: resolver api schema inconsistency [\#2112](https://github.com/hyperledger/aries-cloudagent-python/pull/2112) ([TimoGlastra](https://github.com/chumbert)) - - fix: return if return route but no response [\#1853](https://github.com/hyperledger/aries-cloudagent-python/pull/1853) ([TimoGlastra](https://github.com/TimoGlastra)) - - Multi-ledger/Multi-tenant issues [\#2022](https://github.com/hyperledger/aries-cloudagent-python/pull/2022) ([ianco](https://github.com/ianco)) - - fix: Correct typo in model -- required spelled incorrectly [\#2031](https://github.com/hyperledger/aries-cloudagent-python/pull/2031) ([swcurran](https://github.com/swcurran)) - - Code formatting [\#2053](https://github.com/hyperledger/aries-cloudagent-python/pull/2053) ([ianco](https://github.com/ianco)) - - Improved validation of record state attributes [\#2071](https://github.com/hyperledger/aries-cloudagent-python/pull/2071) ([rmnre](https://github.com/rmnre)) - - Previously flagged in release 1.0.0-rc1 + - fix: resolver api schema inconsistency [\#2112](https://github.com/hyperledger/aries-cloudagent-python/pull/2112) ([TimoGlastra](https://github.com/chumbert)) + - fix: return if return route but no response [\#1853](https://github.com/hyperledger/aries-cloudagent-python/pull/1853) ([TimoGlastra](https://github.com/TimoGlastra)) + - Multi-ledger/Multi-tenant issues [\#2022](https://github.com/hyperledger/aries-cloudagent-python/pull/2022) ([ianco](https://github.com/ianco)) + - fix: Correct typo in model -- required spelled incorrectly [\#2031](https://github.com/hyperledger/aries-cloudagent-python/pull/2031) ([swcurran](https://github.com/swcurran)) + - Code formatting [\#2053](https://github.com/hyperledger/aries-cloudagent-python/pull/2053) ([ianco](https://github.com/ianco)) + - Improved validation of record state attributes [\#2071](https://github.com/hyperledger/aries-cloudagent-python/pull/2071) ([rmnre](https://github.com/rmnre)) + - Previously flagged in release 1.0.0-rc1 - fix: update RouteManager methods use to pass profile as parameter [\#1902](https://github.com/hyperledger/aries-cloudagent-python/pull/1902) ([chumbert](https://github.com/chumbert)) - Allow fully qualified class names for profile managers [\#1880](https://github.com/hyperledger/aries-cloudagent-python/pull/1880) ([chumbert](https://github.com/chumbert)) - fix: unable to use askar with in memory db [\#1878](https://github.com/hyperledger/aries-cloudagent-python/pull/1878) ([dbluhm](https://github.com/dbluhm)) @@ -926,8 +928,8 @@ ACA-Py, adding you wallet settings: - fix: schema class can set Meta.unknown [\#1885](https://github.com/hyperledger/aries-cloudagent-python/pull/1885) ([dbluhm](https://github.com/dbluhm)) - Unit, Integration, and Aries Agent Test Harness Test updates - - Additional integration tests for revocation scenarios [\#2055](https://github.com/hyperledger/aries-cloudagent-python/pull/2055) ([ianco](https://github.com/ianco)) - - Previously flagged in release 1.0.0-rc1 + - Additional integration tests for revocation scenarios [\#2055](https://github.com/hyperledger/aries-cloudagent-python/pull/2055) ([ianco](https://github.com/ianco)) + - Previously flagged in release 1.0.0-rc1 - Fixes a few AATH failures [\#1897](https://github.com/hyperledger/aries-cloudagent-python/pull/1897) ([ianco](https://github.com/ianco)) - fix: warnings in tests from IndySdkProfile [\#1865](https://github.com/hyperledger/aries-cloudagent-python/pull/1865) ([dbluhm](https://github.com/dbluhm)) - Unit test fixes for python 3.9 [\#1858](https://github.com/hyperledger/aries-cloudagent-python/pull/1858) ([andrewwhitehead](https://github.com/andrewwhitehead)) @@ -935,44 +937,44 @@ ACA-Py, adding you wallet settings: - Update pip-audit.yml [\#1944](https://github.com/hyperledger/aries-cloudagent-python/pull/1944) ([ryjones](https://github.com/ryjones)) - Dependency, Python version, GitHub Actions and Container Image Changes - - Remove CircleCI Status since we aren't using CircleCI anymore [\#2163](https://github.com/hyperledger/aries-cloudagent-python/pull/2163) [swcurran](https://github.com/swcurran) - - Update ACA-Py docker files to produce OpenShift compatible images [\#2130](https://github.com/hyperledger/aries-cloudagent-python/pull/2130) [WadeBarnes](https://github.com/WadeBarnes) - - Temporarily disable multi-architecture image builds [\#2125](https://github.com/hyperledger/aries-cloudagent-python/pull/2125) [WadeBarnes](https://github.com/WadeBarnes) - - Fix ACA-py image builds [\#2123](https://github.com/hyperledger/aries-cloudagent-python/pull/2123) [WadeBarnes](https://github.com/WadeBarnes) - - Fix publish workflows [\#2117](https://github.com/hyperledger/aries-cloudagent-python/pull/2117) [WadeBarnes](https://github.com/WadeBarnes) - - fix: indy dependency version format [\#2054](https://github.com/hyperledger/aries-cloudagent-python/pull/2054) ([chumbert](https://github.com/chumbert)) - - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) ([dbluhm](https://github.com/dbluhm)) - - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) ([dbluhm](https://github.com/dbluhm)) - - Update github actions dependencies \(for node16 support\) [\#2066](https://github.com/hyperledger/aries-cloudagent-python/pull/2066) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Docker images and GHA for publishing images [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) ([dbluhm](https://github.com/dbluhm)) - - Update dockerfiles to use python 3.9 [\#2109](https://github.com/hyperledger/aries-cloudagent-python/pull/2109) ([ianco](https://github.com/ianco)) - - Updating base images from slim-buster to slim-bullseye [\#2105](https://github.com/hyperledger/aries-cloudagent-python/pull/2105) ([pradeepp88](https://github.com/pradeepp88)) - - Previously flagged in release 1.0.0-rc1 + - Remove CircleCI Status since we aren't using CircleCI anymore [\#2163](https://github.com/hyperledger/aries-cloudagent-python/pull/2163) [swcurran](https://github.com/swcurran) + - Update ACA-Py docker files to produce OpenShift compatible images [\#2130](https://github.com/hyperledger/aries-cloudagent-python/pull/2130) [WadeBarnes](https://github.com/WadeBarnes) + - Temporarily disable multi-architecture image builds [\#2125](https://github.com/hyperledger/aries-cloudagent-python/pull/2125) [WadeBarnes](https://github.com/WadeBarnes) + - Fix ACA-py image builds [\#2123](https://github.com/hyperledger/aries-cloudagent-python/pull/2123) [WadeBarnes](https://github.com/WadeBarnes) + - Fix publish workflows [\#2117](https://github.com/hyperledger/aries-cloudagent-python/pull/2117) [WadeBarnes](https://github.com/WadeBarnes) + - fix: indy dependency version format [\#2054](https://github.com/hyperledger/aries-cloudagent-python/pull/2054) ([chumbert](https://github.com/chumbert)) + - ci: add gha for pr-tests [\#2058](https://github.com/hyperledger/aries-cloudagent-python/pull/2058) ([dbluhm](https://github.com/dbluhm)) + - ci: test additional versions of python nightly [\#2059](https://github.com/hyperledger/aries-cloudagent-python/pull/2059) ([dbluhm](https://github.com/dbluhm)) + - Update github actions dependencies \(for node16 support\) [\#2066](https://github.com/hyperledger/aries-cloudagent-python/pull/2066) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Docker images and GHA for publishing images [\#2076](https://github.com/hyperledger/aries-cloudagent-python/pull/2076) ([dbluhm](https://github.com/dbluhm)) + - Update dockerfiles to use python 3.9 [\#2109](https://github.com/hyperledger/aries-cloudagent-python/pull/2109) ([ianco](https://github.com/ianco)) + - Updating base images from slim-buster to slim-bullseye [\#2105](https://github.com/hyperledger/aries-cloudagent-python/pull/2105) ([pradeepp88](https://github.com/pradeepp88)) + - Previously flagged in release 1.0.0-rc1 - feat: update pynacl version from 1.4.0 to 1.50 [\#1981](https://github.com/hyperledger/aries-cloudagent-python/pull/1981) ([morrieinmaas](https://github.com/morrieinmaas)) - Fix: web.py dependency - integration tests & demos [\#1973](https://github.com/hyperledger/aries-cloudagent-python/pull/1973) ([shaangill025](https://github.com/shaangill025)) - chore: update pydid [\#1915](https://github.com/hyperledger/aries-cloudagent-python/pull/1915) ([dbluhm](https://github.com/dbluhm)) - Demo and Documentation Updates - - [fix] Removes extra comma that prevents swagger from accepting the presentation request [\#2149](https://github.com/hyperledger/aries-cloudagent-python/pull/2149) [swcurran](https://github.com/swcurran) - - Initial plugin docs [\#2138](https://github.com/hyperledger/aries-cloudagent-python/pull/2138) [ianco](https://github.com/ianco) - - Acme workshop [\#2137](https://github.com/hyperledger/aries-cloudagent-python/pull/2137) [ianco](https://github.com/ianco) - - Fix: Performance Demo [no --revocation] [\#2151](https://github.com/ hyperledger/aries-cloudagent-python/pull/2151) [shaangill025](https://github.com/shaangill025) - - Fix typos in alice-local.sh & faber-local.sh [\#2010](https://github.com/hyperledger/aries-cloudagent-python/pull/2010) ([naonishijima](https://github.com/naonishijima)) - - Added a bit about manually creating a revoc reg tails file [\#2012](https://github.com/hyperledger/aries-cloudagent-python/pull/2012) ([ianco](https://github.com/ianco)) - - Add ability to set docker container name [\#2024](https://github.com/hyperledger/aries-cloudagent-python/pull/2024) ([matrixik](https://github.com/matrixik)) - - Doc updates for json demo [\#2026](https://github.com/hyperledger/aries-cloudagent-python/pull/2026) ([ianco](https://github.com/ianco)) - - Multitenancy demo \(docker-compose with postgres and ngrok\) [\#2089](https://github.com/hyperledger/aries-cloudagent-python/pull/2089) ([ianco](https://github.com/ianco)) - - Allow using YAML configuration file with run\_docker [\#2091](https://github.com/hyperledger/aries-cloudagent-python/pull/2091) ([matrixik](https://github.com/matrixik)) - - Previously flagged in release 1.0.0-rc1 + - [fix] Removes extra comma that prevents swagger from accepting the presentation request [\#2149](https://github.com/hyperledger/aries-cloudagent-python/pull/2149) [swcurran](https://github.com/swcurran) + - Initial plugin docs [\#2138](https://github.com/hyperledger/aries-cloudagent-python/pull/2138) [ianco](https://github.com/ianco) + - Acme workshop [\#2137](https://github.com/hyperledger/aries-cloudagent-python/pull/2137) [ianco](https://github.com/ianco) + - Fix: Performance Demo [no --revocation] [\#2151](https://github.com/ hyperledger/aries-cloudagent-python/pull/2151) [shaangill025](https://github.com/shaangill025) + - Fix typos in alice-local.sh & faber-local.sh [\#2010](https://github.com/hyperledger/aries-cloudagent-python/pull/2010) ([naonishijima](https://github.com/naonishijima)) + - Added a bit about manually creating a revoc reg tails file [\#2012](https://github.com/hyperledger/aries-cloudagent-python/pull/2012) ([ianco](https://github.com/ianco)) + - Add ability to set docker container name [\#2024](https://github.com/hyperledger/aries-cloudagent-python/pull/2024) ([matrixik](https://github.com/matrixik)) + - Doc updates for json demo [\#2026](https://github.com/hyperledger/aries-cloudagent-python/pull/2026) ([ianco](https://github.com/ianco)) + - Multitenancy demo \(docker-compose with postgres and ngrok\) [\#2089](https://github.com/hyperledger/aries-cloudagent-python/pull/2089) ([ianco](https://github.com/ianco)) + - Allow using YAML configuration file with run\_docker [\#2091](https://github.com/hyperledger/aries-cloudagent-python/pull/2091) ([matrixik](https://github.com/matrixik)) + - Previously flagged in release 1.0.0-rc1 - Fixes to acme exercise code [\#1990](https://github.com/hyperledger/aries-cloudagent-python/pull/1990) ([ianco](https://github.com/ianco)) - Fixed bug in run\_demo script [\#1982](https://github.com/hyperledger/aries-cloudagent-python/pull/1982) ([pasquale95](https://github.com/pasquale95)) - Transaction Author with Endorser demo [\#1975](https://github.com/hyperledger/aries-cloudagent-python/pull/1975) ([ianco](https://github.com/ianco)) - Redis Plugins \[redis\_cache & redis\_queue\] related updates [\#1937](https://github.com/hyperledger/aries-cloudagent-python/pull/1937) ([shaangill025](https://github.com/shaangill025)) - Release management pull requests - - 0.8.0 release [\#2169](https://github.com/hyperledger/aries-cloudagent-python/pull/2169) ([swcurran](https://github.com/swcurran)) - - 0.8.0-rc0 release updates [\#2115](https://github.com/hyperledger/aries-cloudagent-python/pull/2115) ([swcurran](https://github.com/swcurran)) - - Previously flagged in release 1.0.0-rc1 + - 0.8.0 release [\#2169](https://github.com/hyperledger/aries-cloudagent-python/pull/2169) ([swcurran](https://github.com/swcurran)) + - 0.8.0-rc0 release updates [\#2115](https://github.com/hyperledger/aries-cloudagent-python/pull/2115) ([swcurran](https://github.com/swcurran)) + - Previously flagged in release 1.0.0-rc1 - Release 1.0.0-rc0 [\#1904](https://github.com/hyperledger/aries-cloudagent-python/pull/1904) ([swcurran](https://github.com/swcurran)) - Add 0.7.5 patch Changelog entry to main branch Changelog [\#1996](https://github.com/hyperledger/aries-cloudagent-python/pull/1996) ([swcurran](https://github.com/swcurran)) - Release 1.0.0-rc1 [\#2005](https://github.com/hyperledger/aries-cloudagent-python/pull/2005) ([swcurran](https://github.com/swcurran)) @@ -1098,128 +1100,128 @@ stuff needed for a healthy, growing codebase. #### Categorized List of Pull Requests - Hyperledger Indy Endorser related updates: - - Fix order of operations connecting faber to endorser [\#1716](https://github.com/hyperledger/aries-cloudagent-python/pull/1716) ([ianco](https://github.com/ianco)) - - Endorser support for updating DID endpoints on ledger [\#1696](https://github.com/hyperledger/aries-cloudagent-python/pull/1696) ([frostyfrog](https://github.com/frostyfrog)) - - Add "sent" key to both Schema and Cred Defs when using Endorsers [\#1663](https://github.com/hyperledger/aries-cloudagent-python/pull/1663) ([frostyfrog](https://github.com/frostyfrog)) - - Add cred_def_id to metadata when using an Endorser [\#1655](https://github.com/hyperledger/aries-cloudagent-python/pull/1655) ([frostyfrog](https://github.com/frostyfrog)) - - Update Endorser documentation [\#1646](https://github.com/hyperledger/aries-cloudagent-python/pull/1646) ([chumbert](https://github.com/chumbert)) - - Auto-promote author did to public after endorsing [\#1607](https://github.com/hyperledger/aries-cloudagent-python/pull/1607) ([ianco](https://github.com/ianco)) - - DID updates for endorser [\#1601](https://github.com/hyperledger/aries-cloudagent-python/pull/1601) ([ianco](https://github.com/ianco)) - - Qualify did exch connection lookup by role [\#1670](https://github.com/hyperledger/aries-cloudagent-python/pull/1670) ([ianco](https://github.com/ianco)) - - Use provided connection_id if provided [\#1726](https://github.com/hyperledger/aries-cloudagent-python/pull/1726) ([ianco](https://github.com/ianco)) + - Fix order of operations connecting faber to endorser [\#1716](https://github.com/hyperledger/aries-cloudagent-python/pull/1716) ([ianco](https://github.com/ianco)) + - Endorser support for updating DID endpoints on ledger [\#1696](https://github.com/hyperledger/aries-cloudagent-python/pull/1696) ([frostyfrog](https://github.com/frostyfrog)) + - Add "sent" key to both Schema and Cred Defs when using Endorsers [\#1663](https://github.com/hyperledger/aries-cloudagent-python/pull/1663) ([frostyfrog](https://github.com/frostyfrog)) + - Add cred_def_id to metadata when using an Endorser [\#1655](https://github.com/hyperledger/aries-cloudagent-python/pull/1655) ([frostyfrog](https://github.com/frostyfrog)) + - Update Endorser documentation [\#1646](https://github.com/hyperledger/aries-cloudagent-python/pull/1646) ([chumbert](https://github.com/chumbert)) + - Auto-promote author did to public after endorsing [\#1607](https://github.com/hyperledger/aries-cloudagent-python/pull/1607) ([ianco](https://github.com/ianco)) + - DID updates for endorser [\#1601](https://github.com/hyperledger/aries-cloudagent-python/pull/1601) ([ianco](https://github.com/ianco)) + - Qualify did exch connection lookup by role [\#1670](https://github.com/hyperledger/aries-cloudagent-python/pull/1670) ([ianco](https://github.com/ianco)) + - Use provided connection_id if provided [\#1726](https://github.com/hyperledger/aries-cloudagent-python/pull/1726) ([ianco](https://github.com/ianco)) - Additions to the startup parameters, Admin API and Web Hooks - - Improve typing of settings and add plugin settings object [\#1833](https://github.com/hyperledger/aries-cloudagent-python/pull/1833) ([dbluhm](https://github.com/dbluhm)) - - feat: accept taa using startup parameter --accept-taa [\#1643](https://github.com/hyperledger/aries-cloudagent-python/pull/1643) ([TimoGlastra](https://github.com/TimoGlastra)) - - Add auto_verify flag in present-proof protocol [\#1702](https://github.com/hyperledger/aries-cloudagent-python/pull/1702) ([DaevMithran](https://github.com/DaevMithran)) - - feat: query connections by their_public_did [\#1637](https://github.com/hyperledger/aries-cloudagent-python/pull/1637) ([TimoGlastra](https://github.com/TimoGlastra)) - - feat: enable webhook events for mediation records [\#1614](https://github.com/hyperledger/aries-cloudagent-python/pull/1614) ([TimoGlastra](https://github.com/TimoGlastra)) - - Feature/undelivered events [\#1694](https://github.com/hyperledger/aries-cloudagent-python/pull/1694) ([mepeltier](https://github.com/mepeltier)) - - Allow use of SEED when creating local wallet DID Issue-1682 Issue-1682 [\#1705](https://github.com/hyperledger/aries-cloudagent-python/pull/1705) ([DaevMithran](https://github.com/DaevMithran)) - - Feature: Add the ability to deny specific plugins from loading [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) ([frostyfrog](https://github.com/frostyfrog)) - - feat: Add filter param to connection list for invitations [\#1797](https://github.com/hyperledger/aries-cloudagent-python/pull/1797) ([frostyfrog](https://github.com/frostyfrog)) - - Fix missing webhook handler [\#1816](https://github.com/hyperledger/aries-cloudagent-python/pull/1816) ([ianco](https://github.com/ianco)) + - Improve typing of settings and add plugin settings object [\#1833](https://github.com/hyperledger/aries-cloudagent-python/pull/1833) ([dbluhm](https://github.com/dbluhm)) + - feat: accept taa using startup parameter --accept-taa [\#1643](https://github.com/hyperledger/aries-cloudagent-python/pull/1643) ([TimoGlastra](https://github.com/TimoGlastra)) + - Add auto_verify flag in present-proof protocol [\#1702](https://github.com/hyperledger/aries-cloudagent-python/pull/1702) ([DaevMithran](https://github.com/DaevMithran)) + - feat: query connections by their_public_did [\#1637](https://github.com/hyperledger/aries-cloudagent-python/pull/1637) ([TimoGlastra](https://github.com/TimoGlastra)) + - feat: enable webhook events for mediation records [\#1614](https://github.com/hyperledger/aries-cloudagent-python/pull/1614) ([TimoGlastra](https://github.com/TimoGlastra)) + - Feature/undelivered events [\#1694](https://github.com/hyperledger/aries-cloudagent-python/pull/1694) ([mepeltier](https://github.com/mepeltier)) + - Allow use of SEED when creating local wallet DID Issue-1682 Issue-1682 [\#1705](https://github.com/hyperledger/aries-cloudagent-python/pull/1705) ([DaevMithran](https://github.com/DaevMithran)) + - Feature: Add the ability to deny specific plugins from loading [\#1737](https://github.com/hyperledger/aries-cloudagent-python/pull/1737) ([frostyfrog](https://github.com/frostyfrog)) + - feat: Add filter param to connection list for invitations [\#1797](https://github.com/hyperledger/aries-cloudagent-python/pull/1797) ([frostyfrog](https://github.com/frostyfrog)) + - Fix missing webhook handler [\#1816](https://github.com/hyperledger/aries-cloudagent-python/pull/1816) ([ianco](https://github.com/ianco)) - Persistent Queues - - Redis PQ Cleanup in preparation for enabling the uses of plugin PQ implementations \[Issue\#1659\] [\#1659](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) + - Redis PQ Cleanup in preparation for enabling the uses of plugin PQ implementations \[Issue\#1659\] [\#1659](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) - Credential Revocation and Tails File Handling - - Fix handling of non-revocable credential when timestamp is specified \(askar/credx\) [\#1847](https://github.com/hyperledger/aries-cloudagent-python/pull/1847) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Additional endpoints to get revocation details and fix "published" status [\#1783](https://github.com/hyperledger/aries-cloudagent-python/pull/1783) ([ianco](https://github.com/ianco)) - - Fix IssuerCredRevRecord state update on revocation publish [\#1827](https://github.com/hyperledger/aries-cloudagent-python/pull/1827) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix put_file when the server returns a redirect [\#1808](https://github.com/hyperledger/aries-cloudagent-python/pull/1808) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Adjust revocation registry update procedure to shorten transactions [\#1804](https://github.com/hyperledger/aries-cloudagent-python/pull/1804) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - fix: Resolve Revocation Notification environment variable name collision [\#1751](https://github.com/hyperledger/aries-cloudagent-python/pull/1751) ([frostyfrog](https://github.com/frostyfrog)) - - fix: always notify if revocation notification record exists [\#1665](https://github.com/hyperledger/aries-cloudagent-python/pull/1665) ([TimoGlastra](https://github.com/TimoGlastra)) - - Fix for AnonCreds non-revoc proof with no timestamp [\#1628](https://github.com/hyperledger/aries-cloudagent-python/pull/1628) ([ianco](https://github.com/ianco)) - - Fixes for v7.3.0 - Issue [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597) [\#1711](https://github.com/hyperledger/aries-cloudagent-python/pull/1711) ([shaangill025](https://github.com/shaangill025)) + - Fix handling of non-revocable credential when timestamp is specified \(askar/credx\) [\#1847](https://github.com/hyperledger/aries-cloudagent-python/pull/1847) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Additional endpoints to get revocation details and fix "published" status [\#1783](https://github.com/hyperledger/aries-cloudagent-python/pull/1783) ([ianco](https://github.com/ianco)) + - Fix IssuerCredRevRecord state update on revocation publish [\#1827](https://github.com/hyperledger/aries-cloudagent-python/pull/1827) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix put_file when the server returns a redirect [\#1808](https://github.com/hyperledger/aries-cloudagent-python/pull/1808) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Adjust revocation registry update procedure to shorten transactions [\#1804](https://github.com/hyperledger/aries-cloudagent-python/pull/1804) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - fix: Resolve Revocation Notification environment variable name collision [\#1751](https://github.com/hyperledger/aries-cloudagent-python/pull/1751) ([frostyfrog](https://github.com/frostyfrog)) + - fix: always notify if revocation notification record exists [\#1665](https://github.com/hyperledger/aries-cloudagent-python/pull/1665) ([TimoGlastra](https://github.com/TimoGlastra)) + - Fix for AnonCreds non-revoc proof with no timestamp [\#1628](https://github.com/hyperledger/aries-cloudagent-python/pull/1628) ([ianco](https://github.com/ianco)) + - Fixes for v7.3.0 - Issue [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597) [\#1711](https://github.com/hyperledger/aries-cloudagent-python/pull/1711) ([shaangill025](https://github.com/shaangill025)) - Fixes Issue 1 from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): Tails file upload fails when a credDef is created and multi ledger support is enabled - - Fix tails server upload multi-ledger mode [\#1785](https://github.com/hyperledger/aries-cloudagent-python/pull/1785) ([ianco](https://github.com/ianco)) - - Feat/revocation notification v2 [\#1734](https://github.com/hyperledger/aries-cloudagent-python/pull/1734) ([frostyfrog](https://github.com/frostyfrog)) + - Fix tails server upload multi-ledger mode [\#1785](https://github.com/hyperledger/aries-cloudagent-python/pull/1785) ([ianco](https://github.com/ianco)) + - Feat/revocation notification v2 [\#1734](https://github.com/hyperledger/aries-cloudagent-python/pull/1734) ([frostyfrog](https://github.com/frostyfrog)) - Issue Credential, Present Proof updates/fixes - - Fix: Present Proof v2 - check_proof_vs_proposal update to support proof request with restrictions [\#1820](https://github.com/hyperledger/aries-cloudagent-python/pull/1820) ([shaangill025](https://github.com/shaangill025)) - - Fix: present-proof v1 send-proposal flow [\#1811](https://github.com/hyperledger/aries-cloudagent-python/pull/1811) ([shaangill025](https://github.com/shaangill025)) - - Prover - verification outcome from presentation ack message [\#1757](https://github.com/hyperledger/aries-cloudagent-python/pull/1757) ([shaangill025](https://github.com/shaangill025)) - - feat: support connectionless exchange [\#1710](https://github.com/hyperledger/aries-cloudagent-python/pull/1710) ([TimoGlastra](https://github.com/TimoGlastra)) - - Fix: DIF proof proposal when creating bound presentation request \[Issue\#1687\] [\#1690](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) - - Fix DIF PresExch and OOB request_attach delete unused connection [\#1676](https://github.com/hyperledger/aries-cloudagent-python/pull/1676) ([shaangill025](https://github.com/shaangill025)) - - Fix DIFPresFormatHandler returning invalid V20PresExRecord on presentation verification [\#1645](https://github.com/hyperledger/aries-cloudagent-python/pull/1645) ([rmnre](https://github.com/rmnre)) - - Update aries-askar patch version to at least 0.2.4 as 0.2.3 does not include backward compatibility [\#1603](https://github.com/hyperledger/aries-cloudagent-python/pull/1603) ([acuderman](https://github.com/acuderman)) - - Fixes for credential details in issue-credential webhook responses [\#1668](https://github.com/hyperledger/aries-cloudagent-python/pull/1668) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: present-proof v2 send-proposal [issue\#1474](https://github.com/hyperledger/aries-cloudagent-python/issues/1474) [\#1667](https://github.com/hyperledger/aries-cloudagent-python/pull/1667) ([shaangill025](https://github.com/shaangill025)) + - Fix: Present Proof v2 - check_proof_vs_proposal update to support proof request with restrictions [\#1820](https://github.com/hyperledger/aries-cloudagent-python/pull/1820) ([shaangill025](https://github.com/shaangill025)) + - Fix: present-proof v1 send-proposal flow [\#1811](https://github.com/hyperledger/aries-cloudagent-python/pull/1811) ([shaangill025](https://github.com/shaangill025)) + - Prover - verification outcome from presentation ack message [\#1757](https://github.com/hyperledger/aries-cloudagent-python/pull/1757) ([shaangill025](https://github.com/shaangill025)) + - feat: support connectionless exchange [\#1710](https://github.com/hyperledger/aries-cloudagent-python/pull/1710) ([TimoGlastra](https://github.com/TimoGlastra)) + - Fix: DIF proof proposal when creating bound presentation request \[Issue\#1687\] [\#1690](https://github.com/hyperledger/aries-cloudagent-python/pull/1690) ([shaangill025](https://github.com/shaangill025)) + - Fix DIF PresExch and OOB request_attach delete unused connection [\#1676](https://github.com/hyperledger/aries-cloudagent-python/pull/1676) ([shaangill025](https://github.com/shaangill025)) + - Fix DIFPresFormatHandler returning invalid V20PresExRecord on presentation verification [\#1645](https://github.com/hyperledger/aries-cloudagent-python/pull/1645) ([rmnre](https://github.com/rmnre)) + - Update aries-askar patch version to at least 0.2.4 as 0.2.3 does not include backward compatibility [\#1603](https://github.com/hyperledger/aries-cloudagent-python/pull/1603) ([acuderman](https://github.com/acuderman)) + - Fixes for credential details in issue-credential webhook responses [\#1668](https://github.com/hyperledger/aries-cloudagent-python/pull/1668) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: present-proof v2 send-proposal [issue\#1474](https://github.com/hyperledger/aries-cloudagent-python/issues/1474) [\#1667](https://github.com/hyperledger/aries-cloudagent-python/pull/1667) ([shaangill025](https://github.com/shaangill025)) - Fixes Issue 3b from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): V2 Credential exchange ignores the auto-respond-credential-request - - Revert change to send_credential_ack return value [\#1660](https://github.com/hyperledger/aries-cloudagent-python/pull/1660) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix usage of send_credential_ack [\#1653](https://github.com/hyperledger/aries-cloudagent-python/pull/1653) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Replace blank credential/presentation exchange states with abandoned state [\#1605](https://github.com/hyperledger/aries-cloudagent-python/pull/1605) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Revert change to send_credential_ack return value [\#1660](https://github.com/hyperledger/aries-cloudagent-python/pull/1660) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix usage of send_credential_ack [\#1653](https://github.com/hyperledger/aries-cloudagent-python/pull/1653) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Replace blank credential/presentation exchange states with abandoned state [\#1605](https://github.com/hyperledger/aries-cloudagent-python/pull/1605) ([andrewwhitehead](https://github.com/andrewwhitehead)) - Fixes Issue 4 from [\#1597](https://github.com/hyperledger/aries-cloudagent-python/issues/1597): Wallet type askar has issues when receiving V1 credentials - - Fixes and cleanups for issue-credential 1.0 [\#1619](https://github.com/hyperledger/aries-cloudagent-python/pull/1619) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: Duplicated schema and cred_def - Askar and Postgres [\#1800](https://github.com/hyperledger/aries-cloudagent-python/pull/1800) ([shaangill025](https://github.com/shaangill025)) + - Fixes and cleanups for issue-credential 1.0 [\#1619](https://github.com/hyperledger/aries-cloudagent-python/pull/1619) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: Duplicated schema and cred_def - Askar and Postgres [\#1800](https://github.com/hyperledger/aries-cloudagent-python/pull/1800) ([shaangill025](https://github.com/shaangill025)) - Mediator updates and fixes - - feat: allow querying default mediator from base wallet [\#1729](https://github.com/hyperledger/aries-cloudagent-python/pull/1729) ([dbluhm](https://github.com/dbluhm)) - - Added async with for mediator record delete [\#1749](https://github.com/hyperledger/aries-cloudagent-python/pull/1749) ([dejsenlitro](https://github.com/dejsenlitro)) + - feat: allow querying default mediator from base wallet [\#1729](https://github.com/hyperledger/aries-cloudagent-python/pull/1729) ([dbluhm](https://github.com/dbluhm)) + - Added async with for mediator record delete [\#1749](https://github.com/hyperledger/aries-cloudagent-python/pull/1749) ([dejsenlitro](https://github.com/dejsenlitro)) - Multitenacy updates and fixes - - feat: create new JWT tokens and invalidate older for multitenancy [\#1725](https://github.com/hyperledger/aries-cloudagent-python/pull/1725) ([TimoGlastra](https://github.com/TimoGlastra)) - - Multi-tenancy stale wallet clean up [\#1692](https://github.com/hyperledger/aries-cloudagent-python/pull/1692) ([dbluhm](https://github.com/dbluhm)) + - feat: create new JWT tokens and invalidate older for multitenancy [\#1725](https://github.com/hyperledger/aries-cloudagent-python/pull/1725) ([TimoGlastra](https://github.com/TimoGlastra)) + - Multi-tenancy stale wallet clean up [\#1692](https://github.com/hyperledger/aries-cloudagent-python/pull/1692) ([dbluhm](https://github.com/dbluhm)) - Dependencies and internal code updates/fixes - - Update pyjwt to 2.4 [\#1829](https://github.com/hyperledger/aries-cloudagent-python/pull/1829) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix external Outbound Transport loading code [\#1812](https://github.com/hyperledger/aries-cloudagent-python/pull/1812) ([frostyfrog](https://github.com/frostyfrog)) - - Fix iteration over key list, update Askar to 0.2.5 [\#1740](https://github.com/hyperledger/aries-cloudagent-python/pull/1740) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Fix: update IndyLedgerRequestsExecutor logic - multitenancy and basic base wallet type [\#1700](https://github.com/hyperledger/aries-cloudagent-python/pull/1700) ([shaangill025](https://github.com/shaangill025)) - - Move database operations inside the session context [\#1633](https://github.com/hyperledger/aries-cloudagent-python/pull/1633) ([acuderman](https://github.com/acuderman)) - - Upgrade ConfigArgParse to version 1.5.3 [\#1627](https://github.com/hyperledger/aries-cloudagent-python/pull/1627) ([WadeBarnes](https://github.com/WadeBarnes)) - - Update aiohttp dependency [\#1606](https://github.com/hyperledger/aries-cloudagent-python/pull/1606) ([acuderman](https://github.com/acuderman)) - - did-exchange implicit request pthid update & invitation key verification [\#1599](https://github.com/hyperledger/aries-cloudagent-python/pull/1599) ([shaangill025](https://github.com/shaangill025)) - - Fix auto connection response not being properly mediated [\#1638](https://github.com/hyperledger/aries-cloudagent-python/pull/1638) ([dbluhm](https://github.com/dbluhm)) - - platform target in run tests. [\#1697](https://github.com/hyperledger/aries-cloudagent-python/pull/1697) ([burdettadam](https://github.com/burdettadam)) - - Add an integration test for mixed proof with a revocable cred and a n… [\#1672](https://github.com/hyperledger/aries-cloudagent-python/pull/1672) ([ianco](https://github.com/ianco)) - - Fix: Inbound Transport is_external attribute [\#1802](https://github.com/hyperledger/aries-cloudagent-python/pull/1802) ([shaangill025](https://github.com/shaangill025)) - - fix: add a close statement to ensure session is closed on error [\#1777](https://github.com/hyperledger/aries-cloudagent-python/pull/1777) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) - - Adds `transport_id` variable assignment back to outbound enqueue method [\#1776](https://github.com/hyperledger/aries-cloudagent-python/pull/1776) ([amanji](https://github.com/amanji)) - - Replace async workaround within document loader [\#1774](https://github.com/hyperledger/aries-cloudagent-python/pull/1774) ([frostyfrog](https://github.com/frostyfrog)) + - Update pyjwt to 2.4 [\#1829](https://github.com/hyperledger/aries-cloudagent-python/pull/1829) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix external Outbound Transport loading code [\#1812](https://github.com/hyperledger/aries-cloudagent-python/pull/1812) ([frostyfrog](https://github.com/frostyfrog)) + - Fix iteration over key list, update Askar to 0.2.5 [\#1740](https://github.com/hyperledger/aries-cloudagent-python/pull/1740) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Fix: update IndyLedgerRequestsExecutor logic - multitenancy and basic base wallet type [\#1700](https://github.com/hyperledger/aries-cloudagent-python/pull/1700) ([shaangill025](https://github.com/shaangill025)) + - Move database operations inside the session context [\#1633](https://github.com/hyperledger/aries-cloudagent-python/pull/1633) ([acuderman](https://github.com/acuderman)) + - Upgrade ConfigArgParse to version 1.5.3 [\#1627](https://github.com/hyperledger/aries-cloudagent-python/pull/1627) ([WadeBarnes](https://github.com/WadeBarnes)) + - Update aiohttp dependency [\#1606](https://github.com/hyperledger/aries-cloudagent-python/pull/1606) ([acuderman](https://github.com/acuderman)) + - did-exchange implicit request pthid update & invitation key verification [\#1599](https://github.com/hyperledger/aries-cloudagent-python/pull/1599) ([shaangill025](https://github.com/shaangill025)) + - Fix auto connection response not being properly mediated [\#1638](https://github.com/hyperledger/aries-cloudagent-python/pull/1638) ([dbluhm](https://github.com/dbluhm)) + - platform target in run tests. [\#1697](https://github.com/hyperledger/aries-cloudagent-python/pull/1697) ([burdettadam](https://github.com/burdettadam)) + - Add an integration test for mixed proof with a revocable cred and a n… [\#1672](https://github.com/hyperledger/aries-cloudagent-python/pull/1672) ([ianco](https://github.com/ianco)) + - Fix: Inbound Transport is_external attribute [\#1802](https://github.com/hyperledger/aries-cloudagent-python/pull/1802) ([shaangill025](https://github.com/shaangill025)) + - fix: add a close statement to ensure session is closed on error [\#1777](https://github.com/hyperledger/aries-cloudagent-python/pull/1777) ([reflectivedevelopment](https://github.com/reflectivedevelopment)) + - Adds `transport_id` variable assignment back to outbound enqueue method [\#1776](https://github.com/hyperledger/aries-cloudagent-python/pull/1776) ([amanji](https://github.com/amanji)) + - Replace async workaround within document loader [\#1774](https://github.com/hyperledger/aries-cloudagent-python/pull/1774) ([frostyfrog](https://github.com/frostyfrog)) - Documentation and Demo Updates - - Use default wallet type askar for alice/faber demo and bdd tests [\#1761](https://github.com/hyperledger/aries-cloudagent-python/pull/1761) ([ianco](https://github.com/ianco)) - - Update the Supported RFCs document for 0.7.4 release [\#1846](https://github.com/hyperledger/aries-cloudagent-python/pull/1846) ([swcurran](https://github.com/swcurran)) - - Fix a typo in DevReadMe.md [\#1844](https://github.com/hyperledger/aries-cloudagent-python/pull/1844) ([feknall](https://github.com/feknall)) - - Add troubleshooting document, include initial examples - ledger connection, out-of-sync RevReg [\#1818](https://github.com/hyperledger/aries-cloudagent-python/pull/1818) ([swcurran](https://github.com/swcurran)) - - Update POST /present-proof/send-request to POST /present-proof-2.0/send-request [\#1824](https://github.com/hyperledger/aries-cloudagent-python/pull/1824) ([lineko](https://github.com/lineko)) - - Fetch from --genesis-url likely to fail in composed container [\#1746](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([tdiesler](https://github.com/tdiesler)) - - Fixes logic for web hook formatter in Faber demo [\#1739](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([amanji](https://github.com/amanji)) - - Multitenancy Docs Update [\#1706](https://github.com/hyperledger/aries-cloudagent-python/pull/1706) ([MonolithicMonk](https://github.com/MonolithicMonk)) - - [\#1674](https://github.com/hyperledger/aries-cloudagent-python/issue/1674) Add basic DOCKER_ENV logging for run_demo [\#1675](https://github.com/hyperledger/aries-cloudagent-python/pull/1675) ([tdiesler](https://github.com/tdiesler)) - - Performance demo updates [\#1647](https://github.com/hyperledger/aries-cloudagent-python/pull/1647) ([ianco](https://github.com/ianco)) - - docs: supported features attribution [\#1654](https://github.com/hyperledger/aries-cloudagent-python/pull/1654) ([TimoGlastra](https://github.com/TimoGlastra)) - - Documentation on existing language wrappers for aca-py [\#1738](https://github.com/hyperledger/aries-cloudagent-python/pull/1738) ([etschelp](https://github.com/etschelp)) - - Document impact of multi-ledger on TAA acceptance [\#1778](https://github.com/hyperledger/aries-cloudagent-python/pull/1778) ([ianco](https://github.com/ianco)) + - Use default wallet type askar for alice/faber demo and bdd tests [\#1761](https://github.com/hyperledger/aries-cloudagent-python/pull/1761) ([ianco](https://github.com/ianco)) + - Update the Supported RFCs document for 0.7.4 release [\#1846](https://github.com/hyperledger/aries-cloudagent-python/pull/1846) ([swcurran](https://github.com/swcurran)) + - Fix a typo in DevReadMe.md [\#1844](https://github.com/hyperledger/aries-cloudagent-python/pull/1844) ([feknall](https://github.com/feknall)) + - Add troubleshooting document, include initial examples - ledger connection, out-of-sync RevReg [\#1818](https://github.com/hyperledger/aries-cloudagent-python/pull/1818) ([swcurran](https://github.com/swcurran)) + - Update POST /present-proof/send-request to POST /present-proof-2.0/send-request [\#1824](https://github.com/hyperledger/aries-cloudagent-python/pull/1824) ([lineko](https://github.com/lineko)) + - Fetch from --genesis-url likely to fail in composed container [\#1746](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([tdiesler](https://github.com/tdiesler)) + - Fixes logic for web hook formatter in Faber demo [\#1739](https://github.com/hyperledger/aries-cloudagent-python/pull/1739) ([amanji](https://github.com/amanji)) + - Multitenancy Docs Update [\#1706](https://github.com/hyperledger/aries-cloudagent-python/pull/1706) ([MonolithicMonk](https://github.com/MonolithicMonk)) + - [\#1674](https://github.com/hyperledger/aries-cloudagent-python/issue/1674) Add basic DOCKER_ENV logging for run_demo [\#1675](https://github.com/hyperledger/aries-cloudagent-python/pull/1675) ([tdiesler](https://github.com/tdiesler)) + - Performance demo updates [\#1647](https://github.com/hyperledger/aries-cloudagent-python/pull/1647) ([ianco](https://github.com/ianco)) + - docs: supported features attribution [\#1654](https://github.com/hyperledger/aries-cloudagent-python/pull/1654) ([TimoGlastra](https://github.com/TimoGlastra)) + - Documentation on existing language wrappers for aca-py [\#1738](https://github.com/hyperledger/aries-cloudagent-python/pull/1738) ([etschelp](https://github.com/etschelp)) + - Document impact of multi-ledger on TAA acceptance [\#1778](https://github.com/hyperledger/aries-cloudagent-python/pull/1778) ([ianco](https://github.com/ianco)) - Code management and contributor/developer support updates - - Set prefix for integration test demo agents; some code cleanup [\#1840](https://github.com/hyperledger/aries-cloudagent-python/pull/1840) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - Pin markupsafe at version 2.0.1 [\#1642](https://github.com/hyperledger/aries-cloudagent-python/pull/1642) ([andrewwhitehead](https://github.com/andrewwhitehead)) - - style: format with stable black release [\#1615](https://github.com/hyperledger/aries-cloudagent-python/pull/1615) ([TimoGlastra](https://github.com/TimoGlastra)) - - Remove references to play with von [\#1688](https://github.com/hyperledger/aries-cloudagent-python/pull/1688) ([ianco](https://github.com/ianco)) - - Add pre-commit as optional developer tool [\#1671](https://github.com/hyperledger/aries-cloudagent-python/pull/1671) ([dbluhm](https://github.com/dbluhm)) - - run_docker start - pass environment variables [\#1715](https://github.com/hyperledger/aries-cloudagent-python/pull/1715) ([shaangill025](https://github.com/shaangill025)) - - Use local deps only [\#1834](https://github.com/hyperledger/aries-cloudagent-python/pull/1834) ([ryjones](https://github.com/ryjones)) - - Enable pip-audit [\#1831](https://github.com/hyperledger/aries-cloudagent-python/pull/1831) ([ryjones](https://github.com/ryjones)) - - Only run pip-audit on main repo [\#1845](https://github.com/hyperledger/aries-cloudagent-python/pull/1845) ([ryjones](https://github.com/ryjones)) + - Set prefix for integration test demo agents; some code cleanup [\#1840](https://github.com/hyperledger/aries-cloudagent-python/pull/1840) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - Pin markupsafe at version 2.0.1 [\#1642](https://github.com/hyperledger/aries-cloudagent-python/pull/1642) ([andrewwhitehead](https://github.com/andrewwhitehead)) + - style: format with stable black release [\#1615](https://github.com/hyperledger/aries-cloudagent-python/pull/1615) ([TimoGlastra](https://github.com/TimoGlastra)) + - Remove references to play with von [\#1688](https://github.com/hyperledger/aries-cloudagent-python/pull/1688) ([ianco](https://github.com/ianco)) + - Add pre-commit as optional developer tool [\#1671](https://github.com/hyperledger/aries-cloudagent-python/pull/1671) ([dbluhm](https://github.com/dbluhm)) + - run_docker start - pass environment variables [\#1715](https://github.com/hyperledger/aries-cloudagent-python/pull/1715) ([shaangill025](https://github.com/shaangill025)) + - Use local deps only [\#1834](https://github.com/hyperledger/aries-cloudagent-python/pull/1834) ([ryjones](https://github.com/ryjones)) + - Enable pip-audit [\#1831](https://github.com/hyperledger/aries-cloudagent-python/pull/1831) ([ryjones](https://github.com/ryjones)) + - Only run pip-audit on main repo [\#1845](https://github.com/hyperledger/aries-cloudagent-python/pull/1845) ([ryjones](https://github.com/ryjones)) - Release management pull requests - - 0.7.4 Release Changelog and version update [\#1849](https://github.com/hyperledger/aries-cloudagent-python/pull/1849) ([swcurran](https://github.com/swcurran)) - - 0.7.4-rc5 changelog, version and ReadTheDocs updates [\#1838](https://github.com/hyperledger/aries-cloudagent-python/pull/1838) ([swcurran](https://github.com/swcurran)) - - Update changelog and version for 0.7.4-rc4 [\#1830](https://github.com/hyperledger/aries-cloudagent-python/pull/1830) ([swcurran](https://github.com/swcurran)) - - Changelog, version and ReadTheDocs updates for 0.7.4-rc3 release [\#1817](https://github.com/hyperledger/aries-cloudagent-python/pull/1817) ([swcurran](https://github.com/swcurran)) - - 0.7.4-rc2 update [\#1771](https://github.com/hyperledger/aries-cloudagent-python/pull/1771) ([swcurran](https://github.com/swcurran)) - - Some ReadTheDocs File updates [\#1770](https://github.com/hyperledger/aries-cloudagent-python/pull/1770) ([swcurran](https://github.com/swcurran)) - - 0.7.4-RC1 Changelog intro paragraph - fix copy/paste error [\#1753](https://github.com/hyperledger/aries-cloudagent-python/pull/1753) ([swcurran](https://github.com/swcurran)) - - Fixing the intro paragraph and heading in the changelog of this 0.7.4RC1 [\#1752](https://github.com/hyperledger/aries-cloudagent-python/pull/1752) ([swcurran](https://github.com/swcurran)) - - Updates to Changelog for 0.7.4. RC1 release [\#1747](https://github.com/hyperledger/aries-cloudagent-python/pull/1747) ([swcurran](https://github.com/swcurran)) - - Prep for adding the 0.7.4-rc0 tag [\#1722](https://github.com/hyperledger/aries-cloudagent-python/pull/1722) ([swcurran](https://github.com/swcurran)) - - Added missed new module -- upgrade -- to the RTD generated docs [\#1593](https://github.com/hyperledger/aries-cloudagent-python/pull/1593) ([swcurran](https://github.com/swcurran)) - - Doh....update the date in the Changelog for 0.7.3 [\#1592](https://github.com/hyperledger/aries-cloudagent-python/pull/1592) ([swcurran](https://github.com/swcurran)) + - 0.7.4 Release Changelog and version update [\#1849](https://github.com/hyperledger/aries-cloudagent-python/pull/1849) ([swcurran](https://github.com/swcurran)) + - 0.7.4-rc5 changelog, version and ReadTheDocs updates [\#1838](https://github.com/hyperledger/aries-cloudagent-python/pull/1838) ([swcurran](https://github.com/swcurran)) + - Update changelog and version for 0.7.4-rc4 [\#1830](https://github.com/hyperledger/aries-cloudagent-python/pull/1830) ([swcurran](https://github.com/swcurran)) + - Changelog, version and ReadTheDocs updates for 0.7.4-rc3 release [\#1817](https://github.com/hyperledger/aries-cloudagent-python/pull/1817) ([swcurran](https://github.com/swcurran)) + - 0.7.4-rc2 update [\#1771](https://github.com/hyperledger/aries-cloudagent-python/pull/1771) ([swcurran](https://github.com/swcurran)) + - Some ReadTheDocs File updates [\#1770](https://github.com/hyperledger/aries-cloudagent-python/pull/1770) ([swcurran](https://github.com/swcurran)) + - 0.7.4-RC1 Changelog intro paragraph - fix copy/paste error [\#1753](https://github.com/hyperledger/aries-cloudagent-python/pull/1753) ([swcurran](https://github.com/swcurran)) + - Fixing the intro paragraph and heading in the changelog of this 0.7.4RC1 [\#1752](https://github.com/hyperledger/aries-cloudagent-python/pull/1752) ([swcurran](https://github.com/swcurran)) + - Updates to Changelog for 0.7.4. RC1 release [\#1747](https://github.com/hyperledger/aries-cloudagent-python/pull/1747) ([swcurran](https://github.com/swcurran)) + - Prep for adding the 0.7.4-rc0 tag [\#1722](https://github.com/hyperledger/aries-cloudagent-python/pull/1722) ([swcurran](https://github.com/swcurran)) + - Added missed new module -- upgrade -- to the RTD generated docs [\#1593](https://github.com/hyperledger/aries-cloudagent-python/pull/1593) ([swcurran](https://github.com/swcurran)) + - Doh....update the date in the Changelog for 0.7.3 [\#1592](https://github.com/hyperledger/aries-cloudagent-python/pull/1592) ([swcurran](https://github.com/swcurran)) ## 0.7.3 @@ -1248,45 +1250,45 @@ release and later, and "as-is" connections made using earlier releases of ACA-Py candidates. A new "Upgrade deployment" capability ([#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557), described below) must be executed to update your deployment to add tags for all existing connections. -The [Supported RFCs document](/SupportedRFCs.md) has been updated to reflect the addition of the +The [Supported RFCs document](../features/SupportedRFCs) has been updated to reflect the addition of the AIP 2.0 RFCs for which support was added. The following is an annotated list of PRs in the release, including a link to each PR. - **AIP 2.0 Features** - - Discover Features Protocol: v1_0 refactoring and v2_0 implementation [[#1500](https://github.com/hyperledger/aries-cloudagent-python/pull/1500)](https://github.com/hyperledger/aries-cloudagent-python/pull/1500) + - Discover Features Protocol: v1_0 refactoring and v2_0 implementation [[#1500](https://github.com/hyperledger/aries-cloudagent-python/pull/1500)](https://github.com/hyperledger/aries-cloudagent-python/pull/1500) - Updates the Discover Features 1.0 (AIP 1.0) implementation and implements the new 2.0 version. In doing so, adds generalized support for goal codes to ACA-Py. - fix DiscoveryExchangeRecord RECORD_TOPIC typo fix [#1566](https://github.com/hyperledger/aries-cloudagent-python/pull/1566) - - Implement Revocation Notification v1.0 [#1464](https://github.com/hyperledger/aries-cloudagent-python/pull/1464) - - Fix integration tests (revocation notifications) [#1528](https://github.com/hyperledger/aries-cloudagent-python/pull/1528) - - Add Revocation notification support to alice/faber [#1527](https://github.com/hyperledger/aries-cloudagent-python/pull/1527) + - Implement Revocation Notification v1.0 [#1464](https://github.com/hyperledger/aries-cloudagent-python/pull/1464) + - Fix integration tests (revocation notifications) [#1528](https://github.com/hyperledger/aries-cloudagent-python/pull/1528) + - Add Revocation notification support to alice/faber [#1527](https://github.com/hyperledger/aries-cloudagent-python/pull/1527) - **Other New Features** - - Multiple Indy Ledger support and State Proof verification [#1425](https://github.com/hyperledger/aries-cloudagent-python/pull/1425) + - Multiple Indy Ledger support and State Proof verification [#1425](https://github.com/hyperledger/aries-cloudagent-python/pull/1425) - Remove required dependencies from multi-ledger code that was requiring the import of Aries Askar even when not being used[#1550](https://github.com/hyperledger/aries-cloudagent-python/pull/1550) - Fixed IndyDID resolver bug after Tag 0.7.3rc0 created [#1569](https://github.com/hyperledger/aries-cloudagent-python/pull/1569) - Typo vdr service name [#1563](https://github.com/hyperledger/aries-cloudagent-python/pull/1563) - Fixes and cleanup for multiple ledger support with Askar [#1583](https://github.com/hyperledger/aries-cloudagent-python/pull/1583) - - Outbound Queue - more usability improvements [#1501](https://github.com/hyperledger/aries-cloudagent-python/pull/1501) - - Display QR code when generating/displaying invites on startup [#1526](https://github.com/hyperledger/aries-cloudagent-python/pull/1526) - - Enable WS Pings for WS Inbound Transport [#1530](https://github.com/hyperledger/aries-cloudagent-python/pull/1530) + - Outbound Queue - more usability improvements [#1501](https://github.com/hyperledger/aries-cloudagent-python/pull/1501) + - Display QR code when generating/displaying invites on startup [#1526](https://github.com/hyperledger/aries-cloudagent-python/pull/1526) + - Enable WS Pings for WS Inbound Transport [#1530](https://github.com/hyperledger/aries-cloudagent-python/pull/1530) - Faster detection of lost Web Socket connections; implementation verified with an existing mediator. - - Performance Improvement when using connection reuse in OOB and there are many DID connections. ConnRecord tags - their_public_did and invitation_msg_id [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) + - Performance Improvement when using connection reuse in OOB and there are many DID connections. ConnRecord tags - their_public_did and invitation_msg_id [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) - In previous releases, a "their_public_did" was not a tag, so to see if you can reuse a connection, all connections were retrieved from the database to see if a matching public DID can be found. Now, connections created after deploying this release will have a tag on the connection such that an indexed query can be used. See "Breaking Change" note above and "Update" feature below. - Follow up to [#1543](https://github.com/hyperledger/aries-cloudagent-python/pull/1543) - Adding invitation_msg_id and their_public_did back to record_value [#1553](https://github.com/hyperledger/aries-cloudagent-python/pull/1553) - - A generic "Upgrade Deployment" capability was added to ACA-Py that operates like a database migration capability in relational databases. When executed (via a command line option), a current version of the deployment is detected and if any storage updates need be applied to be consistent with the new version, they are, and the stored "current version"is updated to the new version. An instance of this capability can be used to address the new feature #1543 documented above. [#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557) - - Adds a "credential_revoked" state to the Issue Credential protocol state object. When the protocol state object is retained past the completion of the protocol, it is updated when the credential is revoked. [#1545](https://github.com/hyperledger/aries-cloudagent-python/pull/1545) - - Updated a missing dependency that recently caused an error when using the `--version` command line option [#1589](https://github.com/hyperledger/aries-cloudagent-python/pull/1589) + - A generic "Upgrade Deployment" capability was added to ACA-Py that operates like a database migration capability in relational databases. When executed (via a command line option), a current version of the deployment is detected and if any storage updates need be applied to be consistent with the new version, they are, and the stored "current version"is updated to the new version. An instance of this capability can be used to address the new feature #1543 documented above. [#1557](https://github.com/hyperledger/aries-cloudagent-python/pull/1557) + - Adds a "credential_revoked" state to the Issue Credential protocol state object. When the protocol state object is retained past the completion of the protocol, it is updated when the credential is revoked. [#1545](https://github.com/hyperledger/aries-cloudagent-python/pull/1545) + - Updated a missing dependency that recently caused an error when using the `--version` command line option [#1589](https://github.com/hyperledger/aries-cloudagent-python/pull/1589) - **Critical Fixes** - - Fix connection record response for mobile [#1469](https://github.com/hyperledger/aries-cloudagent-python/pull/1469) + - Fix connection record response for mobile [#1469](https://github.com/hyperledger/aries-cloudagent-python/pull/1469) - **Documentation Additions and Updates** - - added documentation for wallet storage databases [#1523](https://github.com/hyperledger/aries-cloudagent-python/pull/1523) - - added logging documentation [#1519](https://github.com/hyperledger/aries-cloudagent-python/pull/1519) - - Fix warnings when generating ReadTheDocs [#1509](https://github.com/hyperledger/aries-cloudagent-python/pull/1509) - - Remove Streetcred references [#1504](https://github.com/hyperledger/aries-cloudagent-python/pull/1504) - - Add RTD configs to get generator working [#1496](https://github.com/hyperledger/aries-cloudagent-python/pull/1496) - - The Alice/Faber demo was updated to allow connections based on Public DIDs to be established, including reusing a connection if there is an existing connection. [#1574](https://github.com/hyperledger/aries-cloudagent-python/pull/1574) + - added documentation for wallet storage databases [#1523](https://github.com/hyperledger/aries-cloudagent-python/pull/1523) + - added logging documentation [#1519](https://github.com/hyperledger/aries-cloudagent-python/pull/1519) + - Fix warnings when generating ReadTheDocs [#1509](https://github.com/hyperledger/aries-cloudagent-python/pull/1509) + - Remove Streetcred references [#1504](https://github.com/hyperledger/aries-cloudagent-python/pull/1504) + - Add RTD configs to get generator working [#1496](https://github.com/hyperledger/aries-cloudagent-python/pull/1496) + - The Alice/Faber demo was updated to allow connections based on Public DIDs to be established, including reusing a connection if there is an existing connection. [#1574](https://github.com/hyperledger/aries-cloudagent-python/pull/1574) - **Other Fixes** - - Connection Handling / Out of Band Invitations Fixes + - Connection Handling / Out of Band Invitations Fixes - OOB: Fixes issues with multiple public explicit invitation and unused 0160 connection [#1525](https://github.com/hyperledger/aries-cloudagent-python/pull/1525) - OOB added webhooks to notify the controller when a connection reuse message is used in response to an invitation [#1581](https://github.com/hyperledger/aries-cloudagent-python/pull/1581) - Delete unused ConnRecord generated - OOB invitation (use_exising_connection) [#1521](https://github.com/hyperledger/aries-cloudagent-python/pull/1521) @@ -1296,25 +1298,25 @@ The following is an annotated list of PRs in the release, including a link to ea - fix: use invitation key for connection query [#1570](https://github.com/hyperledger/aries-cloudagent-python/pull/1570) - Fix the inconsistency of invitation_msg_id between invitation and response [#1564](https://github.com/hyperledger/aries-cloudagent-python/pull/1564) - chore: update pydid to ^0.3.3 [#1562](https://github.com/hyperledger/aries-cloudagent-python/pull/1562) - - DIF Presentation Exchange Cleanups + - DIF Presentation Exchange Cleanups - Fix DIF Presentation Request Input Validation [#1517](https://github.com/hyperledger/aries-cloudagent-python/pull/1517) - Some validation checking of a DIF presentation request to prevent uncaught errors later in the process. - DIF PresExch - ProblemReport and "is_holder" [#1493](https://github.com/hyperledger/aries-cloudagent-python/pull/1493) - Cleanups related to when "is_holder" is or is not required. Related to [Issue #1486](https://github.com/hyperledger/aries-cloudagent-python/issues/1486) - - Indy SDK Related Fixes + - Indy SDK Related Fixes - Fix AttributeError when writing an Indy Cred Def record [#1516](https://github.com/hyperledger/aries-cloudagent-python/pull/1516) - Fix TypeError when calling credential_definitions_fix_cred_def_wallet… [#1515](https://github.com/hyperledger/aries-cloudagent-python/pull/1515) - Fix TypeError when writing a Schema record [#1494](https://github.com/hyperledger/aries-cloudagent-python/pull/1494) - Fix validation for range checks [#1538](https://github.com/hyperledger/aries-cloudagent-python/pull/1538) - Back out some of the validation checking for proof requests with predicates as they were preventing valid proof requests from being processed. - - Aries Askar Related Fixes: + - Aries Askar Related Fixes: - Fix bug when getting credentials on askar-profile [#1510](https://github.com/hyperledger/aries-cloudagent-python/pull/1510) - Fix error when removing a wallet on askar-profile [#1518](https://github.com/hyperledger/aries-cloudagent-python/pull/1518) - Fix error when connection request is received (askar, public invitation) [#1508](https://github.com/hyperledger/aries-cloudagent-python/pull/1508) - Fix error when an error occurs while issuing a revocable credential [#1591](https://github.com/hyperledger/aries-cloudagent-python/pull/1591) - - Docker fixes: + - Docker fixes: - Update docker scripts to use new & improved docker IP detection [#1565](https://github.com/hyperledger/aries-cloudagent-python/pull/1565) - - Release Adminstration: + - Release Adminstration: - Changelog and RTD updates for the pending 0.7.3 release [#1553](https://github.com/hyperledger/aries-cloudagent-python/pull/1553) ## 0.7.2 @@ -1326,61 +1328,61 @@ With usage in the field increasing, we're cleaning up edge cases and issues rela The most significant new feature for users of Indy ledgers is a simplified approach for transaction authors getting their transactions signed by an endorser. Transaction author controllers now do almost nothing other than configuring their instance to use an Endorser, -and ACA-Py takes care of the rest. Documentation of that feature is [here](Endorser.md). +and ACA-Py takes care of the rest. Documentation of that feature is [here](../features/Endorser). - Improve cloud native deployments/scaling - - unprotect liveness and readiness endpoints [#1416](https://github.com/hyperledger/aries-cloudagent-python/pull/1416) - - Open askar sessions only on demand - Connections [#1424](https://github.com/hyperledger/aries-cloudagent-python/pull/1424) - - Fixed potential deadlocks by opening sessions only on demand (Wallet endpoints) [#1472](https://github.com/hyperledger/aries-cloudagent-python/pull/1472) - - Fixed potential deadlocks by opening sessions only on demand [#1439](https://github.com/hyperledger/aries-cloudagent-python/pull/1439) - - Make mediation invitation parameter idempotent [#1413](https://github.com/hyperledger/aries-cloudagent-python/pull/1413) + - unprotect liveness and readiness endpoints [#1416](https://github.com/hyperledger/aries-cloudagent-python/pull/1416) + - Open askar sessions only on demand - Connections [#1424](https://github.com/hyperledger/aries-cloudagent-python/pull/1424) + - Fixed potential deadlocks by opening sessions only on demand (Wallet endpoints) [#1472](https://github.com/hyperledger/aries-cloudagent-python/pull/1472) + - Fixed potential deadlocks by opening sessions only on demand [#1439](https://github.com/hyperledger/aries-cloudagent-python/pull/1439) + - Make mediation invitation parameter idempotent [#1413](https://github.com/hyperledger/aries-cloudagent-python/pull/1413) - Indy Transaction Endorser Support Added - - Endorser protocol configuration, automation and demo integration [#1422](https://github.com/hyperledger/aries-cloudagent-python/pull/1422) - - Auto connect from author to endorser on startup [#1461](https://github.com/hyperledger/aries-cloudagent-python/pull/1461) - - Startup and shutdown events (prep for endorser updates) [#1459](https://github.com/hyperledger/aries-cloudagent-python/pull/1459) - - Endorser protocol askar fixes [#1450](https://github.com/hyperledger/aries-cloudagent-python/pull/1450) - - Endorser protocol updates - refactor to use event bus [#1448](https://github.com/hyperledger/aries-cloudagent-python/pull/1448) + - Endorser protocol configuration, automation and demo integration [#1422](https://github.com/hyperledger/aries-cloudagent-python/pull/1422) + - Auto connect from author to endorser on startup [#1461](https://github.com/hyperledger/aries-cloudagent-python/pull/1461) + - Startup and shutdown events (prep for endorser updates) [#1459](https://github.com/hyperledger/aries-cloudagent-python/pull/1459) + - Endorser protocol askar fixes [#1450](https://github.com/hyperledger/aries-cloudagent-python/pull/1450) + - Endorser protocol updates - refactor to use event bus [#1448](https://github.com/hyperledger/aries-cloudagent-python/pull/1448) - Indy verifiable credential/presentation fixes and updates - - Update credential and proof mappings to allow negative encoded values [#1475](https://github.com/hyperledger/aries-cloudagent-python/pull/1475) - - Add credential validation to offer issuance step [#1446](https://github.com/hyperledger/aries-cloudagent-python/pull/1446) - - Fix error removing proof req entries by timestamp [#1465](https://github.com/hyperledger/aries-cloudagent-python/pull/1465) - - Fix issue with cred limit on presentation endpoint [#1437](https://github.com/hyperledger/aries-cloudagent-python/pull/1437) - - Add support for custom offers from the proposal [#1426](https://github.com/hyperledger/aries-cloudagent-python/pull/1426) - - Make requested attributes and predicates required on indy proof request [#1411](https://github.com/hyperledger/aries-cloudagent-python/pull/1411) - - Remove connection check on proof verify [#1383](https://github.com/hyperledger/aries-cloudagent-python/pull/1383) + - Update credential and proof mappings to allow negative encoded values [#1475](https://github.com/hyperledger/aries-cloudagent-python/pull/1475) + - Add credential validation to offer issuance step [#1446](https://github.com/hyperledger/aries-cloudagent-python/pull/1446) + - Fix error removing proof req entries by timestamp [#1465](https://github.com/hyperledger/aries-cloudagent-python/pull/1465) + - Fix issue with cred limit on presentation endpoint [#1437](https://github.com/hyperledger/aries-cloudagent-python/pull/1437) + - Add support for custom offers from the proposal [#1426](https://github.com/hyperledger/aries-cloudagent-python/pull/1426) + - Make requested attributes and predicates required on indy proof request [#1411](https://github.com/hyperledger/aries-cloudagent-python/pull/1411) + - Remove connection check on proof verify [#1383](https://github.com/hyperledger/aries-cloudagent-python/pull/1383) - General cleanups and improvements to existing features - - Fixes failing integration test -- JSON-LD context URL not loading because of external issue [#1491](https://github.com/hyperledger/aries-cloudagent-python/pull/1491) - - Update base record time-stamp to standard ISO format [#1453](https://github.com/hyperledger/aries-cloudagent-python/pull/1453) - - Encode DIDComm messages before sent to the queue [#1408](https://github.com/hyperledger/aries-cloudagent-python/pull/1408) - - Add Event bus Metadata [#1429](https://github.com/hyperledger/aries-cloudagent-python/pull/1429) - - Allow base wallet to connect to a mediator after startup [#1463](https://github.com/hyperledger/aries-cloudagent-python/pull/1463) - - Log warning when unsupported problem report code is received [#1409](https://github.com/hyperledger/aries-cloudagent-python/pull/1409) - - feature/inbound-transport-profile [#1407](https://github.com/hyperledger/aries-cloudagent-python/pull/1407) - - Import cleanups [#1393](https://github.com/hyperledger/aries-cloudagent-python/pull/1393) - - Add no-op handler for generic ack message (RFC 0015) [#1390](https://github.com/hyperledger/aries-cloudagent-python/pull/1390) - - Align OutOfBandManager.receive_invitation with other connection managers [#1382](https://github.com/hyperledger/aries-cloudagent-python/pull/1382) + - Fixes failing integration test -- JSON-LD context URL not loading because of external issue [#1491](https://github.com/hyperledger/aries-cloudagent-python/pull/1491) + - Update base record time-stamp to standard ISO format [#1453](https://github.com/hyperledger/aries-cloudagent-python/pull/1453) + - Encode DIDComm messages before sent to the queue [#1408](https://github.com/hyperledger/aries-cloudagent-python/pull/1408) + - Add Event bus Metadata [#1429](https://github.com/hyperledger/aries-cloudagent-python/pull/1429) + - Allow base wallet to connect to a mediator after startup [#1463](https://github.com/hyperledger/aries-cloudagent-python/pull/1463) + - Log warning when unsupported problem report code is received [#1409](https://github.com/hyperledger/aries-cloudagent-python/pull/1409) + - feature/inbound-transport-profile [#1407](https://github.com/hyperledger/aries-cloudagent-python/pull/1407) + - Import cleanups [#1393](https://github.com/hyperledger/aries-cloudagent-python/pull/1393) + - Add no-op handler for generic ack message (RFC 0015) [#1390](https://github.com/hyperledger/aries-cloudagent-python/pull/1390) + - Align OutOfBandManager.receive_invitation with other connection managers [#1382](https://github.com/hyperledger/aries-cloudagent-python/pull/1382) - Bug fixes - - fix: fixes error in use of a default mediator in connections/out of band -- mediation ID was being saved as None instead of the retrieved default mediator value [#1490](https://github.com/hyperledger/aries-cloudagent-python/pull/1490) - - fix: help text for open-mediation flag [#1445](https://github.com/hyperledger/aries-cloudagent-python/pull/1445) - - fix: incorrect return type [#1438](https://github.com/hyperledger/aries-cloudagent-python/pull/1438) - - Add missing param to ws protocol [#1442](https://github.com/hyperledger/aries-cloudagent-python/pull/1442) - - fix: create static doc use empty endpoint if None [#1483](https://github.com/hyperledger/aries-cloudagent-python/pull/1483) - - fix: use named tuple instead of dataclass in mediation invite store [#1476](https://github.com/hyperledger/aries-cloudagent-python/pull/1476) - - When fetching the admin config, don't overwrite webhook settings [#1420](https://github.com/hyperledger/aries-cloudagent-python/pull/1420) - - fix: return type of inject [#1392](https://github.com/hyperledger/aries-cloudagent-python/pull/1392) - - fix: typo in connection static result schema [#1389](https://github.com/hyperledger/aries-cloudagent-python/pull/1389) - - fix: don't require push on outbound queue implementations [#1387](https://github.com/hyperledger/aries-cloudagent-python/pull/1387) + - fix: fixes error in use of a default mediator in connections/out of band -- mediation ID was being saved as None instead of the retrieved default mediator value [#1490](https://github.com/hyperledger/aries-cloudagent-python/pull/1490) + - fix: help text for open-mediation flag [#1445](https://github.com/hyperledger/aries-cloudagent-python/pull/1445) + - fix: incorrect return type [#1438](https://github.com/hyperledger/aries-cloudagent-python/pull/1438) + - Add missing param to ws protocol [#1442](https://github.com/hyperledger/aries-cloudagent-python/pull/1442) + - fix: create static doc use empty endpoint if None [#1483](https://github.com/hyperledger/aries-cloudagent-python/pull/1483) + - fix: use named tuple instead of dataclass in mediation invite store [#1476](https://github.com/hyperledger/aries-cloudagent-python/pull/1476) + - When fetching the admin config, don't overwrite webhook settings [#1420](https://github.com/hyperledger/aries-cloudagent-python/pull/1420) + - fix: return type of inject [#1392](https://github.com/hyperledger/aries-cloudagent-python/pull/1392) + - fix: typo in connection static result schema [#1389](https://github.com/hyperledger/aries-cloudagent-python/pull/1389) + - fix: don't require push on outbound queue implementations [#1387](https://github.com/hyperledger/aries-cloudagent-python/pull/1387) - Updates/Fixes to the Alice/Faber demo and integration tests - - Clarify instructions in the Acme Controller Demo [#1484](https://github.com/hyperledger/aries-cloudagent-python/pull/1484) - - Fix aip 20 behaviour and other cleanup [#1406](https://github.com/hyperledger/aries-cloudagent-python/pull/1406) - - Fix issue with startup sequence for faber agent [#1415](https://github.com/hyperledger/aries-cloudagent-python/pull/1415) - - Connectionless proof demo [#1395](https://github.com/hyperledger/aries-cloudagent-python/pull/1395) - - Typos in the demo's README.md [#1405](https://github.com/hyperledger/aries-cloudagent-python/pull/1405) - - Run integration tests using external ledger and tails server [#1400](https://github.com/hyperledger/aries-cloudagent-python/pull/1400) + - Clarify instructions in the Acme Controller Demo [#1484](https://github.com/hyperledger/aries-cloudagent-python/pull/1484) + - Fix aip 20 behaviour and other cleanup [#1406](https://github.com/hyperledger/aries-cloudagent-python/pull/1406) + - Fix issue with startup sequence for faber agent [#1415](https://github.com/hyperledger/aries-cloudagent-python/pull/1415) + - Connectionless proof demo [#1395](https://github.com/hyperledger/aries-cloudagent-python/pull/1395) + - Typos in the demo's README.md [#1405](https://github.com/hyperledger/aries-cloudagent-python/pull/1405) + - Run integration tests using external ledger and tails server [#1400](https://github.com/hyperledger/aries-cloudagent-python/pull/1400) - Chores - - Update CONTRIBUTING.md [#1428](https://github.com/hyperledger/aries-cloudagent-python/pull/1428) - - Update to ReadMe and Supported RFCs for 0.7.2 [#1489](https://github.com/hyperledger/aries-cloudagent-python/pull/1489) - - Updating the RTDs code for Release 0.7.2 - Try 2 [#1488](https://github.com/hyperledger/aries-cloudagent-python/pull/1488) + - Update CONTRIBUTING.md [#1428](https://github.com/hyperledger/aries-cloudagent-python/pull/1428) + - Update to ReadMe and Supported RFCs for 0.7.2 [#1489](https://github.com/hyperledger/aries-cloudagent-python/pull/1489) + - Updating the RTDs code for Release 0.7.2 - Try 2 [#1488](https://github.com/hyperledger/aries-cloudagent-python/pull/1488) ## 0.7.1 @@ -1390,8 +1392,8 @@ A relatively minor maintenance release to address issues found since the 0.7.0 R Includes some cleanups of JSON-LD Verifiable Credentials and Verifiable Presentations - W3C Verifiable Credential cleanups - - Timezone inclusion [ISO 8601] for W3C VC and Proofs ([#1373](https://github.com/hyperledger/aries-cloudagent-python/pull/1373)) - - W3C VC handling where attachment is JSON and not Base64 encoded ([#1352](https://github.com/hyperledger/aries-cloudagent-python/pull/1352)) + - Timezone inclusion [ISO 8601] for W3C VC and Proofs ([#1373](https://github.com/hyperledger/aries-cloudagent-python/pull/1373)) + - W3C VC handling where attachment is JSON and not Base64 encoded ([#1352](https://github.com/hyperledger/aries-cloudagent-python/pull/1352)) - Refactor outbound queue interface ([#1348](https://github.com/hyperledger/aries-cloudagent-python/pull/1348)) - Command line parameter handling for arbitrary plugins ([#1347](https://github.com/hyperledger/aries-cloudagent-python/pull/1347)) - Add an optional parameter '--ledger-socks-proxy' ([#1342](https://github.com/hyperledger/aries-cloudagent-python/pull/1342)) @@ -1404,11 +1406,11 @@ Includes some cleanups of JSON-LD Verifiable Credentials and Verifiable Presenta [#1366](https://github.com/hyperledger/aries-cloudagent-python/pull/1366), [#1371](https://github.com/hyperledger/aries-cloudagent-python/pull/1371)) - Add `inject_or` method to dynamic injection framework to resolve typing ambiguity ([#1376](https://github.com/hyperledger/aries-cloudagent-python/pull/1376)) - Other fixes: - - Indy Proof processing fix, error not raised in predicate timestamp check ([#1364](https://github.com/hyperledger/aries-cloudagent-python/pull/1364)) - - Problem Report handler for connection specific problems ([#1356](https://github.com/hyperledger/aries-cloudagent-python/pull/1356)) - - fix: error on deserializing conn record with protocol ([#1325](https://github.com/hyperledger/aries-cloudagent-python/pull/1325)) - - fix: failure to verify jsonld on non-conformant doc but vaild vmethod ([#1301](https://github.com/hyperledger/aries-cloudagent-python/pull/1301)) - - fix: allow underscore in endpoints ([#1378](https://github.com/hyperledger/aries-cloudagent-python/pull/1378)) + - Indy Proof processing fix, error not raised in predicate timestamp check ([#1364](https://github.com/hyperledger/aries-cloudagent-python/pull/1364)) + - Problem Report handler for connection specific problems ([#1356](https://github.com/hyperledger/aries-cloudagent-python/pull/1356)) + - fix: error on deserializing conn record with protocol ([#1325](https://github.com/hyperledger/aries-cloudagent-python/pull/1325)) + - fix: failure to verify jsonld on non-conformant doc but vaild vmethod ([#1301](https://github.com/hyperledger/aries-cloudagent-python/pull/1301)) + - fix: allow underscore in endpoints ([#1378](https://github.com/hyperledger/aries-cloudagent-python/pull/1378)) ## 0.7.0 @@ -1439,11 +1441,11 @@ This is a significant release of ACA-Py with several new features, as well as ch #### Mediator support -While ACA-Py had previous support for a basic routing protocol, this was never fully developed or used in practice. Starting with this release, inbound and outbound connections can be established through a mediator agent using the Aries (Mediator Coordination Protocol)[https://github.com/hyperledger/aries-rfcs/tree/master/features/0211-route-coordination]. This work was initially contributed by Adam Burdett and Daniel Bluhm of [Indicio](https://indicio.tech/) on behalf of [SICPA](https://sicpa.com/). [Read more about mediation support](./Mediation.md). +While ACA-Py had previous support for a basic routing protocol, this was never fully developed or used in practice. Starting with this release, inbound and outbound connections can be established through a mediator agent using the Aries (Mediator Coordination Protocol)[https://github.com/hyperledger/aries-rfcs/tree/master/features/0211-route-coordination]. This work was initially contributed by Adam Burdett and Daniel Bluhm of [Indicio](https://indicio.tech/) on behalf of [SICPA](https://sicpa.com/). [Read more about mediation support](../features/Mediation). #### Multi-Tenancy support -Started by [BMW](https://bmw.com/) and completed by [Animo Solutions](https://animo.id/) and [Anon Solutions](https://anon-solutions.ca/) on behalf of [SICPA](https://sicpa.com/), this feature allows for a single ACA-Py instance to host multiple wallet instances. This can greatly reduce the resources required when many identities are being handled. [Read more about multi-tenancy support](./Multitenancy.md). +Started by [BMW](https://bmw.com/) and completed by [Animo Solutions](https://animo.id/) and [Anon Solutions](https://anon-solutions.ca/) on behalf of [SICPA](https://sicpa.com/), this feature allows for a single ACA-Py instance to host multiple wallet instances. This can greatly reduce the resources required when many identities are being handled. [Read more about multi-tenancy support](../features/Multitenancy). #### New connection protocol(s) diff --git a/docs/release/acapy-README.md b/docs/release/acapy-README.md index ddd5e475..fb246e67 100644 --- a/docs/release/acapy-README.md +++ b/docs/release/acapy-README.md @@ -14,27 +14,27 @@ Check it out! It's much easier to navigate than this GitHub repo for reading the Hyperledger Aries Cloud Agent Python (ACA-Py) is a foundation for building Verifiable Credential (VC) ecosystems. It operates in the second and third layers of the [Trust Over IP framework (PDF)](https://trustoverip.org/wp-content/uploads/2020/05/toip_050520_primer.pdf) using [DIDComm messaging](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0005-didcomm) and [Hyperledger Aries](https://www.hyperledger.org/use/aries) protocols. The "cloud" in the name means that ACA-Py runs on servers (cloud, enterprise, IoT devices, and so forth), and is not designed to run on mobile devices. -ACA-Py is built on the Aries concepts and features that make up [Aries Interop Profile (AIP) 2.0](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0302-aries-interop-profile#aries-interop-profile-version-20). [ACA-Py’s supported Aries protocols](docs/features/SupportedRFCs.md) include, most importantly, protocols for issuing, verifying, and holding verifiable credentials using both [Hyperledger AnonCreds] verifiable credential format, and the [W3C Standard Verifiable Credential Data Model] format using JSON-LD with LD-Signatures and BBS+ Signatures. Coming soon -- issuing and presenting [Hyperledger AnonCreds] verifiable credentials using the [W3C Standard Verifiable Credential Data Model] format. +ACA-Py is built on the Aries concepts and features that make up [Aries Interop Profile (AIP) 2.0](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0302-aries-interop-profile#aries-interop-profile-version-20). [ACA-Py’s supported Aries protocols](../features/SupportedRFCs.md) include, most importantly, protocols for issuing, verifying, and holding verifiable credentials using both [Hyperledger AnonCreds] verifiable credential format, and the [W3C Standard Verifiable Credential Data Model] format using JSON-LD with LD-Signatures and BBS+ Signatures. Coming soon -- issuing and presenting [Hyperledger AnonCreds] verifiable credentials using the [W3C Standard Verifiable Credential Data Model] format. [Hyperledger AnonCreds]: https://www.hyperledger.org/use/anoncreds [W3C Standard Verifiable Credential Data Model]: https://www.w3.org/TR/vc-data-model/ To use ACA-Py you create a business logic controller that "talks to" an ACA-Py instance (sending HTTP requests and receiving webhook notifications), and ACA-Py handles the Aries and DIDComm protocols and related functionality. Your controller can be built in any language that supports making and receiving HTTP requests; knowledge of Python is not needed. Together, this means you can focus on building VC solutions using familiar web development technologies, instead of having to learn the nuts and bolts of low-level cryptography and Trust over IP-type Aries protocols. -This [checklist-style overview document](docs/features/SupportedRFCs.md) provides a full list of the features in ACA-Py. +This [checklist-style overview document](../features/SupportedRFCs.md) provides a full list of the features in ACA-Py. The following is a list of some of the core features needed for a production deployment, with a link to detailed information about the capability. ### Multi-Tenant -ACA-Py supports "multi-tenant" scenarios. In these scenarios, one (scalable) instance of ACA-Py uses one database instance, and are together capable of managing separate secure storage (for private keys, DIDs, credentials, etc.) for many different actors. This enables (for example) an "issuer-as-a-service", where an enterprise may have many VC issuers, each with different identifiers, using the same instance of ACA-Py to interact with VC holders as required. Likewise, an ACA-Py instance could be a "cloud wallet" for many holders (e.g. people or organizations) that, for whatever reason, cannot use a mobile device for a wallet. Learn more about multi-tenant deployments [here](docs/features/Multitenancy.md). +ACA-Py supports "multi-tenant" scenarios. In these scenarios, one (scalable) instance of ACA-Py uses one database instance, and are together capable of managing separate secure storage (for private keys, DIDs, credentials, etc.) for many different actors. This enables (for example) an "issuer-as-a-service", where an enterprise may have many VC issuers, each with different identifiers, using the same instance of ACA-Py to interact with VC holders as required. Likewise, an ACA-Py instance could be a "cloud wallet" for many holders (e.g. people or organizations) that, for whatever reason, cannot use a mobile device for a wallet. Learn more about multi-tenant deployments [here](../features/Multitenancy.md). ### Mediator Service -Startup options allow the use of an ACA-Py as an Aries [mediator](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0046-mediators-and-relays#summary) using core Aries protocols to coordinate its mediation role. Such an ACA-Py instance receives, stores and forwards messages to Aries agents that (for example) lack an addressable endpoint on the Internet such as a mobile wallet. A live instance of a public mediator based on ACA-Py is available [here](https://indicio-tech.github.io/mediator/) from Indicio Technologies. Learn more about deploying a mediator [here](docs/features/Mediation.md). See the [Aries Mediator Service](https://github.com/hyperledger/aries-mediator-service) for a "best practices" configuration of an Aries mediator. +Startup options allow the use of an ACA-Py as an Aries [mediator](https://github.com/hyperledger/aries-rfcs/tree/main/concepts/0046-mediators-and-relays#summary) using core Aries protocols to coordinate its mediation role. Such an ACA-Py instance receives, stores and forwards messages to Aries agents that (for example) lack an addressable endpoint on the Internet such as a mobile wallet. A live instance of a public mediator based on ACA-Py is available [here](https://indicio-tech.github.io/mediator/) from Indicio Technologies. Learn more about deploying a mediator [here](../features/Mediation.md). See the [Aries Mediator Service](https://github.com/hyperledger/aries-mediator-service) for a "best practices" configuration of an Aries mediator. ### Indy Transaction Endorsing -ACA-Py supports a Transaction Endorsement protocol, for agents that don't have write access to an Indy ledger. Endorser support is documented [here](docs/features/Endorser.md). +ACA-Py supports a Transaction Endorsement protocol, for agents that don't have write access to an Indy ledger. Endorser support is documented [here](../features/Endorser.md). ### Scaled Deployments @@ -42,7 +42,7 @@ ACA-Py supports deployments in scaled environments such as in Kubernetes environ ### VC-API Endpoints -A set of endpoints conforming to the vc-api specification are included to manage w3c credentials and presentations. They are documented [here](docs/features/JsonLdCredentials.md#vc-api) and a postman demo is available [here](docs/features/JsonLdCredentials.md#vc-api). +A set of endpoints conforming to the vc-api specification are included to manage w3c credentials and presentations. They are documented [here](../features/JsonLdCredentials.md#vc-api) and a postman demo is available [here](../features/JsonLdCredentials.md#vc-api). ## Example Uses @@ -65,7 +65,7 @@ For those new to SSI, Aries and ACA-Py, there are a couple of Linux Foundation e The latter is the most useful for developers wanting to get a solid basis in using ACA-Py and other Aries Frameworks. -Also included here is a much more concise (but less maintained) [Getting Started Guide](docs/gettingStarted/README.md) that will take you from knowing next to nothing about decentralized identity to developing Aries-based business apps and services. You’ll run an Indy ledger (with no ramp-up time), ACA-Py apps and developer-oriented demos. The guide has a table of contents so you can skip the parts you already know. +Also included here is a much more concise (but less maintained) [Getting Started Guide](../gettingStarted/README.md) that will take you from knowing next to nothing about decentralized identity to developing Aries-based business apps and services. You’ll run an Indy ledger (with no ramp-up time), ACA-Py apps and developer-oriented demos. The guide has a table of contents so you can skip the parts you already know. ### Understanding the Architecture @@ -73,20 +73,20 @@ There is an [architectural deep dive webinar](https://www.youtube.com/watch?v=FX ![drawing](./aca-py_architecture.png) -You can extend ACA-Py using plug-ins, which can be loaded at runtime. Plug-ins are mentioned in the [webinar](https://docs.google.com/presentation/d/1K7qiQkVi4n-lpJ3nUZY27OniUEM0c8HAIk4imCWCx5Q/edit#slide=id.g5d43fe05cc_0_145) and are [described in more detail here](docs/features/PlugIns.md). An ever-expanding set of ACA-Py plugins can be found +You can extend ACA-Py using plug-ins, which can be loaded at runtime. Plug-ins are mentioned in the [webinar](https://docs.google.com/presentation/d/1K7qiQkVi4n-lpJ3nUZY27OniUEM0c8HAIk4imCWCx5Q/edit#slide=id.g5d43fe05cc_0_145) and are [described in more detail here](../features/PlugIns.md). An ever-expanding set of ACA-Py plugins can be found in the [Aries ACA-Py Plugins repository]. Check them out -- it might have the very plugin you need! [Aries ACA-Py Plugins repository]: https://github.com/hyperledger/aries-acapy-plugins ### Installation and Usage -Use the ["install and go" page for developers](docs/features/DevReadMe.md) if you are comfortable with Trust over IP and Aries concepts. ACA-Py can be run with Docker without installation (highly recommended), or can be installed [from PyPi](https://pypi.org/project/aries-cloudagent/). In the [/demo directory](demo) there is a full set of demos for developers to use in getting started, and the [demo read me](docs/demo/README.md) is a great starting point for developers to use an "in-browser" approach to run a zero-install example. The [Read the Docs](https://aries-cloud-agent-python.readthedocs.io/en/latest/) overview is also a way to understand the internal modules and APIs that make up an ACA-Py instance. +Use the ["install and go" page for developers](../features/DevReadMe.md) if you are comfortable with Trust over IP and Aries concepts. ACA-Py can be run with Docker without installation (highly recommended), or can be installed [from PyPi](https://pypi.org/project/aries-cloudagent/). In the [/demo directory](../contributing/demo) there is a full set of demos for developers to use in getting started, and the [demo read me](../demo/README.md) is a great starting point for developers to use an "in-browser" approach to run a zero-install example. The [Read the Docs](https://aries-cloud-agent-python.readthedocs.io/en/latest/) overview is also a way to understand the internal modules and APIs that make up an ACA-Py instance. -If you would like to develop on ACA-Py locally note that we use Poetry for dependency management and packaging, if you are unfamiliar with poetry please see our [cheat sheet](docs/deploying/Poetry.md) +If you would like to develop on ACA-Py locally note that we use Poetry for dependency management and packaging, if you are unfamiliar with poetry please see our [cheat sheet](../deploying/Poetry.md) ## About the ACA-Py Admin API -The [overview of ACA-Py’s API](docs/features/AdminAPI.md) is a great starting place for learning about the ACA-Py API when you are starting to build your own controller. +The [overview of ACA-Py’s API](../features/AdminAPI.md) is a great starting place for learning about the ACA-Py API when you are starting to build your own controller. An ACA-Py instance puts together an OpenAPI-documented REST interface based on the protocols that are loaded. This is used by a controller application (written in any language) to manage the behavior of the agent. The controller can initiate actions (e.g. issuing a credential) and can respond to agent events (e.g. sending a presentation request after a connection is accepted). Agent events are delivered to the controller as webhooks to a configured URL. @@ -96,7 +96,7 @@ Technical note: the administrative API exposed by the agent for the controller t There are a number of resources for getting help with ACA-Py and troubleshooting any problems you might run into. The -[Troubleshooting](docs/testing/Troubleshooting.md) document contains some +[Troubleshooting](../testing/Troubleshooting.md) document contains some guidance about issues that have been experienced in the past. Feel free to submit PRs to supplement the troubleshooting document! Searching the [ACA-Py GitHub issues](https://github.com/hyperledger/aries-cloudagent-python/issues) @@ -111,14 +111,14 @@ The initial implementation of ACA-Py was developed by the Government of British [BC Digital Trust]: https://digital.gov.bc.ca/digital-trust/ -See the [MAINTAINERS.md](./MAINTAINERS.md) file for a list of the current ACA-Py +See the [MAINTAINERS.md](../contributing/MAINTAINERS.md) file for a list of the current ACA-Py maintainers, and the guidelines for becoming a Maintainer. We'd love to have you join the team if you are willing and able to carry out the [duties of a -Maintainer](MAINTAINERS.md#the-duties-of-a-maintainer). +Maintainer](../contributing/MAINTAINERS.md#the-duties-of-a-maintainer). ## Contributing -Pull requests are welcome! Please read our [contributions guide](CONTRIBUTING.md) and submit your PRs. We enforce [developer certificate of origin](https://developercertificate.org/) (DCO) commit signing — [guidance](https://github.com/apps/dco) on this is available. We also welcome issues submitted about problems you encounter in using ACA-Py. +Pull requests are welcome! Please read our [contributions guide](../contributing/CONTRIBUTING.md) and submit your PRs. We enforce [developer certificate of origin](https://developercertificate.org/) (DCO) commit signing — [guidance](https://github.com/apps/dco) on this is available. We also welcome issues submitted about problems you encounter in using ACA-Py. ## License diff --git a/featuresDevReadMe.md b/featuresDevReadMe.md new file mode 100644 index 00000000..df6429b5 --- /dev/null +++ b/featuresDevReadMe.md @@ -0,0 +1,245 @@ +# Developer's Read Me for Hyperledger Aries Cloud Agent - Python + +See the [README](../release/acapy-README.md) for details about this repository and information about how the Aries Cloud Agent - Python fits into the Aries project and relates to Indy. + +## Table of Contents + +- [Introduction](#introduction) +- [Developer Demos](#developer-demos) +- [Running](#running) + - [Configuring ACA-PY: Command Line Parameters](#configuring-aca-py-command-line-parameters) + - [Docker](#docker) + - [Locally Installed](#locally-installed) + - [About ACA-Py Command Line Parameters](#about-aca-py-command-line-parameters) + - [Provisioning Secure Storage](#provisioning-secure-storage) + - [Mediation](#mediation) + - [Multi-tenancy](#multi-tenancy) + - [JSON-LD Credentials](#json-ld-credentials) +- [Developing](#developing) + - [Prerequisites](#prerequisites) + - [Running In A Dev Container](#running-in-a-dev-container) + - [Running Locally](#running-locally) + - [Logging](#logging) + - [Running Tests](#running-tests) + - [Running Aries Agent Test Harness Tests](#running-aries-agent-test-harness-tests) +- [Development Workflow](#development-workflow) +- [Publishing Releases](#publishing-releases) +- [Dynamic Injection of Services](#dynamic-injection-of-services) + +## Introduction + +Aries Cloud Agent Python (ACA-Py) is a configurable, extensible, non-mobile Aries agent that implements an easy way for developers to build decentralized identity services that use verifiable credentials. + +The information on this page assumes you are developer with a background in +decentralized identity, Aries, DID Methods, and verifiable credentials, +especially AnonCreds. If you aren't familiar with those concepts and projects, +please use our [Getting Started Guide](../gettingStarted/README.md) +to learn more. + +## Developer Demos + +To put ACA-Py through its paces at the command line, checkout our [demos](../demo/README.md) page. + +## Running + +### Configuring ACA-PY: Command Line Parameters + +ACA-Py agent instances are configured through the use of command line +parameters, environment variables and/or YAML files. All of the configurations +settings can be managed using any combination of the three methods (command line +parameters override environment variables override YAML). Use the `--help` +option to discover the available command line parameters. There are a lot of +them--for good and bad. + +### Docker + +To run a docker container based on the code in the current repo, use the following commands from the root folder of the repository to check the version, list the available modes of operation, and see all of the command line parameters: + +```bash +scripts/run_docker --version +scripts/run_docker --help +scripts/run_docker provision --help +scripts/run_docker start --help +``` + +### Locally Installed + +If you installed the PyPi package, the executable `aca-py` should be available on your PATH. + +Use the following commands from the root folder of the repository to check the version, list the available modes of operation, and see all of the command line parameters: + +```bash +aca-py --version +aca-py --help +aca-py provision --help +aca-py start --help +``` + +If you get an error about a missing module `indy` (e.g. `ModuleNotFoundError: No module named 'indy'`) when running `aca-py`, you will need to install the Indy libraries from the command line: + +```bash +pip install python3_indy +``` + +Once that completes successfully, you should be able to run `aca-py --version` and the other examples above. + +### About ACA-Py Command Line Parameters + +ACA-Py invocations are separated into two types - initially provisioning an agent (`provision`) and starting a new agent process (`start`). This separation enables not having to pass in some encryption-related parameters required for provisioning when starting an agent instance. This improves security in production deployments. + +When starting an agent instance, at least one _inbound_ and one _outbound_ transport MUST be specified. + +For example: + +```bash +aca-py start --inbound-transport http 0.0.0.0 8000 \ + --outbound-transport http +``` + +or + +```bash +aca-py start --inbound-transport http 0.0.0.0 8000 \ + --inbound-transport ws 0.0.0.0 8001 \ + --outbound-transport ws \ + --outbound-transport http +``` + +ACA-Py ships with both inbound and outbound transport drivers for `http` and `ws` (websockets). Additional transport drivers can be added as pluggable implementations. See the existing implementations in the [transports module](https://github.com/hyperledger/aries-cloudagent-python/tree/main/aries_cloudagent/transport) for getting started on adding a new transport. + +Most configuration parameters are provided to the agent at startup. Refer to the `Running` sections above for details on listing the available command line parameters. + +### Provisioning Secure Storage + +It is possible to provision a secure storage (sometimes called a wallet--but not +the same as a mobile wallet app) before running an agent to avoid passing in the +secure storage seed on every invocation of an agent (e.g. on every `aca-py start ...`). + +```bash +aca-py provision --wallet-type askar --seed $SEED +``` + +For additional `provision` options, execute `aca-py provision --help`. + +Additional information about secure storage options and configuration settings can be found [here](../deploying/Databases.md). + +### Mediation + +ACA-Py can also run in mediator mode - ACA-Py can be run _as_ a mediator (it can mediate connections for other agents), or it can connect to an external mediator to mediate its own connections. See the [docs on mediation](./Mediation.md) for more info. + +### Multi-tenancy + +ACA-Py can also be started in multi-tenant mode. This allows the agent to serve multiple tenants, that each have their own wallet. See the [docs on multi-tenancy](./Multitenancy.md) for more info. + +### JSON-LD Credentials + +ACA-Py can issue W3C Verifiable Credentials using Linked Data Proofs. See the [docs on JSON-LD Credentials](./JsonLdCredentials.md) for more info. + +## Developing + +### Prerequisites + +[Docker](https://www.docker.com) must be installed to run software locally and to run the test suite. + +### Running In A Dev Container + +The dev container environment is a great way to deploy agents quickly with code changes and an interactive debug session. Detailed information can be found in the [Docs On Devcontainers](./devcontainer.md). It is specific for vscode, so if you prefer another code editor or IDE you will need to figure it out on your own, but it is highly recommended to give this a try. + +One thing to be aware of is, unlike the demo, none of the steps are automated. You will need to create public dids, connections and all the other steps yourself. Using the demo and studying the flow and then copying them with your dev container debug session is a great way to learn how everything works. + +### Running Locally + +Another way to develop locally is by using the provided Docker scripts to run the ACA-Py software. + +```bash +./scripts/run_docker start +``` + +For example: + +```bash +./scripts/run_docker start --inbound-transport http 0.0.0.0 10000 --outbound-transport http --debug --log-level DEBUG +``` + +To enable the [ptvsd](https://github.com/Microsoft/ptvsd) Python debugger for Visual Studio/VSCode use the `--debug` command line parameter. + +Any ports you will be using from the docker container should be published using the `PORTS` environment variable. For example: + +```bash +PORTS="5000:5000 8000:8000 10000:10000" ./scripts/run_docker start --inbound-transport http 0.0.0.0 10000 --outbound-transport http --debug --log-level DEBUG +``` + +Refer to [the previous section](#running) for instructions on how to run ACA-Py. + +### Logging + +You can find more details about logging and log levels [here](../testing/Logging.md). + +### Running Tests + +To run the ACA-Py test suite, use the following script: + +```bash +./scripts/run_tests +``` + +To run the ACA-Py test suite with ptvsd debugger enabled: + +```bash +./scripts/run_tests --debug +``` + +To run specific tests pass parameters as defined by [pytest](https://docs.pytest.o../contributing/stable/usage.html#specifying-tests-selecting-tests): + +```bash +./scripts/run_tests aries_cloudagent/protocols/connections +``` + +To run the tests including [Indy SDK](https://github.com/hyperledger/indy-sdk) and related dependencies, run the script: + +```bash +./scripts/run_tests_indy +``` + +### Running Aries Agent Test Harness Tests + +You can run a full suite of integration tests using the [Aries Agent Test Harness (AATH)](https://github.com/hyperledger/aries-agent-test-harness). + +Check out and run AATH tests as follows (this tests the aca-py `main` branch): + +```bash +git clone https://github.com/hyperledger/aries-agent-test-harness.git +cd aries-agent-test-harness +./manage build -a acapy-main +./manage run -d acapy-main -t @AcceptanceTest -t ~@wip +``` + +The `manage` script is described in detail [here](https://github.com/hyperledger/aries-agent-test-harness#the-manage-bash-script), including how to modify the AATH code to run the tests against your aca-py repo/branch. + +## Development Workflow + +We use [Ruff](https://github.com/astral-sh/ruff) to enforce a coding style guide. + +We use [Black](https://black.readthedocs.../contributing/stable/) to automatically format code. + +Please write tests for the work that you submit. + +Tests should reside in a directory named `tests` alongside the code under test. Generally, there is one test file for each file module under test. Test files _must_ have a name starting with `test_` to be automatically picked up the test runner. + +There are some good examples of various test scenarios for you to work from including mocking external imports and working with async code so take a look around! + +The test suite also displays the current code coverage after each run so you can see how much of your work is covered by tests. Use your best judgement for how much coverage is sufficient. + +Please also refer to the [contributing guidelines](../contributing/CONTRIBUTING.md) and [code of conduct](../contributing/CODE_OF_CONDUCT.md). + +## Publishing Releases + +The [publishing](https://github.com/hyperledger/aries-cloudagent-python/blob/main/PUBLISHING.md) document provides information on tagging a release and publishing the release artifacts to PyPi. + +## Dynamic Injection of Services + +The Agent employs a dynamic injection system whereby providers of base classes are registered with the `RequestContext` instance, currently within `conductor.py`. Message handlers and services request an instance of the selected implementation using `context.inject(BaseClass)`; for instance the wallet instance may be injected using `wallet = context.inject(BaseWallet)`. The `inject` method normally throws an exception if no implementation of the base class is provided, but can be called with `required=False` for optional dependencies (in which case a value of `None` may be returned). + +Providers are registered with either `context.injector.bind_instance(BaseClass, instance)` for previously-constructed (singleton) object instances, or `context.injector.bind_provider(BaseClass, provider)` for dynamic providers. In some cases it may be desirable to write a custom provider which switches implementations based on configuration settings, such as the wallet provider. + +The `BaseProvider` classes in the `config.provider` module include `ClassProvider`, which can perform dynamic module inclusion when given the combined module and class name as a string (for instance `aries_cloudagent.wallet.indy.IndyWallet`). `ClassProvider` accepts additional positional and keyword arguments to be passed into the class constructor. Any of these arguments may be an instance of `ClassProvider.Inject(BaseClass)`, allowing dynamic injection of dependencies when the class instance is instantiated. diff --git a/mkdocs.yml b/mkdocs.yml index 0e5fd425..0a34eb80 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -106,6 +106,7 @@ nav: - Hyperledger Indy Endorser In Action: demo/Endorser.md - Using W3C JSON-LD Credentials: demo/AliceWantsAJsonCredential.md - DIY -- ACME Controller Workshop: demo/AcmeDemoWorkshop.md + - Aries Using Postman Demo: demo/AriesPostmanDemo.md - Getting Started: - Becoming an Indy/Aries Developer: gettingStarted/README.md - Hyperledger Indy Basics: gettingStarted/IndyBasics.md @@ -146,3 +147,4 @@ nav: - Hyperledger Code of Conduct: contributing/CODE_OF_CONDUCT.md - Security Vulnerability Reporting: contributing/SECURITY.md - Publishing an ACA-Py Release: contributing/PUBLISHING.md + - Updating the ACA-Py ReadTheDocs Site: UpdateRTD.md diff --git a/scripts/copyFixMDs.sh b/scripts/copyFixMDs.sh index 419a18a4..899e1f63 100755 --- a/scripts/copyFixMDs.sh +++ b/scripts/copyFixMDs.sh @@ -8,20 +8,20 @@ # - Passed in is the Release Versions -- "main" or "0.8.0", etc. # - Delete the existing content of the /docs folder in this repo # - Define the per release Mkdocs navigation for the site and put it in place of the current mkdocs YML +# - For main starting from 2024.02.11, this step is eliminated and edits to the navigation are done directly # - For each folder that will be in the /docs folder of this rep0: # - For each file the is to be in the folder within the /docs folder # - Either directly copy, or copy with edits applied the source file to the /docs folder # - Edits are needed to "fix" the links to work when the file is in the new place in the repo -# See the edits below for the types of changes needed. Usually, they are to change absolute -# links in the ACA-Py folder to relative links in this folder, as well as to handle changes -# in where the docs are placed. +# See the edits below for the types of changes needed. Most are to change relative links +# in the ACA-Py document to because one of the files has moved during the processing. # # To find broken links: -# - Run mkdocs locally and click on links and images that result in 404s +# - Most are found in the running `mkdocs build` +# - After that, run mkdocs locally and click on links and images that result in 404s # - Once you publish the docs, run a "broken link finder" tool to find others # To find missing documentation files -# - Scan the /tmp folder for all .md files and see if you have them in the /docs folder -# - a script to compare the list of .md files in /tmp and /docs is planned +# - Run the `./scripts/diffMDs.md` to find docs in the ACA-Py release that AREN'T in these docs. VERSION=$1 @@ -31,86 +31,13 @@ echo Building pages for ACA-Py Version ${VERSION} # Clean out the docs folder rm -rf docs/* -# Replace the nav with the one for main -# sed '/^nav:/,$d' mkdocs.yml >mkdocs.yml.tmp -# cat << EOF >>mkdocs.yml.tmp -# nav: -# - Welcome!: -# - Welcome: README.md -# - ACA-Py README: release/acapy-README.md -# - Release Notes: release/CHANGELOG.md -# - Features: -# - Developer Introduction: features/DevReadMe.md -# - DevContainer Support: features/devcontainer.md -# - Supported Aries Interop Profiles and RFCs: features/SupportedRFCs.md -# - The Admin API: features/AdminAPI.md -# - ACA-Py Plugins: features/PlugIns.md -# - Multitenant ACA-Py: features/Multitenancy.md -# - DID Methods: features/DIDMethods.md -# - DID Resolution: features/DIDResolution.md -# - Configuring Multiple Indy Ledgers: features/Multiledger.md -# - Automatically Endorsing Indy Transations: features/Endorser.md -# - Using W3C JSON-LD Signed Credentials: features/JsonLdCredentials.md -# - Using SD-JWTs: features/SelectiveDisclosureJWTs.md -# - AnonCreds Presentation Validation: features/AnoncredsProofValidation.md -# - Multiple Credential Types: features/Multicredentials.md -# - Code Generation with the Open API: features/UsingOpenAPI.md -# - ACA-Py as a DIDComm Mediator: features/Mediation.md -# - Demos: -# - The Alice-Faber Demo: demo/README.md -# - Open API Tutorial: demo/AriesOpenAPIDemo.md -# - Alice Gets a Phone: demo/AliceGetsAPhone.md -# - Hyperledger Indy Endorser In Action: demo/Endorser.md -# - Using W3C JSON-LD Credentials: demo/AliceWantsAJsonCredential.md -# - DIY -- ACME Controller Workshop: demo/AcmeDemoWorkshop.md -# - Getting Started: -# - Becoming an Indy/Aries Developer: gettingStarted/README.md -# - Hyperledger Indy Basics: gettingStarted/IndyBasics.md -# - Hyperledger Aries Basics: gettingStarted/AriesBasics.md -# - Decentralized Identity Demos: gettingStarted/DecentralizedIdentityDemos.md -# - Aries - The Big Picture: gettingStarted/AriesBigPicture.md -# - Aries Architecture: gettingStarted/AriesAgentArchitecture.md -# - Aries Messaging: gettingStarted/AriesMessaging.md -# - Aries Developer Demos: gettingStarted/AriesDeveloperDemos.md -# - Agent Connections: gettingStarted/AgentConnections.md -# - Issuing AnonCreds Credentials: gettingStarted/IssuingAnonCredsCredentials.md -# - Presenting AnonCreds Proofs: gettingStarted/PresentingAnonCredsProofs.md -# - Making Your Own ACA-Py Agent: gettingStarted/YourOwnAriesAgent.md -# - Aries Developer Options: gettingStarted/IndyAriesDevOptions.md -# - DIDComm Messaging: gettingStarted/DIDcommMsgs.md -# - DIDComm Message Routing: gettingStarted/RoutingEncryption.md -# - DIDComm Message Routing Example: gettingStarted/AriesRoutingExample.md -# - TODO Connecting to an Indy Network: gettingStarted/ConnectIndyNetwork.md -# - AnonCreds Credential Revocation: gettingStarted/CredentialRevocation.md -# - Deploying: -# - Deployment Model: deploying/deploymentModel.md -# - Upgrading ACA-Py: deploying/UpgradingACA-Py.md -# - Indy SDK to Askar Migration: deploying/IndySDKtoAskarMigration.md -# - The Use of Poetry in ACA-Py: deploying/Poetry.md -# - ACA-Py Container Images: deploying/ContainerImagesAndGithubActions.md -# - Databases: deploying/Databases.md -# - Persistent Queues and Caching: deploying/RedisPlugins.md -# - The askar-anoncreds Wallet Type: deploying/AnonCredsWalletType.md -# - Testing/Troubleshooting: -# - Running and Creating Unit Tests: testing/UnitTests.md -# - Managing Logging: testing/Logging.md -# - ACA-Py Integration Tests: testing/INTEGRATION-TESTS.md -# - Protocol Tracing: testing/AgentTracing.md -# - Troubleshooting: testing/Troubleshooting.md -# - Contributing: -# - How to Contribute: contributing/CONTRIBUTING.md -# - Maintainers: contributing/MAINTAINERS.md -# - Hyperledger Code of Conduct: contributing/CODE_OF_CONDUCT.md -# - Security Vulnerability Reporting: contributing/SECURITY.md -# - Publishing an ACA-Py Release: contributing/PUBLISHING.md -# EOF -# mv mkdocs.yml.tmp mkdocs.yml +# The mkdocs nav used to be built here. Now managed in the mkdocs.yml in the root # Root folder -- README.md # For debugging the "sed" command, you can uncomment the "diff" at the end of the -# sed command to see the differences from running the sed. +# sed command to see the differences from running the sed. Remember to put the back after! FOLDER=docs -# Introduction file is in this repo, not ACA-Py +# The Introduction file is in this repo, not ACA-Py so pull it in. if [ "${VERSION}" == "main" ]; then cp Introduction.md ${FOLDER}/README.md else @@ -119,164 +46,46 @@ else ${FILE} > ${FOLDER}/README.md; # diff tmp/${FILE} ${FOLDER}/${FILE} fi -# Release documents +# Release documents -- documents about this specific release +# Starts with the ACA-Py readme, and includes some other files from the root ACA-Py folder +# Fix up the links FOLDER=docs/release mkdir ${FOLDER} -FILE=README.md; cp tmp/${FILE} ${FOLDER}/acapy-${FILE} -# FILE=README.md; sed -e 's#\./\(SupportedRFCs\).md#../../features/\1#' \ -# -e 's#\./\(Multitenancy\).md#../../features/\1#' \ -# -e 's#\./\(Mediation\).md#../../features/\1#' \ -# -e 's#\(Endorser\).md#../../features/\1#' \ -# -e 's#\(Troubleshooting\).md#../../testing/\1#' \ -# -e 's#/demo/\(README\).md#../../demo/#' \ -# -e 's#/docs/GettingStartedAriesDev/\(README\).md#../../gettingStarted/\1#' \ -# -e 's#/docs/GettingStartedAriesDev/\(PlugIns\).md#../../features/\1/#' \ -# tmp/${FILE} > ${FOLDER}/acapy-${FILE}; # diff tmp/${FILE} ${FOLDER}/acapy-${FILE} +FILE=README.md; sed \ + -e 's#docs/\(.*/.*md\)#../\1#g' \ + -e 's#docs/\(.*/.*md\)#../\1#g' \ + -e 's#(./\(.*\)\.md#(../contributing/\1.md#g' \ + tmp/${FILE} > ${FOLDER}/acapy-${FILE}; # diff tmp/${FILE} ${FOLDER}/acapy-${FILE} cp tmp/aca-py_architecture.png ${FOLDER} -# Special handling for ChangeLog -- add a title at the top of the file -# echo "# Release Notes" >${FOLDER}/CHANGELOG.md cp tmp/CHANGELOG.md ${FOLDER} -# FILE=CHANGELOG.md; sed -e '1s/^/# Release Notes\n\n/' \ -# -e 's#\(Endorser\).md#../../features/\1#g' \ -# -e 's#./\(Mediation\).md#../../features/\1#g' \ -# -e 's#./\(Multitenancy\).md#../../features/\1#g' \ -# -e 's#\/\(SupportedRFCs\).md#../../features/\1#' \ -# -e 's#.\/\(UpgradingACA-Py\).md#../../deploying/\1#' \ -# -e 's#(victorlee0505)#(https://github.com/victorlee0505)#' \ -# -e 's#^ - # - #' \ -# tmp/${FILE} >${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} - -cp -r tmp/docs/assets tmp/docs/demo tmp/docs/deploying tmp/docs/design tmp/docs/gettingStarted tmp/docs/features tmp/docs/testing docs/ - -# Assets -# FOLDER=docs/assets -# mkdir ${FOLDER} -# cp tmp/docs/assets/*.png ${FOLDER} - -# ACA-Py Features -# FOLDER=docs/features -# mkdir ${FOLDER} -# FILE=DevReadMe.md; sed -e 's#(README.md)#(/README.md)#' \ -# -e "s#\(Databases\).md#../../deploying/\1#g" \ -# -e "s#\(Logging\).md#../../testing/\1/#g" \ -# -e "s#/docs/GettingStartedAriesDev/README.md#../../gettingStarted/#" \ -# -e "s#/\(CONTRIBUTING\).md#../../contributing/\1/#" \ -# -e "s#/\(CODE_OF_CONDUCT\).md#../../contributing/\1/#" \ -# -e "s/#Running/#running/g" \ -# -e "s#(/README.md)#(../../release/acapy-README)#" \ -# -e "s#/docs/GettingStartedAriesDev/\(AriesDeveloperDemos\).md#../../\1#" \ -# -e "s#\(aries_cloudagent/transport\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# FILE=devcontainer.md; sed -e "s#(\(.devcontainer/devcontainer.json\))#(https://github.com/hyperledger/aries-cloudagent-python/blob/main/\1)#" \ -# -e "s#(./\(aries_cloudagent\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/main/\1)#" \ -# -e "s#(/\(DevReadMe\).md)#(../\1)#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# FILE=SupportedRFCs.md; sed -e "s#./\(IndySDKtoAskarMigration\).md#../../deploying/\1/#g" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# FILE=AdminAPI.md; sed -e "s#/docs/assets/#../../assets/#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# cp tmp/Multitenancy.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/SelectiveDisclosureJWTs.md ${FOLDER} -# cp tmp/DIDMethods.md ${FOLDER} -# cp tmp/DIDResolution.md ${FOLDER} -# cp tmp/Multiledger.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/PlugIns.md ${FOLDER} -# cp tmp/Mediation.md ${FOLDER} -# FILE=Endorser.md; sed -e 's#\./docs/assets/endorse#../features/endorse#' \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# cp tmp/docs/assets/*.png ${FOLDER} -# cp tmp/JsonLdCredentials.md ${FOLDER} -# cp tmp/AnoncredsProofValidation.md ${FOLDER} -# FILE=UsingOpenAPI.md; sed -e 's#AdminApi.md#AdminAPI.md#' \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# cp tmp/Multicredentials.md ${FOLDER} - -# Deploying -# FOLDER=docs/deploying -# mkdir ${FOLDER} -# cp tmp/ContainerImagesAndGithubActions.md ${FOLDER} -# cp tmp/IndySDKtoAskarMigration.md ${FOLDER} -# cp tmp/UpgradingACA-Py.md ${FOLDER} -# cp tmp/docs/Poetry.md ${FOLDER} -# FILE=deploymentModel.md; sed -e "s#/docs/assets/#../../assets/#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# FILE=Databases.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# cp tmp/RedisPlugins.md ${FOLDER} -# cp tmp/AnonCredsWalletType.md ${FOLDER} - -# Demos -# FOLDER=docs/demo -# mkdir ${FOLDER} -# cp tmp/demo/AcmeDemoWorkshop.md ${FOLDER} -# cp tmp/demo/AliceWantsAJsonCredential.md ${FOLDER} -# FILE=AliceWantsAJsonCredential.md; sed -e "s#../\(JsonLdCredentials\).md#../../features/\1#" tmp/demo/${FILE} > ${FOLDER}/${FILE} -# FILE=README.md; sed -e "s#runners/#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/runners/#g" \ -# -e "s#:uhttps#https#" \ -# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -# cp tmp/demo/Endorser.md ${FOLDER} -# FILE=AliceGetsAPhone.md; sed -e 's#\./collateral#../../demo/collateral#g' \ -# -e "s#(/demo)#(../../demo)#" \ -# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -# FILE=AriesOpenAPIDemo.md; sed -e 's#\./collateral#../../demo/collateral#g' \ -# -e 's#\.\./\(AdminAPI\).md#../../features/\1#' \ -# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -# cp -r tmp/demo/collateral ${FOLDER} - -# Getting Started -# FOLDER=docs/gettingStarted -# mkdir ${FOLDER} -# FILE=README.md; sed -e 's#DIDCommMsgs.md#DIDcommMsgs.md#g' \ -# -e "s#PlugIns.md#../features/PlugIns/#g" \ -# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -# cp tmp/docs/GettingStartedAriesDev/IndyBasics.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/AriesBasics.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/DecentralizedIdentityDemos.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/AriesBigPicture.md ${FOLDER} -# FILE=AriesAgentArchitecture.md; sed -e 's#../\(deploymentModel\).md#../../deploying/\1#g' \ -# -e "s#/docs/assets/#../../assets/#" \ -# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -# cp tmp/docs/GettingStartedAriesDev/AriesMessaging.md ${FOLDER} -# FILE=/AriesDeveloperDemos.md; sed -e 's#../../demo#../../demo#g' \ -# -e "s#\(AriesOpenAPIDemo\).md#\1#" \ -# -e "s#demo/README.md#demo/#" \ -# tmp/docs/GettingStartedAriesDev/${FILE} > ${FOLDER}/${FILE}; # diff tmp/docs/GettingStartedAriesDev/${FILE} ${FOLDER}/${FILE} -# cp tmp/docs/GettingStartedAriesDev/AgentConnections.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/IssuingIndyCredentials.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/PresentingIndyProofs.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/YourOwnAriesAgent.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/IndyAriesDevOptions.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/DIDcommMsgs.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/RoutingEncryption.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/AriesRoutingExample.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/ConnectIndyNetwork.md ${FOLDER} -# cp tmp/docs/GettingStartedAriesDev/CredentialRevocation.md ${FOLDER} - -# Testing and Troubleshooting -# FOLDER=docs/testing -# mkdir ${FOLDER} -# cp tmp/UnitTests.md ${FOLDER} -# FILE=Logging.md ; sed -e "s#demo/demo-args.yaml#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/demo-args.yaml#" \ -# -e "s#(\(aries_cloudagent/config/default_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ -# -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.ini\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ -# -e "s#(\(aries_cloudagent/config/default_per_tenant_logging_config.yml\))#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/\1)#g" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} -# FILE=AgentTracing.md ; sed -e "s#./\(EFK-stack\)#https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/demo/\1#" \ -# tmp/demo/${FILE} > ${FOLDER}/${FILE}; # diff tmp/demo/${FILE} ${FOLDER}/${FILE} -# cp tmp/demo/INTEGRATION-TESTS.md ${FOLDER} -# FILE=Troubleshooting.md; sed -e "s#(demo)#(../../demo)#" \ -# tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} - -# Contributing +FILE=CHANGELOG.md; sed -e '1s/^/# Release Notes\n\n/' \ + -e 's#\(Endorser\).md#../features/\1#g' \ + -e 's#./\(Mediation\).md#../features/\1#g' \ + -e 's#./\(Multitenancy\).md#../features/\1#g' \ + -e 's#\/\(SupportedRFCs\).md#../features/\1#' \ + -e 's#.\/\(UpgradingACA-Py\).md#../deploying/\1#' \ + -e 's#(victorlee0505)#(https://github.com/victorlee0505)#' \ + -e 's#^ - # - #' \ + tmp/${FILE} >${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} + +# Direct copy of the all of the ACA-Py docs +cp -r tmp/docs/UpdateRTD.md tmp/docs/assets tmp/docs/demo tmp/docs/deploying tmp/docs/design tmp/docs/gettingStarted tmp/docs/features tmp/docs/testing docs/ + +# Fix the links to the files not in the root +FILE=DevReadMe.md; FOLDER=docs/features; sed \ + -e 's#\.\./\.\./README.md#../release/acapy-README.md#g' \ + -e 's#\.\./\.\./#../contributing/#g' \ + tmp/${FOLDER}/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FOLDER}/${FILE} ${FOLDER}/${FILE} + +# Contributing docs are all in the root, so they are easily found in the ACA-Py repo, so they need to be copied. FOLDER=docs/contributing mkdir ${FOLDER} cp tmp/CONTRIBUTING.md ${FOLDER} cp tmp/MAINTAINERS.md ${FOLDER} cp tmp/CODE_OF_CONDUCT.md ${FOLDER} cp tmp/SECURITY.md ${FOLDER} -FILE=PUBLISHING.md; sed -e "s#(aries_cloudagent/#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/#" \ - -e "s#(open-api/#(https://github.com/hyperledger/open-api/tree/${VERSION}/#" \ - -e "s#(pyproject.toml)#(https://github.com/hyperledger/aries-cloudagent-python/tree/${VERSION}/pyproject.toml)#" \ +FILE=PUBLISHING.md; sed \ + -e 's#docs/\(.*/.*md\)#../\1#g' \ tmp/${FILE} > ${FOLDER}/${FILE}; # diff tmp/${FILE} ${FOLDER}/${FILE} # Update all references to "main" to "${VERSION}" in Github pathes @@ -285,4 +94,4 @@ for i in $(find docs -name "*.md"); do sed "s#/tree/main/#/tree/${VERSION}/#" $i >$i.tmp sed "s#/blob/main/#/blob/${VERSION}/#" $i.tmp >$i rm $i.tmp -done \ No newline at end of file +done