From 8f913f8556229edc67d1ffe3d9bb02ec1701da7e Mon Sep 17 00:00:00 2001 From: Jehan Date: Tue, 1 Nov 2022 11:55:23 -0700 Subject: [PATCH] Interchain security rebase (#13722) * feat: store ABCI validator updates in transient store * fix test build * change transient key name * add UnbondingDelegationEntryCreated hook * add id to UnbondingDelegationEntry * changes to add simple version of staking ccv hooks * ubde id to string * rough draft of more efficient technique * change hook api and do some clean ups * use ByEntry index and keep stopped entries in Entries array * correct error convention * add comment * some cleanups * comment cleanup * finish hooking up hooks * get the tests to pass * proof of concept with embedded mock hooks * first unit test of CCV hooks * fix forgotten pointer bug * move hook mocks into own file * added test for completing stopped unbonding early * added staking hooks template * correct file and module names * clean up and fix import error * move staking hooks template to types * fix hooks after merge * fix silly proto bug * feat: Add AfterValidatorDowntime hook in slashing module (#10938) Create a slashing hook that allows external modules to register an execution when a validator has downtime. Implementation details: * Call hook in HandleValidatorSignature (x/slashing/keeper/infractions.go) which updates validator SignInfo data * Defer hook execution in case it also wants to update validator SignInfo data * Add methods to update SignInfo to slashing keeper interface(/x/slashing/types/expected_keepers.go) * update: Remove slashing module hooks (#11425) * update: Remove slashing module hooks Hooks are not required anymore to implement the slashing for downtime in CCV. The logic is now using the staking keeper interface definition from the slashing module. The SDK changes are the following: - /x/slashing/keeper/infractions.go - remove hook calls and don't update validators missed blocks when jailed - /x/slashing/types/expected_keepers.go - remove `AfterValidatorDowntime` hook interface and add `IsJailed()` method to staking interface definition - /x/staking/keeper/validator.go - implement `IsJailed()` method * fix last details * Finish staking hooks merge (#11677) * allow stopping and completing of redelegations * refactor to remove BeforeUnbondingDelegationEntryComplete hook and notes for validator unbonding * WIP rough draft of validator unbonding hooks * add many of marius's suggested changes * More review changes * unbonding delegation tests pass * WIP adding redelegation tests * WIP redelegation tests work * unbondingDelegation and redelegation tests pass and cleanup * WIP validator unbonding tests almost pass * tests for all new functionality pass * fix index deleting logic * clean up TODOs * fix small logic bug * fix slashing tests * Rename statements containing 'UnbondingOp' to 'Unbond' in code, docs and proto files Co-authored-by: Simon * feat: enable double-signing evidence in Interchain-Security (#11921) * Add a `InfractionType` enum to Slash function arguments * Remove pubkey condition in HandleEquivocation * Update docs/core/proto-docs.md Co-authored-by: billy rennekamp * Update proto/cosmos/staking/v1beta1/staking.proto Co-authored-by: billy rennekamp * add a possible solution to the evidence module issue Co-authored-by: billy rennekamp * chore: remove direct reliance on staking from slashing (backport #12177) (#12181) * fix: make ModuleAccountInvariants pass for IS SDK changes (#12554) * fix bug breaking ModuleAccountInvariants * set UnbondingOnHold to false explicitly * Fixes staking hooks safety issues (#12578) Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> * Revert "fix: make ModuleAccountInvariants pass for IS SDK changes (#12554)" (#12782) This reverts commit 67c81635b48358eea240a881c7f5d88e4f06616e. * fix: make ModuleAccountInvariants pass for IS SDK changes (#12783) * fix bug breaking ModuleAccountInvariants * set UnbondingOnHold to false explicitly * fix: [Interchain Security] `validatorUnbondingCanComplete` must take into account (re)bonded validators (#12796) * replace val.UnbondingOnHold w/ UnbondingOnHoldRefCount * add UnbondingOnHoldRefCount for undel and red (for consistency) * improve comments * improve TestValidatorUnbondingOnHold test * ret error if UnbondingOnHoldRefCount is negative * adding extra validator unbonding test * change OnHold() def * fix: [Interchain Security] Fix leak in unbonding hooks (#12849) * remove leak for UBDEs and REDEs * remove leak for val unbondings * docs: [Interchain Security] update spec (#12848) * updating staking spec * clarify code * fix typo * store ValidatorUpdates in normal store (#12845) * Update x/slashing/keeper/signing_info.go Co-authored-by: Simon Noetzlin * Update x/staking/keeper/val_state_change.go * Update x/staking/keeper/val_state_change.go * Update x/slashing/keeper/infractions.go Co-authored-by: Simon Noetzlin * Update x/staking/keeper/val_state_change.go * Update x/staking/keeper/val_state_change.go * fix compile errors * remove stakingtypes.TStoreKey * fix: decrease minimums for genesis parameters (#13106) * Update genesis.go * Update genesis.go Co-authored-by: Federico Kunze Co-authored-by: Aditya Sripal Co-authored-by: Simon Noetzlin Co-authored-by: billy rennekamp Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> Co-authored-by: Marius Poke Co-authored-by: Daniel T <30197399+danwt@users.noreply.github.com> Co-authored-by: Shawn Marshall-Spitzbart <44221603+smarshall-spitzbart@users.noreply.github.com> --- docs/core/proto-docs.md | 36 + proto/cosmos/bank/v1beta1/query.proto | 2 - proto/cosmos/staking/v1beta1/staking.proto | 36 + simapp/app.go | 1 + x/bank/types/query.pb.go | 110 +- x/distribution/keeper/delegation_test.go | 14 +- x/distribution/keeper/hooks.go | 2 + x/distribution/types/expected_keepers.go | 4 +- x/evidence/keeper/infraction.go | 31 +- x/evidence/spec/06_begin_block.md | 1 + x/evidence/types/expected_keepers.go | 2 +- x/slashing/handler_test.go | 8 +- x/slashing/keeper/hooks.go | 3 + x/slashing/keeper/infractions.go | 19 +- x/slashing/keeper/keeper.go | 5 +- x/slashing/spec/04_begin_block.md | 2 +- x/slashing/types/expected_keepers.go | 5 +- x/slashing/types/genesis.go | 8 +- x/staking/handler_test.go | 6 +- x/staking/keeper/delegation.go | 37 +- x/staking/keeper/delegation_test.go | 5 +- x/staking/keeper/hooks.go | 7 + x/staking/keeper/keeper.go | 17 + x/staking/keeper/querier.go | 1 + x/staking/keeper/slash.go | 11 +- x/staking/keeper/slash_test.go | 36 +- x/staking/keeper/unbonding.go | 419 ++++ x/staking/keeper/unbonding_test.go | 385 ++++ x/staking/keeper/val_state_change.go | 30 +- x/staking/keeper/validator.go | 30 +- x/staking/keeper/validator_test.go | 2 +- x/staking/simulation/decoder_test.go | 4 +- x/staking/spec/01_state.md | 44 +- x/staking/spec/02_state_transitions.md | 17 +- x/staking/spec/05_end_block.md | 17 +- x/staking/spec/06_hooks.md | 2 + x/staking/types/delegation.go | 75 +- x/staking/types/delegation_test.go | 14 +- x/staking/types/errors.go | 2 + x/staking/types/expected_keepers.go | 3 +- x/staking/types/hooks.go | 5 + x/staking/types/hooks_template.go | 32 + x/staking/types/keys.go | 13 +- x/staking/types/staking.pb.go | 2185 +++++++++++++------- x/staking/types/validator.go | 23 +- 45 files changed, 2747 insertions(+), 964 deletions(-) create mode 100644 x/staking/keeper/unbonding.go create mode 100644 x/staking/keeper/unbonding_test.go create mode 100644 x/staking/types/hooks_template.go diff --git a/docs/core/proto-docs.md b/docs/core/proto-docs.md index 808904049f2f..f4faa5010b09 100644 --- a/docs/core/proto-docs.md +++ b/docs/core/proto-docs.md @@ -480,8 +480,10 @@ - [UnbondingDelegationEntry](#cosmos.staking.v1beta1.UnbondingDelegationEntry) - [ValAddresses](#cosmos.staking.v1beta1.ValAddresses) - [Validator](#cosmos.staking.v1beta1.Validator) + - [ValidatorUpdates](#cosmos.staking.v1beta1.ValidatorUpdates) - [BondStatus](#cosmos.staking.v1beta1.BondStatus) + - [InfractionType](#cosmos.staking.v1beta1.InfractionType) - [cosmos/staking/v1beta1/genesis.proto](#cosmos/staking/v1beta1/genesis.proto) - [GenesisState](#cosmos.staking.v1beta1.GenesisState) @@ -6745,6 +6747,8 @@ RedelegationEntry defines a redelegation object with relevant metadata. | `completion_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | completion_time defines the unix time for redelegation completion. | | `initial_balance` | [string](#string) | | initial_balance defines the initial balance when redelegation started. | | `shares_dst` | [string](#string) | | shares_dst is the amount of destination-validator shares created by redelegation. | +| `unbonding_id` | [uint64](#uint64) | | Incrementing id that uniquely identifies this entry | +| `unbonding_on_hold_ref_count` | [int64](#int64) | | Strictly positive if this entry's unbonding has been stopped by external modules | @@ -6819,6 +6823,8 @@ UnbondingDelegationEntry defines an unbonding object with relevant metadata. | `completion_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | completion_time is the unix time for unbonding completion. | | `initial_balance` | [string](#string) | | initial_balance defines the tokens initially scheduled to receive at completion. | | `balance` | [string](#string) | | balance defines the tokens to receive at completion. | +| `unbonding_id` | [uint64](#uint64) | | Incrementing id that uniquely identifies this entry | +| `unbonding_on_hold_ref_count` | [int64](#int64) | | Strictly positive if this entry's unbonding has been stopped by external modules | @@ -6866,6 +6872,23 @@ multiplied by exchange rate. | `unbonding_time` | [google.protobuf.Timestamp](#google.protobuf.Timestamp) | | unbonding_time defines, if unbonding, the min time for the validator to complete unbonding. | | `commission` | [Commission](#cosmos.staking.v1beta1.Commission) | | commission defines the commission parameters. | | `min_self_delegation` | [string](#string) | | min_self_delegation is the validator's self declared minimum self delegation. | +| `unbonding_on_hold_ref_count` | [int64](#int64) | | strictly positive if this validator's unbonding has been stopped by external modules | +| `unbonding_ids` | [uint64](#uint64) | repeated | list of unbonding ids, each uniquely identifing an unbonding of this validator | + + + + + + + + +### ValidatorUpdates +ValidatorUpdates defines an array of abci.ValidatorUpdate objects. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `updates` | [tendermint.abci.ValidatorUpdate](#tendermint.abci.ValidatorUpdate) | repeated | | @@ -6887,6 +6910,19 @@ BondStatus is the status of a validator. | BOND_STATUS_BONDED | 3 | BONDED defines a validator that is bonded. | + + + +### InfractionType +InfractionType indicates the infraction type a validator commited. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| INFRACTION_TYPE_UNSPECIFIED | 0 | UNSPECIFIED defines an empty infraction type. | +| INFRACTION_TYPE_DOUBLE_SIGN | 1 | DOUBLE_SIGN defines a validator that double-signs a block. | +| INFRACTION_TYPE_DOWNTIME | 2 | DOWNTIME defines a validator that missed signing too many blocks. | + + diff --git a/proto/cosmos/bank/v1beta1/query.proto b/proto/cosmos/bank/v1beta1/query.proto index a567e073f381..e00176a5f5f0 100644 --- a/proto/cosmos/bank/v1beta1/query.proto +++ b/proto/cosmos/bank/v1beta1/query.proto @@ -89,7 +89,6 @@ 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"]; - // pagination defines the pagination in the response. cosmos.base.query.v1beta1.PageResponse pagination = 2; } @@ -113,7 +112,6 @@ message QuerySpendableBalancesResponse { // balances is the spendable balances of all the coins. repeated cosmos.base.v1beta1.Coin balances = 1 [(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; } diff --git a/proto/cosmos/staking/v1beta1/staking.proto b/proto/cosmos/staking/v1beta1/staking.proto index 76e9599e2d35..27581a12cf9a 100644 --- a/proto/cosmos/staking/v1beta1/staking.proto +++ b/proto/cosmos/staking/v1beta1/staking.proto @@ -9,6 +9,7 @@ import "google/protobuf/timestamp.proto"; import "cosmos_proto/cosmos.proto"; import "cosmos/base/v1beta1/coin.proto"; import "tendermint/types/types.proto"; +import "tendermint/abci/types.proto"; option go_package = "github.com/cosmos/cosmos-sdk/x/staking/types"; @@ -117,6 +118,12 @@ message Validator { (gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false ]; + + // strictly positive if this validator's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 12; + + // list of unbonding ids, each uniquely identifing an unbonding of this validator + repeated uint64 unbonding_ids = 13; } // BondStatus is the status of a validator. @@ -226,6 +233,12 @@ message UnbondingDelegationEntry { ]; // balance defines the tokens to receive at completion. string balance = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Int", (gogoproto.nullable) = false]; + + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // RedelegationEntry defines a redelegation object with relevant metadata. @@ -247,6 +260,12 @@ message RedelegationEntry { // shares_dst is the amount of destination-validator shares created by redelegation. string shares_dst = 4 [(gogoproto.customtype) = "github.com/cosmos/cosmos-sdk/types.Dec", (gogoproto.nullable) = false]; + + // Incrementing id that uniquely identifies this entry + uint64 unbonding_id = 5; + + // Strictly positive if this entry's unbonding has been stopped by external modules + int64 unbonding_on_hold_ref_count = 6; } // Redelegation contains the list of a particular delegator's redelegating bonds @@ -332,3 +351,20 @@ message Pool { (gogoproto.moretags) = "yaml:\"bonded_tokens\"" ]; } + +// InfractionType indicates the infraction type a validator commited. +enum InfractionType { + option (gogoproto.goproto_enum_prefix) = false; + + // UNSPECIFIED defines an empty infraction type. + INFRACTION_TYPE_UNSPECIFIED = 0 [(gogoproto.enumvalue_customname) = "InfractionEmpty"]; + // DOUBLE_SIGN defines a validator that double-signs a block. + INFRACTION_TYPE_DOUBLE_SIGN = 1 [(gogoproto.enumvalue_customname) = "DoubleSign"]; + // DOWNTIME defines a validator that missed signing too many blocks. + INFRACTION_TYPE_DOWNTIME = 2 [(gogoproto.enumvalue_customname) = "Downtime"]; +} + +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +message ValidatorUpdates { + repeated tendermint.abci.ValidatorUpdate updates = 1 [(gogoproto.nullable) = false]; +} \ No newline at end of file diff --git a/simapp/app.go b/simapp/app.go index 955f9f41b610..806c2156c2b4 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -210,6 +210,7 @@ func NewSimApp( authzkeeper.StoreKey, ) tkeys := sdk.NewTransientStoreKeys(paramstypes.TStoreKey) + // NOTE: The testingkey is just mounted for testing purposes. Actual applications should // not include this key. memKeys := sdk.NewMemoryStoreKeys(capabilitytypes.MemStoreKey, "testingkey") diff --git a/x/bank/types/query.pb.go b/x/bank/types/query.pb.go index e81ca6b3b6fc..8e2c7f253d3c 100644 --- a/x/bank/types/query.pb.go +++ b/x/bank/types/query.pb.go @@ -805,63 +805,59 @@ func init() { func init() { proto.RegisterFile("cosmos/bank/v1beta1/query.proto", fileDescriptor_9c6fc1939682df13) } var fileDescriptor_9c6fc1939682df13 = []byte{ - // 896 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x97, 0x5d, 0x6b, 0x23, 0x55, - 0x18, 0xc7, 0x73, 0xaa, 0x4d, 0xd3, 0x27, 0x28, 0x78, 0x1a, 0x31, 0x9d, 0xda, 0x89, 0x4c, 0xb5, - 0x4d, 0x6b, 0x3a, 0xd3, 0x24, 0x82, 0xd6, 0x1b, 0x69, 0x2a, 0x7a, 0x21, 0xd2, 0x98, 0x7a, 0x25, - 0x48, 0x39, 0x49, 0xc6, 0x31, 0x34, 0x99, 0x33, 0xcd, 0x99, 0x88, 0xa1, 0x14, 0x44, 0x10, 0x04, - 0x41, 0x05, 0x6f, 0x04, 0x6f, 0xea, 0x8d, 0xa0, 0x5f, 0xc0, 0xaf, 0xd0, 0x8b, 0xbd, 0x28, 0xbb, - 0x37, 0x7b, 0xb5, 0xbb, 0xb4, 0x7b, 0xb1, 0x37, 0xfb, 0x1d, 0x96, 0x9c, 0x97, 0x74, 0x92, 0x4c, - 0x92, 0x59, 0xc8, 0xb2, 0xec, 0x55, 0x93, 0x33, 0xcf, 0xcb, 0xef, 0xf9, 0x9f, 0x33, 0xff, 0x93, - 0x42, 0xa6, 0x46, 0x59, 0x8b, 0x32, 0xab, 0x4a, 0xdc, 0x63, 0xeb, 0xbb, 0x7c, 0xd5, 0xf6, 0x49, - 0xde, 0x3a, 0xe9, 0xd8, 0xed, 0xae, 0xe9, 0xb5, 0xa9, 0x4f, 0xf1, 0x92, 0x08, 0x30, 0x7b, 0x01, - 0xa6, 0x0c, 0xd0, 0xb6, 0xfa, 0x59, 0xcc, 0x16, 0xd1, 0xfd, 0x5c, 0x8f, 0x38, 0x0d, 0x97, 0xf8, - 0x0d, 0xea, 0x8a, 0x02, 0x5a, 0xca, 0xa1, 0x0e, 0xe5, 0x1f, 0xad, 0xde, 0x27, 0xb9, 0xfa, 0xa6, - 0x43, 0xa9, 0xd3, 0xb4, 0x2d, 0xe2, 0x35, 0x2c, 0xe2, 0xba, 0xd4, 0xe7, 0x29, 0x4c, 0x3e, 0xd5, - 0x83, 0xf5, 0x55, 0xe5, 0x1a, 0x6d, 0xb8, 0x23, 0xcf, 0x03, 0xd4, 0x9c, 0x90, 0x3f, 0x37, 0x0e, - 0x60, 0xe9, 0x8b, 0x1e, 0x55, 0x89, 0x34, 0x89, 0x5b, 0xb3, 0x2b, 0xf6, 0x49, 0xc7, 0x66, 0x3e, - 0x4e, 0xc3, 0x02, 0xa9, 0xd7, 0xdb, 0x36, 0x63, 0x69, 0xf4, 0x16, 0xca, 0x2e, 0x56, 0xd4, 0x57, - 0x9c, 0x82, 0xf9, 0xba, 0xed, 0xd2, 0x56, 0x7a, 0x8e, 0xaf, 0x8b, 0x2f, 0x1f, 0x26, 0x7e, 0x3e, - 0xcf, 0xc4, 0x1e, 0x9d, 0x67, 0x62, 0xc6, 0x67, 0x90, 0x1a, 0x2c, 0xc8, 0x3c, 0xea, 0x32, 0x1b, - 0x17, 0x61, 0xa1, 0x2a, 0x96, 0x78, 0xc5, 0x64, 0x61, 0xd9, 0xec, 0xeb, 0xc5, 0x6c, 0xa5, 0x97, - 0xb9, 0x4f, 0x1b, 0x6e, 0x45, 0x45, 0x1a, 0x3f, 0x21, 0x78, 0x83, 0x57, 0xdb, 0x6b, 0x36, 0x65, - 0x41, 0x36, 0x1d, 0xf1, 0x13, 0x80, 0x1b, 0x6d, 0x39, 0x67, 0xb2, 0xb0, 0x3e, 0xd0, 0x4d, 0x6c, - 0x9b, 0xea, 0x59, 0x26, 0x8e, 0x1a, 0xbc, 0x12, 0xc8, 0x0c, 0x0c, 0x75, 0x0b, 0x41, 0x7a, 0x94, - 0x43, 0x4e, 0xe6, 0x40, 0x42, 0xf2, 0xf6, 0x48, 0x5e, 0x9a, 0x38, 0x5a, 0x69, 0xe7, 0xe2, 0x5e, - 0x26, 0xf6, 0xdf, 0xfd, 0x4c, 0xd6, 0x69, 0xf8, 0xdf, 0x76, 0xaa, 0x66, 0x8d, 0xb6, 0x2c, 0xb9, - 0x45, 0xe2, 0xcf, 0x36, 0xab, 0x1f, 0x5b, 0x7e, 0xd7, 0xb3, 0x19, 0x4f, 0x60, 0x95, 0x7e, 0x71, - 0xfc, 0x69, 0xc8, 0x5c, 0x1b, 0x53, 0xe7, 0x12, 0x94, 0xc1, 0xc1, 0x8c, 0x5f, 0x10, 0xac, 0xf2, - 0x71, 0x0e, 0x3d, 0xdb, 0xad, 0x93, 0x6a, 0xd3, 0x7e, 0x9e, 0xe2, 0xde, 0x46, 0xa0, 0x8f, 0xa3, - 0x79, 0x61, 0x25, 0x3e, 0x96, 0x07, 0xf7, 0x4b, 0xea, 0x93, 0xe6, 0x61, 0xc7, 0xf3, 0x9a, 0x5d, - 0xa5, 0xed, 0xa0, 0x82, 0x68, 0x06, 0x0a, 0x5e, 0xa8, 0xe3, 0x39, 0xd0, 0x4d, 0x6a, 0x57, 0x83, - 0x38, 0xe3, 0x2b, 0xcf, 0x42, 0x39, 0x59, 0x7a, 0x76, 0xba, 0xe5, 0xa4, 0x7d, 0x88, 0x21, 0x0e, - 0xbe, 0x51, 0xa2, 0xf5, 0x6d, 0x07, 0x05, 0x6c, 0xc7, 0x28, 0xc3, 0xeb, 0x43, 0xd1, 0x72, 0xe8, - 0xf7, 0x21, 0x4e, 0x5a, 0xb4, 0xe3, 0xfa, 0x53, 0xcd, 0xa6, 0xf4, 0x72, 0x6f, 0xe8, 0x8a, 0x0c, - 0x37, 0x52, 0x80, 0x79, 0xc5, 0x32, 0x69, 0x93, 0x96, 0x7a, 0x1d, 0x8c, 0xb2, 0x74, 0x49, 0xb5, - 0x2a, 0xbb, 0xec, 0x42, 0xdc, 0xe3, 0x2b, 0xb2, 0xcb, 0x8a, 0x19, 0x72, 0x05, 0x98, 0x22, 0x49, - 0xf5, 0x11, 0x09, 0x46, 0x1d, 0x34, 0x5e, 0xf1, 0xe3, 0xde, 0x1c, 0xec, 0x73, 0xdb, 0x27, 0x75, - 0xe2, 0x93, 0x19, 0x1f, 0x11, 0xe3, 0x5f, 0x04, 0x2b, 0xa1, 0x6d, 0xe4, 0x00, 0x7b, 0xb0, 0xd8, - 0x92, 0x6b, 0xea, 0xc5, 0x5a, 0x0d, 0x9d, 0x41, 0x65, 0xca, 0x29, 0x6e, 0xb2, 0x66, 0xb7, 0xf3, - 0x79, 0x58, 0xbe, 0x41, 0x1d, 0x16, 0x24, 0x7c, 0xfb, 0xbf, 0x0e, 0x8a, 0x38, 0x32, 0xdc, 0x47, - 0x90, 0x50, 0x98, 0x52, 0xc2, 0x48, 0xb3, 0xf5, 0x93, 0x0a, 0x8f, 0x17, 0x61, 0x9e, 0xd7, 0xc7, - 0x7f, 0x22, 0x58, 0x90, 0xa6, 0x84, 0xb3, 0xa1, 0x45, 0x42, 0x2e, 0x51, 0x6d, 0x33, 0x42, 0xa4, - 0x60, 0x35, 0x3e, 0xf8, 0xf1, 0xce, 0xc3, 0x3f, 0xe6, 0x0a, 0x78, 0xc7, 0x0a, 0xbf, 0xaf, 0x85, - 0x3d, 0x59, 0xa7, 0xd2, 0x85, 0xcf, 0xac, 0x6a, 0xf7, 0x88, 0x6b, 0x80, 0xff, 0x42, 0x90, 0x0c, - 0xdc, 0x4a, 0x38, 0x37, 0xbe, 0xe9, 0xe8, 0x25, 0xaa, 0x6d, 0x47, 0x8c, 0x96, 0x98, 0x16, 0xc7, - 0xdc, 0xc4, 0x1b, 0x11, 0x31, 0xf1, 0xff, 0x08, 0x5e, 0x1b, 0xb1, 0x75, 0x5c, 0x18, 0xdf, 0x75, - 0xdc, 0x8d, 0xa4, 0x15, 0x9f, 0x2a, 0x47, 0xf2, 0xee, 0x72, 0xde, 0x22, 0xce, 0x87, 0xf2, 0x32, - 0x95, 0x77, 0x14, 0x42, 0xfe, 0x1b, 0x82, 0x64, 0xc0, 0x4e, 0x27, 0xe9, 0x3a, 0xea, 0xf1, 0x93, - 0x74, 0x0d, 0xf1, 0x68, 0x63, 0x8d, 0x73, 0xae, 0xe2, 0x95, 0x70, 0x4e, 0x41, 0xf0, 0x2b, 0x82, - 0x84, 0x32, 0x3a, 0x3c, 0xe1, 0x6c, 0x0d, 0x59, 0xa7, 0xb6, 0x15, 0x25, 0x54, 0x82, 0xbc, 0xcb, - 0x41, 0xde, 0xc1, 0x6b, 0x13, 0x40, 0xac, 0x53, 0x7e, 0xf2, 0xce, 0xf0, 0x0f, 0x08, 0xe2, 0xc2, - 0xdc, 0xf0, 0xc6, 0xf8, 0x1e, 0x03, 0x4e, 0xaa, 0x65, 0xa7, 0x07, 0x46, 0xd2, 0x44, 0xd8, 0x28, - 0xfe, 0x07, 0xc1, 0x2b, 0x03, 0x6f, 0x3f, 0x36, 0xc7, 0x37, 0x08, 0x73, 0x16, 0xcd, 0x8a, 0x1c, - 0x2f, 0xb9, 0xde, 0xe3, 0x5c, 0x26, 0xce, 0x85, 0x72, 0x71, 0x69, 0xd8, 0x91, 0xf2, 0x90, 0xbe, - 0x56, 0x7f, 0x23, 0x78, 0x75, 0xd0, 0x84, 0xf1, 0xb4, 0xce, 0xc3, 0xb7, 0x82, 0xb6, 0x13, 0x3d, - 0x41, 0xb2, 0xe6, 0x38, 0xeb, 0x3a, 0x7e, 0x3b, 0x0a, 0x6b, 0x69, 0xff, 0xe2, 0x4a, 0x47, 0x97, - 0x57, 0x3a, 0x7a, 0x70, 0xa5, 0xa3, 0xdf, 0xaf, 0xf5, 0xd8, 0xe5, 0xb5, 0x1e, 0xbb, 0x7b, 0xad, - 0xc7, 0xbe, 0xda, 0x9c, 0xf8, 0x83, 0xe0, 0x7b, 0x51, 0x96, 0xff, 0x2e, 0xa8, 0xc6, 0xf9, 0xff, - 0x15, 0xc5, 0x27, 0x01, 0x00, 0x00, 0xff, 0xff, 0xd1, 0xfd, 0x88, 0xa1, 0x2f, 0x0d, 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/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index 3b633395e021..4678ecdc503f 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -103,7 +103,7 @@ func TestCalculateRewardsAfterSlash(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), 0) // retrieve validator val = app.StakingKeeper.Validator(ctx, valAddrs[0]) @@ -166,7 +166,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // slash the validator by 50% - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), 0) // fetch the validator again val = app.StakingKeeper.Validator(ctx, valAddrs[0]) @@ -180,7 +180,7 @@ func TestCalculateRewardsAfterManySlashes(t *testing.T) { app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% again - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), 0) // fetch the validator again val = app.StakingKeeper.Validator(ctx, valAddrs[0]) @@ -400,10 +400,10 @@ func TestCalculateRewardsAfterManySlashesInSameBlock(t *testing.T) { app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) // slash the validator by 50% - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), 0) // slash the validator by 50% again - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower/2, sdk.NewDecWithPrec(5, 1), 0) // fetch the validator again val = app.StakingKeeper.Validator(ctx, valAddrs[0]) @@ -457,7 +457,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), 0) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // second delegation @@ -476,7 +476,7 @@ func TestCalculateRewardsMultiDelegatorMultiSlash(t *testing.T) { // slash the validator again ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) - app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, valConsAddr1, ctx.BlockHeight(), valPower, sdk.NewDecWithPrec(5, 1), 0) ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) // fetch updated validator diff --git a/x/distribution/keeper/hooks.go b/x/distribution/keeper/hooks.go index 1d12fcc55513..2d2d1a6a5ab6 100644 --- a/x/distribution/keeper/hooks.go +++ b/x/distribution/keeper/hooks.go @@ -105,3 +105,5 @@ func (h Hooks) BeforeValidatorModified(_ sdk.Context, _ sdk.ValAddress) func (h Hooks) AfterValidatorBonded(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} func (h Hooks) AfterValidatorBeginUnbonding(_ sdk.Context, _ sdk.ConsAddress, _ sdk.ValAddress) {} func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) { +} diff --git a/x/distribution/types/expected_keepers.go b/x/distribution/types/expected_keepers.go index ac9ebc3a4eea..9b869c972735 100644 --- a/x/distribution/types/expected_keepers.go +++ b/x/distribution/types/expected_keepers.go @@ -46,8 +46,8 @@ type StakingKeeper interface { Validator(sdk.Context, sdk.ValAddress) stakingtypes.ValidatorI // get a particular validator by operator address ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.ValidatorI // get a particular validator by consensus address - // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) + // slash the validator and delegators of the validator, specifying offence height, offence power, slash fraction and infraction type + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.InfractionType) Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator diff --git a/x/evidence/keeper/infraction.go b/x/evidence/keeper/infraction.go index 3ae74bc216de..f2221ba009b2 100644 --- a/x/evidence/keeper/infraction.go +++ b/x/evidence/keeper/infraction.go @@ -6,6 +6,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/evidence/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleEquivocationEvidence implements an equivocation evidence handler. Assuming the @@ -26,19 +27,6 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi logger := k.Logger(ctx) consAddr := evidence.GetConsensusAddress() - if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { - // Ignore evidence that cannot be handled. - // - // NOTE: We used to panic with: - // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, - // but this couples the expectations of the app to both Tendermint and - // the simulator. Both are expected to provide the full range of - // allowable but none of the disallowed evidence types. Instead of - // getting this coordination right, it is easier to relax the - // constraints and ignore evidence that cannot be handled. - return - } - // calculate the age of the evidence infractionHeight := evidence.GetHeight() infractionTime := evidence.GetTime() @@ -70,6 +58,22 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi return } + // ignore the public keys when validators don't have an operator address + if !validator.GetOperator().Empty() { + if _, err := k.slashingKeeper.GetPubkey(ctx, consAddr.Bytes()); err != nil { + // Ignore evidence that cannot be handled. + // + // NOTE: We used to panic with: + // `panic(fmt.Sprintf("Validator consensus-address %v not found", consAddr))`, + // but this couples the expectations of the app to both Tendermint and + // the simulator. Both are expected to provide the full range of + // allowable but none of the disallowed evidence types. Instead of + // getting this coordination right, it is easier to relax the + // constraints and ignore evidence that cannot be handled. + return + } + } + if ok := k.slashingKeeper.HasValidatorSigningInfo(ctx, consAddr); !ok { panic(fmt.Sprintf("expected signing info for validator %s but not found", consAddr)) } @@ -109,6 +113,7 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi consAddr, k.slashingKeeper.SlashFractionDoubleSign(ctx), evidence.GetValidatorPower(), distributionHeight, + stakingtypes.DoubleSign, ) // Jail the validator if not already jailed. This will begin unbonding the diff --git a/x/evidence/spec/06_begin_block.md b/x/evidence/spec/06_begin_block.md index 8a6c83327f1b..26350eafa27f 100644 --- a/x/evidence/spec/06_begin_block.md +++ b/x/evidence/spec/06_begin_block.md @@ -136,6 +136,7 @@ func (k Keeper) HandleEquivocationEvidence(ctx sdk.Context, evidence *types.Equi consAddr, k.slashingKeeper.SlashFractionDoubleSign(ctx), evidence.GetValidatorPower(), distributionHeight, + stakingtypes.DoubleSign, ) // Jail the validator if not already jailed. This will begin unbonding the diff --git a/x/evidence/types/expected_keepers.go b/x/evidence/types/expected_keepers.go index 0f1d87774c6c..c01157347243 100644 --- a/x/evidence/types/expected_keepers.go +++ b/x/evidence/types/expected_keepers.go @@ -22,7 +22,7 @@ type ( IsTombstoned(sdk.Context, sdk.ConsAddress) bool HasValidatorSigningInfo(sdk.Context, sdk.ConsAddress) bool Tombstone(sdk.Context, sdk.ConsAddress) - Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64) + Slash(sdk.Context, sdk.ConsAddress, sdk.Dec, int64, int64, stakingtypes.InfractionType) SlashFractionDoubleSign(sdk.Context) sdk.Dec Jail(sdk.Context, sdk.ConsAddress) JailUntil(sdk.Context, sdk.ConsAddress, time.Time) diff --git a/x/slashing/handler_test.go b/x/slashing/handler_test.go index e6b6af64b68d..25fed487ba79 100644 --- a/x/slashing/handler_test.go +++ b/x/slashing/handler_test.go @@ -219,14 +219,14 @@ func TestHandleAbsentValidator(t *testing.T) { // validator should have been slashed require.True(t, amt.Sub(slashAmt).Equal(validator.GetTokens())) - // 502nd block *also* missed (since the LastCommit would have still included the just-unbonded validator) height++ ctx = ctx.WithBlockHeight(height) app.SlashingKeeper.HandleValidatorSignature(ctx, val.Address(), power, false) info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) require.True(t, found) require.Equal(t, int64(0), info.StartHeight) - require.Equal(t, int64(1), info.MissedBlocksCounter) + // validator missed block should not be incremented since it is jailed (#11425) + require.Equal(t, int64(0), info.MissedBlocksCounter) // end block staking.EndBlocker(ctx, app.StakingKeeper) @@ -260,8 +260,8 @@ func TestHandleAbsentValidator(t *testing.T) { info, found = app.SlashingKeeper.GetValidatorSigningInfo(ctx, sdk.ConsAddress(val.Address())) require.True(t, found) require.Equal(t, int64(0), info.StartHeight) - // we've missed 2 blocks more than the maximum, so the counter was reset to 0 at 1 block more and is now 1 - require.Equal(t, int64(1), info.MissedBlocksCounter) + // validator missed block should not have been changed + require.Equal(t, int64(0), info.MissedBlocksCounter) // validator should not be immediately jailed again height++ diff --git a/x/slashing/keeper/hooks.go b/x/slashing/keeper/hooks.go index e3a00e9f5556..445cd80d00d0 100644 --- a/x/slashing/keeper/hooks.go +++ b/x/slashing/keeper/hooks.go @@ -47,6 +47,7 @@ type Hooks struct { k Keeper } +// Implements StakingHooks interface var _ types.StakingHooks = Hooks{} // Return the wrapper struct @@ -76,3 +77,5 @@ func (h Hooks) BeforeDelegationSharesModified(_ sdk.Context, _ sdk.AccAddress, _ func (h Hooks) BeforeDelegationRemoved(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} func (h Hooks) AfterDelegationModified(_ sdk.Context, _ sdk.AccAddress, _ sdk.ValAddress) {} func (h Hooks) BeforeValidatorSlashed(_ sdk.Context, _ sdk.ValAddress, _ sdk.Dec) {} +func (h Hooks) AfterUnbondingInitiated(_ sdk.Context, _ uint64) { +} diff --git a/x/slashing/keeper/infractions.go b/x/slashing/keeper/infractions.go index 06baa48f82b4..509448b35507 100644 --- a/x/slashing/keeper/infractions.go +++ b/x/slashing/keeper/infractions.go @@ -6,19 +6,22 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // HandleValidatorSignature handles a validator signature, must be called once per validator per block. func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Address, power int64, signed bool) { - logger := k.Logger(ctx) - height := ctx.BlockHeight() - // fetch the validator public key consAddr := sdk.ConsAddress(addr) - if _, err := k.GetPubkey(ctx, addr); err != nil { - panic(fmt.Sprintf("Validator consensus-address %s not found", consAddr)) + + // don't update missed blocks when validator's jailed + if k.sk.IsValidatorJailed(ctx, consAddr) { + return } + logger := k.Logger(ctx) + height := ctx.BlockHeight() + // fetch signing info signInfo, found := k.GetValidatorSigningInfo(ctx, consAddr) if !found { @@ -35,6 +38,7 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre // That way we avoid needing to read/write the whole array each time previous := k.GetValidatorMissedBlockBitArray(ctx, consAddr, index) missed := !signed + switch { case !previous && missed: // Array value has changed from not missed to missed, increment counter @@ -75,7 +79,7 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre // if we are past the minimum height and the validator has missed too many blocks, punish them if height > minHeight && signInfo.MissedBlocksCounter > maxMissed { validator := k.sk.ValidatorByConsAddr(ctx, consAddr) - if validator != nil && !validator.IsJailed() { + if validator != nil { // Downtime confirmed: slash and jail the validator // We need to retrieve the stake distribution which signed the block, so we subtract ValidatorUpdateDelay from the evidence height, // and subtract an additional 1 since this is the LastCommit. @@ -83,7 +87,6 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre // i.e. at the end of the pre-genesis block (none) = at the beginning of the genesis block. // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, @@ -93,7 +96,7 @@ func (k Keeper) HandleValidatorSignature(ctx sdk.Context, addr cryptotypes.Addre sdk.NewAttribute(types.AttributeKeyJailed, consAddr.String()), ), ) - k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx)) + k.sk.Slash(ctx, consAddr, distributionHeight, power, k.SlashFractionDowntime(ctx), stakingtypes.Downtime) k.sk.Jail(ctx, consAddr) signInfo.JailedUntil = ctx.BlockHeader().Time.Add(k.DowntimeJailDuration(ctx)) diff --git a/x/slashing/keeper/keeper.go b/x/slashing/keeper/keeper.go index 12a943c84c69..aa7c3746c153 100644 --- a/x/slashing/keeper/keeper.go +++ b/x/slashing/keeper/keeper.go @@ -9,6 +9,7 @@ import ( cryptotypes "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) // Keeper of the slashing store @@ -64,7 +65,7 @@ func (k Keeper) GetPubkey(ctx sdk.Context, a cryptotypes.Address) (cryptotypes.P // Slash attempts to slash a validator. The slash is delegated to the staking // module to make the necessary validator changes. -func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64) { +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.Dec, power, distributionHeight int64, infractionType stakingtypes.InfractionType) { ctx.EventManager().EmitEvent( sdk.NewEvent( types.EventTypeSlash, @@ -74,7 +75,7 @@ func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, fraction sdk.De ), ) - k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction) + k.sk.Slash(ctx, consAddr, distributionHeight, power, fraction, infractionType) } // Jail attempts to jail a validator. The slash is delegated to the staking module diff --git a/x/slashing/spec/04_begin_block.md b/x/slashing/spec/04_begin_block.md index 99572c419f20..452c27fbc767 100644 --- a/x/slashing/spec/04_begin_block.md +++ b/x/slashing/spec/04_begin_block.md @@ -81,7 +81,7 @@ for vote in block.LastCommitInfo.Votes { // That's fine since this is just used to filter unbonding delegations & redelegations. distributionHeight := height - sdk.ValidatorUpdateDelay - 1 - Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime()) + Slash(vote.Validator.Address, distributionHeight, vote.Validator.Power, SlashFractionDowntime(), stakingtypes.Downtime) Jail(vote.Validator.Address) signInfo.JailedUntil = block.Time.Add(DowntimeJailDuration()) diff --git a/x/slashing/types/expected_keepers.go b/x/slashing/types/expected_keepers.go index 9710ad1786e7..18023db66db2 100644 --- a/x/slashing/types/expected_keepers.go +++ b/x/slashing/types/expected_keepers.go @@ -42,7 +42,7 @@ type StakingKeeper interface { ValidatorByConsAddr(sdk.Context, sdk.ConsAddress) stakingtypes.ValidatorI // get a particular validator by consensus address // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, stakingtypes.InfractionType) Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -52,6 +52,9 @@ type StakingKeeper interface { // MaxValidators returns the maximum amount of bonded validators MaxValidators(sdk.Context) uint32 + + // return if the validator is jailed + IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool } // StakingHooks event hooks for staking validator object (noalias) diff --git a/x/slashing/types/genesis.go b/x/slashing/types/genesis.go index b891dec80e8b..d9270a27b8b2 100644 --- a/x/slashing/types/genesis.go +++ b/x/slashing/types/genesis.go @@ -53,13 +53,13 @@ func ValidateGenesis(data GenesisState) error { } downtimeJail := data.Params.DowntimeJailDuration - if downtimeJail < 1*time.Minute { - return fmt.Errorf("downtime unjail duration must be at least 1 minute, is %s", downtimeJail.String()) + if downtimeJail < 2*time.Second { + return fmt.Errorf("downtime unjail duration must be at least 2 seconds, is %s", downtimeJail.String()) } signedWindow := data.Params.SignedBlocksWindow - if signedWindow < 10 { - return fmt.Errorf("signed blocks window must be at least 10, is %d", signedWindow) + if signedWindow < 2 { + return fmt.Errorf("signed blocks window must be at least 2, is %d", signedWindow) } return nil diff --git a/x/staking/handler_test.go b/x/staking/handler_test.go index 4b31484f1855..d23a13f94f0c 100644 --- a/x/staking/handler_test.go +++ b/x/staking/handler_test.go @@ -78,7 +78,7 @@ func TestValidatorByPowerIndex(t *testing.T) { // slash and jail the first validator consAddr0 := sdk.ConsAddress(PKs[0].Address()) - app.StakingKeeper.Slash(ctx, consAddr0, 0, initPower, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, consAddr0, 0, initPower, sdk.NewDecWithPrec(5, 1), 0) app.StakingKeeper.Jail(ctx, consAddr0) app.StakingKeeper.ApplyAndReturnValidatorSetUpdates(ctx) @@ -1110,7 +1110,7 @@ func TestBondUnbondRedelegateSlashTwice(t *testing.T) { require.Equal(t, 2, len(updates)) // slash the validator by half - app.StakingKeeper.Slash(ctx, consAddr0, 0, 20, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, consAddr0, 0, 20, sdk.NewDecWithPrec(5, 1), 0) // unbonding delegation should have been slashed by half ubd, found := app.StakingKeeper.GetUnbondingDelegation(ctx, del, valA) @@ -1135,7 +1135,7 @@ func TestBondUnbondRedelegateSlashTwice(t *testing.T) { // slash the validator for an infraction committed after the unbonding and redelegation begin ctx = ctx.WithBlockHeight(3) - app.StakingKeeper.Slash(ctx, consAddr0, 2, 10, sdk.NewDecWithPrec(5, 1)) + app.StakingKeeper.Slash(ctx, consAddr0, 2, 10, sdk.NewDecWithPrec(5, 1), 0) tstaking.Ctx = ctx // unbonding delegation should be unchanged diff --git a/x/staking/keeper/delegation.go b/x/staking/keeper/delegation.go index cf1fec10457d..f164fea3b8a0 100644 --- a/x/staking/keeper/delegation.go +++ b/x/staking/keeper/delegation.go @@ -309,14 +309,21 @@ func (k Keeper) SetUnbondingDelegationEntry( creationHeight int64, minTime time.Time, balance sdk.Int, ) types.UnbondingDelegation { ubd, found := k.GetUnbondingDelegation(ctx, delegatorAddr, validatorAddr) + id := k.IncrementUnbondingId(ctx) if found { - ubd.AddEntry(creationHeight, minTime, balance) + ubd.AddEntry(creationHeight, minTime, balance, id) } else { - ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance) + ubd = types.NewUnbondingDelegation(delegatorAddr, validatorAddr, creationHeight, minTime, balance, id) } k.SetUnbondingDelegation(ctx, ubd) + // Add to the UBDByUnbondingOp index to look up the UBD by the UBDE ID + k.SetUnbondingDelegationByUnbondingId(ctx, ubd, id) + + // Call hook + k.AfterUnbondingInitiated(ctx, id) + return ubd } @@ -494,8 +501,8 @@ func (k Keeper) SetRedelegation(ctx sdk.Context, red types.Redelegation) { store.Set(types.GetREDByValDstIndexKey(delegatorAddress, valSrcAddr, valDestAddr), []byte{}) } -// SetRedelegationEntry adds an entry to the unbonding delegation at the given -// addresses. It creates the unbonding delegation if it does not exist. +// SetRedelegationEntry adds an entry to the redelegation at +// the given addresses. It creates the redelegation if it does not exist func (k Keeper) SetRedelegationEntry(ctx sdk.Context, delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, creationHeight int64, @@ -503,15 +510,22 @@ func (k Keeper) SetRedelegationEntry(ctx sdk.Context, sharesSrc, sharesDst sdk.Dec, ) types.Redelegation { red, found := k.GetRedelegation(ctx, delegatorAddr, validatorSrcAddr, validatorDstAddr) + id := k.IncrementUnbondingId(ctx) if found { - red.AddEntry(creationHeight, minTime, balance, sharesDst) + red.AddEntry(creationHeight, minTime, balance, sharesDst, id) } else { red = types.NewRedelegation(delegatorAddr, validatorSrcAddr, - validatorDstAddr, creationHeight, minTime, balance, sharesDst) + validatorDstAddr, creationHeight, minTime, balance, sharesDst, id) } k.SetRedelegation(ctx, red) + // Add to the UBDByEntry index to look up the UBD by the UBDE ID + k.SetRedelegationByUnbondingId(ctx, red, id) + + // Call hook + k.AfterUnbondingInitiated(ctx, id) + return red } @@ -850,12 +864,14 @@ func (k Keeper) CompleteUnbonding(ctx sdk.Context, delAddr sdk.AccAddress, valAd return nil, err } - // loop through all the entries and complete unbonding mature entries + // loop through all the entries and try to complete unbonding mature entries for i := 0; i < len(ubd.Entries); i++ { entry := ubd.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { + // Proceed with unbonding ubd.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) // track undelegation only when remaining or truncated shares are non-zero if !entry.Balance.IsZero() { @@ -954,12 +970,13 @@ func (k Keeper) CompleteRedelegation( balances := sdk.NewCoins() ctxTime := ctx.BlockHeader().Time - // loop through all the entries and complete mature redelegation entries + // loop through all the entries and try to complete mature redelegation entries for i := 0; i < len(red.Entries); i++ { entry := red.Entries[i] - if entry.IsMature(ctxTime) { + if entry.IsMature(ctxTime) && !entry.OnHold() { red.RemoveEntry(int64(i)) i-- + k.DeleteUnbondingIndex(ctx, entry.UnbondingId) if !entry.InitialBalance.IsZero() { balances = balances.Add(sdk.NewCoin(bondDenom, entry.InitialBalance)) diff --git a/x/staking/keeper/delegation_test.go b/x/staking/keeper/delegation_test.go index 069d4c943b13..e873022d30fd 100644 --- a/x/staking/keeper/delegation_test.go +++ b/x/staking/keeper/delegation_test.go @@ -148,6 +148,7 @@ func TestUnbondingDelegation(t *testing.T) { 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), + app.StakingKeeper.IncrementUnbondingId(ctx), ) // set and retrieve a record @@ -615,7 +616,7 @@ func TestGetRedelegationsFromSrcValidator(t *testing.T) { rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0), sdk.NewInt(5), - sdk.NewDec(5)) + sdk.NewDec(5), 1) // set and retrieve a record app.StakingKeeper.SetRedelegation(ctx, rd) @@ -642,7 +643,7 @@ func TestRedelegation(t *testing.T) { rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, time.Unix(0, 0).UTC(), sdk.NewInt(5), - sdk.NewDec(5)) + sdk.NewDec(5), 1) // test shouldn't have and redelegations has := app.StakingKeeper.HasReceivingRedelegation(ctx, addrDels[0], addrVals[1]) diff --git a/x/staking/keeper/hooks.go b/x/staking/keeper/hooks.go index b8f25908babd..ae0c98401b7d 100644 --- a/x/staking/keeper/hooks.go +++ b/x/staking/keeper/hooks.go @@ -77,3 +77,10 @@ func (k Keeper) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, k.hooks.BeforeValidatorSlashed(ctx, valAddr, fraction) } } + +// This is called when an UnbondingDelegationEntry is first created +func (k Keeper) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { + if k.hooks != nil { + k.hooks.AfterUnbondingInitiated(ctx, id) + } +} diff --git a/x/staking/keeper/keeper.go b/x/staking/keeper/keeper.go index 6211dcf6ad94..7f120af196f0 100644 --- a/x/staking/keeper/keeper.go +++ b/x/staking/keeper/keeper.go @@ -3,6 +3,7 @@ package keeper import ( "fmt" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/libs/log" "github.com/cosmos/cosmos-sdk/codec" @@ -93,3 +94,19 @@ func (k Keeper) SetLastTotalPower(ctx sdk.Context, power sdk.Int) { bz := k.cdc.MustMarshal(&sdk.IntProto{Int: power}) store.Set(types.LastTotalPowerKey, bz) } + +// SetValidatorUpdates sets the ABCI validator power updates for the current block. +func (k Keeper) SetValidatorUpdates(ctx sdk.Context, valUpdates []abci.ValidatorUpdate) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&types.ValidatorUpdates{Updates: valUpdates}) + store.Set(types.ValidatorUpdatesKey, bz) +} + +// GetValidatorUpdates returns the ABCI validator power updates within the current block. +func (k Keeper) GetValidatorUpdates(ctx sdk.Context) []abci.ValidatorUpdate { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.ValidatorUpdatesKey) + var valUpdates types.ValidatorUpdates + k.cdc.MustUnmarshal(bz, &valUpdates) + return valUpdates.Updates +} diff --git a/x/staking/keeper/querier.go b/x/staking/keeper/querier.go index b3ec7e18d92f..5c276e145aec 100644 --- a/x/staking/keeper/querier.go +++ b/x/staking/keeper/querier.go @@ -511,6 +511,7 @@ func RedelegationsToRedelegationResponses( entry.SharesDst, entry.InitialBalance, val.TokensFromShares(entry.SharesDst).TruncateInt(), + entry.UnbondingId, ) } diff --git a/x/staking/keeper/slash.go b/x/staking/keeper/slash.go index ae41eb72d6ee..dca50f131397 100644 --- a/x/staking/keeper/slash.go +++ b/x/staking/keeper/slash.go @@ -25,10 +25,9 @@ import ( // Slash will not slash unbonded validators (for the above reason) // // CONTRACT: -// -// Infraction was committed at the current height or at a past height, -// not at a height in the future -func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec) { +// Infraction was committed at the current height or at a past height, +// not at a height in the future +func (k Keeper) Slash(ctx sdk.Context, consAddr sdk.ConsAddress, infractionHeight int64, power int64, slashFactor sdk.Dec, _ types.InfractionType) { logger := k.Logger(ctx) if slashFactor.IsNegative() { @@ -184,7 +183,7 @@ func (k Keeper) SlashUnbondingDelegation(ctx sdk.Context, unbondingDelegation ty continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Unbonding delegation no longer eligible for slashing, skip it continue } @@ -238,7 +237,7 @@ func (k Keeper) SlashRedelegation(ctx sdk.Context, srcValidator types.Validator, continue } - if entry.IsMature(now) { + if entry.IsMature(now) && !entry.OnHold() { // Redelegation no longer eligible for slashing, skip it continue } diff --git a/x/staking/keeper/slash_test.go b/x/staking/keeper/slash_test.go index 64bdb0177d57..ac4289f1d5d7 100644 --- a/x/staking/keeper/slash_test.go +++ b/x/staking/keeper/slash_test.go @@ -80,7 +80,7 @@ func TestSlashUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp (beyond which the // unbonding delegation shouldn't be slashed) ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 0, - time.Unix(5, 0), sdk.NewInt(10)) + time.Unix(5, 0), sdk.NewInt(10), app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) @@ -131,7 +131,7 @@ func TestSlashRedelegation(t *testing.T) { // set a redelegation with an expiration timestamp beyond which the // redelegation shouldn't be slashed rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 0, - time.Unix(5, 0), sdk.NewInt(10), sdk.NewDec(10)) + time.Unix(5, 0), sdk.NewInt(10), sdk.NewDec(10), 1) app.StakingKeeper.SetRedelegation(ctx, rd) @@ -188,7 +188,7 @@ func TestSlashAtFutureHeight(t *testing.T) { consAddr := sdk.ConsAddress(PKs[0].Address()) fraction := sdk.NewDecWithPrec(5, 1) - require.Panics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 1, 10, fraction) }) + require.Panics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 1, 10, fraction, 0) }) } // test slash at a negative height @@ -203,7 +203,7 @@ func TestSlashAtNegativeHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, -2, 10, fraction, 0) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -234,7 +234,7 @@ func TestSlashValidatorAtCurrentHeight(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, ctx.BlockHeight(), 10, fraction, 0) // read updated state validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) @@ -264,7 +264,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // set an unbonding delegation with expiration timestamp beyond which the // unbonding delegation shouldn't be slashed ubdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) - ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens) + ubd := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, time.Unix(0, 0), ubdTokens, app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubd) // slash validator for the first time @@ -274,7 +274,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, 0) // end block applyValidatorSetUpdates(t, ctx, app.StakingKeeper, 1) @@ -304,7 +304,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // slash validator again ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, 0) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -330,7 +330,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, 0) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -356,7 +356,7 @@ func TestSlashWithUnbondingDelegation(t *testing.T) { // on the unbonding delegation, but it will slash stake bonded since the infraction // this may not be the desirable behaviour, ref https://github.com/cosmos/cosmos-sdk/issues/1440 ctx = ctx.WithBlockHeight(13) - app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr, 9, 10, fraction, 0) ubd, found = app.StakingKeeper.GetUnbondingDelegation(ctx, addrDels[0], addrVals[0]) require.True(t, found) @@ -390,7 +390,7 @@ func TestSlashWithRedelegation(t *testing.T) { // set a redelegation rdTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rd := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, - time.Unix(0, 0), rdTokens, rdTokens.ToDec()) + time.Unix(0, 0), rdTokens, rdTokens.ToDec(), 1) app.StakingKeeper.SetRedelegation(ctx, rd) // set the associated delegation @@ -414,7 +414,7 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction) }) + require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, fraction, 0) }) burnAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(fraction).TruncateInt() bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -445,7 +445,7 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec()) }) + require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec(), 0) }) burnAmount = app.StakingKeeper.TokensFromConsensusPower(ctx, 7) // read updated pool @@ -479,7 +479,7 @@ func TestSlashWithRedelegation(t *testing.T) { validator, found = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.True(t, found) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec()) }) + require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec(), 0) }) burnAmount = app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(sdk.OneDec()).TruncateInt() burnAmount = burnAmount.Sub(sdk.OneDec().MulInt(rdTokens).TruncateInt()) @@ -512,7 +512,7 @@ func TestSlashWithRedelegation(t *testing.T) { validator, _ = app.StakingKeeper.GetValidatorByConsAddr(ctx, consAddr) require.Equal(t, validator.GetStatus(), types.Unbonding) - require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec()) }) + require.NotPanics(t, func() { app.StakingKeeper.Slash(ctx, consAddr, 10, 10, sdk.OneDec(), 0) }) // read updated pool bondedPool = app.StakingKeeper.GetBondedPool(ctx) @@ -544,7 +544,7 @@ func TestSlashBoth(t *testing.T) { rdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 6) rdA := types.NewRedelegation(addrDels[0], addrVals[0], addrVals[1], 11, time.Unix(0, 0), rdATokens, - rdATokens.ToDec()) + rdATokens.ToDec(), 1) app.StakingKeeper.SetRedelegation(ctx, rdA) // set the associated delegation @@ -555,7 +555,7 @@ func TestSlashBoth(t *testing.T) { // unbonding delegation shouldn't be slashed) ubdATokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 4) ubdA := types.NewUnbondingDelegation(addrDels[0], addrVals[0], 11, - time.Unix(0, 0), ubdATokens) + time.Unix(0, 0), ubdATokens, app.StakingKeeper.IncrementUnbondingId(ctx)) app.StakingKeeper.SetUnbondingDelegation(ctx, ubdA) bondedCoins := sdk.NewCoins(sdk.NewCoin(bondDenom, rdATokens.MulRaw(2))) @@ -578,7 +578,7 @@ func TestSlashBoth(t *testing.T) { validator, found := app.StakingKeeper.GetValidatorByConsAddr(ctx, sdk.GetConsAddress(PKs[0])) require.True(t, found) consAddr0 := sdk.ConsAddress(PKs[0].Address()) - app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction) + app.StakingKeeper.Slash(ctx, consAddr0, 10, 10, fraction, 0) burnedNotBondedAmount := fraction.MulInt(ubdATokens).TruncateInt() burnedBondAmount := app.StakingKeeper.TokensFromConsensusPower(ctx, 10).ToDec().Mul(fraction).TruncateInt() diff --git a/x/staking/keeper/unbonding.go b/x/staking/keeper/unbonding.go new file mode 100644 index 000000000000..099950e6030d --- /dev/null +++ b/x/staking/keeper/unbonding.go @@ -0,0 +1,419 @@ +package keeper + +import ( + "encoding/binary" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/cosmos-sdk/x/staking/types" +) + +// Increments and returns a unique ID for an unbonding operation +func (k Keeper) IncrementUnbondingId(ctx sdk.Context) (unbondingId uint64) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.UnbondingIdKey) + + if bz == nil { + unbondingId = 0 + } else { + unbondingId = binary.BigEndian.Uint64(bz) + } + + unbondingId = unbondingId + 1 + + // Convert back into bytes for storage + bz = make([]byte, 8) + binary.BigEndian.PutUint64(bz, unbondingId) + + store.Set(types.UnbondingIdKey, bz) + + return unbondingId +} + +// Remove a mapping from UnbondingId to unbonding operation +func (k Keeper) DeleteUnbondingIndex(ctx sdk.Context, id uint64) { + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetUnbondingIndexKey(id)) +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetUnbondingDelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (ubd types.UnbondingDelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + ubdeKey := store.Get(types.GetUnbondingIndexKey(id)) + if ubdeKey == nil { + return types.UnbondingDelegation{}, false + } + + value := store.Get(ubdeKey) + if value == nil { + return types.UnbondingDelegation{}, false + } + + ubd, err := types.UnmarshalUBD(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.UnbondingDelegation{}, false + } + + return ubd, true +} + +// return a unbonding delegation that has an unbonding delegation entry with a certain ID +func (k Keeper) GetRedelegationByUnbondingId( + ctx sdk.Context, id uint64, +) (red types.Redelegation, found bool) { + store := ctx.KVStore(k.storeKey) + + redKey := store.Get(types.GetUnbondingIndexKey(id)) + if redKey == nil { + return types.Redelegation{}, false + } + + value := store.Get(redKey) + if value == nil { + return types.Redelegation{}, false + } + + red, err := types.UnmarshalRED(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Redelegation{}, false + } + + return red, true +} + +// return the validator that is unbonding with a certain unbonding op ID +func (k Keeper) GetValidatorByUnbondingId( + ctx sdk.Context, id uint64, +) (val types.Validator, found bool) { + store := ctx.KVStore(k.storeKey) + + valKey := store.Get(types.GetUnbondingIndexKey(id)) + if valKey == nil { + return types.Validator{}, false + } + + value := store.Get(valKey) + if value == nil { + return types.Validator{}, false + } + + val, err := types.UnmarshalValidator(k.cdc, value) + // An error here means that what we got wasn't the right type + if err != nil { + return types.Validator{}, false + } + + return val, true +} + +// Set an index to look up an UnbondingDelegation by the unbondingId of an UnbondingDelegationEntry that it contains +func (k Keeper) SetUnbondingDelegationByUnbondingId(ctx sdk.Context, ubd types.UnbondingDelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + panic(err) + } + + valAddr, err := sdk.ValAddressFromBech32(ubd.ValidatorAddress) + if err != nil { + panic(err) + } + + ubdKey := types.GetUBDKey(delAddr, valAddr) + store.Set(types.GetUnbondingIndexKey(id), ubdKey) +} + +// Set an index to look up an Redelegation by the unbondingId of an RedelegationEntry that it contains +func (k Keeper) SetRedelegationByUnbondingId(ctx sdk.Context, red types.Redelegation, id uint64) { + store := ctx.KVStore(k.storeKey) + + delAddr, err := sdk.AccAddressFromBech32(red.DelegatorAddress) + if err != nil { + panic(err) + } + + valSrcAddr, err := sdk.ValAddressFromBech32(red.ValidatorSrcAddress) + if err != nil { + panic(err) + } + + valDstAddr, err := sdk.ValAddressFromBech32(red.ValidatorDstAddress) + if err != nil { + panic(err) + } + + redKey := types.GetREDKey(delAddr, valSrcAddr, valDstAddr) + store.Set(types.GetUnbondingIndexKey(id), redKey) +} + +// Set an index to look up a Validator by the unbondingId corresponding to its current unbonding +func (k Keeper) SetValidatorByUnbondingId(ctx sdk.Context, val types.Validator, id uint64) { + store := ctx.KVStore(k.storeKey) + + valAddr, err := sdk.ValAddressFromBech32(val.OperatorAddress) + if err != nil { + panic(err) + } + + valKey := types.GetValidatorKey(valAddr) + store.Set(types.GetUnbondingIndexKey(id), valKey) +} + +// unbondingDelegationEntryArrayIndex and redelegationEntryArrayIndex are utilities to find +// at which position in the Entries array the entry with a given id is +// ---------------------------------------------------------------------------------------- + +func unbondingDelegationEntryArrayIndex(ubd types.UnbondingDelegation, id uint64) (index int, found bool) { + for i, entry := range ubd.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +func redelegationEntryArrayIndex(red types.Redelegation, id uint64) (index int, found bool) { + for i, entry := range red.Entries { + // we find the entry with the right ID + if entry.UnbondingId == id { + return i, true + } + } + + return 0, false +} + +// UnbondingCanComplete allows a stopped unbonding operation, such as an +// unbonding delegation, a redelegation, or a validator unbonding to complete. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +// ---------------------------------------------------------------------------------------- + +func (k Keeper) UnbondingCanComplete(ctx sdk.Context, id uint64) error { + found, err := k.unbondingDelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + found, err = k.redelegationEntryCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + found, err = k.validatorUnbondingCanComplete(ctx, id) + if err != nil { + return err + } + if found { + return nil + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) unbondingDelegationEntryCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return false, nil + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + + if !found { + return false, nil + } + + // The entry must be on hold + if !ubd.Entries[i].OnHold() { + return true, + sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "undelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, ubd.Entries[i].UnbondingOnHoldRefCount, + ) + } + ubd.Entries[i].UnbondingOnHoldRefCount-- + + // Check if entry is matured. + if !ubd.Entries[i].OnHold() && ubd.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + delegatorAddress, err := sdk.AccAddressFromBech32(ubd.DelegatorAddress) + if err != nil { + return false, err + } + + bondDenom := k.GetParams(ctx).BondDenom + + // track undelegation only when remaining or truncated shares are non-zero + if !ubd.Entries[i].Balance.IsZero() { + amt := sdk.NewCoin(bondDenom, ubd.Entries[i].Balance) + if err := k.bankKeeper.UndelegateCoinsFromModuleToAccount( + ctx, types.NotBondedPoolName, delegatorAddress, sdk.NewCoins(amt), + ); err != nil { + return false, err + } + } + + // Remove entry + ubd.RemoveEntry(int64(i)) + // Remove from the UnbondingIndex + k.DeleteUnbondingIndex(ctx, id) + } + + // set the unbonding delegation or remove it if there are no more entries + if len(ubd.Entries) == 0 { + k.RemoveUnbondingDelegation(ctx, ubd) + } else { + k.SetUnbondingDelegation(ctx, ubd) + } + + // Successfully completed unbonding + return true, nil +} + +func (k Keeper) redelegationEntryCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return false, nil + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return false, nil + } + + // The entry must be on hold + if !red.Entries[i].OnHold() { + return true, + sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "redelegation unbondingId(%d), expecting UnbondingOnHoldRefCount > 0, got %T", + id, red.Entries[i].UnbondingOnHoldRefCount, + ) + } + red.Entries[i].UnbondingOnHoldRefCount-- + + if !red.Entries[i].OnHold() && red.Entries[i].IsMature(ctx.BlockHeader().Time) { + // If matured, complete it. + // Remove entry + red.RemoveEntry(int64(i)) + // Remove from the Unbonding index + k.DeleteUnbondingIndex(ctx, id) + } + + // set the redelegation or remove it if there are no more entries + if len(red.Entries) == 0 { + k.RemoveRedelegation(ctx, red) + } else { + k.SetRedelegation(ctx, red) + } + + // Successfully completed unbonding + return true, nil +} + +func (k Keeper) validatorUnbondingCanComplete(ctx sdk.Context, id uint64) (found bool, err error) { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return false, nil + } + + if val.UnbondingOnHoldRefCount <= 0 { + return true, + sdkerrors.Wrapf( + types.ErrUnbondingOnHoldRefCountNegative, + "val(%s), expecting UnbondingOnHoldRefCount > 0, got %T", + val.OperatorAddress, val.UnbondingOnHoldRefCount, + ) + } + val.UnbondingOnHoldRefCount-- + k.SetValidator(ctx, val) + + return true, nil +} + +// PutUnbondingOnHold allows an external module to stop an unbonding operation, +// such as an unbonding delegation, a redelegation, or a validator unbonding. +// In order for the unbonding operation with `id` to eventually complete, every call +// to PutUnbondingOnHold(id) must be matched by a call to UnbondingCanComplete(id). +// ---------------------------------------------------------------------------------------- +func (k Keeper) PutUnbondingOnHold(ctx sdk.Context, id uint64) error { + found := k.putUnbondingDelegationEntryOnHold(ctx, id) + if found { + return nil + } + + found = k.putRedelegationEntryOnHold(ctx, id) + if found { + return nil + } + + found = k.putValidatorOnHold(ctx, id) + if found { + return nil + } + + // If an entry was not found + return types.ErrUnbondingNotFound +} + +func (k Keeper) putUnbondingDelegationEntryOnHold(ctx sdk.Context, id uint64) (found bool) { + ubd, found := k.GetUnbondingDelegationByUnbondingId(ctx, id) + if !found { + return false + } + + i, found := unbondingDelegationEntryArrayIndex(ubd, id) + if !found { + return false + } + + ubd.Entries[i].UnbondingOnHoldRefCount++ + k.SetUnbondingDelegation(ctx, ubd) + + return true +} + +func (k Keeper) putRedelegationEntryOnHold(ctx sdk.Context, id uint64) (found bool) { + red, found := k.GetRedelegationByUnbondingId(ctx, id) + if !found { + return false + } + + i, found := redelegationEntryArrayIndex(red, id) + if !found { + return false + } + + red.Entries[i].UnbondingOnHoldRefCount++ + k.SetRedelegation(ctx, red) + + return true +} + +func (k Keeper) putValidatorOnHold(ctx sdk.Context, id uint64) (found bool) { + val, found := k.GetValidatorByUnbondingId(ctx, id) + if !found { + return false + } + + val.UnbondingOnHoldRefCount++ + k.SetValidator(ctx, val) + + return true +} diff --git a/x/staking/keeper/unbonding_test.go b/x/staking/keeper/unbonding_test.go new file mode 100644 index 000000000000..1a06ea451837 --- /dev/null +++ b/x/staking/keeper/unbonding_test.go @@ -0,0 +1,385 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/cosmos/cosmos-sdk/simapp" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/staking/keeper" + "github.com/cosmos/cosmos-sdk/x/staking/teststaking" + "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/stretchr/testify/require" +) + +type MockStakingHooks struct { + types.StakingHooksTemplate + afterUnbondingInitiated func(uint64) +} + +func (h MockStakingHooks) AfterUnbondingInitiated(_ sdk.Context, id uint64) { + h.afterUnbondingInitiated(id) +} + +func setup(t *testing.T, hookCalled *bool, ubdeID *uint64) ( + app *simapp.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, +) { + _, app, ctx = createTestInput() + + stakingKeeper := keeper.NewKeeper( + app.AppCodec(), + app.GetKey(types.StoreKey), + app.AccountKeeper, + app.BankKeeper, + app.GetSubspace(types.ModuleName), + ) + + myHooks := MockStakingHooks{ + afterUnbondingInitiated: func(id uint64) { + *hookCalled = true + // save id + *ubdeID = id + // call back to stop unbonding + err := app.StakingKeeper.PutUnbondingOnHold(ctx, id) + require.NoError(t, err) + }, + } + + stakingKeeper.SetHooks( + types.NewMultiStakingHooks(myHooks), + ) + + app.StakingKeeper = stakingKeeper + + addrDels = simapp.AddTestAddrsIncremental(app, ctx, 2, sdk.NewInt(10000)) + addrVals = simapp.ConvertAddrsToValAddrs(addrDels) + + valTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + startTokens := app.StakingKeeper.TokensFromConsensusPower(ctx, 20) + + bondDenom = app.StakingKeeper.BondDenom(ctx) + notBondedPool := app.StakingKeeper.GetNotBondedPool(ctx) + + require.NoError(t, simapp.FundModuleAccount(app.BankKeeper, ctx, notBondedPool.GetName(), sdk.NewCoins(sdk.NewCoin(bondDenom, startTokens)))) + app.AccountKeeper.SetModuleAccount(ctx, notBondedPool) + + // Create a validator + validator1 := teststaking.NewValidator(t, addrVals[0], PKs[0]) + validator1, issuedShares1 := validator1.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares1.RoundInt()) + + validator1 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator1, true) + require.True(sdk.IntEq(t, valTokens, validator1.BondedTokens())) + require.True(t, validator1.IsBonded()) + + // Create a delegator + delegation := types.NewDelegation(addrDels[0], addrVals[0], issuedShares1) + app.StakingKeeper.SetDelegation(ctx, delegation) + + // Create a validator to redelegate to + validator2 := teststaking.NewValidator(t, addrVals[1], PKs[1]) + validator2, issuedShares2 := validator2.AddTokensFromDel(valTokens) + require.Equal(t, valTokens, issuedShares2.RoundInt()) + + validator2 = keeper.TestingUpdateValidator(app.StakingKeeper, ctx, validator2, true) + require.Equal(t, types.Bonded, validator2.Status) + require.True(t, validator2.IsBonded()) + + return +} + +func doUnbondingDelegation( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, bondDenom string, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time, bondedAmt sdk.Int, notBondedAmt sdk.Int) { + // UNDELEGATE + // Save original bonded and unbonded amounts + bondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt1 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + var err error + completionTime, err = app.StakingKeeper.Undelegate(ctx, addrDels[0], addrVals[0], sdk.NewDec(1)) + require.NoError(t, err) + + // check that the unbonding actually happened + bondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt2 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + // Bonded amount is less + require.True(sdk.IntEq(t, bondedAmt1.SubRaw(1), bondedAmt2)) + // Unbonded amount is more + require.True(sdk.IntEq(t, notBondedAmt1.AddRaw(1), notBondedAmt2)) + + // Check that the unbonding happened- we look up the entry and see that it has the correct number of shares + unbondingDelegations := app.StakingKeeper.GetUnbondingDelegationsFromValidator(ctx, addrVals[0]) + require.Equal(t, sdk.NewInt(1), unbondingDelegations[0].Entries[0].Balance) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime, bondedAmt2, notBondedAmt2 +} + +func doRedelegation( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, addrDels []sdk.AccAddress, addrVals []sdk.ValAddress, hookCalled *bool, +) (completionTime time.Time) { + var err error + completionTime, err = app.StakingKeeper.BeginRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1], sdk.NewDec(1)) + require.NoError(t, err) + + // Check that the redelegation happened- we look up the entry and see that it has the correct number of shares + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + require.Equal(t, sdk.NewDec(1), redelegations[0].Entries[0].SharesDst) + + // check that our hook was called + require.True(t, *hookCalled) + + return completionTime +} + +func doValidatorUnbonding( + t *testing.T, app *simapp.SimApp, ctx sdk.Context, addrVal sdk.ValAddress, hookCalled *bool, +) (validator types.Validator) { + validator, found := app.StakingKeeper.GetValidator(ctx, addrVal) + require.True(t, found) + // Check that status is bonded + require.Equal(t, types.BondStatus(3), validator.Status) + + validator, err := app.StakingKeeper.BeginUnbondingValidator(ctx, validator) + require.NoError(t, err) + + // Check that status is unbonding + require.Equal(t, types.BondStatus(2), validator.Status) + + // check that our hook was called + require.True(t, *hookCalled) + + return validator +} + +func TestValidatorUnbondingOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + + app, ctx, _, _, addrVals := setup(t, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) + + completionTime := validator.UnbondingTime + completionHeight := validator.UnbondingHeight + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Try to unbond validator + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is not complete (is not mature yet) + validator, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator.OperatorAddress, unbondingVals[0]) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that validator unbonding is complete + validator, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestValidatorUnbondingOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + var ubdeIDs []uint64 + app, ctx, _, _, addrVals := setup(t, &hookCalled, &ubdeID) + + // Start unbonding first validator + validator1 := doValidatorUnbonding(t, app, ctx, addrVals[0], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Reset hookCalled flag + hookCalled = false + + // Start unbonding second validator + validator2 := doValidatorUnbonding(t, app, ctx, addrVals[1], &hookCalled) + ubdeIDs = append(ubdeIDs, ubdeID) + + // Check that there are two unbonding operations + require.Equal(t, 2, len(ubdeIDs)) + + // Check that both validators have same unbonding time + require.Equal(t, validator1.UnbondingTime, validator2.UnbondingTime) + + completionTime := validator1.UnbondingTime + completionHeight := validator1.UnbondingHeight + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime.Add(time.Duration(1))) + ctx = ctx.WithBlockHeight(completionHeight + 1) + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is not complete for both validators + validator1, found := app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals := app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 2, len(unbondingVals)) + require.Equal(t, validator1.OperatorAddress, unbondingVals[0]) + require.Equal(t, validator2.OperatorAddress, unbondingVals[1]) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[0]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator1, but not for validator2 + validator1, found = app.StakingKeeper.GetValidator(ctx, addrVals[0]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator1.Status) + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonding, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 1, len(unbondingVals)) + require.Equal(t, validator2.OperatorAddress, unbondingVals[0]) + + // Unbonding for validator2 can complete + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeIDs[1]) + require.NoError(t, err) + + // Try again to unbond validators + app.StakingKeeper.UnbondAllMatureValidators(ctx) + + // Check that unbonding is complete for validator2 + validator2, found = app.StakingKeeper.GetValidator(ctx, addrVals[1]) + require.True(t, found) + require.Equal(t, types.Unbonded, validator2.Status) + unbondingVals = app.StakingKeeper.GetUnbondingValidators(ctx, completionTime, completionHeight) + require.Equal(t, 0, len(unbondingVals)) +} + +func TestRedelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestRedelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, _, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime := doRedelegation(t, app, ctx, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteRedelegation(ctx, addrDels[0], addrVals[0], addrVals[1]) + require.NoError(t, err) + + // Redelegation is not complete - still exists + redelegations := app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 1, len(redelegations)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Redelegation is complete and record is gone + redelegations = app.StakingKeeper.GetRedelegationsFromSrcValidator(ctx, addrVals[0]) + require.Equal(t, 0, len(redelegations)) +} + +func TestUnbondingDelegationOnHold1(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + err := app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err = app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} + +func TestUnbondingDelegationOnHold2(t *testing.T) { + var hookCalled bool + var ubdeID uint64 + app, ctx, bondDenom, addrDels, addrVals := setup(t, &hookCalled, &ubdeID) + completionTime, bondedAmt1, notBondedAmt1 := doUnbondingDelegation(t, app, ctx, bondDenom, addrDels, addrVals, &hookCalled) + + // PROVIDER CHAIN'S UNBONDING PERIOD ENDS - BUT UNBONDING CANNOT COMPLETE + ctx = ctx.WithBlockTime(completionTime) + _, err := app.StakingKeeper.CompleteUnbonding(ctx, addrDels[0], addrVals[0]) + require.NoError(t, err) + + bondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt3 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + // Bonded and unbonded amounts are the same as before because the completionTime has not yet passed and so the + // unbondingDelegation has not completed + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt3)) + require.True(sdk.IntEq(t, notBondedAmt1, notBondedAmt3)) + + // CONSUMER CHAIN'S UNBONDING PERIOD ENDS - STOPPED UNBONDING CAN NOW COMPLETE + err = app.StakingKeeper.UnbondingCanComplete(ctx, ubdeID) + require.NoError(t, err) + + // Check that the unbonding was finally completed + bondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetBondedPool(ctx).GetAddress(), bondDenom).Amount + notBondedAmt5 := app.BankKeeper.GetBalance(ctx, app.StakingKeeper.GetNotBondedPool(ctx).GetAddress(), bondDenom).Amount + + require.True(sdk.IntEq(t, bondedAmt1, bondedAmt5)) + // Not bonded amount back to what it was originaly + require.True(sdk.IntEq(t, notBondedAmt1.SubRaw(1), notBondedAmt5)) +} diff --git a/x/staking/keeper/val_state_change.go b/x/staking/keeper/val_state_change.go index 22f699366119..8bb8b19a256f 100644 --- a/x/staking/keeper/val_state_change.go +++ b/x/staking/keeper/val_state_change.go @@ -145,13 +145,13 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab case validator.IsUnbonded(): validator, err = k.unbondedToBonded(ctx, validator) if err != nil { - return + return nil, err } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) case validator.IsUnbonding(): validator, err = k.unbondingToBonded(ctx, validator) if err != nil { - return + return nil, err } amtFromNotBondedToBonded = amtFromNotBondedToBonded.Add(validator.GetTokens()) case validator.IsBonded(): @@ -165,6 +165,7 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab if err != nil { return nil, err } + oldPowerBytes, found := last[valAddrStr] newPower := validator.ConsensusPower(powerReduction) newPowerBytes := k.cdc.MustMarshal(&gogotypes.Int64Value{Value: newPower}) @@ -172,7 +173,7 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab // update the validator set if power has changed if !found || !bytes.Equal(oldPowerBytes, newPowerBytes) { updates = append(updates, validator.ABCIValidatorUpdate(powerReduction)) - + // set the validator update and power k.SetLastValidatorPower(ctx, valAddr, newPower) } @@ -191,11 +192,13 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab validator := k.mustGetValidator(ctx, sdk.ValAddress(valAddrBytes)) validator, err = k.bondedToUnbonding(ctx, validator) if err != nil { - return + return nil, err } + amtFromBondedToNotBonded = amtFromBondedToNotBonded.Add(validator.GetTokens()) k.DeleteLastValidatorPower(ctx, validator.GetOperator()) - updates = append(updates, validator.ABCIValidatorUpdateZero()) + update := validator.ABCIValidatorUpdateZero() + updates = append(updates, update) } // Update the pools based on the recent updates in the validator set: @@ -218,7 +221,10 @@ func (k Keeper) ApplyAndReturnValidatorSetUpdates(ctx sdk.Context) (updates []ab k.SetLastTotalPower(ctx, totalPower) } - return updates, err + // set the list of validator updates + k.SetValidatorUpdates(ctx, updates) + + return updates, nil } // Validator state transitions @@ -228,7 +234,7 @@ func (k Keeper) bondedToUnbonding(ctx sdk.Context, validator types.Validator) (t panic(fmt.Sprintf("bad state transition bondedToUnbonding, validator: %v\n", validator)) } - return k.beginUnbondingValidator(ctx, validator) + return k.BeginUnbondingValidator(ctx, validator) } func (k Keeper) unbondingToBonded(ctx sdk.Context, validator types.Validator) (types.Validator, error) { @@ -303,7 +309,7 @@ func (k Keeper) bondValidator(ctx sdk.Context, validator types.Validator) (types } // perform all the store operations for when a validator begins unbonding -func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { +func (k Keeper) BeginUnbondingValidator(ctx sdk.Context, validator types.Validator) (types.Validator, error) { params := k.GetParams(ctx) // delete the validator by power index, as the key will change @@ -314,12 +320,16 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat panic(fmt.Sprintf("should not already be unbonded or unbonding, validator: %v\n", validator)) } + id := k.IncrementUnbondingId(ctx) + validator = validator.UpdateStatus(types.Unbonding) // set the unbonding completion time and completion height appropriately validator.UnbondingTime = ctx.BlockHeader().Time.Add(params.UnbondingTime) validator.UnbondingHeight = ctx.BlockHeader().Height + validator.UnbondingIds = append(validator.UnbondingIds, id) + // save the now unbonded validator record and power index k.SetValidator(ctx, validator) k.SetValidatorByPowerIndex(ctx, validator) @@ -334,6 +344,10 @@ func (k Keeper) beginUnbondingValidator(ctx sdk.Context, validator types.Validat } k.AfterValidatorBeginUnbonding(ctx, consAddr, validator.GetOperator()) + k.SetValidatorByUnbondingId(ctx, validator, id) + + k.AfterUnbondingInitiated(ctx, id) + return validator, nil } diff --git a/x/staking/keeper/validator.go b/x/staking/keeper/validator.go index d15b090bdf40..ba69bf4a8429 100644 --- a/x/staking/keeper/validator.go +++ b/x/staking/keeper/validator.go @@ -398,8 +398,6 @@ func (k Keeper) ValidatorQueueIterator(ctx sdk.Context, endTime time.Time, endHe // UnbondAllMatureValidators unbonds all the mature unbonding validators that // have finished their unbonding period. func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { - store := ctx.KVStore(k.storeKey) - blockTime := ctx.BlockTime() blockHeight := ctx.BlockHeight() @@ -438,14 +436,30 @@ func (k Keeper) UnbondAllMatureValidators(ctx sdk.Context) { if !val.IsUnbonding() { panic("unexpected validator in unbonding queue; status was not unbonding") } - - val = k.UnbondingToUnbonded(ctx, val) - if val.GetDelegatorShares().IsZero() { - k.RemoveValidator(ctx, val.GetOperator()) + if val.UnbondingOnHoldRefCount == 0 { + for _, id := range val.UnbondingIds { + k.DeleteUnbondingIndex(ctx, id) + } + val = k.UnbondingToUnbonded(ctx, val) + if val.GetDelegatorShares().IsZero() { + k.RemoveValidator(ctx, val.GetOperator()) + } else { + // remove unbonding ids + val.UnbondingIds = []uint64{} + } + // remove validator from queue + k.DeleteValidatorQueue(ctx, val) } } - - store.Delete(key) } } } + +func (k Keeper) IsValidatorJailed(ctx sdk.Context, addr sdk.ConsAddress) bool { + v, f := k.GetValidatorByConsAddr(ctx, addr) + if !f { + return false + } + + return v.Jailed +} diff --git a/x/staking/keeper/validator_test.go b/x/staking/keeper/validator_test.go index f1082e2484d5..a39d9ca799de 100644 --- a/x/staking/keeper/validator_test.go +++ b/x/staking/keeper/validator_test.go @@ -229,7 +229,7 @@ func TestSlashToZeroPowerRemoved(t *testing.T) { require.Equal(t, valTokens, validator.Tokens, "\nvalidator %v\npool %v", validator, valTokens) // slash the validator by 100% - app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, sdk.OneDec()) + app.StakingKeeper.Slash(ctx, sdk.ConsAddress(PKs[0].Address()), 0, 100, sdk.OneDec(), 0) // apply TM updates applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) // validator should be unbonding diff --git a/x/staking/simulation/decoder_test.go b/x/staking/simulation/decoder_test.go index 6584df24f508..2a5baf02d98f 100644 --- a/x/staking/simulation/decoder_test.go +++ b/x/staking/simulation/decoder_test.go @@ -39,8 +39,8 @@ func TestDecodeStore(t *testing.T) { val, err := types.NewValidator(valAddr1, delPk1, types.NewDescription("test", "test", "test", "test", "test")) require.NoError(t, err) del := types.NewDelegation(delAddr1, valAddr1, sdk.OneDec()) - ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt()) - red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec()) + ubd := types.NewUnbondingDelegation(delAddr1, valAddr1, 15, bondTime, sdk.OneInt(), 1) + red := types.NewRedelegation(delAddr1, valAddr1, valAddr1, 12, bondTime, sdk.OneInt(), sdk.OneDec(), 0) kvPairs := kv.Pairs{ Pairs: []kv.Pair{ diff --git a/x/staking/spec/01_state.md b/x/staking/spec/01_state.md index 656862798b4d..b31c732e51c2 100644 --- a/x/staking/spec/01_state.md +++ b/x/staking/spec/01_state.md @@ -15,6 +15,21 @@ Store entries prefixed with "Last" must remain unchanged until EndBlock. - LastTotalPower: `0x12 -> ProtocolBuffer(sdk.Int)` +## ValidatorUpdates + +ValidatorUpdates contains the validator updates returned to ABCI at the end of every block. +The values are overwritten in every block. + +- ValidatorUpdates `0x51 -> []abci.ValidatorUpdate` + +## UnbondingId + +UnbondingId stores the ID of the latest unbonding operation. It enables to create unique IDs for +unbonding operation, i.e., UnbondingId is incremented every time a new unbonding operation +(validator unbonding, unbonding delegation, redelegation) is initiated. + +- UnbondingId: `0x37 -> uint64` + ## Params Params is a module-wide configuration structure that stores system parameters @@ -52,6 +67,7 @@ records within a block. - Validators: `0x21 | OperatorAddrLen (1 byte) | OperatorAddr -> ProtocolBuffer(validator)` - ValidatorsByConsAddr: `0x22 | ConsAddrLen (1 byte) | ConsAddr -> OperatorAddr` - ValidatorsByPower: `0x23 | BigEndian(ConsensusPower) | OperatorAddrLen (1 byte) | OperatorAddr -> OperatorAddr` +- ValidatorsByUnbondingId: `0x38 | UnbondingId -> 0x21 | OperatorAddrLen (1 byte) | OperatorAddr` - LastValidatorsPower: `0x11 | OperatorAddrLen (1 byte) | OperatorAddr -> ProtocolBuffer(ConsensusPower)` `Validators` is the primary index - it ensures that each operator can have only one @@ -69,6 +85,9 @@ potential validators to quickly determine the current active set. Here ConsensusPower is validator.Tokens/10^6 by default. Note that all validators where `Jailed` is true are not stored within this index. +`ValidatorsByUnbondingId` is an additional index that enables lookups for +validators by the unbonding IDs corresponding to their current unbonding. + `LastValidatorsPower` is a special index that provides a historical list of the last-block's bonded validators. This index remains constant during a block but is updated during the validator set update process which takes place in [`EndBlock`](./05_end_block.md). @@ -122,12 +141,19 @@ detected. - UnbondingDelegation: `0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr -> ProtocolBuffer(unbondingDelegation)` - UnbondingDelegationsFromValidator: `0x33 | ValidatorAddrLen (1 byte) | ValidatorAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +- UnbondingDelegationByUnbondingId: `0x38 | UnbondingId -> 0x32 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorAddr` + +`UnbondingDelegation` is used in queries, to lookup all unbonding delegations for +a given delegator. -The first map here is used in queries, to lookup all unbonding delegations for -a given delegator, while the second map is used in slashing, to lookup all +`UnbondingDelegationsFromValidator` is used in slashing, to lookup all unbonding delegations associated with a given validator that need to be slashed. +`UnbondingDelegationByUnbondingId` is an additional index that enables +lookups for unbonding delegations by the unbonding IDs of the containing +unbonding delegation entries. + A UnbondingDelegation object is created every time an unbonding is initiated. +++ https://github.com/cosmos/cosmos-sdk/blob/v0.40.0/proto/cosmos/staking/v1beta1/staking.proto#L172-L198 @@ -145,10 +171,18 @@ committed by the source validator. - Redelegations: `0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr -> ProtocolBuffer(redelegation)` - RedelegationsBySrc: `0x35 | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` - RedelegationsByDst: `0x36 | ValidatorDstAddrLen (1 byte) | ValidatorDstAddr | ValidatorSrcAddrLen (1 byte) | ValidatorSrcAddr | DelegatorAddrLen (1 byte) | DelegatorAddr -> nil` +- RedelegationByUnbondingId: `0x38 | UnbondingId -> 0x34 | DelegatorAddrLen (1 byte) | DelegatorAddr | ValidatorAddrLen (1 byte) | ValidatorSrcAddr | ValidatorDstAddr` + +`Redelegations` is used for queries, to lookup all redelegations for a given +delegator. + +`RedelegationsBySrc` is used for slashing based on the `ValidatorSrcAddr`. + +`RedelegationsByDst` is used for slashing based on the `ValidatorDstAddr` -The first map here is used for queries, to lookup all redelegations for a given -delegator. The second map is used for slashing based on the `ValidatorSrcAddr`, -while the third map is for slashing based on the `ValidatorDstAddr`. +`RedelegationByUnbondingId` is an additional index that enables +lookups for redelegations by the unbonding IDs of the containing +redelegation entries. A redelegation object is created every time a redelegation occurs. To prevent "redelegation hopping" redelegations may not occur under the situation that: diff --git a/x/staking/spec/02_state_transitions.md b/x/staking/spec/02_state_transitions.md index d62761d16a5a..5766f9cb24b9 100644 --- a/x/staking/spec/02_state_transitions.md +++ b/x/staking/spec/02_state_transitions.md @@ -41,6 +41,8 @@ When a validator begins the unbonding process the following operations occur: - add a new updated record to the `ValidatorByPowerIndex` - update the `Validator` object for this validator - insert a new record into the `ValidatorQueue` for this validator +- get a unique `unbondingId` and map it to the validator in `ValidatorsByUnbondingId` +- call the `AfterUnbondingInitiated(unbondingId)` hook ### Unbonding to Unbonded @@ -83,7 +85,7 @@ As a part of the Undelegate and Complete Unbonding state transitions Unbond Delegation may be called. - subtract the unbonded shares from delegator -- if the validator is `Unbonding` or `Bonded` add the tokens to an `UnbondingDelegation` Entry +- if the validator is `Unbonding` or `Bonded` add the tokens to an `UnbondingDelegationEntry` - if the validator is `Unbonded` send the tokens directly to the withdraw account - update the delegation or remove the delegation if there are no more shares @@ -91,7 +93,10 @@ Delegation may be called. - update the validator with removed the delegator shares and associated coins - if the validator state is `Bonded`, transfer the `Coins` worth of the unbonded shares from the `BondedPool` to the `NotBondedPool` `ModuleAccount` -- remove the validator if it is unbonded and there are no more delegation shares. +- remove the validator if it is unbonded and there are no more delegation shares +- get a unique `unbondingId` and map it to the `UnbondingDelegationEntry` in `UnbondingDelegationByUnbondingId` +- call the `AfterUnbondingInitiated(unbondingId)` hook +- add the unbonding delegation to `UnbondingDelegationQueue` with the completion time set to `UnbondingTime` ### Complete Unbonding @@ -112,6 +117,9 @@ Redelegations affect the delegation, source and destination validators. - otherwise, if the `sourceValidator.Status` is not `Bonded`, and the `destinationValidator` is `Bonded`, transfer the newly delegated tokens from the `NotBondedPool` to the `BondedPool` `ModuleAccount` - record the token amount in an new entry in the relevant `Redelegation` +- get a unique `unbondingId` and map it to the `RedelegationEntry` in `RedelegationByUnbondingId` +- call the `AfterUnbondingInitiated(unbondingId)` hook +- add the redelegation to `RedelegationQueue` with the completion time set to `UnbondingTime` From when a redelegation begins until it completes, the delegator is in a state of "pseudo-unbonding", and can still be slashed for infractions that occured before the redelegation began. @@ -146,7 +154,8 @@ Put otherwise, validators are not slashed retroactively, only when they are caug When a validator is slashed, so are those unbonding delegations from the validator that began unbonding after the time of the infraction. Every entry in every unbonding delegation from the validator is slashed by `slashFactor`. The amount slashed is calculated from the `InitialBalance` of the -delegation and is capped to prevent a resulting negative balance. Completed (or mature) unbondings are not slashed. +delegation and is capped to prevent a resulting negative balance. Completed (i.e., mature and not on hold) +unbondings are not slashed. ### Slash Redelegation @@ -155,7 +164,7 @@ infraction. Redelegations are slashed by `slashFactor`. Redelegations that began before the infraction are not slashed. The amount slashed is calculated from the `InitialBalance` of the delegation and is capped to prevent a resulting negative balance. -Mature redelegations (that have completed pseudo-unbonding) are not slashed. +Completed (i.e., mature and not on hold) redelegations are not slashed. ## How Shares are calculated diff --git a/x/staking/spec/05_end_block.md b/x/staking/spec/05_end_block.md index c097579e092a..70be7763b756 100644 --- a/x/staking/spec/05_end_block.md +++ b/x/staking/spec/05_end_block.md @@ -35,10 +35,11 @@ is calculated during `EndBlock`. ## Queues Within staking, certain state-transitions are not instantaneous but take place -over a duration of time (typically the unbonding period). When these -transitions are mature certain operations must take place in order to complete -the state operation. This is achieved through the use of queues which are -checked/processed at the end of each block. +over a duration of time (typically the unbonding period). We refer to these +transitions as unbonding operations. When these transitions are mature certain +operations must take place in order to complete the unbonding operation. +This is achieved through the use of queues which are checked/processed at the +end of each block. ### Unbonding Validators @@ -75,3 +76,11 @@ Complete the unbonding of all mature `Redelegation.Entries` within the - remove the mature entry from `Redelegation.Entries` - remove the `Redelegation` object from the store if there are no remaining entries. + +## Putting unbonding operations on hold + +Unbonding operations can be put on hold by external modules via the `PutUnbondingOnHold(unbondingId)` method. +As a result, an unbonding operation (e.g., an unbonding delegation) that is on hold, cannot complete +even if it reaches maturity. For an unbonding operation with `unbondingId` to eventually complete +(after it reaches maturity), every call to `PutUnbondingOnHold(unbondingId)` must be matched +by a call to `UnbondingCanComplete(unbondingId)`. \ No newline at end of file diff --git a/x/staking/spec/06_hooks.md b/x/staking/spec/06_hooks.md index d4c3228eca7a..3c1d2cc2bb20 100644 --- a/x/staking/spec/06_hooks.md +++ b/x/staking/spec/06_hooks.md @@ -25,3 +25,5 @@ following hooks can registered with staking: - called when a delegation's shares are modified - `BeforeDelegationRemoved(Context, AccAddress, ValAddress)` - called when a delegation is removed +- `AfterUnbondingInitiated(Context, UnbondingID)` + - called when an unbonding operation (validator unbonding, unbonding delegation, redelegation) was initiated diff --git a/x/staking/types/delegation.go b/x/staking/types/delegation.go index 20a6c6763e9e..01bb8e7197cc 100644 --- a/x/staking/types/delegation.go +++ b/x/staking/types/delegation.go @@ -92,12 +92,14 @@ func (d Delegations) String() (out string) { return strings.TrimSpace(out) } -func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int) UnbondingDelegationEntry { +func NewUnbondingDelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int, id uint64) UnbondingDelegationEntry { return UnbondingDelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - Balance: balance, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + Balance: balance, + UnbondingId: id, + UnbondingOnHoldRefCount: 0, } } @@ -112,25 +114,51 @@ func (e UnbondingDelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e UnbondingDelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + +// return the unbonding delegation entry +func MustMarshalUBDE(cdc codec.BinaryCodec, ubd UnbondingDelegationEntry) []byte { + return cdc.MustMarshal(&ubd) +} + +// unmarshal a unbonding delegation entry from a store value +func MustUnmarshalUBDE(cdc codec.BinaryCodec, value []byte) UnbondingDelegationEntry { + ubd, err := UnmarshalUBDE(cdc, value) + if err != nil { + panic(err) + } + + return ubd +} + +// unmarshal a unbonding delegation entry from a store value +func UnmarshalUBDE(cdc codec.BinaryCodec, value []byte) (ubd UnbondingDelegationEntry, err error) { + err = cdc.Unmarshal(value, &ubd) + return ubd, err +} + // NewUnbondingDelegation - create a new unbonding delegation object // //nolint:interfacer func NewUnbondingDelegation( delegatorAddr sdk.AccAddress, validatorAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance sdk.Int, + creationHeight int64, minTime time.Time, balance sdk.Int, id uint64, ) UnbondingDelegation { return UnbondingDelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorAddress: validatorAddr.String(), Entries: []UnbondingDelegationEntry{ - NewUnbondingDelegationEntry(creationHeight, minTime, balance), + NewUnbondingDelegationEntry(creationHeight, minTime, balance, id), }, } } // AddEntry - append entry to the unbonding delegation -func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int) { - entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance) +func (ubd *UnbondingDelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int, id uint64) { + entry := NewUnbondingDelegationEntry(creationHeight, minTime, balance, id) ubd.Entries = append(ubd.Entries, entry) } @@ -188,12 +216,14 @@ func (ubds UnbondingDelegations) String() (out string) { return strings.TrimSpace(out) } -func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int, sharesDst sdk.Dec) RedelegationEntry { +func NewRedelegationEntry(creationHeight int64, completionTime time.Time, balance sdk.Int, sharesDst sdk.Dec, id uint64) RedelegationEntry { return RedelegationEntry{ - CreationHeight: creationHeight, - CompletionTime: completionTime, - InitialBalance: balance, - SharesDst: sharesDst, + CreationHeight: creationHeight, + CompletionTime: completionTime, + InitialBalance: balance, + SharesDst: sharesDst, + UnbondingId: id, + UnbondingOnHoldRefCount: 0, } } @@ -208,24 +238,29 @@ func (e RedelegationEntry) IsMature(currentTime time.Time) bool { return !e.CompletionTime.After(currentTime) } +// OnHold - is the current entry on hold due to external modules +func (e RedelegationEntry) OnHold() bool { + return e.UnbondingOnHoldRefCount > 0 +} + //nolint:interfacer func NewRedelegation( delegatorAddr sdk.AccAddress, validatorSrcAddr, validatorDstAddr sdk.ValAddress, - creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, + creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, unbondingId uint64, ) Redelegation { return Redelegation{ DelegatorAddress: delegatorAddr.String(), ValidatorSrcAddress: validatorSrcAddr.String(), ValidatorDstAddress: validatorDstAddr.String(), Entries: []RedelegationEntry{ - NewRedelegationEntry(creationHeight, minTime, balance, sharesDst), + NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, unbondingId), }, } } // AddEntry - append entry to the unbonding delegation -func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec) { - entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst) +func (red *Redelegation) AddEntry(creationHeight int64, minTime time.Time, balance sdk.Int, sharesDst sdk.Dec, unbondingId uint64) { + entry := NewRedelegationEntry(creationHeight, minTime, balance, sharesDst, unbondingId) red.Entries = append(red.Entries, entry) } @@ -352,10 +387,8 @@ func NewRedelegationResponse( // NewRedelegationEntryResponse creates a new RedelegationEntryResponse instance. func NewRedelegationEntryResponse( - creationHeight int64, completionTime time.Time, sharesDst sdk.Dec, initialBalance, balance sdk.Int, -) RedelegationEntryResponse { return RedelegationEntryResponse{ - RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst), + RedelegationEntry: NewRedelegationEntry(creationHeight, completionTime, initialBalance, sharesDst, id), Balance: balance, } } diff --git a/x/staking/types/delegation_test.go b/x/staking/types/delegation_test.go index 7ca5e8132eb4..ba6fbfe58bfa 100644 --- a/x/staking/types/delegation_test.go +++ b/x/staking/types/delegation_test.go @@ -33,7 +33,7 @@ func TestDelegationString(t *testing.T) { func TestUnbondingDelegationEqual(t *testing.T) { ubd1 := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) ubd2 := ubd1 ok := ubd1.String() == ubd2.String() @@ -48,7 +48,7 @@ func TestUnbondingDelegationEqual(t *testing.T) { func TestUnbondingDelegationString(t *testing.T) { ubd := types.NewUnbondingDelegation(sdk.AccAddress(valAddr1), valAddr2, 0, - time.Unix(0, 0), sdk.NewInt(0)) + time.Unix(0, 0), sdk.NewInt(0), 1) require.NotEmpty(t, ubd.String()) } @@ -56,10 +56,10 @@ func TestUnbondingDelegationString(t *testing.T) { func TestRedelegationEqual(t *testing.T) { r1 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(0)) + sdk.NewDec(0), 1) r2 := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(0)) + sdk.NewDec(0), 2) ok := r1.String() == r2.String() require.True(t, ok) @@ -74,7 +74,7 @@ func TestRedelegationEqual(t *testing.T) { func TestRedelegationString(t *testing.T) { r := types.NewRedelegation(sdk.AccAddress(valAddr1), valAddr2, valAddr3, 0, time.Unix(0, 0), sdk.NewInt(0), - sdk.NewDec(10)) + sdk.NewDec(10), 1) require.NotEmpty(t, r.String()) } @@ -111,8 +111,8 @@ func TestDelegationResponses(t *testing.T) { func TestRedelegationResponses(t *testing.T) { cdc := codec.NewLegacyAmino() entries := []types.RedelegationEntryResponse{ - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), - types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5)), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), + types.NewRedelegationEntryResponse(0, time.Unix(0, 0), sdk.NewDec(5), sdk.NewInt(5), sdk.NewInt(5), 0), } rdr1 := types.NewRedelegationResponse(sdk.AccAddress(valAddr1), valAddr2, valAddr3, entries) rdr2 := types.NewRedelegationResponse(sdk.AccAddress(valAddr2), valAddr1, valAddr3, entries) diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index 777941e53cfe..10c16276dd98 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -49,4 +49,6 @@ var ( ErrInvalidHistoricalInfo = sdkerrors.Register(ModuleName, 37, "invalid historical info") ErrNoHistoricalInfo = sdkerrors.Register(ModuleName, 38, "no historical info found") ErrEmptyValidatorPubKey = sdkerrors.Register(ModuleName, 39, "empty validator public key") + ErrUnbondingNotFound = sdkerrors.Register(ModuleName, 40, "unbonding operation not found") + ErrUnbondingOnHoldRefCountNegative = sdkerrors.Register(ModuleName, 41, "cannot un-hold unbonding operation that is not on hold") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index 313db78e7b1c..447cc2adcdb7 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -59,7 +59,7 @@ type ValidatorSet interface { StakingTokenSupply(sdk.Context) sdk.Int // total staking token supply // slash the validator and delegators of the validator, specifying offence height, offence power, and slash fraction - Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec) + Slash(sdk.Context, sdk.ConsAddress, int64, int64, sdk.Dec, InfractionType) Jail(sdk.Context, sdk.ConsAddress) // jail a validator Unjail(sdk.Context, sdk.ConsAddress) // unjail a validator @@ -101,4 +101,5 @@ type StakingHooks interface { BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) // Must be called when a delegation is removed AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) + AfterUnbondingInitiated(ctx sdk.Context, id uint64) } diff --git a/x/staking/types/hooks.go b/x/staking/types/hooks.go index d21749d34ff7..76385b82f357 100644 --- a/x/staking/types/hooks.go +++ b/x/staking/types/hooks.go @@ -70,3 +70,8 @@ func (h MultiStakingHooks) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.V h[i].BeforeValidatorSlashed(ctx, valAddr, fraction) } } +func (h MultiStakingHooks) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { + for i := range h { + h[i].AfterUnbondingInitiated(ctx, id) + } +} diff --git a/x/staking/types/hooks_template.go b/x/staking/types/hooks_template.go new file mode 100644 index 000000000000..ba002554fc1e --- /dev/null +++ b/x/staking/types/hooks_template.go @@ -0,0 +1,32 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" +) + +type StakingHooksTemplate struct{} + +var _ StakingHooks = StakingHooksTemplate{} + +func (h StakingHooksTemplate) AfterValidatorCreated(ctx sdk.Context, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) BeforeValidatorModified(ctx sdk.Context, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) AfterValidatorRemoved(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) AfterValidatorBonded(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) AfterValidatorBeginUnbonding(ctx sdk.Context, consAddr sdk.ConsAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) BeforeDelegationCreated(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) BeforeDelegationSharesModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) BeforeDelegationRemoved(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) AfterDelegationModified(ctx sdk.Context, delAddr sdk.AccAddress, valAddr sdk.ValAddress) { +} +func (h StakingHooksTemplate) BeforeValidatorSlashed(ctx sdk.Context, valAddr sdk.ValAddress, fraction sdk.Dec) { +} +func (h StakingHooksTemplate) AfterUnbondingInitiated(ctx sdk.Context, id uint64) { +} diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 74d73bf19c7e..da653338c3c5 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -43,13 +43,24 @@ var ( RedelegationByValSrcIndexKey = []byte{0x35} // prefix for each key for an redelegation, by source validator operator RedelegationByValDstIndexKey = []byte{0x36} // prefix for each key for an redelegation, by destination validator operator + UnbondingIdKey = []byte{0x37} // key for the counter for the incrementing id for UnbondingOperations + UnbondingIndexKey = []byte{0x38} // prefix for an index for looking up unbonding operations by their IDs + UnbondingQueueKey = []byte{0x41} // prefix for the timestamps in unbonding queue RedelegationQueueKey = []byte{0x42} // prefix for the timestamps in redelegations queue ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue - HistoricalInfoKey = []byte{0x50} // prefix for the historical info + HistoricalInfoKey = []byte{0x50} // prefix for the historical info + ValidatorUpdatesKey = []byte{0x51} // prefix for the end block validator updates key ) +// Returns a key for the index for looking up UnbondingDelegations by the UnbondingDelegationEntries they contain +func GetUnbondingIndexKey(id uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, id) + return append(UnbondingIndexKey, bz...) +} + // GetValidatorKey creates the key for the validator with address // VALUE: staking/Validator func GetValidatorKey(operatorAddr sdk.ValAddress) []byte { diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index a0bf1b27dfe8..3b35928c9a2c 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -16,6 +16,7 @@ import ( github_com_gogo_protobuf_protoc_gen_gogo_descriptor "github.com/gogo/protobuf/protoc-gen-gogo/descriptor" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" _ "github.com/regen-network/cosmos-proto" + types3 "github.com/tendermint/tendermint/abci/types" types "github.com/tendermint/tendermint/proto/tendermint/types" _ "google.golang.org/protobuf/types/known/durationpb" _ "google.golang.org/protobuf/types/known/timestamppb" @@ -76,6 +77,38 @@ func (BondStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_64c30c6cf92913c9, []int{0} } +// InfractionType indicates the infraction type a validator commited. +type InfractionType int32 + +const ( + // UNSPECIFIED defines an empty infraction type. + InfractionEmpty InfractionType = 0 + // DOUBLE_SIGN defines a validator that double-signs a block. + DoubleSign InfractionType = 1 + // DOWNTIME defines a validator that missed signing too many blocks. + Downtime InfractionType = 2 +) + +var InfractionType_name = map[int32]string{ + 0: "INFRACTION_TYPE_UNSPECIFIED", + 1: "INFRACTION_TYPE_DOUBLE_SIGN", + 2: "INFRACTION_TYPE_DOWNTIME", +} + +var InfractionType_value = map[string]int32{ + "INFRACTION_TYPE_UNSPECIFIED": 0, + "INFRACTION_TYPE_DOUBLE_SIGN": 1, + "INFRACTION_TYPE_DOWNTIME": 2, +} + +func (x InfractionType) String() string { + return proto.EnumName(InfractionType_name, int32(x)) +} + +func (InfractionType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{1} +} + // HistoricalInfo contains header and validator information for a given block. // It is stored as part of staking module's state, which persists the `n` most // recent HistoricalInfo @@ -334,6 +367,10 @@ type Validator struct { Commission Commission `protobuf:"bytes,10,opt,name=commission,proto3" json:"commission"` // min_self_delegation is the validator's self declared minimum self delegation. MinSelfDelegation github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,11,opt,name=min_self_delegation,json=minSelfDelegation,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"min_self_delegation" yaml:"min_self_delegation"` + // strictly positive if this validator's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,12,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` + // list of unbonding ids, each uniquely identifing an unbonding of this validator + UnbondingIds []uint64 `protobuf:"varint,13,rep,packed,name=unbonding_ids,json=unbondingIds,proto3" json:"unbonding_ids,omitempty"` } func (m *Validator) Reset() { *m = Validator{} } @@ -681,6 +718,10 @@ type UnbondingDelegationEntry struct { InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` // balance defines the tokens to receive at completion. Balance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,4,opt,name=balance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"balance"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *UnbondingDelegationEntry) Reset() { *m = UnbondingDelegationEntry{} } @@ -729,6 +770,20 @@ func (m *UnbondingDelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *UnbondingDelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *UnbondingDelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // RedelegationEntry defines a redelegation object with relevant metadata. type RedelegationEntry struct { // creation_height defines the height which the redelegation took place. @@ -739,6 +794,10 @@ type RedelegationEntry struct { InitialBalance github_com_cosmos_cosmos_sdk_types.Int `protobuf:"bytes,3,opt,name=initial_balance,json=initialBalance,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Int" json:"initial_balance" yaml:"initial_balance"` // shares_dst is the amount of destination-validator shares created by redelegation. SharesDst github_com_cosmos_cosmos_sdk_types.Dec `protobuf:"bytes,4,opt,name=shares_dst,json=sharesDst,proto3,customtype=github.com/cosmos/cosmos-sdk/types.Dec" json:"shares_dst"` + // Incrementing id that uniquely identifies this entry + UnbondingId uint64 `protobuf:"varint,5,opt,name=unbonding_id,json=unbondingId,proto3" json:"unbonding_id,omitempty"` + // Strictly positive if this entry's unbonding has been stopped by external modules + UnbondingOnHoldRefCount int64 `protobuf:"varint,6,opt,name=unbonding_on_hold_ref_count,json=unbondingOnHoldRefCount,proto3" json:"unbonding_on_hold_ref_count,omitempty"` } func (m *RedelegationEntry) Reset() { *m = RedelegationEntry{} } @@ -787,6 +846,20 @@ func (m *RedelegationEntry) GetCompletionTime() time.Time { return time.Time{} } +func (m *RedelegationEntry) GetUnbondingId() uint64 { + if m != nil { + return m.UnbondingId + } + return 0 +} + +func (m *RedelegationEntry) GetUnbondingOnHoldRefCount() int64 { + if m != nil { + return m.UnbondingOnHoldRefCount + } + return 0 +} + // Redelegation contains the list of a particular delegator's redelegating bonds // from a particular source validator to a particular destination validator. type Redelegation struct { @@ -1109,8 +1182,54 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo +// ValidatorUpdates defines an array of abci.ValidatorUpdate objects. +type ValidatorUpdates struct { + Updates []types3.ValidatorUpdate `protobuf:"bytes,1,rep,name=updates,proto3" json:"updates"` +} + +func (m *ValidatorUpdates) Reset() { *m = ValidatorUpdates{} } +func (m *ValidatorUpdates) String() string { return proto.CompactTextString(m) } +func (*ValidatorUpdates) ProtoMessage() {} +func (*ValidatorUpdates) Descriptor() ([]byte, []int) { + return fileDescriptor_64c30c6cf92913c9, []int{20} +} +func (m *ValidatorUpdates) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatorUpdates) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorUpdates.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 *ValidatorUpdates) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorUpdates.Merge(m, src) +} +func (m *ValidatorUpdates) XXX_Size() int { + return m.Size() +} +func (m *ValidatorUpdates) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorUpdates.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatorUpdates proto.InternalMessageInfo + +func (m *ValidatorUpdates) GetUpdates() []types3.ValidatorUpdate { + if m != nil { + return m.Updates + } + return nil +} + func init() { proto.RegisterEnum("cosmos.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) + proto.RegisterEnum("cosmos.staking.v1beta1.InfractionType", InfractionType_name, InfractionType_value) proto.RegisterType((*HistoricalInfo)(nil), "cosmos.staking.v1beta1.HistoricalInfo") proto.RegisterType((*CommissionRates)(nil), "cosmos.staking.v1beta1.CommissionRates") proto.RegisterType((*Commission)(nil), "cosmos.staking.v1beta1.Commission") @@ -1131,6 +1250,7 @@ func init() { proto.RegisterType((*RedelegationEntryResponse)(nil), "cosmos.staking.v1beta1.RedelegationEntryResponse") proto.RegisterType((*RedelegationResponse)(nil), "cosmos.staking.v1beta1.RedelegationResponse") proto.RegisterType((*Pool)(nil), "cosmos.staking.v1beta1.Pool") + proto.RegisterType((*ValidatorUpdates)(nil), "cosmos.staking.v1beta1.ValidatorUpdates") } func init() { @@ -1138,120 +1258,134 @@ func init() { } var fileDescriptor_64c30c6cf92913c9 = []byte{ - // 1796 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0x3b, 0x5e, 0xc7, 0x7e, 0x4e, 0xe2, 0xa4, 0x26, 0x33, 0xeb, 0x98, 0xc1, 0xed, 0x6d, - 0x56, 0x4b, 0x40, 0xbb, 0x0e, 0x93, 0x45, 0x8b, 0xc8, 0x05, 0xc6, 0x71, 0x86, 0x58, 0xbb, 0x0c, - 0xa1, 0x93, 0x09, 0x12, 0xac, 0xb0, 0xca, 0xdd, 0x15, 0xa7, 0x89, 0xbb, 0xdb, 0x74, 0x95, 0x87, - 0x58, 0xda, 0x03, 0xc7, 0x65, 0x10, 0x62, 0xb9, 0xed, 0x65, 0xa4, 0x91, 0xf6, 0xba, 0x12, 0x17, - 0xc4, 0x95, 0xeb, 0x02, 0x97, 0xe1, 0x86, 0x10, 0x32, 0x68, 0xe6, 0x82, 0x38, 0x21, 0x1f, 0x10, - 0x37, 0x50, 0xfd, 0xf4, 0x4f, 0xda, 0xf1, 0xcc, 0x78, 0xb4, 0x87, 0x91, 0xd8, 0x4b, 0xe2, 0x7a, - 0xf5, 0xde, 0xf7, 0xea, 0xfd, 0xd6, 0xab, 0x86, 0x57, 0x2d, 0x9f, 0xba, 0x3e, 0xdd, 0xa2, 0x0c, - 0x9f, 0x39, 0x5e, 0x6f, 0xeb, 0xee, 0x8d, 0x2e, 0x61, 0xf8, 0x46, 0xb8, 0x6e, 0x0c, 0x02, 0x9f, - 0xf9, 0xe8, 0x9a, 0xe4, 0x6a, 0x84, 0x54, 0xc5, 0x55, 0x5d, 0xef, 0xf9, 0x3d, 0x5f, 0xb0, 0x6c, - 0xf1, 0x5f, 0x92, 0xbb, 0xba, 0xd1, 0xf3, 0xfd, 0x5e, 0x9f, 0x6c, 0x89, 0x55, 0x77, 0x78, 0xb2, - 0x85, 0xbd, 0x91, 0xda, 0xaa, 0xa5, 0xb7, 0xec, 0x61, 0x80, 0x99, 0xe3, 0x7b, 0x6a, 0x5f, 0x4f, - 0xef, 0x33, 0xc7, 0x25, 0x94, 0x61, 0x77, 0x10, 0x62, 0xcb, 0x93, 0x74, 0xa4, 0x52, 0x75, 0x2c, - 0x85, 0xad, 0x4c, 0xe9, 0x62, 0x4a, 0x22, 0x3b, 0x2c, 0xdf, 0x09, 0xb1, 0xaf, 0x33, 0xe2, 0xd9, - 0x24, 0x70, 0x1d, 0x8f, 0x6d, 0xb1, 0xd1, 0x80, 0x50, 0xf9, 0x57, 0xee, 0x1a, 0x3f, 0xd3, 0x60, - 0x65, 0xdf, 0xa1, 0xcc, 0x0f, 0x1c, 0x0b, 0xf7, 0xdb, 0xde, 0x89, 0x8f, 0xde, 0x82, 0xfc, 0x29, - 0xc1, 0x36, 0x09, 0x2a, 0x5a, 0x5d, 0xdb, 0x2c, 0x6d, 0x57, 0x1a, 0x31, 0x42, 0x43, 0xca, 0xee, - 0x8b, 0xfd, 0x66, 0xee, 0x93, 0xb1, 0x9e, 0x31, 0x15, 0x37, 0xfa, 0x06, 0xe4, 0xef, 0xe2, 0x3e, - 0x25, 0xac, 0x92, 0xad, 0x2f, 0x6c, 0x96, 0xb6, 0x5f, 0x69, 0x5c, 0xee, 0xbe, 0xc6, 0x31, 0xee, - 0x3b, 0x36, 0x66, 0x7e, 0x04, 0x20, 0xc5, 0x8c, 0x5f, 0x67, 0xa1, 0xbc, 0xeb, 0xbb, 0xae, 0x43, - 0xa9, 0xe3, 0x7b, 0x26, 0x66, 0x84, 0xa2, 0x26, 0xe4, 0x02, 0xcc, 0x88, 0x38, 0x4a, 0xb1, 0xd9, - 0xe0, 0xfc, 0x7f, 0x19, 0xeb, 0xaf, 0xf5, 0x1c, 0x76, 0x3a, 0xec, 0x36, 0x2c, 0xdf, 0x55, 0xce, - 0x50, 0xff, 0xde, 0xa0, 0xf6, 0x99, 0xb2, 0xaf, 0x45, 0x2c, 0x53, 0xc8, 0xa2, 0x77, 0xa1, 0xe0, - 0xe2, 0xf3, 0x8e, 0xc0, 0xc9, 0x0a, 0x9c, 0x9b, 0xf3, 0xe1, 0x4c, 0xc6, 0x7a, 0x79, 0x84, 0xdd, - 0xfe, 0x8e, 0x11, 0xe2, 0x18, 0xe6, 0xa2, 0x8b, 0xcf, 0xf9, 0x11, 0xd1, 0x00, 0xca, 0x9c, 0x6a, - 0x9d, 0x62, 0xaf, 0x47, 0xa4, 0x92, 0x05, 0xa1, 0x64, 0x7f, 0x6e, 0x25, 0xd7, 0x62, 0x25, 0x09, - 0x38, 0xc3, 0x5c, 0x76, 0xf1, 0xf9, 0xae, 0x20, 0x70, 0x8d, 0x3b, 0x85, 0x0f, 0x1f, 0xe8, 0x99, - 0x7f, 0x3c, 0xd0, 0x35, 0xe3, 0x4f, 0x1a, 0x40, 0xec, 0x31, 0xf4, 0x2e, 0xac, 0x5a, 0xd1, 0x4a, - 0xc8, 0x52, 0x15, 0xc3, 0x2f, 0xce, 0x8a, 0x45, 0xca, 0xdf, 0xcd, 0x02, 0x3f, 0xf4, 0xc3, 0xb1, - 0xae, 0x99, 0x65, 0x2b, 0x15, 0x8a, 0x1f, 0x40, 0x69, 0x38, 0xb0, 0x31, 0x23, 0x1d, 0x9e, 0x9d, - 0xc2, 0x93, 0xa5, 0xed, 0x6a, 0x43, 0xa6, 0x6e, 0x23, 0x4c, 0xdd, 0xc6, 0x51, 0x98, 0xba, 0xcd, - 0x1a, 0xc7, 0x9a, 0x8c, 0x75, 0x24, 0xcd, 0x4a, 0x08, 0x1b, 0x1f, 0xfc, 0x4d, 0xd7, 0x4c, 0x90, - 0x14, 0x2e, 0x90, 0xb0, 0xe9, 0xf7, 0x1a, 0x94, 0x5a, 0x84, 0x5a, 0x81, 0x33, 0xe0, 0x15, 0x82, - 0x2a, 0xb0, 0xe8, 0xfa, 0x9e, 0x73, 0xa6, 0xf2, 0xb1, 0x68, 0x86, 0x4b, 0x54, 0x85, 0x82, 0x63, - 0x13, 0x8f, 0x39, 0x6c, 0x24, 0xe3, 0x6a, 0x46, 0x6b, 0x2e, 0xf5, 0x13, 0xd2, 0xa5, 0x4e, 0x18, - 0x0d, 0x33, 0x5c, 0xa2, 0x5b, 0xb0, 0x4a, 0x89, 0x35, 0x0c, 0x1c, 0x36, 0xea, 0x58, 0xbe, 0xc7, - 0xb0, 0xc5, 0x2a, 0x39, 0x11, 0xb0, 0xcf, 0x4d, 0xc6, 0xfa, 0xcb, 0xf2, 0xac, 0x69, 0x0e, 0xc3, - 0x2c, 0x87, 0xa4, 0x5d, 0x49, 0xe1, 0x1a, 0x6c, 0xc2, 0xb0, 0xd3, 0xa7, 0x95, 0x97, 0xa4, 0x06, - 0xb5, 0x4c, 0xd8, 0xf2, 0xf1, 0x22, 0x14, 0xa3, 0x6c, 0xe7, 0x9a, 0xfd, 0x01, 0x09, 0xf8, 0xef, - 0x0e, 0xb6, 0xed, 0x80, 0x50, 0xaa, 0xf2, 0x3a, 0xa1, 0x39, 0xcd, 0x61, 0x98, 0xe5, 0x90, 0x74, - 0x53, 0x52, 0x10, 0xe3, 0x61, 0xf6, 0x28, 0xf1, 0xe8, 0x90, 0x76, 0x06, 0xc3, 0xee, 0x19, 0x19, - 0xa9, 0x68, 0xac, 0x4f, 0x45, 0xe3, 0xa6, 0x37, 0x6a, 0xbe, 0x19, 0xa3, 0xa7, 0xe5, 0x8c, 0x3f, - 0xfc, 0xe6, 0x8d, 0x75, 0x95, 0x1a, 0x56, 0x30, 0x1a, 0x30, 0xbf, 0x71, 0x30, 0xec, 0xbe, 0x4d, - 0x46, 0x3c, 0xfc, 0x8a, 0xf5, 0x40, 0x70, 0xa2, 0x6b, 0x90, 0xff, 0x11, 0x76, 0xfa, 0xc4, 0x16, - 0x0e, 0x2d, 0x98, 0x6a, 0x85, 0x76, 0x20, 0x4f, 0x19, 0x66, 0x43, 0x2a, 0xbc, 0xb8, 0xb2, 0x6d, - 0xcc, 0x4a, 0xb5, 0xa6, 0xef, 0xd9, 0x87, 0x82, 0xd3, 0x54, 0x12, 0xe8, 0x16, 0xe4, 0x99, 0x7f, - 0x46, 0x3c, 0xe5, 0xc2, 0xb9, 0xea, 0xbb, 0xed, 0x31, 0x53, 0x49, 0x73, 0x8f, 0xd8, 0xa4, 0x4f, - 0x7a, 0xc2, 0x71, 0xf4, 0x14, 0x07, 0x84, 0x56, 0xf2, 0x02, 0xb1, 0x3d, 0x77, 0x11, 0x2a, 0x4f, - 0xa5, 0xf1, 0x0c, 0xb3, 0x1c, 0x91, 0x0e, 0x05, 0x05, 0xbd, 0x0d, 0x25, 0x3b, 0x4e, 0xd4, 0xca, - 0xa2, 0x08, 0xc1, 0x17, 0x66, 0x99, 0x9f, 0xc8, 0x69, 0xd5, 0xf7, 0x92, 0xd2, 0x3c, 0x39, 0x86, - 0x5e, 0xd7, 0xf7, 0x6c, 0xc7, 0xeb, 0x75, 0x4e, 0x89, 0xd3, 0x3b, 0x65, 0x95, 0x42, 0x5d, 0xdb, - 0x5c, 0x48, 0x26, 0x47, 0x9a, 0xc3, 0x30, 0xcb, 0x11, 0x69, 0x5f, 0x50, 0x90, 0x0d, 0x2b, 0x31, - 0x97, 0x28, 0xd4, 0xe2, 0x53, 0x0b, 0xf5, 0x15, 0x55, 0xa8, 0x57, 0xd3, 0x5a, 0xe2, 0x5a, 0x5d, - 0x8e, 0x88, 0x5c, 0x0c, 0xed, 0x03, 0xc4, 0xed, 0xa1, 0x02, 0x42, 0x83, 0xf1, 0xf4, 0x1e, 0xa3, - 0x0c, 0x4f, 0xc8, 0xa2, 0xf7, 0xe0, 0x8a, 0xeb, 0x78, 0x1d, 0x4a, 0xfa, 0x27, 0x1d, 0xe5, 0x60, - 0x0e, 0x59, 0x12, 0xd1, 0x7b, 0x67, 0xbe, 0x7c, 0x98, 0x8c, 0xf5, 0xaa, 0x6a, 0xa1, 0xd3, 0x90, - 0x86, 0xb9, 0xe6, 0x3a, 0xde, 0x21, 0xe9, 0x9f, 0xb4, 0x22, 0xda, 0xce, 0xd2, 0xfb, 0x0f, 0xf4, - 0x8c, 0x2a, 0xd7, 0x8c, 0xf1, 0x16, 0x2c, 0x1d, 0xe3, 0xbe, 0x2a, 0x33, 0x42, 0xd1, 0x75, 0x28, - 0xe2, 0x70, 0x51, 0xd1, 0xea, 0x0b, 0x9b, 0x45, 0x33, 0x26, 0xc8, 0x32, 0xff, 0xe9, 0x5f, 0xeb, - 0x9a, 0xf1, 0xb1, 0x06, 0xf9, 0xd6, 0xf1, 0x01, 0x76, 0x02, 0xd4, 0x86, 0xb5, 0x38, 0x73, 0x2e, - 0x16, 0xf9, 0xf5, 0xc9, 0x58, 0xaf, 0xa4, 0x93, 0x2b, 0xaa, 0xf2, 0x38, 0x81, 0xc3, 0x32, 0x6f, - 0xc3, 0xda, 0xdd, 0xb0, 0x77, 0x44, 0x50, 0xd9, 0x34, 0xd4, 0x14, 0x8b, 0x61, 0xae, 0x46, 0x34, - 0x05, 0x95, 0x32, 0x73, 0x0f, 0x16, 0xe5, 0x69, 0x29, 0xda, 0x81, 0x97, 0x06, 0xfc, 0x87, 0xb0, - 0xae, 0xb4, 0x5d, 0x9b, 0x99, 0xbc, 0x82, 0x5f, 0x85, 0x4f, 0x8a, 0x18, 0xbf, 0xca, 0x02, 0xb4, - 0x8e, 0x8f, 0x8f, 0x02, 0x67, 0xd0, 0x27, 0xec, 0xd3, 0xb4, 0xfc, 0x08, 0xae, 0xc6, 0x66, 0xd1, - 0xc0, 0x4a, 0x59, 0x5f, 0x9f, 0x8c, 0xf5, 0xeb, 0x69, 0xeb, 0x13, 0x6c, 0x86, 0x79, 0x25, 0xa2, - 0x1f, 0x06, 0xd6, 0xa5, 0xa8, 0x36, 0x65, 0x11, 0xea, 0xc2, 0x6c, 0xd4, 0x04, 0x5b, 0x12, 0xb5, - 0x45, 0xd9, 0xe5, 0xae, 0x3d, 0x84, 0x52, 0xec, 0x12, 0x8a, 0x5a, 0x50, 0x60, 0xea, 0xb7, 0xf2, - 0xb0, 0x31, 0xdb, 0xc3, 0xa1, 0x98, 0xf2, 0x72, 0x24, 0x69, 0xfc, 0x47, 0x03, 0x88, 0x73, 0xf6, - 0xc5, 0x4c, 0x31, 0xde, 0xca, 0x55, 0xe3, 0x5d, 0x78, 0xae, 0x51, 0x4d, 0x49, 0xa7, 0xfc, 0xf9, - 0xf3, 0x2c, 0x5c, 0xb9, 0x13, 0x76, 0x9e, 0x17, 0xde, 0x07, 0x07, 0xb0, 0x48, 0x3c, 0x16, 0x38, - 0xc2, 0x09, 0x3c, 0xda, 0x5f, 0x99, 0x15, 0xed, 0x4b, 0x6c, 0xda, 0xf3, 0x58, 0x30, 0x52, 0xb1, - 0x0f, 0x61, 0x52, 0xde, 0xf8, 0xe5, 0x02, 0x54, 0x66, 0x49, 0xa2, 0x5d, 0x28, 0x5b, 0x01, 0x11, - 0x84, 0xf0, 0xfe, 0xd0, 0xc4, 0xfd, 0x51, 0x8d, 0x27, 0xcb, 0x14, 0x83, 0x61, 0xae, 0x84, 0x14, - 0x75, 0x7b, 0xf4, 0x80, 0x8f, 0x7d, 0x3c, 0xed, 0x38, 0xd7, 0x33, 0xce, 0x79, 0x86, 0xba, 0x3e, - 0x42, 0x25, 0x17, 0x01, 0xe4, 0xfd, 0xb1, 0x12, 0x53, 0xc5, 0x05, 0xf2, 0x63, 0x28, 0x3b, 0x9e, - 0xc3, 0x1c, 0xdc, 0xef, 0x74, 0x71, 0x1f, 0x7b, 0xd6, 0xf3, 0x4c, 0xcd, 0xb2, 0xe5, 0x2b, 0xb5, - 0x29, 0x38, 0xc3, 0x5c, 0x51, 0x94, 0xa6, 0x24, 0xa0, 0x7d, 0x58, 0x0c, 0x55, 0xe5, 0x9e, 0x6b, - 0xda, 0x08, 0xc5, 0x13, 0x03, 0xde, 0x2f, 0x16, 0x60, 0xcd, 0x24, 0xf6, 0x67, 0xa1, 0x98, 0x2f, - 0x14, 0xdf, 0x06, 0x90, 0xe5, 0xce, 0x1b, 0xec, 0x73, 0x44, 0x83, 0x37, 0x8c, 0xa2, 0x44, 0x68, - 0x51, 0x96, 0x88, 0xc7, 0x38, 0x0b, 0x4b, 0xc9, 0x78, 0xfc, 0x9f, 0xde, 0x4a, 0xa8, 0x1d, 0x77, - 0xa2, 0x9c, 0xe8, 0x44, 0x5f, 0x9a, 0xd5, 0x89, 0xa6, 0xb2, 0xf7, 0xc9, 0x2d, 0xe8, 0xdf, 0x59, - 0xc8, 0x1f, 0xe0, 0x00, 0xbb, 0x14, 0x59, 0x53, 0x93, 0xa6, 0x7c, 0x6b, 0x6e, 0x4c, 0xe5, 0x67, - 0x4b, 0x7d, 0xed, 0x78, 0xca, 0xa0, 0xf9, 0xe1, 0x25, 0x83, 0xe6, 0x37, 0x61, 0x85, 0x3f, 0x87, - 0x23, 0x1b, 0xa5, 0xb7, 0x97, 0x9b, 0x1b, 0x31, 0xca, 0xc5, 0x7d, 0xf9, 0x5a, 0x8e, 0x1e, 0x5d, - 0x14, 0x7d, 0x0d, 0x4a, 0x9c, 0x23, 0x6e, 0xcc, 0x5c, 0xfc, 0x5a, 0xfc, 0x2c, 0x4d, 0x6c, 0x1a, - 0x26, 0xb8, 0xf8, 0x7c, 0x4f, 0x2e, 0xd0, 0x3b, 0x80, 0x4e, 0xa3, 0x2f, 0x23, 0x9d, 0xd8, 0x9d, - 0x5c, 0xfe, 0xf3, 0x93, 0xb1, 0xbe, 0x21, 0xe5, 0xa7, 0x79, 0x0c, 0x73, 0x2d, 0x26, 0x86, 0x68, - 0x5f, 0x05, 0xe0, 0x76, 0x75, 0x6c, 0xe2, 0xf9, 0xae, 0x7a, 0xee, 0x5c, 0x9d, 0x8c, 0xf5, 0x35, - 0x89, 0x12, 0xef, 0x19, 0x66, 0x91, 0x2f, 0x5a, 0xfc, 0x77, 0x22, 0xb3, 0x3f, 0xd2, 0x00, 0xc5, - 0x2d, 0xdf, 0x24, 0x74, 0xc0, 0xdf, 0x67, 0x7c, 0x10, 0x4f, 0x4c, 0xcd, 0xda, 0x93, 0x07, 0xf1, - 0x58, 0x3e, 0x1c, 0xc4, 0x13, 0x95, 0xf2, 0xf5, 0xb8, 0x3d, 0x66, 0x55, 0x1c, 0x15, 0x4c, 0x17, - 0x53, 0x92, 0x18, 0xe6, 0x9d, 0x50, 0x7a, 0xaa, 0x1f, 0x66, 0x8c, 0x3f, 0x6a, 0xb0, 0x31, 0x95, - 0x51, 0xd1, 0x61, 0x7f, 0x08, 0x28, 0x48, 0x6c, 0x0a, 0x7f, 0x8d, 0xd4, 0xa1, 0xe7, 0x4e, 0xd0, - 0xb5, 0x60, 0xaa, 0xef, 0x7e, 0x7a, 0x1d, 0x3e, 0x27, 0x7c, 0xfe, 0x3b, 0x0d, 0xd6, 0x93, 0xea, - 0x23, 0x43, 0x6e, 0xc3, 0x52, 0x52, 0xbb, 0x32, 0xe1, 0xd5, 0x67, 0x31, 0x41, 0x9d, 0xfe, 0x82, - 0x3c, 0xfa, 0x6e, 0x5c, 0xae, 0xf2, 0xdb, 0xd9, 0x8d, 0x67, 0xf6, 0x46, 0x78, 0xa6, 0x74, 0xd9, - 0xe6, 0x44, 0x3c, 0xfe, 0xab, 0x41, 0xee, 0xc0, 0xf7, 0xfb, 0xc8, 0x87, 0x35, 0xcf, 0x67, 0x1d, - 0x9e, 0x59, 0xc4, 0xee, 0xa8, 0x47, 0xb7, 0xec, 0x83, 0xbb, 0xf3, 0x39, 0xe9, 0x9f, 0x63, 0x7d, - 0x1a, 0xca, 0x2c, 0x7b, 0x3e, 0x6b, 0x0a, 0xca, 0x91, 0x7c, 0x92, 0xbf, 0x07, 0xcb, 0x17, 0x95, - 0xc9, 0x2e, 0xf9, 0xbd, 0xb9, 0x95, 0x5d, 0x84, 0x99, 0x8c, 0xf5, 0xf5, 0xb8, 0x62, 0x22, 0xb2, - 0x61, 0x2e, 0x75, 0x13, 0xda, 0x77, 0x0a, 0x3c, 0x7e, 0xff, 0x7a, 0xa0, 0x6b, 0x5f, 0xfe, 0xad, - 0x06, 0x10, 0x7f, 0x79, 0x40, 0xaf, 0xc3, 0xcb, 0xcd, 0xef, 0xdc, 0x6e, 0x75, 0x0e, 0x8f, 0x6e, - 0x1e, 0xdd, 0x39, 0xec, 0xdc, 0xb9, 0x7d, 0x78, 0xb0, 0xb7, 0xdb, 0xbe, 0xd5, 0xde, 0x6b, 0xad, - 0x66, 0xaa, 0xe5, 0x7b, 0xf7, 0xeb, 0xa5, 0x3b, 0x1e, 0x1d, 0x10, 0xcb, 0x39, 0x71, 0x88, 0x8d, - 0x5e, 0x83, 0xf5, 0x8b, 0xdc, 0x7c, 0xb5, 0xd7, 0x5a, 0xd5, 0xaa, 0x4b, 0xf7, 0xee, 0xd7, 0x0b, - 0x72, 0x16, 0x23, 0x36, 0xda, 0x84, 0xab, 0xd3, 0x7c, 0xed, 0xdb, 0xdf, 0x5a, 0xcd, 0x56, 0x97, - 0xef, 0xdd, 0xaf, 0x17, 0xa3, 0xa1, 0x0d, 0x19, 0x80, 0x92, 0x9c, 0x0a, 0x6f, 0xa1, 0x0a, 0xf7, - 0xee, 0xd7, 0xf3, 0xd2, 0x81, 0xd5, 0xdc, 0xfb, 0x1f, 0xd5, 0x32, 0xcd, 0x5b, 0x9f, 0x3c, 0xaa, - 0x69, 0x0f, 0x1f, 0xd5, 0xb4, 0xbf, 0x3f, 0xaa, 0x69, 0x1f, 0x3c, 0xae, 0x65, 0x1e, 0x3e, 0xae, - 0x65, 0xfe, 0xfc, 0xb8, 0x96, 0xf9, 0xfe, 0xeb, 0x4f, 0xf4, 0xdd, 0x79, 0xf4, 0x51, 0x5b, 0x78, - 0xb1, 0x9b, 0x17, 0x6d, 0xf8, 0xcd, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0xc2, 0x48, 0x4c, 0x86, - 0xf3, 0x16, 0x00, 0x00, + // 2021 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x59, 0x4f, 0x6c, 0x23, 0x57, + 0x19, 0xf7, 0xd8, 0xae, 0xe3, 0x7c, 0x4e, 0xe2, 0xe4, 0x6d, 0x76, 0xd7, 0xf1, 0x2e, 0xb6, 0x77, + 0x5a, 0x95, 0xb0, 0x6a, 0x1d, 0x36, 0xad, 0x8a, 0x88, 0x90, 0x68, 0x1c, 0x3b, 0x8d, 0xd5, 0x6d, + 0x36, 0x8c, 0x9d, 0x54, 0x40, 0xc5, 0x68, 0x3c, 0xf3, 0xe2, 0x0c, 0xb1, 0x67, 0xcc, 0xbc, 0xe7, + 0x6d, 0x2c, 0xf5, 0xc0, 0xb1, 0x84, 0x03, 0xe5, 0xd6, 0x4b, 0xa4, 0x95, 0x7a, 0x42, 0x42, 0xe2, + 0x82, 0xb8, 0x72, 0x2d, 0x70, 0x59, 0x6e, 0x08, 0x21, 0x83, 0x76, 0x2f, 0x88, 0x03, 0xaa, 0x72, + 0x40, 0xdc, 0x40, 0xef, 0xcf, 0xfc, 0xc9, 0x38, 0xd9, 0xdd, 0xac, 0x2a, 0x54, 0x89, 0x5e, 0x76, + 0xfd, 0xbe, 0xf7, 0x7d, 0xbf, 0xef, 0x7d, 0xff, 0xdf, 0x9b, 0xc0, 0x4b, 0xa6, 0x4b, 0xfa, 0x2e, + 0x59, 0x21, 0xd4, 0x38, 0xb4, 0x9d, 0xee, 0xca, 0xfd, 0x3b, 0x1d, 0x4c, 0x8d, 0x3b, 0xfe, 0xba, + 0x3a, 0xf0, 0x5c, 0xea, 0xa2, 0x6b, 0x82, 0xab, 0xea, 0x53, 0x25, 0x57, 0x71, 0xb1, 0xeb, 0x76, + 0x5d, 0xce, 0xb2, 0xc2, 0x7e, 0x09, 0xee, 0xe2, 0x52, 0xd7, 0x75, 0xbb, 0x3d, 0xbc, 0xc2, 0x57, + 0x9d, 0xe1, 0xfe, 0x8a, 0xe1, 0x8c, 0xe4, 0x56, 0x29, 0xbe, 0x65, 0x0d, 0x3d, 0x83, 0xda, 0xae, + 0x23, 0xf7, 0xcb, 0xf1, 0x7d, 0x6a, 0xf7, 0x31, 0xa1, 0x46, 0x7f, 0xe0, 0x63, 0x8b, 0x93, 0xe8, + 0x42, 0xa9, 0x3c, 0x96, 0xc4, 0x96, 0xa6, 0x74, 0x0c, 0x82, 0x03, 0x3b, 0x4c, 0xd7, 0xf6, 0xb1, + 0x6f, 0x52, 0xec, 0x58, 0xd8, 0xeb, 0xdb, 0x0e, 0x5d, 0xa1, 0xa3, 0x01, 0x26, 0xe2, 0x5f, 0xb9, + 0x7b, 0x23, 0xb2, 0x6b, 0x74, 0x4c, 0x3b, 0xba, 0xa9, 0xfe, 0x44, 0x81, 0xb9, 0x2d, 0x9b, 0x50, + 0xd7, 0xb3, 0x4d, 0xa3, 0xd7, 0x74, 0xf6, 0x5d, 0xf4, 0x06, 0x64, 0x0e, 0xb0, 0x61, 0x61, 0xaf, + 0xa0, 0x54, 0x94, 0xe5, 0xdc, 0x6a, 0xa1, 0x1a, 0x02, 0x54, 0x85, 0xec, 0x16, 0xdf, 0xaf, 0xa5, + 0x3f, 0x1d, 0x97, 0x13, 0x9a, 0xe4, 0x46, 0xdf, 0x86, 0xcc, 0x7d, 0xa3, 0x47, 0x30, 0x2d, 0x24, + 0x2b, 0xa9, 0xe5, 0xdc, 0xea, 0xad, 0xea, 0xf9, 0xbe, 0xad, 0xee, 0x19, 0x3d, 0xdb, 0x32, 0xa8, + 0x1b, 0x00, 0x08, 0x31, 0xf5, 0x57, 0x49, 0xc8, 0x6f, 0xb8, 0xfd, 0xbe, 0x4d, 0x88, 0xed, 0x3a, + 0x9a, 0x41, 0x31, 0x41, 0x35, 0x48, 0x7b, 0x06, 0xc5, 0xfc, 0x28, 0xd3, 0xb5, 0x2a, 0xe3, 0xff, + 0xf3, 0xb8, 0xfc, 0x72, 0xd7, 0xa6, 0x07, 0xc3, 0x4e, 0xd5, 0x74, 0xfb, 0xd2, 0x53, 0xf2, 0xbf, + 0x57, 0x89, 0x75, 0x28, 0xed, 0xab, 0x63, 0x53, 0xe3, 0xb2, 0xe8, 0x3d, 0xc8, 0xf6, 0x8d, 0x23, + 0x9d, 0xe3, 0x24, 0x39, 0xce, 0xfa, 0xe5, 0x70, 0x4e, 0xc7, 0xe5, 0xfc, 0xc8, 0xe8, 0xf7, 0xd6, + 0x54, 0x1f, 0x47, 0xd5, 0xa6, 0xfa, 0xc6, 0x11, 0x3b, 0x22, 0x1a, 0x40, 0x9e, 0x51, 0xcd, 0x03, + 0xc3, 0xe9, 0x62, 0xa1, 0x24, 0xc5, 0x95, 0x6c, 0x5d, 0x5a, 0xc9, 0xb5, 0x50, 0x49, 0x04, 0x4e, + 0xd5, 0x66, 0xfb, 0xc6, 0xd1, 0x06, 0x27, 0x30, 0x8d, 0x6b, 0xd9, 0x8f, 0x1f, 0x94, 0x13, 0x7f, + 0x7f, 0x50, 0x56, 0xd4, 0x3f, 0x2a, 0x00, 0xa1, 0xc7, 0xd0, 0x7b, 0x30, 0x6f, 0x06, 0x2b, 0x2e, + 0x4b, 0x64, 0x0c, 0xbf, 0x7a, 0x51, 0x2c, 0x62, 0xfe, 0xae, 0x65, 0xd9, 0xa1, 0x1f, 0x8e, 0xcb, + 0x8a, 0x96, 0x37, 0x63, 0xa1, 0xf8, 0x3e, 0xe4, 0x86, 0x03, 0xcb, 0xa0, 0x58, 0x67, 0xa9, 0xcb, + 0x3d, 0x99, 0x5b, 0x2d, 0x56, 0x45, 0x5e, 0x57, 0xfd, 0xbc, 0xae, 0xb6, 0xfd, 0xbc, 0xae, 0x95, + 0x18, 0xd6, 0xe9, 0xb8, 0x8c, 0x84, 0x59, 0x11, 0x61, 0xf5, 0xa3, 0xbf, 0x96, 0x15, 0x0d, 0x04, + 0x85, 0x09, 0x44, 0x6c, 0xfa, 0x9d, 0x02, 0xb9, 0x3a, 0x26, 0xa6, 0x67, 0x0f, 0x58, 0xf9, 0xa0, + 0x02, 0x4c, 0xf5, 0x5d, 0xc7, 0x3e, 0x94, 0xf9, 0x38, 0xad, 0xf9, 0x4b, 0x54, 0x84, 0xac, 0x6d, + 0x61, 0x87, 0xda, 0x74, 0x24, 0xe2, 0xaa, 0x05, 0x6b, 0x26, 0xf5, 0x3e, 0xee, 0x10, 0xdb, 0x8f, + 0x86, 0xe6, 0x2f, 0xd1, 0x26, 0xcc, 0x13, 0x6c, 0x0e, 0x3d, 0x9b, 0x8e, 0x74, 0xd3, 0x75, 0xa8, + 0x61, 0xd2, 0x42, 0x9a, 0x07, 0xec, 0xc6, 0xe9, 0xb8, 0x7c, 0x5d, 0x9c, 0x35, 0xce, 0xa1, 0x6a, + 0x79, 0x9f, 0xb4, 0x21, 0x28, 0x4c, 0x83, 0x85, 0xa9, 0x61, 0xf7, 0x48, 0xe1, 0x05, 0xa1, 0x41, + 0x2e, 0x23, 0xb6, 0xfc, 0x2c, 0x0b, 0xd3, 0x41, 0xb6, 0x33, 0xcd, 0xee, 0x00, 0x7b, 0xec, 0xb7, + 0x6e, 0x58, 0x96, 0x87, 0x09, 0x91, 0x79, 0x1d, 0xd1, 0x1c, 0xe7, 0x50, 0xb5, 0xbc, 0x4f, 0x5a, + 0x17, 0x14, 0x44, 0x59, 0x98, 0x1d, 0x82, 0x1d, 0x32, 0x24, 0xfa, 0x60, 0xd8, 0x39, 0xc4, 0x23, + 0x19, 0x8d, 0xc5, 0x89, 0x68, 0xac, 0x3b, 0xa3, 0xda, 0x6b, 0x21, 0x7a, 0x5c, 0x4e, 0xfd, 0xfd, + 0xaf, 0x5f, 0x5d, 0x94, 0xa9, 0x61, 0x7a, 0xa3, 0x01, 0x75, 0xab, 0x3b, 0xc3, 0xce, 0xdb, 0x78, + 0xc4, 0xc2, 0x2f, 0x59, 0x77, 0x38, 0x27, 0xba, 0x06, 0x99, 0x1f, 0x1a, 0x76, 0x0f, 0x5b, 0xdc, + 0xa1, 0x59, 0x4d, 0xae, 0xd0, 0x1a, 0x64, 0x08, 0x35, 0xe8, 0x90, 0x70, 0x2f, 0xce, 0xad, 0xaa, + 0x17, 0xa5, 0x5a, 0xcd, 0x75, 0xac, 0x16, 0xe7, 0xd4, 0xa4, 0x04, 0xda, 0x84, 0x0c, 0x75, 0x0f, + 0xb1, 0x23, 0x5d, 0x78, 0xa9, 0xfa, 0x6e, 0x3a, 0x54, 0x93, 0xd2, 0xcc, 0x23, 0x16, 0xee, 0xe1, + 0x2e, 0x77, 0x1c, 0x39, 0x30, 0x3c, 0x4c, 0x0a, 0x19, 0x8e, 0xd8, 0xbc, 0x74, 0x11, 0x4a, 0x4f, + 0xc5, 0xf1, 0x54, 0x2d, 0x1f, 0x90, 0x5a, 0x9c, 0x82, 0xde, 0x86, 0x9c, 0x15, 0x26, 0x6a, 0x61, + 0x8a, 0x87, 0xe0, 0xc5, 0x8b, 0xcc, 0x8f, 0xe4, 0xb4, 0xec, 0x7b, 0x51, 0x69, 0x96, 0x1c, 0x43, + 0xa7, 0xe3, 0x3a, 0x96, 0xed, 0x74, 0xf5, 0x03, 0x6c, 0x77, 0x0f, 0x68, 0x21, 0x5b, 0x51, 0x96, + 0x53, 0xd1, 0xe4, 0x88, 0x73, 0xa8, 0x5a, 0x3e, 0x20, 0x6d, 0x71, 0x0a, 0xb2, 0x60, 0x2e, 0xe4, + 0xe2, 0x85, 0x3a, 0xfd, 0xd4, 0x42, 0xbd, 0x25, 0x0b, 0xf5, 0x6a, 0x5c, 0x4b, 0x58, 0xab, 0xb3, + 0x01, 0x91, 0x89, 0xa1, 0x2d, 0x80, 0xb0, 0x3d, 0x14, 0x80, 0x6b, 0x50, 0x9f, 0xde, 0x63, 0xa4, + 0xe1, 0x11, 0x59, 0xf4, 0x01, 0x5c, 0xe9, 0xdb, 0x8e, 0x4e, 0x70, 0x6f, 0x5f, 0x97, 0x0e, 0x66, + 0x90, 0x39, 0x1e, 0xbd, 0xbb, 0x97, 0xcb, 0x87, 0xd3, 0x71, 0xb9, 0x28, 0x5b, 0xe8, 0x24, 0xa4, + 0xaa, 0x2d, 0xf4, 0x6d, 0xa7, 0x85, 0x7b, 0xfb, 0xf5, 0x80, 0x86, 0xbe, 0x05, 0x37, 0x42, 0x6b, + 0x5d, 0x47, 0x3f, 0x70, 0x7b, 0x96, 0xee, 0xe1, 0x7d, 0xdd, 0x74, 0x87, 0x0e, 0x2d, 0xcc, 0xb0, + 0x00, 0x68, 0xd7, 0x03, 0x96, 0x7b, 0xce, 0x96, 0xdb, 0xb3, 0x34, 0xbc, 0xbf, 0xc1, 0xb6, 0xd1, + 0x8b, 0x10, 0xba, 0x45, 0xb7, 0x2d, 0x52, 0x98, 0xad, 0xa4, 0x96, 0xd3, 0xda, 0x4c, 0x40, 0x6c, + 0x5a, 0x64, 0x6d, 0xe6, 0xc3, 0x07, 0xe5, 0x84, 0xec, 0x08, 0x09, 0xf5, 0x0d, 0x98, 0xd9, 0x33, + 0x7a, 0xb2, 0x92, 0x31, 0x41, 0x37, 0x61, 0xda, 0xf0, 0x17, 0x05, 0xa5, 0x92, 0x5a, 0x9e, 0xd6, + 0x42, 0x82, 0xe8, 0x24, 0x3f, 0xfe, 0x4b, 0x45, 0x51, 0x7f, 0xa9, 0x40, 0xa6, 0xbe, 0xb7, 0x63, + 0xd8, 0x1e, 0x6a, 0xc2, 0x42, 0x98, 0x9c, 0x67, 0xfb, 0xc8, 0xcd, 0xd3, 0x71, 0xb9, 0x10, 0xcf, + 0xdf, 0xa0, 0x91, 0x84, 0x35, 0xe2, 0x77, 0x92, 0x26, 0x2c, 0xdc, 0xf7, 0xdb, 0x53, 0x00, 0x95, + 0x8c, 0x43, 0x4d, 0xb0, 0xa8, 0xda, 0x7c, 0x40, 0x93, 0x50, 0x31, 0x33, 0x1b, 0x30, 0x25, 0x4e, + 0x4b, 0xd0, 0x1a, 0xbc, 0x30, 0x60, 0x3f, 0xb8, 0x75, 0xb9, 0xd5, 0xd2, 0x85, 0xf5, 0xc1, 0xf9, + 0x65, 0x86, 0x08, 0x11, 0xf5, 0xe7, 0x49, 0x80, 0xfa, 0xde, 0x5e, 0xdb, 0xb3, 0x07, 0x3d, 0x4c, + 0x3f, 0x4f, 0xcb, 0xdb, 0x70, 0x35, 0x34, 0x8b, 0x78, 0x66, 0xcc, 0xfa, 0xca, 0xe9, 0xb8, 0x7c, + 0x33, 0x6e, 0x7d, 0x84, 0x4d, 0xd5, 0xae, 0x04, 0xf4, 0x96, 0x67, 0x9e, 0x8b, 0x6a, 0x11, 0x1a, + 0xa0, 0xa6, 0x2e, 0x46, 0x8d, 0xb0, 0x45, 0x51, 0xeb, 0x84, 0x9e, 0xef, 0xda, 0x16, 0xe4, 0x42, + 0x97, 0x10, 0x54, 0x87, 0x2c, 0x95, 0xbf, 0xa5, 0x87, 0xd5, 0x8b, 0x3d, 0xec, 0x8b, 0x49, 0x2f, + 0x07, 0x92, 0xea, 0xbf, 0x15, 0x80, 0x48, 0x59, 0x7c, 0x21, 0x53, 0x8c, 0x4d, 0x0b, 0xd9, 0xdb, + 0x53, 0xcf, 0x75, 0x1b, 0x94, 0xd2, 0x31, 0x7f, 0xfe, 0x34, 0x09, 0x57, 0x76, 0xfd, 0x82, 0xfd, + 0xc2, 0xfb, 0x60, 0x07, 0xa6, 0xb0, 0x43, 0x3d, 0x9b, 0x3b, 0x81, 0x45, 0xfb, 0xeb, 0x17, 0x45, + 0xfb, 0x1c, 0x9b, 0x1a, 0x0e, 0xf5, 0x46, 0x32, 0xf6, 0x3e, 0x4c, 0xcc, 0x1b, 0x9f, 0xa5, 0xa0, + 0x70, 0x91, 0x24, 0xda, 0x80, 0xbc, 0xe9, 0x61, 0x4e, 0xf0, 0x47, 0x94, 0xc2, 0x47, 0x54, 0x31, + 0xbc, 0xbc, 0xc6, 0x18, 0x54, 0x6d, 0xce, 0xa7, 0xc8, 0x01, 0xd5, 0x05, 0x76, 0xb3, 0x64, 0x69, + 0xc7, 0xb8, 0x9e, 0xf1, 0x2a, 0xa9, 0xca, 0x09, 0xe5, 0x2b, 0x39, 0x0b, 0x20, 0x46, 0xd4, 0x5c, + 0x48, 0xe5, 0x33, 0xea, 0x47, 0x90, 0xb7, 0x1d, 0x9b, 0xda, 0x46, 0x4f, 0xef, 0x18, 0x3d, 0xc3, + 0x31, 0x9f, 0xe7, 0x62, 0x2e, 0xa6, 0x8a, 0x54, 0x1b, 0x83, 0x53, 0xb5, 0x39, 0x49, 0xa9, 0x09, + 0x02, 0xda, 0x82, 0x29, 0x5f, 0x55, 0xfa, 0xb9, 0x2e, 0x34, 0xbe, 0x38, 0xba, 0x05, 0x33, 0xd1, + 0xd1, 0xc2, 0xef, 0x47, 0x69, 0x2d, 0x17, 0x99, 0x2c, 0x4f, 0x9b, 0x5d, 0x99, 0x27, 0xce, 0xae, + 0xc8, 0x25, 0xf5, 0x9f, 0x29, 0x58, 0xd0, 0xb0, 0xf5, 0x65, 0xac, 0x2f, 0x17, 0xeb, 0x77, 0x00, + 0x44, 0x3f, 0x61, 0x1d, 0xfc, 0x39, 0xc2, 0xcd, 0x3a, 0xd2, 0xb4, 0x40, 0xa8, 0x13, 0xfa, 0xbf, + 0x0c, 0xf8, 0x38, 0x09, 0x33, 0xd1, 0x80, 0xff, 0x9f, 0xce, 0x55, 0xd4, 0x0c, 0x7b, 0x69, 0x9a, + 0xf7, 0xd2, 0xaf, 0x5d, 0xd4, 0x4b, 0x27, 0xca, 0xe3, 0xc9, 0x4d, 0xf4, 0x5f, 0x49, 0xc8, 0xec, + 0x18, 0x9e, 0xd1, 0x27, 0xc8, 0x9c, 0xb8, 0x8e, 0x8b, 0x07, 0xf9, 0xd2, 0x44, 0x01, 0xd4, 0xe5, + 0xf7, 0xa2, 0xa7, 0xdc, 0xc6, 0x3f, 0x3e, 0xe7, 0x36, 0xfe, 0x26, 0xcc, 0xf5, 0x8d, 0x23, 0x3d, + 0xb0, 0x51, 0x78, 0x7b, 0xb6, 0xb6, 0x14, 0xa2, 0x9c, 0xdd, 0x17, 0x9f, 0x14, 0x82, 0x97, 0x29, + 0x41, 0xdf, 0x80, 0x1c, 0xe3, 0x08, 0x47, 0x0b, 0x13, 0xbf, 0x16, 0xbe, 0xdd, 0x23, 0x9b, 0xaa, + 0x06, 0x7d, 0xe3, 0xa8, 0x21, 0x16, 0xe8, 0x2e, 0xa0, 0x83, 0xe0, 0xf3, 0x91, 0x1e, 0xba, 0x93, + 0xc9, 0x7f, 0xe5, 0x74, 0x5c, 0x5e, 0x12, 0xf2, 0x93, 0x3c, 0xaa, 0xb6, 0x10, 0x12, 0x7d, 0xb4, + 0xd7, 0x01, 0x98, 0x5d, 0xba, 0x85, 0x1d, 0xb7, 0x2f, 0xdf, 0x84, 0x57, 0x4f, 0xc7, 0xe5, 0x05, + 0x81, 0x12, 0xee, 0xa9, 0xda, 0x34, 0x5b, 0xd4, 0xd9, 0xef, 0x48, 0x66, 0x7f, 0xa2, 0x00, 0x0a, + 0x87, 0x96, 0x86, 0xc9, 0x80, 0x3d, 0x62, 0xd9, 0x6b, 0x25, 0xf2, 0xb4, 0x50, 0x9e, 0xfc, 0x5a, + 0x09, 0xe5, 0xfd, 0xd7, 0x4a, 0xa4, 0x52, 0xbe, 0x19, 0x36, 0xf8, 0xa4, 0x8c, 0xa3, 0x84, 0xe9, + 0x18, 0x04, 0x47, 0x5e, 0x3c, 0xb6, 0x2f, 0xed, 0xf3, 0x07, 0xa7, 0x4c, 0xa8, 0x7f, 0x50, 0x60, + 0x69, 0x22, 0xa3, 0x82, 0xc3, 0xfe, 0x00, 0x90, 0x17, 0xd9, 0xe4, 0xfe, 0x1a, 0xc9, 0x43, 0x5f, + 0x3a, 0x41, 0x17, 0xbc, 0x89, 0xc6, 0xfe, 0xb9, 0xcd, 0xa8, 0xb5, 0x34, 0xf7, 0xf9, 0x6f, 0x15, + 0x58, 0x8c, 0xaa, 0x0f, 0x0c, 0xd9, 0x86, 0x99, 0xa8, 0x76, 0x69, 0xc2, 0x4b, 0xcf, 0x62, 0x82, + 0x3c, 0xfd, 0x19, 0x79, 0xf4, 0x9d, 0xb0, 0x5c, 0xc5, 0x07, 0xc6, 0x3b, 0xcf, 0xec, 0x0d, 0xff, + 0x4c, 0xf1, 0xb2, 0x4d, 0xf3, 0x78, 0xfc, 0x47, 0x81, 0xf4, 0x8e, 0xeb, 0xf6, 0x90, 0x0b, 0x0b, + 0x8e, 0x4b, 0x75, 0x96, 0x59, 0xd8, 0xd2, 0xe5, 0x97, 0x09, 0xd1, 0x07, 0x37, 0x2e, 0xe7, 0xa4, + 0x7f, 0x8c, 0xcb, 0x93, 0x50, 0x5a, 0xde, 0x71, 0x69, 0x8d, 0x53, 0xda, 0xe2, 0xbb, 0xc5, 0x07, + 0x30, 0x7b, 0x56, 0x99, 0xe8, 0x92, 0xef, 0x5e, 0x5a, 0xd9, 0x59, 0x98, 0xd3, 0x71, 0x79, 0x31, + 0xac, 0x98, 0x80, 0xac, 0x6a, 0x33, 0x9d, 0x88, 0xf6, 0xb5, 0x2c, 0x8b, 0xdf, 0x67, 0x2c, 0x86, + 0x6d, 0x98, 0x0f, 0x9a, 0xc1, 0x2e, 0xff, 0x28, 0x47, 0xd0, 0x9b, 0x30, 0x25, 0xbe, 0xcf, 0xf9, + 0xef, 0x8a, 0x4a, 0xf4, 0x3b, 0xb0, 0xd1, 0x31, 0xed, 0x6a, 0x4c, 0xc6, 0xf7, 0xae, 0x14, 0xbb, + 0xfd, 0x1b, 0x05, 0x20, 0xfc, 0xe8, 0x83, 0x5e, 0x81, 0xeb, 0xb5, 0x7b, 0xdb, 0x75, 0xbd, 0xd5, + 0x5e, 0x6f, 0xef, 0xb6, 0xf4, 0xdd, 0xed, 0xd6, 0x4e, 0x63, 0xa3, 0xb9, 0xd9, 0x6c, 0xd4, 0xe7, + 0x13, 0xc5, 0xfc, 0xf1, 0x49, 0x25, 0xb7, 0xeb, 0x90, 0x01, 0x36, 0xed, 0x7d, 0x1b, 0x5b, 0xe8, + 0x65, 0x58, 0x3c, 0xcb, 0xcd, 0x56, 0x8d, 0xfa, 0xbc, 0x52, 0x9c, 0x39, 0x3e, 0xa9, 0x64, 0xc5, + 0x1d, 0x15, 0x5b, 0x68, 0x19, 0xae, 0x4e, 0xf2, 0x35, 0xb7, 0xdf, 0x9a, 0x4f, 0x16, 0x67, 0x8f, + 0x4f, 0x2a, 0xd3, 0xc1, 0x65, 0x16, 0xa9, 0x80, 0xa2, 0x9c, 0x12, 0x2f, 0x55, 0x84, 0xe3, 0x93, + 0x4a, 0x46, 0x84, 0xa5, 0x98, 0xfe, 0xf0, 0x93, 0x52, 0xe2, 0xf6, 0x2f, 0x14, 0x98, 0x6b, 0x3a, + 0xfb, 0x9e, 0x61, 0xf2, 0x0b, 0xc6, 0x68, 0x80, 0xd1, 0xeb, 0x70, 0xa3, 0xb9, 0xbd, 0xa9, 0xad, + 0x6f, 0xb4, 0x9b, 0xf7, 0xb6, 0xf5, 0xf6, 0x77, 0x77, 0x1a, 0x31, 0x03, 0xae, 0x1c, 0x9f, 0x54, + 0xf2, 0xa1, 0x50, 0xa3, 0x3f, 0xa0, 0x23, 0xb4, 0x32, 0x29, 0x55, 0xbf, 0xb7, 0x5b, 0xbb, 0xdb, + 0xd0, 0x5b, 0xcd, 0xb7, 0xb6, 0xe7, 0x95, 0xe2, 0xdc, 0xf1, 0x49, 0x05, 0xea, 0xee, 0xb0, 0xd3, + 0xc3, 0x2d, 0xbb, 0xeb, 0xa0, 0xdb, 0x50, 0x98, 0x14, 0x78, 0x77, 0xbb, 0xdd, 0x7c, 0xa7, 0x31, + 0x9f, 0x14, 0x96, 0xd7, 0xdd, 0xf7, 0x1d, 0x36, 0x09, 0xc4, 0x59, 0x6b, 0x9b, 0x9f, 0x3e, 0x2a, + 0x29, 0x0f, 0x1f, 0x95, 0x94, 0xbf, 0x3d, 0x2a, 0x29, 0x1f, 0x3d, 0x2e, 0x25, 0x1e, 0x3e, 0x2e, + 0x25, 0xfe, 0xf4, 0xb8, 0x94, 0xf8, 0xde, 0x2b, 0x4f, 0xcc, 0x9e, 0xa3, 0xe0, 0x0f, 0x23, 0x3c, + 0x8f, 0x3a, 0x19, 0x3e, 0x88, 0x5e, 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x53, 0xe2, 0xd3, + 0xf7, 0x37, 0x19, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1260,622 +1394,789 @@ func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_ func StakingDescription() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 9836 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, - 0x75, 0x18, 0x8c, 0x9e, 0x07, 0x30, 0x73, 0x30, 0x00, 0x06, 0x17, 0x58, 0x70, 0x76, 0x76, 0x17, - 0x00, 0x9b, 0xaf, 0xe5, 0x92, 0xc4, 0x92, 0x4b, 0xee, 0x92, 0x9c, 0x95, 0x44, 0xcd, 0x60, 0x66, - 0xb1, 0xe0, 0xe2, 0xc5, 0x06, 0xb0, 0xa4, 0x28, 0xf9, 0x9b, 0x6a, 0xcc, 0x5c, 0x0c, 0x9a, 0x98, - 0xe9, 0x6e, 0x76, 0xf7, 0xec, 0x02, 0x2b, 0xe9, 0x2b, 0xea, 0x11, 0x45, 0xa2, 0xcb, 0xb1, 0x14, - 0xa5, 0x62, 0x89, 0xd2, 0x2a, 0x94, 0xe5, 0x44, 0x8e, 0xac, 0xc4, 0x92, 0xa5, 0x28, 0x71, 0x92, - 0xaa, 0x48, 0xa9, 0x72, 0x2c, 0x29, 0x71, 0x4a, 0x4a, 0x5c, 0x89, 0xe3, 0x72, 0x56, 0x0e, 0xc5, - 0x4a, 0x14, 0x45, 0x89, 0xe5, 0xb5, 0x92, 0x38, 0xa5, 0xca, 0xa3, 0xee, 0xab, 0x5f, 0xf3, 0x04, - 0xb8, 0x2b, 0xc9, 0x71, 0x7e, 0x61, 0xee, 0xb9, 0xe7, 0x9c, 0x7b, 0xce, 0xb9, 0xe7, 0x9e, 0x7b, - 0xee, 0xab, 0x01, 0x5f, 0x3c, 0x0f, 0xb3, 0x35, 0xc3, 0xa8, 0xd5, 0xf1, 0x69, 0xd3, 0x32, 0x1c, - 0x63, 0xab, 0xb9, 0x7d, 0xba, 0x8a, 0xed, 0x8a, 0xa5, 0x99, 0x8e, 0x61, 0xcd, 0x51, 0x18, 0x1a, - 0x63, 0x18, 0x73, 0x02, 0x43, 0x5e, 0x86, 0xf1, 0x0b, 0x5a, 0x1d, 0x17, 0x5d, 0xc4, 0x75, 0xec, - 0xa0, 0x27, 0x20, 0xb6, 0xad, 0xd5, 0x71, 0x46, 0x9a, 0x8d, 0x9e, 0x1c, 0x3e, 0x73, 0xf7, 0x5c, - 0x88, 0x68, 0x2e, 0x48, 0xb1, 0x46, 0xc0, 0x0a, 0xa5, 0x90, 0x5f, 0x8f, 0xc1, 0x44, 0x9b, 0x5a, - 0x84, 0x20, 0xa6, 0xab, 0x0d, 0xc2, 0x51, 0x3a, 0x99, 0x54, 0xe8, 0x6f, 0x94, 0x81, 0x21, 0x53, - 0xad, 0xec, 0xaa, 0x35, 0x9c, 0x89, 0x50, 0xb0, 0x28, 0xa2, 0x69, 0x80, 0x2a, 0x36, 0xb1, 0x5e, - 0xc5, 0x7a, 0x65, 0x3f, 0x13, 0x9d, 0x8d, 0x9e, 0x4c, 0x2a, 0x3e, 0x08, 0x7a, 0x00, 0xc6, 0xcd, - 0xe6, 0x56, 0x5d, 0xab, 0x94, 0x7d, 0x68, 0x30, 0x1b, 0x3d, 0x19, 0x57, 0xd2, 0xac, 0xa2, 0xe8, - 0x21, 0xdf, 0x07, 0x63, 0x57, 0xb1, 0xba, 0xeb, 0x47, 0x1d, 0xa6, 0xa8, 0xa3, 0x04, 0xec, 0x43, - 0x9c, 0x87, 0x54, 0x03, 0xdb, 0xb6, 0x5a, 0xc3, 0x65, 0x67, 0xdf, 0xc4, 0x99, 0x18, 0xd5, 0x7e, - 0xb6, 0x45, 0xfb, 0xb0, 0xe6, 0xc3, 0x9c, 0x6a, 0x63, 0xdf, 0xc4, 0x28, 0x0f, 0x49, 0xac, 0x37, - 0x1b, 0x8c, 0x43, 0xbc, 0x83, 0xfd, 0x4a, 0x7a, 0xb3, 0x11, 0xe6, 0x92, 0x20, 0x64, 0x9c, 0xc5, - 0x90, 0x8d, 0xad, 0x2b, 0x5a, 0x05, 0x67, 0x06, 0x29, 0x83, 0xfb, 0x5a, 0x18, 0xac, 0xb3, 0xfa, - 0x30, 0x0f, 0x41, 0x87, 0xe6, 0x21, 0x89, 0xf7, 0x1c, 0xac, 0xdb, 0x9a, 0xa1, 0x67, 0x86, 0x28, - 0x93, 0x7b, 0xda, 0xf4, 0x22, 0xae, 0x57, 0xc3, 0x2c, 0x3c, 0x3a, 0x74, 0x0e, 0x86, 0x0c, 0xd3, - 0xd1, 0x0c, 0xdd, 0xce, 0x24, 0x66, 0xa5, 0x93, 0xc3, 0x67, 0x8e, 0xb7, 0x75, 0x84, 0x55, 0x86, - 0xa3, 0x08, 0x64, 0xb4, 0x08, 0x69, 0xdb, 0x68, 0x5a, 0x15, 0x5c, 0xae, 0x18, 0x55, 0x5c, 0xd6, - 0xf4, 0x6d, 0x23, 0x93, 0xa4, 0x0c, 0x66, 0x5a, 0x15, 0xa1, 0x88, 0xf3, 0x46, 0x15, 0x2f, 0xea, - 0xdb, 0x86, 0x32, 0x6a, 0x07, 0xca, 0x68, 0x0a, 0x06, 0xed, 0x7d, 0xdd, 0x51, 0xf7, 0x32, 0x29, - 0xea, 0x21, 0xbc, 0x24, 0xff, 0xe6, 0x20, 0x8c, 0xf5, 0xe3, 0x62, 0xe7, 0x21, 0xbe, 0x4d, 0xb4, - 0xcc, 0x44, 0x0e, 0x62, 0x03, 0x46, 0x13, 0x34, 0xe2, 0xe0, 0x21, 0x8d, 0x98, 0x87, 0x61, 0x1d, - 0xdb, 0x0e, 0xae, 0x32, 0x8f, 0x88, 0xf6, 0xe9, 0x53, 0xc0, 0x88, 0x5a, 0x5d, 0x2a, 0x76, 0x28, - 0x97, 0x7a, 0x0e, 0xc6, 0x5c, 0x91, 0xca, 0x96, 0xaa, 0xd7, 0x84, 0x6f, 0x9e, 0xee, 0x25, 0xc9, - 0x5c, 0x49, 0xd0, 0x29, 0x84, 0x4c, 0x19, 0xc5, 0x81, 0x32, 0x2a, 0x02, 0x18, 0x3a, 0x36, 0xb6, - 0xcb, 0x55, 0x5c, 0xa9, 0x67, 0x12, 0x1d, 0xac, 0xb4, 0x4a, 0x50, 0x5a, 0xac, 0x64, 0x30, 0x68, - 0xa5, 0x8e, 0x9e, 0xf4, 0x5c, 0x6d, 0xa8, 0x83, 0xa7, 0x2c, 0xb3, 0x41, 0xd6, 0xe2, 0x6d, 0x9b, - 0x30, 0x6a, 0x61, 0xe2, 0xf7, 0xb8, 0xca, 0x35, 0x4b, 0x52, 0x21, 0xe6, 0x7a, 0x6a, 0xa6, 0x70, - 0x32, 0xa6, 0xd8, 0x88, 0xe5, 0x2f, 0xa2, 0xbb, 0xc0, 0x05, 0x94, 0xa9, 0x5b, 0x01, 0x8d, 0x42, - 0x29, 0x01, 0x5c, 0x51, 0x1b, 0x38, 0x7b, 0x0d, 0x46, 0x83, 0xe6, 0x41, 0x93, 0x10, 0xb7, 0x1d, - 0xd5, 0x72, 0xa8, 0x17, 0xc6, 0x15, 0x56, 0x40, 0x69, 0x88, 0x62, 0xbd, 0x4a, 0xa3, 0x5c, 0x5c, - 0x21, 0x3f, 0xd1, 0x5b, 0x3d, 0x85, 0xa3, 0x54, 0xe1, 0x7b, 0x5b, 0x7b, 0x34, 0xc0, 0x39, 0xac, - 0x77, 0xf6, 0x71, 0x18, 0x09, 0x28, 0xd0, 0x6f, 0xd3, 0xf2, 0xbb, 0xe0, 0x48, 0x5b, 0xd6, 0xe8, - 0x39, 0x98, 0x6c, 0xea, 0x9a, 0xee, 0x60, 0xcb, 0xb4, 0x30, 0xf1, 0x58, 0xd6, 0x54, 0xe6, 0x3f, - 0x0c, 0x75, 0xf0, 0xb9, 0x4d, 0x3f, 0x36, 0xe3, 0xa2, 0x4c, 0x34, 0x5b, 0x81, 0xa7, 0x92, 0x89, - 0xef, 0x0d, 0xa5, 0x5f, 0x7a, 0xe9, 0xa5, 0x97, 0x22, 0xf2, 0xd7, 0x06, 0x61, 0xb2, 0xdd, 0x98, - 0x69, 0x3b, 0x7c, 0xa7, 0x60, 0x50, 0x6f, 0x36, 0xb6, 0xb0, 0x45, 0x8d, 0x14, 0x57, 0x78, 0x09, - 0xe5, 0x21, 0x5e, 0x57, 0xb7, 0x70, 0x3d, 0x13, 0x9b, 0x95, 0x4e, 0x8e, 0x9e, 0x79, 0xa0, 0xaf, - 0x51, 0x39, 0xb7, 0x44, 0x48, 0x14, 0x46, 0x89, 0xde, 0x02, 0x31, 0x1e, 0xa2, 0x09, 0x87, 0x53, - 0xfd, 0x71, 0x20, 0x63, 0x49, 0xa1, 0x74, 0xe8, 0x18, 0x24, 0xc9, 0x5f, 0xe6, 0x1b, 0x83, 0x54, - 0xe6, 0x04, 0x01, 0x10, 0xbf, 0x40, 0x59, 0x48, 0xd0, 0x61, 0x52, 0xc5, 0x62, 0x6a, 0x73, 0xcb, - 0xc4, 0xb1, 0xaa, 0x78, 0x5b, 0x6d, 0xd6, 0x9d, 0xf2, 0x15, 0xb5, 0xde, 0xc4, 0xd4, 0xe1, 0x93, - 0x4a, 0x8a, 0x03, 0x2f, 0x13, 0x18, 0x9a, 0x81, 0x61, 0x36, 0xaa, 0x34, 0xbd, 0x8a, 0xf7, 0x68, - 0xf4, 0x8c, 0x2b, 0x6c, 0xa0, 0x2d, 0x12, 0x08, 0x69, 0xfe, 0x05, 0xdb, 0xd0, 0x85, 0x6b, 0xd2, - 0x26, 0x08, 0x80, 0x36, 0xff, 0x78, 0x38, 0x70, 0x9f, 0x68, 0xaf, 0x5e, 0xcb, 0x58, 0xba, 0x0f, - 0xc6, 0x28, 0xc6, 0xa3, 0xbc, 0xeb, 0xd5, 0x7a, 0x66, 0x7c, 0x56, 0x3a, 0x99, 0x50, 0x46, 0x19, - 0x78, 0x95, 0x43, 0xe5, 0xaf, 0x44, 0x20, 0x46, 0x03, 0xcb, 0x18, 0x0c, 0x6f, 0xbc, 0x6d, 0xad, - 0x54, 0x2e, 0xae, 0x6e, 0x16, 0x96, 0x4a, 0x69, 0x09, 0x8d, 0x02, 0x50, 0xc0, 0x85, 0xa5, 0xd5, - 0xfc, 0x46, 0x3a, 0xe2, 0x96, 0x17, 0x57, 0x36, 0xce, 0x3d, 0x96, 0x8e, 0xba, 0x04, 0x9b, 0x0c, - 0x10, 0xf3, 0x23, 0x3c, 0x7a, 0x26, 0x1d, 0x47, 0x69, 0x48, 0x31, 0x06, 0x8b, 0xcf, 0x95, 0x8a, - 0xe7, 0x1e, 0x4b, 0x0f, 0x06, 0x21, 0x8f, 0x9e, 0x49, 0x0f, 0xa1, 0x11, 0x48, 0x52, 0x48, 0x61, - 0x75, 0x75, 0x29, 0x9d, 0x70, 0x79, 0xae, 0x6f, 0x28, 0x8b, 0x2b, 0x0b, 0xe9, 0xa4, 0xcb, 0x73, - 0x41, 0x59, 0xdd, 0x5c, 0x4b, 0x83, 0xcb, 0x61, 0xb9, 0xb4, 0xbe, 0x9e, 0x5f, 0x28, 0xa5, 0x87, - 0x5d, 0x8c, 0xc2, 0xdb, 0x36, 0x4a, 0xeb, 0xe9, 0x54, 0x40, 0xac, 0x47, 0xcf, 0xa4, 0x47, 0xdc, - 0x26, 0x4a, 0x2b, 0x9b, 0xcb, 0xe9, 0x51, 0x34, 0x0e, 0x23, 0xac, 0x09, 0x21, 0xc4, 0x58, 0x08, - 0x74, 0xee, 0xb1, 0x74, 0xda, 0x13, 0x84, 0x71, 0x19, 0x0f, 0x00, 0xce, 0x3d, 0x96, 0x46, 0xf2, - 0x3c, 0xc4, 0xa9, 0x1b, 0x22, 0x04, 0xa3, 0x4b, 0xf9, 0x42, 0x69, 0xa9, 0xbc, 0xba, 0xb6, 0xb1, - 0xb8, 0xba, 0x92, 0x5f, 0x4a, 0x4b, 0x1e, 0x4c, 0x29, 0x3d, 0xb3, 0xb9, 0xa8, 0x94, 0x8a, 0xe9, - 0x88, 0x1f, 0xb6, 0x56, 0xca, 0x6f, 0x94, 0x8a, 0xe9, 0xa8, 0x5c, 0x81, 0xc9, 0x76, 0x01, 0xb5, - 0xed, 0x10, 0xf2, 0xf9, 0x42, 0xa4, 0x83, 0x2f, 0x50, 0x5e, 0x61, 0x5f, 0x90, 0xbf, 0x1b, 0x81, - 0x89, 0x36, 0x93, 0x4a, 0xdb, 0x46, 0x9e, 0x82, 0x38, 0xf3, 0x65, 0x36, 0xcd, 0xde, 0xdf, 0x76, - 0x76, 0xa2, 0x9e, 0xdd, 0x32, 0xd5, 0x52, 0x3a, 0x7f, 0xaa, 0x11, 0xed, 0x90, 0x6a, 0x10, 0x16, - 0x2d, 0x0e, 0xfb, 0x73, 0x2d, 0xc1, 0x9f, 0xcd, 0x8f, 0xe7, 0xfa, 0x99, 0x1f, 0x29, 0xec, 0x60, - 0x93, 0x40, 0xbc, 0xcd, 0x24, 0x70, 0x1e, 0xc6, 0x5b, 0x18, 0xf5, 0x1d, 0x8c, 0xdf, 0x27, 0x41, - 0xa6, 0x93, 0x71, 0x7a, 0x84, 0xc4, 0x48, 0x20, 0x24, 0x9e, 0x0f, 0x5b, 0xf0, 0xce, 0xce, 0x9d, - 0xd0, 0xd2, 0xd7, 0x9f, 0x95, 0x60, 0xaa, 0x7d, 0x4a, 0xd9, 0x56, 0x86, 0xb7, 0xc0, 0x60, 0x03, - 0x3b, 0x3b, 0x86, 0x48, 0xab, 0xee, 0x6d, 0x33, 0x59, 0x93, 0xea, 0x70, 0x67, 0x73, 0x2a, 0xff, - 0x6c, 0x1f, 0xed, 0x94, 0x17, 0x32, 0x69, 0x5a, 0x24, 0xfd, 0x50, 0x04, 0x8e, 0xb4, 0x65, 0xde, - 0x56, 0xd0, 0x13, 0x00, 0x9a, 0x6e, 0x36, 0x1d, 0x96, 0x3a, 0xb1, 0x48, 0x9c, 0xa4, 0x10, 0x1a, - 0xbc, 0x48, 0x94, 0x6d, 0x3a, 0x6e, 0x7d, 0x94, 0xd6, 0x03, 0x03, 0x51, 0x84, 0x27, 0x3c, 0x41, - 0x63, 0x54, 0xd0, 0xe9, 0x0e, 0x9a, 0xb6, 0x38, 0xe6, 0xc3, 0x90, 0xae, 0xd4, 0x35, 0xac, 0x3b, - 0x65, 0xdb, 0xb1, 0xb0, 0xda, 0xd0, 0xf4, 0x1a, 0x9d, 0x6a, 0x12, 0xb9, 0xf8, 0xb6, 0x5a, 0xb7, - 0xb1, 0x32, 0xc6, 0xaa, 0xd7, 0x45, 0x2d, 0xa1, 0xa0, 0x0e, 0x64, 0xf9, 0x28, 0x06, 0x03, 0x14, - 0xac, 0xda, 0xa5, 0x90, 0x3f, 0x92, 0x84, 0x61, 0x5f, 0x02, 0x8e, 0xee, 0x84, 0xd4, 0x0b, 0xea, - 0x15, 0xb5, 0x2c, 0x16, 0x55, 0xcc, 0x12, 0xc3, 0x04, 0xb6, 0xc6, 0x17, 0x56, 0x0f, 0xc3, 0x24, - 0x45, 0x31, 0x9a, 0x0e, 0xb6, 0xca, 0x95, 0xba, 0x6a, 0xdb, 0xd4, 0x68, 0x09, 0x8a, 0x8a, 0x48, - 0xdd, 0x2a, 0xa9, 0x9a, 0x17, 0x35, 0xe8, 0x2c, 0x4c, 0x50, 0x8a, 0x46, 0xb3, 0xee, 0x68, 0x66, - 0x1d, 0x97, 0xc9, 0x32, 0xcf, 0xa6, 0x53, 0x8e, 0x2b, 0xd9, 0x38, 0xc1, 0x58, 0xe6, 0x08, 0x44, - 0x22, 0x1b, 0x15, 0xe1, 0x04, 0x25, 0xab, 0x61, 0x1d, 0x5b, 0xaa, 0x83, 0xcb, 0xf8, 0xc5, 0xa6, - 0x5a, 0xb7, 0xcb, 0xaa, 0x5e, 0x2d, 0xef, 0xa8, 0xf6, 0x4e, 0x66, 0x92, 0x30, 0x28, 0x44, 0x32, - 0x92, 0x72, 0x94, 0x20, 0x2e, 0x70, 0xbc, 0x12, 0x45, 0xcb, 0xeb, 0xd5, 0x8b, 0xaa, 0xbd, 0x83, - 0x72, 0x30, 0x45, 0xb9, 0xd8, 0x8e, 0xa5, 0xe9, 0xb5, 0x72, 0x65, 0x07, 0x57, 0x76, 0xcb, 0x4d, - 0x67, 0xfb, 0x89, 0xcc, 0x31, 0x7f, 0xfb, 0x54, 0xc2, 0x75, 0x8a, 0x33, 0x4f, 0x50, 0x36, 0x9d, - 0xed, 0x27, 0xd0, 0x3a, 0xa4, 0x48, 0x67, 0x34, 0xb4, 0x6b, 0xb8, 0xbc, 0x6d, 0x58, 0x74, 0x0e, - 0x1d, 0x6d, 0x13, 0x9a, 0x7c, 0x16, 0x9c, 0x5b, 0xe5, 0x04, 0xcb, 0x46, 0x15, 0xe7, 0xe2, 0xeb, - 0x6b, 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, 0x16, 0x18, 0x02, 0xf7, 0x71, 0x1b, 0x3d, 0x09, - 0x47, 0x3c, 0x63, 0xf9, 0x09, 0xc7, 0x5b, 0xb4, 0x0c, 0x93, 0x9e, 0x85, 0x09, 0x73, 0xbf, 0x95, - 0x10, 0x05, 0x5a, 0x34, 0xf7, 0xc3, 0x64, 0x8f, 0xc3, 0xa4, 0xb9, 0x63, 0xb6, 0xd2, 0x9d, 0xf2, - 0xd3, 0x21, 0x73, 0xc7, 0x0c, 0x13, 0xde, 0x43, 0x57, 0xe6, 0x16, 0xae, 0xa8, 0x0e, 0xae, 0x66, - 0xee, 0xf0, 0xa3, 0xfb, 0x2a, 0xd0, 0x1c, 0xa4, 0x2b, 0x95, 0x32, 0xd6, 0xd5, 0xad, 0x3a, 0x2e, - 0xab, 0x16, 0xd6, 0x55, 0x3b, 0x33, 0x43, 0x91, 0x63, 0x8e, 0xd5, 0xc4, 0xca, 0x68, 0xa5, 0x52, - 0xa2, 0x95, 0x79, 0x5a, 0x87, 0x4e, 0xc1, 0xb8, 0xb1, 0xf5, 0x42, 0x85, 0x79, 0x64, 0xd9, 0xb4, - 0xf0, 0xb6, 0xb6, 0x97, 0xb9, 0x9b, 0x9a, 0x77, 0x8c, 0x54, 0x50, 0x7f, 0x5c, 0xa3, 0x60, 0x74, - 0x3f, 0xa4, 0x2b, 0xf6, 0x8e, 0x6a, 0x99, 0x34, 0x24, 0xdb, 0xa6, 0x5a, 0xc1, 0x99, 0x7b, 0x18, - 0x2a, 0x83, 0xaf, 0x08, 0x30, 0x19, 0x11, 0xf6, 0x55, 0x6d, 0xdb, 0x11, 0x1c, 0xef, 0x63, 0x23, - 0x82, 0xc2, 0x38, 0xb7, 0x93, 0x90, 0x26, 0x96, 0x08, 0x34, 0x7c, 0x92, 0xa2, 0x8d, 0x9a, 0x3b, - 0xa6, 0xbf, 0xdd, 0xbb, 0x60, 0x84, 0x60, 0x7a, 0x8d, 0xde, 0xcf, 0x12, 0x37, 0x73, 0xc7, 0xd7, - 0xe2, 0x63, 0x30, 0x45, 0x90, 0x1a, 0xd8, 0x51, 0xab, 0xaa, 0xa3, 0xfa, 0xb0, 0x1f, 0xa4, 0xd8, - 0xc4, 0xec, 0xcb, 0xbc, 0x32, 0x20, 0xa7, 0xd5, 0xdc, 0xda, 0x77, 0x1d, 0xeb, 0x21, 0x26, 0x27, - 0x81, 0x09, 0xd7, 0xba, 0x6d, 0xc9, 0xb9, 0x9c, 0x83, 0x94, 0xdf, 0xef, 0x51, 0x12, 0x98, 0xe7, - 0xa7, 0x25, 0x92, 0x04, 0xcd, 0xaf, 0x16, 0x49, 0xfa, 0xf2, 0x7c, 0x29, 0x1d, 0x21, 0x69, 0xd4, - 0xd2, 0xe2, 0x46, 0xa9, 0xac, 0x6c, 0xae, 0x6c, 0x2c, 0x2e, 0x97, 0xd2, 0x51, 0x5f, 0x62, 0xff, - 0x74, 0x2c, 0x71, 0x6f, 0xfa, 0x3e, 0xf9, 0xdb, 0x11, 0x18, 0x0d, 0xae, 0xd4, 0xd0, 0x9b, 0xe0, - 0x0e, 0xb1, 0xad, 0x62, 0x63, 0xa7, 0x7c, 0x55, 0xb3, 0xe8, 0x80, 0x6c, 0xa8, 0x6c, 0x72, 0x74, - 0xfd, 0x67, 0x92, 0x63, 0xad, 0x63, 0xe7, 0x59, 0xcd, 0x22, 0xc3, 0xad, 0xa1, 0x3a, 0x68, 0x09, - 0x66, 0x74, 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, 0xce, 0x91, 0xbd, 0x19, 0x22, - 0xcf, 0x51, 0x43, 0xee, 0x1b, 0xed, 0xe4, 0xbe, 0xc7, 0x20, 0xd9, 0x50, 0xcd, 0x32, 0xd6, 0x1d, - 0x6b, 0x9f, 0xe6, 0xe7, 0x09, 0x25, 0xd1, 0x50, 0xcd, 0x12, 0x29, 0xff, 0x44, 0x96, 0x49, 0x4f, - 0xc7, 0x12, 0x89, 0x74, 0xf2, 0xe9, 0x58, 0x22, 0x99, 0x06, 0xf9, 0xb5, 0x28, 0xa4, 0xfc, 0xf9, - 0x3a, 0x59, 0xfe, 0x54, 0xe8, 0x8c, 0x25, 0xd1, 0x98, 0x76, 0x57, 0xd7, 0xec, 0x7e, 0x6e, 0x9e, - 0x4c, 0x65, 0xb9, 0x41, 0x96, 0x1c, 0x2b, 0x8c, 0x92, 0xa4, 0x11, 0xc4, 0xd9, 0x30, 0x4b, 0x46, - 0x12, 0x0a, 0x2f, 0xa1, 0x05, 0x18, 0x7c, 0xc1, 0xa6, 0xbc, 0x07, 0x29, 0xef, 0xbb, 0xbb, 0xf3, - 0x7e, 0x7a, 0x9d, 0x32, 0x4f, 0x3e, 0xbd, 0x5e, 0x5e, 0x59, 0x55, 0x96, 0xf3, 0x4b, 0x0a, 0x27, - 0x47, 0x47, 0x21, 0x56, 0x57, 0xaf, 0xed, 0x07, 0x27, 0x3d, 0x0a, 0xea, 0xb7, 0x13, 0x8e, 0x42, - 0xec, 0x2a, 0x56, 0x77, 0x83, 0x53, 0x0d, 0x05, 0xdd, 0xc6, 0xc1, 0x70, 0x1a, 0xe2, 0xd4, 0x5e, - 0x08, 0x80, 0x5b, 0x2c, 0x3d, 0x80, 0x12, 0x10, 0x9b, 0x5f, 0x55, 0xc8, 0x80, 0x48, 0x43, 0x8a, - 0x41, 0xcb, 0x6b, 0x8b, 0xa5, 0xf9, 0x52, 0x3a, 0x22, 0x9f, 0x85, 0x41, 0x66, 0x04, 0x32, 0x58, - 0x5c, 0x33, 0xa4, 0x07, 0x78, 0x91, 0xf3, 0x90, 0x44, 0xed, 0xe6, 0x72, 0xa1, 0xa4, 0xa4, 0x23, - 0xc1, 0xae, 0x8e, 0xa5, 0xe3, 0xb2, 0x0d, 0x29, 0x7f, 0x1e, 0xfe, 0x93, 0x59, 0x8c, 0x7f, 0x55, - 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, 0x84, 0x86, 0x48, 0x3c, 0x3d, 0x28, - 0x7f, 0x4a, 0x82, 0x74, 0x38, 0xb1, 0x0d, 0x89, 0x29, 0xfd, 0x34, 0xc5, 0x94, 0x3f, 0x29, 0xc1, - 0x68, 0x30, 0x9b, 0x0d, 0x89, 0x77, 0xe7, 0x4f, 0x55, 0xbc, 0x3f, 0x8c, 0xc0, 0x48, 0x20, 0x87, - 0xed, 0x57, 0xba, 0x17, 0x61, 0x5c, 0xab, 0xe2, 0x86, 0x69, 0x38, 0x58, 0xaf, 0xec, 0x97, 0xeb, - 0xf8, 0x0a, 0xae, 0x67, 0x64, 0x1a, 0x34, 0x4e, 0x77, 0xcf, 0x92, 0xe7, 0x16, 0x3d, 0xba, 0x25, - 0x42, 0x96, 0x9b, 0x58, 0x2c, 0x96, 0x96, 0xd7, 0x56, 0x37, 0x4a, 0x2b, 0xf3, 0x6f, 0x2b, 0x6f, - 0xae, 0x5c, 0x5a, 0x59, 0x7d, 0x76, 0x45, 0x49, 0x6b, 0x21, 0xb4, 0xdb, 0x38, 0xec, 0xd7, 0x20, - 0x1d, 0x16, 0x0a, 0xdd, 0x01, 0xed, 0xc4, 0x4a, 0x0f, 0xa0, 0x09, 0x18, 0x5b, 0x59, 0x2d, 0xaf, - 0x2f, 0x16, 0x4b, 0xe5, 0xd2, 0x85, 0x0b, 0xa5, 0xf9, 0x8d, 0x75, 0xb6, 0xef, 0xe1, 0x62, 0x6f, - 0x04, 0x06, 0xb8, 0xfc, 0x4a, 0x14, 0x26, 0xda, 0x48, 0x82, 0xf2, 0x7c, 0xc5, 0xc2, 0x16, 0x51, - 0x0f, 0xf5, 0x23, 0xfd, 0x1c, 0xc9, 0x19, 0xd6, 0x54, 0xcb, 0xe1, 0x0b, 0x9c, 0xfb, 0x81, 0x58, - 0x49, 0x77, 0xb4, 0x6d, 0x0d, 0x5b, 0x7c, 0x3f, 0x89, 0x2d, 0x63, 0xc6, 0x3c, 0x38, 0xdb, 0x52, - 0x7a, 0x10, 0x90, 0x69, 0xd8, 0x9a, 0xa3, 0x5d, 0xc1, 0x65, 0x4d, 0x17, 0x9b, 0x4f, 0x64, 0x59, - 0x13, 0x53, 0xd2, 0xa2, 0x66, 0x51, 0x77, 0x5c, 0x6c, 0x1d, 0xd7, 0xd4, 0x10, 0x36, 0x09, 0xe6, - 0x51, 0x25, 0x2d, 0x6a, 0x5c, 0xec, 0x3b, 0x21, 0x55, 0x35, 0x9a, 0x24, 0xd7, 0x63, 0x78, 0x64, - 0xee, 0x90, 0x94, 0x61, 0x06, 0x73, 0x51, 0x78, 0x16, 0xef, 0xed, 0x7a, 0xa5, 0x94, 0x61, 0x06, - 0x63, 0x28, 0xf7, 0xc1, 0x98, 0x5a, 0xab, 0x59, 0x84, 0xb9, 0x60, 0xc4, 0xd6, 0x25, 0xa3, 0x2e, - 0x98, 0x22, 0x66, 0x9f, 0x86, 0x84, 0xb0, 0x03, 0x99, 0xaa, 0x89, 0x25, 0xca, 0x26, 0x5b, 0x6c, - 0x47, 0x4e, 0x26, 0x95, 0x84, 0x2e, 0x2a, 0xef, 0x84, 0x94, 0x66, 0x97, 0xbd, 0x4d, 0xfc, 0xc8, - 0x6c, 0xe4, 0x64, 0x42, 0x19, 0xd6, 0x6c, 0x77, 0x03, 0x54, 0xfe, 0x6c, 0x04, 0x46, 0x83, 0x87, - 0x10, 0xa8, 0x08, 0x89, 0xba, 0x51, 0x51, 0xa9, 0x6b, 0xb1, 0x13, 0xb0, 0x93, 0x3d, 0xce, 0x2d, - 0xe6, 0x96, 0x38, 0xbe, 0xe2, 0x52, 0x66, 0xff, 0xb9, 0x04, 0x09, 0x01, 0x46, 0x53, 0x10, 0x33, - 0x55, 0x67, 0x87, 0xb2, 0x8b, 0x17, 0x22, 0x69, 0x49, 0xa1, 0x65, 0x02, 0xb7, 0x4d, 0x55, 0xa7, - 0x2e, 0xc0, 0xe1, 0xa4, 0x4c, 0xfa, 0xb5, 0x8e, 0xd5, 0x2a, 0x5d, 0xf4, 0x18, 0x8d, 0x06, 0xd6, - 0x1d, 0x5b, 0xf4, 0x2b, 0x87, 0xcf, 0x73, 0x30, 0x7a, 0x00, 0xc6, 0x1d, 0x4b, 0xd5, 0xea, 0x01, - 0xdc, 0x18, 0xc5, 0x4d, 0x8b, 0x0a, 0x17, 0x39, 0x07, 0x47, 0x05, 0xdf, 0x2a, 0x76, 0xd4, 0xca, - 0x0e, 0xae, 0x7a, 0x44, 0x83, 0x74, 0x73, 0xe3, 0x0e, 0x8e, 0x50, 0xe4, 0xf5, 0x82, 0x56, 0xfe, - 0xb6, 0x04, 0xe3, 0x62, 0x99, 0x56, 0x75, 0x8d, 0xb5, 0x0c, 0xa0, 0xea, 0xba, 0xe1, 0xf8, 0xcd, - 0xd5, 0xea, 0xca, 0x2d, 0x74, 0x73, 0x79, 0x97, 0x48, 0xf1, 0x31, 0xc8, 0x36, 0x00, 0xbc, 0x9a, - 0x8e, 0x66, 0x9b, 0x81, 0x61, 0x7e, 0xc2, 0x44, 0x8f, 0x29, 0xd9, 0xc2, 0x1e, 0x18, 0x88, 0xac, - 0xe7, 0xd0, 0x24, 0xc4, 0xb7, 0x70, 0x4d, 0xd3, 0xf9, 0xbe, 0x31, 0x2b, 0x88, 0xed, 0x97, 0x98, - 0xbb, 0xfd, 0x52, 0xf8, 0xff, 0x61, 0xa2, 0x62, 0x34, 0xc2, 0xe2, 0x16, 0xd2, 0xa1, 0xcd, 0x05, - 0xfb, 0xa2, 0xf4, 0xfc, 0x43, 0x1c, 0xa9, 0x66, 0xd4, 0x55, 0xbd, 0x36, 0x67, 0x58, 0x35, 0xef, - 0x98, 0x95, 0x64, 0x3c, 0xb6, 0xef, 0xb0, 0xd5, 0xdc, 0xfa, 0x53, 0x49, 0xfa, 0xe5, 0x48, 0x74, - 0x61, 0xad, 0xf0, 0xb9, 0x48, 0x76, 0x81, 0x11, 0xae, 0x09, 0x63, 0x28, 0x78, 0xbb, 0x8e, 0x2b, - 0x44, 0x41, 0xf8, 0xfe, 0x03, 0x30, 0x59, 0x33, 0x6a, 0x06, 0xe5, 0x74, 0x9a, 0xfc, 0xe2, 0xe7, - 0xb4, 0x49, 0x17, 0x9a, 0xed, 0x79, 0xa8, 0x9b, 0x5b, 0x81, 0x09, 0x8e, 0x5c, 0xa6, 0x07, 0x45, - 0x6c, 0x19, 0x83, 0xba, 0xee, 0xa1, 0x65, 0xbe, 0xf8, 0x3a, 0x9d, 0xbe, 0x95, 0x71, 0x4e, 0x4a, - 0xea, 0xd8, 0x4a, 0x27, 0xa7, 0xc0, 0x91, 0x00, 0x3f, 0x36, 0x48, 0xb1, 0xd5, 0x83, 0xe3, 0x6f, - 0x71, 0x8e, 0x13, 0x3e, 0x8e, 0xeb, 0x9c, 0x34, 0x37, 0x0f, 0x23, 0x07, 0xe1, 0xf5, 0x4f, 0x38, - 0xaf, 0x14, 0xf6, 0x33, 0x59, 0x80, 0x31, 0xca, 0xa4, 0xd2, 0xb4, 0x1d, 0xa3, 0x41, 0x23, 0x60, - 0x77, 0x36, 0xbf, 0xfd, 0x3a, 0x1b, 0x35, 0xa3, 0x84, 0x6c, 0xde, 0xa5, 0xca, 0xe5, 0x80, 0x9e, - 0x8d, 0x55, 0x71, 0xa5, 0xde, 0x83, 0xc3, 0xd7, 0xb9, 0x20, 0x2e, 0x7e, 0xee, 0x32, 0x4c, 0x92, - 0xdf, 0x34, 0x40, 0xf9, 0x25, 0xe9, 0xbd, 0xe1, 0x96, 0xf9, 0xf6, 0xfb, 0xd8, 0xc0, 0x9c, 0x70, - 0x19, 0xf8, 0x64, 0xf2, 0xf5, 0x62, 0x0d, 0x3b, 0x0e, 0xb6, 0xec, 0xb2, 0x5a, 0x6f, 0x27, 0x9e, - 0x6f, 0xc7, 0x22, 0xf3, 0xf1, 0x1f, 0x04, 0x7b, 0x71, 0x81, 0x51, 0xe6, 0xeb, 0xf5, 0xdc, 0x26, - 0xdc, 0xd1, 0xc6, 0x2b, 0xfa, 0xe0, 0xf9, 0x0a, 0xe7, 0x39, 0xd9, 0xe2, 0x19, 0x84, 0xed, 0x1a, - 0x08, 0xb8, 0xdb, 0x97, 0x7d, 0xf0, 0xfc, 0x04, 0xe7, 0x89, 0x38, 0xad, 0xe8, 0x52, 0xc2, 0xf1, - 0x69, 0x18, 0xbf, 0x82, 0xad, 0x2d, 0xc3, 0xe6, 0xbb, 0x44, 0x7d, 0xb0, 0xfb, 0x24, 0x67, 0x37, - 0xc6, 0x09, 0xe9, 0xb6, 0x11, 0xe1, 0xf5, 0x24, 0x24, 0xb6, 0xd5, 0x0a, 0xee, 0x83, 0xc5, 0x75, - 0xce, 0x62, 0x88, 0xe0, 0x13, 0xd2, 0x3c, 0xa4, 0x6a, 0x06, 0x9f, 0xa3, 0x7a, 0x93, 0x7f, 0x8a, - 0x93, 0x0f, 0x0b, 0x1a, 0xce, 0xc2, 0x34, 0xcc, 0x66, 0x9d, 0x4c, 0x60, 0xbd, 0x59, 0xfc, 0x35, - 0xc1, 0x42, 0xd0, 0x70, 0x16, 0x07, 0x30, 0xeb, 0xab, 0x82, 0x85, 0xed, 0xb3, 0xe7, 0x53, 0x30, - 0x6c, 0xe8, 0xf5, 0x7d, 0x43, 0xef, 0x47, 0x88, 0x4f, 0x73, 0x0e, 0xc0, 0x49, 0x08, 0x83, 0xf3, - 0x90, 0xec, 0xb7, 0x23, 0xfe, 0xfa, 0x0f, 0xc4, 0xf0, 0x10, 0x3d, 0xb0, 0x00, 0x63, 0x22, 0x40, - 0x69, 0x86, 0xde, 0x07, 0x8b, 0xbf, 0xc1, 0x59, 0x8c, 0xfa, 0xc8, 0xb8, 0x1a, 0x0e, 0xb6, 0x9d, - 0x1a, 0xee, 0x87, 0xc9, 0x67, 0x85, 0x1a, 0x9c, 0x84, 0x9b, 0x72, 0x0b, 0xeb, 0x95, 0x9d, 0xfe, - 0x38, 0xfc, 0xaa, 0x30, 0xa5, 0xa0, 0x21, 0x2c, 0xe6, 0x61, 0xa4, 0xa1, 0x5a, 0xf6, 0x8e, 0x5a, - 0xef, 0xab, 0x3b, 0xfe, 0x26, 0xe7, 0x91, 0x72, 0x89, 0xb8, 0x45, 0x9a, 0xfa, 0x41, 0xd8, 0x7c, - 0x4e, 0x58, 0xc4, 0x47, 0xc6, 0x87, 0x9e, 0xed, 0xd0, 0x2d, 0xb5, 0x83, 0x70, 0xfb, 0x35, 0x31, - 0xf4, 0x18, 0xed, 0xb2, 0x9f, 0xe3, 0x79, 0x48, 0xda, 0xda, 0xb5, 0xbe, 0xd8, 0x7c, 0x5e, 0xf4, - 0x34, 0x25, 0x20, 0xc4, 0x6f, 0x83, 0xa3, 0x6d, 0xa7, 0x89, 0x3e, 0x98, 0xfd, 0x2d, 0xce, 0x6c, - 0xaa, 0xcd, 0x54, 0xc1, 0x43, 0xc2, 0x41, 0x59, 0xfe, 0x6d, 0x11, 0x12, 0x70, 0x88, 0xd7, 0x1a, - 0x59, 0x35, 0xd8, 0xea, 0xf6, 0xc1, 0xac, 0xf6, 0xeb, 0xc2, 0x6a, 0x8c, 0x36, 0x60, 0xb5, 0x0d, - 0x98, 0xe2, 0x1c, 0x0f, 0xd6, 0xaf, 0x5f, 0x10, 0x81, 0x95, 0x51, 0x6f, 0x06, 0x7b, 0xf7, 0xed, - 0x90, 0x75, 0xcd, 0x29, 0xd2, 0x53, 0xbb, 0xdc, 0x50, 0xcd, 0x3e, 0x38, 0x7f, 0x91, 0x73, 0x16, - 0x11, 0xdf, 0xcd, 0x6f, 0xed, 0x65, 0xd5, 0x24, 0xcc, 0x9f, 0x83, 0x8c, 0x60, 0xde, 0xd4, 0x2d, - 0x5c, 0x31, 0x6a, 0xba, 0x76, 0x0d, 0x57, 0xfb, 0x60, 0xfd, 0x1b, 0xa1, 0xae, 0xda, 0xf4, 0x91, - 0x13, 0xce, 0x8b, 0x90, 0x76, 0x73, 0x95, 0xb2, 0xd6, 0x30, 0x0d, 0xcb, 0xe9, 0xc1, 0xf1, 0x4b, - 0xa2, 0xa7, 0x5c, 0xba, 0x45, 0x4a, 0x96, 0x2b, 0x01, 0x3b, 0x67, 0xee, 0xd7, 0x25, 0xbf, 0xcc, - 0x19, 0x8d, 0x78, 0x54, 0x3c, 0x70, 0x54, 0x8c, 0x86, 0xa9, 0x5a, 0xfd, 0xc4, 0xbf, 0xbf, 0x23, - 0x02, 0x07, 0x27, 0xe1, 0x81, 0x83, 0x64, 0x74, 0x64, 0xb6, 0xef, 0x83, 0xc3, 0x57, 0x44, 0xe0, - 0x10, 0x34, 0x9c, 0x85, 0x48, 0x18, 0xfa, 0x60, 0xf1, 0x77, 0x05, 0x0b, 0x41, 0x43, 0x58, 0x3c, - 0xe3, 0x4d, 0xb4, 0x16, 0xae, 0x69, 0xb6, 0x63, 0xb1, 0xa4, 0xb8, 0x3b, 0xab, 0xbf, 0xf7, 0x83, - 0x60, 0x12, 0xa6, 0xf8, 0x48, 0x49, 0x24, 0xe2, 0x9b, 0xac, 0x74, 0xcd, 0xd4, 0x5b, 0xb0, 0xdf, - 0x14, 0x91, 0xc8, 0x47, 0x46, 0x64, 0xf3, 0x65, 0x88, 0xc4, 0xec, 0x15, 0xb2, 0x52, 0xe8, 0x83, - 0xdd, 0xdf, 0x0f, 0x09, 0xb7, 0x2e, 0x68, 0x09, 0x4f, 0x5f, 0xfe, 0xd3, 0xd4, 0x77, 0xf1, 0x7e, - 0x5f, 0xde, 0xf9, 0x0f, 0x42, 0xf9, 0xcf, 0x26, 0xa3, 0x64, 0x31, 0x64, 0x2c, 0x94, 0x4f, 0xa1, - 0x5e, 0xb7, 0x8a, 0x32, 0xef, 0xf9, 0x11, 0xd7, 0x37, 0x98, 0x4e, 0xe5, 0x96, 0x88, 0x93, 0x07, - 0x93, 0x9e, 0xde, 0xcc, 0xde, 0xf7, 0x23, 0xd7, 0xcf, 0x03, 0x39, 0x4f, 0xee, 0x02, 0x8c, 0x04, - 0x12, 0x9e, 0xde, 0xac, 0xde, 0xcf, 0x59, 0xa5, 0xfc, 0xf9, 0x4e, 0xee, 0x2c, 0xc4, 0x48, 0xf2, - 0xd2, 0x9b, 0xfc, 0x2f, 0x70, 0x72, 0x8a, 0x9e, 0x7b, 0x33, 0x24, 0x44, 0xd2, 0xd2, 0x9b, 0xf4, - 0x03, 0x9c, 0xd4, 0x25, 0x21, 0xe4, 0x22, 0x61, 0xe9, 0x4d, 0xfe, 0x17, 0x05, 0xb9, 0x20, 0x21, - 0xe4, 0xfd, 0x9b, 0xf0, 0xab, 0x3f, 0x1f, 0xe3, 0x93, 0x8e, 0xb0, 0xdd, 0x79, 0x18, 0xe2, 0x99, - 0x4a, 0x6f, 0xea, 0x0f, 0xf1, 0xc6, 0x05, 0x45, 0xee, 0x71, 0x88, 0xf7, 0x69, 0xf0, 0x5f, 0xe0, - 0xa4, 0x0c, 0x3f, 0x37, 0x0f, 0xc3, 0xbe, 0xec, 0xa4, 0x37, 0xf9, 0x5f, 0xe2, 0xe4, 0x7e, 0x2a, - 0x22, 0x3a, 0xcf, 0x4e, 0x7a, 0x33, 0xf8, 0x45, 0x21, 0x3a, 0xa7, 0x20, 0x66, 0x13, 0x89, 0x49, - 0x6f, 0xea, 0x0f, 0x0b, 0xab, 0x0b, 0x92, 0xdc, 0x53, 0x90, 0x74, 0x27, 0x9b, 0xde, 0xf4, 0x1f, - 0xe1, 0xf4, 0x1e, 0x0d, 0xb1, 0x80, 0x6f, 0xb2, 0xeb, 0xcd, 0xe2, 0x2f, 0x0b, 0x0b, 0xf8, 0xa8, - 0xc8, 0x30, 0x0a, 0x27, 0x30, 0xbd, 0x39, 0x7d, 0x54, 0x0c, 0xa3, 0x50, 0xfe, 0x42, 0x7a, 0x93, - 0xc6, 0xfc, 0xde, 0x2c, 0xfe, 0x8a, 0xe8, 0x4d, 0x8a, 0x4f, 0xc4, 0x08, 0x67, 0x04, 0xbd, 0x79, - 0xfc, 0x92, 0x10, 0x23, 0x94, 0x10, 0xe4, 0xd6, 0x00, 0xb5, 0x66, 0x03, 0xbd, 0xf9, 0x7d, 0x8c, - 0xf3, 0x1b, 0x6f, 0x49, 0x06, 0x72, 0xcf, 0xc2, 0x54, 0xfb, 0x4c, 0xa0, 0x37, 0xd7, 0x8f, 0xff, - 0x28, 0xb4, 0x76, 0xf3, 0x27, 0x02, 0xb9, 0x0d, 0x6f, 0x4a, 0xf1, 0x67, 0x01, 0xbd, 0xd9, 0xbe, - 0xf2, 0xa3, 0x60, 0xe0, 0xf6, 0x27, 0x01, 0xb9, 0x3c, 0x80, 0x37, 0x01, 0xf7, 0xe6, 0xf5, 0x49, - 0xce, 0xcb, 0x47, 0x44, 0x86, 0x06, 0x9f, 0x7f, 0x7b, 0xd3, 0x5f, 0x17, 0x43, 0x83, 0x53, 0x90, - 0xa1, 0x21, 0xa6, 0xde, 0xde, 0xd4, 0x9f, 0x12, 0x43, 0x43, 0x90, 0x10, 0xcf, 0xf6, 0xcd, 0x6e, - 0xbd, 0x39, 0x7c, 0x5a, 0x78, 0xb6, 0x8f, 0x2a, 0xb7, 0x02, 0xe3, 0x2d, 0x13, 0x62, 0x6f, 0x56, - 0xbf, 0xcc, 0x59, 0xa5, 0xc3, 0xf3, 0xa1, 0x7f, 0xf2, 0xe2, 0x93, 0x61, 0x6f, 0x6e, 0x9f, 0x09, - 0x4d, 0x5e, 0x7c, 0x2e, 0xcc, 0x9d, 0x87, 0x84, 0xde, 0xac, 0xd7, 0xc9, 0xe0, 0x41, 0xdd, 0x6f, - 0x02, 0x66, 0xfe, 0xe3, 0x8f, 0xb9, 0x75, 0x04, 0x41, 0xee, 0x2c, 0xc4, 0x71, 0x63, 0x0b, 0x57, - 0x7b, 0x51, 0x7e, 0xff, 0xc7, 0x22, 0x60, 0x12, 0xec, 0xdc, 0x53, 0x00, 0x6c, 0x6b, 0x84, 0x1e, - 0x06, 0xf6, 0xa0, 0xfd, 0x4f, 0x3f, 0xe6, 0x57, 0x6f, 0x3c, 0x12, 0x8f, 0x01, 0xbb, 0xc8, 0xd3, - 0x9d, 0xc1, 0x0f, 0x82, 0x0c, 0x68, 0x8f, 0x3c, 0x09, 0x43, 0x2f, 0xd8, 0x86, 0xee, 0xa8, 0xb5, - 0x5e, 0xd4, 0xff, 0x99, 0x53, 0x0b, 0x7c, 0x62, 0xb0, 0x86, 0x61, 0x61, 0x47, 0xad, 0xd9, 0xbd, - 0x68, 0xff, 0x0b, 0xa7, 0x75, 0x09, 0x08, 0x71, 0x45, 0xb5, 0x9d, 0x7e, 0xf4, 0xfe, 0x23, 0x41, - 0x2c, 0x08, 0x88, 0xd0, 0xe4, 0xf7, 0x2e, 0xde, 0xef, 0x45, 0xfb, 0x43, 0x21, 0x34, 0xc7, 0xcf, - 0xbd, 0x19, 0x92, 0xe4, 0x27, 0xbb, 0x4f, 0xd7, 0x83, 0xf8, 0x8f, 0x39, 0xb1, 0x47, 0x41, 0x5a, - 0xb6, 0x9d, 0xaa, 0xa3, 0xf5, 0x36, 0xf6, 0x4d, 0xde, 0xd3, 0x02, 0x3f, 0x97, 0x87, 0x61, 0xdb, - 0xa9, 0x56, 0x9b, 0x3c, 0x3f, 0xed, 0x41, 0xfe, 0x27, 0x3f, 0x76, 0xb7, 0x2c, 0x5c, 0x1a, 0xd2, - 0xdb, 0x57, 0x77, 0x1d, 0xd3, 0xa0, 0x07, 0x1e, 0xbd, 0x38, 0xfc, 0x88, 0x73, 0xf0, 0x91, 0xe4, - 0xe6, 0x21, 0x45, 0x74, 0xb1, 0xb0, 0x89, 0xe9, 0xe9, 0x54, 0x0f, 0x16, 0xff, 0x95, 0x1b, 0x20, - 0x40, 0x54, 0xf8, 0xb9, 0xaf, 0xbf, 0x36, 0x2d, 0x7d, 0xeb, 0xb5, 0x69, 0xe9, 0x0f, 0x5f, 0x9b, - 0x96, 0x3e, 0xfc, 0xdd, 0xe9, 0x81, 0x6f, 0x7d, 0x77, 0x7a, 0xe0, 0xf7, 0xbe, 0x3b, 0x3d, 0xd0, - 0x7e, 0x97, 0x18, 0x16, 0x8c, 0x05, 0x83, 0xed, 0x0f, 0x3f, 0x2f, 0xd7, 0x34, 0x67, 0xa7, 0xb9, - 0x35, 0x57, 0x31, 0x1a, 0x74, 0x1b, 0xd7, 0xdb, 0xad, 0x75, 0x17, 0x39, 0xf0, 0xde, 0x28, 0x1c, - 0xad, 0x18, 0x76, 0xc3, 0xb0, 0xcb, 0x6c, 0xbf, 0x97, 0x15, 0xf8, 0x8e, 0x6f, 0xca, 0x5f, 0xd5, - 0xc7, 0xa6, 0xef, 0x45, 0x18, 0xa5, 0xaa, 0xd3, 0xed, 0x2e, 0xea, 0x6d, 0x3d, 0x03, 0xc4, 0x37, - 0xfe, 0x55, 0x9c, 0x6a, 0x3d, 0xe2, 0x12, 0xd2, 0xd3, 0xfb, 0x0d, 0x98, 0xd4, 0x1a, 0x66, 0x1d, - 0xd3, 0x6d, 0xfe, 0xb2, 0x5b, 0xd7, 0x9b, 0xdf, 0x37, 0x39, 0xbf, 0x09, 0x8f, 0x7c, 0x51, 0x50, - 0xe7, 0x96, 0x60, 0x5c, 0xad, 0x54, 0xb0, 0x19, 0x60, 0xd9, 0xa3, 0x5b, 0x84, 0x80, 0x69, 0x4e, - 0xe9, 0x72, 0x2b, 0x3c, 0xd5, 0xa9, 0x6b, 0x9e, 0xbf, 0xc7, 0x67, 0x79, 0x0b, 0xd7, 0xb0, 0xfe, - 0x90, 0x8e, 0x9d, 0xab, 0x86, 0xb5, 0xcb, 0xcd, 0xfb, 0x10, 0x6b, 0x6a, 0x90, 0xdd, 0x60, 0x86, - 0xf7, 0x47, 0x61, 0x9a, 0x55, 0x9c, 0xde, 0x52, 0x6d, 0x7c, 0xfa, 0xca, 0x23, 0x5b, 0xd8, 0x51, - 0x1f, 0x39, 0x5d, 0x31, 0x34, 0x9d, 0xf7, 0xc4, 0x04, 0xef, 0x17, 0x52, 0x3f, 0xc7, 0xeb, 0xb3, - 0x6d, 0xb7, 0xe9, 0xe5, 0x05, 0x88, 0xcd, 0x1b, 0x9a, 0x8e, 0x26, 0x21, 0x5e, 0xc5, 0xba, 0xd1, - 0xe0, 0x77, 0xee, 0x58, 0x01, 0xdd, 0x05, 0x83, 0x6a, 0xc3, 0x68, 0xea, 0x0e, 0x3b, 0xa1, 0x28, - 0x0c, 0x7f, 0xfd, 0xc6, 0xcc, 0xc0, 0xef, 0xdf, 0x98, 0x89, 0x2e, 0xea, 0x8e, 0xc2, 0xab, 0x72, - 0xb1, 0xef, 0xbd, 0x3a, 0x23, 0xc9, 0x4f, 0xc3, 0x50, 0x11, 0x57, 0x0e, 0xc3, 0xab, 0x88, 0x2b, - 0x21, 0x5e, 0xf7, 0x43, 0x62, 0x51, 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, 0xbf, 0x9b, 0x1e, 0x78, 0xe9, 0xb5, 0xe9, 0x81, 0x8e, 0x3d, 0xe1, - 0x1f, 0x03, 0xdc, 0xc4, 0xbc, 0x0b, 0xec, 0xea, 0x2e, 0x3b, 0x23, 0x71, 0xbb, 0xe1, 0x77, 0x06, - 0x41, 0xe6, 0x38, 0xb6, 0xa3, 0xee, 0x6a, 0x7a, 0xcd, 0xed, 0x09, 0xb5, 0xe9, 0xec, 0x5c, 0xe3, - 0x5d, 0x31, 0xc5, 0xbb, 0x82, 0xe3, 0x74, 0xef, 0x8d, 0x6c, 0xe7, 0xd1, 0x95, 0xed, 0xd1, 0xe7, - 0xf2, 0x3f, 0x8b, 0x02, 0x5a, 0x77, 0xd4, 0x5d, 0x9c, 0x6f, 0x3a, 0x3b, 0x86, 0xa5, 0x5d, 0x63, - 0xb1, 0x0c, 0x03, 0x34, 0xd4, 0xbd, 0xb2, 0x63, 0xec, 0x62, 0xdd, 0xa6, 0xa6, 0x19, 0x3e, 0x73, - 0x74, 0xae, 0x8d, 0x7f, 0xcc, 0x91, 0xae, 0x2b, 0x3c, 0xf0, 0xb9, 0xef, 0xcc, 0xdc, 0xd7, 0xdb, - 0x0a, 0x14, 0x99, 0x24, 0xd7, 0x7b, 0x1b, 0x94, 0x31, 0xba, 0x0c, 0xec, 0x92, 0x45, 0xb9, 0xae, - 0xd9, 0x0e, 0xbf, 0xa7, 0x7d, 0x76, 0xae, 0xbd, 0xee, 0x73, 0xad, 0x62, 0xce, 0x5d, 0x56, 0xeb, - 0x5a, 0x55, 0x75, 0x0c, 0xcb, 0xbe, 0x38, 0xa0, 0x24, 0x29, 0xab, 0x25, 0xcd, 0x76, 0xd0, 0x06, - 0x24, 0xab, 0x58, 0xdf, 0x67, 0x6c, 0xa3, 0x6f, 0x8c, 0x6d, 0x82, 0x70, 0xa2, 0x5c, 0x9f, 0x03, - 0xa4, 0xfa, 0xf1, 0xc4, 0xc3, 0x24, 0x76, 0xbf, 0xb2, 0x03, 0xfb, 0x00, 0x67, 0xfa, 0x8e, 0x62, - 0x5c, 0x0d, 0x83, 0xb2, 0xf7, 0x02, 0x78, 0x6d, 0xa2, 0x0c, 0x0c, 0xa9, 0xd5, 0xaa, 0x85, 0x6d, - 0x9b, 0x1e, 0x00, 0x26, 0x15, 0x51, 0xcc, 0x8d, 0xff, 0x8b, 0x2f, 0x3f, 0x34, 0x12, 0xe0, 0x58, - 0x48, 0x01, 0x5c, 0x71, 0x49, 0x4f, 0x7d, 0x4a, 0x82, 0xf1, 0x96, 0x16, 0x91, 0x0c, 0xd3, 0xf9, - 0xcd, 0x8d, 0x8b, 0xab, 0xca, 0xe2, 0xf3, 0xf9, 0x8d, 0xc5, 0xd5, 0x95, 0x32, 0xbb, 0xf2, 0xbf, - 0xb2, 0xbe, 0x56, 0x9a, 0x5f, 0xbc, 0xb0, 0x58, 0x2a, 0xa6, 0x07, 0xd0, 0x0c, 0x1c, 0x6b, 0x83, - 0x53, 0x2c, 0x2d, 0x95, 0x16, 0xf2, 0x1b, 0xa5, 0xb4, 0x84, 0xee, 0x84, 0x13, 0x6d, 0x99, 0xb8, - 0x28, 0x91, 0x0e, 0x28, 0x4a, 0xc9, 0x45, 0x89, 0x16, 0x2e, 0x74, 0x1c, 0x45, 0x0f, 0x76, 0xf5, - 0x9f, 0x3d, 0x77, 0xb8, 0x04, 0xc7, 0xd3, 0x7b, 0x22, 0x70, 0x34, 0x3c, 0x65, 0xa8, 0xfa, 0x7e, - 0x87, 0x57, 0x9f, 0x1d, 0xa2, 0xd9, 0x45, 0x88, 0xe6, 0xf5, 0x7d, 0x74, 0x94, 0xe5, 0xd3, 0xe5, - 0xa6, 0x55, 0xe7, 0x31, 0x68, 0x88, 0x94, 0x37, 0xad, 0x3a, 0x89, 0x4d, 0xe2, 0xa2, 0xbf, 0x74, - 0x32, 0xc5, 0x6f, 0xef, 0xe7, 0xd2, 0x1f, 0x7b, 0x75, 0x66, 0xe0, 0x0b, 0xaf, 0xce, 0x0c, 0xfc, - 0xf0, 0xd3, 0x33, 0x03, 0x2f, 0xfd, 0xc1, 0xec, 0x40, 0x61, 0x37, 0xac, 0xde, 0x57, 0x7b, 0xce, - 0xa6, 0x89, 0xbc, 0xbe, 0x4f, 0x03, 0xd1, 0x9a, 0xf4, 0x7c, 0x9c, 0x2a, 0x27, 0x0e, 0x50, 0xa7, - 0xc3, 0x07, 0xa8, 0xcf, 0xe2, 0x7a, 0xfd, 0x92, 0x6e, 0x5c, 0xa5, 0xbd, 0xea, 0xd9, 0xe0, 0xa3, - 0x11, 0x98, 0x6e, 0x99, 0x36, 0x79, 0x86, 0xd1, 0xe9, 0xf9, 0x6b, 0x0e, 0x12, 0x45, 0x91, 0xb8, - 0x64, 0x60, 0xc8, 0xc6, 0x15, 0x43, 0xaf, 0xb2, 0x91, 0x1e, 0x55, 0x44, 0x91, 0xa8, 0xad, 0xab, - 0xba, 0x61, 0xf3, 0x3b, 0xf7, 0xac, 0x50, 0xf8, 0x84, 0x74, 0xb0, 0x7c, 0x61, 0x44, 0xb4, 0x24, - 0xd4, 0x7c, 0xa4, 0xe7, 0x91, 0xf2, 0x2e, 0xd1, 0xd2, 0x55, 0x22, 0x70, 0xac, 0xdc, 0xaf, 0x55, - 0x7e, 0x29, 0x02, 0x33, 0x61, 0xab, 0x90, 0xb4, 0xcd, 0x76, 0xd4, 0x86, 0xd9, 0xc9, 0x2c, 0xe7, - 0x21, 0xb9, 0x21, 0x70, 0x0e, 0x6c, 0x97, 0xeb, 0x07, 0xb4, 0xcb, 0xa8, 0xdb, 0x94, 0x30, 0xcc, - 0x99, 0x3e, 0x0d, 0xe3, 0xea, 0x71, 0x28, 0xcb, 0x7c, 0x2e, 0x06, 0x27, 0xe8, 0xa3, 0x2c, 0xab, - 0xa1, 0xe9, 0xce, 0xe9, 0x8a, 0xb5, 0x6f, 0x3a, 0x34, 0x71, 0x33, 0xb6, 0xb9, 0x5d, 0xc6, 0xbd, - 0xea, 0x39, 0x56, 0xdd, 0x61, 0xe4, 0x6c, 0x43, 0x7c, 0x8d, 0xd0, 0x11, 0x8b, 0x38, 0x86, 0xa3, - 0xd6, 0xb9, 0xa5, 0x58, 0x81, 0x40, 0xd9, 0x43, 0xae, 0x08, 0x83, 0x6a, 0xe2, 0x0d, 0x57, 0x1d, - 0xab, 0xdb, 0xec, 0x3e, 0x7c, 0x94, 0x0e, 0xa8, 0x04, 0x01, 0xd0, 0xab, 0xef, 0x93, 0x10, 0x57, - 0x9b, 0xec, 0x2a, 0x47, 0x94, 0x8c, 0x34, 0x5a, 0x90, 0x2f, 0xc1, 0x10, 0x3f, 0x50, 0x46, 0x69, - 0x88, 0xee, 0xe2, 0x7d, 0xda, 0x4e, 0x4a, 0x21, 0x3f, 0xd1, 0x1c, 0xc4, 0xa9, 0xf0, 0x7c, 0x02, - 0xc9, 0xcc, 0xb5, 0x48, 0x3f, 0x47, 0x85, 0x54, 0x18, 0x9a, 0xfc, 0x34, 0x24, 0x8a, 0x46, 0x43, - 0xd3, 0x8d, 0x20, 0xb7, 0x24, 0xe3, 0x46, 0x65, 0x36, 0x9b, 0x3c, 0xdf, 0x50, 0x58, 0x01, 0x4d, - 0xc1, 0x20, 0x7b, 0x1f, 0xc1, 0xaf, 0xa3, 0xf0, 0x92, 0x3c, 0x0f, 0x43, 0x94, 0xf7, 0xaa, 0x89, - 0x10, 0x7f, 0x59, 0xc7, 0x1f, 0x62, 0xd0, 0xd4, 0x94, 0xb3, 0x8f, 0x78, 0xc2, 0x22, 0x88, 0x55, - 0x55, 0x47, 0xe5, 0x7a, 0xd3, 0xdf, 0xf2, 0x5b, 0x20, 0xc1, 0x99, 0xd8, 0xe8, 0x0c, 0x44, 0x0d, - 0xd3, 0xe6, 0x17, 0x4a, 0xb2, 0x9d, 0x54, 0x59, 0x35, 0x0b, 0x31, 0x92, 0xa9, 0x28, 0x04, 0xb9, - 0xa0, 0x74, 0x0c, 0xaa, 0x4f, 0xf8, 0x82, 0xaa, 0xaf, 0xcb, 0x7d, 0x3f, 0x59, 0x97, 0xb6, 0xb8, - 0x83, 0xeb, 0x2c, 0x9f, 0x8e, 0xc0, 0xb4, 0xaf, 0xf6, 0x0a, 0xb6, 0x6c, 0xcd, 0xd0, 0xf9, 0x7c, - 0xce, 0xbc, 0x05, 0xf9, 0x84, 0xe4, 0xf5, 0x1d, 0xdc, 0xe5, 0xcd, 0x10, 0xcd, 0x9b, 0x26, 0xca, - 0x42, 0x82, 0x96, 0x2b, 0x06, 0xf3, 0x97, 0x98, 0xe2, 0x96, 0x49, 0x9d, 0x6d, 0x6c, 0x3b, 0x57, - 0x55, 0xcb, 0x7d, 0x42, 0x28, 0xca, 0xf2, 0x93, 0x90, 0x9c, 0x37, 0x74, 0x1b, 0xeb, 0x76, 0x93, - 0x8e, 0xc1, 0xad, 0xba, 0x51, 0xd9, 0xe5, 0x1c, 0x58, 0x81, 0x18, 0x5c, 0x35, 0x4d, 0x4a, 0x19, - 0x53, 0xc8, 0x4f, 0x96, 0x1b, 0x16, 0xd6, 0x3b, 0x9a, 0xe8, 0xc9, 0x83, 0x9b, 0x88, 0x2b, 0xe9, - 0xda, 0xe8, 0x7f, 0x4a, 0x70, 0xbc, 0x75, 0x40, 0xed, 0xe2, 0x7d, 0xfb, 0xa0, 0xe3, 0xe9, 0x39, - 0x48, 0xae, 0xd1, 0x77, 0xfc, 0x97, 0xf0, 0x3e, 0xca, 0xc2, 0x10, 0xae, 0x9e, 0x39, 0x7b, 0xf6, - 0x91, 0x27, 0x99, 0xb7, 0x5f, 0x1c, 0x50, 0x04, 0x00, 0x4d, 0x43, 0xd2, 0xc6, 0x15, 0xf3, 0xcc, - 0xd9, 0x73, 0xbb, 0x8f, 0x30, 0xf7, 0x22, 0x19, 0x90, 0x0b, 0xca, 0x25, 0x88, 0xd6, 0xdf, 0xfb, - 0xf4, 0x8c, 0x54, 0x88, 0x43, 0xd4, 0x6e, 0x36, 0x6e, 0xab, 0x8f, 0xbc, 0x12, 0x87, 0x59, 0x3f, - 0x25, 0x8d, 0x54, 0x6e, 0x56, 0xc2, 0x6d, 0x90, 0xf6, 0xd9, 0x80, 0x62, 0x74, 0x48, 0x66, 0xbb, - 0x5a, 0x52, 0xfe, 0x0d, 0x09, 0x52, 0x6e, 0xaa, 0xb4, 0x8e, 0x1d, 0x74, 0xde, 0x9f, 0xff, 0xf0, - 0x61, 0x73, 0x6c, 0x2e, 0xdc, 0x96, 0x97, 0xd2, 0x29, 0x3e, 0x74, 0xf4, 0x38, 0x75, 0x44, 0xd3, - 0xb0, 0xf9, 0xb3, 0xb2, 0x1e, 0xa4, 0x2e, 0x32, 0x7a, 0x10, 0x10, 0x8d, 0x70, 0xe5, 0x2b, 0x86, - 0xa3, 0xe9, 0xb5, 0xb2, 0x69, 0x5c, 0xe5, 0x8f, 0x75, 0xa3, 0x4a, 0x9a, 0xd6, 0x5c, 0xa6, 0x15, - 0x6b, 0x04, 0x4e, 0x84, 0x4e, 0xba, 0x5c, 0x82, 0xe9, 0x1d, 0x09, 0x02, 0xa2, 0x88, 0xce, 0xc3, - 0x90, 0xd9, 0xdc, 0x2a, 0x8b, 0x88, 0x31, 0x7c, 0xe6, 0x78, 0xbb, 0xf1, 0x2f, 0xfc, 0x83, 0x47, - 0x80, 0x41, 0xb3, 0xb9, 0x45, 0xbc, 0xe5, 0x4e, 0x48, 0xb5, 0x11, 0x66, 0xf8, 0x8a, 0x27, 0x07, - 0xfd, 0x7c, 0x04, 0xd7, 0xa0, 0x6c, 0x5a, 0x9a, 0x61, 0x69, 0xce, 0x3e, 0xcd, 0x5f, 0xa3, 0x4a, - 0x5a, 0x54, 0xac, 0x71, 0xb8, 0xbc, 0x0b, 0x63, 0xeb, 0x74, 0x7d, 0xeb, 0x49, 0x7e, 0xd6, 0x93, - 0x4f, 0xea, 0x2d, 0x5f, 0x47, 0xc9, 0x22, 0x2d, 0x92, 0x15, 0x9e, 0xe9, 0xe8, 0x9d, 0x8f, 0x1f, - 0xdc, 0x3b, 0x83, 0x19, 0xe2, 0x1f, 0x1d, 0x0d, 0x0c, 0x4e, 0xe6, 0x9c, 0xfe, 0xf0, 0xd5, 0xaf, - 0x63, 0xf6, 0xca, 0x26, 0xb2, 0xdd, 0x27, 0xd5, 0x6c, 0x8f, 0x30, 0x9a, 0xed, 0x39, 0x84, 0xe4, - 0x27, 0x61, 0x64, 0x4d, 0xb5, 0x9c, 0x75, 0xec, 0x5c, 0xc4, 0x6a, 0x15, 0x5b, 0xc1, 0x59, 0x77, - 0x44, 0xcc, 0xba, 0x08, 0x62, 0x74, 0x6a, 0x65, 0xb3, 0x0e, 0xfd, 0x2d, 0xef, 0x40, 0x8c, 0xde, - 0x0c, 0x75, 0x67, 0x64, 0x4e, 0xc1, 0x66, 0x64, 0x12, 0x4b, 0xf7, 0x1d, 0x6c, 0x8b, 0xf4, 0x96, - 0x16, 0xd0, 0x63, 0x62, 0x5e, 0x8d, 0x76, 0x9f, 0x57, 0xb9, 0x23, 0xf2, 0xd9, 0xb5, 0x0e, 0x43, - 0x05, 0x12, 0x8a, 0x17, 0x8b, 0xae, 0x20, 0x92, 0x27, 0x08, 0x5a, 0x86, 0x31, 0x53, 0xb5, 0x1c, - 0xfa, 0x24, 0x66, 0x87, 0x6a, 0xc1, 0x7d, 0x7d, 0xa6, 0x75, 0xe4, 0x05, 0x94, 0xe5, 0xad, 0x8c, - 0x98, 0x7e, 0xa0, 0xfc, 0xef, 0x63, 0x30, 0xc8, 0x8d, 0xf1, 0x66, 0x18, 0xe2, 0x66, 0xe5, 0xde, - 0x79, 0x62, 0xae, 0x75, 0x62, 0x9a, 0x73, 0x27, 0x10, 0xce, 0x4f, 0xd0, 0xa0, 0x7b, 0x21, 0x51, - 0xd9, 0x51, 0x35, 0xbd, 0xac, 0x55, 0xc5, 0x56, 0xc3, 0x6b, 0x37, 0x66, 0x86, 0xe6, 0x09, 0x6c, - 0xb1, 0xa8, 0x0c, 0xd1, 0xca, 0xc5, 0x2a, 0xc9, 0x04, 0x76, 0xb0, 0x56, 0xdb, 0x71, 0xf8, 0x08, - 0xe3, 0x25, 0xf4, 0x04, 0xc4, 0x88, 0x43, 0xf0, 0x07, 0x93, 0xd9, 0x96, 0x0d, 0x1f, 0x37, 0xd9, - 0x2b, 0x24, 0x48, 0xc3, 0x1f, 0xfe, 0xce, 0x8c, 0xa4, 0x50, 0x0a, 0x34, 0x0f, 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, 0x4f, 0xc1, 0x34, 0xc3, 0x3a, 0x06, 0x49, 0xfa, 0x44, - 0x8b, 0xa2, 0xb0, 0xeb, 0xc8, 0x09, 0x02, 0xa0, 0x95, 0xf7, 0xc1, 0x98, 0x17, 0x1f, 0x19, 0x4a, - 0x82, 0x71, 0xf1, 0xc0, 0x14, 0xf1, 0x61, 0x98, 0xd4, 0xf1, 0x1e, 0xbd, 0x20, 0x1d, 0xc0, 0x4e, - 0x52, 0x6c, 0x44, 0xea, 0x2e, 0x07, 0x29, 0xee, 0x81, 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, 0x0b, 0x46, 0xf0, 0x15, 0xad, 0x8a, 0xf5, 0x0a, 0x66, 0x78, - 0x23, 0x14, 0x2f, 0x25, 0x80, 0x14, 0xe9, 0x7e, 0x70, 0xe3, 0x5e, 0x59, 0xc4, 0xe4, 0x51, 0xc6, - 0x4f, 0xc0, 0xf3, 0x0c, 0x2c, 0x67, 0x20, 0x56, 0x54, 0x1d, 0x95, 0x24, 0x18, 0xce, 0x1e, 0x9b, - 0x68, 0x52, 0x0a, 0xf9, 0x29, 0x7f, 0x2f, 0x02, 0xb1, 0xcb, 0x86, 0x83, 0xd1, 0xa3, 0xbe, 0x04, - 0x70, 0xb4, 0x9d, 0x3f, 0xaf, 0x6b, 0x35, 0x1d, 0x57, 0x97, 0xed, 0x9a, 0xef, 0x7b, 0x0a, 0x9e, - 0x3b, 0x45, 0x02, 0xee, 0x34, 0x09, 0x71, 0xcb, 0x68, 0xea, 0x55, 0x71, 0x93, 0x97, 0x16, 0x50, - 0x09, 0x12, 0xae, 0x97, 0xc4, 0x7a, 0x79, 0xc9, 0x18, 0xf1, 0x12, 0xe2, 0xc3, 0x1c, 0xa0, 0x0c, - 0x6d, 0x71, 0x67, 0x29, 0x40, 0xd2, 0x0d, 0x5e, 0xdc, 0xdb, 0xfa, 0x73, 0x58, 0x8f, 0x8c, 0x4c, - 0x26, 0x6e, 0xdf, 0xbb, 0xc6, 0x63, 0x1e, 0x97, 0x76, 0x2b, 0xb8, 0xf5, 0x02, 0x6e, 0xc5, 0xbf, - 0xed, 0x30, 0x44, 0xf5, 0xf2, 0xdc, 0x8a, 0x7d, 0xdf, 0xe1, 0x38, 0x24, 0x6d, 0xad, 0xa6, 0xab, - 0x4e, 0xd3, 0xc2, 0xdc, 0xf3, 0x3c, 0x80, 0xfc, 0x55, 0x09, 0x06, 0x99, 0x27, 0xfb, 0xec, 0x26, - 0xb5, 0xb7, 0x5b, 0xa4, 0x93, 0xdd, 0xa2, 0x87, 0xb7, 0x5b, 0x1e, 0xc0, 0x15, 0xc6, 0xe6, 0x4f, - 0xee, 0xdb, 0x64, 0x0c, 0x4c, 0xc4, 0x75, 0xad, 0xc6, 0x07, 0xaa, 0x8f, 0x48, 0xfe, 0xb7, 0x12, - 0x49, 0x62, 0x79, 0x3d, 0xca, 0xc3, 0x88, 0x90, 0xab, 0xbc, 0x5d, 0x57, 0x6b, 0xdc, 0x77, 0x4e, - 0x74, 0x14, 0xee, 0x42, 0x5d, 0xad, 0x29, 0xc3, 0x5c, 0x1e, 0x52, 0x68, 0xdf, 0x0f, 0x91, 0x0e, - 0xfd, 0x10, 0xe8, 0xf8, 0xe8, 0xe1, 0x3a, 0x3e, 0xd0, 0x45, 0xb1, 0x70, 0x17, 0x7d, 0x29, 0x42, - 0x17, 0x33, 0xa6, 0x61, 0xab, 0xf5, 0x9f, 0xc4, 0x88, 0x38, 0x06, 0x49, 0xd3, 0xa8, 0x97, 0x59, - 0x0d, 0xbb, 0xe1, 0x9e, 0x30, 0x8d, 0xba, 0xd2, 0xd2, 0xed, 0xf1, 0x5b, 0x34, 0x5c, 0x06, 0x6f, - 0x81, 0xd5, 0x86, 0xc2, 0x56, 0xb3, 0x20, 0xc5, 0x4c, 0xc1, 0xe7, 0xb2, 0x87, 0x89, 0x0d, 0xe8, - 0xe4, 0x28, 0xb5, 0xce, 0xbd, 0x4c, 0x6c, 0x86, 0xa9, 0x70, 0x3c, 0x42, 0xc1, 0x42, 0x7f, 0xbb, - 0x55, 0xb0, 0xdf, 0x2d, 0x15, 0x8e, 0x27, 0xff, 0x55, 0x09, 0x60, 0x89, 0x58, 0x96, 0xea, 0x4b, - 0x66, 0x21, 0x9b, 0x8a, 0x50, 0x0e, 0xb4, 0x3c, 0xdd, 0xa9, 0xd3, 0x78, 0xfb, 0x29, 0xdb, 0x2f, - 0xf7, 0x3c, 0x8c, 0x78, 0xce, 0x68, 0x63, 0x21, 0xcc, 0x74, 0x97, 0xac, 0x7a, 0x1d, 0x3b, 0x4a, - 0xea, 0x8a, 0xaf, 0x24, 0xff, 0x63, 0x09, 0x92, 0x54, 0xa6, 0x65, 0xec, 0xa8, 0x81, 0x3e, 0x94, - 0x0e, 0xdf, 0x87, 0x27, 0x00, 0x18, 0x1b, 0x5b, 0xbb, 0x86, 0xb9, 0x67, 0x25, 0x29, 0x64, 0x5d, - 0xbb, 0x86, 0xd1, 0x39, 0xd7, 0xe0, 0xd1, 0xee, 0x06, 0x17, 0x59, 0x37, 0x37, 0xfb, 0x1d, 0x30, - 0x44, 0x3f, 0x51, 0xb5, 0x67, 0xf3, 0x44, 0x7a, 0x50, 0x6f, 0x36, 0x36, 0xf6, 0x6c, 0xf9, 0x05, - 0x18, 0xda, 0xd8, 0x63, 0x7b, 0x23, 0xc7, 0x20, 0x69, 0x19, 0x06, 0x9f, 0x93, 0x59, 0x2e, 0x94, - 0x20, 0x00, 0x3a, 0x05, 0x89, 0xfd, 0x80, 0x88, 0xb7, 0x1f, 0xe0, 0x6d, 0x68, 0x44, 0xfb, 0xda, - 0xd0, 0x38, 0xf5, 0xaf, 0x25, 0x18, 0xf6, 0xc5, 0x07, 0xf4, 0x08, 0x1c, 0x29, 0x2c, 0xad, 0xce, - 0x5f, 0x2a, 0x2f, 0x16, 0xcb, 0x17, 0x96, 0xf2, 0x0b, 0xde, 0x1b, 0xae, 0xec, 0xd4, 0xcb, 0xd7, - 0x67, 0x91, 0x0f, 0x77, 0x53, 0xa7, 0x3b, 0x4a, 0xe8, 0x34, 0x4c, 0x06, 0x49, 0xf2, 0x85, 0xf5, - 0xd2, 0xca, 0x46, 0x5a, 0xca, 0x1e, 0x79, 0xf9, 0xfa, 0xec, 0xb8, 0x8f, 0x22, 0xbf, 0x65, 0x63, - 0xdd, 0x69, 0x25, 0x98, 0x5f, 0x5d, 0x5e, 0x5e, 0xdc, 0x48, 0x47, 0x5a, 0x08, 0x78, 0xc0, 0xbe, - 0x1f, 0xc6, 0x83, 0x04, 0x2b, 0x8b, 0x4b, 0xe9, 0x68, 0x16, 0xbd, 0x7c, 0x7d, 0x76, 0xd4, 0x87, - 0xbd, 0xa2, 0xd5, 0xb3, 0x89, 0x0f, 0x7e, 0x66, 0x7a, 0xe0, 0x57, 0x7f, 0x65, 0x5a, 0x22, 0x9a, - 0x8d, 0x04, 0x62, 0x04, 0x7a, 0x10, 0xee, 0x58, 0x5f, 0x5c, 0x58, 0x29, 0x15, 0xcb, 0xcb, 0xeb, - 0x0b, 0x62, 0x0f, 0x5a, 0x68, 0x37, 0xf6, 0xf2, 0xf5, 0xd9, 0x61, 0xae, 0x52, 0x27, 0xec, 0x35, - 0xa5, 0x74, 0x79, 0x75, 0xa3, 0x94, 0x96, 0x18, 0xf6, 0x9a, 0x85, 0xaf, 0x18, 0x0e, 0xfb, 0x86, - 0xdd, 0xc3, 0x70, 0xb4, 0x0d, 0xb6, 0xab, 0xd8, 0xf8, 0xcb, 0xd7, 0x67, 0x47, 0xd6, 0x2c, 0xcc, - 0xc6, 0x0f, 0xa5, 0x98, 0x83, 0x4c, 0x2b, 0xc5, 0xea, 0xda, 0xea, 0x7a, 0x7e, 0x29, 0x3d, 0x9b, - 0x4d, 0xbf, 0x7c, 0x7d, 0x36, 0x25, 0x82, 0x21, 0xdd, 0xe8, 0x77, 0x35, 0xbb, 0x9d, 0x2b, 0x9e, - 0x3f, 0x79, 0x08, 0xee, 0xee, 0x70, 0xc6, 0x24, 0x4e, 0x27, 0x0e, 0x75, 0xca, 0xd4, 0x71, 0x9f, - 0x3d, 0xdb, 0x63, 0xfb, 0xb9, 0xf7, 0xd2, 0xe9, 0xf0, 0x27, 0x58, 0xd9, 0xae, 0x8b, 0x3b, 0xf9, - 0x43, 0x12, 0x8c, 0x5e, 0xd4, 0x6c, 0xc7, 0xb0, 0xb4, 0x8a, 0x5a, 0xa7, 0x2f, 0xb7, 0xce, 0xf5, - 0x1b, 0x5b, 0x43, 0x43, 0xfd, 0x29, 0x18, 0xbc, 0xa2, 0xd6, 0x59, 0x50, 0x8b, 0xd2, 0x0f, 0xcd, - 0x74, 0x38, 0xf2, 0x71, 0x43, 0x9b, 0x60, 0xc0, 0xc8, 0xe4, 0x5f, 0x8f, 0xc0, 0x18, 0x1d, 0x0c, - 0x36, 0xfb, 0x04, 0x19, 0x59, 0x63, 0x15, 0x20, 0x66, 0xa9, 0x0e, 0xdf, 0x34, 0x2c, 0xcc, 0xf1, - 0xd3, 0xc7, 0x7b, 0xfb, 0x38, 0x4b, 0x2b, 0xe2, 0x8a, 0x42, 0x69, 0xd1, 0x3b, 0x20, 0xd1, 0x50, - 0xf7, 0xca, 0x94, 0x0f, 0x5b, 0xb9, 0xe4, 0x0f, 0xc6, 0xe7, 0xe6, 0x8d, 0x99, 0xb1, 0x7d, 0xb5, - 0x51, 0xcf, 0xc9, 0x82, 0x8f, 0xac, 0x0c, 0x35, 0xd4, 0x3d, 0x22, 0x22, 0x32, 0x61, 0x8c, 0x40, - 0x2b, 0x3b, 0xaa, 0x5e, 0xc3, 0xac, 0x11, 0xba, 0x05, 0x5a, 0xb8, 0x78, 0xe0, 0x46, 0xa6, 0xbc, - 0x46, 0x7c, 0xec, 0x64, 0x65, 0xa4, 0xa1, 0xee, 0xcd, 0x53, 0x00, 0x69, 0x31, 0x97, 0xf8, 0xd8, - 0xab, 0x33, 0x03, 0xf4, 0x44, 0xf7, 0xdb, 0x12, 0x80, 0x67, 0x31, 0xf4, 0x0e, 0x48, 0x57, 0xdc, - 0x12, 0xa5, 0x15, 0x67, 0x93, 0xf7, 0x75, 0xea, 0x8b, 0x90, 0xbd, 0xd9, 0xdc, 0xfc, 0xad, 0x1b, - 0x33, 0x92, 0x32, 0x56, 0x09, 0x75, 0xc5, 0xdb, 0x61, 0xb8, 0x69, 0x56, 0x55, 0x07, 0x97, 0xe9, - 0x3a, 0x2e, 0xd2, 0x73, 0x9e, 0x9f, 0x26, 0xbc, 0x6e, 0xde, 0x98, 0x41, 0x4c, 0x2d, 0x1f, 0xb1, - 0x4c, 0x67, 0x7f, 0x60, 0x10, 0x42, 0xe0, 0xd3, 0xe9, 0x1b, 0x12, 0x0c, 0x17, 0x7d, 0x77, 0x2a, - 0x33, 0x30, 0xd4, 0x30, 0x74, 0x6d, 0x97, 0xfb, 0x63, 0x52, 0x11, 0x45, 0x94, 0x85, 0x04, 0x7b, - 0xcc, 0xea, 0xec, 0x8b, 0xad, 0x50, 0x51, 0x26, 0x54, 0x57, 0xf1, 0x96, 0xad, 0x89, 0xde, 0x50, - 0x44, 0x11, 0x5d, 0x80, 0xb4, 0x8d, 0x2b, 0x4d, 0x4b, 0x73, 0xf6, 0xcb, 0x15, 0x43, 0x77, 0xd4, - 0x8a, 0xc3, 0x9e, 0x45, 0x16, 0x8e, 0xdd, 0xbc, 0x31, 0x73, 0x07, 0x93, 0x35, 0x8c, 0x21, 0x2b, - 0x63, 0x02, 0x34, 0xcf, 0x20, 0xa4, 0x85, 0x2a, 0x76, 0x54, 0xad, 0x6e, 0x67, 0xd8, 0xe5, 0x04, - 0x51, 0xf4, 0xe9, 0xf2, 0xf9, 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, 0x2d, 0x6f, 0x3f, 0x6c, 0xb2, 0xa5, 0x37, 0xf2, 0xfa, 0x7e, 0xe1, 0x51, 0x8f, - 0x7b, 0x98, 0x4e, 0xfe, 0xe6, 0x97, 0x1f, 0x9a, 0xe4, 0xae, 0xe1, 0xed, 0x4f, 0x5d, 0xc2, 0xfb, - 0xa4, 0xfb, 0x39, 0xea, 0x1a, 0xc5, 0x24, 0x69, 0xe7, 0x0b, 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, 0x53, 0x4c, 0x85, 0x53, 0xa0, 0x0b, 0x30, 0xc8, 0x8f, 0xd0, 0xe3, 0x07, 0x1e, - 0xdf, 0xf4, 0xae, 0x04, 0xa3, 0x26, 0x16, 0xa9, 0xe2, 0x3a, 0xae, 0xb1, 0xb4, 0x6a, 0x47, 0x25, - 0xab, 0x0f, 0xfa, 0xed, 0xbd, 0xc2, 0xe2, 0x81, 0x07, 0x21, 0xb7, 0x54, 0x98, 0x9f, 0xac, 0x8c, - 0xb9, 0xa0, 0x75, 0x0a, 0x41, 0x97, 0x02, 0x97, 0x7f, 0xf9, 0x07, 0x2a, 0xef, 0xea, 0xa4, 0xbe, - 0xcf, 0xa7, 0xc5, 0xfe, 0x84, 0xff, 0xea, 0xf0, 0x05, 0x48, 0x37, 0xf5, 0x2d, 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, 0x3b, 0xf9, 0x40, - 0x3d, 0x12, 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, 0xc1, 0x44, - 0x43, 0xd3, 0xcb, 0x36, 0xae, 0x6f, 0x97, 0xb9, 0x81, 0x09, 0x4b, 0xfa, 0x09, 0xa5, 0xc2, 0xd2, - 0xc1, 0xfc, 0xe1, 0xe6, 0x8d, 0x99, 0x2c, 0x0f, 0xa1, 0xad, 0x2c, 0x65, 0x65, 0xbc, 0xa1, 0xe9, - 0xeb, 0xb8, 0xbe, 0x5d, 0x74, 0x61, 0xb9, 0xd4, 0x07, 0x5f, 0x9d, 0x19, 0xe0, 0xc3, 0x75, 0x40, - 0x3e, 0x47, 0xf7, 0xce, 0xf9, 0x30, 0xc3, 0x36, 0x59, 0x93, 0xa8, 0xa2, 0xc0, 0xaf, 0x1a, 0x78, - 0x00, 0x36, 0xcc, 0x5f, 0xfa, 0x83, 0x59, 0x49, 0xfe, 0xbc, 0x04, 0x83, 0xc5, 0xcb, 0x6b, 0xaa, - 0x66, 0xa1, 0x45, 0x18, 0xf7, 0x3c, 0x27, 0x38, 0xc8, 0x8f, 0xdf, 0xbc, 0x31, 0x93, 0x09, 0x3b, - 0x97, 0x3b, 0xca, 0x3d, 0x07, 0x16, 0xc3, 0x7c, 0xb1, 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, 0xee, 0xe8, 0xbc, 0x14, 0xdf, 0xdd, 0xc8, 0x24, 0x24, 0xf2, 0x47, 0x22, 0x00, - 0xc5, 0xcb, 0x97, 0x37, 0x2c, 0xcd, 0xac, 0x63, 0xe7, 0x56, 0x6a, 0xbe, 0x01, 0x47, 0x7c, 0xab, - 0x24, 0xab, 0x12, 0xd2, 0x7e, 0xf6, 0xe6, 0x8d, 0x99, 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, 0x61, 0xd8, 0x33, 0x89, 0x8d, 0x8a, 0x90, 0x70, - 0xf8, 0x6f, 0x6e, 0x61, 0xb9, 0xb3, 0x85, 0x05, 0x19, 0xb7, 0xb2, 0x4b, 0x29, 0xff, 0xa9, 0x04, - 0xe0, 0xf9, 0xec, 0xcf, 0xa6, 0x8b, 0x91, 0x50, 0xce, 0x03, 0x6f, 0xf4, 0x50, 0xa9, 0x1a, 0xa7, - 0x0e, 0xd9, 0xf3, 0xe7, 0x23, 0x30, 0xb1, 0x29, 0x22, 0xcf, 0xcf, 0xbc, 0x0d, 0xd6, 0x60, 0x08, - 0xeb, 0x8e, 0xa5, 0x51, 0x23, 0x90, 0xde, 0x7e, 0xb8, 0x53, 0x6f, 0xb7, 0xd1, 0x89, 0x7e, 0x44, - 0x4a, 0x6c, 0xba, 0x73, 0x36, 0x21, 0x6b, 0xfc, 0x62, 0x14, 0x32, 0x9d, 0x28, 0xd1, 0x3c, 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, 0x45, - 0x18, 0xd3, 0x74, 0xcd, 0xd1, 0xd4, 0x7a, 0x79, 0x4b, 0xad, 0xab, 0x7a, 0xe5, 0x30, 0x59, 0x33, - 0x0b, 0xf9, 0xbc, 0xd9, 0x10, 0x3b, 0x59, 0x19, 0xe5, 0x90, 0x02, 0x03, 0xa0, 0x8b, 0x30, 0x24, - 0x9a, 0x8a, 0x1d, 0x2a, 0xdb, 0x10, 0xe4, 0xbe, 0x04, 0xef, 0x17, 0xa2, 0x30, 0xae, 0xe0, 0xea, - 0xff, 0xeb, 0x8a, 0x83, 0x75, 0xc5, 0x32, 0x00, 0x1b, 0xee, 0x24, 0xc0, 0x1e, 0xa2, 0x37, 0x48, - 0xc0, 0x48, 0x32, 0x0e, 0x45, 0xdb, 0xf1, 0xf5, 0xc7, 0x8d, 0x08, 0xa4, 0xfc, 0xfd, 0xf1, 0xe7, - 0x74, 0x56, 0x42, 0x8b, 0x5e, 0x24, 0x8a, 0xf1, 0x4f, 0xef, 0x76, 0x88, 0x44, 0x2d, 0xde, 0xdb, - 0x3d, 0x04, 0xfd, 0xb7, 0x08, 0x0c, 0xae, 0xa9, 0x96, 0xda, 0xb0, 0x51, 0xa5, 0x25, 0xd3, 0x14, - 0xdb, 0x8f, 0x2d, 0x1f, 0x58, 0xe7, 0xbb, 0x1d, 0x3d, 0x12, 0xcd, 0x8f, 0xb5, 0x49, 0x34, 0xdf, - 0x0a, 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, 0x3e, 0xe5, 0x2d, - 0x4b, 0x7d, 0x95, 0xb2, 0x02, 0x0d, 0x75, 0xaf, 0xc4, 0x0a, 0x68, 0x09, 0xd0, 0x8e, 0xbb, 0x33, - 0x52, 0xf6, 0xcc, 0x49, 0xe8, 0x4f, 0xdc, 0xbc, 0x31, 0x73, 0x94, 0xd1, 0xb7, 0xe2, 0xc8, 0xca, - 0xb8, 0x07, 0x14, 0xdc, 0x1e, 0x03, 0x20, 0x7a, 0x95, 0xd9, 0x15, 0x6e, 0xb6, 0xdc, 0x39, 0x72, - 0xf3, 0xc6, 0xcc, 0x38, 0xe3, 0xe2, 0xd5, 0xc9, 0x4a, 0x92, 0x14, 0x8a, 0xe4, 0xb7, 0xcf, 0xb3, - 0x3f, 0x23, 0x01, 0xf2, 0x42, 0xbe, 0x82, 0x6d, 0x93, 0xac, 0xcf, 0x48, 0x22, 0xee, 0xcb, 0x9a, - 0xa5, 0xee, 0x89, 0xb8, 0x47, 0x2f, 0x12, 0x71, 0xdf, 0x48, 0x79, 0xd2, 0x0b, 0x8f, 0x91, 0x5e, - 0xf7, 0x99, 0xb9, 0x8b, 0x84, 0xe3, 0xe1, 0x80, 0xfc, 0x4f, 0x25, 0x38, 0xda, 0xe2, 0x51, 0xae, - 0xb0, 0xff, 0x1f, 0x20, 0xcb, 0x57, 0xc9, 0xbf, 0xa3, 0xc8, 0x84, 0x3e, 0xb0, 0x83, 0x8e, 0x5b, - 0x2d, 0x71, 0xf7, 0xd6, 0x45, 0x78, 0x76, 0x61, 0xfe, 0x1f, 0x49, 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, 0x7f, 0x4b, 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, 0x5d, 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, 0x83, 0x9f, 0x99, 0x1e, 0xb8, 0xe5, 0x37, 0xc1, 0xff, 0x78, 0xa8, 0xe3, - 0xae, 0x77, 0x0d, 0xeb, 0xd8, 0xd6, 0xec, 0x43, 0xed, 0x7a, 0xf7, 0xb5, 0x93, 0x2e, 0xff, 0x6e, - 0x1c, 0x52, 0x0b, 0xac, 0x15, 0xd2, 0x11, 0x18, 0xbd, 0x09, 0x06, 0x4d, 0x3a, 0x8d, 0xb8, 0xc7, - 0x68, 0x1d, 0x1c, 0x9e, 0x4d, 0x36, 0xee, 0x5d, 0x2e, 0x36, 0xf5, 0xd8, 0xfc, 0x32, 0x07, 0xbb, - 0x63, 0xe6, 0xdd, 0x9a, 0x4a, 0x1d, 0x68, 0xbf, 0x87, 0xe5, 0x2c, 0x7c, 0x6b, 0x25, 0xcc, 0x4f, - 0x66, 0xf7, 0x42, 0x36, 0x08, 0x84, 0xdd, 0x0e, 0x7b, 0xbf, 0x04, 0x47, 0x28, 0x96, 0x37, 0x11, - 0x53, 0x4c, 0x91, 0xec, 0x9f, 0xea, 0xa4, 0xc2, 0x92, 0x6a, 0x7b, 0x77, 0x3d, 0xd8, 0x7d, 0xae, - 0xbb, 0xf9, 0x44, 0x78, 0xdc, 0xd7, 0x78, 0x98, 0xad, 0xac, 0x4c, 0xd4, 0x5b, 0x28, 0x6d, 0xb4, - 0x10, 0xb8, 0xd0, 0x17, 0x3b, 0xd8, 0x56, 0xbb, 0xff, 0x72, 0xdf, 0xd3, 0x30, 0xec, 0xc5, 0x12, - 0x9b, 0xff, 0xdf, 0x97, 0xfe, 0xe7, 0x0e, 0x3f, 0x31, 0xfa, 0x80, 0x04, 0x47, 0xbc, 0xd9, 0xdc, - 0xcf, 0x96, 0xfd, 0x7f, 0x9c, 0x07, 0x0e, 0xb0, 0x10, 0x0a, 0x1b, 0xa7, 0x2d, 0x5f, 0x59, 0x99, - 0x6c, 0xb6, 0x92, 0x92, 0x25, 0xd8, 0x88, 0x3f, 0xb2, 0xda, 0x19, 0xf1, 0x09, 0xc8, 0xfe, 0x43, - 0x73, 0x90, 0x01, 0xfb, 0x9f, 0x1d, 0xa6, 0x61, 0x39, 0xb8, 0x4a, 0x37, 0xe4, 0x12, 0x8a, 0x5b, - 0x96, 0x57, 0x00, 0xb5, 0x76, 0x6e, 0xf8, 0x02, 0xa3, 0xf7, 0x3e, 0x05, 0x4d, 0x42, 0xdc, 0x7f, - 0xc5, 0x8f, 0x15, 0x72, 0x89, 0x0f, 0xf2, 0xe9, 0xf3, 0x96, 0x8f, 0xf9, 0xef, 0x44, 0xe0, 0x94, - 0xff, 0x78, 0xe8, 0xc5, 0x26, 0xb6, 0xf6, 0xdd, 0x21, 0x6a, 0xaa, 0x35, 0x4d, 0xf7, 0xbf, 0x82, - 0x38, 0xea, 0x9f, 0xf0, 0x29, 0xae, 0xb0, 0x93, 0xfc, 0x41, 0x09, 0x86, 0xd7, 0xd4, 0x1a, 0x56, - 0xf0, 0x8b, 0x4d, 0x6c, 0x3b, 0x6d, 0x6e, 0x99, 0x4f, 0xc1, 0xa0, 0xb1, 0xbd, 0x2d, 0xce, 0xb4, - 0x63, 0x0a, 0x2f, 0x11, 0x9d, 0xeb, 0x5a, 0x43, 0x63, 0xd7, 0xc1, 0x62, 0x0a, 0x2b, 0xa0, 0x19, - 0x18, 0xae, 0x18, 0x4d, 0x9d, 0x0f, 0xb9, 0x4c, 0x4c, 0x7c, 0x6b, 0xa5, 0xa9, 0xb3, 0x21, 0x47, - 0x8c, 0x68, 0xe1, 0x2b, 0xd8, 0xb2, 0xd9, 0xd7, 0x25, 0x13, 0x8a, 0x28, 0xca, 0x4f, 0x41, 0x8a, - 0x49, 0xc2, 0x27, 0xe3, 0xa3, 0x90, 0xa0, 0x37, 0xad, 0x3c, 0x79, 0x86, 0x48, 0xf9, 0x12, 0xbb, - 0xab, 0xce, 0xf8, 0x33, 0x91, 0x58, 0xa1, 0x50, 0xe8, 0x68, 0xe5, 0x93, 0xbd, 0xa3, 0x06, 0xb3, - 0xa1, 0x6b, 0xe1, 0xdf, 0x8a, 0xc3, 0x11, 0x7e, 0x78, 0xa7, 0x9a, 0xda, 0xe9, 0x1d, 0xc7, 0x11, - 0x6f, 0x27, 0x80, 0x67, 0xc1, 0xaa, 0xa9, 0xc9, 0xfb, 0x10, 0xbb, 0xe8, 0x38, 0x26, 0x3a, 0x05, - 0x71, 0xab, 0x59, 0xc7, 0x62, 0x33, 0xc8, 0xdd, 0xae, 0x57, 0x4d, 0x6d, 0x8e, 0x20, 0x28, 0xcd, - 0x3a, 0x56, 0x18, 0x0a, 0x2a, 0xc1, 0xcc, 0x76, 0xb3, 0x5e, 0xdf, 0x2f, 0x57, 0x31, 0xfd, 0x77, - 0x59, 0xee, 0x3f, 0x9c, 0xc0, 0x7b, 0xa6, 0x2a, 0x3e, 0x5b, 0x49, 0x0c, 0x73, 0x9c, 0xa2, 0x15, - 0x29, 0x96, 0xf8, 0x67, 0x13, 0x25, 0x81, 0x23, 0xff, 0x7e, 0x04, 0x12, 0x82, 0x35, 0xbd, 0x3c, - 0x8e, 0xeb, 0xb8, 0xe2, 0x18, 0xe2, 0x30, 0xc5, 0x2d, 0x23, 0x04, 0xd1, 0x1a, 0xef, 0xbc, 0xe4, - 0xc5, 0x01, 0x85, 0x14, 0x08, 0xcc, 0xbd, 0xd2, 0x4f, 0x60, 0x66, 0x93, 0xf4, 0x67, 0xcc, 0x34, - 0xc4, 0xaa, 0xed, 0xe2, 0x80, 0x42, 0x4b, 0x28, 0x03, 0x83, 0x64, 0xd0, 0x38, 0xac, 0xb7, 0x08, - 0x9c, 0x97, 0xd1, 0x14, 0xc4, 0x4d, 0xd5, 0xa9, 0xb0, 0xdb, 0x76, 0xa4, 0x82, 0x15, 0xd1, 0xe3, - 0x30, 0xc8, 0x5e, 0x65, 0x87, 0xff, 0x17, 0x0d, 0x31, 0x06, 0xfb, 0xfc, 0x1d, 0x91, 0x7b, 0x4d, - 0x75, 0x1c, 0x6c, 0xe9, 0x84, 0x21, 0x43, 0x47, 0x08, 0x62, 0x5b, 0x46, 0x75, 0x9f, 0xff, 0x7f, - 0x1c, 0xfa, 0x9b, 0xff, 0x43, 0x0e, 0xea, 0x0f, 0x65, 0x5a, 0xc9, 0xfe, 0x2d, 0x58, 0x4a, 0x00, - 0x0b, 0x04, 0xa9, 0x04, 0x13, 0x6a, 0xb5, 0xaa, 0xb1, 0x7f, 0x55, 0x53, 0xde, 0xd2, 0x68, 0xf0, - 0xb0, 0xe9, 0x3f, 0x7d, 0xeb, 0xd4, 0x17, 0xc8, 0x23, 0x28, 0x70, 0xfc, 0x42, 0x12, 0x86, 0x4c, - 0x26, 0x94, 0x7c, 0x1e, 0xc6, 0x5b, 0x24, 0x25, 0xf2, 0xed, 0x6a, 0x7a, 0x55, 0xbc, 0x73, 0x20, - 0xbf, 0x09, 0x8c, 0x7e, 0xb0, 0x92, 0x1d, 0x53, 0xd1, 0xdf, 0x85, 0xf7, 0x76, 0x7e, 0x0e, 0x33, - 0xea, 0x7b, 0x0e, 0xa3, 0x9a, 0x5a, 0x21, 0x49, 0xf9, 0xf3, 0x47, 0x30, 0xf9, 0xd6, 0x47, 0x30, - 0x35, 0xac, 0x8b, 0x89, 0x99, 0x54, 0xa9, 0xa6, 0x66, 0x53, 0x77, 0xf4, 0x3e, 0xa0, 0x69, 0x9f, - 0xf7, 0xfd, 0xa6, 0x6f, 0x62, 0x62, 0x0b, 0xf9, 0xb5, 0x45, 0xd7, 0x8f, 0xbf, 0x16, 0x81, 0xe3, - 0x3e, 0x3f, 0xf6, 0x21, 0xb7, 0xba, 0x73, 0xb6, 0xbd, 0xc7, 0xf7, 0xf1, 0x36, 0xf9, 0x12, 0xc4, - 0x08, 0x3e, 0xea, 0xf1, 0xef, 0x32, 0x32, 0x5f, 0xf8, 0xe6, 0x3f, 0x94, 0x83, 0x07, 0x5a, 0x81, - 0x5e, 0xa1, 0x4c, 0x0a, 0x1f, 0xe8, 0xdf, 0x7e, 0x69, 0xef, 0xdb, 0xa1, 0xf6, 0xad, 0x33, 0x63, - 0xd8, 0x86, 0xaf, 0x9f, 0xed, 0xf8, 0x76, 0x95, 0x05, 0xd3, 0xee, 0xf9, 0xd5, 0x01, 0x22, 0x75, - 0xa7, 0xa7, 0x01, 0xdd, 0x7a, 0xb0, 0xcf, 0x4c, 0x6d, 0x0f, 0xa6, 0x9e, 0x21, 0x6d, 0x7b, 0x2b, - 0x68, 0x11, 0xf2, 0xa7, 0xdc, 0x83, 0x3e, 0x89, 0xff, 0xcf, 0x3d, 0x71, 0x88, 0x07, 0x9e, 0x7c, - 0x7c, 0xed, 0x78, 0xef, 0x5c, 0xc7, 0xa9, 0x64, 0xce, 0x37, 0x8d, 0x28, 0x3e, 0x4a, 0xf9, 0xd7, - 0x24, 0xb8, 0xa3, 0xa5, 0x69, 0x1e, 0xe3, 0x17, 0xda, 0xbc, 0x62, 0x38, 0x54, 0xd2, 0xb3, 0xd0, - 0x46, 0xd8, 0xfb, 0x7a, 0x0a, 0xcb, 0xa4, 0x08, 0x48, 0xfb, 0x16, 0x38, 0x12, 0x14, 0x56, 0x98, - 0xe9, 0x1e, 0x18, 0x0d, 0x6e, 0x16, 0x73, 0x73, 0x8d, 0x04, 0xb6, 0x8b, 0xe5, 0x72, 0xd8, 0xce, - 0xae, 0xae, 0x25, 0x48, 0xba, 0xa8, 0x3c, 0x3b, 0xee, 0x5b, 0x55, 0x8f, 0x52, 0xfe, 0x88, 0x04, - 0xb3, 0xc1, 0x16, 0x7c, 0x79, 0xd2, 0xc1, 0x84, 0xbd, 0x65, 0x5d, 0xfc, 0x3d, 0x09, 0xee, 0xec, - 0x22, 0x13, 0x37, 0xc0, 0x35, 0x98, 0xf4, 0x6d, 0x12, 0x88, 0x10, 0x2e, 0xba, 0xfd, 0x54, 0xef, - 0x0c, 0xd5, 0x5d, 0x13, 0x1f, 0x23, 0x46, 0xf9, 0xdc, 0x77, 0x66, 0x26, 0x5a, 0xeb, 0x6c, 0x65, - 0xa2, 0x75, 0x61, 0x7f, 0x0b, 0xfd, 0xe3, 0x15, 0x09, 0xee, 0x0f, 0xaa, 0xda, 0x26, 0xd5, 0xfd, - 0x69, 0xf5, 0xc3, 0xbf, 0x91, 0xe0, 0x54, 0x3f, 0xc2, 0xf1, 0x0e, 0xd9, 0x82, 0x09, 0x2f, 0x09, - 0x0f, 0xf7, 0xc7, 0x81, 0x52, 0x7b, 0xe6, 0xa5, 0xc8, 0xe5, 0x76, 0x1b, 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, 0xed, 0x30, 0xd1, - 0xc6, 0x95, 0xf9, 0xa8, 0x3e, 0x80, 0x27, 0x2b, 0xa8, 0xd5, 0x59, 0xe5, 0x7d, 0x98, 0xa1, 0xed, - 0xb6, 0x31, 0xf4, 0xed, 0x56, 0xb9, 0xc1, 0x63, 0x4b, 0xdb, 0xa6, 0xb9, 0xee, 0x8b, 0x30, 0xc8, - 0xfa, 0x99, 0xab, 0x7b, 0x08, 0x47, 0xe1, 0x0c, 0xe4, 0x4f, 0x88, 0x58, 0x56, 0x14, 0x62, 0xb7, - 0x1f, 0x43, 0xfd, 0xe8, 0x7a, 0x8b, 0xc6, 0x90, 0xcf, 0x18, 0xdf, 0x16, 0x51, 0xad, 0xbd, 0x74, - 0xdc, 0x1c, 0x95, 0x5b, 0x16, 0xd5, 0x98, 0x6d, 0x6e, 0x6f, 0xf8, 0xfa, 0x15, 0x11, 0xbe, 0x5c, - 0x9d, 0x7a, 0x84, 0xaf, 0x9f, 0x8e, 0xe9, 0xdd, 0x40, 0xd6, 0x43, 0xcc, 0x3f, 0x8b, 0x81, 0xec, - 0x87, 0x12, 0x1c, 0xa5, 0xba, 0xf9, 0xf7, 0x28, 0x0e, 0x6a, 0xf2, 0x07, 0x01, 0xd9, 0x56, 0xa5, - 0xdc, 0x76, 0x74, 0xa7, 0x6d, 0xab, 0x72, 0x39, 0x30, 0xbf, 0x3c, 0x08, 0xa8, 0x1a, 0xd8, 0x89, - 0xa2, 0xd8, 0xec, 0x02, 0x5d, 0xba, 0xea, 0xdb, 0xe8, 0x68, 0xd3, 0x9d, 0xb1, 0x5b, 0xd0, 0x9d, - 0xdf, 0x92, 0x20, 0xdb, 0x4e, 0x65, 0xde, 0x7d, 0x1a, 0x4c, 0x05, 0xce, 0x0f, 0xc2, 0x3d, 0xf8, - 0x60, 0x3f, 0xbb, 0x3c, 0xa1, 0x61, 0x74, 0xc4, 0xc2, 0xb7, 0x3b, 0x0f, 0x98, 0x09, 0x7a, 0x68, - 0x6b, 0x66, 0xfd, 0x53, 0x1b, 0x3e, 0x5f, 0x6e, 0x89, 0xab, 0x7f, 0x26, 0x72, 0xef, 0x3d, 0x98, - 0xee, 0x20, 0xf5, 0xed, 0x9e, 0xf7, 0x76, 0x3a, 0x76, 0xe6, 0xad, 0x4e, 0xdf, 0x1f, 0xe3, 0x23, - 0x21, 0x78, 0x39, 0xdb, 0xb7, 0x16, 0x6b, 0xf7, 0xba, 0x4b, 0x7e, 0x1b, 0x1c, 0x6b, 0x4b, 0xc5, - 0x65, 0xcb, 0x41, 0x6c, 0x47, 0xb3, 0x1d, 0x2e, 0xd6, 0xbd, 0x9d, 0xc4, 0x0a, 0x51, 0x53, 0x1a, - 0x19, 0x41, 0x9a, 0xb2, 0x5e, 0x33, 0x8c, 0x3a, 0x17, 0x43, 0xbe, 0x04, 0xe3, 0x3e, 0x18, 0x6f, - 0xe4, 0x1c, 0xc4, 0x4c, 0x83, 0x7f, 0xb9, 0x60, 0xf8, 0xcc, 0xf1, 0x8e, 0x1b, 0xfb, 0x86, 0x51, - 0xe7, 0x6a, 0x53, 0x7c, 0x79, 0x12, 0x10, 0x63, 0x46, 0xf7, 0xf8, 0x45, 0x13, 0xeb, 0x30, 0x11, - 0x80, 0xf2, 0x46, 0xde, 0xd0, 0xf9, 0xc1, 0x99, 0xef, 0x1f, 0x81, 0x38, 0xe5, 0x8a, 0x3e, 0x2e, - 0x05, 0x3e, 0x2d, 0x34, 0xd7, 0x89, 0x4d, 0xfb, 0x35, 0x71, 0xf6, 0x74, 0xdf, 0xf8, 0x3c, 0x67, - 0x3b, 0xf5, 0xde, 0x7f, 0xf9, 0xfa, 0x47, 0x23, 0x77, 0x23, 0xf9, 0x74, 0x87, 0xd5, 0xb8, 0x6f, - 0xbc, 0x7c, 0x36, 0xf0, 0x2c, 0xfe, 0xa1, 0xfe, 0x9a, 0x12, 0x92, 0xcd, 0xf5, 0x8b, 0xce, 0x05, - 0x3b, 0x4f, 0x05, 0x3b, 0x8b, 0x1e, 0xed, 0x2d, 0xd8, 0xe9, 0x77, 0x06, 0x07, 0xcd, 0xbb, 0xd1, - 0xef, 0x4a, 0x30, 0xd9, 0x6e, 0x49, 0x87, 0x9e, 0xe8, 0x4f, 0x8a, 0xd6, 0x94, 0x22, 0xfb, 0xe4, - 0x21, 0x28, 0xb9, 0x2a, 0x0b, 0x54, 0x95, 0x3c, 0x7a, 0xea, 0x10, 0xaa, 0x9c, 0xf6, 0x6f, 0xfd, - 0xff, 0x0f, 0x09, 0x4e, 0x74, 0x5d, 0x21, 0xa1, 0x7c, 0x7f, 0x52, 0x76, 0xc9, 0x9d, 0xb2, 0x85, - 0x37, 0xc2, 0x82, 0x6b, 0xfc, 0x0c, 0xd5, 0xf8, 0x12, 0x5a, 0x3c, 0x8c, 0xc6, 0x6d, 0xcf, 0x57, - 0xd0, 0x6f, 0x07, 0x2f, 0x1d, 0x76, 0x77, 0xa7, 0x96, 0x85, 0x47, 0x8f, 0x81, 0xd1, 0x9a, 0xd4, - 0xca, 0xcf, 0x51, 0x15, 0x14, 0xb4, 0xf6, 0x06, 0x3b, 0xed, 0xf4, 0x3b, 0x83, 0x81, 0xff, 0xdd, - 0xe8, 0xbf, 0x4b, 0xed, 0xef, 0x10, 0x3e, 0xde, 0x55, 0xc4, 0xce, 0x8b, 0xaa, 0xec, 0x13, 0x07, - 0x27, 0xe4, 0x4a, 0x36, 0xa8, 0x92, 0x35, 0x84, 0x6f, 0xb5, 0x92, 0x6d, 0x3b, 0x11, 0x7d, 0x43, - 0x82, 0xc9, 0x76, 0x6b, 0x92, 0x1e, 0xc3, 0xb2, 0xcb, 0x22, 0xab, 0xc7, 0xb0, 0xec, 0xb6, 0x00, - 0x92, 0xdf, 0x44, 0x95, 0x3f, 0x87, 0x1e, 0xeb, 0xa4, 0x7c, 0xd7, 0x5e, 0x24, 0x63, 0xb1, 0x6b, - 0x92, 0xdf, 0x63, 0x2c, 0xf6, 0xb3, 0x8e, 0xe9, 0x31, 0x16, 0xfb, 0x5a, 0x63, 0xf4, 0x1e, 0x8b, - 0xae, 0x66, 0x7d, 0x76, 0xa3, 0x8d, 0xbe, 0x26, 0xc1, 0x48, 0x20, 0x23, 0x46, 0x8f, 0x74, 0x15, - 0xb4, 0xdd, 0x82, 0x21, 0x7b, 0xe6, 0x20, 0x24, 0x5c, 0x97, 0x45, 0xaa, 0xcb, 0x3c, 0xca, 0x1f, - 0x46, 0x97, 0xe0, 0x31, 0xea, 0xb7, 0x24, 0x98, 0x68, 0x93, 0x65, 0xf6, 0x18, 0x85, 0x9d, 0x93, - 0xe6, 0xec, 0x13, 0x07, 0x27, 0xe4, 0x5a, 0x5d, 0xa0, 0x5a, 0xbd, 0x15, 0xbd, 0xe5, 0x30, 0x5a, - 0xf9, 0xe6, 0xe7, 0x1b, 0xde, 0x95, 0x2c, 0x5f, 0x3b, 0xe8, 0xdc, 0x01, 0x05, 0x13, 0x0a, 0x3d, - 0x7e, 0x60, 0x3a, 0xae, 0xcf, 0xb3, 0x54, 0x9f, 0x67, 0xd0, 0xea, 0x1b, 0xd3, 0xa7, 0x75, 0x5a, - 0xff, 0x52, 0xeb, 0xe3, 0xc0, 0xee, 0x5e, 0xd4, 0x36, 0x59, 0xcd, 0x3e, 0x7a, 0x20, 0x1a, 0xae, - 0xd4, 0x13, 0x54, 0xa9, 0x33, 0xe8, 0xe1, 0x4e, 0x4a, 0xf9, 0xee, 0xdd, 0x69, 0xfa, 0xb6, 0x71, - 0xfa, 0x9d, 0x2c, 0x05, 0x7e, 0x37, 0x7a, 0x8f, 0xb8, 0xf3, 0x74, 0xb2, 0x6b, 0xbb, 0xbe, 0x3c, - 0x36, 0x7b, 0x7f, 0x1f, 0x98, 0x5c, 0xae, 0xbb, 0xa9, 0x5c, 0xd3, 0xe8, 0x78, 0x27, 0xb9, 0x48, - 0x2e, 0x8b, 0x3e, 0x24, 0xb9, 0xd7, 0x24, 0x4f, 0x75, 0xe7, 0xed, 0x4f, 0x76, 0xb3, 0x0f, 0xf4, - 0x85, 0xcb, 0x25, 0xb9, 0x97, 0x4a, 0x32, 0x8b, 0xa6, 0x3b, 0x4a, 0xc2, 0x52, 0xdf, 0x5b, 0x7d, - 0xa9, 0xe0, 0x7f, 0x4d, 0xc1, 0x4c, 0x87, 0x16, 0x9d, 0xbd, 0x1e, 0x67, 0x5c, 0x5d, 0xde, 0xc8, - 0xf6, 0x7c, 0x03, 0x7b, 0xab, 0xbf, 0xed, 0xda, 0xe7, 0x81, 0xd8, 0xef, 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, 0x1a, 0x85, 0xf4, 0xb2, 0x5d, 0x2b, 0x55, 0x35, 0xe7, 0x36, 0xf9, 0xda, 0x53, 0x9d, 0xdf, - 0xbb, 0xa0, 0x9b, 0x37, 0x66, 0x46, 0x99, 0x4d, 0xbb, 0x58, 0xb2, 0x01, 0x63, 0xa1, 0x57, 0xc6, - 0xdc, 0xb3, 0x8a, 0x87, 0x79, 0xec, 0x1c, 0x62, 0x25, 0xd3, 0xe7, 0x09, 0x3e, 0xff, 0x46, 0x7b, - 0xed, 0x9d, 0x99, 0x39, 0xd4, 0xc5, 0xdb, 0xf9, 0x38, 0xd0, 0xeb, 0xb3, 0x2c, 0x64, 0xc2, 0x9d, - 0xe2, 0xf6, 0xd8, 0x6b, 0x12, 0x0c, 0x2f, 0xdb, 0x22, 0x15, 0xc4, 0x3f, 0xa3, 0x4f, 0x93, 0x1e, - 0x77, 0x3f, 0x13, 0x1e, 0xed, 0xcf, 0x6f, 0xfd, 0x9f, 0x0e, 0x1f, 0x90, 0x8f, 0xc0, 0x84, 0x4f, - 0x47, 0x57, 0xf7, 0x6f, 0x46, 0x68, 0x6c, 0x2c, 0xe0, 0x9a, 0xa6, 0xbb, 0x19, 0x24, 0xfe, 0xf3, - 0xfa, 0xe8, 0xc2, 0xb3, 0x71, 0xec, 0x30, 0x36, 0xde, 0xa5, 0x81, 0x21, 0x64, 0x4b, 0x77, 0xc3, - 0x6b, 0xb9, 0xf5, 0x39, 0x90, 0x74, 0x80, 0x2f, 0xed, 0x84, 0x1e, 0xfd, 0xc8, 0xaf, 0x4b, 0x30, - 0xb2, 0x6c, 0xd7, 0x36, 0xf5, 0xea, 0xff, 0xd5, 0x7e, 0xbb, 0x0d, 0x47, 0x02, 0x5a, 0xde, 0x26, - 0x73, 0x9e, 0x79, 0x25, 0x06, 0xd1, 0x65, 0xbb, 0x86, 0x5e, 0x84, 0xb1, 0x70, 0xa2, 0xd0, 0x31, - 0xff, 0x6b, 0x9d, 0x05, 0x3a, 0xaf, 0xd1, 0x3a, 0xcf, 0x18, 0x68, 0x17, 0x46, 0x82, 0xb3, 0xc5, - 0xc9, 0x2e, 0x4c, 0x02, 0x98, 0xd9, 0x87, 0xfb, 0xc5, 0x74, 0x1b, 0x7b, 0x07, 0x24, 0xdc, 0x40, - 0x77, 0x57, 0x17, 0x6a, 0x81, 0xd4, 0x39, 0xa3, 0x6d, 0x13, 0x4e, 0x88, 0xf5, 0xc2, 0xa1, 0xa4, - 0x9b, 0xf5, 0x42, 0xb8, 0x5d, 0xad, 0xd7, 0x69, 0x58, 0x6d, 0x01, 0xf8, 0xc6, 0xc0, 0x3d, 0x5d, - 0x38, 0x78, 0x68, 0xd9, 0x87, 0xfa, 0x42, 0x73, 0x0f, 0x9a, 0x6e, 0x71, 0x02, 0xfe, 0x7f, 0x02, - 0x00, 0x00, 0xff, 0xff, 0x99, 0xdd, 0x46, 0x27, 0xd1, 0x97, 0x00, 0x00, + // 12507 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6b, 0x78, 0x1c, 0xd7, + 0x75, 0x18, 0x66, 0x1f, 0xc0, 0xee, 0x59, 0x3c, 0x16, 0x17, 0x20, 0x09, 0x2e, 0x29, 0x00, 0x1a, + 0xbd, 0x28, 0x4a, 0x02, 0x25, 0x4a, 0xa4, 0x44, 0xd0, 0xb6, 0xbc, 0x0b, 0x2c, 0x01, 0x48, 0x78, + 0x69, 0x00, 0x52, 0xb2, 0xfc, 0xd8, 0x0c, 0x76, 0x2f, 0x16, 0x23, 0xee, 0xce, 0x8c, 0x67, 0x66, + 0x49, 0x40, 0x49, 0xfa, 0x29, 0xb6, 0x93, 0xda, 0xcc, 0xd7, 0x26, 0xae, 0xfb, 0x35, 0x8a, 0x13, + 0xba, 0x72, 0x9c, 0xd6, 0x89, 0x93, 0x36, 0x2f, 0x37, 0x8f, 0xb6, 0x5f, 0xeb, 0xb4, 0x4d, 0xf3, + 0x6a, 0xf2, 0xd9, 0x6d, 0xbe, 0x36, 0xcd, 0x97, 0xd2, 0xa9, 0xec, 0xa6, 0xae, 0xeb, 0x26, 0x8e, + 0xea, 0x36, 0xe9, 0xe7, 0x2f, 0x5f, 0xfa, 0xdd, 0xd7, 0xbc, 0x76, 0x67, 0x67, 0x17, 0x22, 0xed, + 0xa4, 0xee, 0x2f, 0xe0, 0x9e, 0x39, 0xe7, 0xdc, 0x7b, 0xcf, 0x3d, 0xf7, 0x9c, 0x73, 0xcf, 0x7d, + 0x2c, 0xfc, 0xcc, 0x45, 0x98, 0xad, 0x1b, 0x46, 0xbd, 0x81, 0xcf, 0x98, 0x96, 0xe1, 0x18, 0x3b, + 0xad, 0xdd, 0x33, 0x35, 0x6c, 0x57, 0x2d, 0xcd, 0x74, 0x0c, 0x6b, 0x8e, 0xc2, 0xd0, 0x18, 0xc3, + 0x98, 0x13, 0x18, 0xf2, 0x1a, 0x8c, 0x5f, 0xd2, 0x1a, 0x78, 0xd1, 0x45, 0xdc, 0xc2, 0x0e, 0x7a, + 0x0a, 0x52, 0xbb, 0x5a, 0x03, 0x4f, 0x49, 0xb3, 0xc9, 0x53, 0xb9, 0xb3, 0xf7, 0xce, 0x85, 0x88, + 0xe6, 0x82, 0x14, 0x9b, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0x8b, 0x29, 0x98, 0xe8, 0xf0, 0x15, 0x21, + 0x48, 0xe9, 0x6a, 0x93, 0x70, 0x94, 0x4e, 0x65, 0x15, 0xfa, 0x3f, 0x9a, 0x82, 0x21, 0x53, 0xad, + 0x5e, 0x55, 0xeb, 0x78, 0x2a, 0x41, 0xc1, 0xa2, 0x88, 0xa6, 0x01, 0x6a, 0xd8, 0xc4, 0x7a, 0x0d, + 0xeb, 0xd5, 0x83, 0xa9, 0xe4, 0x6c, 0xf2, 0x54, 0x56, 0xf1, 0x41, 0xd0, 0x43, 0x30, 0x6e, 0xb6, + 0x76, 0x1a, 0x5a, 0xb5, 0xe2, 0x43, 0x83, 0xd9, 0xe4, 0xa9, 0xb4, 0x92, 0x67, 0x1f, 0x16, 0x3d, + 0xe4, 0x07, 0x60, 0xec, 0x3a, 0x56, 0xaf, 0xfa, 0x51, 0x73, 0x14, 0x75, 0x94, 0x80, 0x7d, 0x88, + 0x0b, 0x30, 0xdc, 0xc4, 0xb6, 0xad, 0xd6, 0x71, 0xc5, 0x39, 0x30, 0xf1, 0x54, 0x8a, 0xf6, 0x7e, + 0xb6, 0xad, 0xf7, 0xe1, 0x9e, 0xe7, 0x38, 0xd5, 0xf6, 0x81, 0x89, 0x51, 0x11, 0xb2, 0x58, 0x6f, + 0x35, 0x19, 0x87, 0x74, 0x84, 0xfc, 0xca, 0x7a, 0xab, 0x19, 0xe6, 0x92, 0x21, 0x64, 0x9c, 0xc5, + 0x90, 0x8d, 0xad, 0x6b, 0x5a, 0x15, 0x4f, 0x0d, 0x52, 0x06, 0x0f, 0xb4, 0x31, 0xd8, 0x62, 0xdf, + 0xc3, 0x3c, 0x04, 0x1d, 0x5a, 0x80, 0x2c, 0xde, 0x77, 0xb0, 0x6e, 0x6b, 0x86, 0x3e, 0x35, 0x44, + 0x99, 0xdc, 0xd7, 0x61, 0x14, 0x71, 0xa3, 0x16, 0x66, 0xe1, 0xd1, 0xa1, 0xf3, 0x30, 0x64, 0x98, + 0x8e, 0x66, 0xe8, 0xf6, 0x54, 0x66, 0x56, 0x3a, 0x95, 0x3b, 0x7b, 0xb2, 0xa3, 0x22, 0x6c, 0x30, + 0x1c, 0x45, 0x20, 0xa3, 0x15, 0xc8, 0xdb, 0x46, 0xcb, 0xaa, 0xe2, 0x4a, 0xd5, 0xa8, 0xe1, 0x8a, + 0xa6, 0xef, 0x1a, 0x53, 0x59, 0xca, 0x60, 0xa6, 0xbd, 0x23, 0x14, 0x71, 0xc1, 0xa8, 0xe1, 0x15, + 0x7d, 0xd7, 0x50, 0x46, 0xed, 0x40, 0x19, 0x1d, 0x85, 0x41, 0xfb, 0x40, 0x77, 0xd4, 0xfd, 0xa9, + 0x61, 0xaa, 0x21, 0xbc, 0x24, 0xff, 0xd2, 0x20, 0x8c, 0xf5, 0xa2, 0x62, 0x17, 0x21, 0xbd, 0x4b, + 0x7a, 0x39, 0x95, 0xe8, 0x47, 0x06, 0x8c, 0x26, 0x28, 0xc4, 0xc1, 0x43, 0x0a, 0xb1, 0x08, 0x39, + 0x1d, 0xdb, 0x0e, 0xae, 0x31, 0x8d, 0x48, 0xf6, 0xa8, 0x53, 0xc0, 0x88, 0xda, 0x55, 0x2a, 0x75, + 0x28, 0x95, 0x7a, 0x01, 0xc6, 0xdc, 0x26, 0x55, 0x2c, 0x55, 0xaf, 0x0b, 0xdd, 0x3c, 0x13, 0xd7, + 0x92, 0xb9, 0xb2, 0xa0, 0x53, 0x08, 0x99, 0x32, 0x8a, 0x03, 0x65, 0xb4, 0x08, 0x60, 0xe8, 0xd8, + 0xd8, 0xad, 0xd4, 0x70, 0xb5, 0x31, 0x95, 0x89, 0x90, 0xd2, 0x06, 0x41, 0x69, 0x93, 0x92, 0xc1, + 0xa0, 0xd5, 0x06, 0xba, 0xe0, 0xa9, 0xda, 0x50, 0x84, 0xa6, 0xac, 0xb1, 0x49, 0xd6, 0xa6, 0x6d, + 0x97, 0x61, 0xd4, 0xc2, 0x44, 0xef, 0x71, 0x8d, 0xf7, 0x2c, 0x4b, 0x1b, 0x31, 0x17, 0xdb, 0x33, + 0x85, 0x93, 0xb1, 0x8e, 0x8d, 0x58, 0xfe, 0x22, 0xba, 0x07, 0x5c, 0x40, 0x85, 0xaa, 0x15, 0x50, + 0x2b, 0x34, 0x2c, 0x80, 0xeb, 0x6a, 0x13, 0x17, 0x5e, 0x86, 0xd1, 0xa0, 0x78, 0xd0, 0x24, 0xa4, + 0x6d, 0x47, 0xb5, 0x1c, 0xaa, 0x85, 0x69, 0x85, 0x15, 0x50, 0x1e, 0x92, 0x58, 0xaf, 0x51, 0x2b, + 0x97, 0x56, 0xc8, 0xbf, 0xe8, 0xed, 0x5e, 0x87, 0x93, 0xb4, 0xc3, 0xf7, 0xb7, 0x8f, 0x68, 0x80, + 0x73, 0xb8, 0xdf, 0x85, 0x27, 0x61, 0x24, 0xd0, 0x81, 0x5e, 0xab, 0x96, 0xbf, 0x03, 0x8e, 0x74, + 0x64, 0x8d, 0x5e, 0x80, 0xc9, 0x96, 0xae, 0xe9, 0x0e, 0xb6, 0x4c, 0x0b, 0x13, 0x8d, 0x65, 0x55, + 0x4d, 0xfd, 0xd7, 0xa1, 0x08, 0x9d, 0xbb, 0xec, 0xc7, 0x66, 0x5c, 0x94, 0x89, 0x56, 0x3b, 0xf0, + 0x74, 0x36, 0xf3, 0xa5, 0xa1, 0xfc, 0x2b, 0xaf, 0xbc, 0xf2, 0x4a, 0x42, 0xfe, 0xe5, 0x41, 0x98, + 0xec, 0x34, 0x67, 0x3a, 0x4e, 0xdf, 0xa3, 0x30, 0xa8, 0xb7, 0x9a, 0x3b, 0xd8, 0xa2, 0x42, 0x4a, + 0x2b, 0xbc, 0x84, 0x8a, 0x90, 0x6e, 0xa8, 0x3b, 0xb8, 0x31, 0x95, 0x9a, 0x95, 0x4e, 0x8d, 0x9e, + 0x7d, 0xa8, 0xa7, 0x59, 0x39, 0xb7, 0x4a, 0x48, 0x14, 0x46, 0x89, 0xde, 0x06, 0x29, 0x6e, 0xa2, + 0x09, 0x87, 0xd3, 0xbd, 0x71, 0x20, 0x73, 0x49, 0xa1, 0x74, 0xe8, 0x04, 0x64, 0xc9, 0x5f, 0xa6, + 0x1b, 0x83, 0xb4, 0xcd, 0x19, 0x02, 0x20, 0x7a, 0x81, 0x0a, 0x90, 0xa1, 0xd3, 0xa4, 0x86, 0x85, + 0x6b, 0x73, 0xcb, 0x44, 0xb1, 0x6a, 0x78, 0x57, 0x6d, 0x35, 0x9c, 0xca, 0x35, 0xb5, 0xd1, 0xc2, + 0x54, 0xe1, 0xb3, 0xca, 0x30, 0x07, 0x5e, 0x21, 0x30, 0x34, 0x03, 0x39, 0x36, 0xab, 0x34, 0xbd, + 0x86, 0xf7, 0xa9, 0xf5, 0x4c, 0x2b, 0x6c, 0xa2, 0xad, 0x10, 0x08, 0xa9, 0xfe, 0x25, 0xdb, 0xd0, + 0x85, 0x6a, 0xd2, 0x2a, 0x08, 0x80, 0x56, 0xff, 0x64, 0xd8, 0x70, 0xdf, 0xd5, 0xb9, 0x7b, 0x6d, + 0x73, 0xe9, 0x01, 0x18, 0xa3, 0x18, 0x8f, 0xf3, 0xa1, 0x57, 0x1b, 0x53, 0xe3, 0xb3, 0xd2, 0xa9, + 0x8c, 0x32, 0xca, 0xc0, 0x1b, 0x1c, 0x2a, 0xff, 0x7c, 0x02, 0x52, 0xd4, 0xb0, 0x8c, 0x41, 0x6e, + 0xfb, 0x1d, 0x9b, 0xe5, 0xca, 0xe2, 0xc6, 0xe5, 0xd2, 0x6a, 0x39, 0x2f, 0xa1, 0x51, 0x00, 0x0a, + 0xb8, 0xb4, 0xba, 0x51, 0xdc, 0xce, 0x27, 0xdc, 0xf2, 0xca, 0xfa, 0xf6, 0xf9, 0x27, 0xf2, 0x49, + 0x97, 0xe0, 0x32, 0x03, 0xa4, 0xfc, 0x08, 0x8f, 0x9f, 0xcd, 0xa7, 0x51, 0x1e, 0x86, 0x19, 0x83, + 0x95, 0x17, 0xca, 0x8b, 0xe7, 0x9f, 0xc8, 0x0f, 0x06, 0x21, 0x8f, 0x9f, 0xcd, 0x0f, 0xa1, 0x11, + 0xc8, 0x52, 0x48, 0x69, 0x63, 0x63, 0x35, 0x9f, 0x71, 0x79, 0x6e, 0x6d, 0x2b, 0x2b, 0xeb, 0x4b, + 0xf9, 0xac, 0xcb, 0x73, 0x49, 0xd9, 0xb8, 0xbc, 0x99, 0x07, 0x97, 0xc3, 0x5a, 0x79, 0x6b, 0xab, + 0xb8, 0x54, 0xce, 0xe7, 0x5c, 0x8c, 0xd2, 0x3b, 0xb6, 0xcb, 0x5b, 0xf9, 0xe1, 0x40, 0xb3, 0x1e, + 0x3f, 0x9b, 0x1f, 0x71, 0xab, 0x28, 0xaf, 0x5f, 0x5e, 0xcb, 0x8f, 0xa2, 0x71, 0x18, 0x61, 0x55, + 0x88, 0x46, 0x8c, 0x85, 0x40, 0xe7, 0x9f, 0xc8, 0xe7, 0xbd, 0x86, 0x30, 0x2e, 0xe3, 0x01, 0xc0, + 0xf9, 0x27, 0xf2, 0x48, 0x5e, 0x80, 0x34, 0x55, 0x43, 0x84, 0x60, 0x74, 0xb5, 0x58, 0x2a, 0xaf, + 0x56, 0x36, 0x36, 0xb7, 0x57, 0x36, 0xd6, 0x8b, 0xab, 0x79, 0xc9, 0x83, 0x29, 0xe5, 0xe7, 0x2e, + 0xaf, 0x28, 0xe5, 0xc5, 0x7c, 0xc2, 0x0f, 0xdb, 0x2c, 0x17, 0xb7, 0xcb, 0x8b, 0xf9, 0xa4, 0x5c, + 0x85, 0xc9, 0x4e, 0x06, 0xb5, 0xe3, 0x14, 0xf2, 0xe9, 0x42, 0x22, 0x42, 0x17, 0x28, 0xaf, 0xb0, + 0x2e, 0xc8, 0x5f, 0x48, 0xc0, 0x44, 0x07, 0xa7, 0xd2, 0xb1, 0x92, 0xa7, 0x21, 0xcd, 0x74, 0x99, + 0xb9, 0xd9, 0x07, 0x3b, 0x7a, 0x27, 0xaa, 0xd9, 0x6d, 0xae, 0x96, 0xd2, 0xf9, 0x43, 0x8d, 0x64, + 0x44, 0xa8, 0x41, 0x58, 0xb4, 0x29, 0xec, 0xbb, 0xdb, 0x8c, 0x3f, 0xf3, 0x8f, 0xe7, 0x7b, 0xf1, + 0x8f, 0x14, 0xd6, 0x9f, 0x13, 0x48, 0x77, 0x70, 0x02, 0x17, 0x61, 0xbc, 0x8d, 0x51, 0xcf, 0xc6, + 0xf8, 0xfd, 0x12, 0x4c, 0x45, 0x09, 0x27, 0xc6, 0x24, 0x26, 0x02, 0x26, 0xf1, 0x62, 0x58, 0x82, + 0x77, 0x47, 0x0f, 0x42, 0xdb, 0x58, 0x7f, 0x52, 0x82, 0xa3, 0x9d, 0x43, 0xca, 0x8e, 0x6d, 0x78, + 0x1b, 0x0c, 0x36, 0xb1, 0xb3, 0x67, 0x88, 0xb0, 0xea, 0xfe, 0x0e, 0xce, 0x9a, 0x7c, 0x0e, 0x0f, + 0x36, 0xa7, 0xf2, 0x7b, 0xfb, 0x64, 0x54, 0x5c, 0xc8, 0x5a, 0xd3, 0xd6, 0xd2, 0x0f, 0x25, 0xe0, + 0x48, 0x47, 0xe6, 0x1d, 0x1b, 0x7a, 0x17, 0x80, 0xa6, 0x9b, 0x2d, 0x87, 0x85, 0x4e, 0xcc, 0x12, + 0x67, 0x29, 0x84, 0x1a, 0x2f, 0x62, 0x65, 0x5b, 0x8e, 0xfb, 0x3d, 0x49, 0xbf, 0x03, 0x03, 0x51, + 0x84, 0xa7, 0xbc, 0x86, 0xa6, 0x68, 0x43, 0xa7, 0x23, 0x7a, 0xda, 0xa6, 0x98, 0x8f, 0x42, 0xbe, + 0xda, 0xd0, 0xb0, 0xee, 0x54, 0x6c, 0xc7, 0xc2, 0x6a, 0x53, 0xd3, 0xeb, 0xd4, 0xd5, 0x64, 0xe6, + 0xd3, 0xbb, 0x6a, 0xc3, 0xc6, 0xca, 0x18, 0xfb, 0xbc, 0x25, 0xbe, 0x12, 0x0a, 0xaa, 0x40, 0x96, + 0x8f, 0x62, 0x30, 0x40, 0xc1, 0x3e, 0xbb, 0x14, 0xf2, 0x87, 0xb3, 0x90, 0xf3, 0x05, 0xe0, 0xe8, + 0x6e, 0x18, 0x7e, 0x49, 0xbd, 0xa6, 0x56, 0xc4, 0xa2, 0x8a, 0x49, 0x22, 0x47, 0x60, 0x9b, 0x7c, + 0x61, 0xf5, 0x28, 0x4c, 0x52, 0x14, 0xa3, 0xe5, 0x60, 0xab, 0x52, 0x6d, 0xa8, 0xb6, 0x4d, 0x85, + 0x96, 0xa1, 0xa8, 0x88, 0x7c, 0xdb, 0x20, 0x9f, 0x16, 0xc4, 0x17, 0x74, 0x0e, 0x26, 0x28, 0x45, + 0xb3, 0xd5, 0x70, 0x34, 0xb3, 0x81, 0x2b, 0x64, 0x99, 0x67, 0x53, 0x97, 0xe3, 0xb6, 0x6c, 0x9c, + 0x60, 0xac, 0x71, 0x04, 0xd2, 0x22, 0x1b, 0x2d, 0xc2, 0x5d, 0x94, 0xac, 0x8e, 0x75, 0x6c, 0xa9, + 0x0e, 0xae, 0xe0, 0xf7, 0xb6, 0xd4, 0x86, 0x5d, 0x51, 0xf5, 0x5a, 0x65, 0x4f, 0xb5, 0xf7, 0xa6, + 0x26, 0x09, 0x83, 0x52, 0x62, 0x4a, 0x52, 0x8e, 0x13, 0xc4, 0x25, 0x8e, 0x57, 0xa6, 0x68, 0x45, + 0xbd, 0xb6, 0xac, 0xda, 0x7b, 0x68, 0x1e, 0x8e, 0x52, 0x2e, 0xb6, 0x63, 0x69, 0x7a, 0xbd, 0x52, + 0xdd, 0xc3, 0xd5, 0xab, 0x95, 0x96, 0xb3, 0xfb, 0xd4, 0xd4, 0x09, 0x7f, 0xfd, 0xb4, 0x85, 0x5b, + 0x14, 0x67, 0x81, 0xa0, 0x5c, 0x76, 0x76, 0x9f, 0x42, 0x5b, 0x30, 0x4c, 0x06, 0xa3, 0xa9, 0xbd, + 0x8c, 0x2b, 0xbb, 0x86, 0x45, 0x7d, 0xe8, 0x68, 0x07, 0xd3, 0xe4, 0x93, 0xe0, 0xdc, 0x06, 0x27, + 0x58, 0x33, 0x6a, 0x78, 0x3e, 0xbd, 0xb5, 0x59, 0x2e, 0x2f, 0x2a, 0x39, 0xc1, 0xe5, 0x92, 0x61, + 0x11, 0x85, 0xaa, 0x1b, 0xae, 0x80, 0x73, 0x4c, 0xa1, 0xea, 0x86, 0x10, 0xef, 0x39, 0x98, 0xa8, + 0x56, 0x59, 0x9f, 0xb5, 0x6a, 0x85, 0x2f, 0xc6, 0xec, 0xa9, 0x7c, 0x40, 0x58, 0xd5, 0xea, 0x12, + 0x43, 0xe0, 0x3a, 0x6e, 0xa3, 0x0b, 0x70, 0xc4, 0x13, 0x96, 0x9f, 0x70, 0xbc, 0xad, 0x97, 0x61, + 0xd2, 0x73, 0x30, 0x61, 0x1e, 0xb4, 0x13, 0xa2, 0x40, 0x8d, 0xe6, 0x41, 0x98, 0xec, 0x49, 0x98, + 0x34, 0xf7, 0xcc, 0x76, 0xba, 0xd3, 0x7e, 0x3a, 0x64, 0xee, 0x99, 0x61, 0xc2, 0xfb, 0xe8, 0xca, + 0xdc, 0xc2, 0x55, 0xd5, 0xc1, 0xb5, 0xa9, 0x63, 0x7e, 0x74, 0xdf, 0x07, 0x34, 0x07, 0xf9, 0x6a, + 0xb5, 0x82, 0x75, 0x75, 0xa7, 0x81, 0x2b, 0xaa, 0x85, 0x75, 0xd5, 0x9e, 0x9a, 0xa1, 0xc8, 0x29, + 0xc7, 0x6a, 0x61, 0x65, 0xb4, 0x5a, 0x2d, 0xd3, 0x8f, 0x45, 0xfa, 0x0d, 0x9d, 0x86, 0x71, 0x63, + 0xe7, 0xa5, 0x2a, 0xd3, 0xc8, 0x8a, 0x69, 0xe1, 0x5d, 0x6d, 0x7f, 0xea, 0x5e, 0x2a, 0xde, 0x31, + 0xf2, 0x81, 0xea, 0xe3, 0x26, 0x05, 0xa3, 0x07, 0x21, 0x5f, 0xb5, 0xf7, 0x54, 0xcb, 0xa4, 0x26, + 0xd9, 0x36, 0xd5, 0x2a, 0x9e, 0xba, 0x8f, 0xa1, 0x32, 0xf8, 0xba, 0x00, 0x93, 0x19, 0x61, 0x5f, + 0xd7, 0x76, 0x1d, 0xc1, 0xf1, 0x01, 0x36, 0x23, 0x28, 0x8c, 0x73, 0x3b, 0x05, 0x79, 0x22, 0x89, + 0x40, 0xc5, 0xa7, 0x28, 0xda, 0xa8, 0xb9, 0x67, 0xfa, 0xeb, 0xbd, 0x07, 0x46, 0x08, 0xa6, 0x57, + 0xe9, 0x83, 0x2c, 0x70, 0x33, 0xf7, 0x7c, 0x35, 0x3e, 0x01, 0x47, 0x09, 0x52, 0x13, 0x3b, 0x6a, + 0x4d, 0x75, 0x54, 0x1f, 0xf6, 0xc3, 0x14, 0x9b, 0x88, 0x7d, 0x8d, 0x7f, 0x0c, 0xb4, 0xd3, 0x6a, + 0xed, 0x1c, 0xb8, 0x8a, 0xf5, 0x08, 0x6b, 0x27, 0x81, 0x09, 0xd5, 0xba, 0x63, 0xc1, 0xb9, 0x3c, + 0x0f, 0xc3, 0x7e, 0xbd, 0x47, 0x59, 0x60, 0x9a, 0x9f, 0x97, 0x48, 0x10, 0xb4, 0xb0, 0xb1, 0x48, + 0xc2, 0x97, 0x17, 0xcb, 0xf9, 0x04, 0x09, 0xa3, 0x56, 0x57, 0xb6, 0xcb, 0x15, 0xe5, 0xf2, 0xfa, + 0xf6, 0xca, 0x5a, 0x39, 0x9f, 0xf4, 0x05, 0xf6, 0xcf, 0xa4, 0x32, 0xf7, 0xe7, 0x1f, 0x90, 0x3f, + 0x97, 0x80, 0xd1, 0xe0, 0x4a, 0x0d, 0xbd, 0x05, 0x8e, 0x89, 0xb4, 0x8a, 0x8d, 0x9d, 0xca, 0x75, + 0xcd, 0xa2, 0x13, 0xb2, 0xa9, 0x32, 0xe7, 0xe8, 0xea, 0xcf, 0x24, 0xc7, 0xda, 0xc2, 0xce, 0xf3, + 0x9a, 0x45, 0xa6, 0x5b, 0x53, 0x75, 0xd0, 0x2a, 0xcc, 0xe8, 0x46, 0xc5, 0x76, 0x54, 0xbd, 0xa6, + 0x5a, 0xb5, 0x8a, 0x97, 0xd0, 0xaa, 0xa8, 0xd5, 0x2a, 0xb6, 0x6d, 0x83, 0x39, 0x42, 0x97, 0xcb, + 0x49, 0xdd, 0xd8, 0xe2, 0xc8, 0x9e, 0x87, 0x28, 0x72, 0xd4, 0x90, 0xfa, 0x26, 0xa3, 0xd4, 0xf7, + 0x04, 0x64, 0x9b, 0xaa, 0x59, 0xc1, 0xba, 0x63, 0x1d, 0xd0, 0xf8, 0x3c, 0xa3, 0x64, 0x9a, 0xaa, + 0x59, 0x26, 0xe5, 0x6f, 0xc8, 0x32, 0xe9, 0x99, 0x54, 0x26, 0x93, 0xcf, 0x3e, 0x93, 0xca, 0x64, + 0xf3, 0x20, 0xbf, 0x9e, 0x84, 0x61, 0x7f, 0xbc, 0x4e, 0x96, 0x3f, 0x55, 0xea, 0xb1, 0x24, 0x6a, + 0xd3, 0xee, 0xe9, 0x1a, 0xdd, 0xcf, 0x2d, 0x10, 0x57, 0x36, 0x3f, 0xc8, 0x82, 0x63, 0x85, 0x51, + 0x92, 0x30, 0x82, 0x28, 0x1b, 0x66, 0xc1, 0x48, 0x46, 0xe1, 0x25, 0xb4, 0x04, 0x83, 0x2f, 0xd9, + 0x94, 0xf7, 0x20, 0xe5, 0x7d, 0x6f, 0x77, 0xde, 0xcf, 0x6c, 0x51, 0xe6, 0xd9, 0x67, 0xb6, 0x2a, + 0xeb, 0x1b, 0xca, 0x5a, 0x71, 0x55, 0xe1, 0xe4, 0xe8, 0x38, 0xa4, 0x1a, 0xea, 0xcb, 0x07, 0x41, + 0xa7, 0x47, 0x41, 0xbd, 0x0e, 0xc2, 0x71, 0x48, 0x5d, 0xc7, 0xea, 0xd5, 0xa0, 0xab, 0xa1, 0xa0, + 0x3b, 0x38, 0x19, 0xce, 0x40, 0x9a, 0xca, 0x0b, 0x01, 0x70, 0x89, 0xe5, 0x07, 0x50, 0x06, 0x52, + 0x0b, 0x1b, 0x0a, 0x99, 0x10, 0x79, 0x18, 0x66, 0xd0, 0xca, 0xe6, 0x4a, 0x79, 0xa1, 0x9c, 0x4f, + 0xc8, 0xe7, 0x60, 0x90, 0x09, 0x81, 0x4c, 0x16, 0x57, 0x0c, 0xf9, 0x01, 0x5e, 0xe4, 0x3c, 0x24, + 0xf1, 0xf5, 0xf2, 0x5a, 0xa9, 0xac, 0xe4, 0x13, 0xc1, 0xa1, 0x4e, 0xe5, 0xd3, 0xb2, 0x0d, 0xc3, + 0xfe, 0x38, 0xfc, 0x1b, 0xb3, 0x18, 0xff, 0x8c, 0x04, 0x39, 0x5f, 0x5c, 0x4d, 0x02, 0x22, 0xb5, + 0xd1, 0x30, 0xae, 0x57, 0xd4, 0x86, 0xa6, 0xda, 0x5c, 0x35, 0x80, 0x82, 0x8a, 0x04, 0xd2, 0xeb, + 0xd0, 0x7d, 0x83, 0xa6, 0x48, 0x3a, 0x3f, 0x28, 0x7f, 0x4c, 0x82, 0x7c, 0x38, 0xb0, 0x0d, 0x35, + 0x53, 0xfa, 0x66, 0x36, 0x53, 0xfe, 0x61, 0x09, 0x46, 0x83, 0xd1, 0x6c, 0xa8, 0x79, 0x77, 0x7f, + 0x53, 0x9b, 0xf7, 0x07, 0x09, 0x18, 0x09, 0xc4, 0xb0, 0xbd, 0xb6, 0xee, 0xbd, 0x30, 0xae, 0xd5, + 0x70, 0xd3, 0x34, 0x1c, 0xac, 0x57, 0x0f, 0x2a, 0x0d, 0x7c, 0x0d, 0x37, 0xa6, 0x64, 0x6a, 0x34, + 0xce, 0x74, 0x8f, 0x92, 0xe7, 0x56, 0x3c, 0xba, 0x55, 0x42, 0x36, 0x3f, 0xb1, 0xb2, 0x58, 0x5e, + 0xdb, 0xdc, 0xd8, 0x2e, 0xaf, 0x2f, 0xbc, 0xa3, 0x72, 0x79, 0xfd, 0xd9, 0xf5, 0x8d, 0xe7, 0xd7, + 0x95, 0xbc, 0x16, 0x42, 0xbb, 0x83, 0xd3, 0x7e, 0x13, 0xf2, 0xe1, 0x46, 0xa1, 0x63, 0xd0, 0xa9, + 0x59, 0xf9, 0x01, 0x34, 0x01, 0x63, 0xeb, 0x1b, 0x95, 0xad, 0x95, 0xc5, 0x72, 0xa5, 0x7c, 0xe9, + 0x52, 0x79, 0x61, 0x7b, 0x8b, 0xe5, 0x3d, 0x5c, 0xec, 0xed, 0xc0, 0x04, 0x97, 0x3f, 0x9a, 0x84, + 0x89, 0x0e, 0x2d, 0x41, 0x45, 0xbe, 0x62, 0x61, 0x8b, 0xa8, 0x47, 0x7a, 0x69, 0xfd, 0x1c, 0x89, + 0x19, 0x36, 0x55, 0xcb, 0xe1, 0x0b, 0x9c, 0x07, 0x81, 0x48, 0x49, 0x77, 0xb4, 0x5d, 0x0d, 0x5b, + 0x3c, 0x9f, 0xc4, 0x96, 0x31, 0x63, 0x1e, 0x9c, 0xa5, 0x94, 0x1e, 0x06, 0x64, 0x1a, 0xb6, 0xe6, + 0x68, 0xd7, 0x70, 0x45, 0xd3, 0x45, 0xf2, 0x89, 0x2c, 0x6b, 0x52, 0x4a, 0x5e, 0x7c, 0x59, 0xd1, + 0x1d, 0x17, 0x5b, 0xc7, 0x75, 0x35, 0x84, 0x4d, 0x8c, 0x79, 0x52, 0xc9, 0x8b, 0x2f, 0x2e, 0xf6, + 0xdd, 0x30, 0x5c, 0x33, 0x5a, 0x24, 0xd6, 0x63, 0x78, 0xc4, 0x77, 0x48, 0x4a, 0x8e, 0xc1, 0x5c, + 0x14, 0x1e, 0xc5, 0x7b, 0x59, 0xaf, 0x61, 0x25, 0xc7, 0x60, 0x0c, 0xe5, 0x01, 0x18, 0x53, 0xeb, + 0x75, 0x8b, 0x30, 0x17, 0x8c, 0xd8, 0xba, 0x64, 0xd4, 0x05, 0x53, 0xc4, 0xc2, 0x33, 0x90, 0x11, + 0x72, 0x20, 0xae, 0x9a, 0x48, 0xa2, 0x62, 0xb2, 0xc5, 0x76, 0xe2, 0x54, 0x56, 0xc9, 0xe8, 0xe2, + 0xe3, 0xdd, 0x30, 0xac, 0xd9, 0x15, 0x2f, 0x89, 0x9f, 0x98, 0x4d, 0x9c, 0xca, 0x28, 0x39, 0xcd, + 0x76, 0x13, 0xa0, 0xf2, 0x27, 0x13, 0x30, 0x1a, 0xdc, 0x84, 0x40, 0x8b, 0x90, 0x69, 0x18, 0x55, + 0x95, 0xaa, 0x16, 0xdb, 0x01, 0x3b, 0x15, 0xb3, 0x6f, 0x31, 0xb7, 0xca, 0xf1, 0x15, 0x97, 0xb2, + 0xf0, 0xdb, 0x12, 0x64, 0x04, 0x18, 0x1d, 0x85, 0x94, 0xa9, 0x3a, 0x7b, 0x94, 0x5d, 0xba, 0x94, + 0xc8, 0x4b, 0x0a, 0x2d, 0x13, 0xb8, 0x6d, 0xaa, 0x3a, 0x55, 0x01, 0x0e, 0x27, 0x65, 0x32, 0xae, + 0x0d, 0xac, 0xd6, 0xe8, 0xa2, 0xc7, 0x68, 0x36, 0xb1, 0xee, 0xd8, 0x62, 0x5c, 0x39, 0x7c, 0x81, + 0x83, 0xd1, 0x43, 0x30, 0xee, 0x58, 0xaa, 0xd6, 0x08, 0xe0, 0xa6, 0x28, 0x6e, 0x5e, 0x7c, 0x70, + 0x91, 0xe7, 0xe1, 0xb8, 0xe0, 0x5b, 0xc3, 0x8e, 0x5a, 0xdd, 0xc3, 0x35, 0x8f, 0x68, 0x90, 0x26, + 0x37, 0x8e, 0x71, 0x84, 0x45, 0xfe, 0x5d, 0xd0, 0xca, 0x9f, 0x93, 0x60, 0x5c, 0x2c, 0xd3, 0x6a, + 0xae, 0xb0, 0xd6, 0x00, 0x54, 0x5d, 0x37, 0x1c, 0xbf, 0xb8, 0xda, 0x55, 0xb9, 0x8d, 0x6e, 0xae, + 0xe8, 0x12, 0x29, 0x3e, 0x06, 0x85, 0x26, 0x80, 0xf7, 0x25, 0x52, 0x6c, 0x33, 0x90, 0xe3, 0x3b, + 0x4c, 0x74, 0x9b, 0x92, 0x2d, 0xec, 0x81, 0x81, 0xc8, 0x7a, 0x0e, 0x4d, 0x42, 0x7a, 0x07, 0xd7, + 0x35, 0x9d, 0xe7, 0x8d, 0x59, 0x41, 0xa4, 0x5f, 0x52, 0x6e, 0xfa, 0xa5, 0xf4, 0xd7, 0x60, 0xa2, + 0x6a, 0x34, 0xc3, 0xcd, 0x2d, 0xe5, 0x43, 0xc9, 0x05, 0x7b, 0x59, 0x7a, 0xf1, 0x11, 0x8e, 0x54, + 0x37, 0x1a, 0xaa, 0x5e, 0x9f, 0x33, 0xac, 0xba, 0xb7, 0xcd, 0x4a, 0x22, 0x1e, 0xdb, 0xb7, 0xd9, + 0x6a, 0xee, 0xfc, 0x99, 0x24, 0xfd, 0x48, 0x22, 0xb9, 0xb4, 0x59, 0xfa, 0x54, 0xa2, 0xb0, 0xc4, + 0x08, 0x37, 0x85, 0x30, 0x14, 0xbc, 0xdb, 0xc0, 0x55, 0xd2, 0x41, 0xf8, 0xf2, 0x43, 0x30, 0x59, + 0x37, 0xea, 0x06, 0xe5, 0x74, 0x86, 0xfc, 0xc7, 0xf7, 0x69, 0xb3, 0x2e, 0xb4, 0x10, 0xbb, 0xa9, + 0x3b, 0xbf, 0x0e, 0x13, 0x1c, 0xb9, 0x42, 0x37, 0x8a, 0xd8, 0x32, 0x06, 0x75, 0xcd, 0xa1, 0x4d, + 0xfd, 0xcc, 0x17, 0xa9, 0xfb, 0x56, 0xc6, 0x39, 0x29, 0xf9, 0xc6, 0x56, 0x3a, 0xf3, 0x0a, 0x1c, + 0x09, 0xf0, 0x63, 0x93, 0x14, 0x5b, 0x31, 0x1c, 0x7f, 0x85, 0x73, 0x9c, 0xf0, 0x71, 0xdc, 0xe2, + 0xa4, 0xf3, 0x0b, 0x30, 0xd2, 0x0f, 0xaf, 0x7f, 0xcd, 0x79, 0x0d, 0x63, 0x3f, 0x93, 0x25, 0x18, + 0xa3, 0x4c, 0xaa, 0x2d, 0xdb, 0x31, 0x9a, 0xd4, 0x02, 0x76, 0x67, 0xf3, 0xab, 0x5f, 0x64, 0xb3, + 0x66, 0x94, 0x90, 0x2d, 0xb8, 0x54, 0xf3, 0xf3, 0x40, 0xf7, 0xc6, 0x6a, 0xb8, 0xda, 0x88, 0xe1, + 0xf0, 0x6b, 0xbc, 0x21, 0x2e, 0xfe, 0xfc, 0x15, 0x98, 0x24, 0xff, 0x53, 0x03, 0xe5, 0x6f, 0x49, + 0x7c, 0xc2, 0x6d, 0xea, 0x73, 0xef, 0x67, 0x13, 0x73, 0xc2, 0x65, 0xe0, 0x6b, 0x93, 0x6f, 0x14, + 0xeb, 0xd8, 0x71, 0xb0, 0x65, 0x57, 0xd4, 0x46, 0xa7, 0xe6, 0xf9, 0x32, 0x16, 0x53, 0x3f, 0xf8, + 0x95, 0xe0, 0x28, 0x2e, 0x31, 0xca, 0x62, 0xa3, 0x31, 0x7f, 0x19, 0x8e, 0x75, 0xd0, 0x8a, 0x1e, + 0x78, 0x7e, 0x94, 0xf3, 0x9c, 0x6c, 0xd3, 0x0c, 0xc2, 0x76, 0x13, 0x04, 0xdc, 0x1d, 0xcb, 0x1e, + 0x78, 0xfe, 0x10, 0xe7, 0x89, 0x38, 0xad, 0x18, 0x52, 0xc2, 0xf1, 0x19, 0x18, 0xbf, 0x86, 0xad, + 0x1d, 0xc3, 0xe6, 0x59, 0xa2, 0x1e, 0xd8, 0xfd, 0x30, 0x67, 0x37, 0xc6, 0x09, 0x69, 0xda, 0x88, + 0xf0, 0xba, 0x00, 0x99, 0x5d, 0xb5, 0x8a, 0x7b, 0x60, 0x71, 0x93, 0xb3, 0x18, 0x22, 0xf8, 0x84, + 0xb4, 0x08, 0xc3, 0x75, 0x83, 0xfb, 0xa8, 0x78, 0xf2, 0x8f, 0x71, 0xf2, 0x9c, 0xa0, 0xe1, 0x2c, + 0x4c, 0xc3, 0x6c, 0x35, 0x88, 0x03, 0x8b, 0x67, 0xf1, 0x77, 0x05, 0x0b, 0x41, 0xc3, 0x59, 0xf4, + 0x21, 0xd6, 0xd7, 0x04, 0x0b, 0xdb, 0x27, 0xcf, 0xa7, 0x21, 0x67, 0xe8, 0x8d, 0x03, 0x43, 0xef, + 0xa5, 0x11, 0x1f, 0xe7, 0x1c, 0x80, 0x93, 0x10, 0x06, 0x17, 0x21, 0xdb, 0xeb, 0x40, 0xfc, 0xbd, + 0xaf, 0x88, 0xe9, 0x21, 0x46, 0x60, 0x09, 0xc6, 0x84, 0x81, 0xd2, 0x0c, 0xbd, 0x07, 0x16, 0x7f, + 0x9f, 0xb3, 0x18, 0xf5, 0x91, 0xf1, 0x6e, 0x38, 0xd8, 0x76, 0xea, 0xb8, 0x17, 0x26, 0x9f, 0x14, + 0xdd, 0xe0, 0x24, 0x5c, 0x94, 0x3b, 0x58, 0xaf, 0xee, 0xf5, 0xc6, 0xe1, 0xc7, 0x84, 0x28, 0x05, + 0x0d, 0x61, 0xb1, 0x00, 0x23, 0x4d, 0xd5, 0xb2, 0xf7, 0xd4, 0x46, 0x4f, 0xc3, 0xf1, 0xe3, 0x9c, + 0xc7, 0xb0, 0x4b, 0xc4, 0x25, 0xd2, 0xd2, 0xfb, 0x61, 0xf3, 0x29, 0x21, 0x11, 0x1f, 0x19, 0x9f, + 0x7a, 0xb6, 0x43, 0x53, 0x6a, 0xfd, 0x70, 0xfb, 0x09, 0x31, 0xf5, 0x18, 0xed, 0x9a, 0x9f, 0xe3, + 0x45, 0xc8, 0xda, 0xda, 0xcb, 0x3d, 0xb1, 0xf9, 0x49, 0x31, 0xd2, 0x94, 0x80, 0x10, 0xbf, 0x03, + 0x8e, 0x77, 0x74, 0x13, 0x3d, 0x30, 0xfb, 0x07, 0x9c, 0xd9, 0xd1, 0x0e, 0xae, 0x82, 0x9b, 0x84, + 0x7e, 0x59, 0xfe, 0x43, 0x61, 0x12, 0x70, 0x88, 0xd7, 0x26, 0x59, 0x35, 0xd8, 0xea, 0x6e, 0x7f, + 0x52, 0xfb, 0x29, 0x21, 0x35, 0x46, 0x1b, 0x90, 0xda, 0x36, 0x1c, 0xe5, 0x1c, 0xfb, 0x1b, 0xd7, + 0x9f, 0x16, 0x86, 0x95, 0x51, 0x5f, 0x0e, 0x8e, 0xee, 0x3b, 0xa1, 0xe0, 0x8a, 0x53, 0x84, 0xa7, + 0x76, 0xa5, 0xa9, 0x9a, 0x3d, 0x70, 0xfe, 0x19, 0xce, 0x59, 0x58, 0x7c, 0x37, 0xbe, 0xb5, 0xd7, + 0x54, 0x93, 0x30, 0x7f, 0x01, 0xa6, 0x04, 0xf3, 0x96, 0x6e, 0xe1, 0xaa, 0x51, 0xd7, 0xb5, 0x97, + 0x71, 0xad, 0x07, 0xd6, 0x3f, 0x1b, 0x1a, 0xaa, 0xcb, 0x3e, 0x72, 0xc2, 0x79, 0x05, 0xf2, 0x6e, + 0xac, 0x52, 0xd1, 0x9a, 0xa6, 0x61, 0x39, 0x31, 0x1c, 0x7f, 0x4e, 0x8c, 0x94, 0x4b, 0xb7, 0x42, + 0xc9, 0xe6, 0xcb, 0xc0, 0xf6, 0x99, 0x7b, 0x55, 0xc9, 0x4f, 0x73, 0x46, 0x23, 0x1e, 0x15, 0x37, + 0x1c, 0x55, 0xa3, 0x69, 0xaa, 0x56, 0x2f, 0xf6, 0xef, 0x1f, 0x09, 0xc3, 0xc1, 0x49, 0xb8, 0xe1, + 0x20, 0x11, 0x1d, 0xf1, 0xf6, 0x3d, 0x70, 0xf8, 0x79, 0x61, 0x38, 0x04, 0x0d, 0x67, 0x21, 0x02, + 0x86, 0x1e, 0x58, 0xfc, 0x82, 0x60, 0x21, 0x68, 0x08, 0x8b, 0xe7, 0x3c, 0x47, 0x6b, 0xe1, 0xba, + 0x66, 0x3b, 0x16, 0x0b, 0x8a, 0xbb, 0xb3, 0xfa, 0xc5, 0xaf, 0x04, 0x83, 0x30, 0xc5, 0x47, 0x4a, + 0x2c, 0x11, 0x4f, 0xb2, 0xd2, 0x35, 0x53, 0x7c, 0xc3, 0x7e, 0x49, 0x58, 0x22, 0x1f, 0x19, 0x69, + 0x9b, 0x2f, 0x42, 0x24, 0x62, 0xaf, 0x92, 0x95, 0x42, 0x0f, 0xec, 0xfe, 0x71, 0xa8, 0x71, 0x5b, + 0x82, 0x96, 0xf0, 0xf4, 0xc5, 0x3f, 0x2d, 0xfd, 0x2a, 0x3e, 0xe8, 0x49, 0x3b, 0xff, 0x49, 0x28, + 0xfe, 0xb9, 0xcc, 0x28, 0x99, 0x0d, 0x19, 0x0b, 0xc5, 0x53, 0x28, 0xee, 0x54, 0xd1, 0xd4, 0x77, + 0x7d, 0x8d, 0xf7, 0x37, 0x18, 0x4e, 0xcd, 0xaf, 0x12, 0x25, 0x0f, 0x06, 0x3d, 0xf1, 0xcc, 0xde, + 0xff, 0x35, 0x57, 0xcf, 0x03, 0x31, 0xcf, 0xfc, 0x25, 0x18, 0x09, 0x04, 0x3c, 0xf1, 0xac, 0x3e, + 0xc0, 0x59, 0x0d, 0xfb, 0xe3, 0x9d, 0xf9, 0x73, 0x90, 0x22, 0xc1, 0x4b, 0x3c, 0xf9, 0x77, 0x73, + 0x72, 0x8a, 0x3e, 0xff, 0x56, 0xc8, 0x88, 0xa0, 0x25, 0x9e, 0xf4, 0x7b, 0x38, 0xa9, 0x4b, 0x42, + 0xc8, 0x45, 0xc0, 0x12, 0x4f, 0xfe, 0xd7, 0x05, 0xb9, 0x20, 0x21, 0xe4, 0xbd, 0x8b, 0xf0, 0x33, + 0xdf, 0x9b, 0xe2, 0x4e, 0x47, 0xc8, 0xee, 0x22, 0x0c, 0xf1, 0x48, 0x25, 0x9e, 0xfa, 0x43, 0xbc, + 0x72, 0x41, 0x31, 0xff, 0x24, 0xa4, 0x7b, 0x14, 0xf8, 0xdf, 0xe0, 0xa4, 0x0c, 0x7f, 0x7e, 0x01, + 0x72, 0xbe, 0xe8, 0x24, 0x9e, 0xfc, 0x6f, 0x72, 0x72, 0x3f, 0x15, 0x69, 0x3a, 0x8f, 0x4e, 0xe2, + 0x19, 0x7c, 0x9f, 0x68, 0x3a, 0xa7, 0x20, 0x62, 0x13, 0x81, 0x49, 0x3c, 0xf5, 0xf7, 0x0b, 0xa9, + 0x0b, 0x92, 0xf9, 0xa7, 0x21, 0xeb, 0x3a, 0x9b, 0x78, 0xfa, 0x0f, 0x73, 0x7a, 0x8f, 0x86, 0x48, + 0xc0, 0xe7, 0xec, 0xe2, 0x59, 0xfc, 0x2d, 0x21, 0x01, 0x1f, 0x15, 0x99, 0x46, 0xe1, 0x00, 0x26, + 0x9e, 0xd3, 0x47, 0xc4, 0x34, 0x0a, 0xc5, 0x2f, 0x64, 0x34, 0xa9, 0xcd, 0x8f, 0x67, 0xf1, 0xb7, + 0xc5, 0x68, 0x52, 0x7c, 0xd2, 0x8c, 0x70, 0x44, 0x10, 0xcf, 0xe3, 0x07, 0x44, 0x33, 0x42, 0x01, + 0xc1, 0xfc, 0x26, 0xa0, 0xf6, 0x68, 0x20, 0x9e, 0xdf, 0xab, 0x9c, 0xdf, 0x78, 0x5b, 0x30, 0x30, + 0xff, 0x3c, 0x1c, 0xed, 0x1c, 0x09, 0xc4, 0x73, 0xfd, 0xc1, 0xaf, 0x85, 0xd6, 0x6e, 0xfe, 0x40, + 0x60, 0x7e, 0xdb, 0x73, 0x29, 0xfe, 0x28, 0x20, 0x9e, 0xed, 0x47, 0xbf, 0x16, 0x34, 0xdc, 0xfe, + 0x20, 0x60, 0xbe, 0x08, 0xe0, 0x39, 0xe0, 0x78, 0x5e, 0x3f, 0xcc, 0x79, 0xf9, 0x88, 0xc8, 0xd4, + 0xe0, 0xfe, 0x37, 0x9e, 0xfe, 0xa6, 0x98, 0x1a, 0x9c, 0x82, 0x4c, 0x0d, 0xe1, 0x7a, 0xe3, 0xa9, + 0x3f, 0x26, 0xa6, 0x86, 0x20, 0x21, 0x9a, 0xed, 0xf3, 0x6e, 0xf1, 0x1c, 0x3e, 0x2e, 0x34, 0xdb, + 0x47, 0x35, 0xbf, 0x0e, 0xe3, 0x6d, 0x0e, 0x31, 0x9e, 0xd5, 0x8f, 0x70, 0x56, 0xf9, 0xb0, 0x3f, + 0xf4, 0x3b, 0x2f, 0xee, 0x0c, 0xe3, 0xb9, 0x7d, 0x22, 0xe4, 0xbc, 0xb8, 0x2f, 0x9c, 0xbf, 0x08, + 0x19, 0xbd, 0xd5, 0x68, 0x90, 0xc9, 0x83, 0xba, 0x9f, 0x04, 0x9c, 0xfa, 0x6f, 0x5f, 0xe7, 0xd2, + 0x11, 0x04, 0xf3, 0xe7, 0x20, 0x8d, 0x9b, 0x3b, 0xb8, 0x16, 0x47, 0xf9, 0xe5, 0xaf, 0x0b, 0x83, + 0x49, 0xb0, 0xe7, 0x9f, 0x06, 0x60, 0xa9, 0x11, 0xba, 0x19, 0x18, 0x43, 0xfb, 0xdf, 0xbf, 0xce, + 0x8f, 0xde, 0x78, 0x24, 0x1e, 0x03, 0x76, 0x90, 0xa7, 0x3b, 0x83, 0xaf, 0x04, 0x19, 0xd0, 0x11, + 0xb9, 0x00, 0x43, 0x2f, 0xd9, 0x86, 0xee, 0xa8, 0xf5, 0x38, 0xea, 0xff, 0xc1, 0xa9, 0x05, 0x3e, + 0x11, 0x58, 0xd3, 0xb0, 0xb0, 0xa3, 0xd6, 0xed, 0x38, 0xda, 0x3f, 0xe2, 0xb4, 0x2e, 0x01, 0x21, + 0xae, 0xaa, 0xb6, 0xd3, 0x4b, 0xbf, 0xff, 0x58, 0x10, 0x0b, 0x02, 0xd2, 0x68, 0xf2, 0xff, 0x55, + 0x7c, 0x10, 0x47, 0xfb, 0x55, 0xd1, 0x68, 0x8e, 0x3f, 0xff, 0x56, 0xc8, 0x92, 0x7f, 0xd9, 0x79, + 0xba, 0x18, 0xe2, 0x3f, 0xe1, 0xc4, 0x1e, 0x05, 0xa9, 0xd9, 0x76, 0x6a, 0x8e, 0x16, 0x2f, 0xec, + 0x37, 0xf8, 0x48, 0x0b, 0xfc, 0xf9, 0x22, 0xe4, 0x6c, 0xa7, 0x56, 0x6b, 0xf1, 0xf8, 0x34, 0x86, + 0xfc, 0x7f, 0x7e, 0xdd, 0x4d, 0x59, 0xb8, 0x34, 0x64, 0xb4, 0xaf, 0x5f, 0x75, 0x4c, 0x83, 0x6e, + 0x78, 0xc4, 0x71, 0xf8, 0x1a, 0xe7, 0xe0, 0x23, 0x99, 0x5f, 0x80, 0x61, 0xd2, 0x17, 0x0b, 0x9b, + 0x98, 0xee, 0x4e, 0xc5, 0xb0, 0xf8, 0x5f, 0x5c, 0x00, 0x01, 0xa2, 0xd2, 0xbb, 0x7f, 0xed, 0xf5, + 0x69, 0xe9, 0xb3, 0xaf, 0x4f, 0x4b, 0x7f, 0xf0, 0xfa, 0xb4, 0xf4, 0xfd, 0x5f, 0x98, 0x1e, 0xf8, + 0xec, 0x17, 0xa6, 0x07, 0x7e, 0xf7, 0x0b, 0xd3, 0x03, 0x9d, 0xb3, 0xc4, 0xb0, 0x64, 0x2c, 0x19, + 0x2c, 0x3f, 0xfc, 0xa2, 0x5c, 0xd7, 0x9c, 0xbd, 0xd6, 0xce, 0x5c, 0xd5, 0x68, 0xd2, 0x34, 0xae, + 0x97, 0xad, 0x75, 0x17, 0x39, 0xf0, 0xbe, 0x24, 0x1c, 0xaf, 0x1a, 0x76, 0xd3, 0xb0, 0x2b, 0x2c, + 0xdf, 0xcb, 0x0a, 0x3c, 0xe3, 0x3b, 0xec, 0xff, 0xd4, 0x43, 0xd2, 0x77, 0x19, 0x46, 0x69, 0xd7, + 0x69, 0xba, 0x8b, 0x6a, 0x5b, 0xac, 0x81, 0xf8, 0xf5, 0x7f, 0x9f, 0xa6, 0xbd, 0x1e, 0x71, 0x09, + 0xe9, 0xee, 0xfd, 0x36, 0x4c, 0x6a, 0x4d, 0xb3, 0x81, 0x69, 0x9a, 0xbf, 0xe2, 0x7e, 0x8b, 0xe7, + 0xf7, 0x1b, 0x9c, 0xdf, 0x84, 0x47, 0xbe, 0x22, 0xa8, 0xe7, 0x57, 0x61, 0x5c, 0xad, 0x56, 0xb1, + 0x19, 0x60, 0x19, 0x33, 0x2c, 0xa2, 0x81, 0x79, 0x4e, 0xe9, 0x72, 0x2b, 0x3d, 0x1d, 0x35, 0x34, + 0x2f, 0xde, 0xe7, 0x93, 0xbc, 0x85, 0xeb, 0x58, 0x7f, 0x44, 0xc7, 0xce, 0x75, 0xc3, 0xba, 0xca, + 0xc5, 0xfb, 0x08, 0xab, 0x6a, 0x90, 0x9d, 0x60, 0x86, 0x0f, 0x24, 0x61, 0x9a, 0x7d, 0x38, 0xb3, + 0xa3, 0xda, 0xf8, 0xcc, 0xb5, 0xc7, 0x76, 0xb0, 0xa3, 0x3e, 0x76, 0xa6, 0x6a, 0x68, 0x3a, 0x1f, + 0x89, 0x09, 0x3e, 0x2e, 0xe4, 0xfb, 0x1c, 0xff, 0x5e, 0xe8, 0x98, 0xa6, 0x97, 0x97, 0x20, 0xb5, + 0x60, 0x68, 0x3a, 0x9a, 0x84, 0x74, 0x0d, 0xeb, 0x46, 0x93, 0x9f, 0xb9, 0x63, 0x05, 0x74, 0x0f, + 0x0c, 0xaa, 0x4d, 0xa3, 0xa5, 0x3b, 0x6c, 0x87, 0xa2, 0x94, 0xfb, 0xb5, 0x5b, 0x33, 0x03, 0xbf, + 0x77, 0x6b, 0x26, 0xb9, 0xa2, 0x3b, 0x0a, 0xff, 0x34, 0x9f, 0xfa, 0xd2, 0x6b, 0x33, 0x92, 0xfc, + 0x0c, 0x0c, 0x2d, 0xe2, 0xea, 0x61, 0x78, 0x2d, 0xe2, 0x6a, 0x88, 0xd7, 0x83, 0x90, 0x59, 0xd1, + 0x1d, 0x76, 0x2a, 0xf2, 0x2e, 0x48, 0x6a, 0x3a, 0x3b, 0x68, 0x13, 0xaa, 0x9f, 0xc0, 0x09, 0xea, + 0x22, 0xae, 0xba, 0xa8, 0x35, 0x5c, 0x0d, 0xa3, 0x12, 0xf6, 0x04, 0x5e, 0x5a, 0xfc, 0xdd, 0xff, + 0x3c, 0x3d, 0xf0, 0xca, 0xeb, 0xd3, 0x03, 0x91, 0x23, 0xe1, 0x9f, 0x03, 0x5c, 0xc4, 0x7c, 0x08, + 0xec, 0xda, 0x55, 0xb6, 0x47, 0xe2, 0x0e, 0xc3, 0x6f, 0x0d, 0x82, 0xcc, 0x71, 0x6c, 0x47, 0xbd, + 0xaa, 0xe9, 0x75, 0x77, 0x24, 0xd4, 0x96, 0xb3, 0xf7, 0x32, 0x1f, 0x8a, 0xa3, 0x7c, 0x28, 0x38, + 0x4e, 0xf7, 0xd1, 0x28, 0x44, 0xcf, 0xae, 0x42, 0xcc, 0x98, 0xcb, 0xff, 0x26, 0x09, 0x68, 0xcb, + 0x51, 0xaf, 0xe2, 0x62, 0xcb, 0xd9, 0x33, 0x2c, 0xed, 0x65, 0x66, 0xcb, 0x30, 0x40, 0x53, 0xdd, + 0xaf, 0x38, 0xc6, 0x55, 0xac, 0xdb, 0x54, 0x34, 0xb9, 0xb3, 0xc7, 0xe7, 0x3a, 0xe8, 0xc7, 0x1c, + 0x19, 0xba, 0xd2, 0x43, 0x9f, 0xfa, 0xfc, 0xcc, 0x03, 0xf1, 0x52, 0xa0, 0xc8, 0x24, 0xb8, 0xde, + 0xdf, 0xa6, 0x8c, 0xd1, 0x15, 0x60, 0x87, 0x2c, 0x2a, 0x0d, 0xcd, 0x76, 0xf8, 0x39, 0xed, 0x73, + 0x73, 0x9d, 0xfb, 0x3e, 0xd7, 0xde, 0xcc, 0xb9, 0x2b, 0x6a, 0x43, 0xab, 0xa9, 0x8e, 0x61, 0xd9, + 0xcb, 0x03, 0x4a, 0x96, 0xb2, 0x5a, 0xd5, 0x6c, 0x07, 0x6d, 0x43, 0xb6, 0x86, 0xf5, 0x03, 0xc6, + 0x36, 0xf9, 0xe6, 0xd8, 0x66, 0x08, 0x27, 0xca, 0xf5, 0x05, 0x40, 0xaa, 0x1f, 0x4f, 0x5c, 0x4c, + 0x62, 0xe7, 0x2b, 0x23, 0xd8, 0x07, 0x38, 0xd3, 0x7b, 0x14, 0xe3, 0x6a, 0x18, 0x54, 0xb8, 0x1f, + 0xc0, 0xab, 0x13, 0x4d, 0xc1, 0x90, 0x5a, 0xab, 0x59, 0xd8, 0xb6, 0xe9, 0x06, 0x60, 0x56, 0x11, + 0xc5, 0xf9, 0xf1, 0x7f, 0xfb, 0xe9, 0x47, 0x46, 0x02, 0x1c, 0x4b, 0xc3, 0x00, 0xd7, 0x5c, 0xd2, + 0xd3, 0x1f, 0x93, 0x60, 0xbc, 0xad, 0x46, 0x24, 0xc3, 0x74, 0xf1, 0xf2, 0xf6, 0xf2, 0x86, 0xb2, + 0xf2, 0x62, 0x71, 0x7b, 0x65, 0x63, 0xbd, 0xc2, 0x8e, 0xfc, 0xaf, 0x6f, 0x6d, 0x96, 0x17, 0x56, + 0x2e, 0xad, 0x94, 0x17, 0xf3, 0x03, 0x68, 0x06, 0x4e, 0x74, 0xc0, 0x59, 0x2c, 0xaf, 0x96, 0x97, + 0x8a, 0xdb, 0xe5, 0xbc, 0x84, 0xee, 0x86, 0xbb, 0x3a, 0x32, 0x71, 0x51, 0x12, 0x11, 0x28, 0x4a, + 0xd9, 0x45, 0x49, 0x96, 0x2e, 0x45, 0xce, 0xa2, 0x87, 0xbb, 0xea, 0xcf, 0xbe, 0x3b, 0x5d, 0x82, + 0xf3, 0xe9, 0xbb, 0x12, 0x70, 0x3c, 0xec, 0x32, 0x54, 0xfd, 0x20, 0xe2, 0xd6, 0x67, 0x84, 0x35, + 0x5b, 0x86, 0x64, 0x51, 0x3f, 0x40, 0xc7, 0x59, 0x3c, 0x5d, 0x69, 0x59, 0x0d, 0x6e, 0x83, 0x86, + 0x48, 0xf9, 0xb2, 0xd5, 0x20, 0xb6, 0x49, 0x1c, 0xf4, 0x97, 0x4e, 0x0d, 0xf3, 0xd3, 0xfb, 0xf3, + 0xf9, 0x57, 0x5f, 0x9b, 0x19, 0xf8, 0xe9, 0xd7, 0x66, 0x06, 0xbe, 0xfa, 0xf1, 0x99, 0x81, 0x57, + 0x7e, 0x7f, 0x76, 0xa0, 0x74, 0x35, 0xdc, 0xbd, 0xcf, 0xc4, 0x7a, 0xd3, 0x4c, 0x51, 0x3f, 0xa0, + 0x86, 0x68, 0x53, 0x7a, 0x31, 0x4d, 0x3b, 0x27, 0x36, 0x50, 0xa7, 0xc3, 0x1b, 0xa8, 0xcf, 0xe3, + 0x46, 0xe3, 0x59, 0xdd, 0xb8, 0x4e, 0x47, 0xd5, 0x93, 0xc1, 0x47, 0x12, 0x30, 0xdd, 0xe6, 0x36, + 0x79, 0x84, 0x11, 0x75, 0xfd, 0x75, 0x1e, 0x32, 0x8b, 0x22, 0x70, 0x99, 0x82, 0x21, 0x1b, 0x57, + 0x0d, 0xbd, 0xc6, 0x66, 0x7a, 0x52, 0x11, 0x45, 0xd2, 0x6d, 0x5d, 0xd5, 0x0d, 0x9b, 0x9f, 0xb9, + 0x67, 0x85, 0xd2, 0x0f, 0x49, 0xfd, 0xc5, 0x0b, 0x23, 0xa2, 0x26, 0xd1, 0xcd, 0xc7, 0x62, 0xb7, + 0x94, 0xaf, 0x92, 0x5e, 0xba, 0x9d, 0x08, 0x6c, 0x2b, 0xf7, 0x2a, 0x95, 0x1f, 0x48, 0xc0, 0x4c, + 0x58, 0x2a, 0x24, 0x6c, 0xb3, 0x1d, 0xb5, 0x69, 0x46, 0x89, 0xe5, 0x22, 0x64, 0xb7, 0x05, 0x4e, + 0xdf, 0x72, 0xb9, 0xd9, 0xa7, 0x5c, 0x46, 0xdd, 0xaa, 0x84, 0x60, 0xce, 0xf6, 0x28, 0x18, 0xb7, + 0x1f, 0x87, 0x92, 0xcc, 0xa7, 0x52, 0x70, 0x17, 0xbd, 0x94, 0x65, 0x35, 0x35, 0xdd, 0x39, 0x53, + 0xb5, 0x0e, 0x4c, 0x87, 0x06, 0x6e, 0xc6, 0x2e, 0x97, 0xcb, 0xb8, 0xf7, 0x79, 0x8e, 0x7d, 0x8e, + 0x98, 0x39, 0xbb, 0x90, 0xde, 0x24, 0x74, 0x44, 0x22, 0x8e, 0xe1, 0xa8, 0x0d, 0x2e, 0x29, 0x56, + 0x20, 0x50, 0x76, 0x91, 0x2b, 0xc1, 0xa0, 0x9a, 0xb8, 0xc3, 0xd5, 0xc0, 0xea, 0x2e, 0x3b, 0x0f, + 0x9f, 0xa4, 0x13, 0x2a, 0x43, 0x00, 0xf4, 0xe8, 0xfb, 0x24, 0xa4, 0xd5, 0x16, 0x3b, 0xca, 0x91, + 0x24, 0x33, 0x8d, 0x16, 0xe4, 0x67, 0x61, 0x88, 0x6f, 0x28, 0xa3, 0x3c, 0x24, 0xaf, 0xe2, 0x03, + 0x5a, 0xcf, 0xb0, 0x42, 0xfe, 0x45, 0x73, 0x90, 0xa6, 0x8d, 0xe7, 0x0e, 0x64, 0x6a, 0xae, 0xad, + 0xf5, 0x73, 0xb4, 0x91, 0x0a, 0x43, 0x93, 0x9f, 0x81, 0xcc, 0xa2, 0xd1, 0xd4, 0x74, 0x23, 0xc8, + 0x2d, 0xcb, 0xb8, 0xd1, 0x36, 0x9b, 0x2d, 0x1e, 0x6f, 0x28, 0xac, 0x80, 0x8e, 0xc2, 0x20, 0xbb, + 0x1f, 0xc1, 0x8f, 0xa3, 0xf0, 0x92, 0xbc, 0x00, 0x43, 0x94, 0xf7, 0x86, 0x89, 0x10, 0xbf, 0x59, + 0xc7, 0x2f, 0x62, 0xd0, 0xd0, 0x94, 0xb3, 0x4f, 0x78, 0x8d, 0x45, 0x90, 0xaa, 0xa9, 0x8e, 0xca, + 0xfb, 0x4d, 0xff, 0x97, 0xdf, 0x06, 0x19, 0xce, 0xc4, 0x46, 0x67, 0x21, 0x69, 0x98, 0x36, 0x3f, + 0x50, 0x52, 0x88, 0xea, 0xca, 0x86, 0x59, 0x4a, 0x91, 0x48, 0x45, 0x21, 0xc8, 0x25, 0x25, 0xd2, + 0xa8, 0x3e, 0xe5, 0x33, 0xaa, 0xbe, 0x21, 0xf7, 0xfd, 0xcb, 0x86, 0xb4, 0x4d, 0x1d, 0x5c, 0x65, + 0xf9, 0x78, 0x02, 0xa6, 0x7d, 0x5f, 0xaf, 0x61, 0xcb, 0xd6, 0x0c, 0x9d, 0xfb, 0x73, 0xa6, 0x2d, + 0xc8, 0xd7, 0x48, 0xfe, 0x3d, 0x42, 0x5d, 0xde, 0x0a, 0xc9, 0xa2, 0x69, 0xa2, 0x02, 0x64, 0x68, + 0xb9, 0x6a, 0x30, 0x7d, 0x49, 0x29, 0x6e, 0x99, 0x7c, 0xb3, 0x8d, 0x5d, 0xe7, 0xba, 0x6a, 0xb9, + 0x57, 0x08, 0x45, 0x59, 0xbe, 0x00, 0xd9, 0x05, 0x43, 0xb7, 0xb1, 0x6e, 0xb7, 0xe8, 0x1c, 0xdc, + 0x69, 0x18, 0xd5, 0xab, 0x9c, 0x03, 0x2b, 0x10, 0x81, 0xab, 0xa6, 0x49, 0x29, 0x53, 0x0a, 0xf9, + 0x97, 0xc5, 0x86, 0xa5, 0xad, 0x48, 0x11, 0x5d, 0xe8, 0x5f, 0x44, 0xbc, 0x93, 0xae, 0x8c, 0xfe, + 0x5c, 0x82, 0x93, 0xed, 0x13, 0xea, 0x2a, 0x3e, 0xb0, 0xfb, 0x9d, 0x4f, 0x2f, 0x40, 0x76, 0x93, + 0xde, 0xe3, 0x7f, 0x16, 0x1f, 0xa0, 0x02, 0x0c, 0xe1, 0xda, 0xd9, 0x73, 0xe7, 0x1e, 0xbb, 0xc0, + 0xb4, 0x7d, 0x79, 0x40, 0x11, 0x00, 0x34, 0x0d, 0x59, 0x1b, 0x57, 0xcd, 0xb3, 0xe7, 0xce, 0x5f, + 0x7d, 0x8c, 0xa9, 0x17, 0x89, 0x80, 0x5c, 0xd0, 0x7c, 0x86, 0xf4, 0xfa, 0x4b, 0x1f, 0x9f, 0x91, + 0x4a, 0x69, 0x48, 0xda, 0xad, 0xe6, 0x1d, 0xd5, 0x91, 0x8f, 0xa6, 0x61, 0xd6, 0x4f, 0x49, 0x2d, + 0x95, 0x1b, 0x95, 0x70, 0x19, 0xe4, 0x7d, 0x32, 0xa0, 0x18, 0x11, 0xc1, 0x6c, 0x57, 0x49, 0xca, + 0x3f, 0x2b, 0xc1, 0xb0, 0x1b, 0x2a, 0x6d, 0x61, 0x07, 0x5d, 0xf4, 0xc7, 0x3f, 0x7c, 0xda, 0x9c, + 0x98, 0x0b, 0xd7, 0xe5, 0x85, 0x74, 0x8a, 0x0f, 0x1d, 0x3d, 0x49, 0x15, 0xd1, 0x34, 0x6c, 0x7e, + 0xad, 0x2c, 0x86, 0xd4, 0x45, 0x46, 0x0f, 0x03, 0xa2, 0x16, 0xae, 0x72, 0xcd, 0x70, 0x34, 0xbd, + 0x5e, 0x31, 0x8d, 0xeb, 0xfc, 0xb2, 0x6e, 0x52, 0xc9, 0xd3, 0x2f, 0x57, 0xe8, 0x87, 0x4d, 0x02, + 0x27, 0x8d, 0xce, 0xba, 0x5c, 0x82, 0xe1, 0x1d, 0x31, 0x02, 0xa2, 0x88, 0x2e, 0xc2, 0x90, 0xd9, + 0xda, 0xa9, 0x08, 0x8b, 0x91, 0x3b, 0x7b, 0xb2, 0xd3, 0xfc, 0x17, 0xfa, 0xc1, 0x2d, 0xc0, 0xa0, + 0xd9, 0xda, 0x21, 0xda, 0x72, 0x37, 0x0c, 0x77, 0x68, 0x4c, 0xee, 0x9a, 0xd7, 0x0e, 0xfa, 0x7c, + 0x04, 0xef, 0x41, 0xc5, 0xb4, 0x34, 0xc3, 0xd2, 0x9c, 0x03, 0x1a, 0xbf, 0x26, 0x95, 0xbc, 0xf8, + 0xb0, 0xc9, 0xe1, 0xf2, 0x55, 0x18, 0xdb, 0xa2, 0xeb, 0x5b, 0xaf, 0xe5, 0xe7, 0xbc, 0xf6, 0x49, + 0xf1, 0xed, 0x8b, 0x6c, 0x59, 0xa2, 0xad, 0x65, 0xa5, 0xe7, 0x22, 0xb5, 0xf3, 0xc9, 0xfe, 0xb5, + 0x33, 0x18, 0x21, 0xfe, 0xf1, 0xf1, 0xc0, 0xe4, 0x64, 0xca, 0xe9, 0x37, 0x5f, 0xbd, 0x2a, 0x66, + 0x5c, 0x34, 0x51, 0xe8, 0xee, 0x54, 0x0b, 0x31, 0x66, 0xb4, 0x10, 0x3b, 0x85, 0xe4, 0x0b, 0x30, + 0xb2, 0xa9, 0x5a, 0xce, 0x16, 0x76, 0x96, 0xb1, 0x5a, 0xc3, 0x56, 0xd0, 0xeb, 0x8e, 0x08, 0xaf, + 0x8b, 0x20, 0x45, 0x5d, 0x2b, 0xf3, 0x3a, 0xf4, 0x7f, 0x79, 0x0f, 0x52, 0xf4, 0x64, 0xa8, 0xeb, + 0x91, 0x39, 0x05, 0xf3, 0xc8, 0xc4, 0x96, 0x1e, 0x38, 0xd8, 0x16, 0xe1, 0x2d, 0x2d, 0xa0, 0x27, + 0x84, 0x5f, 0x4d, 0x76, 0xf7, 0xab, 0x5c, 0x11, 0xb9, 0x77, 0x6d, 0xc0, 0x50, 0x89, 0x98, 0xe2, + 0x95, 0x45, 0xb7, 0x21, 0x92, 0xd7, 0x10, 0xb4, 0x06, 0x63, 0xa6, 0x6a, 0x39, 0xf4, 0x4a, 0xcc, + 0x1e, 0xed, 0x05, 0xd7, 0xf5, 0x99, 0xf6, 0x99, 0x17, 0xe8, 0x2c, 0xaf, 0x65, 0xc4, 0xf4, 0x03, + 0xe5, 0x3f, 0x4c, 0xc1, 0x20, 0x17, 0xc6, 0x5b, 0x61, 0x88, 0x8b, 0x95, 0x6b, 0xe7, 0x5d, 0x73, + 0xed, 0x8e, 0x69, 0xce, 0x75, 0x20, 0x9c, 0x9f, 0xa0, 0x41, 0xf7, 0x43, 0xa6, 0xba, 0xa7, 0x6a, + 0x7a, 0x45, 0xab, 0x89, 0x54, 0xc3, 0xeb, 0xb7, 0x66, 0x86, 0x16, 0x08, 0x6c, 0x65, 0x51, 0x19, + 0xa2, 0x1f, 0x57, 0x6a, 0x24, 0x12, 0xd8, 0xc3, 0x5a, 0x7d, 0xcf, 0xe1, 0x33, 0x8c, 0x97, 0xd0, + 0x53, 0x90, 0x22, 0x0a, 0xc1, 0x2f, 0x4c, 0x16, 0xda, 0x12, 0x3e, 0x6e, 0xb0, 0x57, 0xca, 0x90, + 0x8a, 0xbf, 0xff, 0xf3, 0x33, 0x92, 0x42, 0x29, 0xd0, 0x02, 0x8c, 0x34, 0x54, 0xdb, 0xa9, 0x50, + 0x0f, 0x46, 0xaa, 0x4f, 0xf3, 0xf5, 0x76, 0x9b, 0x40, 0xb8, 0x60, 0x79, 0xd3, 0x73, 0x84, 0x8a, + 0x81, 0x6a, 0xe8, 0x14, 0xe4, 0x29, 0x93, 0xaa, 0xd1, 0x6c, 0x6a, 0x0e, 0x8b, 0xad, 0x06, 0xa9, + 0xdc, 0x47, 0x09, 0x7c, 0x81, 0x82, 0x69, 0x84, 0x75, 0x02, 0xb2, 0xf4, 0x8a, 0x16, 0x45, 0x61, + 0xc7, 0x91, 0x33, 0x04, 0x40, 0x3f, 0x3e, 0x00, 0x63, 0x9e, 0x7d, 0x64, 0x28, 0x19, 0xc6, 0xc5, + 0x03, 0x53, 0xc4, 0x47, 0x61, 0x52, 0xc7, 0xfb, 0xf4, 0x80, 0x74, 0x00, 0x3b, 0x4b, 0xb1, 0x11, + 0xf9, 0x76, 0x25, 0x48, 0x71, 0x1f, 0x8c, 0x56, 0x85, 0xf0, 0x19, 0x2e, 0x50, 0xdc, 0x11, 0x17, + 0x4a, 0xd1, 0x8e, 0x43, 0x46, 0x35, 0x4d, 0x86, 0x90, 0xe3, 0xf6, 0xd1, 0x34, 0xe9, 0xa7, 0xd3, + 0x30, 0x4e, 0xfb, 0x68, 0x61, 0xbb, 0xd5, 0x70, 0x38, 0x93, 0x61, 0x8a, 0x33, 0x46, 0x3e, 0x28, + 0x0c, 0x4e, 0x71, 0xef, 0x81, 0x11, 0x7c, 0x4d, 0xab, 0x61, 0xbd, 0x8a, 0x19, 0xde, 0x08, 0xc5, + 0x1b, 0x16, 0x40, 0x8a, 0xf4, 0x20, 0xb8, 0x76, 0xaf, 0x22, 0x6c, 0xf2, 0x28, 0xe3, 0x27, 0xe0, + 0x45, 0x06, 0x96, 0xa7, 0x20, 0xb5, 0xa8, 0x3a, 0x2a, 0x09, 0x30, 0x9c, 0x7d, 0xe6, 0x68, 0x86, + 0x15, 0xf2, 0xaf, 0xfc, 0xa5, 0x04, 0xa4, 0xae, 0x18, 0x0e, 0x46, 0x8f, 0xfb, 0x02, 0xc0, 0xd1, + 0x4e, 0xfa, 0xbc, 0xa5, 0xd5, 0x75, 0x5c, 0x5b, 0xb3, 0xeb, 0xbe, 0xf7, 0x14, 0x3c, 0x75, 0x4a, + 0x04, 0xd4, 0x69, 0x12, 0xd2, 0x96, 0xd1, 0xd2, 0x6b, 0xe2, 0x24, 0x2f, 0x2d, 0xa0, 0x32, 0x64, + 0x5c, 0x2d, 0x49, 0xc5, 0x69, 0xc9, 0x18, 0xd1, 0x12, 0xa2, 0xc3, 0x1c, 0xa0, 0x0c, 0xed, 0x70, + 0x65, 0x29, 0x41, 0xd6, 0x35, 0x5e, 0x5c, 0xdb, 0x7a, 0x53, 0x58, 0x8f, 0x8c, 0x38, 0x13, 0x77, + 0xec, 0x5d, 0xe1, 0x31, 0x8d, 0xcb, 0xbb, 0x1f, 0xb8, 0xf4, 0x02, 0x6a, 0xc5, 0xdf, 0x76, 0x18, + 0xa2, 0xfd, 0xf2, 0xd4, 0x8a, 0xbd, 0xef, 0x70, 0x12, 0xb2, 0xb6, 0x56, 0xd7, 0x55, 0xa7, 0x65, + 0x61, 0xae, 0x79, 0x1e, 0x40, 0xfe, 0x8c, 0x04, 0x83, 0x4c, 0x93, 0x7d, 0x72, 0x93, 0x3a, 0xcb, + 0x2d, 0x11, 0x25, 0xb7, 0xe4, 0xe1, 0xe5, 0x56, 0x04, 0x70, 0x1b, 0x63, 0xf3, 0x2b, 0xf7, 0x1d, + 0x22, 0x06, 0xd6, 0xc4, 0x2d, 0xad, 0xce, 0x27, 0xaa, 0x8f, 0x48, 0xfe, 0x4f, 0x12, 0x09, 0x62, + 0xf9, 0x77, 0x54, 0x84, 0x11, 0xd1, 0xae, 0xca, 0x6e, 0x43, 0xad, 0x73, 0xdd, 0xb9, 0x2b, 0xb2, + 0x71, 0x97, 0x1a, 0x6a, 0x5d, 0xc9, 0xf1, 0xf6, 0x90, 0x42, 0xe7, 0x71, 0x48, 0x44, 0x8c, 0x43, + 0x60, 0xe0, 0x93, 0x87, 0x1b, 0xf8, 0xc0, 0x10, 0xa5, 0xc2, 0x43, 0xf4, 0x73, 0x09, 0xba, 0x98, + 0x31, 0x0d, 0x5b, 0x6d, 0x7c, 0x23, 0x66, 0xc4, 0x09, 0xc8, 0x9a, 0x46, 0xa3, 0xc2, 0xbe, 0xb0, + 0x13, 0xee, 0x19, 0xd3, 0x68, 0x28, 0x6d, 0xc3, 0x9e, 0xbe, 0x4d, 0xd3, 0x65, 0xf0, 0x36, 0x48, + 0x6d, 0x28, 0x2c, 0x35, 0x0b, 0x86, 0x99, 0x28, 0xb8, 0x2f, 0x7b, 0x94, 0xc8, 0x80, 0x3a, 0x47, + 0xa9, 0xdd, 0xf7, 0xb2, 0x66, 0x33, 0x4c, 0x85, 0xe3, 0x11, 0x0a, 0x66, 0xfa, 0x3b, 0xad, 0x82, + 0xfd, 0x6a, 0xa9, 0x70, 0x3c, 0xf9, 0xef, 0x48, 0x00, 0xab, 0x44, 0xb2, 0xb4, 0xbf, 0xc4, 0x0b, + 0xd9, 0xb4, 0x09, 0x95, 0x40, 0xcd, 0xd3, 0x51, 0x83, 0xc6, 0xeb, 0x1f, 0xb6, 0xfd, 0xed, 0x5e, + 0x80, 0x11, 0x4f, 0x19, 0x6d, 0x2c, 0x1a, 0x33, 0xdd, 0x25, 0xaa, 0xde, 0xc2, 0x8e, 0x32, 0x7c, + 0xcd, 0x57, 0x92, 0xff, 0x85, 0x04, 0x59, 0xda, 0xa6, 0x35, 0xec, 0xa8, 0x81, 0x31, 0x94, 0x0e, + 0x3f, 0x86, 0x77, 0x01, 0x30, 0x36, 0xb6, 0xf6, 0x32, 0xe6, 0x9a, 0x95, 0xa5, 0x90, 0x2d, 0xed, + 0x65, 0x8c, 0xce, 0xbb, 0x02, 0x4f, 0x76, 0x17, 0xb8, 0x88, 0xba, 0xb9, 0xd8, 0x8f, 0xc1, 0x10, + 0x7d, 0xa2, 0x6a, 0xdf, 0xe6, 0x81, 0xf4, 0xa0, 0xde, 0x6a, 0x6e, 0xef, 0xdb, 0xf2, 0x4b, 0x30, + 0xb4, 0xbd, 0xcf, 0x72, 0x23, 0x27, 0x20, 0x6b, 0x19, 0x06, 0xf7, 0xc9, 0x2c, 0x16, 0xca, 0x10, + 0x00, 0x75, 0x41, 0x22, 0x1f, 0x90, 0xf0, 0xf2, 0x01, 0x5e, 0x42, 0x23, 0xd9, 0x53, 0x42, 0xe3, + 0xf4, 0x7f, 0x90, 0x20, 0xe7, 0xb3, 0x0f, 0xe8, 0x31, 0x38, 0x52, 0x5a, 0xdd, 0x58, 0x78, 0xb6, + 0xb2, 0xb2, 0x58, 0xb9, 0xb4, 0x5a, 0x5c, 0xf2, 0xee, 0x70, 0x15, 0x8e, 0xde, 0xb8, 0x39, 0x8b, + 0x7c, 0xb8, 0x97, 0x75, 0x9a, 0x51, 0x42, 0x67, 0x60, 0x32, 0x48, 0x52, 0x2c, 0x6d, 0x95, 0xd7, + 0xb7, 0xf3, 0x52, 0xe1, 0xc8, 0x8d, 0x9b, 0xb3, 0xe3, 0x3e, 0x8a, 0xe2, 0x8e, 0x8d, 0x75, 0xa7, + 0x9d, 0x60, 0x61, 0x63, 0x6d, 0x6d, 0x65, 0x3b, 0x9f, 0x68, 0x23, 0xe0, 0x06, 0xfb, 0x41, 0x18, + 0x0f, 0x12, 0xac, 0xaf, 0xac, 0xe6, 0x93, 0x05, 0x74, 0xe3, 0xe6, 0xec, 0xa8, 0x0f, 0x7b, 0x5d, + 0x6b, 0x14, 0x32, 0x1f, 0xfc, 0xc4, 0xf4, 0xc0, 0x8f, 0xfd, 0xe8, 0xb4, 0x44, 0x7a, 0x36, 0x12, + 0xb0, 0x11, 0xe8, 0x61, 0x38, 0xb6, 0xb5, 0xb2, 0xb4, 0x5e, 0x5e, 0xac, 0xac, 0x6d, 0x2d, 0x89, + 0x1c, 0xb4, 0xe8, 0xdd, 0xd8, 0x8d, 0x9b, 0xb3, 0x39, 0xde, 0xa5, 0x28, 0xec, 0x4d, 0xa5, 0x7c, + 0x65, 0x63, 0xbb, 0x9c, 0x97, 0x18, 0xf6, 0xa6, 0x85, 0xaf, 0x19, 0x0e, 0x7b, 0xc3, 0xee, 0x51, + 0x38, 0xde, 0x01, 0xdb, 0xed, 0xd8, 0xf8, 0x8d, 0x9b, 0xb3, 0x23, 0x9b, 0x16, 0x66, 0xf3, 0x87, + 0x52, 0xcc, 0xc1, 0x54, 0x3b, 0xc5, 0xc6, 0xe6, 0xc6, 0x56, 0x71, 0x35, 0x3f, 0x5b, 0xc8, 0xdf, + 0xb8, 0x39, 0x3b, 0x2c, 0x8c, 0x21, 0x4d, 0xf4, 0xbb, 0x3d, 0xbb, 0x93, 0x2b, 0x9e, 0xdf, 0x1a, + 0x0a, 0xe4, 0xf7, 0xd8, 0x5a, 0xc2, 0x54, 0x2d, 0xb5, 0xd9, 0xef, 0x92, 0x27, 0x26, 0xad, 0x2c, + 0xbf, 0x9a, 0x80, 0x31, 0x37, 0xa0, 0xde, 0xa4, 0x35, 0xa0, 0x0b, 0xfe, 0xbc, 0x4c, 0x2e, 0xd2, + 0x95, 0x31, 0x6c, 0xb1, 0x74, 0x60, 0xc9, 0x9b, 0x12, 0x64, 0x44, 0x78, 0xc6, 0x0d, 0xc7, 0x6c, + 0x3b, 0x75, 0x99, 0x63, 0x04, 0x18, 0xb8, 0x74, 0xa8, 0x0c, 0x59, 0xd7, 0x98, 0xb8, 0x2f, 0xc2, + 0x44, 0x5b, 0x9f, 0x00, 0x17, 0x8f, 0x12, 0x3d, 0xed, 0x2d, 0x26, 0x52, 0x51, 0xcb, 0x93, 0x2b, + 0x0c, 0x21, 0xc0, 0x42, 0x50, 0xc9, 0x98, 0x4f, 0x49, 0x2e, 0x15, 0x7a, 0xb3, 0x7e, 0xbf, 0xc2, + 0x56, 0x59, 0x2c, 0x62, 0xc9, 0x34, 0xd5, 0xfd, 0x12, 0x5d, 0x68, 0x1d, 0x83, 0x21, 0xf2, 0xb1, + 0xce, 0xaf, 0x1e, 0x27, 0x95, 0xc1, 0xa6, 0xba, 0xbf, 0xa4, 0xda, 0x68, 0x16, 0x86, 0x89, 0x07, + 0xa9, 0x68, 0x86, 0xa3, 0x56, 0x9a, 0x36, 0x5f, 0x71, 0x00, 0x81, 0xad, 0x18, 0x8e, 0xba, 0x66, + 0xcb, 0x3f, 0x2e, 0xc1, 0x68, 0x50, 0x22, 0xe8, 0x21, 0x40, 0x84, 0x9b, 0x5a, 0xc7, 0x15, 0x62, + 0x9a, 0xa8, 0x68, 0x45, 0x9d, 0x63, 0x4d, 0x75, 0xbf, 0x58, 0xc7, 0xeb, 0xad, 0x26, 0x6d, 0x9c, + 0x8d, 0xd6, 0x20, 0x2f, 0x90, 0xc5, 0xd8, 0x72, 0xd1, 0x1f, 0x6f, 0x7f, 0x47, 0x8e, 0x23, 0x30, + 0x07, 0xf7, 0x2a, 0x71, 0x70, 0xa3, 0x8c, 0x9f, 0xbb, 0x95, 0x10, 0xe8, 0x66, 0x32, 0xd8, 0x4d, + 0xf9, 0x69, 0x18, 0x0b, 0xc9, 0x1d, 0xc9, 0x30, 0xc2, 0x33, 0x0a, 0x74, 0x33, 0x4d, 0x6c, 0x78, + 0xe5, 0x58, 0xe6, 0x80, 0xa6, 0xad, 0xe7, 0x33, 0xbf, 0xf8, 0xda, 0x8c, 0x44, 0x37, 0x78, 0xe7, + 0x61, 0x24, 0x20, 0x73, 0x7a, 0x6f, 0xdb, 0x34, 0x2b, 0xfe, 0x65, 0x5f, 0x4a, 0x01, 0xd5, 0x34, + 0x39, 0x9a, 0x8f, 0xf6, 0x45, 0x18, 0x26, 0xf6, 0x16, 0xd7, 0x38, 0xe9, 0xfd, 0x30, 0xc6, 0xfc, + 0x41, 0x78, 0x58, 0x58, 0x40, 0xb6, 0x26, 0xc6, 0x46, 0x16, 0x11, 0x5a, 0x70, 0x84, 0x72, 0x02, + 0x6b, 0x49, 0xb5, 0x4b, 0x97, 0x7f, 0xec, 0xf5, 0x69, 0xe9, 0xce, 0xcd, 0xe7, 0x7f, 0xb5, 0x04, + 0x27, 0x7c, 0x1f, 0xd5, 0x9d, 0xaa, 0x16, 0x48, 0x60, 0x8c, 0xf9, 0x34, 0x93, 0x7c, 0x8c, 0x4b, + 0x44, 0x74, 0x4d, 0x87, 0x74, 0xcf, 0xbf, 0x15, 0xba, 0x1b, 0x96, 0xf8, 0x1c, 0x49, 0xe7, 0xb4, + 0xe7, 0x87, 0x33, 0x30, 0xa4, 0xe0, 0xf7, 0xb6, 0xb0, 0xed, 0xa0, 0xb3, 0x90, 0xc2, 0xd5, 0x3d, + 0xa3, 0x53, 0x86, 0x89, 0x74, 0x6e, 0x8e, 0xe3, 0x95, 0xab, 0x7b, 0xc6, 0xf2, 0x80, 0x42, 0x71, + 0xd1, 0x39, 0x48, 0xef, 0x36, 0x5a, 0x3c, 0xe5, 0x11, 0xb2, 0x39, 0x7e, 0xa2, 0x4b, 0x04, 0x69, + 0x79, 0x40, 0x61, 0xd8, 0xa4, 0x2a, 0xfa, 0x48, 0x67, 0xb2, 0x7b, 0x55, 0x2b, 0xfa, 0x2e, 0xad, + 0x8a, 0xe0, 0xa2, 0x12, 0x80, 0x8d, 0x1d, 0x71, 0x03, 0x3b, 0xd5, 0x6e, 0x60, 0xfc, 0x94, 0x5b, + 0xd8, 0x61, 0x47, 0x3c, 0x58, 0x72, 0x96, 0x17, 0x08, 0x0f, 0x4d, 0xd7, 0x9c, 0x0a, 0x4d, 0x29, + 0xf0, 0xc0, 0xf4, 0xee, 0xe8, 0xda, 0x35, 0x87, 0x26, 0x21, 0x08, 0x0f, 0x4d, 0x14, 0x48, 0x97, + 0xdf, 0xdb, 0xc2, 0xd6, 0x01, 0x8f, 0x47, 0x23, 0xbb, 0xfc, 0x1c, 0x41, 0x22, 0x5d, 0xa6, 0xd8, + 0xa8, 0x0c, 0x39, 0x7a, 0x27, 0x94, 0x99, 0x05, 0xfe, 0xe8, 0xa4, 0x1c, 0x45, 0x5c, 0x22, 0xa8, + 0xd4, 0x52, 0x2c, 0x0f, 0x28, 0xb0, 0xe3, 0x96, 0xd0, 0x5b, 0x20, 0xc3, 0x1e, 0x25, 0x72, 0xf6, + 0xf9, 0x53, 0x7b, 0x33, 0x51, 0x3c, 0xe8, 0xcb, 0x44, 0xdb, 0xfb, 0xcb, 0x03, 0xca, 0x50, 0x95, + 0xfd, 0x4b, 0xfa, 0x5f, 0xc3, 0x0d, 0xed, 0x1a, 0xb6, 0x08, 0x7d, 0xb6, 0x7b, 0xff, 0x17, 0x19, + 0x26, 0xe5, 0x90, 0xad, 0x89, 0x02, 0x7a, 0x1a, 0xb2, 0x58, 0xaf, 0xf1, 0x6e, 0x40, 0xbb, 0xb3, + 0x08, 0xe8, 0x8a, 0x5e, 0x13, 0x9d, 0xc8, 0x60, 0xfe, 0x3f, 0x7a, 0xca, 0x0d, 0x98, 0x73, 0xed, + 0x31, 0x6a, 0xa0, 0x03, 0x2c, 0x75, 0x32, 0x20, 0x02, 0x67, 0xb4, 0x0e, 0xa3, 0x0d, 0xcd, 0x76, + 0x2a, 0xb6, 0xae, 0x9a, 0xf6, 0x9e, 0xe1, 0xd8, 0x34, 0x07, 0x91, 0x3b, 0x7b, 0x5f, 0x14, 0x87, + 0x55, 0xcd, 0x76, 0xb6, 0x04, 0xf2, 0xf2, 0x80, 0x32, 0xd2, 0xf0, 0x03, 0x08, 0x3f, 0x63, 0x77, + 0x17, 0x5b, 0x2e, 0x43, 0x9a, 0xab, 0xe8, 0xc2, 0x6f, 0x83, 0x60, 0x0b, 0x7a, 0xc2, 0xcf, 0xf0, + 0x03, 0xd0, 0x3b, 0x61, 0xa2, 0x61, 0xa8, 0x35, 0x97, 0x5d, 0xa5, 0xba, 0xd7, 0xd2, 0xaf, 0xd2, + 0xc4, 0x46, 0xee, 0xec, 0x83, 0x91, 0x8d, 0x34, 0xd4, 0x9a, 0x60, 0xb1, 0x40, 0x08, 0x96, 0x07, + 0x94, 0xf1, 0x46, 0x18, 0x88, 0xde, 0x03, 0x93, 0xaa, 0x69, 0x36, 0x0e, 0xc2, 0xdc, 0xc7, 0x28, + 0xf7, 0xd3, 0x51, 0xdc, 0x8b, 0x84, 0x26, 0xcc, 0x1e, 0xa9, 0x6d, 0xd0, 0xd2, 0x10, 0xdf, 0x69, + 0x97, 0x1f, 0x80, 0x9c, 0x6f, 0xaa, 0xa3, 0x29, 0x18, 0xe2, 0xe7, 0x4e, 0xc5, 0xde, 0x3c, 0x2f, + 0xca, 0xa3, 0x30, 0xec, 0x9f, 0xde, 0x72, 0xd3, 0x25, 0xa4, 0x17, 0xb5, 0xa7, 0x82, 0x69, 0xc1, + 0xac, 0x97, 0xf1, 0xbb, 0x47, 0x98, 0x76, 0xf1, 0x9d, 0xed, 0x1a, 0x0d, 0x53, 0x20, 0xf7, 0x20, + 0xc4, 0xc5, 0x98, 0x67, 0x3d, 0x17, 0x93, 0x64, 0x2e, 0xc6, 0x3c, 0x2b, 0x5c, 0x8c, 0x3c, 0x0f, + 0xf9, 0xf0, 0x6c, 0xef, 0xbc, 0xab, 0xe8, 0x1d, 0x20, 0xc8, 0xf2, 0x03, 0x04, 0xf2, 0x6f, 0x26, + 0x5c, 0x62, 0x77, 0x9a, 0xbb, 0x89, 0x44, 0xa9, 0xef, 0x44, 0xe2, 0xf1, 0x70, 0x0a, 0xd3, 0xcb, + 0x5a, 0x3e, 0x0b, 0x79, 0x2f, 0xf9, 0xc6, 0x4c, 0x36, 0x37, 0x7b, 0xed, 0xb3, 0x26, 0x14, 0xd1, + 0x29, 0x63, 0xd5, 0x50, 0x88, 0x77, 0x29, 0xb0, 0xe7, 0x22, 0x9e, 0x8b, 0x0e, 0xb3, 0x71, 0x7d, + 0xfd, 0x65, 0xb3, 0xa6, 0x3a, 0x58, 0xe4, 0x42, 0x7c, 0xdb, 0x2f, 0xf7, 0xc3, 0x18, 0x71, 0xdf, + 0xb6, 0xa3, 0x3a, 0x98, 0xfb, 0xe0, 0x34, 0x4b, 0x09, 0xaa, 0xa6, 0xb9, 0x45, 0xa0, 0xcc, 0x07, + 0xdf, 0x07, 0xa3, 0xc4, 0xf0, 0x69, 0x6a, 0xa3, 0xc2, 0x33, 0x03, 0x83, 0xcc, 0x55, 0x73, 0xe8, + 0x32, 0x05, 0xca, 0x35, 0x57, 0x11, 0xa8, 0xd1, 0x73, 0x97, 0x56, 0x92, 0x6f, 0x69, 0x85, 0xf8, + 0xcd, 0x7a, 0x26, 0x1e, 0xf1, 0x18, 0x41, 0xe7, 0x8c, 0xee, 0x24, 0x5d, 0x86, 0x5d, 0x63, 0x49, + 0x8e, 0x8c, 0xc2, 0x0a, 0xf2, 0x07, 0x12, 0x30, 0xde, 0x66, 0x1e, 0x3b, 0xa6, 0xba, 0xbd, 0x35, + 0x65, 0xa2, 0xaf, 0x35, 0xe5, 0x46, 0x30, 0x95, 0xeb, 0x73, 0x51, 0xed, 0x46, 0x76, 0xd5, 0xcd, + 0xed, 0x12, 0x65, 0xe7, 0x8c, 0x7c, 0x19, 0x5f, 0x3a, 0x05, 0x14, 0x98, 0xdc, 0x39, 0x78, 0x59, + 0xd5, 0x1d, 0x4d, 0xc7, 0x95, 0xb6, 0x91, 0x3b, 0xde, 0xc6, 0x54, 0x04, 0x94, 0x9c, 0xdd, 0x84, + 0x4b, 0xec, 0x65, 0x74, 0x65, 0x05, 0x46, 0x83, 0x06, 0x1e, 0x8d, 0x42, 0xc2, 0xd9, 0xe7, 0x02, + 0x48, 0x38, 0xfb, 0xe8, 0x51, 0x9e, 0xfc, 0x49, 0xd0, 0xe4, 0x4f, 0xbb, 0x77, 0xe5, 0x74, 0x5e, + 0xe6, 0x47, 0x96, 0xdd, 0xd9, 0xe0, 0x1a, 0xfd, 0x30, 0x57, 0xf9, 0x41, 0x18, 0x0b, 0x59, 0xf5, + 0xa8, 0x54, 0xa0, 0x3c, 0x06, 0x23, 0x01, 0x13, 0x2e, 0x1f, 0x85, 0xc9, 0x4e, 0x16, 0x59, 0xde, + 0x73, 0xe1, 0x01, 0xcb, 0x8a, 0xce, 0x41, 0xc6, 0x35, 0xc9, 0x1d, 0x52, 0x0f, 0xb4, 0x17, 0x02, + 0x59, 0x71, 0x51, 0x03, 0x19, 0xec, 0x44, 0x20, 0x83, 0x2d, 0x7f, 0x1b, 0x4c, 0x45, 0x99, 0xdb, + 0x50, 0x37, 0x52, 0xae, 0x1a, 0x1e, 0x85, 0x41, 0xfe, 0x6c, 0x58, 0x82, 0xee, 0xd9, 0xf0, 0x12, + 0x51, 0x4f, 0x66, 0x7a, 0x93, 0x6c, 0x2b, 0x87, 0x16, 0xe4, 0x0a, 0x1c, 0x8f, 0x34, 0xb9, 0xd1, + 0xbb, 0x3f, 0x8c, 0x11, 0xdf, 0xfd, 0xa9, 0x8a, 0xe6, 0xd8, 0xb4, 0xaf, 0xe2, 0xc4, 0x03, 0x2b, + 0xc9, 0xff, 0x25, 0x03, 0x19, 0x05, 0xdb, 0x26, 0xb1, 0x09, 0xa8, 0x04, 0x59, 0xbc, 0x5f, 0xc5, + 0xa6, 0xe3, 0xed, 0xba, 0x74, 0x0a, 0x26, 0x18, 0x76, 0x59, 0x60, 0x12, 0x4f, 0xee, 0x92, 0xa1, + 0xc7, 0x79, 0xc0, 0x17, 0x1d, 0xbb, 0x71, 0x72, 0x7f, 0xc4, 0x77, 0x5e, 0x44, 0x7c, 0xc9, 0x48, + 0xe7, 0xcd, 0xa8, 0x42, 0x21, 0xdf, 0xe3, 0x3c, 0xe4, 0x4b, 0xc5, 0x54, 0x16, 0x88, 0xf9, 0x16, + 0x02, 0x31, 0x5f, 0x3a, 0xa6, 0x9b, 0x11, 0x41, 0xdf, 0x42, 0x20, 0xe8, 0x1b, 0x8c, 0x61, 0x12, + 0x11, 0xf5, 0x9d, 0x17, 0x51, 0xdf, 0x50, 0x4c, 0xb7, 0x43, 0x61, 0xdf, 0xa5, 0x60, 0xd8, 0xc7, + 0x42, 0xb6, 0x7b, 0x22, 0xa9, 0x23, 0xe3, 0xbe, 0xb7, 0xfa, 0xe2, 0xbe, 0x6c, 0x64, 0xd0, 0xc5, + 0x98, 0x74, 0x08, 0xfc, 0x16, 0x02, 0x81, 0x1f, 0xc4, 0xc8, 0x20, 0x22, 0xf2, 0x7b, 0xbb, 0x3f, + 0xf2, 0xcb, 0x45, 0x06, 0x8f, 0x5c, 0x69, 0x3a, 0x85, 0x7e, 0x17, 0xdc, 0xd0, 0x6f, 0x38, 0x32, + 0x76, 0xe5, 0x7d, 0x08, 0xc7, 0x7e, 0x1b, 0x6d, 0xb1, 0xdf, 0x08, 0x7f, 0xc6, 0x3c, 0x8a, 0x45, + 0x4c, 0xf0, 0xb7, 0xd1, 0x16, 0xfc, 0x8d, 0xc6, 0x30, 0x8c, 0x89, 0xfe, 0xde, 0xd5, 0x39, 0xfa, + 0x8b, 0x8e, 0xcf, 0x78, 0x33, 0x7b, 0x0b, 0xff, 0x2a, 0x11, 0xe1, 0x5f, 0x9e, 0xb2, 0x7f, 0x28, + 0x92, 0x7d, 0xff, 0xf1, 0xdf, 0x83, 0xc4, 0xcd, 0x86, 0x0c, 0x07, 0x31, 0x55, 0xd8, 0xb2, 0x0c, + 0x4b, 0x9c, 0x11, 0xa7, 0x05, 0xf9, 0x14, 0x71, 0xfc, 0x9e, 0x91, 0xe8, 0x12, 0x2b, 0x52, 0x97, + 0xe0, 0x33, 0x0c, 0xf2, 0x2f, 0x4a, 0x1e, 0x2d, 0xf5, 0x95, 0xfe, 0xa0, 0x21, 0xcb, 0x83, 0x06, + 0x5f, 0x08, 0x99, 0x08, 0x86, 0x90, 0xa1, 0x04, 0x44, 0x32, 0x9c, 0x80, 0x70, 0xb7, 0x2c, 0x59, + 0xa0, 0xc9, 0xed, 0x3b, 0xcb, 0x14, 0x8f, 0xb9, 0xdb, 0xb7, 0x2c, 0x7e, 0x41, 0x8f, 0xc0, 0x84, + 0x0f, 0xd7, 0x75, 0x21, 0x2c, 0x24, 0xca, 0xbb, 0xd8, 0x45, 0xee, 0x4b, 0xd6, 0x3c, 0x01, 0x79, + 0x91, 0x27, 0x82, 0x54, 0xd5, 0xa8, 0x61, 0x6e, 0xe0, 0xe9, 0xff, 0x24, 0x1a, 0x6d, 0x18, 0x75, + 0x6e, 0xc6, 0xc9, 0xbf, 0x04, 0xcb, 0xb5, 0x82, 0x59, 0x66, 0xe4, 0xe4, 0x7f, 0x29, 0x79, 0xfc, + 0xbc, 0x60, 0xb4, 0x53, 0xdc, 0x28, 0xdd, 0x9e, 0xb8, 0x31, 0x71, 0xe8, 0xb8, 0xd1, 0xef, 0x60, + 0x93, 0x41, 0x07, 0xfb, 0xa7, 0x92, 0x37, 0xc2, 0x6e, 0x14, 0x78, 0x38, 0x89, 0x78, 0xde, 0x32, + 0xed, 0x3f, 0xbd, 0xc8, 0x63, 0xfb, 0x41, 0xef, 0x48, 0x9f, 0x1b, 0xdb, 0x0f, 0xf9, 0x0e, 0x07, + 0xa3, 0xa7, 0x20, 0x4b, 0x93, 0x2e, 0x15, 0xc3, 0x14, 0xcf, 0xd1, 0x9f, 0x88, 0x3e, 0xce, 0x67, + 0xd3, 0xc3, 0x45, 0xec, 0x08, 0xa0, 0x17, 0x08, 0x64, 0x03, 0xf1, 0xe8, 0x49, 0xc8, 0x92, 0xd6, + 0xb3, 0x67, 0x55, 0x81, 0x5f, 0x64, 0x12, 0x00, 0xf9, 0x3d, 0x80, 0xda, 0xcd, 0x37, 0x5a, 0x86, + 0x41, 0x7c, 0x8d, 0xbe, 0x72, 0xc5, 0x8e, 0x46, 0x1d, 0xed, 0x10, 0xec, 0x61, 0xdd, 0x29, 0x4d, + 0x11, 0x21, 0x7f, 0xf9, 0xd6, 0x4c, 0x9e, 0x61, 0x3f, 0x6c, 0x34, 0x35, 0x07, 0x37, 0x4d, 0xe7, + 0x40, 0xe1, 0xf4, 0xf2, 0xfb, 0x13, 0x24, 0xf2, 0x0a, 0x98, 0xf6, 0x8e, 0xb2, 0xed, 0xb4, 0xa1, + 0xd1, 0x9b, 0xbc, 0xa7, 0x01, 0xea, 0xaa, 0x5d, 0xb9, 0xae, 0xea, 0x0e, 0xae, 0x71, 0xa1, 0xfb, + 0x20, 0xa8, 0x00, 0x19, 0x52, 0x6a, 0xd9, 0xb8, 0xc6, 0x17, 0x00, 0x6e, 0xd9, 0xd7, 0xcf, 0xa1, + 0x37, 0xd7, 0xcf, 0xa0, 0x94, 0x33, 0x61, 0x29, 0x7f, 0x77, 0xc2, 0x9b, 0x25, 0x5e, 0x90, 0xfa, + 0xad, 0x27, 0x87, 0xef, 0xa5, 0x2b, 0xd7, 0xa0, 0x8f, 0x45, 0x5b, 0xfe, 0xad, 0xe8, 0x16, 0x9d, + 0xbd, 0x42, 0xef, 0x7a, 0x9d, 0xe6, 0xde, 0x96, 0x35, 0x03, 0xdb, 0xe8, 0x05, 0x38, 0x16, 0xb2, + 0x40, 0x2e, 0xeb, 0x44, 0x8f, 0x86, 0xe8, 0x48, 0xd0, 0x10, 0x09, 0xce, 0x9e, 0xac, 0x92, 0x6f, + 0x72, 0x6e, 0xac, 0x90, 0xc5, 0x90, 0x3f, 0x62, 0xe8, 0x38, 0xfa, 0xf4, 0x55, 0x7d, 0x87, 0xac, + 0xcf, 0x03, 0xcb, 0xcd, 0x61, 0x06, 0xe4, 0x8b, 0xd8, 0x4d, 0x38, 0xd2, 0x31, 0x72, 0x40, 0x4f, + 0x42, 0xd6, 0x0b, 0x3a, 0xa4, 0x88, 0x95, 0x9b, 0xbb, 0x1a, 0xf1, 0x70, 0xe5, 0x7f, 0x26, 0x79, + 0x2c, 0x83, 0xeb, 0x9b, 0x32, 0x0c, 0xb2, 0xa3, 0x34, 0x7c, 0x83, 0xfe, 0x91, 0xde, 0x62, 0x8e, + 0x39, 0x76, 0xce, 0x46, 0xe1, 0xc4, 0xf2, 0x7b, 0x60, 0x90, 0x41, 0x50, 0x0e, 0x86, 0xbc, 0xe7, + 0x22, 0x01, 0x06, 0x8b, 0x0b, 0x0b, 0xe5, 0xcd, 0xed, 0xbc, 0x84, 0xb2, 0x90, 0x2e, 0x96, 0x36, + 0x94, 0xed, 0x7c, 0x82, 0x80, 0x95, 0xf2, 0x33, 0xe5, 0x85, 0xed, 0x7c, 0x12, 0x8d, 0xc3, 0x08, + 0xfb, 0xbf, 0x72, 0x69, 0x43, 0x59, 0x2b, 0x6e, 0xe7, 0x53, 0x3e, 0xd0, 0x56, 0x79, 0x7d, 0xb1, + 0xac, 0xe4, 0xd3, 0xf2, 0x63, 0x64, 0x49, 0x13, 0x11, 0xa5, 0x78, 0x8b, 0x17, 0xc9, 0xb7, 0x78, + 0x91, 0x5f, 0x4d, 0x40, 0x21, 0x3a, 0xf4, 0x40, 0xcf, 0x84, 0x3a, 0x7e, 0xb6, 0x8f, 0xb8, 0x25, + 0xd4, 0x7b, 0x74, 0x1f, 0x8c, 0x5a, 0x78, 0x17, 0x3b, 0xd5, 0x3d, 0x16, 0x0a, 0x31, 0xc7, 0x36, + 0xa2, 0x8c, 0x70, 0x28, 0x25, 0xb2, 0x19, 0xda, 0x4b, 0xb8, 0xea, 0x54, 0xd8, 0x3a, 0xca, 0xe6, + 0x3f, 0xef, 0x35, 0xc2, 0xa0, 0x5b, 0x0c, 0x28, 0x7f, 0x5b, 0x5f, 0xb2, 0xcc, 0x42, 0x5a, 0x29, + 0x6f, 0x2b, 0xef, 0xc8, 0x27, 0x11, 0x82, 0x51, 0xfa, 0x6f, 0x65, 0x6b, 0xbd, 0xb8, 0xb9, 0xb5, + 0xbc, 0x41, 0x64, 0x39, 0x01, 0x63, 0x42, 0x96, 0x02, 0x98, 0x96, 0xff, 0x42, 0x6a, 0xdf, 0xb3, + 0x3b, 0x1b, 0xdc, 0xb3, 0x6b, 0x5f, 0xab, 0xfb, 0xb6, 0xb2, 0xc4, 0x66, 0xdd, 0x5b, 0xfa, 0xdf, + 0xac, 0xf3, 0x6d, 0xd3, 0x3d, 0x7d, 0x98, 0x6d, 0x3a, 0xff, 0x06, 0xdd, 0x85, 0x7e, 0x37, 0xe8, + 0xbc, 0xad, 0xb9, 0x85, 0xdb, 0xb0, 0x35, 0x27, 0xbf, 0x1b, 0x46, 0x83, 0xb9, 0x17, 0xef, 0x7c, + 0x8a, 0xe4, 0x3f, 0x9f, 0x72, 0x0e, 0xd2, 0xd7, 0x0c, 0x66, 0xac, 0x3a, 0x4f, 0xd9, 0x2b, 0x86, + 0x83, 0x7d, 0xb9, 0x1b, 0x86, 0x2d, 0xbf, 0x0c, 0x69, 0x6a, 0x7c, 0x3a, 0xde, 0x2a, 0x78, 0x37, + 0x80, 0xea, 0x38, 0x96, 0xb6, 0xd3, 0xf2, 0x18, 0xcf, 0x74, 0x36, 0x5e, 0x45, 0x81, 0x57, 0x3a, + 0xc9, 0xad, 0xd8, 0xa4, 0x47, 0xea, 0xb3, 0x64, 0x3e, 0x86, 0xf2, 0x3a, 0x8c, 0x06, 0x69, 0x3b, + 0xdc, 0xb9, 0xe8, 0x78, 0x21, 0xca, 0x8b, 0x98, 0xf8, 0x9d, 0x78, 0x5a, 0x90, 0x6f, 0x48, 0x90, + 0xd9, 0xde, 0xe7, 0x6a, 0xdd, 0xe5, 0xdc, 0x96, 0x77, 0x55, 0xc4, 0x4d, 0x4d, 0xb0, 0xec, 0x4f, + 0xd2, 0xcd, 0x29, 0xbd, 0xdd, 0x9d, 0xb8, 0xa9, 0x5e, 0x17, 0x8f, 0x22, 0xb9, 0xc6, 0x8d, 0xd5, + 0xc5, 0xde, 0x8e, 0x62, 0x4f, 0x42, 0xda, 0x7f, 0x8c, 0x9a, 0x15, 0xe4, 0x9a, 0x6f, 0x07, 0x93, + 0x79, 0x11, 0xff, 0x99, 0x6d, 0xa9, 0xef, 0x33, 0xdb, 0x6e, 0x2d, 0x09, 0x7f, 0x2d, 0xd7, 0x20, + 0x23, 0x94, 0x02, 0xbd, 0xcd, 0x3f, 0x4f, 0x44, 0x46, 0x38, 0xd2, 0x95, 0xb6, 0xef, 0x63, 0x9f, + 0x86, 0x71, 0x7e, 0xaa, 0xc7, 0x5b, 0x5a, 0xf0, 0xf7, 0xad, 0xc7, 0xd8, 0x87, 0x55, 0xb1, 0xae, + 0x90, 0xff, 0x5c, 0x82, 0x8c, 0x98, 0xb0, 0xe8, 0xb1, 0xc0, 0xd1, 0xad, 0xbb, 0x22, 0x73, 0x84, + 0xbe, 0x83, 0x5b, 0x81, 0xb6, 0x26, 0xfa, 0x6f, 0xeb, 0xed, 0x3f, 0x59, 0xdb, 0xf9, 0x98, 0x7e, + 0x3a, 0xe2, 0x98, 0xfe, 0xfb, 0x24, 0xc8, 0xb8, 0xbe, 0xb1, 0xdf, 0x6c, 0xdc, 0x51, 0x18, 0xe4, + 0xe6, 0x9f, 0xa5, 0xe3, 0x78, 0xc9, 0x4d, 0x0c, 0xa7, 0x7c, 0x89, 0xe1, 0x02, 0x64, 0xc4, 0x0f, + 0x25, 0xf0, 0xd5, 0x9d, 0x5b, 0x3e, 0x7d, 0x01, 0x72, 0xbe, 0xc4, 0x28, 0x99, 0x79, 0xeb, 0xe5, + 0xe7, 0xf3, 0x03, 0x85, 0xa1, 0x1b, 0x37, 0x67, 0x93, 0xeb, 0xf8, 0x3a, 0xd1, 0x59, 0xa5, 0xbc, + 0xb0, 0x5c, 0x5e, 0x78, 0x36, 0x2f, 0x15, 0x72, 0x37, 0x6e, 0xce, 0x0e, 0x29, 0x98, 0xe6, 0x57, + 0x4e, 0x2f, 0xc3, 0xb0, 0x7f, 0x54, 0x82, 0x1e, 0x04, 0xc1, 0xe8, 0xe2, 0xe5, 0xcd, 0xd5, 0x95, + 0x85, 0xe2, 0x76, 0xb9, 0xc2, 0x0e, 0xc0, 0xa0, 0x63, 0x30, 0xb1, 0xba, 0xb2, 0xb4, 0xbc, 0x5d, + 0x59, 0x58, 0x5d, 0x29, 0xaf, 0x6f, 0x57, 0x8a, 0xdb, 0xdb, 0xc5, 0x85, 0x67, 0xf3, 0x89, 0xb3, + 0xef, 0x07, 0x18, 0x2b, 0x96, 0x16, 0x56, 0x88, 0xf7, 0xd3, 0xf8, 0x53, 0xbe, 0x0b, 0x90, 0xa2, + 0x8b, 0xeb, 0xae, 0x3b, 0xb2, 0x85, 0xee, 0xe9, 0x3b, 0x74, 0x09, 0xd2, 0x74, 0xdd, 0x8d, 0xba, + 0x6f, 0xd1, 0x16, 0x62, 0xf2, 0x79, 0xa4, 0x31, 0x74, 0x7a, 0x74, 0xdd, 0xb3, 0x2d, 0x74, 0x4f, + 0xef, 0x21, 0x05, 0xb2, 0xde, 0xc2, 0x39, 0x7e, 0x0f, 0xb7, 0xd0, 0x43, 0xca, 0x8f, 0xf0, 0xf4, + 0x96, 0x05, 0xf1, 0x7b, 0x9a, 0x85, 0x1e, 0x0c, 0x18, 0x5a, 0x85, 0x21, 0xb1, 0xe0, 0x8a, 0xdb, + 0x65, 0x2d, 0xc4, 0xa6, 0xe3, 0xc8, 0x10, 0xb0, 0x85, 0x71, 0xf7, 0x2d, 0xe3, 0x42, 0x4c, 0x6e, + 0x11, 0xad, 0xb8, 0x47, 0x71, 0x63, 0x76, 0x4e, 0x0b, 0x71, 0xe9, 0x35, 0x22, 0x34, 0x2f, 0xe3, + 0x10, 0xbf, 0x11, 0x5e, 0xe8, 0x21, 0x6d, 0x8a, 0x2e, 0x03, 0xf8, 0x96, 0xc1, 0x3d, 0xec, 0x70, + 0x17, 0x7a, 0x49, 0x87, 0xa2, 0x0d, 0xc8, 0xb8, 0xcb, 0x9d, 0xd8, 0xfd, 0xe6, 0x42, 0x7c, 0x5e, + 0x12, 0xbd, 0x07, 0x46, 0x82, 0x71, 0x7e, 0x6f, 0xbb, 0xc8, 0x85, 0x1e, 0x13, 0x8e, 0x84, 0x7f, + 0x30, 0xe8, 0xef, 0x6d, 0x57, 0xb9, 0xd0, 0x63, 0xfe, 0x11, 0xbd, 0x04, 0xe3, 0xed, 0x41, 0x79, + 0xef, 0x9b, 0xcc, 0x85, 0x3e, 0x32, 0x92, 0xa8, 0x09, 0xa8, 0x43, 0x30, 0xdf, 0xc7, 0x9e, 0x73, + 0xa1, 0x9f, 0x04, 0x65, 0xa9, 0x1c, 0x79, 0xa4, 0xe7, 0xa1, 0xd8, 0x23, 0x3d, 0xde, 0x21, 0x1d, + 0xf7, 0x18, 0xcf, 0x2f, 0x9c, 0x85, 0x7b, 0x23, 0x9e, 0x7e, 0x10, 0x8f, 0x06, 0x1c, 0xea, 0xf1, + 0x87, 0xc8, 0xeb, 0xef, 0x71, 0xc7, 0xf7, 0xe2, 0x4f, 0xeb, 0x1c, 0xfe, 0x61, 0x89, 0x98, 0x43, + 0x46, 0xdd, 0xce, 0x33, 0xc9, 0x1f, 0x92, 0x60, 0x74, 0x59, 0xb3, 0x1d, 0xc3, 0xd2, 0xaa, 0x6a, + 0x83, 0x9a, 0xea, 0xf3, 0xbd, 0x9e, 0x87, 0x0e, 0x6d, 0xa5, 0x3e, 0x0d, 0x83, 0xd7, 0xd4, 0x06, + 0x3b, 0x88, 0x9c, 0xa4, 0x6b, 0x8c, 0x88, 0x67, 0x1a, 0xc2, 0x61, 0x09, 0x27, 0x93, 0x7f, 0x8a, + 0x9e, 0x70, 0x6c, 0x36, 0x35, 0x9b, 0xfd, 0x6c, 0x28, 0x59, 0x13, 0x94, 0x20, 0x65, 0xa9, 0x0e, + 0x0f, 0xc9, 0x4b, 0x73, 0xfc, 0xc5, 0x90, 0xfb, 0x7b, 0x78, 0xff, 0x62, 0x11, 0x57, 0x15, 0x4a, + 0x8b, 0xde, 0x05, 0x64, 0x8d, 0x51, 0xa1, 0x7c, 0xd8, 0x6d, 0xa3, 0x62, 0x7f, 0x7c, 0xde, 0xb8, + 0x35, 0x33, 0x76, 0xa0, 0x36, 0x1b, 0xf3, 0xb2, 0xe0, 0x23, 0x2b, 0x64, 0xa9, 0x42, 0x9a, 0x88, + 0x4c, 0x18, 0x23, 0xd0, 0xea, 0x9e, 0xaa, 0xd7, 0x31, 0xab, 0x84, 0xe6, 0x9c, 0x4a, 0xcb, 0x7d, + 0x57, 0x72, 0xd4, 0xab, 0xc4, 0xc7, 0x4e, 0x56, 0x46, 0x9a, 0xea, 0xfe, 0x02, 0x05, 0x90, 0x1a, + 0xe7, 0x33, 0xaf, 0xbe, 0x36, 0x33, 0x40, 0x0f, 0xda, 0x7d, 0x4e, 0x02, 0xf0, 0x24, 0x86, 0xde, + 0x05, 0xf9, 0xaa, 0x5b, 0xa2, 0xb4, 0x22, 0x81, 0xfc, 0x40, 0xd4, 0x58, 0x84, 0xe4, 0xcd, 0xa2, + 0xba, 0xcf, 0xde, 0x9a, 0x91, 0x94, 0xb1, 0x6a, 0x68, 0x28, 0xde, 0x09, 0x39, 0x96, 0x0c, 0xaa, + 0xd0, 0x08, 0x31, 0x11, 0x1b, 0x21, 0x4e, 0x13, 0x5e, 0x6f, 0xdc, 0x9a, 0x41, 0xac, 0x5b, 0x3e, + 0x62, 0x99, 0xc6, 0x8d, 0xc0, 0x20, 0x84, 0xc0, 0xd7, 0xa7, 0x5f, 0x97, 0x20, 0xb7, 0xe8, 0x7b, + 0x07, 0x71, 0x0a, 0x86, 0x9a, 0x86, 0xae, 0x5d, 0xc5, 0x96, 0xbb, 0xc1, 0xc0, 0x8a, 0x24, 0xb4, + 0x63, 0x3f, 0x40, 0xe1, 0x1c, 0x88, 0xeb, 0xcb, 0xa2, 0x4c, 0xa8, 0xae, 0xe3, 0x1d, 0x5b, 0x13, + 0xa3, 0xa1, 0x88, 0x22, 0xba, 0x04, 0x79, 0x1b, 0x57, 0x5b, 0x96, 0xe6, 0x1c, 0x54, 0xaa, 0x86, + 0xee, 0xa8, 0x55, 0xb6, 0xc0, 0xc9, 0x96, 0x4e, 0xbc, 0x71, 0x6b, 0xe6, 0x18, 0x6b, 0x6b, 0x18, + 0x43, 0x56, 0xc6, 0x04, 0x68, 0x81, 0x41, 0x48, 0x0d, 0x35, 0xec, 0xa8, 0x5a, 0x83, 0x1d, 0xa4, + 0xc8, 0x2a, 0xa2, 0xe8, 0xeb, 0xcb, 0xf7, 0x65, 0xfc, 0x2b, 0xa0, 0x4b, 0x90, 0x37, 0x4c, 0x6c, + 0x05, 0x2e, 0x8f, 0x48, 0xe1, 0x9a, 0xc3, 0x18, 0xb2, 0x32, 0x26, 0x40, 0xe2, 0x62, 0x89, 0x13, + 0xd8, 0x27, 0x68, 0xed, 0x78, 0x77, 0x58, 0x27, 0xdb, 0x46, 0xa3, 0xa8, 0x1f, 0x94, 0x1e, 0xf7, + 0xb8, 0x87, 0xe9, 0xe4, 0xdf, 0xf8, 0xf4, 0x23, 0x93, 0x5c, 0x35, 0xbc, 0xf5, 0xd3, 0xb3, 0xf8, + 0xc0, 0xbf, 0xa1, 0x40, 0x31, 0x49, 0xd0, 0xfd, 0x92, 0xaa, 0x35, 0xc4, 0x4f, 0xf2, 0x28, 0xbc, + 0x84, 0xe6, 0x61, 0xd0, 0x76, 0x54, 0xa7, 0x65, 0xf3, 0xd7, 0x59, 0xe4, 0x28, 0x55, 0x2b, 0x19, + 0x7a, 0x6d, 0x8b, 0x62, 0x2a, 0x9c, 0x02, 0x5d, 0x82, 0x41, 0xfe, 0xec, 0x4d, 0xba, 0xef, 0xf9, + 0x4d, 0xdf, 0x37, 0x62, 0xd4, 0x44, 0x22, 0x35, 0xdc, 0xc0, 0x75, 0x76, 0x15, 0x62, 0x4f, 0xb5, + 0x30, 0xbb, 0x1e, 0x95, 0x2d, 0xad, 0xf4, 0x3d, 0x09, 0xb9, 0xa4, 0xc2, 0xfc, 0x64, 0x65, 0xcc, + 0x05, 0x6d, 0x51, 0x08, 0x7a, 0x36, 0xf0, 0x60, 0x27, 0xdf, 0x26, 0xbe, 0x27, 0xaa, 0xfb, 0x3e, + 0x9d, 0x16, 0x77, 0x0a, 0xfd, 0xcf, 0x7d, 0x5e, 0x82, 0x7c, 0x4b, 0xdf, 0x31, 0x74, 0xfa, 0xbb, + 0x19, 0x7c, 0x35, 0x94, 0x21, 0x8b, 0x27, 0xbf, 0x72, 0x84, 0x31, 0x64, 0x65, 0xcc, 0x05, 0xf1, + 0x8d, 0xad, 0x1a, 0x8c, 0x7a, 0x58, 0x74, 0xa2, 0x66, 0x63, 0x27, 0xea, 0xdd, 0x7c, 0xa2, 0x1e, + 0x09, 0xd7, 0xe2, 0xcd, 0xd5, 0x11, 0x17, 0x48, 0xc8, 0xd0, 0x32, 0x80, 0x67, 0x1e, 0xdc, 0xcd, + 0xe5, 0x58, 0x1b, 0x23, 0xf6, 0x97, 0x3c, 0x5a, 0xf4, 0x1d, 0x30, 0xd1, 0xd4, 0xf4, 0x8a, 0x8d, + 0x1b, 0xbb, 0x15, 0x2e, 0x60, 0xc2, 0x92, 0xfe, 0xec, 0x61, 0x69, 0xb5, 0x3f, 0x7d, 0x78, 0xe3, + 0xd6, 0x4c, 0x81, 0x9b, 0xd0, 0x76, 0x96, 0xb2, 0x32, 0xde, 0xd4, 0xf4, 0x2d, 0xdc, 0xd8, 0x5d, + 0x74, 0x61, 0xe8, 0x2d, 0x70, 0xc2, 0xeb, 0xad, 0xa1, 0x57, 0xf6, 0x8c, 0x46, 0xad, 0x62, 0xe1, + 0xdd, 0x4a, 0x95, 0x3e, 0x83, 0x35, 0x4c, 0x57, 0xaf, 0xc7, 0x5c, 0x94, 0x0d, 0x7d, 0xd9, 0x68, + 0xd4, 0x14, 0xbc, 0xbb, 0x40, 0x3e, 0xa3, 0x7b, 0xc0, 0x13, 0x4b, 0x45, 0xab, 0xd9, 0x53, 0x23, + 0xb3, 0xc9, 0x53, 0x29, 0x65, 0xd8, 0x05, 0xae, 0xd4, 0xec, 0xf9, 0xe1, 0x0f, 0xbe, 0x36, 0x33, + 0xc0, 0x2d, 0xc2, 0x80, 0x7c, 0x9e, 0x5e, 0xa9, 0xe7, 0x33, 0x19, 0xd3, 0xcc, 0xbf, 0x2a, 0x0a, + 0xfc, 0x40, 0xb6, 0x07, 0x60, 0x96, 0xe4, 0x95, 0xdf, 0x9f, 0x95, 0xe4, 0x9f, 0x94, 0x60, 0x70, + 0xf1, 0xca, 0xa6, 0xaa, 0x59, 0x68, 0x05, 0xc6, 0x3d, 0xe5, 0x0c, 0xda, 0x91, 0x93, 0x6f, 0xdc, + 0x9a, 0x99, 0x0a, 0xeb, 0xaf, 0x6b, 0x48, 0xbc, 0x39, 0x22, 0x2c, 0xc9, 0x4a, 0xd4, 0x7d, 0xb6, + 0x00, 0xab, 0x36, 0x14, 0xb9, 0xfd, 0xb6, 0x5b, 0xa8, 0x9b, 0x65, 0x18, 0x62, 0xad, 0xb5, 0xd1, + 0x3c, 0xa4, 0x4d, 0xf2, 0x0f, 0xcf, 0xa3, 0x4f, 0x47, 0xce, 0x0f, 0x8a, 0xef, 0xde, 0x6f, 0x26, + 0x24, 0xf2, 0x87, 0x13, 0x00, 0x8b, 0x57, 0xae, 0x6c, 0x5b, 0x9a, 0xd9, 0xc0, 0xce, 0xed, 0xec, + 0xf9, 0x36, 0x1c, 0xf1, 0x5d, 0x9e, 0xb2, 0xaa, 0xa1, 0xde, 0xcf, 0xbe, 0x71, 0x6b, 0xe6, 0x64, + 0xb8, 0xf7, 0x3e, 0x34, 0x59, 0x99, 0xf0, 0xae, 0x51, 0x59, 0xd5, 0x8e, 0x5c, 0x6b, 0xb6, 0xe3, + 0x72, 0x4d, 0x46, 0x73, 0xf5, 0xa1, 0xf9, 0xb9, 0x2e, 0xda, 0x4e, 0x67, 0xd1, 0x6e, 0x41, 0xce, + 0x13, 0x89, 0x8d, 0x16, 0x21, 0xe3, 0xf0, 0xff, 0xb9, 0x84, 0xe5, 0x68, 0x09, 0x0b, 0x32, 0x71, + 0x93, 0x43, 0x50, 0xca, 0x7f, 0x26, 0x01, 0xf8, 0xa6, 0xc5, 0x5f, 0x4a, 0x15, 0x23, 0xde, 0x82, + 0xdb, 0xf6, 0xe4, 0xa1, 0xa2, 0x41, 0x4e, 0x1d, 0x92, 0xe7, 0xf7, 0x26, 0x60, 0xe2, 0xb2, 0x98, + 0xb0, 0x7f, 0xe9, 0x65, 0xb0, 0x09, 0x43, 0x58, 0x77, 0x2c, 0x0d, 0x8b, 0x8d, 0xb4, 0x47, 0xa3, + 0x46, 0xbb, 0x43, 0x9f, 0xe8, 0x6f, 0x4b, 0x8a, 0xcb, 0x33, 0x9c, 0x4d, 0x48, 0x1a, 0x5f, 0x4d, + 0xc2, 0x54, 0x14, 0x25, 0x5a, 0x80, 0xb1, 0xaa, 0x85, 0xd9, 0x7b, 0x6c, 0xfe, 0xc4, 0x72, 0xa9, + 0xe0, 0x05, 0xaf, 0x21, 0x04, 0x59, 0x19, 0x15, 0x10, 0xee, 0xa0, 0xea, 0x40, 0x22, 0x4b, 0xa2, + 0x76, 0xf4, 0x59, 0xb7, 0xde, 0x42, 0x49, 0x99, 0x7b, 0x28, 0x51, 0x49, 0x90, 0x01, 0x73, 0x51, + 0xa3, 0x1e, 0x94, 0xfa, 0xa8, 0xf7, 0xc2, 0x98, 0x38, 0xc9, 0xba, 0xa3, 0x36, 0x54, 0xbd, 0x7a, + 0x98, 0xc0, 0x9c, 0x79, 0x15, 0x5e, 0x6d, 0x88, 0x9d, 0xac, 0x88, 0xa3, 0xb2, 0x25, 0x06, 0x40, + 0xcb, 0x30, 0x24, 0xaa, 0x4a, 0x1d, 0x2a, 0xa0, 0x11, 0xe4, 0xe8, 0x6e, 0x18, 0xf6, 0xbb, 0x16, + 0x1a, 0x1f, 0xa5, 0x94, 0x9c, 0xcf, 0xb3, 0xc4, 0xf9, 0xae, 0xc1, 0xae, 0xbe, 0xcb, 0x17, 0xa4, + 0xfe, 0x51, 0x12, 0xc6, 0x15, 0x5c, 0xfb, 0xff, 0x63, 0xdd, 0xdf, 0x58, 0xaf, 0x01, 0x30, 0x7b, + 0x42, 0x2c, 0xf8, 0x21, 0x86, 0x9b, 0x58, 0xa4, 0x2c, 0xe3, 0xb0, 0x68, 0x3b, 0xdf, 0xc8, 0x01, + 0xbf, 0x95, 0x80, 0x61, 0xff, 0x80, 0x7f, 0x8b, 0xfa, 0x55, 0xb4, 0xe2, 0xd9, 0x52, 0x76, 0x3a, + 0x3b, 0xf2, 0x61, 0xc9, 0xb6, 0xe9, 0xd1, 0xdd, 0x88, 0xfe, 0xef, 0x04, 0x0c, 0xf2, 0x0d, 0xcf, + 0x6a, 0x5b, 0x38, 0x2e, 0xc5, 0xdd, 0xf8, 0xeb, 0x1e, 0x8d, 0xbf, 0xda, 0x21, 0x1a, 0x7f, 0x3b, + 0x8c, 0x36, 0xd5, 0xfd, 0x4a, 0xe0, 0xbc, 0x97, 0x74, 0x6a, 0xa4, 0x74, 0xdc, 0xe3, 0x12, 0xfc, + 0xce, 0x52, 0x0a, 0x57, 0xfc, 0x8f, 0x33, 0xe5, 0x08, 0x86, 0xe7, 0x5a, 0x08, 0xf9, 0x51, 0x6f, + 0xed, 0xee, 0xfb, 0x28, 0x2b, 0xd0, 0x54, 0xf7, 0xcb, 0xac, 0x80, 0x56, 0x01, 0xed, 0xb9, 0xe9, + 0xa3, 0x8a, 0x27, 0x4e, 0x42, 0x7f, 0xd7, 0x1b, 0xb7, 0x66, 0x8e, 0x33, 0xfa, 0x76, 0x1c, 0x59, + 0x19, 0xf7, 0x80, 0x82, 0xdb, 0x13, 0x00, 0xa4, 0x5f, 0x15, 0xf6, 0x36, 0x2d, 0x5b, 0x13, 0x1e, + 0x79, 0xe3, 0xd6, 0xcc, 0x38, 0xe3, 0xe2, 0x7d, 0x93, 0x95, 0x2c, 0x29, 0x2c, 0x92, 0xff, 0x7d, + 0x9a, 0xfd, 0x09, 0x09, 0x90, 0xe7, 0xb4, 0xdc, 0x93, 0xd3, 0xcb, 0xf4, 0x28, 0xac, 0x58, 0x5a, + 0x48, 0xdd, 0x57, 0x2b, 0x1e, 0xbd, 0x58, 0xad, 0xf8, 0x66, 0xca, 0x05, 0xcf, 0xc0, 0x27, 0xe2, + 0x1e, 0x6a, 0xe5, 0x2a, 0xc2, 0xf1, 0xdd, 0x56, 0x0e, 0xc8, 0xbf, 0x29, 0xc1, 0xf1, 0x36, 0x8d, + 0x72, 0x1b, 0xfb, 0x1e, 0x40, 0x96, 0xef, 0x23, 0xff, 0x81, 0x68, 0x89, 0x5f, 0x28, 0xea, 0x53, + 0x41, 0xc7, 0xad, 0x36, 0xc3, 0x7e, 0xdb, 0x7c, 0x14, 0x7f, 0x09, 0xf8, 0x9f, 0x4b, 0x30, 0xe9, + 0xaf, 0xde, 0xed, 0xc8, 0x3a, 0x0c, 0xfb, 0x6b, 0xe7, 0x5d, 0xb8, 0xb7, 0x97, 0x2e, 0xf0, 0xd6, + 0x07, 0xe8, 0xd1, 0x73, 0xde, 0x74, 0x65, 0x09, 0xc6, 0xc7, 0x7a, 0x96, 0x86, 0xbb, 0xb9, 0x10, + 0x9a, 0xb6, 0x29, 0x3a, 0x1e, 0x7f, 0x21, 0x41, 0x6a, 0xd3, 0x30, 0x1a, 0xc8, 0x80, 0x71, 0xdd, + 0x70, 0x2a, 0x44, 0xb3, 0x70, 0xcd, 0xff, 0x20, 0x6f, 0xb6, 0xb4, 0xd0, 0x9f, 0x90, 0xbe, 0x7c, + 0x6b, 0xa6, 0x9d, 0x95, 0x32, 0xa6, 0x1b, 0x4e, 0x89, 0x42, 0xf8, 0x9b, 0xbc, 0xdf, 0x01, 0x23, + 0xc1, 0xca, 0x98, 0x95, 0x7c, 0xbe, 0xef, 0xca, 0x82, 0x6c, 0xde, 0xb8, 0x35, 0x33, 0xe9, 0xcd, + 0x18, 0x17, 0x2c, 0x2b, 0xc3, 0x3b, 0xbe, 0xda, 0xd9, 0xbb, 0x75, 0x5f, 0x25, 0x63, 0xb8, 0x0d, + 0xf9, 0x2b, 0xe1, 0xb3, 0x60, 0x6f, 0x87, 0xa1, 0xc3, 0x1d, 0x2b, 0x13, 0x64, 0xa7, 0x7f, 0x5e, + 0x02, 0xf0, 0x92, 0x3e, 0xe8, 0x61, 0x38, 0x56, 0xda, 0x58, 0x5f, 0xac, 0x6c, 0x6d, 0x17, 0xb7, + 0x2f, 0x6f, 0x05, 0x9f, 0xc4, 0x15, 0xaf, 0x09, 0xd8, 0x26, 0xae, 0x6a, 0xbb, 0x1a, 0xae, 0xa1, + 0xfb, 0x61, 0x32, 0x88, 0x4d, 0x4a, 0xe5, 0xc5, 0xbc, 0x54, 0x18, 0xbe, 0x71, 0x73, 0x36, 0xc3, + 0x62, 0x54, 0x5c, 0x43, 0xa7, 0xe0, 0x48, 0x3b, 0xde, 0xca, 0xfa, 0x52, 0x3e, 0x51, 0x18, 0xb9, + 0x71, 0x73, 0x36, 0xeb, 0x06, 0xb3, 0x48, 0x06, 0xe4, 0xc7, 0xe4, 0xfc, 0x92, 0x05, 0xb8, 0x71, + 0x73, 0x76, 0x90, 0x0d, 0x4b, 0x21, 0xf5, 0xc1, 0x4f, 0x4c, 0x0f, 0x9c, 0xfe, 0x71, 0x09, 0x46, + 0x57, 0xf4, 0x5d, 0x4b, 0xad, 0xba, 0xcf, 0xfa, 0x3e, 0x01, 0x27, 0x56, 0xd6, 0x2f, 0x29, 0xc5, + 0x85, 0x88, 0x37, 0x7d, 0x0b, 0x13, 0x37, 0x6e, 0xce, 0x8e, 0x79, 0x44, 0xe5, 0xa6, 0xe9, 0x1c, + 0xa0, 0x33, 0xed, 0x54, 0x8b, 0x1b, 0x97, 0x4b, 0xab, 0xe5, 0xca, 0xd6, 0xca, 0xd2, 0x7a, 0x5e, + 0x2a, 0x8c, 0xde, 0xb8, 0x39, 0x0b, 0x8b, 0xf4, 0x27, 0x6c, 0xb7, 0xb4, 0xba, 0x8e, 0x4e, 0xc3, + 0x54, 0x3b, 0xc1, 0xf3, 0xec, 0x97, 0xf0, 0x13, 0xac, 0xe7, 0x8b, 0xc6, 0x75, 0x9d, 0x78, 0x02, + 0xd6, 0xd6, 0xdb, 0xfe, 0xc8, 0xef, 0x9f, 0x0c, 0x45, 0xee, 0x9c, 0xd4, 0xb1, 0x8e, 0x6d, 0xcd, + 0x3e, 0xd4, 0xce, 0x49, 0x4f, 0xbb, 0x31, 0xf2, 0xef, 0xa4, 0x61, 0x78, 0x89, 0xd5, 0x42, 0xaf, + 0xa4, 0xa1, 0xb7, 0xc0, 0x60, 0xe0, 0x20, 0x74, 0x64, 0xf6, 0x20, 0xf0, 0x30, 0x00, 0xa7, 0x41, + 0x36, 0xbf, 0xdc, 0xc5, 0xce, 0x25, 0x78, 0xa7, 0x3f, 0x86, 0xfb, 0x4a, 0x0b, 0xb2, 0xb0, 0x90, + 0x67, 0xe0, 0xc2, 0xfc, 0x64, 0x76, 0x01, 0x6c, 0x9b, 0x40, 0xd8, 0xc3, 0x7f, 0x1f, 0x90, 0xe0, + 0x08, 0xc5, 0xf2, 0x42, 0x11, 0x8a, 0x29, 0x16, 0x6c, 0xa7, 0xa3, 0xba, 0xb0, 0xaa, 0xda, 0xde, + 0x33, 0x5e, 0xec, 0xa9, 0xbe, 0x7b, 0x79, 0x28, 0x70, 0xd2, 0x57, 0x79, 0x98, 0xad, 0xac, 0xd0, + 0x93, 0xec, 0x41, 0x4a, 0x1b, 0x2d, 0x75, 0xb8, 0x37, 0xd8, 0xf3, 0x8e, 0x8c, 0xff, 0x00, 0xf8, + 0x33, 0x90, 0xf3, 0xac, 0xa9, 0x3d, 0x95, 0x8e, 0xc9, 0x31, 0x84, 0x6d, 0xb8, 0x9f, 0x18, 0x7d, + 0x8f, 0x04, 0x47, 0xbc, 0x78, 0xc6, 0xcf, 0x76, 0x90, 0xb2, 0x7d, 0xa8, 0x8f, 0xc5, 0x6c, 0x58, + 0x38, 0x1d, 0xf9, 0xca, 0xca, 0x64, 0xab, 0x9d, 0x94, 0x2c, 0xa3, 0x47, 0xfc, 0xbe, 0x45, 0x9c, + 0xe0, 0xed, 0xc7, 0x39, 0x05, 0x19, 0xa0, 0x02, 0x64, 0xf0, 0xbe, 0x69, 0x58, 0x0e, 0xae, 0xd1, + 0xbc, 0x6d, 0x46, 0x71, 0xcb, 0xf2, 0x3a, 0xa0, 0xf6, 0xc1, 0x0d, 0x1f, 0x88, 0xca, 0x76, 0x38, + 0x10, 0xe5, 0x3f, 0xaa, 0x34, 0x9f, 0xf9, 0x20, 0x0f, 0x20, 0x6e, 0xfb, 0x9c, 0xff, 0x7c, 0x02, + 0x4e, 0xfb, 0xb7, 0x18, 0xe9, 0x3d, 0x26, 0x77, 0x8a, 0x9a, 0x6a, 0x5d, 0xd3, 0xfd, 0x0f, 0x5c, + 0x1f, 0xf7, 0x87, 0x3c, 0x14, 0x57, 0xc8, 0x49, 0xfe, 0xa0, 0x04, 0xb9, 0x4d, 0xb5, 0x8e, 0xc5, + 0x03, 0x03, 0xed, 0x87, 0xd9, 0x8e, 0xc2, 0xa0, 0xb1, 0xbb, 0x2b, 0x9e, 0x2b, 0x4a, 0x29, 0xbc, + 0x44, 0xfa, 0xdc, 0xd0, 0x9a, 0x9a, 0xc3, 0xef, 0x75, 0xb0, 0x02, 0x9a, 0x81, 0x1c, 0x5d, 0xdc, + 0xb0, 0x29, 0xc7, 0x2f, 0x87, 0x02, 0x05, 0xd1, 0x29, 0x47, 0x84, 0x68, 0xe1, 0x6b, 0xd8, 0xb2, + 0xd9, 0x0f, 0x87, 0x67, 0x14, 0x51, 0x94, 0x9f, 0x86, 0x61, 0xd6, 0x12, 0x1e, 0x8e, 0x1c, 0x87, + 0x0c, 0x7d, 0x44, 0xcf, 0x6b, 0xcf, 0x10, 0x29, 0xf3, 0xa3, 0x61, 0x8c, 0x3f, 0x6b, 0x12, 0x2b, + 0x94, 0x4a, 0x91, 0x52, 0x3e, 0x15, 0x6f, 0x35, 0x98, 0x0c, 0x5d, 0x09, 0xff, 0x4a, 0x1a, 0x8e, + 0xf0, 0x0d, 0x60, 0xd5, 0xd4, 0xce, 0xec, 0x39, 0x8e, 0x78, 0x16, 0x1b, 0xf8, 0x3a, 0x40, 0x35, + 0x35, 0xf9, 0x00, 0x52, 0xcb, 0x8e, 0x63, 0xa2, 0xd3, 0x90, 0xb6, 0x5a, 0x0d, 0xd7, 0xf1, 0xba, + 0xbb, 0x3a, 0xaa, 0xa9, 0xcd, 0x11, 0x04, 0xa5, 0xd5, 0xc0, 0x0a, 0x43, 0x41, 0x65, 0x98, 0xd9, + 0x6d, 0x35, 0x1a, 0x07, 0x95, 0x1a, 0xae, 0x1a, 0x35, 0x5c, 0xb1, 0xb0, 0x8d, 0xad, 0x6b, 0xb8, + 0x56, 0xc1, 0xfb, 0xa6, 0xaa, 0xbb, 0xf7, 0x68, 0x32, 0xca, 0x49, 0x8a, 0xb6, 0x48, 0xb1, 0x14, + 0x8e, 0x54, 0x16, 0x38, 0xf2, 0xef, 0x25, 0x20, 0x23, 0x58, 0xd3, 0x77, 0x81, 0x71, 0x03, 0x57, + 0x1d, 0xf7, 0xf2, 0x8f, 0x5b, 0x46, 0x08, 0x92, 0x75, 0x3e, 0x78, 0xd9, 0xe5, 0x01, 0x85, 0x14, + 0x08, 0xcc, 0x7d, 0xad, 0x99, 0xc0, 0xcc, 0x16, 0x19, 0xcf, 0x94, 0x69, 0x88, 0x85, 0xf1, 0xf2, + 0x80, 0x42, 0x4b, 0x68, 0x0a, 0x06, 0xc9, 0xa4, 0x71, 0xd8, 0x68, 0x11, 0x38, 0x2f, 0xa3, 0xa3, + 0x90, 0x36, 0x55, 0xa7, 0xca, 0x1e, 0x52, 0x24, 0x1f, 0x58, 0x11, 0x3d, 0x09, 0x83, 0xec, 0x07, + 0x77, 0xf8, 0xbd, 0x8e, 0xbb, 0xfc, 0xc2, 0x60, 0xbf, 0x6c, 0x4c, 0xda, 0xbd, 0xa9, 0x3a, 0x0e, + 0xb6, 0x74, 0x7a, 0x7b, 0x8c, 0x02, 0x11, 0x82, 0xd4, 0x8e, 0x51, 0x63, 0xb7, 0xf7, 0xb2, 0x0a, + 0xfd, 0x9f, 0x9d, 0x0a, 0x67, 0xfa, 0x50, 0xa1, 0x1f, 0x87, 0xd9, 0x2f, 0xb4, 0x08, 0x60, 0x89, + 0x20, 0x95, 0x61, 0x42, 0xad, 0xd5, 0x34, 0xa2, 0xf0, 0x64, 0xfd, 0xaf, 0x51, 0xe3, 0x61, 0x4f, + 0xe5, 0xba, 0x8c, 0x05, 0xf2, 0x08, 0x4a, 0x1c, 0xbf, 0x94, 0x85, 0x21, 0x93, 0x35, 0x4a, 0xbe, + 0x08, 0xe3, 0x6d, 0x2d, 0x25, 0xed, 0xbb, 0xaa, 0xf1, 0x13, 0xac, 0x59, 0x85, 0xfe, 0xdf, 0xe9, + 0xc6, 0x74, 0xe9, 0x7d, 0xd1, 0x2f, 0x9d, 0x8f, 0xfa, 0x5e, 0x3a, 0x57, 0x4d, 0xad, 0x94, 0xa5, + 0xfc, 0xf9, 0xfb, 0xe6, 0xc5, 0xf6, 0xf7, 0xcd, 0xeb, 0x58, 0x17, 0x8e, 0x99, 0x7c, 0x52, 0x4d, + 0xcd, 0xa6, 0xea, 0xe8, 0xfd, 0x36, 0xba, 0x7d, 0xd1, 0xf7, 0x3f, 0x7d, 0xee, 0x3c, 0xb5, 0x54, + 0xdc, 0x5c, 0x71, 0xf5, 0xf8, 0x97, 0x13, 0x70, 0xd2, 0xa7, 0xc7, 0x3e, 0xe4, 0x76, 0x75, 0x2e, + 0x74, 0xd6, 0xf8, 0x1e, 0x7e, 0x76, 0xe6, 0x59, 0x48, 0x11, 0x7c, 0x34, 0xdd, 0xe1, 0xc7, 0x61, + 0x9c, 0x3d, 0xc3, 0xfd, 0x29, 0x97, 0x9f, 0xfe, 0x8d, 0x7f, 0x2a, 0x07, 0xf7, 0x3d, 0x03, 0xa3, + 0x42, 0x99, 0x94, 0xbe, 0xa7, 0x77, 0xf9, 0xe5, 0xbd, 0x9f, 0x85, 0xb7, 0x6f, 0x9f, 0x18, 0xc3, + 0x32, 0xfc, 0xe2, 0xb9, 0xc8, 0x9f, 0x25, 0x61, 0xc6, 0xb4, 0x7b, 0x7c, 0xd5, 0x87, 0xa5, 0x8e, + 0x7a, 0xf5, 0xb9, 0xdb, 0x08, 0xf6, 0x18, 0xa9, 0xed, 0xc3, 0x51, 0x7a, 0x34, 0xcd, 0xcb, 0x21, + 0x08, 0x93, 0x7f, 0xd4, 0xdd, 0x0f, 0x96, 0xf8, 0x5d, 0x66, 0xb1, 0xd7, 0x0b, 0x5e, 0xfb, 0xf8, + 0xea, 0xf9, 0xfe, 0xb9, 0x48, 0x57, 0x32, 0xe7, 0x73, 0x23, 0x8a, 0x8f, 0x52, 0xfe, 0x09, 0x09, + 0x8e, 0xb5, 0x55, 0xcd, 0x6d, 0xfc, 0x52, 0x87, 0x07, 0xaa, 0x0f, 0x15, 0xf4, 0x2c, 0x75, 0x68, + 0xec, 0x03, 0xb1, 0x8d, 0x65, 0xad, 0x08, 0xb4, 0xf6, 0x6d, 0x70, 0x24, 0xd8, 0x58, 0x21, 0xa6, + 0xfb, 0x60, 0x34, 0x98, 0xf0, 0xe7, 0xe2, 0x1a, 0x09, 0xa4, 0xfc, 0xe5, 0x4a, 0x58, 0xce, 0x6e, + 0x5f, 0xcb, 0xed, 0xa7, 0x95, 0x7b, 0xee, 0xaa, 0x47, 0x29, 0x7f, 0x58, 0x82, 0xd9, 0x60, 0x0d, + 0xbe, 0x38, 0xa9, 0xbf, 0xc6, 0xde, 0xb6, 0x21, 0xfe, 0x92, 0x04, 0x77, 0x77, 0x69, 0x13, 0x17, + 0xc0, 0xcb, 0x30, 0xe9, 0x4b, 0x93, 0x08, 0x13, 0x2e, 0x86, 0xfd, 0x74, 0x7c, 0x84, 0xea, 0x66, + 0x05, 0x4e, 0x10, 0xa1, 0x7c, 0xea, 0xf3, 0x33, 0x13, 0xed, 0xdf, 0x6c, 0x65, 0xa2, 0x3d, 0xb5, + 0x71, 0x1b, 0xf5, 0xe3, 0xa3, 0x12, 0x3c, 0x18, 0xec, 0x6a, 0x87, 0x50, 0xf7, 0x9b, 0x35, 0x0e, + 0xff, 0x51, 0x82, 0xd3, 0xbd, 0x34, 0x8e, 0x0f, 0xc8, 0x0e, 0x4c, 0x78, 0x41, 0x78, 0x78, 0x3c, + 0xfa, 0x0a, 0xed, 0x99, 0x96, 0x22, 0x97, 0xdb, 0x1d, 0x10, 0xbc, 0xc9, 0x27, 0x96, 0x7f, 0xc8, + 0x5d, 0x21, 0x07, 0x53, 0xdd, 0x42, 0xc8, 0x81, 0x64, 0x77, 0x87, 0xb1, 0x48, 0x74, 0x18, 0x0b, + 0x2f, 0x6a, 0x97, 0xaf, 0x71, 0xbb, 0xd5, 0x21, 0x41, 0xf9, 0x4e, 0x98, 0xe8, 0xa0, 0xca, 0x7c, + 0x56, 0xf7, 0xa1, 0xc9, 0x0a, 0x6a, 0x57, 0x56, 0xf9, 0x00, 0x66, 0x68, 0xbd, 0x1d, 0x04, 0x7d, + 0xa7, 0xbb, 0xdc, 0xe4, 0xb6, 0xa5, 0x63, 0xd5, 0xbc, 0xef, 0x2b, 0x30, 0xc8, 0xc6, 0x99, 0x77, + 0xf7, 0x10, 0x8a, 0xc2, 0x19, 0xc8, 0x3f, 0x24, 0x6c, 0xd9, 0xa2, 0x68, 0x76, 0xe7, 0x39, 0xd4, + 0x4b, 0x5f, 0x6f, 0xd3, 0x1c, 0xf2, 0x09, 0xe3, 0x73, 0xc2, 0xaa, 0x75, 0x6e, 0x1d, 0x17, 0x47, + 0xf5, 0xb6, 0x59, 0x35, 0xfe, 0xa0, 0xcc, 0x1d, 0x35, 0x5f, 0x3f, 0x2a, 0xcc, 0x97, 0xdb, 0xa7, + 0x18, 0xf3, 0xf5, 0xcd, 0x11, 0xbd, 0x6b, 0xc8, 0x62, 0x9a, 0xf9, 0x57, 0xd1, 0x90, 0x7d, 0x55, + 0x82, 0xe3, 0xb4, 0x6f, 0xfe, 0x1c, 0x45, 0xbf, 0x22, 0x7f, 0x18, 0x90, 0x6d, 0x55, 0x2b, 0x1d, + 0x67, 0x77, 0xde, 0xb6, 0xaa, 0x57, 0x02, 0xfe, 0xe5, 0x61, 0x40, 0xb5, 0x40, 0x26, 0x8a, 0x62, + 0xb3, 0x73, 0x96, 0xf9, 0x9a, 0x2f, 0xd1, 0xd1, 0x61, 0x38, 0x53, 0xb7, 0x61, 0x38, 0x3f, 0x2b, + 0x41, 0xa1, 0x53, 0x97, 0xf9, 0xf0, 0x69, 0x70, 0x34, 0xb0, 0x83, 0x12, 0x1e, 0xc1, 0x87, 0x7b, + 0xc9, 0xf2, 0x84, 0xa6, 0xd1, 0x11, 0x0b, 0xdf, 0xe9, 0x38, 0x60, 0x26, 0xa8, 0xa1, 0xed, 0x91, + 0xf5, 0x37, 0x6d, 0xfa, 0x7c, 0xba, 0xcd, 0xae, 0xfe, 0x95, 0x88, 0xbd, 0xf7, 0x61, 0x3a, 0xa2, + 0xd5, 0x77, 0xda, 0xef, 0xed, 0x45, 0x0e, 0xe6, 0xed, 0x0e, 0xdf, 0x9f, 0xe0, 0x33, 0x21, 0x78, + 0x86, 0xdf, 0xb7, 0x16, 0xeb, 0xf8, 0x5a, 0xd7, 0x3b, 0xe0, 0x44, 0x47, 0x2a, 0xde, 0xb6, 0x79, + 0x48, 0xed, 0x69, 0xb6, 0x78, 0x87, 0xeb, 0xfe, 0xa8, 0x66, 0x85, 0xa8, 0x29, 0x8d, 0x8c, 0x20, + 0x4f, 0x59, 0x6f, 0x1a, 0x46, 0x83, 0x37, 0x43, 0x7e, 0x16, 0xc6, 0x7d, 0x30, 0x5e, 0xc9, 0x79, + 0x48, 0x99, 0x06, 0xff, 0x51, 0xaa, 0xdc, 0xd9, 0x93, 0x91, 0x89, 0x7d, 0xc3, 0x68, 0xf0, 0x6e, + 0x53, 0x7c, 0x79, 0x12, 0x10, 0x63, 0xc6, 0x6e, 0x1a, 0xf3, 0x2a, 0xb6, 0x60, 0x22, 0x00, 0xe5, + 0x95, 0xbc, 0xa9, 0xfd, 0x83, 0xb3, 0x5f, 0x3e, 0x22, 0xee, 0x6f, 0xfd, 0xa0, 0x14, 0xf8, 0xd5, + 0xc8, 0xb9, 0x28, 0x36, 0x9d, 0xd7, 0xc4, 0x85, 0x33, 0x3d, 0xe3, 0xf3, 0x98, 0xed, 0xf4, 0xfb, + 0xfe, 0xdd, 0x17, 0x3f, 0x92, 0xb8, 0x17, 0xc9, 0x67, 0x22, 0x56, 0xe3, 0xbe, 0xf9, 0xf2, 0xc9, + 0xc0, 0x2f, 0x1e, 0x3d, 0xd2, 0x5b, 0x55, 0xa2, 0x65, 0x73, 0xbd, 0xa2, 0xf3, 0x86, 0x5d, 0xa4, + 0x0d, 0x3b, 0x87, 0x1e, 0x8f, 0x6f, 0xd8, 0x99, 0x6f, 0x0f, 0x4e, 0x9a, 0xef, 0x44, 0xbf, 0x23, + 0xc1, 0x64, 0xa7, 0x25, 0x1d, 0x7a, 0xaa, 0xb7, 0x56, 0xb4, 0x87, 0x14, 0x85, 0x0b, 0x87, 0xa0, + 0xe4, 0x5d, 0x59, 0xa2, 0x5d, 0x29, 0xa2, 0xa7, 0x0f, 0xd1, 0x95, 0x33, 0xfe, 0xd4, 0xff, 0xff, + 0x91, 0xe0, 0xae, 0xae, 0x2b, 0x24, 0x54, 0xec, 0xad, 0x95, 0x5d, 0x62, 0xa7, 0x42, 0xe9, 0xcd, + 0xb0, 0xe0, 0x3d, 0x7e, 0x8e, 0xf6, 0xf8, 0x59, 0xb4, 0x72, 0x98, 0x1e, 0x77, 0xdc, 0x5f, 0x41, + 0xbf, 0x1a, 0x3c, 0x38, 0xda, 0x5d, 0x9d, 0xda, 0x16, 0x1e, 0x31, 0x13, 0xa3, 0x3d, 0xa8, 0x95, + 0x5f, 0xa0, 0x5d, 0x50, 0xd0, 0xe6, 0x9b, 0x1c, 0xb4, 0x33, 0xdf, 0x1e, 0x34, 0xfc, 0xdf, 0x89, + 0xfe, 0x54, 0xea, 0x7c, 0x0e, 0xf4, 0xc9, 0xae, 0x4d, 0x8c, 0x5e, 0x54, 0x15, 0x9e, 0xea, 0x9f, + 0x90, 0x77, 0xb2, 0x49, 0x3b, 0x59, 0x47, 0xf8, 0x76, 0x77, 0xb2, 0xe3, 0x20, 0xa2, 0x5f, 0x97, + 0x60, 0xb2, 0xd3, 0x9a, 0x24, 0x66, 0x5a, 0x76, 0x59, 0x64, 0xc5, 0x4c, 0xcb, 0x6e, 0x0b, 0x20, + 0xf9, 0x2d, 0xb4, 0xf3, 0xe7, 0xd1, 0x13, 0x51, 0x9d, 0xef, 0x3a, 0x8a, 0x64, 0x2e, 0x76, 0x0d, + 0xf2, 0x63, 0xe6, 0x62, 0x2f, 0xeb, 0x98, 0x98, 0xb9, 0xd8, 0xd3, 0x1a, 0x23, 0x7e, 0x2e, 0xba, + 0x3d, 0xeb, 0x71, 0x18, 0x6d, 0xf4, 0xcb, 0xf4, 0x3d, 0x2e, 0x3f, 0xe4, 0xb1, 0xae, 0x0d, 0xed, + 0xb4, 0x60, 0x28, 0x9c, 0xed, 0x87, 0x84, 0xf7, 0x65, 0x85, 0xf6, 0x65, 0x01, 0x15, 0x0f, 0xd3, + 0x97, 0xe0, 0x36, 0xea, 0x67, 0x25, 0x98, 0xe8, 0x10, 0x65, 0xc6, 0xcc, 0xc2, 0xe8, 0xa0, 0xb9, + 0xf0, 0x54, 0xff, 0x84, 0xbc, 0x57, 0x97, 0x68, 0xaf, 0xde, 0x8e, 0xde, 0x76, 0x98, 0x5e, 0xf9, + 0xfc, 0xf3, 0x2d, 0xef, 0x50, 0x9a, 0xaf, 0x1e, 0x74, 0xbe, 0xcf, 0x86, 0x89, 0x0e, 0x3d, 0xd9, + 0x37, 0x1d, 0xef, 0xcf, 0xf3, 0xb4, 0x3f, 0xcf, 0xa1, 0x8d, 0x37, 0xd7, 0x9f, 0x76, 0xb7, 0xfe, + 0x73, 0xed, 0x77, 0x48, 0xbb, 0x6b, 0x51, 0xc7, 0x60, 0xb5, 0xf0, 0x78, 0x5f, 0x34, 0xbc, 0x53, + 0x4f, 0xd1, 0x4e, 0x9d, 0x45, 0x8f, 0x46, 0x75, 0xca, 0x77, 0xf2, 0x50, 0xd3, 0x77, 0x8d, 0x33, + 0xdf, 0xce, 0x42, 0xe0, 0xef, 0x44, 0xdf, 0x25, 0x4e, 0x7d, 0x9d, 0xea, 0x5a, 0xaf, 0x2f, 0x8e, + 0x2d, 0x3c, 0xd8, 0x03, 0x26, 0x6f, 0xd7, 0xbd, 0xb4, 0x5d, 0xd3, 0xe8, 0x64, 0x54, 0xbb, 0x48, + 0x2c, 0x8b, 0x3e, 0x24, 0xb9, 0x07, 0x45, 0x4f, 0x77, 0xe7, 0xed, 0x0f, 0x76, 0x0b, 0x0f, 0xf5, + 0x84, 0xcb, 0x5b, 0x72, 0x3f, 0x6d, 0xc9, 0x2c, 0x9a, 0x8e, 0x6c, 0x09, 0x0b, 0x7d, 0x6f, 0xf7, + 0xa1, 0x82, 0x1b, 0xc7, 0x60, 0x26, 0xa2, 0x46, 0x67, 0x3f, 0x66, 0x8f, 0xab, 0xcb, 0x3d, 0xeb, + 0xc3, 0xfd, 0xea, 0xc1, 0x9b, 0xb9, 0x5d, 0xdd, 0xdb, 0x86, 0xd8, 0x6f, 0xa5, 0x00, 0xad, 0xd9, + 0xf5, 0x05, 0x0b, 0xab, 0x8e, 0xef, 0x67, 0x3c, 0x43, 0x77, 0x04, 0xa5, 0x37, 0x75, 0x47, 0x70, + 0x2d, 0x70, 0xeb, 0x2e, 0xd1, 0xdf, 0xcd, 0xde, 0x9e, 0xaf, 0xde, 0x25, 0xbf, 0x31, 0x57, 0xef, + 0x3a, 0x1e, 0x3a, 0x4f, 0xdd, 0xbe, 0xfb, 0x35, 0xe9, 0xc3, 0xde, 0x31, 0xe2, 0x37, 0x6a, 0x07, + 0xbb, 0xdc, 0xa8, 0x9d, 0x8a, 0xbc, 0x36, 0xcb, 0xa9, 0xe9, 0x53, 0x54, 0xee, 0x3b, 0x95, 0x3d, + 0x1c, 0x13, 0xe6, 0xbf, 0x72, 0xef, 0xa5, 0x10, 0x4e, 0x42, 0xa1, 0x5d, 0x9d, 0xdc, 0x49, 0xfd, + 0x91, 0x24, 0xe4, 0xd7, 0xec, 0x7a, 0xb9, 0xa6, 0x39, 0x77, 0x48, 0xd7, 0x9e, 0x8e, 0xbe, 0xb3, + 0x84, 0xde, 0xb8, 0x35, 0x33, 0xca, 0x64, 0xda, 0x45, 0x92, 0x4d, 0x18, 0x0b, 0x5d, 0x46, 0xe7, + 0x9a, 0xb5, 0x78, 0x98, 0x3b, 0xf1, 0x21, 0x56, 0x32, 0xbd, 0x01, 0xe2, 0xd3, 0x6f, 0xb4, 0xdf, + 0x59, 0x99, 0x99, 0x42, 0x2d, 0xdf, 0x41, 0x45, 0xf6, 0x8d, 0x59, 0x01, 0xa6, 0xc2, 0x83, 0xe2, + 0x8e, 0xd8, 0x1f, 0x4a, 0x90, 0x5b, 0xb3, 0x45, 0x28, 0x88, 0xff, 0x92, 0x5e, 0x2f, 0x7b, 0x12, + 0x06, 0xd5, 0x26, 0xbd, 0x4d, 0x92, 0xec, 0x4d, 0x6f, 0x39, 0xba, 0x4f, 0x08, 0x47, 0x60, 0xc2, + 0xd7, 0x4f, 0xb7, 0xff, 0xbf, 0x9d, 0xa0, 0xf6, 0x91, 0x3e, 0xef, 0xe2, 0x46, 0x91, 0xf8, 0x5b, + 0xf5, 0xea, 0x89, 0x27, 0xe7, 0xd4, 0x61, 0xe5, 0x7c, 0x95, 0x1a, 0x88, 0x90, 0x3c, 0xdd, 0xc4, + 0xd7, 0x5a, 0xfb, 0xcd, 0xab, 0x7e, 0x7e, 0xe3, 0x22, 0x74, 0xbf, 0x4a, 0xfe, 0x92, 0x04, 0x23, + 0x6b, 0x76, 0xfd, 0xb2, 0x5e, 0xfb, 0x7f, 0x5e, 0x7f, 0x77, 0xe1, 0x48, 0xa0, 0xa7, 0x77, 0x48, + 0xa4, 0x67, 0x3f, 0x9a, 0x82, 0xe4, 0x9a, 0x5d, 0x47, 0xef, 0x85, 0xb1, 0x70, 0xd0, 0x10, 0x19, + 0x0b, 0xb6, 0x7b, 0x84, 0xe8, 0xf5, 0x5a, 0xb4, 0xf7, 0x40, 0x57, 0x61, 0x24, 0xe8, 0x39, 0x4e, + 0x75, 0x61, 0x12, 0xc0, 0x2c, 0x3c, 0xda, 0x2b, 0xa6, 0x5b, 0xd9, 0xbb, 0x20, 0xe3, 0x1a, 0xbd, + 0x7b, 0xba, 0x50, 0x0b, 0xa4, 0xe8, 0xe8, 0xb6, 0x83, 0x59, 0x21, 0xd2, 0x0b, 0x9b, 0x94, 0x6e, + 0xd2, 0x0b, 0xe1, 0x76, 0x95, 0x5e, 0xd4, 0xd4, 0xda, 0x01, 0xf0, 0xcd, 0x83, 0xfb, 0xba, 0x70, + 0xf0, 0xd0, 0x0a, 0x8f, 0xf4, 0x84, 0xe6, 0x6e, 0x3a, 0xdd, 0xe6, 0x60, 0xfc, 0xff, 0x06, 0x00, + 0x00, 0xff, 0xff, 0x49, 0x6b, 0x36, 0xbd, 0xb8, 0xc1, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2015,6 +2316,12 @@ func (this *UnbondingDelegationEntry) Equal(that interface{}) bool { if !this.Balance.Equal(that1.Balance) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *RedelegationEntry) Equal(that interface{}) bool { @@ -2048,6 +2355,12 @@ func (this *RedelegationEntry) Equal(that interface{}) bool { if !this.SharesDst.Equal(that1.SharesDst) { return false } + if this.UnbondingId != that1.UnbondingId { + return false + } + if this.UnbondingOnHoldRefCount != that1.UnbondingOnHoldRefCount { + return false + } return true } func (this *Params) Equal(that interface{}) bool { @@ -2359,6 +2672,29 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.UnbondingIds) > 0 { + dAtA5 := make([]byte, len(m.UnbondingIds)*10) + var j4 int + for _, num := range m.UnbondingIds { + for num >= 1<<7 { + dAtA5[j4] = uint8(uint64(num)&0x7f | 0x80) + num >>= 7 + j4++ + } + dAtA5[j4] = uint8(num) + j4++ + } + i -= j4 + copy(dAtA[i:], dAtA5[:j4]) + i = encodeVarintStaking(dAtA, i, uint64(j4)) + i-- + dAtA[i] = 0x6a + } + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x60 + } { size := m.MinSelfDelegation.Size() i -= size @@ -2379,12 +2715,12 @@ func (m *Validator) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x52 - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) - if err5 != nil { - return 0, err5 + n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.UnbondingTime):]) + if err7 != nil { + return 0, err7 } - i -= n5 - i = encodeVarintStaking(dAtA, i, uint64(n5)) + i -= n7 + i = encodeVarintStaking(dAtA, i, uint64(n7)) i-- dAtA[i] = 0x4a if m.UnbondingHeight != 0 { @@ -2764,6 +3100,16 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.Balance.Size() i -= size @@ -2784,12 +3130,12 @@ func (m *UnbondingDelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error } i-- dAtA[i] = 0x1a - n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err8 != nil { - return 0, err8 + n10, err10 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err10 != nil { + return 0, err10 } - i -= n8 - i = encodeVarintStaking(dAtA, i, uint64(n8)) + i -= n10 + i = encodeVarintStaking(dAtA, i, uint64(n10)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2820,6 +3166,16 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.UnbondingOnHoldRefCount != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingOnHoldRefCount)) + i-- + dAtA[i] = 0x30 + } + if m.UnbondingId != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.UnbondingId)) + i-- + dAtA[i] = 0x28 + } { size := m.SharesDst.Size() i -= size @@ -2840,12 +3196,12 @@ func (m *RedelegationEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n9, err9 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) - if err9 != nil { - return 0, err9 + n11, err11 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CompletionTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CompletionTime):]) + if err11 != nil { + return 0, err11 } - i -= n9 - i = encodeVarintStaking(dAtA, i, uint64(n9)) + i -= n11 + i = encodeVarintStaking(dAtA, i, uint64(n11)) i-- dAtA[i] = 0x12 if m.CreationHeight != 0 { @@ -2956,12 +3312,12 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x10 } - n10, err10 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) - if err10 != nil { - return 0, err10 + n12, err12 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.UnbondingTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.UnbondingTime):]) + if err12 != nil { + return 0, err12 } - i -= n10 - i = encodeVarintStaking(dAtA, i, uint64(n10)) + i -= n12 + i = encodeVarintStaking(dAtA, i, uint64(n12)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -3143,6 +3499,43 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ValidatorUpdates) 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 *ValidatorUpdates) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorUpdates) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Updates) > 0 { + for iNdEx := len(m.Updates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Updates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintStaking(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { offset -= sovStaking(v) base := offset @@ -3263,6 +3656,16 @@ func (m *Validator) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.MinSelfDelegation.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } + if len(m.UnbondingIds) > 0 { + l = 0 + for _, e := range m.UnbondingIds { + l += sovStaking(uint64(e)) + } + n += 1 + sovStaking(uint64(l)) + l + } return n } @@ -3406,6 +3809,12 @@ func (m *UnbondingDelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.Balance.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3424,6 +3833,12 @@ func (m *RedelegationEntry) Size() (n int) { n += 1 + l + sovStaking(uint64(l)) l = m.SharesDst.Size() n += 1 + l + sovStaking(uint64(l)) + if m.UnbondingId != 0 { + n += 1 + sovStaking(uint64(m.UnbondingId)) + } + if m.UnbondingOnHoldRefCount != 0 { + n += 1 + sovStaking(uint64(m.UnbondingOnHoldRefCount)) + } return n } @@ -3534,6 +3949,21 @@ func (m *Pool) Size() (n int) { return n } +func (m *ValidatorUpdates) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Updates) > 0 { + for _, e := range m.Updates { + l = e.Size() + n += 1 + l + sovStaking(uint64(l)) + } + } + return n +} + func sovStaking(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -4509,6 +4939,101 @@ func (m *Validator) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 13: + if wireType == 0 { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } else if wireType == 2 { + var packedLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + packedLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if packedLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + packedLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + 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.UnbondingIds) == 0 { + m.UnbondingIds = make([]uint64, 0, elementCount) + } + for iNdEx < postIndex { + var v uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.UnbondingIds = append(m.UnbondingIds, v) + } + } else { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingIds", wireType) + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5485,6 +6010,44 @@ func (m *UnbondingDelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -5655,6 +6218,44 @@ func (m *RedelegationEntry) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingId", wireType) + } + m.UnbondingId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UnbondingOnHoldRefCount", wireType) + } + m.UnbondingOnHoldRefCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UnbondingOnHoldRefCount |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipStaking(dAtA[iNdEx:]) @@ -6496,6 +7097,90 @@ func (m *Pool) Unmarshal(dAtA []byte) error { } return nil } +func (m *ValidatorUpdates) 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 ErrIntOverflowStaking + } + 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: ValidatorUpdates: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatorUpdates: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Updates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Updates = append(m.Updates, types3.ValidatorUpdate{}) + if err := m.Updates[len(m.Updates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthStaking + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipStaking(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/x/staking/types/validator.go b/x/staking/types/validator.go index de41bd8a01d5..02da27fec732 100644 --- a/x/staking/types/validator.go +++ b/x/staking/types/validator.go @@ -47,17 +47,18 @@ func NewValidator(operator sdk.ValAddress, pubKey cryptotypes.PubKey, descriptio } return Validator{ - OperatorAddress: operator.String(), - ConsensusPubkey: pkAny, - Jailed: false, - Status: Unbonded, - Tokens: sdk.ZeroInt(), - DelegatorShares: sdk.ZeroDec(), - Description: description, - UnbondingHeight: int64(0), - UnbondingTime: time.Unix(0, 0).UTC(), - Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), - MinSelfDelegation: sdk.OneInt(), + OperatorAddress: operator.String(), + ConsensusPubkey: pkAny, + Jailed: false, + Status: Unbonded, + Tokens: sdk.ZeroInt(), + DelegatorShares: sdk.ZeroDec(), + Description: description, + UnbondingHeight: int64(0), + UnbondingTime: time.Unix(0, 0).UTC(), + Commission: NewCommission(sdk.ZeroDec(), sdk.ZeroDec(), sdk.ZeroDec()), + MinSelfDelegation: sdk.OneInt(), + UnbondingOnHoldRefCount: 0, }, nil }