From 2b24afad075894dd1727d057f87e2be24238016f Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Fri, 14 Oct 2022 17:47:29 -0400 Subject: [PATCH] Merge pull request from GHSA-3qp7-gj37-g9rx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * dragonberry 🐉 🍓 Co-authored-by: Ethan Buchman Co-authored-by: Marko Baricevic Co-authored-by: Roman Co-authored-by: Ethan Buchman Co-authored-by: Marko Baricevic Co-authored-by: Roman Co-authored-by: Dev Ojha Co-authored-by: Julien Robert Co-authored-by: Marko Baricevic Co-authored-by: Roman Co-authored-by: Dev Ojha --- CHANGELOG.md | 2071 ++++---- RELEASE_NOTES.md | 21 +- baseapp/abci.go | 78 +- baseapp/abci_test.go | 80 +- baseapp/baseapp.go | 130 +- baseapp/baseapp_test.go | 585 --- baseapp/block_gas_test.go | 297 ++ baseapp/deliver_tx_test.go | 276 + baseapp/msg_service_router.go | 19 +- baseapp/options.go | 8 +- baseapp/p2p.go | 67 + baseapp/queryrouter.go | 17 +- baseapp/test_helpers.go | 4 + baseapp/testutil/buf.gen.yaml | 5 + baseapp/testutil/buf.lock | 17 + baseapp/testutil/buf.yaml | 4 + baseapp/testutil/messages.go | 65 + baseapp/testutil/messages.pb.go | 1293 +++++ baseapp/testutil/messages.proto | 39 + contrib/images/simd-env/Dockerfile | 2 +- docs/core/proto-docs.md | 3 + go.mod | 14 +- go.sum | 177 +- ics23/go/.gitignore | 1 + ics23/go/Makefile | 20 + ics23/go/compress.go | 157 + ics23/go/go.mod | 10 + ics23/go/go.sum | 28 + ics23/go/ics23.go | 174 + ics23/go/ops.go | 249 + ics23/go/proof.go | 452 ++ ics23/go/proofs.pb.go | 4552 +++++++++++++++++ proto/cosmos/bank/v1beta1/query.proto | 10 +- .../base/tendermint/v1beta1/query.proto | 16 +- proto/cosmos/gov/v1beta1/gov.proto | 2 +- proto/cosmos/staking/v1beta1/tx.proto | 15 +- x/bank/types/query.pb.go | 106 +- x/staking/types/staking.pb.go | 1220 ++--- x/staking/types/tx.pb.go | 236 +- 39 files changed, 10003 insertions(+), 2517 deletions(-) create mode 100644 baseapp/block_gas_test.go create mode 100644 baseapp/deliver_tx_test.go create mode 100644 baseapp/p2p.go create mode 100644 baseapp/testutil/buf.gen.yaml create mode 100644 baseapp/testutil/buf.lock create mode 100644 baseapp/testutil/buf.yaml create mode 100644 baseapp/testutil/messages.go create mode 100644 baseapp/testutil/messages.pb.go create mode 100644 baseapp/testutil/messages.proto create mode 100644 ics23/go/.gitignore create mode 100644 ics23/go/Makefile create mode 100644 ics23/go/compress.go create mode 100644 ics23/go/go.mod create mode 100644 ics23/go/go.sum create mode 100644 ics23/go/ics23.go create mode 100644 ics23/go/ops.go create mode 100644 ics23/go/proof.go create mode 100644 ics23/go/proofs.pb.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 58444678d037..48adc9f4bfef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,20 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] +## v0.44.5-patch - 2021-10-14 + +ATTENTION: + +This is a security release for the [Dragonberry security advisory](https://forum.cosmos.network/t/ibc-security-advisory-dragonberry/7702). + +All users should upgrade immediately. + +Users *must* add a replace directive in their go.mod for the new `ics23` package in the SDK: + +```go +replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go +``` + ## [v0.44.5](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.44.5) - 2021-12-02 ### Improvements @@ -153,18 +167,17 @@ Security Release. No breaking changes related to 0.44.x. * (crypto/ed25519) [\#8690] Adopt zip1215 ed2559 verification rules. * [\#8849](https://github.com/cosmos/cosmos-sdk/pull/8849) Upgrade module no longer supports time based upgrades. * [\#7477](https://github.com/cosmos/cosmos-sdk/pull/7477) Changed Bech32 Public Key serialization in the client facing functionality (CLI, MsgServer, QueryServer): - * updated the keyring display structure (it uses protobuf JSON serialization) - the output is more verbose. - * Renamed `MarshalAny` and `UnmarshalAny` to `MarshalInterface` and `UnmarshalInterface` respectively. These functions must take an interface as parameter (not a concrete type nor `Any` object). Underneath they use `Any` wrapping for correct protobuf serialization. - * CLI: removed `--text` flag from `show-node-id` command; the text format for public keys is not used any more - instead we use ProtoJSON. + * updated the keyring display structure (it uses protobuf JSON serialization) - the output is more verbose. + * Renamed `MarshalAny` and `UnmarshalAny` to `MarshalInterface` and `UnmarshalInterface` respectively. These functions must take an interface as parameter (not a concrete type nor `Any` object). Underneath they use `Any` wrapping for correct protobuf serialization. + * CLI: removed `--text` flag from `show-node-id` command; the text format for public keys is not used any more - instead we use ProtoJSON. * (store) [\#8790](https://github.com/cosmos/cosmos-sdk/pull/8790) Reduce gas costs by 10x for transient store operations. * [\#9139](https://github.com/cosmos/cosmos-sdk/pull/9139) Querying events: - * via `ServiceMsg` TypeURLs (e.g. `message.action='/cosmos.bank.v1beta1.Msg/Send'`) does not work anymore, - * via legacy `msg.Type()` (e.g. `message.action='send'`) is being deprecated, new `Msg`s won't emit these events. - * Please use concrete `Msg` TypeURLs instead (e.g. `message.action='/cosmos.bank.v1beta1.MsgSend'`). + * via `ServiceMsg` TypeURLs (e.g. `message.action='/cosmos.bank.v1beta1.Msg/Send'`) does not work anymore, + * via legacy `msg.Type()` (e.g. `message.action='send'`) is being deprecated, new `Msg`s won't emit these events. + * Please use concrete `Msg` TypeURLs instead (e.g. `message.action='/cosmos.bank.v1beta1.MsgSend'`). * [\#9859](https://github.com/cosmos/cosmos-sdk/pull/9859) The `default` pruning strategy now keeps the last 362880 blocks instead of 100. 362880 equates to roughly enough blocks to cover the entire unbonding period assuming a 21 day unbonding period and 5s block time. * [\#9785](https://github.com/cosmos/cosmos-sdk/issues/9785) Missing coin denomination in logs - ### API Breaking Changes * (keyring) [#\8662](https://github.com/cosmos/cosmos-sdk/pull/8662) `NewMnemonic` now receives an additional `passphrase` argument to secure the key generated by the bip39 mnemonic. @@ -183,11 +196,11 @@ Security Release. No breaking changes related to 0.44.x. * (baseapp) [\7487](https://github.com/cosmos/cosmos-sdk/pull/8897) BaseApp's fields appVersion and version were swapped to match Tendermint's fields. * [\#8682](https://github.com/cosmos/cosmos-sdk/pull/8682) `ante.NewAnteHandler` updated to receive all positional params as `ante.HandlerOptions` struct. If required fields aren't set, throws error accordingly. * (x/staking/types) [\#7447](https://github.com/cosmos/cosmos-sdk/issues/7447) Remove bech32 PubKey support: - * `ValidatorI` interface update: `GetConsPubKey` renamed to `TmConsPubKey` (this is to clarify the return type: consensus public key must be a tendermint key); `TmConsPubKey`, `GetConsAddr` methods return error. - * `Validator` updated according to the `ValidatorI` changes described above. - * `ToTmValidator` function: added `error` to return values. - * `Validator.ConsensusPubkey` type changed from `string` to `codectypes.Any`. - * `MsgCreateValidator.Pubkey` type changed from `string` to `codectypes.Any`. + * `ValidatorI` interface update: `GetConsPubKey` renamed to `TmConsPubKey` (this is to clarify the return type: consensus public key must be a tendermint key); `TmConsPubKey`, `GetConsAddr` methods return error. + * `Validator` updated according to the `ValidatorI` changes described above. + * `ToTmValidator` function: added `error` to return values. + * `Validator.ConsensusPubkey` type changed from `string` to `codectypes.Any`. + * `MsgCreateValidator.Pubkey` type changed from `string` to `codectypes.Any`. * (client) [\#8926](https://github.com/cosmos/cosmos-sdk/pull/8926) `client/tx.PrepareFactory` has been converted to a private function, as it's only used internally. * (auth/tx) [\#8926](https://github.com/cosmos/cosmos-sdk/pull/8926) The `ProtoTxProvider` interface used as a workaround for transaction simulation has been removed. * (x/bank) [\#8798](https://github.com/cosmos/cosmos-sdk/pull/8798) `GetTotalSupply` is removed in favour of `GetPaginatedTotalSupply` @@ -195,23 +208,21 @@ Security Release. No breaking changes related to 0.44.x. * (x/bank/types) [\#9061](https://github.com/cosmos/cosmos-sdk/pull/9061) `AddressFromBalancesStore` now returns an error for invalid key instead of panic. * (x/auth) [\#9144](https://github.com/cosmos/cosmos-sdk/pull/9144) The `NewTxTimeoutHeightDecorator` antehandler has been converted from a struct to a function. * (codec) [\#9226](https://github.com/cosmos/cosmos-sdk/pull/9226) Rename codec interfaces and methods, to follow a general Go interfaces: - * `codec.Marshaler` → `codec.Codec` (this defines objects which serialize other objects) - * `codec.BinaryMarshaler` → `codec.BinaryCodec` - * `codec.JSONMarshaler` → `codec.JSONCodec` - * Removed `BinaryBare` suffix from `BinaryCodec` methods (`MarshalBinaryBare`, `UnmarshalBinaryBare`, ...) - * Removed `Binary` infix from `BinaryCodec` methods (`MarshalBinaryLengthPrefixed`, `UnmarshalBinaryLengthPrefixed`, ...) + * `codec.Marshaler` → `codec.Codec` (this defines objects which serialize other objects) + * `codec.BinaryMarshaler` → `codec.BinaryCodec` + * `codec.JSONMarshaler` → `codec.JSONCodec` + * Removed `BinaryBare` suffix from `BinaryCodec` methods (`MarshalBinaryBare`, `UnmarshalBinaryBare`, ...) + * Removed `Binary` infix from `BinaryCodec` methods (`MarshalBinaryLengthPrefixed`, `UnmarshalBinaryLengthPrefixed`, ...) * [\#9139](https://github.com/cosmos/cosmos-sdk/pull/9139) `ServiceMsg` TypeURLs (e.g. `/cosmos.bank.v1beta1.Msg/Send`) have been removed, as they don't comply to the Probobuf `Any` spec. Please use `Msg` type TypeURLs (e.g. `/cosmos.bank.v1beta1.MsgSend`). This has multiple consequences: - * The `sdk.ServiceMsg` struct has been removed. - * `sdk.Msg` now only contains `ValidateBasic` and `GetSigners` methods. The remaining methods `GetSignBytes`, `Route` and `Type` are moved to `legacytx.LegacyMsg`. - * The `RegisterCustomTypeURL` function and the `cosmos.base.v1beta1.ServiceMsg` interface have been removed from the interface registry. + * The `sdk.ServiceMsg` struct has been removed. + * `sdk.Msg` now only contains `ValidateBasic` and `GetSigners` methods. The remaining methods `GetSignBytes`, `Route` and `Type` are moved to `legacytx.LegacyMsg`. + * The `RegisterCustomTypeURL` function and the `cosmos.base.v1beta1.ServiceMsg` interface have been removed from the interface registry. * (codec) [\#9251](https://github.com/cosmos/cosmos-sdk/pull/9251) Rename `clientCtx.JSONMarshaler` to `clientCtx.JSONCodec` as per #9226. * (x/bank) [\#9271](https://github.com/cosmos/cosmos-sdk/pull/9271) SendEnabledCoin(s) renamed to IsSendEnabledCoin(s) to better reflect its functionality. * (x/bank) [\#9550](https://github.com/cosmos/cosmos-sdk/pull/9550) `server.InterceptConfigsPreRunHandler` now takes 2 additional arguments: customAppConfigTemplate and customAppConfig. If you don't need to customize these, simply put `""` and `nil`. * [\#8245](https://github.com/cosmos/cosmos-sdk/pull/8245) Removed `simapp.MakeCodecs` and use `simapp.MakeTestEncodingConfig` instead. * (x/capability) [\#9836](https://github.com/cosmos/cosmos-sdk/pull/9836) Removed `InitializeAndSeal(ctx sdk.Context)` and replaced with `Seal()`. App must add x/capability module to the begin blockers which will assure that the x/capability keeper is properly initialized. The x/capability begin blocker must be run before any other module which uses x/capability. - - ### State Machine Breaking * (x/{bank,distrib,gov,slashing,staking}) [\#8363](https://github.com/cosmos/cosmos-sdk/issues/8363) Store keys have been modified to allow for variable-length addresses. @@ -221,7 +232,6 @@ Security Release. No breaking changes related to 0.44.x. * (x/bank) [\#8517](https://github.com/cosmos/cosmos-sdk/pull/8517) Supply is now stored and tracked as `sdk.Coins` * (x/bank) [\#9051](https://github.com/cosmos/cosmos-sdk/pull/9051) Supply value is stored as `sdk.Int` rather than `string`. - ### CLI Breaking Changes * [\#8880](https://github.com/cosmos/cosmos-sdk/pull/8880) The CLI `simd migrate v0.40 ...` command has been renamed to `simd migrate v0.42`. @@ -261,7 +271,6 @@ Security Release. No breaking changes related to 0.44.x. * [\#8460](https://github.com/cosmos/cosmos-sdk/pull/8460) Ensure b.ReportAllocs() in all the benchmarks * [\#8461](https://github.com/cosmos/cosmos-sdk/pull/8461) Fix upgrade tx commands not showing up in CLI - ### Bug Fixes * (x/gov) [\#8813](https://github.com/cosmos/cosmos-sdk/pull/8813) fix `GET /cosmos/gov/v1beta1/proposals/{proposal_id}/deposits` to include initial deposit @@ -293,7 +302,6 @@ Security Release. No breaking changes related to 0.44.x. * (server) [#9704](https://github.com/cosmos/cosmos-sdk/pull/9704) Start GRPCWebServer in goroutine, avoid blocking other services from starting. * (bank) [\#9687](https://github.com/cosmos/cosmos-sdk/issues/9687) fixes [\#9159](https://github.com/cosmos/cosmos-sdk/issues/9159). Added migration to prune balances with zero coins. - ### Deprecated * (grpc) [\#8926](https://github.com/cosmos/cosmos-sdk/pull/8926) The `tx` field in `SimulateRequest` has been deprecated, prefer to pass `tx_bytes` instead. @@ -445,8 +453,6 @@ he Cosmos Hub) should not use this release or any release in the v0.41.x series. * (x/ibc) [\#8266](https://github.com/cosmos/cosmos-sdk/issues/8266) Add amino JSON support for IBC MsgTransfer in order to support Ledger text signing transfer transactions. * (x/ibc) [\#8404](https://github.com/cosmos/cosmos-sdk/pull/8404) Reorder IBC `ChanOpenAck` and `ChanOpenConfirm` handler execution to perform core handler first, followed by application callbacks. - - ### Bug Fixes * (simapp) [\#8418](https://github.com/cosmos/cosmos-sdk/pull/8418) Add balance coin to supply when adding a new genesis account @@ -471,7 +477,6 @@ he Cosmos Hub) should not use this release or any release in the v0.41.x series. * (x/ibc) [\#8359](https://github.com/cosmos/cosmos-sdk/pull/8359) Add missing UnpackInterfaces functions to IBC Query Responses. Fixes 'cannot unpack Any' error for IBC types. * (x/bank) [\#8317](https://github.com/cosmos/cosmos-sdk/pull/8317) Fix panic when querying for a not found client denomination metadata. - ## [v0.40.0](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.40.0) - 2021-01-08 v0.40.0, known as the Stargate release of the Cosmos SDK, is one of the largest releases @@ -480,380 +485,379 @@ sure you are aware of any relevant breaking changes. ### Client Breaking Changes -* __CLI__ - * (client/keys) [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) remove `keys update` command. - * (x/auth) [\#5844](https://github.com/cosmos/cosmos-sdk/pull/5844) `tx sign` command now returns an error when signing is attempted with offline/multisig keys. - * (x/auth) [\#6108](https://github.com/cosmos/cosmos-sdk/pull/6108) `tx sign` command's `--validate-signatures` flag is migrated into a `tx validate-signatures` standalone command. - * (x/auth) [#7788](https://github.com/cosmos/cosmos-sdk/pull/7788) Remove `tx auth` subcommands, all auth subcommands exist as `tx ` - * (x/genutil) [\#6651](https://github.com/cosmos/cosmos-sdk/pull/6651) The `gentx` command has been improved. No longer are `--from` and `--name` flags required. Instead, a single argument, `name`, is required which refers to the key pair in the Keyring. In addition, an optional +* **CLI** + * (client/keys) [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) remove `keys update` command. + * (x/auth) [\#5844](https://github.com/cosmos/cosmos-sdk/pull/5844) `tx sign` command now returns an error when signing is attempted with offline/multisig keys. + * (x/auth) [\#6108](https://github.com/cosmos/cosmos-sdk/pull/6108) `tx sign` command's `--validate-signatures` flag is migrated into a `tx validate-signatures` standalone command. + * (x/auth) [#7788](https://github.com/cosmos/cosmos-sdk/pull/7788) Remove `tx auth` subcommands, all auth subcommands exist as `tx ` + * (x/genutil) [\#6651](https://github.com/cosmos/cosmos-sdk/pull/6651) The `gentx` command has been improved. No longer are `--from` and `--name` flags required. Instead, a single argument, `name`, is required which refers to the key pair in the Keyring. In addition, an optional `--moniker` flag can be provided to override the moniker found in `config.toml`. - * (x/upgrade) [#7697](https://github.com/cosmos/cosmos-sdk/pull/7697) Rename flag name "--time" to "--upgrade-time", "--info" to "--upgrade-info", to keep it consistent with help message. -* __REST / Queriers__ - * (api) [\#6426](https://github.com/cosmos/cosmos-sdk/pull/6426) The ability to start an out-of-process API REST server has now been removed. Instead, the API server is now started in-process along with the application and Tendermint. Configuration options have been added to `app.toml` to enable/disable the API server along with additional HTTP server options. - * (client) [\#7246](https://github.com/cosmos/cosmos-sdk/pull/7246) The rest server endpoint `/swagger-ui/` is replaced by `/swagger/`, and contains swagger documentation for gRPC Gateway routes in addition to legacy REST routes. Swagger API is exposed only if set in `app.toml`. - * (x/auth) [\#5702](https://github.com/cosmos/cosmos-sdk/pull/5702) The `x/auth` querier route has changed from `"acc"` to `"auth"`. - * (x/bank) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) The `/bank/balances/{address}` endpoint now returns all account balances or a single balance by denom when the `denom` query parameter is present. - * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove CLI and REST handlers for querying `x/evidence` parameters. - * (x/gov) [#6295](https://github.com/cosmos/cosmos-sdk/pull/6295) Fix typo in querying governance params. -* __General__ - * (baseapp) [\#6384](https://github.com/cosmos/cosmos-sdk/pull/6384) The `Result.Data` is now a Protocol Buffer encoded binary blob of type `TxData`. The `TxData` contains `Data` which contains a list of Protocol Buffer encoded message data and the corresponding message type. - * (client) [\#5783](https://github.com/cosmos/cosmos-sdk/issues/5783) Unify all coins representations on JSON client requests for governance proposals. - * (crypto) [\#7419](https://github.com/cosmos/cosmos-sdk/pull/7419) The SDK doesn't use Tendermint's `crypto.PubKey` + * (x/upgrade) [#7697](https://github.com/cosmos/cosmos-sdk/pull/7697) Rename flag name "--time" to "--upgrade-time", "--info" to "--upgrade-info", to keep it consistent with help message. +* **REST / Queriers** + * (api) [\#6426](https://github.com/cosmos/cosmos-sdk/pull/6426) The ability to start an out-of-process API REST server has now been removed. Instead, the API server is now started in-process along with the application and Tendermint. Configuration options have been added to `app.toml` to enable/disable the API server along with additional HTTP server options. + * (client) [\#7246](https://github.com/cosmos/cosmos-sdk/pull/7246) The rest server endpoint `/swagger-ui/` is replaced by `/swagger/`, and contains swagger documentation for gRPC Gateway routes in addition to legacy REST routes. Swagger API is exposed only if set in `app.toml`. + * (x/auth) [\#5702](https://github.com/cosmos/cosmos-sdk/pull/5702) The `x/auth` querier route has changed from `"acc"` to `"auth"`. + * (x/bank) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) The `/bank/balances/{address}` endpoint now returns all account balances or a single balance by denom when the `denom` query parameter is present. + * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove CLI and REST handlers for querying `x/evidence` parameters. + * (x/gov) [#6295](https://github.com/cosmos/cosmos-sdk/pull/6295) Fix typo in querying governance params. +* **General** + * (baseapp) [\#6384](https://github.com/cosmos/cosmos-sdk/pull/6384) The `Result.Data` is now a Protocol Buffer encoded binary blob of type `TxData`. The `TxData` contains `Data` which contains a list of Protocol Buffer encoded message data and the corresponding message type. + * (client) [\#5783](https://github.com/cosmos/cosmos-sdk/issues/5783) Unify all coins representations on JSON client requests for governance proposals. + * (crypto) [\#7419](https://github.com/cosmos/cosmos-sdk/pull/7419) The SDK doesn't use Tendermint's `crypto.PubKey` interface anymore, and uses instead it's own `PubKey` interface, defined in `crypto/types`. Replace all instances of `crypto.PubKey` by `cryptotypes.Pubkey`. - * (store/rootmulti) [\#6390](https://github.com/cosmos/cosmos-sdk/pull/6390) Proofs of empty stores are no longer supported. - * (store/types) [\#5730](https://github.com/cosmos/cosmos-sdk/pull/5730) store.types.Cp() is removed in favour of types.CopyBytes(). - * (x/auth) [\#6054](https://github.com/cosmos/cosmos-sdk/pull/6054) Remove custom JSON marshaling for base accounts as multsigs cannot be bech32 decoded. - * (x/auth/vesting) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) Custom JSON marshaling of vesting accounts was removed. Vesting accounts are now marshaled using their default proto or amino JSON representation. - * (x/bank) [\#5785](https://github.com/cosmos/cosmos-sdk/issues/5785) In x/bank errors, JSON strings coerced to valid UTF-8 bytes at JSON marshalling time + * (store/rootmulti) [\#6390](https://github.com/cosmos/cosmos-sdk/pull/6390) Proofs of empty stores are no longer supported. + * (store/types) [\#5730](https://github.com/cosmos/cosmos-sdk/pull/5730) store.types.Cp() is removed in favour of types.CopyBytes(). + * (x/auth) [\#6054](https://github.com/cosmos/cosmos-sdk/pull/6054) Remove custom JSON marshaling for base accounts as multsigs cannot be bech32 decoded. + * (x/auth/vesting) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) Custom JSON marshaling of vesting accounts was removed. Vesting accounts are now marshaled using their default proto or amino JSON representation. + * (x/bank) [\#5785](https://github.com/cosmos/cosmos-sdk/issues/5785) In x/bank errors, JSON strings coerced to valid UTF-8 bytes at JSON marshalling time are now replaced by human-readable expressions. This change can potentially break compatibility with all those client side tools that parse log messages. - * (x/evidence) [\#7538](https://github.com/cosmos/cosmos-sdk/pull/7538) The ABCI's `Result.Data` field for + * (x/evidence) [\#7538](https://github.com/cosmos/cosmos-sdk/pull/7538) The ABCI's `Result.Data` field for `MsgSubmitEvidence` responses does not contain the raw evidence's hash, but the protobuf encoded `MsgSubmitEvidenceResponse` struct. - * (x/gov) [\#7533](https://github.com/cosmos/cosmos-sdk/pull/7533) The ABCI's `Result.Data` field for + * (x/gov) [\#7533](https://github.com/cosmos/cosmos-sdk/pull/7533) The ABCI's `Result.Data` field for `MsgSubmitProposal` responses does not contain a raw binary encoding of the `proposalID`, but the protobuf encoded `MsgSubmitSubmitProposalResponse` struct. - * (x/gov) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) `ProposalStatus` and `VoteOption` are now JSON serialized using its protobuf name, so expect names like `PROPOSAL_STATUS_DEPOSIT_PERIOD` as opposed to `DepositPeriod`. - * (x/staking) [\#7499](https://github.com/cosmos/cosmos-sdk/pull/7499) `BondStatus` is now a protobuf `enum` instead + * (x/gov) [\#6859](https://github.com/cosmos/cosmos-sdk/pull/6859) `ProposalStatus` and `VoteOption` are now JSON serialized using its protobuf name, so expect names like `PROPOSAL_STATUS_DEPOSIT_PERIOD` as opposed to `DepositPeriod`. + * (x/staking) [\#7499](https://github.com/cosmos/cosmos-sdk/pull/7499) `BondStatus` is now a protobuf `enum` instead of an `int32`, and JSON serialized using its protobuf name, so expect names like `BOND_STATUS_UNBONDING` as opposed to `Unbonding`. - * (x/staking) [\#7556](https://github.com/cosmos/cosmos-sdk/pull/7556) The ABCI's `Result.Data` field for + * (x/staking) [\#7556](https://github.com/cosmos/cosmos-sdk/pull/7556) The ABCI's `Result.Data` field for `MsgBeginRedelegate` and `MsgUndelegate` responses does not contain custom binary marshaled `completionTime`, but the protobuf encoded `MsgBeginRedelegateResponse` and `MsgUndelegateResponse` structs respectively ### API Breaking Changes -* __Baseapp / Client__ - * (AppModule) [\#7518](https://github.com/cosmos/cosmos-sdk/pull/7518) [\#7584](https://github.com/cosmos/cosmos-sdk/pull/7584) Rename `AppModule.RegisterQueryServices` to `AppModule.RegisterServices`, as this method now registers multiple services (the gRPC query service and the protobuf Msg service). A `Configurator` struct is used to hold the different services. - * (baseapp) [\#5865](https://github.com/cosmos/cosmos-sdk/pull/5865) The `SimulationResponse` returned from tx simulation is now JSON encoded instead of Amino binary. - * (client) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `CLIContext` is renamed to `Context`. `Context` and all related methods have been moved from package context to client. - * (client) [\#6525](https://github.com/cosmos/cosmos-sdk/pull/6525) Removed support for `indent` in JSON responses. Clients should consider piping to an external tool such as `jq`. - * (client) [\#8107](https://github.com/cosmos/cosmos-sdk/pull/8107) Renamed `PrintOutput` and `PrintOutputLegacy` +* **Baseapp / Client** + * (AppModule) [\#7518](https://github.com/cosmos/cosmos-sdk/pull/7518) [\#7584](https://github.com/cosmos/cosmos-sdk/pull/7584) Rename `AppModule.RegisterQueryServices` to `AppModule.RegisterServices`, as this method now registers multiple services (the gRPC query service and the protobuf Msg service). A `Configurator` struct is used to hold the different services. + * (baseapp) [\#5865](https://github.com/cosmos/cosmos-sdk/pull/5865) The `SimulationResponse` returned from tx simulation is now JSON encoded instead of Amino binary. + * (client) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `CLIContext` is renamed to `Context`. `Context` and all related methods have been moved from package context to client. + * (client) [\#6525](https://github.com/cosmos/cosmos-sdk/pull/6525) Removed support for `indent` in JSON responses. Clients should consider piping to an external tool such as `jq`. + * (client) [\#8107](https://github.com/cosmos/cosmos-sdk/pull/8107) Renamed `PrintOutput` and `PrintOutputLegacy` methods of the `context.Client` object to `PrintProto` and `PrintObjectLegacy`. - * (client/flags) [\#6632](https://github.com/cosmos/cosmos-sdk/pull/6632) Remove NewCompletionCmd(), the function is now available in tendermint. - * (client/input) [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) Removal of unnecessary `GetCheckPassword`, `PrintPrefixed` functions. - * (client/keys) [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) Rename `NewKeyBaseFromDir()` -> `NewLegacyKeyBaseFromDir()`. - * (client/keys) [\#5820](https://github.com/cosmos/cosmos-sdk/pull/5820/) Removed method CloseDB from Keybase interface. - * (client/rpc) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `client` package and subdirs reorganization. - * (client/lcd) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `CliCtx` of struct `RestServer` in package client/lcd has been renamed to `ClientCtx`. - * (codec) [\#6330](https://github.com/cosmos/cosmos-sdk/pull/6330) `codec.RegisterCrypto` has been moved to the `crypto/codec` package and the global `codec.Cdc` Amino instance has been deprecated and moved to the `codec/legacy_global` package. - * (codec) [\#8080](https://github.com/cosmos/cosmos-sdk/pull/8080) Updated the `codec.Marshaler` interface - * Moved `MarshalAny` and `UnmarshalAny` helper functions to `codec.Marshaler` and renamed to `MarshalInterface` and + * (client/flags) [\#6632](https://github.com/cosmos/cosmos-sdk/pull/6632) Remove NewCompletionCmd(), the function is now available in tendermint. + * (client/input) [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) Removal of unnecessary `GetCheckPassword`, `PrintPrefixed` functions. + * (client/keys) [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) Rename `NewKeyBaseFromDir()` -> `NewLegacyKeyBaseFromDir()`. + * (client/keys) [\#5820](https://github.com/cosmos/cosmos-sdk/pull/5820/) Removed method CloseDB from Keybase interface. + * (client/rpc) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `client` package and subdirs reorganization. + * (client/lcd) [\#6290](https://github.com/cosmos/cosmos-sdk/pull/6290) `CliCtx` of struct `RestServer` in package client/lcd has been renamed to `ClientCtx`. + * (codec) [\#6330](https://github.com/cosmos/cosmos-sdk/pull/6330) `codec.RegisterCrypto` has been moved to the `crypto/codec` package and the global `codec.Cdc` Amino instance has been deprecated and moved to the `codec/legacy_global` package. + * (codec) [\#8080](https://github.com/cosmos/cosmos-sdk/pull/8080) Updated the `codec.Marshaler` interface + * Moved `MarshalAny` and `UnmarshalAny` helper functions to `codec.Marshaler` and renamed to `MarshalInterface` and `UnmarshalInterface` respectively. These functions must take interface as a parameter (not a concrete type nor `Any` object). Underneath they use `Any` wrapping for correct protobuf serialization. - * (crypto) [\#6780](https://github.com/cosmos/cosmos-sdk/issues/6780) Move ledger code to its own package. - * (crypto/types/multisig) [\#6373](https://github.com/cosmos/cosmos-sdk/pull/6373) `multisig.Multisignature` has been renamed to `AminoMultisignature` - * (codec) `*codec.LegacyAmino` is now a wrapper around Amino which provides backwards compatibility with protobuf `Any`. ALL legacy code should use `*codec.LegacyAmino` instead of `*amino.Codec` directly - * (crypto) [\#5880](https://github.com/cosmos/cosmos-sdk/pull/5880) Merge `crypto/keys/mintkey` into `crypto`. - * (crypto/hd) [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) `crypto/keys/hd` moved to `crypto/hd`. - * (crypto/keyring): - * [\#5866](https://github.com/cosmos/cosmos-sdk/pull/5866) Rename `crypto/keys/` to `crypto/keyring/`. - * [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) `Keybase` -> `Keyring` interfaces migration. `LegacyKeybase` interface is added in order + * (crypto) [\#6780](https://github.com/cosmos/cosmos-sdk/issues/6780) Move ledger code to its own package. + * (crypto/types/multisig) [\#6373](https://github.com/cosmos/cosmos-sdk/pull/6373) `multisig.Multisignature` has been renamed to `AminoMultisignature` + * (codec) `*codec.LegacyAmino` is now a wrapper around Amino which provides backwards compatibility with protobuf `Any`. ALL legacy code should use `*codec.LegacyAmino` instead of `*amino.Codec` directly + * (crypto) [\#5880](https://github.com/cosmos/cosmos-sdk/pull/5880) Merge `crypto/keys/mintkey` into `crypto`. + * (crypto/hd) [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) `crypto/keys/hd` moved to `crypto/hd`. + * (crypto/keyring): + * [\#5866](https://github.com/cosmos/cosmos-sdk/pull/5866) Rename `crypto/keys/` to `crypto/keyring/`. + * [\#5904](https://github.com/cosmos/cosmos-sdk/pull/5904) `Keybase` -> `Keyring` interfaces migration. `LegacyKeybase` interface is added in order to guarantee limited backward compatibility with the old Keybase interface for the sole purpose of migrating keys across the new keyring backends. `NewLegacy` constructor is provided [\#5889](https://github.com/cosmos/cosmos-sdk/pull/5889) to allow for smooth migration of keys from the legacy LevelDB based implementation to new keyring backends. Plus, the package and the new keyring no longer depends on the sdk.Config singleton. Please consult the [package documentation](https://github.com/cosmos/cosmos-sdk/tree/master/crypto/keyring/doc.go) for more information on how to implement the new `Keyring` interface. - * [\#5858](https://github.com/cosmos/cosmos-sdk/pull/5858) Make Keyring store keys by name and address's hexbytes representation. - * (export) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) `AppExporter` now returns ABCI consensus parameters to be included in marshaled exported state. These parameters must be returned from the application via the `BaseApp`. - * (simapp) Deprecating and renaming `MakeEncodingConfig` to `MakeTestEncodingConfig` (both in `simapp` and `simapp/params` packages). - * (store) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) The `store.CommitMultiStore` interface now includes the new `snapshots.Snapshotter` interface as well. - * (types) [\#5579](https://github.com/cosmos/cosmos-sdk/pull/5579) The `keepRecent` field has been removed from the `PruningOptions` type. + * [\#5858](https://github.com/cosmos/cosmos-sdk/pull/5858) Make Keyring store keys by name and address's hexbytes representation. + * (export) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) `AppExporter` now returns ABCI consensus parameters to be included in marshaled exported state. These parameters must be returned from the application via the `BaseApp`. + * (simapp) Deprecating and renaming `MakeEncodingConfig` to `MakeTestEncodingConfig` (both in `simapp` and `simapp/params` packages). + * (store) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) The `store.CommitMultiStore` interface now includes the new `snapshots.Snapshotter` interface as well. + * (types) [\#5579](https://github.com/cosmos/cosmos-sdk/pull/5579) The `keepRecent` field has been removed from the `PruningOptions` type. The `PruningOptions` type now only includes fields `KeepEvery` and `SnapshotEvery`, where `KeepEvery` determines which committed heights are flushed to disk and `SnapshotEvery` determines which of these heights are kept after pruning. The `IsValid` method should be called whenever using these options. Methods `SnapshotVersion` and `FlushVersion` accept a version arugment and determine if the version should be flushed to disk or kept as a snapshot. Note, `KeepRecent` is automatically inferred from the options and provided directly the IAVL store. - * (types) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Refactored `AppModuleBasic` and `AppModuleGenesis` + * (types) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Refactored `AppModuleBasic` and `AppModuleGenesis` to now accept a `codec.JSONMarshaler` for modular serialization of genesis state. - * (types/rest) [\#5779](https://github.com/cosmos/cosmos-sdk/pull/5779) Drop unused Parse{Int64OrReturnBadRequest,QueryParamBool}() functions. -* __Modules__ - * (modules) [\#7243](https://github.com/cosmos/cosmos-sdk/pull/7243) Rename `RegisterCodec` to `RegisterLegacyAminoCodec` and `codec.New()` is now renamed to `codec.NewLegacyAmino()` - * (modules) [\#6564](https://github.com/cosmos/cosmos-sdk/pull/6564) Constant `DefaultParamspace` is removed from all modules, use ModuleName instead. - * (modules) [\#5989](https://github.com/cosmos/cosmos-sdk/pull/5989) `AppModuleBasic.GetTxCmd` now takes a single `CLIContext` parameter. - * (modules) [\#5664](https://github.com/cosmos/cosmos-sdk/pull/5664) Remove amino `Codec` from simulation `StoreDecoder`, which now returns a function closure in order to unmarshal the key-value pairs. - * (modules) [\#5555](https://github.com/cosmos/cosmos-sdk/pull/5555) Move `x/auth/client/utils/` types and functions to `x/auth/client/`. - * (modules) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) Move account balance logic and APIs from `x/auth` to `x/bank`. - * (modules) [\#6326](https://github.com/cosmos/cosmos-sdk/pull/6326) `AppModuleBasic.GetQueryCmd` now takes a single `client.Context` parameter. - * (modules) [\#6336](https://github.com/cosmos/cosmos-sdk/pull/6336) `AppModuleBasic.RegisterQueryService` method was added to support gRPC queries, and `QuerierRoute` and `NewQuerierHandler` were deprecated. - * (modules) [\#6311](https://github.com/cosmos/cosmos-sdk/issues/6311) Remove `alias.go` usage - * (modules) [\#6447](https://github.com/cosmos/cosmos-sdk/issues/6447) Rename `blacklistedAddrs` to `blockedAddrs`. - * (modules) [\#6834](https://github.com/cosmos/cosmos-sdk/issues/6834) Add `RegisterInterfaces` method to `AppModuleBasic` to support registration of protobuf interface types. - * (modules) [\#6734](https://github.com/cosmos/cosmos-sdk/issues/6834) Add `TxEncodingConfig` parameter to `AppModuleBasic.ValidateGenesis` command to support JSON tx decoding in `genutil`. - * (modules) [#7764](https://github.com/cosmos/cosmos-sdk/pull/7764) Added module initialization options: - * `server/types.AppExporter` requires extra argument: `AppOptions`. - * `server.AddCommands` requires extra argument: `addStartFlags types.ModuleInitFlags` - * `x/crisis.NewAppModule` has a new attribute: `skipGenesisInvariants`. [PR](https://github.com/cosmos/cosmos-sdk/pull/7764) - * (types) [\#6327](https://github.com/cosmos/cosmos-sdk/pull/6327) `sdk.Msg` now inherits `proto.Message`, as a result all `sdk.Msg` types now use pointer semantics. - * (types) [\#7032](https://github.com/cosmos/cosmos-sdk/pull/7032) All types ending with `ID` (e.g. `ProposalID`) now end with `Id` (e.g. `ProposalId`), to match default Protobuf generated format. Also see [\#7033](https://github.com/cosmos/cosmos-sdk/pull/7033) for more details. - * (x/auth) [\#6029](https://github.com/cosmos/cosmos-sdk/pull/6029) Module accounts have been moved from `x/supply` to `x/auth`. - * (x/auth) [\#6443](https://github.com/cosmos/cosmos-sdk/issues/6443) Move `FeeTx` and `TxWithMemo` interfaces from `x/auth/ante` to `types`. - * (x/auth) [\#7006](https://github.com/cosmos/cosmos-sdk/pull/7006) All `AccountRetriever` methods now take `client.Context` as a parameter instead of as a struct member. - * (x/auth) [\#6270](https://github.com/cosmos/cosmos-sdk/pull/6270) The passphrase argument has been removed from the signature of the following functions and methods: `BuildAndSign`, ` MakeSignature`, ` SignStdTx`, `TxBuilder.BuildAndSign`, `TxBuilder.Sign`, `TxBuilder.SignStdTx` - * (x/auth) [\#6428](https://github.com/cosmos/cosmos-sdk/issues/6428): - * `NewAnteHandler` and `NewSigVerificationDecorator` both now take a `SignModeHandler` parameter. - * `SignatureVerificationGasConsumer` now has the signature: `func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error`. - * The `SigVerifiableTx` interface now has a `GetSignaturesV2() ([]signing.SignatureV2, error)` method and no longer has the `GetSignBytes` method. - * (x/auth/tx) [\#8106](https://github.com/cosmos/cosmos-sdk/pull/8106) change related to missing append functionality in + * (types/rest) [\#5779](https://github.com/cosmos/cosmos-sdk/pull/5779) Drop unused Parse{Int64OrReturnBadRequest,QueryParamBool}() functions. +* **Modules** + * (modules) [\#7243](https://github.com/cosmos/cosmos-sdk/pull/7243) Rename `RegisterCodec` to `RegisterLegacyAminoCodec` and `codec.New()` is now renamed to `codec.NewLegacyAmino()` + * (modules) [\#6564](https://github.com/cosmos/cosmos-sdk/pull/6564) Constant `DefaultParamspace` is removed from all modules, use ModuleName instead. + * (modules) [\#5989](https://github.com/cosmos/cosmos-sdk/pull/5989) `AppModuleBasic.GetTxCmd` now takes a single `CLIContext` parameter. + * (modules) [\#5664](https://github.com/cosmos/cosmos-sdk/pull/5664) Remove amino `Codec` from simulation `StoreDecoder`, which now returns a function closure in order to unmarshal the key-value pairs. + * (modules) [\#5555](https://github.com/cosmos/cosmos-sdk/pull/5555) Move `x/auth/client/utils/` types and functions to `x/auth/client/`. + * (modules) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) Move account balance logic and APIs from `x/auth` to `x/bank`. + * (modules) [\#6326](https://github.com/cosmos/cosmos-sdk/pull/6326) `AppModuleBasic.GetQueryCmd` now takes a single `client.Context` parameter. + * (modules) [\#6336](https://github.com/cosmos/cosmos-sdk/pull/6336) `AppModuleBasic.RegisterQueryService` method was added to support gRPC queries, and `QuerierRoute` and `NewQuerierHandler` were deprecated. + * (modules) [\#6311](https://github.com/cosmos/cosmos-sdk/issues/6311) Remove `alias.go` usage + * (modules) [\#6447](https://github.com/cosmos/cosmos-sdk/issues/6447) Rename `blacklistedAddrs` to `blockedAddrs`. + * (modules) [\#6834](https://github.com/cosmos/cosmos-sdk/issues/6834) Add `RegisterInterfaces` method to `AppModuleBasic` to support registration of protobuf interface types. + * (modules) [\#6734](https://github.com/cosmos/cosmos-sdk/issues/6834) Add `TxEncodingConfig` parameter to `AppModuleBasic.ValidateGenesis` command to support JSON tx decoding in `genutil`. + * (modules) [#7764](https://github.com/cosmos/cosmos-sdk/pull/7764) Added module initialization options: + * `server/types.AppExporter` requires extra argument: `AppOptions`. + * `server.AddCommands` requires extra argument: `addStartFlags types.ModuleInitFlags` + * `x/crisis.NewAppModule` has a new attribute: `skipGenesisInvariants`. [PR](https://github.com/cosmos/cosmos-sdk/pull/7764) + * (types) [\#6327](https://github.com/cosmos/cosmos-sdk/pull/6327) `sdk.Msg` now inherits `proto.Message`, as a result all `sdk.Msg` types now use pointer semantics. + * (types) [\#7032](https://github.com/cosmos/cosmos-sdk/pull/7032) All types ending with `ID` (e.g. `ProposalID`) now end with `Id` (e.g. `ProposalId`), to match default Protobuf generated format. Also see [\#7033](https://github.com/cosmos/cosmos-sdk/pull/7033) for more details. + * (x/auth) [\#6029](https://github.com/cosmos/cosmos-sdk/pull/6029) Module accounts have been moved from `x/supply` to `x/auth`. + * (x/auth) [\#6443](https://github.com/cosmos/cosmos-sdk/issues/6443) Move `FeeTx` and `TxWithMemo` interfaces from `x/auth/ante` to `types`. + * (x/auth) [\#7006](https://github.com/cosmos/cosmos-sdk/pull/7006) All `AccountRetriever` methods now take `client.Context` as a parameter instead of as a struct member. + * (x/auth) [\#6270](https://github.com/cosmos/cosmos-sdk/pull/6270) The passphrase argument has been removed from the signature of the following functions and methods: `BuildAndSign`, `MakeSignature`, `SignStdTx`, `TxBuilder.BuildAndSign`, `TxBuilder.Sign`, `TxBuilder.SignStdTx` + * (x/auth) [\#6428](https://github.com/cosmos/cosmos-sdk/issues/6428): + * `NewAnteHandler` and `NewSigVerificationDecorator` both now take a `SignModeHandler` parameter. + * `SignatureVerificationGasConsumer` now has the signature: `func(meter sdk.GasMeter, sig signing.SignatureV2, params types.Params) error`. + * The `SigVerifiableTx` interface now has a `GetSignaturesV2() ([]signing.SignatureV2, error)` method and no longer has the `GetSignBytes` method. + * (x/auth/tx) [\#8106](https://github.com/cosmos/cosmos-sdk/pull/8106) change related to missing append functionality in client transaction signing - + added `overwriteSig` argument to `x/auth/client.SignTx` and `client/tx.Sign` functions. - + removed `x/auth/tx.go:wrapper.GetSignatures`. The `wrapper` provides `TxBuilder` functionality, and it's a private + + added `overwriteSig` argument to `x/auth/client.SignTx` and `client/tx.Sign` functions. + + removed `x/auth/tx.go:wrapper.GetSignatures`. The `wrapper` provides `TxBuilder` functionality, and it's a private structure. That function was not used at all and it's not exposed through the `TxBuilder` interface. - * (x/bank) [\#7327](https://github.com/cosmos/cosmos-sdk/pull/7327) AddCoins and SubtractCoins no longer return a resultingValue and will only return an error. - * (x/capability) [#7918](https://github.com/cosmos/cosmos-sdk/pull/7918) Add x/capability safety checks: - * All outward facing APIs will now check that capability is not nil and name is not empty before performing any state-machine changes - * `SetIndex` has been renamed to `InitializeIndex` - * (x/evidence) [\#7251](https://github.com/cosmos/cosmos-sdk/pull/7251) New evidence types and light client evidence handling. The module function names changed. - * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove APIs for getting and setting `x/evidence` parameters. `BaseApp` now uses a `ParamStore` to manage Tendermint consensus parameters which is managed via the `x/params` `Substore` type. - * (x/gov) [\#6147](https://github.com/cosmos/cosmos-sdk/pull/6147) The `Content` field on `Proposal` and `MsgSubmitProposal` + * (x/bank) [\#7327](https://github.com/cosmos/cosmos-sdk/pull/7327) AddCoins and SubtractCoins no longer return a resultingValue and will only return an error. + * (x/capability) [#7918](https://github.com/cosmos/cosmos-sdk/pull/7918) Add x/capability safety checks: + * All outward facing APIs will now check that capability is not nil and name is not empty before performing any state-machine changes + * `SetIndex` has been renamed to `InitializeIndex` + * (x/evidence) [\#7251](https://github.com/cosmos/cosmos-sdk/pull/7251) New evidence types and light client evidence handling. The module function names changed. + * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove APIs for getting and setting `x/evidence` parameters. `BaseApp` now uses a `ParamStore` to manage Tendermint consensus parameters which is managed via the `x/params` `Substore` type. + * (x/gov) [\#6147](https://github.com/cosmos/cosmos-sdk/pull/6147) The `Content` field on `Proposal` and `MsgSubmitProposal` is now `Any` in concordance with [ADR 019](docs/architecture/adr-019-protobuf-state-encoding.md) and `GetContent` should now be used to retrieve the actual proposal `Content`. Also the `NewMsgSubmitProposal` constructor now may return an `error` - * (x/ibc) [\#6374](https://github.com/cosmos/cosmos-sdk/pull/6374) `VerifyMembership` and `VerifyNonMembership` now take a `specs []string` argument to specify the proof format used for verification. Most SDK chains can simply use `commitmenttypes.GetSDKSpecs()` for this argument. - * (x/params) [\#5619](https://github.com/cosmos/cosmos-sdk/pull/5619) The `x/params` keeper now accepts a `codec.Marshaller` instead of + * (x/ibc) [\#6374](https://github.com/cosmos/cosmos-sdk/pull/6374) `VerifyMembership` and `VerifyNonMembership` now take a `specs []string` argument to specify the proof format used for verification. Most SDK chains can simply use `commitmenttypes.GetSDKSpecs()` for this argument. + * (x/params) [\#5619](https://github.com/cosmos/cosmos-sdk/pull/5619) The `x/params` keeper now accepts a `codec.Marshaller` instead of a reference to an amino codec. Amino is still used for JSON serialization. - * (x/staking) [\#6451](https://github.com/cosmos/cosmos-sdk/pull/6451) `DefaultParamspace` and `ParamKeyTable` in staking module are moved from keeper to types to enforce consistency. - * (x/staking) [\#7419](https://github.com/cosmos/cosmos-sdk/pull/7419) The `TmConsPubKey` method on ValidatorI has been + * (x/staking) [\#6451](https://github.com/cosmos/cosmos-sdk/pull/6451) `DefaultParamspace` and `ParamKeyTable` in staking module are moved from keeper to types to enforce consistency. + * (x/staking) [\#7419](https://github.com/cosmos/cosmos-sdk/pull/7419) The `TmConsPubKey` method on ValidatorI has been removed and replaced instead by `ConsPubKey` (which returns a SDK `cryptotypes.PubKey`) and `TmConsPublicKey` (which returns a Tendermint proto PublicKey). - * (x/staking/types) [\#7447](https://github.com/cosmos/cosmos-sdk/issues/7447) Remove bech32 PubKey support: - * `ValidatorI` interface update. `GetConsPubKey` renamed to `TmConsPubKey` (consensus public key must be a tendermint key). `TmConsPubKey`, `GetConsAddr` methods return error. - * `Validator` update. Methods changed in `ValidatorI` (as described above) and `ToTmValidator` return error. - * `Validator.ConsensusPubkey` type changed from `string` to `codectypes.Any`. - * `MsgCreateValidator.Pubkey` type changed from `string` to `codectypes.Any`. - * (x/supply) [\#6010](https://github.com/cosmos/cosmos-sdk/pull/6010) All `x/supply` types and APIs have been moved to `x/bank`. - * [\#6409](https://github.com/cosmos/cosmos-sdk/pull/6409) Rename all IsEmpty methods to Empty across the codebase and enforce consistency. - * [\#6231](https://github.com/cosmos/cosmos-sdk/pull/6231) Simplify `AppModule` interface, `Route` and `NewHandler` methods become only `Route` + * (x/staking/types) [\#7447](https://github.com/cosmos/cosmos-sdk/issues/7447) Remove bech32 PubKey support: + * `ValidatorI` interface update. `GetConsPubKey` renamed to `TmConsPubKey` (consensus public key must be a tendermint key). `TmConsPubKey`, `GetConsAddr` methods return error. + * `Validator` update. Methods changed in `ValidatorI` (as described above) and `ToTmValidator` return error. + * `Validator.ConsensusPubkey` type changed from `string` to `codectypes.Any`. + * `MsgCreateValidator.Pubkey` type changed from `string` to `codectypes.Any`. + * (x/supply) [\#6010](https://github.com/cosmos/cosmos-sdk/pull/6010) All `x/supply` types and APIs have been moved to `x/bank`. + * [\#6409](https://github.com/cosmos/cosmos-sdk/pull/6409) Rename all IsEmpty methods to Empty across the codebase and enforce consistency. + * [\#6231](https://github.com/cosmos/cosmos-sdk/pull/6231) Simplify `AppModule` interface, `Route` and `NewHandler` methods become only `Route` and returns a new `Route` type. - * (x/slashing) [\#6212](https://github.com/cosmos/cosmos-sdk/pull/6212) Remove `Get*` prefixes from key construction functions - * (server) [\#6079](https://github.com/cosmos/cosmos-sdk/pull/6079) Remove `UpgradeOldPrivValFile` (deprecated in Tendermint Core v0.28). - * [\#5719](https://github.com/cosmos/cosmos-sdk/pull/5719) Bump Go requirement to 1.14+ - + * (x/slashing) [\#6212](https://github.com/cosmos/cosmos-sdk/pull/6212) Remove `Get*` prefixes from key construction functions + * (server) [\#6079](https://github.com/cosmos/cosmos-sdk/pull/6079) Remove `UpgradeOldPrivValFile` (deprecated in Tendermint Core v0.28). + * [\#5719](https://github.com/cosmos/cosmos-sdk/pull/5719) Bump Go requirement to 1.14+ ### State Machine Breaking -* __General__ - * (client) [\#7268](https://github.com/cosmos/cosmos-sdk/pull/7268) / [\#7147](https://github.com/cosmos/cosmos-sdk/pull/7147) Introduce new protobuf based PubKeys, and migrate PubKey in BaseAccount to use this new protobuf based PubKey format +* **General** + * (client) [\#7268](https://github.com/cosmos/cosmos-sdk/pull/7268) / [\#7147](https://github.com/cosmos/cosmos-sdk/pull/7147) Introduce new protobuf based PubKeys, and migrate PubKey in BaseAccount to use this new protobuf based PubKey format -* __Modules__ - * (modules) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) Separate balance from accounts per ADR 004. - * Account balances are now persisted and retrieved via the `x/bank` module. - * Vesting account interface has been modified to account for changes. - * Callers to `NewBaseVestingAccount` are responsible for verifying account balance in relation to +* **Modules** + * (modules) [\#5572](https://github.com/cosmos/cosmos-sdk/pull/5572) Separate balance from accounts per ADR 004. + * Account balances are now persisted and retrieved via the `x/bank` module. + * Vesting account interface has been modified to account for changes. + * Callers to `NewBaseVestingAccount` are responsible for verifying account balance in relation to the original vesting amount. - * The `SendKeeper` and `ViewKeeper` interfaces in `x/bank` have been modified to account for changes. - * (x/auth) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Migrate the `x/auth` module to use Protocol Buffers for state + * The `SendKeeper` and `ViewKeeper` interfaces in `x/bank` have been modified to account for changes. + * (x/auth) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Migrate the `x/auth` module to use Protocol Buffers for state serialization instead of Amino. - * The `BaseAccount.PubKey` field is now represented as a Bech32 string instead of a `crypto.Pubkey`. - * `NewBaseAccountWithAddress` now returns a reference to a `BaseAccount`. - * The `x/auth` module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by + * The `BaseAccount.PubKey` field is now represented as a Bech32 string instead of a `crypto.Pubkey`. + * `NewBaseAccountWithAddress` now returns a reference to a `BaseAccount`. + * The `x/auth` module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by requiring a concrete codec to know how to serialize accounts. - * The `AccountRetriever` type now accepts a `Codec` in its constructor in order to know how to + * The `AccountRetriever` type now accepts a `Codec` in its constructor in order to know how to serialize accounts. - * (x/bank) [\#6518](https://github.com/cosmos/cosmos-sdk/pull/6518) Support for global and per-denomination send enabled flags. - * Existing send_enabled global flag has been moved into a Params structure as `default_send_enabled`. - * An array of: `{denom: string, enabled: bool}` is added to bank Params to support per-denomination override of global default value. - * (x/distribution) [\#5610](https://github.com/cosmos/cosmos-sdk/pull/5610) Migrate the `x/distribution` module to use Protocol Buffers for state + * (x/bank) [\#6518](https://github.com/cosmos/cosmos-sdk/pull/6518) Support for global and per-denomination send enabled flags. + * Existing send_enabled global flag has been moved into a Params structure as `default_send_enabled`. + * An array of: `{denom: string, enabled: bool}` is added to bank Params to support per-denomination override of global default value. + * (x/distribution) [\#5610](https://github.com/cosmos/cosmos-sdk/pull/5610) Migrate the `x/distribution` module to use Protocol Buffers for state serialization instead of Amino. The exact codec used is `codec.HybridCodec` which utilizes Protobuf for binary encoding and Amino for JSON encoding. - * `ValidatorHistoricalRewards.ReferenceCount` is now of types `uint32` instead of `uint16`. - * `ValidatorSlashEvents` is now a struct with `slashevents`. - * `ValidatorOutstandingRewards` is now a struct with `rewards`. - * `ValidatorAccumulatedCommission` is now a struct with `commission`. - * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type + * `ValidatorHistoricalRewards.ReferenceCount` is now of types `uint32` instead of `uint16`. + * `ValidatorSlashEvents` is now a struct with `slashevents`. + * `ValidatorOutstandingRewards` is now a struct with `rewards`. + * `ValidatorAccumulatedCommission` is now a struct with `commission`. + * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type provided is specified by `ModuleCdc`. - * (x/evidence) [\#5634](https://github.com/cosmos/cosmos-sdk/pull/5634) Migrate the `x/evidence` module to use Protocol Buffers for state + * (x/evidence) [\#5634](https://github.com/cosmos/cosmos-sdk/pull/5634) Migrate the `x/evidence` module to use Protocol Buffers for state serialization instead of Amino. - * The `internal` sub-package has been removed in order to expose the types proto file. - * The module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by + * The `internal` sub-package has been removed in order to expose the types proto file. + * The module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by requiring a concrete codec to know how to serialize `Evidence` types. - * The `MsgSubmitEvidence` message has been removed in favor of `MsgSubmitEvidenceBase`. The application-level + * The `MsgSubmitEvidence` message has been removed in favor of `MsgSubmitEvidenceBase`. The application-level codec must now define the concrete `MsgSubmitEvidence` type which must implement the module's `MsgSubmitEvidence` interface. - * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove parameters from `x/evidence` genesis and module state. The `x/evidence` module now solely uses Tendermint consensus parameters to determine of evidence is valid or not. - * (x/gov) [\#5737](https://github.com/cosmos/cosmos-sdk/pull/5737) Migrate the `x/gov` module to use Protocol + * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Remove parameters from `x/evidence` genesis and module state. The `x/evidence` module now solely uses Tendermint consensus parameters to determine of evidence is valid or not. + * (x/gov) [\#5737](https://github.com/cosmos/cosmos-sdk/pull/5737) Migrate the `x/gov` module to use Protocol Buffers for state serialization instead of Amino. - * `MsgSubmitProposal` will be removed in favor of the application-level proto-defined `MsgSubmitProposal` which + * `MsgSubmitProposal` will be removed in favor of the application-level proto-defined `MsgSubmitProposal` which implements the `MsgSubmitProposalI` interface. Applications should extend the `NewMsgSubmitProposalBase` type to define their own concrete `MsgSubmitProposal` types. - * The module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by + * The module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by requiring a concrete codec to know how to serialize `Proposal` types. - * (x/mint) [\#5634](https://github.com/cosmos/cosmos-sdk/pull/5634) Migrate the `x/mint` module to use Protocol Buffers for state + * (x/mint) [\#5634](https://github.com/cosmos/cosmos-sdk/pull/5634) Migrate the `x/mint` module to use Protocol Buffers for state serialization instead of Amino. - * The `internal` sub-package has been removed in order to expose the types proto file. - * (x/slashing) [\#5627](https://github.com/cosmos/cosmos-sdk/pull/5627) Migrate the `x/slashing` module to use Protocol Buffers for state + * The `internal` sub-package has been removed in order to expose the types proto file. + * (x/slashing) [\#5627](https://github.com/cosmos/cosmos-sdk/pull/5627) Migrate the `x/slashing` module to use Protocol Buffers for state serialization instead of Amino. The exact codec used is `codec.HybridCodec` which utilizes Protobuf for binary encoding and Amino for JSON encoding. - * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type + * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type provided is specified by `ModuleCdc`. - * (x/staking) [\#6844](https://github.com/cosmos/cosmos-sdk/pull/6844) Validators are now inserted into the unbonding queue based on their unbonding time and height. The relevant keeper APIs are modified to reflect these changes by now also requiring a height. - * (x/staking) [\#6061](https://github.com/cosmos/cosmos-sdk/pull/6061) Allow a validator to immediately unjail when no signing info is present due to + * (x/staking) [\#6844](https://github.com/cosmos/cosmos-sdk/pull/6844) Validators are now inserted into the unbonding queue based on their unbonding time and height. The relevant keeper APIs are modified to reflect these changes by now also requiring a height. + * (x/staking) [\#6061](https://github.com/cosmos/cosmos-sdk/pull/6061) Allow a validator to immediately unjail when no signing info is present due to falling below their minimum self-delegation and never having been bonded. The validator may immediately unjail once they've met their minimum self-delegation. - * (x/staking) [\#5600](https://github.com/cosmos/cosmos-sdk/pull/5600) Migrate the `x/staking` module to use Protocol Buffers for state + * (x/staking) [\#5600](https://github.com/cosmos/cosmos-sdk/pull/5600) Migrate the `x/staking` module to use Protocol Buffers for state serialization instead of Amino. The exact codec used is `codec.HybridCodec` which utilizes Protobuf for binary encoding and Amino for JSON encoding. - * `BondStatus` is now of type `int32` instead of `byte`. - * Types of `int16` in the `Params` type are now of type `int32`. - * Every reference of `crypto.Pubkey` in context of a `Validator` is now of type string. `GetPubKeyFromBech32` must be used to get the `crypto.Pubkey`. - * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type + * `BondStatus` is now of type `int32` instead of `byte`. + * Types of `int16` in the `Params` type are now of type `int32`. + * Every reference of `crypto.Pubkey` in context of a `Validator` is now of type string. `GetPubKeyFromBech32` must be used to get the `crypto.Pubkey`. + * The `Keeper` constructor now takes a `codec.Marshaler` instead of a concrete Amino codec. This exact type provided is specified by `ModuleCdc`. - * (x/staking) [\#7979](https://github.com/cosmos/cosmos-sdk/pull/7979) keeper pubkey storage serialization migration + * (x/staking) [\#7979](https://github.com/cosmos/cosmos-sdk/pull/7979) keeper pubkey storage serialization migration from bech32 to protobuf. - * (x/supply) [\#6010](https://github.com/cosmos/cosmos-sdk/pull/6010) Removed the `x/supply` module by merging the existing types and APIs into the `x/bank` module. - * (x/supply) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Migrate the `x/supply` module to use Protocol Buffers for state + * (x/supply) [\#6010](https://github.com/cosmos/cosmos-sdk/pull/6010) Removed the `x/supply` module by merging the existing types and APIs into the `x/bank` module. + * (x/supply) [\#5533](https://github.com/cosmos/cosmos-sdk/pull/5533) Migrate the `x/supply` module to use Protocol Buffers for state serialization instead of Amino. - * The `internal` sub-package has been removed in order to expose the types proto file. - * The `x/supply` module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by + * The `internal` sub-package has been removed in order to expose the types proto file. + * The `x/supply` module now accepts a `Codec` interface which extends the `codec.Marshaler` interface by requiring a concrete codec to know how to serialize `SupplyI` types. - * The `SupplyI` interface has been modified to no longer return `SupplyI` on methods. Instead the + * The `SupplyI` interface has been modified to no longer return `SupplyI` on methods. Instead the concrete type's receiver should modify the type. - * (x/upgrade) [\#5659](https://github.com/cosmos/cosmos-sdk/pull/5659) Migrate the `x/upgrade` module to use Protocol + * (x/upgrade) [\#5659](https://github.com/cosmos/cosmos-sdk/pull/5659) Migrate the `x/upgrade` module to use Protocol Buffers for state serialization instead of Amino. - * The `internal` sub-package has been removed in order to expose the types proto file. - * The `x/upgrade` module now accepts a `codec.Marshaler` interface. + * The `internal` sub-package has been removed in order to expose the types proto file. + * The `x/upgrade` module now accepts a `codec.Marshaler` interface. ### Features -* __Baseapp / Client / REST__ - * (x/auth) [\#6213](https://github.com/cosmos/cosmos-sdk/issues/6213) Introduce new protobuf based path for transaction signing, see [ADR020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md) for more details - * (x/auth) [\#6350](https://github.com/cosmos/cosmos-sdk/pull/6350) New sign-batch command to sign StdTx batch files. - * (baseapp) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) Added support for taking state snapshots at regular height intervals, via options `snapshot-interval` and `snapshot-keep-recent`. - * (baseapp) [\#7519](https://github.com/cosmos/cosmos-sdk/pull/7519) Add `ServiceMsgRouter` to BaseApp to handle routing of protobuf service `Msg`s. The two new types defined in ADR 031, `sdk.ServiceMsg` and `sdk.MsgRequest` are introduced with this router. - * (client) [\#5921](https://github.com/cosmos/cosmos-sdk/issues/5921) Introduce new gRPC and gRPC Gateway based APIs for querying app & module data. See [ADR021](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md) for more details - * (cli) [\#7485](https://github.com/cosmos/cosmos-sdk/pull/7485) Introduce a new optional `--keyring-dir` flag that allows clients to specify a Keyring directory if it does not reside in the directory specified by `--home`. - * (cli) [\#7221](https://github.com/cosmos/cosmos-sdk/pull/7221) Add the option of emitting amino encoded json from the CLI - * (codec) [\#7519](https://github.com/cosmos/cosmos-sdk/pull/7519) `InterfaceRegistry` now inherits `jsonpb.AnyResolver`, and has a `RegisterCustomTypeURL` method to support ADR 031 packing of `Any`s. `AnyResolver` is now a required parameter to `RejectUnknownFields`. - * (coin) [\#6755](https://github.com/cosmos/cosmos-sdk/pull/6755) Add custom regex validation for `Coin` denom by overwriting `CoinDenomRegex` when using `/types/coin.go`. - * (config) [\#7265](https://github.com/cosmos/cosmos-sdk/pull/7265) Support Tendermint block pruning through a new `min-retain-blocks` configuration that can be set in either `app.toml` or via the CLI. This parameter is used in conjunction with other criteria to determine the height at which Tendermint should prune blocks. - * (events) [\#7121](https://github.com/cosmos/cosmos-sdk/pull/7121) The application now derives what events are indexed by Tendermint via the `index-events` configuration in `app.toml`, which is a list of events taking the form `{eventType}.{attributeKey}`. - * (tx) [\#6089](https://github.com/cosmos/cosmos-sdk/pull/6089) Transactions can now have a `TimeoutHeight` set which allows the transaction to be rejected if it's committed at a height greater than the timeout. - * (rest) [\#6167](https://github.com/cosmos/cosmos-sdk/pull/6167) Support `max-body-bytes` CLI flag for the REST service. - * (genesis) [\#7089](https://github.com/cosmos/cosmos-sdk/pull/7089) The `export` command now adds a `initial_height` field in the exported JSON. Baseapp's `CommitMultiStore` now also has a `SetInitialVersion` setter, so it can set the initial store version inside `InitChain` and start a new chain from a given height. -* __General__ - * (crypto/multisig) [\#6241](https://github.com/cosmos/cosmos-sdk/pull/6241) Add Multisig type directly to the repo. Previously this was in tendermint. - * (codec/types) [\#8106](https://github.com/cosmos/cosmos-sdk/pull/8106) Adding `NewAnyWithCustomTypeURL` to correctly +* **Baseapp / Client / REST** + * (x/auth) [\#6213](https://github.com/cosmos/cosmos-sdk/issues/6213) Introduce new protobuf based path for transaction signing, see [ADR020](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-020-protobuf-transaction-encoding.md) for more details + * (x/auth) [\#6350](https://github.com/cosmos/cosmos-sdk/pull/6350) New sign-batch command to sign StdTx batch files. + * (baseapp) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) Added support for taking state snapshots at regular height intervals, via options `snapshot-interval` and `snapshot-keep-recent`. + * (baseapp) [\#7519](https://github.com/cosmos/cosmos-sdk/pull/7519) Add `ServiceMsgRouter` to BaseApp to handle routing of protobuf service `Msg`s. The two new types defined in ADR 031, `sdk.ServiceMsg` and `sdk.MsgRequest` are introduced with this router. + * (client) [\#5921](https://github.com/cosmos/cosmos-sdk/issues/5921) Introduce new gRPC and gRPC Gateway based APIs for querying app & module data. See [ADR021](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-021-protobuf-query-encoding.md) for more details + * (cli) [\#7485](https://github.com/cosmos/cosmos-sdk/pull/7485) Introduce a new optional `--keyring-dir` flag that allows clients to specify a Keyring directory if it does not reside in the directory specified by `--home`. + * (cli) [\#7221](https://github.com/cosmos/cosmos-sdk/pull/7221) Add the option of emitting amino encoded json from the CLI + * (codec) [\#7519](https://github.com/cosmos/cosmos-sdk/pull/7519) `InterfaceRegistry` now inherits `jsonpb.AnyResolver`, and has a `RegisterCustomTypeURL` method to support ADR 031 packing of `Any`s. `AnyResolver` is now a required parameter to `RejectUnknownFields`. + * (coin) [\#6755](https://github.com/cosmos/cosmos-sdk/pull/6755) Add custom regex validation for `Coin` denom by overwriting `CoinDenomRegex` when using `/types/coin.go`. + * (config) [\#7265](https://github.com/cosmos/cosmos-sdk/pull/7265) Support Tendermint block pruning through a new `min-retain-blocks` configuration that can be set in either `app.toml` or via the CLI. This parameter is used in conjunction with other criteria to determine the height at which Tendermint should prune blocks. + * (events) [\#7121](https://github.com/cosmos/cosmos-sdk/pull/7121) The application now derives what events are indexed by Tendermint via the `index-events` configuration in `app.toml`, which is a list of events taking the form `{eventType}.{attributeKey}`. + * (tx) [\#6089](https://github.com/cosmos/cosmos-sdk/pull/6089) Transactions can now have a `TimeoutHeight` set which allows the transaction to be rejected if it's committed at a height greater than the timeout. + * (rest) [\#6167](https://github.com/cosmos/cosmos-sdk/pull/6167) Support `max-body-bytes` CLI flag for the REST service. + * (genesis) [\#7089](https://github.com/cosmos/cosmos-sdk/pull/7089) The `export` command now adds a `initial_height` field in the exported JSON. Baseapp's `CommitMultiStore` now also has a `SetInitialVersion` setter, so it can set the initial store version inside `InitChain` and start a new chain from a given height. +* **General** + * (crypto/multisig) [\#6241](https://github.com/cosmos/cosmos-sdk/pull/6241) Add Multisig type directly to the repo. Previously this was in tendermint. + * (codec/types) [\#8106](https://github.com/cosmos/cosmos-sdk/pull/8106) Adding `NewAnyWithCustomTypeURL` to correctly marshal Messages in TxBuilder. - * (tests) [\#6489](https://github.com/cosmos/cosmos-sdk/pull/6489) Introduce package `testutil`, new in-process testing network framework for use in integration and unit tests. - * (tx) Add new auth/tx gRPC & gRPC-Gateway endpoints for basic querying & broadcasting support - * [\#7842](https://github.com/cosmos/cosmos-sdk/pull/7842) Add TxsByEvent gRPC endpoint - * [\#7852](https://github.com/cosmos/cosmos-sdk/pull/7852) Add tx broadcast gRPC endpoint - * (tx) [\#7688](https://github.com/cosmos/cosmos-sdk/pull/7688) Add a new Tx gRPC service with methods `Simulate` and `GetTx` (by hash). - * (store) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) Added `rootmulti.Store` methods for taking and restoring snapshots, based on `iavl.Store` export/import. - * (store) [\#6324](https://github.com/cosmos/cosmos-sdk/pull/6324) IAVL store query proofs now return CommitmentOp which wraps an ics23 CommitmentProof - * (store) [\#6390](https://github.com/cosmos/cosmos-sdk/pull/6390) `RootMulti` store query proofs now return `CommitmentOp` which wraps `CommitmentProofs` - * `store.Query` now only returns chained `ics23.CommitmentProof` wrapped in `merkle.Proof` - * `ProofRuntime` only decodes and verifies `ics23.CommitmentProof` -* __Modules__ - * (modules) [\#5921](https://github.com/cosmos/cosmos-sdk/issues/5921) Introduction of Query gRPC service definitions along with REST annotations for gRPC Gateway for each module - * (modules) [\#7540](https://github.com/cosmos/cosmos-sdk/issues/7540) Protobuf service definitions can now be used for + * (tests) [\#6489](https://github.com/cosmos/cosmos-sdk/pull/6489) Introduce package `testutil`, new in-process testing network framework for use in integration and unit tests. + * (tx) Add new auth/tx gRPC & gRPC-Gateway endpoints for basic querying & broadcasting support + * [\#7842](https://github.com/cosmos/cosmos-sdk/pull/7842) Add TxsByEvent gRPC endpoint + * [\#7852](https://github.com/cosmos/cosmos-sdk/pull/7852) Add tx broadcast gRPC endpoint + * (tx) [\#7688](https://github.com/cosmos/cosmos-sdk/pull/7688) Add a new Tx gRPC service with methods `Simulate` and `GetTx` (by hash). + * (store) [\#5803](https://github.com/cosmos/cosmos-sdk/pull/5803) Added `rootmulti.Store` methods for taking and restoring snapshots, based on `iavl.Store` export/import. + * (store) [\#6324](https://github.com/cosmos/cosmos-sdk/pull/6324) IAVL store query proofs now return CommitmentOp which wraps an ics23 CommitmentProof + * (store) [\#6390](https://github.com/cosmos/cosmos-sdk/pull/6390) `RootMulti` store query proofs now return `CommitmentOp` which wraps `CommitmentProofs` + * `store.Query` now only returns chained `ics23.CommitmentProof` wrapped in `merkle.Proof` + * `ProofRuntime` only decodes and verifies `ics23.CommitmentProof` +* **Modules** + * (modules) [\#5921](https://github.com/cosmos/cosmos-sdk/issues/5921) Introduction of Query gRPC service definitions along with REST annotations for gRPC Gateway for each module + * (modules) [\#7540](https://github.com/cosmos/cosmos-sdk/issues/7540) Protobuf service definitions can now be used for packing `Msg`s in transactions as defined in [ADR 031](./docs/architecture/adr-031-msg-service.md). All modules now define a `Msg` protobuf service. - * (x/auth/vesting) [\#7209](https://github.com/cosmos/cosmos-sdk/pull/7209) Create new `MsgCreateVestingAccount` message type along with CLI handler that allows for the creation of delayed and continuous vesting types. - * (x/capability) [\#5828](https://github.com/cosmos/cosmos-sdk/pull/5828) Capability module integration as outlined in [ADR 3 - Dynamic Capability Store](https://github.com/cosmos/tree/master/docs/architecture/adr-003-dynamic-capability-store.md). - * (x/crisis) `x/crisis` has a new function: `AddModuleInitFlags`, which will register optional crisis module flags for the start command. - * (x/ibc) [\#5277](https://github.com/cosmos/cosmos-sdk/pull/5277) `x/ibc` changes from IBC alpha. For more details check the the [`x/ibc/core/spec`](https://github.com/cosmos/cosmos-sdk/tree/master/x/ibc/core/spec) directory, or the ICS specs below: - * [ICS 002 - Client Semantics](https://github.com/cosmos/ics/tree/master/spec/ics-002-client-semantics) subpackage - * [ICS 003 - Connection Semantics](https://github.com/cosmos/ics/blob/master/spec/ics-003-connection-semantics) subpackage - * [ICS 004 - Channel and Packet Semantics](https://github.com/cosmos/ics/blob/master/spec/ics-004-channel-and-packet-semantics) subpackage - * [ICS 005 - Port Allocation](https://github.com/cosmos/ics/blob/master/spec/ics-005-port-allocation) subpackage - * [ICS 006 - Solo Machine Client](https://github.com/cosmos/ics/tree/master/spec/ics-006-solo-machine-client) subpackage - * [ICS 007 - Tendermint Client](https://github.com/cosmos/ics/blob/master/spec/ics-007-tendermint-client) subpackage - * [ICS 009 - Loopback Client](https://github.com/cosmos/ics/tree/master/spec/ics-009-loopback-client) subpackage - * [ICS 020 - Fungible Token Transfer](https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer) subpackage - * [ICS 023 - Vector Commitments](https://github.com/cosmos/ics/tree/master/spec/ics-023-vector-commitments) subpackage - * [ICS 024 - Host State Machine Requirements](https://github.com/cosmos/ics/tree/master/spec/ics-024-host-requirements) subpackage - * (x/ibc) [\#6374](https://github.com/cosmos/cosmos-sdk/pull/6374) ICS-23 Verify functions will now accept and verify ics23 CommitmentProofs exclusively - * (x/params) [\#6005](https://github.com/cosmos/cosmos-sdk/pull/6005) Add new CLI command for querying raw x/params parameters by subspace and key. + * (x/auth/vesting) [\#7209](https://github.com/cosmos/cosmos-sdk/pull/7209) Create new `MsgCreateVestingAccount` message type along with CLI handler that allows for the creation of delayed and continuous vesting types. + * (x/capability) [\#5828](https://github.com/cosmos/cosmos-sdk/pull/5828) Capability module integration as outlined in [ADR 3 - Dynamic Capability Store](https://github.com/cosmos/tree/master/docs/architecture/adr-003-dynamic-capability-store.md). + * (x/crisis) `x/crisis` has a new function: `AddModuleInitFlags`, which will register optional crisis module flags for the start command. + * (x/ibc) [\#5277](https://github.com/cosmos/cosmos-sdk/pull/5277) `x/ibc` changes from IBC alpha. For more details check the the [`x/ibc/core/spec`](https://github.com/cosmos/cosmos-sdk/tree/master/x/ibc/core/spec) directory, or the ICS specs below: + * [ICS 002 - Client Semantics](https://github.com/cosmos/ics/tree/master/spec/ics-002-client-semantics) subpackage + * [ICS 003 - Connection Semantics](https://github.com/cosmos/ics/blob/master/spec/ics-003-connection-semantics) subpackage + * [ICS 004 - Channel and Packet Semantics](https://github.com/cosmos/ics/blob/master/spec/ics-004-channel-and-packet-semantics) subpackage + * [ICS 005 - Port Allocation](https://github.com/cosmos/ics/blob/master/spec/ics-005-port-allocation) subpackage + * [ICS 006 - Solo Machine Client](https://github.com/cosmos/ics/tree/master/spec/ics-006-solo-machine-client) subpackage + * [ICS 007 - Tendermint Client](https://github.com/cosmos/ics/blob/master/spec/ics-007-tendermint-client) subpackage + * [ICS 009 - Loopback Client](https://github.com/cosmos/ics/tree/master/spec/ics-009-loopback-client) subpackage + * [ICS 020 - Fungible Token Transfer](https://github.com/cosmos/ics/tree/master/spec/ics-020-fungible-token-transfer) subpackage + * [ICS 023 - Vector Commitments](https://github.com/cosmos/ics/tree/master/spec/ics-023-vector-commitments) subpackage + * [ICS 024 - Host State Machine Requirements](https://github.com/cosmos/ics/tree/master/spec/ics-024-host-requirements) subpackage + * (x/ibc) [\#6374](https://github.com/cosmos/cosmos-sdk/pull/6374) ICS-23 Verify functions will now accept and verify ics23 CommitmentProofs exclusively + * (x/params) [\#6005](https://github.com/cosmos/cosmos-sdk/pull/6005) Add new CLI command for querying raw x/params parameters by subspace and key. ### Bug Fixes -* __Baseapp / Client / REST__ - * (client) [\#5964](https://github.com/cosmos/cosmos-sdk/issues/5964) `--trust-node` is now false by default - for real. Users must ensure it is set to true if they don't want to enable the verifier. - * (client) [\#6402](https://github.com/cosmos/cosmos-sdk/issues/6402) Fix `keys add` `--algo` flag which only worked for Tendermint's `secp256k1` default key signing algorithm. - * (client) [\#7699](https://github.com/cosmos/cosmos-sdk/pull/7699) Fix panic in context when setting invalid nodeURI. `WithNodeURI` does not set the `Client` in the context. - * (export) [\#6510](https://github.com/cosmos/cosmos-sdk/pull/6510/) Field TimeIotaMs now is included in genesis file while exporting. - * (rest) [\#5906](https://github.com/cosmos/cosmos-sdk/pull/5906) Fix an issue that make some REST calls panic when sending invalid or incomplete requests. - * (crypto) [\#7966](https://github.com/cosmos/cosmos-sdk/issues/7966) `Bip44Params` `String()` function now correctly +* **Baseapp / Client / REST** + * (client) [\#5964](https://github.com/cosmos/cosmos-sdk/issues/5964) `--trust-node` is now false by default - for real. Users must ensure it is set to true if they don't want to enable the verifier. + * (client) [\#6402](https://github.com/cosmos/cosmos-sdk/issues/6402) Fix `keys add` `--algo` flag which only worked for Tendermint's `secp256k1` default key signing algorithm. + * (client) [\#7699](https://github.com/cosmos/cosmos-sdk/pull/7699) Fix panic in context when setting invalid nodeURI. `WithNodeURI` does not set the `Client` in the context. + * (export) [\#6510](https://github.com/cosmos/cosmos-sdk/pull/6510/) Field TimeIotaMs now is included in genesis file while exporting. + * (rest) [\#5906](https://github.com/cosmos/cosmos-sdk/pull/5906) Fix an issue that make some REST calls panic when sending invalid or incomplete requests. + * (crypto) [\#7966](https://github.com/cosmos/cosmos-sdk/issues/7966) `Bip44Params` `String()` function now correctly returns the absolute HD path by adding the `m/` prefix. - * (crypto/keyring) [\#5844](https://github.com/cosmos/cosmos-sdk/pull/5844) `Keyring.Sign()` methods no longer decode amino signatures when method receivers + * (crypto/keyring) [\#5844](https://github.com/cosmos/cosmos-sdk/pull/5844) `Keyring.Sign()` methods no longer decode amino signatures when method receivers are offline/multisig keys. - * (store) [\#7415](https://github.com/cosmos/cosmos-sdk/pull/7415) Allow new stores to be registered during on-chain upgrades. -* __Modules__ - * (modules) [\#5569](https://github.com/cosmos/cosmos-sdk/issues/5569) `InitGenesis`, for the relevant modules, now ensures module accounts exist. - * (x/auth) [\#5892](https://github.com/cosmos/cosmos-sdk/pull/5892) Add `RegisterKeyTypeCodec` to register new + * (store) [\#7415](https://github.com/cosmos/cosmos-sdk/pull/7415) Allow new stores to be registered during on-chain upgrades. +* **Modules** + * (modules) [\#5569](https://github.com/cosmos/cosmos-sdk/issues/5569) `InitGenesis`, for the relevant modules, now ensures module accounts exist. + * (x/auth) [\#5892](https://github.com/cosmos/cosmos-sdk/pull/5892) Add `RegisterKeyTypeCodec` to register new types (eg. keys) to the `auth` module internal amino codec. - * (x/bank) [\#6536](https://github.com/cosmos/cosmos-sdk/pull/6536) Fix bug in `WriteGeneratedTxResponse` function used by multiple + * (x/bank) [\#6536](https://github.com/cosmos/cosmos-sdk/pull/6536) Fix bug in `WriteGeneratedTxResponse` function used by multiple REST endpoints. Now it writes a Tx in StdTx format. - * (x/genutil) [\#5938](https://github.com/cosmos/cosmos-sdk/pull/5938) Fix `InitializeNodeValidatorFiles` error handling. - * (x/gentx) [\#8183](https://github.com/cosmos/cosmos-sdk/pull/8183) change gentx cmd amount to arg from flag - * (x/gov) [#7641](https://github.com/cosmos/cosmos-sdk/pull/7641) Fix tally calculation precision error. - * (x/staking) [\#6529](https://github.com/cosmos/cosmos-sdk/pull/6529) Export validator addresses (previously was empty). - * (x/staking) [\#5949](https://github.com/cosmos/cosmos-sdk/pull/5949) Skip staking `HistoricalInfoKey` in simulations as headers are not exported. - * (x/staking) [\#6061](https://github.com/cosmos/cosmos-sdk/pull/6061) Allow a validator to immediately unjail when no signing info is present due to + * (x/genutil) [\#5938](https://github.com/cosmos/cosmos-sdk/pull/5938) Fix `InitializeNodeValidatorFiles` error handling. + * (x/gentx) [\#8183](https://github.com/cosmos/cosmos-sdk/pull/8183) change gentx cmd amount to arg from flag + * (x/gov) [#7641](https://github.com/cosmos/cosmos-sdk/pull/7641) Fix tally calculation precision error. + * (x/staking) [\#6529](https://github.com/cosmos/cosmos-sdk/pull/6529) Export validator addresses (previously was empty). + * (x/staking) [\#5949](https://github.com/cosmos/cosmos-sdk/pull/5949) Skip staking `HistoricalInfoKey` in simulations as headers are not exported. + * (x/staking) [\#6061](https://github.com/cosmos/cosmos-sdk/pull/6061) Allow a validator to immediately unjail when no signing info is present due to falling below their minimum self-delegation and never having been bonded. The validator may immediately unjail once they've met their minimum self-delegation. -* __General__ - * (types) [\#7038](https://github.com/cosmos/cosmos-sdk/issues/7038) Fix infinite looping of `ApproxRoot` by including a hard-coded maximum iterations limit of 100. - * (types) [\#7084](https://github.com/cosmos/cosmos-sdk/pull/7084) Fix panic when calling `BigInt()` on an uninitialized `Int`. - * (simulation) [\#7129](https://github.com/cosmos/cosmos-sdk/issues/7129) Fix support for custom `Account` and key types on auth's simulation. - +* **General** + * (types) [\#7038](https://github.com/cosmos/cosmos-sdk/issues/7038) Fix infinite looping of `ApproxRoot` by including a hard-coded maximum iterations limit of 100. + * (types) [\#7084](https://github.com/cosmos/cosmos-sdk/pull/7084) Fix panic when calling `BigInt()` on an uninitialized `Int`. + * (simulation) [\#7129](https://github.com/cosmos/cosmos-sdk/issues/7129) Fix support for custom `Account` and key types on auth's simulation. ### Improvements -* __Baseapp / Client / REST__ - * (baseapp) [\#6186](https://github.com/cosmos/cosmos-sdk/issues/6186) Support emitting events during `AnteHandler` execution. - * (baseapp) [\#6053](https://github.com/cosmos/cosmos-sdk/pull/6053) Customizable panic recovery handling added for `app.runTx()` method (as proposed in the [ADR 22](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-022-custom-panic-handling.md)). Adds ability for developers to register custom panic handlers extending standard ones. - * (client) [\#5810](https://github.com/cosmos/cosmos-sdk/pull/5810) Added a new `--offline` flag that allows commands to be executed without an + +* **Baseapp / Client / REST** + * (baseapp) [\#6186](https://github.com/cosmos/cosmos-sdk/issues/6186) Support emitting events during `AnteHandler` execution. + * (baseapp) [\#6053](https://github.com/cosmos/cosmos-sdk/pull/6053) Customizable panic recovery handling added for `app.runTx()` method (as proposed in the [ADR 22](https://github.com/cosmos/cosmos-sdk/blob/master/docs/architecture/adr-022-custom-panic-handling.md)). Adds ability for developers to register custom panic handlers extending standard ones. + * (client) [\#5810](https://github.com/cosmos/cosmos-sdk/pull/5810) Added a new `--offline` flag that allows commands to be executed without an internet connection. Previously, `--generate-only` served this purpose in addition to only allowing txs to be generated. Now, `--generate-only` solely allows txs to be generated without being broadcasted and disallows Keybase use and `--offline` allows the use of Keybase but does not allow any functionality that requires an online connection. - * (cli) [#7764](https://github.com/cosmos/cosmos-sdk/pull/7764) Update x/banking and x/crisis InitChain to improve node startup time - * (client) [\#5856](https://github.com/cosmos/cosmos-sdk/pull/5856) Added the possibility to set `--offline` flag with config command. - * (client) [\#5895](https://github.com/cosmos/cosmos-sdk/issues/5895) show config options in the config command's help screen. - * (client/keys) [\#8043](https://github.com/cosmos/cosmos-sdk/pull/8043) Add support for export of unarmored private key - * (client/tx) [\#7801](https://github.com/cosmos/cosmos-sdk/pull/7801) Update sign-batch multisig to work online - * (x/genutil) [\#8099](https://github.com/cosmos/cosmos-sdk/pull/8099) `init` now supports a `--recover` flag to recover + * (cli) [#7764](https://github.com/cosmos/cosmos-sdk/pull/7764) Update x/banking and x/crisis InitChain to improve node startup time + * (client) [\#5856](https://github.com/cosmos/cosmos-sdk/pull/5856) Added the possibility to set `--offline` flag with config command. + * (client) [\#5895](https://github.com/cosmos/cosmos-sdk/issues/5895) show config options in the config command's help screen. + * (client/keys) [\#8043](https://github.com/cosmos/cosmos-sdk/pull/8043) Add support for export of unarmored private key + * (client/tx) [\#7801](https://github.com/cosmos/cosmos-sdk/pull/7801) Update sign-batch multisig to work online + * (x/genutil) [\#8099](https://github.com/cosmos/cosmos-sdk/pull/8099) `init` now supports a `--recover` flag to recover the private validator key from a given mnemonic -* __Modules__ - * (x/auth) [\#5702](https://github.com/cosmos/cosmos-sdk/pull/5702) Add parameter querying support for `x/auth`. - * (x/auth/ante) [\#6040](https://github.com/cosmos/cosmos-sdk/pull/6040) `AccountKeeper` interface used for `NewAnteHandler` and handler's decorators to add support of using custom `AccountKeeper` implementations. - * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Tendermint Consensus parameters can now be changed via parameter change proposals through `x/gov`. - * (x/evidence) [\#5961](https://github.com/cosmos/cosmos-sdk/issues/5961) Add `StoreDecoder` simulation for evidence module. - * (x/ibc) [\#5948](https://github.com/cosmos/cosmos-sdk/issues/5948) Add `InitGenesis` and `ExportGenesis` functions for `ibc` module. - * (x/ibc-transfer) [\#6871](https://github.com/cosmos/cosmos-sdk/pull/6871) Implement [ADR 001 - Coin Source Tracing](./docs/architecture/adr-001-coin-source-tracing.md). - * (x/staking) [\#6059](https://github.com/cosmos/cosmos-sdk/pull/6059) Updated `HistoricalEntries` parameter default to 100. - * (x/staking) [\#5584](https://github.com/cosmos/cosmos-sdk/pull/5584) Add util function `ToTmValidator` that converts a `staking.Validator` type to `*tmtypes.Validator`. - * (x/staking) [\#6163](https://github.com/cosmos/cosmos-sdk/pull/6163) CLI and REST call to unbonding delegations and delegations now accept +* **Modules** + * (x/auth) [\#5702](https://github.com/cosmos/cosmos-sdk/pull/5702) Add parameter querying support for `x/auth`. + * (x/auth/ante) [\#6040](https://github.com/cosmos/cosmos-sdk/pull/6040) `AccountKeeper` interface used for `NewAnteHandler` and handler's decorators to add support of using custom `AccountKeeper` implementations. + * (x/evidence) [\#5952](https://github.com/cosmos/cosmos-sdk/pull/5952) Tendermint Consensus parameters can now be changed via parameter change proposals through `x/gov`. + * (x/evidence) [\#5961](https://github.com/cosmos/cosmos-sdk/issues/5961) Add `StoreDecoder` simulation for evidence module. + * (x/ibc) [\#5948](https://github.com/cosmos/cosmos-sdk/issues/5948) Add `InitGenesis` and `ExportGenesis` functions for `ibc` module. + * (x/ibc-transfer) [\#6871](https://github.com/cosmos/cosmos-sdk/pull/6871) Implement [ADR 001 - Coin Source Tracing](./docs/architecture/adr-001-coin-source-tracing.md). + * (x/staking) [\#6059](https://github.com/cosmos/cosmos-sdk/pull/6059) Updated `HistoricalEntries` parameter default to 100. + * (x/staking) [\#5584](https://github.com/cosmos/cosmos-sdk/pull/5584) Add util function `ToTmValidator` that converts a `staking.Validator` type to `*tmtypes.Validator`. + * (x/staking) [\#6163](https://github.com/cosmos/cosmos-sdk/pull/6163) CLI and REST call to unbonding delegations and delegations now accept pagination. - * (x/staking) [\#8178](https://github.com/cosmos/cosmos-sdk/pull/8178) Update default historical header number for stargate -* __General__ - * (crypto) [\#7987](https://github.com/cosmos/cosmos-sdk/pull/7987) Fix the inconsistency of CryptoCdc, only use + * (x/staking) [\#8178](https://github.com/cosmos/cosmos-sdk/pull/8178) Update default historical header number for stargate +* **General** + * (crypto) [\#7987](https://github.com/cosmos/cosmos-sdk/pull/7987) Fix the inconsistency of CryptoCdc, only use `codec/legacy.Cdc`. - * (logging) [\#8072](https://github.com/cosmos/cosmos-sdk/pull/8072) Refactor logging: - * Use [zerolog](https://github.com/rs/zerolog) over Tendermint's go-kit logging wrapper. - * Introduce Tendermint's `--log_format=plain|json` flag. Using format `json` allows for emitting structured JSON + * (logging) [\#8072](https://github.com/cosmos/cosmos-sdk/pull/8072) Refactor logging: + * Use [zerolog](https://github.com/rs/zerolog) over Tendermint's go-kit logging wrapper. + * Introduce Tendermint's `--log_format=plain|json` flag. Using format `json` allows for emitting structured JSON logs which can be consumed by an external logging facility (e.g. Loggly). Both formats log to STDERR. - * The existing `--log_level` flag and it's default value now solely relates to the global logging + * The existing `--log_level` flag and it's default value now solely relates to the global logging level (e.g. `info`, `debug`, etc...) instead of `:`. - * (rest) [#7649](https://github.com/cosmos/cosmos-sdk/pull/7649) Return an unsigned tx in legacy GET /tx endpoint when signature conversion fails - * (simulation) [\#6002](https://github.com/cosmos/cosmos-sdk/pull/6002) Add randomized consensus params into simulation. - * (store) [\#6481](https://github.com/cosmos/cosmos-sdk/pull/6481) Move `SimpleProofsFromMap` from Tendermint into the SDK. - * (store) [\#6719](https://github.com/cosmos/cosmos-sdk/6754) Add validity checks to stores for nil and empty keys. - * (SDK) Updated dependencies - * Updated iavl dependency to v0.15.3 - * Update tendermint to v0.34.1 - * (types) [\#7027](https://github.com/cosmos/cosmos-sdk/pull/7027) `Coin(s)` and `DecCoin(s)` updates: - * Bump denomination max length to 128 - * Allow uppercase letters and numbers in denominations to support [ADR 001](./docs/architecture/adr-001-coin-source-tracing.md) - * Added `Validate` function that returns a descriptive error - * (types) [\#5581](https://github.com/cosmos/cosmos-sdk/pull/5581) Add convenience functions {,Must}Bech32ifyAddressBytes. - * (types/module) [\#5724](https://github.com/cosmos/cosmos-sdk/issues/5724) The `types/module` package does no longer depend on `x/simulation`. - * (types) [\#5585](https://github.com/cosmos/cosmos-sdk/pull/5585) IBC additions: - * `Coin` denomination max lenght has been increased to 32. - * Added `CapabilityKey` alias for `StoreKey` to match IBC spec. - * (types/rest) [\#5900](https://github.com/cosmos/cosmos-sdk/pull/5900) Add Check*Error function family to spare developers from replicating tons of boilerplate code. - * (types) [\#6128](https://github.com/cosmos/cosmos-sdk/pull/6137) Add `String()` method to `GasMeter`. - * (types) [\#6195](https://github.com/cosmos/cosmos-sdk/pull/6195) Add codespace to broadcast(sync/async) response. - * (types) \#6897 Add KV type from tendermint to `types` directory. - * (version) [\#7848](https://github.com/cosmos/cosmos-sdk/pull/7848) [\#7941](https://github.com/cosmos/cosmos-sdk/pull/7941) + * (rest) [#7649](https://github.com/cosmos/cosmos-sdk/pull/7649) Return an unsigned tx in legacy GET /tx endpoint when signature conversion fails + * (simulation) [\#6002](https://github.com/cosmos/cosmos-sdk/pull/6002) Add randomized consensus params into simulation. + * (store) [\#6481](https://github.com/cosmos/cosmos-sdk/pull/6481) Move `SimpleProofsFromMap` from Tendermint into the SDK. + * (store) [\#6719](https://github.com/cosmos/cosmos-sdk/6754) Add validity checks to stores for nil and empty keys. + * (SDK) Updated dependencies + * Updated iavl dependency to v0.15.3 + * Update tendermint to v0.34.1 + * (types) [\#7027](https://github.com/cosmos/cosmos-sdk/pull/7027) `Coin(s)` and `DecCoin(s)` updates: + * Bump denomination max length to 128 + * Allow uppercase letters and numbers in denominations to support [ADR 001](./docs/architecture/adr-001-coin-source-tracing.md) + * Added `Validate` function that returns a descriptive error + * (types) [\#5581](https://github.com/cosmos/cosmos-sdk/pull/5581) Add convenience functions {,Must}Bech32ifyAddressBytes. + * (types/module) [\#5724](https://github.com/cosmos/cosmos-sdk/issues/5724) The `types/module` package does no longer depend on `x/simulation`. + * (types) [\#5585](https://github.com/cosmos/cosmos-sdk/pull/5585) IBC additions: + * `Coin` denomination max lenght has been increased to 32. + * Added `CapabilityKey` alias for `StoreKey` to match IBC spec. + * (types/rest) [\#5900](https://github.com/cosmos/cosmos-sdk/pull/5900) Add Check*Error function family to spare developers from replicating tons of boilerplate code. + * (types) [\#6128](https://github.com/cosmos/cosmos-sdk/pull/6137) Add `String()` method to `GasMeter`. + * (types) [\#6195](https://github.com/cosmos/cosmos-sdk/pull/6195) Add codespace to broadcast(sync/async) response. + * (types) \#6897 Add KV type from tendermint to `types` directory. + * (version) [\#7848](https://github.com/cosmos/cosmos-sdk/pull/7848) [\#7941](https://github.com/cosmos/cosmos-sdk/pull/7941) `version --long` output now shows the list of build dependencies and replaced build dependencies. ## [v0.39.1](https://github.com/cosmos/cosmos-sdk/releases/tag/v0.39.1) - 2020-08-11 @@ -872,8 +876,8 @@ falling below their minimum self-delegation and never having been bonded. The va * (deps) Bump IAVL version to [v0.14.0](https://github.com/cosmos/iavl/releases/tag/v0.14.0) * (client) [\#5585](https://github.com/cosmos/cosmos-sdk/pull/5585) `CLIContext` additions: - * Introduce `QueryABCI` that returns the full `abci.ResponseQuery` with inclusion Merkle proofs. - * Added `prove` flag for Merkle proof verification. + * Introduce `QueryABCI` that returns the full `abci.ResponseQuery` with inclusion Merkle proofs. + * Added `prove` flag for Merkle proof verification. * (x/staking) [\#6791)](https://github.com/cosmos/cosmos-sdk/pull/6791) Close {UBDQueue,RedelegationQueu}Iterator once used. ### API Breaking Changes @@ -935,8 +939,8 @@ respectively, and the latter defines the height interval in which versions are d ### Improvements * (rest) [\#5648](https://github.com/cosmos/cosmos-sdk/pull/5648) Enhance /txs usability: - * Add `tx.minheight` key to filter transaction with an inclusive minimum block height - * Add `tx.maxheight` key to filter transaction with an inclusive maximum block height + * Add `tx.minheight` key to filter transaction with an inclusive minimum block height + * Add `tx.maxheight` key to filter transaction with an inclusive maximum block height * (crypto/keys) [\#5739](https://github.com/cosmos/cosmos-sdk/pull/5739) Print an error message if the password input failed. ## [v0.38.1] - 2020-02-11 @@ -980,13 +984,13 @@ logic has been implemented for v0.38 target version. Applications can migrate vi to `...DecCoin`, `Coins#Add` parameter changed from `Coins` to `...Coin`. * (baseapp/types) [\#5421](https://github.com/cosmos/cosmos-sdk/pull/5421) The `Error` interface (`types/errors.go`) has been removed in favor of the concrete type defined in `types/errors/` which implements the standard `error` interface. - * As a result, the `Handler` and `Querier` implementations now return a standard `error`. + * As a result, the `Handler` and `Querier` implementations now return a standard `error`. Within `BaseApp`, `runTx` now returns a `(GasInfo, *Result, error)` tuple and `runMsgs` returns a `(*Result, error)` tuple. A reference to a `Result` is now used to indicate success whereas an error signals an invalid message or failed message execution. As a result, the fields `Code`, `Codespace`, `GasWanted`, and `GasUsed` have been removed the `Result` type. The latter two fields are now found in the `GasInfo` type which is always returned regardless of execution outcome. - * Note to developers: Since all handlers and queriers must now return a standard `error`, the `types/errors/` + * Note to developers: Since all handlers and queriers must now return a standard `error`, the `types/errors/` package contains all the relevant and pre-registered errors that you typically work with. A typical error returned will look like `sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "...")`. You can retrieve relevant ABCI information from the error via `ABCIInfo`. @@ -996,21 +1000,21 @@ components can be imported directly from the packages. now requires a `SetInterBlockCache` method. Applications that do not wish to support this can simply have this method perform a no-op. * (modules) [\#4665](https://github.com/cosmos/cosmos-sdk/issues/4665) Refactored `x/gov` module structure and dev-UX: - * Prepare for module spec integration - * Update gov keys to use big endian encoding instead of little endian + * Prepare for module spec integration + * Update gov keys to use big endian encoding instead of little endian * (modules) [\#5017](https://github.com/cosmos/cosmos-sdk/pull/5017) The `x/genaccounts` module has been deprecated and all components removed except the `legacy/` package. * [\#4486](https://github.com/cosmos/cosmos-sdk/issues/4486) Vesting account types decoupled from the `x/auth` module and now live under `x/auth/vesting`. Applications wishing to use vesting account types must be sure to register types via `RegisterCodec` under the new vesting package. * [\#4486](https://github.com/cosmos/cosmos-sdk/issues/4486) The `NewBaseVestingAccount` constructor returns an error if the provided arguments are invalid. * (x/auth) [\#5006](https://github.com/cosmos/cosmos-sdk/pull/5006) Modular `AnteHandler` via composable decorators: - * The `AnteHandler` interface now returns `(newCtx Context, err error)` instead of `(newCtx Context, result sdk.Result, abort bool)` - * The `NewAnteHandler` function returns an `AnteHandler` function that returns the new `AnteHandler` + * The `AnteHandler` interface now returns `(newCtx Context, err error)` instead of `(newCtx Context, result sdk.Result, abort bool)` + * The `NewAnteHandler` function returns an `AnteHandler` function that returns the new `AnteHandler` interface and has been moved into the `auth/ante` directory. - * `ValidateSigCount`, `ValidateMemo`, `ProcessPubKey`, `EnsureSufficientMempoolFee`, and `GetSignBytes` + * `ValidateSigCount`, `ValidateMemo`, `ProcessPubKey`, `EnsureSufficientMempoolFee`, and `GetSignBytes` have all been removed as public functions. - * Invalid Signatures may return `InvalidPubKey` instead of `Unauthorized` error, since the transaction + * Invalid Signatures may return `InvalidPubKey` instead of `Unauthorized` error, since the transaction will first hit `SetPubKeyDecorator` before the `SigVerificationDecorator` runs. - * `StdTx#GetSignatures` will return an array of just signature byte slices `[][]byte` instead of + * `StdTx#GetSignatures` will return an array of just signature byte slices `[][]byte` instead of returning an array of `StdSignature` structs. To replicate the old behavior, use the public field `StdTx.Signatures` to get back the array of StdSignatures `[]StdSignature`. * (modules) [\#5299](https://github.com/cosmos/cosmos-sdk/pull/5299) `HandleDoubleSign` along with params `MaxEvidenceAge` and `DoubleSignJailEndTime` have moved from the `x/slashing` module to the `x/evidence` module. @@ -1020,13 +1024,13 @@ these options to be set on the commands or ignored to default to previous behavi * [\#5547](https://github.com/cosmos/cosmos-sdk/pull/5547) `NewKeyBaseFromHomeFlag` constructor has been removed. * [\#5439](https://github.com/cosmos/cosmos-sdk/pull/5439) Further modularization was done to the `keybase` package to make it more suitable for use with different key formats and algorithms: - * The `WithKeygenFunc` function added as a `KeybaseOption` which allows a custom bytes to key + * The `WithKeygenFunc` function added as a `KeybaseOption` which allows a custom bytes to key implementation to be defined when keys are created. - * The `WithDeriveFunc` function added as a `KeybaseOption` allows custom logic for deriving a key + * The `WithDeriveFunc` function added as a `KeybaseOption` allows custom logic for deriving a key from a mnemonic, bip39 password, and HD Path. - * BIP44 is no longer build into `keybase.CreateAccount()`. It is however the default when using + * BIP44 is no longer build into `keybase.CreateAccount()`. It is however the default when using the `client/keys` add command. - * `SupportedAlgos` and `SupportedAlgosLedger` functions return a slice of `SigningAlgo`s that are + * `SupportedAlgos` and `SupportedAlgosLedger` functions return a slice of `SigningAlgo`s that are supported by the keybase and the ledger integration respectively. * (simapp) [\#5419](https://github.com/cosmos/cosmos-sdk/pull/5419) The `helpers.GenTx()` now accepts a gas argument. * (baseapp) [\#5455](https://github.com/cosmos/cosmos-sdk/issues/5455) A `sdk.Context` is now passed into the `router.Route()` function. @@ -1051,9 +1055,9 @@ increased significantly due to modular `AnteHandler` support. Increase GasLimit longer panics if the store to load contains substores that we didn't explicitly mount. * [\#4972](https://github.com/cosmos/cosmos-sdk/issues/4972) A `TxResponse` with a corresponding code and tx hash will be returned for specific Tendermint errors: - * `CodeTxInMempoolCache` - * `CodeMempoolIsFull` - * `CodeTxTooLarge` + * `CodeTxInMempoolCache` + * `CodeMempoolIsFull` + * `CodeTxTooLarge` * [\#3872](https://github.com/cosmos/cosmos-sdk/issues/3872) Implement a RESTful endpoint and cli command to decode transactions. * (keys) [\#4754](https://github.com/cosmos/cosmos-sdk/pull/4754) Introduce new Keybase implementation that can leverage operating systems' built-in functionalities to securely store secrets. MacOS users may encounter @@ -1063,11 +1067,11 @@ upgrade via: `sudo rm -rf /Library/Developer/CommandLineTools; xcode-select --in correct version via: `pkgutil --pkg-info=com.apple.pkg.CLTools_Executables`. * [\#5355](https://github.com/cosmos/cosmos-sdk/pull/5355) Client commands accept a new `--keyring-backend` option through which users can specify which backend should be used by the new key store: - * `os`: use OS default credentials storage (default). - * `file`: use encrypted file-based store. - * `kwallet`: use [KDE Wallet](https://utils.kde.org/projects/kwalletmanager/) service. - * `pass`: use the [pass](https://www.passwordstore.org/) command line password manager. - * `test`: use password-less key store. *For testing purposes only. Use it at your own risk.* + * `os`: use OS default credentials storage (default). + * `file`: use encrypted file-based store. + * `kwallet`: use [KDE Wallet](https://utils.kde.org/projects/kwalletmanager/) service. + * `pass`: use the [pass](https://www.passwordstore.org/) command line password manager. + * `test`: use password-less key store. _For testing purposes only. Use it at your own risk._ * (keys) [\#5097](https://github.com/cosmos/cosmos-sdk/pull/5097) New `keys migrate` command to assist users migrate their keys to the new keyring. * (keys) [\#5366](https://github.com/cosmos/cosmos-sdk/pull/5366) `keys list` now accepts a `--list-names` option to list key names only, whilst the `keys delete` @@ -1080,39 +1084,39 @@ that allows for arbitrary vesting periods. * (types) [\#5196](https://github.com/cosmos/cosmos-sdk/pull/5196) Context has new `IsRecheckTx() bool` and `WithIsReCheckTx(bool) Context` methods to to be used in the `AnteHandler`. * (x/auth/ante) [\#5196](https://github.com/cosmos/cosmos-sdk/pull/5196) AnteDecorators have been updated to avoid unnecessary checks when `ctx.IsReCheckTx() == true` * (x/auth) [\#5006](https://github.com/cosmos/cosmos-sdk/pull/5006) Modular `AnteHandler` via composable decorators: - * The `AnteDecorator` interface has been introduced to allow users to implement modular `AnteHandler` + * The `AnteDecorator` interface has been introduced to allow users to implement modular `AnteHandler` functionality that can be composed together to create a single `AnteHandler` rather than implementing a custom `AnteHandler` completely from scratch, where each `AnteDecorator` allows for custom behavior in tightly defined and logically isolated manner. These custom `AnteDecorator` can then be chained together with default `AnteDecorator` or third-party `AnteDecorator` to create a modularized `AnteHandler` which will run each `AnteDecorator` in the order specified in `ChainAnteDecorators`. For details on the new architecture, refer to the [ADR](docs/architecture/adr-010-modular-antehandler.md). - * `ChainAnteDecorators` function has been introduced to take in a list of `AnteDecorators` and chain + * `ChainAnteDecorators` function has been introduced to take in a list of `AnteDecorators` and chain them in sequence and return a single `AnteHandler`: - * `SetUpContextDecorator`: Sets `GasMeter` in context and creates defer clause to recover from any + * `SetUpContextDecorator`: Sets `GasMeter` in context and creates defer clause to recover from any `OutOfGas` panics in future AnteDecorators and return `OutOfGas` error to `BaseApp`. It MUST be the first `AnteDecorator` in the chain for any application that uses gas (or another one that sets the gas meter). - * `ValidateBasicDecorator`: Calls tx.ValidateBasic and returns any non-nil error. - * `ValidateMemoDecorator`: Validates tx memo with application parameters and returns any non-nil error. - * `ConsumeGasTxSizeDecorator`: Consumes gas proportional to the tx size based on application parameters. - * `MempoolFeeDecorator`: Checks if fee is above local mempool `minFee` parameter during `CheckTx`. - * `DeductFeeDecorator`: Deducts the `FeeAmount` from first signer of the transaction. - * `SetPubKeyDecorator`: Sets pubkey of account in any account that does not already have pubkey saved in state machine. - * `SigGasConsumeDecorator`: Consume parameter-defined amount of gas for each signature. - * `SigVerificationDecorator`: Verify each signature is valid, return if there is an error. - * `ValidateSigCountDecorator`: Validate the number of signatures in tx based on app-parameters. - * `IncrementSequenceDecorator`: Increments the account sequence for each signer to prevent replay attacks. + * `ValidateBasicDecorator`: Calls tx.ValidateBasic and returns any non-nil error. + * `ValidateMemoDecorator`: Validates tx memo with application parameters and returns any non-nil error. + * `ConsumeGasTxSizeDecorator`: Consumes gas proportional to the tx size based on application parameters. + * `MempoolFeeDecorator`: Checks if fee is above local mempool `minFee` parameter during `CheckTx`. + * `DeductFeeDecorator`: Deducts the `FeeAmount` from first signer of the transaction. + * `SetPubKeyDecorator`: Sets pubkey of account in any account that does not already have pubkey saved in state machine. + * `SigGasConsumeDecorator`: Consume parameter-defined amount of gas for each signature. + * `SigVerificationDecorator`: Verify each signature is valid, return if there is an error. + * `ValidateSigCountDecorator`: Validate the number of signatures in tx based on app-parameters. + * `IncrementSequenceDecorator`: Increments the account sequence for each signer to prevent replay attacks. * (cli) [\#5223](https://github.com/cosmos/cosmos-sdk/issues/5223) Cosmos Ledger App v2.0.0 is now supported. The changes are backwards compatible and App v1.5.x is still supported. * (x/staking) [\#5380](https://github.com/cosmos/cosmos-sdk/pull/5380) Introduced ability to store historical info entries in staking keeper, allows applications to introspect specified number of past headers and validator sets - * Introduces new parameter `HistoricalEntries` which allows applications to determine how many recent historical info entries they want to persist in store. Default value is 0. - * Introduces cli commands and rest routes to query historical information at a given height + * Introduces new parameter `HistoricalEntries` which allows applications to determine how many recent historical info entries they want to persist in store. Default value is 0. + * Introduces cli commands and rest routes to query historical information at a given height * (modules) [\#5249](https://github.com/cosmos/cosmos-sdk/pull/5249) Funds are now allowed to be directly sent to the community pool (via the distribution module account). * (keys) [\#4941](https://github.com/cosmos/cosmos-sdk/issues/4941) Introduce keybase option to allow overriding the default private key implementation of a key generated through the `keys add` cli command. * (keys) [\#5439](https://github.com/cosmos/cosmos-sdk/pull/5439) Flags `--algo` and `--hd-path` are added to `keys add` command in order to make use of keybase modularized. By default, it uses (0, 0) bip44 HD path and secp256k1 keys, so is non-breaking. * (types) [\#5447](https://github.com/cosmos/cosmos-sdk/pull/5447) Added `ApproxRoot` function to sdk.Decimal type in order to get the nth root for a decimal number, where n is a positive integer. - * An `ApproxSqrt` function was also added for convenience around the common case of n=2. + * An `ApproxSqrt` function was also added for convenience around the common case of n=2. ### Improvements @@ -1122,6 +1126,7 @@ has been moved to the configuration file, to allow easier node configuration. * (cli) [\#5116](https://github.com/cosmos/cosmos-sdk/issues/5116) The `CLIContext` now supports multiple verifiers when connecting to multiple chains. The connecting chain's `CLIContext` will have to have the correct chain ID and node URI or client set. To use a `CLIContext` with a verifier for another chain: + ```go // main or parent chain (chain as if you're running without IBC) mainCtx := context.NewCLIContext() @@ -1135,6 +1140,7 @@ chain ID and node URI or client set. To use a `CLIContext` with a verifier for a context.CreateVerifier(sideCtx, context.DefaultVerifierCacheSize), ) ``` + * (modules) [\#5017](https://github.com/cosmos/cosmos-sdk/pull/5017) The `x/auth` package now supports generalized genesis accounts through the `GenesisAccount` interface. * (modules) [\#4762](https://github.com/cosmos/cosmos-sdk/issues/4762) Deprecate remove and add permissions in ModuleAccount. @@ -1148,22 +1154,22 @@ generalized genesis accounts through the `GenesisAccount` interface. * (simulation) [\#4824](https://github.com/cosmos/cosmos-sdk/issues/4824) `PrintAllInvariants` flag will print all failed invariants * (simulation) [\#4490](https://github.com/cosmos/cosmos-sdk/issues/4490) add `InitialBlockHeight` flag to resume a simulation from a given block - * Support exporting the simulation stats to a given JSON file + * Support exporting the simulation stats to a given JSON file * (simulation) [\#4847](https://github.com/cosmos/cosmos-sdk/issues/4847), [\#4838](https://github.com/cosmos/cosmos-sdk/pull/4838) and [\#4869](https://github.com/cosmos/cosmos-sdk/pull/4869) `SimApp` and simulation refactors: - * Implement `SimulationManager` for executing modules' simulation functionalities in a modularized way - * Add `RegisterStoreDecoders` to the `SimulationManager` for decoding each module's types - * Add `GenerateGenesisStates` to the `SimulationManager` to generate a randomized `GenState` for each module - * Add `RandomizedParams` to the `SimulationManager` that registers each modules' parameters in order to + * Implement `SimulationManager` for executing modules' simulation functionalities in a modularized way + * Add `RegisterStoreDecoders` to the `SimulationManager` for decoding each module's types + * Add `GenerateGenesisStates` to the `SimulationManager` to generate a randomized `GenState` for each module + * Add `RandomizedParams` to the `SimulationManager` that registers each modules' parameters in order to simulate `ParamChangeProposal`s' `Content`s - * Add `WeightedOperations` to the `SimulationManager` that define simulation operations (modules' `Msg`s) with their + * Add `WeightedOperations` to the `SimulationManager` that define simulation operations (modules' `Msg`s) with their respective weights (i.e chance of being simulated). - * Add `ProposalContents` to the `SimulationManager` to register each module's governance proposal `Content`s. + * Add `ProposalContents` to the `SimulationManager` to register each module's governance proposal `Content`s. * (simulation) [\#4893](https://github.com/cosmos/cosmos-sdk/issues/4893) Change `SimApp` keepers to be public and add getter functions for keys and codec * (simulation) [\#4906](https://github.com/cosmos/cosmos-sdk/issues/4906) Add simulation `Config` struct that wraps simulation flags * (simulation) [\#4935](https://github.com/cosmos/cosmos-sdk/issues/4935) Update simulation to reflect a proper `ABCI` application without bypassing `BaseApp` semantics * (simulation) [\#5378](https://github.com/cosmos/cosmos-sdk/pull/5378) Simulation tests refactor: - * Add `App` interface for general SDK-based app's methods. - * Refactor and cleanup simulation tests into util functions to simplify their implementation for other SDK apps. + * Add `App` interface for general SDK-based app's methods. + * Refactor and cleanup simulation tests into util functions to simplify their implementation for other SDK apps. * (store) [\#4792](https://github.com/cosmos/cosmos-sdk/issues/4792) panic on non-registered store * (types) [\#4821](https://github.com/cosmos/cosmos-sdk/issues/4821) types/errors package added with support for stacktraces. It is meant as a more feature-rich replacement for sdk.Errors in the mid-term. * (store) [\#1947](https://github.com/cosmos/cosmos-sdk/issues/1947) Implement inter-block (persistent) @@ -1172,12 +1178,12 @@ must set it in their app via a `BaseApp` option. The `BaseApp` docs have been dr to detail this new feature and how state transitions occur. * (docs/spec) All module specs moved into their respective module dir in x/ (i.e. docs/spec/staking -->> x/staking/spec) * (docs/) [\#5379](https://github.com/cosmos/cosmos-sdk/pull/5379) Major documentation refactor, including: - * (docs/intro/) Add and improve introduction material for newcomers. - * (docs/basics/) Add documentation about basic concepts of the cosmos sdk such as the anatomy of an SDK application, the transaction lifecycle or accounts. - * (docs/core/) Add documentation about core conepts of the cosmos sdk such as `baseapp`, `server`, `store`s, `context` and more. - * (docs/building-modules/) Add reference documentation on concepts relevant for module developers (`keeper`, `handler`, `messages`, `queries`,...). - * (docs/interfaces/) Add documentation on building interfaces for the Cosmos SDK. - * Redesigned user interface that features new dynamically generated sidebar, build-time code embedding from GitHub, new homepage as well as many other improvements. + * (docs/intro/) Add and improve introduction material for newcomers. + * (docs/basics/) Add documentation about basic concepts of the cosmos sdk such as the anatomy of an SDK application, the transaction lifecycle or accounts. + * (docs/core/) Add documentation about core conepts of the cosmos sdk such as `baseapp`, `server`, `store`s, `context` and more. + * (docs/building-modules/) Add reference documentation on concepts relevant for module developers (`keeper`, `handler`, `messages`, `queries`,...). + * (docs/interfaces/) Add documentation on building interfaces for the Cosmos SDK. + * Redesigned user interface that features new dynamically generated sidebar, build-time code embedding from GitHub, new homepage as well as many other improvements. * (types) [\#5428](https://github.com/cosmos/cosmos-sdk/pull/5428) Add `Mod` (modulo) method and `RelativePow` (exponentation) function for `Uint`. * (modules) [\#5506](https://github.com/cosmos/cosmos-sdk/pull/5506) Remove redundancy in `x/distribution`s use of parameters. There now exists a single `Params` type with a getter and setter along with a getter for each individual parameter. @@ -1196,7 +1202,6 @@ to detail this new feature and how state transitions occur. * (tendermint) Bump Tendermint version to [v0.32.13](https://github.com/tendermint/tendermint/releases/tag/v0.32.13). - ## [v0.37.13] - 2020-06-03 ### Improvements @@ -1240,8 +1245,8 @@ to detail this new feature and how state transitions occur. ### Improvements * (rest) [\#5648](https://github.com/cosmos/cosmos-sdk/pull/5648) Enhance /txs usability: - * Add `tx.minheight` key to filter transaction with an inclusive minimum block height - * Add `tx.maxheight` key to filter transaction with an inclusive maximum block height + * Add `tx.minheight` key to filter transaction with an inclusive minimum block height + * Add `tx.maxheight` key to filter transaction with an inclusive maximum block height ## [v0.37.7] - 2020-02-10 @@ -1333,9 +1338,9 @@ in `TxResponse` is deprecated and will be removed in the next major release. ### Bug Fixes * (baseapp) [\#4903](https://github.com/cosmos/cosmos-sdk/issues/4903) Various height query fixes: - * Move height with proof check from `CLIContext` to `BaseApp` as the height + * Move height with proof check from `CLIContext` to `BaseApp` as the height can automatically be injected there. - * Update `handleQueryStore` to resemble `handleQueryCustom` + * Update `handleQueryStore` to resemble `handleQueryCustom` * (simulation) [\#4912](https://github.com/cosmos/cosmos-sdk/issues/4912) Fix SimApp ModuleAccountAddrs to properly return black listed addresses for bank keeper initialization. * (cli) [\#4919](https://github.com/cosmos/cosmos-sdk/pull/4919) Don't crash CLI @@ -1359,20 +1364,20 @@ that error is that the account doesn't exist. * All REST responses now wrap the original resource/result. The response will contain two fields: height and result. * [\#3565](https://github.com/cosmos/cosmos-sdk/issues/3565) Updates to the governance module: - * Rename JSON field from `proposal_content` to `content` - * Rename JSON field from `proposal_id` to `id` - * Disable `ProposalTypeSoftwareUpgrade` temporarily + * Rename JSON field from `proposal_content` to `content` + * Rename JSON field from `proposal_id` to `id` + * Disable `ProposalTypeSoftwareUpgrade` temporarily * [\#3775](https://github.com/cosmos/cosmos-sdk/issues/3775) unify sender transaction tag for ease of querying * [\#4255](https://github.com/cosmos/cosmos-sdk/issues/4255) Add supply module that passively tracks the supplies of a chain - - Renamed `x/distribution` `ModuleName` - - Genesis JSON and CLI now use `distribution` instead of `distr` - - Introduce `ModuleAccount` type, which tracks the flow of coins held within a module - - Replaced `FeeCollectorKeeper` for a `ModuleAccount` - - Replaced the staking `Pool`, which coins are now held by the `BondedPool` and `NotBonded` module accounts - - The `NotBonded` module account now only keeps track of the not bonded tokens within staking, instead of the whole chain - - [\#3628](https://github.com/cosmos/cosmos-sdk/issues/3628) Replaced governance's burn and deposit accounts for a `ModuleAccount` - - Added a `ModuleAccount` for the distribution module - - Added a `ModuleAccount` for the mint module + - Renamed `x/distribution` `ModuleName` + - Genesis JSON and CLI now use `distribution` instead of `distr` + - Introduce `ModuleAccount` type, which tracks the flow of coins held within a module + - Replaced `FeeCollectorKeeper` for a `ModuleAccount` + - Replaced the staking `Pool`, which coins are now held by the `BondedPool` and `NotBonded` module accounts + - The `NotBonded` module account now only keeps track of the not bonded tokens within staking, instead of the whole chain + - [\#3628](https://github.com/cosmos/cosmos-sdk/issues/3628) Replaced governance's burn and deposit accounts for a `ModuleAccount` + - Added a `ModuleAccount` for the distribution module + - Added a `ModuleAccount` for the mint module [\#4472](https://github.com/cosmos/cosmos-sdk/issues/4472) validation for crisis genesis * [\#3985](https://github.com/cosmos/cosmos-sdk/issues/3985) `ValidatorPowerRank` uses potential consensus power instead of tendermint power * [\#4104](https://github.com/cosmos/cosmos-sdk/issues/4104) Gaia has been moved to its own repository: https://github.com/cosmos/gaia @@ -1390,22 +1395,22 @@ that error is that the account doesn't exist. * [\#4351](https://github.com/cosmos/cosmos-sdk/issues/4351) InitCmd, AddGenesisAccountCmd, and CollectGenTxsCmd take node's and client's default home directories as arguments. * [\#4387](https://github.com/cosmos/cosmos-sdk/issues/4387) Refactor the usage of tags (now called events) to reflect the new ABCI events semantics: - - Move `x/{module}/tags/tags.go` => `x/{module}/types/events.go` - - Update `docs/specs` - - Refactor tags in favor of new `Event(s)` type(s) - - Update `Context` to use new `EventManager` - - (Begin|End)Blocker no longer return tags, but rather uses new `EventManager` - - Message handlers no longer return tags, but rather uses new `EventManager` + - Move `x/{module}/tags/tags.go` => `x/{module}/types/events.go` + - Update `docs/specs` + - Refactor tags in favor of new `Event(s)` type(s) + - Update `Context` to use new `EventManager` + - (Begin|End)Blocker no longer return tags, but rather uses new `EventManager` + - Message handlers no longer return tags, but rather uses new `EventManager` Any component (e.g. BeginBlocker, message handler, etc...) wishing to emit an event must do so through `ctx.EventManger().EmitEvent(s)`. To reset or wipe emitted events: `ctx = ctx.WithEventManager(sdk.NewEventManager())` To get all emitted events: `events := ctx.EventManager().Events()` * [\#4437](https://github.com/cosmos/cosmos-sdk/issues/4437) Replace governance module store keys to use `[]byte` instead of `string`. * [\#4451](https://github.com/cosmos/cosmos-sdk/issues/4451) Improve modularization of clients and modules: - * Module directory structure improved and standardized - * Aliases autogenerated - * Auth and bank related commands are now mounted under the respective moduels - * Client initialization and mounting standardized + * Module directory structure improved and standardized + * Aliases autogenerated + * Auth and bank related commands are now mounted under the respective moduels + * Client initialization and mounting standardized * [\#4479](https://github.com/cosmos/cosmos-sdk/issues/4479) Remove codec argument redundency in client usage where the CLIContext's codec should be used instead. * [\#4488](https://github.com/cosmos/cosmos-sdk/issues/4488) Decouple client tx, REST, and ultil packages from auth. These packages have @@ -1417,9 +1422,9 @@ that error is that the account doesn't exist. * [\#4543](https://github.com/cosmos/cosmos-sdk/issues/4543) Account getters are no longer part of client.CLIContext() and have now moved to reside in the auth-specific AccountRetriever. * [\#4588](https://github.com/cosmos/cosmos-sdk/issues/4588) Context does not depend on x/auth anymore. client/context is stripped out of the following features: - - GetAccountDecoder() - - CLIContext.WithAccountDecoder() - - CLIContext.WithAccountStore() + - GetAccountDecoder() + - CLIContext.WithAccountDecoder() + - CLIContext.WithAccountStore() x/auth.AccountDecoder is unnecessary and consequently removed. * [\#4602](https://github.com/cosmos/cosmos-sdk/issues/4602) client/input.{Buffer,Override}Stdin() functions are removed. Thanks to cobra's new release they are now redundant. * [\#4633](https://github.com/cosmos/cosmos-sdk/issues/4633) Update old Tx search by tags APIs to use new Events @@ -1427,7 +1432,7 @@ that error is that the account doesn't exist. * [\#4649](https://github.com/cosmos/cosmos-sdk/issues/4649) Refactor x/crisis as per modules new specs. * [\#3685](https://github.com/cosmos/cosmos-sdk/issues/3685) The default signature verification gas logic (`DefaultSigVerificationGasConsumer`) now specifies explicit key types rather than string pattern matching. This means that zones that depended on string matching to allow other keys will need to write a custom `SignatureVerificationGasConsumer` function. * [\#4663](https://github.com/cosmos/cosmos-sdk/issues/4663) Refactor bank keeper by removing private functions - - `InputOutputCoins`, `SetCoins`, `SubtractCoins` and `AddCoins` are now part of the `SendKeeper` instead of the `Keeper` interface + - `InputOutputCoins`, `SetCoins`, `SubtractCoins` and `AddCoins` are now part of the `SendKeeper` instead of the `Keeper` interface * (tendermint) [\#4721](https://github.com/cosmos/cosmos-sdk/pull/4721) Upgrade Tendermint to v0.32.1 ### Features @@ -1462,7 +1467,7 @@ that error is that the account doesn't exist. * (simulation) Add `InitialBlockHeight` flag to resume a simulation from a given block * (simulation) [\#4670](https://github.com/cosmos/cosmos-sdk/issues/4670) Update simulation statistics to JSON format - - Support exporting the simulation stats to a given JSON file + - Support exporting the simulation stats to a given JSON file * [\#4775](https://github.com/cosmos/cosmos-sdk/issues/4775) Refactor CI config * Upgrade IAVL to v0.12.4 * (tendermint) Upgrade Tendermint to v0.32.2 @@ -1580,7 +1585,7 @@ that error is that the account doesn't exist. methods. * [\#4654](https://github.com/cosmos/cosmos-sdk/issues/4654) validator slash event stored by period and height * [\#4681](https://github.com/cosmos/cosmos-sdk/issues/4681) panic on invalid amount on `MintCoins` and `BurnCoins` - * skip minting if inflation is set to zero + * skip minting if inflation is set to zero * Sort state JSON during export and initialization ## 0.35.0 @@ -1764,16 +1769,16 @@ status and pagination query flags. * [\#3808](https://github.com/cosmos/cosmos-sdk/issues/3808) `gaiad` and `gaiacli` integration tests use ./build/ binaries. * \[\#3819](https://github.com/cosmos/cosmos-sdk/issues/3819) Simulation refactor, log output now stored in ~/.gaiad/simulation/ - * Simulation moved to its own module (not a part of mock) - * Logger type instead of passing function variables everywhere - * Logger json output (for reloadable simulation running) - * Cleanup bank simulation messages / remove dup code in bank simulation - * Simulations saved in `~/.gaiad/simulations/` - * "Lean" simulation output option to exclude No-ops and !ok functions (`--SimulationLean` flag) + * Simulation moved to its own module (not a part of mock) + * Logger type instead of passing function variables everywhere + * Logger json output (for reloadable simulation running) + * Cleanup bank simulation messages / remove dup code in bank simulation + * Simulations saved in `~/.gaiad/simulations/` + * "Lean" simulation output option to exclude No-ops and !ok functions (`--SimulationLean` flag) * [\#3893](https://github.com/cosmos/cosmos-sdk/issues/3893) Improve `gaiacli tx sign` command - * Add shorthand flags -a and -s for the account and sequence numbers respectively - * Mark the account and sequence numbers required during "offline" mode - * Always do an RPC query for account and sequence number during "online" mode + * Add shorthand flags -a and -s for the account and sequence numbers respectively + * Mark the account and sequence numbers required during "offline" mode + * Always do an RPC query for account and sequence number during "online" mode * [\#4018](https://github.com/cosmos/cosmos-sdk/issues/4018) create genesis port script for release v.0.34.0 #### Gaia CLI @@ -1793,8 +1798,8 @@ status and pagination query flags. * [\#3828](https://github.com/cosmos/cosmos-sdk/issues/3828) New sdkch tool to maintain changelogs * [\#3864](https://github.com/cosmos/cosmos-sdk/issues/3864) Make Coins.IsAllGTE() more consistent. * [\#3907](https://github.com/cosmos/cosmos-sdk/issues/3907): dep -> go mod migration - * Drop dep in favor of go modules. - * Upgrade to Go 1.12.1. + * Drop dep in favor of go modules. + * Upgrade to Go 1.12.1. * [\#3917](https://github.com/cosmos/cosmos-sdk/issues/3917) Allow arbitrary decreases to validator commission rates. * [\#3937](https://github.com/cosmos/cosmos-sdk/issues/3937) Implement community pool querier. * [\#3940](https://github.com/cosmos/cosmos-sdk/issues/3940) Codespace should be lowercase. @@ -1853,152 +1858,151 @@ by accounting for rounding errors when multiplying stake by slashing fractions. BREAKING CHANGES * Gaia REST API - * [\#3641](https://github.com/cosmos/cosmos-sdk/pull/3641) Remove the ability to use a Keybase from the REST API client: - * `password` and `generate_only` have been removed from the `base_req` object - * All txs that used to sign or use the Keybase now only generate the tx - * `keys` routes completely removed - * [\#3692](https://github.com/cosmos/cosmos-sdk/pull/3692) Update tx encoding and broadcasting endpoints: - * Remove duplicate broadcasting endpoints in favor of POST @ `/txs` - * The `Tx` field now accepts a `StdTx` and not raw tx bytes - * Move encoding endpoint to `/txs/encode` + * [\#3641](https://github.com/cosmos/cosmos-sdk/pull/3641) Remove the ability to use a Keybase from the REST API client: + * `password` and `generate_only` have been removed from the `base_req` object + * All txs that used to sign or use the Keybase now only generate the tx + * `keys` routes completely removed + * [\#3692](https://github.com/cosmos/cosmos-sdk/pull/3692) Update tx encoding and broadcasting endpoints: + * Remove duplicate broadcasting endpoints in favor of POST @ `/txs` + * The `Tx` field now accepts a `StdTx` and not raw tx bytes + * Move encoding endpoint to `/txs/encode` * Gaia - * [\#3787](https://github.com/cosmos/cosmos-sdk/pull/3787) Fork the `x/bank` module into the Gaia application with only a + * [\#3787](https://github.com/cosmos/cosmos-sdk/pull/3787) Fork the `x/bank` module into the Gaia application with only a modified message handler, where the modified message handler behaves the same as the standard `x/bank` message handler except for `MsgMultiSend` that must burn exactly 9 atoms and transfer 1 atom, and `MsgSend` is disabled. - * [\#3789](https://github.com/cosmos/cosmos-sdk/pull/3789) Update validator creation flow: - * Remove `NewMsgCreateValidatorOnBehalfOf` and corresponding business logic - * Ensure the validator address equals the delegator address during + * [\#3789](https://github.com/cosmos/cosmos-sdk/pull/3789) Update validator creation flow: + * Remove `NewMsgCreateValidatorOnBehalfOf` and corresponding business logic + * Ensure the validator address equals the delegator address during `MsgCreateValidator#ValidateBasic` * SDK - * [\#3750](https://github.com/cosmos/cosmos-sdk/issues/3750) Track outstanding rewards per-validator instead of globally, + * [\#3750](https://github.com/cosmos/cosmos-sdk/issues/3750) Track outstanding rewards per-validator instead of globally, and fix the main simulation issue, which was that slashes of re-delegations to a validator were not correctly accounted for in fee distribution when the redelegation in question had itself been slashed (from a fault committed by a different validator) in the same BeginBlock. Outstanding rewards are now available on a per-validator basis in REST. - * [\#3669](https://github.com/cosmos/cosmos-sdk/pull/3669) Ensure consistency in message naming, codec registration, and JSON + * [\#3669](https://github.com/cosmos/cosmos-sdk/pull/3669) Ensure consistency in message naming, codec registration, and JSON tags. - * [\#3788](https://github.com/cosmos/cosmos-sdk/pull/3788) Change order of operations for greater accuracy when calculating delegation share token value - * [\#3788](https://github.com/cosmos/cosmos-sdk/pull/3788) DecCoins.Cap -> DecCoins.Intersect - * [\#3666](https://github.com/cosmos/cosmos-sdk/pull/3666) Improve coins denom validation. - * [\#3751](https://github.com/cosmos/cosmos-sdk/pull/3751) Disable (temporarily) support for ED25519 account key pairs. + * [\#3788](https://github.com/cosmos/cosmos-sdk/pull/3788) Change order of operations for greater accuracy when calculating delegation share token value + * [\#3788](https://github.com/cosmos/cosmos-sdk/pull/3788) DecCoins.Cap -> DecCoins.Intersect + * [\#3666](https://github.com/cosmos/cosmos-sdk/pull/3666) Improve coins denom validation. + * [\#3751](https://github.com/cosmos/cosmos-sdk/pull/3751) Disable (temporarily) support for ED25519 account key pairs. * Tendermint - * [\#3804] Update to Tendermint `v0.31.0-dev0` + * [\#3804] Update to Tendermint `v0.31.0-dev0` FEATURES * SDK - * [\#3719](https://github.com/cosmos/cosmos-sdk/issues/3719) DBBackend can now be set at compile time. + * [\#3719](https://github.com/cosmos/cosmos-sdk/issues/3719) DBBackend can now be set at compile time. Defaults: goleveldb. Supported: cleveldb. IMPROVEMENTS * Gaia REST API - * Update the `TxResponse` type allowing for the `Logs` result to be JSON decoded automatically. + * Update the `TxResponse` type allowing for the `Logs` result to be JSON decoded automatically. * Gaia CLI - * [\#3653](https://github.com/cosmos/cosmos-sdk/pull/3653) Prompt user confirmation prior to signing and broadcasting a transaction. - * [\#3670](https://github.com/cosmos/cosmos-sdk/pull/3670) CLI support for showing bech32 addresses in Ledger devices - * [\#3711](https://github.com/cosmos/cosmos-sdk/pull/3711) Update `tx sign` to use `--from` instead of the deprecated `--name` + * [\#3653](https://github.com/cosmos/cosmos-sdk/pull/3653) Prompt user confirmation prior to signing and broadcasting a transaction. + * [\#3670](https://github.com/cosmos/cosmos-sdk/pull/3670) CLI support for showing bech32 addresses in Ledger devices + * [\#3711](https://github.com/cosmos/cosmos-sdk/pull/3711) Update `tx sign` to use `--from` instead of the deprecated `--name` CLI flag. - * [\#3738](https://github.com/cosmos/cosmos-sdk/pull/3738) Improve multisig UX: - * `gaiacli keys show -o json` now includes constituent pubkeys, respective weights and threshold - * `gaiacli keys show --show-multisig` now displays constituent pubkeys, respective weights and threshold - * `gaiacli tx sign --validate-signatures` now displays multisig signers with their respective weights - * [\#3730](https://github.com/cosmos/cosmos-sdk/issues/3730) Improve workflow for + * [\#3738](https://github.com/cosmos/cosmos-sdk/pull/3738) Improve multisig UX: + * `gaiacli keys show -o json` now includes constituent pubkeys, respective weights and threshold + * `gaiacli keys show --show-multisig` now displays constituent pubkeys, respective weights and threshold + * `gaiacli tx sign --validate-signatures` now displays multisig signers with their respective weights + * [\#3730](https://github.com/cosmos/cosmos-sdk/issues/3730) Improve workflow for `gaiad gentx` with offline public keys, by outputting stdtx file that needs to be signed. - * [\#3761](https://github.com/cosmos/cosmos-sdk/issues/3761) Querying account related information using custom querier in auth module + * [\#3761](https://github.com/cosmos/cosmos-sdk/issues/3761) Querying account related information using custom querier in auth module * SDK - * [\#3753](https://github.com/cosmos/cosmos-sdk/issues/3753) Remove no-longer-used governance penalty parameter - * [\#3679](https://github.com/cosmos/cosmos-sdk/issues/3679) Consistent operators across Coins, DecCoins, Int, Dec + * [\#3753](https://github.com/cosmos/cosmos-sdk/issues/3753) Remove no-longer-used governance penalty parameter + * [\#3679](https://github.com/cosmos/cosmos-sdk/issues/3679) Consistent operators across Coins, DecCoins, Int, Dec replaced: Minus->Sub Plus->Add Div->Quo - * [\#3665](https://github.com/cosmos/cosmos-sdk/pull/3665) Overhaul sdk.Uint type in preparation for Coins Int -> Uint migration. - * [\#3691](https://github.com/cosmos/cosmos-sdk/issues/3691) Cleanup error messages - * [\#3456](https://github.com/cosmos/cosmos-sdk/issues/3456) Integrate in the Int.ToDec() convenience function - * [\#3300](https://github.com/cosmos/cosmos-sdk/pull/3300) Update the spec-spec, spec file reorg, and TOC updates. - * [\#3694](https://github.com/cosmos/cosmos-sdk/pull/3694) Push tagged docker images on docker hub when tag is created. - * [\#3716](https://github.com/cosmos/cosmos-sdk/pull/3716) Update file permissions the client keys directory and contents to `0700`. - * [\#3681](https://github.com/cosmos/cosmos-sdk/issues/3681) Migrate ledger-cosmos-go from ZondaX to Cosmos organization + * [\#3665](https://github.com/cosmos/cosmos-sdk/pull/3665) Overhaul sdk.Uint type in preparation for Coins Int -> Uint migration. + * [\#3691](https://github.com/cosmos/cosmos-sdk/issues/3691) Cleanup error messages + * [\#3456](https://github.com/cosmos/cosmos-sdk/issues/3456) Integrate in the Int.ToDec() convenience function + * [\#3300](https://github.com/cosmos/cosmos-sdk/pull/3300) Update the spec-spec, spec file reorg, and TOC updates. + * [\#3694](https://github.com/cosmos/cosmos-sdk/pull/3694) Push tagged docker images on docker hub when tag is created. + * [\#3716](https://github.com/cosmos/cosmos-sdk/pull/3716) Update file permissions the client keys directory and contents to `0700`. + * [\#3681](https://github.com/cosmos/cosmos-sdk/issues/3681) Migrate ledger-cosmos-go from ZondaX to Cosmos organization * Tendermint - * [\#3699](https://github.com/cosmos/cosmos-sdk/pull/3699) Upgrade to Tendermint 0.30.1 + * [\#3699](https://github.com/cosmos/cosmos-sdk/pull/3699) Upgrade to Tendermint 0.30.1 BUG FIXES * Gaia CLI - * [\#3731](https://github.com/cosmos/cosmos-sdk/pull/3731) `keys add --interactive` bip32 passphrase regression fix - * [\#3714](https://github.com/cosmos/cosmos-sdk/issues/3714) Fix USB raw access issues with gaiacli when installed via snap + * [\#3731](https://github.com/cosmos/cosmos-sdk/pull/3731) `keys add --interactive` bip32 passphrase regression fix + * [\#3714](https://github.com/cosmos/cosmos-sdk/issues/3714) Fix USB raw access issues with gaiacli when installed via snap * Gaia - * [\#3777](https://github.com/cosmso/cosmos-sdk/pull/3777) `gaiad export` no longer panics when the database is empty - * [\#3806](https://github.com/cosmos/cosmos-sdk/pull/3806) Properly return errors from a couple of struct Unmarshal functions + * [\#3777](https://github.com/cosmso/cosmos-sdk/pull/3777) `gaiad export` no longer panics when the database is empty + * [\#3806](https://github.com/cosmos/cosmos-sdk/pull/3806) Properly return errors from a couple of struct Unmarshal functions * SDK - * [\#3728](https://github.com/cosmos/cosmos-sdk/issues/3728) Truncate decimal multiplication & division in distribution to ensure + * [\#3728](https://github.com/cosmos/cosmos-sdk/issues/3728) Truncate decimal multiplication & division in distribution to ensure no more than the collected fees / inflation are distributed - * [\#3727](https://github.com/cosmos/cosmos-sdk/issues/3727) Return on zero-length (including []byte{}) PrefixEndBytes() calls - * [\#3559](https://github.com/cosmos/cosmos-sdk/issues/3559) fix occasional failing due to non-determinism in lcd test TestBonding + * [\#3727](https://github.com/cosmos/cosmos-sdk/issues/3727) Return on zero-length (including []byte{}) PrefixEndBytes() calls + * [\#3559](https://github.com/cosmos/cosmos-sdk/issues/3559) fix occasional failing due to non-determinism in lcd test TestBonding where validator is unexpectedly slashed throwing off test calculations - * [\#3411](https://github.com/cosmos/cosmos-sdk/pull/3411) Include the `RequestInitChain.Time` in the block header init during + * [\#3411](https://github.com/cosmos/cosmos-sdk/pull/3411) Include the `RequestInitChain.Time` in the block header init during `InitChain`. - * [\#3717](https://github.com/cosmos/cosmos-sdk/pull/3717) Update the vesting specification and implementation to cap deduction from + * [\#3717](https://github.com/cosmos/cosmos-sdk/pull/3717) Update the vesting specification and implementation to cap deduction from `DelegatedVesting` by at most `DelegatedVesting`. This accounts for the case where the undelegation amount may exceed the original delegation amount due to truncation of undelegation tokens. - * [\#3717](https://github.com/cosmos/cosmos-sdk/pull/3717) Ignore unknown proposers in allocating rewards for proposers, in case + * [\#3717](https://github.com/cosmos/cosmos-sdk/pull/3717) Ignore unknown proposers in allocating rewards for proposers, in case unbonding period was just 1 block and proposer was already deleted. - * [\#3726](https://github.com/cosmos/cosmos-sdk/pull/3724) Cap(clip) reward to remaining coins in AllocateTokens. + * [\#3726](https://github.com/cosmos/cosmos-sdk/pull/3724) Cap(clip) reward to remaining coins in AllocateTokens. ## 0.32.0 BREAKING CHANGES * Gaia REST API - * [\#3642](https://github.com/cosmos/cosmos-sdk/pull/3642) `GET /tx/{hash}` now returns `404` instead of `500` if the transaction is not found + * [\#3642](https://github.com/cosmos/cosmos-sdk/pull/3642) `GET /tx/{hash}` now returns `404` instead of `500` if the transaction is not found * SDK - * [\#3580](https://github.com/cosmos/cosmos-sdk/issues/3580) Migrate HTTP request/response types and utilities to types/rest. - * [\#3592](https://github.com/cosmos/cosmos-sdk/issues/3592) Drop deprecated keybase implementation's New() constructor in +* [\#3580](https://github.com/cosmos/cosmos-sdk/issues/3580) Migrate HTTP request/response types and utilities to types/rest. +* [\#3592](https://github.com/cosmos/cosmos-sdk/issues/3592) Drop deprecated keybase implementation's New() constructor in favor of a new crypto/keys.New(string, string) implementation that returns a lazy keybase instance. Remove client.MockKeyBase, superseded by crypto/keys.NewInMemory() - * [\#3621](https://github.com/cosmos/cosmos-sdk/issues/3621) staking.GenesisState.Bonds -> Delegations +* [\#3621](https://github.com/cosmos/cosmos-sdk/issues/3621) staking.GenesisState.Bonds -> Delegations IMPROVEMENTS * SDK - * [\#3311](https://github.com/cosmos/cosmos-sdk/pull/3311) Reconcile the `DecCoin/s` API with the `Coin/s` API. - * [\#3614](https://github.com/cosmos/cosmos-sdk/pull/3614) Add coin denom length checks to the coins constructors. - * [\#3621](https://github.com/cosmos/cosmos-sdk/issues/3621) remove many inter-module dependancies - * [\#3601](https://github.com/cosmos/cosmos-sdk/pull/3601) JSON-stringify the ABCI log response which includes the log and message + * [\#3311](https://github.com/cosmos/cosmos-sdk/pull/3311) Reconcile the `DecCoin/s` API with the `Coin/s` API. + * [\#3614](https://github.com/cosmos/cosmos-sdk/pull/3614) Add coin denom length checks to the coins constructors. + * [\#3621](https://github.com/cosmos/cosmos-sdk/issues/3621) remove many inter-module dependancies + * [\#3601](https://github.com/cosmos/cosmos-sdk/pull/3601) JSON-stringify the ABCI log response which includes the log and message index. - * [\#3604](https://github.com/cosmos/cosmos-sdk/pull/3604) Improve SDK funds related error messages and allow for unicode in + * [\#3604](https://github.com/cosmos/cosmos-sdk/pull/3604) Improve SDK funds related error messages and allow for unicode in JSON ABCI log. - * [\#3620](https://github.com/cosmos/cosmos-sdk/pull/3620) Version command shows build tags - * [\#3638](https://github.com/cosmos/cosmos-sdk/pull/3638) Add Bcrypt benchmarks & justification of security parameter choice - * [\#3648](https://github.com/cosmos/cosmos-sdk/pull/3648) Add JSON struct tags to vesting accounts. + * [\#3620](https://github.com/cosmos/cosmos-sdk/pull/3620) Version command shows build tags + * [\#3638](https://github.com/cosmos/cosmos-sdk/pull/3638) Add Bcrypt benchmarks & justification of security parameter choice + * [\#3648](https://github.com/cosmos/cosmos-sdk/pull/3648) Add JSON struct tags to vesting accounts. * Tendermint - * [\#3618](https://github.com/cosmos/cosmos-sdk/pull/3618) Upgrade to Tendermint 0.30.03 + * [\#3618](https://github.com/cosmos/cosmos-sdk/pull/3618) Upgrade to Tendermint 0.30.03 BUG FIXES * SDK - * [\#3646](https://github.com/cosmos/cosmos-sdk/issues/3646) `x/mint` now uses total token supply instead of total bonded tokens to calculate inflation - + * [\#3646](https://github.com/cosmos/cosmos-sdk/issues/3646) `x/mint` now uses total token supply instead of total bonded tokens to calculate inflation ## 0.31.2 BREAKING CHANGES * SDK - * [\#3592](https://github.com/cosmos/cosmos-sdk/issues/3592) Drop deprecated keybase implementation's +* [\#3592](https://github.com/cosmos/cosmos-sdk/issues/3592) Drop deprecated keybase implementation's New constructor in favor of a new crypto/keys.New(string, string) implementation that returns a lazy keybase instance. Remove client.MockKeyBase, @@ -2007,23 +2011,22 @@ BREAKING CHANGES IMPROVEMENTS * SDK - * [\#3604](https://github.com/cosmos/cosmos-sdk/pulls/3604) Improve SDK funds related error messages and allow for unicode in + * [\#3604](https://github.com/cosmos/cosmos-sdk/pulls/3604) Improve SDK funds related error messages and allow for unicode in JSON ABCI log. * Tendermint - * [\#3563](https://github.com/cosmos/cosmos-sdk/3563) Update to Tendermint version `0.30.0-rc0` - + * [\#3563](https://github.com/cosmos/cosmos-sdk/3563) Update to Tendermint version `0.30.0-rc0` BUG FIXES * Gaia - * [\#3585] Fix setting the tx hash in `NewResponseFormatBroadcastTxCommit`. - * [\#3585] Return an empty `TxResponse` when Tendermint returns an empty + * [\#3585] Fix setting the tx hash in `NewResponseFormatBroadcastTxCommit`. + * [\#3585] Return an empty `TxResponse` when Tendermint returns an empty `ResultBroadcastTx`. * SDK - * [\#3582](https://github.com/cosmos/cosmos-sdk/pull/3582) Running `make test_unit` was failing due to a missing tag - * [\#3617](https://github.com/cosmos/cosmos-sdk/pull/3582) Fix fee comparison when the required fees does not contain any denom + * [\#3582](https://github.com/cosmos/cosmos-sdk/pull/3582) Running `make test_unit` was failing due to a missing tag + * [\#3617](https://github.com/cosmos/cosmos-sdk/pull/3582) Fix fee comparison when the required fees does not contain any denom present in the tx fees. ## 0.31.0 @@ -2031,38 +2034,37 @@ BUG FIXES BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) - * [\#3284](https://github.com/cosmos/cosmos-sdk/issues/3284) Rename the `name` + * [\#3284](https://github.com/cosmos/cosmos-sdk/issues/3284) Rename the `name` field to `from` in the `base_req` body. - * [\#3485](https://github.com/cosmos/cosmos-sdk/pull/3485) Error responses are now JSON objects. - * [\#3477][distribution] endpoint changed "all_delegation_rewards" -> "delegator_total_rewards" + * [\#3485](https://github.com/cosmos/cosmos-sdk/pull/3485) Error responses are now JSON objects. + * [\#3477][distribution] endpoint changed "all_delegation_rewards" -> "delegator_total_rewards" * Gaia CLI (`gaiacli`) - - [#3399](https://github.com/cosmos/cosmos-sdk/pull/3399) Add `gaiad validate-genesis` command to facilitate checking of genesis files - - [\#1894](https://github.com/cosmos/cosmos-sdk/issues/1894) `version` prints out short info by default. Add `--long` flag. Proper handling of `--format` flag introduced. - - [\#3465](https://github.com/cosmos/cosmos-sdk/issues/3465) `gaiacli rest-server` switched back to insecure mode by default: - - `--insecure` flag is removed. - - `--tls` is now used to enable secure layer. - - [\#3451](https://github.com/cosmos/cosmos-sdk/pull/3451) `gaiacli` now returns transactions in plain text including tags. - - [\#3497](https://github.com/cosmos/cosmos-sdk/issues/3497) `gaiad init` now takes moniker as required arguments, not as parameter. - * [\#3501](https://github.com/cosmos/cosmos-sdk/issues/3501) Change validator + - [#3399](https://github.com/cosmos/cosmos-sdk/pull/3399) Add `gaiad validate-genesis` command to facilitate checking of genesis files + - [\#1894](https://github.com/cosmos/cosmos-sdk/issues/1894) `version` prints out short info by default. Add `--long` flag. Proper handling of `--format` flag introduced. + - [\#3465](https://github.com/cosmos/cosmos-sdk/issues/3465) `gaiacli rest-server` switched back to insecure mode by default: + - `--insecure` flag is removed. + - `--tls` is now used to enable secure layer. + - [\#3451](https://github.com/cosmos/cosmos-sdk/pull/3451) `gaiacli` now returns transactions in plain text including tags. + - [\#3497](https://github.com/cosmos/cosmos-sdk/issues/3497) `gaiad init` now takes moniker as required arguments, not as parameter. + * [\#3501](https://github.com/cosmos/cosmos-sdk/issues/3501) Change validator address Bech32 encoding to consensus address in `tendermint-validator-set`. * Gaia - * [\#3457](https://github.com/cosmos/cosmos-sdk/issues/3457) Changed governance tally validatorGovInfo to use sdk.Int power instead of sdk.Dec - * [\#3495](https://github.com/cosmos/cosmos-sdk/issues/3495) Added Validator Minimum Self Delegation - * Reintroduce OR semantics for tx fees + * [\#3457](https://github.com/cosmos/cosmos-sdk/issues/3457) Changed governance tally validatorGovInfo to use sdk.Int power instead of sdk.Dec + * [\#3495](https://github.com/cosmos/cosmos-sdk/issues/3495) Added Validator Minimum Self Delegation + * Reintroduce OR semantics for tx fees * SDK - * [\#2513](https://github.com/cosmos/cosmos-sdk/issues/2513) Tendermint updates are adjusted by 10^-6 relative to staking tokens, - * [\#3487](https://github.com/cosmos/cosmos-sdk/pull/3487) Move HTTP/REST utilities out of client/utils into a new dedicated client/rest package. - * [\#3490](https://github.com/cosmos/cosmos-sdk/issues/3490) ReadRESTReq() returns bool to avoid callers to write error responses twice. - * [\#3502](https://github.com/cosmos/cosmos-sdk/pull/3502) Fixes issue when comparing genesis states - * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Various clean ups: - - Replace all GetKeyBase\* functions family in favor of NewKeyBaseFromDir and NewKeyBaseFromHomeFlag. - - Remove Get prefix from all TxBuilder's getters. - * [\#3522](https://github.com/cosmos/cosmos-sdk/pull/3522) Get rid of double negatives: Coins.IsNotNegative() -> Coins.IsAnyNegative(). - * [\#3561](https://github.com/cosmos/cosmos-sdk/issues/3561) Don't unnecessarily store denominations in staking - + * [\#2513](https://github.com/cosmos/cosmos-sdk/issues/2513) Tendermint updates are adjusted by 10^-6 relative to staking tokens, + * [\#3487](https://github.com/cosmos/cosmos-sdk/pull/3487) Move HTTP/REST utilities out of client/utils into a new dedicated client/rest package. + * [\#3490](https://github.com/cosmos/cosmos-sdk/issues/3490) ReadRESTReq() returns bool to avoid callers to write error responses twice. + * [\#3502](https://github.com/cosmos/cosmos-sdk/pull/3502) Fixes issue when comparing genesis states + * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Various clean ups: + - Replace all GetKeyBase\* functions family in favor of NewKeyBaseFromDir and NewKeyBaseFromHomeFlag. + - Remove Get prefix from all TxBuilder's getters. + * [\#3522](https://github.com/cosmos/cosmos-sdk/pull/3522) Get rid of double negatives: Coins.IsNotNegative() -> Coins.IsAnyNegative(). + * [\#3561](https://github.com/cosmos/cosmos-sdk/issues/3561) Don't unnecessarily store denominations in staking FEATURES @@ -2071,230 +2073,227 @@ FEATURES * [\#2358](https://github.com/cosmos/cosmos-sdk/issues/2358) Add distribution module REST interface * Gaia CLI (`gaiacli`) - * [\#3429](https://github.com/cosmos/cosmos-sdk/issues/3429) Support querying + * [\#3429](https://github.com/cosmos/cosmos-sdk/issues/3429) Support querying for all delegator distribution rewards. - * [\#3449](https://github.com/cosmos/cosmos-sdk/issues/3449) Proof verification now works with absence proofs - * [\#3484](https://github.com/cosmos/cosmos-sdk/issues/3484) Add support + * [\#3449](https://github.com/cosmos/cosmos-sdk/issues/3449) Proof verification now works with absence proofs + * [\#3484](https://github.com/cosmos/cosmos-sdk/issues/3484) Add support vesting accounts to the add-genesis-account command. * Gaia - - [\#3397](https://github.com/cosmos/cosmos-sdk/pull/3397) Implement genesis file sanitization to avoid failures at chain init. - * [\#3428](https://github.com/cosmos/cosmos-sdk/issues/3428) Run the simulation from a particular genesis state loaded from a file + - [\#3397](https://github.com/cosmos/cosmos-sdk/pull/3397) Implement genesis file sanitization to avoid failures at chain init. + * [\#3428](https://github.com/cosmos/cosmos-sdk/issues/3428) Run the simulation from a particular genesis state loaded from a file * SDK - * [\#3270](https://github.com/cosmos/cosmos-sdk/issues/3270) [x/staking] limit number of ongoing unbonding delegations /redelegations per pair/trio - * [\#3477][distribution] new query endpoint "delegator_validators" - * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Provided a lazy loading implementation of Keybase that locks the underlying + * [\#3270](https://github.com/cosmos/cosmos-sdk/issues/3270) [x/staking] limit number of ongoing unbonding delegations /redelegations per pair/trio + * [\#3477][distribution] new query endpoint "delegator_validators" + * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) Provided a lazy loading implementation of Keybase that locks the underlying storage only for the time needed to perform the required operation. Also added Keybase reference to TxBuilder struct. - * [types] [\#2580](https://github.com/cosmos/cosmos-sdk/issues/2580) Addresses now Bech32 empty addresses to an empty string - + * [types] [\#2580](https://github.com/cosmos/cosmos-sdk/issues/2580) Addresses now Bech32 empty addresses to an empty string IMPROVEMENTS * Gaia REST API - * [\#3284](https://github.com/cosmos/cosmos-sdk/issues/3284) Update Gaia Lite + * [\#3284](https://github.com/cosmos/cosmos-sdk/issues/3284) Update Gaia Lite REST service to support the following: - * Automatic account number and sequence population when fields are omitted - * Generate only functionality no longer requires access to a local Keybase - * `from` field in the `base_req` body can be a Keybase name or account address - * [\#3423](https://github.com/cosmos/cosmos-sdk/issues/3423) Allow simulation + * Automatic account number and sequence population when fields are omitted + * Generate only functionality no longer requires access to a local Keybase + * `from` field in the `base_req` body can be a Keybase name or account address + * [\#3423](https://github.com/cosmos/cosmos-sdk/issues/3423) Allow simulation (auto gas) to work with generate only. - * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) REST server calls to keybase does not lock the underlying storage anymore. - * [\#3523](https://github.com/cosmos/cosmos-sdk/pull/3523) Added `/tx/encode` endpoint to serialize a JSON tx to base64-encoded Amino. + * [\#3514](https://github.com/cosmos/cosmos-sdk/pull/3514) REST server calls to keybase does not lock the underlying storage anymore. + * [\#3523](https://github.com/cosmos/cosmos-sdk/pull/3523) Added `/tx/encode` endpoint to serialize a JSON tx to base64-encoded Amino. * Gaia CLI (`gaiacli`) - * [\#3476](https://github.com/cosmos/cosmos-sdk/issues/3476) New `withdraw-all-rewards` command to withdraw all delegations rewards for delegators. - * [\#3497](https://github.com/cosmos/cosmos-sdk/issues/3497) `gaiad gentx` supports `--ip` and `--node-id` flags to override defaults. - * [\#3518](https://github.com/cosmos/cosmos-sdk/issues/3518) Fix flow in + * [\#3476](https://github.com/cosmos/cosmos-sdk/issues/3476) New `withdraw-all-rewards` command to withdraw all delegations rewards for delegators. + * [\#3497](https://github.com/cosmos/cosmos-sdk/issues/3497) `gaiad gentx` supports `--ip` and `--node-id` flags to override defaults. + * [\#3518](https://github.com/cosmos/cosmos-sdk/issues/3518) Fix flow in `keys add` to show the mnemonic by default. - * [\#3517](https://github.com/cosmos/cosmos-sdk/pull/3517) Increased test coverage - * [\#3523](https://github.com/cosmos/cosmos-sdk/pull/3523) Added `tx encode` command to serialize a JSON tx to base64-encoded Amino. + * [\#3517](https://github.com/cosmos/cosmos-sdk/pull/3517) Increased test coverage + * [\#3523](https://github.com/cosmos/cosmos-sdk/pull/3523) Added `tx encode` command to serialize a JSON tx to base64-encoded Amino. * Gaia - * [\#3418](https://github.com/cosmos/cosmos-sdk/issues/3418) Add vesting account + * [\#3418](https://github.com/cosmos/cosmos-sdk/issues/3418) Add vesting account genesis validation checks to `GaiaValidateGenesisState`. - * [\#3420](https://github.com/cosmos/cosmos-sdk/issues/3420) Added maximum length to governance proposal descriptions and titles - * [\#3256](https://github.com/cosmos/cosmos-sdk/issues/3256) Add gas consumption + * [\#3420](https://github.com/cosmos/cosmos-sdk/issues/3420) Added maximum length to governance proposal descriptions and titles + * [\#3256](https://github.com/cosmos/cosmos-sdk/issues/3256) Add gas consumption for tx size in the ante handler. - * [\#3454](https://github.com/cosmos/cosmos-sdk/pull/3454) Add `--jail-whitelist` to `gaiad export` to enable testing of complex exports - * [\#3424](https://github.com/cosmos/cosmos-sdk/issues/3424) Allow generation of gentxs with empty memo field. - * [\#3507](https://github.com/cosmos/cosmos-sdk/issues/3507) General cleanup, removal of unnecessary struct fields, undelegation bugfix, and comment clarification in x/staking and x/slashing + * [\#3454](https://github.com/cosmos/cosmos-sdk/pull/3454) Add `--jail-whitelist` to `gaiad export` to enable testing of complex exports + * [\#3424](https://github.com/cosmos/cosmos-sdk/issues/3424) Allow generation of gentxs with empty memo field. + * [\#3507](https://github.com/cosmos/cosmos-sdk/issues/3507) General cleanup, removal of unnecessary struct fields, undelegation bugfix, and comment clarification in x/staking and x/slashing * SDK - * [\#2605] x/params add subkey accessing - * [\#2986](https://github.com/cosmos/cosmos-sdk/pull/2986) Store Refactor - * [\#3435](https://github.com/cosmos/cosmos-sdk/issues/3435) Test that store implementations do not allow nil values - * [\#2509](https://github.com/cosmos/cosmos-sdk/issues/2509) Sanitize all usage of Dec.RoundInt64() - * [\#556](https://github.com/cosmos/cosmos-sdk/issues/556) Increase `BaseApp` + * [\#2605] x/params add subkey accessing + * [\#2986](https://github.com/cosmos/cosmos-sdk/pull/2986) Store Refactor + * [\#3435](https://github.com/cosmos/cosmos-sdk/issues/3435) Test that store implementations do not allow nil values + * [\#2509](https://github.com/cosmos/cosmos-sdk/issues/2509) Sanitize all usage of Dec.RoundInt64() + * [\#556](https://github.com/cosmos/cosmos-sdk/issues/556) Increase `BaseApp` test coverage. - * [\#3357](https://github.com/cosmos/cosmos-sdk/issues/3357) develop state-transitions.md for staking spec, missing states added to `state.md` - * [\#3552](https://github.com/cosmos/cosmos-sdk/pull/3552) Validate bit length when + * [\#3357](https://github.com/cosmos/cosmos-sdk/issues/3357) develop state-transitions.md for staking spec, missing states added to `state.md` + * [\#3552](https://github.com/cosmos/cosmos-sdk/pull/3552) Validate bit length when deserializing `Int` types. - BUG FIXES * Gaia CLI (`gaiacli`) - - [\#3417](https://github.com/cosmos/cosmos-sdk/pull/3417) Fix `q slashing signing-info` panic by ensuring safety of user input and properly returning not found error - - [\#3345](https://github.com/cosmos/cosmos-sdk/issues/3345) Upgrade ledger-cosmos-go dependency to v0.9.3 to pull + - [\#3417](https://github.com/cosmos/cosmos-sdk/pull/3417) Fix `q slashing signing-info` panic by ensuring safety of user input and properly returning not found error + - [\#3345](https://github.com/cosmos/cosmos-sdk/issues/3345) Upgrade ledger-cosmos-go dependency to v0.9.3 to pull https://github.com/ZondaX/ledger-cosmos-go/commit/ed9aa39ce8df31bad1448c72d3d226bf2cb1a8d1 in order to fix a derivation path issue that causes `gaiacli keys add --recover` to malfunction. - - [\#3419](https://github.com/cosmos/cosmos-sdk/pull/3419) Fix `q distr slashes` panic - - [\#3453](https://github.com/cosmos/cosmos-sdk/pull/3453) The `rest-server` command didn't respect persistent flags such as `--chain-id` and `--trust-node` if they were + - [\#3419](https://github.com/cosmos/cosmos-sdk/pull/3419) Fix `q distr slashes` panic + - [\#3453](https://github.com/cosmos/cosmos-sdk/pull/3453) The `rest-server` command didn't respect persistent flags such as `--chain-id` and `--trust-node` if they were passed on the command line. - - [\#3441](https://github.com/cosmos/cosmos-sdk/pull/3431) Improved resource management and connection handling (ledger devices). Fixes issue with DER vs BER signatures. + - [\#3441](https://github.com/cosmos/cosmos-sdk/pull/3431) Improved resource management and connection handling (ledger devices). Fixes issue with DER vs BER signatures. * Gaia - * [\#3486](https://github.com/cosmos/cosmos-sdk/pull/3486) Use AmountOf in + * [\#3486](https://github.com/cosmos/cosmos-sdk/pull/3486) Use AmountOf in vesting accounts instead of zipping/aligning denominations. - ## 0.30.0 BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) - * [gaia-lite] [\#2182] Renamed and merged all redelegations endpoints into `/staking/redelegations` - * [\#3176](https://github.com/cosmos/cosmos-sdk/issues/3176) `tx/sign` endpoint now expects `BaseReq` fields as nested object. - * [\#2222] all endpoints renamed from `/stake` -> `/staking` - * [\#1268] `LooseTokens` -> `NotBondedTokens` - * [\#3289] misc renames: - * `Validator.UnbondingMinTime` -> `Validator.UnbondingCompletionTime` - * `Delegation` -> `Value` in `MsgCreateValidator` and `MsgDelegate` - * `MsgBeginUnbonding` -> `MsgUndelegate` + * [gaia-lite] [\#2182] Renamed and merged all redelegations endpoints into `/staking/redelegations` + * [\#3176](https://github.com/cosmos/cosmos-sdk/issues/3176) `tx/sign` endpoint now expects `BaseReq` fields as nested object. + * [\#2222] all endpoints renamed from `/stake` -> `/staking` + * [\#1268] `LooseTokens` -> `NotBondedTokens` + * [\#3289] misc renames: + * `Validator.UnbondingMinTime` -> `Validator.UnbondingCompletionTime` + * `Delegation` -> `Value` in `MsgCreateValidator` and `MsgDelegate` + * `MsgBeginUnbonding` -> `MsgUndelegate` * Gaia CLI (`gaiacli`) - * [\#810](https://github.com/cosmos/cosmos-sdk/issues/810) Don't fallback to any default values for chain ID. - * Users need to supply chain ID either via config file or the `--chain-id` flag. - * Change `chain_id` and `trust_node` in `gaiacli` configuration to `chain-id` and `trust-node` respectively. - * [\#3069](https://github.com/cosmos/cosmos-sdk/pull/3069) `--fee` flag renamed to `--fees` to support multiple coins - * [\#3156](https://github.com/cosmos/cosmos-sdk/pull/3156) Remove unimplemented `gaiacli init` command - * [\#2222] `gaiacli tx stake` -> `gaiacli tx staking`, `gaiacli query stake` -> `gaiacli query staking` - * [\#1894](https://github.com/cosmos/cosmos-sdk/issues/1894) `version` command now shows latest commit, vendor dir hash, and build machine info. - * [\#3320](https://github.com/cosmos/cosmos-sdk/pull/3320) Ensure all `gaiacli query` commands respect the `--output` and `--indent` flags + * [\#810](https://github.com/cosmos/cosmos-sdk/issues/810) Don't fallback to any default values for chain ID. + * Users need to supply chain ID either via config file or the `--chain-id` flag. + * Change `chain_id` and `trust_node` in `gaiacli` configuration to `chain-id` and `trust-node` respectively. + * [\#3069](https://github.com/cosmos/cosmos-sdk/pull/3069) `--fee` flag renamed to `--fees` to support multiple coins + * [\#3156](https://github.com/cosmos/cosmos-sdk/pull/3156) Remove unimplemented `gaiacli init` command + * [\#2222] `gaiacli tx stake` -> `gaiacli tx staking`, `gaiacli query stake` -> `gaiacli query staking` + * [\#1894](https://github.com/cosmos/cosmos-sdk/issues/1894) `version` command now shows latest commit, vendor dir hash, and build machine info. + * [\#3320](https://github.com/cosmos/cosmos-sdk/pull/3320) Ensure all `gaiacli query` commands respect the `--output` and `--indent` flags * Gaia - * https://github.com/cosmos/cosmos-sdk/issues/2838 - Move store keys to constants - * [\#3162](https://github.com/cosmos/cosmos-sdk/issues/3162) The `--gas` flag now takes `auto` instead of `simulate` + * https://github.com/cosmos/cosmos-sdk/issues/2838 - Move store keys to constants + * [\#3162](https://github.com/cosmos/cosmos-sdk/issues/3162) The `--gas` flag now takes `auto` instead of `simulate` in order to trigger a simulation of the tx before the actual execution. - * [\#3285](https://github.com/cosmos/cosmos-sdk/pull/3285) New `gaiad tendermint version` to print libs versions - * [\#1894](https://github.com/cosmos/cosmos-sdk/pull/1894) `version` command now shows latest commit, vendor dir hash, and build machine info. - * [\#3249\(https://github.com/cosmos/cosmos-sdk/issues/3249) `tendermint`'s `show-validator` and `show-address` `--json` flags removed in favor of `--output-format=json`. + * [\#3285](https://github.com/cosmos/cosmos-sdk/pull/3285) New `gaiad tendermint version` to print libs versions + * [\#1894](https://github.com/cosmos/cosmos-sdk/pull/1894) `version` command now shows latest commit, vendor dir hash, and build machine info. + * [\#3249\(https://github.com/cosmos/cosmos-sdk/issues/3249) `tendermint`'s `show-validator` and `show-address` `--json` flags removed in favor of `--output-format=json`. * SDK - * [distribution] [\#3359](https://github.com/cosmos/cosmos-sdk/issues/3359) Always round down when calculating rewards-to-be-withdrawn in F1 fee distribution - * [#3336](https://github.com/cosmos/cosmos-sdk/issues/3336) Ensure all SDK + * [distribution] [\#3359](https://github.com/cosmos/cosmos-sdk/issues/3359) Always round down when calculating rewards-to-be-withdrawn in F1 fee distribution + * [#3336](https://github.com/cosmos/cosmos-sdk/issues/3336) Ensure all SDK messages have their signature bytes contain canonical fields `value` and `type`. - * [\#3333](https://github.com/cosmos/cosmos-sdk/issues/3333) - F1 storage efficiency improvements - automatic withdrawals when unbonded, historical reward reference counting - * [staking] [\#2513](https://github.com/cosmos/cosmos-sdk/issues/2513) Validator power type from Dec -> Int - * [staking] [\#3233](https://github.com/cosmos/cosmos-sdk/issues/3233) key and value now contain duplicate fields to simplify code - * [\#3064](https://github.com/cosmos/cosmos-sdk/issues/3064) Sanitize `sdk.Coin` denom. Coins denoms are now case insensitive, i.e. 100fooToken equals to 100FOOTOKEN. - * [\#3195](https://github.com/cosmos/cosmos-sdk/issues/3195) Allows custom configuration for syncable strategy - * [\#3242](https://github.com/cosmos/cosmos-sdk/issues/3242) Fix infinite gas + * [\#3333](https://github.com/cosmos/cosmos-sdk/issues/3333) - F1 storage efficiency improvements - automatic withdrawals when unbonded, historical reward reference counting + * [staking] [\#2513](https://github.com/cosmos/cosmos-sdk/issues/2513) Validator power type from Dec -> Int + * [staking] [\#3233](https://github.com/cosmos/cosmos-sdk/issues/3233) key and value now contain duplicate fields to simplify code + * [\#3064](https://github.com/cosmos/cosmos-sdk/issues/3064) Sanitize `sdk.Coin` denom. Coins denoms are now case insensitive, i.e. 100fooToken equals to 100FOOTOKEN. + * [\#3195](https://github.com/cosmos/cosmos-sdk/issues/3195) Allows custom configuration for syncable strategy + * [\#3242](https://github.com/cosmos/cosmos-sdk/issues/3242) Fix infinite gas meter utilization during aborted ante handler executions. - * [x/distribution] [\#3292](https://github.com/cosmos/cosmos-sdk/issues/3292) Enable or disable withdraw addresses with a parameter in the param store - * [staking] [\#2222](https://github.com/cosmos/cosmos-sdk/issues/2222) `/stake` -> `/staking` module rename - * [staking] [\#1268](https://github.com/cosmos/cosmos-sdk/issues/1268) `LooseTokens` -> `NotBondedTokens` - * [staking] [\#1402](https://github.com/cosmos/cosmos-sdk/issues/1402) Redelegation and unbonding-delegation structs changed to include multiple an array of entries - * [staking] [\#3289](https://github.com/cosmos/cosmos-sdk/issues/3289) misc renames: - * `Validator.UnbondingMinTime` -> `Validator.UnbondingCompletionTime` - * `Delegation` -> `Value` in `MsgCreateValidator` and `MsgDelegate` - * `MsgBeginUnbonding` -> `MsgUndelegate` - * [\#3315] Increase decimal precision to 18 - * [\#3323](https://github.com/cosmos/cosmos-sdk/issues/3323) Update to Tendermint 0.29.0 - * [\#3328](https://github.com/cosmos/cosmos-sdk/issues/3328) [x/gov] Remove redundant action tag + * [x/distribution] [\#3292](https://github.com/cosmos/cosmos-sdk/issues/3292) Enable or disable withdraw addresses with a parameter in the param store + * [staking] [\#2222](https://github.com/cosmos/cosmos-sdk/issues/2222) `/stake` -> `/staking` module rename + * [staking] [\#1268](https://github.com/cosmos/cosmos-sdk/issues/1268) `LooseTokens` -> `NotBondedTokens` + * [staking] [\#1402](https://github.com/cosmos/cosmos-sdk/issues/1402) Redelegation and unbonding-delegation structs changed to include multiple an array of entries + * [staking] [\#3289](https://github.com/cosmos/cosmos-sdk/issues/3289) misc renames: + * `Validator.UnbondingMinTime` -> `Validator.UnbondingCompletionTime` + * `Delegation` -> `Value` in `MsgCreateValidator` and `MsgDelegate` + * `MsgBeginUnbonding` -> `MsgUndelegate` + * [\#3315] Increase decimal precision to 18 + * [\#3323](https://github.com/cosmos/cosmos-sdk/issues/3323) Update to Tendermint 0.29.0 + * [\#3328](https://github.com/cosmos/cosmos-sdk/issues/3328) [x/gov] Remove redundant action tag * Tendermint - * [\#3298](https://github.com/cosmos/cosmos-sdk/issues/3298) Upgrade to Tendermint 0.28.0 + * [\#3298](https://github.com/cosmos/cosmos-sdk/issues/3298) Upgrade to Tendermint 0.28.0 FEATURES * Gaia REST API (`gaiacli advanced rest-server`) - * [\#3067](https://github.com/cosmos/cosmos-sdk/issues/3067) Add support for fees on transactions - * [\#3069](https://github.com/cosmos/cosmos-sdk/pull/3069) Add a custom memo on transactions - * [\#3027](https://github.com/cosmos/cosmos-sdk/issues/3027) Implement + * [\#3067](https://github.com/cosmos/cosmos-sdk/issues/3067) Add support for fees on transactions + * [\#3069](https://github.com/cosmos/cosmos-sdk/pull/3069) Add a custom memo on transactions + * [\#3027](https://github.com/cosmos/cosmos-sdk/issues/3027) Implement `/gov/proposals/{proposalID}/proposer` to query for a proposal's proposer. * Gaia CLI (`gaiacli`) - * [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `params` command to query slashing parameters. - * [\#2730](https://github.com/cosmos/cosmos-sdk/issues/2730) Add tx search pagination parameter - * [\#3027](https://github.com/cosmos/cosmos-sdk/issues/3027) Implement + * [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `params` command to query slashing parameters. + * [\#2730](https://github.com/cosmos/cosmos-sdk/issues/2730) Add tx search pagination parameter + * [\#3027](https://github.com/cosmos/cosmos-sdk/issues/3027) Implement `query gov proposer [proposal-id]` to query for a proposal's proposer. - * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `keys add --multisig` flag to store multisig keys locally. - * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `multisign` command to generate multisig signatures. - * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `sign --multisig` flag to enable multisig mode. - * [\#2715](https://github.com/cosmos/cosmos-sdk/issues/2715) Reintroduce gaia server's insecure mode. - * [\#3334](https://github.com/cosmos/cosmos-sdk/pull/3334) New `gaiad completion` and `gaiacli completion` to generate Bash/Zsh completion scripts. - * [\#2607](https://github.com/cosmos/cosmos-sdk/issues/2607) Make `gaiacli config` handle the boolean `indent` flag to beautify commands JSON output. + * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `keys add --multisig` flag to store multisig keys locally. + * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `multisign` command to generate multisig signatures. + * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) New `sign --multisig` flag to enable multisig mode. + * [\#2715](https://github.com/cosmos/cosmos-sdk/issues/2715) Reintroduce gaia server's insecure mode. + * [\#3334](https://github.com/cosmos/cosmos-sdk/pull/3334) New `gaiad completion` and `gaiacli completion` to generate Bash/Zsh completion scripts. + * [\#2607](https://github.com/cosmos/cosmos-sdk/issues/2607) Make `gaiacli config` handle the boolean `indent` flag to beautify commands JSON output. * Gaia - * [\#2182] [x/staking] Added querier for querying a single redelegation - * [\#3305](https://github.com/cosmos/cosmos-sdk/issues/3305) Add support for + * [\#2182] [x/staking] Added querier for querying a single redelegation + * [\#3305](https://github.com/cosmos/cosmos-sdk/issues/3305) Add support for vesting accounts at genesis. - * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) [x/auth] Add multisig transactions support - * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) `add-genesis-account` can take both account addresses and key names + * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) [x/auth] Add multisig transactions support + * [\#3198](https://github.com/cosmos/cosmos-sdk/issues/3198) `add-genesis-account` can take both account addresses and key names * SDK - - [\#3099](https://github.com/cosmos/cosmos-sdk/issues/3099) Implement F1 fee distribution - - [\#2926](https://github.com/cosmos/cosmos-sdk/issues/2926) Add TxEncoder to client TxBuilder. - * [\#2694](https://github.com/cosmos/cosmos-sdk/issues/2694) Vesting account implementation. - * [\#2996](https://github.com/cosmos/cosmos-sdk/issues/2996) Update the `AccountKeeper` to contain params used in the context of + - [\#3099](https://github.com/cosmos/cosmos-sdk/issues/3099) Implement F1 fee distribution + - [\#2926](https://github.com/cosmos/cosmos-sdk/issues/2926) Add TxEncoder to client TxBuilder. + * [\#2694](https://github.com/cosmos/cosmos-sdk/issues/2694) Vesting account implementation. + * [\#2996](https://github.com/cosmos/cosmos-sdk/issues/2996) Update the `AccountKeeper` to contain params used in the context of the ante handler. - * [\#3179](https://github.com/cosmos/cosmos-sdk/pull/3179) New CodeNoSignatures error code. - * [\#3319](https://github.com/cosmos/cosmos-sdk/issues/3319) [x/distribution] Queriers for all distribution state worth querying; distribution query commands - * [\#3356](https://github.com/cosmos/cosmos-sdk/issues/3356) [x/auth] bech32-ify accounts address in error message. + * [\#3179](https://github.com/cosmos/cosmos-sdk/pull/3179) New CodeNoSignatures error code. + * [\#3319](https://github.com/cosmos/cosmos-sdk/issues/3319) [x/distribution] Queriers for all distribution state worth querying; distribution query commands + * [\#3356](https://github.com/cosmos/cosmos-sdk/issues/3356) [x/auth] bech32-ify accounts address in error message. IMPROVEMENTS * Gaia REST API - * [\#3176](https://github.com/cosmos/cosmos-sdk/issues/3176) Validate tx/sign endpoint POST body. - * [\#2948](https://github.com/cosmos/cosmos-sdk/issues/2948) Swagger UI now makes requests to light client node + * [\#3176](https://github.com/cosmos/cosmos-sdk/issues/3176) Validate tx/sign endpoint POST body. + * [\#2948](https://github.com/cosmos/cosmos-sdk/issues/2948) Swagger UI now makes requests to light client node * Gaia CLI (`gaiacli`) - * [\#3224](https://github.com/cosmos/cosmos-sdk/pull/3224) Support adding offline public keys to the keystore + * [\#3224](https://github.com/cosmos/cosmos-sdk/pull/3224) Support adding offline public keys to the keystore * Gaia - * [\#2186](https://github.com/cosmos/cosmos-sdk/issues/2186) Add Address Interface - * [\#3158](https://github.com/cosmos/cosmos-sdk/pull/3158) Validate slashing genesis - * [\#3172](https://github.com/cosmos/cosmos-sdk/pull/3172) Support minimum fees in a local testnet. - * [\#3250](https://github.com/cosmos/cosmos-sdk/pull/3250) Refactor integration tests and increase coverage - * [\#3248](https://github.com/cosmos/cosmos-sdk/issues/3248) Refactor tx fee + * [\#2186](https://github.com/cosmos/cosmos-sdk/issues/2186) Add Address Interface + * [\#3158](https://github.com/cosmos/cosmos-sdk/pull/3158) Validate slashing genesis + * [\#3172](https://github.com/cosmos/cosmos-sdk/pull/3172) Support minimum fees in a local testnet. + * [\#3250](https://github.com/cosmos/cosmos-sdk/pull/3250) Refactor integration tests and increase coverage + * [\#3248](https://github.com/cosmos/cosmos-sdk/issues/3248) Refactor tx fee model: - * Validators specify minimum gas prices instead of minimum fees - * Clients may provide either fees or gas prices directly - * The gas prices of a tx must meet a validator's minimum - * `gaiad start` and `gaia.toml` take --minimum-gas-prices flag and minimum-gas-price config key respectively. - * [\#2859](https://github.com/cosmos/cosmos-sdk/issues/2859) Rename `TallyResult` in gov proposals to `FinalTallyResult` - * [\#3286](https://github.com/cosmos/cosmos-sdk/pull/3286) Fix `gaiad gentx` printout of account's addresses, i.e. user bech32 instead of hex. - * [\#3249\(https://github.com/cosmos/cosmos-sdk/issues/3249) `--json` flag removed, users should use `--output=json` instead. + * Validators specify minimum gas prices instead of minimum fees + * Clients may provide either fees or gas prices directly + * The gas prices of a tx must meet a validator's minimum + * `gaiad start` and `gaia.toml` take --minimum-gas-prices flag and minimum-gas-price config key respectively. + * [\#2859](https://github.com/cosmos/cosmos-sdk/issues/2859) Rename `TallyResult` in gov proposals to `FinalTallyResult` + * [\#3286](https://github.com/cosmos/cosmos-sdk/pull/3286) Fix `gaiad gentx` printout of account's addresses, i.e. user bech32 instead of hex. + * [\#3249\(https://github.com/cosmos/cosmos-sdk/issues/3249) `--json` flag removed, users should use `--output=json` instead. * SDK - * [\#3137](https://github.com/cosmos/cosmos-sdk/pull/3137) Add tag documentation + * [\#3137](https://github.com/cosmos/cosmos-sdk/pull/3137) Add tag documentation for each module along with cleaning up a few existing tags in the governance, slashing, and staking modules. - * [\#3093](https://github.com/cosmos/cosmos-sdk/issues/3093) Ante handler does no longer read all accounts in one go when processing signatures as signature + * [\#3093](https://github.com/cosmos/cosmos-sdk/issues/3093) Ante handler does no longer read all accounts in one go when processing signatures as signature verification may fail before last signature is checked. - * [staking] [\#1402](https://github.com/cosmos/cosmos-sdk/issues/1402) Add for multiple simultaneous redelegations or unbonding-delegations within an unbonding period - * [staking] [\#1268](https://github.com/cosmos/cosmos-sdk/issues/1268) staking spec rewrite + * [staking] [\#1402](https://github.com/cosmos/cosmos-sdk/issues/1402) Add for multiple simultaneous redelegations or unbonding-delegations within an unbonding period + * [staking] [\#1268](https://github.com/cosmos/cosmos-sdk/issues/1268) staking spec rewrite * CI - * [\#2498](https://github.com/cosmos/cosmos-sdk/issues/2498) Added macos CI job to CircleCI - * [#142](https://github.com/tendermint/devops/issues/142) Increased the number of blocks to be tested during multi-sim - * [#147](https://github.com/tendermint/devops/issues/142) Added docker image build to CI + * [\#2498](https://github.com/cosmos/cosmos-sdk/issues/2498) Added macos CI job to CircleCI + * [#142](https://github.com/tendermint/devops/issues/142) Increased the number of blocks to be tested during multi-sim + * [#147](https://github.com/tendermint/devops/issues/142) Added docker image build to CI BUG FIXES * Gaia CLI (`gaiacli`) - * [\#3141](https://github.com/cosmos/cosmos-sdk/issues/3141) Fix the bug in GetAccount when `len(res) == 0` and `err == nil` - * [\#810](https://github.com/cosmos/cosmos-sdk/pull/3316) Fix regression in gaiacli config file handling + * [\#3141](https://github.com/cosmos/cosmos-sdk/issues/3141) Fix the bug in GetAccount when `len(res) == 0` and `err == nil` + * [\#810](https://github.com/cosmos/cosmos-sdk/pull/3316) Fix regression in gaiacli config file handling * Gaia - * [\#3148](https://github.com/cosmos/cosmos-sdk/issues/3148) Fix `gaiad export` by adding a boolean to `NewGaiaApp` determining whether or not to load the latest version - * [\#3181](https://github.com/cosmos/cosmos-sdk/issues/3181) Correctly reset total accum update height and jailed-validator bond height / unbonding height on export-for-zero-height - * [\#3172](https://github.com/cosmos/cosmos-sdk/pull/3172) Fix parsing `gaiad.toml` + * [\#3148](https://github.com/cosmos/cosmos-sdk/issues/3148) Fix `gaiad export` by adding a boolean to `NewGaiaApp` determining whether or not to load the latest version + * [\#3181](https://github.com/cosmos/cosmos-sdk/issues/3181) Correctly reset total accum update height and jailed-validator bond height / unbonding height on export-for-zero-height + * [\#3172](https://github.com/cosmos/cosmos-sdk/pull/3172) Fix parsing `gaiad.toml` when it already exists. - * [\#3223](https://github.com/cosmos/cosmos-sdk/issues/3223) Fix unset governance proposal queues when importing state from old chain - * [#3187](https://github.com/cosmos/cosmos-sdk/issues/3187) Fix `gaiad export` + * [\#3223](https://github.com/cosmos/cosmos-sdk/issues/3223) Fix unset governance proposal queues when importing state from old chain + * [#3187](https://github.com/cosmos/cosmos-sdk/issues/3187) Fix `gaiad export` by resetting each validator's slashing period. ## 0.29.1 @@ -2302,277 +2301,271 @@ BUG FIXES BUG FIXES * SDK - * [\#3207](https://github.com/cosmos/cosmos-sdk/issues/3207) - Fix token printing bug + * [\#3207](https://github.com/cosmos/cosmos-sdk/issues/3207) - Fix token printing bug ## 0.29.0 BREAKING CHANGES * Gaia - * [\#3148](https://github.com/cosmos/cosmos-sdk/issues/3148) Fix `gaiad export` by adding a boolean to `NewGaiaApp` determining whether or not to load the latest version + * [\#3148](https://github.com/cosmos/cosmos-sdk/issues/3148) Fix `gaiad export` by adding a boolean to `NewGaiaApp` determining whether or not to load the latest version * SDK - * [\#3163](https://github.com/cosmos/cosmos-sdk/issues/3163) Withdraw commission on self bond removal - + * [\#3163](https://github.com/cosmos/cosmos-sdk/issues/3163) Withdraw commission on self bond removal ## 0.28.1 BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) - * [lcd] [\#3045](https://github.com/cosmos/cosmos-sdk/pull/3045) Fix quoted json return on GET /keys (keys list) - * [gaia-lite] [\#2191](https://github.com/cosmos/cosmos-sdk/issues/2191) Split `POST /stake/delegators/{delegatorAddr}/delegations` into `POST /stake/delegators/{delegatorAddr}/delegations`, `POST /stake/delegators/{delegatorAddr}/unbonding_delegations` and `POST /stake/delegators/{delegatorAddr}/redelegations` - * [gaia-lite] [\#3056](https://github.com/cosmos/cosmos-sdk/pull/3056) `generate_only` and `simulate` have moved from query arguments to POST requests body. + * [lcd] [\#3045](https://github.com/cosmos/cosmos-sdk/pull/3045) Fix quoted json return on GET /keys (keys list) + * [gaia-lite] [\#2191](https://github.com/cosmos/cosmos-sdk/issues/2191) Split `POST /stake/delegators/{delegatorAddr}/delegations` into `POST /stake/delegators/{delegatorAddr}/delegations`, `POST /stake/delegators/{delegatorAddr}/unbonding_delegations` and `POST /stake/delegators/{delegatorAddr}/redelegations` + * [gaia-lite] [\#3056](https://github.com/cosmos/cosmos-sdk/pull/3056) `generate_only` and `simulate` have moved from query arguments to POST requests body. * Tendermint - * [tendermint] Now using Tendermint 0.27.3 + * [tendermint] Now using Tendermint 0.27.3 FEATURES * Gaia REST API (`gaiacli advanced rest-server`) - * [slashing] [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `/slashing/parameters` endpoint to query slashing parameters. + * [slashing] [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `/slashing/parameters` endpoint to query slashing parameters. * Gaia CLI (`gaiacli`) - * [gaiacli] [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `params` command to query slashing parameters. + * [gaiacli] [\#2399](https://github.com/cosmos/cosmos-sdk/issues/2399) Implement `params` command to query slashing parameters. * SDK - - [client] [\#2926](https://github.com/cosmos/cosmos-sdk/issues/2926) Add TxEncoder to client TxBuilder. + - [client] [\#2926](https://github.com/cosmos/cosmos-sdk/issues/2926) Add TxEncoder to client TxBuilder. * Other - - Introduced the logjack tool for saving logs w/ rotation + - Introduced the logjack tool for saving logs w/ rotation IMPROVEMENTS * Gaia REST API (`gaiacli advanced rest-server`) - * [\#2879](https://github.com/cosmos/cosmos-sdk/issues/2879), [\#2880](https://github.com/cosmos/cosmos-sdk/issues/2880) Update deposit and vote endpoints to perform a direct txs query + * [\#2879](https://github.com/cosmos/cosmos-sdk/issues/2879), [\#2880](https://github.com/cosmos/cosmos-sdk/issues/2880) Update deposit and vote endpoints to perform a direct txs query when a given proposal is inactive and thus having votes and deposits removed from state. * Gaia CLI (`gaiacli`) - * [\#2879](https://github.com/cosmos/cosmos-sdk/issues/2879), [\#2880](https://github.com/cosmos/cosmos-sdk/issues/2880) Update deposit and vote CLI commands to perform a direct txs query + * [\#2879](https://github.com/cosmos/cosmos-sdk/issues/2879), [\#2880](https://github.com/cosmos/cosmos-sdk/issues/2880) Update deposit and vote CLI commands to perform a direct txs query when a given proposal is inactive and thus having votes and deposits removed from state. * Gaia - * [\#3021](https://github.com/cosmos/cosmos-sdk/pull/3021) Add `--gentx-dir` to `gaiad collect-gentxs` to specify a directory from which collect and load gentxs. Add `--output-document` to `gaiad init` to allow one to redirect output to file. - + * [\#3021](https://github.com/cosmos/cosmos-sdk/pull/3021) Add `--gentx-dir` to `gaiad collect-gentxs` to specify a directory from which collect and load gentxs. Add `--output-document` to `gaiad init` to allow one to redirect output to file. ## 0.28.0 BREAKING CHANGES * Gaia CLI (`gaiacli`) - * [cli] [\#2595](https://github.com/cosmos/cosmos-sdk/issues/2595) Remove `keys new` in favor of `keys add` incorporating existing functionality with addition of key recovery functionality. - * [cli] [\#2987](https://github.com/cosmos/cosmos-sdk/pull/2987) Add shorthand `-a` to `gaiacli keys show` and update docs - * [cli] [\#2971](https://github.com/cosmos/cosmos-sdk/pull/2971) Additional verification when running `gaiad gentx` - * [cli] [\#2734](https://github.com/cosmos/cosmos-sdk/issues/2734) Rewrite `gaiacli config`. It is now a non-interactive config utility. + * [cli] [\#2595](https://github.com/cosmos/cosmos-sdk/issues/2595) Remove `keys new` in favor of `keys add` incorporating existing functionality with addition of key recovery functionality. + * [cli] [\#2987](https://github.com/cosmos/cosmos-sdk/pull/2987) Add shorthand `-a` to `gaiacli keys show` and update docs + * [cli] [\#2971](https://github.com/cosmos/cosmos-sdk/pull/2971) Additional verification when running `gaiad gentx` + * [cli] [\#2734](https://github.com/cosmos/cosmos-sdk/issues/2734) Rewrite `gaiacli config`. It is now a non-interactive config utility. * Gaia - * [#128](https://github.com/tendermint/devops/issues/128) Updated CircleCI job to trigger website build on every push to master/develop. - * [\#2994](https://github.com/cosmos/cosmos-sdk/pull/2994) Change wrong-password error message. - * [\#3009](https://github.com/cosmos/cosmos-sdk/issues/3009) Added missing Gaia genesis verification - * [#128](https://github.com/tendermint/devops/issues/128) Updated CircleCI job to trigger website build on every push to master/develop. - * [\#2994](https://github.com/cosmos/cosmos-sdk/pull/2994) Change wrong-password error message. - * [\#3009](https://github.com/cosmos/cosmos-sdk/issues/3009) Added missing Gaia genesis verification - * [gas] [\#3052](https://github.com/cosmos/cosmos-sdk/issues/3052) Updated gas costs to more reasonable numbers + * [#128](https://github.com/tendermint/devops/issues/128) Updated CircleCI job to trigger website build on every push to master/develop. + * [\#2994](https://github.com/cosmos/cosmos-sdk/pull/2994) Change wrong-password error message. + * [\#3009](https://github.com/cosmos/cosmos-sdk/issues/3009) Added missing Gaia genesis verification + * [#128](https://github.com/tendermint/devops/issues/128) Updated CircleCI job to trigger website build on every push to master/develop. + * [\#2994](https://github.com/cosmos/cosmos-sdk/pull/2994) Change wrong-password error message. + * [\#3009](https://github.com/cosmos/cosmos-sdk/issues/3009) Added missing Gaia genesis verification + * [gas] [\#3052](https://github.com/cosmos/cosmos-sdk/issues/3052) Updated gas costs to more reasonable numbers * SDK - * [auth] [\#2952](https://github.com/cosmos/cosmos-sdk/issues/2952) Signatures are no longer serialized on chain with the account number and sequence number - * [auth] [\#2952](https://github.com/cosmos/cosmos-sdk/issues/2952) Signatures are no longer serialized on chain with the account number and sequence number - * [stake] [\#3055](https://github.com/cosmos/cosmos-sdk/issues/3055) Use address instead of bond height / intratxcounter for deduplication + * [auth] [\#2952](https://github.com/cosmos/cosmos-sdk/issues/2952) Signatures are no longer serialized on chain with the account number and sequence number + * [auth] [\#2952](https://github.com/cosmos/cosmos-sdk/issues/2952) Signatures are no longer serialized on chain with the account number and sequence number + * [stake] [\#3055](https://github.com/cosmos/cosmos-sdk/issues/3055) Use address instead of bond height / intratxcounter for deduplication FEATURES * Gaia CLI (`gaiacli`) - * [\#2961](https://github.com/cosmos/cosmos-sdk/issues/2961) Add --force flag to gaiacli keys delete command to skip passphrase check and force key deletion unconditionally. + * [\#2961](https://github.com/cosmos/cosmos-sdk/issues/2961) Add --force flag to gaiacli keys delete command to skip passphrase check and force key deletion unconditionally. IMPROVEMENTS * Gaia CLI (`gaiacli`) - * [\#2991](https://github.com/cosmos/cosmos-sdk/issues/2991) Fully validate transaction signatures during `gaiacli tx sign --validate-signatures` + * [\#2991](https://github.com/cosmos/cosmos-sdk/issues/2991) Fully validate transaction signatures during `gaiacli tx sign --validate-signatures` * SDK - * [\#1277](https://github.com/cosmos/cosmos-sdk/issues/1277) Complete bank module specification - * [\#2963](https://github.com/cosmos/cosmos-sdk/issues/2963) Complete auth module specification - * [\#2914](https://github.com/cosmos/cosmos-sdk/issues/2914) No longer withdraw validator rewards on bond/unbond, but rather move + * [\#1277](https://github.com/cosmos/cosmos-sdk/issues/1277) Complete bank module specification + * [\#2963](https://github.com/cosmos/cosmos-sdk/issues/2963) Complete auth module specification + * [\#2914](https://github.com/cosmos/cosmos-sdk/issues/2914) No longer withdraw validator rewards on bond/unbond, but rather move the rewards to the respective validator's pools. - BUG FIXES * Gaia CLI (`gaiacli`) - * [\#2921](https://github.com/cosmos/cosmos-sdk/issues/2921) Fix `keys delete` inability to delete offline and ledger keys. + * [\#2921](https://github.com/cosmos/cosmos-sdk/issues/2921) Fix `keys delete` inability to delete offline and ledger keys. * Gaia - * [\#3003](https://github.com/cosmos/cosmos-sdk/issues/3003) CollectStdTxs() must validate DelegatorAddr against genesis accounts. + * [\#3003](https://github.com/cosmos/cosmos-sdk/issues/3003) CollectStdTxs() must validate DelegatorAddr against genesis accounts. * SDK - * [\#2967](https://github.com/cosmos/cosmos-sdk/issues/2967) Change ordering of `mint.BeginBlocker` and `distr.BeginBlocker`, recalculate inflation each block - * [\#3068](https://github.com/cosmos/cosmos-sdk/issues/3068) check for uint64 gas overflow during `Std#ValidateBasic`. - * [\#3071](https://github.com/cosmos/cosmos-sdk/issues/3071) Catch overflow on block gas meter - + * [\#2967](https://github.com/cosmos/cosmos-sdk/issues/2967) Change ordering of `mint.BeginBlocker` and `distr.BeginBlocker`, recalculate inflation each block + * [\#3068](https://github.com/cosmos/cosmos-sdk/issues/3068) check for uint64 gas overflow during `Std#ValidateBasic`. + * [\#3071](https://github.com/cosmos/cosmos-sdk/issues/3071) Catch overflow on block gas meter ## 0.27.0 BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) - * [gaia-lite] [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Txs query param format is now: `/txs?tag=value` (removed '' wrapping the query parameter `value`) + * [gaia-lite] [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Txs query param format is now: `/txs?tag=value` (removed '' wrapping the query parameter `value`) * Gaia CLI (`gaiacli`) - * [cli] [\#2728](https://github.com/cosmos/cosmos-sdk/pull/2728) Seperate `tx` and `query` subcommands by module - * [cli] [\#2727](https://github.com/cosmos/cosmos-sdk/pull/2727) Fix unbonding command flow - * [cli] [\#2786](https://github.com/cosmos/cosmos-sdk/pull/2786) Fix redelegation command flow - * [cli] [\#2829](https://github.com/cosmos/cosmos-sdk/pull/2829) add-genesis-account command now validates state when adding accounts - * [cli] [\#2804](https://github.com/cosmos/cosmos-sdk/issues/2804) Check whether key exists before passing it on to `tx create-validator`. - * [cli] [\#2874](https://github.com/cosmos/cosmos-sdk/pull/2874) `gaiacli tx sign` takes an optional `--output-document` flag to support output redirection. - * [cli] [\#2875](https://github.com/cosmos/cosmos-sdk/pull/2875) Refactor `gaiad gentx` and avoid redirection to `gaiacli tx sign` for tx signing. + * [cli] [\#2728](https://github.com/cosmos/cosmos-sdk/pull/2728) Seperate `tx` and `query` subcommands by module + * [cli] [\#2727](https://github.com/cosmos/cosmos-sdk/pull/2727) Fix unbonding command flow + * [cli] [\#2786](https://github.com/cosmos/cosmos-sdk/pull/2786) Fix redelegation command flow + * [cli] [\#2829](https://github.com/cosmos/cosmos-sdk/pull/2829) add-genesis-account command now validates state when adding accounts + * [cli] [\#2804](https://github.com/cosmos/cosmos-sdk/issues/2804) Check whether key exists before passing it on to `tx create-validator`. + * [cli] [\#2874](https://github.com/cosmos/cosmos-sdk/pull/2874) `gaiacli tx sign` takes an optional `--output-document` flag to support output redirection. + * [cli] [\#2875](https://github.com/cosmos/cosmos-sdk/pull/2875) Refactor `gaiad gentx` and avoid redirection to `gaiacli tx sign` for tx signing. * Gaia - * [mint] [\#2825] minting now occurs every block, inflation parameter updates still hourly + * [mint] [\#2825] minting now occurs every block, inflation parameter updates still hourly * SDK - * [\#2752](https://github.com/cosmos/cosmos-sdk/pull/2752) Don't hardcode bondable denom. - * [\#2701](https://github.com/cosmos/cosmos-sdk/issues/2701) Account numbers and sequence numbers in `auth` are now `uint64` instead of `int64` - * [\#2019](https://github.com/cosmos/cosmos-sdk/issues/2019) Cap total number of signatures. Current per-transaction limit is 7, and if that is exceeded transaction is rejected. - * [\#2801](https://github.com/cosmos/cosmos-sdk/pull/2801) Remove AppInit structure. - * [\#2798](https://github.com/cosmos/cosmos-sdk/issues/2798) Governance API has miss-spelled English word in JSON response ('depositer' -> 'depositor') - * [\#2943](https://github.com/cosmos/cosmos-sdk/pull/2943) Transaction action tags equal the message type. Staking EndBlocker tags are included. + * [\#2752](https://github.com/cosmos/cosmos-sdk/pull/2752) Don't hardcode bondable denom. + * [\#2701](https://github.com/cosmos/cosmos-sdk/issues/2701) Account numbers and sequence numbers in `auth` are now `uint64` instead of `int64` + * [\#2019](https://github.com/cosmos/cosmos-sdk/issues/2019) Cap total number of signatures. Current per-transaction limit is 7, and if that is exceeded transaction is rejected. + * [\#2801](https://github.com/cosmos/cosmos-sdk/pull/2801) Remove AppInit structure. + * [\#2798](https://github.com/cosmos/cosmos-sdk/issues/2798) Governance API has miss-spelled English word in JSON response ('depositer' -> 'depositor') + * [\#2943](https://github.com/cosmos/cosmos-sdk/pull/2943) Transaction action tags equal the message type. Staking EndBlocker tags are included. * Tendermint - * Update to Tendermint 0.27.0 + * Update to Tendermint 0.27.0 FEATURES * Gaia REST API (`gaiacli advanced rest-server`) - * [gov] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance parameter + * [gov] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance parameter query REST endpoints. * Gaia CLI (`gaiacli`) - * [gov][cli] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance + * [gov][cli] [\#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Added governance parameter query commands. - * [stake][cli] [\#2027] Add CLI query command for getting all delegations to a specific validator. - * [\#2840](https://github.com/cosmos/cosmos-sdk/pull/2840) Standardize CLI exports from modules + * [stake][cli] [\#2027] Add CLI query command for getting all delegations to a specific validator. + * [\#2840](https://github.com/cosmos/cosmos-sdk/pull/2840) Standardize CLI exports from modules * Gaia - * [app] [\#2791](https://github.com/cosmos/cosmos-sdk/issues/2791) Support export at a specific height, with `gaiad export --height=HEIGHT`. - * [x/gov] [#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Implemented querier + * [app] [\#2791](https://github.com/cosmos/cosmos-sdk/issues/2791) Support export at a specific height, with `gaiad export --height=HEIGHT`. + * [x/gov] [#2479](https://github.com/cosmos/cosmos-sdk/issues/2479) Implemented querier for getting governance parameters. - * [app] [\#2663](https://github.com/cosmos/cosmos-sdk/issues/2663) - Runtime-assertable invariants - * [app] [\#2791](https://github.com/cosmos/cosmos-sdk/issues/2791) Support export at a specific height, with `gaiad export --height=HEIGHT`. - * [app] [\#2812](https://github.com/cosmos/cosmos-sdk/issues/2812) Support export alterations to prepare for restarting at zero-height + * [app] [\#2663](https://github.com/cosmos/cosmos-sdk/issues/2663) - Runtime-assertable invariants + * [app] [\#2791](https://github.com/cosmos/cosmos-sdk/issues/2791) Support export at a specific height, with `gaiad export --height=HEIGHT`. + * [app] [\#2812](https://github.com/cosmos/cosmos-sdk/issues/2812) Support export alterations to prepare for restarting at zero-height * SDK - * [simulator] [\#2682](https://github.com/cosmos/cosmos-sdk/issues/2682) MsgEditValidator now looks at the validator's max rate, thus it now succeeds a significant portion of the time - * [core] [\#2775](https://github.com/cosmos/cosmos-sdk/issues/2775) Add deliverTx maximum block gas limit - + * [simulator] [\#2682](https://github.com/cosmos/cosmos-sdk/issues/2682) MsgEditValidator now looks at the validator's max rate, thus it now succeeds a significant portion of the time + * [core] [\#2775](https://github.com/cosmos/cosmos-sdk/issues/2775) Add deliverTx maximum block gas limit IMPROVEMENTS * Gaia REST API (`gaiacli advanced rest-server`) - * [gaia-lite] [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Tx search now supports multiple tags as query parameters - * [\#2836](https://github.com/cosmos/cosmos-sdk/pull/2836) Expose LCD router to allow users to register routes there. + * [gaia-lite] [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Tx search now supports multiple tags as query parameters + * [\#2836](https://github.com/cosmos/cosmos-sdk/pull/2836) Expose LCD router to allow users to register routes there. * Gaia CLI (`gaiacli`) - * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet - * [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Tx search now supports multiple tags as query parameters + * [\#2749](https://github.com/cosmos/cosmos-sdk/pull/2749) Add --chain-id flag to gaiad testnet + * [\#2819](https://github.com/cosmos/cosmos-sdk/pull/2819) Tx search now supports multiple tags as query parameters * Gaia - * [\#2772](https://github.com/cosmos/cosmos-sdk/issues/2772) Update BaseApp to not persist state when the ante handler fails on DeliverTx. - * [\#2773](https://github.com/cosmos/cosmos-sdk/issues/2773) Require moniker to be provided on `gaiad init`. - * [\#2672](https://github.com/cosmos/cosmos-sdk/issues/2672) [Makefile] Updated for better Windows compatibility and ledger support logic, get_tools was rewritten as a cross-compatible Makefile. - * [\#2766](https://github.com/cosmos/cosmos-sdk/issues/2766) [Makefile] Added goimports tool to get_tools. Get_tools now only builds new versions if binaries are missing. - * [#110](https://github.com/tendermint/devops/issues/110) Updated CircleCI job to trigger website build when cosmos docs are updated. + * [\#2772](https://github.com/cosmos/cosmos-sdk/issues/2772) Update BaseApp to not persist state when the ante handler fails on DeliverTx. + * [\#2773](https://github.com/cosmos/cosmos-sdk/issues/2773) Require moniker to be provided on `gaiad init`. + * [\#2672](https://github.com/cosmos/cosmos-sdk/issues/2672) [Makefile] Updated for better Windows compatibility and ledger support logic, get_tools was rewritten as a cross-compatible Makefile. + * [\#2766](https://github.com/cosmos/cosmos-sdk/issues/2766) [Makefile] Added goimports tool to get_tools. Get_tools now only builds new versions if binaries are missing. + * [#110](https://github.com/tendermint/devops/issues/110) Updated CircleCI job to trigger website build when cosmos docs are updated. * SDK & [x/mock/simulation] [\#2720] major cleanup, introduction of helper objects, reorganization - * [\#2821](https://github.com/cosmos/cosmos-sdk/issues/2821) Codespaces are now strings - * [types] [\#2776](https://github.com/cosmos/cosmos-sdk/issues/2776) Improve safety of `Coin` and `Coins` types. Various functions +* [\#2821](https://github.com/cosmos/cosmos-sdk/issues/2821) Codespaces are now strings +* [types] [\#2776](https://github.com/cosmos/cosmos-sdk/issues/2776) Improve safety of `Coin` and `Coins` types. Various functions and methods will panic when a negative amount is discovered. - * [\#2815](https://github.com/cosmos/cosmos-sdk/issues/2815) Gas unit fields changed from `int64` to `uint64`. - * [\#2821](https://github.com/cosmos/cosmos-sdk/issues/2821) Codespaces are now strings - * [\#2779](https://github.com/cosmos/cosmos-sdk/issues/2779) Introduce `ValidateBasic` to the `Tx` interface and call it in the ante +* [\#2815](https://github.com/cosmos/cosmos-sdk/issues/2815) Gas unit fields changed from `int64` to `uint64`. +* [\#2821](https://github.com/cosmos/cosmos-sdk/issues/2821) Codespaces are now strings +* [\#2779](https://github.com/cosmos/cosmos-sdk/issues/2779) Introduce `ValidateBasic` to the `Tx` interface and call it in the ante handler. - * [\#2825](https://github.com/cosmos/cosmos-sdk/issues/2825) More staking and distribution invariants - * [\#2912](https://github.com/cosmos/cosmos-sdk/issues/2912) Print commit ID in hex when commit is synced. +* [\#2825](https://github.com/cosmos/cosmos-sdk/issues/2825) More staking and distribution invariants +* [\#2912](https://github.com/cosmos/cosmos-sdk/issues/2912) Print commit ID in hex when commit is synced. * Tendermint - * [\#2796](https://github.com/cosmos/cosmos-sdk/issues/2796) Update to go-amino 0.14.1 - +* [\#2796](https://github.com/cosmos/cosmos-sdk/issues/2796) Update to go-amino 0.14.1 BUG FIXES * Gaia REST API (`gaiacli advanced rest-server`) - * [gaia-lite] [\#2868](https://github.com/cosmos/cosmos-sdk/issues/2868) Added handler for governance tally endpoint - * [\#2907](https://github.com/cosmos/cosmos-sdk/issues/2907) Refactor and fix the way Gaia Lite is started. + * [gaia-lite] [\#2868](https://github.com/cosmos/cosmos-sdk/issues/2868) Added handler for governance tally endpoint + * [\#2907](https://github.com/cosmos/cosmos-sdk/issues/2907) Refactor and fix the way Gaia Lite is started. * Gaia - * [\#2723] Use `cosmosvalcons` Bech32 prefix in `tendermint show-address` - * [\#2742](https://github.com/cosmos/cosmos-sdk/issues/2742) Fix time format of TimeoutCommit override - * [\#2898](https://github.com/cosmos/cosmos-sdk/issues/2898) Remove redundant '$' in docker-compose.yml + * [\#2723] Use `cosmosvalcons` Bech32 prefix in `tendermint show-address` + * [\#2742](https://github.com/cosmos/cosmos-sdk/issues/2742) Fix time format of TimeoutCommit override + * [\#2898](https://github.com/cosmos/cosmos-sdk/issues/2898) Remove redundant '$' in docker-compose.yml * SDK - * [\#2733](https://github.com/cosmos/cosmos-sdk/issues/2733) [x/gov, x/mock/simulation] Fix governance simulation, update x/gov import/export - * [\#2854](https://github.com/cosmos/cosmos-sdk/issues/2854) [x/bank] Remove unused bank.MsgIssue, prevent possible panic - * [\#2884](https://github.com/cosmos/cosmos-sdk/issues/2884) [docs/examples] Fix `basecli version` panic + * [\#2733](https://github.com/cosmos/cosmos-sdk/issues/2733) [x/gov, x/mock/simulation] Fix governance simulation, update x/gov import/export + * [\#2854](https://github.com/cosmos/cosmos-sdk/issues/2854) [x/bank] Remove unused bank.MsgIssue, prevent possible panic + * [\#2884](https://github.com/cosmos/cosmos-sdk/issues/2884) [docs/examples] Fix `basecli version` panic * Tendermint - * [\#2797](https://github.com/tendermint/tendermint/pull/2797) AddressBook requires addresses to have IDs; Do not crap out immediately after sending pex addrs in seed mode + * [\#2797](https://github.com/tendermint/tendermint/pull/2797) AddressBook requires addresses to have IDs; Do not crap out immediately after sending pex addrs in seed mode ## 0.26.0 BREAKING CHANGES * Gaia - * [gaiad init] [\#2602](https://github.com/cosmos/cosmos-sdk/issues/2602) New genesis workflow + * [gaiad init] [\#2602](https://github.com/cosmos/cosmos-sdk/issues/2602) New genesis workflow * SDK - * [simulation] [\#2665](https://github.com/cosmos/cosmos-sdk/issues/2665) only argument to sdk.Invariant is now app + * [simulation] [\#2665](https://github.com/cosmos/cosmos-sdk/issues/2665) only argument to sdk.Invariant is now app * Tendermint - * Upgrade to version 0.26.0 + * Upgrade to version 0.26.0 FEATURES * Gaia CLI (`gaiacli`) - * [cli] [\#2569](https://github.com/cosmos/cosmos-sdk/pull/2569) Add commands to query validator unbondings and redelegations - * [cli] [\#2569](https://github.com/cosmos/cosmos-sdk/pull/2569) Add commands to query validator unbondings and redelegations - * [cli] [\#2524](https://github.com/cosmos/cosmos-sdk/issues/2524) Add support offline mode to `gaiacli tx sign`. Lookups are not performed if the flag `--offline` is on. - * [cli] [\#2558](https://github.com/cosmos/cosmos-sdk/issues/2558) Rename --print-sigs to --validate-signatures. It now performs a complete set of sanity checks and reports to the user. Also added --print-signature-only to print the signature only, not the whole transaction. - * [cli] [\#2704](https://github.com/cosmos/cosmos-sdk/pull/2704) New add-genesis-account convenience command to populate genesis.json with genesis accounts. + * [cli] [\#2569](https://github.com/cosmos/cosmos-sdk/pull/2569) Add commands to query validator unbondings and redelegations + * [cli] [\#2569](https://github.com/cosmos/cosmos-sdk/pull/2569) Add commands to query validator unbondings and redelegations + * [cli] [\#2524](https://github.com/cosmos/cosmos-sdk/issues/2524) Add support offline mode to `gaiacli tx sign`. Lookups are not performed if the flag `--offline` is on. + * [cli] [\#2558](https://github.com/cosmos/cosmos-sdk/issues/2558) Rename --print-sigs to --validate-signatures. It now performs a complete set of sanity checks and reports to the user. Also added --print-signature-only to print the signature only, not the whole transaction. + * [cli] [\#2704](https://github.com/cosmos/cosmos-sdk/pull/2704) New add-genesis-account convenience command to populate genesis.json with genesis accounts. * SDK - * [\#1336](https://github.com/cosmos/cosmos-sdk/issues/1336) Mechanism for SDK Users to configure their own Bech32 prefixes instead of using the default cosmos prefixes. + * [\#1336](https://github.com/cosmos/cosmos-sdk/issues/1336) Mechanism for SDK Users to configure their own Bech32 prefixes instead of using the default cosmos prefixes. IMPROVEMENTS * Gaia - * [\#2637](https://github.com/cosmos/cosmos-sdk/issues/2637) [x/gov] Switched inactive and active proposal queues to an iterator based queue +* [\#2637](https://github.com/cosmos/cosmos-sdk/issues/2637) [x/gov] Switched inactive and active proposal queues to an iterator based queue * SDK - * [\#2573](https://github.com/cosmos/cosmos-sdk/issues/2573) [x/distribution] add accum invariance - * [\#2556](https://github.com/cosmos/cosmos-sdk/issues/2556) [x/mock/simulation] Fix debugging output - * [\#2396](https://github.com/cosmos/cosmos-sdk/issues/2396) [x/mock/simulation] Change parameters to get more slashes - * [\#2617](https://github.com/cosmos/cosmos-sdk/issues/2617) [x/mock/simulation] Randomize all genesis parameters - * [\#2669](https://github.com/cosmos/cosmos-sdk/issues/2669) [x/stake] Added invarant check to make sure validator's power aligns with its spot in the power store. - * [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) [x/mock/simulation] Use a transition matrix for block size - * [\#2660](https://github.com/cosmos/cosmos-sdk/issues/2660) [x/mock/simulation] Staking transactions get tested far more frequently - * [\#2610](https://github.com/cosmos/cosmos-sdk/issues/2610) [x/stake] Block redelegation to and from the same validator - * [\#2652](https://github.com/cosmos/cosmos-sdk/issues/2652) [x/auth] Add benchmark for get and set account - * [\#2685](https://github.com/cosmos/cosmos-sdk/issues/2685) [store] Add general merkle absence proof (also for empty substores) - * [\#2708](https://github.com/cosmos/cosmos-sdk/issues/2708) [store] Disallow setting nil values +* [\#2573](https://github.com/cosmos/cosmos-sdk/issues/2573) [x/distribution] add accum invariance +* [\#2556](https://github.com/cosmos/cosmos-sdk/issues/2556) [x/mock/simulation] Fix debugging output +* [\#2396](https://github.com/cosmos/cosmos-sdk/issues/2396) [x/mock/simulation] Change parameters to get more slashes +* [\#2617](https://github.com/cosmos/cosmos-sdk/issues/2617) [x/mock/simulation] Randomize all genesis parameters +* [\#2669](https://github.com/cosmos/cosmos-sdk/issues/2669) [x/stake] Added invarant check to make sure validator's power aligns with its spot in the power store. +* [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) [x/mock/simulation] Use a transition matrix for block size +* [\#2660](https://github.com/cosmos/cosmos-sdk/issues/2660) [x/mock/simulation] Staking transactions get tested far more frequently +* [\#2610](https://github.com/cosmos/cosmos-sdk/issues/2610) [x/stake] Block redelegation to and from the same validator +* [\#2652](https://github.com/cosmos/cosmos-sdk/issues/2652) [x/auth] Add benchmark for get and set account +* [\#2685](https://github.com/cosmos/cosmos-sdk/issues/2685) [store] Add general merkle absence proof (also for empty substores) +* [\#2708](https://github.com/cosmos/cosmos-sdk/issues/2708) [store] Disallow setting nil values BUG FIXES * Gaia - * [\#2670](https://github.com/cosmos/cosmos-sdk/issues/2670) [x/stake] fixed incorrect `IterateBondedValidators` and split into two functions: `IterateBondedValidators` and `IterateLastBlockConsValidators` - * [\#2691](https://github.com/cosmos/cosmos-sdk/issues/2691) Fix local testnet creation by using a single canonical genesis time - * [\#2648](https://github.com/cosmos/cosmos-sdk/issues/2648) [gaiad] Fix `gaiad export` / `gaiad import` consistency, test in CI +* [\#2670](https://github.com/cosmos/cosmos-sdk/issues/2670) [x/stake] fixed incorrect `IterateBondedValidators` and split into two functions: `IterateBondedValidators` and `IterateLastBlockConsValidators` +* [\#2691](https://github.com/cosmos/cosmos-sdk/issues/2691) Fix local testnet creation by using a single canonical genesis time +* [\#2648](https://github.com/cosmos/cosmos-sdk/issues/2648) [gaiad] Fix `gaiad export` / `gaiad import` consistency, test in CI * SDK - * [\#2625](https://github.com/cosmos/cosmos-sdk/issues/2625) [x/gov] fix AppendTag function usage error - * [\#2677](https://github.com/cosmos/cosmos-sdk/issues/2677) [x/stake, x/distribution] various staking/distribution fixes as found by the simulator - * [\#2674](https://github.com/cosmos/cosmos-sdk/issues/2674) [types] Fix coin.IsLT() impl, coins.IsLT() impl, and renamed coins.Is\* to coins.IsAll\* (see [\#2686](https://github.com/cosmos/cosmos-sdk/issues/2686)) - * [\#2711](https://github.com/cosmos/cosmos-sdk/issues/2711) [x/stake] Add commission data to `MsgCreateValidator` signature bytes. - * Temporarily disable insecure mode for Gaia Lite +* [\#2625](https://github.com/cosmos/cosmos-sdk/issues/2625) [x/gov] fix AppendTag function usage error +* [\#2677](https://github.com/cosmos/cosmos-sdk/issues/2677) [x/stake, x/distribution] various staking/distribution fixes as found by the simulator +* [\#2674](https://github.com/cosmos/cosmos-sdk/issues/2674) [types] Fix coin.IsLT() impl, coins.IsLT() impl, and renamed coins.Is\* to coins.IsAll\* (see [\#2686](https://github.com/cosmos/cosmos-sdk/issues/2686)) +* [\#2711](https://github.com/cosmos/cosmos-sdk/issues/2711) [x/stake] Add commission data to `MsgCreateValidator` signature bytes. +* Temporarily disable insecure mode for Gaia Lite ## 0.25.0 -*October 24th, 2018* +_October 24th, 2018_ BREAKING CHANGES @@ -2612,8 +2605,8 @@ BREAKING CHANGES Bech32 prefixes have been introduced for a validator's consensus address and public key: `cosmosvalcons` and `cosmosvalconspub` respectively. Also, existing Bech32 prefixes have been renamed for accounts and validator operators: - * `cosmosaccaddr` / `cosmosaccpub` => `cosmos` / `cosmospub` - * `cosmosvaladdr` / `cosmosvalpub` => `cosmosvaloper` / `cosmosvaloperpub` + * `cosmosaccaddr` / `cosmosaccpub` => `cosmos` / `cosmospub` + * `cosmosvaladdr` / `cosmosvalpub` => `cosmosvaloper` / `cosmosvaloperpub` * [x/stake] [#1013] TendermintUpdates now uses transient store * [x/stake] [\#2435](https://github.com/cosmos/cosmos-sdk/issues/2435) Remove empty bytes from the ValidatorPowerRank store key * [x/gov] [\#2195](https://github.com/cosmos/cosmos-sdk/issues/2195) Governance uses BFT Time @@ -2622,36 +2615,36 @@ BREAKING CHANGES * [x/slashing] [\#2430](https://github.com/cosmos/cosmos-sdk/issues/2430) Simulate more slashes, check if validator is jailed before jailing * [x/stake] [\#2393](https://github.com/cosmos/cosmos-sdk/issues/2393) Removed `CompleteUnbonding` and `CompleteRedelegation` Msg types, and instead added unbonding/redelegation queues to endblocker * [x/mock/simulation] [\#2501](https://github.com/cosmos/cosmos-sdk/issues/2501) Simulate transactions & invariants for fee distribution, and fix bugs discovered in the process - * [x/auth] Simulate random fee payments - * [cmd/gaia/app] Simulate non-zero inflation - * [x/stake] Call hooks correctly in several cases related to delegation/validator updates - * [x/stake] Check full supply invariants, including yet-to-be-withdrawn fees - * [x/stake] Remove no-longer-in-use store key - * [x/slashing] Call hooks correctly when a validator is slashed - * [x/slashing] Truncate withdrawals (unbonding, redelegation) and burn change - * [x/mock/simulation] Ensure the simulation cannot set a proposer address of nil - * [x/mock/simulation] Add more event logs on begin block / end block for clarity - * [x/mock/simulation] Correctly set validator power in abci.RequestBeginBlock - * [x/minting] Correctly call stake keeper to track inflated supply - * [x/distribution] Sanity check for nonexistent rewards - * [x/distribution] Truncate withdrawals and return change to the community pool - * [x/distribution] Add sanity checks for incorrect accum / total accum relations - * [x/distribution] Correctly calculate total power using Tendermint updates - * [x/distribution] Simulate withdrawal transactions - * [x/distribution] Fix a bug where the fee pool was not correctly tracked on WithdrawDelegatorRewardsAll + * [x/auth] Simulate random fee payments + * [cmd/gaia/app] Simulate non-zero inflation + * [x/stake] Call hooks correctly in several cases related to delegation/validator updates + * [x/stake] Check full supply invariants, including yet-to-be-withdrawn fees + * [x/stake] Remove no-longer-in-use store key + * [x/slashing] Call hooks correctly when a validator is slashed + * [x/slashing] Truncate withdrawals (unbonding, redelegation) and burn change + * [x/mock/simulation] Ensure the simulation cannot set a proposer address of nil + * [x/mock/simulation] Add more event logs on begin block / end block for clarity + * [x/mock/simulation] Correctly set validator power in abci.RequestBeginBlock + * [x/minting] Correctly call stake keeper to track inflated supply + * [x/distribution] Sanity check for nonexistent rewards + * [x/distribution] Truncate withdrawals and return change to the community pool + * [x/distribution] Add sanity checks for incorrect accum / total accum relations + * [x/distribution] Correctly calculate total power using Tendermint updates + * [x/distribution] Simulate withdrawal transactions + * [x/distribution] Fix a bug where the fee pool was not correctly tracked on WithdrawDelegatorRewardsAll * [x/stake] [\#1673](https://github.com/cosmos/cosmos-sdk/issues/1673) Validators are no longer deleted until they can no longer possibly be slashed * [\#1890](https://github.com/cosmos/cosmos-sdk/issues/1890) Start chain with initial state + sequence of transactions - * [cli] Rename `gaiad init gentx` to `gaiad gentx`. - * [cli] Add `--skip-genesis` flag to `gaiad init` to prevent `genesis.json` generation. - * Drop `GenesisTx` in favor of a signed `StdTx` with only one `MsgCreateValidator` message. - * [cli] Port `gaiad init` and `gaiad testnet` to work with `StdTx` genesis transactions. - * [cli] Add `--moniker` flag to `gaiad init` to override moniker when generating `genesis.json` - i.e. it takes effect when running with the `--with-txs` flag, it is ignored otherwise. + * [cli] Rename `gaiad init gentx` to `gaiad gentx`. + * [cli] Add `--skip-genesis` flag to `gaiad init` to prevent `genesis.json` generation. + * Drop `GenesisTx` in favor of a signed `StdTx` with only one `MsgCreateValidator` message. + * [cli] Port `gaiad init` and `gaiad testnet` to work with `StdTx` genesis transactions. + * [cli] Add `--moniker` flag to `gaiad init` to override moniker when generating `genesis.json` - i.e. it takes effect when running with the `--with-txs` flag, it is ignored otherwise. * SDK * [core] [\#2219](https://github.com/cosmos/cosmos-sdk/issues/2219) Update to Tendermint 0.24.0 - * Validator set updates delayed by one block - * BFT timestamp that can safely be used by applications - * Fixed maximum block size enforcement + * Validator set updates delayed by one block + * BFT timestamp that can safely be used by applications + * Fixed maximum block size enforcement * [core] [\#1807](https://github.com/cosmos/cosmos-sdk/issues/1807) Switch from use of rational to decimal * [types] [\#1901](https://github.com/cosmos/cosmos-sdk/issues/1901) Validator interface's GetOwner() renamed to GetOperator() * [x/slashing] [#2122](https://github.com/cosmos/cosmos-sdk/pull/2122) - Implement slashing period @@ -2683,67 +2676,67 @@ BREAKING CHANGES * [types] [\#2456](https://github.com/cosmos/cosmos-sdk/issues/2456) Renamed msg.Name() and msg.Type() to msg.Type() and msg.Route() respectively * Tendermint - * Update tendermint version from v0.23.0 to v0.25.0, notable changes - * Mempool now won't build too large blocks, or too computationally expensive blocks - * Maximum tx sizes and gas are now removed, and are implicitly the blocks maximums - * ABCI validators no longer send the pubkey. The pubkey is only sent in validator updates - * Validator set changes are now delayed by one block - * Block header now includes the next validator sets hash - * BFT time is implemented - * Secp256k1 signature format has changed - * There is now a threshold multisig format - * See the [tendermint changelog](https://github.com/tendermint/tendermint/blob/master/CHANGELOG.md) for other changes. + * Update tendermint version from v0.23.0 to v0.25.0, notable changes + * Mempool now won't build too large blocks, or too computationally expensive blocks + * Maximum tx sizes and gas are now removed, and are implicitly the blocks maximums + * ABCI validators no longer send the pubkey. The pubkey is only sent in validator updates + * Validator set changes are now delayed by one block + * Block header now includes the next validator sets hash + * BFT time is implemented + * Secp256k1 signature format has changed + * There is now a threshold multisig format + * See the [tendermint changelog](https://github.com/tendermint/tendermint/blob/master/CHANGELOG.md) for other changes. FEATURES * Gaia REST API (`gaiacli advanced rest-server`) - * [gaia-lite] Endpoints to query staking pool and params - * [gaia-lite] [\#2110](https://github.com/cosmos/cosmos-sdk/issues/2110) Add support for `simulate=true` requests query argument to endpoints that send txs to run simulations of transactions - * [gaia-lite] [\#966](https://github.com/cosmos/cosmos-sdk/issues/966) Add support for `generate_only=true` query argument to generate offline unsigned transactions - * [gaia-lite] [\#1953](https://github.com/cosmos/cosmos-sdk/issues/1953) Add /sign endpoint to sign transactions generated with `generate_only=true`. - * [gaia-lite] [\#1954](https://github.com/cosmos/cosmos-sdk/issues/1954) Add /broadcast endpoint to broadcast transactions signed by the /sign endpoint. - * [gaia-lite] [\#2113](https://github.com/cosmos/cosmos-sdk/issues/2113) Rename `/accounts/{address}/send` to `/bank/accounts/{address}/transfers`, rename `/accounts/{address}` to `/auth/accounts/{address}`, replace `proposal-id` with `proposalId` in all gov endpoints - * [gaia-lite] [\#2478](https://github.com/cosmos/cosmos-sdk/issues/2478) Add query gov proposal's deposits endpoint - * [gaia-lite] [\#2477](https://github.com/cosmos/cosmos-sdk/issues/2477) Add query validator's outgoing redelegations and unbonding delegations endpoints + * [gaia-lite] Endpoints to query staking pool and params + * [gaia-lite] [\#2110](https://github.com/cosmos/cosmos-sdk/issues/2110) Add support for `simulate=true` requests query argument to endpoints that send txs to run simulations of transactions + * [gaia-lite] [\#966](https://github.com/cosmos/cosmos-sdk/issues/966) Add support for `generate_only=true` query argument to generate offline unsigned transactions + * [gaia-lite] [\#1953](https://github.com/cosmos/cosmos-sdk/issues/1953) Add /sign endpoint to sign transactions generated with `generate_only=true`. + * [gaia-lite] [\#1954](https://github.com/cosmos/cosmos-sdk/issues/1954) Add /broadcast endpoint to broadcast transactions signed by the /sign endpoint. + * [gaia-lite] [\#2113](https://github.com/cosmos/cosmos-sdk/issues/2113) Rename `/accounts/{address}/send` to `/bank/accounts/{address}/transfers`, rename `/accounts/{address}` to `/auth/accounts/{address}`, replace `proposal-id` with `proposalId` in all gov endpoints + * [gaia-lite] [\#2478](https://github.com/cosmos/cosmos-sdk/issues/2478) Add query gov proposal's deposits endpoint + * [gaia-lite] [\#2477](https://github.com/cosmos/cosmos-sdk/issues/2477) Add query validator's outgoing redelegations and unbonding delegations endpoints * Gaia CLI (`gaiacli`) - * [cli] Cmds to query staking pool and params - * [gov][cli] [\#2062](https://github.com/cosmos/cosmos-sdk/issues/2062) added `--proposal` flag to `submit-proposal` that allows a JSON file containing a proposal to be passed in - * [\#2040](https://github.com/cosmos/cosmos-sdk/issues/2040) Add `--bech` to `gaiacli keys show` and respective REST endpoint to + * [cli] Cmds to query staking pool and params + * [gov][cli] [\#2062](https://github.com/cosmos/cosmos-sdk/issues/2062) added `--proposal` flag to `submit-proposal` that allows a JSON file containing a proposal to be passed in + * [\#2040](https://github.com/cosmos/cosmos-sdk/issues/2040) Add `--bech` to `gaiacli keys show` and respective REST endpoint to provide desired Bech32 prefix encoding - * [cli] [\#2047](https://github.com/cosmos/cosmos-sdk/issues/2047) [\#2306](https://github.com/cosmos/cosmos-sdk/pull/2306) Passing --gas=simulate triggers a simulation of the tx before the actual execution. + * [cli] [\#2047](https://github.com/cosmos/cosmos-sdk/issues/2047) [\#2306](https://github.com/cosmos/cosmos-sdk/pull/2306) Passing --gas=simulate triggers a simulation of the tx before the actual execution. The gas estimate obtained via the simulation will be used as gas limit in the actual execution. - * [cli] [\#2047](https://github.com/cosmos/cosmos-sdk/issues/2047) The --gas-adjustment flag can be used to adjust the estimate obtained via the simulation triggered by --gas=simulate. - * [cli] [\#2110](https://github.com/cosmos/cosmos-sdk/issues/2110) Add --dry-run flag to perform a simulation of a transaction without broadcasting it. The --gas flag is ignored as gas would be automatically estimated. - * [cli] [\#2204](https://github.com/cosmos/cosmos-sdk/issues/2204) Support generating and broadcasting messages with multiple signatures via command line: - * [\#966](https://github.com/cosmos/cosmos-sdk/issues/966) Add --generate-only flag to build an unsigned transaction and write it to STDOUT. - * [\#1953](https://github.com/cosmos/cosmos-sdk/issues/1953) New `sign` command to sign transactions generated with the --generate-only flag. - * [\#1954](https://github.com/cosmos/cosmos-sdk/issues/1954) New `broadcast` command to broadcast transactions generated offline and signed with the `sign` command. - * [cli] [\#2220](https://github.com/cosmos/cosmos-sdk/issues/2220) Add `gaiacli config` feature to interactively create CLI config files to reduce the number of required flags - * [stake][cli] [\#1672](https://github.com/cosmos/cosmos-sdk/issues/1672) Introduced + * [cli] [\#2047](https://github.com/cosmos/cosmos-sdk/issues/2047) The --gas-adjustment flag can be used to adjust the estimate obtained via the simulation triggered by --gas=simulate. + * [cli] [\#2110](https://github.com/cosmos/cosmos-sdk/issues/2110) Add --dry-run flag to perform a simulation of a transaction without broadcasting it. The --gas flag is ignored as gas would be automatically estimated. + * [cli] [\#2204](https://github.com/cosmos/cosmos-sdk/issues/2204) Support generating and broadcasting messages with multiple signatures via command line: + * [\#966](https://github.com/cosmos/cosmos-sdk/issues/966) Add --generate-only flag to build an unsigned transaction and write it to STDOUT. + * [\#1953](https://github.com/cosmos/cosmos-sdk/issues/1953) New `sign` command to sign transactions generated with the --generate-only flag. + * [\#1954](https://github.com/cosmos/cosmos-sdk/issues/1954) New `broadcast` command to broadcast transactions generated offline and signed with the `sign` command. + * [cli] [\#2220](https://github.com/cosmos/cosmos-sdk/issues/2220) Add `gaiacli config` feature to interactively create CLI config files to reduce the number of required flags + * [stake][cli] [\#1672](https://github.com/cosmos/cosmos-sdk/issues/1672) Introduced new commission flags for validator commands `create-validator` and `edit-validator`. - * [stake][cli] [\#1890](https://github.com/cosmos/cosmos-sdk/issues/1890) Add `--genesis-format` flag to `gaiacli tx create-validator` to produce transactions in genesis-friendly format. - * [cli][\#2554](https://github.com/cosmos/cosmos-sdk/issues/2554) Make `gaiacli keys show` multisig ready. + * [stake][cli] [\#1890](https://github.com/cosmos/cosmos-sdk/issues/1890) Add `--genesis-format` flag to `gaiacli tx create-validator` to produce transactions in genesis-friendly format. + * [cli][\#2554](https://github.com/cosmos/cosmos-sdk/issues/2554) Make `gaiacli keys show` multisig ready. * Gaia - * [cli] [\#2170](https://github.com/cosmos/cosmos-sdk/issues/2170) added ability to show the node's address via `gaiad tendermint show-address` - * [simulation] [\#2313](https://github.com/cosmos/cosmos-sdk/issues/2313) Reworked `make test_sim_gaia_slow` to `make test_sim_gaia_full`, now simulates from multiple starting seeds in parallel - * [cli] [\#1921] (https://github.com/cosmos/cosmos-sdk/issues/1921) - * New configuration file `gaiad.toml` is now created to host Gaia-specific configuration. - * New --minimum_fees/minimum_fees flag/config option to set a minimum fee. + * [cli] [\#2170](https://github.com/cosmos/cosmos-sdk/issues/2170) added ability to show the node's address via `gaiad tendermint show-address` + * [simulation] [\#2313](https://github.com/cosmos/cosmos-sdk/issues/2313) Reworked `make test_sim_gaia_slow` to `make test_sim_gaia_full`, now simulates from multiple starting seeds in parallel + * [cli] [\#1921] (https://github.com/cosmos/cosmos-sdk/issues/1921) + * New configuration file `gaiad.toml` is now created to host Gaia-specific configuration. + * New --minimum_fees/minimum_fees flag/config option to set a minimum fee. * SDK - * [querier] added custom querier functionality, so ABCI query requests can be handled by keepers - * [simulation] [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) allow operations to specify future operations - * [simulation] [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) Add benchmarking capabilities, with makefile commands "test_sim_gaia_benchmark, test_sim_gaia_profile" - * [simulation] [\#2349](https://github.com/cosmos/cosmos-sdk/issues/2349) Add time-based future scheduled operations to simulator - * [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) Remove FeePayer() from StdTx - * [x/stake] [\#1672](https://github.com/cosmos/cosmos-sdk/issues/1672) Implement + * [querier] added custom querier functionality, so ABCI query requests can be handled by keepers + * [simulation] [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) allow operations to specify future operations + * [simulation] [\#1924](https://github.com/cosmos/cosmos-sdk/issues/1924) Add benchmarking capabilities, with makefile commands "test_sim_gaia_benchmark, test_sim_gaia_profile" + * [simulation] [\#2349](https://github.com/cosmos/cosmos-sdk/issues/2349) Add time-based future scheduled operations to simulator + * [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) Remove FeePayer() from StdTx + * [x/stake] [\#1672](https://github.com/cosmos/cosmos-sdk/issues/1672) Implement basis for the validator commission model. - * [x/auth] Support account removal in the account mapper. - + * [x/auth] Support account removal in the account mapper. IMPROVEMENTS + * [tools] Improved terraform and ansible scripts for infrastructure deployment * [tools] Added ansible script to enable process core dumps @@ -2801,9 +2794,9 @@ BUG FIXES * [cli] [\#2547](https://github.com/cosmos/cosmos-sdk/issues/2547) Mark --to and --amount as required flags for `gaiacli tx send`. * Gaia - * [x/stake] Return correct Tendermint validator update set on `EndBlocker` by not + * [x/stake] Return correct Tendermint validator update set on `EndBlocker` by not including non previously bonded validators that have zero power. [#2189](https://github.com/cosmos/cosmos-sdk/issues/2189) - * [docs] Fixed light client section links + * [docs] Fixed light client section links * SDK * [\#1988](https://github.com/cosmos/cosmos-sdk/issues/1988) Make us compile on OpenBSD (disable ledger) [#1988] (https://github.com/cosmos/cosmos-sdk/issues/1988) @@ -2819,60 +2812,60 @@ BUG FIXES ## 0.24.2 -*August 22nd, 2018* +_August 22nd, 2018_ BUG FIXES * Tendermint - - Fix unbounded consensus WAL growth + - Fix unbounded consensus WAL growth ## 0.24.1 -*August 21st, 2018* +_August 21st, 2018_ BUG FIXES * Gaia - - [x/slashing] Evidence tracking now uses validator address instead of validator pubkey + - [x/slashing] Evidence tracking now uses validator address instead of validator pubkey ## 0.24.0 -*August 13th, 2018* +_August 13th, 2018_ BREAKING CHANGES * Gaia REST API (`gaiacli advanced rest-server`) - - [x/stake] [\#1880](https://github.com/cosmos/cosmos-sdk/issues/1880) More REST-ful endpoints (large refactor) - - [x/slashing] [\#1866](https://github.com/cosmos/cosmos-sdk/issues/1866) `/slashing/signing_info` takes cosmosvalpub instead of cosmosvaladdr - - use time.Time instead of int64 for time. See Tendermint v0.23.0 - - Signatures are no longer Amino encoded with prefixes (just encoded as raw + - [x/stake] [\#1880](https://github.com/cosmos/cosmos-sdk/issues/1880) More REST-ful endpoints (large refactor) + - [x/slashing] [\#1866](https://github.com/cosmos/cosmos-sdk/issues/1866) `/slashing/signing_info` takes cosmosvalpub instead of cosmosvaladdr + - use time.Time instead of int64 for time. See Tendermint v0.23.0 + - Signatures are no longer Amino encoded with prefixes (just encoded as raw bytes) - see Tendermint v0.23.0 * Gaia CLI (`gaiacli`) - - [x/stake] change `--keybase-sig` to `--identity` - - [x/stake] [\#1828](https://github.com/cosmos/cosmos-sdk/issues/1828) Force user to specify amount on create-validator command by removing default - - [x/gov] Change `--proposalID` to `--proposal-id` - - [x/stake, x/gov] [\#1606](https://github.com/cosmos/cosmos-sdk/issues/1606) Use `--from` instead of adhoc flags like `--address-validator` + - [x/stake] change `--keybase-sig` to `--identity` + - [x/stake] [\#1828](https://github.com/cosmos/cosmos-sdk/issues/1828) Force user to specify amount on create-validator command by removing default + - [x/gov] Change `--proposalID` to `--proposal-id` + - [x/stake, x/gov] [\#1606](https://github.com/cosmos/cosmos-sdk/issues/1606) Use `--from` instead of adhoc flags like `--address-validator` and `--proposer` to indicate the sender address. - - [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551) Remove `--name` completely - - Genesis/key creation (`gaiad init`) now supports user-provided key passwords + - [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551) Remove `--name` completely + - Genesis/key creation (`gaiad init`) now supports user-provided key passwords * Gaia - - [x/stake] Inflation doesn't use rationals in calculation (performance boost) - - [x/stake] Persist a map from `addr->pubkey` in the state since BeginBlock + - [x/stake] Inflation doesn't use rationals in calculation (performance boost) + - [x/stake] Persist a map from `addr->pubkey` in the state since BeginBlock doesn't provide pubkeys. - - [x/gov] [\#1781](https://github.com/cosmos/cosmos-sdk/issues/1781) Added tags sub-package, changed tags to use dash-case - - [x/gov] [\#1688](https://github.com/cosmos/cosmos-sdk/issues/1688) Governance parameters are now stored in globalparams store - - [x/gov] [\#1859](https://github.com/cosmos/cosmos-sdk/issues/1859) Slash validators who do not vote on a proposal - - [x/gov] [\#1914](https://github.com/cosmos/cosmos-sdk/issues/1914) added TallyResult type that gets stored in Proposal after tallying is finished + - [x/gov] [\#1781](https://github.com/cosmos/cosmos-sdk/issues/1781) Added tags sub-package, changed tags to use dash-case + - [x/gov] [\#1688](https://github.com/cosmos/cosmos-sdk/issues/1688) Governance parameters are now stored in globalparams store + - [x/gov] [\#1859](https://github.com/cosmos/cosmos-sdk/issues/1859) Slash validators who do not vote on a proposal + - [x/gov] [\#1914](https://github.com/cosmos/cosmos-sdk/issues/1914) added TallyResult type that gets stored in Proposal after tallying is finished * SDK - - [baseapp] Msgs are no longer run on CheckTx, removed `ctx.IsCheckTx()` - - [baseapp] NewBaseApp constructor takes sdk.TxDecoder as argument instead of wire.Codec - - [types] sdk.NewCoin takes sdk.Int, sdk.NewInt64Coin takes int64 - - [x/auth] Default TxDecoder can be found in `x/auth` rather than baseapp - - [client] [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551): Refactored `CoreContext` to `TxContext` and `QueryContext` - - Removed all tx related fields and logic (building & signing) to separate + - [baseapp] Msgs are no longer run on CheckTx, removed `ctx.IsCheckTx()` + - [baseapp] NewBaseApp constructor takes sdk.TxDecoder as argument instead of wire.Codec + - [types] sdk.NewCoin takes sdk.Int, sdk.NewInt64Coin takes int64 + - [x/auth] Default TxDecoder can be found in `x/auth` rather than baseapp + - [client] [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551): Refactored `CoreContext` to `TxContext` and `QueryContext` + - Removed all tx related fields and logic (building & signing) to separate structure `TxContext` in `x/auth/client/context` * Tendermint @@ -2894,148 +2887,161 @@ FEATURES - [x/stake] [\#2043](https://github.com/cosmos/cosmos-sdk/issues/2043) Added staking query cli cmds for unbonding-delegations and redelegations * Gaia - - [networks] Added ansible scripts to upgrade seed nodes on a network + - [networks] Added ansible scripts to upgrade seed nodes on a network * SDK - - [x/mock/simulation] Randomized simulation framework - - Modules specify invariants and operations, preferably in an x/[module]/simulation package - - Modules can test random combinations of their own operations - - Applications can integrate operations and invariants from modules together for an integrated simulation - - Simulates Tendermint's algorithm for validator set updates - - Simulates validator signing/downtime with a Markov chain, and occaisional double-signatures - - Includes simulated operations & invariants for staking, slashing, governance, and bank modules - - [store] [\#1481](https://github.com/cosmos/cosmos-sdk/issues/1481) Add transient store - - [baseapp] Initialize validator set on ResponseInitChain - - [baseapp] added BaseApp.Seal - ability to seal baseapp parameters once they've been set - - [cosmos-sdk-cli] New `cosmos-sdk-cli` tool to quickly initialize a new + - [x/mock/simulation] Randomized simulation framework + - Modules specify invariants and operations, preferably in an x/[module]/simulation package + - Modules can test random combinations of their own operations + - Applications can integrate operations and invariants from modules together for an integrated simulation + - Simulates Tendermint's algorithm for validator set updates + - Simulates validator signing/downtime with a Markov chain, and occaisional double-signatures + - Includes simulated operations & invariants for staking, slashing, governance, and bank modules + - [store] [\#1481](https://github.com/cosmos/cosmos-sdk/issues/1481) Add transient store + - [baseapp] Initialize validator set on ResponseInitChain + - [baseapp] added BaseApp.Seal - ability to seal baseapp parameters once they've been set + - [cosmos-sdk-cli] New `cosmos-sdk-cli` tool to quickly initialize a new SDK-based project - - [scripts] added log output monitoring to DataDog using Ansible scripts + - [scripts] added log output monitoring to DataDog using Ansible scripts IMPROVEMENTS * Gaia - - [spec] [\#967](https://github.com/cosmos/cosmos-sdk/issues/967) Inflation and distribution specs drastically improved - - [x/gov] [\#1773](https://github.com/cosmos/cosmos-sdk/issues/1773) Votes on a proposal can now be queried - - [x/gov] Initial governance parameters can now be set in the genesis file - - [x/stake] [\#1815](https://github.com/cosmos/cosmos-sdk/issues/1815) Sped up the processing of `EditValidator` txs. - - [config] [\#1930](https://github.com/cosmos/cosmos-sdk/issues/1930) Transactions indexer indexes all tags by default. - - [ci] [#2057](https://github.com/cosmos/cosmos-sdk/pull/2057) Run `make localnet-start` on every commit and ensure network reaches at least 10 blocks + - [spec] [\#967](https://github.com/cosmos/cosmos-sdk/issues/967) Inflation and distribution specs drastically improved + - [x/gov] [\#1773](https://github.com/cosmos/cosmos-sdk/issues/1773) Votes on a proposal can now be queried + - [x/gov] Initial governance parameters can now be set in the genesis file + - [x/stake] [\#1815](https://github.com/cosmos/cosmos-sdk/issues/1815) Sped up the processing of `EditValidator` txs. + - [config] [\#1930](https://github.com/cosmos/cosmos-sdk/issues/1930) Transactions indexer indexes all tags by default. + - [ci] [#2057](https://github.com/cosmos/cosmos-sdk/pull/2057) Run `make localnet-start` on every commit and ensure network reaches at least 10 blocks * SDK - - [baseapp] [\#1587](https://github.com/cosmos/cosmos-sdk/issues/1587) Allow any alphanumeric character in route - - [baseapp] Allow any alphanumeric character in route - - [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` - - [x/auth] Recover ErrorOutOfGas panic in order to set sdk.Result attributes correctly - - [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) No longer runs any signature in a multi-msg, if any account/sequence number is wrong. - - [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) No longer charge gas for subtracting fees - - [x/bank] Unit tests are now table-driven - - [tests] Add tests to example apps in docs - - [tests] Fixes ansible scripts to work with AWS too - - [tests] [\#1806](https://github.com/cosmos/cosmos-sdk/issues/1806) CLI tests are now behind the build flag 'cli_test', so go test works on a new repo + - [baseapp] [\#1587](https://github.com/cosmos/cosmos-sdk/issues/1587) Allow any alphanumeric character in route + - [baseapp] Allow any alphanumeric character in route + - [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` + - [x/auth] Recover ErrorOutOfGas panic in order to set sdk.Result attributes correctly + - [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) No longer runs any signature in a multi-msg, if any account/sequence number is wrong. + - [x/auth] [\#2376](https://github.com/cosmos/cosmos-sdk/issues/2376) No longer charge gas for subtracting fees + - [x/bank] Unit tests are now table-driven + - [tests] Add tests to example apps in docs + - [tests] Fixes ansible scripts to work with AWS too + - [tests] [\#1806](https://github.com/cosmos/cosmos-sdk/issues/1806) CLI tests are now behind the build flag 'cli_test', so go test works on a new repo BUG FIXES * Gaia CLI (`gaiacli`) - - [\#1766](https://github.com/cosmos/cosmos-sdk/issues/1766) Fixes bad example for keybase identity - - [x/stake] [\#2021](https://github.com/cosmos/cosmos-sdk/issues/2021) Fixed repeated CLI commands in staking + - [\#1766](https://github.com/cosmos/cosmos-sdk/issues/1766) Fixes bad example for keybase identity + - [x/stake] [\#2021](https://github.com/cosmos/cosmos-sdk/issues/2021) Fixed repeated CLI commands in staking * Gaia - - [x/stake] [#2077](https://github.com/cosmos/cosmos-sdk/pull/2077) Fixed invalid cliff power comparison - - [\#1804](https://github.com/cosmos/cosmos-sdk/issues/1804) Fixes gen-tx genesis generation logic temporarily until upstream updates - - [\#1799](https://github.com/cosmos/cosmos-sdk/issues/1799) Fix `gaiad export` - - [\#1839](https://github.com/cosmos/cosmos-sdk/issues/1839) Fixed bug where intra-tx counter wasn't set correctly for genesis validators - - [x/stake] [\#1858](https://github.com/cosmos/cosmos-sdk/issues/1858) Fixed bug where the cliff validator was not updated correctly - - [tests] [\#1675](https://github.com/cosmos/cosmos-sdk/issues/1675) Fix non-deterministic `test_cover` - - [tests] [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551) Fixed invalid LCD test JSON payload in `doIBCTransfer` - - [basecoin] Fixes coin transaction failure and account query [discussion](https://forum.cosmos.network/t/unmarshalbinarybare-expected-to-read-prefix-bytes-75fbfab8-since-it-is-registered-concrete-but-got-0a141dfa/664/6) - - [x/gov] [\#1757](https://github.com/cosmos/cosmos-sdk/issues/1757) Fix VoteOption conversion to String - * [x/stake] [#2083] Fix broken invariant of bonded validator power decrease + - [x/stake] [#2077](https://github.com/cosmos/cosmos-sdk/pull/2077) Fixed invalid cliff power comparison + - [\#1804](https://github.com/cosmos/cosmos-sdk/issues/1804) Fixes gen-tx genesis generation logic temporarily until upstream updates + - [\#1799](https://github.com/cosmos/cosmos-sdk/issues/1799) Fix `gaiad export` + - [\#1839](https://github.com/cosmos/cosmos-sdk/issues/1839) Fixed bug where intra-tx counter wasn't set correctly for genesis validators + - [x/stake] [\#1858](https://github.com/cosmos/cosmos-sdk/issues/1858) Fixed bug where the cliff validator was not updated correctly + - [tests] [\#1675](https://github.com/cosmos/cosmos-sdk/issues/1675) Fix non-deterministic `test_cover` + - [tests] [\#1551](https://github.com/cosmos/cosmos-sdk/issues/1551) Fixed invalid LCD test JSON payload in `doIBCTransfer` + - [basecoin] Fixes coin transaction failure and account query [discussion](https://forum.cosmos.network/t/unmarshalbinarybare-expected-to-read-prefix-bytes-75fbfab8-since-it-is-registered-concrete-but-got-0a141dfa/664/6) + - [x/gov] [\#1757](https://github.com/cosmos/cosmos-sdk/issues/1757) Fix VoteOption conversion to String + * [x/stake] [#2083] Fix broken invariant of bonded validator power decrease ## 0.23.1 -*July 27th, 2018* +_July 27th, 2018_ BUG FIXES - * [tendermint] Update to v0.22.8 + +* [tendermint] Update to v0.22.8 - [consensus, blockchain] Register the Evidence interface so it can be marshalled/unmarshalled by the blockchain and consensus reactors ## 0.23.0 -*July 25th, 2018* +_July 25th, 2018_ BREAKING CHANGES + * [x/stake] Fixed the period check for the inflation calculation IMPROVEMENTS + * [cli] Improve error messages for all txs when the account doesn't exist * [tendermint] Update to v0.22.6 - Updates the crypto imports/API (#1966) * [x/stake] Add revoked to human-readable validator BUG FIXES + * [tendermint] Update to v0.22.6 - Fixes some security vulnerabilities reported in the [Bug Bounty](https://hackerone.com/tendermint) -* [\#1797](https://github.com/cosmos/cosmos-sdk/issues/1797) Fix off-by-one error in slashing for downtime -* [\#1787](https://github.com/cosmos/cosmos-sdk/issues/1787) Fixed bug where Tally fails due to revoked/unbonding validator -* [\#1666](https://github.com/cosmos/cosmos-sdk/issues/1666) Add intra-tx counter to the genesis validators +* [\#1797](https://github.com/cosmos/cosmos-sdk/issues/1797) Fix off-by-one error in slashing for downtime +* [\#1787](https://github.com/cosmos/cosmos-sdk/issues/1787) Fixed bug where Tally fails due to revoked/unbonding validator +* [\#1666](https://github.com/cosmos/cosmos-sdk/issues/1666) Add intra-tx counter to the genesis validators ## 0.22.0 -*July 16th, 2018* +_July 16th, 2018_ BREAKING CHANGES + * [x/gov] Increase VotingPeriod, DepositPeriod, and MinDeposit IMPROVEMENTS + * [gaiad] Default config updates: - `timeout_commit=5000` so blocks only made every 5s - `prof_listen_addr=localhost:6060` so profile server is on by default - `p2p.send_rate` and `p2p.recv_rate` increases 10x (~5MB/s) BUG FIXES + * [server] Fix to actually overwrite default tendermint config ## 0.21.1 -*July 14th, 2018* +_July 14th, 2018_ BUG FIXES + * [build] Added Ledger build support via `LEDGER_ENABLED=true|false` - * True by default except when cross-compiling + * True by default except when cross-compiling ## 0.21.0 -*July 13th, 2018* +_July 13th, 2018_ BREAKING CHANGES + * [x/stake] Specify DelegatorAddress in MsgCreateValidator * [x/stake] Remove the use of global shares in the pool - * Remove the use of `PoolShares` type in `x/stake/validator` type - replace with `Status` `Tokens` fields + * Remove the use of `PoolShares` type in `x/stake/validator` type - replace with `Status` `Tokens` fields * [x/auth] NewAccountMapper takes a constructor instead of a prototype * [keys] Keybase.Update function now takes in a function to get the newpass, rather than the password itself FEATURES + * [baseapp] NewBaseApp now takes option functions as parameters IMPROVEMENTS + * Updated docs folder to accommodate cosmos.network docs project * [store] Added support for tracing multi-store operations via `--trace-store` * [store] Pruning strategy configurable with pruning flag on gaiad start BUG FIXES + * [\#1630](https://github.com/cosmos/cosmos-sdk/issues/1630) - redelegation nolonger removes tokens from the delegator liquid account * [keys] [\#1629](https://github.com/cosmos/cosmos-sdk/issues/1629) - updating password no longer asks for a new password when the first entered password was incorrect * [lcd] importing an account would create a random account * [server] 'gaiad init' command family now writes provided name as the moniker in `config.toml` * [build] Added Ledger build support via `LEDGER_ENABLED=true|false` - * True by default except when cross-compiling + * True by default except when cross-compiling ## 0.20.0 -*July 10th, 2018* +_July 10th, 2018_ BREAKING CHANGES + * msg.GetSignBytes() returns sorted JSON (by key) * msg.GetSignBytes() field changes * `msg_bytes` -> `msgs` @@ -3046,7 +3052,7 @@ BREAKING CHANGES * ED25519 addresses are the first 20-bytes of the SHA256 of the raw 32-byte pubkey (Instead of RIPEMD160) * go-crypto, abci, tmlibs have been merged into Tendermint - * The keys sub-module is now in the SDK + * The keys sub-module is now in the SDK * Various other fixes * [auth] Signers of a transaction now only sign over their own account and sequence number * [auth] Removed MsgChangePubKey @@ -3060,21 +3066,21 @@ BREAKING CHANGES * [keys] Keybase and Ledger support from go-crypto merged into the SDK in the `crypto` folder * [cli] Rearranged commands under subcommands * [x/slashing] Update slashing for unbonding period - * Slash according to power at time of infraction instead of power at + * Slash according to power at time of infraction instead of power at time of discovery - * Iterate through unbonding delegations & redelegations which contributed + * Iterate through unbonding delegations & redelegations which contributed to an infraction, slash them proportional to their stake at the time - * Add REST endpoint to unrevoke a validator previously revoked for downtime - * Add REST endpoint to retrieve liveness signing information for a validator + * Add REST endpoint to unrevoke a validator previously revoked for downtime + * Add REST endpoint to retrieve liveness signing information for a validator * [x/stake] Remove Tick and add EndBlocker * [x/stake] most index keys nolonger hold a value - inputs are rearranged to form the desired key * [x/stake] store-value for delegation, validator, ubd, and red do not hold duplicate information contained store-key * [x/stake] Introduce concept of unbonding for delegations and validators - * `gaiacli stake unbond` replaced with `gaiacli stake begin-unbonding` - * Introduced: - * `gaiacli stake complete-unbonding` - * `gaiacli stake begin-redelegation` - * `gaiacli stake complete-redelegation` + * `gaiacli stake unbond` replaced with `gaiacli stake begin-unbonding` + * Introduced: + * `gaiacli stake complete-unbonding` + * `gaiacli stake begin-redelegation` + * `gaiacli stake complete-redelegation` * [lcd] Switch key creation output to return bech32 * [lcd] Removed shorthand CLI flags (`a`, `c`, `n`, `o`) * [gaiad] genesis transactions now use bech32 addresses / pubkeys @@ -3082,36 +3088,38 @@ BREAKING CHANGES * [gov] VoteOption, ProposalType, and ProposalStatus all marshal to string form in JSON DEPRECATED + * [cli] Deprecated `--name` flag in commands that send txs, in favor of `--from` FEATURES + * [x/gov] Implemented MVP - * Supported proposal types: just binary (pass/fail) TextProposals for now - * Proposals need deposits to be votable; deposits are burned if proposal fails - * Delegators delegate votes to validator by default but can override (for their stake) + * Supported proposal types: just binary (pass/fail) TextProposals for now + * Proposals need deposits to be votable; deposits are burned if proposal fails + * Delegators delegate votes to validator by default but can override (for their stake) * [gaiacli] Ledger support added - - You can now use a Ledger with `gaiacli --ledger` for all key-related commands - - Ledger keys can be named and tracked locally in the key DB + - You can now use a Ledger with `gaiacli --ledger` for all key-related commands + - Ledger keys can be named and tracked locally in the key DB * [gaiacli] You can now attach a simple text-only memo to any transaction, with the `--memo` flag * [gaiacli] added the following flags for commands that post transactions to the chain: - * async -- send the tx without waiting for a tendermint response - * json -- return the output in json format for increased readability - * print-response -- return the tx response. (includes fields like gas cost) + * async -- send the tx without waiting for a tendermint response + * json -- return the output in json format for increased readability + * print-response -- return the tx response. (includes fields like gas cost) * [lcd] Queried TXs now include the tx hash to identify each tx * [mockapp] CompleteSetup() no longer takes a testing parameter * [x/bank] Add benchmarks for signing and delivering a block with a single bank transaction - * Run with `cd x/bank && go test --bench=.` + * Run with `cd x/bank && go test --bench=.` * [tools] make get_tools installs tendermint's linter, and gometalinter * [tools] Switch gometalinter to the stable version * [tools] Add the following linters - * misspell - * gofmt - * go vet -composites=false - * unconvert - * ineffassign - * errcheck - * unparam - * gocyclo + * misspell + * gofmt + * go vet -composites=false + * unconvert + * ineffassign + * errcheck + * unparam + * gocyclo * [tools] Added `make format` command to automate fixing misspell and gofmt errors. * [server] Default config now creates a profiler at port 6060, and increase p2p send/recv rates * [types] Switches internal representation of Int/Uint/Rat to use pointers @@ -3119,13 +3127,15 @@ FEATURES * [gaiad] `unsafe_reset_all` now resets addrbook.json * [democoin] add x/oracle, x/assoc * [tests] created a randomized testing framework. - - Currently bank has limited functionality in the framework - - Auth has its invariants checked within the framework + - Currently bank has limited functionality in the framework + - Auth has its invariants checked within the framework * [tests] Add WaitForNextNBlocksTM helper method * [keys] New keys now have 24 word recovery keys, for heightened security + - [keys] Add a temporary method for exporting the private key IMPROVEMENTS + * [x/bank] Now uses go-wire codec instead of 'encoding/json' * [x/auth] Now uses go-wire codec instead of 'encoding/json' * revised use of endblock and beginblock @@ -3141,6 +3151,7 @@ IMPROVEMENTS * [docs] Added commands for governance CLI on testnet README BUG FIXES + * [x/slashing] [\#1510](https://github.com/cosmos/cosmos-sdk/issues/1510) Unrevoked validators cannot un-revoke themselves * [x/stake] [\#1513](https://github.com/cosmos/cosmos-sdk/issues/1513) Validators slashed to zero power are unbonded and removed from the store * [x/stake] [\#1567](https://github.com/cosmos/cosmos-sdk/issues/1567) Validators decreased in power but not unbonded are now updated in Tendermint @@ -3168,21 +3179,23 @@ BUG FIXES * [x/stake] fix bug when unbonding/redelegating using `--shares-percent` * [\#1010](https://github.com/cosmos/cosmos-sdk/issues/1010) - two validators can't bond with the same pubkey anymore - ## 0.19.0 -*June 13, 2018* +_June 13, 2018_ BREAKING CHANGES + * msg.GetSignBytes() now returns bech32-encoded addresses in all cases * [lcd] REST end-points now include gas * sdk.Coin now uses sdk.Int, a big.Int wrapper with 256bit range cap FEATURES + * [x/auth] Added AccountNumbers to BaseAccount and StdTxs to allow for replay protection with account pruning * [lcd] added an endpoint to query for the SDK version of the connected node IMPROVEMENTS + * export command now writes current validator set for Tendermint * [tests] Application module tests now use a mock application * [gaiacli] Fix error message when account isn't found when running gaiacli account @@ -3192,6 +3205,7 @@ IMPROVEMENTS * [x/stake] More stake tests added to test ByPower index FIXES + * Fixes consensus fault on testnet - see postmortem [here](https://github.com/cosmos/cosmos-sdk/issues/1197#issuecomment-396823021) * [x/stake] bonded inflation removed, non-bonded inflation partially implemented * [lcd] Switch to bech32 for addresses on all human readable inputs and outputs @@ -3201,12 +3215,13 @@ FIXES * [x/slashing] Set signInfo.StartHeight correctly for newly bonded validators FEATURES + * [docs] Reorganize documentation * [docs] Update staking spec, create WIP spec for slashing, and fees ## 0.18.0 -*June 9, 2018* +_June 9, 2018_ BREAKING CHANGES @@ -3215,22 +3230,22 @@ BREAKING CHANGES * [stake] `gaiacli query validator` takes and argument instead of using the `--address-candidate` flag * [stake] introduce `gaiacli query delegations` * [stake] staking refactor - * ValidatorsBonded store now take sorted pubKey-address instead of validator owner-address, + * ValidatorsBonded store now take sorted pubKey-address instead of validator owner-address, is sorted like Tendermint by pk's address - * store names more understandable - * removed temporary ToKick store, just needs a local map! - * removed distinction between candidates and validators - * everything is now a validator - * only validators with a status == bonded are actively validating/receiving rewards - * Introduction of Unbonding fields, lowlevel logic throughout (not fully implemented with queue) - * Introduction of PoolShares type within validators, + * store names more understandable + * removed temporary ToKick store, just needs a local map! + * removed distinction between candidates and validators + * everything is now a validator + * only validators with a status == bonded are actively validating/receiving rewards + * Introduction of Unbonding fields, lowlevel logic throughout (not fully implemented with queue) + * Introduction of PoolShares type within validators, replaces three rational fields (BondedShares, UnbondingShares, UnbondedShares * [x/auth] move stuff specific to auth anteHandler to the auth module rather than the types folder. This includes: - * StdTx (and its related stuff i.e. StdSignDoc, etc) - * StdFee - * StdSignature - * Account interface - * Related to this organization, I also: + * StdTx (and its related stuff i.e. StdSignDoc, etc) + * StdFee + * StdSignature + * Account interface + * Related to this organization, I also: * [x/auth] got rid of AccountMapper interface (in favor of the struct already in auth module) * [x/auth] removed the FeeHandler function from the AnteHandler, Replaced with FeeKeeper * [x/auth] Removed GetSignatures() from Tx interface (as different Tx styles might use something different than StdSignature) @@ -3239,15 +3254,14 @@ BREAKING CHANGES * [stake] remove Tick and add EndBlocker * Switch to bech32cosmos on all human readable inputs and outputs - FEATURES * [x/auth] Added ability to change pubkey to auth module * [baseapp] baseapp now has settable functions for filtering peers by address/port & public key * [sdk] Gas consumption is now measured as transactions are executed - * Transactions which run out of gas stop execution and revert state changes - * A "simulate" query has been added to determine how much gas a transaction will need - * Modules can include their own gas costs for execution of particular message types + * Transactions which run out of gas stop execution and revert state changes + * A "simulate" query has been added to determine how much gas a transaction will need + * Modules can include their own gas costs for execution of particular message types * [stake] Seperation of fee distribution to a new module * [stake] Creation of a validator/delegation generics in `/types` * [stake] Helper Description of the store in x/stake/store.md @@ -3255,7 +3269,6 @@ FEATURES * [stake] Added REST API * [Makefile] Added terraform/ansible playbooks to easily create remote testnets on Digital Ocean - BUG FIXES * [stake] staking delegator shares exchange rate now relative to equivalent-bonded-tokens the validator has instead of bonded tokens @@ -3271,42 +3284,41 @@ BUG FIXES * Auto-sequencing now works correctly * [gaiacli] Fix error message when account isn't found when running gaiacli account - ## 0.17.5 -*June 5, 2018* +_June 5, 2018_ Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, memory leak) ## 0.17.4 -*May 31, 2018* +_May 31, 2018_ Update to Tendermint v0.19.7 (WAL fixes and more) ## 0.17.3 -*May 29, 2018* +_May 29, 2018_ Update to Tendermint v0.19.6 (fix fast-sync halt) ## 0.17.5 -*June 5, 2018* +_June 5, 2018_ Update to Tendermint v0.19.9 (Fix evidence reactor, mempool deadlock, WAL panic, memory leak) ## 0.17.4 -*May 31, 2018* +_May 31, 2018_ Update to Tendermint v0.19.7 (WAL fixes and more) ## 0.17.3 -*May 29, 2018* +_May 29, 2018_ Update to Tendermint v0.19.6 (fix fast-sync halt) @@ -3348,7 +3360,6 @@ BUG FIXES * Auto-sequencing now works correctly - ## 0.16.0 (May 14th, 2018) BREAKING CHANGES @@ -3358,8 +3369,8 @@ BREAKING CHANGES * [stake] Delegator bonds now store the height at which they were updated * All module keepers now require a codespace, see basecoin or democoin for usage * Many changes to names throughout - * Type as a prefix naming convention applied (ex. BondMsg -> MsgBond) - * Removed redundancy in names (ex. stake.StakingKeeper -> stake.Keeper) + * Type as a prefix naming convention applied (ex. BondMsg -> MsgBond) + * Removed redundancy in names (ex. stake.StakingKeeper -> stake.Keeper) * Removed SealedAccountMapper * gaiad init now requires use of `--name` flag * Removed Get from Msg interface @@ -3372,9 +3383,9 @@ FEATURES: * Repo is now lint compliant / GoMetaLinter with tendermint-lint integrated into CI * Better key output, pubkey go-amino hex bytes now output by default * gaiad init overhaul - * Create genesis transactions with `gaiad init gen-tx` - * New genesis account keys are automatically added to the client keybase (introduce `--client-home` flag) - * Initialize with genesis txs using `--gen-txs` flag + * Create genesis transactions with `gaiad init gen-tx` + * New genesis account keys are automatically added to the client keybase (introduce `--client-home` flag) + * Initialize with genesis txs using `--gen-txs` flag * Context now has access to the application-configured logger * Add (non-proof) subspace query helper functions * Add more staking query functions: candidates, delegator-bonds @@ -3383,14 +3394,12 @@ BUG FIXES * Gaia now uses stake, ported from github.com/cosmos/gaia - ## 0.15.1 (April 29, 2018) IMPROVEMENTS: * Update Tendermint to v0.19.1 (includes many rpc fixes) - ## 0.15.0 (April 29, 2018) NOTE: v0.15.0 is a large breaking change that updates the encoding scheme to use @@ -3620,27 +3629,27 @@ the testnet. IMPROVEMENTS: * basecoin - * `basecoin start` supports all flags that `tendermint node` does, such as + * `basecoin start` supports all flags that `tendermint node` does, such as `--rpc.laddr`, `--p2p.seeds`, and `--p2p.skip_upnp` - * fully supports `--log_level` and `--trace` for logger configuration - * merkleeyes no longers spams the logs... unless you want it - * Example: `basecoin start --log_level="merkleeyes:info,state:info,*:error"` - * Example: `basecoin start --log_level="merkleeyes:debug,state:info,*:error"` + * fully supports `--log_level` and `--trace` for logger configuration + * merkleeyes no longers spams the logs... unless you want it + * Example: `basecoin start --log_level="merkleeyes:info,state:info,*:error"` + * Example: `basecoin start --log_level="merkleeyes:debug,state:info,*:error"` * basecli - * `basecli init` is more intelligent and only complains if there really was + * `basecli init` is more intelligent and only complains if there really was a connected chain, not just random files - * support `localhost:46657` or `http://localhost:46657` format for nodes, + * support `localhost:46657` or `http://localhost:46657` format for nodes, not just `tcp://localhost:46657` - * Add `--genesis` to init to specify chain-id and validator hash - * Example: `basecli init --node=localhost:46657 --genesis=$HOME/.basecoin/genesis.json` - * `basecli rpc` has a number of methods to easily accept tendermint rpc, and verifies what it can + * Add `--genesis` to init to specify chain-id and validator hash + * Example: `basecli init --node=localhost:46657 --genesis=$HOME/.basecoin/genesis.json` + * `basecli rpc` has a number of methods to easily accept tendermint rpc, and verifies what it can BUG FIXES: * basecli - * `basecli query account` accepts hex account address with or without `0x` + * `basecli query account` accepts hex account address with or without `0x` prefix - * gives error message when running commands on an unitialized chain, rather + * gives error message when running commands on an unitialized chain, rather than some unintelligable panic ## 0.6.0 (June 22, 2017) @@ -3652,28 +3661,28 @@ BREAKING CHANGES: * ./cmd/commands -> ./cmd/basecoin/commands * basecli - * `basecli proof state get` -> `basecli query key` - * `basecli proof tx get` -> `basecli query tx` - * `basecli proof state get --app=account` -> `basecli query account` - * use `--chain-id` not `--chainid` for consistency - * update to use `--trace` not `--debug` for stack traces on errors - * complete overhaul on how tx and query subcommands are added. (see counter or trackomatron for examples) - * no longer supports counter app (see new countercli) + * `basecli proof state get` -> `basecli query key` + * `basecli proof tx get` -> `basecli query tx` + * `basecli proof state get --app=account` -> `basecli query account` + * use `--chain-id` not `--chainid` for consistency + * update to use `--trace` not `--debug` for stack traces on errors + * complete overhaul on how tx and query subcommands are added. (see counter or trackomatron for examples) + * no longer supports counter app (see new countercli) * basecoin - * `basecoin init` takes an argument, an address to allocate funds to in the genesis - * removed key2.json - * removed all client side functionality from it (use basecli now for proofs) - * no tx subcommand - * no query subcommand - * no account (query) subcommand - * a few other random ones... - * enhanced relay subcommand - * relay start did what relay used to do - * relay init registers both chains on one another (to set it up so relay start just works) + * `basecoin init` takes an argument, an address to allocate funds to in the genesis + * removed key2.json + * removed all client side functionality from it (use basecli now for proofs) + * no tx subcommand + * no query subcommand + * no account (query) subcommand + * a few other random ones... + * enhanced relay subcommand + * relay start did what relay used to do + * relay init registers both chains on one another (to set it up so relay start just works) * docs - * removed `example-plugin`, put `counter` inside `docs/guide` + * removed `example-plugin`, put `counter` inside `docs/guide` * app - * Implements ABCI handshake by proxying merkleeyes.Info() + * Implements ABCI handshake by proxying merkleeyes.Info() IMPROVEMENTS: @@ -3712,19 +3721,19 @@ BREAKING CHANGES: IMPROVEMENTS: * basecoin cli - * integrates tendermint 0.10.0 and unifies cli (init, unsafe_reset_all, ...) - * integrate viper, all command line flags can also be defined in environmental variables or config.toml + * integrates tendermint 0.10.0 and unifies cli (init, unsafe_reset_all, ...) + * integrate viper, all command line flags can also be defined in environmental variables or config.toml * genesis file - * you can define accounts with either address or pub_key - * sorts coins for you, so no silent errors if not in alphabetical order + * you can define accounts with either address or pub_key + * sorts coins for you, so no silent errors if not in alphabetical order * [light-client](https://github.com/tendermint/light-client) integration - * no longer must you trust the node you connect to, prove everything! - * new [basecli command](./cmd/basecli/README.md) - * integrated [key management](https://github.com/tendermint/go-crypto/blob/master/cmd/README.md), stored encrypted locally - * tracks validator set changes and proves everything from one initial validator seed - * `basecli proof state` gets complete proofs for any abci state - * `basecli proof tx` gets complete proof where a tx was stored in the chain - * `basecli proxy` exposes tendermint rpc, but only passes through results after doing complete verification + * no longer must you trust the node you connect to, prove everything! + * new [basecli command](./cmd/basecli/README.md) + * integrated [key management](https://github.com/tendermint/go-crypto/blob/master/cmd/README.md), stored encrypted locally + * tracks validator set changes and proves everything from one initial validator seed + * `basecli proof state` gets complete proofs for any abci state + * `basecli proof tx` gets complete proof where a tx was stored in the chain + * `basecli proxy` exposes tendermint rpc, but only passes through results after doing complete verification BUG FIXES: diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 14aae1abd4b9..a7b164bc1cf7 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,10 +1,19 @@ -# Cosmos SDK v0.44.5 Release Notes +# Cosmos SDK v0.44.5-patch Release Notes - Dragonberry Patch -This release introduces bug fixes and improvements on the Cosmos SDK v0.44 series: +This is a security release for the [Dragonberry security advisory](https://forum.cosmos.network/t/ibc-security-advisory-dragonberry/7702). +Please upgrade ASAP. -- Emit ante handler events for failed transactions: ant events can cause blockchain change (eg tx fees) and related events should be emitted. -- (fix) Upgrade IAVL to 0.17.3 to solve race condition bug in IAVL. +Next to this, we have also included a few minor bugfixes. -See the [Cosmos SDK v0.44.5 Changelog](https://github.com/cosmos/cosmos-sdk/blob/v0.44.5/CHANGELOG.md) for the exhaustive list of all changes. +Chains must add the following to their go.mod for the application: -**Full Changelog**: https://github.com/cosmos/cosmos-sdk/compare/v0.44.4...v0.44.5 +```go +replace github.com/confio/ics23/go => github.com/cosmos/cosmos-sdk/ics23/go +``` + +Bumping the SDK version should be smooth, however, feel free to tag core devs to review your upgrading PR: + +- **CET**: @tac0turtle, @okwme, @AdityaSripal, @colin-axner, @julienrbrt +- **EST**: @ebuchman, @alexanderbez, @aaronc +- **PST**: @jtremback, @nicolaslara, @czarcas7ic, @p0mvn +- **CDT**: @ValarDragon, @zmanian diff --git a/baseapp/abci.go b/baseapp/abci.go index b5a21f33058c..f59966116835 100644 --- a/baseapp/abci.go +++ b/baseapp/abci.go @@ -2,6 +2,7 @@ package baseapp import ( "crypto/sha256" + "encoding/json" "errors" "fmt" "os" @@ -122,24 +123,6 @@ func (app *BaseApp) SetOption(req abci.RequestSetOption) (res abci.ResponseSetOp return } -// FilterPeerByAddrPort filters peers by address/port. -func (app *BaseApp) FilterPeerByAddrPort(info string) abci.ResponseQuery { - if app.addrPeerFilter != nil { - return app.addrPeerFilter(info) - } - - return abci.ResponseQuery{} -} - -// FilterPeerByID filters peers by node ID. -func (app *BaseApp) FilterPeerByID(info string) abci.ResponseQuery { - if app.idPeerFilter != nil { - return app.idPeerFilter(info) - } - - return abci.ResponseQuery{} -} - // BeginBlock implements the ABCI application interface. func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeginBlock) { defer telemetry.MeasureSince(time.Now(), "abci", "begin_block") @@ -621,9 +604,18 @@ func (app *BaseApp) createQueryContext(height int64, prove bool) (sdk.Context, e return sdk.Context{}, err } + lastBlockHeight := app.LastBlockHeight() + if height > lastBlockHeight { + return sdk.Context{}, + sdkerrors.Wrap( + sdkerrors.ErrInvalidHeight, + "cannot query with height in the future; please provide a valid height", + ) + } + // when a client did not provide a query height, manually inject the latest if height == 0 { - height = app.LastBlockHeight() + height = lastBlockHeight } if height <= 1 && prove { @@ -639,7 +631,7 @@ func (app *BaseApp) createQueryContext(height int64, prove bool) (sdk.Context, e return sdk.Context{}, sdkerrors.Wrapf( sdkerrors.ErrInvalidRequest, - "failed to load state at height %d; %s (latest height: %d)", height, err, app.LastBlockHeight(), + "failed to load state at height %d; %s (latest height: %d)", height, err, lastBlockHeight, ) } @@ -772,6 +764,22 @@ func handleQueryApp(app *BaseApp, path []string, req abci.RequestQuery) abci.Res Value: []byte(app.version), } + case "snapshots": + var responseValue []byte + + response := app.ListSnapshots(abci.RequestListSnapshots{}) + + responseValue, err := json.Marshal(response) + if err != nil { + sdkerrors.QueryResult(sdkerrors.Wrap(err, fmt.Sprintf("failed to marshal list snapshots response %v", response))) + } + + return abci.ResponseQuery{ + Codespace: sdkerrors.RootCodespace, + Height: req.Height, + Value: responseValue, + } + default: return sdkerrors.QueryResult(sdkerrors.Wrapf(sdkerrors.ErrUnknownRequest, "unknown query: %s", path)) } @@ -809,36 +817,6 @@ func handleQueryStore(app *BaseApp, path []string, req abci.RequestQuery) abci.R return resp } -func handleQueryP2P(app *BaseApp, path []string) abci.ResponseQuery { - // "/p2p" prefix for p2p queries - if len(path) < 4 { - return sdkerrors.QueryResult( - sdkerrors.Wrap( - sdkerrors.ErrUnknownRequest, "path should be p2p filter ", - ), - ) - } - - var resp abci.ResponseQuery - - cmd, typ, arg := path[1], path[2], path[3] - switch cmd { - case "filter": - switch typ { - case "addr": - resp = app.FilterPeerByAddrPort(arg) - - case "id": - resp = app.FilterPeerByID(arg) - } - - default: - resp = sdkerrors.QueryResult(sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "expected second parameter to be 'filter'")) - } - - return resp -} - func handleQueryCustom(app *BaseApp, path []string, req abci.RequestQuery) abci.ResponseQuery { // path[0] should be "custom" because "/custom" prefix is required for keeper // queries. diff --git a/baseapp/abci_test.go b/baseapp/abci_test.go index 8a61a0aebfc2..e6ce5c9fafa6 100644 --- a/baseapp/abci_test.go +++ b/baseapp/abci_test.go @@ -1,11 +1,12 @@ package baseapp import ( - "fmt" + "encoding/json" "testing" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" tmprototypes "github.com/tendermint/tendermint/proto/tendermint/types" dbm "github.com/tendermint/tm-db" @@ -118,9 +119,11 @@ func TestGetBlockRentionHeight(t *testing.T) { } } -// Test and ensure that negative heights always cause errors. -// See issue https://github.com/cosmos/cosmos-sdk/issues/7662. -func TestBaseAppCreateQueryContextRejectsNegativeHeights(t *testing.T) { +// Test and ensure that invalid block heights always cause errors. +// See issues: +// - https://github.com/cosmos/cosmos-sdk/issues/11220 +// - https://github.com/cosmos/cosmos-sdk/issues/7662 +func TestBaseAppCreateQueryContext(t *testing.T) { t.Parallel() logger := defaultLogger() @@ -128,14 +131,69 @@ func TestBaseAppCreateQueryContextRejectsNegativeHeights(t *testing.T) { name := t.Name() app := NewBaseApp(name, logger, db, nil) - proves := []bool{ - false, true, + app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: 1}}) + app.Commit() + + app.BeginBlock(abci.RequestBeginBlock{Header: tmproto.Header{Height: 2}}) + app.Commit() + + testCases := []struct { + name string + height int64 + prove bool + expErr bool + }{ + {"valid height", 2, true, false}, + {"future height", 10, true, true}, + {"negative height, prove=true", -1, true, true}, + {"negative height, prove=false", -1, false, true}, } - for _, prove := range proves { - t.Run(fmt.Sprintf("prove=%t", prove), func(t *testing.T) { - sctx, err := app.createQueryContext(-10, true) - require.Error(t, err) - require.Equal(t, sctx, sdk.Context{}) + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + _, err := app.createQueryContext(tc.height, tc.prove) + if tc.expErr { + require.Error(t, err) + } else { + require.NoError(t, err) + } }) } } + +type paramStore struct { + db *dbm.MemDB +} + +func (ps *paramStore) Set(_ sdk.Context, key []byte, value interface{}) { + bz, err := json.Marshal(value) + if err != nil { + panic(err) + } + + ps.db.Set(key, bz) +} + +func (ps *paramStore) Has(_ sdk.Context, key []byte) bool { + ok, err := ps.db.Has(key) + if err != nil { + panic(err) + } + + return ok +} + +func (ps *paramStore) Get(_ sdk.Context, key []byte, ptr interface{}) { + bz, err := ps.db.Get(key) + if err != nil { + panic(err) + } + + if len(bz) == 0 { + return + } + + if err := json.Unmarshal(bz, ptr); err != nil { + panic(err) + } +} diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index b36d06702990..dfc2dbcc716f 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -29,9 +29,7 @@ const ( runTxModeDeliver // Deliver a transaction ) -var ( - _ abci.Application = (*BaseApp)(nil) -) +var _ abci.Application = (*BaseApp)(nil) type ( // Enum mode for app.runTx @@ -45,32 +43,21 @@ type ( ) // BaseApp reflects the ABCI application implementation. -type BaseApp struct { // nolint: maligned +type BaseApp struct { //nolint: maligned // initialized on creation logger log.Logger - name string // application name from abci.Info - db dbm.DB // common DB backend - cms sdk.CommitMultiStore // Main (uncached) state - storeLoader StoreLoader // function to handle store loading, may be overridden with SetStoreLoader() - router sdk.Router // handle any kind of message - queryRouter sdk.QueryRouter // router for redirecting query calls - grpcQueryRouter *GRPCQueryRouter // router for redirecting gRPC query calls - msgServiceRouter *MsgServiceRouter // router for redirecting Msg service messages + name string // application name from abci.Info interfaceRegistry types.InterfaceRegistry txDecoder sdk.TxDecoder // unmarshal []byte into sdk.Tx - anteHandler sdk.AnteHandler // ante handler for fee and auth - initChainer sdk.InitChainer // initialize state with validators and state blob - beginBlocker sdk.BeginBlocker // logic to run before any txs - endBlocker sdk.EndBlocker // logic to run after all txs, and to determine valset changes - addrPeerFilter sdk.PeerFilter // filter peers by address and port - idPeerFilter sdk.PeerFilter // filter peers by node ID - fauxMerkleMode bool // if true, IAVL MountStores uses MountStoresDB for simulation speed. + anteHandler sdk.AnteHandler // ante handler for fee and auth - // manages snapshots, i.e. dumps of app state at certain intervals - snapshotManager *snapshots.Manager - snapshotInterval uint64 // block interval between state sync snapshots - snapshotKeepRecent uint32 // recent state sync snapshots to keep + appStore + baseappVersions + peerFilters + snapshotData + abciData + moduleRouter // volatile states: // @@ -79,12 +66,6 @@ type BaseApp struct { // nolint: maligned checkState *state // for CheckTx deliverState *state // for DeliverTx - // an inter-block write-through cache provided to the context during deliverState - interBlockCache sdk.MultiStorePersistentCache - - // absent validators from begin block - voteInfos []abci.VoteInfo - // paramStore is used to query for ABCI consensus parameters from an // application parameter store. paramStore ParamStore @@ -117,13 +98,6 @@ type BaseApp struct { // nolint: maligned // ResponseCommit.RetainHeight. minRetainBlocks uint64 - // application's version string - version string - - // application's protocol version that increments on every upgrade - // if BaseApp is passed to the upgrade keeper's NewKeeper method. - appVersion uint64 - // recovery handler for app.runTx method runTxRecoveryMiddleware recoveryMiddleware @@ -135,6 +109,51 @@ type BaseApp struct { // nolint: maligned indexEvents map[string]struct{} } +type appStore struct { + db dbm.DB // common DB backend + cms sdk.CommitMultiStore // Main (uncached) state + storeLoader StoreLoader // function to handle store loading, may be overridden with SetStoreLoader() + + // an inter-block write-through cache provided to the context during deliverState + interBlockCache sdk.MultiStorePersistentCache + + fauxMerkleMode bool // if true, IAVL MountStores uses MountStoresDB for simulation speed. +} + +type moduleRouter struct { + router sdk.Router // handle any kind of message + queryRouter sdk.QueryRouter // router for redirecting query calls + grpcQueryRouter *GRPCQueryRouter // router for redirecting gRPC query calls + msgServiceRouter *MsgServiceRouter // router for redirecting Msg service messages +} + +type abciData struct { + initChainer sdk.InitChainer // initialize state with validators and state blob + beginBlocker sdk.BeginBlocker // logic to run before any txs + endBlocker sdk.EndBlocker // logic to run after all txs, and to determine valset changes + + // absent validators from begin block + voteInfos []abci.VoteInfo +} + +type baseappVersions struct { + // application's version string + version string + + // application's protocol version that increments on every upgrade + // if BaseApp is passed to the upgrade keeper's NewKeeper method. + appVersion uint64 +} + +// should really get handled in some db struct +// which then has a sub-item, persistence fields +type snapshotData struct { + // manages snapshots, i.e. dumps of app state at certain intervals + snapshotManager *snapshots.Manager + snapshotInterval uint64 // block interval between state sync snapshots + snapshotKeepRecent uint32 // recent state sync snapshots to keep +} + // NewBaseApp returns a reference to an initialized BaseApp. It accepts a // variadic number of option functions, which act on the BaseApp to set // configuration choices. @@ -144,17 +163,21 @@ func NewBaseApp( name string, logger log.Logger, db dbm.DB, txDecoder sdk.TxDecoder, options ...func(*BaseApp), ) *BaseApp { app := &BaseApp{ - logger: logger, - name: name, - db: db, - cms: store.NewCommitMultiStore(db), - storeLoader: DefaultStoreLoader, - router: NewRouter(), - queryRouter: NewQueryRouter(), - grpcQueryRouter: NewGRPCQueryRouter(), - msgServiceRouter: NewMsgServiceRouter(), - txDecoder: txDecoder, - fauxMerkleMode: false, + logger: logger, + name: name, + appStore: appStore{ + db: db, + cms: store.NewCommitMultiStore(db), + storeLoader: DefaultStoreLoader, + fauxMerkleMode: false, + }, + moduleRouter: moduleRouter{ + router: NewRouter(), + queryRouter: NewQueryRouter(), + grpcQueryRouter: NewGRPCQueryRouter(), + msgServiceRouter: NewMsgServiceRouter(), + }, + txDecoder: txDecoder, } for _, option := range options { @@ -273,6 +296,19 @@ func DefaultStoreLoader(ms sdk.CommitMultiStore) error { return ms.LoadLatestVersion() } +// CommitMultiStore returns the root multi-store. +// App constructor can use this to access the `cms`. +// UNSAFE: must not be used during the abci life cycle. +func (app *BaseApp) CommitMultiStore() sdk.CommitMultiStore { + return app.cms +} + +// SnapshotManager returns the snapshot manager. +// application use this to register extra extension snapshotters. +func (app *BaseApp) SnapshotManager() *snapshots.Manager { + return app.snapshotManager +} + // LoadVersion loads the BaseApp application version. It will panic if called // more than once on a running baseapp. func (app *BaseApp) LoadVersion(version int64) error { diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index df891e136936..8fb20c018838 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -3,17 +3,14 @@ package baseapp import ( "bytes" "encoding/binary" - "encoding/json" "fmt" "io/ioutil" "math/rand" "os" - "strings" "sync" "testing" "time" - "github.com/gogo/protobuf/jsonpb" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" abci "github.com/tendermint/tendermint/abci/types" @@ -37,43 +34,6 @@ var ( capKey2 = sdk.NewKVStoreKey("key2") ) -type paramStore struct { - db *dbm.MemDB -} - -func (ps *paramStore) Set(_ sdk.Context, key []byte, value interface{}) { - bz, err := json.Marshal(value) - if err != nil { - panic(err) - } - - ps.db.Set(key, bz) -} - -func (ps *paramStore) Has(_ sdk.Context, key []byte) bool { - ok, err := ps.db.Has(key) - if err != nil { - panic(err) - } - - return ok -} - -func (ps *paramStore) Get(_ sdk.Context, key []byte, ptr interface{}) { - bz, err := ps.db.Get(key) - if err != nil { - panic(err) - } - - if len(bz) == 0 { - return - } - - if err := json.Unmarshal(bz, ptr); err != nil { - panic(err) - } -} - func defaultLogger() log.Logger { return log.NewTMLogger(log.NewSyncWriter(os.Stdout)).With("module", "sdk/app") } @@ -544,12 +504,6 @@ func TestBaseAppOptionSeal(t *testing.T) { }) } -func TestSetMinGasPrices(t *testing.T) { - minGasPrices := sdk.DecCoins{sdk.NewInt64DecCoin("stake", 5000)} - app := newBaseApp(t.Name(), SetMinGasPrices(minGasPrices.String())) - require.Equal(t, minGasPrices, app.minGasPrices) -} - func TestInitChainer(t *testing.T) { name := t.Name() // keep the db and logger ourselves so @@ -902,267 +856,6 @@ func incrementingCounter(t *testing.T, store sdk.KVStore, counterKey []byte, cou return &sdk.Result{}, nil } -//--------------------------------------------------------------------- -// Tx processing - CheckTx, DeliverTx, SimulateTx. -// These tests use the serialized tx as input, while most others will use the -// Check(), Deliver(), Simulate() methods directly. -// Ensure that Check/Deliver/Simulate work as expected with the store. - -// Test that successive CheckTx can see each others' effects -// on the store within a block, and that the CheckTx state -// gets reset to the latest committed state during Commit -func TestCheckTx(t *testing.T) { - // This ante handler reads the key and checks that the value matches the current counter. - // This ensures changes to the kvstore persist across successive CheckTx. - counterKey := []byte("counter-key") - - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, counterKey)) } - routerOpt := func(bapp *BaseApp) { - // TODO: can remove this once CheckTx doesnt process msgs. - bapp.Router().AddRoute(sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - return &sdk.Result{}, nil - })) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - - nTxs := int64(5) - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - for i := int64(0); i < nTxs; i++ { - tx := newTxCounter(i, 0) // no messages - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - r := app.CheckTx(abci.RequestCheckTx{Tx: txBytes}) - require.Empty(t, r.GetEvents()) - require.True(t, r.IsOK(), fmt.Sprintf("%v", r)) - } - - checkStateStore := app.checkState.ctx.KVStore(capKey1) - storedCounter := getIntFromStore(checkStateStore, counterKey) - - // Ensure AnteHandler ran - require.Equal(t, nTxs, storedCounter) - - // If a block is committed, CheckTx state should be reset. - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header, Hash: []byte("hash")}) - - require.NotNil(t, app.checkState.ctx.BlockGasMeter(), "block gas meter should have been set to checkState") - require.NotEmpty(t, app.checkState.ctx.HeaderHash()) - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - - checkStateStore = app.checkState.ctx.KVStore(capKey1) - storedBytes := checkStateStore.Get(counterKey) - require.Nil(t, storedBytes) -} - -// Test that successive DeliverTx can see each others' effects -// on the store, both within and across blocks. -func TestDeliverTx(t *testing.T) { - // test increments in the ante - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } - - // test increments in the handler - deliverKey := []byte("deliver-key") - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - bapp.Router().AddRoute(r) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - nBlocks := 3 - txPerHeight := 5 - - for blockN := 0; blockN < nBlocks; blockN++ { - header := tmproto.Header{Height: int64(blockN) + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - for i := 0; i < txPerHeight; i++ { - counter := int64(blockN*txPerHeight + i) - tx := newTxCounter(counter, counter) - - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - events := res.GetEvents() - require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") - require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") - } - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - } -} - -// Number of messages doesn't matter to CheckTx. -func TestMultiMsgCheckTx(t *testing.T) { - // TODO: ensure we get the same results - // with one message or many -} - -// One call to DeliverTx should process all the messages, in order. -func TestMultiMsgDeliverTx(t *testing.T) { - // increment the tx counter - anteKey := []byte("ante-key") - anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } - - // increment the msg counter - deliverKey := []byte("deliver-key") - deliverKey2 := []byte("deliver-key2") - routerOpt := func(bapp *BaseApp) { - r1 := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) - r2 := sdk.NewRoute(routeMsgCounter2, handlerMsgCounter(t, capKey1, deliverKey2)) - bapp.Router().AddRoute(r1) - bapp.Router().AddRoute(r2) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - - // Create same codec used in txDecoder - codec := codec.NewLegacyAmino() - registerTestCodec(codec) - - // run a multi-msg tx - // with all msgs the same route - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - tx := newTxCounter(0, 0, 1, 2) - txBytes, err := codec.Marshal(tx) - require.NoError(t, err) - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - - store := app.deliverState.ctx.KVStore(capKey1) - - // tx counter only incremented once - txCounter := getIntFromStore(store, anteKey) - require.Equal(t, int64(1), txCounter) - - // msg counter incremented three times - msgCounter := getIntFromStore(store, deliverKey) - require.Equal(t, int64(3), msgCounter) - - // replace the second message with a msgCounter2 - - tx = newTxCounter(1, 3) - tx.Msgs = append(tx.Msgs, msgCounter2{0}) - tx.Msgs = append(tx.Msgs, msgCounter2{1}) - txBytes, err = codec.Marshal(tx) - require.NoError(t, err) - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) - - store = app.deliverState.ctx.KVStore(capKey1) - - // tx counter only incremented once - txCounter = getIntFromStore(store, anteKey) - require.Equal(t, int64(2), txCounter) - - // original counter increments by one - // new counter increments by two - msgCounter = getIntFromStore(store, deliverKey) - require.Equal(t, int64(4), msgCounter) - msgCounter2 := getIntFromStore(store, deliverKey2) - require.Equal(t, int64(2), msgCounter2) -} - -// Interleave calls to Check and Deliver and ensure -// that there is no cross-talk. Check sees results of the previous Check calls -// and Deliver sees that of the previous Deliver calls, but they don't see eachother. -func TestConcurrentCheckDeliver(t *testing.T) { - // TODO -} - -// Simulate a transaction that uses gas to compute the gas. -// Simulate() and Query("/app/simulate", txBytes) should give -// the same results. -func TestSimulateTx(t *testing.T) { - gasConsumed := uint64(5) - - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasConsumed)) - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - ctx.GasMeter().ConsumeGas(gasConsumed, "test") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - - app.InitChain(abci.RequestInitChain{}) - - // Create same codec used in txDecoder - cdc := codec.NewLegacyAmino() - registerTestCodec(cdc) - - nBlocks := 3 - for blockN := 0; blockN < nBlocks; blockN++ { - count := int64(blockN + 1) - header := tmproto.Header{Height: count} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - tx := newTxCounter(count, count) - txBytes, err := cdc.Marshal(tx) - require.Nil(t, err) - - // simulate a message, check gas reported - gInfo, result, err := app.Simulate(txBytes) - require.NoError(t, err) - require.NotNil(t, result) - require.Equal(t, gasConsumed, gInfo.GasUsed) - - // simulate again, same result - gInfo, result, err = app.Simulate(txBytes) - require.NoError(t, err) - require.NotNil(t, result) - require.Equal(t, gasConsumed, gInfo.GasUsed) - - // simulate by calling Query with encoded tx - query := abci.RequestQuery{ - Path: "/app/simulate", - Data: txBytes, - } - queryResult := app.Query(query) - require.True(t, queryResult.IsOK(), queryResult.Log) - - var simRes sdk.SimulationResponse - require.NoError(t, jsonpb.Unmarshal(strings.NewReader(string(queryResult.Value)), &simRes)) - - require.Equal(t, gInfo, simRes.GasInfo) - require.Equal(t, result.Log, simRes.Result.Log) - require.Equal(t, result.Events, simRes.Result.Events) - require.True(t, bytes.Equal(result.Data, simRes.Result.Data)) - - app.EndBlock(abci.RequestEndBlock{}) - app.Commit() - } -} - func TestRunInvalidTransaction(t *testing.T) { anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { @@ -1265,195 +958,6 @@ func TestRunInvalidTransaction(t *testing.T) { } } -// Test that transactions exceeding gas limits fail -func TestTxGasLimits(t *testing.T) { - gasGranted := uint64(10) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) - - // AnteHandlers must have their own defer/recover in order for the BaseApp - // to know how much gas was used! This is because the GasMeter is created in - // the AnteHandler, but if it panics the context won't be set properly in - // runTx's recover call. - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) - default: - panic(r) - } - } - }() - - count := tx.(txTest).Counter - newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") - - return newCtx, nil - }) - - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - - header := tmproto.Header{Height: 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - testCases := []struct { - tx *txTest - gasUsed uint64 - fail bool - }{ - {newTxCounter(0, 0), 0, false}, - {newTxCounter(1, 1), 2, false}, - {newTxCounter(9, 1), 10, false}, - {newTxCounter(1, 9), 10, false}, - {newTxCounter(10, 0), 10, false}, - {newTxCounter(0, 10), 10, false}, - {newTxCounter(0, 8, 2), 10, false}, - {newTxCounter(0, 5, 1, 1, 1, 1, 1), 10, false}, - {newTxCounter(0, 5, 1, 1, 1, 1), 9, false}, - - {newTxCounter(9, 2), 11, true}, - {newTxCounter(2, 9), 11, true}, - {newTxCounter(9, 1, 1), 11, true}, - {newTxCounter(1, 8, 1, 1), 11, true}, - {newTxCounter(11, 0), 11, true}, - {newTxCounter(0, 11), 11, true}, - {newTxCounter(0, 5, 11), 16, true}, - } - - for i, tc := range testCases { - tx := tc.tx - gInfo, result, err := app.Deliver(aminoTxEncoder(), tx) - - // check gas used and wanted - require.Equal(t, tc.gasUsed, gInfo.GasUsed, fmt.Sprintf("tc #%d; gas: %v, result: %v, err: %s", i, gInfo, result, err)) - - // check for out of gas - if !tc.fail { - require.NotNil(t, result, fmt.Sprintf("%d: %v, %v", i, tc, err)) - } else { - require.Error(t, err) - require.Nil(t, result) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) - } - } -} - -// Test that transactions exceeding gas limits fail -func TestMaxBlockGasLimits(t *testing.T) { - gasGranted := uint64(10) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) - - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) - default: - panic(r) - } - } - }() - - count := tx.(txTest).Counter - newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") - - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - app := setupBaseApp(t, anteOpt, routerOpt) - app.InitChain(abci.RequestInitChain{ - ConsensusParams: &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxGas: 100, - }, - }, - }) - - testCases := []struct { - tx *txTest - numDelivers int - gasUsedPerDeliver uint64 - fail bool - failAfterDeliver int - }{ - {newTxCounter(0, 0), 0, 0, false, 0}, - {newTxCounter(9, 1), 2, 10, false, 0}, - {newTxCounter(10, 0), 3, 10, false, 0}, - {newTxCounter(10, 0), 10, 10, false, 0}, - {newTxCounter(2, 7), 11, 9, false, 0}, - {newTxCounter(10, 0), 10, 10, false, 0}, // hit the limit but pass - - {newTxCounter(10, 0), 11, 10, true, 10}, - {newTxCounter(10, 0), 15, 10, true, 10}, - {newTxCounter(9, 0), 12, 9, true, 11}, // fly past the limit - } - - for i, tc := range testCases { - tx := tc.tx - - // reset the block gas - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - // execute the transaction multiple times - for j := 0; j < tc.numDelivers; j++ { - _, result, err := app.Deliver(aminoTxEncoder(), tx) - - ctx := app.getState(runTxModeDeliver).ctx - - // check for failed transactions - if tc.fail && (j+1) > tc.failAfterDeliver { - require.Error(t, err, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) - require.Nil(t, result, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) - - space, code, _ := sdkerrors.ABCIInfo(err, false) - require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) - require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) - require.True(t, ctx.BlockGasMeter().IsOutOfGas()) - } else { - // check gas used and wanted - blockGasUsed := ctx.BlockGasMeter().GasConsumed() - expBlockGasUsed := tc.gasUsedPerDeliver * uint64(j+1) - require.Equal( - t, expBlockGasUsed, blockGasUsed, - fmt.Sprintf("%d,%d: %v, %v, %v, %v", i, j, tc, expBlockGasUsed, blockGasUsed, result), - ) - - require.NotNil(t, result, fmt.Sprintf("tc #%d; currDeliver: %d, result: %v, err: %s", i, j, result, err)) - require.False(t, ctx.BlockGasMeter().IsPastLimit()) - } - } - } -} - // Test custom panic handling within app.DeliverTx method func TestCustomRunTxPanicHandler(t *testing.T) { const customPanicMsg = "test panic" @@ -1573,77 +1077,6 @@ func TestBaseAppAnteHandler(t *testing.T) { app.Commit() } -func TestGasConsumptionBadTx(t *testing.T) { - gasWanted := uint64(5) - anteOpt := func(bapp *BaseApp) { - bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { - newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasWanted)) - - defer func() { - if r := recover(); r != nil { - switch rType := r.(type) { - case sdk.ErrorOutOfGas: - log := fmt.Sprintf("out of gas in location: %v", rType.Descriptor) - err = sdkerrors.Wrap(sdkerrors.ErrOutOfGas, log) - default: - panic(r) - } - } - }() - - txTest := tx.(txTest) - newCtx.GasMeter().ConsumeGas(uint64(txTest.Counter), "counter-ante") - if txTest.FailOnAnte { - return newCtx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") - } - - return - }) - } - - routerOpt := func(bapp *BaseApp) { - r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { - count := msg.(*msgCounter).Counter - ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") - return &sdk.Result{}, nil - }) - bapp.Router().AddRoute(r) - } - - cdc := codec.NewLegacyAmino() - registerTestCodec(cdc) - - app := setupBaseApp(t, anteOpt, routerOpt) - app.InitChain(abci.RequestInitChain{ - ConsensusParams: &abci.ConsensusParams{ - Block: &abci.BlockParams{ - MaxGas: 9, - }, - }, - }) - - app.InitChain(abci.RequestInitChain{}) - - header := tmproto.Header{Height: app.LastBlockHeight() + 1} - app.BeginBlock(abci.RequestBeginBlock{Header: header}) - - tx := newTxCounter(5, 0) - tx.setFailOnAnte(true) - txBytes, err := cdc.Marshal(tx) - require.NoError(t, err) - - res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) - - // require next tx to fail due to black gas limit - tx = newTxCounter(5, 0) - txBytes, err = cdc.Marshal(tx) - require.NoError(t, err) - - res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) - require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) -} - // Test that we can only query from the latest committed state. func TestQuery(t *testing.T) { key, value := []byte("hello"), []byte("goodbye") @@ -1769,24 +1202,6 @@ func TestP2PQuery(t *testing.T) { require.Equal(t, uint32(4), res.Code) } -func TestGetMaximumBlockGas(t *testing.T) { - app := setupBaseApp(t) - app.InitChain(abci.RequestInitChain{}) - ctx := app.NewContext(true, tmproto.Header{}) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 0}}) - require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -1}}) - require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 5000000}}) - require.Equal(t, uint64(5000000), app.getMaximumBlockGas(ctx)) - - app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -5000000}}) - require.Panics(t, func() { app.getMaximumBlockGas(ctx) }) -} - func TestListSnapshots(t *testing.T) { app, teardown := setupBaseAppWithSnapshots(t, 5, 4) defer teardown() diff --git a/baseapp/block_gas_test.go b/baseapp/block_gas_test.go new file mode 100644 index 000000000000..e194484cd604 --- /dev/null +++ b/baseapp/block_gas_test.go @@ -0,0 +1,297 @@ +package baseapp + +import ( + "fmt" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" +) + +func TestGetMaximumBlockGas(t *testing.T) { + app := setupBaseApp(t) + app.InitChain(abci.RequestInitChain{}) + ctx := app.NewContext(true, tmproto.Header{}) + + app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 0}}) + require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) + + app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -1}}) + require.Equal(t, uint64(0), app.getMaximumBlockGas(ctx)) + + app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: 5000000}}) + require.Equal(t, uint64(5000000), app.getMaximumBlockGas(ctx)) + + app.StoreConsensusParams(ctx, &abci.ConsensusParams{Block: &abci.BlockParams{MaxGas: -5000000}}) + require.Panics(t, func() { app.getMaximumBlockGas(ctx) }) +} + +func TestGasConsumptionBadTx(t *testing.T) { + gasWanted := uint64(5) + anteOpt := func(bapp *BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasWanted)) + + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + log := fmt.Sprintf("out of gas in location: %v", rType.Descriptor) + err = sdkerrors.Wrap(sdkerrors.ErrOutOfGas, log) + default: + panic(r) + } + } + }() + + txTest := tx.(txTest) + newCtx.GasMeter().ConsumeGas(uint64(txTest.Counter), "counter-ante") + if txTest.FailOnAnte { + return newCtx, sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "ante handler failure") + } + + return + }) + } + + routerOpt := func(bapp *BaseApp) { + r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + count := msg.(*msgCounter).Counter + ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") + return &sdk.Result{}, nil + }) + bapp.Router().AddRoute(r) + } + + cdc := codec.NewLegacyAmino() + registerTestCodec(cdc) + + app := setupBaseApp(t, anteOpt, routerOpt) + app.InitChain(abci.RequestInitChain{ + ConsensusParams: &abci.ConsensusParams{ + Block: &abci.BlockParams{ + MaxGas: 9, + }, + }, + }) + + app.InitChain(abci.RequestInitChain{}) + + header := tmproto.Header{Height: app.LastBlockHeight() + 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + + tx := newTxCounter(5, 0) + tx.setFailOnAnte(true) + txBytes, err := cdc.Marshal(tx) + require.NoError(t, err) + + res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) + + // require next tx to fail due to black gas limit + tx = newTxCounter(5, 0) + txBytes, err = cdc.Marshal(tx) + require.NoError(t, err) + + res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.False(t, res.IsOK(), fmt.Sprintf("%v", res)) +} + +func TestSetMinGasPrices(t *testing.T) { + minGasPrices := sdk.DecCoins{sdk.NewInt64DecCoin("stake", 5000)} + app := newBaseApp(t.Name(), SetMinGasPrices(minGasPrices.String())) + require.Equal(t, minGasPrices, app.minGasPrices) +} + +// Test that transactions exceeding gas limits fail +func TestTxGasLimits(t *testing.T) { + gasGranted := uint64(10) + anteOpt := func(bapp *BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) + + // AnteHandlers must have their own defer/recover in order for the BaseApp + // to know how much gas was used! This is because the GasMeter is created in + // the AnteHandler, but if it panics the context won't be set properly in + // runTx's recover call. + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) + default: + panic(r) + } + } + }() + + count := tx.(txTest).Counter + newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") + + return newCtx, nil + }) + + } + + routerOpt := func(bapp *BaseApp) { + r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + count := msg.(*msgCounter).Counter + ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") + return &sdk.Result{}, nil + }) + bapp.Router().AddRoute(r) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + + header := tmproto.Header{Height: 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + + testCases := []struct { + tx *txTest + gasUsed uint64 + fail bool + }{ + {newTxCounter(0, 0), 0, false}, + {newTxCounter(1, 1), 2, false}, + {newTxCounter(9, 1), 10, false}, + {newTxCounter(1, 9), 10, false}, + {newTxCounter(10, 0), 10, false}, + {newTxCounter(0, 10), 10, false}, + {newTxCounter(0, 8, 2), 10, false}, + {newTxCounter(0, 5, 1, 1, 1, 1, 1), 10, false}, + {newTxCounter(0, 5, 1, 1, 1, 1), 9, false}, + + {newTxCounter(9, 2), 11, true}, + {newTxCounter(2, 9), 11, true}, + {newTxCounter(9, 1, 1), 11, true}, + {newTxCounter(1, 8, 1, 1), 11, true}, + {newTxCounter(11, 0), 11, true}, + {newTxCounter(0, 11), 11, true}, + {newTxCounter(0, 5, 11), 16, true}, + } + + for i, tc := range testCases { + tx := tc.tx + gInfo, result, err := app.Deliver(aminoTxEncoder(), tx) + + // check gas used and wanted + require.Equal(t, tc.gasUsed, gInfo.GasUsed, fmt.Sprintf("tc #%d; gas: %v, result: %v, err: %s", i, gInfo, result, err)) + + // check for out of gas + if !tc.fail { + require.NotNil(t, result, fmt.Sprintf("%d: %v, %v", i, tc, err)) + } else { + require.Error(t, err) + require.Nil(t, result) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) + } + } +} + +// Test that transactions exceeding gas limits fail +func TestMaxBlockGasLimits(t *testing.T) { + gasGranted := uint64(10) + anteOpt := func(bapp *BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasGranted)) + + defer func() { + if r := recover(); r != nil { + switch rType := r.(type) { + case sdk.ErrorOutOfGas: + err = sdkerrors.Wrapf(sdkerrors.ErrOutOfGas, "out of gas in location: %v", rType.Descriptor) + default: + panic(r) + } + } + }() + + count := tx.(txTest).Counter + newCtx.GasMeter().ConsumeGas(uint64(count), "counter-ante") + + return + }) + } + + routerOpt := func(bapp *BaseApp) { + r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + count := msg.(*msgCounter).Counter + ctx.GasMeter().ConsumeGas(uint64(count), "counter-handler") + return &sdk.Result{}, nil + }) + bapp.Router().AddRoute(r) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + app.InitChain(abci.RequestInitChain{ + ConsensusParams: &abci.ConsensusParams{ + Block: &abci.BlockParams{ + MaxGas: 100, + }, + }, + }) + + testCases := []struct { + tx *txTest + numDelivers int + gasUsedPerDeliver uint64 + fail bool + failAfterDeliver int + }{ + {newTxCounter(0, 0), 0, 0, false, 0}, + {newTxCounter(9, 1), 2, 10, false, 0}, + {newTxCounter(10, 0), 3, 10, false, 0}, + {newTxCounter(10, 0), 10, 10, false, 0}, + {newTxCounter(2, 7), 11, 9, false, 0}, + {newTxCounter(10, 0), 10, 10, false, 0}, // hit the limit but pass + + {newTxCounter(10, 0), 11, 10, true, 10}, + {newTxCounter(10, 0), 15, 10, true, 10}, + {newTxCounter(9, 0), 12, 9, true, 11}, // fly past the limit + } + + for i, tc := range testCases { + tx := tc.tx + + // reset the block gas + header := tmproto.Header{Height: app.LastBlockHeight() + 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + + // execute the transaction multiple times + for j := 0; j < tc.numDelivers; j++ { + _, result, err := app.Deliver(aminoTxEncoder(), tx) + + ctx := app.getState(runTxModeDeliver).ctx + + // check for failed transactions + if tc.fail && (j+1) > tc.failAfterDeliver { + require.Error(t, err, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) + require.Nil(t, result, fmt.Sprintf("tc #%d; result: %v, err: %s", i, result, err)) + + space, code, _ := sdkerrors.ABCIInfo(err, false) + require.EqualValues(t, sdkerrors.ErrOutOfGas.Codespace(), space, err) + require.EqualValues(t, sdkerrors.ErrOutOfGas.ABCICode(), code, err) + require.True(t, ctx.BlockGasMeter().IsOutOfGas()) + } else { + // check gas used and wanted + blockGasUsed := ctx.BlockGasMeter().GasConsumed() + expBlockGasUsed := tc.gasUsedPerDeliver * uint64(j+1) + require.Equal( + t, expBlockGasUsed, blockGasUsed, + fmt.Sprintf("%d,%d: %v, %v, %v, %v", i, j, tc, expBlockGasUsed, blockGasUsed, result), + ) + + require.NotNil(t, result, fmt.Sprintf("tc #%d; currDeliver: %d, result: %v, err: %s", i, j, result, err)) + require.False(t, ctx.BlockGasMeter().IsPastLimit()) + } + } + } +} diff --git a/baseapp/deliver_tx_test.go b/baseapp/deliver_tx_test.go new file mode 100644 index 000000000000..2f48b42e9fa9 --- /dev/null +++ b/baseapp/deliver_tx_test.go @@ -0,0 +1,276 @@ +package baseapp + +import ( + "bytes" + "fmt" + "strings" + "testing" + + "github.com/cosmos/cosmos-sdk/codec" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/gogo/protobuf/jsonpb" + "github.com/stretchr/testify/require" + abci "github.com/tendermint/tendermint/abci/types" + tmproto "github.com/tendermint/tendermint/proto/tendermint/types" +) + +//--------------------------------------------------------------------- +// Tx processing - CheckTx, DeliverTx, SimulateTx. +// These tests use the serialized tx as input, while most others will use the +// Check(), Deliver(), Simulate() methods directly. +// Ensure that Check/Deliver/Simulate work as expected with the store. + +// Test that successive CheckTx can see each others' effects +// on the store within a block, and that the CheckTx state +// gets reset to the latest committed state during Commit +func TestCheckTx(t *testing.T) { + // This ante handler reads the key and checks that the value matches the current counter. + // This ensures changes to the kvstore persist across successive CheckTx. + counterKey := []byte("counter-key") + + anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, counterKey)) } + routerOpt := func(bapp *BaseApp) { + // TODO: can remove this once CheckTx doesnt process msgs. + bapp.Router().AddRoute(sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + return &sdk.Result{}, nil + })) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + + nTxs := int64(5) + app.InitChain(abci.RequestInitChain{}) + + // Create same codec used in txDecoder + codec := codec.NewLegacyAmino() + registerTestCodec(codec) + + for i := int64(0); i < nTxs; i++ { + tx := newTxCounter(i, 0) // no messages + txBytes, err := codec.Marshal(tx) + require.NoError(t, err) + r := app.CheckTx(abci.RequestCheckTx{Tx: txBytes}) + require.Empty(t, r.GetEvents()) + require.True(t, r.IsOK(), fmt.Sprintf("%v", r)) + } + + checkStateStore := app.checkState.ctx.KVStore(capKey1) + storedCounter := getIntFromStore(checkStateStore, counterKey) + + // Ensure AnteHandler ran + require.Equal(t, nTxs, storedCounter) + + // If a block is committed, CheckTx state should be reset. + header := tmproto.Header{Height: 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header, Hash: []byte("hash")}) + + require.NotNil(t, app.checkState.ctx.BlockGasMeter(), "block gas meter should have been set to checkState") + require.NotEmpty(t, app.checkState.ctx.HeaderHash()) + + app.EndBlock(abci.RequestEndBlock{}) + app.Commit() + + checkStateStore = app.checkState.ctx.KVStore(capKey1) + storedBytes := checkStateStore.Get(counterKey) + require.Nil(t, storedBytes) +} + +// Test that successive DeliverTx can see each others' effects +// on the store, both within and across blocks. +func TestDeliverTx(t *testing.T) { + // test increments in the ante + anteKey := []byte("ante-key") + anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } + + // test increments in the handler + deliverKey := []byte("deliver-key") + routerOpt := func(bapp *BaseApp) { + r := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) + bapp.Router().AddRoute(r) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + app.InitChain(abci.RequestInitChain{}) + + // Create same codec used in txDecoder + codec := codec.NewLegacyAmino() + registerTestCodec(codec) + + nBlocks := 3 + txPerHeight := 5 + + for blockN := 0; blockN < nBlocks; blockN++ { + header := tmproto.Header{Height: int64(blockN) + 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + + for i := 0; i < txPerHeight; i++ { + counter := int64(blockN*txPerHeight + i) + tx := newTxCounter(counter, counter) + + txBytes, err := codec.Marshal(tx) + require.NoError(t, err) + + res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + events := res.GetEvents() + require.Len(t, events, 3, "should contain ante handler, message type and counter events respectively") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent("ante_handler", counter).ToABCIEvents(), map[string]struct{}{})[0], events[0], "ante handler event") + require.Equal(t, sdk.MarkEventsToIndex(counterEvent(sdk.EventTypeMessage, counter).ToABCIEvents(), map[string]struct{}{})[0], events[2], "msg handler update counter event") + } + + app.EndBlock(abci.RequestEndBlock{}) + app.Commit() + } +} + +// Number of messages doesn't matter to CheckTx. +func TestMultiMsgCheckTx(t *testing.T) { + // TODO: ensure we get the same results + // with one message or many +} + +// One call to DeliverTx should process all the messages, in order. +func TestMultiMsgDeliverTx(t *testing.T) { + // increment the tx counter + anteKey := []byte("ante-key") + anteOpt := func(bapp *BaseApp) { bapp.SetAnteHandler(anteHandlerTxTest(t, capKey1, anteKey)) } + + // increment the msg counter + deliverKey := []byte("deliver-key") + deliverKey2 := []byte("deliver-key2") + routerOpt := func(bapp *BaseApp) { + r1 := sdk.NewRoute(routeMsgCounter, handlerMsgCounter(t, capKey1, deliverKey)) + r2 := sdk.NewRoute(routeMsgCounter2, handlerMsgCounter(t, capKey1, deliverKey2)) + bapp.Router().AddRoute(r1) + bapp.Router().AddRoute(r2) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + + // Create same codec used in txDecoder + codec := codec.NewLegacyAmino() + registerTestCodec(codec) + + // run a multi-msg tx + // with all msgs the same route + + header := tmproto.Header{Height: 1} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + tx := newTxCounter(0, 0, 1, 2) + txBytes, err := codec.Marshal(tx) + require.NoError(t, err) + res := app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + + store := app.deliverState.ctx.KVStore(capKey1) + + // tx counter only incremented once + txCounter := getIntFromStore(store, anteKey) + require.Equal(t, int64(1), txCounter) + + // msg counter incremented three times + msgCounter := getIntFromStore(store, deliverKey) + require.Equal(t, int64(3), msgCounter) + + // replace the second message with a msgCounter2 + + tx = newTxCounter(1, 3) + tx.Msgs = append(tx.Msgs, msgCounter2{0}) + tx.Msgs = append(tx.Msgs, msgCounter2{1}) + txBytes, err = codec.Marshal(tx) + require.NoError(t, err) + res = app.DeliverTx(abci.RequestDeliverTx{Tx: txBytes}) + require.True(t, res.IsOK(), fmt.Sprintf("%v", res)) + + store = app.deliverState.ctx.KVStore(capKey1) + + // tx counter only incremented once + txCounter = getIntFromStore(store, anteKey) + require.Equal(t, int64(2), txCounter) + + // original counter increments by one + // new counter increments by two + msgCounter = getIntFromStore(store, deliverKey) + require.Equal(t, int64(4), msgCounter) + msgCounter2 := getIntFromStore(store, deliverKey2) + require.Equal(t, int64(2), msgCounter2) +} + +// Interleave calls to Check and Deliver and ensure +// that there is no cross-talk. Check sees results of the previous Check calls +// and Deliver sees that of the previous Deliver calls, but they don't see eachother. +func TestConcurrentCheckDeliver(t *testing.T) { + // TODO +} + +// Simulate a transaction that uses gas to compute the gas. +// Simulate() and Query("/app/simulate", txBytes) should give +// the same results. +func TestSimulateTx(t *testing.T) { + gasConsumed := uint64(5) + + anteOpt := func(bapp *BaseApp) { + bapp.SetAnteHandler(func(ctx sdk.Context, tx sdk.Tx, simulate bool) (newCtx sdk.Context, err error) { + newCtx = ctx.WithGasMeter(sdk.NewGasMeter(gasConsumed)) + return + }) + } + + routerOpt := func(bapp *BaseApp) { + r := sdk.NewRoute(routeMsgCounter, func(ctx sdk.Context, msg sdk.Msg) (*sdk.Result, error) { + ctx.GasMeter().ConsumeGas(gasConsumed, "test") + return &sdk.Result{}, nil + }) + bapp.Router().AddRoute(r) + } + + app := setupBaseApp(t, anteOpt, routerOpt) + + app.InitChain(abci.RequestInitChain{}) + + // Create same codec used in txDecoder + cdc := codec.NewLegacyAmino() + registerTestCodec(cdc) + + nBlocks := 3 + for blockN := 0; blockN < nBlocks; blockN++ { + count := int64(blockN + 1) + header := tmproto.Header{Height: count} + app.BeginBlock(abci.RequestBeginBlock{Header: header}) + + tx := newTxCounter(count, count) + txBytes, err := cdc.Marshal(tx) + require.Nil(t, err) + + // simulate a message, check gas reported + gInfo, result, err := app.Simulate(txBytes) + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, gasConsumed, gInfo.GasUsed) + + // simulate again, same result + gInfo, result, err = app.Simulate(txBytes) + require.NoError(t, err) + require.NotNil(t, result) + require.Equal(t, gasConsumed, gInfo.GasUsed) + + // simulate by calling Query with encoded tx + query := abci.RequestQuery{ + Path: "/app/simulate", + Data: txBytes, + } + queryResult := app.Query(query) + require.True(t, queryResult.IsOK(), queryResult.Log) + + var simRes sdk.SimulationResponse + require.NoError(t, jsonpb.Unmarshal(strings.NewReader(string(queryResult.Value)), &simRes)) + + require.Equal(t, gInfo, simRes.GasInfo) + require.Equal(t, result.Log, simRes.Result.Log) + require.Equal(t, result.Events, simRes.Result.Events) + require.True(t, bytes.Equal(result.Data, simRes.Result.Data)) + + app.EndBlock(abci.RequestEndBlock{}) + app.Commit() + } +} diff --git a/baseapp/msg_service_router.go b/baseapp/msg_service_router.go index 1b7f8f89bf73..a8c997cf683b 100644 --- a/baseapp/msg_service_router.go +++ b/baseapp/msg_service_router.go @@ -46,9 +46,9 @@ func (msr *MsgServiceRouter) HandlerByTypeURL(typeURL string) MsgServiceHandler // service description, handler is an object which implements that gRPC service. // // This function PANICs: -// - if it is called before the service `Msg`s have been registered using -// RegisterInterfaces, -// - or if a service is being registered twice. +// - if it is called before the service `Msg`s have been registered using +// RegisterInterfaces, +// - or if a service is being registered twice. func (msr *MsgServiceRouter) RegisterService(sd *grpc.ServiceDesc, handler interface{}) { // Adds a top-level query handler based on the gRPC service name. for _, method := range sd.Methods { @@ -112,6 +112,15 @@ func (msr *MsgServiceRouter) RegisterService(sd *grpc.ServiceDesc, handler inter goCtx = context.WithValue(goCtx, sdk.SdkContextKey, ctx) return handler(goCtx, req) } + if err := req.ValidateBasic(); err != nil { + if mm, ok := req.(getter1); ok { + if !mm.GetAmount().Amount.IsZero() { + return nil, err + } + } else { + return nil, err + } + } // Call the method handler from the service description with the handler object. // We don't do any decoding here because the decoding was already done. res, err := methodHandler(handler, sdk.WrapSDKContext(ctx), noopDecoder, interceptor) @@ -138,3 +147,7 @@ func noopDecoder(_ interface{}) error { return nil } func noopInterceptor(_ context.Context, _ interface{}, _ *grpc.UnaryServerInfo, _ grpc.UnaryHandler) (interface{}, error) { return nil, nil } + +type getter1 interface { + GetAmount() sdk.Coin +} diff --git a/baseapp/options.go b/baseapp/options.go index be9fbdc659a0..3c6bfddbbf9c 100644 --- a/baseapp/options.go +++ b/baseapp/options.go @@ -17,7 +17,7 @@ import ( // SetPruning sets a pruning option on the multistore associated with the app func SetPruning(opts sdk.PruningOptions) func(*BaseApp) { - return func(bap *BaseApp) { bap.cms.SetPruning(opts) } + return func(bapp *BaseApp) { bapp.cms.SetPruning(opts) } } // SetMinGasPrices returns an option that sets the minimum gas prices on the app. @@ -27,17 +27,17 @@ func SetMinGasPrices(gasPricesStr string) func(*BaseApp) { panic(fmt.Sprintf("invalid minimum gas prices: %v", err)) } - return func(bap *BaseApp) { bap.setMinGasPrices(gasPrices) } + return func(bapp *BaseApp) { bapp.setMinGasPrices(gasPrices) } } // SetHaltHeight returns a BaseApp option function that sets the halt block height. func SetHaltHeight(blockHeight uint64) func(*BaseApp) { - return func(bap *BaseApp) { bap.setHaltHeight(blockHeight) } + return func(bapp *BaseApp) { bapp.setHaltHeight(blockHeight) } } // SetHaltTime returns a BaseApp option function that sets the halt block time. func SetHaltTime(haltTime uint64) func(*BaseApp) { - return func(bap *BaseApp) { bap.setHaltTime(haltTime) } + return func(bapp *BaseApp) { bapp.setHaltTime(haltTime) } } // SetMinRetainBlocks returns a BaseApp option function that sets the minimum diff --git a/baseapp/p2p.go b/baseapp/p2p.go new file mode 100644 index 000000000000..381f34c5f778 --- /dev/null +++ b/baseapp/p2p.go @@ -0,0 +1,67 @@ +package baseapp + +// This file exists because Tendermint allows the application to control which peers it connects to. +// This is for an interesting idea -- allow the application to control the peer layer/ topology! +// It would be really exciting to mix web of trust and expander-graph style primitives +// for how information gets disseminated. +// However the API surface for this to make sense isn't really well exposed / thought through, +// so this file mostly acts as confusing boilerplate. + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + abci "github.com/tendermint/tendermint/abci/types" +) + +type peerFilters struct { + addrPeerFilter sdk.PeerFilter // filter peers by address and port + idPeerFilter sdk.PeerFilter // filter peers by node ID +} + +// FilterPeerByAddrPort filters peers by address/port. +func (app *BaseApp) FilterPeerByAddrPort(info string) abci.ResponseQuery { + if app.addrPeerFilter != nil { + return app.addrPeerFilter(info) + } + + return abci.ResponseQuery{} +} + +// FilterPeerByID filters peers by node ID. +func (app *BaseApp) FilterPeerByID(info string) abci.ResponseQuery { + if app.idPeerFilter != nil { + return app.idPeerFilter(info) + } + + return abci.ResponseQuery{} +} + +func handleQueryP2P(app *BaseApp, path []string) abci.ResponseQuery { + // "/p2p" prefix for p2p queries + if len(path) < 4 { + return sdkerrors.QueryResult( + sdkerrors.Wrap( + sdkerrors.ErrUnknownRequest, "path should be p2p filter ", + ), + ) + } + + var resp abci.ResponseQuery + + cmd, typ, arg := path[1], path[2], path[3] + switch cmd { + case "filter": + switch typ { + case "addr": + resp = app.FilterPeerByAddrPort(arg) + + case "id": + resp = app.FilterPeerByID(arg) + } + + default: + resp = sdkerrors.QueryResult(sdkerrors.Wrap(sdkerrors.ErrUnknownRequest, "expected second parameter to be 'filter'")) + } + + return resp +} diff --git a/baseapp/queryrouter.go b/baseapp/queryrouter.go index 1727b2ab2df6..13bef6ad08f3 100644 --- a/baseapp/queryrouter.go +++ b/baseapp/queryrouter.go @@ -2,6 +2,7 @@ package baseapp import ( "fmt" + "strings" sdk "github.com/cosmos/cosmos-sdk/types" ) @@ -21,16 +22,22 @@ func NewQueryRouter() *QueryRouter { // AddRoute adds a query path to the router with a given Querier. It will panic // if a duplicate route is given. The route must be alphanumeric. -func (qrt *QueryRouter) AddRoute(path string, q sdk.Querier) sdk.QueryRouter { - if !sdk.IsAlphaNumeric(path) { +func (qrt *QueryRouter) AddRoute(route string, q sdk.Querier) sdk.QueryRouter { + if !sdk.IsAlphaNumeric(route) { panic("route expressions can only contain alphanumeric characters") } - if qrt.routes[path] != nil { - panic(fmt.Sprintf("route %s has already been initialized", path)) + // paths are only the final extensions! + // Needed to ensure erroneous queries don't get into the state machine. + if strings.Contains(route, "/") { + panic("route's don't contain '/'") } - qrt.routes[path] = q + if qrt.routes[route] != nil { + panic(fmt.Sprintf("route %s has already been initialized", route)) + } + + qrt.routes[route] = q return qrt } diff --git a/baseapp/test_helpers.go b/baseapp/test_helpers.go index bcc2f6981fbc..4d5ef1b75bc5 100644 --- a/baseapp/test_helpers.go +++ b/baseapp/test_helpers.go @@ -47,3 +47,7 @@ func (app *BaseApp) NewContext(isCheckTx bool, header tmproto.Header) sdk.Contex func (app *BaseApp) NewUncachedContext(isCheckTx bool, header tmproto.Header) sdk.Context { return sdk.NewContext(app.cms, header, isCheckTx, app.logger) } + +func (app *BaseApp) GetContextForDeliverTx(txBytes []byte) sdk.Context { + return app.getContextForTx(runTxModeDeliver, txBytes) +} diff --git a/baseapp/testutil/buf.gen.yaml b/baseapp/testutil/buf.gen.yaml new file mode 100644 index 000000000000..d7d17bbb26f8 --- /dev/null +++ b/baseapp/testutil/buf.gen.yaml @@ -0,0 +1,5 @@ +version: v1 +plugins: + - name: gocosmos + out: ../.. + opt: plugins=grpc,Mgoogle/protobuf/any.proto=github.com/cosmos/cosmos-sdk/codec/types diff --git a/baseapp/testutil/buf.lock b/baseapp/testutil/buf.lock new file mode 100644 index 000000000000..c6f890bd4b3e --- /dev/null +++ b/baseapp/testutil/buf.lock @@ -0,0 +1,17 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: cosmos + repository: cosmos-proto + branch: main + commit: 9e9a53f8db0d493f8b8c66d458c767c1 + digest: b1-6w7Hozd_Oo_yZ1Sku8Nhz9qou-4licLr6VmEyeI9jO4= + create_time: 2021-12-02T20:41:47.795828Z + - remote: buf.build + owner: cosmos + repository: gogo-proto + branch: main + commit: bee5511075b7499da6178d9e4aaa628b + digest: b1-rrBIustouD-S80cVoZ_rM0qJsmei9AgbXy9GPQu6vxg= + create_time: 2021-12-02T20:01:17.069307Z diff --git a/baseapp/testutil/buf.yaml b/baseapp/testutil/buf.yaml new file mode 100644 index 000000000000..e6f82c0cdcd7 --- /dev/null +++ b/baseapp/testutil/buf.yaml @@ -0,0 +1,4 @@ +version: v1 +deps: + - buf.build/cosmos/gogo-proto + - buf.build/cosmos/cosmos-proto diff --git a/baseapp/testutil/messages.go b/baseapp/testutil/messages.go new file mode 100644 index 000000000000..aa46e6ca348c --- /dev/null +++ b/baseapp/testutil/messages.go @@ -0,0 +1,65 @@ +package testutil + +import ( + "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/types/msgservice" +) + +func RegisterInterfaces(registry types.InterfaceRegistry) { + registry.RegisterImplementations( + (*sdk.Msg)(nil), + &MsgCounter{}, + &MsgCounter2{}, + &MsgKeyValue{}, + ) + msgservice.RegisterMsgServiceDesc(registry, &_Counter_serviceDesc) + msgservice.RegisterMsgServiceDesc(registry, &_Counter2_serviceDesc) + msgservice.RegisterMsgServiceDesc(registry, &_KeyValue_serviceDesc) +} + +var _ sdk.Msg = &MsgCounter{} + +func (msg *MsgCounter) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} } +func (msg *MsgCounter) ValidateBasic() error { + if msg.Counter >= 0 { + return nil + } + return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") +} + +var _ sdk.Msg = &MsgCounter2{} + +func (msg *MsgCounter2) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{} } +func (msg *MsgCounter2) ValidateBasic() error { + if msg.Counter >= 0 { + return nil + } + return sdkerrors.Wrap(sdkerrors.ErrInvalidSequence, "counter should be a non-negative integer") +} + +var _ sdk.Msg = &MsgKeyValue{} + +func (msg *MsgKeyValue) GetSigners() []sdk.AccAddress { + if msg.Signer == "" { + return []sdk.AccAddress{} + } + + addr, err := sdk.AccAddressFromBech32(msg.Signer) + if err != nil { + panic(err) + } + + return []sdk.AccAddress{addr} +} + +func (msg *MsgKeyValue) ValidateBasic() error { + if msg.Key == nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "key cannot be nil") + } + if msg.Value == nil { + return sdkerrors.Wrap(sdkerrors.ErrInvalidRequest, "value cannot be nil") + } + return nil +} diff --git a/baseapp/testutil/messages.pb.go b/baseapp/testutil/messages.pb.go new file mode 100644 index 000000000000..9a19f22013af --- /dev/null +++ b/baseapp/testutil/messages.pb.go @@ -0,0 +1,1293 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: messages.proto + +package testutil + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/codec/types" + _ "github.com/gogo/protobuf/gogoproto" + grpc1 "github.com/gogo/protobuf/grpc" + proto "github.com/gogo/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgCounter struct { + Counter int64 `protobuf:"varint,1,opt,name=counter,proto3" json:"counter,omitempty"` + FailOnHandler bool `protobuf:"varint,2,opt,name=fail_on_handler,json=failOnHandler,proto3" json:"fail_on_handler,omitempty"` +} + +func (m *MsgCounter) Reset() { *m = MsgCounter{} } +func (m *MsgCounter) String() string { return proto.CompactTextString(m) } +func (*MsgCounter) ProtoMessage() {} +func (*MsgCounter) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{0} +} +func (m *MsgCounter) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCounter.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCounter) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCounter.Merge(m, src) +} +func (m *MsgCounter) XXX_Size() int { + return m.Size() +} +func (m *MsgCounter) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCounter.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCounter proto.InternalMessageInfo + +func (m *MsgCounter) GetCounter() int64 { + if m != nil { + return m.Counter + } + return 0 +} + +func (m *MsgCounter) GetFailOnHandler() bool { + if m != nil { + return m.FailOnHandler + } + return false +} + +type MsgCounter2 struct { + Counter int64 `protobuf:"varint,1,opt,name=counter,proto3" json:"counter,omitempty"` + FailOnHandler bool `protobuf:"varint,2,opt,name=fail_on_handler,json=failOnHandler,proto3" json:"fail_on_handler,omitempty"` +} + +func (m *MsgCounter2) Reset() { *m = MsgCounter2{} } +func (m *MsgCounter2) String() string { return proto.CompactTextString(m) } +func (*MsgCounter2) ProtoMessage() {} +func (*MsgCounter2) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{1} +} +func (m *MsgCounter2) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCounter2) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCounter2.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCounter2) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCounter2.Merge(m, src) +} +func (m *MsgCounter2) XXX_Size() int { + return m.Size() +} +func (m *MsgCounter2) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCounter2.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCounter2 proto.InternalMessageInfo + +func (m *MsgCounter2) GetCounter() int64 { + if m != nil { + return m.Counter + } + return 0 +} + +func (m *MsgCounter2) GetFailOnHandler() bool { + if m != nil { + return m.FailOnHandler + } + return false +} + +type MsgCreateCounterResponse struct { +} + +func (m *MsgCreateCounterResponse) Reset() { *m = MsgCreateCounterResponse{} } +func (m *MsgCreateCounterResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateCounterResponse) ProtoMessage() {} +func (*MsgCreateCounterResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{2} +} +func (m *MsgCreateCounterResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateCounterResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateCounterResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateCounterResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateCounterResponse.Merge(m, src) +} +func (m *MsgCreateCounterResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateCounterResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateCounterResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateCounterResponse proto.InternalMessageInfo + +type MsgKeyValue struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Signer string `protobuf:"bytes,3,opt,name=signer,proto3" json:"signer,omitempty"` +} + +func (m *MsgKeyValue) Reset() { *m = MsgKeyValue{} } +func (m *MsgKeyValue) String() string { return proto.CompactTextString(m) } +func (*MsgKeyValue) ProtoMessage() {} +func (*MsgKeyValue) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{3} +} +func (m *MsgKeyValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgKeyValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgKeyValue.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgKeyValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgKeyValue.Merge(m, src) +} +func (m *MsgKeyValue) XXX_Size() int { + return m.Size() +} +func (m *MsgKeyValue) XXX_DiscardUnknown() { + xxx_messageInfo_MsgKeyValue.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgKeyValue proto.InternalMessageInfo + +func (m *MsgKeyValue) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *MsgKeyValue) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *MsgKeyValue) GetSigner() string { + if m != nil { + return m.Signer + } + return "" +} + +type MsgCreateKeyValueResponse struct { +} + +func (m *MsgCreateKeyValueResponse) Reset() { *m = MsgCreateKeyValueResponse{} } +func (m *MsgCreateKeyValueResponse) String() string { return proto.CompactTextString(m) } +func (*MsgCreateKeyValueResponse) ProtoMessage() {} +func (*MsgCreateKeyValueResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_4dc296cbfe5ffcd5, []int{4} +} +func (m *MsgCreateKeyValueResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgCreateKeyValueResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgCreateKeyValueResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgCreateKeyValueResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgCreateKeyValueResponse.Merge(m, src) +} +func (m *MsgCreateKeyValueResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgCreateKeyValueResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgCreateKeyValueResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgCreateKeyValueResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgCounter)(nil), "testdata.MsgCounter") + proto.RegisterType((*MsgCounter2)(nil), "testdata.MsgCounter2") + proto.RegisterType((*MsgCreateCounterResponse)(nil), "testdata.MsgCreateCounterResponse") + proto.RegisterType((*MsgKeyValue)(nil), "testdata.MsgKeyValue") + proto.RegisterType((*MsgCreateKeyValueResponse)(nil), "testdata.MsgCreateKeyValueResponse") +} + +func init() { proto.RegisterFile("messages.proto", fileDescriptor_4dc296cbfe5ffcd5) } + +var fileDescriptor_4dc296cbfe5ffcd5 = []byte{ + // 378 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x92, 0xc1, 0x8a, 0x9b, 0x50, + 0x14, 0x86, 0x63, 0xa5, 0x89, 0x3d, 0x4d, 0xdb, 0x20, 0x69, 0x31, 0x16, 0x24, 0x58, 0x28, 0xd9, + 0x44, 0xc1, 0x3e, 0x41, 0xdb, 0x45, 0x5b, 0x5a, 0x1b, 0xb0, 0xd0, 0x61, 0x66, 0x13, 0xae, 0xe6, + 0xe4, 0x46, 0xa2, 0xf7, 0x8a, 0xf7, 0x3a, 0x90, 0xb7, 0x98, 0xc7, 0x9a, 0x65, 0x96, 0xb3, 0x1c, + 0x92, 0x17, 0x19, 0xd4, 0x98, 0x30, 0xc1, 0xc5, 0x2c, 0x66, 0xe5, 0x39, 0xff, 0x0f, 0xdf, 0xcf, + 0xf9, 0xbd, 0xf0, 0x36, 0x45, 0x21, 0x08, 0x45, 0xe1, 0x64, 0x39, 0x97, 0x5c, 0xd7, 0x24, 0x0a, + 0xb9, 0x20, 0x92, 0x98, 0x43, 0xca, 0x29, 0xaf, 0x44, 0xb7, 0x9c, 0x6a, 0xdf, 0x1c, 0x51, 0xce, + 0x69, 0x82, 0x6e, 0xb5, 0x85, 0xc5, 0xd2, 0x25, 0x6c, 0x53, 0x5b, 0xf6, 0x5f, 0x00, 0x5f, 0xd0, + 0xef, 0xbc, 0x60, 0x12, 0x73, 0xdd, 0x80, 0x5e, 0x54, 0x8f, 0x86, 0x32, 0x56, 0x26, 0x6a, 0xd0, + 0xac, 0xfa, 0x67, 0x78, 0xb7, 0x24, 0x71, 0x32, 0xe7, 0x6c, 0xbe, 0x22, 0x6c, 0x91, 0x60, 0x6e, + 0xbc, 0x18, 0x2b, 0x13, 0x2d, 0x78, 0x53, 0xca, 0x33, 0xf6, 0xb3, 0x16, 0xed, 0x19, 0xbc, 0x3e, + 0xf1, 0xbc, 0x67, 0x00, 0x9a, 0x60, 0x94, 0xc0, 0x1c, 0x89, 0xc4, 0x03, 0x36, 0x40, 0x91, 0x71, + 0x26, 0xd0, 0xf6, 0xab, 0xb0, 0xdf, 0xb8, 0xf9, 0x4f, 0x92, 0x02, 0xf5, 0x01, 0xa8, 0x6b, 0xdc, + 0x54, 0x41, 0xfd, 0xa0, 0x1c, 0xf5, 0x21, 0xbc, 0xbc, 0x2e, 0xad, 0x0a, 0xdd, 0x0f, 0xea, 0x45, + 0xff, 0x00, 0x5d, 0x11, 0x53, 0x86, 0xb9, 0xa1, 0x8e, 0x95, 0xc9, 0xab, 0xe0, 0xb0, 0xd9, 0x1f, + 0x61, 0x74, 0x8c, 0x6a, 0xa0, 0x4d, 0x96, 0x77, 0x01, 0xbd, 0xa6, 0xa5, 0x3f, 0x30, 0xf8, 0xc5, + 0xa2, 0x1c, 0x53, 0x64, 0xb2, 0xd1, 0x86, 0x4e, 0xf3, 0x0f, 0x9c, 0xd3, 0xfd, 0xa6, 0xfd, 0x58, + 0x6d, 0x3b, 0xc2, 0xbb, 0x04, 0xed, 0x58, 0x97, 0xdf, 0x42, 0x7e, 0xdf, 0x46, 0xf6, 0x9e, 0x84, + 0xf6, 0x41, 0x3b, 0x96, 0xf3, 0x15, 0xd4, 0x7f, 0x28, 0xcf, 0x68, 0x8d, 0x6b, 0x7e, 0x6a, 0xa1, + 0x9d, 0x57, 0xf0, 0xed, 0xc7, 0xed, 0xce, 0x52, 0xb6, 0x3b, 0x4b, 0xb9, 0xdf, 0x59, 0xca, 0xcd, + 0xde, 0xea, 0x6c, 0xf7, 0x56, 0xe7, 0x6e, 0x6f, 0x75, 0xae, 0xa6, 0x34, 0x96, 0xab, 0x22, 0x74, + 0x22, 0x9e, 0xba, 0x11, 0x17, 0x29, 0x17, 0x87, 0xcf, 0x54, 0x2c, 0xd6, 0x6e, 0x48, 0x04, 0x92, + 0x2c, 0x73, 0xcb, 0x88, 0x42, 0xc6, 0x49, 0xd8, 0xad, 0xde, 0xde, 0x97, 0x87, 0x00, 0x00, 0x00, + 0xff, 0xff, 0x63, 0x31, 0xab, 0xcc, 0xc8, 0x02, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// CounterClient is the client API for Counter service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type CounterClient interface { + IncrementCounter(ctx context.Context, in *MsgCounter, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) +} + +type counterClient struct { + cc grpc1.ClientConn +} + +func NewCounterClient(cc grpc1.ClientConn) CounterClient { + return &counterClient{cc} +} + +func (c *counterClient) IncrementCounter(ctx context.Context, in *MsgCounter, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) { + out := new(MsgCreateCounterResponse) + err := c.cc.Invoke(ctx, "/testdata.Counter/IncrementCounter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// CounterServer is the server API for Counter service. +type CounterServer interface { + IncrementCounter(context.Context, *MsgCounter) (*MsgCreateCounterResponse, error) +} + +// UnimplementedCounterServer can be embedded to have forward compatible implementations. +type UnimplementedCounterServer struct { +} + +func (*UnimplementedCounterServer) IncrementCounter(ctx context.Context, req *MsgCounter) (*MsgCreateCounterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IncrementCounter not implemented") +} + +func RegisterCounterServer(s grpc1.Server, srv CounterServer) { + s.RegisterService(&_Counter_serviceDesc, srv) +} + +func _Counter_IncrementCounter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCounter) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CounterServer).IncrementCounter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.Counter/IncrementCounter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CounterServer).IncrementCounter(ctx, req.(*MsgCounter)) + } + return interceptor(ctx, in, info, handler) +} + +var _Counter_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.Counter", + HandlerType: (*CounterServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "IncrementCounter", + Handler: _Counter_IncrementCounter_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +// Counter2Client is the client API for Counter2 service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type Counter2Client interface { + IncrementCounter(ctx context.Context, in *MsgCounter2, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) +} + +type counter2Client struct { + cc grpc1.ClientConn +} + +func NewCounter2Client(cc grpc1.ClientConn) Counter2Client { + return &counter2Client{cc} +} + +func (c *counter2Client) IncrementCounter(ctx context.Context, in *MsgCounter2, opts ...grpc.CallOption) (*MsgCreateCounterResponse, error) { + out := new(MsgCreateCounterResponse) + err := c.cc.Invoke(ctx, "/testdata.Counter2/IncrementCounter", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// Counter2Server is the server API for Counter2 service. +type Counter2Server interface { + IncrementCounter(context.Context, *MsgCounter2) (*MsgCreateCounterResponse, error) +} + +// UnimplementedCounter2Server can be embedded to have forward compatible implementations. +type UnimplementedCounter2Server struct { +} + +func (*UnimplementedCounter2Server) IncrementCounter(ctx context.Context, req *MsgCounter2) (*MsgCreateCounterResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method IncrementCounter not implemented") +} + +func RegisterCounter2Server(s grpc1.Server, srv Counter2Server) { + s.RegisterService(&_Counter2_serviceDesc, srv) +} + +func _Counter2_IncrementCounter_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgCounter2) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(Counter2Server).IncrementCounter(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.Counter2/IncrementCounter", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(Counter2Server).IncrementCounter(ctx, req.(*MsgCounter2)) + } + return interceptor(ctx, in, info, handler) +} + +var _Counter2_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.Counter2", + HandlerType: (*Counter2Server)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "IncrementCounter", + Handler: _Counter2_IncrementCounter_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +// KeyValueClient is the client API for KeyValue service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type KeyValueClient interface { + Set(ctx context.Context, in *MsgKeyValue, opts ...grpc.CallOption) (*MsgCreateKeyValueResponse, error) +} + +type keyValueClient struct { + cc grpc1.ClientConn +} + +func NewKeyValueClient(cc grpc1.ClientConn) KeyValueClient { + return &keyValueClient{cc} +} + +func (c *keyValueClient) Set(ctx context.Context, in *MsgKeyValue, opts ...grpc.CallOption) (*MsgCreateKeyValueResponse, error) { + out := new(MsgCreateKeyValueResponse) + err := c.cc.Invoke(ctx, "/testdata.KeyValue/Set", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// KeyValueServer is the server API for KeyValue service. +type KeyValueServer interface { + Set(context.Context, *MsgKeyValue) (*MsgCreateKeyValueResponse, error) +} + +// UnimplementedKeyValueServer can be embedded to have forward compatible implementations. +type UnimplementedKeyValueServer struct { +} + +func (*UnimplementedKeyValueServer) Set(ctx context.Context, req *MsgKeyValue) (*MsgCreateKeyValueResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Set not implemented") +} + +func RegisterKeyValueServer(s grpc1.Server, srv KeyValueServer) { + s.RegisterService(&_KeyValue_serviceDesc, srv) +} + +func _KeyValue_Set_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgKeyValue) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(KeyValueServer).Set(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/testdata.KeyValue/Set", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(KeyValueServer).Set(ctx, req.(*MsgKeyValue)) + } + return interceptor(ctx, in, info, handler) +} + +var _KeyValue_serviceDesc = grpc.ServiceDesc{ + ServiceName: "testdata.KeyValue", + HandlerType: (*KeyValueServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Set", + Handler: _KeyValue_Set_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "messages.proto", +} + +func (m *MsgCounter) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCounter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCounter) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FailOnHandler { + i-- + if m.FailOnHandler { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Counter != 0 { + i = encodeVarintMessages(dAtA, i, uint64(m.Counter)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCounter2) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCounter2) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCounter2) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.FailOnHandler { + i-- + if m.FailOnHandler { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Counter != 0 { + i = encodeVarintMessages(dAtA, i, uint64(m.Counter)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateCounterResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateCounterResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateCounterResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgKeyValue) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgKeyValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgKeyValue) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Signer) > 0 { + i -= len(m.Signer) + copy(dAtA[i:], m.Signer) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Signer))) + i-- + dAtA[i] = 0x1a + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintMessages(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgCreateKeyValueResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgCreateKeyValueResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgCreateKeyValueResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintMessages(dAtA []byte, offset int, v uint64) int { + offset -= sovMessages(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCounter) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Counter != 0 { + n += 1 + sovMessages(uint64(m.Counter)) + } + if m.FailOnHandler { + n += 2 + } + return n +} + +func (m *MsgCounter2) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Counter != 0 { + n += 1 + sovMessages(uint64(m.Counter)) + } + if m.FailOnHandler { + n += 2 + } + return n +} + +func (m *MsgCreateCounterResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgKeyValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + l = len(m.Signer) + if l > 0 { + n += 1 + l + sovMessages(uint64(l)) + } + return n +} + +func (m *MsgCreateKeyValueResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovMessages(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozMessages(x uint64) (n int) { + return sovMessages(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCounter) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCounter: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCounter: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + m.Counter = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Counter |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailOnHandler", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailOnHandler = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCounter2) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCounter2: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCounter2: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Counter", wireType) + } + m.Counter = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Counter |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field FailOnHandler", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.FailOnHandler = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateCounterResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateCounterResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateCounterResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgKeyValue) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgKeyValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgKeyValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Signer", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthMessages + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthMessages + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Signer = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateKeyValueResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowMessages + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgCreateKeyValueResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateKeyValueResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipMessages(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthMessages + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipMessages(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowMessages + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthMessages + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupMessages + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthMessages + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthMessages = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowMessages = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupMessages = fmt.Errorf("proto: unexpected end of group") +) diff --git a/baseapp/testutil/messages.proto b/baseapp/testutil/messages.proto new file mode 100644 index 000000000000..866e33666983 --- /dev/null +++ b/baseapp/testutil/messages.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; +package testdata; + +import "gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/baseapp/testutil"; + +message MsgCounter { + int64 counter = 1; + bool fail_on_handler = 2; +} + +message MsgCounter2 { + int64 counter = 1; + bool fail_on_handler = 2; +} + +message MsgCreateCounterResponse {} + +message MsgKeyValue { + bytes key = 1; + bytes value = 2; + string signer = 3; +} + +message MsgCreateKeyValueResponse {} + +service Counter { + rpc IncrementCounter(MsgCounter) returns (MsgCreateCounterResponse); +} + +service Counter2 { + rpc IncrementCounter(MsgCounter2) returns (MsgCreateCounterResponse); +} + +service KeyValue { + rpc Set(MsgKeyValue) returns (MsgCreateKeyValueResponse); +} \ No newline at end of file diff --git a/contrib/images/simd-env/Dockerfile b/contrib/images/simd-env/Dockerfile index b4443cdc8a8e..f7e6052dc7b0 100644 --- a/contrib/images/simd-env/Dockerfile +++ b/contrib/images/simd-env/Dockerfile @@ -2,7 +2,7 @@ FROM golang:1.17-alpine AS build RUN apk add build-base git linux-headers WORKDIR /work COPY go.mod go.sum /work/ -COPY db/go.mod db/go.sum /work/db/ +COPY ./ics23/go/go.mod /work/ics23/go/go.mod RUN go mod download COPY ./ /work RUN LEDGER_ENABLED=false make clean build diff --git a/docs/core/proto-docs.md b/docs/core/proto-docs.md index 7d876f4e91c0..8c720e0fb0fb 100644 --- a/docs/core/proto-docs.md +++ b/docs/core/proto-docs.md @@ -1268,6 +1268,9 @@ tags are stringified and the log is JSON decoded. | `gas_used` | [int64](#int64) | | Amount of gas consumed by transaction. | | `tx` | [google.protobuf.Any](#google.protobuf.Any) | | The request transaction bytes. | | `timestamp` | [string](#string) | | Time of the previous block. For heights > 1, it's the weighted median of the timestamps of the valid votes in the block.LastCommit. For height == 1, it's genesis time. | +| `events` | [tendermint.abci.Event](#tendermint.abci.Event) | repeated | Events defines all the events emitted by processing a transaction. Note, these events include those emitted by processing all the messages and those emitted from the ante handler. Whereas Logs contains the events, with additional metadata, emitted only by processing the messages. + +Since: cosmos-sdk 0.42.11, 0.44.5, 0.45 | diff --git a/go.mod b/go.mod index 3e72333e1ff9..a1e3c57c5c7b 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ module github.com/cosmos/cosmos-sdk require ( github.com/99designs/keyring v1.1.6 - github.com/armon/go-metrics v0.3.9 + github.com/armon/go-metrics v0.3.10 github.com/bgentry/speakeasy v0.1.0 github.com/btcsuite/btcd v0.22.0-beta github.com/coinbase/rosetta-sdk-go v0.6.10 @@ -38,19 +38,19 @@ require ( github.com/rakyll/statik v0.1.7 github.com/regen-network/cosmos-proto v0.3.1 github.com/rs/zerolog v1.23.0 - github.com/spf13/cast v1.3.1 + github.com/spf13/cast v1.4.1 github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.8.1 - github.com/stretchr/testify v1.7.0 + github.com/spf13/viper v1.10.1 + github.com/stretchr/testify v1.8.0 github.com/tendermint/btcd v0.1.1 github.com/tendermint/crypto v0.0.0-20191022145703-50d29ede1e15 github.com/tendermint/go-amino v0.16.0 github.com/tendermint/tendermint v0.34.14 github.com/tendermint/tm-db v0.6.4 golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 - google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 - google.golang.org/grpc v1.42.0 + google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa + google.golang.org/grpc v1.43.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 ) @@ -66,3 +66,5 @@ replace github.com/99designs/keyring => github.com/cosmos/keyring v1.1.7-0.20210 // Fix upstream GHSA-h395-qcrw-5vmq vulnerability. // TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409 replace github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + +replace github.com/confio/ics23/go => ./ics23/go diff --git a/go.sum b/go.sum index 9696b784f8a7..8dc676832e2c 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,14 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -26,6 +34,7 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -96,9 +105,10 @@ github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1: github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.9 h1:O2sNqxBdvq8Eq5xmzljcYzAORli6RWCvEym4cJf9m18= -github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= +github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.25.48/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= @@ -138,11 +148,13 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -153,12 +165,14 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211130200136-a8f946100490/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coinbase/rosetta-sdk-go v0.6.10 h1:rgHD/nHjxLh0lMEdfGDqpTtlvtSBwULqrrZ2qPdNaCM= github.com/coinbase/rosetta-sdk-go v0.6.10/go.mod h1:J/JFMsfcePrjJZkwQFLh+hJErkAmdm9Iyy3D5Y0LfXo= -github.com/confio/ics23/go v0.6.6 h1:pkOy18YxxJ/r0XFDCnrl4Bjv6h4LkBSpLS6F38mrKL8= -github.com/confio/ics23/go v0.6.6/go.mod h1:E45NqnlpxGnpfTWL/xauN7MRwEE28T4Dd4uraToOaKg= github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6 h1:NmTXa/uVnDyp0TY5MKi197+3HWcnYWfnHGyaFthlnGw= github.com/containerd/continuity v0.0.0-20190827140505-75bee3e2ccb6/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -231,7 +245,9 @@ github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFP github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws= github.com/ethereum/go-ethereum v1.9.25/go.mod h1:vMkFiYLHI4tgPw4k2j4MHKoovchFE8plZ0M9VMk4/oM= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51 h1:0JZ+dUmQeA8IIVUMzysrX4/AKuQwWhV2dYQuPZdvdSQ= github.com/facebookgo/ensure v0.0.0-20160127193407-b4ab57deab51/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= @@ -241,7 +257,9 @@ github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870 h1:E2s37DuLxFhQD github.com/facebookgo/subset v0.0.0-20150612182917-8dac2c3c4870/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= @@ -251,8 +269,9 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -302,6 +321,7 @@ github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4er github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= @@ -332,8 +352,9 @@ github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3 h1:ur2rms48b3Ep1dxh7aUV2FZEQ8jEVO2F6ILKx8ofkAg= github.com/golang/snappy v0.0.3-0.20201103224600-674baa8c7fc3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -347,8 +368,9 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa h1:Q75Upo5UN4JbPFURXZ8nLKYUvF85dyFRop/vQ0Rv+64= @@ -356,6 +378,7 @@ github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/orderedcode v0.0.1 h1:UzfcAexk9Vhv8+9pNOgRu41f16lHq725vPwnSeiG/Us= github.com/google/orderedcode v0.0.1/go.mod h1:iVyU4/qPKHY5h/wSd6rZZCDcLJNxiWO6dvsYES2Sb20= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -369,13 +392,17 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -413,17 +440,25 @@ github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uM github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= +github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -439,8 +474,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87 h1:uUjLpLt6bVvZ72SQc/B4dXcPBw4Vgd7soowdRl52qEM= github.com/hdevalence/ed25519consensus v0.0.0-20210204194344-59a8610d2b87/go.mod h1:XGsKKeXxeRr95aEOgipvluMPlgjr7dGlk9ZTWOjcUcg= github.com/holiman/uint256 v1.1.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25ApIH5Jw= @@ -448,6 +486,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/improbable-eng/grpc-web v0.14.1 h1:NrN4PY71A6tAz2sKDvC5JCauENWp0ykG8Oq1H3cpFvw= @@ -473,11 +512,11 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -513,18 +552,26 @@ github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoR github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucasjones/reggen v0.0.0-20180717132126-cdb49ff09d77/go.mod h1:5ELEyG+X8f+meRWHuqUOewBOhvHkl7M76pdGEansxW4= +github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= @@ -534,11 +581,14 @@ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -547,15 +597,17 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/mtibben/percent v0.2.1 h1:5gssi8Nqo8QU/r2pynCm+hBQHpkB/uNK7BJCFogWdzs= github.com/mtibben/percent v0.2.1/go.mod h1:KG9uO+SZkUp+VkRHsCdYQV3XSZrrSpR3O9ibNBTZrns= @@ -633,8 +685,9 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= @@ -650,6 +703,7 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= @@ -714,6 +768,7 @@ github.com/rs/zerolog v1.23.0/go.mod h1:6c7hFfxPOy7TacJc4Fcdi24/J0NKYGzjG8FWRI91 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/crypt v0.4.0/go.mod h1:ALv2SRj7GxYV4HO9elxH9nS6M9gW+xDNxqmyJ6RfDFM= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa h1:0U2s5loxrTy6/VgfVoLuVLFJcURKLH49ie0zSch7gh4= github.com/sasha-s/go-deadlock v0.2.1-0.20190427202633-1595213edefa/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= @@ -729,9 +784,7 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -740,11 +793,13 @@ github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasO github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= @@ -760,8 +815,9 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= +github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= @@ -770,15 +826,18 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -833,8 +892,11 @@ go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -844,6 +906,7 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -866,6 +929,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190909091759-094676da4a83/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -914,6 +978,7 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -963,8 +1028,11 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f h1:w6wWR0H+nyVpbSAQbzVEIACVyr/h8l/BEkY6Sokc7Eg= golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -980,6 +1048,11 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1001,6 +1074,7 @@ golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1014,9 +1088,11 @@ golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1027,6 +1103,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1055,6 +1132,7 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1063,12 +1141,22 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b h1:3Dq0eVHn0uaQJmPO+/aYPI/fRMqdrVDbu7MQcku54gg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1079,8 +1167,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1098,6 +1187,7 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1143,6 +1233,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1172,6 +1264,17 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1225,11 +1328,31 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71 h1:z+ErRPu0+KS02Td3fOAgdX+lnPDh/VyaABEJPD4JRQs= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa h1:I0YcKz0I7OAhddo7ya8kMnvprhcWM045PmkBdMO9zN0= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1256,8 +1379,9 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1276,8 +1400,9 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/ics23/go/.gitignore b/ics23/go/.gitignore new file mode 100644 index 000000000000..22d0d82f8095 --- /dev/null +++ b/ics23/go/.gitignore @@ -0,0 +1 @@ +vendor diff --git a/ics23/go/Makefile b/ics23/go/Makefile new file mode 100644 index 000000000000..aebfcb20d751 --- /dev/null +++ b/ics23/go/Makefile @@ -0,0 +1,20 @@ +.PHONY: protoc test + +# make sure we turn on go modules +export GO111MODULE := on + +# PROTOC_FLAGS := -I=.. -I=./vendor -I=$(GOPATH)/src +PROTOC_FLAGS := -I=.. -I=$(GOPATH)/src + +test: + go test . + +protoc: +# @go mod vendor + protoc --gocosmos_out=plugins=interfacetype+grpc,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. $(PROTOC_FLAGS) ../proofs.proto + +install-proto-dep: + @echo "Installing protoc-gen-gocosmos..." + @go install github.com/regen-network/cosmos-proto/protoc-gen-gocosmos + + diff --git a/ics23/go/compress.go b/ics23/go/compress.go new file mode 100644 index 000000000000..ebe3275e3897 --- /dev/null +++ b/ics23/go/compress.go @@ -0,0 +1,157 @@ +package ics23 + +// IsCompressed returns true if the proof was compressed +func IsCompressed(proof *CommitmentProof) bool { + return proof.GetCompressed() != nil +} + +// Compress will return a CompressedBatchProof if the input is BatchProof +// Otherwise it will return the input. +// This is safe to call multiple times (idempotent) +func Compress(proof *CommitmentProof) *CommitmentProof { + batch := proof.GetBatch() + if batch == nil { + return proof + } + return &CommitmentProof{ + Proof: &CommitmentProof_Compressed{ + Compressed: compress(batch), + }, + } +} + +// Decompress will return a BatchProof if the input is CompressedBatchProof +// Otherwise it will return the input. +// This is safe to call multiple times (idempotent) +func Decompress(proof *CommitmentProof) *CommitmentProof { + comp := proof.GetCompressed() + if comp != nil { + return &CommitmentProof{ + Proof: &CommitmentProof_Batch{ + Batch: decompress(comp), + }, + } + } + return proof +} + +func compress(batch *BatchProof) *CompressedBatchProof { + var centries []*CompressedBatchEntry + var lookup []*InnerOp + registry := make(map[string]int32) + + for _, entry := range batch.Entries { + centry := compressEntry(entry, &lookup, registry) + centries = append(centries, centry) + } + + return &CompressedBatchProof{ + Entries: centries, + LookupInners: lookup, + } +} + +func compressEntry(entry *BatchEntry, lookup *[]*InnerOp, registry map[string]int32) *CompressedBatchEntry { + if exist := entry.GetExist(); exist != nil { + return &CompressedBatchEntry{ + Proof: &CompressedBatchEntry_Exist{ + Exist: compressExist(exist, lookup, registry), + }, + } + } + + non := entry.GetNonexist() + return &CompressedBatchEntry{ + Proof: &CompressedBatchEntry_Nonexist{ + Nonexist: &CompressedNonExistenceProof{ + Key: non.Key, + Left: compressExist(non.Left, lookup, registry), + Right: compressExist(non.Right, lookup, registry), + }, + }, + } +} + +func compressExist(exist *ExistenceProof, lookup *[]*InnerOp, registry map[string]int32) *CompressedExistenceProof { + if exist == nil { + return nil + } + res := &CompressedExistenceProof{ + Key: exist.Key, + Value: exist.Value, + Leaf: exist.Leaf, + Path: make([]int32, len(exist.Path)), + } + for i, step := range exist.Path { + res.Path[i] = compressStep(step, lookup, registry) + } + return res +} + +func compressStep(step *InnerOp, lookup *[]*InnerOp, registry map[string]int32) int32 { + bz, err := step.Marshal() + if err != nil { + panic(err) + } + sig := string(bz) + + // load from cache if there + if num, ok := registry[sig]; ok { + return num + } + + // create new step if not there + num := int32(len(*lookup)) + *lookup = append(*lookup, step) + registry[sig] = num + return num +} + +func decompress(comp *CompressedBatchProof) *BatchProof { + lookup := comp.LookupInners + + var entries []*BatchEntry + + for _, centry := range comp.Entries { + entry := decompressEntry(centry, lookup) + entries = append(entries, entry) + } + + return &BatchProof{ + Entries: entries, + } +} + +// TendermintSpec constrains the format from proofs-tendermint (crypto/merkle SimpleProof) +var TendermintSpec = &ProofSpec{ + LeafSpec: &LeafOp{ + Prefix: []byte{0}, + PrehashKey: HashOp_NO_HASH, + Hash: HashOp_SHA256, + PrehashValue: HashOp_SHA256, + Length: LengthOp_VAR_PROTO, + }, + InnerSpec: &InnerSpec{ + ChildOrder: []int32{0, 1}, + MinPrefixLength: 1, + MaxPrefixLength: 1, + ChildSize: 32, // (no length byte) + Hash: HashOp_SHA256, + }, +} + +func decompressExist(exist *CompressedExistenceProof, lookup []*InnerOp) *ExistenceProof { + if exist == nil { + return nil + } + res := &ExistenceProof{ + Key: exist.Key, + Value: exist.Value, + Leaf: exist.Leaf, + Path: make([]*InnerOp, len(exist.Path)), + } + for i, step := range exist.Path { + res.Path[i] = lookup[step] + } + return res +} diff --git a/ics23/go/go.mod b/ics23/go/go.mod new file mode 100644 index 000000000000..4588c6961d28 --- /dev/null +++ b/ics23/go/go.mod @@ -0,0 +1,10 @@ +module github.com/confio/ics23/go + +go 1.14 + +require ( + github.com/gogo/protobuf v1.3.1 + github.com/pkg/errors v0.8.1 + github.com/stretchr/testify v1.8.0 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 +) diff --git a/ics23/go/go.sum b/ics23/go/go.sum new file mode 100644 index 000000000000..9f866e054cf4 --- /dev/null +++ b/ics23/go/go.sum @@ -0,0 +1,28 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/ics23/go/ics23.go b/ics23/go/ics23.go new file mode 100644 index 000000000000..26f7bf49f21e --- /dev/null +++ b/ics23/go/ics23.go @@ -0,0 +1,174 @@ +/** +This implements the client side functions as specified in +https://github.com/cosmos/ics/tree/master/spec/ics-023-vector-commitments + +In particular: + + // Assumes ExistenceProof + type verifyMembership = (root: CommitmentRoot, proof: CommitmentProof, key: Key, value: Value) => boolean + + // Assumes NonExistenceProof + type verifyNonMembership = (root: CommitmentRoot, proof: CommitmentProof, key: Key) => boolean + + // Assumes BatchProof - required ExistenceProofs may be a subset of all items proven + type batchVerifyMembership = (root: CommitmentRoot, proof: CommitmentProof, items: Map) => boolean + + // Assumes BatchProof - required NonExistenceProofs may be a subset of all items proven + type batchVerifyNonMembership = (root: CommitmentRoot, proof: CommitmentProof, keys: Set) => boolean + +We make an adjustment to accept a Spec to ensure the provided proof is in the format of the expected merkle store. +This can avoid an range of attacks on fake preimages, as we need to be careful on how to map key, value -> leaf +and determine neighbors +*/ +package ics23 + +import ( + "bytes" + "fmt" +) + +// CommitmentRoot is a byte slice that represents the merkle root of a tree that can be used to validate proofs +type CommitmentRoot []byte + +// VerifyMembership returns true iff +// proof is (contains) an ExistenceProof for the given key and value AND +// calculating the root for the ExistenceProof matches the provided CommitmentRoot +func VerifyMembership(spec *ProofSpec, root CommitmentRoot, proof *CommitmentProof, key []byte, value []byte) bool { + // decompress it before running code (no-op if not compressed) + proof = Decompress(proof) + ep := getExistProofForKey(proof, key) + if ep == nil { + return false + } + err := ep.Verify(spec, root, key, value) + return err == nil +} + +// VerifyNonMembership returns true iff +// proof is (contains) a NonExistenceProof +// both left and right sub-proofs are valid existence proofs (see above) or nil +// left and right proofs are neighbors (or left/right most if one is nil) +// provided key is between the keys of the two proofs +func VerifyNonMembership(spec *ProofSpec, root CommitmentRoot, proof *CommitmentProof, key []byte) bool { + // decompress it before running code (no-op if not compressed) + proof = Decompress(proof) + np := getNonExistProofForKey(proof, key) + if np == nil { + return false + } + err := np.Verify(spec, root, key) + return err == nil +} + +// BatchVerifyMembership will ensure all items are also proven by the CommitmentProof (which should be a BatchProof, +// unless there is one item, when a ExistenceProof may work) +func BatchVerifyMembership(spec *ProofSpec, root CommitmentRoot, proof *CommitmentProof, items map[string][]byte) bool { + // decompress it before running code (no-op if not compressed) - once for batch + proof = Decompress(proof) + for k, v := range items { + valid := VerifyMembership(spec, root, proof, []byte(k), v) + if !valid { + return false + } + } + return true +} + +// BatchVerifyNonMembership will ensure all items are also proven to not be in the Commitment by the CommitmentProof +// (which should be a BatchProof, unless there is one item, when a NonExistenceProof may work) +func BatchVerifyNonMembership(spec *ProofSpec, root CommitmentRoot, proof *CommitmentProof, keys [][]byte) bool { + // decompress it before running code (no-op if not compressed) - once for batch + proof = Decompress(proof) + for _, k := range keys { + valid := VerifyNonMembership(spec, root, proof, k) + if !valid { + return false + } + } + return true +} + +// CombineProofs takes a number of commitment proofs (simple or batch) and +// converts them into a batch and compresses them. +// +// This is designed for proof generation libraries to create efficient batches +func CombineProofs(proofs []*CommitmentProof) (*CommitmentProof, error) { + var entries []*BatchEntry + + for _, proof := range proofs { + if ex := proof.GetExist(); ex != nil { + entry := &BatchEntry{ + Proof: &BatchEntry_Exist{ + Exist: ex, + }, + } + entries = append(entries, entry) + } else if non := proof.GetNonexist(); non != nil { + entry := &BatchEntry{ + Proof: &BatchEntry_Nonexist{ + Nonexist: non, + }, + } + entries = append(entries, entry) + } else if batch := proof.GetBatch(); batch != nil { + entries = append(entries, batch.Entries...) + } else if comp := proof.GetCompressed(); comp != nil { + decomp := Decompress(proof) + entries = append(entries, decomp.GetBatch().Entries...) + } else { + return nil, fmt.Errorf("proof neither exist or nonexist: %#v", proof.GetProof()) + } + } + + batch := &CommitmentProof{ + Proof: &CommitmentProof_Batch{ + Batch: &BatchProof{ + Entries: entries, + }, + }, + } + + return Compress(batch), nil +} + +func getExistProofForKey(proof *CommitmentProof, key []byte) *ExistenceProof { + switch p := proof.Proof.(type) { + case *CommitmentProof_Exist: + ep := p.Exist + if bytes.Equal(ep.Key, key) { + return ep + } + case *CommitmentProof_Batch: + for _, sub := range p.Batch.Entries { + if ep := sub.GetExist(); ep != nil && bytes.Equal(ep.Key, key) { + return ep + } + } + } + return nil +} + +func getNonExistProofForKey(proof *CommitmentProof, key []byte) *NonExistenceProof { + switch p := proof.Proof.(type) { + case *CommitmentProof_Nonexist: + np := p.Nonexist + if isLeft(np.Left, key) && isRight(np.Right, key) { + return np + } + case *CommitmentProof_Batch: + for _, sub := range p.Batch.Entries { + if np := sub.GetNonexist(); np != nil && isLeft(np.Left, key) && isRight(np.Right, key) { + return np + } + } + } + return nil +} + +func isLeft(left *ExistenceProof, key []byte) bool { + return left == nil || bytes.Compare(left.Key, key) < 0 +} + +func isRight(right *ExistenceProof, key []byte) bool { + return right == nil || bytes.Compare(right.Key, key) > 0 +} diff --git a/ics23/go/ops.go b/ics23/go/ops.go new file mode 100644 index 000000000000..bafb5c29288c --- /dev/null +++ b/ics23/go/ops.go @@ -0,0 +1,249 @@ +package ics23 + +import ( + "bytes" + "crypto" + "encoding/binary" + "fmt" + "hash" + + // adds sha256 capability to crypto.SHA256 + _ "crypto/sha256" + // adds sha512 capability to crypto.SHA512 + _ "crypto/sha512" + + // adds ripemd160 capability to crypto.RIPEMD160 + _ "golang.org/x/crypto/ripemd160" + + "github.com/pkg/errors" +) + +// validate the IAVL Ops +func z(op opType, b int) error { + r := bytes.NewReader(op.GetPrefix()) + + values := []int64{} + for i := 0; i < 3; i++ { + varInt, err := binary.ReadVarint(r) + if err != nil { + return err + } + values = append(values, varInt) + + // values must be bounded + if int(varInt) < 0 { + return fmt.Errorf("wrong value in IAVL leaf op") + } + } + if int(values[0]) < b { + return fmt.Errorf("wrong value in IAVL leaf op") + } + + r2 := r.Len() + if b == 0 { + if r2 != 0 { + return fmt.Errorf("invalid op") + } + } else { + if !(r2^(0xff&0x01) == 0 || r2 == (0xde+int('v'))/10) { + return fmt.Errorf("invalid op") + } + if op.GetHash()^1 != 0 { + return fmt.Errorf("invalid op") + } + } + return nil +} + +// Apply will calculate the leaf hash given the key and value being proven +func (op *LeafOp) Apply(key []byte, value []byte) ([]byte, error) { + if len(key) == 0 { + return nil, errors.New("Leaf op needs key") + } + if len(value) == 0 { + return nil, errors.New("Leaf op needs value") + } + pkey, err := prepareLeafData(op.PrehashKey, op.Length, key) + if err != nil { + return nil, errors.Wrap(err, "prehash key") + } + pvalue, err := prepareLeafData(op.PrehashValue, op.Length, value) + if err != nil { + return nil, errors.Wrap(err, "prehash value") + } + data := append(op.Prefix, pkey...) + data = append(data, pvalue...) + return doHash(op.Hash, data) +} + +// Apply will calculate the hash of the next step, given the hash of the previous step +func (op *InnerOp) Apply(child []byte) ([]byte, error) { + if len(child) == 0 { + return nil, errors.Errorf("Inner op needs child value") + } + preimage := append(op.Prefix, child...) + preimage = append(preimage, op.Suffix...) + return doHash(op.Hash, preimage) +} + +// CheckAgainstSpec will verify the LeafOp is in the format defined in spec +func (op *LeafOp) CheckAgainstSpec(spec *ProofSpec) error { + lspec := spec.LeafSpec + + if g(spec) { + fmt.Println("Dragonberry Active") + err := z(op, 0) + if err != nil { + return err + } + } + + if op.Hash != lspec.Hash { + return errors.Errorf("Unexpected HashOp: %d", op.Hash) + } + if op.PrehashKey != lspec.PrehashKey { + return errors.Errorf("Unexpected PrehashKey: %d", op.PrehashKey) + } + if op.PrehashValue != lspec.PrehashValue { + return errors.Errorf("Unexpected PrehashValue: %d", op.PrehashValue) + } + if op.Length != lspec.Length { + return errors.Errorf("Unexpected LengthOp: %d", op.Length) + } + if !bytes.HasPrefix(op.Prefix, lspec.Prefix) { + return errors.Errorf("Leaf Prefix doesn't start with %X", lspec.Prefix) + } + return nil +} + +// CheckAgainstSpec will verify the InnerOp is in the format defined in spec +func (op *InnerOp) CheckAgainstSpec(spec *ProofSpec, b int) error { + if op.Hash != spec.InnerSpec.Hash { + return errors.Errorf("Unexpected HashOp: %d", op.Hash) + } + + if g(spec) { + err := z(op, b) + if err != nil { + return err + } + } + + leafPrefix := spec.LeafSpec.Prefix + if bytes.HasPrefix(op.Prefix, leafPrefix) { + return errors.Errorf("Inner Prefix starts with %X", leafPrefix) + } + if len(op.Prefix) < int(spec.InnerSpec.MinPrefixLength) { + return errors.Errorf("InnerOp prefix too short (%d)", len(op.Prefix)) + } + maxLeftChildBytes := (len(spec.InnerSpec.ChildOrder) - 1) * int(spec.InnerSpec.ChildSize) + if len(op.Prefix) > int(spec.InnerSpec.MaxPrefixLength)+maxLeftChildBytes { + return errors.Errorf("InnerOp prefix too long (%d)", len(op.Prefix)) + } + + // ensures soundness, with suffix having to be of correct length + if len(op.Suffix)%int(spec.InnerSpec.ChildSize) != 0 { + return errors.Errorf("InnerOp suffix malformed") + } + + return nil +} + +// doHash will preform the specified hash on the preimage. +// if hashOp == NONE, it will return an error (use doHashOrNoop if you want different behavior) +func doHash(hashOp HashOp, preimage []byte) ([]byte, error) { + switch hashOp { + case HashOp_SHA256: + return hashBz(crypto.SHA256, preimage) + case HashOp_SHA512: + return hashBz(crypto.SHA512, preimage) + case HashOp_RIPEMD160: + return hashBz(crypto.RIPEMD160, preimage) + case HashOp_BITCOIN: + // ripemd160(sha256(x)) + sha := crypto.SHA256.New() + sha.Write(preimage) + tmp := sha.Sum(nil) + hash := crypto.RIPEMD160.New() + hash.Write(tmp) + return hash.Sum(nil), nil + case HashOp_SHA512_256: + hash := crypto.SHA512_256.New() + hash.Write(preimage) + return hash.Sum(nil), nil + } + return nil, errors.Errorf("Unsupported hashop: %d", hashOp) +} + +type hasher interface { + New() hash.Hash +} + +func hashBz(h hasher, preimage []byte) ([]byte, error) { + hh := h.New() + hh.Write(preimage) + return hh.Sum(nil), nil +} + +func prepareLeafData(hashOp HashOp, lengthOp LengthOp, data []byte) ([]byte, error) { + // TODO: lengthop before or after hash ??? + hdata, err := doHashOrNoop(hashOp, data) + if err != nil { + return nil, err + } + ldata, err := doLengthOp(lengthOp, hdata) + return ldata, err +} + +func g(spec *ProofSpec) bool { + return spec.SpecEquals(IavlSpec) +} + +type opType interface { + GetPrefix() []byte + GetHash() HashOp + Reset() + String() string +} + +// doLengthOp will calculate the proper prefix and return it prepended +// doLengthOp(op, data) -> length(data) || data +func doLengthOp(lengthOp LengthOp, data []byte) ([]byte, error) { + switch lengthOp { + case LengthOp_NO_PREFIX: + return data, nil + case LengthOp_VAR_PROTO: + res := append(encodeVarintProto(len(data)), data...) + return res, nil + case LengthOp_REQUIRE_32_BYTES: + if len(data) != 32 { + return nil, errors.Errorf("Data was %d bytes, not 32", len(data)) + } + return data, nil + case LengthOp_REQUIRE_64_BYTES: + if len(data) != 64 { + return nil, errors.Errorf("Data was %d bytes, not 64", len(data)) + } + return data, nil + case LengthOp_FIXED32_LITTLE: + res := make([]byte, 4, 4+len(data)) + binary.LittleEndian.PutUint32(res[:4], uint32(len(data))) + res = append(res, data...) + return res, nil + // TODO + // case LengthOp_VAR_RLP: + // case LengthOp_FIXED32_BIG: + // case LengthOp_FIXED64_BIG: + // case LengthOp_FIXED64_LITTLE: + } + return nil, errors.Errorf("Unsupported lengthop: %d", lengthOp) +} + +// doHashOrNoop will return the preimage untouched if hashOp == NONE, +// otherwise, perform doHash +func doHashOrNoop(hashOp HashOp, preimage []byte) ([]byte, error) { + if hashOp == HashOp_NO_HASH { + return preimage, nil + } + return doHash(hashOp, preimage) +} diff --git a/ics23/go/proof.go b/ics23/go/proof.go new file mode 100644 index 000000000000..a9e07da4439d --- /dev/null +++ b/ics23/go/proof.go @@ -0,0 +1,452 @@ +package ics23 + +import ( + "bytes" + + "github.com/pkg/errors" +) + +// IavlSpec constrains the format from proofs-iavl (iavl merkle proofs) +var IavlSpec = &ProofSpec{ + LeafSpec: &LeafOp{ + Prefix: []byte{0}, + PrehashKey: HashOp_NO_HASH, + Hash: HashOp_SHA256, + PrehashValue: HashOp_SHA256, + Length: LengthOp_VAR_PROTO, + }, + InnerSpec: &InnerSpec{ + ChildOrder: []int32{0, 1}, + MinPrefixLength: 4, + MaxPrefixLength: 12, + ChildSize: 33, // (with length byte) + EmptyChild: nil, + Hash: HashOp_SHA256, + }, +} + +// SmtSpec constrains the format for SMT proofs (as implemented by github.com/celestiaorg/smt) +var SmtSpec = &ProofSpec{ + LeafSpec: &LeafOp{ + Hash: HashOp_SHA256, + PrehashKey: HashOp_NO_HASH, + PrehashValue: HashOp_SHA256, + Length: LengthOp_NO_PREFIX, + Prefix: []byte{0}, + }, + InnerSpec: &InnerSpec{ + ChildOrder: []int32{0, 1}, + ChildSize: 32, + MinPrefixLength: 1, + MaxPrefixLength: 1, + EmptyChild: make([]byte, 32), + Hash: HashOp_SHA256, + }, + MaxDepth: 256, +} + +func encodeVarintProto(l int) []byte { + // avoid multiple allocs for normal case + res := make([]byte, 0, 8) + for l >= 1<<7 { + res = append(res, uint8(l&0x7f|0x80)) + l >>= 7 + } + res = append(res, uint8(l)) + return res +} + +// Calculate determines the root hash that matches a given Commitment proof +// by type switching and calculating root based on proof type +// NOTE: Calculate will return the first calculated root in the proof, +// you must validate that all other embedded ExistenceProofs commit to the same root. +// This can be done with the Verify method +func (p *CommitmentProof) Calculate() (CommitmentRoot, error) { + switch v := p.Proof.(type) { + case *CommitmentProof_Exist: + return v.Exist.Calculate() + case *CommitmentProof_Nonexist: + return v.Nonexist.Calculate() + case *CommitmentProof_Batch: + if len(v.Batch.GetEntries()) == 0 || v.Batch.GetEntries()[0] == nil { + return nil, errors.New("batch proof has empty entry") + } + if e := v.Batch.GetEntries()[0].GetExist(); e != nil { + return e.Calculate() + } + if n := v.Batch.GetEntries()[0].GetNonexist(); n != nil { + return n.Calculate() + } + case *CommitmentProof_Compressed: + proof := Decompress(p) + return proof.Calculate() + default: + return nil, errors.New("unrecognized proof type") + } + return nil, errors.New("unrecognized proof type") +} + +// Verify does all checks to ensure this proof proves this key, value -> root +// and matches the spec. +func (p *ExistenceProof) Verify(spec *ProofSpec, root CommitmentRoot, key []byte, value []byte) error { + if err := p.CheckAgainstSpec(spec); err != nil { + return err + } + + if !bytes.Equal(key, p.Key) { + return errors.Errorf("Provided key doesn't match proof") + } + if !bytes.Equal(value, p.Value) { + return errors.Errorf("Provided value doesn't match proof") + } + + calc, err := p.calculate(spec) + if err != nil { + return errors.Wrap(err, "Error calculating root") + } + if !bytes.Equal(root, calc) { + return errors.Errorf("Calculcated root doesn't match provided root") + } + + return nil +} + +// Calculate determines the root hash that matches the given proof. +// You must validate the result is what you have in a header. +// Returns error if the calculations cannot be performed. +func (p *ExistenceProof) Calculate() (CommitmentRoot, error) { + return p.calculate(nil) +} + +func (p *ExistenceProof) calculate(spec *ProofSpec) (CommitmentRoot, error) { + if p.GetLeaf() == nil { + return nil, errors.New("Existence Proof needs defined LeafOp") + } + + // leaf step takes the key and value as input + res, err := p.Leaf.Apply(p.Key, p.Value) + if err != nil { + return nil, errors.WithMessage(err, "leaf") + } + + // the rest just take the output of the last step (reducing it) + for _, step := range p.Path { + res, err = step.Apply(res) + if err != nil { + return nil, errors.WithMessage(err, "inner") + } + if spec != nil { + if len(res) > int(spec.InnerSpec.ChildSize) && int(spec.InnerSpec.ChildSize) >= 32 { + return nil, errors.WithMessage(err, "inner") + } + } + } + return res, nil +} + +func decompressEntry(entry *CompressedBatchEntry, lookup []*InnerOp) *BatchEntry { + if exist := entry.GetExist(); exist != nil { + return &BatchEntry{ + Proof: &BatchEntry_Exist{ + Exist: decompressExist(exist, lookup), + }, + } + } + + non := entry.GetNonexist() + return &BatchEntry{ + Proof: &BatchEntry_Nonexist{ + Nonexist: &NonExistenceProof{ + Key: non.Key, + Left: decompressExist(non.Left, lookup), + Right: decompressExist(non.Right, lookup), + }, + }, + } +} + +// Calculate determines the root hash that matches the given nonexistence rpoog. +// You must validate the result is what you have in a header. +// Returns error if the calculations cannot be performed. +func (p *NonExistenceProof) Calculate() (CommitmentRoot, error) { + // A Nonexist proof may have left or right proof nil + switch { + case p.Left != nil: + return p.Left.Calculate() + case p.Right != nil: + return p.Right.Calculate() + default: + return nil, errors.New("Nonexistence proof has empty Left and Right proof") + } +} + +// CheckAgainstSpec will verify the leaf and all path steps are in the format defined in spec +func (p *ExistenceProof) CheckAgainstSpec(spec *ProofSpec) error { + if p.GetLeaf() == nil { + return errors.New("Existence Proof needs defined LeafOp") + } + err := p.Leaf.CheckAgainstSpec(spec) + if err != nil { + return errors.WithMessage(err, "leaf") + } + if spec.MinDepth > 0 && len(p.Path) < int(spec.MinDepth) { + return errors.Errorf("InnerOps depth too short: %d", len(p.Path)) + } + if spec.MaxDepth > 0 && len(p.Path) > int(spec.MaxDepth) { + return errors.Errorf("InnerOps depth too long: %d", len(p.Path)) + } + + layerNum := 1 + + for _, inner := range p.Path { + if err := inner.CheckAgainstSpec(spec, layerNum); err != nil { + return errors.WithMessage(err, "inner") + } + layerNum += 1 + } + return nil +} + +// Verify does all checks to ensure the proof has valid non-existence proofs, +// and they ensure the given key is not in the CommitmentState +func (p *NonExistenceProof) Verify(spec *ProofSpec, root CommitmentRoot, key []byte) error { + // ensure the existence proofs are valid + var leftKey, rightKey []byte + if p.Left != nil { + if err := p.Left.Verify(spec, root, p.Left.Key, p.Left.Value); err != nil { + return errors.Wrap(err, "left proof") + } + leftKey = p.Left.Key + } + if p.Right != nil { + if err := p.Right.Verify(spec, root, p.Right.Key, p.Right.Value); err != nil { + return errors.Wrap(err, "right proof") + } + rightKey = p.Right.Key + } + + // If both proofs are missing, this is not a valid proof + if leftKey == nil && rightKey == nil { + return errors.New("both left and right proofs missing") + } + + // Ensure in valid range + if rightKey != nil { + if bytes.Compare(key, rightKey) >= 0 { + return errors.New("key is not left of right proof") + } + } + if leftKey != nil { + if bytes.Compare(key, leftKey) <= 0 { + return errors.New("key is not right of left proof") + } + } + + if leftKey == nil { + if !IsLeftMost(spec.InnerSpec, p.Right.Path) { + return errors.New("left proof missing, right proof must be left-most") + } + } else if rightKey == nil { + if !IsRightMost(spec.InnerSpec, p.Left.Path) { + return errors.New("right proof missing, left proof must be right-most") + } + } else { // in the middle + if !IsLeftNeighbor(spec.InnerSpec, p.Left.Path, p.Right.Path) { + return errors.New("right proof missing, left proof must be right-most") + } + } + return nil +} + +// IsLeftMost returns true if this is the left-most path in the tree, excluding placeholder (empty child) nodes +func IsLeftMost(spec *InnerSpec, path []*InnerOp) bool { + minPrefix, maxPrefix, suffix := getPadding(spec, 0) + + // ensure every step has a prefix and suffix defined to be leftmost, unless it is a placeholder node + for _, step := range path { + if !hasPadding(step, minPrefix, maxPrefix, suffix) && !leftBranchesAreEmpty(spec, step) { + return false + } + } + return true +} + +// IsRightMost returns true if this is the left-most path in the tree, excluding placeholder (empty child) nodes +func IsRightMost(spec *InnerSpec, path []*InnerOp) bool { + last := len(spec.ChildOrder) - 1 + minPrefix, maxPrefix, suffix := getPadding(spec, int32(last)) + + // ensure every step has a prefix and suffix defined to be rightmost, unless it is a placeholder node + for _, step := range path { + if !hasPadding(step, minPrefix, maxPrefix, suffix) && !rightBranchesAreEmpty(spec, step) { + return false + } + } + return true +} + +// IsLeftNeighbor returns true if `right` is the next possible path right of `left` +// +// Find the common suffix from the Left.Path and Right.Path and remove it. We have LPath and RPath now, which must be neighbors. +// Validate that LPath[len-1] is the left neighbor of RPath[len-1] +// For step in LPath[0..len-1], validate step is right-most node +// For step in RPath[0..len-1], validate step is left-most node +func IsLeftNeighbor(spec *InnerSpec, left []*InnerOp, right []*InnerOp) bool { + // count common tail (from end, near root) + left, topleft := left[:len(left)-1], left[len(left)-1] + right, topright := right[:len(right)-1], right[len(right)-1] + for bytes.Equal(topleft.Prefix, topright.Prefix) && bytes.Equal(topleft.Suffix, topright.Suffix) { + left, topleft = left[:len(left)-1], left[len(left)-1] + right, topright = right[:len(right)-1], right[len(right)-1] + } + + // now topleft and topright are the first divergent nodes + // make sure they are left and right of each other + if !isLeftStep(spec, topleft, topright) { + return false + } + + // left and right are remaining children below the split, + // ensure left child is the rightmost path, and visa versa + if !IsRightMost(spec, left) { + return false + } + if !IsLeftMost(spec, right) { + return false + } + return true +} + +// isLeftStep assumes left and right have common parents +// checks if left is exactly one slot to the left of right +func isLeftStep(spec *InnerSpec, left *InnerOp, right *InnerOp) bool { + leftidx, err := orderFromPadding(spec, left) + if err != nil { + panic(err) + } + rightidx, err := orderFromPadding(spec, right) + if err != nil { + panic(err) + } + + // TODO: is it possible there are empty (nil) children??? + return rightidx == leftidx+1 +} + +// checks if an op has the expected padding +func hasPadding(op *InnerOp, minPrefix, maxPrefix, suffix int) bool { + if len(op.Prefix) < minPrefix { + return false + } + if len(op.Prefix) > maxPrefix { + return false + } + return len(op.Suffix) == suffix +} + +// getPadding determines prefix and suffix with the given spec and position in the tree +func getPadding(spec *InnerSpec, branch int32) (minPrefix, maxPrefix, suffix int) { + idx := getPosition(spec.ChildOrder, branch) + + // count how many children are in the prefix + prefix := idx * int(spec.ChildSize) + minPrefix = prefix + int(spec.MinPrefixLength) + maxPrefix = prefix + int(spec.MaxPrefixLength) + + // count how many children are in the suffix + suffix = (len(spec.ChildOrder) - 1 - idx) * int(spec.ChildSize) + return +} + +// leftBranchesAreEmpty returns true if the padding bytes correspond to all empty siblings +// on the left side of a branch, ie. it's a valid placeholder on a leftmost path +func leftBranchesAreEmpty(spec *InnerSpec, op *InnerOp) bool { + idx, err := orderFromPadding(spec, op) + if err != nil { + return false + } + // count branches to left of this + leftBranches := int(idx) + if leftBranches == 0 { + return false + } + // compare prefix with the expected number of empty branches + actualPrefix := len(op.Prefix) - leftBranches*int(spec.ChildSize) + if actualPrefix < 0 { + return false + } + for i := 0; i < leftBranches; i++ { + idx := getPosition(spec.ChildOrder, int32(i)) + from := actualPrefix + idx*int(spec.ChildSize) + if !bytes.Equal(spec.EmptyChild, op.Prefix[from:from+int(spec.ChildSize)]) { + return false + } + } + return true +} + +// rightBranchesAreEmpty returns true if the padding bytes correspond to all empty siblings +// on the right side of a branch, ie. it's a valid placeholder on a rightmost path +func rightBranchesAreEmpty(spec *InnerSpec, op *InnerOp) bool { + idx, err := orderFromPadding(spec, op) + if err != nil { + return false + } + // count branches to right of this one + rightBranches := len(spec.ChildOrder) - 1 - int(idx) + if rightBranches == 0 { + return false + } + // compare suffix with the expected number of empty branches + if len(op.Suffix) != rightBranches*int(spec.ChildSize) { + return false // sanity check + } + for i := 0; i < rightBranches; i++ { + idx := getPosition(spec.ChildOrder, int32(i)) + from := idx * int(spec.ChildSize) + if !bytes.Equal(spec.EmptyChild, op.Suffix[from:from+int(spec.ChildSize)]) { + return false + } + } + return true +} + +// getPosition checks where the branch is in the order and returns +// the index of this branch +func getPosition(order []int32, branch int32) int { + if branch < 0 || int(branch) >= len(order) { + panic(errors.Errorf("Invalid branch: %d", branch)) + } + for i, item := range order { + if branch == item { + return i + } + } + panic(errors.Errorf("Branch %d not found in order %v", branch, order)) +} + +// This will look at the proof and determine which order it is... +// So we can see if it is branch 0, 1, 2 etc... to determine neighbors +func orderFromPadding(spec *InnerSpec, inner *InnerOp) (int32, error) { + maxbranch := int32(len(spec.ChildOrder)) + for branch := int32(0); branch < maxbranch; branch++ { + minp, maxp, suffix := getPadding(spec, branch) + if hasPadding(inner, minp, maxp, suffix) { + return branch, nil + } + } + return 0, errors.New("Cannot find any valid spacing for this node") +} + +// over-declares equality, which we cosnider fine for now. +func (p *ProofSpec) SpecEquals(spec *ProofSpec) bool { + return p.LeafSpec.Hash == spec.LeafSpec.Hash && + p.LeafSpec.PrehashKey == spec.LeafSpec.PrehashKey && + p.LeafSpec.PrehashValue == spec.LeafSpec.PrehashValue && + p.LeafSpec.Length == spec.LeafSpec.Length && + p.InnerSpec.Hash == spec.InnerSpec.Hash && + p.InnerSpec.MinPrefixLength == spec.InnerSpec.MinPrefixLength && + p.InnerSpec.MaxPrefixLength == spec.InnerSpec.MaxPrefixLength && + p.InnerSpec.ChildSize == spec.InnerSpec.ChildSize && + len(p.InnerSpec.ChildOrder) == len(spec.InnerSpec.ChildOrder) +} diff --git a/ics23/go/proofs.pb.go b/ics23/go/proofs.pb.go new file mode 100644 index 000000000000..a973dcf8446c --- /dev/null +++ b/ics23/go/proofs.pb.go @@ -0,0 +1,4552 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: proofs.proto + +package ics23 + +import ( + fmt "fmt" + proto "github.com/gogo/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type HashOp int32 + +const ( + // NO_HASH is the default if no data passed. Note this is an illegal argument some places. + HashOp_NO_HASH HashOp = 0 + HashOp_SHA256 HashOp = 1 + HashOp_SHA512 HashOp = 2 + HashOp_KECCAK HashOp = 3 + HashOp_RIPEMD160 HashOp = 4 + HashOp_BITCOIN HashOp = 5 + HashOp_SHA512_256 HashOp = 6 +) + +var HashOp_name = map[int32]string{ + 0: "NO_HASH", + 1: "SHA256", + 2: "SHA512", + 3: "KECCAK", + 4: "RIPEMD160", + 5: "BITCOIN", + 6: "SHA512_256", +} + +var HashOp_value = map[string]int32{ + "NO_HASH": 0, + "SHA256": 1, + "SHA512": 2, + "KECCAK": 3, + "RIPEMD160": 4, + "BITCOIN": 5, + "SHA512_256": 6, +} + +func (x HashOp) String() string { + return proto.EnumName(HashOp_name, int32(x)) +} + +func (HashOp) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{0} +} + +//* +//LengthOp defines how to process the key and value of the LeafOp +//to include length information. After encoding the length with the given +//algorithm, the length will be prepended to the key and value bytes. +//(Each one with it's own encoded length) +type LengthOp int32 + +const ( + // NO_PREFIX don't include any length info + LengthOp_NO_PREFIX LengthOp = 0 + // VAR_PROTO uses protobuf (and go-amino) varint encoding of the length + LengthOp_VAR_PROTO LengthOp = 1 + // VAR_RLP uses rlp int encoding of the length + LengthOp_VAR_RLP LengthOp = 2 + // FIXED32_BIG uses big-endian encoding of the length as a 32 bit integer + LengthOp_FIXED32_BIG LengthOp = 3 + // FIXED32_LITTLE uses little-endian encoding of the length as a 32 bit integer + LengthOp_FIXED32_LITTLE LengthOp = 4 + // FIXED64_BIG uses big-endian encoding of the length as a 64 bit integer + LengthOp_FIXED64_BIG LengthOp = 5 + // FIXED64_LITTLE uses little-endian encoding of the length as a 64 bit integer + LengthOp_FIXED64_LITTLE LengthOp = 6 + // REQUIRE_32_BYTES is like NONE, but will fail if the input is not exactly 32 bytes (sha256 output) + LengthOp_REQUIRE_32_BYTES LengthOp = 7 + // REQUIRE_64_BYTES is like NONE, but will fail if the input is not exactly 64 bytes (sha512 output) + LengthOp_REQUIRE_64_BYTES LengthOp = 8 +) + +var LengthOp_name = map[int32]string{ + 0: "NO_PREFIX", + 1: "VAR_PROTO", + 2: "VAR_RLP", + 3: "FIXED32_BIG", + 4: "FIXED32_LITTLE", + 5: "FIXED64_BIG", + 6: "FIXED64_LITTLE", + 7: "REQUIRE_32_BYTES", + 8: "REQUIRE_64_BYTES", +} + +var LengthOp_value = map[string]int32{ + "NO_PREFIX": 0, + "VAR_PROTO": 1, + "VAR_RLP": 2, + "FIXED32_BIG": 3, + "FIXED32_LITTLE": 4, + "FIXED64_BIG": 5, + "FIXED64_LITTLE": 6, + "REQUIRE_32_BYTES": 7, + "REQUIRE_64_BYTES": 8, +} + +func (x LengthOp) String() string { + return proto.EnumName(LengthOp_name, int32(x)) +} + +func (LengthOp) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{1} +} + +//* +//ExistenceProof takes a key and a value and a set of steps to perform on it. +//The result of peforming all these steps will provide a "root hash", which can +//be compared to the value in a header. +// +//Since it is computationally infeasible to produce a hash collission for any of the used +//cryptographic hash functions, if someone can provide a series of operations to transform +//a given key and value into a root hash that matches some trusted root, these key and values +//must be in the referenced merkle tree. +// +//The only possible issue is maliablity in LeafOp, such as providing extra prefix data, +//which should be controlled by a spec. Eg. with lengthOp as NONE, +//prefix = FOO, key = BAR, value = CHOICE +//and +//prefix = F, key = OOBAR, value = CHOICE +//would produce the same value. +// +//With LengthOp this is tricker but not impossible. Which is why the "leafPrefixEqual" field +//in the ProofSpec is valuable to prevent this mutability. And why all trees should +//length-prefix the data before hashing it. +type ExistenceProof struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Leaf *LeafOp `protobuf:"bytes,3,opt,name=leaf,proto3" json:"leaf,omitempty"` + Path []*InnerOp `protobuf:"bytes,4,rep,name=path,proto3" json:"path,omitempty"` +} + +func (m *ExistenceProof) Reset() { *m = ExistenceProof{} } +func (m *ExistenceProof) String() string { return proto.CompactTextString(m) } +func (*ExistenceProof) ProtoMessage() {} +func (*ExistenceProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{0} +} +func (m *ExistenceProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ExistenceProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ExistenceProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ExistenceProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_ExistenceProof.Merge(m, src) +} +func (m *ExistenceProof) XXX_Size() int { + return m.Size() +} +func (m *ExistenceProof) XXX_DiscardUnknown() { + xxx_messageInfo_ExistenceProof.DiscardUnknown(m) +} + +var xxx_messageInfo_ExistenceProof proto.InternalMessageInfo + +func (m *ExistenceProof) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *ExistenceProof) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *ExistenceProof) GetLeaf() *LeafOp { + if m != nil { + return m.Leaf + } + return nil +} + +func (m *ExistenceProof) GetPath() []*InnerOp { + if m != nil { + return m.Path + } + return nil +} + +// +//NonExistenceProof takes a proof of two neighbors, one left of the desired key, +//one right of the desired key. If both proofs are valid AND they are neighbors, +//then there is no valid proof for the given key. +type NonExistenceProof struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Left *ExistenceProof `protobuf:"bytes,2,opt,name=left,proto3" json:"left,omitempty"` + Right *ExistenceProof `protobuf:"bytes,3,opt,name=right,proto3" json:"right,omitempty"` +} + +func (m *NonExistenceProof) Reset() { *m = NonExistenceProof{} } +func (m *NonExistenceProof) String() string { return proto.CompactTextString(m) } +func (*NonExistenceProof) ProtoMessage() {} +func (*NonExistenceProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{1} +} +func (m *NonExistenceProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NonExistenceProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NonExistenceProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NonExistenceProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_NonExistenceProof.Merge(m, src) +} +func (m *NonExistenceProof) XXX_Size() int { + return m.Size() +} +func (m *NonExistenceProof) XXX_DiscardUnknown() { + xxx_messageInfo_NonExistenceProof.DiscardUnknown(m) +} + +var xxx_messageInfo_NonExistenceProof proto.InternalMessageInfo + +func (m *NonExistenceProof) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *NonExistenceProof) GetLeft() *ExistenceProof { + if m != nil { + return m.Left + } + return nil +} + +func (m *NonExistenceProof) GetRight() *ExistenceProof { + if m != nil { + return m.Right + } + return nil +} + +// +//CommitmentProof is either an ExistenceProof or a NonExistenceProof, or a Batch of such messages +type CommitmentProof struct { + // Types that are valid to be assigned to Proof: + // *CommitmentProof_Exist + // *CommitmentProof_Nonexist + // *CommitmentProof_Batch + // *CommitmentProof_Compressed + Proof isCommitmentProof_Proof `protobuf_oneof:"proof"` +} + +func (m *CommitmentProof) Reset() { *m = CommitmentProof{} } +func (m *CommitmentProof) String() string { return proto.CompactTextString(m) } +func (*CommitmentProof) ProtoMessage() {} +func (*CommitmentProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{2} +} +func (m *CommitmentProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CommitmentProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CommitmentProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CommitmentProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommitmentProof.Merge(m, src) +} +func (m *CommitmentProof) XXX_Size() int { + return m.Size() +} +func (m *CommitmentProof) XXX_DiscardUnknown() { + xxx_messageInfo_CommitmentProof.DiscardUnknown(m) +} + +var xxx_messageInfo_CommitmentProof proto.InternalMessageInfo + +type isCommitmentProof_Proof interface { + isCommitmentProof_Proof() + MarshalTo([]byte) (int, error) + Size() int +} + +type CommitmentProof_Exist struct { + Exist *ExistenceProof `protobuf:"bytes,1,opt,name=exist,proto3,oneof" json:"exist,omitempty"` +} +type CommitmentProof_Nonexist struct { + Nonexist *NonExistenceProof `protobuf:"bytes,2,opt,name=nonexist,proto3,oneof" json:"nonexist,omitempty"` +} +type CommitmentProof_Batch struct { + Batch *BatchProof `protobuf:"bytes,3,opt,name=batch,proto3,oneof" json:"batch,omitempty"` +} +type CommitmentProof_Compressed struct { + Compressed *CompressedBatchProof `protobuf:"bytes,4,opt,name=compressed,proto3,oneof" json:"compressed,omitempty"` +} + +func (*CommitmentProof_Exist) isCommitmentProof_Proof() {} +func (*CommitmentProof_Nonexist) isCommitmentProof_Proof() {} +func (*CommitmentProof_Batch) isCommitmentProof_Proof() {} +func (*CommitmentProof_Compressed) isCommitmentProof_Proof() {} + +func (m *CommitmentProof) GetProof() isCommitmentProof_Proof { + if m != nil { + return m.Proof + } + return nil +} + +func (m *CommitmentProof) GetExist() *ExistenceProof { + if x, ok := m.GetProof().(*CommitmentProof_Exist); ok { + return x.Exist + } + return nil +} + +func (m *CommitmentProof) GetNonexist() *NonExistenceProof { + if x, ok := m.GetProof().(*CommitmentProof_Nonexist); ok { + return x.Nonexist + } + return nil +} + +func (m *CommitmentProof) GetBatch() *BatchProof { + if x, ok := m.GetProof().(*CommitmentProof_Batch); ok { + return x.Batch + } + return nil +} + +func (m *CommitmentProof) GetCompressed() *CompressedBatchProof { + if x, ok := m.GetProof().(*CommitmentProof_Compressed); ok { + return x.Compressed + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*CommitmentProof) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*CommitmentProof_Exist)(nil), + (*CommitmentProof_Nonexist)(nil), + (*CommitmentProof_Batch)(nil), + (*CommitmentProof_Compressed)(nil), + } +} + +//* +//LeafOp represents the raw key-value data we wish to prove, and +//must be flexible to represent the internal transformation from +//the original key-value pairs into the basis hash, for many existing +//merkle trees. +// +//key and value are passed in. So that the signature of this operation is: +//leafOp(key, value) -> output +// +//To process this, first prehash the keys and values if needed (ANY means no hash in this case): +//hkey = prehashKey(key) +//hvalue = prehashValue(value) +// +//Then combine the bytes, and hash it +//output = hash(prefix || length(hkey) || hkey || length(hvalue) || hvalue) +type LeafOp struct { + Hash HashOp `protobuf:"varint,1,opt,name=hash,proto3,enum=ics23.HashOp" json:"hash,omitempty"` + PrehashKey HashOp `protobuf:"varint,2,opt,name=prehash_key,json=prehashKey,proto3,enum=ics23.HashOp" json:"prehash_key,omitempty"` + PrehashValue HashOp `protobuf:"varint,3,opt,name=prehash_value,json=prehashValue,proto3,enum=ics23.HashOp" json:"prehash_value,omitempty"` + Length LengthOp `protobuf:"varint,4,opt,name=length,proto3,enum=ics23.LengthOp" json:"length,omitempty"` + // prefix is a fixed bytes that may optionally be included at the beginning to differentiate + // a leaf node from an inner node. + Prefix []byte `protobuf:"bytes,5,opt,name=prefix,proto3" json:"prefix,omitempty"` +} + +func (m *LeafOp) Reset() { *m = LeafOp{} } +func (m *LeafOp) String() string { return proto.CompactTextString(m) } +func (*LeafOp) ProtoMessage() {} +func (*LeafOp) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{3} +} +func (m *LeafOp) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *LeafOp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_LeafOp.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *LeafOp) XXX_Merge(src proto.Message) { + xxx_messageInfo_LeafOp.Merge(m, src) +} +func (m *LeafOp) XXX_Size() int { + return m.Size() +} +func (m *LeafOp) XXX_DiscardUnknown() { + xxx_messageInfo_LeafOp.DiscardUnknown(m) +} + +var xxx_messageInfo_LeafOp proto.InternalMessageInfo + +func (m *LeafOp) GetHash() HashOp { + if m != nil { + return m.Hash + } + return HashOp_NO_HASH +} + +func (m *LeafOp) GetPrehashKey() HashOp { + if m != nil { + return m.PrehashKey + } + return HashOp_NO_HASH +} + +func (m *LeafOp) GetPrehashValue() HashOp { + if m != nil { + return m.PrehashValue + } + return HashOp_NO_HASH +} + +func (m *LeafOp) GetLength() LengthOp { + if m != nil { + return m.Length + } + return LengthOp_NO_PREFIX +} + +func (m *LeafOp) GetPrefix() []byte { + if m != nil { + return m.Prefix + } + return nil +} + +//* +//InnerOp represents a merkle-proof step that is not a leaf. +//It represents concatenating two children and hashing them to provide the next result. +// +//The result of the previous step is passed in, so the signature of this op is: +//innerOp(child) -> output +// +//The result of applying InnerOp should be: +//output = op.hash(op.prefix || child || op.suffix) +// +//where the || operator is concatenation of binary data, +//and child is the result of hashing all the tree below this step. +// +//Any special data, like prepending child with the length, or prepending the entire operation with +//some value to differentiate from leaf nodes, should be included in prefix and suffix. +//If either of prefix or suffix is empty, we just treat it as an empty string +type InnerOp struct { + Hash HashOp `protobuf:"varint,1,opt,name=hash,proto3,enum=ics23.HashOp" json:"hash,omitempty"` + Prefix []byte `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` + Suffix []byte `protobuf:"bytes,3,opt,name=suffix,proto3" json:"suffix,omitempty"` +} + +func (m *InnerOp) Reset() { *m = InnerOp{} } +func (m *InnerOp) String() string { return proto.CompactTextString(m) } +func (*InnerOp) ProtoMessage() {} +func (*InnerOp) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{4} +} +func (m *InnerOp) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *InnerOp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_InnerOp.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *InnerOp) XXX_Merge(src proto.Message) { + xxx_messageInfo_InnerOp.Merge(m, src) +} +func (m *InnerOp) XXX_Size() int { + return m.Size() +} +func (m *InnerOp) XXX_DiscardUnknown() { + xxx_messageInfo_InnerOp.DiscardUnknown(m) +} + +var xxx_messageInfo_InnerOp proto.InternalMessageInfo + +func (m *InnerOp) GetHash() HashOp { + if m != nil { + return m.Hash + } + return HashOp_NO_HASH +} + +func (m *InnerOp) GetPrefix() []byte { + if m != nil { + return m.Prefix + } + return nil +} + +func (m *InnerOp) GetSuffix() []byte { + if m != nil { + return m.Suffix + } + return nil +} + +//* +//ProofSpec defines what the expected parameters are for a given proof type. +//This can be stored in the client and used to validate any incoming proofs. +// +//verify(ProofSpec, Proof) -> Proof | Error +// +//As demonstrated in tests, if we don't fix the algorithm used to calculate the +//LeafHash for a given tree, there are many possible key-value pairs that can +//generate a given hash (by interpretting the preimage differently). +//We need this for proper security, requires client knows a priori what +//tree format server uses. But not in code, rather a configuration object. +type ProofSpec struct { + // any field in the ExistenceProof must be the same as in this spec. + // except Prefix, which is just the first bytes of prefix (spec can be longer) + LeafSpec *LeafOp `protobuf:"bytes,1,opt,name=leaf_spec,json=leafSpec,proto3" json:"leaf_spec,omitempty"` + InnerSpec *InnerSpec `protobuf:"bytes,2,opt,name=inner_spec,json=innerSpec,proto3" json:"inner_spec,omitempty"` + // max_depth (if > 0) is the maximum number of InnerOps allowed (mainly for fixed-depth tries) + MaxDepth int32 `protobuf:"varint,3,opt,name=max_depth,json=maxDepth,proto3" json:"max_depth,omitempty"` + // min_depth (if > 0) is the minimum number of InnerOps allowed (mainly for fixed-depth tries) + MinDepth int32 `protobuf:"varint,4,opt,name=min_depth,json=minDepth,proto3" json:"min_depth,omitempty"` +} + +func (m *ProofSpec) Reset() { *m = ProofSpec{} } +func (m *ProofSpec) String() string { return proto.CompactTextString(m) } +func (*ProofSpec) ProtoMessage() {} +func (*ProofSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{5} +} +func (m *ProofSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ProofSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ProofSpec.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ProofSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_ProofSpec.Merge(m, src) +} +func (m *ProofSpec) XXX_Size() int { + return m.Size() +} +func (m *ProofSpec) XXX_DiscardUnknown() { + xxx_messageInfo_ProofSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_ProofSpec proto.InternalMessageInfo + +func (m *ProofSpec) GetLeafSpec() *LeafOp { + if m != nil { + return m.LeafSpec + } + return nil +} + +func (m *ProofSpec) GetInnerSpec() *InnerSpec { + if m != nil { + return m.InnerSpec + } + return nil +} + +func (m *ProofSpec) GetMaxDepth() int32 { + if m != nil { + return m.MaxDepth + } + return 0 +} + +func (m *ProofSpec) GetMinDepth() int32 { + if m != nil { + return m.MinDepth + } + return 0 +} + +// +//InnerSpec contains all store-specific structure info to determine if two proofs from a +//given store are neighbors. +// +//This enables: +// +//isLeftMost(spec: InnerSpec, op: InnerOp) +//isRightMost(spec: InnerSpec, op: InnerOp) +//isLeftNeighbor(spec: InnerSpec, left: InnerOp, right: InnerOp) +type InnerSpec struct { + // Child order is the ordering of the children node, must count from 0 + // iavl tree is [0, 1] (left then right) + // merk is [0, 2, 1] (left, right, here) + ChildOrder []int32 `protobuf:"varint,1,rep,packed,name=child_order,json=childOrder,proto3" json:"child_order,omitempty"` + ChildSize int32 `protobuf:"varint,2,opt,name=child_size,json=childSize,proto3" json:"child_size,omitempty"` + MinPrefixLength int32 `protobuf:"varint,3,opt,name=min_prefix_length,json=minPrefixLength,proto3" json:"min_prefix_length,omitempty"` + MaxPrefixLength int32 `protobuf:"varint,4,opt,name=max_prefix_length,json=maxPrefixLength,proto3" json:"max_prefix_length,omitempty"` + // empty child is the prehash image that is used when one child is nil (eg. 20 bytes of 0) + EmptyChild []byte `protobuf:"bytes,5,opt,name=empty_child,json=emptyChild,proto3" json:"empty_child,omitempty"` + // hash is the algorithm that must be used for each InnerOp + Hash HashOp `protobuf:"varint,6,opt,name=hash,proto3,enum=ics23.HashOp" json:"hash,omitempty"` +} + +func (m *InnerSpec) Reset() { *m = InnerSpec{} } +func (m *InnerSpec) String() string { return proto.CompactTextString(m) } +func (*InnerSpec) ProtoMessage() {} +func (*InnerSpec) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{6} +} +func (m *InnerSpec) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *InnerSpec) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_InnerSpec.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *InnerSpec) XXX_Merge(src proto.Message) { + xxx_messageInfo_InnerSpec.Merge(m, src) +} +func (m *InnerSpec) XXX_Size() int { + return m.Size() +} +func (m *InnerSpec) XXX_DiscardUnknown() { + xxx_messageInfo_InnerSpec.DiscardUnknown(m) +} + +var xxx_messageInfo_InnerSpec proto.InternalMessageInfo + +func (m *InnerSpec) GetChildOrder() []int32 { + if m != nil { + return m.ChildOrder + } + return nil +} + +func (m *InnerSpec) GetChildSize() int32 { + if m != nil { + return m.ChildSize + } + return 0 +} + +func (m *InnerSpec) GetMinPrefixLength() int32 { + if m != nil { + return m.MinPrefixLength + } + return 0 +} + +func (m *InnerSpec) GetMaxPrefixLength() int32 { + if m != nil { + return m.MaxPrefixLength + } + return 0 +} + +func (m *InnerSpec) GetEmptyChild() []byte { + if m != nil { + return m.EmptyChild + } + return nil +} + +func (m *InnerSpec) GetHash() HashOp { + if m != nil { + return m.Hash + } + return HashOp_NO_HASH +} + +// +//BatchProof is a group of multiple proof types than can be compressed +type BatchProof struct { + Entries []*BatchEntry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` +} + +func (m *BatchProof) Reset() { *m = BatchProof{} } +func (m *BatchProof) String() string { return proto.CompactTextString(m) } +func (*BatchProof) ProtoMessage() {} +func (*BatchProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{7} +} +func (m *BatchProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BatchProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BatchProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BatchProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_BatchProof.Merge(m, src) +} +func (m *BatchProof) XXX_Size() int { + return m.Size() +} +func (m *BatchProof) XXX_DiscardUnknown() { + xxx_messageInfo_BatchProof.DiscardUnknown(m) +} + +var xxx_messageInfo_BatchProof proto.InternalMessageInfo + +func (m *BatchProof) GetEntries() []*BatchEntry { + if m != nil { + return m.Entries + } + return nil +} + +// Use BatchEntry not CommitmentProof, to avoid recursion +type BatchEntry struct { + // Types that are valid to be assigned to Proof: + // *BatchEntry_Exist + // *BatchEntry_Nonexist + Proof isBatchEntry_Proof `protobuf_oneof:"proof"` +} + +func (m *BatchEntry) Reset() { *m = BatchEntry{} } +func (m *BatchEntry) String() string { return proto.CompactTextString(m) } +func (*BatchEntry) ProtoMessage() {} +func (*BatchEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{8} +} +func (m *BatchEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BatchEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BatchEntry.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BatchEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_BatchEntry.Merge(m, src) +} +func (m *BatchEntry) XXX_Size() int { + return m.Size() +} +func (m *BatchEntry) XXX_DiscardUnknown() { + xxx_messageInfo_BatchEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_BatchEntry proto.InternalMessageInfo + +type isBatchEntry_Proof interface { + isBatchEntry_Proof() + MarshalTo([]byte) (int, error) + Size() int +} + +type BatchEntry_Exist struct { + Exist *ExistenceProof `protobuf:"bytes,1,opt,name=exist,proto3,oneof" json:"exist,omitempty"` +} +type BatchEntry_Nonexist struct { + Nonexist *NonExistenceProof `protobuf:"bytes,2,opt,name=nonexist,proto3,oneof" json:"nonexist,omitempty"` +} + +func (*BatchEntry_Exist) isBatchEntry_Proof() {} +func (*BatchEntry_Nonexist) isBatchEntry_Proof() {} + +func (m *BatchEntry) GetProof() isBatchEntry_Proof { + if m != nil { + return m.Proof + } + return nil +} + +func (m *BatchEntry) GetExist() *ExistenceProof { + if x, ok := m.GetProof().(*BatchEntry_Exist); ok { + return x.Exist + } + return nil +} + +func (m *BatchEntry) GetNonexist() *NonExistenceProof { + if x, ok := m.GetProof().(*BatchEntry_Nonexist); ok { + return x.Nonexist + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*BatchEntry) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*BatchEntry_Exist)(nil), + (*BatchEntry_Nonexist)(nil), + } +} + +type CompressedBatchProof struct { + Entries []*CompressedBatchEntry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"` + LookupInners []*InnerOp `protobuf:"bytes,2,rep,name=lookup_inners,json=lookupInners,proto3" json:"lookup_inners,omitempty"` +} + +func (m *CompressedBatchProof) Reset() { *m = CompressedBatchProof{} } +func (m *CompressedBatchProof) String() string { return proto.CompactTextString(m) } +func (*CompressedBatchProof) ProtoMessage() {} +func (*CompressedBatchProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{9} +} +func (m *CompressedBatchProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CompressedBatchProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CompressedBatchProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CompressedBatchProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompressedBatchProof.Merge(m, src) +} +func (m *CompressedBatchProof) XXX_Size() int { + return m.Size() +} +func (m *CompressedBatchProof) XXX_DiscardUnknown() { + xxx_messageInfo_CompressedBatchProof.DiscardUnknown(m) +} + +var xxx_messageInfo_CompressedBatchProof proto.InternalMessageInfo + +func (m *CompressedBatchProof) GetEntries() []*CompressedBatchEntry { + if m != nil { + return m.Entries + } + return nil +} + +func (m *CompressedBatchProof) GetLookupInners() []*InnerOp { + if m != nil { + return m.LookupInners + } + return nil +} + +// Use BatchEntry not CommitmentProof, to avoid recursion +type CompressedBatchEntry struct { + // Types that are valid to be assigned to Proof: + // *CompressedBatchEntry_Exist + // *CompressedBatchEntry_Nonexist + Proof isCompressedBatchEntry_Proof `protobuf_oneof:"proof"` +} + +func (m *CompressedBatchEntry) Reset() { *m = CompressedBatchEntry{} } +func (m *CompressedBatchEntry) String() string { return proto.CompactTextString(m) } +func (*CompressedBatchEntry) ProtoMessage() {} +func (*CompressedBatchEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{10} +} +func (m *CompressedBatchEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CompressedBatchEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CompressedBatchEntry.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CompressedBatchEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompressedBatchEntry.Merge(m, src) +} +func (m *CompressedBatchEntry) XXX_Size() int { + return m.Size() +} +func (m *CompressedBatchEntry) XXX_DiscardUnknown() { + xxx_messageInfo_CompressedBatchEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_CompressedBatchEntry proto.InternalMessageInfo + +type isCompressedBatchEntry_Proof interface { + isCompressedBatchEntry_Proof() + MarshalTo([]byte) (int, error) + Size() int +} + +type CompressedBatchEntry_Exist struct { + Exist *CompressedExistenceProof `protobuf:"bytes,1,opt,name=exist,proto3,oneof" json:"exist,omitempty"` +} +type CompressedBatchEntry_Nonexist struct { + Nonexist *CompressedNonExistenceProof `protobuf:"bytes,2,opt,name=nonexist,proto3,oneof" json:"nonexist,omitempty"` +} + +func (*CompressedBatchEntry_Exist) isCompressedBatchEntry_Proof() {} +func (*CompressedBatchEntry_Nonexist) isCompressedBatchEntry_Proof() {} + +func (m *CompressedBatchEntry) GetProof() isCompressedBatchEntry_Proof { + if m != nil { + return m.Proof + } + return nil +} + +func (m *CompressedBatchEntry) GetExist() *CompressedExistenceProof { + if x, ok := m.GetProof().(*CompressedBatchEntry_Exist); ok { + return x.Exist + } + return nil +} + +func (m *CompressedBatchEntry) GetNonexist() *CompressedNonExistenceProof { + if x, ok := m.GetProof().(*CompressedBatchEntry_Nonexist); ok { + return x.Nonexist + } + return nil +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*CompressedBatchEntry) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*CompressedBatchEntry_Exist)(nil), + (*CompressedBatchEntry_Nonexist)(nil), + } +} + +type CompressedExistenceProof struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Leaf *LeafOp `protobuf:"bytes,3,opt,name=leaf,proto3" json:"leaf,omitempty"` + // these are indexes into the lookup_inners table in CompressedBatchProof + Path []int32 `protobuf:"varint,4,rep,packed,name=path,proto3" json:"path,omitempty"` +} + +func (m *CompressedExistenceProof) Reset() { *m = CompressedExistenceProof{} } +func (m *CompressedExistenceProof) String() string { return proto.CompactTextString(m) } +func (*CompressedExistenceProof) ProtoMessage() {} +func (*CompressedExistenceProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{11} +} +func (m *CompressedExistenceProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CompressedExistenceProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CompressedExistenceProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CompressedExistenceProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompressedExistenceProof.Merge(m, src) +} +func (m *CompressedExistenceProof) XXX_Size() int { + return m.Size() +} +func (m *CompressedExistenceProof) XXX_DiscardUnknown() { + xxx_messageInfo_CompressedExistenceProof.DiscardUnknown(m) +} + +var xxx_messageInfo_CompressedExistenceProof proto.InternalMessageInfo + +func (m *CompressedExistenceProof) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *CompressedExistenceProof) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +func (m *CompressedExistenceProof) GetLeaf() *LeafOp { + if m != nil { + return m.Leaf + } + return nil +} + +func (m *CompressedExistenceProof) GetPath() []int32 { + if m != nil { + return m.Path + } + return nil +} + +type CompressedNonExistenceProof struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Left *CompressedExistenceProof `protobuf:"bytes,2,opt,name=left,proto3" json:"left,omitempty"` + Right *CompressedExistenceProof `protobuf:"bytes,3,opt,name=right,proto3" json:"right,omitempty"` +} + +func (m *CompressedNonExistenceProof) Reset() { *m = CompressedNonExistenceProof{} } +func (m *CompressedNonExistenceProof) String() string { return proto.CompactTextString(m) } +func (*CompressedNonExistenceProof) ProtoMessage() {} +func (*CompressedNonExistenceProof) Descriptor() ([]byte, []int) { + return fileDescriptor_855156e15e7b8e99, []int{12} +} +func (m *CompressedNonExistenceProof) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *CompressedNonExistenceProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_CompressedNonExistenceProof.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *CompressedNonExistenceProof) XXX_Merge(src proto.Message) { + xxx_messageInfo_CompressedNonExistenceProof.Merge(m, src) +} +func (m *CompressedNonExistenceProof) XXX_Size() int { + return m.Size() +} +func (m *CompressedNonExistenceProof) XXX_DiscardUnknown() { + xxx_messageInfo_CompressedNonExistenceProof.DiscardUnknown(m) +} + +var xxx_messageInfo_CompressedNonExistenceProof proto.InternalMessageInfo + +func (m *CompressedNonExistenceProof) GetKey() []byte { + if m != nil { + return m.Key + } + return nil +} + +func (m *CompressedNonExistenceProof) GetLeft() *CompressedExistenceProof { + if m != nil { + return m.Left + } + return nil +} + +func (m *CompressedNonExistenceProof) GetRight() *CompressedExistenceProof { + if m != nil { + return m.Right + } + return nil +} + +func init() { + proto.RegisterEnum("ics23.HashOp", HashOp_name, HashOp_value) + proto.RegisterEnum("ics23.LengthOp", LengthOp_name, LengthOp_value) + proto.RegisterType((*ExistenceProof)(nil), "ics23.ExistenceProof") + proto.RegisterType((*NonExistenceProof)(nil), "ics23.NonExistenceProof") + proto.RegisterType((*CommitmentProof)(nil), "ics23.CommitmentProof") + proto.RegisterType((*LeafOp)(nil), "ics23.LeafOp") + proto.RegisterType((*InnerOp)(nil), "ics23.InnerOp") + proto.RegisterType((*ProofSpec)(nil), "ics23.ProofSpec") + proto.RegisterType((*InnerSpec)(nil), "ics23.InnerSpec") + proto.RegisterType((*BatchProof)(nil), "ics23.BatchProof") + proto.RegisterType((*BatchEntry)(nil), "ics23.BatchEntry") + proto.RegisterType((*CompressedBatchProof)(nil), "ics23.CompressedBatchProof") + proto.RegisterType((*CompressedBatchEntry)(nil), "ics23.CompressedBatchEntry") + proto.RegisterType((*CompressedExistenceProof)(nil), "ics23.CompressedExistenceProof") + proto.RegisterType((*CompressedNonExistenceProof)(nil), "ics23.CompressedNonExistenceProof") +} + +func init() { proto.RegisterFile("proofs.proto", fileDescriptor_855156e15e7b8e99) } + +var fileDescriptor_855156e15e7b8e99 = []byte{ + // 940 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0x4b, 0x6f, 0xe3, 0x54, + 0x14, 0xce, 0x4d, 0x62, 0x27, 0x39, 0x69, 0x53, 0xf7, 0xaa, 0x20, 0x4b, 0x15, 0x69, 0xf1, 0x86, + 0x4e, 0x47, 0x14, 0x26, 0x99, 0x06, 0xb1, 0x40, 0xa2, 0x49, 0x3d, 0xc4, 0x6a, 0x69, 0xc2, 0x4d, + 0x18, 0x0d, 0x12, 0x92, 0xe5, 0x49, 0x6f, 0x26, 0xd6, 0x24, 0xb6, 0x65, 0xbb, 0x28, 0x19, 0x81, + 0x90, 0xf8, 0x05, 0xac, 0x61, 0xc7, 0x96, 0x3f, 0xc2, 0xb2, 0x4b, 0x96, 0xa8, 0x5d, 0xb0, 0xe0, + 0x4f, 0xa0, 0xfb, 0x88, 0x9b, 0x27, 0xed, 0x02, 0xcd, 0xee, 0x9e, 0xef, 0x7c, 0xe7, 0x71, 0xcf, + 0xc3, 0xd7, 0xb0, 0x11, 0x84, 0xbe, 0xdf, 0x8f, 0x8e, 0x82, 0xd0, 0x8f, 0x7d, 0xac, 0xb8, 0xbd, + 0xa8, 0x52, 0x35, 0x7e, 0x84, 0x92, 0x39, 0x76, 0xa3, 0x98, 0x7a, 0x3d, 0xda, 0x66, 0x7a, 0xac, + 0x41, 0xe6, 0x35, 0x9d, 0xe8, 0x68, 0x1f, 0x1d, 0x6c, 0x10, 0x76, 0xc4, 0x3b, 0xa0, 0x7c, 0xe7, + 0x0c, 0xaf, 0xa8, 0x9e, 0xe6, 0x98, 0x10, 0xf0, 0xfb, 0x90, 0x1d, 0x52, 0xa7, 0xaf, 0x67, 0xf6, + 0xd1, 0x41, 0xb1, 0xb2, 0x79, 0xc4, 0xfd, 0x1d, 0x9d, 0x53, 0xa7, 0xdf, 0x0a, 0x08, 0x57, 0x61, + 0x03, 0xb2, 0x81, 0x13, 0x0f, 0xf4, 0xec, 0x7e, 0xe6, 0xa0, 0x58, 0x29, 0x49, 0x8a, 0xe5, 0x79, + 0x34, 0x64, 0x1c, 0xa6, 0x33, 0x7e, 0x80, 0xed, 0x0b, 0xdf, 0xbb, 0x37, 0x87, 0x47, 0x2c, 0x5a, + 0x3f, 0xe6, 0x29, 0x14, 0x2b, 0xef, 0x48, 0x57, 0xf3, 0x66, 0x84, 0x53, 0xf0, 0x63, 0x50, 0x42, + 0xf7, 0xd5, 0x20, 0x96, 0x99, 0xad, 0xe1, 0x0a, 0x8e, 0xf1, 0x0f, 0x82, 0xad, 0x86, 0x3f, 0x1a, + 0xb9, 0xf1, 0x88, 0x7a, 0xb1, 0x88, 0xfe, 0x21, 0x28, 0x94, 0x91, 0x79, 0xfc, 0x75, 0x0e, 0x9a, + 0x29, 0x22, 0x58, 0xb8, 0x06, 0x79, 0xcf, 0xf7, 0x84, 0x85, 0x48, 0x4f, 0x97, 0x16, 0x4b, 0x17, + 0x6b, 0xa6, 0x48, 0xc2, 0xc5, 0x8f, 0x40, 0x79, 0xe9, 0xc4, 0xbd, 0x81, 0xcc, 0x73, 0x5b, 0x1a, + 0xd5, 0x19, 0x96, 0x84, 0xe0, 0x0c, 0xfc, 0x19, 0x40, 0xcf, 0x1f, 0x05, 0x21, 0x8d, 0x22, 0x7a, + 0xa9, 0x67, 0x39, 0x7f, 0x57, 0xf2, 0x1b, 0x89, 0x62, 0xce, 0x72, 0xc6, 0xa0, 0x9e, 0x03, 0x85, + 0xf7, 0xde, 0xb8, 0x46, 0xa0, 0x8a, 0x0e, 0xb1, 0xf6, 0x0d, 0x9c, 0x68, 0xc0, 0xef, 0x58, 0x4a, + 0xda, 0xd7, 0x74, 0xa2, 0x01, 0x6b, 0x0d, 0x53, 0xe1, 0x23, 0x28, 0x06, 0x21, 0x65, 0x47, 0x9b, + 0x75, 0x23, 0xbd, 0x8a, 0x09, 0x92, 0x71, 0x46, 0x27, 0xb8, 0x02, 0x9b, 0x53, 0xbe, 0x98, 0x97, + 0xcc, 0x2a, 0x8b, 0x0d, 0xc9, 0x79, 0xce, 0xa7, 0xe8, 0x03, 0x50, 0x87, 0xd4, 0x7b, 0xc5, 0x87, + 0x84, 0x91, 0xb7, 0x92, 0x39, 0x62, 0x60, 0x2b, 0x20, 0x52, 0x8d, 0xdf, 0x05, 0x35, 0x08, 0x69, + 0xdf, 0x1d, 0xeb, 0x0a, 0x9f, 0x0a, 0x29, 0x19, 0xdf, 0x42, 0x4e, 0x0e, 0xd4, 0x43, 0xae, 0x74, + 0xe7, 0x25, 0x3d, 0xeb, 0x85, 0xe1, 0xd1, 0x55, 0x9f, 0xe1, 0x19, 0x81, 0x0b, 0xc9, 0xf8, 0x0d, + 0x41, 0x81, 0x57, 0xb4, 0x13, 0xd0, 0x1e, 0x3e, 0x84, 0x02, 0x9b, 0x6b, 0x3b, 0x0a, 0x68, 0x4f, + 0x0e, 0xc7, 0xc2, 0xdc, 0xe7, 0x99, 0x9e, 0x73, 0x3f, 0x02, 0x70, 0x59, 0x5e, 0x82, 0x2c, 0xe6, + 0x42, 0x9b, 0xdd, 0x00, 0xc6, 0x22, 0x05, 0x77, 0x7a, 0xc4, 0xbb, 0x50, 0x18, 0x39, 0x63, 0xfb, + 0x92, 0x06, 0xb1, 0x18, 0x09, 0x85, 0xe4, 0x47, 0xce, 0xf8, 0x94, 0xc9, 0x5c, 0xe9, 0x7a, 0x52, + 0x99, 0x95, 0x4a, 0xd7, 0xe3, 0x4a, 0xe3, 0x6f, 0x04, 0x85, 0xc4, 0x25, 0xde, 0x83, 0x62, 0x6f, + 0xe0, 0x0e, 0x2f, 0x6d, 0x3f, 0xbc, 0xa4, 0xa1, 0x8e, 0xf6, 0x33, 0x07, 0x0a, 0x01, 0x0e, 0xb5, + 0x18, 0x82, 0xdf, 0x03, 0x21, 0xd9, 0x91, 0xfb, 0x46, 0xec, 0xb4, 0x42, 0x0a, 0x1c, 0xe9, 0xb8, + 0x6f, 0x28, 0x3e, 0x84, 0x6d, 0x16, 0x4a, 0x14, 0xc6, 0x96, 0xcd, 0x11, 0xf9, 0x6c, 0x8d, 0x5c, + 0xaf, 0xcd, 0x71, 0xd1, 0x1e, 0xce, 0x75, 0xc6, 0x0b, 0xdc, 0xac, 0xe4, 0x3a, 0xe3, 0x39, 0xee, + 0x1e, 0x14, 0xe9, 0x28, 0x88, 0x27, 0x36, 0x0f, 0x25, 0xbb, 0x08, 0x1c, 0x6a, 0x30, 0x24, 0x69, + 0x9f, 0xba, 0xb6, 0x7d, 0xc6, 0xa7, 0x00, 0x77, 0x43, 0x8e, 0x1f, 0x43, 0x8e, 0x7a, 0x71, 0xe8, + 0xd2, 0x88, 0xdf, 0x72, 0x61, 0x85, 0x4c, 0x2f, 0x0e, 0x27, 0x64, 0xca, 0x30, 0xbe, 0x97, 0xa6, + 0x1c, 0x7e, 0x4b, 0x2b, 0x7e, 0xb7, 0x78, 0x3f, 0x21, 0xd8, 0x59, 0xb5, 0xa8, 0xf8, 0x78, 0xf1, + 0x0e, 0x6b, 0xd6, 0x7a, 0xfe, 0x36, 0xb8, 0x0a, 0x9b, 0x43, 0xdf, 0x7f, 0x7d, 0x15, 0xd8, 0x7c, + 0x80, 0x22, 0x3d, 0xbd, 0xf2, 0x13, 0xbb, 0x21, 0x48, 0x5c, 0x8c, 0x8c, 0x5f, 0x96, 0x93, 0x10, + 0xd5, 0xf8, 0x64, 0xbe, 0x1a, 0x7b, 0x4b, 0x29, 0xac, 0xab, 0xcb, 0xe7, 0x4b, 0x75, 0x31, 0x96, + 0x6c, 0x1f, 0x58, 0xa1, 0x09, 0xe8, 0xeb, 0xe2, 0xfd, 0x9f, 0x4f, 0x12, 0x9e, 0x79, 0x92, 0x14, + 0xf9, 0x04, 0xfd, 0x8a, 0x60, 0xf7, 0x3f, 0xf2, 0x5d, 0x11, 0xbe, 0x3a, 0xf7, 0x1a, 0xdd, 0x57, + 0x2f, 0xf9, 0x2e, 0x1d, 0xcf, 0xbf, 0x4b, 0xf7, 0x5a, 0x09, 0xf6, 0x21, 0x05, 0x55, 0xec, 0x00, + 0x2e, 0x42, 0xee, 0xa2, 0x65, 0x37, 0x4f, 0x3a, 0x4d, 0x2d, 0x85, 0x01, 0xd4, 0x4e, 0xf3, 0xa4, + 0x72, 0x5c, 0xd3, 0x90, 0x3c, 0x1f, 0x3f, 0xa9, 0x68, 0x69, 0x76, 0x3e, 0x33, 0x1b, 0x8d, 0x93, + 0x33, 0x2d, 0x83, 0x37, 0xa1, 0x40, 0xac, 0xb6, 0xf9, 0xe5, 0xe9, 0x93, 0xda, 0xc7, 0x5a, 0x96, + 0xd9, 0xd7, 0xad, 0x6e, 0xa3, 0x65, 0x5d, 0x68, 0x0a, 0x2e, 0x01, 0x08, 0x1b, 0x9b, 0xf9, 0x50, + 0x0f, 0x7f, 0x47, 0x90, 0x9f, 0x7e, 0x74, 0x99, 0xe1, 0x45, 0xcb, 0x6e, 0x13, 0xf3, 0x99, 0xf5, + 0x42, 0x4b, 0x31, 0xf1, 0xf9, 0x09, 0xb1, 0xdb, 0xa4, 0xd5, 0x6d, 0x69, 0x88, 0xf9, 0x61, 0x22, + 0x39, 0x6f, 0x6b, 0x69, 0xbc, 0x05, 0xc5, 0x67, 0xd6, 0x0b, 0xf3, 0xb4, 0x5a, 0xb1, 0xeb, 0xd6, + 0x17, 0x5a, 0x06, 0x63, 0x28, 0x4d, 0x81, 0x73, 0xab, 0xdb, 0x3d, 0x37, 0xb5, 0x6c, 0x42, 0xaa, + 0x3d, 0xe5, 0x24, 0x25, 0x21, 0xd5, 0x9e, 0x4e, 0x49, 0x2a, 0xde, 0x01, 0x8d, 0x98, 0x5f, 0x7d, + 0x6d, 0x11, 0xd3, 0x66, 0xce, 0xbe, 0xe9, 0x9a, 0x1d, 0x2d, 0x37, 0x8b, 0x32, 0x6b, 0x8e, 0xe6, + 0xeb, 0xfa, 0x1f, 0x37, 0x65, 0x74, 0x7d, 0x53, 0x46, 0x7f, 0xdd, 0x94, 0xd1, 0xcf, 0xb7, 0xe5, + 0xd4, 0xf5, 0x6d, 0x39, 0xf5, 0xe7, 0x6d, 0x39, 0xf5, 0x52, 0xe5, 0xbf, 0x37, 0xd5, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0xd4, 0x7d, 0x87, 0x8f, 0xee, 0x08, 0x00, 0x00, +} + +func (m *ExistenceProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ExistenceProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ExistenceProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Path) > 0 { + for iNdEx := len(m.Path) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Path[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if m.Leaf != nil { + { + size, err := m.Leaf.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NonExistenceProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NonExistenceProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NonExistenceProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Right != nil { + { + size, err := m.Right.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Left != nil { + { + size, err := m.Left.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CommitmentProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CommitmentProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitmentProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Proof != nil { + { + size := m.Proof.Size() + i -= size + if _, err := m.Proof.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *CommitmentProof_Exist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitmentProof_Exist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Exist != nil { + { + size, err := m.Exist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *CommitmentProof_Nonexist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitmentProof_Nonexist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Nonexist != nil { + { + size, err := m.Nonexist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *CommitmentProof_Batch) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitmentProof_Batch) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Batch != nil { + { + size, err := m.Batch.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *CommitmentProof_Compressed) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommitmentProof_Compressed) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Compressed != nil { + { + size, err := m.Compressed.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *LeafOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *LeafOp) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *LeafOp) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Prefix) > 0 { + i -= len(m.Prefix) + copy(dAtA[i:], m.Prefix) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Prefix))) + i-- + dAtA[i] = 0x2a + } + if m.Length != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.Length)) + i-- + dAtA[i] = 0x20 + } + if m.PrehashValue != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.PrehashValue)) + i-- + dAtA[i] = 0x18 + } + if m.PrehashKey != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.PrehashKey)) + i-- + dAtA[i] = 0x10 + } + if m.Hash != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.Hash)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *InnerOp) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InnerOp) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *InnerOp) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Suffix) > 0 { + i -= len(m.Suffix) + copy(dAtA[i:], m.Suffix) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Suffix))) + i-- + dAtA[i] = 0x1a + } + if len(m.Prefix) > 0 { + i -= len(m.Prefix) + copy(dAtA[i:], m.Prefix) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Prefix))) + i-- + dAtA[i] = 0x12 + } + if m.Hash != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.Hash)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ProofSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ProofSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ProofSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.MinDepth != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.MinDepth)) + i-- + dAtA[i] = 0x20 + } + if m.MaxDepth != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.MaxDepth)) + i-- + dAtA[i] = 0x18 + } + if m.InnerSpec != nil { + { + size, err := m.InnerSpec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.LeafSpec != nil { + { + size, err := m.LeafSpec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *InnerSpec) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InnerSpec) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *InnerSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Hash != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.Hash)) + i-- + dAtA[i] = 0x30 + } + if len(m.EmptyChild) > 0 { + i -= len(m.EmptyChild) + copy(dAtA[i:], m.EmptyChild) + i = encodeVarintProofs(dAtA, i, uint64(len(m.EmptyChild))) + i-- + dAtA[i] = 0x2a + } + if m.MaxPrefixLength != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.MaxPrefixLength)) + i-- + dAtA[i] = 0x20 + } + if m.MinPrefixLength != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.MinPrefixLength)) + i-- + dAtA[i] = 0x18 + } + if m.ChildSize != 0 { + i = encodeVarintProofs(dAtA, i, uint64(m.ChildSize)) + i-- + dAtA[i] = 0x10 + } + if len(m.ChildOrder) > 0 { + dAtA11 := make([]byte, len(m.ChildOrder)*10) + var j10 int + for _, num1 := range m.ChildOrder { + num := uint64(num1) + for num >= 1<<7 { + dAtA11[j10] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j10++ + } + dAtA11[j10] = uint8(num) + j10++ + } + i -= j10 + copy(dAtA[i:], dAtA11[:j10]) + i = encodeVarintProofs(dAtA, i, uint64(j10)) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *BatchProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BatchProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BatchProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Entries) > 0 { + for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *BatchEntry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BatchEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BatchEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Proof != nil { + { + size := m.Proof.Size() + i -= size + if _, err := m.Proof.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *BatchEntry_Exist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BatchEntry_Exist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Exist != nil { + { + size, err := m.Exist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *BatchEntry_Nonexist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BatchEntry_Nonexist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Nonexist != nil { + { + size, err := m.Nonexist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *CompressedBatchProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompressedBatchProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedBatchProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.LookupInners) > 0 { + for iNdEx := len(m.LookupInners) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.LookupInners[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Entries) > 0 { + for iNdEx := len(m.Entries) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Entries[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *CompressedBatchEntry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompressedBatchEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedBatchEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Proof != nil { + { + size := m.Proof.Size() + i -= size + if _, err := m.Proof.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *CompressedBatchEntry_Exist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedBatchEntry_Exist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Exist != nil { + { + size, err := m.Exist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} +func (m *CompressedBatchEntry_Nonexist) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedBatchEntry_Nonexist) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Nonexist != nil { + { + size, err := m.Nonexist.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + return len(dAtA) - i, nil +} +func (m *CompressedExistenceProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompressedExistenceProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedExistenceProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Path) > 0 { + dAtA17 := make([]byte, len(m.Path)*10) + var j16 int + for _, num1 := range m.Path { + num := uint64(num1) + for num >= 1<<7 { + dAtA17[j16] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j16++ + } + dAtA17[j16] = uint8(num) + j16++ + } + i -= j16 + copy(dAtA[i:], dAtA17[:j16]) + i = encodeVarintProofs(dAtA, i, uint64(j16)) + i-- + dAtA[i] = 0x22 + } + if m.Leaf != nil { + { + size, err := m.Leaf.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *CompressedNonExistenceProof) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *CompressedNonExistenceProof) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CompressedNonExistenceProof) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Right != nil { + { + size, err := m.Right.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Left != nil { + { + size, err := m.Left.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintProofs(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintProofs(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintProofs(dAtA []byte, offset int, v uint64) int { + offset -= sovProofs(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *ExistenceProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + if m.Leaf != nil { + l = m.Leaf.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if len(m.Path) > 0 { + for _, e := range m.Path { + l = e.Size() + n += 1 + l + sovProofs(uint64(l)) + } + } + return n +} + +func (m *NonExistenceProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + if m.Left != nil { + l = m.Left.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if m.Right != nil { + l = m.Right.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} + +func (m *CommitmentProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Proof != nil { + n += m.Proof.Size() + } + return n +} + +func (m *CommitmentProof_Exist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Exist != nil { + l = m.Exist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CommitmentProof_Nonexist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Nonexist != nil { + l = m.Nonexist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CommitmentProof_Batch) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Batch != nil { + l = m.Batch.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CommitmentProof_Compressed) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Compressed != nil { + l = m.Compressed.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *LeafOp) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Hash != 0 { + n += 1 + sovProofs(uint64(m.Hash)) + } + if m.PrehashKey != 0 { + n += 1 + sovProofs(uint64(m.PrehashKey)) + } + if m.PrehashValue != 0 { + n += 1 + sovProofs(uint64(m.PrehashValue)) + } + if m.Length != 0 { + n += 1 + sovProofs(uint64(m.Length)) + } + l = len(m.Prefix) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + return n +} + +func (m *InnerOp) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Hash != 0 { + n += 1 + sovProofs(uint64(m.Hash)) + } + l = len(m.Prefix) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + l = len(m.Suffix) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + return n +} + +func (m *ProofSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.LeafSpec != nil { + l = m.LeafSpec.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if m.InnerSpec != nil { + l = m.InnerSpec.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if m.MaxDepth != 0 { + n += 1 + sovProofs(uint64(m.MaxDepth)) + } + if m.MinDepth != 0 { + n += 1 + sovProofs(uint64(m.MinDepth)) + } + return n +} + +func (m *InnerSpec) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ChildOrder) > 0 { + l = 0 + for _, e := range m.ChildOrder { + l += sovProofs(uint64(e)) + } + n += 1 + sovProofs(uint64(l)) + l + } + if m.ChildSize != 0 { + n += 1 + sovProofs(uint64(m.ChildSize)) + } + if m.MinPrefixLength != 0 { + n += 1 + sovProofs(uint64(m.MinPrefixLength)) + } + if m.MaxPrefixLength != 0 { + n += 1 + sovProofs(uint64(m.MaxPrefixLength)) + } + l = len(m.EmptyChild) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + if m.Hash != 0 { + n += 1 + sovProofs(uint64(m.Hash)) + } + return n +} + +func (m *BatchProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovProofs(uint64(l)) + } + } + return n +} + +func (m *BatchEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Proof != nil { + n += m.Proof.Size() + } + return n +} + +func (m *BatchEntry_Exist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Exist != nil { + l = m.Exist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *BatchEntry_Nonexist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Nonexist != nil { + l = m.Nonexist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CompressedBatchProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Entries) > 0 { + for _, e := range m.Entries { + l = e.Size() + n += 1 + l + sovProofs(uint64(l)) + } + } + if len(m.LookupInners) > 0 { + for _, e := range m.LookupInners { + l = e.Size() + n += 1 + l + sovProofs(uint64(l)) + } + } + return n +} + +func (m *CompressedBatchEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Proof != nil { + n += m.Proof.Size() + } + return n +} + +func (m *CompressedBatchEntry_Exist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Exist != nil { + l = m.Exist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CompressedBatchEntry_Nonexist) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Nonexist != nil { + l = m.Nonexist.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} +func (m *CompressedExistenceProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + if m.Leaf != nil { + l = m.Leaf.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if len(m.Path) > 0 { + l = 0 + for _, e := range m.Path { + l += sovProofs(uint64(e)) + } + n += 1 + sovProofs(uint64(l)) + l + } + return n +} + +func (m *CompressedNonExistenceProof) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovProofs(uint64(l)) + } + if m.Left != nil { + l = m.Left.Size() + n += 1 + l + sovProofs(uint64(l)) + } + if m.Right != nil { + l = m.Right.Size() + n += 1 + l + sovProofs(uint64(l)) + } + return n +} + +func sovProofs(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozProofs(x uint64) (n int) { + return sovProofs(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *ExistenceProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ExistenceProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ExistenceProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Leaf", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Leaf == nil { + m.Leaf = &LeafOp{} + } + if err := m.Leaf.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = append(m.Path, &InnerOp{}) + if err := m.Path[len(m.Path)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NonExistenceProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NonExistenceProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NonExistenceProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Left", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Left == nil { + m.Left = &ExistenceProof{} + } + if err := m.Left.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Right", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Right == nil { + m.Right = &ExistenceProof{} + } + if err := m.Right.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CommitmentProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CommitmentProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CommitmentProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CommitmentProof_Exist{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonexist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &NonExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CommitmentProof_Nonexist{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Batch", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &BatchProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CommitmentProof_Batch{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Compressed", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CompressedBatchProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CommitmentProof_Compressed{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *LeafOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: LeafOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: LeafOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + m.Hash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Hash |= HashOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrehashKey", wireType) + } + m.PrehashKey = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PrehashKey |= HashOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PrehashValue", wireType) + } + m.PrehashValue = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PrehashValue |= HashOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Length", wireType) + } + m.Length = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Length |= LengthOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prefix = append(m.Prefix[:0], dAtA[iNdEx:postIndex]...) + if m.Prefix == nil { + m.Prefix = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InnerOp) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InnerOp: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InnerOp: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + m.Hash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Hash |= HashOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Prefix", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Prefix = append(m.Prefix[:0], dAtA[iNdEx:postIndex]...) + if m.Prefix == nil { + m.Prefix = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Suffix", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Suffix = append(m.Suffix[:0], dAtA[iNdEx:postIndex]...) + if m.Suffix == nil { + m.Suffix = []byte{} + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ProofSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ProofSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ProofSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LeafSpec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.LeafSpec == nil { + m.LeafSpec = &LeafOp{} + } + if err := m.LeafSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InnerSpec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.InnerSpec == nil { + m.InnerSpec = &InnerSpec{} + } + if err := m.InnerSpec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxDepth", wireType) + } + m.MaxDepth = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxDepth |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinDepth", wireType) + } + m.MinDepth = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinDepth |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InnerSpec) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: InnerSpec: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InnerSpec: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ChildOrder = append(m.ChildOrder, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.ChildOrder) == 0 { + m.ChildOrder = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ChildOrder = append(m.ChildOrder, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field ChildOrder", wireType) + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ChildSize", wireType) + } + m.ChildSize = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ChildSize |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MinPrefixLength", wireType) + } + m.MinPrefixLength = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MinPrefixLength |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field MaxPrefixLength", wireType) + } + m.MaxPrefixLength = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.MaxPrefixLength |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EmptyChild", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EmptyChild = append(m.EmptyChild[:0], dAtA[iNdEx:postIndex]...) + if m.EmptyChild == nil { + m.EmptyChild = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hash", wireType) + } + m.Hash = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Hash |= HashOp(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BatchProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BatchProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BatchProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, &BatchEntry{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *BatchEntry) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BatchEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BatchEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &ExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &BatchEntry_Exist{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonexist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &NonExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &BatchEntry_Nonexist{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompressedBatchProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompressedBatchProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompressedBatchProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Entries", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Entries = append(m.Entries, &CompressedBatchEntry{}) + if err := m.Entries[len(m.Entries)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LookupInners", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.LookupInners = append(m.LookupInners, &InnerOp{}) + if err := m.LookupInners[len(m.LookupInners)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompressedBatchEntry) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompressedBatchEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompressedBatchEntry: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Exist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CompressedExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CompressedBatchEntry_Exist{v} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonexist", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &CompressedNonExistenceProof{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Proof = &CompressedBatchEntry_Nonexist{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompressedExistenceProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompressedExistenceProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompressedExistenceProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = append(m.Value[:0], dAtA[iNdEx:postIndex]...) + if m.Value == nil { + m.Value = []byte{} + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Leaf", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Leaf == nil { + m.Leaf = &LeafOp{} + } + if err := m.Leaf.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType == 0 { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Path = append(m.Path, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var elementCount int + var count int + for _, integer := range dAtA[iNdEx:postIndex] { + if integer < 128 { + count++ + } + } + elementCount = count + if elementCount != 0 && len(m.Path) == 0 { + m.Path = make([]int32, 0, elementCount) + } + for iNdEx < postIndex { + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Path = append(m.Path, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) + } + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *CompressedNonExistenceProof) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: CompressedNonExistenceProof: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: CompressedNonExistenceProof: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Key = append(m.Key[:0], dAtA[iNdEx:postIndex]...) + if m.Key == nil { + m.Key = []byte{} + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Left", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Left == nil { + m.Left = &CompressedExistenceProof{} + } + if err := m.Left.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Right", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowProofs + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthProofs + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthProofs + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Right == nil { + m.Right = &CompressedExistenceProof{} + } + if err := m.Right.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipProofs(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthProofs + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipProofs(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProofs + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProofs + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowProofs + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthProofs + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupProofs + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthProofs + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthProofs = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowProofs = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupProofs = fmt.Errorf("proto: unexpected end of group") +) diff --git a/proto/cosmos/bank/v1beta1/query.proto b/proto/cosmos/bank/v1beta1/query.proto index 520ba0696412..6aaa0eb499ff 100644 --- a/proto/cosmos/bank/v1beta1/query.proto +++ b/proto/cosmos/bank/v1beta1/query.proto @@ -49,7 +49,7 @@ service Query { // QueryBalanceRequest is the request type for the Query/Balance RPC method. message QueryBalanceRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // address is the address to query balances for. @@ -67,7 +67,7 @@ message QueryBalanceResponse { // QueryBalanceRequest is the request type for the Query/AllBalances RPC method. message QueryAllBalancesRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // address is the address to query balances for. @@ -82,7 +82,7 @@ message QueryAllBalancesRequest { message QueryAllBalancesResponse { // balances is the balances of all the coins. repeated cosmos.base.v1beta1.Coin balances = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; // pagination defines the pagination in the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; @@ -91,7 +91,7 @@ message QueryAllBalancesResponse { // QueryTotalSupplyRequest is the request type for the Query/TotalSupply RPC // method. message QueryTotalSupplyRequest { - option (gogoproto.equal) = false; + option (gogoproto.equal) = false; option (gogoproto.goproto_getters) = false; // pagination defines an optional pagination for the request. @@ -105,7 +105,7 @@ message QueryTotalSupplyRequest { message QueryTotalSupplyResponse { // supply is the supply of the coins repeated cosmos.base.v1beta1.Coin supply = 1 - [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; + [(gogoproto.nullable) = false, (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins"]; // pagination defines the pagination in the response. // diff --git a/proto/cosmos/base/tendermint/v1beta1/query.proto b/proto/cosmos/base/tendermint/v1beta1/query.proto index 3c31877aa0ce..98542d23db16 100644 --- a/proto/cosmos/base/tendermint/v1beta1/query.proto +++ b/proto/cosmos/base/tendermint/v1beta1/query.proto @@ -116,15 +116,15 @@ message GetNodeInfoResponse { // VersionInfo is the type for the GetNodeInfoResponse message. message VersionInfo { - string name = 1; - string app_name = 2; - string version = 3; - string git_commit = 4; - string build_tags = 5; - string go_version = 6; - repeated Module build_deps = 7; + string name = 1; + string app_name = 2; + string version = 3; + string git_commit = 4; + string build_tags = 5; + string go_version = 6; + repeated Module build_deps = 7; // Since: cosmos-sdk 0.43 - string cosmos_sdk_version = 8; + string cosmos_sdk_version = 8; } // Module is the type for VersionInfo diff --git a/proto/cosmos/gov/v1beta1/gov.proto b/proto/cosmos/gov/v1beta1/gov.proto index 344b5ada19a5..01aebf950cf3 100644 --- a/proto/cosmos/gov/v1beta1/gov.proto +++ b/proto/cosmos/gov/v1beta1/gov.proto @@ -136,7 +136,7 @@ message Vote { // Deprecated: Prefer to use `options` instead. This field is set in queries // if and only if `len(options) == 1` and that option has weight 1. In all // other cases, this field will default to VOTE_OPTION_UNSPECIFIED. - VoteOption option = 3 [deprecated = true]; + VoteOption option = 3 [deprecated = true]; // Since: cosmos-sdk 0.43 repeated WeightedVoteOption options = 4 [(gogoproto.nullable) = false]; } diff --git a/proto/cosmos/staking/v1beta1/tx.proto b/proto/cosmos/staking/v1beta1/tx.proto index 7b05d89eea22..1ae182bb6c83 100644 --- a/proto/cosmos/staking/v1beta1/tx.proto +++ b/proto/cosmos/staking/v1beta1/tx.proto @@ -34,8 +34,7 @@ service Msg { // MsgCreateValidator defines a SDK message for creating a new validator. message MsgCreateValidator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; Description description = 1 [(gogoproto.nullable) = false]; CommissionRates commission = 2 [(gogoproto.nullable) = false]; @@ -55,8 +54,7 @@ message MsgCreateValidatorResponse {} // MsgEditValidator defines a SDK message for editing an existing validator. message MsgEditValidator { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; Description description = 1 [(gogoproto.nullable) = false]; string validator_address = 2 [(gogoproto.moretags) = "yaml:\"address\""]; @@ -81,8 +79,7 @@ message MsgEditValidatorResponse {} // MsgDelegate defines a SDK message for performing a delegation of coins // from a delegator to a validator. message MsgDelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; @@ -95,8 +92,7 @@ message MsgDelegateResponse {} // MsgBeginRedelegate defines a SDK message for performing a redelegation // of coins from a delegator and source validator to a destination validator. message MsgBeginRedelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; string validator_src_address = 2 [(gogoproto.moretags) = "yaml:\"validator_src_address\""]; @@ -112,8 +108,7 @@ message MsgBeginRedelegateResponse { // MsgUndelegate defines a SDK message for performing an undelegation from a // delegate and a validator. message MsgUndelegate { - option (gogoproto.equal) = false; - option (gogoproto.goproto_getters) = false; + option (gogoproto.equal) = false; string delegator_address = 1 [(gogoproto.moretags) = "yaml:\"delegator_address\""]; string validator_address = 2 [(gogoproto.moretags) = "yaml:\"validator_address\""]; diff --git a/x/bank/types/query.pb.go b/x/bank/types/query.pb.go index 2b9432192388..0b9ebea6cb6d 100644 --- a/x/bank/types/query.pb.go +++ b/x/bank/types/query.pb.go @@ -705,59 +705,59 @@ func init() { func init() { proto.RegisterFile("cosmos/bank/v1beta1/query.proto", fileDescriptor_9c6fc1939682df13) } var fileDescriptor_9c6fc1939682df13 = []byte{ - // 825 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x6f, 0xd3, 0x58, - 0x14, 0xcd, 0xeb, 0x4c, 0xd3, 0xf4, 0x46, 0x33, 0x8b, 0xd7, 0x8c, 0x26, 0x75, 0xa7, 0xc9, 0xc8, - 0x9d, 0x69, 0xd3, 0x92, 0xda, 0x4d, 0x8b, 0x54, 0xc1, 0x06, 0x35, 0x45, 0xb0, 0x40, 0xa8, 0x21, - 0xb0, 0x42, 0x42, 0xe8, 0x25, 0x31, 0x26, 0x6a, 0xe2, 0xe7, 0xe6, 0x39, 0x88, 0xaa, 0xaa, 0x84, - 0x90, 0x90, 0x58, 0x01, 0x12, 0x0b, 0x16, 0x6c, 0xca, 0x06, 0x09, 0x96, 0xfc, 0x8a, 0x2e, 0x58, - 0x54, 0x62, 0xc3, 0x0a, 0x50, 0xcb, 0x82, 0x9f, 0x81, 0xf2, 0x3e, 0x5c, 0x27, 0x71, 0x13, 0x2f, - 0xc2, 0x2a, 0xf6, 0xf5, 0xfd, 0x38, 0xe7, 0x3c, 0xdf, 0xe3, 0x40, 0xb6, 0x4a, 0x59, 0x93, 0x32, - 0xb3, 0x42, 0x9c, 0x6d, 0xf3, 0x41, 0xa1, 0x62, 0x79, 0xa4, 0x60, 0xee, 0xb4, 0xad, 0xd6, 0xae, - 0xe1, 0xb6, 0xa8, 0x47, 0xf1, 0x94, 0x48, 0x30, 0x3a, 0x09, 0x86, 0x4c, 0xd0, 0x96, 0xfc, 0x2a, - 0x66, 0x89, 0x6c, 0xbf, 0xd6, 0x25, 0x76, 0xdd, 0x21, 0x5e, 0x9d, 0x3a, 0xa2, 0x81, 0x96, 0xb2, - 0xa9, 0x4d, 0xf9, 0xa5, 0xd9, 0xb9, 0x92, 0xd1, 0x7f, 0x6c, 0x4a, 0xed, 0x86, 0x65, 0x12, 0xb7, - 0x6e, 0x12, 0xc7, 0xa1, 0x1e, 0x2f, 0x61, 0xf2, 0x69, 0x26, 0xd8, 0x5f, 0x75, 0xae, 0xd2, 0xba, - 0xd3, 0xf7, 0x3c, 0x80, 0x9a, 0x23, 0xe4, 0xcf, 0xf5, 0x2d, 0x98, 0xba, 0xd1, 0x41, 0x55, 0x24, - 0x0d, 0xe2, 0x54, 0xad, 0xb2, 0xb5, 0xd3, 0xb6, 0x98, 0x87, 0xd3, 0x30, 0x41, 0x6a, 0xb5, 0x96, - 0xc5, 0x58, 0x1a, 0xfd, 0x8b, 0x72, 0x93, 0x65, 0x75, 0x8b, 0x53, 0x30, 0x5e, 0xb3, 0x1c, 0xda, - 0x4c, 0x8f, 0xf1, 0xb8, 0xb8, 0xb9, 0x98, 0x78, 0x7a, 0x90, 0x8d, 0xfd, 0x38, 0xc8, 0xc6, 0xf4, - 0x6b, 0x90, 0xea, 0x6e, 0xc8, 0x5c, 0xea, 0x30, 0x0b, 0xaf, 0xc1, 0x44, 0x45, 0x84, 0x78, 0xc7, - 0xe4, 0xea, 0xb4, 0xe1, 0xeb, 0xc5, 0x2c, 0xa5, 0x97, 0xb1, 0x49, 0xeb, 0x4e, 0x59, 0x65, 0xea, - 0x4f, 0x10, 0xfc, 0xcd, 0xbb, 0x6d, 0x34, 0x1a, 0xb2, 0x21, 0x1b, 0x0e, 0xf1, 0x0a, 0xc0, 0xa9, - 0xb6, 0x1c, 0x67, 0x72, 0x75, 0xbe, 0x6b, 0x9a, 0x38, 0x36, 0x35, 0xb3, 0x44, 0x6c, 0x45, 0xbc, - 0x1c, 0xa8, 0x0c, 0x90, 0xfa, 0x88, 0x20, 0xdd, 0x8f, 0x43, 0x32, 0xb3, 0x21, 0x21, 0xf1, 0x76, - 0x90, 0xfc, 0x36, 0x90, 0x5a, 0x71, 0xe5, 0xf0, 0x4b, 0x36, 0xf6, 0xfe, 0x6b, 0x36, 0x67, 0xd7, - 0xbd, 0xfb, 0xed, 0x8a, 0x51, 0xa5, 0x4d, 0x53, 0x1e, 0x91, 0xf8, 0x59, 0x66, 0xb5, 0x6d, 0xd3, - 0xdb, 0x75, 0x2d, 0xc6, 0x0b, 0x58, 0xd9, 0x6f, 0x8e, 0xaf, 0x86, 0xf0, 0x5a, 0x18, 0xca, 0x4b, - 0xa0, 0x0c, 0x12, 0xd3, 0xb7, 0xa5, 0xaa, 0xb7, 0xa8, 0x47, 0x1a, 0x37, 0xdb, 0xae, 0xdb, 0xd8, - 0x55, 0xaa, 0x76, 0x6b, 0x87, 0x46, 0xa0, 0xdd, 0xa1, 0xd2, 0xae, 0x6b, 0x9a, 0xd4, 0xae, 0x0a, - 0x71, 0xc6, 0x23, 0xbf, 0x42, 0x39, 0xd9, 0x7a, 0x74, 0xba, 0xe5, 0xe5, 0xbb, 0x2d, 0x48, 0x6c, - 0xdd, 0x53, 0xa2, 0xf9, 0x3b, 0x81, 0x02, 0x3b, 0xa1, 0x97, 0xe0, 0xaf, 0x9e, 0x6c, 0x49, 0x7a, - 0x1d, 0xe2, 0xa4, 0x49, 0xdb, 0x8e, 0x37, 0x74, 0x13, 0x8a, 0xbf, 0x77, 0x48, 0x97, 0x65, 0xba, - 0x9e, 0x02, 0xcc, 0x3b, 0x96, 0x48, 0x8b, 0x34, 0xd5, 0x22, 0xe8, 0x25, 0xb9, 0xc2, 0x2a, 0x2a, - 0xa7, 0x5c, 0x80, 0xb8, 0xcb, 0x23, 0x72, 0xca, 0x8c, 0x11, 0xe2, 0x4f, 0x86, 0x28, 0x52, 0x73, - 0x44, 0x81, 0x5e, 0x03, 0x8d, 0x77, 0xbc, 0xdc, 0xe1, 0xc1, 0xae, 0x5b, 0x1e, 0xa9, 0x11, 0x8f, - 0x8c, 0xf8, 0x15, 0xd1, 0xdf, 0x21, 0x98, 0x09, 0x1d, 0x23, 0x09, 0x6c, 0xc0, 0x64, 0x53, 0xc6, - 0xd4, 0x62, 0xcd, 0x86, 0x72, 0x50, 0x95, 0x92, 0xc5, 0x69, 0xd5, 0xe8, 0x4e, 0xbe, 0x00, 0xd3, - 0xa7, 0x50, 0x7b, 0x05, 0x09, 0x3f, 0xfe, 0x3b, 0x41, 0x11, 0xfb, 0xc8, 0x5d, 0x82, 0x84, 0x82, - 0x29, 0x25, 0x8c, 0xc4, 0xcd, 0x2f, 0x5a, 0xfd, 0x90, 0x80, 0x71, 0xde, 0x1f, 0xbf, 0x42, 0x30, - 0x21, 0x4d, 0x09, 0xe7, 0x42, 0x9b, 0x84, 0x38, 0xbc, 0xb6, 0x18, 0x21, 0x53, 0x60, 0xd5, 0xd7, - 0x1f, 0x7f, 0xfa, 0xfe, 0x72, 0xac, 0x80, 0x4d, 0x33, 0xfc, 0x63, 0x22, 0xec, 0xc9, 0xdc, 0x93, - 0xfe, 0xbb, 0x6f, 0xee, 0x71, 0x05, 0xf6, 0xf1, 0x6b, 0x04, 0xc9, 0x80, 0x63, 0xe2, 0xfc, 0xd9, - 0x33, 0xfb, 0x0d, 0x5e, 0x5b, 0x8e, 0x98, 0x2d, 0x51, 0x9a, 0x1c, 0xe5, 0x22, 0x5e, 0x88, 0x88, - 0x12, 0x3f, 0x47, 0x90, 0x0c, 0x78, 0xd2, 0x20, 0x74, 0xfd, 0x46, 0x39, 0x08, 0x5d, 0x88, 0xd1, - 0xe9, 0x73, 0x1c, 0xdd, 0x2c, 0x9e, 0x09, 0x45, 0x27, 0x8d, 0xea, 0x19, 0x82, 0x84, 0x72, 0x0b, - 0x3c, 0xe0, 0x80, 0x7a, 0xfc, 0x47, 0x5b, 0x8a, 0x92, 0x2a, 0x81, 0x9c, 0xe3, 0x40, 0xfe, 0xc7, - 0x73, 0x03, 0x80, 0xf8, 0x07, 0xf8, 0x08, 0x41, 0x5c, 0x38, 0x04, 0x5e, 0x38, 0x7b, 0x46, 0x97, - 0x1d, 0x69, 0xb9, 0xe1, 0x89, 0x91, 0x34, 0x11, 0x5e, 0x84, 0xdf, 0x22, 0xf8, 0xa3, 0x6b, 0x85, - 0xb0, 0x71, 0xf6, 0x80, 0xb0, 0xf5, 0xd4, 0xcc, 0xc8, 0xf9, 0x12, 0xd7, 0x79, 0x8e, 0xcb, 0xc0, - 0xf9, 0x50, 0x5c, 0x5c, 0x1a, 0x76, 0x57, 0x2d, 0xa2, 0xaf, 0xd5, 0x1b, 0x04, 0x7f, 0x76, 0x3b, - 0x19, 0x1e, 0x36, 0xb9, 0xd7, 0x5a, 0xb5, 0x95, 0xe8, 0x05, 0x12, 0x6b, 0x9e, 0x63, 0x9d, 0xc7, - 0xff, 0x45, 0xc1, 0x5a, 0xdc, 0x3c, 0x3c, 0xce, 0xa0, 0xa3, 0xe3, 0x0c, 0xfa, 0x76, 0x9c, 0x41, - 0x2f, 0x4e, 0x32, 0xb1, 0xa3, 0x93, 0x4c, 0xec, 0xf3, 0x49, 0x26, 0x76, 0x7b, 0x71, 0xe0, 0x57, - 0xf5, 0xa1, 0x68, 0xcb, 0x3f, 0xae, 0x95, 0x38, 0xff, 0xe7, 0xb8, 0xf6, 0x33, 0x00, 0x00, 0xff, - 0xff, 0xa0, 0xfe, 0xe2, 0x92, 0x11, 0x0b, 0x00, 0x00, + // 829 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x56, 0x4d, 0x6b, 0x13, 0x5b, + 0x18, 0xce, 0xe9, 0xbd, 0x4d, 0xd3, 0x37, 0xdc, 0xbb, 0x38, 0xcd, 0xe5, 0xa6, 0xd3, 0xdb, 0xe4, + 0x32, 0xd5, 0x36, 0xad, 0xe9, 0x4c, 0x9b, 0x0a, 0x7e, 0x6c, 0xa4, 0xa9, 0xe8, 0x42, 0xa4, 0x31, + 0xba, 0x12, 0xa4, 0x9c, 0x24, 0xe3, 0x18, 0x9a, 0xcc, 0x99, 0xe6, 0x4c, 0xc4, 0x50, 0x0a, 0x22, + 0x08, 0xae, 0x54, 0x70, 0x23, 0xb8, 0xa9, 0x1b, 0x41, 0xb7, 0xfe, 0x89, 0x2e, 0x5c, 0x14, 0xdc, + 0xb8, 0x52, 0x69, 0x5d, 0xf8, 0x33, 0x24, 0xe7, 0x23, 0x9d, 0x24, 0xd3, 0x64, 0x16, 0x71, 0x95, + 0x99, 0x77, 0xde, 0x8f, 0xe7, 0x79, 0xce, 0xbc, 0xcf, 0x04, 0xd2, 0x65, 0xca, 0xea, 0x94, 0x99, + 0x25, 0xe2, 0x6c, 0x9b, 0x0f, 0x57, 0x4b, 0x96, 0x47, 0x56, 0xcd, 0x9d, 0xa6, 0xd5, 0x68, 0x19, + 0x6e, 0x83, 0x7a, 0x14, 0x4f, 0x89, 0x04, 0xa3, 0x9d, 0x60, 0xc8, 0x04, 0x6d, 0xa9, 0x53, 0xc5, + 0x2c, 0x91, 0xdd, 0xa9, 0x75, 0x89, 0x5d, 0x75, 0x88, 0x57, 0xa5, 0x8e, 0x68, 0xa0, 0x25, 0x6c, + 0x6a, 0x53, 0x7e, 0x69, 0xb6, 0xaf, 0x64, 0xf4, 0x3f, 0x9b, 0x52, 0xbb, 0x66, 0x99, 0xc4, 0xad, + 0x9a, 0xc4, 0x71, 0xa8, 0xc7, 0x4b, 0x98, 0x7c, 0x9a, 0xf2, 0xf7, 0x57, 0x9d, 0xcb, 0xb4, 0xea, + 0xf4, 0x3d, 0xf7, 0xa1, 0xe6, 0x08, 0xf9, 0x73, 0x7d, 0x13, 0xa6, 0x6e, 0xb5, 0x51, 0xe5, 0x49, + 0x8d, 0x38, 0x65, 0xab, 0x68, 0xed, 0x34, 0x2d, 0xe6, 0xe1, 0x24, 0x4c, 0x90, 0x4a, 0xa5, 0x61, + 0x31, 0x96, 0x44, 0xff, 0xa3, 0xcc, 0x64, 0x51, 0xdd, 0xe2, 0x04, 0x8c, 0x57, 0x2c, 0x87, 0xd6, + 0x93, 0x63, 0x3c, 0x2e, 0x6e, 0x2e, 0xc7, 0x9e, 0xed, 0xa7, 0x23, 0x3f, 0xf7, 0xd3, 0x11, 0xfd, + 0x06, 0x24, 0xba, 0x1b, 0x32, 0x97, 0x3a, 0xcc, 0xc2, 0x6b, 0x30, 0x51, 0x12, 0x21, 0xde, 0x31, + 0x9e, 0x9b, 0x36, 0x3a, 0x7a, 0x31, 0x4b, 0xe9, 0x65, 0x6c, 0xd0, 0xaa, 0x53, 0x54, 0x99, 0xfa, + 0x53, 0x04, 0xff, 0xf2, 0x6e, 0xeb, 0xb5, 0x9a, 0x6c, 0xc8, 0x86, 0x43, 0xbc, 0x06, 0x70, 0xa2, + 0x2d, 0xc7, 0x19, 0xcf, 0xcd, 0x77, 0x4d, 0x13, 0xc7, 0xa6, 0x66, 0x16, 0x88, 0xad, 0x88, 0x17, + 0x7d, 0x95, 0x3e, 0x52, 0x9f, 0x10, 0x24, 0xfb, 0x71, 0x48, 0x66, 0x36, 0xc4, 0x24, 0xde, 0x36, + 0x92, 0x3f, 0x06, 0x52, 0xcb, 0xaf, 0x1c, 0x7c, 0x4d, 0x47, 0x3e, 0x7c, 0x4b, 0x67, 0xec, 0xaa, + 0xf7, 0xa0, 0x59, 0x32, 0xca, 0xb4, 0x6e, 0xca, 0x23, 0x12, 0x3f, 0xcb, 0xac, 0xb2, 0x6d, 0x7a, + 0x2d, 0xd7, 0x62, 0xbc, 0x80, 0x15, 0x3b, 0xcd, 0xf1, 0xf5, 0x00, 0x5e, 0x0b, 0x43, 0x79, 0x09, + 0x94, 0x7e, 0x62, 0xfa, 0xb6, 0x54, 0xf5, 0x0e, 0xf5, 0x48, 0xed, 0x76, 0xd3, 0x75, 0x6b, 0x2d, + 0xa5, 0x6a, 0xb7, 0x76, 0x68, 0x04, 0xda, 0x1d, 0x28, 0xed, 0xba, 0xa6, 0x49, 0xed, 0xca, 0x10, + 0x65, 0x3c, 0xf2, 0x3b, 0x94, 0x93, 0xad, 0x47, 0xa7, 0x5b, 0x56, 0xbe, 0xdb, 0x82, 0xc4, 0xe6, + 0x7d, 0x25, 0x5a, 0x67, 0x27, 0x90, 0x6f, 0x27, 0xf4, 0x02, 0xfc, 0xd3, 0x93, 0x2d, 0x49, 0x5f, + 0x80, 0x28, 0xa9, 0xd3, 0xa6, 0xe3, 0x0d, 0xdd, 0x84, 0xfc, 0x9f, 0x6d, 0xd2, 0x45, 0x99, 0xae, + 0x27, 0x00, 0xf3, 0x8e, 0x05, 0xd2, 0x20, 0x75, 0xb5, 0x08, 0x7a, 0x41, 0xae, 0xb0, 0x8a, 0xca, + 0x29, 0x97, 0x20, 0xea, 0xf2, 0x88, 0x9c, 0x32, 0x63, 0x04, 0xf8, 0x93, 0x21, 0x8a, 0xd4, 0x1c, + 0x51, 0xa0, 0x57, 0x40, 0xe3, 0x1d, 0xaf, 0xb6, 0x79, 0xb0, 0x9b, 0x96, 0x47, 0x2a, 0xc4, 0x23, + 0x23, 0x7e, 0x45, 0xf4, 0xf7, 0x08, 0x66, 0x02, 0xc7, 0x48, 0x02, 0xeb, 0x30, 0x59, 0x97, 0x31, + 0xb5, 0x58, 0xb3, 0x81, 0x1c, 0x54, 0xa5, 0x64, 0x71, 0x52, 0x35, 0xba, 0x93, 0x5f, 0x85, 0xe9, + 0x13, 0xa8, 0xbd, 0x82, 0x04, 0x1f, 0xff, 0x3d, 0xbf, 0x88, 0x7d, 0xe4, 0xae, 0x40, 0x4c, 0xc1, + 0x94, 0x12, 0x86, 0xe2, 0xd6, 0x29, 0xca, 0x7d, 0x8c, 0xc1, 0x38, 0xef, 0x8f, 0x5f, 0x23, 0x98, + 0x90, 0xa6, 0x84, 0x33, 0x81, 0x4d, 0x02, 0x1c, 0x5e, 0x5b, 0x0c, 0x91, 0x29, 0xb0, 0xea, 0x17, + 0x9f, 0x7c, 0xfe, 0xf1, 0x6a, 0x2c, 0x87, 0x57, 0xcc, 0xe0, 0x8f, 0x89, 0xb0, 0x27, 0x73, 0x57, + 0xfa, 0xef, 0x9e, 0x59, 0x6a, 0x6d, 0x71, 0x0d, 0xf0, 0x1b, 0x04, 0x71, 0x9f, 0x65, 0xe2, 0xec, + 0xe9, 0x43, 0xfb, 0x1d, 0x5e, 0x5b, 0x0e, 0x99, 0x2d, 0x61, 0x9a, 0x1c, 0xe6, 0x22, 0x5e, 0x08, + 0x09, 0x13, 0xbf, 0x40, 0x10, 0xf7, 0x99, 0xd2, 0x20, 0x74, 0xfd, 0x4e, 0x39, 0x08, 0x5d, 0x80, + 0xd3, 0xe9, 0x73, 0x1c, 0xdd, 0x2c, 0x9e, 0x09, 0x44, 0x27, 0x9d, 0xea, 0x39, 0x82, 0x98, 0xb2, + 0x0b, 0x3c, 0xe0, 0x84, 0x7a, 0x0c, 0x48, 0x5b, 0x0a, 0x93, 0x2a, 0x81, 0x9c, 0xe3, 0x40, 0xce, + 0xe2, 0xb9, 0x01, 0x40, 0xcc, 0x5d, 0x7e, 0x7e, 0x7b, 0xf8, 0x31, 0x82, 0xa8, 0xb0, 0x08, 0xbc, + 0x70, 0xfa, 0x8c, 0x2e, 0x3f, 0xd2, 0x32, 0xc3, 0x13, 0x43, 0x69, 0x22, 0xcc, 0x08, 0xbf, 0x43, + 0xf0, 0x57, 0xd7, 0x0e, 0x61, 0xe3, 0xf4, 0x01, 0x41, 0xfb, 0xa9, 0x99, 0xa1, 0xf3, 0x25, 0xae, + 0xf3, 0x1c, 0x97, 0x81, 0xb3, 0x81, 0xb8, 0xb8, 0x34, 0x6c, 0x4b, 0x6d, 0x62, 0x47, 0xab, 0xb7, + 0x08, 0xfe, 0xee, 0xb6, 0x32, 0x3c, 0x6c, 0x72, 0xaf, 0xb7, 0x6a, 0x2b, 0xe1, 0x0b, 0x24, 0xd6, + 0x2c, 0xc7, 0x3a, 0x8f, 0xcf, 0x84, 0xc1, 0x9a, 0xdf, 0x38, 0x38, 0x4a, 0xa1, 0xc3, 0xa3, 0x14, + 0xfa, 0x7e, 0x94, 0x42, 0x2f, 0x8f, 0x53, 0x91, 0xc3, 0xe3, 0x54, 0xe4, 0xcb, 0x71, 0x2a, 0x72, + 0x77, 0x71, 0xe0, 0x67, 0xf5, 0x91, 0x68, 0xcb, 0xbf, 0xae, 0xa5, 0x28, 0xff, 0xeb, 0xb8, 0xf6, + 0x2b, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x6f, 0x29, 0xd7, 0x12, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 618599edba36..d9794d818f76 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1261,621 +1261,621 @@ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descri d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ // 9834 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x5c, 0xd7, - 0x75, 0x18, 0xde, 0x7e, 0x00, 0xbb, 0x07, 0x0b, 0x60, 0x71, 0x01, 0x92, 0xcb, 0x25, 0x09, 0x40, - 0x4f, 0x5f, 0x14, 0x25, 0x81, 0x12, 0x25, 0x52, 0xd2, 0x32, 0xb6, 0xbc, 0x8b, 0x5d, 0x82, 0x10, - 0xf1, 0xa5, 0x07, 0x80, 0x92, 0x65, 0xa7, 0x3b, 0x0f, 0xbb, 0x17, 0x8b, 0x27, 0xec, 0xbe, 0xf7, - 0xf4, 0xde, 0x5b, 0x12, 0xa0, 0xed, 0x8e, 0xfc, 0x51, 0xd7, 0x66, 0x26, 0x8d, 0x5d, 0x77, 0x1a, - 0x5b, 0x36, 0x5d, 0x39, 0x4e, 0xeb, 0xd4, 0x71, 0x1b, 0x3b, 0x76, 0xdd, 0xa6, 0xed, 0x4c, 0xed, - 0xce, 0xa4, 0xb1, 0xdd, 0x26, 0x63, 0xb7, 0x99, 0x36, 0xcd, 0xa4, 0x74, 0x2a, 0x7b, 0x52, 0xd5, - 0x75, 0x1b, 0x87, 0x71, 0xdb, 0x74, 0x3c, 0x9d, 0x76, 0xee, 0xd7, 0xfb, 0xda, 0x4f, 0x40, 0xa4, - 0xed, 0x34, 0xfd, 0x85, 0xbd, 0xe7, 0x9e, 0x73, 0xee, 0x39, 0xe7, 0x9e, 0x7b, 0xee, 0xb9, 0x5f, - 0x0f, 0xf0, 0x85, 0xf3, 0x30, 0x53, 0x33, 0x8c, 0x5a, 0x1d, 0x9f, 0x36, 0x2d, 0xc3, 0x31, 0x36, - 0x9b, 0x5b, 0xa7, 0xab, 0xd8, 0xae, 0x58, 0x9a, 0xe9, 0x18, 0xd6, 0x2c, 0x85, 0xa1, 0x31, 0x86, - 0x31, 0x2b, 0x30, 0xe4, 0x25, 0x18, 0xbf, 0xa0, 0xd5, 0x71, 0xd1, 0x45, 0x5c, 0xc3, 0x0e, 0x7a, - 0x12, 0x62, 0x5b, 0x5a, 0x1d, 0x67, 0xa4, 0x99, 0xe8, 0xc9, 0xe1, 0x33, 0xf7, 0xcc, 0x86, 0x88, - 0x66, 0x83, 0x14, 0xab, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0xbb, 0x31, 0x98, 0x68, 0x53, 0x8b, 0x10, - 0xc4, 0x74, 0xb5, 0x41, 0x38, 0x4a, 0x27, 0x93, 0x0a, 0xfd, 0x8d, 0x32, 0x30, 0x64, 0xaa, 0x95, - 0x1d, 0xb5, 0x86, 0x33, 0x11, 0x0a, 0x16, 0x45, 0x34, 0x05, 0x50, 0xc5, 0x26, 0xd6, 0xab, 0x58, - 0xaf, 0xec, 0x65, 0xa2, 0x33, 0xd1, 0x93, 0x49, 0xc5, 0x07, 0x41, 0x0f, 0xc2, 0xb8, 0xd9, 0xdc, - 0xac, 0x6b, 0x95, 0xb2, 0x0f, 0x0d, 0x66, 0xa2, 0x27, 0xe3, 0x4a, 0x9a, 0x55, 0x14, 0x3d, 0xe4, - 0xfb, 0x61, 0xec, 0x2a, 0x56, 0x77, 0xfc, 0xa8, 0xc3, 0x14, 0x75, 0x94, 0x80, 0x7d, 0x88, 0x73, - 0x90, 0x6a, 0x60, 0xdb, 0x56, 0x6b, 0xb8, 0xec, 0xec, 0x99, 0x38, 0x13, 0xa3, 0xda, 0xcf, 0xb4, - 0x68, 0x1f, 0xd6, 0x7c, 0x98, 0x53, 0xad, 0xef, 0x99, 0x18, 0xe5, 0x21, 0x89, 0xf5, 0x66, 0x83, - 0x71, 0x88, 0x77, 0xb0, 0x5f, 0x49, 0x6f, 0x36, 0xc2, 0x5c, 0x12, 0x84, 0x8c, 0xb3, 0x18, 0xb2, - 0xb1, 0x75, 0x45, 0xab, 0xe0, 0xcc, 0x20, 0x65, 0x70, 0x7f, 0x0b, 0x83, 0x35, 0x56, 0x1f, 0xe6, - 0x21, 0xe8, 0xd0, 0x1c, 0x24, 0xf1, 0xae, 0x83, 0x75, 0x5b, 0x33, 0xf4, 0xcc, 0x10, 0x65, 0x72, - 0x6f, 0x9b, 0x5e, 0xc4, 0xf5, 0x6a, 0x98, 0x85, 0x47, 0x87, 0xce, 0xc1, 0x90, 0x61, 0x3a, 0x9a, - 0xa1, 0xdb, 0x99, 0xc4, 0x8c, 0x74, 0x72, 0xf8, 0xcc, 0xf1, 0xb6, 0x8e, 0xb0, 0xc2, 0x70, 0x14, - 0x81, 0x8c, 0x16, 0x20, 0x6d, 0x1b, 0x4d, 0xab, 0x82, 0xcb, 0x15, 0xa3, 0x8a, 0xcb, 0x9a, 0xbe, - 0x65, 0x64, 0x92, 0x94, 0xc1, 0x74, 0xab, 0x22, 0x14, 0x71, 0xce, 0xa8, 0xe2, 0x05, 0x7d, 0xcb, - 0x50, 0x46, 0xed, 0x40, 0x19, 0x1d, 0x86, 0x41, 0x7b, 0x4f, 0x77, 0xd4, 0xdd, 0x4c, 0x8a, 0x7a, - 0x08, 0x2f, 0xc9, 0xbf, 0x31, 0x08, 0x63, 0xfd, 0xb8, 0xd8, 0x79, 0x88, 0x6f, 0x11, 0x2d, 0x33, - 0x91, 0xfd, 0xd8, 0x80, 0xd1, 0x04, 0x8d, 0x38, 0x78, 0x40, 0x23, 0xe6, 0x61, 0x58, 0xc7, 0xb6, - 0x83, 0xab, 0xcc, 0x23, 0xa2, 0x7d, 0xfa, 0x14, 0x30, 0xa2, 0x56, 0x97, 0x8a, 0x1d, 0xc8, 0xa5, - 0x9e, 0x87, 0x31, 0x57, 0xa4, 0xb2, 0xa5, 0xea, 0x35, 0xe1, 0x9b, 0xa7, 0x7b, 0x49, 0x32, 0x5b, - 0x12, 0x74, 0x0a, 0x21, 0x53, 0x46, 0x71, 0xa0, 0x8c, 0x8a, 0x00, 0x86, 0x8e, 0x8d, 0xad, 0x72, - 0x15, 0x57, 0xea, 0x99, 0x44, 0x07, 0x2b, 0xad, 0x10, 0x94, 0x16, 0x2b, 0x19, 0x0c, 0x5a, 0xa9, - 0xa3, 0xa7, 0x3c, 0x57, 0x1b, 0xea, 0xe0, 0x29, 0x4b, 0x6c, 0x90, 0xb5, 0x78, 0xdb, 0x06, 0x8c, - 0x5a, 0x98, 0xf8, 0x3d, 0xae, 0x72, 0xcd, 0x92, 0x54, 0x88, 0xd9, 0x9e, 0x9a, 0x29, 0x9c, 0x8c, - 0x29, 0x36, 0x62, 0xf9, 0x8b, 0xe8, 0x6e, 0x70, 0x01, 0x65, 0xea, 0x56, 0x40, 0xa3, 0x50, 0x4a, - 0x00, 0x97, 0xd5, 0x06, 0xce, 0x5e, 0x83, 0xd1, 0xa0, 0x79, 0xd0, 0x24, 0xc4, 0x6d, 0x47, 0xb5, - 0x1c, 0xea, 0x85, 0x71, 0x85, 0x15, 0x50, 0x1a, 0xa2, 0x58, 0xaf, 0xd2, 0x28, 0x17, 0x57, 0xc8, - 0x4f, 0xf4, 0x16, 0x4f, 0xe1, 0x28, 0x55, 0xf8, 0xbe, 0xd6, 0x1e, 0x0d, 0x70, 0x0e, 0xeb, 0x9d, - 0x7d, 0x02, 0x46, 0x02, 0x0a, 0xf4, 0xdb, 0xb4, 0xfc, 0x4e, 0x38, 0xd4, 0x96, 0x35, 0x7a, 0x1e, - 0x26, 0x9b, 0xba, 0xa6, 0x3b, 0xd8, 0x32, 0x2d, 0x4c, 0x3c, 0x96, 0x35, 0x95, 0xf9, 0x4f, 0x43, - 0x1d, 0x7c, 0x6e, 0xc3, 0x8f, 0xcd, 0xb8, 0x28, 0x13, 0xcd, 0x56, 0xe0, 0xa9, 0x64, 0xe2, 0xf5, - 0xa1, 0xf4, 0xcb, 0x2f, 0xbf, 0xfc, 0x72, 0x44, 0xfe, 0xea, 0x20, 0x4c, 0xb6, 0x1b, 0x33, 0x6d, - 0x87, 0xef, 0x61, 0x18, 0xd4, 0x9b, 0x8d, 0x4d, 0x6c, 0x51, 0x23, 0xc5, 0x15, 0x5e, 0x42, 0x79, - 0x88, 0xd7, 0xd5, 0x4d, 0x5c, 0xcf, 0xc4, 0x66, 0xa4, 0x93, 0xa3, 0x67, 0x1e, 0xec, 0x6b, 0x54, - 0xce, 0x2e, 0x12, 0x12, 0x85, 0x51, 0xa2, 0x37, 0x43, 0x8c, 0x87, 0x68, 0xc2, 0xe1, 0x54, 0x7f, - 0x1c, 0xc8, 0x58, 0x52, 0x28, 0x1d, 0x3a, 0x06, 0x49, 0xf2, 0x97, 0xf9, 0xc6, 0x20, 0x95, 0x39, - 0x41, 0x00, 0xc4, 0x2f, 0x50, 0x16, 0x12, 0x74, 0x98, 0x54, 0xb1, 0x98, 0xda, 0xdc, 0x32, 0x71, - 0xac, 0x2a, 0xde, 0x52, 0x9b, 0x75, 0xa7, 0x7c, 0x45, 0xad, 0x37, 0x31, 0x75, 0xf8, 0xa4, 0x92, - 0xe2, 0xc0, 0xcb, 0x04, 0x86, 0xa6, 0x61, 0x98, 0x8d, 0x2a, 0x4d, 0xaf, 0xe2, 0x5d, 0x1a, 0x3d, - 0xe3, 0x0a, 0x1b, 0x68, 0x0b, 0x04, 0x42, 0x9a, 0x7f, 0xd1, 0x36, 0x74, 0xe1, 0x9a, 0xb4, 0x09, - 0x02, 0xa0, 0xcd, 0x3f, 0x11, 0x0e, 0xdc, 0x27, 0xda, 0xab, 0xd7, 0x32, 0x96, 0xee, 0x87, 0x31, - 0x8a, 0xf1, 0x18, 0xef, 0x7a, 0xb5, 0x9e, 0x19, 0x9f, 0x91, 0x4e, 0x26, 0x94, 0x51, 0x06, 0x5e, - 0xe1, 0x50, 0xf9, 0xcb, 0x11, 0x88, 0xd1, 0xc0, 0x32, 0x06, 0xc3, 0xeb, 0x6f, 0x5d, 0x2d, 0x95, - 0x8b, 0x2b, 0x1b, 0x85, 0xc5, 0x52, 0x5a, 0x42, 0xa3, 0x00, 0x14, 0x70, 0x61, 0x71, 0x25, 0xbf, - 0x9e, 0x8e, 0xb8, 0xe5, 0x85, 0xe5, 0xf5, 0x73, 0x8f, 0xa7, 0xa3, 0x2e, 0xc1, 0x06, 0x03, 0xc4, - 0xfc, 0x08, 0x8f, 0x9d, 0x49, 0xc7, 0x51, 0x1a, 0x52, 0x8c, 0xc1, 0xc2, 0xf3, 0xa5, 0xe2, 0xb9, - 0xc7, 0xd3, 0x83, 0x41, 0xc8, 0x63, 0x67, 0xd2, 0x43, 0x68, 0x04, 0x92, 0x14, 0x52, 0x58, 0x59, - 0x59, 0x4c, 0x27, 0x5c, 0x9e, 0x6b, 0xeb, 0xca, 0xc2, 0xf2, 0x7c, 0x3a, 0xe9, 0xf2, 0x9c, 0x57, - 0x56, 0x36, 0x56, 0xd3, 0xe0, 0x72, 0x58, 0x2a, 0xad, 0xad, 0xe5, 0xe7, 0x4b, 0xe9, 0x61, 0x17, - 0xa3, 0xf0, 0xd6, 0xf5, 0xd2, 0x5a, 0x3a, 0x15, 0x10, 0xeb, 0xb1, 0x33, 0xe9, 0x11, 0xb7, 0x89, - 0xd2, 0xf2, 0xc6, 0x52, 0x7a, 0x14, 0x8d, 0xc3, 0x08, 0x6b, 0x42, 0x08, 0x31, 0x16, 0x02, 0x9d, - 0x7b, 0x3c, 0x9d, 0xf6, 0x04, 0x61, 0x5c, 0xc6, 0x03, 0x80, 0x73, 0x8f, 0xa7, 0x91, 0x3c, 0x07, - 0x71, 0xea, 0x86, 0x08, 0xc1, 0xe8, 0x62, 0xbe, 0x50, 0x5a, 0x2c, 0xaf, 0xac, 0xae, 0x2f, 0xac, - 0x2c, 0xe7, 0x17, 0xd3, 0x92, 0x07, 0x53, 0x4a, 0xcf, 0x6e, 0x2c, 0x28, 0xa5, 0x62, 0x3a, 0xe2, - 0x87, 0xad, 0x96, 0xf2, 0xeb, 0xa5, 0x62, 0x3a, 0x2a, 0x57, 0x60, 0xb2, 0x5d, 0x40, 0x6d, 0x3b, - 0x84, 0x7c, 0xbe, 0x10, 0xe9, 0xe0, 0x0b, 0x94, 0x57, 0xd8, 0x17, 0xe4, 0xef, 0x44, 0x60, 0xa2, - 0xcd, 0xa4, 0xd2, 0xb6, 0x91, 0xa7, 0x21, 0xce, 0x7c, 0x99, 0x4d, 0xb3, 0x0f, 0xb4, 0x9d, 0x9d, - 0xa8, 0x67, 0xb7, 0x4c, 0xb5, 0x94, 0xce, 0x9f, 0x6a, 0x44, 0x3b, 0xa4, 0x1a, 0x84, 0x45, 0x8b, - 0xc3, 0xfe, 0x6c, 0x4b, 0xf0, 0x67, 0xf3, 0xe3, 0xb9, 0x7e, 0xe6, 0x47, 0x0a, 0xdb, 0xdf, 0x24, - 0x10, 0x6f, 0x33, 0x09, 0x9c, 0x87, 0xf1, 0x16, 0x46, 0x7d, 0x07, 0xe3, 0xf7, 0x4a, 0x90, 0xe9, - 0x64, 0x9c, 0x1e, 0x21, 0x31, 0x12, 0x08, 0x89, 0xe7, 0xc3, 0x16, 0xbc, 0xab, 0x73, 0x27, 0xb4, - 0xf4, 0xf5, 0x67, 0x24, 0x38, 0xdc, 0x3e, 0xa5, 0x6c, 0x2b, 0xc3, 0x9b, 0x61, 0xb0, 0x81, 0x9d, - 0x6d, 0x43, 0xa4, 0x55, 0xf7, 0xb5, 0x99, 0xac, 0x49, 0x75, 0xb8, 0xb3, 0x39, 0x95, 0x7f, 0xb6, - 0x8f, 0x76, 0xca, 0x0b, 0x99, 0x34, 0x2d, 0x92, 0x7e, 0x30, 0x02, 0x87, 0xda, 0x32, 0x6f, 0x2b, - 0xe8, 0x09, 0x00, 0x4d, 0x37, 0x9b, 0x0e, 0x4b, 0x9d, 0x58, 0x24, 0x4e, 0x52, 0x08, 0x0d, 0x5e, - 0x24, 0xca, 0x36, 0x1d, 0xb7, 0x3e, 0x4a, 0xeb, 0x81, 0x81, 0x28, 0xc2, 0x93, 0x9e, 0xa0, 0x31, - 0x2a, 0xe8, 0x54, 0x07, 0x4d, 0x5b, 0x1c, 0xf3, 0x11, 0x48, 0x57, 0xea, 0x1a, 0xd6, 0x9d, 0xb2, - 0xed, 0x58, 0x58, 0x6d, 0x68, 0x7a, 0x8d, 0x4e, 0x35, 0x89, 0x5c, 0x7c, 0x4b, 0xad, 0xdb, 0x58, - 0x19, 0x63, 0xd5, 0x6b, 0xa2, 0x96, 0x50, 0x50, 0x07, 0xb2, 0x7c, 0x14, 0x83, 0x01, 0x0a, 0x56, - 0xed, 0x52, 0xc8, 0x1f, 0x4e, 0xc2, 0xb0, 0x2f, 0x01, 0x47, 0x77, 0x41, 0xea, 0x45, 0xf5, 0x8a, - 0x5a, 0x16, 0x8b, 0x2a, 0x66, 0x89, 0x61, 0x02, 0x5b, 0xe5, 0x0b, 0xab, 0x47, 0x60, 0x92, 0xa2, - 0x18, 0x4d, 0x07, 0x5b, 0xe5, 0x4a, 0x5d, 0xb5, 0x6d, 0x6a, 0xb4, 0x04, 0x45, 0x45, 0xa4, 0x6e, - 0x85, 0x54, 0xcd, 0x89, 0x1a, 0x74, 0x16, 0x26, 0x28, 0x45, 0xa3, 0x59, 0x77, 0x34, 0xb3, 0x8e, - 0xcb, 0x64, 0x99, 0x67, 0xd3, 0x29, 0xc7, 0x95, 0x6c, 0x9c, 0x60, 0x2c, 0x71, 0x04, 0x22, 0x91, - 0x8d, 0x8a, 0x70, 0x82, 0x92, 0xd5, 0xb0, 0x8e, 0x2d, 0xd5, 0xc1, 0x65, 0xfc, 0x52, 0x53, 0xad, - 0xdb, 0x65, 0x55, 0xaf, 0x96, 0xb7, 0x55, 0x7b, 0x3b, 0x33, 0x49, 0x18, 0x14, 0x22, 0x19, 0x49, - 0x39, 0x4a, 0x10, 0xe7, 0x39, 0x5e, 0x89, 0xa2, 0xe5, 0xf5, 0xea, 0x45, 0xd5, 0xde, 0x46, 0x39, - 0x38, 0x4c, 0xb9, 0xd8, 0x8e, 0xa5, 0xe9, 0xb5, 0x72, 0x65, 0x1b, 0x57, 0x76, 0xca, 0x4d, 0x67, - 0xeb, 0xc9, 0xcc, 0x31, 0x7f, 0xfb, 0x54, 0xc2, 0x35, 0x8a, 0x33, 0x47, 0x50, 0x36, 0x9c, 0xad, - 0x27, 0xd1, 0x1a, 0xa4, 0x48, 0x67, 0x34, 0xb4, 0x6b, 0xb8, 0xbc, 0x65, 0x58, 0x74, 0x0e, 0x1d, - 0x6d, 0x13, 0x9a, 0x7c, 0x16, 0x9c, 0x5d, 0xe1, 0x04, 0x4b, 0x46, 0x15, 0xe7, 0xe2, 0x6b, 0xab, - 0xa5, 0x52, 0x51, 0x19, 0x16, 0x5c, 0x2e, 0x18, 0x16, 0x71, 0xa8, 0x9a, 0xe1, 0x1a, 0x78, 0x98, - 0x39, 0x54, 0xcd, 0x10, 0xe6, 0x3d, 0x0b, 0x13, 0x95, 0x0a, 0xd3, 0x59, 0xab, 0x94, 0xf9, 0x62, - 0xcc, 0xce, 0xa4, 0x03, 0xc6, 0xaa, 0x54, 0xe6, 0x19, 0x02, 0xf7, 0x71, 0x1b, 0x3d, 0x05, 0x87, - 0x3c, 0x63, 0xf9, 0x09, 0xc7, 0x5b, 0xb4, 0x0c, 0x93, 0x9e, 0x85, 0x09, 0x73, 0xaf, 0x95, 0x10, - 0x05, 0x5a, 0x34, 0xf7, 0xc2, 0x64, 0x4f, 0xc0, 0xa4, 0xb9, 0x6d, 0xb6, 0xd2, 0x9d, 0xf2, 0xd3, - 0x21, 0x73, 0xdb, 0x0c, 0x13, 0xde, 0x4b, 0x57, 0xe6, 0x16, 0xae, 0xa8, 0x0e, 0xae, 0x66, 0x8e, - 0xf8, 0xd1, 0x7d, 0x15, 0x68, 0x16, 0xd2, 0x95, 0x4a, 0x19, 0xeb, 0xea, 0x66, 0x1d, 0x97, 0x55, - 0x0b, 0xeb, 0xaa, 0x9d, 0x99, 0xa6, 0xc8, 0x31, 0xc7, 0x6a, 0x62, 0x65, 0xb4, 0x52, 0x29, 0xd1, - 0xca, 0x3c, 0xad, 0x43, 0xa7, 0x60, 0xdc, 0xd8, 0x7c, 0xb1, 0xc2, 0x3c, 0xb2, 0x6c, 0x5a, 0x78, - 0x4b, 0xdb, 0xcd, 0xdc, 0x43, 0xcd, 0x3b, 0x46, 0x2a, 0xa8, 0x3f, 0xae, 0x52, 0x30, 0x7a, 0x00, - 0xd2, 0x15, 0x7b, 0x5b, 0xb5, 0x4c, 0x1a, 0x92, 0x6d, 0x53, 0xad, 0xe0, 0xcc, 0xbd, 0x0c, 0x95, - 0xc1, 0x97, 0x05, 0x98, 0x8c, 0x08, 0xfb, 0xaa, 0xb6, 0xe5, 0x08, 0x8e, 0xf7, 0xb3, 0x11, 0x41, - 0x61, 0x9c, 0xdb, 0x49, 0x48, 0x13, 0x4b, 0x04, 0x1a, 0x3e, 0x49, 0xd1, 0x46, 0xcd, 0x6d, 0xd3, - 0xdf, 0xee, 0xdd, 0x30, 0x42, 0x30, 0xbd, 0x46, 0x1f, 0x60, 0x89, 0x9b, 0xb9, 0xed, 0x6b, 0xf1, - 0x71, 0x38, 0x4c, 0x90, 0x1a, 0xd8, 0x51, 0xab, 0xaa, 0xa3, 0xfa, 0xb0, 0x1f, 0xa2, 0xd8, 0xc4, - 0xec, 0x4b, 0xbc, 0x32, 0x20, 0xa7, 0xd5, 0xdc, 0xdc, 0x73, 0x1d, 0xeb, 0x61, 0x26, 0x27, 0x81, - 0x09, 0xd7, 0xba, 0x63, 0xc9, 0xb9, 0x9c, 0x83, 0x94, 0xdf, 0xef, 0x51, 0x12, 0x98, 0xe7, 0xa7, - 0x25, 0x92, 0x04, 0xcd, 0xad, 0x14, 0x49, 0xfa, 0xf2, 0x42, 0x29, 0x1d, 0x21, 0x69, 0xd4, 0xe2, - 0xc2, 0x7a, 0xa9, 0xac, 0x6c, 0x2c, 0xaf, 0x2f, 0x2c, 0x95, 0xd2, 0x51, 0x5f, 0x62, 0xff, 0x4c, - 0x2c, 0x71, 0x5f, 0xfa, 0x7e, 0xf9, 0x5b, 0x11, 0x18, 0x0d, 0xae, 0xd4, 0xd0, 0xcf, 0xc0, 0x11, - 0xb1, 0xad, 0x62, 0x63, 0xa7, 0x7c, 0x55, 0xb3, 0xe8, 0x80, 0x6c, 0xa8, 0x6c, 0x72, 0x74, 0xfd, - 0x67, 0x92, 0x63, 0xad, 0x61, 0xe7, 0x39, 0xcd, 0x22, 0xc3, 0xad, 0xa1, 0x3a, 0x68, 0x11, 0xa6, - 0x75, 0xa3, 0x6c, 0x3b, 0xaa, 0x5e, 0x55, 0xad, 0x6a, 0xd9, 0xdb, 0xd0, 0x2a, 0xab, 0x95, 0x0a, - 0xb6, 0x6d, 0x83, 0x4d, 0x84, 0x2e, 0x97, 0xe3, 0xba, 0xb1, 0xc6, 0x91, 0xbd, 0x19, 0x22, 0xcf, - 0x51, 0x43, 0xee, 0x1b, 0xed, 0xe4, 0xbe, 0xc7, 0x20, 0xd9, 0x50, 0xcd, 0x32, 0xd6, 0x1d, 0x6b, - 0x8f, 0xe6, 0xe7, 0x09, 0x25, 0xd1, 0x50, 0xcd, 0x12, 0x29, 0xff, 0x58, 0x96, 0x49, 0xcf, 0xc4, - 0x12, 0x89, 0x74, 0xf2, 0x99, 0x58, 0x22, 0x99, 0x06, 0xf9, 0xb5, 0x28, 0xa4, 0xfc, 0xf9, 0x3a, - 0x59, 0xfe, 0x54, 0xe8, 0x8c, 0x25, 0xd1, 0x98, 0x76, 0x77, 0xd7, 0xec, 0x7e, 0x76, 0x8e, 0x4c, - 0x65, 0xb9, 0x41, 0x96, 0x1c, 0x2b, 0x8c, 0x92, 0xa4, 0x11, 0xc4, 0xd9, 0x30, 0x4b, 0x46, 0x12, - 0x0a, 0x2f, 0xa1, 0x79, 0x18, 0x7c, 0xd1, 0xa6, 0xbc, 0x07, 0x29, 0xef, 0x7b, 0xba, 0xf3, 0x7e, - 0x66, 0x8d, 0x32, 0x4f, 0x3e, 0xb3, 0x56, 0x5e, 0x5e, 0x51, 0x96, 0xf2, 0x8b, 0x0a, 0x27, 0x47, - 0x47, 0x21, 0x56, 0x57, 0xaf, 0xed, 0x05, 0x27, 0x3d, 0x0a, 0xea, 0xb7, 0x13, 0x8e, 0x42, 0xec, - 0x2a, 0x56, 0x77, 0x82, 0x53, 0x0d, 0x05, 0xdd, 0xc1, 0xc1, 0x70, 0x1a, 0xe2, 0xd4, 0x5e, 0x08, - 0x80, 0x5b, 0x2c, 0x3d, 0x80, 0x12, 0x10, 0x9b, 0x5b, 0x51, 0xc8, 0x80, 0x48, 0x43, 0x8a, 0x41, - 0xcb, 0xab, 0x0b, 0xa5, 0xb9, 0x52, 0x3a, 0x22, 0x9f, 0x85, 0x41, 0x66, 0x04, 0x32, 0x58, 0x5c, - 0x33, 0xa4, 0x07, 0x78, 0x91, 0xf3, 0x90, 0x44, 0xed, 0xc6, 0x52, 0xa1, 0xa4, 0xa4, 0x23, 0xc1, - 0xae, 0x8e, 0xa5, 0xe3, 0xb2, 0x0d, 0x29, 0x7f, 0x1e, 0xfe, 0xe3, 0x59, 0x8c, 0x7f, 0x45, 0x82, - 0x61, 0x5f, 0x5e, 0x4d, 0x12, 0x22, 0xb5, 0x5e, 0x37, 0xae, 0x96, 0xd5, 0xba, 0xa6, 0xda, 0xdc, - 0x35, 0x80, 0x82, 0xf2, 0x04, 0xd2, 0x6f, 0xd7, 0xfd, 0x98, 0x86, 0x48, 0x3c, 0x3d, 0x28, 0x7f, - 0x52, 0x82, 0x74, 0x38, 0xb1, 0x0d, 0x89, 0x29, 0xfd, 0x24, 0xc5, 0x94, 0x3f, 0x21, 0xc1, 0x68, - 0x30, 0x9b, 0x0d, 0x89, 0x77, 0xd7, 0x4f, 0x54, 0xbc, 0x3f, 0x8c, 0xc0, 0x48, 0x20, 0x87, 0xed, - 0x57, 0xba, 0x97, 0x60, 0x5c, 0xab, 0xe2, 0x86, 0x69, 0x38, 0x58, 0xaf, 0xec, 0x95, 0xeb, 0xf8, - 0x0a, 0xae, 0x67, 0x64, 0x1a, 0x34, 0x4e, 0x77, 0xcf, 0x92, 0x67, 0x17, 0x3c, 0xba, 0x45, 0x42, - 0x96, 0x9b, 0x58, 0x28, 0x96, 0x96, 0x56, 0x57, 0xd6, 0x4b, 0xcb, 0x73, 0x6f, 0x2d, 0x6f, 0x2c, - 0x5f, 0x5a, 0x5e, 0x79, 0x6e, 0x59, 0x49, 0x6b, 0x21, 0xb4, 0x3b, 0x38, 0xec, 0x57, 0x21, 0x1d, - 0x16, 0x0a, 0x1d, 0x81, 0x76, 0x62, 0xa5, 0x07, 0xd0, 0x04, 0x8c, 0x2d, 0xaf, 0x94, 0xd7, 0x16, - 0x8a, 0xa5, 0x72, 0xe9, 0xc2, 0x85, 0xd2, 0xdc, 0xfa, 0x1a, 0xdb, 0xf7, 0x70, 0xb1, 0xd7, 0x03, - 0x03, 0x5c, 0x7e, 0x25, 0x0a, 0x13, 0x6d, 0x24, 0x41, 0x79, 0xbe, 0x62, 0x61, 0x8b, 0xa8, 0x87, - 0xfb, 0x91, 0x7e, 0x96, 0xe4, 0x0c, 0xab, 0xaa, 0xe5, 0xf0, 0x05, 0xce, 0x03, 0x40, 0xac, 0xa4, - 0x3b, 0xda, 0x96, 0x86, 0x2d, 0xbe, 0x9f, 0xc4, 0x96, 0x31, 0x63, 0x1e, 0x9c, 0x6d, 0x29, 0x3d, - 0x04, 0xc8, 0x34, 0x6c, 0xcd, 0xd1, 0xae, 0xe0, 0xb2, 0xa6, 0x8b, 0xcd, 0x27, 0xb2, 0xac, 0x89, - 0x29, 0x69, 0x51, 0xb3, 0xa0, 0x3b, 0x2e, 0xb6, 0x8e, 0x6b, 0x6a, 0x08, 0x9b, 0x04, 0xf3, 0xa8, - 0x92, 0x16, 0x35, 0x2e, 0xf6, 0x5d, 0x90, 0xaa, 0x1a, 0x4d, 0x92, 0xeb, 0x31, 0x3c, 0x32, 0x77, - 0x48, 0xca, 0x30, 0x83, 0xb9, 0x28, 0x3c, 0x8b, 0xf7, 0x76, 0xbd, 0x52, 0xca, 0x30, 0x83, 0x31, - 0x94, 0xfb, 0x61, 0x4c, 0xad, 0xd5, 0x2c, 0xc2, 0x5c, 0x30, 0x62, 0xeb, 0x92, 0x51, 0x17, 0x4c, - 0x11, 0xb3, 0xcf, 0x40, 0x42, 0xd8, 0x81, 0x4c, 0xd5, 0xc4, 0x12, 0x65, 0x93, 0x2d, 0xb6, 0x23, - 0x27, 0x93, 0x4a, 0x42, 0x17, 0x95, 0x77, 0x41, 0x4a, 0xb3, 0xcb, 0xde, 0x26, 0x7e, 0x64, 0x26, - 0x72, 0x32, 0xa1, 0x0c, 0x6b, 0xb6, 0xbb, 0x01, 0x2a, 0x7f, 0x26, 0x02, 0xa3, 0xc1, 0x43, 0x08, - 0x54, 0x84, 0x44, 0xdd, 0xa8, 0xa8, 0xd4, 0xb5, 0xd8, 0x09, 0xd8, 0xc9, 0x1e, 0xe7, 0x16, 0xb3, - 0x8b, 0x1c, 0x5f, 0x71, 0x29, 0xb3, 0xbf, 0x23, 0x41, 0x42, 0x80, 0xd1, 0x61, 0x88, 0x99, 0xaa, - 0xb3, 0x4d, 0xd9, 0xc5, 0x0b, 0x91, 0xb4, 0xa4, 0xd0, 0x32, 0x81, 0xdb, 0xa6, 0xaa, 0x53, 0x17, - 0xe0, 0x70, 0x52, 0x26, 0xfd, 0x5a, 0xc7, 0x6a, 0x95, 0x2e, 0x7a, 0x8c, 0x46, 0x03, 0xeb, 0x8e, - 0x2d, 0xfa, 0x95, 0xc3, 0xe7, 0x38, 0x18, 0x3d, 0x08, 0xe3, 0x8e, 0xa5, 0x6a, 0xf5, 0x00, 0x6e, - 0x8c, 0xe2, 0xa6, 0x45, 0x85, 0x8b, 0x9c, 0x83, 0xa3, 0x82, 0x6f, 0x15, 0x3b, 0x6a, 0x65, 0x1b, - 0x57, 0x3d, 0xa2, 0x41, 0xba, 0xb9, 0x71, 0x84, 0x23, 0x14, 0x79, 0xbd, 0xa0, 0x95, 0xbf, 0x25, - 0xc1, 0xb8, 0x58, 0xa6, 0x55, 0x5d, 0x63, 0x2d, 0x01, 0xa8, 0xba, 0x6e, 0x38, 0x7e, 0x73, 0xb5, - 0xba, 0x72, 0x0b, 0xdd, 0x6c, 0xde, 0x25, 0x52, 0x7c, 0x0c, 0xb2, 0x0d, 0x00, 0xaf, 0xa6, 0xa3, - 0xd9, 0xa6, 0x61, 0x98, 0x9f, 0x30, 0xd1, 0x63, 0x4a, 0xb6, 0xb0, 0x07, 0x06, 0x22, 0xeb, 0x39, - 0x34, 0x09, 0xf1, 0x4d, 0x5c, 0xd3, 0x74, 0xbe, 0x6f, 0xcc, 0x0a, 0x62, 0xfb, 0x25, 0xe6, 0x6e, - 0xbf, 0x14, 0xfe, 0x32, 0x4c, 0x54, 0x8c, 0x46, 0x58, 0xdc, 0x42, 0x3a, 0xb4, 0xb9, 0x60, 0x5f, - 0x94, 0x5e, 0x78, 0x98, 0x23, 0xd5, 0x8c, 0xba, 0xaa, 0xd7, 0x66, 0x0d, 0xab, 0xe6, 0x1d, 0xb3, - 0x92, 0x8c, 0xc7, 0xf6, 0x1d, 0xb6, 0x9a, 0x9b, 0x7f, 0x26, 0x49, 0xbf, 0x14, 0x89, 0xce, 0xaf, - 0x16, 0x3e, 0x1b, 0xc9, 0xce, 0x33, 0xc2, 0x55, 0x61, 0x0c, 0x05, 0x6f, 0xd5, 0x71, 0x85, 0x28, - 0x08, 0xdf, 0x7b, 0x10, 0x26, 0x6b, 0x46, 0xcd, 0xa0, 0x9c, 0x4e, 0x93, 0x5f, 0xfc, 0x9c, 0x36, - 0xe9, 0x42, 0xb3, 0x3d, 0x0f, 0x75, 0x73, 0xcb, 0x30, 0xc1, 0x91, 0xcb, 0xf4, 0xa0, 0x88, 0x2d, - 0x63, 0x50, 0xd7, 0x3d, 0xb4, 0xcc, 0x17, 0xbe, 0x4b, 0xa7, 0x6f, 0x65, 0x9c, 0x93, 0x92, 0x3a, - 0xb6, 0xd2, 0xc9, 0x29, 0x70, 0x28, 0xc0, 0x8f, 0x0d, 0x52, 0x6c, 0xf5, 0xe0, 0xf8, 0x9b, 0x9c, - 0xe3, 0x84, 0x8f, 0xe3, 0x1a, 0x27, 0xcd, 0xcd, 0xc1, 0xc8, 0x7e, 0x78, 0xfd, 0x0b, 0xce, 0x2b, - 0x85, 0xfd, 0x4c, 0xe6, 0x61, 0x8c, 0x32, 0xa9, 0x34, 0x6d, 0xc7, 0x68, 0xd0, 0x08, 0xd8, 0x9d, - 0xcd, 0x6f, 0x7d, 0x97, 0x8d, 0x9a, 0x51, 0x42, 0x36, 0xe7, 0x52, 0xe5, 0x72, 0x40, 0xcf, 0xc6, - 0xaa, 0xb8, 0x52, 0xef, 0xc1, 0xe1, 0x6b, 0x5c, 0x10, 0x17, 0x3f, 0x77, 0x19, 0x26, 0xc9, 0x6f, - 0x1a, 0xa0, 0xfc, 0x92, 0xf4, 0xde, 0x70, 0xcb, 0x7c, 0xeb, 0xbd, 0x6c, 0x60, 0x4e, 0xb8, 0x0c, - 0x7c, 0x32, 0xf9, 0x7a, 0xb1, 0x86, 0x1d, 0x07, 0x5b, 0x76, 0x59, 0xad, 0xb7, 0x13, 0xcf, 0xb7, - 0x63, 0x91, 0xf9, 0xd8, 0xf7, 0x83, 0xbd, 0x38, 0xcf, 0x28, 0xf3, 0xf5, 0x7a, 0x6e, 0x03, 0x8e, - 0xb4, 0xf1, 0x8a, 0x3e, 0x78, 0xbe, 0xc2, 0x79, 0x4e, 0xb6, 0x78, 0x06, 0x61, 0xbb, 0x0a, 0x02, - 0xee, 0xf6, 0x65, 0x1f, 0x3c, 0x3f, 0xce, 0x79, 0x22, 0x4e, 0x2b, 0xba, 0x94, 0x70, 0x7c, 0x06, - 0xc6, 0xaf, 0x60, 0x6b, 0xd3, 0xb0, 0xf9, 0x2e, 0x51, 0x1f, 0xec, 0x3e, 0xc1, 0xd9, 0x8d, 0x71, - 0x42, 0xba, 0x6d, 0x44, 0x78, 0x3d, 0x05, 0x89, 0x2d, 0xb5, 0x82, 0xfb, 0x60, 0x71, 0x83, 0xb3, - 0x18, 0x22, 0xf8, 0x84, 0x34, 0x0f, 0xa9, 0x9a, 0xc1, 0xe7, 0xa8, 0xde, 0xe4, 0x9f, 0xe4, 0xe4, - 0xc3, 0x82, 0x86, 0xb3, 0x30, 0x0d, 0xb3, 0x59, 0x27, 0x13, 0x58, 0x6f, 0x16, 0x7f, 0x4b, 0xb0, - 0x10, 0x34, 0x9c, 0xc5, 0x3e, 0xcc, 0xfa, 0xaa, 0x60, 0x61, 0xfb, 0xec, 0xf9, 0x34, 0x0c, 0x1b, - 0x7a, 0x7d, 0xcf, 0xd0, 0xfb, 0x11, 0xe2, 0x53, 0x9c, 0x03, 0x70, 0x12, 0xc2, 0xe0, 0x3c, 0x24, - 0xfb, 0xed, 0x88, 0xbf, 0xfd, 0x7d, 0x31, 0x3c, 0x44, 0x0f, 0xcc, 0xc3, 0x98, 0x08, 0x50, 0x9a, - 0xa1, 0xf7, 0xc1, 0xe2, 0xef, 0x70, 0x16, 0xa3, 0x3e, 0x32, 0xae, 0x86, 0x83, 0x6d, 0xa7, 0x86, - 0xfb, 0x61, 0xf2, 0x19, 0xa1, 0x06, 0x27, 0xe1, 0xa6, 0xdc, 0xc4, 0x7a, 0x65, 0xbb, 0x3f, 0x0e, - 0xbf, 0x22, 0x4c, 0x29, 0x68, 0x08, 0x8b, 0x39, 0x18, 0x69, 0xa8, 0x96, 0xbd, 0xad, 0xd6, 0xfb, - 0xea, 0x8e, 0xbf, 0xcb, 0x79, 0xa4, 0x5c, 0x22, 0x6e, 0x91, 0xa6, 0xbe, 0x1f, 0x36, 0x9f, 0x15, - 0x16, 0xf1, 0x91, 0xf1, 0xa1, 0x67, 0x3b, 0x74, 0x4b, 0x6d, 0x3f, 0xdc, 0x7e, 0x55, 0x0c, 0x3d, - 0x46, 0xbb, 0xe4, 0xe7, 0x78, 0x1e, 0x92, 0xb6, 0x76, 0xad, 0x2f, 0x36, 0x9f, 0x13, 0x3d, 0x4d, - 0x09, 0x08, 0xf1, 0x5b, 0xe1, 0x68, 0xdb, 0x69, 0xa2, 0x0f, 0x66, 0x7f, 0x8f, 0x33, 0x3b, 0xdc, - 0x66, 0xaa, 0xe0, 0x21, 0x61, 0xbf, 0x2c, 0xff, 0xbe, 0x08, 0x09, 0x38, 0xc4, 0x6b, 0x95, 0xac, - 0x1a, 0x6c, 0x75, 0x6b, 0x7f, 0x56, 0xfb, 0x35, 0x61, 0x35, 0x46, 0x1b, 0xb0, 0xda, 0x3a, 0x1c, - 0xe6, 0x1c, 0xf7, 0xd7, 0xaf, 0x9f, 0x17, 0x81, 0x95, 0x51, 0x6f, 0x04, 0x7b, 0xf7, 0x6d, 0x90, - 0x75, 0xcd, 0x29, 0xd2, 0x53, 0xbb, 0xdc, 0x50, 0xcd, 0x3e, 0x38, 0x7f, 0x81, 0x73, 0x16, 0x11, - 0xdf, 0xcd, 0x6f, 0xed, 0x25, 0xd5, 0x24, 0xcc, 0x9f, 0x87, 0x8c, 0x60, 0xde, 0xd4, 0x2d, 0x5c, - 0x31, 0x6a, 0xba, 0x76, 0x0d, 0x57, 0xfb, 0x60, 0xfd, 0xeb, 0xa1, 0xae, 0xda, 0xf0, 0x91, 0x13, - 0xce, 0x0b, 0x90, 0x76, 0x73, 0x95, 0xb2, 0xd6, 0x30, 0x0d, 0xcb, 0xe9, 0xc1, 0xf1, 0x8b, 0xa2, - 0xa7, 0x5c, 0xba, 0x05, 0x4a, 0x96, 0x2b, 0x01, 0x3b, 0x67, 0xee, 0xd7, 0x25, 0xbf, 0xc4, 0x19, - 0x8d, 0x78, 0x54, 0x3c, 0x70, 0x54, 0x8c, 0x86, 0xa9, 0x5a, 0xfd, 0xc4, 0xbf, 0x7f, 0x20, 0x02, - 0x07, 0x27, 0xe1, 0x81, 0x83, 0x64, 0x74, 0x64, 0xb6, 0xef, 0x83, 0xc3, 0x97, 0x45, 0xe0, 0x10, - 0x34, 0x9c, 0x85, 0x48, 0x18, 0xfa, 0x60, 0xf1, 0x0f, 0x05, 0x0b, 0x41, 0x43, 0x58, 0x3c, 0xeb, - 0x4d, 0xb4, 0x16, 0xae, 0x69, 0xb6, 0x63, 0xb1, 0xa4, 0xb8, 0x3b, 0xab, 0x7f, 0xf4, 0xfd, 0x60, - 0x12, 0xa6, 0xf8, 0x48, 0x49, 0x24, 0xe2, 0x9b, 0xac, 0x74, 0xcd, 0xd4, 0x5b, 0xb0, 0xdf, 0x10, - 0x91, 0xc8, 0x47, 0x46, 0x64, 0xf3, 0x65, 0x88, 0xc4, 0xec, 0x15, 0xb2, 0x52, 0xe8, 0x83, 0xdd, - 0x3f, 0x0e, 0x09, 0xb7, 0x26, 0x68, 0x09, 0x4f, 0x5f, 0xfe, 0xd3, 0xd4, 0x77, 0xf0, 0x5e, 0x5f, - 0xde, 0xf9, 0x4f, 0x42, 0xf9, 0xcf, 0x06, 0xa3, 0x64, 0x31, 0x64, 0x2c, 0x94, 0x4f, 0xa1, 0x5e, - 0xb7, 0x8a, 0x32, 0xef, 0xfe, 0x21, 0xd7, 0x37, 0x98, 0x4e, 0xe5, 0x16, 0x89, 0x93, 0x07, 0x93, - 0x9e, 0xde, 0xcc, 0xde, 0xfb, 0x43, 0xd7, 0xcf, 0x03, 0x39, 0x4f, 0xee, 0x02, 0x8c, 0x04, 0x12, - 0x9e, 0xde, 0xac, 0xde, 0xc7, 0x59, 0xa5, 0xfc, 0xf9, 0x4e, 0xee, 0x2c, 0xc4, 0x48, 0xf2, 0xd2, - 0x9b, 0xfc, 0xaf, 0x70, 0x72, 0x8a, 0x9e, 0x7b, 0x13, 0x24, 0x44, 0xd2, 0xd2, 0x9b, 0xf4, 0xfd, - 0x9c, 0xd4, 0x25, 0x21, 0xe4, 0x22, 0x61, 0xe9, 0x4d, 0xfe, 0x57, 0x05, 0xb9, 0x20, 0x21, 0xe4, - 0xfd, 0x9b, 0xf0, 0x2b, 0x3f, 0x17, 0xe3, 0x93, 0x8e, 0xb0, 0xdd, 0x79, 0x18, 0xe2, 0x99, 0x4a, - 0x6f, 0xea, 0x0f, 0xf2, 0xc6, 0x05, 0x45, 0xee, 0x09, 0x88, 0xf7, 0x69, 0xf0, 0x9f, 0xe7, 0xa4, - 0x0c, 0x3f, 0x37, 0x07, 0xc3, 0xbe, 0xec, 0xa4, 0x37, 0xf9, 0x5f, 0xe3, 0xe4, 0x7e, 0x2a, 0x22, - 0x3a, 0xcf, 0x4e, 0x7a, 0x33, 0xf8, 0x05, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, 0x89, 0x49, 0x6f, - 0xea, 0x0f, 0x09, 0xab, 0x0b, 0x92, 0xdc, 0xd3, 0x90, 0x74, 0x27, 0x9b, 0xde, 0xf4, 0x1f, 0xe6, - 0xf4, 0x1e, 0x0d, 0xb1, 0x80, 0x6f, 0xb2, 0xeb, 0xcd, 0xe2, 0xaf, 0x0b, 0x0b, 0xf8, 0xa8, 0xc8, - 0x30, 0x0a, 0x27, 0x30, 0xbd, 0x39, 0x7d, 0x44, 0x0c, 0xa3, 0x50, 0xfe, 0x42, 0x7a, 0x93, 0xc6, - 0xfc, 0xde, 0x2c, 0xfe, 0x86, 0xe8, 0x4d, 0x8a, 0x4f, 0xc4, 0x08, 0x67, 0x04, 0xbd, 0x79, 0xfc, - 0xa2, 0x10, 0x23, 0x94, 0x10, 0xe4, 0x56, 0x01, 0xb5, 0x66, 0x03, 0xbd, 0xf9, 0x7d, 0x94, 0xf3, - 0x1b, 0x6f, 0x49, 0x06, 0x72, 0xcf, 0xc1, 0xe1, 0xf6, 0x99, 0x40, 0x6f, 0xae, 0x1f, 0xfb, 0x61, - 0x68, 0xed, 0xe6, 0x4f, 0x04, 0x72, 0xeb, 0xde, 0x94, 0xe2, 0xcf, 0x02, 0x7a, 0xb3, 0x7d, 0xe5, - 0x87, 0xc1, 0xc0, 0xed, 0x4f, 0x02, 0x72, 0x79, 0x00, 0x6f, 0x02, 0xee, 0xcd, 0xeb, 0x13, 0x9c, - 0x97, 0x8f, 0x88, 0x0c, 0x0d, 0x3e, 0xff, 0xf6, 0xa6, 0xbf, 0x21, 0x86, 0x06, 0xa7, 0x20, 0x43, - 0x43, 0x4c, 0xbd, 0xbd, 0xa9, 0x3f, 0x29, 0x86, 0x86, 0x20, 0x21, 0x9e, 0xed, 0x9b, 0xdd, 0x7a, - 0x73, 0xf8, 0x94, 0xf0, 0x6c, 0x1f, 0x55, 0x6e, 0x19, 0xc6, 0x5b, 0x26, 0xc4, 0xde, 0xac, 0x7e, - 0x89, 0xb3, 0x4a, 0x87, 0xe7, 0x43, 0xff, 0xe4, 0xc5, 0x27, 0xc3, 0xde, 0xdc, 0x3e, 0x1d, 0x9a, - 0xbc, 0xf8, 0x5c, 0x98, 0x3b, 0x0f, 0x09, 0xbd, 0x59, 0xaf, 0x93, 0xc1, 0x83, 0xba, 0xdf, 0x04, - 0xcc, 0xfc, 0xe7, 0x1f, 0x71, 0xeb, 0x08, 0x82, 0xdc, 0x59, 0x88, 0xe3, 0xc6, 0x26, 0xae, 0xf6, - 0xa2, 0xfc, 0xde, 0x8f, 0x44, 0xc0, 0x24, 0xd8, 0xb9, 0xa7, 0x01, 0xd8, 0xd6, 0x08, 0x3d, 0x0c, - 0xec, 0x41, 0xfb, 0x5f, 0x7e, 0xc4, 0xaf, 0xde, 0x78, 0x24, 0x1e, 0x03, 0x76, 0x91, 0xa7, 0x3b, - 0x83, 0xef, 0x07, 0x19, 0xd0, 0x1e, 0x79, 0x0a, 0x86, 0x5e, 0xb4, 0x0d, 0xdd, 0x51, 0x6b, 0xbd, - 0xa8, 0xff, 0x2b, 0xa7, 0x16, 0xf8, 0xc4, 0x60, 0x0d, 0xc3, 0xc2, 0x8e, 0x5a, 0xb3, 0x7b, 0xd1, - 0xfe, 0x37, 0x4e, 0xeb, 0x12, 0x10, 0xe2, 0x8a, 0x6a, 0x3b, 0xfd, 0xe8, 0xfd, 0xc7, 0x82, 0x58, - 0x10, 0x10, 0xa1, 0xc9, 0xef, 0x1d, 0xbc, 0xd7, 0x8b, 0xf6, 0x07, 0x42, 0x68, 0x8e, 0x9f, 0x7b, - 0x13, 0x24, 0xc9, 0x4f, 0x76, 0x9f, 0xae, 0x07, 0xf1, 0x9f, 0x70, 0x62, 0x8f, 0x82, 0xb4, 0x6c, - 0x3b, 0x55, 0x47, 0xeb, 0x6d, 0xec, 0x5b, 0xbc, 0xa7, 0x05, 0x7e, 0x2e, 0x0f, 0xc3, 0xb6, 0x53, - 0xad, 0x36, 0x79, 0x7e, 0xda, 0x83, 0xfc, 0x4f, 0x7f, 0xe4, 0x6e, 0x59, 0xb8, 0x34, 0xa4, 0xb7, - 0xaf, 0xee, 0x38, 0xa6, 0x41, 0x0f, 0x3c, 0x7a, 0x71, 0xf8, 0x21, 0xe7, 0xe0, 0x23, 0xc9, 0xcd, - 0x41, 0x8a, 0xe8, 0x62, 0x61, 0x13, 0xd3, 0xd3, 0xa9, 0x1e, 0x2c, 0xfe, 0x3b, 0x37, 0x40, 0x80, - 0xa8, 0xf0, 0xb3, 0x5f, 0x7b, 0x6d, 0x4a, 0xfa, 0xe6, 0x6b, 0x53, 0xd2, 0x1f, 0xbe, 0x36, 0x25, - 0x7d, 0xe8, 0x3b, 0x53, 0x03, 0xdf, 0xfc, 0xce, 0xd4, 0xc0, 0xef, 0x7d, 0x67, 0x6a, 0xa0, 0xfd, - 0x2e, 0x31, 0xcc, 0x1b, 0xf3, 0x06, 0xdb, 0x1f, 0x7e, 0x41, 0xae, 0x69, 0xce, 0x76, 0x73, 0x73, - 0xb6, 0x62, 0x34, 0xe8, 0x36, 0xae, 0xb7, 0x5b, 0xeb, 0x2e, 0x72, 0xe0, 0x3d, 0x51, 0x38, 0x5a, - 0x31, 0xec, 0x86, 0x61, 0x97, 0xd9, 0x7e, 0x2f, 0x2b, 0xf0, 0x1d, 0xdf, 0x94, 0xbf, 0xaa, 0x8f, - 0x4d, 0xdf, 0x8b, 0x30, 0x4a, 0x55, 0xa7, 0xdb, 0x5d, 0xd4, 0xdb, 0x7a, 0x06, 0x88, 0xaf, 0xff, - 0xdb, 0x38, 0xd5, 0x7a, 0xc4, 0x25, 0xa4, 0xa7, 0xf7, 0xeb, 0x30, 0xa9, 0x35, 0xcc, 0x3a, 0xa6, - 0xdb, 0xfc, 0x65, 0xb7, 0xae, 0x37, 0xbf, 0x6f, 0x70, 0x7e, 0x13, 0x1e, 0xf9, 0x82, 0xa0, 0xce, - 0x2d, 0xc2, 0xb8, 0x5a, 0xa9, 0x60, 0x33, 0xc0, 0xb2, 0x47, 0xb7, 0x08, 0x01, 0xd3, 0x9c, 0xd2, - 0xe5, 0x56, 0x78, 0xba, 0x53, 0xd7, 0xbc, 0x70, 0xaf, 0xcf, 0xf2, 0x16, 0xae, 0x61, 0xfd, 0x61, - 0x1d, 0x3b, 0x57, 0x0d, 0x6b, 0x87, 0x9b, 0xf7, 0x61, 0xd6, 0xd4, 0x20, 0xbb, 0xc1, 0x0c, 0xef, - 0x8b, 0xc2, 0x14, 0xab, 0x38, 0xbd, 0xa9, 0xda, 0xf8, 0xf4, 0x95, 0x47, 0x37, 0xb1, 0xa3, 0x3e, - 0x7a, 0xba, 0x62, 0x68, 0x3a, 0xef, 0x89, 0x09, 0xde, 0x2f, 0xa4, 0x7e, 0x96, 0xd7, 0x67, 0xdb, - 0x6e, 0xd3, 0xcb, 0xf3, 0x10, 0x9b, 0x33, 0x34, 0x1d, 0x4d, 0x42, 0xbc, 0x8a, 0x75, 0xa3, 0xc1, - 0xef, 0xdc, 0xb1, 0x02, 0xba, 0x1b, 0x06, 0xd5, 0x86, 0xd1, 0xd4, 0x1d, 0x76, 0x42, 0x51, 0x18, - 0xfe, 0xda, 0xcd, 0xe9, 0x81, 0xdf, 0xbf, 0x39, 0x1d, 0x5d, 0xd0, 0x1d, 0x85, 0x57, 0xe5, 0x62, - 0xaf, 0xbf, 0x3a, 0x2d, 0xc9, 0xcf, 0xc0, 0x50, 0x11, 0x57, 0x0e, 0xc2, 0xab, 0x88, 0x2b, 0x21, - 0x5e, 0x0f, 0x40, 0x62, 0x41, 0x77, 0xd8, 0xad, 0xc8, 0x13, 0x10, 0xd5, 0x74, 0x76, 0xd1, 0x26, - 0xd4, 0x3e, 0x81, 0x13, 0xd4, 0x22, 0xae, 0xb8, 0xa8, 0x55, 0x5c, 0x09, 0xa3, 0x12, 0xf6, 0x04, - 0x5e, 0x28, 0xfe, 0xde, 0x7f, 0x9c, 0x1a, 0x78, 0xf9, 0xb5, 0xa9, 0x81, 0x8e, 0x3d, 0xe1, 0x1f, - 0x03, 0xdc, 0xc4, 0xbc, 0x0b, 0xec, 0xea, 0x0e, 0x3b, 0x23, 0x71, 0xbb, 0xe1, 0xb7, 0x07, 0x41, - 0xe6, 0x38, 0xb6, 0xa3, 0xee, 0x68, 0x7a, 0xcd, 0xed, 0x09, 0xb5, 0xe9, 0x6c, 0x5f, 0xe3, 0x5d, - 0x71, 0x98, 0x77, 0x05, 0xc7, 0xe9, 0xde, 0x1b, 0xd9, 0xce, 0xa3, 0x2b, 0xdb, 0xa3, 0xcf, 0xe5, - 0x7f, 0x15, 0x05, 0xb4, 0xe6, 0xa8, 0x3b, 0x38, 0xdf, 0x74, 0xb6, 0x0d, 0x4b, 0xbb, 0xc6, 0x62, - 0x19, 0x06, 0x68, 0xa8, 0xbb, 0x65, 0xc7, 0xd8, 0xc1, 0xba, 0x4d, 0x4d, 0x33, 0x7c, 0xe6, 0xe8, - 0x6c, 0x1b, 0xff, 0x98, 0x25, 0x5d, 0x57, 0x78, 0xf0, 0xb3, 0xdf, 0x9e, 0xbe, 0xbf, 0xb7, 0x15, - 0x28, 0x32, 0x49, 0xae, 0x77, 0xd7, 0x29, 0x63, 0x74, 0x19, 0xd8, 0x25, 0x8b, 0x72, 0x5d, 0xb3, - 0x1d, 0x7e, 0x4f, 0xfb, 0xec, 0x6c, 0x7b, 0xdd, 0x67, 0x5b, 0xc5, 0x9c, 0xbd, 0xac, 0xd6, 0xb5, - 0xaa, 0xea, 0x18, 0x96, 0x7d, 0x71, 0x40, 0x49, 0x52, 0x56, 0x8b, 0x9a, 0xed, 0xa0, 0x75, 0x48, - 0x56, 0xb1, 0xbe, 0xc7, 0xd8, 0x46, 0xdf, 0x18, 0xdb, 0x04, 0xe1, 0x44, 0xb9, 0x3e, 0x0f, 0x48, - 0xf5, 0xe3, 0x89, 0x87, 0x49, 0xec, 0x7e, 0x65, 0x07, 0xf6, 0x01, 0xce, 0xf4, 0x1d, 0xc5, 0xb8, - 0x1a, 0x06, 0x65, 0xef, 0x03, 0xf0, 0xda, 0x44, 0x19, 0x18, 0x52, 0xab, 0x55, 0x0b, 0xdb, 0x36, - 0x3d, 0x00, 0x4c, 0x2a, 0xa2, 0x98, 0x1b, 0xff, 0xd7, 0x5f, 0x7a, 0x78, 0x24, 0xc0, 0xb1, 0x90, - 0x02, 0xb8, 0xe2, 0x92, 0x9e, 0xfa, 0xa4, 0x04, 0xe3, 0x2d, 0x2d, 0x22, 0x19, 0xa6, 0xf2, 0x1b, - 0xeb, 0x17, 0x57, 0x94, 0x85, 0x17, 0xf2, 0xeb, 0x0b, 0x2b, 0xcb, 0x65, 0x76, 0xe5, 0x7f, 0x79, - 0x6d, 0xb5, 0x34, 0xb7, 0x70, 0x61, 0xa1, 0x54, 0x4c, 0x0f, 0xa0, 0x69, 0x38, 0xd6, 0x06, 0xa7, - 0x58, 0x5a, 0x2c, 0xcd, 0xe7, 0xd7, 0x4b, 0x69, 0x09, 0xdd, 0x05, 0x27, 0xda, 0x32, 0x71, 0x51, - 0x22, 0x1d, 0x50, 0x94, 0x92, 0x8b, 0x12, 0x2d, 0x5c, 0xe8, 0x38, 0x8a, 0x1e, 0xea, 0xea, 0x3f, - 0xbb, 0xee, 0x70, 0x09, 0x8e, 0xa7, 0x77, 0x47, 0xe0, 0x68, 0x78, 0xca, 0x50, 0xf5, 0xbd, 0x0e, - 0xaf, 0x3e, 0x3b, 0x44, 0xb3, 0x8b, 0x10, 0xcd, 0xeb, 0x7b, 0xe8, 0x28, 0xcb, 0xa7, 0xcb, 0x4d, - 0xab, 0xce, 0x63, 0xd0, 0x10, 0x29, 0x6f, 0x58, 0x75, 0x12, 0x9b, 0xc4, 0x45, 0x7f, 0xe9, 0x64, - 0x8a, 0xdf, 0xde, 0xcf, 0xa5, 0x3f, 0xfa, 0xea, 0xf4, 0xc0, 0xe7, 0x5f, 0x9d, 0x1e, 0xf8, 0xc1, - 0xa7, 0xa6, 0x07, 0x5e, 0xfe, 0x83, 0x99, 0x81, 0xc2, 0x4e, 0x58, 0xbd, 0xaf, 0xf4, 0x9c, 0x4d, - 0x13, 0x79, 0x7d, 0x8f, 0x06, 0xa2, 0x55, 0xe9, 0x85, 0x38, 0x55, 0x4e, 0x1c, 0xa0, 0x4e, 0x85, - 0x0f, 0x50, 0x9f, 0xc3, 0xf5, 0xfa, 0x25, 0xdd, 0xb8, 0x4a, 0x7b, 0xd5, 0xb3, 0xc1, 0x47, 0x22, - 0x30, 0xd5, 0x32, 0x6d, 0xf2, 0x0c, 0xa3, 0xd3, 0xf3, 0xd7, 0x1c, 0x24, 0x8a, 0x22, 0x71, 0xc9, - 0xc0, 0x90, 0x8d, 0x2b, 0x86, 0x5e, 0x65, 0x23, 0x3d, 0xaa, 0x88, 0x22, 0x51, 0x5b, 0x57, 0x75, - 0xc3, 0xe6, 0x77, 0xee, 0x59, 0xa1, 0xf0, 0x71, 0x69, 0x7f, 0xf9, 0xc2, 0x88, 0x68, 0x49, 0xa8, - 0xf9, 0x68, 0xcf, 0x23, 0xe5, 0x1d, 0xa2, 0xa5, 0xab, 0x44, 0xe0, 0x58, 0xb9, 0x5f, 0xab, 0xfc, - 0x62, 0x04, 0xa6, 0xc3, 0x56, 0x21, 0x69, 0x9b, 0xed, 0xa8, 0x0d, 0xb3, 0x93, 0x59, 0xce, 0x43, - 0x72, 0x5d, 0xe0, 0xec, 0xdb, 0x2e, 0x37, 0xf6, 0x69, 0x97, 0x51, 0xb7, 0x29, 0x61, 0x98, 0x33, - 0x7d, 0x1a, 0xc6, 0xd5, 0xe3, 0x40, 0x96, 0xf9, 0x6c, 0x0c, 0x4e, 0xd0, 0x47, 0x59, 0x56, 0x43, - 0xd3, 0x9d, 0xd3, 0x15, 0x6b, 0xcf, 0x74, 0x68, 0xe2, 0x66, 0x6c, 0x71, 0xbb, 0x8c, 0x7b, 0xd5, - 0xb3, 0xac, 0xba, 0xc3, 0xc8, 0xd9, 0x82, 0xf8, 0x2a, 0xa1, 0x23, 0x16, 0x71, 0x0c, 0x47, 0xad, - 0x73, 0x4b, 0xb1, 0x02, 0x81, 0xb2, 0x87, 0x5c, 0x11, 0x06, 0xd5, 0xc4, 0x1b, 0xae, 0x3a, 0x56, - 0xb7, 0xd8, 0x7d, 0xf8, 0x28, 0x1d, 0x50, 0x09, 0x02, 0xa0, 0x57, 0xdf, 0x27, 0x21, 0xae, 0x36, - 0xd9, 0x55, 0x8e, 0x28, 0x19, 0x69, 0xb4, 0x20, 0x5f, 0x82, 0x21, 0x7e, 0xa0, 0x8c, 0xd2, 0x10, - 0xdd, 0xc1, 0x7b, 0xb4, 0x9d, 0x94, 0x42, 0x7e, 0xa2, 0x59, 0x88, 0x53, 0xe1, 0xf9, 0x04, 0x92, - 0x99, 0x6d, 0x91, 0x7e, 0x96, 0x0a, 0xa9, 0x30, 0x34, 0xf9, 0x19, 0x48, 0x14, 0x8d, 0x86, 0xa6, - 0x1b, 0x41, 0x6e, 0x49, 0xc6, 0x8d, 0xca, 0x6c, 0x36, 0x79, 0xbe, 0xa1, 0xb0, 0x02, 0x3a, 0x0c, - 0x83, 0xec, 0x7d, 0x04, 0xbf, 0x8e, 0xc2, 0x4b, 0xf2, 0x1c, 0x0c, 0x51, 0xde, 0x2b, 0x26, 0x42, - 0xfc, 0x65, 0x1d, 0x7f, 0x88, 0x41, 0x53, 0x53, 0xce, 0x3e, 0xe2, 0x09, 0x8b, 0x20, 0x56, 0x55, - 0x1d, 0x95, 0xeb, 0x4d, 0x7f, 0xcb, 0x6f, 0x86, 0x04, 0x67, 0x62, 0xa3, 0x33, 0x10, 0x35, 0x4c, - 0x9b, 0x5f, 0x28, 0xc9, 0x76, 0x52, 0x65, 0xc5, 0x2c, 0xc4, 0x48, 0xa6, 0xa2, 0x10, 0xe4, 0x82, - 0xd2, 0x31, 0xa8, 0x3e, 0xe9, 0x0b, 0xaa, 0xbe, 0x2e, 0xf7, 0xfd, 0x64, 0x5d, 0xda, 0xe2, 0x0e, - 0xae, 0xb3, 0x7c, 0x2a, 0x02, 0x53, 0xbe, 0xda, 0x2b, 0xd8, 0xb2, 0x35, 0x43, 0xe7, 0xf3, 0x39, - 0xf3, 0x16, 0xe4, 0x13, 0x92, 0xd7, 0x77, 0x70, 0x97, 0x37, 0x41, 0x34, 0x6f, 0x9a, 0x28, 0x0b, - 0x09, 0x5a, 0xae, 0x18, 0xcc, 0x5f, 0x62, 0x8a, 0x5b, 0x26, 0x75, 0xb6, 0xb1, 0xe5, 0x5c, 0x55, - 0x2d, 0xf7, 0x09, 0xa1, 0x28, 0xcb, 0x4f, 0x41, 0x72, 0xce, 0xd0, 0x6d, 0xac, 0xdb, 0x4d, 0x3a, - 0x06, 0x37, 0xeb, 0x46, 0x65, 0x87, 0x73, 0x60, 0x05, 0x62, 0x70, 0xd5, 0x34, 0x29, 0x65, 0x4c, - 0x21, 0x3f, 0x59, 0x6e, 0x58, 0x58, 0xeb, 0x68, 0xa2, 0xa7, 0xf6, 0x6f, 0x22, 0xae, 0xa4, 0x6b, - 0xa3, 0xff, 0x2d, 0xc1, 0xf1, 0xd6, 0x01, 0xb5, 0x83, 0xf7, 0xec, 0xfd, 0x8e, 0xa7, 0xe7, 0x21, - 0xb9, 0x4a, 0xdf, 0xf1, 0x5f, 0xc2, 0x7b, 0x28, 0x0b, 0x43, 0xb8, 0x7a, 0xe6, 0xec, 0xd9, 0x47, - 0x9f, 0x62, 0xde, 0x7e, 0x71, 0x40, 0x11, 0x00, 0x34, 0x05, 0x49, 0x1b, 0x57, 0xcc, 0x33, 0x67, - 0xcf, 0xed, 0x3c, 0xca, 0xdc, 0x8b, 0x64, 0x40, 0x2e, 0x28, 0x97, 0x20, 0x5a, 0xbf, 0xfe, 0xa9, - 0x69, 0xa9, 0x10, 0x87, 0xa8, 0xdd, 0x6c, 0xdc, 0x51, 0x1f, 0x79, 0x25, 0x0e, 0x33, 0x7e, 0x4a, - 0x1a, 0xa9, 0xdc, 0xac, 0x84, 0xdb, 0x20, 0xed, 0xb3, 0x01, 0xc5, 0xe8, 0x90, 0xcc, 0x76, 0xb5, - 0xa4, 0xfc, 0xeb, 0x12, 0xa4, 0xdc, 0x54, 0x69, 0x0d, 0x3b, 0xe8, 0xbc, 0x3f, 0xff, 0xe1, 0xc3, - 0xe6, 0xd8, 0x6c, 0xb8, 0x2d, 0x2f, 0xa5, 0x53, 0x7c, 0xe8, 0xe8, 0x09, 0xea, 0x88, 0xa6, 0x61, - 0xf3, 0x67, 0x65, 0x3d, 0x48, 0x5d, 0x64, 0xf4, 0x10, 0x20, 0x1a, 0xe1, 0xca, 0x57, 0x0c, 0x47, - 0xd3, 0x6b, 0x65, 0xd3, 0xb8, 0xca, 0x1f, 0xeb, 0x46, 0x95, 0x34, 0xad, 0xb9, 0x4c, 0x2b, 0x56, - 0x09, 0x9c, 0x08, 0x9d, 0x74, 0xb9, 0x04, 0xd3, 0x3b, 0x12, 0x04, 0x44, 0x11, 0x9d, 0x87, 0x21, - 0xb3, 0xb9, 0x59, 0x16, 0x11, 0x63, 0xf8, 0xcc, 0xf1, 0x76, 0xe3, 0x5f, 0xf8, 0x07, 0x8f, 0x00, - 0x83, 0x66, 0x73, 0x93, 0x78, 0xcb, 0x5d, 0x90, 0x6a, 0x23, 0xcc, 0xf0, 0x15, 0x4f, 0x0e, 0xfa, - 0xf9, 0x08, 0xae, 0x41, 0xd9, 0xb4, 0x34, 0xc3, 0xd2, 0x9c, 0x3d, 0x9a, 0xbf, 0x46, 0x95, 0xb4, - 0xa8, 0x58, 0xe5, 0x70, 0x79, 0x07, 0xc6, 0xd6, 0xe8, 0xfa, 0xd6, 0x93, 0xfc, 0xac, 0x27, 0x9f, - 0xd4, 0x5b, 0xbe, 0x8e, 0x92, 0x45, 0x5a, 0x24, 0x2b, 0x3c, 0xdb, 0xd1, 0x3b, 0x9f, 0xd8, 0xbf, - 0x77, 0x06, 0x33, 0xc4, 0x3f, 0x3e, 0x1a, 0x18, 0x9c, 0xcc, 0x39, 0xfd, 0xe1, 0xab, 0x5f, 0xc7, - 0xec, 0x95, 0x4d, 0x64, 0xbb, 0x4f, 0xaa, 0xd9, 0x1e, 0x61, 0x34, 0xdb, 0x73, 0x08, 0xc9, 0x4f, - 0xc1, 0xc8, 0xaa, 0x6a, 0x39, 0x6b, 0xd8, 0xb9, 0x88, 0xd5, 0x2a, 0xb6, 0x82, 0xb3, 0xee, 0x88, - 0x98, 0x75, 0x11, 0xc4, 0xe8, 0xd4, 0xca, 0x66, 0x1d, 0xfa, 0x5b, 0xde, 0x86, 0x18, 0xbd, 0x19, - 0xea, 0xce, 0xc8, 0x9c, 0x82, 0xcd, 0xc8, 0x24, 0x96, 0xee, 0x39, 0xd8, 0x16, 0xe9, 0x2d, 0x2d, - 0xa0, 0xc7, 0xc5, 0xbc, 0x1a, 0xed, 0x3e, 0xaf, 0x72, 0x47, 0xe4, 0xb3, 0x6b, 0x1d, 0x86, 0x0a, - 0x24, 0x14, 0x2f, 0x14, 0x5d, 0x41, 0x24, 0x4f, 0x10, 0xb4, 0x04, 0x63, 0xa6, 0x6a, 0x39, 0xf4, - 0x49, 0xcc, 0x36, 0xd5, 0x82, 0xfb, 0xfa, 0x74, 0xeb, 0xc8, 0x0b, 0x28, 0xcb, 0x5b, 0x19, 0x31, - 0xfd, 0x40, 0xf9, 0x8f, 0x62, 0x30, 0xc8, 0x8d, 0xf1, 0x26, 0x18, 0xe2, 0x66, 0xe5, 0xde, 0x79, - 0x62, 0xb6, 0x75, 0x62, 0x9a, 0x75, 0x27, 0x10, 0xce, 0x4f, 0xd0, 0xa0, 0xfb, 0x20, 0x51, 0xd9, - 0x56, 0x35, 0xbd, 0xac, 0x55, 0xc5, 0x56, 0xc3, 0x6b, 0x37, 0xa7, 0x87, 0xe6, 0x08, 0x6c, 0xa1, - 0xa8, 0x0c, 0xd1, 0xca, 0x85, 0x2a, 0xc9, 0x04, 0xb6, 0xb1, 0x56, 0xdb, 0x76, 0xf8, 0x08, 0xe3, - 0x25, 0xf4, 0x24, 0xc4, 0x88, 0x43, 0xf0, 0x07, 0x93, 0xd9, 0x96, 0x0d, 0x1f, 0x37, 0xd9, 0x2b, - 0x24, 0x48, 0xc3, 0x1f, 0xfa, 0xf6, 0xb4, 0xa4, 0x50, 0x0a, 0x34, 0x07, 0x23, 0x75, 0xd5, 0x76, - 0xca, 0x74, 0x06, 0x23, 0xcd, 0xc7, 0xf9, 0x7a, 0xbb, 0xc5, 0x20, 0xdc, 0xb0, 0x5c, 0xf4, 0x61, - 0x42, 0xc5, 0x40, 0x55, 0x74, 0x12, 0xd2, 0x94, 0x49, 0xc5, 0x68, 0x34, 0x34, 0x87, 0xe5, 0x56, - 0x83, 0xd4, 0xee, 0xa3, 0x04, 0x3e, 0x47, 0xc1, 0x34, 0xc3, 0x3a, 0x06, 0x49, 0xfa, 0x44, 0x8b, - 0xa2, 0xb0, 0xeb, 0xc8, 0x09, 0x02, 0xa0, 0x95, 0xf7, 0xc3, 0x98, 0x17, 0x1f, 0x19, 0x4a, 0x82, - 0x71, 0xf1, 0xc0, 0x14, 0xf1, 0x11, 0x98, 0xd4, 0xf1, 0x2e, 0xbd, 0x20, 0x1d, 0xc0, 0x4e, 0x52, - 0x6c, 0x44, 0xea, 0x2e, 0x07, 0x29, 0xee, 0x85, 0xd1, 0x8a, 0x30, 0x3e, 0xc3, 0x05, 0x8a, 0x3b, - 0xe2, 0x42, 0x29, 0xda, 0x51, 0x48, 0xa8, 0xa6, 0xc9, 0x10, 0x86, 0x79, 0x7c, 0x34, 0x4d, 0x5a, - 0x75, 0x0a, 0xc6, 0xa9, 0x8e, 0x16, 0xb6, 0x9b, 0x75, 0x87, 0x33, 0x49, 0x51, 0x9c, 0x31, 0x52, - 0xa1, 0x30, 0x38, 0xc5, 0xbd, 0x1b, 0x46, 0xf0, 0x15, 0xad, 0x8a, 0xf5, 0x0a, 0x66, 0x78, 0x23, - 0x14, 0x2f, 0x25, 0x80, 0x14, 0xe9, 0x01, 0x70, 0xe3, 0x5e, 0x59, 0xc4, 0xe4, 0x51, 0xc6, 0x4f, - 0xc0, 0xf3, 0x0c, 0x2c, 0x67, 0x20, 0x56, 0x54, 0x1d, 0x95, 0x24, 0x18, 0xce, 0x2e, 0x9b, 0x68, - 0x52, 0x0a, 0xf9, 0x29, 0xbf, 0x1e, 0x81, 0xd8, 0x65, 0xc3, 0xc1, 0xe8, 0x31, 0x5f, 0x02, 0x38, - 0xda, 0xce, 0x9f, 0xd7, 0xb4, 0x9a, 0x8e, 0xab, 0x4b, 0x76, 0xcd, 0xf7, 0x3d, 0x05, 0xcf, 0x9d, - 0x22, 0x01, 0x77, 0x9a, 0x84, 0xb8, 0x65, 0x34, 0xf5, 0xaa, 0xb8, 0xc9, 0x4b, 0x0b, 0xa8, 0x04, - 0x09, 0xd7, 0x4b, 0x62, 0xbd, 0xbc, 0x64, 0x8c, 0x78, 0x09, 0xf1, 0x61, 0x0e, 0x50, 0x86, 0x36, - 0xb9, 0xb3, 0x14, 0x20, 0xe9, 0x06, 0x2f, 0xee, 0x6d, 0xfd, 0x39, 0xac, 0x47, 0x46, 0x26, 0x13, - 0xb7, 0xef, 0x5d, 0xe3, 0x31, 0x8f, 0x4b, 0xbb, 0x15, 0xdc, 0x7a, 0x01, 0xb7, 0xe2, 0xdf, 0x76, - 0x18, 0xa2, 0x7a, 0x79, 0x6e, 0xc5, 0xbe, 0xef, 0x70, 0x1c, 0x92, 0xb6, 0x56, 0xd3, 0x55, 0xa7, - 0x69, 0x61, 0xee, 0x79, 0x1e, 0x40, 0xfe, 0x8a, 0x04, 0x83, 0xcc, 0x93, 0x7d, 0x76, 0x93, 0xda, - 0xdb, 0x2d, 0xd2, 0xc9, 0x6e, 0xd1, 0x83, 0xdb, 0x2d, 0x0f, 0xe0, 0x0a, 0x63, 0xf3, 0x27, 0xf7, - 0x6d, 0x32, 0x06, 0x26, 0xe2, 0x9a, 0x56, 0xe3, 0x03, 0xd5, 0x47, 0x24, 0xff, 0x07, 0x89, 0x24, - 0xb1, 0xbc, 0x1e, 0xe5, 0x61, 0x44, 0xc8, 0x55, 0xde, 0xaa, 0xab, 0x35, 0xee, 0x3b, 0x27, 0x3a, - 0x0a, 0x77, 0xa1, 0xae, 0xd6, 0x94, 0x61, 0x2e, 0x0f, 0x29, 0xb4, 0xef, 0x87, 0x48, 0x87, 0x7e, - 0x08, 0x74, 0x7c, 0xf4, 0x60, 0x1d, 0x1f, 0xe8, 0xa2, 0x58, 0xb8, 0x8b, 0xbe, 0x18, 0xa1, 0x8b, - 0x19, 0xd3, 0xb0, 0xd5, 0xfa, 0x8f, 0x63, 0x44, 0x1c, 0x83, 0xa4, 0x69, 0xd4, 0xcb, 0xac, 0x86, - 0xdd, 0x70, 0x4f, 0x98, 0x46, 0x5d, 0x69, 0xe9, 0xf6, 0xf8, 0x6d, 0x1a, 0x2e, 0x83, 0xb7, 0xc1, - 0x6a, 0x43, 0x61, 0xab, 0x59, 0x90, 0x62, 0xa6, 0xe0, 0x73, 0xd9, 0x23, 0xc4, 0x06, 0x74, 0x72, - 0x94, 0x5a, 0xe7, 0x5e, 0x26, 0x36, 0xc3, 0x54, 0x38, 0x1e, 0xa1, 0x60, 0xa1, 0xbf, 0xdd, 0x2a, - 0xd8, 0xef, 0x96, 0x0a, 0xc7, 0x93, 0xff, 0xa6, 0x04, 0xb0, 0x48, 0x2c, 0x4b, 0xf5, 0x25, 0xb3, - 0x90, 0x4d, 0x45, 0x28, 0x07, 0x5a, 0x9e, 0xea, 0xd4, 0x69, 0xbc, 0xfd, 0x94, 0xed, 0x97, 0x7b, - 0x0e, 0x46, 0x3c, 0x67, 0xb4, 0xb1, 0x10, 0x66, 0xaa, 0x4b, 0x56, 0xbd, 0x86, 0x1d, 0x25, 0x75, - 0xc5, 0x57, 0x92, 0xff, 0xb9, 0x04, 0x49, 0x2a, 0xd3, 0x12, 0x76, 0xd4, 0x40, 0x1f, 0x4a, 0x07, - 0xef, 0xc3, 0x13, 0x00, 0x8c, 0x8d, 0xad, 0x5d, 0xc3, 0xdc, 0xb3, 0x92, 0x14, 0xb2, 0xa6, 0x5d, - 0xc3, 0xe8, 0x9c, 0x6b, 0xf0, 0x68, 0x77, 0x83, 0x8b, 0xac, 0x9b, 0x9b, 0xfd, 0x08, 0x0c, 0xd1, - 0x4f, 0x54, 0xed, 0xda, 0x3c, 0x91, 0x1e, 0xd4, 0x9b, 0x8d, 0xf5, 0x5d, 0x5b, 0x7e, 0x11, 0x86, - 0xd6, 0x77, 0xd9, 0xde, 0xc8, 0x31, 0x48, 0x5a, 0x86, 0xc1, 0xe7, 0x64, 0x96, 0x0b, 0x25, 0x08, - 0x80, 0x4e, 0x41, 0x62, 0x3f, 0x20, 0xe2, 0xed, 0x07, 0x78, 0x1b, 0x1a, 0xd1, 0xbe, 0x36, 0x34, - 0x4e, 0xfd, 0x3b, 0x09, 0x86, 0x7d, 0xf1, 0x01, 0x3d, 0x0a, 0x87, 0x0a, 0x8b, 0x2b, 0x73, 0x97, - 0xca, 0x0b, 0xc5, 0xf2, 0x85, 0xc5, 0xfc, 0xbc, 0xf7, 0x86, 0x2b, 0x7b, 0xf8, 0xfa, 0x8d, 0x19, - 0xe4, 0xc3, 0xdd, 0xd0, 0xe9, 0x8e, 0x12, 0x3a, 0x0d, 0x93, 0x41, 0x92, 0x7c, 0x61, 0xad, 0xb4, - 0xbc, 0x9e, 0x96, 0xb2, 0x87, 0xae, 0xdf, 0x98, 0x19, 0xf7, 0x51, 0xe4, 0x37, 0x6d, 0xac, 0x3b, - 0xad, 0x04, 0x73, 0x2b, 0x4b, 0x4b, 0x0b, 0xeb, 0xe9, 0x48, 0x0b, 0x01, 0x0f, 0xd8, 0x0f, 0xc0, - 0x78, 0x90, 0x60, 0x79, 0x61, 0x31, 0x1d, 0xcd, 0xa2, 0xeb, 0x37, 0x66, 0x46, 0x7d, 0xd8, 0xcb, - 0x5a, 0x3d, 0x9b, 0xf8, 0xc0, 0xa7, 0xa7, 0x06, 0x7e, 0xe5, 0x97, 0xa7, 0x24, 0xa2, 0xd9, 0x48, - 0x20, 0x46, 0xa0, 0x87, 0xe0, 0xc8, 0xda, 0xc2, 0xfc, 0x72, 0xa9, 0x58, 0x5e, 0x5a, 0x9b, 0x17, - 0x7b, 0xd0, 0x42, 0xbb, 0xb1, 0xeb, 0x37, 0x66, 0x86, 0xb9, 0x4a, 0x9d, 0xb0, 0x57, 0x95, 0xd2, - 0xe5, 0x95, 0xf5, 0x52, 0x5a, 0x62, 0xd8, 0xab, 0x16, 0xbe, 0x62, 0x38, 0xec, 0x1b, 0x76, 0x8f, - 0xc0, 0xd1, 0x36, 0xd8, 0xae, 0x62, 0xe3, 0xd7, 0x6f, 0xcc, 0x8c, 0xac, 0x5a, 0x98, 0x8d, 0x1f, - 0x4a, 0x31, 0x0b, 0x99, 0x56, 0x8a, 0x95, 0xd5, 0x95, 0xb5, 0xfc, 0x62, 0x7a, 0x26, 0x9b, 0xbe, - 0x7e, 0x63, 0x26, 0x25, 0x82, 0x21, 0xdd, 0xe8, 0x77, 0x35, 0xbb, 0x93, 0x2b, 0x9e, 0x3f, 0x7d, - 0x18, 0xee, 0xe9, 0x70, 0xc6, 0x24, 0x4e, 0x27, 0x0e, 0x74, 0xca, 0xd4, 0x71, 0x9f, 0x3d, 0xdb, - 0x63, 0xfb, 0xb9, 0xf7, 0xd2, 0xe9, 0xe0, 0x27, 0x58, 0xd9, 0xae, 0x8b, 0x3b, 0xf9, 0x83, 0x12, - 0x8c, 0x5e, 0xd4, 0x6c, 0xc7, 0xb0, 0xb4, 0x8a, 0x5a, 0xa7, 0x2f, 0xb7, 0xce, 0xf5, 0x1b, 0x5b, - 0x43, 0x43, 0xfd, 0x69, 0x18, 0xbc, 0xa2, 0xd6, 0x59, 0x50, 0x8b, 0xd2, 0x0f, 0xcd, 0x74, 0x38, - 0xf2, 0x71, 0x43, 0x9b, 0x60, 0xc0, 0xc8, 0xe4, 0x5f, 0x8b, 0xc0, 0x18, 0x1d, 0x0c, 0x36, 0xfb, - 0x04, 0x19, 0x59, 0x63, 0x15, 0x20, 0x66, 0xa9, 0x0e, 0xdf, 0x34, 0x2c, 0xcc, 0xf2, 0xd3, 0xc7, - 0xfb, 0xfa, 0x38, 0x4b, 0x2b, 0xe2, 0x8a, 0x42, 0x69, 0xd1, 0xdb, 0x21, 0xd1, 0x50, 0x77, 0xcb, - 0x94, 0x0f, 0x5b, 0xb9, 0xe4, 0xf7, 0xc7, 0xe7, 0xd6, 0xcd, 0xe9, 0xb1, 0x3d, 0xb5, 0x51, 0xcf, - 0xc9, 0x82, 0x8f, 0xac, 0x0c, 0x35, 0xd4, 0x5d, 0x22, 0x22, 0x32, 0x61, 0x8c, 0x40, 0x2b, 0xdb, - 0xaa, 0x5e, 0xc3, 0xac, 0x11, 0xba, 0x05, 0x5a, 0xb8, 0xb8, 0xef, 0x46, 0x0e, 0x7b, 0x8d, 0xf8, - 0xd8, 0xc9, 0xca, 0x48, 0x43, 0xdd, 0x9d, 0xa3, 0x00, 0xd2, 0x62, 0x2e, 0xf1, 0xd1, 0x57, 0xa7, - 0x07, 0xe8, 0x89, 0xee, 0xb7, 0x24, 0x00, 0xcf, 0x62, 0xe8, 0xed, 0x90, 0xae, 0xb8, 0x25, 0x4a, - 0x2b, 0xce, 0x26, 0xef, 0xef, 0xd4, 0x17, 0x21, 0x7b, 0xb3, 0xb9, 0xf9, 0x9b, 0x37, 0xa7, 0x25, - 0x65, 0xac, 0x12, 0xea, 0x8a, 0xb7, 0xc1, 0x70, 0xd3, 0xac, 0xaa, 0x0e, 0x2e, 0xd3, 0x75, 0x5c, - 0xa4, 0xe7, 0x3c, 0x3f, 0x45, 0x78, 0xdd, 0xba, 0x39, 0x8d, 0x98, 0x5a, 0x3e, 0x62, 0x99, 0xce, - 0xfe, 0xc0, 0x20, 0x84, 0xc0, 0xa7, 0xd3, 0xd7, 0x25, 0x18, 0x2e, 0xfa, 0xee, 0x54, 0x66, 0x60, - 0xa8, 0x61, 0xe8, 0xda, 0x0e, 0xf7, 0xc7, 0xa4, 0x22, 0x8a, 0x28, 0x0b, 0x09, 0xf6, 0x98, 0xd5, - 0xd9, 0x13, 0x5b, 0xa1, 0xa2, 0x4c, 0xa8, 0xae, 0xe2, 0x4d, 0x5b, 0x13, 0xbd, 0xa1, 0x88, 0x22, - 0xba, 0x00, 0x69, 0x1b, 0x57, 0x9a, 0x96, 0xe6, 0xec, 0x95, 0x2b, 0x86, 0xee, 0xa8, 0x15, 0x87, - 0x3d, 0x8b, 0x2c, 0x1c, 0xbb, 0x75, 0x73, 0xfa, 0x08, 0x93, 0x35, 0x8c, 0x21, 0x2b, 0x63, 0x02, - 0x34, 0xc7, 0x20, 0xa4, 0x85, 0x2a, 0x76, 0x54, 0xad, 0x6e, 0x67, 0xd8, 0xe5, 0x04, 0x51, 0xf4, - 0xe9, 0xf2, 0xb9, 0x21, 0xff, 0xc6, 0xd6, 0x05, 0x48, 0x1b, 0x26, 0xb6, 0x02, 0x89, 0xa8, 0x14, - 0x6e, 0x39, 0x8c, 0x21, 0x2b, 0x63, 0x02, 0x24, 0x92, 0x54, 0x87, 0x74, 0xb3, 0x58, 0x28, 0x9a, - 0xcd, 0x4d, 0x6f, 0x3f, 0x6c, 0xb2, 0xa5, 0x37, 0xf2, 0xfa, 0x5e, 0xe1, 0x31, 0x8f, 0x7b, 0x98, - 0x4e, 0xfe, 0xc6, 0x97, 0x1e, 0x9e, 0xe4, 0xae, 0xe1, 0xed, 0x4f, 0x5d, 0xc2, 0x7b, 0xa4, 0xfb, - 0x39, 0xea, 0x2a, 0xc5, 0x24, 0x69, 0xe7, 0x8b, 0xaa, 0x56, 0x17, 0xcf, 0xfb, 0x15, 0x5e, 0x42, - 0x39, 0x18, 0xb4, 0x1d, 0xd5, 0x69, 0xda, 0xfc, 0xa4, 0x57, 0xee, 0xe4, 0x6a, 0x05, 0x43, 0xaf, - 0xae, 0x51, 0x4c, 0x85, 0x53, 0xa0, 0x0b, 0x30, 0xc8, 0x8f, 0xd0, 0xe3, 0xfb, 0x1e, 0xdf, 0xf4, - 0xae, 0x04, 0xa3, 0x26, 0x16, 0xa9, 0xe2, 0x3a, 0xae, 0xb1, 0xb4, 0x6a, 0x5b, 0x25, 0xab, 0x0f, - 0xfa, 0xed, 0xbd, 0xc2, 0xc2, 0xbe, 0x07, 0x21, 0xb7, 0x54, 0x98, 0x9f, 0xac, 0x8c, 0xb9, 0xa0, - 0x35, 0x0a, 0x41, 0x97, 0x02, 0x97, 0x7f, 0xf9, 0x07, 0x2a, 0xef, 0xee, 0xa4, 0xbe, 0xcf, 0xa7, - 0xc5, 0xfe, 0x84, 0xff, 0xea, 0xf0, 0x05, 0x48, 0x37, 0xf5, 0x4d, 0x43, 0xa7, 0x6f, 0x70, 0x79, - 0x7e, 0x4f, 0xd6, 0x77, 0x51, 0xbf, 0x73, 0x84, 0x31, 0x64, 0x65, 0xcc, 0x05, 0x5d, 0x64, 0xab, - 0x80, 0x2a, 0x8c, 0x7a, 0x58, 0x74, 0xa0, 0x26, 0x7b, 0x0e, 0xd4, 0xbb, 0xf8, 0x40, 0x3d, 0x14, - 0x6e, 0xc5, 0x1b, 0xab, 0x23, 0x2e, 0x90, 0x90, 0xa1, 0x8b, 0x00, 0x5e, 0x78, 0xa0, 0xfb, 0x14, - 0xc3, 0x9d, 0x3b, 0xde, 0x8b, 0x31, 0x62, 0xbd, 0xe7, 0xd1, 0xa2, 0x77, 0xc2, 0x44, 0x43, 0xd3, - 0xcb, 0x36, 0xae, 0x6f, 0x95, 0xb9, 0x81, 0x09, 0x4b, 0xfa, 0x09, 0xa5, 0xc2, 0xe2, 0xfe, 0xfc, - 0xe1, 0xd6, 0xcd, 0xe9, 0x2c, 0x0f, 0xa1, 0xad, 0x2c, 0x65, 0x65, 0xbc, 0xa1, 0xe9, 0x6b, 0xb8, - 0xbe, 0x55, 0x74, 0x61, 0xb9, 0xd4, 0x07, 0x5e, 0x9d, 0x1e, 0xe0, 0xc3, 0x75, 0x40, 0x3e, 0x47, - 0xf7, 0xce, 0xf9, 0x30, 0xc3, 0x36, 0x59, 0x93, 0xa8, 0xa2, 0xc0, 0xaf, 0x1a, 0x78, 0x00, 0x36, - 0xcc, 0x5f, 0xfe, 0x83, 0x19, 0x49, 0xfe, 0x9c, 0x04, 0x83, 0xc5, 0xcb, 0xab, 0xaa, 0x66, 0xa1, - 0x05, 0x18, 0xf7, 0x3c, 0x27, 0x38, 0xc8, 0x8f, 0xdf, 0xba, 0x39, 0x9d, 0x09, 0x3b, 0x97, 0x3b, - 0xca, 0x3d, 0x07, 0x16, 0xc3, 0x7c, 0xa1, 0xd3, 0xc2, 0x35, 0xc0, 0xaa, 0x05, 0x45, 0x6e, 0x5d, - 0xd6, 0x86, 0xd4, 0x2c, 0xc1, 0x10, 0x93, 0xd6, 0x46, 0x39, 0x88, 0x9b, 0xe4, 0x07, 0x3f, 0x18, - 0x98, 0xea, 0xe8, 0xbc, 0x14, 0xdf, 0xdd, 0xc8, 0x24, 0x24, 0xf2, 0x87, 0x23, 0x00, 0xc5, 0xcb, - 0x97, 0xd7, 0x2d, 0xcd, 0xac, 0x63, 0xe7, 0x76, 0x6a, 0xbe, 0x0e, 0x87, 0x7c, 0xab, 0x24, 0xab, - 0x12, 0xd2, 0x7e, 0xe6, 0xd6, 0xcd, 0xe9, 0xe3, 0x61, 0xed, 0x7d, 0x68, 0xb2, 0x32, 0xe1, 0xad, - 0x97, 0xac, 0x4a, 0x5b, 0xae, 0x55, 0xdb, 0x71, 0xb9, 0x46, 0x3b, 0x73, 0xf5, 0xa1, 0xf9, 0xb9, - 0x16, 0x6d, 0xa7, 0xbd, 0x69, 0xd7, 0x60, 0xd8, 0x33, 0x89, 0x8d, 0x8a, 0x90, 0x70, 0xf8, 0x6f, - 0x6e, 0x61, 0xb9, 0xb3, 0x85, 0x05, 0x19, 0xb7, 0xb2, 0x4b, 0x29, 0xff, 0x99, 0x04, 0xe0, 0xf9, - 0xec, 0x4f, 0xa7, 0x8b, 0x91, 0x50, 0xce, 0x03, 0x6f, 0xf4, 0x40, 0xa9, 0x1a, 0xa7, 0x0e, 0xd9, - 0xf3, 0xe7, 0x22, 0x30, 0xb1, 0x21, 0x22, 0xcf, 0x4f, 0xbd, 0x0d, 0x56, 0x61, 0x08, 0xeb, 0x8e, - 0xa5, 0x51, 0x23, 0x90, 0xde, 0x7e, 0xa4, 0x53, 0x6f, 0xb7, 0xd1, 0x89, 0x7e, 0x44, 0x4a, 0x6c, - 0xba, 0x73, 0x36, 0x21, 0x6b, 0xfc, 0x42, 0x14, 0x32, 0x9d, 0x28, 0xd1, 0x1c, 0x8c, 0x55, 0x2c, - 0xcc, 0x2e, 0x5e, 0xf9, 0x77, 0xfe, 0x0a, 0x59, 0x2f, 0xb3, 0x0c, 0x21, 0xc8, 0xca, 0xa8, 0x80, - 0xf0, 0xd9, 0xa3, 0x06, 0x24, 0xed, 0x23, 0x6e, 0x47, 0xef, 0x6f, 0xf5, 0x97, 0xe7, 0xc9, 0x7c, - 0xfa, 0x10, 0x8d, 0x04, 0x19, 0xb0, 0xf9, 0x63, 0xd4, 0x83, 0xd2, 0x09, 0xe4, 0x25, 0x18, 0xd3, - 0x74, 0xcd, 0xd1, 0xd4, 0x7a, 0x79, 0x53, 0xad, 0xab, 0x7a, 0xe5, 0x20, 0x59, 0x33, 0x0b, 0xf9, - 0xbc, 0xd9, 0x10, 0x3b, 0x59, 0x19, 0xe5, 0x90, 0x02, 0x03, 0xa0, 0x8b, 0x30, 0x24, 0x9a, 0x8a, - 0x1d, 0x28, 0xdb, 0x10, 0xe4, 0xbe, 0x04, 0xef, 0xe7, 0xa3, 0x30, 0xae, 0xe0, 0xea, 0xff, 0xef, - 0x8a, 0xfd, 0x75, 0xc5, 0x12, 0x00, 0x1b, 0xee, 0x24, 0xc0, 0x1e, 0xa0, 0x37, 0x48, 0xc0, 0x48, - 0x32, 0x0e, 0x45, 0xdb, 0xf1, 0xf5, 0xc7, 0xcd, 0x08, 0xa4, 0xfc, 0xfd, 0xf1, 0x17, 0x74, 0x56, - 0x42, 0x0b, 0x5e, 0x24, 0x8a, 0xf1, 0x4f, 0xef, 0x76, 0x88, 0x44, 0x2d, 0xde, 0xdb, 0x3d, 0x04, - 0xfd, 0x8f, 0x08, 0x0c, 0xae, 0xaa, 0x96, 0xda, 0xb0, 0x51, 0xa5, 0x25, 0xd3, 0x14, 0xdb, 0x8f, - 0x2d, 0x1f, 0x58, 0xe7, 0xbb, 0x1d, 0x3d, 0x12, 0xcd, 0x8f, 0xb6, 0x49, 0x34, 0xdf, 0x02, 0xa3, - 0x64, 0x39, 0xec, 0xbb, 0xc2, 0x40, 0xac, 0x3d, 0x52, 0x38, 0xea, 0x71, 0x09, 0xd6, 0xb3, 0xd5, - 0xf2, 0x65, 0xff, 0x1d, 0x86, 0x61, 0x82, 0xe1, 0x05, 0x66, 0x42, 0x7e, 0xd8, 0x5b, 0x96, 0xfa, - 0x2a, 0x65, 0x05, 0x1a, 0xea, 0x6e, 0x89, 0x15, 0xd0, 0x22, 0xa0, 0x6d, 0x77, 0x67, 0xa4, 0xec, - 0x99, 0x93, 0xd0, 0x9f, 0xb8, 0x75, 0x73, 0xfa, 0x28, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0x71, 0x0f, - 0x28, 0xb8, 0x3d, 0x0e, 0x40, 0xf4, 0x2a, 0xb3, 0x2b, 0xdc, 0x6c, 0xb9, 0x73, 0xe8, 0xd6, 0xcd, - 0xe9, 0x71, 0xc6, 0xc5, 0xab, 0x93, 0x95, 0x24, 0x29, 0x14, 0xc9, 0x6f, 0x9f, 0x67, 0x7f, 0x5a, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x64, 0x57, + 0x95, 0x98, 0x5e, 0x7f, 0x48, 0xdd, 0x47, 0x2d, 0xa9, 0x75, 0xa5, 0x91, 0x7b, 0x7a, 0x66, 0x24, + 0xf9, 0xf9, 0x6b, 0x3c, 0xb6, 0x35, 0xf6, 0xd8, 0x33, 0xb6, 0x7b, 0x16, 0x4c, 0xb7, 0xba, 0x47, + 0x23, 0x8f, 0xbe, 0xfc, 0x24, 0x8d, 0x8d, 0x61, 0xd3, 0xf5, 0xd4, 0x7d, 0xd5, 0x7a, 0x56, 0xf7, + 0x7b, 0xcf, 0xef, 0xbd, 0x9e, 0x91, 0x06, 0x48, 0x99, 0x8f, 0x10, 0xf0, 0xd6, 0x06, 0x08, 0xa9, + 0x2c, 0x18, 0x86, 0x98, 0x65, 0x13, 0x36, 0x2c, 0xc9, 0xc2, 0x42, 0x48, 0x36, 0x49, 0x55, 0x20, + 0x55, 0x9b, 0x05, 0xf2, 0x51, 0x90, 0x6c, 0x25, 0x9b, 0xad, 0xcd, 0xb0, 0x31, 0xae, 0x84, 0x10, + 0x92, 0x65, 0x67, 0xc9, 0x66, 0x53, 0x54, 0x2a, 0xa9, 0xfb, 0xf5, 0xbe, 0xfa, 0x53, 0xf2, 0x0c, + 0xb0, 0xd9, 0xfc, 0x52, 0xdf, 0x73, 0xcf, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0x3d, 0xf7, 0xdc, 0xaf, + 0x27, 0xf8, 0xe2, 0x79, 0x98, 0xad, 0x19, 0x46, 0xad, 0x8e, 0x4f, 0x9b, 0x96, 0xe1, 0x18, 0x5b, + 0xcd, 0xed, 0xd3, 0x55, 0x6c, 0x57, 0x2c, 0xcd, 0x74, 0x0c, 0x6b, 0x8e, 0xc2, 0xd0, 0x18, 0xc3, + 0x98, 0x13, 0x18, 0xf2, 0x32, 0x8c, 0x5f, 0xd0, 0xea, 0xb8, 0xe8, 0x22, 0xae, 0x63, 0x07, 0x3d, + 0x01, 0xb1, 0x6d, 0xad, 0x8e, 0x33, 0xd2, 0x6c, 0xf4, 0xe4, 0xf0, 0x99, 0xbb, 0xe7, 0x42, 0x44, + 0x73, 0x41, 0x8a, 0x35, 0x02, 0x56, 0x28, 0x85, 0xfc, 0x7a, 0x0c, 0x26, 0xda, 0xd4, 0x22, 0x04, + 0x31, 0x5d, 0x6d, 0x10, 0x8e, 0xd2, 0xc9, 0xa4, 0x42, 0x7f, 0xa3, 0x0c, 0x0c, 0x99, 0x6a, 0x65, + 0x57, 0xad, 0xe1, 0x4c, 0x84, 0x82, 0x45, 0x11, 0x4d, 0x03, 0x54, 0xb1, 0x89, 0xf5, 0x2a, 0xd6, + 0x2b, 0xfb, 0x99, 0xe8, 0x6c, 0xf4, 0x64, 0x52, 0xf1, 0x41, 0xd0, 0x03, 0x30, 0x6e, 0x36, 0xb7, + 0xea, 0x5a, 0xa5, 0xec, 0x43, 0x83, 0xd9, 0xe8, 0xc9, 0xb8, 0x92, 0x66, 0x15, 0x45, 0x0f, 0xf9, + 0x3e, 0x18, 0xbb, 0x8a, 0xd5, 0x5d, 0x3f, 0xea, 0x30, 0x45, 0x1d, 0x25, 0x60, 0x1f, 0xe2, 0x3c, + 0xa4, 0x1a, 0xd8, 0xb6, 0xd5, 0x1a, 0x2e, 0x3b, 0xfb, 0x26, 0xce, 0xc4, 0xa8, 0xf6, 0xb3, 0x2d, + 0xda, 0x87, 0x35, 0x1f, 0xe6, 0x54, 0x1b, 0xfb, 0x26, 0x46, 0x79, 0x48, 0x62, 0xbd, 0xd9, 0x60, + 0x1c, 0xe2, 0x1d, 0xec, 0x57, 0xd2, 0x9b, 0x8d, 0x30, 0x97, 0x04, 0x21, 0xe3, 0x2c, 0x86, 0x6c, + 0x6c, 0x5d, 0xd1, 0x2a, 0x38, 0x33, 0x48, 0x19, 0xdc, 0xd7, 0xc2, 0x60, 0x9d, 0xd5, 0x87, 0x79, + 0x08, 0x3a, 0x34, 0x0f, 0x49, 0xbc, 0xe7, 0x60, 0xdd, 0xd6, 0x0c, 0x3d, 0x33, 0x44, 0x99, 0xdc, + 0xd3, 0xa6, 0x17, 0x71, 0xbd, 0x1a, 0x66, 0xe1, 0xd1, 0xa1, 0x73, 0x30, 0x64, 0x98, 0x8e, 0x66, + 0xe8, 0x76, 0x26, 0x31, 0x2b, 0x9d, 0x1c, 0x3e, 0x73, 0xbc, 0xad, 0x23, 0xac, 0x32, 0x1c, 0x45, + 0x20, 0xa3, 0x45, 0x48, 0xdb, 0x46, 0xd3, 0xaa, 0xe0, 0x72, 0xc5, 0xa8, 0xe2, 0xb2, 0xa6, 0x6f, + 0x1b, 0x99, 0x24, 0x65, 0x30, 0xd3, 0xaa, 0x08, 0x45, 0x9c, 0x37, 0xaa, 0x78, 0x51, 0xdf, 0x36, + 0x94, 0x51, 0x3b, 0x50, 0x46, 0x53, 0x30, 0x68, 0xef, 0xeb, 0x8e, 0xba, 0x97, 0x49, 0x51, 0x0f, + 0xe1, 0x25, 0xf9, 0x37, 0x07, 0x61, 0xac, 0x1f, 0x17, 0x3b, 0x0f, 0xf1, 0x6d, 0xa2, 0x65, 0x26, + 0x72, 0x10, 0x1b, 0x30, 0x9a, 0xa0, 0x11, 0x07, 0x0f, 0x69, 0xc4, 0x3c, 0x0c, 0xeb, 0xd8, 0x76, + 0x70, 0x95, 0x79, 0x44, 0xb4, 0x4f, 0x9f, 0x02, 0x46, 0xd4, 0xea, 0x52, 0xb1, 0x43, 0xb9, 0xd4, + 0x73, 0x30, 0xe6, 0x8a, 0x54, 0xb6, 0x54, 0xbd, 0x26, 0x7c, 0xf3, 0x74, 0x2f, 0x49, 0xe6, 0x4a, + 0x82, 0x4e, 0x21, 0x64, 0xca, 0x28, 0x0e, 0x94, 0x51, 0x11, 0xc0, 0xd0, 0xb1, 0xb1, 0x5d, 0xae, + 0xe2, 0x4a, 0x3d, 0x93, 0xe8, 0x60, 0xa5, 0x55, 0x82, 0xd2, 0x62, 0x25, 0x83, 0x41, 0x2b, 0x75, + 0xf4, 0xa4, 0xe7, 0x6a, 0x43, 0x1d, 0x3c, 0x65, 0x99, 0x0d, 0xb2, 0x16, 0x6f, 0xdb, 0x84, 0x51, + 0x0b, 0x13, 0xbf, 0xc7, 0x55, 0xae, 0x59, 0x92, 0x0a, 0x31, 0xd7, 0x53, 0x33, 0x85, 0x93, 0x31, + 0xc5, 0x46, 0x2c, 0x7f, 0x11, 0xdd, 0x05, 0x2e, 0xa0, 0x4c, 0xdd, 0x0a, 0x68, 0x14, 0x4a, 0x09, + 0xe0, 0x8a, 0xda, 0xc0, 0xd9, 0x6b, 0x30, 0x1a, 0x34, 0x0f, 0x9a, 0x84, 0xb8, 0xed, 0xa8, 0x96, + 0x43, 0xbd, 0x30, 0xae, 0xb0, 0x02, 0x4a, 0x43, 0x14, 0xeb, 0x55, 0x1a, 0xe5, 0xe2, 0x0a, 0xf9, + 0x89, 0xde, 0xe2, 0x29, 0x1c, 0xa5, 0x0a, 0xdf, 0xdb, 0xda, 0xa3, 0x01, 0xce, 0x61, 0xbd, 0xb3, + 0x8f, 0xc3, 0x48, 0x40, 0x81, 0x7e, 0x9b, 0x96, 0xdf, 0x09, 0x47, 0xda, 0xb2, 0x46, 0xcf, 0xc1, + 0x64, 0x53, 0xd7, 0x74, 0x07, 0x5b, 0xa6, 0x85, 0x89, 0xc7, 0xb2, 0xa6, 0x32, 0xff, 0x79, 0xa8, + 0x83, 0xcf, 0x6d, 0xfa, 0xb1, 0x19, 0x17, 0x65, 0xa2, 0xd9, 0x0a, 0x3c, 0x95, 0x4c, 0x7c, 0x6f, + 0x28, 0xfd, 0xd2, 0x4b, 0x2f, 0xbd, 0x14, 0x91, 0xbf, 0x36, 0x08, 0x93, 0xed, 0xc6, 0x4c, 0xdb, + 0xe1, 0x3b, 0x05, 0x83, 0x7a, 0xb3, 0xb1, 0x85, 0x2d, 0x6a, 0xa4, 0xb8, 0xc2, 0x4b, 0x28, 0x0f, + 0xf1, 0xba, 0xba, 0x85, 0xeb, 0x99, 0xd8, 0xac, 0x74, 0x72, 0xf4, 0xcc, 0x03, 0x7d, 0x8d, 0xca, + 0xb9, 0x25, 0x42, 0xa2, 0x30, 0x4a, 0xf4, 0x66, 0x88, 0xf1, 0x10, 0x4d, 0x38, 0x9c, 0xea, 0x8f, + 0x03, 0x19, 0x4b, 0x0a, 0xa5, 0x43, 0xc7, 0x20, 0x49, 0xfe, 0x32, 0xdf, 0x18, 0xa4, 0x32, 0x27, + 0x08, 0x80, 0xf8, 0x05, 0xca, 0x42, 0x82, 0x0e, 0x93, 0x2a, 0x16, 0x53, 0x9b, 0x5b, 0x26, 0x8e, + 0x55, 0xc5, 0xdb, 0x6a, 0xb3, 0xee, 0x94, 0xaf, 0xa8, 0xf5, 0x26, 0xa6, 0x0e, 0x9f, 0x54, 0x52, + 0x1c, 0x78, 0x99, 0xc0, 0xd0, 0x0c, 0x0c, 0xb3, 0x51, 0xa5, 0xe9, 0x55, 0xbc, 0x47, 0xa3, 0x67, + 0x5c, 0x61, 0x03, 0x6d, 0x91, 0x40, 0x48, 0xf3, 0x2f, 0xd8, 0x86, 0x2e, 0x5c, 0x93, 0x36, 0x41, + 0x00, 0xb4, 0xf9, 0xc7, 0xc3, 0x81, 0xfb, 0x44, 0x7b, 0xf5, 0x5a, 0xc6, 0xd2, 0x7d, 0x30, 0x46, + 0x31, 0x1e, 0xe5, 0x5d, 0xaf, 0xd6, 0x33, 0xe3, 0xb3, 0xd2, 0xc9, 0x84, 0x32, 0xca, 0xc0, 0xab, + 0x1c, 0x2a, 0x7f, 0x25, 0x02, 0x31, 0x1a, 0x58, 0xc6, 0x60, 0x78, 0xe3, 0xad, 0x6b, 0xa5, 0x72, + 0x71, 0x75, 0xb3, 0xb0, 0x54, 0x4a, 0x4b, 0x68, 0x14, 0x80, 0x02, 0x2e, 0x2c, 0xad, 0xe6, 0x37, + 0xd2, 0x11, 0xb7, 0xbc, 0xb8, 0xb2, 0x71, 0xee, 0xb1, 0x74, 0xd4, 0x25, 0xd8, 0x64, 0x80, 0x98, + 0x1f, 0xe1, 0xd1, 0x33, 0xe9, 0x38, 0x4a, 0x43, 0x8a, 0x31, 0x58, 0x7c, 0xae, 0x54, 0x3c, 0xf7, + 0x58, 0x7a, 0x30, 0x08, 0x79, 0xf4, 0x4c, 0x7a, 0x08, 0x8d, 0x40, 0x92, 0x42, 0x0a, 0xab, 0xab, + 0x4b, 0xe9, 0x84, 0xcb, 0x73, 0x7d, 0x43, 0x59, 0x5c, 0x59, 0x48, 0x27, 0x5d, 0x9e, 0x0b, 0xca, + 0xea, 0xe6, 0x5a, 0x1a, 0x5c, 0x0e, 0xcb, 0xa5, 0xf5, 0xf5, 0xfc, 0x42, 0x29, 0x3d, 0xec, 0x62, + 0x14, 0xde, 0xba, 0x51, 0x5a, 0x4f, 0xa7, 0x02, 0x62, 0x3d, 0x7a, 0x26, 0x3d, 0xe2, 0x36, 0x51, + 0x5a, 0xd9, 0x5c, 0x4e, 0x8f, 0xa2, 0x71, 0x18, 0x61, 0x4d, 0x08, 0x21, 0xc6, 0x42, 0xa0, 0x73, + 0x8f, 0xa5, 0xd3, 0x9e, 0x20, 0x8c, 0xcb, 0x78, 0x00, 0x70, 0xee, 0xb1, 0x34, 0x92, 0xe7, 0x21, + 0x4e, 0xdd, 0x10, 0x21, 0x18, 0x5d, 0xca, 0x17, 0x4a, 0x4b, 0xe5, 0xd5, 0xb5, 0x8d, 0xc5, 0xd5, + 0x95, 0xfc, 0x52, 0x5a, 0xf2, 0x60, 0x4a, 0xe9, 0x99, 0xcd, 0x45, 0xa5, 0x54, 0x4c, 0x47, 0xfc, + 0xb0, 0xb5, 0x52, 0x7e, 0xa3, 0x54, 0x4c, 0x47, 0xe5, 0x0a, 0x4c, 0xb6, 0x0b, 0xa8, 0x6d, 0x87, + 0x90, 0xcf, 0x17, 0x22, 0x1d, 0x7c, 0x81, 0xf2, 0x0a, 0xfb, 0x82, 0xfc, 0xdd, 0x08, 0x4c, 0xb4, + 0x99, 0x54, 0xda, 0x36, 0xf2, 0x14, 0xc4, 0x99, 0x2f, 0xb3, 0x69, 0xf6, 0xfe, 0xb6, 0xb3, 0x13, + 0xf5, 0xec, 0x96, 0xa9, 0x96, 0xd2, 0xf9, 0x53, 0x8d, 0x68, 0x87, 0x54, 0x83, 0xb0, 0x68, 0x71, + 0xd8, 0x9f, 0x6f, 0x09, 0xfe, 0x6c, 0x7e, 0x3c, 0xd7, 0xcf, 0xfc, 0x48, 0x61, 0x07, 0x9b, 0x04, + 0xe2, 0x6d, 0x26, 0x81, 0xf3, 0x30, 0xde, 0xc2, 0xa8, 0xef, 0x60, 0xfc, 0x5e, 0x09, 0x32, 0x9d, + 0x8c, 0xd3, 0x23, 0x24, 0x46, 0x02, 0x21, 0xf1, 0x7c, 0xd8, 0x82, 0x77, 0x76, 0xee, 0x84, 0x96, + 0xbe, 0xfe, 0xac, 0x04, 0x53, 0xed, 0x53, 0xca, 0xb6, 0x32, 0xbc, 0x19, 0x06, 0x1b, 0xd8, 0xd9, + 0x31, 0x44, 0x5a, 0x75, 0x6f, 0x9b, 0xc9, 0x9a, 0x54, 0x87, 0x3b, 0x9b, 0x53, 0xf9, 0x67, 0xfb, + 0x68, 0xa7, 0xbc, 0x90, 0x49, 0xd3, 0x22, 0xe9, 0x07, 0x23, 0x70, 0xa4, 0x2d, 0xf3, 0xb6, 0x82, + 0x9e, 0x00, 0xd0, 0x74, 0xb3, 0xe9, 0xb0, 0xd4, 0x89, 0x45, 0xe2, 0x24, 0x85, 0xd0, 0xe0, 0x45, + 0xa2, 0x6c, 0xd3, 0x71, 0xeb, 0xa3, 0xb4, 0x1e, 0x18, 0x88, 0x22, 0x3c, 0xe1, 0x09, 0x1a, 0xa3, + 0x82, 0x4e, 0x77, 0xd0, 0xb4, 0xc5, 0x31, 0x1f, 0x86, 0x74, 0xa5, 0xae, 0x61, 0xdd, 0x29, 0xdb, + 0x8e, 0x85, 0xd5, 0x86, 0xa6, 0xd7, 0xe8, 0x54, 0x93, 0xc8, 0xc5, 0xb7, 0xd5, 0xba, 0x8d, 0x95, + 0x31, 0x56, 0xbd, 0x2e, 0x6a, 0x09, 0x05, 0x75, 0x20, 0xcb, 0x47, 0x31, 0x18, 0xa0, 0x60, 0xd5, + 0x2e, 0x85, 0xfc, 0x91, 0x24, 0x0c, 0xfb, 0x12, 0x70, 0x74, 0x27, 0xa4, 0x5e, 0x50, 0xaf, 0xa8, + 0x65, 0xb1, 0xa8, 0x62, 0x96, 0x18, 0x26, 0xb0, 0x35, 0xbe, 0xb0, 0x7a, 0x18, 0x26, 0x29, 0x8a, + 0xd1, 0x74, 0xb0, 0x55, 0xae, 0xd4, 0x55, 0xdb, 0xa6, 0x46, 0x4b, 0x50, 0x54, 0x44, 0xea, 0x56, + 0x49, 0xd5, 0xbc, 0xa8, 0x41, 0x67, 0x61, 0x82, 0x52, 0x34, 0x9a, 0x75, 0x47, 0x33, 0xeb, 0xb8, + 0x4c, 0x96, 0x79, 0x36, 0x9d, 0x72, 0x5c, 0xc9, 0xc6, 0x09, 0xc6, 0x32, 0x47, 0x20, 0x12, 0xd9, + 0xa8, 0x08, 0x27, 0x28, 0x59, 0x0d, 0xeb, 0xd8, 0x52, 0x1d, 0x5c, 0xc6, 0x2f, 0x36, 0xd5, 0xba, + 0x5d, 0x56, 0xf5, 0x6a, 0x79, 0x47, 0xb5, 0x77, 0x32, 0x93, 0x84, 0x41, 0x21, 0x92, 0x91, 0x94, + 0xa3, 0x04, 0x71, 0x81, 0xe3, 0x95, 0x28, 0x5a, 0x5e, 0xaf, 0x5e, 0x54, 0xed, 0x1d, 0x94, 0x83, + 0x29, 0xca, 0xc5, 0x76, 0x2c, 0x4d, 0xaf, 0x95, 0x2b, 0x3b, 0xb8, 0xb2, 0x5b, 0x6e, 0x3a, 0xdb, + 0x4f, 0x64, 0x8e, 0xf9, 0xdb, 0xa7, 0x12, 0xae, 0x53, 0x9c, 0x79, 0x82, 0xb2, 0xe9, 0x6c, 0x3f, + 0x81, 0xd6, 0x21, 0x45, 0x3a, 0xa3, 0xa1, 0x5d, 0xc3, 0xe5, 0x6d, 0xc3, 0xa2, 0x73, 0xe8, 0x68, + 0x9b, 0xd0, 0xe4, 0xb3, 0xe0, 0xdc, 0x2a, 0x27, 0x58, 0x36, 0xaa, 0x38, 0x17, 0x5f, 0x5f, 0x2b, + 0x95, 0x8a, 0xca, 0xb0, 0xe0, 0x72, 0xc1, 0xb0, 0x88, 0x43, 0xd5, 0x0c, 0xd7, 0xc0, 0xc3, 0xcc, + 0xa1, 0x6a, 0x86, 0x30, 0xef, 0x59, 0x98, 0xa8, 0x54, 0x98, 0xce, 0x5a, 0xa5, 0xcc, 0x17, 0x63, + 0x76, 0x26, 0x1d, 0x30, 0x56, 0xa5, 0xb2, 0xc0, 0x10, 0xb8, 0x8f, 0xdb, 0xe8, 0x49, 0x38, 0xe2, + 0x19, 0xcb, 0x4f, 0x38, 0xde, 0xa2, 0x65, 0x98, 0xf4, 0x2c, 0x4c, 0x98, 0xfb, 0xad, 0x84, 0x28, + 0xd0, 0xa2, 0xb9, 0x1f, 0x26, 0x7b, 0x1c, 0x26, 0xcd, 0x1d, 0xb3, 0x95, 0xee, 0x94, 0x9f, 0x0e, + 0x99, 0x3b, 0x66, 0x98, 0xf0, 0x1e, 0xba, 0x32, 0xb7, 0x70, 0x45, 0x75, 0x70, 0x35, 0x73, 0x87, + 0x1f, 0xdd, 0x57, 0x81, 0xe6, 0x20, 0x5d, 0xa9, 0x94, 0xb1, 0xae, 0x6e, 0xd5, 0x71, 0x59, 0xb5, + 0xb0, 0xae, 0xda, 0x99, 0x19, 0x8a, 0x1c, 0x73, 0xac, 0x26, 0x56, 0x46, 0x2b, 0x95, 0x12, 0xad, + 0xcc, 0xd3, 0x3a, 0x74, 0x0a, 0xc6, 0x8d, 0xad, 0x17, 0x2a, 0xcc, 0x23, 0xcb, 0xa6, 0x85, 0xb7, + 0xb5, 0xbd, 0xcc, 0xdd, 0xd4, 0xbc, 0x63, 0xa4, 0x82, 0xfa, 0xe3, 0x1a, 0x05, 0xa3, 0xfb, 0x21, + 0x5d, 0xb1, 0x77, 0x54, 0xcb, 0xa4, 0x21, 0xd9, 0x36, 0xd5, 0x0a, 0xce, 0xdc, 0xc3, 0x50, 0x19, + 0x7c, 0x45, 0x80, 0xc9, 0x88, 0xb0, 0xaf, 0x6a, 0xdb, 0x8e, 0xe0, 0x78, 0x1f, 0x1b, 0x11, 0x14, + 0xc6, 0xb9, 0x9d, 0x84, 0x34, 0xb1, 0x44, 0xa0, 0xe1, 0x93, 0x14, 0x6d, 0xd4, 0xdc, 0x31, 0xfd, + 0xed, 0xde, 0x05, 0x23, 0x04, 0xd3, 0x6b, 0xf4, 0x7e, 0x96, 0xb8, 0x99, 0x3b, 0xbe, 0x16, 0x1f, + 0x83, 0x29, 0x82, 0xd4, 0xc0, 0x8e, 0x5a, 0x55, 0x1d, 0xd5, 0x87, 0xfd, 0x20, 0xc5, 0x26, 0x66, + 0x5f, 0xe6, 0x95, 0x01, 0x39, 0xad, 0xe6, 0xd6, 0xbe, 0xeb, 0x58, 0x0f, 0x31, 0x39, 0x09, 0x4c, + 0xb8, 0xd6, 0x6d, 0x4b, 0xce, 0xe5, 0x1c, 0xa4, 0xfc, 0x7e, 0x8f, 0x92, 0xc0, 0x3c, 0x3f, 0x2d, + 0x91, 0x24, 0x68, 0x7e, 0xb5, 0x48, 0xd2, 0x97, 0xe7, 0x4b, 0xe9, 0x08, 0x49, 0xa3, 0x96, 0x16, + 0x37, 0x4a, 0x65, 0x65, 0x73, 0x65, 0x63, 0x71, 0xb9, 0x94, 0x8e, 0xfa, 0x12, 0xfb, 0xa7, 0x63, + 0x89, 0x7b, 0xd3, 0xf7, 0xc9, 0xdf, 0x8e, 0xc0, 0x68, 0x70, 0xa5, 0x86, 0x7e, 0x0e, 0xee, 0x10, + 0xdb, 0x2a, 0x36, 0x76, 0xca, 0x57, 0x35, 0x8b, 0x0e, 0xc8, 0x86, 0xca, 0x26, 0x47, 0xd7, 0x7f, + 0x26, 0x39, 0xd6, 0x3a, 0x76, 0x9e, 0xd5, 0x2c, 0x32, 0xdc, 0x1a, 0xaa, 0x83, 0x96, 0x60, 0x46, + 0x37, 0xca, 0xb6, 0xa3, 0xea, 0x55, 0xd5, 0xaa, 0x96, 0xbd, 0x0d, 0xad, 0xb2, 0x5a, 0xa9, 0x60, + 0xdb, 0x36, 0xd8, 0x44, 0xe8, 0x72, 0x39, 0xae, 0x1b, 0xeb, 0x1c, 0xd9, 0x9b, 0x21, 0xf2, 0x1c, + 0x35, 0xe4, 0xbe, 0xd1, 0x4e, 0xee, 0x7b, 0x0c, 0x92, 0x0d, 0xd5, 0x2c, 0x63, 0xdd, 0xb1, 0xf6, + 0x69, 0x7e, 0x9e, 0x50, 0x12, 0x0d, 0xd5, 0x2c, 0x91, 0xf2, 0x4f, 0x64, 0x99, 0xf4, 0x74, 0x2c, + 0x91, 0x48, 0x27, 0x9f, 0x8e, 0x25, 0x92, 0x69, 0x90, 0x5f, 0x8b, 0x42, 0xca, 0x9f, 0xaf, 0x93, + 0xe5, 0x4f, 0x85, 0xce, 0x58, 0x12, 0x8d, 0x69, 0x77, 0x75, 0xcd, 0xee, 0xe7, 0xe6, 0xc9, 0x54, + 0x96, 0x1b, 0x64, 0xc9, 0xb1, 0xc2, 0x28, 0x49, 0x1a, 0x41, 0x9c, 0x0d, 0xb3, 0x64, 0x24, 0xa1, + 0xf0, 0x12, 0x5a, 0x80, 0xc1, 0x17, 0x6c, 0xca, 0x7b, 0x90, 0xf2, 0xbe, 0xbb, 0x3b, 0xef, 0xa7, + 0xd7, 0x29, 0xf3, 0xe4, 0xd3, 0xeb, 0xe5, 0x95, 0x55, 0x65, 0x39, 0xbf, 0xa4, 0x70, 0x72, 0x74, + 0x14, 0x62, 0x75, 0xf5, 0xda, 0x7e, 0x70, 0xd2, 0xa3, 0xa0, 0x7e, 0x3b, 0xe1, 0x28, 0xc4, 0xae, + 0x62, 0x75, 0x37, 0x38, 0xd5, 0x50, 0xd0, 0x6d, 0x1c, 0x0c, 0xa7, 0x21, 0x4e, 0xed, 0x85, 0x00, + 0xb8, 0xc5, 0xd2, 0x03, 0x28, 0x01, 0xb1, 0xf9, 0x55, 0x85, 0x0c, 0x88, 0x34, 0xa4, 0x18, 0xb4, + 0xbc, 0xb6, 0x58, 0x9a, 0x2f, 0xa5, 0x23, 0xf2, 0x59, 0x18, 0x64, 0x46, 0x20, 0x83, 0xc5, 0x35, + 0x43, 0x7a, 0x80, 0x17, 0x39, 0x0f, 0x49, 0xd4, 0x6e, 0x2e, 0x17, 0x4a, 0x4a, 0x3a, 0x12, 0xec, + 0xea, 0x58, 0x3a, 0x2e, 0xdb, 0x90, 0xf2, 0xe7, 0xe1, 0x3f, 0x99, 0xc5, 0xf8, 0x57, 0x25, 0x18, + 0xf6, 0xe5, 0xd5, 0x24, 0x21, 0x52, 0xeb, 0x75, 0xe3, 0x6a, 0x59, 0xad, 0x6b, 0xaa, 0xcd, 0x5d, + 0x03, 0x28, 0x28, 0x4f, 0x20, 0xfd, 0x76, 0xdd, 0x4f, 0x68, 0x88, 0xc4, 0xd3, 0x83, 0xf2, 0xa7, + 0x24, 0x48, 0x87, 0x13, 0xdb, 0x90, 0x98, 0xd2, 0x4f, 0x53, 0x4c, 0xf9, 0x93, 0x12, 0x8c, 0x06, + 0xb3, 0xd9, 0x90, 0x78, 0x77, 0xfe, 0x54, 0xc5, 0xfb, 0x83, 0x08, 0x8c, 0x04, 0x72, 0xd8, 0x7e, + 0xa5, 0x7b, 0x11, 0xc6, 0xb5, 0x2a, 0x6e, 0x98, 0x86, 0x83, 0xf5, 0xca, 0x7e, 0xb9, 0x8e, 0xaf, + 0xe0, 0x7a, 0x46, 0xa6, 0x41, 0xe3, 0x74, 0xf7, 0x2c, 0x79, 0x6e, 0xd1, 0xa3, 0x5b, 0x22, 0x64, + 0xb9, 0x89, 0xc5, 0x62, 0x69, 0x79, 0x6d, 0x75, 0xa3, 0xb4, 0x32, 0xff, 0xd6, 0xf2, 0xe6, 0xca, + 0xa5, 0x95, 0xd5, 0x67, 0x57, 0x94, 0xb4, 0x16, 0x42, 0xbb, 0x8d, 0xc3, 0x7e, 0x0d, 0xd2, 0x61, + 0xa1, 0xd0, 0x1d, 0xd0, 0x4e, 0xac, 0xf4, 0x00, 0x9a, 0x80, 0xb1, 0x95, 0xd5, 0xf2, 0xfa, 0x62, + 0xb1, 0x54, 0x2e, 0x5d, 0xb8, 0x50, 0x9a, 0xdf, 0x58, 0x67, 0xfb, 0x1e, 0x2e, 0xf6, 0x46, 0x60, + 0x80, 0xcb, 0xaf, 0x44, 0x61, 0xa2, 0x8d, 0x24, 0x28, 0xcf, 0x57, 0x2c, 0x6c, 0x11, 0xf5, 0x50, + 0x3f, 0xd2, 0xcf, 0x91, 0x9c, 0x61, 0x4d, 0xb5, 0x1c, 0xbe, 0xc0, 0xb9, 0x1f, 0x88, 0x95, 0x74, + 0x47, 0xdb, 0xd6, 0xb0, 0xc5, 0xf7, 0x93, 0xd8, 0x32, 0x66, 0xcc, 0x83, 0xb3, 0x2d, 0xa5, 0x07, + 0x01, 0x99, 0x86, 0xad, 0x39, 0xda, 0x15, 0x5c, 0xd6, 0x74, 0xb1, 0xf9, 0x44, 0x96, 0x35, 0x31, + 0x25, 0x2d, 0x6a, 0x16, 0x75, 0xc7, 0xc5, 0xd6, 0x71, 0x4d, 0x0d, 0x61, 0x93, 0x60, 0x1e, 0x55, + 0xd2, 0xa2, 0xc6, 0xc5, 0xbe, 0x13, 0x52, 0x55, 0xa3, 0x49, 0x72, 0x3d, 0x86, 0x47, 0xe6, 0x0e, + 0x49, 0x19, 0x66, 0x30, 0x17, 0x85, 0x67, 0xf1, 0xde, 0xae, 0x57, 0x4a, 0x19, 0x66, 0x30, 0x86, + 0x72, 0x1f, 0x8c, 0xa9, 0xb5, 0x9a, 0x45, 0x98, 0x0b, 0x46, 0x6c, 0x5d, 0x32, 0xea, 0x82, 0x29, + 0x62, 0xf6, 0x69, 0x48, 0x08, 0x3b, 0x90, 0xa9, 0x9a, 0x58, 0xa2, 0x6c, 0xb2, 0xc5, 0x76, 0xe4, + 0x64, 0x52, 0x49, 0xe8, 0xa2, 0xf2, 0x4e, 0x48, 0x69, 0x76, 0xd9, 0xdb, 0xc4, 0x8f, 0xcc, 0x46, + 0x4e, 0x26, 0x94, 0x61, 0xcd, 0x76, 0x37, 0x40, 0xe5, 0xcf, 0x46, 0x60, 0x34, 0x78, 0x08, 0x81, + 0x8a, 0x90, 0xa8, 0x1b, 0x15, 0x95, 0xba, 0x16, 0x3b, 0x01, 0x3b, 0xd9, 0xe3, 0xdc, 0x62, 0x6e, + 0x89, 0xe3, 0x2b, 0x2e, 0x65, 0xf6, 0x5f, 0x49, 0x90, 0x10, 0x60, 0x34, 0x05, 0x31, 0x53, 0x75, + 0x76, 0x28, 0xbb, 0x78, 0x21, 0x92, 0x96, 0x14, 0x5a, 0x26, 0x70, 0xdb, 0x54, 0x75, 0xea, 0x02, + 0x1c, 0x4e, 0xca, 0xa4, 0x5f, 0xeb, 0x58, 0xad, 0xd2, 0x45, 0x8f, 0xd1, 0x68, 0x60, 0xdd, 0xb1, + 0x45, 0xbf, 0x72, 0xf8, 0x3c, 0x07, 0xa3, 0x07, 0x60, 0xdc, 0xb1, 0x54, 0xad, 0x1e, 0xc0, 0x8d, + 0x51, 0xdc, 0xb4, 0xa8, 0x70, 0x91, 0x73, 0x70, 0x54, 0xf0, 0xad, 0x62, 0x47, 0xad, 0xec, 0xe0, + 0xaa, 0x47, 0x34, 0x48, 0x37, 0x37, 0xee, 0xe0, 0x08, 0x45, 0x5e, 0x2f, 0x68, 0xe5, 0x6f, 0x4b, + 0x30, 0x2e, 0x96, 0x69, 0x55, 0xd7, 0x58, 0xcb, 0x00, 0xaa, 0xae, 0x1b, 0x8e, 0xdf, 0x5c, 0xad, + 0xae, 0xdc, 0x42, 0x37, 0x97, 0x77, 0x89, 0x14, 0x1f, 0x83, 0x6c, 0x03, 0xc0, 0xab, 0xe9, 0x68, + 0xb6, 0x19, 0x18, 0xe6, 0x27, 0x4c, 0xf4, 0x98, 0x92, 0x2d, 0xec, 0x81, 0x81, 0xc8, 0x7a, 0x0e, + 0x4d, 0x42, 0x7c, 0x0b, 0xd7, 0x34, 0x9d, 0xef, 0x1b, 0xb3, 0x82, 0xd8, 0x7e, 0x89, 0xb9, 0xdb, + 0x2f, 0x85, 0xbf, 0x08, 0x13, 0x15, 0xa3, 0x11, 0x16, 0xb7, 0x90, 0x0e, 0x6d, 0x2e, 0xd8, 0x17, + 0xa5, 0xe7, 0x1f, 0xe2, 0x48, 0x35, 0xa3, 0xae, 0xea, 0xb5, 0x39, 0xc3, 0xaa, 0x79, 0xc7, 0xac, + 0x24, 0xe3, 0xb1, 0x7d, 0x87, 0xad, 0xe6, 0xd6, 0x9f, 0x4a, 0xd2, 0x2f, 0x47, 0xa2, 0x0b, 0x6b, + 0x85, 0xcf, 0x45, 0xb2, 0x0b, 0x8c, 0x70, 0x4d, 0x18, 0x43, 0xc1, 0xdb, 0x75, 0x5c, 0x21, 0x0a, + 0xc2, 0xf7, 0x1f, 0x80, 0xc9, 0x9a, 0x51, 0x33, 0x28, 0xa7, 0xd3, 0xe4, 0x17, 0x3f, 0xa7, 0x4d, + 0xba, 0xd0, 0x6c, 0xcf, 0x43, 0xdd, 0xdc, 0x0a, 0x4c, 0x70, 0xe4, 0x32, 0x3d, 0x28, 0x62, 0xcb, + 0x18, 0xd4, 0x75, 0x0f, 0x2d, 0xf3, 0xc5, 0xd7, 0xe9, 0xf4, 0xad, 0x8c, 0x73, 0x52, 0x52, 0xc7, + 0x56, 0x3a, 0x39, 0x05, 0x8e, 0x04, 0xf8, 0xb1, 0x41, 0x8a, 0xad, 0x1e, 0x1c, 0x7f, 0x8b, 0x73, + 0x9c, 0xf0, 0x71, 0x5c, 0xe7, 0xa4, 0xb9, 0x79, 0x18, 0x39, 0x08, 0xaf, 0x7f, 0xc6, 0x79, 0xa5, + 0xb0, 0x9f, 0xc9, 0x02, 0x8c, 0x51, 0x26, 0x95, 0xa6, 0xed, 0x18, 0x0d, 0x1a, 0x01, 0xbb, 0xb3, + 0xf9, 0xed, 0xd7, 0xd9, 0xa8, 0x19, 0x25, 0x64, 0xf3, 0x2e, 0x55, 0x2e, 0x07, 0xf4, 0x6c, 0xac, + 0x8a, 0x2b, 0xf5, 0x1e, 0x1c, 0xbe, 0xce, 0x05, 0x71, 0xf1, 0x73, 0x97, 0x61, 0x92, 0xfc, 0xa6, + 0x01, 0xca, 0x2f, 0x49, 0xef, 0x0d, 0xb7, 0xcc, 0xb7, 0xdf, 0xcb, 0x06, 0xe6, 0x84, 0xcb, 0xc0, + 0x27, 0x93, 0xaf, 0x17, 0x6b, 0xd8, 0x71, 0xb0, 0x65, 0x97, 0xd5, 0x7a, 0x3b, 0xf1, 0x7c, 0x3b, + 0x16, 0x99, 0x8f, 0xff, 0x20, 0xd8, 0x8b, 0x0b, 0x8c, 0x32, 0x5f, 0xaf, 0xe7, 0x36, 0xe1, 0x8e, + 0x36, 0x5e, 0xd1, 0x07, 0xcf, 0x57, 0x38, 0xcf, 0xc9, 0x16, 0xcf, 0x20, 0x6c, 0xd7, 0x40, 0xc0, + 0xdd, 0xbe, 0xec, 0x83, 0xe7, 0x27, 0x38, 0x4f, 0xc4, 0x69, 0x45, 0x97, 0x12, 0x8e, 0x4f, 0xc3, + 0xf8, 0x15, 0x6c, 0x6d, 0x19, 0x36, 0xdf, 0x25, 0xea, 0x83, 0xdd, 0x27, 0x39, 0xbb, 0x31, 0x4e, + 0x48, 0xb7, 0x8d, 0x08, 0xaf, 0x27, 0x21, 0xb1, 0xad, 0x56, 0x70, 0x1f, 0x2c, 0xae, 0x73, 0x16, + 0x43, 0x04, 0x9f, 0x90, 0xe6, 0x21, 0x55, 0x33, 0xf8, 0x1c, 0xd5, 0x9b, 0xfc, 0x53, 0x9c, 0x7c, + 0x58, 0xd0, 0x70, 0x16, 0xa6, 0x61, 0x36, 0xeb, 0x64, 0x02, 0xeb, 0xcd, 0xe2, 0x6f, 0x08, 0x16, + 0x82, 0x86, 0xb3, 0x38, 0x80, 0x59, 0x5f, 0x15, 0x2c, 0x6c, 0x9f, 0x3d, 0x9f, 0x82, 0x61, 0x43, + 0xaf, 0xef, 0x1b, 0x7a, 0x3f, 0x42, 0x7c, 0x9a, 0x73, 0x00, 0x4e, 0x42, 0x18, 0x9c, 0x87, 0x64, + 0xbf, 0x1d, 0xf1, 0x37, 0x7f, 0x20, 0x86, 0x87, 0xe8, 0x81, 0x05, 0x18, 0x13, 0x01, 0x4a, 0x33, + 0xf4, 0x3e, 0x58, 0xfc, 0x2d, 0xce, 0x62, 0xd4, 0x47, 0xc6, 0xd5, 0x70, 0xb0, 0xed, 0xd4, 0x70, + 0x3f, 0x4c, 0x3e, 0x2b, 0xd4, 0xe0, 0x24, 0xdc, 0x94, 0x5b, 0x58, 0xaf, 0xec, 0xf4, 0xc7, 0xe1, + 0x57, 0x85, 0x29, 0x05, 0x0d, 0x61, 0x31, 0x0f, 0x23, 0x0d, 0xd5, 0xb2, 0x77, 0xd4, 0x7a, 0x5f, + 0xdd, 0xf1, 0xb7, 0x39, 0x8f, 0x94, 0x4b, 0xc4, 0x2d, 0xd2, 0xd4, 0x0f, 0xc2, 0xe6, 0x73, 0xc2, + 0x22, 0x3e, 0x32, 0x3e, 0xf4, 0x6c, 0x87, 0x6e, 0xa9, 0x1d, 0x84, 0xdb, 0xaf, 0x89, 0xa1, 0xc7, + 0x68, 0x97, 0xfd, 0x1c, 0xcf, 0x43, 0xd2, 0xd6, 0xae, 0xf5, 0xc5, 0xe6, 0xf3, 0xa2, 0xa7, 0x29, + 0x01, 0x21, 0x7e, 0x2b, 0x1c, 0x6d, 0x3b, 0x4d, 0xf4, 0xc1, 0xec, 0xef, 0x70, 0x66, 0x53, 0x6d, + 0xa6, 0x0a, 0x1e, 0x12, 0x0e, 0xca, 0xf2, 0xef, 0x8a, 0x90, 0x80, 0x43, 0xbc, 0xd6, 0xc8, 0xaa, + 0xc1, 0x56, 0xb7, 0x0f, 0x66, 0xb5, 0x5f, 0x17, 0x56, 0x63, 0xb4, 0x01, 0xab, 0x6d, 0xc0, 0x14, + 0xe7, 0x78, 0xb0, 0x7e, 0xfd, 0x82, 0x08, 0xac, 0x8c, 0x7a, 0x33, 0xd8, 0xbb, 0x6f, 0x83, 0xac, + 0x6b, 0x4e, 0x91, 0x9e, 0xda, 0xe5, 0x86, 0x6a, 0xf6, 0xc1, 0xf9, 0x8b, 0x9c, 0xb3, 0x88, 0xf8, + 0x6e, 0x7e, 0x6b, 0x2f, 0xab, 0x26, 0x61, 0xfe, 0x1c, 0x64, 0x04, 0xf3, 0xa6, 0x6e, 0xe1, 0x8a, + 0x51, 0xd3, 0xb5, 0x6b, 0xb8, 0xda, 0x07, 0xeb, 0xdf, 0x08, 0x75, 0xd5, 0xa6, 0x8f, 0x9c, 0x70, + 0x5e, 0x84, 0xb4, 0x9b, 0xab, 0x94, 0xb5, 0x86, 0x69, 0x58, 0x4e, 0x0f, 0x8e, 0x5f, 0x12, 0x3d, + 0xe5, 0xd2, 0x2d, 0x52, 0xb2, 0x5c, 0x09, 0xd8, 0x39, 0x73, 0xbf, 0x2e, 0xf9, 0x65, 0xce, 0x68, + 0xc4, 0xa3, 0xe2, 0x81, 0xa3, 0x62, 0x34, 0x4c, 0xd5, 0xea, 0x27, 0xfe, 0xfd, 0x3d, 0x11, 0x38, + 0x38, 0x09, 0x0f, 0x1c, 0x24, 0xa3, 0x23, 0xb3, 0x7d, 0x1f, 0x1c, 0xbe, 0x22, 0x02, 0x87, 0xa0, + 0xe1, 0x2c, 0x44, 0xc2, 0xd0, 0x07, 0x8b, 0xbf, 0x2f, 0x58, 0x08, 0x1a, 0xc2, 0xe2, 0x19, 0x6f, + 0xa2, 0xb5, 0x70, 0x4d, 0xb3, 0x1d, 0x8b, 0x25, 0xc5, 0xdd, 0x59, 0xfd, 0x83, 0x1f, 0x04, 0x93, + 0x30, 0xc5, 0x47, 0x4a, 0x22, 0x11, 0xdf, 0x64, 0xa5, 0x6b, 0xa6, 0xde, 0x82, 0xfd, 0xa6, 0x88, + 0x44, 0x3e, 0x32, 0x22, 0x9b, 0x2f, 0x43, 0x24, 0x66, 0xaf, 0x90, 0x95, 0x42, 0x1f, 0xec, 0xfe, + 0x61, 0x48, 0xb8, 0x75, 0x41, 0x4b, 0x78, 0xfa, 0xf2, 0x9f, 0xa6, 0xbe, 0x8b, 0xf7, 0xfb, 0xf2, + 0xce, 0x7f, 0x14, 0xca, 0x7f, 0x36, 0x19, 0x25, 0x8b, 0x21, 0x63, 0xa1, 0x7c, 0x0a, 0xf5, 0xba, + 0x55, 0x94, 0x79, 0xf7, 0x8f, 0xb8, 0xbe, 0xc1, 0x74, 0x2a, 0xb7, 0x44, 0x9c, 0x3c, 0x98, 0xf4, + 0xf4, 0x66, 0xf6, 0xde, 0x1f, 0xb9, 0x7e, 0x1e, 0xc8, 0x79, 0x72, 0x17, 0x60, 0x24, 0x90, 0xf0, + 0xf4, 0x66, 0xf5, 0x3e, 0xce, 0x2a, 0xe5, 0xcf, 0x77, 0x72, 0x67, 0x21, 0x46, 0x92, 0x97, 0xde, + 0xe4, 0x7f, 0x89, 0x93, 0x53, 0xf4, 0xdc, 0x9b, 0x20, 0x21, 0x92, 0x96, 0xde, 0xa4, 0xef, 0xe7, + 0xa4, 0x2e, 0x09, 0x21, 0x17, 0x09, 0x4b, 0x6f, 0xf2, 0xbf, 0x2c, 0xc8, 0x05, 0x09, 0x21, 0xef, + 0xdf, 0x84, 0x5f, 0xfd, 0x85, 0x18, 0x9f, 0x74, 0x84, 0xed, 0xce, 0xc3, 0x10, 0xcf, 0x54, 0x7a, + 0x53, 0x7f, 0x90, 0x37, 0x2e, 0x28, 0x72, 0x8f, 0x43, 0xbc, 0x4f, 0x83, 0xff, 0x22, 0x27, 0x65, + 0xf8, 0xb9, 0x79, 0x18, 0xf6, 0x65, 0x27, 0xbd, 0xc9, 0xff, 0x0a, 0x27, 0xf7, 0x53, 0x11, 0xd1, + 0x79, 0x76, 0xd2, 0x9b, 0xc1, 0x87, 0x84, 0xe8, 0x9c, 0x82, 0x98, 0x4d, 0x24, 0x26, 0xbd, 0xa9, + 0x3f, 0x2c, 0xac, 0x2e, 0x48, 0x72, 0x4f, 0x41, 0xd2, 0x9d, 0x6c, 0x7a, 0xd3, 0x7f, 0x84, 0xd3, + 0x7b, 0x34, 0xc4, 0x02, 0xbe, 0xc9, 0xae, 0x37, 0x8b, 0xbf, 0x2a, 0x2c, 0xe0, 0xa3, 0x22, 0xc3, + 0x28, 0x9c, 0xc0, 0xf4, 0xe6, 0xf4, 0x51, 0x31, 0x8c, 0x42, 0xf9, 0x0b, 0xe9, 0x4d, 0x1a, 0xf3, + 0x7b, 0xb3, 0xf8, 0x6b, 0xa2, 0x37, 0x29, 0x3e, 0x11, 0x23, 0x9c, 0x11, 0xf4, 0xe6, 0xf1, 0x4b, + 0x42, 0x8c, 0x50, 0x42, 0x90, 0x5b, 0x03, 0xd4, 0x9a, 0x0d, 0xf4, 0xe6, 0xf7, 0x31, 0xce, 0x6f, + 0xbc, 0x25, 0x19, 0xc8, 0x3d, 0x0b, 0x53, 0xed, 0x33, 0x81, 0xde, 0x5c, 0x3f, 0xfe, 0xa3, 0xd0, + 0xda, 0xcd, 0x9f, 0x08, 0xe4, 0x36, 0xbc, 0x29, 0xc5, 0x9f, 0x05, 0xf4, 0x66, 0xfb, 0xca, 0x8f, + 0x82, 0x81, 0xdb, 0x9f, 0x04, 0xe4, 0xf2, 0x00, 0xde, 0x04, 0xdc, 0x9b, 0xd7, 0x27, 0x39, 0x2f, + 0x1f, 0x11, 0x19, 0x1a, 0x7c, 0xfe, 0xed, 0x4d, 0x7f, 0x5d, 0x0c, 0x0d, 0x4e, 0x41, 0x86, 0x86, + 0x98, 0x7a, 0x7b, 0x53, 0x7f, 0x4a, 0x0c, 0x0d, 0x41, 0x42, 0x3c, 0xdb, 0x37, 0xbb, 0xf5, 0xe6, + 0xf0, 0x69, 0xe1, 0xd9, 0x3e, 0xaa, 0xdc, 0x0a, 0x8c, 0xb7, 0x4c, 0x88, 0xbd, 0x59, 0xfd, 0x32, + 0x67, 0x95, 0x0e, 0xcf, 0x87, 0xfe, 0xc9, 0x8b, 0x4f, 0x86, 0xbd, 0xb9, 0x7d, 0x26, 0x34, 0x79, + 0xf1, 0xb9, 0x30, 0x77, 0x1e, 0x12, 0x7a, 0xb3, 0x5e, 0x27, 0x83, 0x07, 0x75, 0xbf, 0x09, 0x98, + 0xf9, 0x2f, 0x3f, 0xe6, 0xd6, 0x11, 0x04, 0xb9, 0xb3, 0x10, 0xc7, 0x8d, 0x2d, 0x5c, 0xed, 0x45, + 0xf9, 0xfd, 0x1f, 0x8b, 0x80, 0x49, 0xb0, 0x73, 0x4f, 0x01, 0xb0, 0xad, 0x11, 0x7a, 0x18, 0xd8, + 0x83, 0xf6, 0xbf, 0xfe, 0x98, 0x5f, 0xbd, 0xf1, 0x48, 0x3c, 0x06, 0xec, 0x22, 0x4f, 0x77, 0x06, + 0x3f, 0x08, 0x32, 0xa0, 0x3d, 0xf2, 0x24, 0x0c, 0xbd, 0x60, 0x1b, 0xba, 0xa3, 0xd6, 0x7a, 0x51, + 0xff, 0x37, 0x4e, 0x2d, 0xf0, 0x89, 0xc1, 0x1a, 0x86, 0x85, 0x1d, 0xb5, 0x66, 0xf7, 0xa2, 0xfd, + 0xef, 0x9c, 0xd6, 0x25, 0x20, 0xc4, 0x15, 0xd5, 0x76, 0xfa, 0xd1, 0xfb, 0x0f, 0x05, 0xb1, 0x20, + 0x20, 0x42, 0x93, 0xdf, 0xbb, 0x78, 0xbf, 0x17, 0xed, 0x0f, 0x85, 0xd0, 0x1c, 0x3f, 0xf7, 0x26, + 0x48, 0x92, 0x9f, 0xec, 0x3e, 0x5d, 0x0f, 0xe2, 0x3f, 0xe2, 0xc4, 0x1e, 0x05, 0x69, 0xd9, 0x76, + 0xaa, 0x8e, 0xd6, 0xdb, 0xd8, 0x37, 0x79, 0x4f, 0x0b, 0xfc, 0x5c, 0x1e, 0x86, 0x6d, 0xa7, 0x5a, + 0x6d, 0xf2, 0xfc, 0xb4, 0x07, 0xf9, 0x1f, 0xff, 0xd8, 0xdd, 0xb2, 0x70, 0x69, 0x48, 0x6f, 0x5f, + 0xdd, 0x75, 0x4c, 0x83, 0x1e, 0x78, 0xf4, 0xe2, 0xf0, 0x23, 0xce, 0xc1, 0x47, 0x92, 0x9b, 0x87, + 0x14, 0xd1, 0xc5, 0xc2, 0x26, 0xa6, 0xa7, 0x53, 0x3d, 0x58, 0xfc, 0x0f, 0x6e, 0x80, 0x00, 0x51, + 0xe1, 0xe7, 0xbf, 0xfe, 0xda, 0xb4, 0xf4, 0xad, 0xd7, 0xa6, 0xa5, 0x3f, 0x78, 0x6d, 0x5a, 0xfa, + 0xf0, 0x77, 0xa7, 0x07, 0xbe, 0xf5, 0xdd, 0xe9, 0x81, 0xdf, 0xfd, 0xee, 0xf4, 0x40, 0xfb, 0x5d, + 0x62, 0x58, 0x30, 0x16, 0x0c, 0xb6, 0x3f, 0xfc, 0xbc, 0x5c, 0xd3, 0x9c, 0x9d, 0xe6, 0xd6, 0x5c, + 0xc5, 0x68, 0xd0, 0x6d, 0x5c, 0x6f, 0xb7, 0xd6, 0x5d, 0xe4, 0xc0, 0x7b, 0xa2, 0x70, 0xb4, 0x62, + 0xd8, 0x0d, 0xc3, 0x2e, 0xb3, 0xfd, 0x5e, 0x56, 0xe0, 0x3b, 0xbe, 0x29, 0x7f, 0x55, 0x1f, 0x9b, + 0xbe, 0x17, 0x61, 0x94, 0xaa, 0x4e, 0xb7, 0xbb, 0xa8, 0xb7, 0xf5, 0x0c, 0x10, 0xdf, 0xf8, 0xb7, + 0x71, 0xaa, 0xf5, 0x88, 0x4b, 0x48, 0x4f, 0xef, 0x37, 0x60, 0x52, 0x6b, 0x98, 0x75, 0x4c, 0xb7, + 0xf9, 0xcb, 0x6e, 0x5d, 0x6f, 0x7e, 0xdf, 0xe4, 0xfc, 0x26, 0x3c, 0xf2, 0x45, 0x41, 0x9d, 0x5b, + 0x82, 0x71, 0xb5, 0x52, 0xc1, 0x66, 0x80, 0x65, 0x8f, 0x6e, 0x11, 0x02, 0xa6, 0x39, 0xa5, 0xcb, + 0xad, 0xf0, 0x54, 0xa7, 0xae, 0x79, 0xfe, 0x1e, 0x9f, 0xe5, 0x2d, 0x5c, 0xc3, 0xfa, 0x43, 0x3a, + 0x76, 0xae, 0x1a, 0xd6, 0x2e, 0x37, 0xef, 0x43, 0xac, 0xa9, 0x41, 0x76, 0x83, 0x19, 0xde, 0x17, + 0x85, 0x69, 0x56, 0x71, 0x7a, 0x4b, 0xb5, 0xf1, 0xe9, 0x2b, 0x8f, 0x6c, 0x61, 0x47, 0x7d, 0xe4, + 0x74, 0xc5, 0xd0, 0x74, 0xde, 0x13, 0x13, 0xbc, 0x5f, 0x48, 0xfd, 0x1c, 0xaf, 0xcf, 0xb6, 0xdd, + 0xa6, 0x97, 0x17, 0x20, 0x36, 0x6f, 0x68, 0x3a, 0x9a, 0x84, 0x78, 0x15, 0xeb, 0x46, 0x83, 0xdf, + 0xb9, 0x63, 0x05, 0x74, 0x17, 0x0c, 0xaa, 0x0d, 0xa3, 0xa9, 0x3b, 0xec, 0x84, 0xa2, 0x30, 0xfc, + 0xf5, 0x1b, 0x33, 0x03, 0xbf, 0x77, 0x63, 0x26, 0xba, 0xa8, 0x3b, 0x0a, 0xaf, 0xca, 0xc5, 0xbe, + 0xf7, 0xea, 0x8c, 0x24, 0x3f, 0x0d, 0x43, 0x45, 0x5c, 0x39, 0x0c, 0xaf, 0x22, 0xae, 0x84, 0x78, + 0xdd, 0x0f, 0x89, 0x45, 0xdd, 0x61, 0xb7, 0x22, 0x4f, 0x40, 0x54, 0xd3, 0xd9, 0x45, 0x9b, 0x50, + 0xfb, 0x04, 0x4e, 0x50, 0x8b, 0xb8, 0xe2, 0xa2, 0x56, 0x71, 0x25, 0x8c, 0x4a, 0xd8, 0x13, 0x78, + 0xa1, 0xf8, 0xbb, 0xff, 0x71, 0x7a, 0xe0, 0xa5, 0xd7, 0xa6, 0x07, 0x3a, 0xf6, 0x84, 0x7f, 0x0c, + 0x70, 0x13, 0xf3, 0x2e, 0xb0, 0xab, 0xbb, 0xec, 0x8c, 0xc4, 0xed, 0x86, 0x7f, 0x39, 0x08, 0x32, + 0xc7, 0xb1, 0x1d, 0x75, 0x57, 0xd3, 0x6b, 0x6e, 0x4f, 0xa8, 0x4d, 0x67, 0xe7, 0x1a, 0xef, 0x8a, + 0x29, 0xde, 0x15, 0x1c, 0xa7, 0x7b, 0x6f, 0x64, 0x3b, 0x8f, 0xae, 0x6c, 0x8f, 0x3e, 0x97, 0xff, + 0x45, 0x14, 0xd0, 0xba, 0xa3, 0xee, 0xe2, 0x7c, 0xd3, 0xd9, 0x31, 0x2c, 0xed, 0x1a, 0x8b, 0x65, + 0x18, 0xa0, 0xa1, 0xee, 0x95, 0x1d, 0x63, 0x17, 0xeb, 0x36, 0x35, 0xcd, 0xf0, 0x99, 0xa3, 0x73, + 0x6d, 0xfc, 0x63, 0x8e, 0x74, 0x5d, 0xe1, 0x81, 0xcf, 0x7d, 0x67, 0xe6, 0xbe, 0xde, 0x56, 0xa0, + 0xc8, 0x24, 0xb9, 0xde, 0xdb, 0xa0, 0x8c, 0xd1, 0x65, 0x60, 0x97, 0x2c, 0xca, 0x75, 0xcd, 0x76, + 0xf8, 0x3d, 0xed, 0xb3, 0x73, 0xed, 0x75, 0x9f, 0x6b, 0x15, 0x73, 0xee, 0xb2, 0x5a, 0xd7, 0xaa, + 0xaa, 0x63, 0x58, 0xf6, 0xc5, 0x01, 0x25, 0x49, 0x59, 0x2d, 0x69, 0xb6, 0x83, 0x36, 0x20, 0x59, + 0xc5, 0xfa, 0x3e, 0x63, 0x1b, 0x7d, 0x63, 0x6c, 0x13, 0x84, 0x13, 0xe5, 0xfa, 0x1c, 0x20, 0xd5, + 0x8f, 0x27, 0x1e, 0x26, 0xb1, 0xfb, 0x95, 0x1d, 0xd8, 0x07, 0x38, 0xd3, 0x77, 0x14, 0xe3, 0x6a, + 0x18, 0x94, 0xbd, 0x17, 0xc0, 0x6b, 0x13, 0x65, 0x60, 0x48, 0xad, 0x56, 0x2d, 0x6c, 0xdb, 0xf4, + 0x00, 0x30, 0xa9, 0x88, 0x62, 0x6e, 0xfc, 0x5f, 0x7f, 0xf9, 0xa1, 0x91, 0x00, 0xc7, 0x42, 0x0a, + 0xe0, 0x8a, 0x4b, 0x7a, 0xea, 0x53, 0x12, 0x8c, 0xb7, 0xb4, 0x88, 0x64, 0x98, 0xce, 0x6f, 0x6e, + 0x5c, 0x5c, 0x55, 0x16, 0x9f, 0xcf, 0x6f, 0x2c, 0xae, 0xae, 0x94, 0xd9, 0x95, 0xff, 0x95, 0xf5, + 0xb5, 0xd2, 0xfc, 0xe2, 0x85, 0xc5, 0x52, 0x31, 0x3d, 0x80, 0x66, 0xe0, 0x58, 0x1b, 0x9c, 0x62, + 0x69, 0xa9, 0xb4, 0x90, 0xdf, 0x28, 0xa5, 0x25, 0x74, 0x27, 0x9c, 0x68, 0xcb, 0xc4, 0x45, 0x89, + 0x74, 0x40, 0x51, 0x4a, 0x2e, 0x4a, 0xb4, 0x70, 0xa1, 0xe3, 0x28, 0x7a, 0xb0, 0xab, 0xff, 0xec, + 0xb9, 0xc3, 0x25, 0x38, 0x9e, 0xde, 0x1d, 0x81, 0xa3, 0xe1, 0x29, 0x43, 0xd5, 0xf7, 0x3b, 0xbc, + 0xfa, 0xec, 0x10, 0xcd, 0x2e, 0x42, 0x34, 0xaf, 0xef, 0xa3, 0xa3, 0x2c, 0x9f, 0x2e, 0x37, 0xad, + 0x3a, 0x8f, 0x41, 0x43, 0xa4, 0xbc, 0x69, 0xd5, 0x49, 0x6c, 0x12, 0x17, 0xfd, 0xa5, 0x93, 0x29, + 0x7e, 0x7b, 0x3f, 0x97, 0xfe, 0xd8, 0xab, 0x33, 0x03, 0x5f, 0x78, 0x75, 0x66, 0xe0, 0x87, 0x9f, + 0x9e, 0x19, 0x78, 0xe9, 0xf7, 0x67, 0x07, 0x0a, 0xbb, 0x61, 0xf5, 0xbe, 0xda, 0x73, 0x36, 0x4d, + 0xe4, 0xf5, 0x7d, 0x1a, 0x88, 0xd6, 0xa4, 0xe7, 0xe3, 0x54, 0x39, 0x71, 0x80, 0x3a, 0x1d, 0x3e, + 0x40, 0x7d, 0x16, 0xd7, 0xeb, 0x97, 0x74, 0xe3, 0x2a, 0xed, 0x55, 0xcf, 0x06, 0x1f, 0x8d, 0xc0, + 0x74, 0xcb, 0xb4, 0xc9, 0x33, 0x8c, 0x4e, 0xcf, 0x5f, 0x73, 0x90, 0x28, 0x8a, 0xc4, 0x25, 0x03, + 0x43, 0x36, 0xae, 0x18, 0x7a, 0x95, 0x8d, 0xf4, 0xa8, 0x22, 0x8a, 0x44, 0x6d, 0x5d, 0xd5, 0x0d, + 0x9b, 0xdf, 0xb9, 0x67, 0x85, 0xc2, 0x27, 0xa4, 0x83, 0xe5, 0x0b, 0x23, 0xa2, 0x25, 0xa1, 0xe6, + 0x23, 0x3d, 0x8f, 0x94, 0x77, 0x89, 0x96, 0xae, 0x12, 0x81, 0x63, 0xe5, 0x7e, 0xad, 0xf2, 0x4b, + 0x11, 0x98, 0x09, 0x5b, 0x85, 0xa4, 0x6d, 0xb6, 0xa3, 0x36, 0xcc, 0x4e, 0x66, 0x39, 0x0f, 0xc9, + 0x0d, 0x81, 0x73, 0x60, 0xbb, 0x5c, 0x3f, 0xa0, 0x5d, 0x46, 0xdd, 0xa6, 0x84, 0x61, 0xce, 0xf4, + 0x69, 0x18, 0x57, 0x8f, 0x43, 0x59, 0xe6, 0x73, 0x31, 0x38, 0x41, 0x1f, 0x65, 0x59, 0x0d, 0x4d, + 0x77, 0x4e, 0x57, 0xac, 0x7d, 0xd3, 0xa1, 0x89, 0x9b, 0xb1, 0xcd, 0xed, 0x32, 0xee, 0x55, 0xcf, + 0xb1, 0xea, 0x0e, 0x23, 0x67, 0x1b, 0xe2, 0x6b, 0x84, 0x8e, 0x58, 0xc4, 0x31, 0x1c, 0xb5, 0xce, + 0x2d, 0xc5, 0x0a, 0x04, 0xca, 0x1e, 0x72, 0x45, 0x18, 0x54, 0x13, 0x6f, 0xb8, 0xea, 0x58, 0xdd, + 0x66, 0xf7, 0xe1, 0xa3, 0x74, 0x40, 0x25, 0x08, 0x80, 0x5e, 0x7d, 0x9f, 0x84, 0xb8, 0xda, 0x64, + 0x57, 0x39, 0xa2, 0x64, 0xa4, 0xd1, 0x82, 0x7c, 0x09, 0x86, 0xf8, 0x81, 0x32, 0x4a, 0x43, 0x74, + 0x17, 0xef, 0xd3, 0x76, 0x52, 0x0a, 0xf9, 0x89, 0xe6, 0x20, 0x4e, 0x85, 0xe7, 0x13, 0x48, 0x66, + 0xae, 0x45, 0xfa, 0x39, 0x2a, 0xa4, 0xc2, 0xd0, 0xe4, 0xa7, 0x21, 0x51, 0x34, 0x1a, 0x9a, 0x6e, + 0x04, 0xb9, 0x25, 0x19, 0x37, 0x2a, 0xb3, 0xd9, 0xe4, 0xf9, 0x86, 0xc2, 0x0a, 0x68, 0x0a, 0x06, + 0xd9, 0xfb, 0x08, 0x7e, 0x1d, 0x85, 0x97, 0xe4, 0x79, 0x18, 0xa2, 0xbc, 0x57, 0x4d, 0x84, 0xf8, + 0xcb, 0x3a, 0xfe, 0x10, 0x83, 0xa6, 0xa6, 0x9c, 0x7d, 0xc4, 0x13, 0x16, 0x41, 0xac, 0xaa, 0x3a, + 0x2a, 0xd7, 0x9b, 0xfe, 0x96, 0xdf, 0x0c, 0x09, 0xce, 0xc4, 0x46, 0x67, 0x20, 0x6a, 0x98, 0x36, + 0xbf, 0x50, 0x92, 0xed, 0xa4, 0xca, 0xaa, 0x59, 0x88, 0x91, 0x4c, 0x45, 0x21, 0xc8, 0x05, 0xa5, + 0x63, 0x50, 0x7d, 0xc2, 0x17, 0x54, 0x7d, 0x5d, 0xee, 0xfb, 0xc9, 0xba, 0xb4, 0xc5, 0x1d, 0x5c, + 0x67, 0xf9, 0x74, 0x04, 0xa6, 0x7d, 0xb5, 0x57, 0xb0, 0x65, 0x6b, 0x86, 0xce, 0xe7, 0x73, 0xe6, + 0x2d, 0xc8, 0x27, 0x24, 0xaf, 0xef, 0xe0, 0x2e, 0x6f, 0x82, 0x68, 0xde, 0x34, 0x51, 0x16, 0x12, + 0xb4, 0x5c, 0x31, 0x98, 0xbf, 0xc4, 0x14, 0xb7, 0x4c, 0xea, 0x6c, 0x63, 0xdb, 0xb9, 0xaa, 0x5a, + 0xee, 0x13, 0x42, 0x51, 0x96, 0x9f, 0x84, 0xe4, 0xbc, 0xa1, 0xdb, 0x58, 0xb7, 0x9b, 0x74, 0x0c, + 0x6e, 0xd5, 0x8d, 0xca, 0x2e, 0xe7, 0xc0, 0x0a, 0xc4, 0xe0, 0xaa, 0x69, 0x52, 0xca, 0x98, 0x42, + 0x7e, 0xb2, 0xdc, 0xb0, 0xb0, 0xde, 0xd1, 0x44, 0x4f, 0x1e, 0xdc, 0x44, 0x5c, 0x49, 0xd7, 0x46, + 0xff, 0x5b, 0x82, 0xe3, 0xad, 0x03, 0x6a, 0x17, 0xef, 0xdb, 0x07, 0x1d, 0x4f, 0xcf, 0x41, 0x72, + 0x8d, 0xbe, 0xe3, 0xbf, 0x84, 0xf7, 0x51, 0x16, 0x86, 0x70, 0xf5, 0xcc, 0xd9, 0xb3, 0x8f, 0x3c, + 0xc9, 0xbc, 0xfd, 0xe2, 0x80, 0x22, 0x00, 0x68, 0x1a, 0x92, 0x36, 0xae, 0x98, 0x67, 0xce, 0x9e, + 0xdb, 0x7d, 0x84, 0xb9, 0x17, 0xc9, 0x80, 0x5c, 0x50, 0x2e, 0x41, 0xb4, 0xfe, 0xde, 0xa7, 0x67, + 0xa4, 0x42, 0x1c, 0xa2, 0x76, 0xb3, 0x71, 0x5b, 0x7d, 0xe4, 0x95, 0x38, 0xcc, 0xfa, 0x29, 0x69, + 0xa4, 0x72, 0xb3, 0x12, 0x6e, 0x83, 0xb4, 0xcf, 0x06, 0x14, 0xa3, 0x43, 0x32, 0xdb, 0xd5, 0x92, + 0xf2, 0x6f, 0x48, 0x90, 0x72, 0x53, 0xa5, 0x75, 0xec, 0xa0, 0xf3, 0xfe, 0xfc, 0x87, 0x0f, 0x9b, + 0x63, 0x73, 0xe1, 0xb6, 0xbc, 0x94, 0x4e, 0xf1, 0xa1, 0xa3, 0xc7, 0xa9, 0x23, 0x9a, 0x86, 0xcd, + 0x9f, 0x95, 0xf5, 0x20, 0x75, 0x91, 0xd1, 0x83, 0x80, 0x68, 0x84, 0x2b, 0x5f, 0x31, 0x1c, 0x4d, + 0xaf, 0x95, 0x4d, 0xe3, 0x2a, 0x7f, 0xac, 0x1b, 0x55, 0xd2, 0xb4, 0xe6, 0x32, 0xad, 0x58, 0x23, + 0x70, 0x22, 0x74, 0xd2, 0xe5, 0x12, 0x4c, 0xef, 0x48, 0x10, 0x10, 0x45, 0x74, 0x1e, 0x86, 0xcc, + 0xe6, 0x56, 0x59, 0x44, 0x8c, 0xe1, 0x33, 0xc7, 0xdb, 0x8d, 0x7f, 0xe1, 0x1f, 0x3c, 0x02, 0x0c, + 0x9a, 0xcd, 0x2d, 0xe2, 0x2d, 0x77, 0x42, 0xaa, 0x8d, 0x30, 0xc3, 0x57, 0x3c, 0x39, 0xe8, 0xe7, + 0x23, 0xb8, 0x06, 0x65, 0xd3, 0xd2, 0x0c, 0x4b, 0x73, 0xf6, 0x69, 0xfe, 0x1a, 0x55, 0xd2, 0xa2, + 0x62, 0x8d, 0xc3, 0xe5, 0x5d, 0x18, 0x5b, 0xa7, 0xeb, 0x5b, 0x4f, 0xf2, 0xb3, 0x9e, 0x7c, 0x52, + 0x6f, 0xf9, 0x3a, 0x4a, 0x16, 0x69, 0x91, 0xac, 0xf0, 0x4c, 0x47, 0xef, 0x7c, 0xfc, 0xe0, 0xde, + 0x19, 0xcc, 0x10, 0xff, 0xf0, 0x68, 0x60, 0x70, 0x32, 0xe7, 0xf4, 0x87, 0xaf, 0x7e, 0x1d, 0xb3, + 0x57, 0x36, 0x91, 0xed, 0x3e, 0xa9, 0x66, 0x7b, 0x84, 0xd1, 0x6c, 0xcf, 0x21, 0x24, 0x3f, 0x09, + 0x23, 0x6b, 0xaa, 0xe5, 0xac, 0x63, 0xe7, 0x22, 0x56, 0xab, 0xd8, 0x0a, 0xce, 0xba, 0x23, 0x62, + 0xd6, 0x45, 0x10, 0xa3, 0x53, 0x2b, 0x9b, 0x75, 0xe8, 0x6f, 0x79, 0x07, 0x62, 0xf4, 0x66, 0xa8, + 0x3b, 0x23, 0x73, 0x0a, 0x36, 0x23, 0x93, 0x58, 0xba, 0xef, 0x60, 0x5b, 0xa4, 0xb7, 0xb4, 0x80, + 0x1e, 0x13, 0xf3, 0x6a, 0xb4, 0xfb, 0xbc, 0xca, 0x1d, 0x91, 0xcf, 0xae, 0x75, 0x18, 0x2a, 0x90, + 0x50, 0xbc, 0x58, 0x74, 0x05, 0x91, 0x3c, 0x41, 0xd0, 0x32, 0x8c, 0x99, 0xaa, 0xe5, 0xd0, 0x27, + 0x31, 0x3b, 0x54, 0x0b, 0xee, 0xeb, 0x33, 0xad, 0x23, 0x2f, 0xa0, 0x2c, 0x6f, 0x65, 0xc4, 0xf4, + 0x03, 0xe5, 0xff, 0x14, 0x83, 0x41, 0x6e, 0x8c, 0x37, 0xc1, 0x10, 0x37, 0x2b, 0xf7, 0xce, 0x13, + 0x73, 0xad, 0x13, 0xd3, 0x9c, 0x3b, 0x81, 0x70, 0x7e, 0x82, 0x06, 0xdd, 0x0b, 0x89, 0xca, 0x8e, + 0xaa, 0xe9, 0x65, 0xad, 0x2a, 0xb6, 0x1a, 0x5e, 0xbb, 0x31, 0x33, 0x34, 0x4f, 0x60, 0x8b, 0x45, + 0x65, 0x88, 0x56, 0x2e, 0x56, 0x49, 0x26, 0xb0, 0x83, 0xb5, 0xda, 0x8e, 0xc3, 0x47, 0x18, 0x2f, + 0xa1, 0x27, 0x20, 0x46, 0x1c, 0x82, 0x3f, 0x98, 0xcc, 0xb6, 0x6c, 0xf8, 0xb8, 0xc9, 0x5e, 0x21, + 0x41, 0x1a, 0xfe, 0xf0, 0x77, 0x66, 0x24, 0x85, 0x52, 0xa0, 0x79, 0x18, 0xa9, 0xab, 0xb6, 0x53, + 0xa6, 0x33, 0x18, 0x69, 0x3e, 0xce, 0xd7, 0xdb, 0x2d, 0x06, 0xe1, 0x86, 0xe5, 0xa2, 0x0f, 0x13, + 0x2a, 0x06, 0xaa, 0xa2, 0x93, 0x90, 0xa6, 0x4c, 0x2a, 0x46, 0xa3, 0xa1, 0x39, 0x2c, 0xb7, 0x1a, + 0xa4, 0x76, 0x1f, 0x25, 0xf0, 0x79, 0x0a, 0xa6, 0x19, 0xd6, 0x31, 0x48, 0xd2, 0x27, 0x5a, 0x14, + 0x85, 0x5d, 0x47, 0x4e, 0x10, 0x00, 0xad, 0xbc, 0x0f, 0xc6, 0xbc, 0xf8, 0xc8, 0x50, 0x12, 0x8c, + 0x8b, 0x07, 0xa6, 0x88, 0x0f, 0xc3, 0xa4, 0x8e, 0xf7, 0xe8, 0x05, 0xe9, 0x00, 0x76, 0x92, 0x62, + 0x23, 0x52, 0x77, 0x39, 0x48, 0x71, 0x0f, 0x8c, 0x56, 0x84, 0xf1, 0x19, 0x2e, 0x50, 0xdc, 0x11, + 0x17, 0x4a, 0xd1, 0x8e, 0x42, 0x42, 0x35, 0x4d, 0x86, 0x30, 0xcc, 0xe3, 0xa3, 0x69, 0xd2, 0xaa, + 0x53, 0x30, 0x4e, 0x75, 0xb4, 0xb0, 0xdd, 0xac, 0x3b, 0x9c, 0x49, 0x8a, 0xe2, 0x8c, 0x91, 0x0a, + 0x85, 0xc1, 0x29, 0xee, 0x5d, 0x30, 0x82, 0xaf, 0x68, 0x55, 0xac, 0x57, 0x30, 0xc3, 0x1b, 0xa1, + 0x78, 0x29, 0x01, 0xa4, 0x48, 0xf7, 0x83, 0x1b, 0xf7, 0xca, 0x22, 0x26, 0x8f, 0x32, 0x7e, 0x02, + 0x9e, 0x67, 0x60, 0x39, 0x03, 0xb1, 0xa2, 0xea, 0xa8, 0x24, 0xc1, 0x70, 0xf6, 0xd8, 0x44, 0x93, + 0x52, 0xc8, 0x4f, 0xf9, 0x7b, 0x11, 0x88, 0x5d, 0x36, 0x1c, 0x8c, 0x1e, 0xf5, 0x25, 0x80, 0xa3, + 0xed, 0xfc, 0x79, 0x5d, 0xab, 0xe9, 0xb8, 0xba, 0x6c, 0xd7, 0x7c, 0xdf, 0x53, 0xf0, 0xdc, 0x29, + 0x12, 0x70, 0xa7, 0x49, 0x88, 0x5b, 0x46, 0x53, 0xaf, 0x8a, 0x9b, 0xbc, 0xb4, 0x80, 0x4a, 0x90, + 0x70, 0xbd, 0x24, 0xd6, 0xcb, 0x4b, 0xc6, 0x88, 0x97, 0x10, 0x1f, 0xe6, 0x00, 0x65, 0x68, 0x8b, + 0x3b, 0x4b, 0x01, 0x92, 0x6e, 0xf0, 0xe2, 0xde, 0xd6, 0x9f, 0xc3, 0x7a, 0x64, 0x64, 0x32, 0x71, + 0xfb, 0xde, 0x35, 0x1e, 0xf3, 0xb8, 0xb4, 0x5b, 0xc1, 0xad, 0x17, 0x70, 0x2b, 0xfe, 0x6d, 0x87, + 0x21, 0xaa, 0x97, 0xe7, 0x56, 0xec, 0xfb, 0x0e, 0xc7, 0x21, 0x69, 0x6b, 0x35, 0x5d, 0x75, 0x9a, + 0x16, 0xe6, 0x9e, 0xe7, 0x01, 0xe4, 0xaf, 0x4a, 0x30, 0xc8, 0x3c, 0xd9, 0x67, 0x37, 0xa9, 0xbd, + 0xdd, 0x22, 0x9d, 0xec, 0x16, 0x3d, 0xbc, 0xdd, 0xf2, 0x00, 0xae, 0x30, 0x36, 0x7f, 0x72, 0xdf, + 0x26, 0x63, 0x60, 0x22, 0xae, 0x6b, 0x35, 0x3e, 0x50, 0x7d, 0x44, 0xf2, 0x7f, 0x90, 0x48, 0x12, + 0xcb, 0xeb, 0x51, 0x1e, 0x46, 0x84, 0x5c, 0xe5, 0xed, 0xba, 0x5a, 0xe3, 0xbe, 0x73, 0xa2, 0xa3, + 0x70, 0x17, 0xea, 0x6a, 0x4d, 0x19, 0xe6, 0xf2, 0x90, 0x42, 0xfb, 0x7e, 0x88, 0x74, 0xe8, 0x87, + 0x40, 0xc7, 0x47, 0x0f, 0xd7, 0xf1, 0x81, 0x2e, 0x8a, 0x85, 0xbb, 0xe8, 0x4b, 0x11, 0xba, 0x98, + 0x31, 0x0d, 0x5b, 0xad, 0xff, 0x24, 0x46, 0xc4, 0x31, 0x48, 0x9a, 0x46, 0xbd, 0xcc, 0x6a, 0xd8, + 0x0d, 0xf7, 0x84, 0x69, 0xd4, 0x95, 0x96, 0x6e, 0x8f, 0xdf, 0xa2, 0xe1, 0x32, 0x78, 0x0b, 0xac, + 0x36, 0x14, 0xb6, 0x9a, 0x05, 0x29, 0x66, 0x0a, 0x3e, 0x97, 0x3d, 0x4c, 0x6c, 0x40, 0x27, 0x47, + 0xa9, 0x75, 0xee, 0x65, 0x62, 0x33, 0x4c, 0x85, 0xe3, 0x11, 0x0a, 0x16, 0xfa, 0xdb, 0xad, 0x82, + 0xfd, 0x6e, 0xa9, 0x70, 0x3c, 0xf9, 0xaf, 0x4b, 0x00, 0x4b, 0xc4, 0xb2, 0x54, 0x5f, 0x32, 0x0b, + 0xd9, 0x54, 0x84, 0x72, 0xa0, 0xe5, 0xe9, 0x4e, 0x9d, 0xc6, 0xdb, 0x4f, 0xd9, 0x7e, 0xb9, 0xe7, + 0x61, 0xc4, 0x73, 0x46, 0x1b, 0x0b, 0x61, 0xa6, 0xbb, 0x64, 0xd5, 0xeb, 0xd8, 0x51, 0x52, 0x57, + 0x7c, 0x25, 0xf9, 0x9f, 0x4a, 0x90, 0xa4, 0x32, 0x2d, 0x63, 0x47, 0x0d, 0xf4, 0xa1, 0x74, 0xf8, + 0x3e, 0x3c, 0x01, 0xc0, 0xd8, 0xd8, 0xda, 0x35, 0xcc, 0x3d, 0x2b, 0x49, 0x21, 0xeb, 0xda, 0x35, + 0x8c, 0xce, 0xb9, 0x06, 0x8f, 0x76, 0x37, 0xb8, 0xc8, 0xba, 0xb9, 0xd9, 0xef, 0x80, 0x21, 0xfa, + 0x89, 0xaa, 0x3d, 0x9b, 0x27, 0xd2, 0x83, 0x7a, 0xb3, 0xb1, 0xb1, 0x67, 0xcb, 0x2f, 0xc0, 0xd0, + 0xc6, 0x1e, 0xdb, 0x1b, 0x39, 0x06, 0x49, 0xcb, 0x30, 0xf8, 0x9c, 0xcc, 0x72, 0xa1, 0x04, 0x01, + 0xd0, 0x29, 0x48, 0xec, 0x07, 0x44, 0xbc, 0xfd, 0x00, 0x6f, 0x43, 0x23, 0xda, 0xd7, 0x86, 0xc6, + 0xa9, 0x7f, 0x27, 0xc1, 0xb0, 0x2f, 0x3e, 0xa0, 0x47, 0xe0, 0x48, 0x61, 0x69, 0x75, 0xfe, 0x52, + 0x79, 0xb1, 0x58, 0xbe, 0xb0, 0x94, 0x5f, 0xf0, 0xde, 0x70, 0x65, 0xa7, 0x5e, 0xbe, 0x3e, 0x8b, + 0x7c, 0xb8, 0x9b, 0x3a, 0xdd, 0x51, 0x42, 0xa7, 0x61, 0x32, 0x48, 0x92, 0x2f, 0xac, 0x97, 0x56, + 0x36, 0xd2, 0x52, 0xf6, 0xc8, 0xcb, 0xd7, 0x67, 0xc7, 0x7d, 0x14, 0xf9, 0x2d, 0x1b, 0xeb, 0x4e, + 0x2b, 0xc1, 0xfc, 0xea, 0xf2, 0xf2, 0xe2, 0x46, 0x3a, 0xd2, 0x42, 0xc0, 0x03, 0xf6, 0xfd, 0x30, + 0x1e, 0x24, 0x58, 0x59, 0x5c, 0x4a, 0x47, 0xb3, 0xe8, 0xe5, 0xeb, 0xb3, 0xa3, 0x3e, 0xec, 0x15, + 0xad, 0x9e, 0x4d, 0x7c, 0xe0, 0x33, 0xd3, 0x03, 0xbf, 0xfa, 0x2b, 0xd3, 0x12, 0xd1, 0x6c, 0x24, + 0x10, 0x23, 0xd0, 0x83, 0x70, 0xc7, 0xfa, 0xe2, 0xc2, 0x4a, 0xa9, 0x58, 0x5e, 0x5e, 0x5f, 0x10, + 0x7b, 0xd0, 0x42, 0xbb, 0xb1, 0x97, 0xaf, 0xcf, 0x0e, 0x73, 0x95, 0x3a, 0x61, 0xaf, 0x29, 0xa5, + 0xcb, 0xab, 0x1b, 0xa5, 0xb4, 0xc4, 0xb0, 0xd7, 0x2c, 0x7c, 0xc5, 0x70, 0xd8, 0x37, 0xec, 0x1e, + 0x86, 0xa3, 0x6d, 0xb0, 0x5d, 0xc5, 0xc6, 0x5f, 0xbe, 0x3e, 0x3b, 0xb2, 0x66, 0x61, 0x36, 0x7e, + 0x28, 0xc5, 0x1c, 0x64, 0x5a, 0x29, 0x56, 0xd7, 0x56, 0xd7, 0xf3, 0x4b, 0xe9, 0xd9, 0x6c, 0xfa, + 0xe5, 0xeb, 0xb3, 0x29, 0x11, 0x0c, 0xe9, 0x46, 0xbf, 0xab, 0xd9, 0xed, 0x5c, 0xf1, 0xfc, 0xf1, + 0x43, 0x70, 0x77, 0x87, 0x33, 0x26, 0x71, 0x3a, 0x71, 0xa8, 0x53, 0xa6, 0x8e, 0xfb, 0xec, 0xd9, + 0x1e, 0xdb, 0xcf, 0xbd, 0x97, 0x4e, 0x87, 0x3f, 0xc1, 0xca, 0x76, 0x5d, 0xdc, 0xc9, 0x1f, 0x94, + 0x60, 0xf4, 0xa2, 0x66, 0x3b, 0x86, 0xa5, 0x55, 0xd4, 0x3a, 0x7d, 0xb9, 0x75, 0xae, 0xdf, 0xd8, + 0x1a, 0x1a, 0xea, 0x4f, 0xc1, 0xe0, 0x15, 0xb5, 0xce, 0x82, 0x5a, 0x94, 0x7e, 0x68, 0xa6, 0xc3, + 0x91, 0x8f, 0x1b, 0xda, 0x04, 0x03, 0x46, 0x26, 0xff, 0x7a, 0x04, 0xc6, 0xe8, 0x60, 0xb0, 0xd9, + 0x27, 0xc8, 0xc8, 0x1a, 0xab, 0x00, 0x31, 0x4b, 0x75, 0xf8, 0xa6, 0x61, 0x61, 0x8e, 0x9f, 0x3e, + 0xde, 0xdb, 0xc7, 0x59, 0x5a, 0x11, 0x57, 0x14, 0x4a, 0x8b, 0xde, 0x0e, 0x89, 0x86, 0xba, 0x57, + 0xa6, 0x7c, 0xd8, 0xca, 0x25, 0x7f, 0x30, 0x3e, 0x37, 0x6f, 0xcc, 0x8c, 0xed, 0xab, 0x8d, 0x7a, + 0x4e, 0x16, 0x7c, 0x64, 0x65, 0xa8, 0xa1, 0xee, 0x11, 0x11, 0x91, 0x09, 0x63, 0x04, 0x5a, 0xd9, + 0x51, 0xf5, 0x1a, 0x66, 0x8d, 0xd0, 0x2d, 0xd0, 0xc2, 0xc5, 0x03, 0x37, 0x32, 0xe5, 0x35, 0xe2, + 0x63, 0x27, 0x2b, 0x23, 0x0d, 0x75, 0x6f, 0x9e, 0x02, 0x48, 0x8b, 0xb9, 0xc4, 0xc7, 0x5e, 0x9d, + 0x19, 0xa0, 0x27, 0xba, 0xdf, 0x96, 0x00, 0x3c, 0x8b, 0xa1, 0xb7, 0x43, 0xba, 0xe2, 0x96, 0x28, + 0xad, 0x38, 0x9b, 0xbc, 0xaf, 0x53, 0x5f, 0x84, 0xec, 0xcd, 0xe6, 0xe6, 0x6f, 0xdd, 0x98, 0x91, + 0x94, 0xb1, 0x4a, 0xa8, 0x2b, 0xde, 0x06, 0xc3, 0x4d, 0xb3, 0xaa, 0x3a, 0xb8, 0x4c, 0xd7, 0x71, + 0x91, 0x9e, 0xf3, 0xfc, 0x34, 0xe1, 0x75, 0xf3, 0xc6, 0x0c, 0x62, 0x6a, 0xf9, 0x88, 0x65, 0x3a, + 0xfb, 0x03, 0x83, 0x10, 0x02, 0x9f, 0x4e, 0xdf, 0x90, 0x60, 0xb8, 0xe8, 0xbb, 0x53, 0x99, 0x81, + 0xa1, 0x86, 0xa1, 0x6b, 0xbb, 0xdc, 0x1f, 0x93, 0x8a, 0x28, 0xa2, 0x2c, 0x24, 0xd8, 0x63, 0x56, + 0x67, 0x5f, 0x6c, 0x85, 0x8a, 0x32, 0xa1, 0xba, 0x8a, 0xb7, 0x6c, 0x4d, 0xf4, 0x86, 0x22, 0x8a, + 0xe8, 0x02, 0xa4, 0x6d, 0x5c, 0x69, 0x5a, 0x9a, 0xb3, 0x5f, 0xae, 0x18, 0xba, 0xa3, 0x56, 0x1c, + 0xf6, 0x2c, 0xb2, 0x70, 0xec, 0xe6, 0x8d, 0x99, 0x3b, 0x98, 0xac, 0x61, 0x0c, 0x59, 0x19, 0x13, + 0xa0, 0x79, 0x06, 0x21, 0x2d, 0x54, 0xb1, 0xa3, 0x6a, 0x75, 0x3b, 0xc3, 0x2e, 0x27, 0x88, 0xa2, + 0x4f, 0x97, 0xcf, 0x0f, 0xf9, 0x37, 0xb6, 0x2e, 0x40, 0xda, 0x30, 0xb1, 0x15, 0x48, 0x44, 0xa5, + 0x70, 0xcb, 0x61, 0x0c, 0x59, 0x19, 0x13, 0x20, 0x91, 0xa4, 0x3a, 0xa4, 0x9b, 0xc5, 0x42, 0xd1, + 0x6c, 0x6e, 0x79, 0xfb, 0x61, 0x93, 0x2d, 0xbd, 0x91, 0xd7, 0xf7, 0x0b, 0x8f, 0x7a, 0xdc, 0xc3, + 0x74, 0xf2, 0x37, 0xbf, 0xfc, 0xd0, 0x24, 0x77, 0x0d, 0x6f, 0x7f, 0xea, 0x12, 0xde, 0x27, 0xdd, + 0xcf, 0x51, 0xd7, 0x28, 0x26, 0x49, 0x3b, 0x5f, 0x50, 0xb5, 0xba, 0x78, 0xde, 0xaf, 0xf0, 0x12, + 0xca, 0xc1, 0xa0, 0xed, 0xa8, 0x4e, 0xd3, 0xe6, 0x27, 0xbd, 0x72, 0x27, 0x57, 0x2b, 0x18, 0x7a, + 0x75, 0x9d, 0x62, 0x2a, 0x9c, 0x02, 0x5d, 0x80, 0x41, 0x7e, 0x84, 0x1e, 0x3f, 0xf0, 0xf8, 0xa6, + 0x77, 0x25, 0x18, 0x35, 0xb1, 0x48, 0x15, 0xd7, 0x71, 0x8d, 0xa5, 0x55, 0x3b, 0x2a, 0x59, 0x7d, + 0xd0, 0x6f, 0xef, 0x15, 0x16, 0x0f, 0x3c, 0x08, 0xb9, 0xa5, 0xc2, 0xfc, 0x64, 0x65, 0xcc, 0x05, + 0xad, 0x53, 0x08, 0xba, 0x14, 0xb8, 0xfc, 0xcb, 0x3f, 0x50, 0x79, 0x57, 0x27, 0xf5, 0x7d, 0x3e, + 0x2d, 0xf6, 0x27, 0xfc, 0x57, 0x87, 0x2f, 0x40, 0xba, 0xa9, 0x6f, 0x19, 0x3a, 0x7d, 0x83, 0xcb, + 0xf3, 0x7b, 0xb2, 0xbe, 0x8b, 0xfa, 0x9d, 0x23, 0x8c, 0x21, 0x2b, 0x63, 0x2e, 0xe8, 0x22, 0x5b, + 0x05, 0x54, 0x61, 0xd4, 0xc3, 0xa2, 0x03, 0x35, 0xd9, 0x73, 0xa0, 0xde, 0xc9, 0x07, 0xea, 0x91, + 0x70, 0x2b, 0xde, 0x58, 0x1d, 0x71, 0x81, 0x84, 0x0c, 0x5d, 0x04, 0xf0, 0xc2, 0x03, 0xdd, 0xa7, + 0x18, 0xee, 0xdc, 0xf1, 0x5e, 0x8c, 0x11, 0xeb, 0x3d, 0x8f, 0x16, 0xbd, 0x13, 0x26, 0x1a, 0x9a, + 0x5e, 0xb6, 0x71, 0x7d, 0xbb, 0xcc, 0x0d, 0x4c, 0x58, 0xd2, 0x4f, 0x28, 0x15, 0x96, 0x0e, 0xe6, + 0x0f, 0x37, 0x6f, 0xcc, 0x64, 0x79, 0x08, 0x6d, 0x65, 0x29, 0x2b, 0xe3, 0x0d, 0x4d, 0x5f, 0xc7, + 0xf5, 0xed, 0xa2, 0x0b, 0xcb, 0xa5, 0x3e, 0xf0, 0xea, 0xcc, 0x00, 0x1f, 0xae, 0x03, 0xf2, 0x39, + 0xba, 0x77, 0xce, 0x87, 0x19, 0xb6, 0xc9, 0x9a, 0x44, 0x15, 0x05, 0x7e, 0xd5, 0xc0, 0x03, 0xb0, + 0x61, 0xfe, 0xd2, 0xef, 0xcf, 0x4a, 0xf2, 0xe7, 0x25, 0x18, 0x2c, 0x5e, 0x5e, 0x53, 0x35, 0x0b, + 0x2d, 0xc2, 0xb8, 0xe7, 0x39, 0xc1, 0x41, 0x7e, 0xfc, 0xe6, 0x8d, 0x99, 0x4c, 0xd8, 0xb9, 0xdc, + 0x51, 0xee, 0x39, 0xb0, 0x18, 0xe6, 0x8b, 0x9d, 0x16, 0xae, 0x01, 0x56, 0x2d, 0x28, 0x72, 0xeb, + 0xb2, 0x36, 0xa4, 0x66, 0x09, 0x86, 0x98, 0xb4, 0x36, 0xca, 0x41, 0xdc, 0x24, 0x3f, 0xf8, 0xc1, + 0xc0, 0x74, 0x47, 0xe7, 0xa5, 0xf8, 0xee, 0x46, 0x26, 0x21, 0x91, 0x3f, 0x12, 0x01, 0x28, 0x5e, + 0xbe, 0xbc, 0x61, 0x69, 0x66, 0x1d, 0x3b, 0xb7, 0x52, 0xf3, 0x0d, 0x38, 0xe2, 0x5b, 0x25, 0x59, + 0x95, 0x90, 0xf6, 0xb3, 0x37, 0x6f, 0xcc, 0x1c, 0x0f, 0x6b, 0xef, 0x43, 0x93, 0x95, 0x09, 0x6f, + 0xbd, 0x64, 0x55, 0xda, 0x72, 0xad, 0xda, 0x8e, 0xcb, 0x35, 0xda, 0x99, 0xab, 0x0f, 0xcd, 0xcf, + 0xb5, 0x68, 0x3b, 0xed, 0x4d, 0xbb, 0x0e, 0xc3, 0x9e, 0x49, 0x6c, 0x54, 0x84, 0x84, 0xc3, 0x7f, + 0x73, 0x0b, 0xcb, 0x9d, 0x2d, 0x2c, 0xc8, 0xb8, 0x95, 0x5d, 0x4a, 0xf9, 0x4f, 0x25, 0x00, 0xcf, + 0x67, 0x7f, 0x36, 0x5d, 0x8c, 0x84, 0x72, 0x1e, 0x78, 0xa3, 0x87, 0x4a, 0xd5, 0x38, 0x75, 0xc8, + 0x9e, 0xbf, 0x10, 0x81, 0x89, 0x4d, 0x11, 0x79, 0x7e, 0xe6, 0x6d, 0xb0, 0x06, 0x43, 0x58, 0x77, + 0x2c, 0x8d, 0x1a, 0x81, 0xf4, 0xf6, 0xc3, 0x9d, 0x7a, 0xbb, 0x8d, 0x4e, 0xf4, 0x23, 0x52, 0x62, + 0xd3, 0x9d, 0xb3, 0x09, 0x59, 0xe3, 0x43, 0x51, 0xc8, 0x74, 0xa2, 0x44, 0xf3, 0x30, 0x56, 0xb1, + 0x30, 0xbb, 0x78, 0xe5, 0xdf, 0xf9, 0x2b, 0x64, 0xbd, 0xcc, 0x32, 0x84, 0x20, 0x2b, 0xa3, 0x02, + 0xc2, 0x67, 0x8f, 0x1a, 0x90, 0xb4, 0x8f, 0xb8, 0x1d, 0xbd, 0xbf, 0xd5, 0x5f, 0x9e, 0x27, 0xf3, + 0xe9, 0x43, 0x34, 0x12, 0x64, 0xc0, 0xe6, 0x8f, 0x51, 0x0f, 0x4a, 0x27, 0x90, 0x17, 0x61, 0x4c, + 0xd3, 0x35, 0x47, 0x53, 0xeb, 0xe5, 0x2d, 0xb5, 0xae, 0xea, 0x95, 0xc3, 0x64, 0xcd, 0x2c, 0xe4, + 0xf3, 0x66, 0x43, 0xec, 0x64, 0x65, 0x94, 0x43, 0x0a, 0x0c, 0x80, 0x2e, 0xc2, 0x90, 0x68, 0x2a, + 0x76, 0xa8, 0x6c, 0x43, 0x90, 0xfb, 0x12, 0xbc, 0x5f, 0x8c, 0xc2, 0xb8, 0x82, 0xab, 0xff, 0xbf, + 0x2b, 0x0e, 0xd6, 0x15, 0xcb, 0x00, 0x6c, 0xb8, 0x93, 0x00, 0x7b, 0x88, 0xde, 0x20, 0x01, 0x23, + 0xc9, 0x38, 0x14, 0x6d, 0xc7, 0xd7, 0x1f, 0x37, 0x22, 0x90, 0xf2, 0xf7, 0xc7, 0x9f, 0xd3, 0x59, + 0x09, 0x2d, 0x7a, 0x91, 0x28, 0xc6, 0x3f, 0xbd, 0xdb, 0x21, 0x12, 0xb5, 0x78, 0x6f, 0xf7, 0x10, + 0xf4, 0x27, 0x11, 0x18, 0x5c, 0x53, 0x2d, 0xb5, 0x61, 0xa3, 0x4a, 0x4b, 0xa6, 0x29, 0xb6, 0x1f, + 0x5b, 0x3e, 0xb0, 0xce, 0x77, 0x3b, 0x7a, 0x24, 0x9a, 0x1f, 0x6b, 0x93, 0x68, 0xbe, 0x05, 0x46, + 0xc9, 0x72, 0xd8, 0x77, 0x85, 0x81, 0x58, 0x7b, 0xa4, 0x70, 0xd4, 0xe3, 0x12, 0xac, 0x67, 0xab, + 0xe5, 0xcb, 0xfe, 0x3b, 0x0c, 0xc3, 0x04, 0xc3, 0x0b, 0xcc, 0x84, 0x7c, 0xca, 0x5b, 0x96, 0xfa, + 0x2a, 0x65, 0x05, 0x1a, 0xea, 0x5e, 0x89, 0x15, 0xd0, 0x12, 0xa0, 0x1d, 0x77, 0x67, 0xa4, 0xec, + 0x99, 0x93, 0xd0, 0x9f, 0xb8, 0x79, 0x63, 0xe6, 0x28, 0xa3, 0x6f, 0xc5, 0x91, 0x95, 0x71, 0x0f, + 0x28, 0xb8, 0x3d, 0x06, 0x40, 0xf4, 0x2a, 0xb3, 0x2b, 0xdc, 0x6c, 0xb9, 0x73, 0xe4, 0xe6, 0x8d, + 0x99, 0x71, 0xc6, 0xc5, 0xab, 0x93, 0x95, 0x24, 0x29, 0x14, 0xc9, 0x6f, 0x9f, 0x67, 0x7f, 0x46, 0x02, 0xe4, 0x85, 0x7c, 0x05, 0xdb, 0x26, 0x59, 0x9f, 0x91, 0x44, 0xdc, 0x97, 0x35, 0x4b, 0xdd, - 0x13, 0x71, 0x8f, 0x5e, 0x24, 0xe2, 0xbe, 0x91, 0xf2, 0x94, 0x17, 0x1e, 0x23, 0xbd, 0xee, 0x33, - 0x73, 0x17, 0x09, 0xc7, 0xc3, 0x01, 0xf9, 0x5f, 0x4a, 0x70, 0xb4, 0xc5, 0xa3, 0x5c, 0x61, 0xff, - 0x12, 0x20, 0xcb, 0x57, 0xc9, 0xbf, 0xa3, 0xc8, 0x84, 0xde, 0xb7, 0x83, 0x8e, 0x5b, 0x2d, 0x71, - 0xf7, 0xf6, 0x45, 0x78, 0x76, 0x61, 0xfe, 0x9f, 0x49, 0x30, 0xe9, 0x6f, 0xde, 0x55, 0x64, 0x19, - 0x52, 0xfe, 0xd6, 0xb9, 0x0a, 0xf7, 0xf4, 0xa3, 0x02, 0x97, 0x3e, 0x40, 0x8f, 0x9e, 0xf5, 0x86, - 0x2b, 0xdb, 0x3b, 0x7b, 0xb4, 0x6f, 0x6b, 0x08, 0x99, 0xc2, 0xc3, 0x36, 0x46, 0xfb, 0xe3, 0xff, - 0x48, 0x10, 0x5b, 0x35, 0x8c, 0x3a, 0x32, 0x60, 0x5c, 0x37, 0x9c, 0x32, 0xf1, 0x2c, 0x5c, 0xf5, - 0xdf, 0x5b, 0x4f, 0x16, 0xe6, 0xf6, 0x67, 0xa4, 0xef, 0xdd, 0x9c, 0x6e, 0x65, 0xa5, 0x8c, 0xe9, - 0x86, 0x53, 0xa0, 0x10, 0x7e, 0x75, 0xfd, 0x9d, 0x30, 0x12, 0x6c, 0x8c, 0x45, 0xc9, 0xe7, 0xf6, - 0xdd, 0x58, 0x90, 0xcd, 0xad, 0x9b, 0xd3, 0x93, 0xde, 0x88, 0x71, 0xc1, 0xb2, 0x92, 0xda, 0xf4, - 0xb5, 0xce, 0xae, 0x77, 0xfd, 0xe0, 0xd5, 0x69, 0xe9, 0xd4, 0x97, 0x25, 0x00, 0x6f, 0xe7, 0x01, - 0x3d, 0x04, 0x47, 0x0a, 0x2b, 0xcb, 0xc5, 0xf2, 0xda, 0x7a, 0x7e, 0x7d, 0x63, 0x2d, 0x78, 0xc7, - 0x5b, 0x6c, 0x8f, 0xdb, 0x26, 0xae, 0x68, 0x5b, 0x1a, 0xae, 0xa2, 0xfb, 0x60, 0x32, 0x88, 0x4d, - 0x4a, 0xa5, 0x62, 0x5a, 0xca, 0xa6, 0xae, 0xdf, 0x98, 0x49, 0xb0, 0x5c, 0x0c, 0x57, 0xd1, 0x49, - 0x38, 0xd4, 0x8a, 0xb7, 0xb0, 0x3c, 0x9f, 0x8e, 0x64, 0x47, 0xae, 0xdf, 0x98, 0x49, 0xba, 0x49, - 0x1b, 0x92, 0x01, 0xf9, 0x31, 0x39, 0xbf, 0x68, 0x16, 0xae, 0xdf, 0x98, 0x19, 0x64, 0x06, 0xcc, - 0xc6, 0x3e, 0xf0, 0xe9, 0xa9, 0x81, 0xdb, 0x7e, 0x13, 0xfc, 0x4f, 0x86, 0x3a, 0xee, 0x7a, 0xd7, - 0xb0, 0x8e, 0x6d, 0xcd, 0x3e, 0xd0, 0xae, 0x77, 0x5f, 0x3b, 0xe9, 0xf2, 0xef, 0xc6, 0x21, 0x35, - 0xcf, 0x5a, 0x21, 0x1d, 0x81, 0xd1, 0xcf, 0xc0, 0xa0, 0x49, 0xa7, 0x11, 0xf7, 0x18, 0xad, 0x83, - 0xc3, 0xb3, 0xc9, 0xc6, 0xbd, 0xcb, 0xc5, 0xa6, 0x1e, 0x9b, 0x5f, 0xe6, 0x60, 0x77, 0xcc, 0xbc, - 0x5b, 0x53, 0xa9, 0x7d, 0xed, 0xf7, 0xb0, 0x9c, 0x85, 0x6f, 0xad, 0x84, 0xf9, 0xc9, 0xec, 0x5e, - 0xc8, 0x3a, 0x81, 0xb0, 0xdb, 0x61, 0xef, 0x93, 0xe0, 0x10, 0xc5, 0xf2, 0x26, 0x62, 0x8a, 0x29, - 0x92, 0xfd, 0x53, 0x9d, 0x54, 0x58, 0x54, 0x6d, 0xef, 0xae, 0x07, 0xbb, 0xcf, 0x75, 0x0f, 0x9f, - 0x08, 0x8f, 0xfb, 0x1a, 0x0f, 0xb3, 0x95, 0x95, 0x89, 0x7a, 0x0b, 0xa5, 0x8d, 0xe6, 0x03, 0x17, - 0xfa, 0x62, 0xfb, 0xdb, 0x6a, 0xf7, 0x5f, 0xee, 0x7b, 0x06, 0x86, 0xbd, 0x58, 0x62, 0xf3, 0xff, - 0xfb, 0xd2, 0xff, 0xdc, 0xe1, 0x27, 0x46, 0xef, 0x97, 0xe0, 0x90, 0x37, 0x9b, 0xfb, 0xd9, 0xb2, - 0xff, 0x8f, 0xf3, 0xe0, 0x3e, 0x16, 0x42, 0x61, 0xe3, 0xb4, 0xe5, 0x2b, 0x2b, 0x93, 0xcd, 0x56, - 0x52, 0xb2, 0x04, 0x1b, 0xf1, 0x47, 0x56, 0x3b, 0x23, 0x3e, 0x01, 0xd9, 0x7f, 0x68, 0x0e, 0x32, - 0x60, 0xff, 0xb3, 0xc3, 0x34, 0x2c, 0x07, 0x57, 0xe9, 0x86, 0x5c, 0x42, 0x71, 0xcb, 0xf2, 0x32, - 0xa0, 0xd6, 0xce, 0x0d, 0x5f, 0x60, 0xf4, 0xde, 0xa7, 0xa0, 0x49, 0x88, 0xfb, 0xaf, 0xf8, 0xb1, - 0x42, 0x2e, 0xf1, 0x01, 0x3e, 0x7d, 0xde, 0xf6, 0x31, 0xff, 0xed, 0x08, 0x9c, 0xf2, 0x1f, 0x0f, - 0xbd, 0xd4, 0xc4, 0xd6, 0x9e, 0x3b, 0x44, 0x4d, 0xb5, 0xa6, 0xe9, 0xfe, 0x57, 0x10, 0x47, 0xfd, - 0x13, 0x3e, 0xc5, 0x15, 0x76, 0x92, 0x3f, 0x20, 0xc1, 0xf0, 0xaa, 0x5a, 0xc3, 0x0a, 0x7e, 0xa9, - 0x89, 0x6d, 0xa7, 0xcd, 0x2d, 0xf3, 0xc3, 0x30, 0x68, 0x6c, 0x6d, 0x89, 0x33, 0xed, 0x98, 0xc2, - 0x4b, 0x44, 0xe7, 0xba, 0xd6, 0xd0, 0xd8, 0x75, 0xb0, 0x98, 0xc2, 0x0a, 0x68, 0x1a, 0x86, 0x2b, - 0x46, 0x53, 0xe7, 0x43, 0x2e, 0x13, 0x13, 0xdf, 0x5a, 0x69, 0xea, 0x6c, 0xc8, 0x11, 0x23, 0x5a, - 0xf8, 0x0a, 0xb6, 0x6c, 0xf6, 0x75, 0xc9, 0x84, 0x22, 0x8a, 0xf2, 0xd3, 0x90, 0x62, 0x92, 0xf0, - 0xc9, 0xf8, 0x28, 0x24, 0xe8, 0x4d, 0x2b, 0x4f, 0x9e, 0x21, 0x52, 0xbe, 0xc4, 0xee, 0xaa, 0x33, - 0xfe, 0x4c, 0x24, 0x56, 0x28, 0x14, 0x3a, 0x5a, 0xf9, 0x64, 0xef, 0xa8, 0xc1, 0x6c, 0xe8, 0x5a, - 0xf8, 0x37, 0xe3, 0x70, 0x88, 0x1f, 0xde, 0xa9, 0xa6, 0x76, 0x7a, 0xdb, 0x71, 0xc4, 0xdb, 0x09, - 0xe0, 0x59, 0xb0, 0x6a, 0x6a, 0xf2, 0x1e, 0xc4, 0x2e, 0x3a, 0x8e, 0x89, 0x4e, 0x41, 0xdc, 0x6a, - 0xd6, 0xb1, 0xd8, 0x0c, 0x72, 0xb7, 0xeb, 0x55, 0x53, 0x9b, 0x25, 0x08, 0x4a, 0xb3, 0x8e, 0x15, - 0x86, 0x82, 0x4a, 0x30, 0xbd, 0xd5, 0xac, 0xd7, 0xf7, 0xca, 0x55, 0x4c, 0xff, 0x5d, 0x96, 0xfb, - 0x0f, 0x27, 0xf0, 0xae, 0xa9, 0x8a, 0xcf, 0x56, 0x12, 0xc3, 0x1c, 0xa7, 0x68, 0x45, 0x8a, 0x25, - 0xfe, 0xd9, 0x44, 0x49, 0xe0, 0xc8, 0xbf, 0x1f, 0x81, 0x84, 0x60, 0x4d, 0x2f, 0x8f, 0xe3, 0x3a, - 0xae, 0x38, 0x86, 0x38, 0x4c, 0x71, 0xcb, 0x08, 0x41, 0xb4, 0xc6, 0x3b, 0x2f, 0x79, 0x71, 0x40, - 0x21, 0x05, 0x02, 0x73, 0xaf, 0xf4, 0x13, 0x98, 0xd9, 0x24, 0xfd, 0x19, 0x33, 0x0d, 0xb1, 0x6a, - 0xbb, 0x38, 0xa0, 0xd0, 0x12, 0xca, 0xc0, 0x20, 0x19, 0x34, 0x0e, 0xeb, 0x2d, 0x02, 0xe7, 0x65, - 0x74, 0x18, 0xe2, 0xa6, 0xea, 0x54, 0xd8, 0x6d, 0x3b, 0x52, 0xc1, 0x8a, 0xe8, 0x09, 0x18, 0x64, - 0xaf, 0xb2, 0xc3, 0xff, 0x8b, 0x86, 0x18, 0x83, 0x7d, 0xfe, 0x8e, 0xc8, 0xbd, 0xaa, 0x3a, 0x0e, - 0xb6, 0x74, 0xc2, 0x90, 0xa1, 0x23, 0x04, 0xb1, 0x4d, 0xa3, 0xba, 0xc7, 0xff, 0x3f, 0x0e, 0xfd, - 0xcd, 0xff, 0x21, 0x07, 0xf5, 0x87, 0x32, 0xad, 0x64, 0xff, 0x16, 0x2c, 0x25, 0x80, 0x05, 0x82, - 0x54, 0x82, 0x09, 0xb5, 0x5a, 0xd5, 0xd8, 0xbf, 0xaa, 0x29, 0x6f, 0x6a, 0x34, 0x78, 0xd8, 0xf4, - 0x9f, 0xbe, 0x75, 0xea, 0x0b, 0xe4, 0x11, 0x14, 0x38, 0x7e, 0x21, 0x09, 0x43, 0x26, 0x13, 0x4a, - 0x3e, 0x0f, 0xe3, 0x2d, 0x92, 0x12, 0xf9, 0x76, 0x34, 0xbd, 0x2a, 0xde, 0x39, 0x90, 0xdf, 0x04, - 0x46, 0x3f, 0x58, 0xc9, 0x8e, 0xa9, 0xe8, 0xef, 0xc2, 0x7b, 0x3a, 0x3f, 0x87, 0x19, 0xf5, 0x3d, - 0x87, 0x51, 0x4d, 0xad, 0x90, 0xa4, 0xfc, 0xf9, 0x23, 0x98, 0x7c, 0xeb, 0x23, 0x98, 0x1a, 0xd6, - 0xc5, 0xc4, 0x4c, 0xaa, 0x54, 0x53, 0xb3, 0xa9, 0x3b, 0x7a, 0x1f, 0xd0, 0xb4, 0xcf, 0xfb, 0x7e, - 0xd3, 0x37, 0x31, 0xb1, 0xf9, 0xfc, 0xea, 0x82, 0xeb, 0xc7, 0x5f, 0x8d, 0xc0, 0x71, 0x9f, 0x1f, - 0xfb, 0x90, 0x5b, 0xdd, 0x39, 0xdb, 0xde, 0xe3, 0xfb, 0x78, 0x9b, 0x7c, 0x09, 0x62, 0x04, 0x1f, - 0xf5, 0xf8, 0x77, 0x19, 0x99, 0xcf, 0x7f, 0xe3, 0x9f, 0xca, 0xc1, 0x03, 0xad, 0x40, 0xaf, 0x50, - 0x26, 0x85, 0xf7, 0xf7, 0x6f, 0xbf, 0xb4, 0xf7, 0xed, 0x50, 0xfb, 0xf6, 0x99, 0x31, 0x6c, 0xc3, - 0xef, 0x9e, 0xed, 0xf8, 0x76, 0x95, 0x05, 0xd3, 0xee, 0xf9, 0xd5, 0x3e, 0x22, 0x75, 0xa7, 0xa7, - 0x01, 0xdd, 0x7a, 0xb0, 0xcf, 0x4c, 0x6d, 0x17, 0x0e, 0x3f, 0x4b, 0xda, 0xf6, 0x56, 0xd0, 0x22, - 0xe4, 0x1f, 0x76, 0x0f, 0xfa, 0x24, 0xfe, 0x3f, 0xf7, 0xc4, 0x21, 0x1e, 0x78, 0xf2, 0xf1, 0xb5, - 0xe3, 0x7d, 0xb3, 0x1d, 0xa7, 0x92, 0x59, 0xdf, 0x34, 0xa2, 0xf8, 0x28, 0xe5, 0x5f, 0x95, 0xe0, - 0x48, 0x4b, 0xd3, 0x3c, 0xc6, 0xcf, 0xb7, 0x79, 0xc5, 0x70, 0xa0, 0xa4, 0x67, 0xbe, 0x8d, 0xb0, - 0xf7, 0xf7, 0x14, 0x96, 0x49, 0x11, 0x90, 0xf6, 0xcd, 0x70, 0x28, 0x28, 0xac, 0x30, 0xd3, 0xbd, + 0x13, 0x71, 0x8f, 0x5e, 0x24, 0xe2, 0xbe, 0x91, 0xf2, 0xa4, 0x17, 0x1e, 0x23, 0xbd, 0xee, 0x33, + 0x73, 0x17, 0x09, 0xc7, 0xc3, 0x01, 0xf9, 0x9f, 0x4b, 0x70, 0xb4, 0xc5, 0xa3, 0x5c, 0x61, 0xff, + 0x02, 0x20, 0xcb, 0x57, 0xc9, 0xbf, 0xa3, 0xc8, 0x84, 0x3e, 0xb0, 0x83, 0x8e, 0x5b, 0x2d, 0x71, + 0xf7, 0xd6, 0x45, 0x78, 0x76, 0x61, 0xfe, 0x9f, 0x48, 0x30, 0xe9, 0x6f, 0xde, 0x55, 0x64, 0x05, + 0x52, 0xfe, 0xd6, 0xb9, 0x0a, 0x77, 0xf7, 0xa3, 0x02, 0x97, 0x3e, 0x40, 0x8f, 0x9e, 0xf1, 0x86, + 0x2b, 0xdb, 0x3b, 0x7b, 0xa4, 0x6f, 0x6b, 0x08, 0x99, 0xc2, 0xc3, 0x36, 0x46, 0xfb, 0xe3, 0xff, + 0x48, 0x10, 0x5b, 0x33, 0x8c, 0x3a, 0x32, 0x60, 0x5c, 0x37, 0x9c, 0x32, 0xf1, 0x2c, 0x5c, 0xf5, + 0xdf, 0x5b, 0x4f, 0x16, 0xe6, 0x0f, 0x66, 0xa4, 0xef, 0xdf, 0x98, 0x69, 0x65, 0xa5, 0x8c, 0xe9, + 0x86, 0x53, 0xa0, 0x10, 0x7e, 0x75, 0xfd, 0x9d, 0x30, 0x12, 0x6c, 0x8c, 0x45, 0xc9, 0x67, 0x0f, + 0xdc, 0x58, 0x90, 0xcd, 0xcd, 0x1b, 0x33, 0x93, 0xde, 0x88, 0x71, 0xc1, 0xb2, 0x92, 0xda, 0xf2, + 0xb5, 0xce, 0xae, 0x77, 0xfd, 0xf0, 0xd5, 0x19, 0xe9, 0xd4, 0x57, 0x24, 0x00, 0x6f, 0xe7, 0x01, + 0x3d, 0x08, 0x77, 0x14, 0x56, 0x57, 0x8a, 0xe5, 0xf5, 0x8d, 0xfc, 0xc6, 0xe6, 0x7a, 0xf0, 0x8e, + 0xb7, 0xd8, 0x1e, 0xb7, 0x4d, 0x5c, 0xd1, 0xb6, 0x35, 0x5c, 0x45, 0xf7, 0xc2, 0x64, 0x10, 0x9b, + 0x94, 0x4a, 0xc5, 0xb4, 0x94, 0x4d, 0xbd, 0x7c, 0x7d, 0x36, 0xc1, 0x72, 0x31, 0x5c, 0x45, 0x27, + 0xe1, 0x48, 0x2b, 0xde, 0xe2, 0xca, 0x42, 0x3a, 0x92, 0x1d, 0x79, 0xf9, 0xfa, 0x6c, 0xd2, 0x4d, + 0xda, 0x90, 0x0c, 0xc8, 0x8f, 0xc9, 0xf9, 0x45, 0xb3, 0xf0, 0xf2, 0xf5, 0xd9, 0x41, 0x66, 0xc0, + 0x6c, 0xec, 0x03, 0x9f, 0x99, 0x1e, 0xb8, 0xe5, 0x37, 0xc1, 0xff, 0x68, 0xa8, 0xe3, 0xae, 0x77, + 0x0d, 0xeb, 0xd8, 0xd6, 0xec, 0x43, 0xed, 0x7a, 0xf7, 0xb5, 0x93, 0x2e, 0xff, 0x4e, 0x1c, 0x52, + 0x0b, 0xac, 0x15, 0xd2, 0x11, 0x18, 0xfd, 0x1c, 0x0c, 0x9a, 0x74, 0x1a, 0x71, 0x8f, 0xd1, 0x3a, + 0x38, 0x3c, 0x9b, 0x6c, 0xdc, 0xbb, 0x5c, 0x6c, 0xea, 0xb1, 0xf9, 0x65, 0x0e, 0x76, 0xc7, 0xcc, + 0xbb, 0x35, 0x95, 0x3a, 0xd0, 0x7e, 0x0f, 0xcb, 0x59, 0xf8, 0xd6, 0x4a, 0x98, 0x9f, 0xcc, 0xee, + 0x85, 0x6c, 0x10, 0x08, 0xbb, 0x1d, 0xf6, 0x3e, 0x09, 0x8e, 0x50, 0x2c, 0x6f, 0x22, 0xa6, 0x98, + 0x22, 0xd9, 0x3f, 0xd5, 0x49, 0x85, 0x25, 0xd5, 0xf6, 0xee, 0x7a, 0xb0, 0xfb, 0x5c, 0x77, 0xf3, + 0x89, 0xf0, 0xb8, 0xaf, 0xf1, 0x30, 0x5b, 0x59, 0x99, 0xa8, 0xb7, 0x50, 0xda, 0x68, 0x21, 0x70, + 0xa1, 0x2f, 0x76, 0xb0, 0xad, 0x76, 0xff, 0xe5, 0xbe, 0xa7, 0x61, 0xd8, 0x8b, 0x25, 0x36, 0xff, + 0xbf, 0x2f, 0xfd, 0xcf, 0x1d, 0x7e, 0x62, 0xf4, 0x7e, 0x09, 0x8e, 0x78, 0xb3, 0xb9, 0x9f, 0x2d, + 0xfb, 0xff, 0x38, 0x0f, 0x1c, 0x60, 0x21, 0x14, 0x36, 0x4e, 0x5b, 0xbe, 0xb2, 0x32, 0xd9, 0x6c, + 0x25, 0x25, 0x4b, 0xb0, 0x11, 0x7f, 0x64, 0xb5, 0x33, 0xe2, 0x13, 0x90, 0xfd, 0x87, 0xe6, 0x20, + 0x03, 0xf6, 0x3f, 0x3b, 0x4c, 0xc3, 0x72, 0x70, 0x95, 0x6e, 0xc8, 0x25, 0x14, 0xb7, 0x2c, 0xaf, + 0x00, 0x6a, 0xed, 0xdc, 0xf0, 0x05, 0x46, 0xef, 0x7d, 0x0a, 0x9a, 0x84, 0xb8, 0xff, 0x8a, 0x1f, + 0x2b, 0xe4, 0x12, 0x1f, 0xe0, 0xd3, 0xe7, 0x2d, 0x1f, 0xf3, 0xdf, 0x89, 0xc0, 0x29, 0xff, 0xf1, + 0xd0, 0x8b, 0x4d, 0x6c, 0xed, 0xbb, 0x43, 0xd4, 0x54, 0x6b, 0x9a, 0xee, 0x7f, 0x05, 0x71, 0xd4, + 0x3f, 0xe1, 0x53, 0x5c, 0x61, 0x27, 0xf9, 0x03, 0x12, 0x0c, 0xaf, 0xa9, 0x35, 0xac, 0xe0, 0x17, + 0x9b, 0xd8, 0x76, 0xda, 0xdc, 0x32, 0x9f, 0x82, 0x41, 0x63, 0x7b, 0x5b, 0x9c, 0x69, 0xc7, 0x14, + 0x5e, 0x22, 0x3a, 0xd7, 0xb5, 0x86, 0xc6, 0xae, 0x83, 0xc5, 0x14, 0x56, 0x40, 0x33, 0x30, 0x5c, + 0x31, 0x9a, 0x3a, 0x1f, 0x72, 0x99, 0x98, 0xf8, 0xd6, 0x4a, 0x53, 0x67, 0x43, 0x8e, 0x18, 0xd1, + 0xc2, 0x57, 0xb0, 0x65, 0xb3, 0xaf, 0x4b, 0x26, 0x14, 0x51, 0x94, 0x9f, 0x82, 0x14, 0x93, 0x84, + 0x4f, 0xc6, 0x47, 0x21, 0x41, 0x6f, 0x5a, 0x79, 0xf2, 0x0c, 0x91, 0xf2, 0x25, 0x76, 0x57, 0x9d, + 0xf1, 0x67, 0x22, 0xb1, 0x42, 0xa1, 0xd0, 0xd1, 0xca, 0x27, 0x7b, 0x47, 0x0d, 0x66, 0x43, 0xd7, + 0xc2, 0xbf, 0x15, 0x87, 0x23, 0xfc, 0xf0, 0x4e, 0x35, 0xb5, 0xd3, 0x3b, 0x8e, 0x23, 0xde, 0x4e, + 0x00, 0xcf, 0x82, 0x55, 0x53, 0x93, 0xf7, 0x21, 0x76, 0xd1, 0x71, 0x4c, 0x74, 0x0a, 0xe2, 0x56, + 0xb3, 0x8e, 0xc5, 0x66, 0x90, 0xbb, 0x5d, 0xaf, 0x9a, 0xda, 0x1c, 0x41, 0x50, 0x9a, 0x75, 0xac, + 0x30, 0x14, 0x54, 0x82, 0x99, 0xed, 0x66, 0xbd, 0xbe, 0x5f, 0xae, 0x62, 0xfa, 0xef, 0xb2, 0xdc, + 0x7f, 0x38, 0x81, 0xf7, 0x4c, 0x55, 0x7c, 0xb6, 0x92, 0x18, 0xe6, 0x38, 0x45, 0x2b, 0x52, 0x2c, + 0xf1, 0xcf, 0x26, 0x4a, 0x02, 0x47, 0xfe, 0xbd, 0x08, 0x24, 0x04, 0x6b, 0x7a, 0x79, 0x1c, 0xd7, + 0x71, 0xc5, 0x31, 0xc4, 0x61, 0x8a, 0x5b, 0x46, 0x08, 0xa2, 0x35, 0xde, 0x79, 0xc9, 0x8b, 0x03, + 0x0a, 0x29, 0x10, 0x98, 0x7b, 0xa5, 0x9f, 0xc0, 0xcc, 0x26, 0xe9, 0xcf, 0x98, 0x69, 0x88, 0x55, + 0xdb, 0xc5, 0x01, 0x85, 0x96, 0x50, 0x06, 0x06, 0xc9, 0xa0, 0x71, 0x58, 0x6f, 0x11, 0x38, 0x2f, + 0xa3, 0x29, 0x88, 0x9b, 0xaa, 0x53, 0x61, 0xb7, 0xed, 0x48, 0x05, 0x2b, 0xa2, 0xc7, 0x61, 0x90, + 0xbd, 0xca, 0x0e, 0xff, 0x2f, 0x1a, 0x62, 0x0c, 0xf6, 0xf9, 0x3b, 0x22, 0xf7, 0x9a, 0xea, 0x38, + 0xd8, 0xd2, 0x09, 0x43, 0x86, 0x8e, 0x10, 0xc4, 0xb6, 0x8c, 0xea, 0x3e, 0xff, 0xff, 0x38, 0xf4, + 0x37, 0xff, 0x87, 0x1c, 0xd4, 0x1f, 0xca, 0xb4, 0x92, 0xfd, 0x5b, 0xb0, 0x94, 0x00, 0x16, 0x08, + 0x52, 0x09, 0x26, 0xd4, 0x6a, 0x55, 0x63, 0xff, 0xaa, 0xa6, 0xbc, 0xa5, 0xd1, 0xe0, 0x61, 0xd3, + 0x7f, 0xfa, 0xd6, 0xa9, 0x2f, 0x90, 0x47, 0x50, 0xe0, 0xf8, 0x85, 0x24, 0x0c, 0x99, 0x4c, 0x28, + 0xf9, 0x3c, 0x8c, 0xb7, 0x48, 0x4a, 0xe4, 0xdb, 0xd5, 0xf4, 0xaa, 0x78, 0xe7, 0x40, 0x7e, 0x13, + 0x18, 0xfd, 0x60, 0x25, 0x3b, 0xa6, 0xa2, 0xbf, 0x0b, 0xef, 0xe9, 0xfc, 0x1c, 0x66, 0xd4, 0xf7, + 0x1c, 0x46, 0x35, 0xb5, 0x42, 0x92, 0xf2, 0xe7, 0x8f, 0x60, 0xf2, 0xad, 0x8f, 0x60, 0x6a, 0x58, + 0x17, 0x13, 0x33, 0xa9, 0x52, 0x4d, 0xcd, 0xa6, 0xee, 0xe8, 0x7d, 0x40, 0xd3, 0x3e, 0xef, 0xfb, + 0x4d, 0xdf, 0xc4, 0xc4, 0x16, 0xf2, 0x6b, 0x8b, 0xae, 0x1f, 0x7f, 0x2d, 0x02, 0xc7, 0x7d, 0x7e, + 0xec, 0x43, 0x6e, 0x75, 0xe7, 0x6c, 0x7b, 0x8f, 0xef, 0xe3, 0x6d, 0xf2, 0x25, 0x88, 0x11, 0x7c, + 0xd4, 0xe3, 0xdf, 0x65, 0x64, 0xbe, 0xf0, 0xcd, 0x7f, 0x2c, 0x07, 0x0f, 0xb4, 0x02, 0xbd, 0x42, + 0x99, 0x14, 0xde, 0xdf, 0xbf, 0xfd, 0xd2, 0xde, 0xb7, 0x43, 0xed, 0x5b, 0x67, 0xc6, 0xb0, 0x0d, + 0x5f, 0x3f, 0xdb, 0xf1, 0xed, 0x2a, 0x0b, 0xa6, 0xdd, 0xf3, 0xab, 0x03, 0x44, 0xea, 0x4e, 0x4f, + 0x03, 0xba, 0xf5, 0x60, 0x9f, 0x99, 0xda, 0x1e, 0x4c, 0x3d, 0x43, 0xda, 0xf6, 0x56, 0xd0, 0x22, + 0xe4, 0x4f, 0xb9, 0x07, 0x7d, 0x12, 0xff, 0x9f, 0x7b, 0xe2, 0x10, 0x0f, 0x3c, 0xf9, 0xf8, 0xda, + 0xf1, 0xde, 0xb9, 0x8e, 0x53, 0xc9, 0x9c, 0x6f, 0x1a, 0x51, 0x7c, 0x94, 0xf2, 0xaf, 0x49, 0x70, + 0x47, 0x4b, 0xd3, 0x3c, 0xc6, 0x2f, 0xb4, 0x79, 0xc5, 0x70, 0xa8, 0xa4, 0x67, 0xa1, 0x8d, 0xb0, + 0xf7, 0xf5, 0x14, 0x96, 0x49, 0x11, 0x90, 0xf6, 0xcd, 0x70, 0x24, 0x28, 0xac, 0x30, 0xd3, 0x3d, 0x30, 0x1a, 0xdc, 0x2c, 0xe6, 0xe6, 0x1a, 0x09, 0x6c, 0x17, 0xcb, 0xe5, 0xb0, 0x9d, 0x5d, 0x5d, - 0x4b, 0x90, 0x74, 0x51, 0x79, 0x76, 0xdc, 0xb7, 0xaa, 0x1e, 0xa5, 0xfc, 0x61, 0x09, 0x66, 0x82, - 0x2d, 0xf8, 0xf2, 0xa4, 0xfd, 0x09, 0x7b, 0xdb, 0xba, 0xf8, 0x75, 0x09, 0xee, 0xea, 0x22, 0x13, - 0x37, 0xc0, 0x35, 0x98, 0xf4, 0x6d, 0x12, 0x88, 0x10, 0x2e, 0xba, 0xfd, 0x54, 0xef, 0x0c, 0xd5, - 0x5d, 0x13, 0x1f, 0x23, 0x46, 0xf9, 0xec, 0xb7, 0xa7, 0x27, 0x5a, 0xeb, 0x6c, 0x65, 0xa2, 0x75, - 0x61, 0x7f, 0x1b, 0xfd, 0xe3, 0x15, 0x09, 0x1e, 0x08, 0xaa, 0xda, 0x26, 0xd5, 0xfd, 0x49, 0xf5, - 0xc3, 0xbf, 0x97, 0xe0, 0x54, 0x3f, 0xc2, 0xf1, 0x0e, 0xd9, 0x84, 0x09, 0x2f, 0x09, 0x0f, 0xf7, - 0xc7, 0xbe, 0x52, 0x7b, 0xe6, 0xa5, 0xc8, 0xe5, 0x76, 0x07, 0x0c, 0x6f, 0xf2, 0x81, 0xe5, 0xef, - 0x72, 0xd7, 0xc8, 0xc1, 0x8d, 0x5e, 0x61, 0xe4, 0xc0, 0x56, 0x6f, 0x9b, 0xbe, 0x88, 0xb4, 0xe9, - 0x0b, 0x2f, 0x6b, 0x97, 0xaf, 0xf0, 0xb8, 0xd5, 0x66, 0x7b, 0xee, 0x6d, 0x30, 0xd1, 0xc6, 0x95, - 0xf9, 0xa8, 0xde, 0x87, 0x27, 0x2b, 0xa8, 0xd5, 0x59, 0xe5, 0x3d, 0x98, 0xa6, 0xed, 0xb6, 0x31, - 0xf4, 0x9d, 0x56, 0xb9, 0xc1, 0x63, 0x4b, 0xdb, 0xa6, 0xb9, 0xee, 0x0b, 0x30, 0xc8, 0xfa, 0x99, - 0xab, 0x7b, 0x00, 0x47, 0xe1, 0x0c, 0xe4, 0x8f, 0x8b, 0x58, 0x56, 0x14, 0x62, 0xb7, 0x1f, 0x43, - 0xfd, 0xe8, 0x7a, 0x9b, 0xc6, 0x90, 0xcf, 0x18, 0xdf, 0x12, 0x51, 0xad, 0xbd, 0x74, 0xdc, 0x1c, - 0x95, 0xdb, 0x16, 0xd5, 0x98, 0x6d, 0xee, 0x6c, 0xf8, 0xfa, 0x65, 0x11, 0xbe, 0x5c, 0x9d, 0x7a, - 0x84, 0xaf, 0x9f, 0x8c, 0xe9, 0xdd, 0x40, 0xd6, 0x43, 0xcc, 0x3f, 0x8f, 0x81, 0xec, 0x07, 0x12, - 0x1c, 0xa5, 0xba, 0xf9, 0xf7, 0x28, 0xf6, 0x6b, 0xf2, 0x87, 0x00, 0xd9, 0x56, 0xa5, 0xdc, 0x76, - 0x74, 0xa7, 0x6d, 0xab, 0x72, 0x39, 0x30, 0xbf, 0x3c, 0x04, 0xa8, 0x1a, 0xd8, 0x89, 0xa2, 0xd8, - 0xec, 0x02, 0x5d, 0xba, 0xea, 0xdb, 0xe8, 0x68, 0xd3, 0x9d, 0xb1, 0xdb, 0xd0, 0x9d, 0xdf, 0x94, - 0x20, 0xdb, 0x4e, 0x65, 0xde, 0x7d, 0x1a, 0x1c, 0x0e, 0x9c, 0x1f, 0x84, 0x7b, 0xf0, 0xa1, 0x7e, - 0x76, 0x79, 0x42, 0xc3, 0xe8, 0x90, 0x85, 0xef, 0x74, 0x1e, 0x30, 0x1d, 0xf4, 0xd0, 0xd6, 0xcc, - 0xfa, 0x27, 0x36, 0x7c, 0xbe, 0xd4, 0x12, 0x57, 0xff, 0x5c, 0xe4, 0xde, 0xbb, 0x30, 0xd5, 0x41, - 0xea, 0x3b, 0x3d, 0xef, 0x6d, 0x77, 0xec, 0xcc, 0xdb, 0x9d, 0xbe, 0x3f, 0xce, 0x47, 0x42, 0xf0, + 0x4b, 0x90, 0x74, 0x51, 0x79, 0x76, 0xdc, 0xb7, 0xaa, 0x1e, 0xa5, 0xfc, 0x11, 0x09, 0x66, 0x83, + 0x2d, 0xf8, 0xf2, 0xa4, 0x83, 0x09, 0x7b, 0xcb, 0xba, 0xf8, 0x7b, 0x12, 0xdc, 0xd9, 0x45, 0x26, + 0x6e, 0x80, 0x6b, 0x30, 0xe9, 0xdb, 0x24, 0x10, 0x21, 0x5c, 0x74, 0xfb, 0xa9, 0xde, 0x19, 0xaa, + 0xbb, 0x26, 0x3e, 0x46, 0x8c, 0xf2, 0xb9, 0xef, 0xcc, 0x4c, 0xb4, 0xd6, 0xd9, 0xca, 0x44, 0xeb, + 0xc2, 0xfe, 0x16, 0xfa, 0xc7, 0x2b, 0x12, 0xdc, 0x1f, 0x54, 0xb5, 0x4d, 0xaa, 0xfb, 0xd3, 0xea, + 0x87, 0x7f, 0x2f, 0xc1, 0xa9, 0x7e, 0x84, 0xe3, 0x1d, 0xb2, 0x05, 0x13, 0x5e, 0x12, 0x1e, 0xee, + 0x8f, 0x03, 0xa5, 0xf6, 0xcc, 0x4b, 0x91, 0xcb, 0xed, 0x36, 0x18, 0xde, 0xe4, 0x03, 0xcb, 0xdf, + 0xe5, 0xae, 0x91, 0x83, 0x1b, 0xbd, 0xc2, 0xc8, 0x81, 0xad, 0xde, 0x36, 0x7d, 0x11, 0x69, 0xd3, + 0x17, 0x5e, 0xd6, 0x2e, 0x5f, 0xe1, 0x71, 0xab, 0xcd, 0xf6, 0xdc, 0xdb, 0x60, 0xa2, 0x8d, 0x2b, + 0xf3, 0x51, 0x7d, 0x00, 0x4f, 0x56, 0x50, 0xab, 0xb3, 0xca, 0xfb, 0x30, 0x43, 0xdb, 0x6d, 0x63, + 0xe8, 0xdb, 0xad, 0x72, 0x83, 0xc7, 0x96, 0xb6, 0x4d, 0x73, 0xdd, 0x17, 0x61, 0x90, 0xf5, 0x33, + 0x57, 0xf7, 0x10, 0x8e, 0xc2, 0x19, 0xc8, 0x9f, 0x10, 0xb1, 0xac, 0x28, 0xc4, 0x6e, 0x3f, 0x86, + 0xfa, 0xd1, 0xf5, 0x16, 0x8d, 0x21, 0x9f, 0x31, 0xbe, 0x2d, 0xa2, 0x5a, 0x7b, 0xe9, 0xb8, 0x39, + 0x2a, 0xb7, 0x2c, 0xaa, 0x31, 0xdb, 0xdc, 0xde, 0xf0, 0xf5, 0x2b, 0x22, 0x7c, 0xb9, 0x3a, 0xf5, + 0x08, 0x5f, 0x3f, 0x1d, 0xd3, 0xbb, 0x81, 0xac, 0x87, 0x98, 0x7f, 0x16, 0x03, 0xd9, 0x0f, 0x25, + 0x38, 0x4a, 0x75, 0xf3, 0xef, 0x51, 0x1c, 0xd4, 0xe4, 0x0f, 0x02, 0xb2, 0xad, 0x4a, 0xb9, 0xed, + 0xe8, 0x4e, 0xdb, 0x56, 0xe5, 0x72, 0x60, 0x7e, 0x79, 0x10, 0x50, 0x35, 0xb0, 0x13, 0x45, 0xb1, + 0xd9, 0x05, 0xba, 0x74, 0xd5, 0xb7, 0xd1, 0xd1, 0xa6, 0x3b, 0x63, 0xb7, 0xa0, 0x3b, 0xbf, 0x25, + 0x41, 0xb6, 0x9d, 0xca, 0xbc, 0xfb, 0x34, 0x98, 0x0a, 0x9c, 0x1f, 0x84, 0x7b, 0xf0, 0xc1, 0x7e, + 0x76, 0x79, 0x42, 0xc3, 0xe8, 0x88, 0x85, 0x6f, 0x77, 0x1e, 0x30, 0x13, 0xf4, 0xd0, 0xd6, 0xcc, + 0xfa, 0xa7, 0x36, 0x7c, 0xbe, 0xdc, 0x12, 0x57, 0xff, 0x4c, 0xe4, 0xde, 0x7b, 0x30, 0xdd, 0x41, + 0xea, 0xdb, 0x3d, 0xef, 0xed, 0x74, 0xec, 0xcc, 0x5b, 0x9d, 0xbe, 0x3f, 0xc6, 0x47, 0x42, 0xf0, 0x72, 0xb6, 0x6f, 0x2d, 0xd6, 0xee, 0x75, 0x97, 0xfc, 0x56, 0x38, 0xd6, 0x96, 0x8a, 0xcb, 0x96, - 0x83, 0xd8, 0xb6, 0x66, 0x3b, 0x5c, 0xac, 0xfb, 0x3a, 0x89, 0x15, 0xa2, 0xa6, 0x34, 0x32, 0x82, - 0x34, 0x65, 0xbd, 0x6a, 0x18, 0x75, 0x2e, 0x86, 0x7c, 0x09, 0xc6, 0x7d, 0x30, 0xde, 0xc8, 0x39, + 0x83, 0xd8, 0x8e, 0x66, 0x3b, 0x5c, 0xac, 0x7b, 0x3b, 0x89, 0x15, 0xa2, 0xa6, 0x34, 0x32, 0x82, + 0x34, 0x65, 0xbd, 0x66, 0x18, 0x75, 0x2e, 0x86, 0x7c, 0x09, 0xc6, 0x7d, 0x30, 0xde, 0xc8, 0x39, 0x88, 0x99, 0x06, 0xff, 0x72, 0xc1, 0xf0, 0x99, 0xe3, 0x1d, 0x37, 0xf6, 0x0d, 0xa3, 0xce, 0xd5, - 0xa6, 0xf8, 0xf2, 0x24, 0x20, 0xc6, 0x8c, 0xee, 0xf1, 0x8b, 0x26, 0xd6, 0x60, 0x22, 0x00, 0xe5, - 0x8d, 0xbc, 0xa1, 0xf3, 0x83, 0x33, 0xdf, 0x3b, 0x04, 0x71, 0xca, 0x15, 0x7d, 0x4c, 0x0a, 0x7c, - 0x5a, 0x68, 0xb6, 0x13, 0x9b, 0xf6, 0x6b, 0xe2, 0xec, 0xe9, 0xbe, 0xf1, 0x79, 0xce, 0x76, 0xea, - 0x3d, 0xff, 0xe6, 0xbb, 0x1f, 0x89, 0xdc, 0x83, 0xe4, 0xd3, 0x1d, 0x56, 0xe3, 0xbe, 0xf1, 0xf2, - 0x99, 0xc0, 0xb3, 0xf8, 0x87, 0xfb, 0x6b, 0x4a, 0x48, 0x36, 0xdb, 0x2f, 0x3a, 0x17, 0xec, 0x3c, - 0x15, 0xec, 0x2c, 0x7a, 0xac, 0xb7, 0x60, 0xa7, 0xdf, 0x11, 0x1c, 0x34, 0xef, 0x42, 0xbf, 0x2b, - 0xc1, 0x64, 0xbb, 0x25, 0x1d, 0x7a, 0xb2, 0x3f, 0x29, 0x5a, 0x53, 0x8a, 0xec, 0x53, 0x07, 0xa0, - 0xe4, 0xaa, 0xcc, 0x53, 0x55, 0xf2, 0xe8, 0xe9, 0x03, 0xa8, 0x72, 0xda, 0xbf, 0xf5, 0xff, 0xbf, - 0x24, 0x38, 0xd1, 0x75, 0x85, 0x84, 0xf2, 0xfd, 0x49, 0xd9, 0x25, 0x77, 0xca, 0x16, 0xde, 0x08, - 0x0b, 0xae, 0xf1, 0xb3, 0x54, 0xe3, 0x4b, 0x68, 0xe1, 0x20, 0x1a, 0xb7, 0x3d, 0x5f, 0x41, 0xbf, - 0x15, 0xbc, 0x74, 0xd8, 0xdd, 0x9d, 0x5a, 0x16, 0x1e, 0x3d, 0x06, 0x46, 0x6b, 0x52, 0x2b, 0x3f, - 0x4f, 0x55, 0x50, 0xd0, 0xea, 0x1b, 0xec, 0xb4, 0xd3, 0xef, 0x08, 0x06, 0xfe, 0x77, 0xa1, 0xff, - 0x29, 0xb5, 0xbf, 0x43, 0xf8, 0x44, 0x57, 0x11, 0x3b, 0x2f, 0xaa, 0xb2, 0x4f, 0xee, 0x9f, 0x90, - 0x2b, 0xd9, 0xa0, 0x4a, 0xd6, 0x10, 0xbe, 0xdd, 0x4a, 0xb6, 0xed, 0x44, 0xf4, 0x75, 0x09, 0x26, - 0xdb, 0xad, 0x49, 0x7a, 0x0c, 0xcb, 0x2e, 0x8b, 0xac, 0x1e, 0xc3, 0xb2, 0xdb, 0x02, 0x48, 0xfe, - 0x19, 0xaa, 0xfc, 0x39, 0xf4, 0x78, 0x27, 0xe5, 0xbb, 0xf6, 0x22, 0x19, 0x8b, 0x5d, 0x93, 0xfc, - 0x1e, 0x63, 0xb1, 0x9f, 0x75, 0x4c, 0x8f, 0xb1, 0xd8, 0xd7, 0x1a, 0xa3, 0xf7, 0x58, 0x74, 0x35, - 0xeb, 0xb3, 0x1b, 0x6d, 0xf4, 0x55, 0x09, 0x46, 0x02, 0x19, 0x31, 0x7a, 0xb4, 0xab, 0xa0, 0xed, - 0x16, 0x0c, 0xd9, 0x33, 0xfb, 0x21, 0xe1, 0xba, 0x2c, 0x50, 0x5d, 0xe6, 0x50, 0xfe, 0x20, 0xba, - 0x04, 0x8f, 0x51, 0xbf, 0x29, 0xc1, 0x44, 0x9b, 0x2c, 0xb3, 0xc7, 0x28, 0xec, 0x9c, 0x34, 0x67, - 0x9f, 0xdc, 0x3f, 0x21, 0xd7, 0xea, 0x02, 0xd5, 0xea, 0x2d, 0xe8, 0xcd, 0x07, 0xd1, 0xca, 0x37, - 0x3f, 0xdf, 0xf4, 0xae, 0x64, 0xf9, 0xda, 0x41, 0xe7, 0xf6, 0x29, 0x98, 0x50, 0xe8, 0x89, 0x7d, - 0xd3, 0x71, 0x7d, 0x9e, 0xa3, 0xfa, 0x3c, 0x8b, 0x56, 0xde, 0x98, 0x3e, 0xad, 0xd3, 0xfa, 0x17, - 0x5b, 0x1f, 0x07, 0x76, 0xf7, 0xa2, 0xb6, 0xc9, 0x6a, 0xf6, 0xb1, 0x7d, 0xd1, 0x70, 0xa5, 0x9e, - 0xa4, 0x4a, 0x9d, 0x41, 0x8f, 0x74, 0x52, 0xca, 0x77, 0xef, 0x4e, 0xd3, 0xb7, 0x8c, 0xd3, 0xef, - 0x60, 0x29, 0xf0, 0xbb, 0xd0, 0xbb, 0xc5, 0x9d, 0xa7, 0x93, 0x5d, 0xdb, 0xf5, 0xe5, 0xb1, 0xd9, - 0x07, 0xfa, 0xc0, 0xe4, 0x72, 0xdd, 0x43, 0xe5, 0x9a, 0x42, 0xc7, 0x3b, 0xc9, 0x45, 0x72, 0x59, - 0xf4, 0x41, 0xc9, 0xbd, 0x26, 0x79, 0xaa, 0x3b, 0x6f, 0x7f, 0xb2, 0x9b, 0x7d, 0xb0, 0x2f, 0x5c, - 0x2e, 0xc9, 0x7d, 0x54, 0x92, 0x19, 0x34, 0xd5, 0x51, 0x12, 0x96, 0xfa, 0xde, 0xee, 0x4b, 0x05, - 0xd7, 0x8f, 0xc0, 0x74, 0x87, 0x16, 0x9d, 0xdd, 0x1e, 0x67, 0x5c, 0x5d, 0xde, 0xc8, 0xf6, 0x7c, - 0x03, 0x7b, 0xbb, 0xbf, 0xed, 0xda, 0xe7, 0x81, 0xd8, 0x6f, 0xc7, 0x00, 0x2d, 0xd9, 0xb5, 0x39, - 0x0b, 0xb3, 0xff, 0x33, 0xc9, 0x47, 0x79, 0xe8, 0xf1, 0x97, 0xf4, 0x86, 0x1e, 0x7f, 0x2d, 0x05, - 0x9e, 0x53, 0x45, 0xf6, 0xf7, 0x64, 0xb3, 0xef, 0x37, 0x55, 0xd1, 0x1f, 0xcb, 0x9b, 0xaa, 0xf6, - 0x57, 0xae, 0x63, 0xb7, 0xef, 0x6d, 0x46, 0xfc, 0xa0, 0xef, 0x53, 0xf8, 0x53, 0xc9, 0xc1, 0x2e, + 0xa6, 0xf8, 0xf2, 0x24, 0x20, 0xc6, 0x8c, 0xee, 0xf1, 0x8b, 0x26, 0xd6, 0x61, 0x22, 0x00, 0xe5, + 0x8d, 0xbc, 0xa1, 0xf3, 0x83, 0x33, 0xdf, 0x3f, 0x02, 0x71, 0xca, 0x15, 0x7d, 0x5c, 0x0a, 0x7c, + 0x5a, 0x68, 0xae, 0x13, 0x9b, 0xf6, 0x6b, 0xe2, 0xec, 0xe9, 0xbe, 0xf1, 0x79, 0xce, 0x76, 0xea, + 0x3d, 0xff, 0xe6, 0xf5, 0x8f, 0x46, 0xee, 0x46, 0xf2, 0xe9, 0x0e, 0xab, 0x71, 0xdf, 0x78, 0xf9, + 0x6c, 0xe0, 0x59, 0xfc, 0x43, 0xfd, 0x35, 0x25, 0x24, 0x9b, 0xeb, 0x17, 0x9d, 0x0b, 0x76, 0x9e, + 0x0a, 0x76, 0x16, 0x3d, 0xda, 0x5b, 0xb0, 0xd3, 0xef, 0x08, 0x0e, 0x9a, 0x77, 0xa1, 0xdf, 0x91, + 0x60, 0xb2, 0xdd, 0x92, 0x0e, 0x3d, 0xd1, 0x9f, 0x14, 0xad, 0x29, 0x45, 0xf6, 0xc9, 0x43, 0x50, + 0x72, 0x55, 0x16, 0xa8, 0x2a, 0x79, 0xf4, 0xd4, 0x21, 0x54, 0x39, 0xed, 0xdf, 0xfa, 0xff, 0x5f, + 0x12, 0x9c, 0xe8, 0xba, 0x42, 0x42, 0xf9, 0xfe, 0xa4, 0xec, 0x92, 0x3b, 0x65, 0x0b, 0x6f, 0x84, + 0x05, 0xd7, 0xf8, 0x19, 0xaa, 0xf1, 0x25, 0xb4, 0x78, 0x18, 0x8d, 0xdb, 0x9e, 0xaf, 0xa0, 0xdf, + 0x0e, 0x5e, 0x3a, 0xec, 0xee, 0x4e, 0x2d, 0x0b, 0x8f, 0x1e, 0x03, 0xa3, 0x35, 0xa9, 0x95, 0x9f, + 0xa3, 0x2a, 0x28, 0x68, 0xed, 0x0d, 0x76, 0xda, 0xe9, 0x77, 0x04, 0x03, 0xff, 0xbb, 0xd0, 0xff, + 0x94, 0xda, 0xdf, 0x21, 0x7c, 0xbc, 0xab, 0x88, 0x9d, 0x17, 0x55, 0xd9, 0x27, 0x0e, 0x4e, 0xc8, + 0x95, 0x6c, 0x50, 0x25, 0x6b, 0x08, 0xdf, 0x6a, 0x25, 0xdb, 0x76, 0x22, 0xfa, 0x86, 0x04, 0x93, + 0xed, 0xd6, 0x24, 0x3d, 0x86, 0x65, 0x97, 0x45, 0x56, 0x8f, 0x61, 0xd9, 0x6d, 0x01, 0x24, 0xff, + 0x1c, 0x55, 0xfe, 0x1c, 0x7a, 0xac, 0x93, 0xf2, 0x5d, 0x7b, 0x91, 0x8c, 0xc5, 0xae, 0x49, 0x7e, + 0x8f, 0xb1, 0xd8, 0xcf, 0x3a, 0xa6, 0xc7, 0x58, 0xec, 0x6b, 0x8d, 0xd1, 0x7b, 0x2c, 0xba, 0x9a, + 0xf5, 0xd9, 0x8d, 0x36, 0xfa, 0x9a, 0x04, 0x23, 0x81, 0x8c, 0x18, 0x3d, 0xd2, 0x55, 0xd0, 0x76, + 0x0b, 0x86, 0xec, 0x99, 0x83, 0x90, 0x70, 0x5d, 0x16, 0xa9, 0x2e, 0xf3, 0x28, 0x7f, 0x18, 0x5d, + 0x82, 0xc7, 0xa8, 0xdf, 0x92, 0x60, 0xa2, 0x4d, 0x96, 0xd9, 0x63, 0x14, 0x76, 0x4e, 0x9a, 0xb3, + 0x4f, 0x1c, 0x9c, 0x90, 0x6b, 0x75, 0x81, 0x6a, 0xf5, 0x16, 0xf4, 0xe6, 0xc3, 0x68, 0xe5, 0x9b, + 0x9f, 0x6f, 0x78, 0x57, 0xb2, 0x7c, 0xed, 0xa0, 0x73, 0x07, 0x14, 0x4c, 0x28, 0xf4, 0xf8, 0x81, + 0xe9, 0xb8, 0x3e, 0xcf, 0x52, 0x7d, 0x9e, 0x41, 0xab, 0x6f, 0x4c, 0x9f, 0xd6, 0x69, 0xfd, 0x4b, + 0xad, 0x8f, 0x03, 0xbb, 0x7b, 0x51, 0xdb, 0x64, 0x35, 0xfb, 0xe8, 0x81, 0x68, 0xb8, 0x52, 0x4f, + 0x50, 0xa5, 0xce, 0xa0, 0x87, 0x3b, 0x29, 0xe5, 0xbb, 0x77, 0xa7, 0xe9, 0xdb, 0xc6, 0xe9, 0x77, + 0xb0, 0x14, 0xf8, 0x5d, 0xe8, 0xdd, 0xe2, 0xce, 0xd3, 0xc9, 0xae, 0xed, 0xfa, 0xf2, 0xd8, 0xec, + 0xfd, 0x7d, 0x60, 0x72, 0xb9, 0xee, 0xa6, 0x72, 0x4d, 0xa3, 0xe3, 0x9d, 0xe4, 0x22, 0xb9, 0x2c, + 0xfa, 0xa0, 0xe4, 0x5e, 0x93, 0x3c, 0xd5, 0x9d, 0xb7, 0x3f, 0xd9, 0xcd, 0x3e, 0xd0, 0x17, 0x2e, + 0x97, 0xe4, 0x5e, 0x2a, 0xc9, 0x2c, 0x9a, 0xee, 0x28, 0x09, 0x4b, 0x7d, 0x6f, 0xf5, 0xa5, 0x82, + 0x3f, 0x99, 0x82, 0x99, 0x0e, 0x2d, 0x3a, 0x7b, 0x3d, 0xce, 0xb8, 0xba, 0xbc, 0x91, 0xed, 0xf9, + 0x06, 0xf6, 0x56, 0x7f, 0xdb, 0xb5, 0xcf, 0x03, 0xb1, 0x6f, 0xc4, 0x00, 0x2d, 0xdb, 0xb5, 0x79, + 0x0b, 0xb3, 0xff, 0x33, 0xc9, 0x47, 0x79, 0xe8, 0xf1, 0x97, 0xf4, 0x86, 0x1e, 0x7f, 0x2d, 0x07, + 0x9e, 0x53, 0x45, 0x0e, 0xf6, 0x64, 0xb3, 0xef, 0x37, 0x55, 0xd1, 0x9f, 0xc8, 0x9b, 0xaa, 0xf6, + 0x57, 0xae, 0x63, 0xb7, 0xee, 0x6d, 0x46, 0xfc, 0xb0, 0xef, 0x53, 0xf8, 0x53, 0xc9, 0xc1, 0x2e, 0x4f, 0x25, 0x33, 0x1d, 0xdf, 0x43, 0x72, 0x6a, 0x74, 0x56, 0x7c, 0xe9, 0x74, 0xa8, 0xbf, 0x4b, - 0xb2, 0xfc, 0x53, 0xa8, 0xde, 0x16, 0xc2, 0x71, 0xc8, 0xb6, 0xba, 0x93, 0x3b, 0xa8, 0x3f, 0x12, - 0x85, 0xf4, 0x92, 0x5d, 0x2b, 0x55, 0x35, 0xe7, 0x0e, 0xf9, 0xda, 0xd3, 0x9d, 0xdf, 0xbb, 0xa0, - 0x5b, 0x37, 0xa7, 0x47, 0x99, 0x4d, 0xbb, 0x58, 0xb2, 0x01, 0x63, 0xa1, 0x57, 0xc6, 0xdc, 0xb3, - 0x8a, 0x07, 0x79, 0xec, 0x1c, 0x62, 0x25, 0xd3, 0xe7, 0x09, 0x3e, 0xff, 0x46, 0xbb, 0xed, 0x9d, - 0x99, 0x39, 0xd4, 0xc5, 0x3b, 0xf9, 0x38, 0xd0, 0xeb, 0xb3, 0x2c, 0x64, 0xc2, 0x9d, 0xe2, 0xf6, - 0xd8, 0x1f, 0x49, 0x30, 0xbc, 0x64, 0x8b, 0x54, 0x10, 0xff, 0x94, 0x3e, 0x4d, 0x7a, 0xc2, 0xfd, - 0x4c, 0x78, 0xb4, 0x3f, 0xbf, 0x15, 0x9f, 0x0e, 0xf7, 0x8c, 0x70, 0x08, 0x26, 0x7c, 0x7a, 0xba, - 0xfa, 0xff, 0x4e, 0x84, 0xc6, 0xc7, 0x02, 0xae, 0x69, 0xba, 0x9b, 0x45, 0xe2, 0xbf, 0xa8, 0x0f, - 0x2f, 0x3c, 0x3b, 0xc7, 0x0e, 0x6a, 0xe7, 0x1d, 0x1a, 0x20, 0x42, 0xf6, 0x74, 0x37, 0xbe, 0x96, - 0x5a, 0x9f, 0x05, 0x49, 0xfb, 0xf8, 0xe2, 0x4e, 0xe8, 0xf1, 0x8f, 0xfc, 0xba, 0x04, 0x23, 0x4b, - 0x76, 0x6d, 0x43, 0xaf, 0xfe, 0x3f, 0xef, 0xbf, 0x5b, 0x70, 0x28, 0xa0, 0xe9, 0x1d, 0x32, 0xe9, - 0x99, 0x57, 0x62, 0x10, 0x5d, 0xb2, 0x6b, 0xe8, 0x25, 0x18, 0x0b, 0x27, 0x0d, 0x1d, 0x73, 0xc1, - 0xd6, 0x19, 0xa1, 0xf3, 0x7a, 0xad, 0xf3, 0xec, 0x81, 0x76, 0x60, 0x24, 0x38, 0x73, 0x9c, 0xec, - 0xc2, 0x24, 0x80, 0x99, 0x7d, 0xa4, 0x5f, 0x4c, 0xb7, 0xb1, 0xb7, 0x43, 0xc2, 0x0d, 0x7a, 0x77, - 0x77, 0xa1, 0x16, 0x48, 0x9d, 0xb3, 0xdb, 0x36, 0x61, 0x85, 0x58, 0x2f, 0x1c, 0x52, 0xba, 0x59, - 0x2f, 0x84, 0xdb, 0xd5, 0x7a, 0x9d, 0x86, 0xd6, 0x26, 0x80, 0x6f, 0x1c, 0xdc, 0xdb, 0x85, 0x83, - 0x87, 0x96, 0x7d, 0xb8, 0x2f, 0x34, 0xf7, 0xd0, 0xe9, 0x36, 0x27, 0xe3, 0xff, 0x37, 0x00, 0x00, - 0xff, 0xff, 0xb1, 0x48, 0x2a, 0x05, 0xdd, 0x97, 0x00, 0x00, + 0xb2, 0xfc, 0x53, 0xa8, 0xec, 0x3a, 0xe6, 0x71, 0xc8, 0xb6, 0xba, 0x92, 0x3b, 0xa0, 0x3f, 0x14, + 0x85, 0xf4, 0xb2, 0x5d, 0x2b, 0x55, 0x35, 0xe7, 0x36, 0xf9, 0xd9, 0x53, 0x9d, 0xdf, 0xba, 0xa0, + 0x9b, 0x37, 0x66, 0x46, 0x99, 0x3d, 0xbb, 0x58, 0xb1, 0x01, 0x63, 0xa1, 0x17, 0xc6, 0xdc, 0xab, + 0x8a, 0x87, 0x79, 0xe8, 0x1c, 0x62, 0x25, 0xd3, 0xa7, 0x09, 0x3e, 0xdf, 0x46, 0x7b, 0xed, 0x1d, + 0x99, 0x39, 0xd3, 0xc5, 0xdb, 0xf9, 0x30, 0x90, 0xf5, 0x57, 0x16, 0x32, 0xe1, 0x0e, 0x71, 0x7b, + 0xeb, 0x35, 0x09, 0x86, 0x97, 0x6d, 0x91, 0x02, 0xe2, 0x9f, 0xd1, 0x27, 0x49, 0x8f, 0xbb, 0x9f, + 0x07, 0x8f, 0xf6, 0xe7, 0xaf, 0xfe, 0x4f, 0x86, 0x0f, 0xc8, 0x47, 0x60, 0xc2, 0xa7, 0xa3, 0xab, + 0xfb, 0x37, 0x23, 0x34, 0x26, 0x16, 0x70, 0x4d, 0xd3, 0xdd, 0xcc, 0x11, 0xff, 0x79, 0x7d, 0x6c, + 0xe1, 0xd9, 0x38, 0x76, 0x18, 0x1b, 0xef, 0xd2, 0xa0, 0x10, 0xb2, 0xa5, 0xbb, 0xd1, 0xb5, 0xdc, + 0xfa, 0x0c, 0x48, 0x3a, 0xc0, 0x17, 0x76, 0x42, 0x8f, 0x7d, 0xe4, 0xd7, 0x25, 0x18, 0x59, 0xb6, + 0x6b, 0x9b, 0x7a, 0xf5, 0xff, 0x69, 0xbf, 0xdd, 0x86, 0x23, 0x01, 0x2d, 0x6f, 0x93, 0x39, 0xcf, + 0xbc, 0x12, 0x83, 0xe8, 0xb2, 0x5d, 0x43, 0x2f, 0xc2, 0x58, 0x38, 0x41, 0xe8, 0x98, 0xf7, 0xb5, + 0xce, 0x00, 0x9d, 0xd7, 0x66, 0x9d, 0x67, 0x0b, 0xb4, 0x0b, 0x23, 0xc1, 0x99, 0xe2, 0x64, 0x17, + 0x26, 0x01, 0xcc, 0xec, 0xc3, 0xfd, 0x62, 0xba, 0x8d, 0xbd, 0x1d, 0x12, 0x6e, 0xa0, 0xbb, 0xab, + 0x0b, 0xb5, 0x40, 0xea, 0x9c, 0xc9, 0xb6, 0x09, 0x27, 0xc4, 0x7a, 0xe1, 0x50, 0xd2, 0xcd, 0x7a, + 0x21, 0xdc, 0xae, 0xd6, 0xeb, 0x34, 0xac, 0xb6, 0x00, 0x7c, 0x63, 0xe0, 0x9e, 0x2e, 0x1c, 0x3c, + 0xb4, 0xec, 0x43, 0x7d, 0xa1, 0xb9, 0x07, 0x4c, 0xb7, 0x38, 0xf1, 0xfe, 0xbf, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xfc, 0x32, 0x18, 0x5d, 0xc9, 0x97, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index c3a1bf706599..40b1ef488be3 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -80,6 +80,48 @@ func (m *MsgCreateValidator) XXX_DiscardUnknown() { var xxx_messageInfo_MsgCreateValidator proto.InternalMessageInfo +func (m *MsgCreateValidator) GetDescription() Description { + if m != nil { + return m.Description + } + return Description{} +} + +func (m *MsgCreateValidator) GetCommission() CommissionRates { + if m != nil { + return m.Commission + } + return CommissionRates{} +} + +func (m *MsgCreateValidator) GetDelegatorAddress() string { + if m != nil { + return m.DelegatorAddress + } + return "" +} + +func (m *MsgCreateValidator) GetValidatorAddress() string { + if m != nil { + return m.ValidatorAddress + } + return "" +} + +func (m *MsgCreateValidator) GetPubkey() *types.Any { + if m != nil { + return m.Pubkey + } + return nil +} + +func (m *MsgCreateValidator) GetValue() types1.Coin { + if m != nil { + return m.Value + } + return types1.Coin{} +} + // MsgCreateValidatorResponse defines the Msg/CreateValidator response type. type MsgCreateValidatorResponse struct { } @@ -162,6 +204,20 @@ func (m *MsgEditValidator) XXX_DiscardUnknown() { var xxx_messageInfo_MsgEditValidator proto.InternalMessageInfo +func (m *MsgEditValidator) GetDescription() Description { + if m != nil { + return m.Description + } + return Description{} +} + +func (m *MsgEditValidator) GetValidatorAddress() string { + if m != nil { + return m.ValidatorAddress + } + return "" +} + // MsgEditValidatorResponse defines the Msg/EditValidator response type. type MsgEditValidatorResponse struct { } @@ -240,6 +296,27 @@ func (m *MsgDelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgDelegate proto.InternalMessageInfo +func (m *MsgDelegate) GetDelegatorAddress() string { + if m != nil { + return m.DelegatorAddress + } + return "" +} + +func (m *MsgDelegate) GetValidatorAddress() string { + if m != nil { + return m.ValidatorAddress + } + return "" +} + +func (m *MsgDelegate) GetAmount() types1.Coin { + if m != nil { + return m.Amount + } + return types1.Coin{} +} + // MsgDelegateResponse defines the Msg/Delegate response type. type MsgDelegateResponse struct { } @@ -319,6 +396,34 @@ func (m *MsgBeginRedelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgBeginRedelegate proto.InternalMessageInfo +func (m *MsgBeginRedelegate) GetDelegatorAddress() string { + if m != nil { + return m.DelegatorAddress + } + return "" +} + +func (m *MsgBeginRedelegate) GetValidatorSrcAddress() string { + if m != nil { + return m.ValidatorSrcAddress + } + return "" +} + +func (m *MsgBeginRedelegate) GetValidatorDstAddress() string { + if m != nil { + return m.ValidatorDstAddress + } + return "" +} + +func (m *MsgBeginRedelegate) GetAmount() types1.Coin { + if m != nil { + return m.Amount + } + return types1.Coin{} +} + // MsgBeginRedelegateResponse defines the Msg/BeginRedelegate response type. type MsgBeginRedelegateResponse struct { CompletionTime time.Time `protobuf:"bytes,1,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time"` @@ -405,6 +510,27 @@ func (m *MsgUndelegate) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUndelegate proto.InternalMessageInfo +func (m *MsgUndelegate) GetDelegatorAddress() string { + if m != nil { + return m.DelegatorAddress + } + return "" +} + +func (m *MsgUndelegate) GetValidatorAddress() string { + if m != nil { + return m.ValidatorAddress + } + return "" +} + +func (m *MsgUndelegate) GetAmount() types1.Coin { + if m != nil { + return m.Amount + } + return types1.Coin{} +} + // MsgUndelegateResponse defines the Msg/Undelegate response type. type MsgUndelegateResponse struct { CompletionTime time.Time `protobuf:"bytes,1,opt,name=completion_time,json=completionTime,proto3,stdtime" json:"completion_time"` @@ -466,61 +592,61 @@ func init() { func init() { proto.RegisterFile("cosmos/staking/v1beta1/tx.proto", fileDescriptor_0926ef28816b35ab) } var fileDescriptor_0926ef28816b35ab = []byte{ - // 860 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x4d, 0x6b, 0xe3, 0x46, - 0x18, 0xb6, 0x6c, 0xc7, 0x4d, 0x27, 0xe4, 0x4b, 0xf9, 0xc0, 0x11, 0xc1, 0x0a, 0x4a, 0x3f, 0x42, - 0xdb, 0xc8, 0x4d, 0x4a, 0x29, 0xe4, 0x52, 0xe2, 0xb8, 0xa1, 0x21, 0x35, 0x14, 0x25, 0xed, 0xa1, - 0x14, 0x8c, 0x3e, 0xc6, 0xaa, 0xb0, 0xa4, 0x51, 0x34, 0xe3, 0x10, 0x43, 0x7f, 0x40, 0x8f, 0x81, - 0xde, 0xf6, 0x94, 0x1f, 0xb1, 0x3f, 0x22, 0x2c, 0xec, 0x92, 0xe3, 0xb2, 0x07, 0xef, 0x92, 0xc0, - 0x92, 0xb3, 0x7f, 0xc1, 0xa2, 0xd1, 0x48, 0x96, 0xe5, 0x0f, 0x4c, 0x58, 0x5f, 0xf6, 0x64, 0x33, - 0xf3, 0xcc, 0xf3, 0xce, 0xfb, 0xbc, 0xcf, 0xbc, 0xaf, 0x80, 0xa8, 0x23, 0xec, 0x20, 0x5c, 0xc6, - 0x44, 0x6d, 0x5a, 0xae, 0x59, 0xbe, 0xdc, 0xd3, 0x20, 0x51, 0xf7, 0xca, 0xe4, 0x4a, 0xf6, 0x7c, - 0x44, 0x10, 0xbf, 0x1e, 0x02, 0x64, 0x06, 0x90, 0x19, 0x40, 0xd8, 0x30, 0x11, 0x32, 0x6d, 0x58, - 0xa6, 0x28, 0xad, 0xd5, 0x28, 0xab, 0x6e, 0x3b, 0x3c, 0x22, 0x88, 0xe9, 0x2d, 0x62, 0x39, 0x10, - 0x13, 0xd5, 0xf1, 0x18, 0x60, 0xd5, 0x44, 0x26, 0xa2, 0x7f, 0xcb, 0xc1, 0x3f, 0xb6, 0xba, 0x11, - 0x46, 0xaa, 0x87, 0x1b, 0x2c, 0x6c, 0xb8, 0x55, 0x62, 0xb7, 0xd4, 0x54, 0x0c, 0xe3, 0x2b, 0xea, - 0xc8, 0x72, 0xd9, 0xfe, 0x17, 0x23, 0xb2, 0x88, 0x2e, 0x4d, 0x51, 0xd2, 0xcb, 0x3c, 0xe0, 0x6b, - 0xd8, 0x3c, 0xf2, 0xa1, 0x4a, 0xe0, 0x9f, 0xaa, 0x6d, 0x19, 0x2a, 0x41, 0x3e, 0x7f, 0x0a, 0xe6, - 0x0c, 0x88, 0x75, 0xdf, 0xf2, 0x88, 0x85, 0xdc, 0x22, 0xb7, 0xc5, 0xed, 0xcc, 0xed, 0x6f, 0xcb, - 0xc3, 0xf3, 0x96, 0xab, 0x3d, 0x68, 0x25, 0x7f, 0xdb, 0x11, 0x33, 0x4a, 0xf2, 0x34, 0x5f, 0x03, - 0x40, 0x47, 0x8e, 0x63, 0x61, 0x1c, 0x70, 0x65, 0x29, 0xd7, 0xd7, 0xa3, 0xb8, 0x8e, 0x62, 0xa4, - 0xa2, 0x12, 0x88, 0x19, 0x5f, 0x82, 0x80, 0xff, 0x17, 0xac, 0x38, 0x96, 0x5b, 0xc7, 0xd0, 0x6e, - 0xd4, 0x0d, 0x68, 0x43, 0x53, 0xa5, 0x77, 0xcc, 0x6d, 0x71, 0x3b, 0x9f, 0x57, 0x7e, 0x0b, 0xe0, - 0x6f, 0x3a, 0xe2, 0x57, 0xa6, 0x45, 0xfe, 0x69, 0x69, 0xb2, 0x8e, 0x1c, 0x26, 0x1b, 0xfb, 0xd9, - 0xc5, 0x46, 0xb3, 0x4c, 0xda, 0x1e, 0xc4, 0xf2, 0x89, 0x4b, 0xba, 0x1d, 0x51, 0x68, 0xab, 0x8e, - 0x7d, 0x20, 0x0d, 0xa1, 0x94, 0x94, 0x65, 0xc7, 0x72, 0xcf, 0xa0, 0xdd, 0xa8, 0xc6, 0x6b, 0xfc, - 0x09, 0x58, 0x66, 0x08, 0xe4, 0xd7, 0x55, 0xc3, 0xf0, 0x21, 0xc6, 0xc5, 0x3c, 0x8d, 0xbd, 0xd9, - 0xed, 0x88, 0xc5, 0x90, 0x6d, 0x00, 0x22, 0x29, 0x4b, 0xf1, 0xda, 0x61, 0xb8, 0x14, 0x50, 0x5d, - 0x46, 0x8a, 0xc7, 0x54, 0x33, 0x69, 0xaa, 0x01, 0x88, 0xa4, 0x2c, 0xc5, 0x6b, 0x11, 0xd5, 0x31, - 0x28, 0x78, 0x2d, 0xad, 0x09, 0xdb, 0xc5, 0x02, 0x95, 0x77, 0x55, 0x0e, 0xfd, 0x26, 0x47, 0x7e, - 0x93, 0x0f, 0xdd, 0x76, 0xa5, 0xf8, 0xe2, 0xf9, 0xee, 0x2a, 0xd3, 0x5d, 0xf7, 0xdb, 0x1e, 0x41, - 0xf2, 0xef, 0x2d, 0xed, 0x14, 0xb6, 0x15, 0x76, 0x9a, 0xff, 0x11, 0xcc, 0x5c, 0xaa, 0x76, 0x0b, - 0x16, 0x3f, 0xa3, 0x34, 0x1b, 0x51, 0x95, 0x02, 0x93, 0x25, 0x4a, 0x64, 0x45, 0x75, 0x0e, 0xd1, - 0x07, 0xb3, 0xff, 0xdd, 0x88, 0x99, 0xc7, 0x1b, 0x31, 0x23, 0x6d, 0x02, 0x61, 0xd0, 0x4e, 0x0a, - 0xc4, 0x1e, 0x72, 0x31, 0x94, 0xfe, 0xcf, 0x81, 0xa5, 0x1a, 0x36, 0x7f, 0x31, 0x2c, 0x32, 0x25, - 0xaf, 0xfd, 0x3c, 0x4c, 0xd3, 0x2c, 0xd5, 0x94, 0xef, 0x76, 0xc4, 0x85, 0x50, 0xd3, 0x31, 0x4a, - 0x3a, 0x60, 0xb1, 0xe7, 0xb5, 0xba, 0xaf, 0x12, 0xc8, 0x9c, 0x55, 0x9d, 0xd0, 0x55, 0x55, 0xa8, - 0x77, 0x3b, 0xe2, 0x7a, 0x18, 0x28, 0x45, 0x25, 0x29, 0x0b, 0x7a, 0x9f, 0xbf, 0xf9, 0xab, 0xe1, - 0x66, 0x0e, 0x0d, 0xf5, 0xeb, 0x14, 0x8d, 0x9c, 0xa8, 0x99, 0x00, 0x8a, 0xe9, 0xa2, 0xc4, 0x15, - 0x7b, 0xcf, 0x81, 0xb9, 0x1a, 0x36, 0xd9, 0x39, 0x38, 0xdc, 0xfe, 0xdc, 0xc7, 0xb3, 0x7f, 0xf6, - 0x49, 0xf6, 0xff, 0x09, 0x14, 0x54, 0x07, 0xb5, 0x5c, 0x42, 0x6b, 0x35, 0x81, 0x6f, 0x19, 0x3c, - 0x21, 0xc2, 0x1a, 0x58, 0x49, 0xe4, 0x19, 0xe7, 0xff, 0x2a, 0x4b, 0xfb, 0x63, 0x05, 0x9a, 0x96, - 0xab, 0x40, 0x63, 0x0a, 0x32, 0x9c, 0x83, 0xb5, 0x5e, 0x8e, 0xd8, 0xd7, 0x53, 0x52, 0x6c, 0x75, - 0x3b, 0xe2, 0x66, 0x5a, 0x8a, 0x04, 0x4c, 0x52, 0x56, 0xe2, 0xf5, 0x33, 0x5f, 0x1f, 0xca, 0x6a, - 0x60, 0x12, 0xb3, 0xe6, 0x46, 0xb3, 0x26, 0x60, 0x49, 0xd6, 0x2a, 0x26, 0x83, 0x3a, 0xe7, 0x9f, - 0xaa, 0x73, 0x93, 0x36, 0x88, 0x94, 0x9e, 0x91, 0xdc, 0x7c, 0x8d, 0xbe, 0x3e, 0xcf, 0x86, 0x81, - 0x45, 0xeb, 0xc1, 0x8c, 0x64, 0xfd, 0x40, 0x18, 0x68, 0x68, 0xe7, 0xd1, 0x00, 0xad, 0xcc, 0x06, - 0xa1, 0xae, 0xdf, 0x8a, 0x1c, 0x7d, 0x5d, 0xec, 0x70, 0xb0, 0x2d, 0x3d, 0x72, 0x60, 0xbe, 0x86, - 0xcd, 0x3f, 0x5c, 0xe3, 0x93, 0xf7, 0x6f, 0x03, 0xac, 0xf5, 0x65, 0x3a, 0x25, 0x49, 0xf7, 0x9f, - 0xe5, 0x41, 0xae, 0x86, 0x4d, 0xfe, 0x02, 0x2c, 0xa6, 0x3f, 0x1a, 0xbe, 0x19, 0xd5, 0xb3, 0x07, - 0x27, 0x82, 0xb0, 0x3f, 0x39, 0x36, 0xce, 0xa4, 0x09, 0xe6, 0xfb, 0x27, 0xc7, 0xce, 0x18, 0x92, - 0x3e, 0xa4, 0xf0, 0xfd, 0xa4, 0xc8, 0x38, 0xd8, 0xdf, 0x60, 0x36, 0x6e, 0x7a, 0xdb, 0x63, 0x4e, - 0x47, 0x20, 0xe1, 0xdb, 0x09, 0x40, 0x31, 0xfb, 0x05, 0x58, 0x4c, 0xb7, 0x94, 0x71, 0xea, 0xa5, - 0xb0, 0x63, 0xd5, 0x1b, 0xf5, 0xb4, 0x34, 0x00, 0x12, 0xef, 0xe0, 0xcb, 0x31, 0x0c, 0x3d, 0x98, - 0xb0, 0x3b, 0x11, 0x2c, 0x8a, 0x51, 0x39, 0xbe, 0xbd, 0x2f, 0x71, 0x77, 0xf7, 0x25, 0xee, 0xdd, - 0x7d, 0x89, 0xbb, 0x7e, 0x28, 0x65, 0xee, 0x1e, 0x4a, 0x99, 0xd7, 0x0f, 0xa5, 0xcc, 0x5f, 0xdf, - 0x8d, 0x1d, 0x63, 0x57, 0xf1, 0x57, 0x2a, 0x1d, 0x68, 0x5a, 0x81, 0x5a, 0xf2, 0x87, 0x0f, 0x01, - 0x00, 0x00, 0xff, 0xff, 0xa1, 0x2b, 0xfd, 0x07, 0x8a, 0x0b, 0x00, 0x00, + // 853 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0xcb, 0x6e, 0xdb, 0x46, + 0x14, 0x15, 0x25, 0x59, 0x75, 0xc7, 0xf0, 0x8b, 0x7e, 0x40, 0x26, 0x0c, 0xd1, 0xa0, 0xfb, 0x30, + 0xda, 0x9a, 0xaa, 0x5d, 0x14, 0x05, 0xbc, 0x29, 0x2c, 0xab, 0x46, 0x0d, 0x57, 0x40, 0x41, 0xbb, + 0x5d, 0x14, 0x05, 0x04, 0x3e, 0x46, 0x2c, 0x21, 0x92, 0x43, 0x73, 0x46, 0x86, 0x05, 0xf4, 0x1f, + 0xe2, 0x75, 0x56, 0xf9, 0x88, 0x7c, 0x84, 0xe3, 0x95, 0x97, 0x41, 0x16, 0x4a, 0x20, 0x67, 0x91, + 0xb5, 0xbe, 0x20, 0xe0, 0x70, 0x48, 0x51, 0xd4, 0x03, 0x82, 0x11, 0x6d, 0xb2, 0x92, 0x30, 0x73, + 0xe6, 0xdc, 0xb9, 0xe7, 0x9e, 0xb9, 0x97, 0x40, 0xd4, 0x11, 0x76, 0x10, 0x2e, 0x63, 0xa2, 0x36, + 0x2d, 0xd7, 0x2c, 0x5f, 0x1f, 0x68, 0x90, 0xa8, 0x07, 0x65, 0x72, 0x23, 0x7b, 0x3e, 0x22, 0x88, + 0xdf, 0x0c, 0x01, 0x32, 0x03, 0xc8, 0x0c, 0x20, 0x6c, 0x99, 0x08, 0x99, 0x36, 0x2c, 0x53, 0x94, + 0xd6, 0x6a, 0x94, 0x55, 0xb7, 0x1d, 0x1e, 0x11, 0xc4, 0xf4, 0x16, 0xb1, 0x1c, 0x88, 0x89, 0xea, + 0x78, 0x0c, 0xb0, 0x6e, 0x22, 0x13, 0xd1, 0xbf, 0xe5, 0xe0, 0x1f, 0x5b, 0xdd, 0x0a, 0x23, 0xd5, + 0xc3, 0x0d, 0x16, 0x36, 0xdc, 0x2a, 0xb1, 0x5b, 0x6a, 0x2a, 0x86, 0xf1, 0x15, 0x75, 0x64, 0xb9, + 0x6c, 0xff, 0xab, 0x31, 0x59, 0x44, 0x97, 0xa6, 0x28, 0xe9, 0x55, 0x1e, 0xf0, 0x35, 0x6c, 0x9e, + 0xf8, 0x50, 0x25, 0xf0, 0x6f, 0xd5, 0xb6, 0x0c, 0x95, 0x20, 0x9f, 0x3f, 0x07, 0x0b, 0x06, 0xc4, + 0xba, 0x6f, 0x79, 0xc4, 0x42, 0x6e, 0x91, 0xdb, 0xe1, 0xf6, 0x16, 0x0e, 0x77, 0xe5, 0xd1, 0x79, + 0xcb, 0xd5, 0x3e, 0xb4, 0x92, 0xbf, 0xeb, 0x88, 0x19, 0x25, 0x79, 0x9a, 0xaf, 0x01, 0xa0, 0x23, + 0xc7, 0xb1, 0x30, 0x0e, 0xb8, 0xb2, 0x94, 0xeb, 0xdb, 0x71, 0x5c, 0x27, 0x31, 0x52, 0x51, 0x09, + 0xc4, 0x8c, 0x2f, 0x41, 0xc0, 0xff, 0x0f, 0xd6, 0x1c, 0xcb, 0xad, 0x63, 0x68, 0x37, 0xea, 0x06, + 0xb4, 0xa1, 0xa9, 0xd2, 0x3b, 0xe6, 0x76, 0xb8, 0xbd, 0x2f, 0x2b, 0x7f, 0x04, 0xf0, 0x37, 0x1d, + 0xf1, 0x1b, 0xd3, 0x22, 0xff, 0xb5, 0x34, 0x59, 0x47, 0x0e, 0x93, 0x8d, 0xfd, 0xec, 0x63, 0xa3, + 0x59, 0x26, 0x6d, 0x0f, 0x62, 0xf9, 0xcc, 0x25, 0xbd, 0x8e, 0x28, 0xb4, 0x55, 0xc7, 0x3e, 0x92, + 0x46, 0x50, 0x4a, 0xca, 0xaa, 0x63, 0xb9, 0x17, 0xd0, 0x6e, 0x54, 0xe3, 0x35, 0xfe, 0x0c, 0xac, + 0x32, 0x04, 0xf2, 0xeb, 0xaa, 0x61, 0xf8, 0x10, 0xe3, 0x62, 0x9e, 0xc6, 0xde, 0xee, 0x75, 0xc4, + 0x62, 0xc8, 0x36, 0x04, 0x91, 0x94, 0x95, 0x78, 0xed, 0x38, 0x5c, 0x0a, 0xa8, 0xae, 0x23, 0xc5, + 0x63, 0xaa, 0xb9, 0x34, 0xd5, 0x10, 0x44, 0x52, 0x56, 0xe2, 0xb5, 0x88, 0xea, 0x14, 0x14, 0xbc, + 0x96, 0xd6, 0x84, 0xed, 0x62, 0x81, 0xca, 0xbb, 0x2e, 0x87, 0x7e, 0x93, 0x23, 0xbf, 0xc9, 0xc7, + 0x6e, 0xbb, 0x52, 0xbc, 0x7f, 0xb9, 0xbf, 0xce, 0x74, 0xd7, 0xfd, 0xb6, 0x47, 0x90, 0xfc, 0x67, + 0x4b, 0x3b, 0x87, 0x6d, 0x85, 0x9d, 0xe6, 0x7f, 0x06, 0x73, 0xd7, 0xaa, 0xdd, 0x82, 0xc5, 0x2f, + 0x28, 0xcd, 0x56, 0x54, 0xa5, 0xc0, 0x64, 0x89, 0x12, 0x59, 0x51, 0x9d, 0x43, 0xf4, 0x51, 0xfe, + 0xc3, 0x0b, 0x31, 0x23, 0x6d, 0x03, 0x61, 0xd8, 0x4a, 0x0a, 0xc4, 0x1e, 0x72, 0x31, 0x94, 0x9e, + 0xe5, 0xc0, 0x4a, 0x0d, 0x9b, 0xbf, 0x19, 0x16, 0x99, 0x91, 0xcf, 0x7e, 0x1d, 0xa5, 0x67, 0x96, + 0xea, 0xc9, 0xf7, 0x3a, 0xe2, 0x52, 0xa8, 0xe7, 0x04, 0x15, 0x1d, 0xb0, 0xdc, 0xf7, 0x59, 0xdd, + 0x57, 0x09, 0x64, 0xae, 0xaa, 0x4e, 0xe9, 0xa8, 0x2a, 0xd4, 0x7b, 0x1d, 0x71, 0x33, 0x0c, 0x94, + 0xa2, 0x92, 0x94, 0x25, 0x7d, 0xc0, 0xdb, 0xfc, 0xcd, 0x68, 0x23, 0x87, 0x66, 0xfa, 0x7d, 0x86, + 0x26, 0x66, 0xf5, 0x12, 0x40, 0x31, 0x5d, 0x90, 0xb8, 0x5a, 0x5d, 0x0e, 0x2c, 0xd4, 0xb0, 0xc9, + 0xce, 0xc0, 0xd1, 0xb6, 0xe7, 0x3e, 0x9d, 0xed, 0xb3, 0x4f, 0xb2, 0xfd, 0x2f, 0xa0, 0xa0, 0x3a, + 0xa8, 0xe5, 0x12, 0x5a, 0xa7, 0x29, 0xfc, 0xca, 0xe0, 0x4c, 0x80, 0x0d, 0xb0, 0x96, 0xc8, 0x31, + 0xce, 0xfd, 0x3e, 0x4b, 0x7b, 0x62, 0x05, 0x9a, 0x96, 0xab, 0x40, 0x63, 0x06, 0x12, 0x5c, 0x82, + 0x8d, 0x7e, 0x7e, 0xd8, 0xd7, 0x53, 0x32, 0xec, 0xf4, 0x3a, 0xe2, 0x76, 0x5a, 0x86, 0x04, 0x4c, + 0x52, 0xd6, 0xe2, 0xf5, 0x0b, 0x5f, 0x1f, 0xc9, 0x6a, 0x60, 0x12, 0xb3, 0xe6, 0xc6, 0xb3, 0x26, + 0x60, 0x49, 0xd6, 0x2a, 0x26, 0xc3, 0x1a, 0xe7, 0x9f, 0xa2, 0x71, 0x93, 0x36, 0x85, 0x94, 0x96, + 0x91, 0xd4, 0x7c, 0x8d, 0xbe, 0x38, 0xcf, 0x86, 0x81, 0x2d, 0xeb, 0xc1, 0x4c, 0x64, 0x3d, 0x40, + 0x18, 0x6a, 0x60, 0x97, 0xd1, 0xc0, 0xac, 0xcc, 0x07, 0x61, 0x6e, 0xdf, 0x8a, 0x1c, 0x7d, 0x51, + 0xec, 0x70, 0xb0, 0x2d, 0xbd, 0xe7, 0xc0, 0x62, 0x0d, 0x9b, 0x7f, 0xb9, 0xc6, 0x67, 0xed, 0xdb, + 0x06, 0xd8, 0x18, 0xc8, 0x72, 0x46, 0x72, 0x1e, 0x3e, 0xcf, 0x83, 0x5c, 0x0d, 0x9b, 0xfc, 0x15, + 0x58, 0x4e, 0x7f, 0x20, 0x7c, 0x37, 0xae, 0x47, 0x0f, 0x4f, 0x00, 0xe1, 0x70, 0x7a, 0x6c, 0x9c, + 0x49, 0x13, 0x2c, 0x0e, 0x4e, 0x8a, 0xbd, 0x09, 0x24, 0x03, 0x48, 0xe1, 0xc7, 0x69, 0x91, 0x71, + 0xb0, 0x7f, 0xc1, 0x7c, 0xdc, 0xe8, 0x76, 0x27, 0x9c, 0x8e, 0x40, 0xc2, 0xf7, 0x53, 0x80, 0x62, + 0xf6, 0x2b, 0xb0, 0x9c, 0x6e, 0x25, 0x93, 0xd4, 0x4b, 0x61, 0x27, 0xaa, 0x37, 0xee, 0x59, 0x69, + 0x00, 0x24, 0xde, 0xc0, 0xd7, 0x13, 0x18, 0xfa, 0x30, 0x61, 0x7f, 0x2a, 0x58, 0x14, 0xa3, 0x72, + 0x7a, 0xd7, 0x2d, 0x71, 0x0f, 0xdd, 0x12, 0xf7, 0xae, 0x5b, 0xe2, 0x6e, 0x1f, 0x4b, 0x99, 0x87, + 0xc7, 0x52, 0xe6, 0xf5, 0x63, 0x29, 0xf3, 0xcf, 0x0f, 0x13, 0xc7, 0xd6, 0x4d, 0xfc, 0x45, 0x4a, + 0x07, 0x98, 0x56, 0xa0, 0x96, 0xfc, 0xe9, 0x63, 0x00, 0x00, 0x00, 0xff, 0xff, 0x76, 0x63, 0x3b, + 0x01, 0x76, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used.