diff --git a/Makefile b/Makefile index 171f2296..bd7a39f7 100644 --- a/Makefile +++ b/Makefile @@ -13,6 +13,67 @@ all: tools lint # The below include contains the tools. include contrib/devtools/Makefile + + +PACKAGES=$(shell go list ./... | grep -v '/simulation') +VERSION := $(shell git describe --abbrev=6 --dirty --always --tags) +COMMIT := $(shell git log -1 --format='%H') +DOCKER := $(shell which docker) +DOCKER_BUF := $(DOCKER) run --rm -v $(CURDIR):/workspace --workdir /workspace bufbuild/buf +HTTPS_GIT := https://github.com/iqlusioninc/liquidity-staking-module.git + +build_tags = netgo +ifeq ($(LEDGER_ENABLED),true) + ifeq ($(OS),Windows_NT) + GCCEXE = $(shell where gcc.exe 2> NUL) + ifeq ($(GCCEXE),) + $(error gcc.exe not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + else + UNAME_S = $(shell uname -s) + ifeq ($(UNAME_S),OpenBSD) + $(warning OpenBSD detected, disabling ledger support (https://github.com/cosmos/cosmos-sdk/issues/1988)) + else + GCC = $(shell command -v gcc 2> /dev/null) + ifeq ($(GCC),) + $(error gcc not installed for ledger support, please install or set LEDGER_ENABLED=false) + else + build_tags += ledger + endif + endif + endif +endif + +ifeq (cleveldb,$(findstring cleveldb,$(GAIA_BUILD_OPTIONS))) + build_tags += gcc +endif +build_tags += $(BUILD_TAGS) +build_tags := $(strip $(build_tags)) + +whitespace := +whitespace += $(whitespace) +comma := , +build_tags_comma_sep := $(subst $(whitespace),$(comma),$(build_tags)) + +ldflags = -X github.com/cosmos/cosmos-sdk/version.Name=gravity \ + -X github.com/cosmos/cosmos-sdk/version.AppName=gravity \ + -X github.com/cosmos/cosmos-sdk/version.Version=$(VERSION) \ + -X github.com/cosmos/cosmos-sdk/version.Commit=$(COMMIT) \ + -X "github.com/cosmos/cosmos-sdk/version.BuildTags=$(build_tags_comma_sep)" \ + +BUILD_FLAGS := -ldflags '$(ldflags)' -gcflags="all=-N -l" + +############## +### Build and install + +install: go.sum + go install $(BUILD_FLAGS) ./cmd/liquidstakingd + +build: + go build -o build/liquidstakingd $(BUILD_FLAGS) ./cmd/liquidstakingd/main.go + ######################################## ### Tools & dependencies diff --git a/proto/distribution/v1beta1/tx.proto b/proto/distribution/v1beta1/tx.proto index ceaa1746..ea93c166 100644 --- a/proto/distribution/v1beta1/tx.proto +++ b/proto/distribution/v1beta1/tx.proto @@ -21,6 +21,11 @@ service Msg { // full commission to the validator address. rpc WithdrawValidatorCommission(MsgWithdrawValidatorCommission) returns (MsgWithdrawValidatorCommissionResponse); + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for + // owning TokenizeShareRecord + rpc WithdrawTokenizeShareRecordReward(MsgWithdrawTokenizeShareRecordReward) + returns (MsgWithdrawTokenizeShareRecordRewardResponse); + // FundCommunityPool defines a method to allow an account to directly // fund the community pool. rpc FundCommunityPool(MsgFundCommunityPool) returns (MsgFundCommunityPoolResponse); @@ -64,6 +69,15 @@ message MsgWithdrawValidatorCommission { // MsgWithdrawValidatorCommissionResponse defines the Msg/WithdrawValidatorCommission response type. message MsgWithdrawValidatorCommissionResponse {} +message MsgWithdrawTokenizeShareRecordReward { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string owner_address = 1 [ (gogoproto.moretags) = "yaml:\"owner_address\"" ]; +} + +message MsgWithdrawTokenizeShareRecordRewardResponse {} + // MsgFundCommunityPool allows an account to directly // fund the community pool. message MsgFundCommunityPool { diff --git a/proto/staking/v1beta1/genesis.proto b/proto/staking/v1beta1/genesis.proto index 4ff5fbbd..ee89176b 100644 --- a/proto/staking/v1beta1/genesis.proto +++ b/proto/staking/v1beta1/genesis.proto @@ -38,6 +38,13 @@ message GenesisState { repeated Redelegation redelegations = 7 [(gogoproto.nullable) = false]; bool exported = 8; + + // store tokenize share records to provide reward to record owners + repeated TokenizeShareRecord tokenize_share_records = 9 + [ (gogoproto.nullable) = false ]; + + // last tokenize share record id, used for next share record id calculation + uint64 last_tokenize_share_record_id = 10; } // LastValidatorPower required for validator set update logic. diff --git a/proto/staking/v1beta1/staking.proto b/proto/staking/v1beta1/staking.proto index 47457d0e..d6751f77 100644 --- a/proto/staking/v1beta1/staking.proto +++ b/proto/staking/v1beta1/staking.proto @@ -332,3 +332,13 @@ message Pool { (gogoproto.moretags) = "yaml:\"bonded_tokens\"" ]; } + +message TokenizeShareRecord { + option (gogoproto.equal) = true; + + uint64 id = 1; + string owner = 2; + string share_token_denom = 3; + string module_account = 4; // module account take the role of delegator + string validator = 5; // validator delegated to for tokenize share record creation +} diff --git a/proto/staking/v1beta1/tx.proto b/proto/staking/v1beta1/tx.proto index bf9a4220..f097f929 100644 --- a/proto/staking/v1beta1/tx.proto +++ b/proto/staking/v1beta1/tx.proto @@ -30,6 +30,19 @@ service Msg { // Undelegate defines a method for performing an undelegation from a // delegate and a validator. rpc Undelegate(MsgUndelegate) returns (MsgUndelegateResponse); + + // TokenizeShares defines a method for tokenizing shares from a validator. + rpc TokenizeShares(MsgTokenizeShares) returns (MsgTokenizeSharesResponse); + + // RedeemTokens defines a method for redeeming tokens from a validator for + // shares. + rpc RedeemTokens(MsgRedeemTokensforShares) + returns (MsgRedeemTokensforSharesResponse); + + // TransferTokenizeShareRecord defines a method to transfer ownership of + // TokenizeShareRecord + rpc TransferTokenizeShareRecord(MsgTransferTokenizeShareRecord) + returns (MsgTransferTokenizeShareRecordResponse); } // MsgCreateValidator defines a SDK message for creating a new validator. @@ -124,3 +137,42 @@ message MsgUndelegate { message MsgUndelegateResponse { google.protobuf.Timestamp completion_time = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true]; } + +message MsgTokenizeShares { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string delegator_address = 1 + [ (gogoproto.moretags) = "yaml:\"delegator_address\"" ]; + string validator_address = 2 + [ (gogoproto.moretags) = "yaml:\"validator_address\"" ]; + cosmos.base.v1beta1.Coin amount = 3 [ (gogoproto.nullable) = false ]; + string tokenized_share_owner = 4 + [ (gogoproto.moretags) = "yaml:\"tokenized_share_owner\"" ]; +} + +message MsgTokenizeSharesResponse { + cosmos.base.v1beta1.Coin amount = 1 [ (gogoproto.nullable) = false ]; +} + +message MsgRedeemTokensforShares { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + string delegator_address = 1 + [ (gogoproto.moretags) = "yaml:\"delegator_address\"" ]; + cosmos.base.v1beta1.Coin amount = 2 [ (gogoproto.nullable) = false ]; +} + +message MsgRedeemTokensforSharesResponse {} + +message MsgTransferTokenizeShareRecord { + option (gogoproto.equal) = false; + option (gogoproto.goproto_getters) = false; + + uint64 tokenize_share_record_id = 1; + string sender = 2; + string new_owner = 3; +} + +message MsgTransferTokenizeShareRecordResponse {} \ No newline at end of file diff --git a/x/distribution/client/cli/tx.go b/x/distribution/client/cli/tx.go index bacd1d07..a2b924ef 100644 --- a/x/distribution/client/cli/tx.go +++ b/x/distribution/client/cli/tx.go @@ -41,6 +41,7 @@ func NewTxCmd() *cobra.Command { NewWithdrawAllRewardsCmd(), NewSetWithdrawAddrCmd(), NewFundCommunityPoolCmd(), + NewWithdrawTokenizeShareRecordRewardCmd(), ) return distTxCmd @@ -332,3 +333,35 @@ Where proposal.json contains: return cmd } + +// WithdrawTokenizeShareRecordReward defines a method to withdraw reward for owning TokenizeShareRecord +func NewWithdrawTokenizeShareRecordRewardCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "withdraw-tokenize-share-rewards", + Args: cobra.ExactArgs(0), + Short: "Withdraw reward for owning TokenizeShareRecord", + Long: strings.TrimSpace( + fmt.Sprintf(`Withdraw reward for owned TokenizeShareRecord + +Example: +$ %s tx distribution withdraw-tokenize-share-rewards --from mykey +`, + version.AppName, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgWithdrawTokenizeShareRecordReward(clientCtx.GetFromAddress()) + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/distribution/client/testutil/suite.go b/x/distribution/client/testutil/suite.go index 29baee0f..3f5b2f23 100644 --- a/x/distribution/client/testutil/suite.go +++ b/x/distribution/client/testutil/suite.go @@ -747,3 +747,46 @@ func (s *IntegrationTestSuite) TestGetCmdSubmitProposal() { }) } } + +func (s *IntegrationTestSuite) TestNewWithdrawTokenizeShareRecordRewardCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "valid transaction of withdraw tokenize share record reward", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewWithdrawTokenizeShareRecordRewardCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) + } + }) + } +} diff --git a/x/distribution/keeper/delegation_test.go b/x/distribution/keeper/delegation_test.go index e1e6a7ea..f58fd5ff 100644 --- a/x/distribution/keeper/delegation_test.go +++ b/x/distribution/keeper/delegation_test.go @@ -7,8 +7,11 @@ import ( tmproto "github.com/tendermint/tendermint/proto/tendermint/types" sdk "github.com/cosmos/cosmos-sdk/types" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/distribution/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking" + stakingkeeper "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" stakingtypes "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -67,6 +70,97 @@ func TestCalculateRewardsBasic(t *testing.T) { require.Equal(t, sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: sdk.NewDec(initial / 2)}}, app.DistrKeeper.GetValidatorAccumulatedCommission(ctx, valAddrs[0]).Commission) } +func TestWithdrawTokenizeShareRecordReward(t *testing.T) { + app := simapp.Setup(false) + ctx := app.BaseApp.NewContext(false, tmproto.Header{}) + + addr := simapp.AddTestAddrs(app, ctx, 2, sdk.NewInt(100000000)) + valAddrs := simapp.ConvertAddrsToValAddrs(addr) + tstaking := teststaking.NewHelper(t, ctx, app.StakingKeeper) + + // create validator with 50% commission + tstaking.Commission = stakingtypes.NewCommissionRates(sdk.NewDecWithPrec(5, 1), sdk.NewDecWithPrec(5, 1), sdk.NewDec(0)) + valPower := int64(100) + tstaking.CreateValidatorWithValPower(valAddrs[0], valConsPk1, valPower, true) + + // end block to bond validator + staking.EndBlocker(ctx, app.StakingKeeper) + + // next block + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + + // fetch validator and delegation + val := app.StakingKeeper.Validator(ctx, valAddrs[0]) + del := app.StakingKeeper.Delegation(ctx, sdk.AccAddress(valAddrs[0]), valAddrs[0]) + + // end period + endingPeriod := app.DistrKeeper.IncrementValidatorPeriod(ctx, val) + + // calculate delegation rewards + rewards := app.DistrKeeper.CalculateDelegationRewards(ctx, val, del, endingPeriod) + + // rewards should be zero + require.True(t, rewards.IsZero()) + + // start out block height + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) + + // retrieve validator + val = app.StakingKeeper.Validator(ctx, valAddrs[0]) + + // increase block height + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 3) + + // allocate some rewards + initial := app.StakingKeeper.TokensFromConsensusPower(ctx, 10) + tokens := sdk.DecCoins{{Denom: sdk.DefaultBondDenom, Amount: initial.ToDec()}} + app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) + + // end period + app.DistrKeeper.IncrementValidatorPeriod(ctx, val) + + coins := sdk.Coins{sdk.NewCoin(sdk.DefaultBondDenom, initial)} + err := app.MintKeeper.MintCoins(ctx, coins) + require.NoError(t, err) + err = app.BankKeeper.SendCoinsFromModuleToModule(ctx, minttypes.ModuleName, types.ModuleName, coins) + require.NoError(t, err) + + // tokenize share amount + delTokens := sdk.NewInt(1000000) + msgServer := stakingkeeper.NewMsgServerImpl(app.StakingKeeper) + resp, err := msgServer.TokenizeShares(sdk.WrapSDKContext(ctx), &stakingtypes.MsgTokenizeShares{ + DelegatorAddress: sdk.AccAddress(valAddrs[0]).String(), + ValidatorAddress: valAddrs[0].String(), + TokenizedShareOwner: sdk.AccAddress(valAddrs[0]).String(), + Amount: sdk.NewCoin(sdk.DefaultBondDenom, delTokens), + }) + + // assert tokenize share response + require.NoError(t, err) + require.Equal(t, resp.Amount.Amount, delTokens) + + // end block to bond validator + staking.EndBlocker(ctx, app.StakingKeeper) + // next block + ctx = ctx.WithBlockHeight(ctx.BlockHeight() + 1) + // allocate some rewards + app.DistrKeeper.AllocateTokensToValidator(ctx, val, tokens) + // end period + app.DistrKeeper.IncrementValidatorPeriod(ctx, val) + + beforeBalance := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(valAddrs[0]), sdk.DefaultBondDenom) + + // withdraw rewards + coins, err = app.DistrKeeper.WithdrawTokenizeShareRecordReward(ctx, sdk.AccAddress(valAddrs[0])) + require.Nil(t, err) + + // check return value + require.Equal(t, coins.String(), "50000stake") + // check balance changes + afterBalance := app.BankKeeper.GetBalance(ctx, sdk.AccAddress(valAddrs[0]), sdk.DefaultBondDenom) + require.Equal(t, beforeBalance.Amount.Add(coins.AmountOf(sdk.DefaultBondDenom)), afterBalance.Amount) +} + func TestCalculateRewardsAfterSlash(t *testing.T) { app := simapp.Setup(false) ctx := app.BaseApp.NewContext(false, tmproto.Header{}) diff --git a/x/distribution/keeper/keeper.go b/x/distribution/keeper/keeper.go index 119beb62..1eac17db 100644 --- a/x/distribution/keeper/keeper.go +++ b/x/distribution/keeper/keeper.go @@ -173,3 +173,47 @@ func (k Keeper) FundCommunityPool(ctx sdk.Context, amount sdk.Coins, sender sdk. return nil } + +// withdraw reward for owning TokenizeShareRecord +func (k Keeper) WithdrawTokenizeShareRecordReward(ctx sdk.Context, ownerAddr sdk.AccAddress) (sdk.Coins, error) { + totalRewards := sdk.Coins{} + + records := k.stakingKeeper.GetTokenizeShareRecordsByOwner(ctx, ownerAddr) + + for _, record := range records { + valAddr, err := sdk.ValAddressFromBech32(record.Validator) + if err != nil { + return nil, err + } + + val := k.stakingKeeper.Validator(ctx, valAddr) + if val == nil { + continue + } + + del := k.stakingKeeper.Delegation(ctx, record.GetModuleAddress(), valAddr) + if del == nil { + continue + } + + // withdraw rewards + rewards, err := k.withdrawDelegationRewards(ctx, val, del) + if err != nil { + return nil, err + } + + // send coins from record module account to record module owner account + k.bankKeeper.SendCoins(ctx, record.GetModuleAddress(), ownerAddr, rewards) + + totalRewards = totalRewards.Add(rewards...) + } + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeWithdrawTokenizeShareReward, + sdk.NewAttribute(sdk.AttributeKeyAmount, totalRewards.String()), + ), + ) + + return totalRewards, nil +} diff --git a/x/distribution/keeper/msg_server.go b/x/distribution/keeper/msg_server.go index 7e0769b3..8ef5cd13 100644 --- a/x/distribution/keeper/msg_server.go +++ b/x/distribution/keeper/msg_server.go @@ -122,6 +122,42 @@ func (k msgServer) WithdrawValidatorCommission(goCtx context.Context, msg *types return &types.MsgWithdrawValidatorCommissionResponse{}, nil } +// WithdrawTokenizeShareRecordReward defines a method to withdraw reward for owning TokenizeShareRecord +func (k msgServer) WithdrawTokenizeShareRecordReward(goCtx context.Context, msg *types.MsgWithdrawTokenizeShareRecordReward) (*types.MsgWithdrawTokenizeShareRecordRewardResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + ownerAddr, err := sdk.AccAddressFromBech32(msg.OwnerAddress) + if err != nil { + return nil, err + } + amount, err := k.Keeper.WithdrawTokenizeShareRecordReward(ctx, ownerAddr) + if err != nil { + return nil, err + } + + defer func() { + for _, a := range amount { + if a.Amount.IsInt64() { + telemetry.SetGaugeWithLabels( + []string{"tx", "msg", "withdraw_tokenize_share_reward"}, + float32(a.Amount.Int64()), + []metrics.Label{telemetry.NewLabel("denom", a.Denom)}, + ) + } + } + }() + + ctx.EventManager().EmitEvent( + sdk.NewEvent( + sdk.EventTypeMessage, + sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory), + sdk.NewAttribute(sdk.AttributeKeySender, msg.OwnerAddress), + ), + ) + + return &types.MsgWithdrawTokenizeShareRecordRewardResponse{}, nil +} + func (k msgServer) FundCommunityPool(goCtx context.Context, msg *types.MsgFundCommunityPool) (*types.MsgFundCommunityPoolResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) diff --git a/x/distribution/spec/04_messages.md b/x/distribution/spec/04_messages.md index 65fde1af..ecd68116 100644 --- a/x/distribution/spec/04_messages.md +++ b/x/distribution/spec/04_messages.md @@ -72,6 +72,14 @@ The commission is calculated in every block during `BeginBlock`, so no iteration The amount withdrawn is deducted from the `ValidatorOutstandingRewards` variable for the validator. Only integer amounts can be sent. If the accumulated awards have decimals, the amount is truncated before the withdrawal is sent, and the remainder is left to be withdrawn later. +## MsgWithdrawTokenizeShareRecordReward + +A `TokenizeShareRecords` owner can send the MsgWithdrawTokenizeShareRecordReward message to withraw their rewards allocated for tokenized amount of staking tokens. + +The middle account (1:1 assigned per tokenize share record) takes the role of a delegator. + +While executing the message, handler iterates all the tokenize share records, withdraw delegation reward from each record account and send the rewards to the record owner. + ## FundCommunityPool This message sends coins directly from the sender to the community pool. diff --git a/x/distribution/spec/README.md b/x/distribution/spec/README.md index 868b4259..4a9565da 100644 --- a/x/distribution/spec/README.md +++ b/x/distribution/spec/README.md @@ -23,12 +23,12 @@ whenever changes to parameters which affect the rate of reward distribution occurs, withdrawal of rewards must also occur. - Whenever withdrawing, one must withdraw the maximum amount they are entitled - to, leaving nothing in the pool. + to, leaving nothing in the pool. - Whenever bonding, unbonding, or re-delegating tokens to an existing account, a - full withdrawal of the rewards must occur (as the rules for lazy accounting - change). + full withdrawal of the rewards must occur (as the rules for lazy accounting + change). - Whenever a validator chooses to change the commission on rewards, all accumulated - commission rewards must be simultaneously withdrawn. + commission rewards must be simultaneously withdrawn. The above scenarios are covered in `hooks.md`. @@ -42,7 +42,7 @@ following rewards between validators and associated delegators: Fees are pooled within a global pool, as well as validator specific proposer-reward pools. The mechanisms used allow for validators and delegators -to independently and lazily withdraw their rewards. +to independently and lazily withdraw their rewards. ## Shortcomings @@ -85,19 +85,20 @@ to set up a script to periodically withdraw and rebond rewards. ## Contents 1. **[Concepts](01_concepts.md)** - - [Reference Counting in F1 Fee Distribution](01_concepts.md#reference-counting-in-f1-fee-distribution) + - [Reference Counting in F1 Fee Distribution](01_concepts.md#reference-counting-in-f1-fee-distribution) 2. **[State](02_state.md)** 3. **[Begin Block](03_begin_block.md)** 4. **[Messages](04_messages.md)** - - [MsgSetWithdrawAddress](04_messages.md#msgsetwithdrawaddress) - - [MsgWithdrawDelegatorReward](04_messages.md#msgwithdrawdelegatorreward) - - [Withdraw Validator Rewards All](04_messages.md#withdraw-validator-rewards-all) - - [Common calculations](04_messages.md#common-calculations-) + - [MsgSetWithdrawAddress](04_messages.md#msgsetwithdrawaddress) + - [MsgWithdrawDelegatorReward](04_messages.md#msgwithdrawdelegatorreward) + - [Withdraw Validator Rewards All](04_messages.md#withdraw-validator-rewards-all) + - [MsgWithdrawTokenizeShareRecordReward](04_messages.md#msgwithdrawtokenizesharerecordreward) + - [Common calculations](04_messages.md#common-calculations-) 5. **[Hooks](05_hooks.md)** - - [Create or modify delegation distribution](05_hooks.md#create-or-modify-delegation-distribution) - - [Commission rate change](05_hooks.md#commission-rate-change) - - [Change in Validator State](05_hooks.md#change-in-validator-state) + - [Create or modify delegation distribution](05_hooks.md#create-or-modify-delegation-distribution) + - [Commission rate change](05_hooks.md#commission-rate-change) + - [Change in Validator State](05_hooks.md#change-in-validator-state) 6. **[Events](06_events.md)** - - [BeginBlocker](06_events.md#beginblocker) - - [Handlers](06_events.md#handlers) + - [BeginBlocker](06_events.md#beginblocker) + - [Handlers](06_events.md#handlers) 7. **[Parameters](07_params.md)** diff --git a/x/distribution/types/codec.go b/x/distribution/types/codec.go index 73aca450..029c0955 100644 --- a/x/distribution/types/codec.go +++ b/x/distribution/types/codec.go @@ -17,6 +17,7 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgSetWithdrawAddress{}, "cosmos-sdk/MsgModifyWithdrawAddress", nil) cdc.RegisterConcrete(&MsgFundCommunityPool{}, "cosmos-sdk/MsgFundCommunityPool", nil) cdc.RegisterConcrete(&CommunityPoolSpendProposal{}, "cosmos-sdk/CommunityPoolSpendProposal", nil) + cdc.RegisterConcrete(&MsgWithdrawTokenizeShareRecordReward{}, "cosmos-sdk/MsgWithdrawTokenizeShareRecordReward", nil) } func RegisterInterfaces(registry types.InterfaceRegistry) { @@ -26,6 +27,7 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgWithdrawValidatorCommission{}, &MsgSetWithdrawAddress{}, &MsgFundCommunityPool{}, + &MsgWithdrawTokenizeShareRecordReward{}, ) registry.RegisterImplementations( (*govtypes.Content)(nil), diff --git a/x/distribution/types/events.go b/x/distribution/types/events.go index ce4c0ef6..a45d931c 100644 --- a/x/distribution/types/events.go +++ b/x/distribution/types/events.go @@ -2,12 +2,13 @@ package types // distribution module event types const ( - EventTypeSetWithdrawAddress = "set_withdraw_address" - EventTypeRewards = "rewards" - EventTypeCommission = "commission" - EventTypeWithdrawRewards = "withdraw_rewards" - EventTypeWithdrawCommission = "withdraw_commission" - EventTypeProposerReward = "proposer_reward" + EventTypeSetWithdrawAddress = "set_withdraw_address" + EventTypeRewards = "rewards" + EventTypeCommission = "commission" + EventTypeWithdrawRewards = "withdraw_rewards" + EventTypeWithdrawCommission = "withdraw_commission" + EventTypeWithdrawTokenizeShareReward = "withdraw_tokenize_share_reward" + EventTypeProposerReward = "proposer_reward" AttributeKeyWithdrawAddress = "withdraw_address" AttributeKeyValidator = "validator" diff --git a/x/distribution/types/expected_keepers.go b/x/distribution/types/expected_keepers.go index acf1f1a4..18ee1c7f 100644 --- a/x/distribution/types/expected_keepers.go +++ b/x/distribution/types/expected_keepers.go @@ -28,6 +28,7 @@ type BankKeeper interface { SendCoinsFromModuleToModule(ctx sdk.Context, senderModule string, recipientModule string, amt sdk.Coins) error SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error } // StakingKeeper expected staking keeper (noalias) @@ -66,6 +67,8 @@ type StakingKeeper interface { GetLastValidatorPower(ctx sdk.Context, valAddr sdk.ValAddress) int64 GetAllSDKDelegations(ctx sdk.Context) []stakingtypes.Delegation + + GetTokenizeShareRecordsByOwner(ctx sdk.Context, owner sdk.AccAddress) (tokenizeShareRecords []stakingtypes.TokenizeShareRecord) } // StakingHooks event hooks for staking validator object (noalias) diff --git a/x/distribution/types/msg.go b/x/distribution/types/msg.go index 09e9994c..99511a2a 100644 --- a/x/distribution/types/msg.go +++ b/x/distribution/types/msg.go @@ -7,14 +7,16 @@ import ( // distribution message types const ( - TypeMsgSetWithdrawAddress = "set_withdraw_address" - TypeMsgWithdrawDelegatorReward = "withdraw_delegator_reward" - TypeMsgWithdrawValidatorCommission = "withdraw_validator_commission" - TypeMsgFundCommunityPool = "fund_community_pool" + TypeMsgSetWithdrawAddress = "set_withdraw_address" + TypeMsgWithdrawDelegatorReward = "withdraw_delegator_reward" + TypeMsgWithdrawValidatorCommission = "withdraw_validator_commission" + TypeMsgFundCommunityPool = "fund_community_pool" + TypeMsgWithdrawTokenizeShareRecordReward = "withdraw_tokenize_share_record_reward" ) // Verify interface at compile time var _, _, _ sdk.Msg = &MsgSetWithdrawAddress{}, &MsgWithdrawDelegatorReward{}, &MsgWithdrawValidatorCommission{} +var _ sdk.Msg = &MsgWithdrawTokenizeShareRecordReward{} func NewMsgSetWithdrawAddress(delAddr, withdrawAddr sdk.AccAddress) *MsgSetWithdrawAddress { return &MsgSetWithdrawAddress{ @@ -164,3 +166,34 @@ func (msg MsgFundCommunityPool) ValidateBasic() error { return nil } + +func NewMsgWithdrawTokenizeShareRecordReward(ownerAddr sdk.AccAddress) *MsgWithdrawTokenizeShareRecordReward { + return &MsgWithdrawTokenizeShareRecordReward{ + OwnerAddress: ownerAddr.String(), + } +} + +func (msg MsgWithdrawTokenizeShareRecordReward) Route() string { return ModuleName } +func (msg MsgWithdrawTokenizeShareRecordReward) Type() string { + return TypeMsgWithdrawTokenizeShareRecordReward +} + +// Return address that must sign over msg.GetSignBytes() +func (msg MsgWithdrawTokenizeShareRecordReward) GetSigners() []sdk.AccAddress { + owner, _ := sdk.AccAddressFromBech32(msg.OwnerAddress) + return []sdk.AccAddress{owner} +} + +// get the bytes for the message signer to sign on +func (msg MsgWithdrawTokenizeShareRecordReward) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +// quick validity check +func (msg MsgWithdrawTokenizeShareRecordReward) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.OwnerAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid owner address: %s", err) + } + return nil +} diff --git a/x/distribution/types/tx.pb.go b/x/distribution/types/tx.pb.go index 8e3ad926..080b8efd 100644 --- a/x/distribution/types/tx.pb.go +++ b/x/distribution/types/tx.pb.go @@ -262,6 +262,83 @@ func (m *MsgWithdrawValidatorCommissionResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgWithdrawValidatorCommissionResponse proto.InternalMessageInfo +type MsgWithdrawTokenizeShareRecordReward struct { + OwnerAddress string `protobuf:"bytes,1,opt,name=owner_address,json=ownerAddress,proto3" json:"owner_address,omitempty" yaml:"owner_address"` +} + +func (m *MsgWithdrawTokenizeShareRecordReward) Reset() { *m = MsgWithdrawTokenizeShareRecordReward{} } +func (m *MsgWithdrawTokenizeShareRecordReward) String() string { return proto.CompactTextString(m) } +func (*MsgWithdrawTokenizeShareRecordReward) ProtoMessage() {} +func (*MsgWithdrawTokenizeShareRecordReward) Descriptor() ([]byte, []int) { + return fileDescriptor_f0452d52deb0ca76, []int{6} +} +func (m *MsgWithdrawTokenizeShareRecordReward) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgWithdrawTokenizeShareRecordReward) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgWithdrawTokenizeShareRecordReward.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 *MsgWithdrawTokenizeShareRecordReward) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithdrawTokenizeShareRecordReward.Merge(m, src) +} +func (m *MsgWithdrawTokenizeShareRecordReward) XXX_Size() int { + return m.Size() +} +func (m *MsgWithdrawTokenizeShareRecordReward) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithdrawTokenizeShareRecordReward.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithdrawTokenizeShareRecordReward proto.InternalMessageInfo + +type MsgWithdrawTokenizeShareRecordRewardResponse struct { +} + +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) Reset() { + *m = MsgWithdrawTokenizeShareRecordRewardResponse{} +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) String() string { + return proto.CompactTextString(m) +} +func (*MsgWithdrawTokenizeShareRecordRewardResponse) ProtoMessage() {} +func (*MsgWithdrawTokenizeShareRecordRewardResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_f0452d52deb0ca76, []int{7} +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgWithdrawTokenizeShareRecordRewardResponse.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 *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgWithdrawTokenizeShareRecordRewardResponse.Merge(m, src) +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgWithdrawTokenizeShareRecordRewardResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgWithdrawTokenizeShareRecordRewardResponse proto.InternalMessageInfo + // MsgFundCommunityPool allows an account to directly // fund the community pool. type MsgFundCommunityPool struct { @@ -273,7 +350,7 @@ func (m *MsgFundCommunityPool) Reset() { *m = MsgFundCommunityPool{} } func (m *MsgFundCommunityPool) String() string { return proto.CompactTextString(m) } func (*MsgFundCommunityPool) ProtoMessage() {} func (*MsgFundCommunityPool) Descriptor() ([]byte, []int) { - return fileDescriptor_f0452d52deb0ca76, []int{6} + return fileDescriptor_f0452d52deb0ca76, []int{8} } func (m *MsgFundCommunityPool) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -310,7 +387,7 @@ func (m *MsgFundCommunityPoolResponse) Reset() { *m = MsgFundCommunityPo func (m *MsgFundCommunityPoolResponse) String() string { return proto.CompactTextString(m) } func (*MsgFundCommunityPoolResponse) ProtoMessage() {} func (*MsgFundCommunityPoolResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_f0452d52deb0ca76, []int{7} + return fileDescriptor_f0452d52deb0ca76, []int{9} } func (m *MsgFundCommunityPoolResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -346,6 +423,8 @@ func init() { proto.RegisterType((*MsgWithdrawDelegatorRewardResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawDelegatorRewardResponse") proto.RegisterType((*MsgWithdrawValidatorCommission)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawValidatorCommission") proto.RegisterType((*MsgWithdrawValidatorCommissionResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawValidatorCommissionResponse") + proto.RegisterType((*MsgWithdrawTokenizeShareRecordReward)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawTokenizeShareRecordReward") + proto.RegisterType((*MsgWithdrawTokenizeShareRecordRewardResponse)(nil), "liquidstaking.distribution.v1beta1.MsgWithdrawTokenizeShareRecordRewardResponse") proto.RegisterType((*MsgFundCommunityPool)(nil), "liquidstaking.distribution.v1beta1.MsgFundCommunityPool") proto.RegisterType((*MsgFundCommunityPoolResponse)(nil), "liquidstaking.distribution.v1beta1.MsgFundCommunityPoolResponse") } @@ -353,44 +432,49 @@ func init() { func init() { proto.RegisterFile("distribution/v1beta1/tx.proto", fileDescriptor_f0452d52deb0ca76) } var fileDescriptor_f0452d52deb0ca76 = []byte{ - // 588 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x31, 0x6f, 0xd3, 0x40, - 0x14, 0xf6, 0xb5, 0xa2, 0xa2, 0xc7, 0x40, 0x62, 0x15, 0x35, 0xb8, 0xa9, 0x5d, 0x59, 0x08, 0x65, - 0x89, 0x4d, 0xcb, 0x02, 0x1d, 0x10, 0x4d, 0xab, 0x48, 0x45, 0x8a, 0x84, 0x8c, 0x04, 0x12, 0x0b, - 0xb2, 0x73, 0x27, 0xf7, 0x54, 0xdb, 0x2f, 0xf5, 0x9d, 0x9b, 0x66, 0x63, 0x64, 0x03, 0xf1, 0x0b, - 0x8a, 0x58, 0x10, 0x12, 0x1b, 0x23, 0x3f, 0xa0, 0x63, 0x47, 0xa6, 0x80, 0x92, 0x85, 0xb9, 0xbf, - 0x00, 0x25, 0x8e, 0x4d, 0x52, 0x3b, 0xa5, 0x34, 0x4c, 0x89, 0xde, 0xfb, 0xbe, 0xef, 0x7d, 0x4f, - 0xfe, 0x9e, 0x0e, 0xaf, 0x12, 0xc6, 0x45, 0xc8, 0x9c, 0x48, 0x30, 0x08, 0xcc, 0xc3, 0x75, 0x87, - 0x0a, 0x7b, 0xdd, 0x14, 0x47, 0x46, 0x2b, 0x04, 0x01, 0xb2, 0xee, 0xb1, 0x83, 0x88, 0x11, 0x2e, - 0xec, 0x7d, 0x16, 0xb8, 0xc6, 0x38, 0xd8, 0x18, 0x81, 0x95, 0x25, 0x17, 0x5c, 0x18, 0xc2, 0xcd, - 0xc1, 0xbf, 0x98, 0xa9, 0xa8, 0x4d, 0xe0, 0x3e, 0x70, 0xd3, 0xb1, 0x39, 0x4d, 0x75, 0x9b, 0xc0, - 0x82, 0xb8, 0xaf, 0x7f, 0x45, 0xf8, 0x56, 0x83, 0xbb, 0xcf, 0xa8, 0x78, 0xc1, 0xc4, 0x1e, 0x09, - 0xed, 0xf6, 0x16, 0x21, 0x21, 0xe5, 0x5c, 0xde, 0xc5, 0x45, 0x42, 0x3d, 0xea, 0xda, 0x02, 0xc2, - 0x57, 0x76, 0x5c, 0x2c, 0xa1, 0x35, 0x54, 0x59, 0xac, 0x95, 0xcf, 0xba, 0x5a, 0xa9, 0x63, 0xfb, - 0xde, 0xa6, 0x9e, 0x81, 0xe8, 0x56, 0x21, 0xad, 0x25, 0x52, 0x75, 0x5c, 0x68, 0x8f, 0xd4, 0x53, - 0xa5, 0xb9, 0xa1, 0xd2, 0xca, 0x59, 0x57, 0x5b, 0x8e, 0x95, 0xce, 0x23, 0x74, 0xeb, 0x66, 0x7b, - 0xd2, 0xd2, 0xe6, 0xf5, 0x37, 0xc7, 0x9a, 0xf4, 0xeb, 0x58, 0x93, 0x74, 0x0d, 0xaf, 0xe6, 0xba, - 0xb6, 0x28, 0x6f, 0x41, 0xc0, 0xa9, 0xfe, 0x0d, 0x61, 0xa5, 0xc1, 0xdd, 0xa4, 0xbd, 0x93, 0x58, - 0xb2, 0x68, 0xdb, 0x0e, 0xc9, 0xff, 0x5c, 0x6e, 0x17, 0x17, 0x0f, 0x6d, 0x8f, 0x91, 0x09, 0xa9, - 0xb9, 0xf3, 0x52, 0x19, 0x88, 0x6e, 0x15, 0xd2, 0x5a, 0x76, 0xbf, 0x3b, 0x58, 0x9f, 0xee, 0x3e, - 0x5d, 0x32, 0xc2, 0xea, 0x18, 0xea, 0x79, 0x22, 0xb7, 0x0d, 0xbe, 0xcf, 0x38, 0x67, 0x10, 0xe4, - 0x9b, 0x43, 0x33, 0x9a, 0xab, 0xe0, 0xbb, 0x17, 0x8f, 0x4d, 0x0d, 0x7e, 0x44, 0x78, 0xa9, 0xc1, - 0xdd, 0x7a, 0x14, 0x90, 0x41, 0x37, 0x0a, 0x98, 0xe8, 0x3c, 0x05, 0xf0, 0xe4, 0x26, 0x5e, 0xb0, - 0x7d, 0x88, 0x02, 0x51, 0x42, 0x6b, 0xf3, 0x95, 0x1b, 0x1b, 0xb7, 0x8d, 0x38, 0xa7, 0xc6, 0x20, - 0xa7, 0x49, 0xa4, 0x8d, 0x6d, 0x60, 0x41, 0xed, 0xde, 0x49, 0x57, 0x93, 0x3e, 0xff, 0xd0, 0x2a, - 0x2e, 0x13, 0x7b, 0x91, 0x63, 0x34, 0xc1, 0x37, 0x47, 0xa1, 0x8e, 0x7f, 0xaa, 0x9c, 0xec, 0x9b, - 0xa2, 0xd3, 0xa2, 0x7c, 0x48, 0xe0, 0xd6, 0x48, 0x5a, 0x2e, 0xe3, 0x45, 0x42, 0x5b, 0xc0, 0x99, - 0x80, 0x30, 0xfe, 0x22, 0xd6, 0x9f, 0xc2, 0xd8, 0x3e, 0x2a, 0x2e, 0xe7, 0x99, 0x4c, 0xb6, 0xd8, - 0x78, 0x7d, 0x0d, 0xcf, 0x37, 0xb8, 0x2b, 0xbf, 0x47, 0x58, 0xce, 0x39, 0x94, 0x87, 0xc6, 0xdf, - 0xaf, 0xd3, 0xc8, 0x4d, 0xab, 0xb2, 0x75, 0x65, 0x6a, 0x62, 0x4e, 0xfe, 0x80, 0xf0, 0xf2, 0xb4, - 0x94, 0x3f, 0xba, 0xa4, 0xfc, 0x14, 0xbe, 0x52, 0x9f, 0x8d, 0x9f, 0x7a, 0xfc, 0x82, 0xf0, 0xca, - 0x45, 0x29, 0xad, 0xfd, 0xe3, 0x9c, 0x1c, 0x0d, 0xe5, 0xc9, 0xec, 0x1a, 0xa9, 0xdf, 0xb7, 0x08, - 0x17, 0xb3, 0x99, 0x7d, 0x70, 0xc9, 0x09, 0x19, 0xa6, 0xf2, 0xf8, 0xaa, 0xcc, 0xc4, 0x51, 0xcd, - 0xf9, 0xd4, 0x53, 0xd1, 0x49, 0x4f, 0x45, 0xa7, 0x3d, 0x15, 0xfd, 0xec, 0xa9, 0xe8, 0x5d, 0x5f, - 0x95, 0x4e, 0xfb, 0xaa, 0xf4, 0xbd, 0xaf, 0x4a, 0x2f, 0x77, 0xc6, 0x4e, 0x83, 0x1d, 0x78, 0xd1, - 0x60, 0x19, 0x16, 0x34, 0xcd, 0x78, 0x2a, 0x13, 0x9d, 0xea, 0x68, 0x72, 0xd5, 0x07, 0x12, 0x79, - 0xd4, 0x3c, 0x32, 0x27, 0xde, 0x9b, 0xe1, 0xf1, 0x38, 0x0b, 0xc3, 0x17, 0xe1, 0xfe, 0xef, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xb2, 0x85, 0x56, 0x27, 0x8c, 0x06, 0x00, 0x00, + // 661 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x95, 0x4f, 0x6b, 0x13, 0x41, + 0x18, 0xc6, 0x33, 0x2d, 0x14, 0x3b, 0x2a, 0xb6, 0x4b, 0xa5, 0x71, 0xdb, 0xee, 0xd6, 0xa5, 0x48, + 0x0e, 0x76, 0xd7, 0xd6, 0x8b, 0x16, 0x14, 0x9b, 0x96, 0x62, 0x85, 0x40, 0xd9, 0x8a, 0x82, 0x17, + 0xd9, 0x64, 0x86, 0xed, 0xd0, 0xdd, 0x79, 0xd3, 0x9d, 0xd9, 0xa6, 0xf1, 0x13, 0x78, 0x53, 0xfc, + 0x04, 0x15, 0x2f, 0x22, 0x78, 0xf3, 0x28, 0x08, 0x9e, 0x7a, 0xec, 0xd1, 0x53, 0x94, 0xf4, 0xe2, + 0xb9, 0x9f, 0x40, 0xb2, 0x9b, 0x5d, 0x93, 0x66, 0xd3, 0xff, 0xa7, 0x24, 0xef, 0x3c, 0xef, 0xf3, + 0xfe, 0x5e, 0x36, 0xcf, 0x0e, 0x9e, 0x22, 0x4c, 0xc8, 0x80, 0x95, 0x43, 0xc9, 0x80, 0x5b, 0xdb, + 0x73, 0x65, 0x2a, 0x9d, 0x39, 0x4b, 0xee, 0x98, 0xd5, 0x00, 0x24, 0x28, 0x86, 0xc7, 0xb6, 0x42, + 0x46, 0x84, 0x74, 0x36, 0x19, 0x77, 0xcd, 0x4e, 0xb1, 0xd9, 0x16, 0xab, 0x63, 0x2e, 0xb8, 0x10, + 0xc9, 0xad, 0xd6, 0xb7, 0xb8, 0x53, 0xd5, 0x2a, 0x20, 0x7c, 0x10, 0x56, 0xd9, 0x11, 0x34, 0xf5, + 0xad, 0x00, 0xe3, 0xf1, 0xb9, 0xf1, 0x0d, 0xe1, 0x9b, 0x25, 0xe1, 0xae, 0x53, 0xf9, 0x92, 0xc9, + 0x0d, 0x12, 0x38, 0xb5, 0x45, 0x42, 0x02, 0x2a, 0x84, 0xb2, 0x8a, 0x47, 0x09, 0xf5, 0xa8, 0xeb, + 0x48, 0x08, 0x5e, 0x3b, 0x71, 0x31, 0x8f, 0xa6, 0x51, 0x61, 0xb8, 0x38, 0x79, 0xd8, 0xd0, 0xf3, + 0x75, 0xc7, 0xf7, 0x16, 0x8c, 0x1e, 0x89, 0x61, 0x8f, 0xa4, 0xb5, 0xc4, 0x6a, 0x05, 0x8f, 0xd4, + 0xda, 0xee, 0xa9, 0xd3, 0x40, 0xe4, 0x34, 0x71, 0xd8, 0xd0, 0xc7, 0x63, 0xa7, 0xa3, 0x0a, 0xc3, + 0xbe, 0x51, 0xeb, 0x46, 0x5a, 0xb8, 0xf2, 0x76, 0x57, 0xcf, 0xfd, 0xdd, 0xd5, 0x73, 0x86, 0x8e, + 0xa7, 0x32, 0xa9, 0x6d, 0x2a, 0xaa, 0xc0, 0x05, 0x35, 0xbe, 0x23, 0xac, 0x96, 0x84, 0x9b, 0x1c, + 0x2f, 0x27, 0x48, 0x36, 0xad, 0x39, 0x01, 0xb9, 0xcc, 0xe5, 0x56, 0xf1, 0xe8, 0xb6, 0xe3, 0x31, + 0xd2, 0x65, 0x35, 0x70, 0xd4, 0xaa, 0x47, 0x62, 0xd8, 0x23, 0x69, 0xad, 0x77, 0xbf, 0x19, 0x6c, + 0xf4, 0xa7, 0x4f, 0x97, 0x0c, 0xb1, 0xd6, 0xa1, 0x7a, 0x91, 0xd8, 0x2d, 0x81, 0xef, 0x33, 0x21, + 0x18, 0xf0, 0x6c, 0x38, 0x74, 0x41, 0xb8, 0x02, 0xbe, 0x73, 0xfc, 0xd8, 0x14, 0x10, 0xf0, 0x4c, + 0x87, 0xf2, 0x39, 0x6c, 0x52, 0xce, 0xde, 0xd0, 0xf5, 0x0d, 0x27, 0xa0, 0x36, 0xad, 0x40, 0x6b, + 0x95, 0xe8, 0x71, 0x3c, 0xc2, 0xd7, 0xa1, 0xc6, 0xe9, 0x51, 0xc4, 0xfc, 0x61, 0x43, 0x1f, 0x8b, + 0x11, 0xbb, 0x8e, 0x0d, 0xfb, 0x5a, 0xf4, 0xbb, 0x17, 0xcd, 0xc4, 0x77, 0x4f, 0x33, 0x30, 0x05, + 0xfc, 0x84, 0xf0, 0x58, 0x49, 0xb8, 0x2b, 0x21, 0x27, 0x2d, 0xfc, 0x90, 0x33, 0x59, 0x5f, 0x03, + 0xf0, 0x94, 0x0a, 0x1e, 0x72, 0x7c, 0x08, 0xb9, 0xcc, 0xa3, 0xe9, 0xc1, 0xc2, 0xd5, 0xf9, 0x5b, + 0x66, 0x1c, 0x24, 0xb3, 0x15, 0xa4, 0x24, 0x73, 0xe6, 0x12, 0x30, 0x5e, 0xbc, 0xb7, 0xd7, 0xd0, + 0x73, 0x5f, 0x7e, 0xeb, 0x05, 0x97, 0xc9, 0x8d, 0xb0, 0x6c, 0x56, 0xc0, 0xb7, 0xda, 0xa9, 0x8b, + 0x3f, 0x66, 0x05, 0xd9, 0xb4, 0x64, 0xbd, 0x4a, 0x45, 0xd4, 0x20, 0xec, 0xb6, 0xb5, 0x32, 0x89, + 0x87, 0x09, 0xad, 0x82, 0x60, 0x12, 0x82, 0xf8, 0x2f, 0x63, 0xff, 0x2f, 0x74, 0x6c, 0xa5, 0xe1, + 0xc9, 0x2c, 0xc8, 0x64, 0x8b, 0xf9, 0x9f, 0x43, 0x78, 0xb0, 0x24, 0x5c, 0xe5, 0x03, 0xc2, 0x4a, + 0x46, 0x92, 0x1f, 0x9a, 0x27, 0xbf, 0x3e, 0xcc, 0xcc, 0x38, 0xa9, 0x8b, 0xe7, 0x6e, 0x4d, 0xe0, + 0x94, 0x8f, 0x08, 0x8f, 0xf7, 0x8b, 0xe1, 0xe3, 0x53, 0xda, 0xf7, 0xe9, 0x57, 0x57, 0x2e, 0xd6, + 0x9f, 0x32, 0x7e, 0x45, 0x78, 0xe2, 0xb8, 0x18, 0x15, 0xcf, 0x38, 0x27, 0xc3, 0x43, 0x7d, 0x76, + 0x71, 0x8f, 0x94, 0xf7, 0x07, 0xc2, 0xb7, 0x4f, 0x4e, 0xd5, 0xd3, 0x33, 0x4e, 0xec, 0xeb, 0xa4, + 0xae, 0x5d, 0x96, 0x53, 0xba, 0xc1, 0x3b, 0x84, 0x47, 0x7b, 0x53, 0xf7, 0xe0, 0x94, 0x73, 0x7a, + 0x3a, 0xd5, 0x27, 0xe7, 0xed, 0x4c, 0x88, 0x8a, 0xe5, 0xcf, 0x4d, 0x0d, 0xed, 0x35, 0x35, 0xb4, + 0xdf, 0xd4, 0xd0, 0x9f, 0xa6, 0x86, 0xde, 0x1f, 0x68, 0xb9, 0xfd, 0x03, 0x2d, 0xf7, 0xeb, 0x40, + 0xcb, 0xbd, 0x5a, 0xee, 0x08, 0x37, 0xdb, 0xf2, 0xc2, 0xd6, 0xe3, 0x60, 0xbc, 0x62, 0xc5, 0x53, + 0x99, 0xac, 0xcf, 0xb6, 0x27, 0xcf, 0xfa, 0x40, 0x42, 0x8f, 0x5a, 0x3b, 0x56, 0xd7, 0x95, 0x1e, + 0xc5, 0xbf, 0x3c, 0x14, 0x5d, 0xba, 0xf7, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x51, 0xe1, 0x6d, + 0x36, 0xef, 0x07, 0x00, 0x00, } func (this *MsgSetWithdrawAddressResponse) Equal(that interface{}) bool { @@ -456,6 +540,27 @@ func (this *MsgWithdrawValidatorCommissionResponse) Equal(that interface{}) bool } return true } +func (this *MsgWithdrawTokenizeShareRecordRewardResponse) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*MsgWithdrawTokenizeShareRecordRewardResponse) + if !ok { + that2, ok := that.(MsgWithdrawTokenizeShareRecordRewardResponse) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + return true +} func (this *MsgFundCommunityPoolResponse) Equal(that interface{}) bool { if that == nil { return this == nil @@ -499,6 +604,9 @@ type MsgClient interface { // WithdrawValidatorCommission defines a method to withdraw the // full commission to the validator address. WithdrawValidatorCommission(ctx context.Context, in *MsgWithdrawValidatorCommission, opts ...grpc.CallOption) (*MsgWithdrawValidatorCommissionResponse, error) + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for + // owning TokenizeShareRecord + WithdrawTokenizeShareRecordReward(ctx context.Context, in *MsgWithdrawTokenizeShareRecordReward, opts ...grpc.CallOption) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) // FundCommunityPool defines a method to allow an account to directly // fund the community pool. FundCommunityPool(ctx context.Context, in *MsgFundCommunityPool, opts ...grpc.CallOption) (*MsgFundCommunityPoolResponse, error) @@ -539,6 +647,15 @@ func (c *msgClient) WithdrawValidatorCommission(ctx context.Context, in *MsgWith return out, nil } +func (c *msgClient) WithdrawTokenizeShareRecordReward(ctx context.Context, in *MsgWithdrawTokenizeShareRecordReward, opts ...grpc.CallOption) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) { + out := new(MsgWithdrawTokenizeShareRecordRewardResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.distribution.v1beta1.Msg/WithdrawTokenizeShareRecordReward", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *msgClient) FundCommunityPool(ctx context.Context, in *MsgFundCommunityPool, opts ...grpc.CallOption) (*MsgFundCommunityPoolResponse, error) { out := new(MsgFundCommunityPoolResponse) err := c.cc.Invoke(ctx, "/liquidstaking.distribution.v1beta1.Msg/FundCommunityPool", in, out, opts...) @@ -559,6 +676,9 @@ type MsgServer interface { // WithdrawValidatorCommission defines a method to withdraw the // full commission to the validator address. WithdrawValidatorCommission(context.Context, *MsgWithdrawValidatorCommission) (*MsgWithdrawValidatorCommissionResponse, error) + // WithdrawTokenizeShareRecordReward defines a method to withdraw reward for + // owning TokenizeShareRecord + WithdrawTokenizeShareRecordReward(context.Context, *MsgWithdrawTokenizeShareRecordReward) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) // FundCommunityPool defines a method to allow an account to directly // fund the community pool. FundCommunityPool(context.Context, *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error) @@ -577,6 +697,9 @@ func (*UnimplementedMsgServer) WithdrawDelegatorReward(ctx context.Context, req func (*UnimplementedMsgServer) WithdrawValidatorCommission(ctx context.Context, req *MsgWithdrawValidatorCommission) (*MsgWithdrawValidatorCommissionResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method WithdrawValidatorCommission not implemented") } +func (*UnimplementedMsgServer) WithdrawTokenizeShareRecordReward(ctx context.Context, req *MsgWithdrawTokenizeShareRecordReward) (*MsgWithdrawTokenizeShareRecordRewardResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method WithdrawTokenizeShareRecordReward not implemented") +} func (*UnimplementedMsgServer) FundCommunityPool(ctx context.Context, req *MsgFundCommunityPool) (*MsgFundCommunityPoolResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method FundCommunityPool not implemented") } @@ -639,6 +762,24 @@ func _Msg_WithdrawValidatorCommission_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _Msg_WithdrawTokenizeShareRecordReward_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgWithdrawTokenizeShareRecordReward) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).WithdrawTokenizeShareRecordReward(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.distribution.v1beta1.Msg/WithdrawTokenizeShareRecordReward", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).WithdrawTokenizeShareRecordReward(ctx, req.(*MsgWithdrawTokenizeShareRecordReward)) + } + return interceptor(ctx, in, info, handler) +} + func _Msg_FundCommunityPool_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(MsgFundCommunityPool) if err := dec(in); err != nil { @@ -673,6 +814,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "WithdrawValidatorCommission", Handler: _Msg_WithdrawValidatorCommission_Handler, }, + { + MethodName: "WithdrawTokenizeShareRecordReward", + Handler: _Msg_WithdrawTokenizeShareRecordReward_Handler, + }, { MethodName: "FundCommunityPool", Handler: _Msg_FundCommunityPool_Handler, @@ -855,6 +1000,59 @@ func (m *MsgWithdrawValidatorCommissionResponse) MarshalToSizedBuffer(dAtA []byt return len(dAtA) - i, nil } +func (m *MsgWithdrawTokenizeShareRecordReward) 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 *MsgWithdrawTokenizeShareRecordReward) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgWithdrawTokenizeShareRecordReward) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.OwnerAddress) > 0 { + i -= len(m.OwnerAddress) + copy(dAtA[i:], m.OwnerAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.OwnerAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) 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 *MsgWithdrawTokenizeShareRecordRewardResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + func (m *MsgFundCommunityPool) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1007,6 +1205,28 @@ func (m *MsgWithdrawValidatorCommissionResponse) Size() (n int) { return n } +func (m *MsgWithdrawTokenizeShareRecordReward) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.OwnerAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + func (m *MsgFundCommunityPool) Size() (n int) { if m == nil { return 0 @@ -1519,6 +1739,144 @@ func (m *MsgWithdrawValidatorCommissionResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgWithdrawTokenizeShareRecordReward) 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 ErrIntOverflowTx + } + 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: MsgWithdrawTokenizeShareRecordReward: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgWithdrawTokenizeShareRecordReward: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OwnerAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.OwnerAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgWithdrawTokenizeShareRecordRewardResponse) 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 ErrIntOverflowTx + } + 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: MsgWithdrawTokenizeShareRecordRewardResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgWithdrawTokenizeShareRecordRewardResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *MsgFundCommunityPool) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/staking/client/cli/tx.go b/x/staking/client/cli/tx.go index 63c836b9..ecd48813 100644 --- a/x/staking/client/cli/tx.go +++ b/x/staking/client/cli/tx.go @@ -3,6 +3,7 @@ package cli import ( "fmt" "os" + "strconv" "strings" "github.com/spf13/cobra" @@ -44,6 +45,9 @@ func NewTxCmd() *cobra.Command { NewDelegateCmd(), NewRedelegateCmd(), NewUnbondCmd(), + NewTokenizeSharesCmd(), + NewRedeemTokensCmd(), + NewTransferTokenizeShareRecordCmd(), ) return stakingTxCmd @@ -546,3 +550,147 @@ func BuildCreateValidatorMsg(clientCtx client.Context, config TxCreateValidatorC return txBldr, msg, nil } + +// NewTokenizeSharesCmd defines a command for tokenizing shares from a validator. +func NewTokenizeSharesCmd() *cobra.Command { + bech32PrefixValAddr := sdk.GetConfig().GetBech32ValidatorAddrPrefix() + bech32PrefixAccAddr := sdk.GetConfig().GetBech32AccountAddrPrefix() + + cmd := &cobra.Command{ + Use: "tokenize-share [validator-addr] [amount] [rewardOwner]", + Short: "Tokenize delegation to share tokens", + Args: cobra.ExactArgs(3), + Long: strings.TrimSpace( + fmt.Sprintf(`Tokenize delegation to share tokens. + +Example: +$ %s tx staking tokenize-share %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj 100stake %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj --from mykey +`, + version.AppName, bech32PrefixValAddr, bech32PrefixAccAddr, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + delAddr := clientCtx.GetFromAddress() + valAddr, err := sdk.ValAddressFromBech32(args[0]) + if err != nil { + return err + } + + amount, err := sdk.ParseCoinNormalized(args[1]) + if err != nil { + return err + } + + rewardOwner, err := sdk.AccAddressFromBech32(args[2]) + if err != nil { + return err + } + + msg := &types.MsgTokenizeShares{ + DelegatorAddress: delAddr.String(), + ValidatorAddress: valAddr.String(), + Amount: amount, + TokenizedShareOwner: rewardOwner.String(), + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +// NewRedeemTokensCmd defines a command for redeeming tokens from a validator for shares. +func NewRedeemTokensCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "redeem-tokens [amount]", + Short: "Redeem specified amount of share tokens to delegation", + Args: cobra.ExactArgs(1), + Long: strings.TrimSpace( + fmt.Sprintf(`Redeem specified amount of share tokens to delegation. + +Example: +$ %s tx staking redeem-tokens 100sharetoken --from mykey +`, + version.AppName, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + delAddr := clientCtx.GetFromAddress() + + amount, err := sdk.ParseCoinNormalized(args[0]) + if err != nil { + return err + } + + msg := &types.MsgRedeemTokensforShares{ + DelegatorAddress: delAddr.String(), + Amount: amount, + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} + +// NewTransferTokenizeShareRecordCmd defines a command to transfer ownership of TokenizeShareRecord +func NewTransferTokenizeShareRecordCmd() *cobra.Command { + bech32PrefixAccAddr := sdk.GetConfig().GetBech32AccountAddrPrefix() + + cmd := &cobra.Command{ + Use: "transfer-tokenize-share-record [record-id] [new-owner]", + Short: "Transfer ownership of TokenizeShareRecord", + Args: cobra.ExactArgs(2), + Long: strings.TrimSpace( + fmt.Sprintf(`Transfer ownership of TokenizeShareRecord. + +Example: +$ %s tx staking transfer-tokenize-share-record 1 %s1gghjut3ccd8ay0zduzj64hwre2fxs9ldmqhffj --from mykey +`, + version.AppName, bech32PrefixAccAddr, + ), + ), + RunE: func(cmd *cobra.Command, args []string) error { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + recordId, err := strconv.Atoi(args[0]) + if err != nil { + return err + } + + ownerAddr, err := sdk.AccAddressFromBech32(args[1]) + if err != nil { + return err + } + + msg := &types.MsgTransferTokenizeShareRecord{ + Sender: clientCtx.GetFromAddress().String(), + TokenizeShareRecordId: uint64(recordId), + NewOwner: ownerAddr.String(), + } + + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/staking/client/testutil/suite.go b/x/staking/client/testutil/suite.go index dc05ffdb..d4dfd79e 100644 --- a/x/staking/client/testutil/suite.go +++ b/x/staking/client/testutil/suite.go @@ -1284,6 +1284,251 @@ func (s *IntegrationTestSuite) TestNewUnbondCmd() { } } +func (s *IntegrationTestSuite) TestNewTokenizeSharesCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "Without reward owner", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without tokenize share amount", + []string{ + val.ValAddress.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without tokenize share amount and reward owner", + []string{ + val.ValAddress.String(), + val.Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without validator address", + []string{ + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + val.Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without validator address and reward owner", + []string{ + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without validator address, tokenize share amount and reward owner", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "valid transaction of tokenize share", + []string{ + val.ValAddress.String(), + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + val.Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewTokenizeSharesCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestNewRedeemTokensCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "Without redeem token amount", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "valid transaction of redeem token", + []string{ + sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(150)).String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewRedeemTokensCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) + } + }) + } +} + +func (s *IntegrationTestSuite) TestNewTransferTokenizeShareRecordCmd() { + val := s.network.Validators[0] + + testCases := []struct { + name string + args []string + expectErr bool + expectedCode uint32 + respType proto.Message + }{ + { + "Without new owner", + []string{ + "123", + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without record id", + []string{ + val.Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "Without record id and new owner", + []string{ + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + true, 0, nil, + }, + { + "valid transaction of transfer tokenize share record", + []string{ + "123", + val.Address.String(), + fmt.Sprintf("--%s=%s", flags.FlagFrom, val.Address.String()), + fmt.Sprintf("--%s=true", flags.FlagSkipConfirmation), + fmt.Sprintf("--%s=%s", flags.FlagBroadcastMode, flags.BroadcastBlock), + fmt.Sprintf("--%s=%s", flags.FlagFees, sdk.NewCoins(sdk.NewCoin(s.cfg.BondDenom, sdk.NewInt(10))).String()), + }, + false, 0, &sdk.TxResponse{}, + }, + } + + for _, tc := range testCases { + tc := tc + + s.Run(tc.name, func() { + cmd := cli.NewTransferTokenizeShareRecordCmd() + clientCtx := val.ClientCtx + + out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args) + if tc.expectErr { + s.Require().Error(err) + } else { + s.Require().NoError(err, out.String()) + s.Require().NoError(clientCtx.Codec.UnmarshalJSON(out.Bytes(), tc.respType), out.String()) + + txResp := tc.respType.(*sdk.TxResponse) + s.Require().Equal(tc.expectedCode, txResp.Code, out.String()) + } + }) + } +} + // TestBlockResults tests that the validator updates correctly show when // calling the /block_results RPC endpoint. // ref: https://github.com/cosmos/cosmos-sdk/issues/7401. diff --git a/x/staking/genesis.go b/x/staking/genesis.go index 9095e936..8039e851 100644 --- a/x/staking/genesis.go +++ b/x/staking/genesis.go @@ -154,6 +154,13 @@ func InitGenesis( } } + keeper.SetLastTokenizeShareRecordId(ctx, data.LastTokenizeShareRecordId) + for _, tokenizeShareRecord := range data.TokenizeShareRecords { + if err := keeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord); err != nil { + panic(err) + } + } + return res } @@ -182,15 +189,22 @@ func ExportGenesis(ctx sdk.Context, keeper keeper.Keeper) *types.GenesisState { return false }) + var tokenizeShareRecords []types.TokenizeShareRecord + for _, tokenizeShareRecord := range keeper.GetAllTokenizeShareRecords(ctx) { + tokenizeShareRecords = append(tokenizeShareRecords, tokenizeShareRecord) + } + return &types.GenesisState{ - Params: keeper.GetParams(ctx), - LastTotalPower: keeper.GetLastTotalPower(ctx), - LastValidatorPowers: lastValidatorPowers, - Validators: keeper.GetAllValidators(ctx), - Delegations: keeper.GetAllDelegations(ctx), - UnbondingDelegations: unbondingDelegations, - Redelegations: redelegations, - Exported: true, + Params: keeper.GetParams(ctx), + LastTotalPower: keeper.GetLastTotalPower(ctx), + LastValidatorPowers: lastValidatorPowers, + Validators: keeper.GetAllValidators(ctx), + Delegations: keeper.GetAllDelegations(ctx), + UnbondingDelegations: unbondingDelegations, + Redelegations: redelegations, + Exported: true, + TokenizeShareRecords: tokenizeShareRecords, + LastTokenizeShareRecordId: keeper.GetLastTokenizeShareRecordId(ctx), } } diff --git a/x/staking/keeper/common_test.go b/x/staking/keeper/common_test.go index 92556a4b..b227c335 100644 --- a/x/staking/keeper/common_test.go +++ b/x/staking/keeper/common_test.go @@ -8,6 +8,7 @@ import ( "github.com/cosmos/cosmos-sdk/codec" sdk "github.com/cosmos/cosmos-sdk/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" simapp "github.com/iqlusioninc/liquidity-staking-module/app" "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" @@ -49,3 +50,12 @@ func generateAddresses(app *simapp.SimApp, ctx sdk.Context, numAddrs int) ([]sdk return addrDels, addrVals } + +func delegateCoinsFromAccount(ctx sdk.Context, app *simapp.SimApp, addr sdk.AccAddress, amount sdk.Int, val types.Validator) error { + // bondDenom := app.StakingKeeper.BondDenom(ctx) + // coins := sdk.Coins{sdk.NewCoin(bondDenom, amount)} + // app.BankKeeper.DelegateCoinsFromAccountToModule(ctx, addr, types.EpochDelegationPoolName, coins) + _, err := app.StakingKeeper.Delegate(ctx, addr, amount, sdkstaking.Unbonded, val, true) + + return err +} diff --git a/x/staking/keeper/msg_server.go b/x/staking/keeper/msg_server.go index 4b608e86..b7aa49d1 100644 --- a/x/staking/keeper/msg_server.go +++ b/x/staking/keeper/msg_server.go @@ -2,6 +2,8 @@ package keeper import ( "context" + "fmt" + "strconv" "time" metrics "github.com/armon/go-metrics" @@ -11,6 +13,8 @@ import ( "github.com/cosmos/cosmos-sdk/telemetry" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" ) @@ -373,3 +377,225 @@ func (k msgServer) Undelegate(goCtx context.Context, msg *types.MsgUndelegate) ( CompletionTime: completionTime, }, nil } + +func getShareTokenDenom(validatorAddress string, tokenizeShareRecordId uint64) string { + return validatorAddress + strconv.Itoa(int(tokenizeShareRecordId)) +} + +func (k msgServer) TokenizeShares(goCtx context.Context, msg *types.MsgTokenizeShares) (*types.MsgTokenizeSharesResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + valAddr, valErr := sdk.ValAddressFromBech32(msg.ValidatorAddress) + if valErr != nil { + return nil, valErr + } + validator, found := k.GetValidator(ctx, valAddr) + if !found { + return nil, types.ErrNoValidatorFound + } + + _ = validator + + delegatorAddress, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + return nil, err + } + + delegation, found := k.GetDelegation(ctx, delegatorAddress, valAddr) + if !found { + return nil, types.ErrNoDelegatorForAddress + } + + if msg.Amount.Denom != k.BondDenom(ctx) { + return nil, types.ErrOnlyBondDenomAllowdForTokenize + } + + delegationAmount := validator.Tokens.ToDec().Mul(delegation.GetShares()).Quo(validator.DelegatorShares) + if msg.Amount.Amount.GT(sdk.Int(delegationAmount)) { + return nil, types.ErrNotEnoughDelegationShares + } + + acc := k.authKeeper.GetAccount(ctx, delegatorAddress) + if acc != nil { + acc, ok := acc.(vesting.VestingAccount) + if ok { + // if account is a vesting account, it checks if free delegation (non-vesting delegation) is not exceeding + // the tokenize share amount and execute further tokenize share process + // tokenize share is reducing unlocked tokens delegation from the vesting account and further process + // is not causing issues + delFree := acc.GetDelegatedFree().AmountOf(msg.Amount.Denom) + if delFree.LT(msg.Amount.Amount) { + return nil, types.ErrExceedingFreeVestingDelegations + } + } + } + + recordId := k.GetLastTokenizeShareRecordId(ctx) + 1 + shareTokenDenom := getShareTokenDenom(msg.ValidatorAddress, recordId) + record := types.TokenizeShareRecord{ + Id: recordId, + Owner: msg.TokenizedShareOwner, + ShareTokenDenom: shareTokenDenom, + ModuleAccount: fmt.Sprintf("tokenizeshare_%d", recordId), + Validator: msg.ValidatorAddress, + } + + shareToken := sdk.NewCoin(shareTokenDenom, msg.Amount.Amount) + + err = k.bankKeeper.MintCoins(ctx, minttypes.ModuleName, sdk.Coins{shareToken}) + if err != nil { + return nil, err + } + + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, minttypes.ModuleName, delegatorAddress, sdk.Coins{shareToken}) + if err != nil { + return nil, err + } + + shares, err := k.ValidateUnbondAmount( + ctx, delegatorAddress, valAddr, msg.Amount.Amount, + ) + + returnAmount, err := k.Unbond(ctx, delegatorAddress, valAddr, shares) + if err != nil { + return nil, err + } + + if validator.IsBonded() { + k.bondedTokensToNotBonded(ctx, returnAmount) + } + + // Note: UndelegateCoinsFromModuleToAccount is internally calling TrackUndelegation for vesting account + err = k.bankKeeper.UndelegateCoinsFromModuleToAccount(ctx, types.NotBondedPoolName, delegatorAddress, sdk.Coins{msg.Amount}) + if err != nil { + return nil, err + } + + // create reward ownership record + k.AddTokenizeShareRecord(ctx, record) + + // send coins to module account + err = k.bankKeeper.SendCoins(ctx, delegatorAddress, record.GetModuleAddress(), sdk.Coins{msg.Amount}) + if err != nil { + return nil, err + } + + validator, found = k.GetValidator(ctx, valAddr) + if !found { + return nil, types.ErrNoValidatorFound + } + + // delegate from module account + _, err = k.Keeper.Delegate(ctx, record.GetModuleAddress(), msg.Amount.Amount, sdkstaking.Unbonded, validator, true) + if err != nil { + return nil, err + } + + return &types.MsgTokenizeSharesResponse{ + Amount: shareToken, + }, nil +} + +func (k msgServer) RedeemTokens(goCtx context.Context, msg *types.MsgRedeemTokensforShares) (*types.MsgRedeemTokensforSharesResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + delegatorAddress, err := sdk.AccAddressFromBech32(msg.DelegatorAddress) + if err != nil { + return nil, err + } + + balance := k.bankKeeper.GetBalance(ctx, delegatorAddress, msg.Amount.Denom) + if balance.Amount.LT(msg.Amount.Amount) { + return nil, types.ErrNotEnoughBalance + } + + record, err := k.GetTokenizeShareRecordByDenom(ctx, msg.Amount.Denom) + if err != nil { + return nil, err + } + + valAddr, valErr := sdk.ValAddressFromBech32(record.Validator) + if valErr != nil { + return nil, valErr + } + + validator, found := k.GetValidator(ctx, valAddr) + if !found { + return nil, types.ErrNoValidatorFound + } + + // calculate the ratio between shares and redeem amount + // moduleAccountTotalDelegation * redeemAmount / totalIssue + delegation, found := k.GetDelegation(ctx, record.GetModuleAddress(), valAddr) + shareDenomSupply := k.bankKeeper.GetSupply(ctx, msg.Amount.Denom) + shares := delegation.Shares.Mul(msg.Amount.Amount.ToDec()).QuoInt(shareDenomSupply.Amount) + + returnAmount, err := k.Unbond(ctx, record.GetModuleAddress(), valAddr, shares) + if err != nil { + return nil, err + } + + if validator.IsBonded() { + k.bondedTokensToNotBonded(ctx, returnAmount) + } + + _, found = k.GetDelegation(ctx, record.GetModuleAddress(), valAddr) + if !found { + k.DeleteTokenizeShareRecord(ctx, record.Id) + } + + // send share tokens to NotBondedPool and burn + err = k.bankKeeper.SendCoinsFromAccountToModule(ctx, delegatorAddress, types.NotBondedPoolName, sdk.Coins{msg.Amount}) + if err != nil { + return nil, err + } + err = k.bankKeeper.BurnCoins(ctx, types.NotBondedPoolName, sdk.Coins{msg.Amount}) + if err != nil { + return nil, err + } + + // send equivalent amount of tokens to the delegator + returnCoin := sdk.NewCoin(k.BondDenom(ctx), returnAmount) + err = k.bankKeeper.SendCoinsFromModuleToAccount(ctx, types.NotBondedPoolName, delegatorAddress, sdk.Coins{returnCoin}) + if err != nil { + return nil, err + } + + // convert the share tokens to delegated status + // Note: Delegate(substractAccount => true) -> DelegateCoinsFromAccountToModule -> TrackDelegation for vesting account + _, err = k.Keeper.Delegate(ctx, delegatorAddress, returnAmount, sdkstaking.Unbonded, validator, true) + if err != nil { + return nil, err + } + + return &types.MsgRedeemTokensforSharesResponse{}, nil +} + +func (k msgServer) TransferTokenizeShareRecord(goCtx context.Context, msg *types.MsgTransferTokenizeShareRecord) (*types.MsgTransferTokenizeShareRecordResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + record, err := k.GetTokenizeShareRecord(ctx, msg.TokenizeShareRecordId) + if err != nil { + return nil, types.ErrTokenizeShareRecordNotExists + } + + if record.Owner != msg.Sender { + return nil, types.ErrNotTokenizeShareRecordOwner + } + + // Remove old account reference + oldOwner, err := sdk.AccAddressFromBech32(record.Owner) + k.deleteTokenizeShareRecordWithOwner(ctx, oldOwner, record.Id) + + record.Owner = msg.NewOwner + k.setTokenizeShareRecord(ctx, record) + + // Set new account reference + newOwner, err := sdk.AccAddressFromBech32(record.Owner) + if err != nil { + return nil, sdkerrors.ErrInvalidAddress + } + k.setTokenizeShareRecordWithOwner(ctx, newOwner, record.Id) + + return &types.MsgTransferTokenizeShareRecordResponse{}, nil +} diff --git a/x/staking/keeper/msg_server_test.go b/x/staking/keeper/msg_server_test.go new file mode 100644 index 00000000..d3b4e5f1 --- /dev/null +++ b/x/staking/keeper/msg_server_test.go @@ -0,0 +1,320 @@ +package keeper_test + +import ( + "testing" + + "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + vesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + sdkstaking "github.com/cosmos/cosmos-sdk/x/staking/types" + simapp "github.com/iqlusioninc/liquidity-staking-module/app" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/keeper" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/teststaking" + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" + "github.com/stretchr/testify/require" +) + +func TestTokenizeSharesAndRedeemTokens(t *testing.T) { + _, app, ctx := createTestInput() + + testCases := []struct { + name string + vestingAmount sdk.Int + delegationAmount sdk.Int + tokenizeShareAmount sdk.Int + redeemAmount sdk.Int + targetVestingDelAfterShare sdk.Int + targetVestingDelAfterRedeem sdk.Int + slashFactor sdk.Dec + expTokenizeErr bool + expRedeemErr bool + prevAccountDelegationExists bool + recordAccountDelegationExists bool + }{ + { + name: "full amount tokenize and redeem", + vestingAmount: sdk.NewInt(0), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: false, + expRedeemErr: false, + prevAccountDelegationExists: false, + recordAccountDelegationExists: false, + }, + { + name: "full amount tokenize and partial redeem", + vestingAmount: sdk.NewInt(0), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.NewDecWithPrec(10, 2), + expTokenizeErr: false, + expRedeemErr: false, + prevAccountDelegationExists: false, + recordAccountDelegationExists: true, + }, + { + name: "partial amount tokenize and full redeem", + vestingAmount: sdk.NewInt(0), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: false, + expRedeemErr: false, + prevAccountDelegationExists: true, + recordAccountDelegationExists: false, + }, + { + name: "over tokenize", + vestingAmount: sdk.NewInt(0), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 30), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: true, + expRedeemErr: false, + }, + { + name: "over redeem", + vestingAmount: sdk.NewInt(0), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 40), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: false, + expRedeemErr: true, + }, + { + name: "vesting account tokenize share failure", + vestingAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: true, + expRedeemErr: false, + prevAccountDelegationExists: true, + }, + { + name: "vesting account tokenize share success", + vestingAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + delegationAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 20), + tokenizeShareAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + redeemAmount: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterShare: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + targetVestingDelAfterRedeem: app.StakingKeeper.TokensFromConsensusPower(ctx, 10), + slashFactor: sdk.ZeroDec(), + expTokenizeErr: false, + expRedeemErr: false, + prevAccountDelegationExists: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + _, app, ctx = createTestInput() + addrs := simapp.AddTestAddrs(app, ctx, 2, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) + addrAcc1, addrAcc2 := addrs[0], addrs[1] + addrVal1, addrVal2 := sdk.ValAddress(addrAcc1), sdk.ValAddress(addrAcc2) + + if !tc.vestingAmount.IsZero() { + // create vesting account + pubkey := secp256k1.GenPrivKey().PubKey() + baseAcc := authtypes.NewBaseAccount(addrAcc2, pubkey, 0, 0) + initialVesting := sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, tc.vestingAmount)) + baseVestingWithCoins := vestingtypes.NewBaseVestingAccount(baseAcc, initialVesting, ctx.BlockTime().Unix()+86400*365) + delayedVestingAccount := vestingtypes.NewDelayedVestingAccountRaw(baseVestingWithCoins) + app.AccountKeeper.SetAccount(ctx, delayedVestingAccount) + } + + pubKeys := simapp.CreateTestPubKeys(2) + pk1, pk2 := pubKeys[0], pubKeys[1] + + // Create Validators and Delegation + val1 := teststaking.NewValidator(t, addrVal1, pk1) + val1.Status = sdkstaking.Bonded + app.StakingKeeper.SetValidator(ctx, val1) + app.StakingKeeper.SetValidatorByPowerIndex(ctx, val1) + app.StakingKeeper.SetValidatorByConsAddr(ctx, val1) + + val2 := teststaking.NewValidator(t, addrVal2, pk2) + val2.Status = sdkstaking.Bonded + app.StakingKeeper.SetValidator(ctx, val2) + app.StakingKeeper.SetValidatorByPowerIndex(ctx, val2) + app.StakingKeeper.SetValidatorByConsAddr(ctx, val2) + + delTokens := tc.delegationAmount + err := delegateCoinsFromAccount(ctx, app, addrAcc2, delTokens, val1) + require.NoError(t, err) + + // apply TM updates + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) + + _, found := app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + require.True(t, found, "delegation not found after delegate") + + msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + resp, err := msgServer.TokenizeShares(sdk.WrapSDKContext(ctx), &types.MsgTokenizeShares{ + DelegatorAddress: addrAcc2.String(), + ValidatorAddress: addrVal1.String(), + Amount: sdk.NewCoin(app.StakingKeeper.BondDenom(ctx), tc.tokenizeShareAmount), + TokenizedShareOwner: addrAcc2.String(), + }) + if tc.expTokenizeErr { + require.Error(t, err) + return + } + require.NoError(t, err) + + if tc.vestingAmount.IsPositive() { + acc := app.AccountKeeper.GetAccount(ctx, addrAcc2) + vestingAcc := acc.(vesting.VestingAccount) + require.Equal(t, vestingAcc.GetDelegatedVesting().AmountOf(app.StakingKeeper.BondDenom(ctx)).String(), tc.targetVestingDelAfterShare.String()) + } + + if tc.prevAccountDelegationExists { + _, found = app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + require.True(t, found, "delegation found after partial tokenize share") + } else { + _, found = app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + require.False(t, found, "delegation found after full tokenize share") + } + + shareToken := app.BankKeeper.GetBalance(ctx, addrAcc2, resp.Amount.Denom) + require.Equal(t, resp.Amount, shareToken) + _, found = app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found, true, "validator not found") + + records := app.StakingKeeper.GetAllTokenizeShareRecords(ctx) + require.Len(t, records, 1) + delegation, found := app.StakingKeeper.GetDelegation(ctx, records[0].GetModuleAddress(), addrVal1) + require.True(t, found, "delegation not found from tokenize share module account after tokenize share") + + // slash before redeem + if tc.slashFactor.IsPositive() { + consAddr, err := val1.GetConsAddr() + require.NoError(t, err) + ctx = ctx.WithBlockHeight(100) + val1, found = app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found) + power := app.StakingKeeper.TokensToConsensusPower(ctx, val1.Tokens) + app.StakingKeeper.Slash(ctx, consAddr, 10, power, tc.slashFactor) + } + + // get deletagor balance and delegation + bondDenomAmountBefore := app.BankKeeper.GetBalance(ctx, addrAcc2, app.StakingKeeper.BondDenom(ctx)) + val1, found = app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found) + delegation, found = app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + if !found { + delegation = types.Delegation{Shares: sdk.ZeroDec()} + } + delAmountBefore := val1.TokensFromShares(delegation.Shares) + + _, err = msgServer.RedeemTokens(sdk.WrapSDKContext(ctx), &types.MsgRedeemTokensforShares{ + DelegatorAddress: addrAcc2.String(), + Amount: sdk.NewCoin(resp.Amount.Denom, tc.redeemAmount), + }) + if tc.expRedeemErr { + require.Error(t, err) + return + } + require.NoError(t, err) + + if tc.vestingAmount.IsPositive() { + acc := app.AccountKeeper.GetAccount(ctx, addrAcc2) + vestingAcc := acc.(vesting.VestingAccount) + require.Equal(t, vestingAcc.GetDelegatedVesting().AmountOf(app.StakingKeeper.BondDenom(ctx)).String(), tc.targetVestingDelAfterRedeem.String()) + } + + delegation, found = app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + require.True(t, found, "delegation not found after redeem tokens") + require.Equal(t, delegation.DelegatorAddress, addrAcc2.String()) + require.Equal(t, delegation.ValidatorAddress, addrVal1.String()) + require.Equal(t, delegation.Shares, tc.delegationAmount.Sub(tc.tokenizeShareAmount).Add(tc.redeemAmount).ToDec()) + + // check delegator balance is not changed + bondDenomAmountAfter := app.BankKeeper.GetBalance(ctx, addrAcc2, app.StakingKeeper.BondDenom(ctx)) + require.Equal(t, bondDenomAmountAfter.Amount.String(), bondDenomAmountBefore.Amount.String()) + + // get delegation amount is changed correctly + val1, found = app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found) + delegation, found = app.StakingKeeper.GetDelegation(ctx, addrAcc2, addrVal1) + if !found { + delegation = types.Delegation{Shares: sdk.ZeroDec()} + } + delAmountAfter := val1.TokensFromShares(delegation.Shares) + require.Equal(t, delAmountAfter.String(), delAmountBefore.Add(tc.redeemAmount.ToDec().Mul(sdk.OneDec().Sub(tc.slashFactor))).String()) + + shareToken = app.BankKeeper.GetBalance(ctx, addrAcc2, resp.Amount.Denom) + require.Equal(t, shareToken.Amount.String(), tc.tokenizeShareAmount.Sub(tc.redeemAmount).String()) + _, found = app.StakingKeeper.GetValidator(ctx, addrVal1) + require.True(t, found, true, "validator not found") + + if tc.recordAccountDelegationExists { + _, found = app.StakingKeeper.GetDelegation(ctx, records[0].GetModuleAddress(), addrVal1) + require.True(t, found, "delegation not found from tokenize share module account after redeem partial amount") + + records = app.StakingKeeper.GetAllTokenizeShareRecords(ctx) + require.Len(t, records, 1) + } else { + _, found = app.StakingKeeper.GetDelegation(ctx, records[0].GetModuleAddress(), addrVal1) + require.False(t, found, "delegation found from tokenize share module account after redeem full amount") + + records = app.StakingKeeper.GetAllTokenizeShareRecords(ctx) + require.Len(t, records, 0) + } + }) + } +} + +func TestTransferTokenizeShareRecord(t *testing.T) { + _, app, ctx := createTestInput() + + addrs := simapp.AddTestAddrs(app, ctx, 3, app.StakingKeeper.TokensFromConsensusPower(ctx, 10000)) + addrAcc1, addrAcc2, valAcc := addrs[0], addrs[1], addrs[2] + addrVal := sdk.ValAddress(valAcc) + + pubKeys := simapp.CreateTestPubKeys(1) + pk := pubKeys[0] + + val := teststaking.NewValidator(t, addrVal, pk) + app.StakingKeeper.SetValidator(ctx, val) + app.StakingKeeper.SetValidatorByPowerIndex(ctx, val) + + // apply TM updates + applyValidatorSetUpdates(t, ctx, app.StakingKeeper, -1) + + msgServer := keeper.NewMsgServerImpl(app.StakingKeeper) + + err := app.StakingKeeper.AddTokenizeShareRecord(ctx, types.TokenizeShareRecord{ + Id: 1, + Owner: addrAcc1.String(), + ShareTokenDenom: "share_token_denom", + ModuleAccount: "module_account", + Validator: val.String(), + }) + require.NoError(t, err) + + _, err = msgServer.TransferTokenizeShareRecord(sdk.WrapSDKContext(ctx), &types.MsgTransferTokenizeShareRecord{ + TokenizeShareRecordId: 1, + Sender: addrAcc1.String(), + NewOwner: addrAcc2.String(), + }) + require.NoError(t, err) + + record, err := app.StakingKeeper.GetTokenizeShareRecord(ctx, 1) + require.NoError(t, err) + require.Equal(t, record.Owner, addrAcc2.String()) + + records := app.StakingKeeper.GetTokenizeShareRecordsByOwner(ctx, addrAcc1) + require.Len(t, records, 0) + records = app.StakingKeeper.GetTokenizeShareRecordsByOwner(ctx, addrAcc2) + require.Len(t, records, 1) +} diff --git a/x/staking/keeper/tokenize_share_record.go b/x/staking/keeper/tokenize_share_record.go new file mode 100644 index 00000000..8d8949fa --- /dev/null +++ b/x/staking/keeper/tokenize_share_record.go @@ -0,0 +1,150 @@ +package keeper + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + gogotypes "github.com/gogo/protobuf/types" + + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +func (k Keeper) GetLastTokenizeShareRecordId(ctx sdk.Context) uint64 { + store := ctx.KVStore(k.storeKey) + bytes := store.Get(types.LastTokenizeShareRecordIdKey) + if bytes == nil { + return 0 + } + return sdk.BigEndianToUint64(bytes) +} + +func (k Keeper) SetLastTokenizeShareRecordId(ctx sdk.Context, id uint64) { + store := ctx.KVStore(k.storeKey) + store.Set(types.LastTokenizeShareRecordIdKey, sdk.Uint64ToBigEndian(id)) +} + +func (k Keeper) GetTokenizeShareRecord(ctx sdk.Context, id uint64) (tokenizeShareRecord types.TokenizeShareRecord, err error) { + store := ctx.KVStore(k.storeKey) + + bz := store.Get(types.GetTokenizeShareRecordByIndexKey(id)) + if bz == nil { + return tokenizeShareRecord, sdkerrors.Wrap(types.ErrTokenizeShareRecordNotExists, fmt.Sprintf("tokenizeShareRecord %d does not exist", id)) + } + + k.cdc.MustUnmarshal(bz, &tokenizeShareRecord) + return tokenizeShareRecord, nil +} + +func (k Keeper) GetTokenizeShareRecordsByOwner(ctx sdk.Context, owner sdk.AccAddress) (tokenizeShareRecords []types.TokenizeShareRecord) { + store := ctx.KVStore(k.storeKey) + + var it sdk.Iterator = sdk.KVStorePrefixIterator(store, types.GetTokenizeShareRecordIdsByOwnerPrefix(owner)) + defer it.Close() + + for ; it.Valid(); it.Next() { + var id gogotypes.UInt64Value + k.cdc.MustUnmarshal(it.Value(), &id) + + tokenizeShareRecord, err := k.GetTokenizeShareRecord(ctx, id.Value) + if err != nil { + continue + } + tokenizeShareRecords = append(tokenizeShareRecords, tokenizeShareRecord) + } + return +} + +func (k Keeper) GetTokenizeShareRecordByDenom(ctx sdk.Context, denom string) (types.TokenizeShareRecord, error) { + store := ctx.KVStore(k.storeKey) + bz := store.Get(types.GetTokenizeShareRecordIdByDenomKey(denom)) + if bz == nil { + return types.TokenizeShareRecord{}, fmt.Errorf("tokenize share record not found from denom: %s", denom) + } + + var id gogotypes.UInt64Value + k.cdc.MustUnmarshal(bz, &id) + + return k.GetTokenizeShareRecord(ctx, id.Value) +} + +func (k Keeper) GetAllTokenizeShareRecords(ctx sdk.Context) (tokenizeShareRecords []types.TokenizeShareRecord) { + store := ctx.KVStore(k.storeKey) + + var it sdk.Iterator = sdk.KVStorePrefixIterator(store, types.TokenizeShareRecordPrefix) + defer it.Close() + + for ; it.Valid(); it.Next() { + var tokenizeShareRecord types.TokenizeShareRecord + k.cdc.MustUnmarshal(it.Value(), &tokenizeShareRecord) + + tokenizeShareRecords = append(tokenizeShareRecords, tokenizeShareRecord) + } + return +} + +func (k Keeper) AddTokenizeShareRecord(ctx sdk.Context, tokenizeShareRecord types.TokenizeShareRecord) error { + if k.hasTokenizeShareRecord(ctx, tokenizeShareRecord.Id) { + return sdkerrors.Wrapf(types.ErrTokenizeShareRecordAlreadyExists, "TokenizeShareRecord already exists: %d", tokenizeShareRecord.Id) + } + + k.setTokenizeShareRecord(ctx, tokenizeShareRecord) + + owner, err := sdk.AccAddressFromBech32(tokenizeShareRecord.Owner) + if err != nil { + return err + } + + k.setTokenizeShareRecordWithOwner(ctx, owner, tokenizeShareRecord.Id) + k.setTokenizeShareRecordWithDenom(ctx, tokenizeShareRecord.ShareTokenDenom, tokenizeShareRecord.Id) + + return nil +} + +func (k Keeper) DeleteTokenizeShareRecord(ctx sdk.Context, recordId uint64) error { + record, err := k.GetTokenizeShareRecord(ctx, recordId) + if err != nil { + return err + } + owner, err := sdk.AccAddressFromBech32(record.Owner) + if err != nil { + return err + } + + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetTokenizeShareRecordByIndexKey(recordId)) + store.Delete(types.GetTokenizeShareRecordIdByOwnerAndIdKey(owner, recordId)) + store.Delete(types.GetTokenizeShareRecordIdByDenomKey(record.ShareTokenDenom)) + return nil +} + +func (k Keeper) hasTokenizeShareRecord(ctx sdk.Context, id uint64) bool { + store := ctx.KVStore(k.storeKey) + return store.Has(types.GetTokenizeShareRecordByIndexKey(id)) +} + +func (k Keeper) setTokenizeShareRecord(ctx sdk.Context, tokenizeShareRecord types.TokenizeShareRecord) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&tokenizeShareRecord) + + store.Set(types.GetTokenizeShareRecordByIndexKey(tokenizeShareRecord.Id), bz) +} + +func (k Keeper) setTokenizeShareRecordWithOwner(ctx sdk.Context, owner sdk.AccAddress, id uint64) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&gogotypes.UInt64Value{Value: id}) + + store.Set(types.GetTokenizeShareRecordIdByOwnerAndIdKey(owner, id), bz) +} + +func (k Keeper) deleteTokenizeShareRecordWithOwner(ctx sdk.Context, owner sdk.AccAddress, id uint64) { + store := ctx.KVStore(k.storeKey) + store.Delete(types.GetTokenizeShareRecordIdByOwnerAndIdKey(owner, id)) +} + +func (k Keeper) setTokenizeShareRecordWithDenom(ctx sdk.Context, denom string, id uint64) { + store := ctx.KVStore(k.storeKey) + bz := k.cdc.MustMarshal(&gogotypes.UInt64Value{Value: id}) + + store.Set(types.GetTokenizeShareRecordIdByDenomKey(denom), bz) +} diff --git a/x/staking/keeper/tokenize_share_record_test.go b/x/staking/keeper/tokenize_share_record_test.go new file mode 100644 index 00000000..c4f0de4a --- /dev/null +++ b/x/staking/keeper/tokenize_share_record_test.go @@ -0,0 +1,61 @@ +package keeper_test + +import ( + "github.com/iqlusioninc/liquidity-staking-module/x/staking/types" +) + +func (suite *KeeperTestSuite) TestGetLastTokenizeShareRecordId() { + app, ctx := suite.app, suite.ctx + lastTokenizeShareRecordId := app.StakingKeeper.GetLastTokenizeShareRecordId(ctx) + suite.Equal(lastTokenizeShareRecordId, uint64(0)) + app.StakingKeeper.SetLastTokenizeShareRecordId(ctx, 100) + lastTokenizeShareRecordId = app.StakingKeeper.GetLastTokenizeShareRecordId(ctx) + suite.Equal(lastTokenizeShareRecordId, uint64(100)) +} + +func (suite *KeeperTestSuite) TestGetTokenizeShareRecord() { + app, ctx := suite.app, suite.ctx + owner1, owner2 := suite.addrs[0], suite.addrs[1] + + tokenizeShareRecord1 := types.TokenizeShareRecord{ + Id: 0, + Owner: owner1.String(), + ShareTokenDenom: "test-share-token-denom-1", + ModuleAccount: "test-module-account-1", + Validator: "test-validator", + } + tokenizeShareRecord2 := types.TokenizeShareRecord{ + Id: 1, + Owner: owner2.String(), + ShareTokenDenom: "test-share-token-denom-2", + ModuleAccount: "test-module-account-2", + Validator: "test-validator", + } + tokenizeShareRecord3 := types.TokenizeShareRecord{ + Id: 2, + Owner: owner1.String(), + ShareTokenDenom: "test-share-token-denom-3", + ModuleAccount: "test-module-account-3", + Validator: "test-validator", + } + app.StakingKeeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord1) + app.StakingKeeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord2) + app.StakingKeeper.AddTokenizeShareRecord(ctx, tokenizeShareRecord3) + + tokenizeShareRecord, err := app.StakingKeeper.GetTokenizeShareRecord(ctx, 2) + suite.NoError(err) + suite.Equal(tokenizeShareRecord, tokenizeShareRecord3) + + tokenizeShareRecord, err = app.StakingKeeper.GetTokenizeShareRecordByDenom(ctx, "test-share-token-denom-2") + suite.NoError(err) + suite.Equal(tokenizeShareRecord, tokenizeShareRecord2) + + tokenizeShareRecords := app.StakingKeeper.GetAllTokenizeShareRecords(ctx) + suite.Equal(len(tokenizeShareRecords), 3) + + tokenizeShareRecords = app.StakingKeeper.GetTokenizeShareRecordsByOwner(ctx, owner1) + suite.Equal(len(tokenizeShareRecords), 2) + + tokenizeShareRecords = app.StakingKeeper.GetTokenizeShareRecordsByOwner(ctx, owner2) + suite.Equal(len(tokenizeShareRecords), 1) +} diff --git a/x/staking/spec/01_state.md b/x/staking/spec/01_state.md index 9dacbb22..e966123e 100644 --- a/x/staking/spec/01_state.md +++ b/x/staking/spec/01_state.md @@ -215,3 +215,24 @@ the current block in a `HistoricalInfo` object. The Validators are sorted on the they are in a determisnistic order. The oldest HistoricalEntries will be pruned to ensure that there only exist the parameter-defined number of historical entries. + +## TokenizeShareRecord + +TokenizeShareRecord objects are created when a user tokenize his delegation. + +Record is put on `0x61 | id -> TokenizeShareRecord` + +```go +type TokenizeShareRecord struct { + Id uint64 + Owner string + ShareTokenDenom string + ModuleAccount string + Validator string +} +``` + +There are helper queues to manage the tokenize share records by owner and by share token denom. + +`0x62 | owner | id -> TokenizeShareRecordId` +`0x63 | denom -> TokenizeShareRecordId` diff --git a/x/staking/spec/02_state_transitions.md b/x/staking/spec/02_state_transitions.md index d62761d1..43e8afaa 100644 --- a/x/staking/spec/02_state_transitions.md +++ b/x/staking/spec/02_state_transitions.md @@ -174,3 +174,42 @@ The total number of tokens is now `T + T_j`, and the total number of shares is ` A special case is the initial delegation, when `T = 0` and `S = 0`, so `T_j / T` is undefined. For the initial delegation, delegator `j` who delegates `T_j` tokens receive `S_j = T_j` shares. So a validator that hasn't received any rewards and has not been slashed will have `T = S`. + +## Tokenizing + +### Tokenize delegation shares + +Tokenizing delegation shares tokenize the delegation shares to transferrable asset. + +The process of tokenizing delegation shares + +1. Get delegation from the delegator to the validator +2. Verify that delegation amount is bigger than tokenize amount +3. Create a new tokenize share record as the owner specified by the delegator +4. Mint share tokens to delegator +5. Unbond tokenizing amount from delegator and send it to toknize share record account +6. Delegate the unbonded amount to the same validator from tokenize share record account + +### Redeem delegation shares + +Redeeming of delegation shares is to convert tokenized delegation shares to regular delegation share. + +The process of redeeming delegation shares from tokenized share + +1. Verify that tokenize share tokens amount is not lower than redeeming share tokens amount +2. Get tokenize share record from tokenized share denom +3. Unbond the amount of tokens from the tokenize share record account +4. If tokenize share record account's delegation amount is zero, delete the record +5. Burn share tokens +6. Delegate unbonded tokens from delegator address to the validator + +### Transfer tokenize share record + +Transferring of tokenized share record is done to move the reward withdrawal rights. + +The process of transferring the tokenize share record + +1. Check tokenize share record exists and the owner is the sender of the message +2. Delete old owner's reference to tokenize share record +3. Update tokenize share record to have new owner +4. Add new owner's reference to tokenize share record diff --git a/x/staking/spec/03_messages.md b/x/staking/spec/03_messages.md index 9dce41e9..a2c42a16 100644 --- a/x/staking/spec/03_messages.md +++ b/x/staking/spec/03_messages.md @@ -21,9 +21,9 @@ This message is expected to fail if: - another validator with this pubkey is already registered - the initial self-delegation tokens are of a denom not specified as the bonding denom - the commission parameters are faulty, namely: - - `MaxRate` is either > 1 or < 0 - - the initial `Rate` is either negative or > `MaxRate` - - the initial `MaxChangeRate` is either negative or > `MaxRate` + - `MaxRate` is either > 1 or < 0 + - the initial `Rate` is either negative or > `MaxRate` + - the initial `MaxChangeRate` is either negative or > `MaxRate` - the description fields are too large This message creates and stores the `Validator` object at appropriate indexes. @@ -108,11 +108,11 @@ When this message is processed the following actions occur: - validator's `DelegatorShares` and the delegation's `Shares` are both reduced by the message `SharesAmount` - calculate the token worth of the shares remove that amount tokens held within the validator - with those removed tokens, if the validator is: - - `Bonded` - add them to an entry in `UnbondingDelegation` (create `UnbondingDelegation` if it doesn't exist) with a completion time a full unbonding period from the current time. Update pool shares to reduce BondedTokens and increase NotBondedTokens by token worth of the shares. - - `Unbonding` - add them to an entry in `UnbondingDelegation` (create `UnbondingDelegation` if it doesn't exist) with the same completion time as the validator (`UnbondingMinTime`). - - `Unbonded` - then send the coins the message `DelegatorAddr` + - `Bonded` - add them to an entry in `UnbondingDelegation` (create `UnbondingDelegation` if it doesn't exist) with a completion time a full unbonding period from the current time. Update pool shares to reduce BondedTokens and increase NotBondedTokens by token worth of the shares. + - `Unbonding` - add them to an entry in `UnbondingDelegation` (create `UnbondingDelegation` if it doesn't exist) with the same completion time as the validator (`UnbondingMinTime`). + - `Unbonded` - then send the coins the message `DelegatorAddr` - if there are no more `Shares` in the delegation, then the delegation object is removed from the store - - under this situation if the delegation is the validator's self-delegation then also jail the validator. + - under this situation if the delegation is the validator's self-delegation then also jail the validator. ![Unbond sequence](../../../docs/uml/svg/unbond_sequence.svg) @@ -144,11 +144,34 @@ When this message is processed the following actions occur: - the source validator's `DelegatorShares` and the delegations `Shares` are both reduced by the message `SharesAmount` - calculate the token worth of the shares remove that amount tokens held within the source validator. - if the source validator is: - - `Bonded` - add an entry to the `Redelegation` (create `Redelegation` if it doesn't exist) with a completion time a full unbonding period from the current time. Update pool shares to reduce BondedTokens and increase NotBondedTokens by token worth of the shares (this may be effectively reversed in the next step however). - - `Unbonding` - add an entry to the `Redelegation` (create `Redelegation` if it doesn't exist) with the same completion time as the validator (`UnbondingMinTime`). - - `Unbonded` - no action required in this step + - `Bonded` - add an entry to the `Redelegation` (create `Redelegation` if it doesn't exist) with a completion time a full unbonding period from the current time. Update pool shares to reduce BondedTokens and increase NotBondedTokens by token worth of the shares (this may be effectively reversed in the next step however). + - `Unbonding` - add an entry to the `Redelegation` (create `Redelegation` if it doesn't exist) with the same completion time as the validator (`UnbondingMinTime`). + - `Unbonded` - no action required in this step - Delegate the token worth to the destination validator, possibly moving tokens back to the bonded state. - if there are no more `Shares` in the source delegation, then the source delegation object is removed from the store - - under this situation if the delegation is the validator's self-delegation then also jail the validator. + - under this situation if the delegation is the validator's self-delegation then also jail the validator. ![Begin redelegation sequence](../../../docs/uml/svg/begin_redelegation_sequence.svg) + +## MsgTokenizeShares + +The `MsgTokenizeShares` message is used to create tokenize delegated tokens. +This message can be executed by any delegator who has positive amount of delegation and after execution the specific amount of delegation disappear from the account and share tokens are provided. Share tokens are demoninated in the validator and record id of the underlying delegation. + +A user may tokenize some or all of their Delegation. + +They will recieved shares like ` cosmosvaloper1xxxx5` where 5 is the record id for the validator operator. + +A validator may tokenize their self bond but tokenizing more than their min self bond will be equivalent to unbonding their min self bond and cause the validator to be removed from the active set. + +`MsgTokenizeSharesResponse` provides the number of tokens generated and their denom. + +## MsgRedeemTokensforShares + +The `MsgRedeemTokensforShares` message is used to redeem the delegation from share tokens. +This message can be executed by any user who owns share tokens and after execution the delegation appear for the user. + +## MsgTransferTokenizeShareRecord + +The `MsgTransferTokenizeShareRecord` message is used to transfer the ownership of rewards generated from the tokenized amount of delegation. +The tokenize share record is created when a user tokenize his/her delegation and deleted and full amount of share tokens are redeemed. diff --git a/x/staking/spec/README.md b/x/staking/spec/README.md index b56ae71c..685d055c 100644 --- a/x/staking/spec/README.md +++ b/x/staking/spec/README.md @@ -21,35 +21,44 @@ ultimately determining the effective validator set for the system. This module will be used in the Cosmos Hub, the first Hub in the Cosmos network. +This module has been extended with a liquid staking implementation to enable the creation of nonfungible tokenized staking shares to be used to be synthetic staked assets. The governing philosphy of this design is that it optimizes for allowing a smooth upgrade path from the existing cosmos staking module at the expense of the usability of the native staking token. It is anticipated that DAOs will form that accept these assets and issue a more usable underlying asset. + ## Contents 1. **[State](01_state.md)** - - [Pool](01_state.md#pool) - - [LastTotalPower](01_state.md#lasttotalpower) - - [Params](01_state.md#params) - - [Validator](01_state.md#validator) - - [Delegation](01_state.md#delegation) - - [UnbondingDelegation](01_state.md#unbondingdelegation) - - [Redelegation](01_state.md#redelegation) - - [Queues](01_state.md#queues) - - [HistoricalInfo](01_state.md#historicalinfo) + - [Pool](01_state.md#pool) + - [LastTotalPower](01_state.md#lasttotalpower) + - [Params](01_state.md#params) + - [Validator](01_state.md#validator) + - [Delegation](01_state.md#delegation) + - [UnbondingDelegation](01_state.md#unbondingdelegation) + - [Redelegation](01_state.md#redelegation) + - [Queues](01_state.md#queues) + - [HistoricalInfo](01_state.md#historicalinfo) + - [TokenizeShareRecord](01_state.md#tokenizesharerecord) 2. **[State Transitions](02_state_transitions.md)** - - [Validators](02_state_transitions.md#validators) - - [Delegations](02_state_transitions.md#delegations) - - [Slashing](02_state_transitions.md#slashing) + - [Validators](02_state_transitions.md#validators) + - [Delegations](02_state_transitions.md#delegations) + - [Slashing](02_state_transitions.md#slashing) + - [Tokenizing](02_state_transitions.md#tokenizing) 3. **[Messages](03_messages.md)** - - [MsgCreateValidator](03_messages.md#msgcreatevalidator) - - [MsgEditValidator](03_messages.md#msgeditvalidator) - - [MsgDelegate](03_messages.md#msgdelegate) - - [MsgUndelegate](03_messages.md#msgundelegate) - - [MsgBeginRedelegate](03_messages.md#msgbeginredelegate) + + - [MsgCreateValidator](03_messages.md#msgcreatevalidator) + - [MsgEditValidator](03_messages.md#msgeditvalidator) + - [MsgDelegate](03_messages.md#msgdelegate) + - [MsgUndelegate](03_messages.md#msgundelegate) + - [MsgBeginRedelegate](03_messages.md#msgbeginredelegate) + - [MsgTokenizeShares](03_messages.md#msgtokenizeshares) + - [MsgRedeemTokensforShares](03_messages.md#msgredeemtokensforshares) + - [MsgTransferTokenizeShareRecord](03_messages.md#msgtransfertokenizesharerecord) + 4. **[Begin-Block](04_begin_block.md)** - - [Historical Info Tracking](04_begin_block.md#historical-info-tracking) + - [Historical Info Tracking](04_begin_block.md#historical-info-tracking) 5. **[End-Block](05_end_block.md)** - - [Validator Set Changes](05_end_block.md#validator-set-changes) - - [Queues](05_end_block.md#queues-) + - [Validator Set Changes](05_end_block.md#validator-set-changes) + - [Queues](05_end_block.md#queues-) 6. **[Hooks](06_hooks.md)** 7. **[Events](07_events.md)** - - [EndBlocker](07_events.md#endblocker) - - [Msg's](07_events.md#msg's) + - [EndBlocker](07_events.md#endblocker) + - [Msg's](07_events.md#msg's) 8. **[Parameters](08_params.md)** diff --git a/x/staking/types/codec.go b/x/staking/types/codec.go index 48554907..09063a52 100644 --- a/x/staking/types/codec.go +++ b/x/staking/types/codec.go @@ -17,6 +17,9 @@ func RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) { cdc.RegisterConcrete(&MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil) cdc.RegisterConcrete(&MsgUndelegate{}, "cosmos-sdk/MsgUndelegate", nil) cdc.RegisterConcrete(&MsgBeginRedelegate{}, "cosmos-sdk/MsgBeginRedelegate", nil) + cdc.RegisterConcrete(&MsgTokenizeShares{}, "cosmos-sdk/MsgTokenizeShares", nil) + cdc.RegisterConcrete(&MsgRedeemTokensforShares{}, "cosmos-sdk/MsgRedeemTokensforShares", nil) + cdc.RegisterConcrete(&MsgTransferTokenizeShareRecord{}, "cosmos-sdk/MsgTransferTokenizeShareRecord", nil) } // RegisterInterfaces registers the x/staking interfaces types with the interface registry @@ -27,6 +30,9 @@ func RegisterInterfaces(registry types.InterfaceRegistry) { &MsgDelegate{}, &MsgUndelegate{}, &MsgBeginRedelegate{}, + &MsgTokenizeShares{}, + &MsgRedeemTokensforShares{}, + &MsgTransferTokenizeShareRecord{}, ) registry.RegisterImplementations( (*authz.Authorization)(nil), diff --git a/x/staking/types/errors.go b/x/staking/types/errors.go index 75e1f0ce..6989ea38 100644 --- a/x/staking/types/errors.go +++ b/x/staking/types/errors.go @@ -11,42 +11,48 @@ import ( // // REF: https://github.com/cosmos/cosmos-sdk/issues/5450 var ( - ErrEmptyValidatorAddr = sdkerrors.New(ModuleName, 2, "empty validator address") - ErrNoValidatorFound = sdkerrors.New(ModuleName, 3, "validator does not exist") - ErrValidatorOwnerExists = sdkerrors.New(ModuleName, 4, "validator already exist for this operator address; must use new validator operator address") - ErrValidatorPubKeyExists = sdkerrors.New(ModuleName, 5, "validator already exist for this pubkey; must use new validator pubkey") - ErrValidatorPubKeyTypeNotSupported = sdkerrors.New(ModuleName, 6, "validator pubkey type is not supported") - ErrValidatorJailed = sdkerrors.New(ModuleName, 7, "validator for this address is currently jailed") - ErrBadRemoveValidator = sdkerrors.New(ModuleName, 8, "failed to remove validator") - ErrCommissionNegative = sdkerrors.New(ModuleName, 9, "commission must be positive") - ErrCommissionHuge = sdkerrors.New(ModuleName, 10, "commission cannot be more than 100%") - ErrCommissionGTMaxRate = sdkerrors.New(ModuleName, 11, "commission cannot be more than the max rate") - ErrCommissionUpdateTime = sdkerrors.New(ModuleName, 12, "commission cannot be changed more than once in 24h") - ErrCommissionChangeRateNegative = sdkerrors.New(ModuleName, 13, "commission change rate must be positive") - ErrCommissionChangeRateGTMaxRate = sdkerrors.New(ModuleName, 14, "commission change rate cannot be more than the max rate") - ErrCommissionGTMaxChangeRate = sdkerrors.New(ModuleName, 15, "commission cannot be changed more than max change rate") - ErrSelfDelegationBelowMinimum = sdkerrors.New(ModuleName, 16, "validator's self delegation must be greater than their minimum self delegation") - ErrMinSelfDelegationDecreased = sdkerrors.New(ModuleName, 17, "minimum self delegation cannot be decrease") - ErrEmptyDelegatorAddr = sdkerrors.New(ModuleName, 18, "empty delegator address") - ErrNoDelegation = sdkerrors.New(ModuleName, 19, "no delegation for (address, validator) tuple") - ErrBadDelegatorAddr = sdkerrors.New(ModuleName, 20, "delegator does not exist with address") - ErrNoDelegatorForAddress = sdkerrors.New(ModuleName, 21, "delegator does not contain delegation") - ErrInsufficientShares = sdkerrors.New(ModuleName, 22, "insufficient delegation shares") - ErrDelegationValidatorEmpty = sdkerrors.New(ModuleName, 23, "cannot delegate to an empty validator") - ErrNotEnoughDelegationShares = sdkerrors.New(ModuleName, 24, "not enough delegation shares") - ErrNotMature = sdkerrors.New(ModuleName, 25, "entry not mature") - ErrNoUnbondingDelegation = sdkerrors.New(ModuleName, 26, "no unbonding delegation found") - ErrMaxUnbondingDelegationEntries = sdkerrors.New(ModuleName, 27, "too many unbonding delegation entries for (delegator, validator) tuple") - ErrNoRedelegation = sdkerrors.New(ModuleName, 28, "no redelegation found") - ErrSelfRedelegation = sdkerrors.New(ModuleName, 29, "cannot redelegate to the same validator") - ErrTinyRedelegationAmount = sdkerrors.New(ModuleName, 30, "too few tokens to redelegate (truncates to zero tokens)") - ErrBadRedelegationDst = sdkerrors.New(ModuleName, 31, "redelegation destination validator not found") - ErrTransitiveRedelegation = sdkerrors.New(ModuleName, 32, "redelegation to this validator already in progress; first redelegation to this validator must complete before next redelegation") - ErrMaxRedelegationEntries = sdkerrors.New(ModuleName, 33, "too many redelegation entries for (delegator, src-validator, dst-validator) tuple") - ErrDelegatorShareExRateInvalid = sdkerrors.New(ModuleName, 34, "cannot delegate to validators with invalid (zero) ex-rate") - ErrBothShareMsgsGiven = sdkerrors.New(ModuleName, 35, "both shares amount and shares percent provided") - ErrNeitherShareMsgsGiven = sdkerrors.New(ModuleName, 36, "neither shares amount nor shares percent provided") - ErrInvalidHistoricalInfo = sdkerrors.New(ModuleName, 37, "invalid historical info") - ErrNoHistoricalInfo = sdkerrors.New(ModuleName, 38, "no historical info found") - ErrEmptyValidatorPubKey = sdkerrors.New(ModuleName, 39, "empty validator public key") + ErrEmptyValidatorAddr = sdkerrors.New(ModuleName, 2, "empty validator address") + ErrNoValidatorFound = sdkerrors.New(ModuleName, 3, "validator does not exist") + ErrValidatorOwnerExists = sdkerrors.New(ModuleName, 4, "validator already exist for this operator address; must use new validator operator address") + ErrValidatorPubKeyExists = sdkerrors.New(ModuleName, 5, "validator already exist for this pubkey; must use new validator pubkey") + ErrValidatorPubKeyTypeNotSupported = sdkerrors.New(ModuleName, 6, "validator pubkey type is not supported") + ErrValidatorJailed = sdkerrors.New(ModuleName, 7, "validator for this address is currently jailed") + ErrBadRemoveValidator = sdkerrors.New(ModuleName, 8, "failed to remove validator") + ErrCommissionNegative = sdkerrors.New(ModuleName, 9, "commission must be positive") + ErrCommissionHuge = sdkerrors.New(ModuleName, 10, "commission cannot be more than 100%") + ErrCommissionGTMaxRate = sdkerrors.New(ModuleName, 11, "commission cannot be more than the max rate") + ErrCommissionUpdateTime = sdkerrors.New(ModuleName, 12, "commission cannot be changed more than once in 24h") + ErrCommissionChangeRateNegative = sdkerrors.New(ModuleName, 13, "commission change rate must be positive") + ErrCommissionChangeRateGTMaxRate = sdkerrors.New(ModuleName, 14, "commission change rate cannot be more than the max rate") + ErrCommissionGTMaxChangeRate = sdkerrors.New(ModuleName, 15, "commission cannot be changed more than max change rate") + ErrSelfDelegationBelowMinimum = sdkerrors.New(ModuleName, 16, "validator's self delegation must be greater than their minimum self delegation") + ErrMinSelfDelegationDecreased = sdkerrors.New(ModuleName, 17, "minimum self delegation cannot be decrease") + ErrEmptyDelegatorAddr = sdkerrors.New(ModuleName, 18, "empty delegator address") + ErrNoDelegation = sdkerrors.New(ModuleName, 19, "no delegation for (address, validator) tuple") + ErrBadDelegatorAddr = sdkerrors.New(ModuleName, 20, "delegator does not exist with address") + ErrNoDelegatorForAddress = sdkerrors.New(ModuleName, 21, "delegator does not contain delegation") + ErrInsufficientShares = sdkerrors.New(ModuleName, 22, "insufficient delegation shares") + ErrDelegationValidatorEmpty = sdkerrors.New(ModuleName, 23, "cannot delegate to an empty validator") + ErrNotEnoughDelegationShares = sdkerrors.New(ModuleName, 24, "not enough delegation shares") + ErrNotMature = sdkerrors.New(ModuleName, 25, "entry not mature") + ErrNoUnbondingDelegation = sdkerrors.New(ModuleName, 26, "no unbonding delegation found") + ErrMaxUnbondingDelegationEntries = sdkerrors.New(ModuleName, 27, "too many unbonding delegation entries for (delegator, validator) tuple") + ErrNoRedelegation = sdkerrors.New(ModuleName, 28, "no redelegation found") + ErrSelfRedelegation = sdkerrors.New(ModuleName, 29, "cannot redelegate to the same validator") + ErrTinyRedelegationAmount = sdkerrors.New(ModuleName, 30, "too few tokens to redelegate (truncates to zero tokens)") + ErrBadRedelegationDst = sdkerrors.New(ModuleName, 31, "redelegation destination validator not found") + ErrTransitiveRedelegation = sdkerrors.New(ModuleName, 32, "redelegation to this validator already in progress; first redelegation to this validator must complete before next redelegation") + ErrMaxRedelegationEntries = sdkerrors.New(ModuleName, 33, "too many redelegation entries for (delegator, src-validator, dst-validator) tuple") + ErrDelegatorShareExRateInvalid = sdkerrors.New(ModuleName, 34, "cannot delegate to validators with invalid (zero) ex-rate") + ErrBothShareMsgsGiven = sdkerrors.New(ModuleName, 35, "both shares amount and shares percent provided") + ErrNeitherShareMsgsGiven = sdkerrors.New(ModuleName, 36, "neither shares amount nor shares percent provided") + ErrInvalidHistoricalInfo = sdkerrors.New(ModuleName, 37, "invalid historical info") + ErrNoHistoricalInfo = sdkerrors.New(ModuleName, 38, "no historical info found") + ErrEmptyValidatorPubKey = sdkerrors.New(ModuleName, 39, "empty validator public key") + ErrNotEnoughBalance = sdkerrors.New(ModuleName, 40, "not enough balance") + ErrTokenizeShareRecordNotExists = sdkerrors.New(ModuleName, 41, "tokenize share record not exists") + ErrTokenizeShareRecordAlreadyExists = sdkerrors.New(ModuleName, 42, "tokenize share record already exists") + ErrNotTokenizeShareRecordOwner = sdkerrors.New(ModuleName, 43, "not tokenize share record owner") + ErrExceedingFreeVestingDelegations = sdkerrors.New(ModuleName, 44, "trying to exceed vested free delegation for vesting account") + ErrOnlyBondDenomAllowdForTokenize = sdkerrors.New(ModuleName, 45, "only bond denom is allowed for tokenize") ) diff --git a/x/staking/types/expected_keepers.go b/x/staking/types/expected_keepers.go index a4beece8..f435ec94 100644 --- a/x/staking/types/expected_keepers.go +++ b/x/staking/types/expected_keepers.go @@ -33,10 +33,14 @@ type BankKeeper interface { GetSupply(ctx sdk.Context, denom string) sdk.Coin + SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error SendCoinsFromModuleToModule(ctx sdk.Context, senderPool, recipientPool string, amt sdk.Coins) error + SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error UndelegateCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error DelegateCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error + MintCoins(cts sdk.Context, name string, amt sdk.Coins) error BurnCoins(ctx sdk.Context, name string, amt sdk.Coins) error } diff --git a/x/staking/types/genesis.pb.go b/x/staking/types/genesis.pb.go index adc57ce2..e3cb9082 100644 --- a/x/staking/types/genesis.pb.go +++ b/x/staking/types/genesis.pb.go @@ -43,6 +43,10 @@ type GenesisState struct { // redelegations defines the redelegations active at genesis. Redelegations []Redelegation `protobuf:"bytes,7,rep,name=redelegations,proto3" json:"redelegations"` Exported bool `protobuf:"varint,8,opt,name=exported,proto3" json:"exported,omitempty"` + // store tokenize share records to provide reward to record owners + TokenizeShareRecords []TokenizeShareRecord `protobuf:"bytes,9,rep,name=tokenize_share_records,json=tokenizeShareRecords,proto3" json:"tokenize_share_records"` + // last tokenize share record id, used for next share record id calculation + LastTokenizeShareRecordId uint64 `protobuf:"varint,10,opt,name=last_tokenize_share_record_id,json=lastTokenizeShareRecordId,proto3" json:"last_tokenize_share_record_id,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -127,6 +131,20 @@ func (m *GenesisState) GetExported() bool { return false } +func (m *GenesisState) GetTokenizeShareRecords() []TokenizeShareRecord { + if m != nil { + return m.TokenizeShareRecords + } + return nil +} + +func (m *GenesisState) GetLastTokenizeShareRecordId() uint64 { + if m != nil { + return m.LastTokenizeShareRecordId + } + return 0 +} + // LastValidatorPower required for validator set update logic. type LastValidatorPower struct { // address is the address of the validator. @@ -176,40 +194,44 @@ func init() { func init() { proto.RegisterFile("staking/v1beta1/genesis.proto", fileDescriptor_30376b0921a07e54) } var fileDescriptor_30376b0921a07e54 = []byte{ - // 520 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x4f, 0x8b, 0xd3, 0x40, - 0x18, 0xc6, 0x13, 0xbb, 0xed, 0xd6, 0xe9, 0x2a, 0x32, 0x76, 0x31, 0x14, 0x37, 0x29, 0x41, 0x25, - 0x22, 0x4d, 0x68, 0xbd, 0xed, 0x45, 0xa8, 0x82, 0x2c, 0xc8, 0xb2, 0xc6, 0x7f, 0xe8, 0xa5, 0x4c, - 0x9b, 0x21, 0x0e, 0x9b, 0xcc, 0x64, 0x33, 0x93, 0x75, 0xfb, 0x0d, 0x04, 0x11, 0xfc, 0x08, 0xfb, - 0x71, 0xf6, 0xb8, 0x47, 0xf1, 0x50, 0xa4, 0xbd, 0x78, 0xee, 0x07, 0x10, 0xc9, 0x24, 0xa9, 0xb1, - 0x95, 0xcd, 0x69, 0x3a, 0xd3, 0xe7, 0xf9, 0xbd, 0xcf, 0x3b, 0x99, 0x17, 0xec, 0x71, 0x81, 0x8e, - 0x09, 0xf5, 0x9d, 0xd3, 0xfe, 0x18, 0x0b, 0xd4, 0x77, 0x7c, 0x4c, 0x31, 0x27, 0xdc, 0x8e, 0x62, - 0x26, 0x18, 0xdc, 0x0b, 0xc8, 0x49, 0x42, 0xbc, 0x5c, 0x64, 0x17, 0x6b, 0x2e, 0xee, 0xb4, 0x7d, - 0xe6, 0x33, 0xa9, 0x74, 0xd2, 0x5f, 0x99, 0xa9, 0xb3, 0xc1, 0x2c, 0x6c, 0xf2, 0x6f, 0xf3, 0x77, - 0x1d, 0xec, 0x3c, 0xcf, 0xaa, 0xbc, 0x12, 0x48, 0x60, 0xf8, 0x14, 0x34, 0x22, 0x14, 0xa3, 0x90, - 0x6b, 0x6a, 0x57, 0xb5, 0x5a, 0x83, 0xfb, 0xf6, 0x95, 0x55, 0xed, 0x23, 0x29, 0x1e, 0x6e, 0x5d, - 0xcc, 0x0c, 0xc5, 0xcd, 0xad, 0x90, 0x83, 0x5b, 0x01, 0xe2, 0x62, 0x24, 0x98, 0x40, 0xc1, 0x28, - 0x62, 0x9f, 0x70, 0xac, 0x5d, 0xeb, 0xaa, 0xd6, 0xce, 0xf0, 0x20, 0xd5, 0xfd, 0x98, 0x19, 0x0f, - 0x7c, 0x22, 0x3e, 0x26, 0x63, 0x7b, 0xc2, 0x42, 0x67, 0xc2, 0x78, 0xc8, 0x78, 0xbe, 0xf4, 0xb8, - 0x77, 0xec, 0x88, 0x69, 0x84, 0xb9, 0x7d, 0x40, 0xc5, 0x72, 0x66, 0xdc, 0x99, 0xa2, 0x30, 0xd8, - 0x37, 0xd7, 0x79, 0xa6, 0x7b, 0x33, 0x3d, 0x7a, 0x9d, 0x9e, 0x1c, 0xa5, 0x07, 0xf0, 0x8b, 0x0a, - 0x76, 0xa5, 0xea, 0x14, 0x05, 0xc4, 0x43, 0x82, 0xc5, 0x99, 0x92, 0x6b, 0xb5, 0x6e, 0xcd, 0x6a, - 0x0d, 0xfa, 0x15, 0x9d, 0xbc, 0x40, 0x5c, 0xbc, 0x2d, 0xac, 0x12, 0x39, 0xbc, 0x97, 0xa6, 0x5d, - 0xce, 0x8c, 0xbb, 0xa5, 0x0c, 0xeb, 0x74, 0xd3, 0xbd, 0x1d, 0x6c, 0x38, 0x39, 0x3c, 0x04, 0x60, - 0xa5, 0xe4, 0xda, 0x96, 0x4c, 0x60, 0x55, 0x24, 0x58, 0x31, 0xf2, 0xeb, 0x2c, 0x11, 0xe0, 0x4b, - 0xd0, 0xf2, 0x70, 0x80, 0x7d, 0x24, 0x08, 0xa3, 0x5c, 0xab, 0x4b, 0xe0, 0xc3, 0x0a, 0xe0, 0xb3, - 0x95, 0x23, 0x27, 0x96, 0x19, 0xf0, 0xab, 0x0a, 0x76, 0x13, 0x3a, 0x66, 0xd4, 0x23, 0xd4, 0x1f, - 0x95, 0xe9, 0x0d, 0x49, 0x1f, 0x54, 0xd0, 0xdf, 0x14, 0xde, 0x52, 0x99, 0xb5, 0x1b, 0xfb, 0x2f, - 0xde, 0x74, 0xdb, 0xc9, 0xa6, 0x95, 0xc3, 0x77, 0xe0, 0x46, 0x8c, 0xcb, 0x31, 0xb6, 0x65, 0x8c, - 0x47, 0x15, 0x31, 0xdc, 0x92, 0x27, 0x6f, 0xf3, 0x5f, 0x0e, 0xec, 0x80, 0x26, 0x3e, 0x8b, 0x58, - 0x2c, 0xb0, 0xa7, 0x35, 0xbb, 0xaa, 0xd5, 0x74, 0x57, 0x7b, 0xf3, 0x10, 0xc0, 0xcd, 0x0f, 0x0f, - 0x35, 0xb0, 0x8d, 0x3c, 0x2f, 0xc6, 0x3c, 0x1b, 0x83, 0xeb, 0x6e, 0xb1, 0x85, 0x6d, 0x50, 0xff, - 0xfb, 0x9e, 0x6b, 0x6e, 0xb6, 0xd9, 0x6f, 0x7e, 0x3e, 0x37, 0x94, 0x5f, 0xe7, 0x86, 0x32, 0x7c, - 0x7f, 0x31, 0xd7, 0xd5, 0xcb, 0xb9, 0xae, 0xfe, 0x9c, 0xeb, 0xea, 0xb7, 0x85, 0xae, 0x5c, 0x2e, - 0x74, 0xe5, 0xfb, 0x42, 0x57, 0x3e, 0x3c, 0x29, 0x3d, 0x79, 0x72, 0x12, 0x24, 0x9c, 0x30, 0x4a, - 0xe8, 0xc4, 0xc9, 0xba, 0x23, 0x62, 0xda, 0xcb, 0x3b, 0xeb, 0x85, 0xcc, 0x4b, 0x02, 0xec, 0x9c, - 0x15, 0xb3, 0x9a, 0xcd, 0xc3, 0xb8, 0x21, 0x47, 0xf6, 0xf1, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x6d, 0xc0, 0x0a, 0x58, 0x27, 0x04, 0x00, 0x00, + // 585 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0xcf, 0x6e, 0xd3, 0x4c, + 0x14, 0xc5, 0xed, 0xaf, 0x69, 0x92, 0x4e, 0xfa, 0x21, 0x34, 0xa4, 0x60, 0x22, 0x62, 0x47, 0x16, + 0x20, 0x23, 0x14, 0x5b, 0x09, 0xbb, 0x6e, 0x40, 0x01, 0x09, 0x45, 0x42, 0x55, 0x71, 0x0b, 0x08, + 0x36, 0xd6, 0x24, 0x33, 0x72, 0x47, 0x71, 0x3c, 0xa9, 0x67, 0x5c, 0x1a, 0x9e, 0x00, 0x09, 0x21, + 0xf1, 0x08, 0x7d, 0x04, 0x1e, 0xa3, 0xcb, 0x2e, 0x11, 0x8b, 0x08, 0x25, 0x1b, 0xd6, 0x7d, 0x02, + 0xe4, 0x7f, 0xc1, 0xc4, 0x15, 0x61, 0x65, 0xcf, 0xf8, 0x9c, 0xdf, 0x3d, 0xbe, 0x9a, 0x3b, 0xa0, + 0xc9, 0x05, 0x1a, 0x51, 0xdf, 0xb5, 0x4e, 0x3a, 0x03, 0x22, 0x50, 0xc7, 0x72, 0x89, 0x4f, 0x38, + 0xe5, 0xe6, 0x24, 0x60, 0x82, 0xc1, 0xa6, 0x47, 0x8f, 0x43, 0x8a, 0x53, 0x91, 0x99, 0x3d, 0x53, + 0x71, 0xa3, 0xee, 0x32, 0x97, 0xc5, 0x4a, 0x2b, 0x7a, 0x4b, 0x4c, 0x8d, 0x02, 0x33, 0xb3, 0xc5, + 0x9f, 0xf5, 0xaf, 0x15, 0xb0, 0xfd, 0x3c, 0xa9, 0x72, 0x20, 0x90, 0x20, 0xf0, 0x29, 0x28, 0x4f, + 0x50, 0x80, 0xc6, 0x5c, 0x91, 0x5b, 0xb2, 0x51, 0xeb, 0xde, 0x33, 0xff, 0x5a, 0xd5, 0xdc, 0x8f, + 0xc5, 0xbd, 0xd2, 0xf9, 0x4c, 0x93, 0xec, 0xd4, 0x0a, 0x39, 0xb8, 0xee, 0x21, 0x2e, 0x1c, 0xc1, + 0x04, 0xf2, 0x9c, 0x09, 0x7b, 0x4f, 0x02, 0xe5, 0xbf, 0x96, 0x6c, 0x6c, 0xf7, 0xfa, 0x91, 0xee, + 0xfb, 0x4c, 0xbb, 0xef, 0x52, 0x71, 0x14, 0x0e, 0xcc, 0x21, 0x1b, 0x5b, 0x43, 0xc6, 0xc7, 0x8c, + 0xa7, 0x8f, 0x36, 0xc7, 0x23, 0x4b, 0x4c, 0x27, 0x84, 0x9b, 0x7d, 0x5f, 0x5c, 0xce, 0xb4, 0x5b, + 0x53, 0x34, 0xf6, 0x76, 0xf5, 0x55, 0x9e, 0x6e, 0x5f, 0x8b, 0xb6, 0x0e, 0xa3, 0x9d, 0xfd, 0x68, + 0x03, 0x7e, 0x92, 0xc1, 0x4e, 0xac, 0x3a, 0x41, 0x1e, 0xc5, 0x48, 0xb0, 0x20, 0x51, 0x72, 0x65, + 0xa3, 0xb5, 0x61, 0xd4, 0xba, 0x9d, 0x35, 0x7f, 0xf2, 0x02, 0x71, 0xf1, 0x3a, 0xb3, 0xc6, 0xc8, + 0xde, 0xdd, 0x28, 0xed, 0xe5, 0x4c, 0xbb, 0x93, 0xcb, 0xb0, 0x4a, 0xd7, 0xed, 0x1b, 0x5e, 0xc1, + 0xc9, 0xe1, 0x1e, 0x00, 0x4b, 0x25, 0x57, 0x4a, 0x71, 0x02, 0x63, 0x4d, 0x82, 0x25, 0x23, 0x6d, + 0x67, 0x8e, 0x00, 0x5f, 0x82, 0x1a, 0x26, 0x1e, 0x71, 0x91, 0xa0, 0xcc, 0xe7, 0xca, 0x66, 0x0c, + 0x7c, 0xb0, 0x06, 0xf8, 0x6c, 0xe9, 0x48, 0x89, 0x79, 0x06, 0xfc, 0x2c, 0x83, 0x9d, 0xd0, 0x1f, + 0x30, 0x1f, 0x53, 0xdf, 0x75, 0xf2, 0xf4, 0x72, 0x4c, 0xef, 0xae, 0xa1, 0xbf, 0xca, 0xbc, 0xb9, + 0x32, 0x2b, 0x1d, 0xbb, 0x12, 0xaf, 0xdb, 0xf5, 0xb0, 0x68, 0xe5, 0xf0, 0x0d, 0xf8, 0x3f, 0x20, + 0xf9, 0x18, 0x95, 0x38, 0xc6, 0xc3, 0x35, 0x31, 0xec, 0x9c, 0x27, 0xfd, 0xcd, 0x3f, 0x39, 0xb0, + 0x01, 0xaa, 0xe4, 0x74, 0xc2, 0x02, 0x41, 0xb0, 0x52, 0x6d, 0xc9, 0x46, 0xd5, 0x5e, 0xae, 0xa1, + 0x0f, 0x6e, 0x0a, 0x36, 0x22, 0x3e, 0xfd, 0x40, 0x1c, 0x7e, 0x84, 0x02, 0xe2, 0x04, 0x64, 0xc8, + 0x02, 0xcc, 0x95, 0xad, 0x7f, 0x6a, 0xc2, 0x61, 0x6a, 0x3e, 0x88, 0xbc, 0x76, 0x6c, 0x4d, 0x43, + 0xd4, 0x45, 0xf1, 0x13, 0x87, 0x4f, 0x40, 0x33, 0x3d, 0xca, 0x57, 0x14, 0x75, 0x28, 0x56, 0x40, + 0x4b, 0x36, 0x4a, 0xf6, 0xed, 0xe4, 0x70, 0x17, 0x00, 0x7d, 0xac, 0xef, 0x01, 0x58, 0x3c, 0xaa, + 0x50, 0x01, 0x15, 0x84, 0x71, 0x40, 0x78, 0x32, 0xb8, 0x5b, 0x76, 0xb6, 0x84, 0x75, 0xb0, 0xf9, + 0x7b, 0x02, 0x37, 0xec, 0x64, 0xb1, 0x5b, 0xfd, 0x78, 0xa6, 0x49, 0x3f, 0xcf, 0x34, 0xa9, 0xf7, + 0xf6, 0x7c, 0xae, 0xca, 0x17, 0x73, 0x55, 0xfe, 0x31, 0x57, 0xe5, 0x2f, 0x0b, 0x55, 0xba, 0x58, + 0xa8, 0xd2, 0xb7, 0x85, 0x2a, 0xbd, 0x7b, 0x9c, 0x1b, 0x52, 0x7a, 0xec, 0x85, 0x9c, 0x32, 0x9f, + 0xfa, 0x43, 0x2b, 0xe9, 0x08, 0x15, 0xd3, 0x76, 0xda, 0x8d, 0xf6, 0x98, 0xe1, 0xd0, 0x23, 0xd6, + 0x69, 0x76, 0xbb, 0x24, 0x13, 0x3c, 0x28, 0xc7, 0x97, 0xcc, 0xa3, 0x5f, 0x01, 0x00, 0x00, 0xff, + 0xff, 0xa3, 0xfb, 0xe7, 0x19, 0xd9, 0x04, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -232,6 +254,25 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.LastTokenizeShareRecordId != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.LastTokenizeShareRecordId)) + i-- + dAtA[i] = 0x50 + } + if len(m.TokenizeShareRecords) > 0 { + for iNdEx := len(m.TokenizeShareRecords) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.TokenizeShareRecords[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + } if m.Exported { i-- if m.Exported { @@ -424,6 +465,15 @@ func (m *GenesisState) Size() (n int) { if m.Exported { n += 2 } + if len(m.TokenizeShareRecords) > 0 { + for _, e := range m.TokenizeShareRecords { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + if m.LastTokenizeShareRecordId != 0 { + n += 1 + sovGenesis(uint64(m.LastTokenizeShareRecordId)) + } return n } @@ -734,6 +784,59 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } } m.Exported = bool(v != 0) + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenizeShareRecords", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenizeShareRecords = append(m.TokenizeShareRecords, TokenizeShareRecord{}) + if err := m.TokenizeShareRecords[len(m.TokenizeShareRecords)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTokenizeShareRecordId", wireType) + } + m.LastTokenizeShareRecordId = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.LastTokenizeShareRecordId |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/staking/types/keys.go b/x/staking/types/keys.go index 584dba56..09adf7af 100644 --- a/x/staking/types/keys.go +++ b/x/staking/types/keys.go @@ -47,6 +47,11 @@ var ( ValidatorQueueKey = []byte{0x43} // prefix for the timestamps in validator queue HistoricalInfoKey = []byte{0x50} // prefix for the historical info + + TokenizeShareRecordPrefix = []byte{0x61} // key for tokenizeshare record prefix + TokenizeShareRecordIdByOwnerPrefix = []byte{0x62} // key for tokenizeshare record id by owner prefix + TokenizeShareRecordIdByDenomPrefix = []byte{0x63} // key for tokenizeshare record id by denom prefix + LastTokenizeShareRecordIdKey = []byte{0x64} // key for last tokenize share record id ) // GetValidatorKey creates the key for the validator with address @@ -333,3 +338,22 @@ func GetREDsByDelToValDstIndexKey(delAddr sdk.AccAddress, valDstAddr sdk.ValAddr func GetHistoricalInfoKey(height int64) []byte { return append(HistoricalInfoKey, []byte(strconv.FormatInt(height, 10))...) } + +// GetTokenizeShareRecordByIndexKey returns the key of the specified id. Intended for querying the tokenizeShareRecord by the id. +func GetTokenizeShareRecordByIndexKey(id uint64) []byte { + return append(TokenizeShareRecordPrefix, sdk.Uint64ToBigEndian(id)...) +} + +// GetTokenizeShareRecordIdsByOwnerPrefix returns the key of the specified owner. Intended for querying all tokenizeShareRecords of an owner +func GetTokenizeShareRecordIdsByOwnerPrefix(owner sdk.AccAddress) []byte { + return append(TokenizeShareRecordIdByOwnerPrefix, owner.Bytes()...) +} + +// GetTokenizeShareRecordIdByOwnerAndIdKey returns the key of the specified owner and id. Intended for setting tokenizeShareRecord of an owner +func GetTokenizeShareRecordIdByOwnerAndIdKey(owner sdk.AccAddress, id uint64) []byte { + return append(append(TokenizeShareRecordIdByOwnerPrefix, owner.Bytes()...), sdk.Uint64ToBigEndian(id)...) +} + +func GetTokenizeShareRecordIdByDenomKey(denom string) []byte { + return append(TokenizeShareRecordIdByDenomPrefix, []byte(denom)...) +} diff --git a/x/staking/types/msg.go b/x/staking/types/msg.go index af60ac37..842262e5 100644 --- a/x/staking/types/msg.go +++ b/x/staking/types/msg.go @@ -26,6 +26,9 @@ var ( _ sdk.Msg = &MsgDelegate{} _ sdk.Msg = &MsgUndelegate{} _ sdk.Msg = &MsgBeginRedelegate{} + _ sdk.Msg = &MsgTokenizeShares{} + _ sdk.Msg = &MsgRedeemTokensforShares{} + _ sdk.Msg = &MsgTransferTokenizeShareRecord{} ) // NewMsgCreateValidator creates a new MsgCreateValidator instance. @@ -366,3 +369,80 @@ func (msg MsgUndelegate) ValidateBasic() error { return nil } + +func (msg MsgTokenizeShares) GetSigners() []sdk.AccAddress { + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} +} + +func (msg MsgTokenizeShares) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +func (msg MsgTokenizeShares) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) + } + if _, err := sdk.ValAddressFromBech32(msg.ValidatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid validator address: %s", err) + } + if _, err := sdk.AccAddressFromBech32(msg.TokenizedShareOwner); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid tokenize share owner address: %s", err) + } + + if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { + return sdkerrors.Wrap( + sdkerrors.ErrInvalidRequest, + "invalid shares amount", + ) + } + + return nil +} + +func (msg MsgRedeemTokensforShares) GetSigners() []sdk.AccAddress { + delegator, _ := sdk.AccAddressFromBech32(msg.DelegatorAddress) + return []sdk.AccAddress{delegator} +} + +func (msg MsgRedeemTokensforShares) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +func (msg MsgRedeemTokensforShares) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.DelegatorAddress); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid delegator address: %s", err) + } + + if !msg.Amount.IsValid() || !msg.Amount.Amount.IsPositive() { + return sdkerrors.Wrap( + sdkerrors.ErrInvalidRequest, + "invalid shares amount", + ) + } + + return nil +} + +func (msg MsgTransferTokenizeShareRecord) GetSigners() []sdk.AccAddress { + sender, _ := sdk.AccAddressFromBech32(msg.Sender) + return []sdk.AccAddress{sender} +} + +func (msg MsgTransferTokenizeShareRecord) GetSignBytes() []byte { + bz := ModuleCdc.MustMarshalJSON(&msg) + return sdk.MustSortJSON(bz) +} + +func (msg MsgTransferTokenizeShareRecord) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(msg.Sender); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid sender address: %s", err) + } + if _, err := sdk.AccAddressFromBech32(msg.NewOwner); err != nil { + return sdkerrors.ErrInvalidAddress.Wrapf("invalid new owner address: %s", err) + } + + return nil +} diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index 39e44615..86758b07 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -16,10 +16,10 @@ import ( proto "github.com/gogo/protobuf/proto" 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/golang/protobuf/ptypes/duration" + _ "github.com/golang/protobuf/ptypes/timestamp" _ "github.com/regen-network/cosmos-proto" types "github.com/tendermint/tendermint/proto/tendermint/types" - _ "google.golang.org/protobuf/types/known/durationpb" - _ "google.golang.org/protobuf/types/known/timestamppb" io "io" io_ioutil "io/ioutil" math "math" @@ -1110,6 +1110,82 @@ func (m *Pool) XXX_DiscardUnknown() { var xxx_messageInfo_Pool proto.InternalMessageInfo +type TokenizeShareRecord struct { + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` + ShareTokenDenom string `protobuf:"bytes,3,opt,name=share_token_denom,json=shareTokenDenom,proto3" json:"share_token_denom,omitempty"` + ModuleAccount string `protobuf:"bytes,4,opt,name=module_account,json=moduleAccount,proto3" json:"module_account,omitempty"` + Validator string `protobuf:"bytes,5,opt,name=validator,proto3" json:"validator,omitempty"` +} + +func (m *TokenizeShareRecord) Reset() { *m = TokenizeShareRecord{} } +func (m *TokenizeShareRecord) String() string { return proto.CompactTextString(m) } +func (*TokenizeShareRecord) ProtoMessage() {} +func (*TokenizeShareRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_76a7656dabf68054, []int{20} +} +func (m *TokenizeShareRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TokenizeShareRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TokenizeShareRecord.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 *TokenizeShareRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_TokenizeShareRecord.Merge(m, src) +} +func (m *TokenizeShareRecord) XXX_Size() int { + return m.Size() +} +func (m *TokenizeShareRecord) XXX_DiscardUnknown() { + xxx_messageInfo_TokenizeShareRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_TokenizeShareRecord proto.InternalMessageInfo + +func (m *TokenizeShareRecord) GetId() uint64 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *TokenizeShareRecord) GetOwner() string { + if m != nil { + return m.Owner + } + return "" +} + +func (m *TokenizeShareRecord) GetShareTokenDenom() string { + if m != nil { + return m.ShareTokenDenom + } + return "" +} + +func (m *TokenizeShareRecord) GetModuleAccount() string { + if m != nil { + return m.ModuleAccount + } + return "" +} + +func (m *TokenizeShareRecord) GetValidator() string { + if m != nil { + return m.Validator + } + return "" +} + func init() { proto.RegisterEnum("liquidstaking.staking.v1beta1.BondStatus", BondStatus_name, BondStatus_value) proto.RegisterType((*HistoricalInfo)(nil), "liquidstaking.staking.v1beta1.HistoricalInfo") @@ -1132,127 +1208,133 @@ func init() { proto.RegisterType((*RedelegationEntryResponse)(nil), "liquidstaking.staking.v1beta1.RedelegationEntryResponse") proto.RegisterType((*RedelegationResponse)(nil), "liquidstaking.staking.v1beta1.RedelegationResponse") proto.RegisterType((*Pool)(nil), "liquidstaking.staking.v1beta1.Pool") + proto.RegisterType((*TokenizeShareRecord)(nil), "liquidstaking.staking.v1beta1.TokenizeShareRecord") } func init() { proto.RegisterFile("staking/v1beta1/staking.proto", fileDescriptor_76a7656dabf68054) } var fileDescriptor_76a7656dabf68054 = []byte{ - // 1828 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x23, 0x49, - 0x15, 0x76, 0x3b, 0xd9, 0x24, 0x7e, 0xce, 0xc4, 0x49, 0x4d, 0x66, 0xd6, 0x31, 0x33, 0x6e, 0xd3, - 0x12, 0xab, 0xcc, 0xc2, 0xd8, 0x6c, 0x16, 0xed, 0xc2, 0x5c, 0x20, 0x8e, 0x33, 0x24, 0xda, 0x61, - 0x36, 0xea, 0xfc, 0x2c, 0x2c, 0x48, 0x56, 0xbb, 0xbb, 0xe2, 0x14, 0xe9, 0x1f, 0x4f, 0x57, 0x79, - 0x88, 0xa5, 0x3d, 0x70, 0x5c, 0x8d, 0x84, 0x18, 0x38, 0xed, 0x65, 0xa4, 0x91, 0xb8, 0x21, 0x24, - 0x2e, 0x88, 0x3b, 0xb7, 0x05, 0x09, 0x69, 0xc4, 0x69, 0x85, 0x90, 0x41, 0x33, 0x42, 0x42, 0x9c, - 0x90, 0x0f, 0x88, 0x1b, 0xa8, 0x7e, 0xfa, 0x27, 0xed, 0xd9, 0xf5, 0x38, 0xda, 0xc3, 0x4a, 0xec, - 0x25, 0x71, 0xbd, 0x7a, 0xef, 0x7b, 0x5d, 0xdf, 0xfb, 0xe9, 0x57, 0x0d, 0xd7, 0x29, 0xb3, 0x4e, - 0x89, 0xdf, 0x6d, 0xdc, 0x7f, 0xad, 0x83, 0x99, 0xf5, 0x5a, 0x43, 0xad, 0xeb, 0xbd, 0x30, 0x60, - 0x01, 0xba, 0xee, 0x92, 0x7b, 0x7d, 0xe2, 0x44, 0xc2, 0xe8, 0xbf, 0x52, 0xae, 0xac, 0x76, 0x83, - 0x6e, 0x20, 0x34, 0x1b, 0xfc, 0x97, 0x34, 0xaa, 0xac, 0x75, 0x83, 0xa0, 0xeb, 0xe2, 0x86, 0x58, - 0x75, 0xfa, 0xc7, 0x0d, 0xcb, 0x1f, 0xa8, 0xad, 0x6a, 0x76, 0xcb, 0xe9, 0x87, 0x16, 0x23, 0x81, - 0xaf, 0xf6, 0xf5, 0xec, 0x3e, 0x23, 0x1e, 0xa6, 0xcc, 0xf2, 0x7a, 0x11, 0xb6, 0x1d, 0x50, 0x2f, - 0xa0, 0x6d, 0xe9, 0x54, 0x2e, 0x22, 0x6c, 0xb9, 0x6a, 0x74, 0x2c, 0x8a, 0xe3, 0xe3, 0xd8, 0x01, - 0x89, 0xb0, 0xaf, 0x31, 0xec, 0x3b, 0x38, 0xf4, 0x88, 0xcf, 0x1a, 0x6c, 0xd0, 0xc3, 0x54, 0xfe, - 0x95, 0xbb, 0xc6, 0x43, 0x0d, 0x96, 0x76, 0x08, 0x65, 0x41, 0x48, 0x6c, 0xcb, 0xdd, 0xf5, 0x8f, - 0x03, 0xf4, 0x06, 0xcc, 0x9d, 0x60, 0xcb, 0xc1, 0x61, 0x59, 0xab, 0x69, 0xeb, 0xc5, 0x8d, 0x72, - 0x3d, 0x41, 0xa8, 0x4b, 0xdb, 0x1d, 0xb1, 0xdf, 0x9c, 0xfd, 0x70, 0xa8, 0xe7, 0x4c, 0xa5, 0x8d, - 0x6e, 0xc3, 0xdc, 0x7d, 0xcb, 0xa5, 0x98, 0x95, 0xf3, 0xb5, 0x99, 0xf5, 0xe2, 0xc6, 0x7a, 0xfd, - 0x13, 0x59, 0xac, 0x1f, 0x59, 0x2e, 0x71, 0x2c, 0x16, 0xc4, 0x38, 0xd2, 0xda, 0xf8, 0x75, 0x1e, - 0x4a, 0x5b, 0x81, 0xe7, 0x11, 0x4a, 0x49, 0xe0, 0x9b, 0x16, 0xc3, 0x14, 0x35, 0x61, 0x36, 0xb4, - 0x18, 0x16, 0x4f, 0x54, 0x68, 0xd6, 0xb9, 0xfe, 0x9f, 0x87, 0xfa, 0x2b, 0x5d, 0xc2, 0x4e, 0xfa, - 0x9d, 0xba, 0x1d, 0x78, 0x8a, 0x13, 0xf5, 0xef, 0x26, 0x75, 0x4e, 0xd5, 0x31, 0x5b, 0xd8, 0x36, - 0x85, 0x2d, 0xfa, 0x01, 0x2c, 0x78, 0xd6, 0x59, 0x5b, 0xe0, 0xe4, 0x05, 0xce, 0xe6, 0x74, 0x38, - 0xa3, 0xa1, 0x5e, 0x1a, 0x58, 0x9e, 0x7b, 0xcb, 0x88, 0x70, 0x0c, 0x73, 0xde, 0xb3, 0xce, 0xf8, - 0x23, 0xa2, 0x1e, 0x94, 0xb8, 0xd4, 0x3e, 0xb1, 0xfc, 0x2e, 0x96, 0x4e, 0x66, 0x84, 0x93, 0x9d, - 0xa9, 0x9d, 0x5c, 0x4d, 0x9c, 0xa4, 0xe0, 0x0c, 0xf3, 0x92, 0x67, 0x9d, 0x6d, 0x09, 0x01, 0xf7, - 0x78, 0x6b, 0xe1, 0x83, 0xc7, 0x7a, 0xee, 0x1f, 0x8f, 0x75, 0xcd, 0xf8, 0x48, 0x03, 0x48, 0x18, - 0x43, 0x36, 0x2c, 0xdb, 0xf1, 0x4a, 0xd8, 0x52, 0x15, 0xca, 0xfa, 0x84, 0x90, 0x64, 0x68, 0x6f, - 0x2e, 0xf0, 0x67, 0x7f, 0x32, 0xd4, 0x35, 0xb3, 0x64, 0x67, 0x22, 0xf2, 0x7d, 0x28, 0xf6, 0x7b, - 0x8e, 0xc5, 0x70, 0x9b, 0xe7, 0xaa, 0x20, 0xb4, 0xb8, 0x51, 0xa9, 0xcb, 0x44, 0xae, 0x47, 0x89, - 0x5c, 0x3f, 0x88, 0x12, 0xb9, 0x59, 0xe5, 0x58, 0xa3, 0xa1, 0x8e, 0xe4, 0xe9, 0x52, 0xc6, 0xc6, - 0xc3, 0xbf, 0xea, 0x9a, 0x09, 0x52, 0xc2, 0x0d, 0x52, 0x47, 0xfb, 0xbd, 0x06, 0xc5, 0x16, 0xa6, - 0x76, 0x48, 0x7a, 0xbc, 0x5e, 0x50, 0x19, 0xe6, 0xbd, 0xc0, 0x27, 0xa7, 0x2a, 0x3b, 0x0b, 0x66, - 0xb4, 0x44, 0x15, 0x58, 0x20, 0x0e, 0xf6, 0x19, 0x61, 0x03, 0x19, 0x5e, 0x33, 0x5e, 0x73, 0xab, - 0x1f, 0xe1, 0x0e, 0x25, 0x51, 0x50, 0xcc, 0x68, 0x89, 0x6e, 0xc3, 0x32, 0xc5, 0x76, 0x3f, 0x24, - 0x6c, 0xd0, 0xb6, 0x03, 0x9f, 0x59, 0x36, 0x2b, 0xcf, 0x8a, 0xb8, 0x7d, 0x61, 0x34, 0xd4, 0x5f, - 0x96, 0xcf, 0x9a, 0xd5, 0x30, 0xcc, 0x52, 0x24, 0xda, 0x92, 0x12, 0xee, 0xc1, 0xc1, 0xcc, 0x22, - 0x2e, 0x2d, 0xbf, 0x24, 0x3d, 0xa8, 0x65, 0xea, 0x2c, 0xbf, 0x9b, 0x87, 0x42, 0x9c, 0xf4, 0xdc, - 0x73, 0xd0, 0xc3, 0x21, 0xff, 0xdd, 0xb6, 0x1c, 0x27, 0xc4, 0x94, 0xaa, 0xf4, 0x4e, 0x79, 0xce, - 0x6a, 0x18, 0x66, 0x29, 0x12, 0x6d, 0x4a, 0x09, 0x62, 0x3c, 0xda, 0x3e, 0xc5, 0x3e, 0xed, 0xd3, - 0x76, 0xaf, 0xdf, 0x39, 0xc5, 0x03, 0x15, 0x8d, 0xd5, 0xb1, 0x68, 0x6c, 0xfa, 0x83, 0xe6, 0xeb, - 0x09, 0x7a, 0xd6, 0xce, 0xf8, 0xc3, 0x6f, 0x6e, 0xae, 0xaa, 0xe6, 0x62, 0x87, 0x83, 0x1e, 0x0b, - 0xea, 0x7b, 0xfd, 0xce, 0x5b, 0x78, 0xc0, 0xc3, 0xaf, 0x54, 0xf7, 0x84, 0x26, 0xba, 0x0a, 0x73, - 0x3f, 0xb4, 0x88, 0x8b, 0x1d, 0x41, 0xe8, 0x82, 0xa9, 0x56, 0x68, 0x13, 0xe6, 0x28, 0xb3, 0x58, - 0x9f, 0x0a, 0x16, 0x97, 0x36, 0x6e, 0x4c, 0xc8, 0xb8, 0x66, 0xe0, 0x3b, 0xfb, 0xc2, 0xc0, 0x54, - 0x86, 0xbc, 0x8f, 0xb0, 0xe0, 0x14, 0xfb, 0x8a, 0xc9, 0xa9, 0xaa, 0x7d, 0xd7, 0x67, 0xa6, 0xb2, - 0xe6, 0xc4, 0x38, 0xd8, 0xc5, 0x5d, 0xc1, 0x1f, 0x3d, 0xb1, 0x42, 0x4c, 0xcb, 0x73, 0x02, 0x71, - 0x77, 0xea, 0x92, 0x54, 0x84, 0x65, 0xf1, 0x0c, 0xb3, 0x14, 0x8b, 0xf6, 0x85, 0x04, 0x99, 0x50, - 0x74, 0x92, 0x7c, 0x2d, 0xcf, 0x8b, 0x48, 0xbc, 0x3a, 0x81, 0x85, 0x54, 0x86, 0xab, 0x66, 0x98, - 0x06, 0xe1, 0xa9, 0xd2, 0xf7, 0x3b, 0x81, 0xef, 0x10, 0xbf, 0xdb, 0x3e, 0xc1, 0xa4, 0x7b, 0xc2, - 0xca, 0x0b, 0x35, 0x6d, 0x7d, 0x26, 0x9d, 0x2a, 0x59, 0x0d, 0xc3, 0x2c, 0xc5, 0xa2, 0x1d, 0x21, - 0x41, 0x0e, 0x2c, 0x25, 0x5a, 0xa2, 0x6c, 0x0b, 0x13, 0xcb, 0xf6, 0x8b, 0xaa, 0x6c, 0xaf, 0x64, - 0xbd, 0x24, 0x95, 0x7b, 0x29, 0x16, 0x72, 0x33, 0xf4, 0x36, 0x40, 0xd2, 0x2c, 0xca, 0x20, 0x3c, - 0xdc, 0x78, 0xe1, 0xc6, 0xa3, 0xce, 0x9f, 0x82, 0x40, 0xef, 0xc1, 0x65, 0x8f, 0xf8, 0x6d, 0x8a, - 0xdd, 0xe3, 0xb6, 0xa2, 0x9b, 0x23, 0x17, 0x45, 0x2c, 0xef, 0x4c, 0x97, 0x1d, 0xa3, 0xa1, 0x5e, - 0x51, 0xed, 0x75, 0x1c, 0xd2, 0x30, 0x57, 0x3c, 0xe2, 0xef, 0x63, 0xf7, 0xb8, 0x15, 0xcb, 0x6e, - 0x2d, 0xbe, 0xff, 0x58, 0xcf, 0xa9, 0x1a, 0xce, 0x19, 0x6f, 0xc0, 0xe2, 0x91, 0xe5, 0xaa, 0xda, - 0xc3, 0x14, 0x5d, 0x83, 0x82, 0x15, 0x2d, 0xca, 0x5a, 0x6d, 0x66, 0xbd, 0x60, 0x26, 0x02, 0x59, - 0xfb, 0x3f, 0xfe, 0x4b, 0x4d, 0x33, 0x7e, 0xa5, 0xc1, 0x5c, 0xeb, 0x68, 0xcf, 0x22, 0x21, 0xda, - 0x85, 0x95, 0x24, 0x8f, 0xce, 0x57, 0xfe, 0xb5, 0xd1, 0x50, 0x2f, 0x67, 0x53, 0x2d, 0x2e, 0xfd, - 0x24, 0x9d, 0xa3, 0xda, 0xdf, 0x85, 0x95, 0xfb, 0x51, 0x43, 0x89, 0xa1, 0xf2, 0x59, 0xa8, 0x31, - 0x15, 0xc3, 0x5c, 0x8e, 0x65, 0x0a, 0x2a, 0x73, 0xcc, 0x3b, 0x30, 0x2f, 0x9f, 0x96, 0xa2, 0x4d, - 0x78, 0xa9, 0xc7, 0x7f, 0x88, 0xd3, 0x15, 0x37, 0xbe, 0x34, 0x29, 0x95, 0x85, 0x99, 0x8a, 0xa2, - 0xb4, 0x34, 0x7e, 0x96, 0x07, 0x68, 0x1d, 0x1d, 0x1d, 0x84, 0xa4, 0xe7, 0x62, 0xf6, 0x69, 0x12, - 0x70, 0x00, 0x57, 0x92, 0xd3, 0xd1, 0xd0, 0xce, 0x90, 0x50, 0x1b, 0x0d, 0xf5, 0x6b, 0x59, 0x12, - 0x52, 0x6a, 0x86, 0x79, 0x39, 0x96, 0xef, 0x87, 0xf6, 0x73, 0x51, 0x1d, 0xca, 0x62, 0xd4, 0x99, - 0x8f, 0x47, 0x4d, 0xa9, 0xa5, 0x51, 0x5b, 0x94, 0x3d, 0x9f, 0xe1, 0x77, 0xa1, 0x98, 0x50, 0x42, - 0xd1, 0x5b, 0xb0, 0xc0, 0xd4, 0x6f, 0x45, 0xf4, 0x8d, 0x89, 0x44, 0x47, 0xd6, 0x8a, 0xec, 0x18, - 0xc0, 0xf8, 0x8f, 0x06, 0x90, 0x64, 0xf0, 0x67, 0x33, 0xe1, 0x78, 0x9b, 0x57, 0x4d, 0x79, 0xe6, - 0x42, 0x43, 0x9d, 0xb2, 0xce, 0xd0, 0xfa, 0xf3, 0x3c, 0x5c, 0x3e, 0x8c, 0xda, 0xd1, 0x67, 0x9e, - 0x83, 0x77, 0x60, 0x1e, 0xfb, 0x2c, 0x24, 0x82, 0x04, 0x1e, 0xf4, 0x37, 0x27, 0x04, 0xfd, 0x39, - 0x47, 0xdb, 0xf6, 0x59, 0x38, 0x50, 0x29, 0x10, 0xa1, 0x65, 0x48, 0xf9, 0xe9, 0x0c, 0x94, 0x3f, - 0xce, 0x12, 0x6d, 0x41, 0xc9, 0x0e, 0xb1, 0x10, 0x44, 0xef, 0x16, 0x4d, 0xbc, 0x5b, 0x2a, 0xc9, - 0x28, 0x9a, 0x51, 0x30, 0xcc, 0xa5, 0x48, 0xa2, 0xde, 0x2c, 0x5d, 0xe0, 0x03, 0x22, 0xcf, 0x3e, - 0xae, 0xf5, 0x82, 0x13, 0xa1, 0xa1, 0x5e, 0x2d, 0x91, 0x93, 0xf3, 0x00, 0xf2, 0xdd, 0xb2, 0x94, - 0x48, 0xc5, 0xcb, 0xe5, 0x1e, 0x94, 0x88, 0x4f, 0x18, 0xb1, 0xdc, 0x76, 0xc7, 0x72, 0x2d, 0xdf, - 0xbe, 0xc8, 0x98, 0x2d, 0xdf, 0x03, 0xca, 0x6d, 0x06, 0xce, 0x30, 0x97, 0x94, 0xa4, 0x29, 0x05, - 0x68, 0x07, 0xe6, 0x23, 0x57, 0xb3, 0x17, 0x1a, 0x48, 0x22, 0xf3, 0xd4, 0x28, 0xf8, 0x93, 0x19, - 0x58, 0x31, 0xb1, 0xf3, 0x79, 0x28, 0xa6, 0x0b, 0xc5, 0x77, 0x00, 0x64, 0xd5, 0xf3, 0x76, 0x7b, - 0x81, 0x68, 0xf0, 0xbe, 0x51, 0x90, 0x08, 0x2d, 0xca, 0x52, 0xf1, 0xf8, 0x7b, 0x1e, 0x16, 0xd3, - 0xf1, 0xf8, 0x3f, 0x7d, 0x47, 0xa1, 0xbd, 0xa4, 0x21, 0xcd, 0x8a, 0x86, 0xf4, 0xd5, 0x09, 0x0d, - 0x69, 0x2c, 0x89, 0x3f, 0xb9, 0x13, 0xfd, 0x3b, 0x0f, 0x73, 0x7b, 0x56, 0x68, 0x79, 0x14, 0xd9, - 0x63, 0xc3, 0xa8, 0xbc, 0xa3, 0xae, 0x8d, 0xa5, 0x69, 0x4b, 0x7d, 0x2c, 0x99, 0x30, 0x8b, 0x7e, - 0xf0, 0x9c, 0x59, 0xf4, 0x5b, 0xb0, 0xc4, 0xaf, 0xd1, 0xf1, 0x51, 0x25, 0xe9, 0x97, 0x9a, 0x6b, - 0x09, 0xca, 0xf9, 0x7d, 0x79, 0xcb, 0x8e, 0x6f, 0x69, 0x14, 0xbd, 0x09, 0x45, 0xae, 0x91, 0xb4, - 0x69, 0x6e, 0x7e, 0x35, 0xb9, 0xc7, 0xa6, 0x36, 0x0d, 0x13, 0x3c, 0xeb, 0x6c, 0x5b, 0x2e, 0xd0, - 0x1d, 0x40, 0x27, 0xf1, 0x87, 0x95, 0x76, 0xc2, 0x2a, 0xb7, 0xbf, 0x3e, 0x1a, 0xea, 0x6b, 0xd2, - 0x7e, 0x5c, 0xc7, 0x30, 0x57, 0x12, 0x61, 0x84, 0xf6, 0x35, 0x00, 0x7e, 0xae, 0xb6, 0x83, 0xfd, - 0xc0, 0x53, 0x17, 0xa3, 0x2b, 0xa3, 0xa1, 0xbe, 0x22, 0x51, 0x92, 0x3d, 0xc3, 0x2c, 0xf0, 0x45, - 0x8b, 0xff, 0x4e, 0x25, 0xf8, 0x2f, 0x35, 0x40, 0x49, 0xe7, 0x37, 0x31, 0xed, 0xf1, 0x0b, 0x1d, - 0x9f, 0xd5, 0x53, 0x13, 0xb5, 0xf6, 0x42, 0xb3, 0x7a, 0x02, 0x13, 0xcd, 0xea, 0xa9, 0xba, 0xf9, - 0x46, 0xd2, 0x2c, 0xf3, 0x2a, 0x9c, 0xea, 0x42, 0xd9, 0xb1, 0x28, 0x4e, 0xcd, 0xfb, 0x24, 0xb2, - 0x1e, 0xeb, 0x8e, 0x39, 0xe3, 0x4f, 0x1a, 0xac, 0x8d, 0x25, 0x56, 0xfc, 0xcc, 0x18, 0x50, 0x98, - 0xda, 0x14, 0xb4, 0x0d, 0xd4, 0xb3, 0x5f, 0x34, 0x5d, 0x57, 0xc2, 0xb1, 0x66, 0xfc, 0xe9, 0xb5, - 0xfd, 0x59, 0x11, 0x81, 0x3f, 0x6a, 0xb0, 0x9a, 0x76, 0x1f, 0x9f, 0xe7, 0x10, 0x16, 0xd3, 0xde, - 0xd5, 0x49, 0xbe, 0x3c, 0xc5, 0x49, 0xd4, 0x21, 0xce, 0xc1, 0xa0, 0xef, 0x26, 0xa5, 0x2c, 0xbf, - 0xc7, 0x7d, 0x7d, 0x5a, 0x6e, 0xa2, 0x27, 0xcc, 0x96, 0xf4, 0xac, 0x08, 0xd2, 0x7f, 0x35, 0x98, - 0xdd, 0x0b, 0x02, 0x17, 0x05, 0xb0, 0xe2, 0x07, 0xac, 0xcd, 0xb3, 0x0e, 0x3b, 0x6d, 0x75, 0x75, - 0x97, 0xad, 0x72, 0x6b, 0x3a, 0xca, 0xfe, 0x39, 0xd4, 0xc7, 0xa1, 0xcc, 0x92, 0x1f, 0xb0, 0xa6, - 0x90, 0x1c, 0xc8, 0x8b, 0xfd, 0x7b, 0x70, 0xe9, 0xbc, 0x33, 0xd9, 0x48, 0xdf, 0x99, 0xda, 0xd9, - 0x79, 0x98, 0xd1, 0x50, 0x5f, 0x4d, 0xaa, 0x29, 0x16, 0x1b, 0xe6, 0x62, 0x27, 0xe5, 0xfd, 0xd6, - 0x02, 0x8f, 0xe6, 0xbf, 0x1e, 0xeb, 0xda, 0xab, 0xbf, 0xd5, 0x00, 0x92, 0xef, 0x17, 0xe8, 0x2b, - 0xf0, 0x72, 0xf3, 0xed, 0xbb, 0xad, 0xf6, 0xfe, 0xc1, 0xe6, 0xc1, 0xe1, 0x7e, 0xfb, 0xf0, 0xee, - 0xfe, 0xde, 0xf6, 0xd6, 0xee, 0xed, 0xdd, 0xed, 0xd6, 0x72, 0xae, 0x52, 0x7a, 0xf0, 0xa8, 0x56, - 0x3c, 0xf4, 0x69, 0x0f, 0xdb, 0xe4, 0x98, 0x60, 0x07, 0xbd, 0x02, 0xab, 0xe7, 0xb5, 0xf9, 0x6a, - 0xbb, 0xb5, 0xac, 0x55, 0x16, 0x1f, 0x3c, 0xaa, 0x2d, 0xc8, 0x71, 0x0d, 0x3b, 0x68, 0x1d, 0xae, - 0x8c, 0xeb, 0xed, 0xde, 0xfd, 0xf6, 0x72, 0xbe, 0x72, 0xe9, 0xc1, 0xa3, 0x5a, 0x21, 0x9e, 0xeb, - 0x90, 0x01, 0x28, 0xad, 0xa9, 0xf0, 0x66, 0x2a, 0xf0, 0xe0, 0x51, 0x6d, 0x4e, 0x12, 0x58, 0x99, - 0x7d, 0xff, 0x17, 0xd5, 0x5c, 0xf3, 0x7b, 0x1f, 0x3e, 0xad, 0x6a, 0x4f, 0x9e, 0x56, 0xb5, 0xbf, - 0x3d, 0xad, 0x6a, 0x0f, 0x9f, 0x55, 0x73, 0x4f, 0x9e, 0x55, 0x73, 0x1f, 0x3d, 0xab, 0xe6, 0xde, - 0xfd, 0x66, 0x8a, 0x3b, 0x72, 0xcf, 0xed, 0xf3, 0xfb, 0x37, 0xf1, 0xed, 0x86, 0xcc, 0x1c, 0xc2, - 0x06, 0x37, 0x55, 0xd6, 0xdc, 0xf4, 0x02, 0xa7, 0xef, 0xe2, 0xc6, 0x59, 0xf4, 0xe5, 0x5c, 0x12, - 0xdb, 0x99, 0x13, 0x5d, 0xfb, 0xf5, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x18, 0xb4, 0x22, 0x5b, - 0x61, 0x17, 0x00, 0x00, + // 1913 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6c, 0x5b, 0x59, + 0x15, 0xf6, 0x73, 0xdc, 0xfc, 0x1c, 0x27, 0x71, 0x72, 0x9b, 0x76, 0x5c, 0xd3, 0xc6, 0xe6, 0x49, + 0x33, 0x4a, 0x0b, 0x75, 0x98, 0x0c, 0x9a, 0x81, 0x6e, 0x20, 0x8e, 0x53, 0x12, 0x4d, 0xe9, 0x44, + 0x2f, 0x3f, 0x03, 0x03, 0x92, 0x75, 0xfd, 0xde, 0x8d, 0x73, 0xc9, 0xfb, 0x71, 0xdf, 0xbd, 0xee, + 0xc4, 0x68, 0x16, 0x2c, 0x47, 0x95, 0x10, 0x85, 0xd5, 0x6c, 0x2a, 0x55, 0x62, 0x87, 0x90, 0x90, + 0x10, 0x62, 0xcf, 0x6e, 0x40, 0x42, 0xaa, 0x58, 0x8d, 0x10, 0x32, 0xa8, 0x15, 0x12, 0x62, 0x85, + 0xb2, 0x40, 0xec, 0x40, 0xf7, 0xe7, 0xfd, 0xe4, 0xb9, 0x33, 0xae, 0xa3, 0x59, 0x8c, 0xc4, 0x6c, + 0x12, 0xdf, 0x73, 0xcf, 0xf9, 0xce, 0x3b, 0xbf, 0xf7, 0xdc, 0x0b, 0xd7, 0x18, 0xc7, 0xc7, 0xd4, + 0xef, 0xac, 0xde, 0x7f, 0xb5, 0x4d, 0x38, 0x7e, 0x75, 0x55, 0xaf, 0xeb, 0xdd, 0x30, 0xe0, 0x01, + 0xba, 0xe6, 0xd2, 0x7b, 0x3d, 0xea, 0x44, 0xc4, 0xe8, 0xbf, 0x66, 0xae, 0x2c, 0x75, 0x82, 0x4e, + 0x20, 0x39, 0x57, 0xc5, 0x2f, 0x25, 0x54, 0xb9, 0xd2, 0x09, 0x82, 0x8e, 0x4b, 0x56, 0xe5, 0xaa, + 0xdd, 0x3b, 0x5c, 0xc5, 0x7e, 0x5f, 0x6f, 0x2d, 0x67, 0xb7, 0x9c, 0x5e, 0x88, 0x39, 0x0d, 0x7c, + 0xbd, 0x5f, 0xcd, 0xee, 0x73, 0xea, 0x11, 0xc6, 0xb1, 0xd7, 0x8d, 0xb0, 0xed, 0x80, 0x79, 0x01, + 0x6b, 0x29, 0xa5, 0x6a, 0x11, 0x61, 0xab, 0xd5, 0x6a, 0x1b, 0x33, 0x12, 0x9b, 0x63, 0x07, 0x34, + 0xc2, 0xbe, 0xca, 0x89, 0xef, 0x90, 0xd0, 0xa3, 0x3e, 0x5f, 0xe5, 0xfd, 0x2e, 0x61, 0xea, 0xaf, + 0xda, 0x35, 0x1f, 0x1a, 0x30, 0xbf, 0x45, 0x19, 0x0f, 0x42, 0x6a, 0x63, 0x77, 0xdb, 0x3f, 0x0c, + 0xd0, 0xeb, 0x30, 0x79, 0x44, 0xb0, 0x43, 0xc2, 0xb2, 0x51, 0x33, 0x56, 0x8a, 0x6b, 0xe5, 0x7a, + 0x82, 0x50, 0x57, 0xb2, 0x5b, 0x72, 0xbf, 0x51, 0xf8, 0x70, 0x50, 0xcd, 0x59, 0x9a, 0x1b, 0xdd, + 0x86, 0xc9, 0xfb, 0xd8, 0x65, 0x84, 0x97, 0xf3, 0xb5, 0x89, 0x95, 0xe2, 0xda, 0x4a, 0xfd, 0x13, + 0xbd, 0x58, 0x3f, 0xc0, 0x2e, 0x75, 0x30, 0x0f, 0x62, 0x1c, 0x25, 0x6d, 0xfe, 0x2a, 0x0f, 0xa5, + 0x8d, 0xc0, 0xf3, 0x28, 0x63, 0x34, 0xf0, 0x2d, 0xcc, 0x09, 0x43, 0x0d, 0x28, 0x84, 0x98, 0x13, + 0xf9, 0x45, 0x33, 0x8d, 0xba, 0xe0, 0xff, 0xf3, 0xa0, 0xfa, 0x4a, 0x87, 0xf2, 0xa3, 0x5e, 0xbb, + 0x6e, 0x07, 0x9e, 0xf6, 0x89, 0xfe, 0x77, 0x93, 0x39, 0xc7, 0xda, 0xcc, 0x26, 0xb1, 0x2d, 0x29, + 0x8b, 0xbe, 0x0f, 0xd3, 0x1e, 0x3e, 0x69, 0x49, 0x9c, 0xbc, 0xc4, 0x59, 0x1f, 0x0f, 0xe7, 0x74, + 0x50, 0x2d, 0xf5, 0xb1, 0xe7, 0xde, 0x32, 0x23, 0x1c, 0xd3, 0x9a, 0xf2, 0xf0, 0x89, 0xf8, 0x44, + 0xd4, 0x85, 0x92, 0xa0, 0xda, 0x47, 0xd8, 0xef, 0x10, 0xa5, 0x64, 0x42, 0x2a, 0xd9, 0x1a, 0x5b, + 0xc9, 0xe5, 0x44, 0x49, 0x0a, 0xce, 0xb4, 0xe6, 0x3c, 0x7c, 0xb2, 0x21, 0x09, 0x42, 0xe3, 0xad, + 0xe9, 0x0f, 0x1e, 0x57, 0x73, 0xff, 0x78, 0x5c, 0x35, 0xcc, 0x8f, 0x0c, 0x80, 0xc4, 0x63, 0xc8, + 0x86, 0x05, 0x3b, 0x5e, 0x49, 0x59, 0xa6, 0x43, 0x59, 0x1f, 0x11, 0x92, 0x8c, 0xdb, 0x1b, 0xd3, + 0xe2, 0xdb, 0x9f, 0x0c, 0xaa, 0x86, 0x55, 0xb2, 0x33, 0x11, 0xf9, 0x1e, 0x14, 0x7b, 0x5d, 0x07, + 0x73, 0xd2, 0x12, 0xb9, 0x2a, 0x1d, 0x5a, 0x5c, 0xab, 0xd4, 0x55, 0x22, 0xd7, 0xa3, 0x44, 0xae, + 0xef, 0x45, 0x89, 0xdc, 0x58, 0x16, 0x58, 0xa7, 0x83, 0x2a, 0x52, 0xd6, 0xa5, 0x84, 0xcd, 0x87, + 0x7f, 0xad, 0x1a, 0x16, 0x28, 0x8a, 0x10, 0x48, 0x99, 0xf6, 0x7b, 0x03, 0x8a, 0x4d, 0xc2, 0xec, + 0x90, 0x76, 0x45, 0xbd, 0xa0, 0x32, 0x4c, 0x79, 0x81, 0x4f, 0x8f, 0x75, 0x76, 0xce, 0x58, 0xd1, + 0x12, 0x55, 0x60, 0x9a, 0x3a, 0xc4, 0xe7, 0x94, 0xf7, 0x55, 0x78, 0xad, 0x78, 0x2d, 0xa4, 0xde, + 0x25, 0x6d, 0x46, 0xa3, 0xa0, 0x58, 0xd1, 0x12, 0xdd, 0x86, 0x05, 0x46, 0xec, 0x5e, 0x48, 0x79, + 0xbf, 0x65, 0x07, 0x3e, 0xc7, 0x36, 0x2f, 0x17, 0x64, 0xdc, 0xbe, 0x70, 0x3a, 0xa8, 0xbe, 0xa4, + 0xbe, 0x35, 0xcb, 0x61, 0x5a, 0xa5, 0x88, 0xb4, 0xa1, 0x28, 0x42, 0x83, 0x43, 0x38, 0xa6, 0x2e, + 0x2b, 0x5f, 0x50, 0x1a, 0xf4, 0x32, 0x65, 0xcb, 0xef, 0xa6, 0x60, 0x26, 0x4e, 0x7a, 0xa1, 0x39, + 0xe8, 0x92, 0x50, 0xfc, 0x6e, 0x61, 0xc7, 0x09, 0x09, 0x63, 0x3a, 0xbd, 0x53, 0x9a, 0xb3, 0x1c, + 0xa6, 0x55, 0x8a, 0x48, 0xeb, 0x8a, 0x82, 0xb8, 0x88, 0xb6, 0xcf, 0x88, 0xcf, 0x7a, 0xac, 0xd5, + 0xed, 0xb5, 0x8f, 0x49, 0x5f, 0x47, 0x63, 0x69, 0x28, 0x1a, 0xeb, 0x7e, 0xbf, 0xf1, 0x5a, 0x82, + 0x9e, 0x95, 0x33, 0xff, 0xf0, 0x9b, 0x9b, 0x4b, 0xba, 0xb9, 0xd8, 0x61, 0xbf, 0xcb, 0x83, 0xfa, + 0x4e, 0xaf, 0xfd, 0x26, 0xe9, 0x8b, 0xf0, 0x6b, 0xd6, 0x1d, 0xc9, 0x89, 0x2e, 0xc3, 0xe4, 0x0f, + 0x30, 0x75, 0x89, 0x23, 0x1d, 0x3a, 0x6d, 0xe9, 0x15, 0x5a, 0x87, 0x49, 0xc6, 0x31, 0xef, 0x31, + 0xe9, 0xc5, 0xf9, 0xb5, 0xeb, 0x23, 0x32, 0xae, 0x11, 0xf8, 0xce, 0xae, 0x14, 0xb0, 0xb4, 0xa0, + 0xe8, 0x23, 0x3c, 0x38, 0x26, 0xbe, 0xf6, 0xe4, 0x58, 0xd5, 0xbe, 0xed, 0x73, 0x4b, 0x4b, 0x0b, + 0xc7, 0x38, 0xc4, 0x25, 0x1d, 0xe9, 0x3f, 0x76, 0x84, 0x43, 0xc2, 0xca, 0x93, 0x12, 0x71, 0x7b, + 0xec, 0x92, 0xd4, 0x0e, 0xcb, 0xe2, 0x99, 0x56, 0x29, 0x26, 0xed, 0x4a, 0x0a, 0xb2, 0xa0, 0xe8, + 0x24, 0xf9, 0x5a, 0x9e, 0x92, 0x91, 0xb8, 0x31, 0xc2, 0x0b, 0xa9, 0x0c, 0xd7, 0xcd, 0x30, 0x0d, + 0x22, 0x52, 0xa5, 0xe7, 0xb7, 0x03, 0xdf, 0xa1, 0x7e, 0xa7, 0x75, 0x44, 0x68, 0xe7, 0x88, 0x97, + 0xa7, 0x6b, 0xc6, 0xca, 0x44, 0x3a, 0x55, 0xb2, 0x1c, 0xa6, 0x55, 0x8a, 0x49, 0x5b, 0x92, 0x82, + 0x1c, 0x98, 0x4f, 0xb8, 0x64, 0xd9, 0xce, 0x8c, 0x2c, 0xdb, 0x2f, 0xea, 0xb2, 0xbd, 0x94, 0xd5, + 0x92, 0x54, 0xee, 0x5c, 0x4c, 0x14, 0x62, 0xe8, 0x2d, 0x80, 0xa4, 0x59, 0x94, 0x41, 0x6a, 0xb8, + 0xfe, 0xc2, 0x8d, 0x47, 0xdb, 0x9f, 0x82, 0x40, 0xef, 0xc1, 0x45, 0x8f, 0xfa, 0x2d, 0x46, 0xdc, + 0xc3, 0x96, 0x76, 0xb7, 0x40, 0x2e, 0xca, 0x58, 0xde, 0x19, 0x2f, 0x3b, 0x4e, 0x07, 0xd5, 0x8a, + 0x6e, 0xaf, 0xc3, 0x90, 0xa6, 0xb5, 0xe8, 0x51, 0x7f, 0x97, 0xb8, 0x87, 0xcd, 0x98, 0x76, 0x6b, + 0xf6, 0xfd, 0xc7, 0xd5, 0x9c, 0xae, 0xe1, 0x9c, 0xf9, 0x3a, 0xcc, 0x1e, 0x60, 0x57, 0xd7, 0x1e, + 0x61, 0xe8, 0x2a, 0xcc, 0xe0, 0x68, 0x51, 0x36, 0x6a, 0x13, 0x2b, 0x33, 0x56, 0x42, 0x50, 0xb5, + 0xff, 0xa3, 0xbf, 0xd4, 0x0c, 0xf3, 0x97, 0x06, 0x4c, 0x36, 0x0f, 0x76, 0x30, 0x0d, 0xd1, 0x36, + 0x2c, 0x26, 0x79, 0x74, 0xb6, 0xf2, 0xaf, 0x9e, 0x0e, 0xaa, 0xe5, 0x6c, 0xaa, 0xc5, 0xa5, 0x9f, + 0xa4, 0x73, 0x54, 0xfb, 0xdb, 0xb0, 0x78, 0x3f, 0x6a, 0x28, 0x31, 0x54, 0x3e, 0x0b, 0x35, 0xc4, + 0x62, 0x5a, 0x0b, 0x31, 0x4d, 0x43, 0x65, 0xcc, 0xbc, 0x03, 0x53, 0xea, 0x6b, 0x19, 0x5a, 0x87, + 0x0b, 0x5d, 0xf1, 0x43, 0x5a, 0x57, 0x5c, 0x7b, 0x79, 0x54, 0x2a, 0x4b, 0x31, 0x1d, 0x45, 0x25, + 0x69, 0xfe, 0x34, 0x0f, 0xd0, 0x3c, 0x38, 0xd8, 0x0b, 0x69, 0xd7, 0x25, 0xfc, 0xd3, 0x74, 0xc0, + 0x1e, 0x5c, 0x4a, 0xac, 0x63, 0xa1, 0x9d, 0x71, 0x42, 0xed, 0x74, 0x50, 0xbd, 0x9a, 0x75, 0x42, + 0x8a, 0xcd, 0xb4, 0x2e, 0xc6, 0xf4, 0xdd, 0xd0, 0x7e, 0x2e, 0xaa, 0xc3, 0x78, 0x8c, 0x3a, 0xf1, + 0xf1, 0xa8, 0x29, 0xb6, 0x34, 0x6a, 0x93, 0xf1, 0xe7, 0x7b, 0xf8, 0x1d, 0x28, 0x26, 0x2e, 0x61, + 0xe8, 0x4d, 0x98, 0xe6, 0xfa, 0xb7, 0x76, 0xf4, 0xf5, 0x91, 0x8e, 0x8e, 0xa4, 0xb5, 0xb3, 0x63, + 0x00, 0xf3, 0x3f, 0x06, 0x40, 0x92, 0xc1, 0x9f, 0xcd, 0x84, 0x13, 0x6d, 0x5e, 0x37, 0xe5, 0x89, + 0x73, 0x0d, 0x75, 0x5a, 0x3a, 0xe3, 0xd6, 0x9f, 0xe5, 0xe1, 0xe2, 0x7e, 0xd4, 0x8e, 0x3e, 0xf3, + 0x3e, 0x78, 0x1b, 0xa6, 0x88, 0xcf, 0x43, 0x2a, 0x9d, 0x20, 0x82, 0xfe, 0xc6, 0x88, 0xa0, 0x3f, + 0xc7, 0xb4, 0x4d, 0x9f, 0x87, 0x7d, 0x9d, 0x02, 0x11, 0x5a, 0xc6, 0x29, 0x3f, 0x99, 0x80, 0xf2, + 0xc7, 0x49, 0xa2, 0x0d, 0x28, 0xd9, 0x21, 0x91, 0x84, 0xe8, 0x6c, 0x31, 0xe4, 0xd9, 0x52, 0x49, + 0x46, 0xd1, 0x0c, 0x83, 0x69, 0xcd, 0x47, 0x14, 0x7d, 0xb2, 0x74, 0x40, 0x0c, 0x88, 0x22, 0xfb, + 0x04, 0xd7, 0x0b, 0x4e, 0x84, 0xa6, 0x3e, 0x5a, 0x22, 0x25, 0x67, 0x01, 0xd4, 0xd9, 0x32, 0x9f, + 0x50, 0xe5, 0xe1, 0x72, 0x0f, 0x4a, 0xd4, 0xa7, 0x9c, 0x62, 0xb7, 0xd5, 0xc6, 0x2e, 0xf6, 0xed, + 0xf3, 0x8c, 0xd9, 0xea, 0x1c, 0xd0, 0x6a, 0x33, 0x70, 0xa6, 0x35, 0xaf, 0x29, 0x0d, 0x45, 0x40, + 0x5b, 0x30, 0x15, 0xa9, 0x2a, 0x9c, 0x6b, 0x20, 0x89, 0xc4, 0x53, 0xa3, 0xe0, 0x8f, 0x27, 0x60, + 0xd1, 0x22, 0xce, 0xe7, 0xa1, 0x18, 0x2f, 0x14, 0xdf, 0x06, 0x50, 0x55, 0x2f, 0xda, 0xed, 0x39, + 0xa2, 0x21, 0xfa, 0xc6, 0x8c, 0x42, 0x68, 0x32, 0x9e, 0x8a, 0xc7, 0xdf, 0xf3, 0x30, 0x9b, 0x8e, + 0xc7, 0xff, 0xe9, 0x19, 0x85, 0x76, 0x92, 0x86, 0x54, 0x90, 0x0d, 0xe9, 0x2b, 0x23, 0x1a, 0xd2, + 0x50, 0x12, 0x7f, 0x72, 0x27, 0xfa, 0x77, 0x1e, 0x26, 0x77, 0x70, 0x88, 0x3d, 0x86, 0xec, 0xa1, + 0x61, 0x54, 0xdd, 0x51, 0xaf, 0x0c, 0xa5, 0x69, 0x53, 0x3f, 0x96, 0x8c, 0x98, 0x45, 0x3f, 0x78, + 0xce, 0x2c, 0xfa, 0x4d, 0x98, 0x17, 0xd7, 0xe8, 0xd8, 0x54, 0xe5, 0xf4, 0xb9, 0xc6, 0x95, 0x04, + 0xe5, 0xec, 0xbe, 0xba, 0x65, 0xc7, 0xb7, 0x34, 0x86, 0xde, 0x80, 0xa2, 0xe0, 0x48, 0xda, 0xb4, + 0x10, 0xbf, 0x9c, 0xdc, 0x63, 0x53, 0x9b, 0xa6, 0x05, 0x1e, 0x3e, 0xd9, 0x54, 0x0b, 0x74, 0x07, + 0xd0, 0x51, 0xfc, 0xb0, 0xd2, 0x4a, 0xbc, 0x2a, 0xe4, 0xaf, 0x9d, 0x0e, 0xaa, 0x57, 0x94, 0xfc, + 0x30, 0x8f, 0x69, 0x2d, 0x26, 0xc4, 0x08, 0xed, 0xab, 0x00, 0xc2, 0xae, 0x96, 0x43, 0xfc, 0xc0, + 0xd3, 0x17, 0xa3, 0x4b, 0xa7, 0x83, 0xea, 0xa2, 0x42, 0x49, 0xf6, 0x4c, 0x6b, 0x46, 0x2c, 0x9a, + 0xe2, 0x77, 0x2a, 0xc1, 0x7f, 0x61, 0x00, 0x4a, 0x3a, 0xbf, 0x45, 0x58, 0x57, 0x5c, 0xe8, 0xc4, + 0xac, 0x9e, 0x9a, 0xa8, 0x8d, 0x17, 0x9a, 0xd5, 0x13, 0x98, 0x68, 0x56, 0x4f, 0xd5, 0xcd, 0xd7, + 0x93, 0x66, 0x99, 0xd7, 0xe1, 0xd4, 0x17, 0xca, 0x36, 0x66, 0x24, 0x35, 0xef, 0xd3, 0x48, 0x7a, + 0xa8, 0x3b, 0xe6, 0xcc, 0x3f, 0x19, 0x70, 0x65, 0x28, 0xb1, 0xe2, 0x6f, 0x26, 0x80, 0xc2, 0xd4, + 0xa6, 0x74, 0x5b, 0x5f, 0x7f, 0xfb, 0x79, 0xd3, 0x75, 0x31, 0x1c, 0x6a, 0xc6, 0x9f, 0x5e, 0xdb, + 0x2f, 0xc8, 0x08, 0xfc, 0xd1, 0x80, 0xa5, 0xb4, 0xfa, 0xd8, 0x9e, 0x7d, 0x98, 0x4d, 0x6b, 0xd7, + 0x96, 0x7c, 0x69, 0x0c, 0x4b, 0xb4, 0x11, 0x67, 0x60, 0xd0, 0x77, 0x92, 0x52, 0x56, 0xef, 0x71, + 0x5f, 0x1b, 0xd7, 0x37, 0xd1, 0x17, 0x66, 0x4b, 0xba, 0x20, 0x83, 0xf4, 0x5f, 0x03, 0x0a, 0x3b, + 0x41, 0xe0, 0xa2, 0x00, 0x16, 0xfd, 0x80, 0xb7, 0x44, 0xd6, 0x11, 0xa7, 0xa5, 0xaf, 0xee, 0xaa, + 0x55, 0x6e, 0x8c, 0xe7, 0xb2, 0x7f, 0x0e, 0xaa, 0xc3, 0x50, 0x56, 0xc9, 0x0f, 0x78, 0x43, 0x52, + 0xf6, 0xd4, 0xc5, 0xfe, 0x3d, 0x98, 0x3b, 0xab, 0x4c, 0x35, 0xd2, 0xb7, 0xc7, 0x56, 0x76, 0x16, + 0xe6, 0x74, 0x50, 0x5d, 0x4a, 0xaa, 0x29, 0x26, 0x9b, 0xd6, 0x6c, 0x3b, 0xa5, 0xfd, 0xd6, 0xb4, + 0x88, 0xe6, 0xbf, 0x44, 0x44, 0x7f, 0x6d, 0xc0, 0x45, 0x49, 0xa4, 0x3f, 0x24, 0xf2, 0xf6, 0x6f, + 0x11, 0x3b, 0x08, 0x1d, 0x34, 0x0f, 0x79, 0xea, 0x48, 0x0f, 0x14, 0xac, 0x3c, 0x75, 0xd0, 0x12, + 0x5c, 0x08, 0xde, 0xf5, 0x49, 0xa8, 0x9f, 0xa5, 0xd4, 0x02, 0xdd, 0x80, 0x45, 0x79, 0x12, 0x29, + 0x35, 0xba, 0xb0, 0xd5, 0xeb, 0x54, 0x49, 0x6e, 0x48, 0x68, 0x59, 0xc7, 0xe8, 0x65, 0x98, 0xf7, + 0x02, 0xa7, 0xe7, 0x92, 0x16, 0xb6, 0xed, 0xa0, 0xe7, 0xeb, 0xb3, 0xcf, 0x9a, 0x53, 0xd4, 0x75, + 0x45, 0x14, 0x97, 0xd1, 0xb8, 0x93, 0xe9, 0x67, 0xa8, 0x84, 0xa0, 0xd2, 0xf0, 0xc6, 0x6f, 0x0d, + 0x80, 0xe4, 0xd1, 0x05, 0x7d, 0x19, 0x5e, 0x6a, 0xbc, 0x75, 0xb7, 0xd9, 0xda, 0xdd, 0x5b, 0xdf, + 0xdb, 0xdf, 0x6d, 0xed, 0xdf, 0xdd, 0xdd, 0xd9, 0xdc, 0xd8, 0xbe, 0xbd, 0xbd, 0xd9, 0x5c, 0xc8, + 0x55, 0x4a, 0x0f, 0x1e, 0xd5, 0x8a, 0xfb, 0x3e, 0xeb, 0x12, 0x9b, 0x1e, 0x52, 0xe2, 0xa0, 0x57, + 0x60, 0xe9, 0x2c, 0xb7, 0x58, 0x6d, 0x36, 0x17, 0x8c, 0xca, 0xec, 0x83, 0x47, 0xb5, 0x69, 0x35, + 0x63, 0x12, 0x07, 0xad, 0xc0, 0xa5, 0x61, 0xbe, 0xed, 0xbb, 0xdf, 0x5a, 0xc8, 0x57, 0xe6, 0x1e, + 0x3c, 0xaa, 0xcd, 0xc4, 0xc3, 0x28, 0x32, 0x01, 0xa5, 0x39, 0x35, 0xde, 0x44, 0x05, 0x1e, 0x3c, + 0xaa, 0x4d, 0xaa, 0xa8, 0x57, 0x0a, 0xef, 0xff, 0x7c, 0x39, 0xd7, 0xf8, 0xee, 0x87, 0x4f, 0x97, + 0x8d, 0x27, 0x4f, 0x97, 0x8d, 0xbf, 0x3d, 0x5d, 0x36, 0x1e, 0x3e, 0x5b, 0xce, 0x3d, 0x79, 0xb6, + 0x9c, 0xfb, 0xe8, 0xd9, 0x72, 0xee, 0x9d, 0x6f, 0xa4, 0x02, 0x4e, 0xef, 0xb9, 0x3d, 0x46, 0x03, + 0x9f, 0xfa, 0xf6, 0xaa, 0x4a, 0x77, 0xca, 0xfb, 0x37, 0x75, 0xaa, 0xdf, 0x54, 0xee, 0x5a, 0x3d, + 0x89, 0x9e, 0xfb, 0x55, 0x36, 0xb4, 0x27, 0xe5, 0x51, 0xf3, 0xda, 0xff, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x7e, 0x94, 0xa0, 0x1f, 0x16, 0x18, 0x00, 0x00, } func (this *Pool) Description() (desc *github_com_gogo_protobuf_protoc_gen_gogo_descriptor.FileDescriptorSet) { @@ -1261,624 +1343,641 @@ 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{ - // 9870 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x7d, 0x74, 0x1c, 0xd7, - 0x75, 0x1f, 0x66, 0x77, 0x01, 0xec, 0x5e, 0x2c, 0x80, 0xc5, 0x03, 0x48, 0x2e, 0x97, 0x24, 0x00, - 0x8d, 0xbe, 0x28, 0x4a, 0x02, 0x25, 0x8a, 0xa4, 0xa4, 0xa5, 0x25, 0x7a, 0x17, 0x58, 0x82, 0xa0, - 0xf0, 0xa5, 0x01, 0x40, 0xc9, 0x4a, 0x73, 0xb6, 0x83, 0xdd, 0x87, 0xc5, 0x08, 0xbb, 0x33, 0xa3, - 0x99, 0x59, 0x12, 0x50, 0xec, 0x46, 0xb1, 0xf3, 0xe1, 0x28, 0xc7, 0xb5, 0x1d, 0xf7, 0xd4, 0x8e, - 0x6c, 0xba, 0x76, 0x9c, 0xd6, 0xa9, 0x9a, 0xe6, 0xc3, 0x71, 0xdc, 0xa6, 0xe9, 0x1f, 0x76, 0x7b, - 0xd2, 0x3a, 0x3e, 0xa7, 0xa9, 0x93, 0x9e, 0xd6, 0x3e, 0x69, 0x4b, 0xdb, 0xb2, 0x9b, 0xba, 0xae, - 0xdb, 0x38, 0xac, 0xdd, 0x93, 0x73, 0x7c, 0xfa, 0x71, 0xde, 0xd7, 0x7c, 0xed, 0x2e, 0x66, 0x17, - 0x26, 0x65, 0xa7, 0xe9, 0x5f, 0xd8, 0x77, 0xe7, 0xde, 0xdf, 0xbb, 0xef, 0xbe, 0xfb, 0xee, 0xbb, - 0xef, 0xcd, 0x7b, 0x03, 0xf8, 0xe7, 0x17, 0x60, 0xba, 0x66, 0x18, 0xb5, 0x3a, 0x3e, 0x6d, 0x5a, - 0x86, 0x63, 0x6c, 0x36, 0xb7, 0x4e, 0x57, 0xb1, 0x5d, 0xb1, 0x34, 0xd3, 0x31, 0xac, 0x19, 0x4a, - 0x43, 0xa3, 0x8c, 0x63, 0x46, 0x70, 0xc8, 0x4b, 0x30, 0x76, 0x49, 0xab, 0xe3, 0x39, 0x97, 0x71, - 0x0d, 0x3b, 0xe8, 0x09, 0x48, 0x6c, 0x69, 0x75, 0x9c, 0x95, 0xa6, 0xe3, 0x27, 0x87, 0xce, 0xdc, - 0x33, 0x13, 0x12, 0x9a, 0x09, 0x4a, 0xac, 0x12, 0xb2, 0x42, 0x25, 0xe4, 0x6f, 0x24, 0x60, 0xbc, - 0xcd, 0x53, 0x84, 0x20, 0xa1, 0xab, 0x0d, 0x82, 0x28, 0x9d, 0x4c, 0x29, 0xf4, 0x37, 0xca, 0xc2, - 0xa0, 0xa9, 0x56, 0x76, 0xd4, 0x1a, 0xce, 0xc6, 0x28, 0x59, 0x14, 0xd1, 0x24, 0x40, 0x15, 0x9b, - 0x58, 0xaf, 0x62, 0xbd, 0xb2, 0x97, 0x8d, 0x4f, 0xc7, 0x4f, 0xa6, 0x14, 0x1f, 0x05, 0x3d, 0x08, - 0x63, 0x66, 0x73, 0xb3, 0xae, 0x55, 0xca, 0x3e, 0x36, 0x98, 0x8e, 0x9f, 0xec, 0x57, 0x32, 0xec, - 0xc1, 0x9c, 0xc7, 0x7c, 0x3f, 0x8c, 0x5e, 0xc7, 0xea, 0x8e, 0x9f, 0x75, 0x88, 0xb2, 0x8e, 0x10, - 0xb2, 0x8f, 0x71, 0x16, 0xd2, 0x0d, 0x6c, 0xdb, 0x6a, 0x0d, 0x97, 0x9d, 0x3d, 0x13, 0x67, 0x13, - 0xb4, 0xf5, 0xd3, 0x2d, 0xad, 0x0f, 0xb7, 0x7c, 0x88, 0x4b, 0xad, 0xef, 0x99, 0x18, 0x15, 0x20, - 0x85, 0xf5, 0x66, 0x83, 0x21, 0xf4, 0x77, 0xb0, 0x5f, 0x49, 0x6f, 0x36, 0xc2, 0x28, 0x49, 0x22, - 0xc6, 0x21, 0x06, 0x6d, 0x6c, 0x5d, 0xd3, 0x2a, 0x38, 0x3b, 0x40, 0x01, 0xee, 0x6f, 0x01, 0x58, - 0x63, 0xcf, 0xc3, 0x18, 0x42, 0x0e, 0xcd, 0x42, 0x0a, 0xef, 0x3a, 0x58, 0xb7, 0x35, 0x43, 0xcf, - 0x0e, 0x52, 0x90, 0x7b, 0xdb, 0xf4, 0x22, 0xae, 0x57, 0xc3, 0x10, 0x9e, 0x1c, 0x3a, 0x0f, 0x83, - 0x86, 0xe9, 0x68, 0x86, 0x6e, 0x67, 0x93, 0xd3, 0xd2, 0xc9, 0xa1, 0x33, 0xc7, 0xdb, 0x3a, 0xc2, - 0x0a, 0xe3, 0x51, 0x04, 0x33, 0x5a, 0x80, 0x8c, 0x6d, 0x34, 0xad, 0x0a, 0x2e, 0x57, 0x8c, 0x2a, - 0x2e, 0x6b, 0xfa, 0x96, 0x91, 0x4d, 0x51, 0x80, 0xa9, 0xd6, 0x86, 0x50, 0xc6, 0x59, 0xa3, 0x8a, - 0x17, 0xf4, 0x2d, 0x43, 0x19, 0xb1, 0x03, 0x65, 0x74, 0x18, 0x06, 0xec, 0x3d, 0xdd, 0x51, 0x77, - 0xb3, 0x69, 0xea, 0x21, 0xbc, 0x24, 0xff, 0xee, 0x00, 0x8c, 0x76, 0xe3, 0x62, 0x17, 0xa0, 0x7f, - 0x8b, 0xb4, 0x32, 0x1b, 0xeb, 0xc5, 0x06, 0x4c, 0x26, 0x68, 0xc4, 0x81, 0x03, 0x1a, 0xb1, 0x00, - 0x43, 0x3a, 0xb6, 0x1d, 0x5c, 0x65, 0x1e, 0x11, 0xef, 0xd2, 0xa7, 0x80, 0x09, 0xb5, 0xba, 0x54, - 0xe2, 0x40, 0x2e, 0xf5, 0x3c, 0x8c, 0xba, 0x2a, 0x95, 0x2d, 0x55, 0xaf, 0x09, 0xdf, 0x3c, 0x1d, - 0xa5, 0xc9, 0x4c, 0x49, 0xc8, 0x29, 0x44, 0x4c, 0x19, 0xc1, 0x81, 0x32, 0x9a, 0x03, 0x30, 0x74, - 0x6c, 0x6c, 0x95, 0xab, 0xb8, 0x52, 0xcf, 0x26, 0x3b, 0x58, 0x69, 0x85, 0xb0, 0xb4, 0x58, 0xc9, - 0x60, 0xd4, 0x4a, 0x1d, 0x3d, 0xe9, 0xb9, 0xda, 0x60, 0x07, 0x4f, 0x59, 0x62, 0x83, 0xac, 0xc5, - 0xdb, 0x36, 0x60, 0xc4, 0xc2, 0xc4, 0xef, 0x71, 0x95, 0xb7, 0x2c, 0x45, 0x95, 0x98, 0x89, 0x6c, - 0x99, 0xc2, 0xc5, 0x58, 0xc3, 0x86, 0x2d, 0x7f, 0x11, 0xdd, 0x0d, 0x2e, 0xa1, 0x4c, 0xdd, 0x0a, - 0x68, 0x14, 0x4a, 0x0b, 0xe2, 0xb2, 0xda, 0xc0, 0xb9, 0x97, 0x61, 0x24, 0x68, 0x1e, 0x34, 0x01, - 0xfd, 0xb6, 0xa3, 0x5a, 0x0e, 0xf5, 0xc2, 0x7e, 0x85, 0x15, 0x50, 0x06, 0xe2, 0x58, 0xaf, 0xd2, - 0x28, 0xd7, 0xaf, 0x90, 0x9f, 0xe8, 0xad, 0x5e, 0x83, 0xe3, 0xb4, 0xc1, 0xf7, 0xb5, 0xf6, 0x68, - 0x00, 0x39, 0xdc, 0xee, 0xdc, 0xe3, 0x30, 0x1c, 0x68, 0x40, 0xb7, 0x55, 0xcb, 0x6f, 0x87, 0x43, - 0x6d, 0xa1, 0xd1, 0xf3, 0x30, 0xd1, 0xd4, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, 0xe2, 0xb1, 0xac, - 0xaa, 0xec, 0x7f, 0x1e, 0xec, 0xe0, 0x73, 0x1b, 0x7e, 0x6e, 0x86, 0xa2, 0x8c, 0x37, 0x5b, 0x89, - 0xa7, 0x52, 0xc9, 0x6f, 0x0e, 0x66, 0x5e, 0x79, 0xe5, 0x95, 0x57, 0x62, 0xf2, 0xe7, 0x06, 0x60, - 0xa2, 0xdd, 0x98, 0x69, 0x3b, 0x7c, 0x0f, 0xc3, 0x80, 0xde, 0x6c, 0x6c, 0x62, 0x8b, 0x1a, 0xa9, - 0x5f, 0xe1, 0x25, 0x54, 0x80, 0xfe, 0xba, 0xba, 0x89, 0xeb, 0xd9, 0xc4, 0xb4, 0x74, 0x72, 0xe4, - 0xcc, 0x83, 0x5d, 0x8d, 0xca, 0x99, 0x45, 0x22, 0xa2, 0x30, 0x49, 0xf4, 0x34, 0x24, 0x78, 0x88, - 0x26, 0x08, 0xa7, 0xba, 0x43, 0x20, 0x63, 0x49, 0xa1, 0x72, 0xe8, 0x18, 0xa4, 0xc8, 0x5f, 0xe6, - 0x1b, 0x03, 0x54, 0xe7, 0x24, 0x21, 0x10, 0xbf, 0x40, 0x39, 0x48, 0xd2, 0x61, 0x52, 0xc5, 0x62, - 0x6a, 0x73, 0xcb, 0xc4, 0xb1, 0xaa, 0x78, 0x4b, 0x6d, 0xd6, 0x9d, 0xf2, 0x35, 0xb5, 0xde, 0xc4, - 0xd4, 0xe1, 0x53, 0x4a, 0x9a, 0x13, 0xaf, 0x12, 0x1a, 0x9a, 0x82, 0x21, 0x36, 0xaa, 0x34, 0xbd, - 0x8a, 0x77, 0x69, 0xf4, 0xec, 0x57, 0xd8, 0x40, 0x5b, 0x20, 0x14, 0x52, 0xfd, 0x8b, 0xb6, 0xa1, - 0x0b, 0xd7, 0xa4, 0x55, 0x10, 0x02, 0xad, 0xfe, 0xf1, 0x70, 0xe0, 0x3e, 0xd1, 0xbe, 0x79, 0x2d, - 0x63, 0xe9, 0x7e, 0x18, 0xa5, 0x1c, 0x8f, 0xf1, 0xae, 0x57, 0xeb, 0xd9, 0xb1, 0x69, 0xe9, 0x64, - 0x52, 0x19, 0x61, 0xe4, 0x15, 0x4e, 0x95, 0x3f, 0x13, 0x83, 0x04, 0x0d, 0x2c, 0xa3, 0x30, 0xb4, - 0xfe, 0xb6, 0xd5, 0x52, 0x79, 0x6e, 0x65, 0xa3, 0xb8, 0x58, 0xca, 0x48, 0x68, 0x04, 0x80, 0x12, - 0x2e, 0x2d, 0xae, 0x14, 0xd6, 0x33, 0x31, 0xb7, 0xbc, 0xb0, 0xbc, 0x7e, 0xfe, 0x6c, 0x26, 0xee, - 0x0a, 0x6c, 0x30, 0x42, 0xc2, 0xcf, 0xf0, 0xd8, 0x99, 0x4c, 0x3f, 0xca, 0x40, 0x9a, 0x01, 0x2c, - 0x3c, 0x5f, 0x9a, 0x3b, 0x7f, 0x36, 0x33, 0x10, 0xa4, 0x3c, 0x76, 0x26, 0x33, 0x88, 0x86, 0x21, - 0x45, 0x29, 0xc5, 0x95, 0x95, 0xc5, 0x4c, 0xd2, 0xc5, 0x5c, 0x5b, 0x57, 0x16, 0x96, 0xe7, 0x33, - 0x29, 0x17, 0x73, 0x5e, 0x59, 0xd9, 0x58, 0xcd, 0x80, 0x8b, 0xb0, 0x54, 0x5a, 0x5b, 0x2b, 0xcc, - 0x97, 0x32, 0x43, 0x2e, 0x47, 0xf1, 0x6d, 0xeb, 0xa5, 0xb5, 0x4c, 0x3a, 0xa0, 0xd6, 0x63, 0x67, - 0x32, 0xc3, 0x6e, 0x15, 0xa5, 0xe5, 0x8d, 0xa5, 0xcc, 0x08, 0x1a, 0x83, 0x61, 0x56, 0x85, 0x50, - 0x62, 0x34, 0x44, 0x3a, 0x7f, 0x36, 0x93, 0xf1, 0x14, 0x61, 0x28, 0x63, 0x01, 0xc2, 0xf9, 0xb3, - 0x19, 0x24, 0xcf, 0x42, 0x3f, 0x75, 0x43, 0x84, 0x60, 0x64, 0xb1, 0x50, 0x2c, 0x2d, 0x96, 0x57, - 0x56, 0xd7, 0x17, 0x56, 0x96, 0x0b, 0x8b, 0x19, 0xc9, 0xa3, 0x29, 0xa5, 0x67, 0x37, 0x16, 0x94, - 0xd2, 0x5c, 0x26, 0xe6, 0xa7, 0xad, 0x96, 0x0a, 0xeb, 0xa5, 0xb9, 0x4c, 0x5c, 0xae, 0xc0, 0x44, - 0xbb, 0x80, 0xda, 0x76, 0x08, 0xf9, 0x7c, 0x21, 0xd6, 0xc1, 0x17, 0x28, 0x56, 0xd8, 0x17, 0xe4, - 0xaf, 0xc7, 0x60, 0xbc, 0xcd, 0xa4, 0xd2, 0xb6, 0x92, 0x8b, 0xd0, 0xcf, 0x7c, 0x99, 0x4d, 0xb3, - 0x0f, 0xb4, 0x9d, 0x9d, 0xa8, 0x67, 0xb7, 0x4c, 0xb5, 0x54, 0xce, 0x9f, 0x6a, 0xc4, 0x3b, 0xa4, - 0x1a, 0x04, 0xa2, 0xc5, 0x61, 0x7f, 0xbc, 0x25, 0xf8, 0xb3, 0xf9, 0xf1, 0x7c, 0x37, 0xf3, 0x23, - 0xa5, 0xf5, 0x36, 0x09, 0xf4, 0xb7, 0x99, 0x04, 0x2e, 0xc0, 0x58, 0x0b, 0x50, 0xd7, 0xc1, 0xf8, - 0x5d, 0x12, 0x64, 0x3b, 0x19, 0x27, 0x22, 0x24, 0xc6, 0x02, 0x21, 0xf1, 0x42, 0xd8, 0x82, 0x77, - 0x75, 0xee, 0x84, 0x96, 0xbe, 0xfe, 0xa4, 0x04, 0x87, 0xdb, 0xa7, 0x94, 0x6d, 0x75, 0x78, 0x1a, - 0x06, 0x1a, 0xd8, 0xd9, 0x36, 0x44, 0x5a, 0x75, 0x5f, 0x9b, 0xc9, 0x9a, 0x3c, 0x0e, 0x77, 0x36, - 0x97, 0xf2, 0xcf, 0xf6, 0xf1, 0x4e, 0x79, 0x21, 0xd3, 0xa6, 0x45, 0xd3, 0x9f, 0x8f, 0xc1, 0xa1, - 0xb6, 0xe0, 0x6d, 0x15, 0x3d, 0x01, 0xa0, 0xe9, 0x66, 0xd3, 0x61, 0xa9, 0x13, 0x8b, 0xc4, 0x29, - 0x4a, 0xa1, 0xc1, 0x8b, 0x44, 0xd9, 0xa6, 0xe3, 0x3e, 0x8f, 0xd3, 0xe7, 0xc0, 0x48, 0x94, 0xe1, - 0x09, 0x4f, 0xd1, 0x04, 0x55, 0x74, 0xb2, 0x43, 0x4b, 0x5b, 0x1c, 0xf3, 0x11, 0xc8, 0x54, 0xea, - 0x1a, 0xd6, 0x9d, 0xb2, 0xed, 0x58, 0x58, 0x6d, 0x68, 0x7a, 0x8d, 0x4e, 0x35, 0xc9, 0x7c, 0xff, - 0x96, 0x5a, 0xb7, 0xb1, 0x32, 0xca, 0x1e, 0xaf, 0x89, 0xa7, 0x44, 0x82, 0x3a, 0x90, 0xe5, 0x93, - 0x18, 0x08, 0x48, 0xb0, 0xc7, 0xae, 0x84, 0xfc, 0xfe, 0x14, 0x0c, 0xf9, 0x12, 0x70, 0x74, 0x17, - 0xa4, 0x5f, 0x54, 0xaf, 0xa9, 0x65, 0xb1, 0xa8, 0x62, 0x96, 0x18, 0x22, 0xb4, 0x55, 0xbe, 0xb0, - 0x7a, 0x04, 0x26, 0x28, 0x8b, 0xd1, 0x74, 0xb0, 0x55, 0xae, 0xd4, 0x55, 0xdb, 0xa6, 0x46, 0x4b, - 0x52, 0x56, 0x44, 0x9e, 0xad, 0x90, 0x47, 0xb3, 0xe2, 0x09, 0x3a, 0x07, 0xe3, 0x54, 0xa2, 0xd1, - 0xac, 0x3b, 0x9a, 0x59, 0xc7, 0x65, 0xb2, 0xcc, 0xb3, 0xe9, 0x94, 0xe3, 0x6a, 0x36, 0x46, 0x38, - 0x96, 0x38, 0x03, 0xd1, 0xc8, 0x46, 0x73, 0x70, 0x82, 0x8a, 0xd5, 0xb0, 0x8e, 0x2d, 0xd5, 0xc1, - 0x65, 0xfc, 0x52, 0x53, 0xad, 0xdb, 0x65, 0x55, 0xaf, 0x96, 0xb7, 0x55, 0x7b, 0x3b, 0x3b, 0x41, - 0x00, 0x8a, 0xb1, 0xac, 0xa4, 0x1c, 0x25, 0x8c, 0xf3, 0x9c, 0xaf, 0x44, 0xd9, 0x0a, 0x7a, 0xf5, - 0xb2, 0x6a, 0x6f, 0xa3, 0x3c, 0x1c, 0xa6, 0x28, 0xb6, 0x63, 0x69, 0x7a, 0xad, 0x5c, 0xd9, 0xc6, - 0x95, 0x9d, 0x72, 0xd3, 0xd9, 0x7a, 0x22, 0x7b, 0xcc, 0x5f, 0x3f, 0xd5, 0x70, 0x8d, 0xf2, 0xcc, - 0x12, 0x96, 0x0d, 0x67, 0xeb, 0x09, 0xb4, 0x06, 0x69, 0xd2, 0x19, 0x0d, 0xed, 0x65, 0x5c, 0xde, - 0x32, 0x2c, 0x3a, 0x87, 0x8e, 0xb4, 0x09, 0x4d, 0x3e, 0x0b, 0xce, 0xac, 0x70, 0x81, 0x25, 0xa3, - 0x8a, 0xf3, 0xfd, 0x6b, 0xab, 0xa5, 0xd2, 0x9c, 0x32, 0x24, 0x50, 0x2e, 0x19, 0x16, 0x71, 0xa8, - 0x9a, 0xe1, 0x1a, 0x78, 0x88, 0x39, 0x54, 0xcd, 0x10, 0xe6, 0x3d, 0x07, 0xe3, 0x95, 0x0a, 0x6b, - 0xb3, 0x56, 0x29, 0xf3, 0xc5, 0x98, 0x9d, 0xcd, 0x04, 0x8c, 0x55, 0xa9, 0xcc, 0x33, 0x06, 0xee, - 0xe3, 0x36, 0x7a, 0x12, 0x0e, 0x79, 0xc6, 0xf2, 0x0b, 0x8e, 0xb5, 0xb4, 0x32, 0x2c, 0x7a, 0x0e, - 0xc6, 0xcd, 0xbd, 0x56, 0x41, 0x14, 0xa8, 0xd1, 0xdc, 0x0b, 0x8b, 0x3d, 0x0e, 0x13, 0xe6, 0xb6, - 0xd9, 0x2a, 0x77, 0xca, 0x2f, 0x87, 0xcc, 0x6d, 0x33, 0x2c, 0x78, 0x2f, 0x5d, 0x99, 0x5b, 0xb8, - 0xa2, 0x3a, 0xb8, 0x9a, 0x3d, 0xe2, 0x67, 0xf7, 0x3d, 0x40, 0x33, 0x90, 0xa9, 0x54, 0xca, 0x58, - 0x57, 0x37, 0xeb, 0xb8, 0xac, 0x5a, 0x58, 0x57, 0xed, 0xec, 0x14, 0x65, 0x4e, 0x38, 0x56, 0x13, - 0x2b, 0x23, 0x95, 0x4a, 0x89, 0x3e, 0x2c, 0xd0, 0x67, 0xe8, 0x14, 0x8c, 0x19, 0x9b, 0x2f, 0x56, - 0x98, 0x47, 0x96, 0x4d, 0x0b, 0x6f, 0x69, 0xbb, 0xd9, 0x7b, 0xa8, 0x79, 0x47, 0xc9, 0x03, 0xea, - 0x8f, 0xab, 0x94, 0x8c, 0x1e, 0x80, 0x4c, 0xc5, 0xde, 0x56, 0x2d, 0x93, 0x86, 0x64, 0xdb, 0x54, - 0x2b, 0x38, 0x7b, 0x2f, 0x63, 0x65, 0xf4, 0x65, 0x41, 0x26, 0x23, 0xc2, 0xbe, 0xae, 0x6d, 0x39, - 0x02, 0xf1, 0x7e, 0x36, 0x22, 0x28, 0x8d, 0xa3, 0x9d, 0x84, 0x0c, 0xb1, 0x44, 0xa0, 0xe2, 0x93, - 0x94, 0x6d, 0xc4, 0xdc, 0x36, 0xfd, 0xf5, 0xde, 0x0d, 0xc3, 0x84, 0xd3, 0xab, 0xf4, 0x01, 0x96, - 0xb8, 0x99, 0xdb, 0xbe, 0x1a, 0xcf, 0xc2, 0x61, 0xc2, 0xd4, 0xc0, 0x8e, 0x5a, 0x55, 0x1d, 0xd5, - 0xc7, 0xfd, 0x10, 0xe5, 0x26, 0x66, 0x5f, 0xe2, 0x0f, 0x03, 0x7a, 0x5a, 0xcd, 0xcd, 0x3d, 0xd7, - 0xb1, 0x1e, 0x66, 0x7a, 0x12, 0x9a, 0x70, 0xad, 0x3b, 0x96, 0x9c, 0xcb, 0x79, 0x48, 0xfb, 0xfd, - 0x1e, 0xa5, 0x80, 0x79, 0x7e, 0x46, 0x22, 0x49, 0xd0, 0xec, 0xca, 0x1c, 0x49, 0x5f, 0x5e, 0x28, - 0x65, 0x62, 0x24, 0x8d, 0x5a, 0x5c, 0x58, 0x2f, 0x95, 0x95, 0x8d, 0xe5, 0xf5, 0x85, 0xa5, 0x52, - 0x26, 0xee, 0x4b, 0xec, 0xaf, 0x24, 0x92, 0xf7, 0x65, 0xee, 0x27, 0x59, 0xc3, 0x48, 0x70, 0xa5, - 0x86, 0xde, 0x02, 0x47, 0xc4, 0xb6, 0x8a, 0x8d, 0x9d, 0xf2, 0x75, 0xcd, 0xa2, 0x03, 0xb2, 0xa1, - 0xb2, 0xc9, 0xd1, 0xf5, 0x9f, 0x09, 0xce, 0xb5, 0x86, 0x9d, 0xe7, 0x34, 0x8b, 0x0c, 0xb7, 0x86, - 0xea, 0xa0, 0x45, 0x98, 0xd2, 0x8d, 0xb2, 0xed, 0xa8, 0x7a, 0x55, 0xb5, 0xaa, 0x65, 0x6f, 0x43, - 0xab, 0xac, 0x56, 0x2a, 0xd8, 0xb6, 0x0d, 0x36, 0x11, 0xba, 0x28, 0xc7, 0x75, 0x63, 0x8d, 0x33, - 0x7b, 0x33, 0x44, 0x81, 0xb3, 0x86, 0xdc, 0x37, 0xde, 0xc9, 0x7d, 0x8f, 0x41, 0xaa, 0xa1, 0x9a, - 0x65, 0xac, 0x3b, 0xd6, 0x1e, 0xcd, 0xcf, 0x93, 0x4a, 0xb2, 0xa1, 0x9a, 0x25, 0x52, 0x7e, 0x53, - 0x96, 0x49, 0x57, 0x12, 0xc9, 0x44, 0xa6, 0xff, 0x4a, 0x22, 0xd9, 0x9f, 0x19, 0xb8, 0x92, 0x48, - 0x0e, 0x64, 0x06, 0xaf, 0x24, 0x92, 0xc9, 0x4c, 0xea, 0x4a, 0x22, 0x99, 0xca, 0x80, 0xfc, 0x46, - 0x1c, 0xd2, 0xfe, 0x0c, 0x9e, 0x2c, 0x88, 0x2a, 0x74, 0x0e, 0x93, 0x68, 0x94, 0xbb, 0x7b, 0xdf, - 0x7c, 0x7f, 0x66, 0x96, 0x4c, 0x6e, 0xf9, 0x01, 0x96, 0x2e, 0x2b, 0x4c, 0x92, 0x24, 0x16, 0xc4, - 0xfd, 0x30, 0x4b, 0x4f, 0x92, 0x0a, 0x2f, 0xa1, 0x79, 0x18, 0x78, 0xd1, 0xa6, 0xd8, 0x03, 0x14, - 0xfb, 0x9e, 0xfd, 0xb1, 0xaf, 0xac, 0x51, 0xf0, 0xd4, 0x95, 0xb5, 0xf2, 0xf2, 0x8a, 0xb2, 0x54, - 0x58, 0x54, 0xb8, 0x38, 0x3a, 0x0a, 0x89, 0xba, 0xfa, 0xf2, 0x5e, 0x70, 0x1a, 0xa4, 0xa4, 0x6e, - 0xbb, 0xe5, 0x28, 0x24, 0xae, 0x63, 0x75, 0x27, 0x38, 0xf9, 0x50, 0xd2, 0x1d, 0x1c, 0x1e, 0xa7, - 0xa1, 0x9f, 0xda, 0x0b, 0x01, 0x70, 0x8b, 0x65, 0xfa, 0x50, 0x12, 0x12, 0xb3, 0x2b, 0x0a, 0x19, - 0x22, 0x19, 0x48, 0x33, 0x6a, 0x79, 0x75, 0xa1, 0x34, 0x5b, 0xca, 0xc4, 0xe4, 0x73, 0x30, 0xc0, - 0x8c, 0x40, 0x86, 0x8f, 0x6b, 0x86, 0x4c, 0x1f, 0x2f, 0x72, 0x0c, 0x49, 0x3c, 0xdd, 0x58, 0x2a, - 0x96, 0x94, 0x4c, 0xac, 0xa5, 0xf3, 0x65, 0x1b, 0xd2, 0xfe, 0xcc, 0xfc, 0xcd, 0x59, 0x9e, 0x7f, - 0x56, 0x82, 0x21, 0x5f, 0xa6, 0x4d, 0x52, 0x24, 0xb5, 0x5e, 0x37, 0xae, 0x97, 0xd5, 0xba, 0xa6, - 0xda, 0xdc, 0x35, 0x80, 0x92, 0x0a, 0x84, 0xd2, 0x6d, 0xd7, 0xbd, 0x49, 0x83, 0xa6, 0x3f, 0x33, - 0x20, 0x7f, 0x54, 0x82, 0x4c, 0x38, 0xd5, 0x0d, 0xa9, 0x29, 0xfd, 0x30, 0xd5, 0x94, 0x3f, 0x22, - 0xc1, 0x48, 0x30, 0xbf, 0x0d, 0xa9, 0x77, 0xd7, 0x0f, 0x55, 0xbd, 0xaf, 0xc6, 0x60, 0x38, 0x90, - 0xd5, 0x76, 0xab, 0xdd, 0x4b, 0x30, 0xa6, 0x55, 0x71, 0xc3, 0x34, 0x1c, 0xac, 0x57, 0xf6, 0xca, - 0x75, 0x7c, 0x0d, 0xd7, 0xb3, 0x32, 0x0d, 0x1a, 0xa7, 0xf7, 0xcf, 0x9b, 0x67, 0x16, 0x3c, 0xb9, - 0x45, 0x22, 0x96, 0x1f, 0x5f, 0x98, 0x2b, 0x2d, 0xad, 0xae, 0xac, 0x97, 0x96, 0x67, 0xdf, 0x56, - 0xde, 0x58, 0x7e, 0x66, 0x79, 0xe5, 0xb9, 0x65, 0x25, 0xa3, 0x85, 0xd8, 0xee, 0xe0, 0xb0, 0x5f, - 0x85, 0x4c, 0x58, 0x29, 0x74, 0x04, 0xda, 0xa9, 0x95, 0xe9, 0x43, 0xe3, 0x30, 0xba, 0xbc, 0x52, - 0x5e, 0x5b, 0x98, 0x2b, 0x95, 0x4b, 0x97, 0x2e, 0x95, 0x66, 0xd7, 0xd7, 0xd8, 0x4e, 0x88, 0xcb, - 0xbd, 0x1e, 0x18, 0xe0, 0xf2, 0x6b, 0x71, 0x18, 0x6f, 0xa3, 0x09, 0x2a, 0xf0, 0x35, 0x0c, 0x5b, - 0x56, 0x3d, 0xdc, 0x8d, 0xf6, 0x33, 0x24, 0x8b, 0x58, 0x55, 0x2d, 0x87, 0x2f, 0x79, 0x1e, 0x00, - 0x62, 0x25, 0xdd, 0xd1, 0xb6, 0x34, 0x6c, 0xf1, 0x1d, 0x26, 0xb6, 0xb0, 0x19, 0xf5, 0xe8, 0x6c, - 0x93, 0xe9, 0x21, 0x40, 0xa6, 0x61, 0x6b, 0x8e, 0x76, 0x0d, 0x97, 0x35, 0x5d, 0x6c, 0x47, 0x91, - 0x85, 0x4e, 0x42, 0xc9, 0x88, 0x27, 0x0b, 0xba, 0xe3, 0x72, 0xeb, 0xb8, 0xa6, 0x86, 0xb8, 0x49, - 0x30, 0x8f, 0x2b, 0x19, 0xf1, 0xc4, 0xe5, 0xbe, 0x0b, 0xd2, 0x55, 0xa3, 0x49, 0xb2, 0x3f, 0xc6, - 0x47, 0xe6, 0x0e, 0x49, 0x19, 0x62, 0x34, 0x97, 0x85, 0xe7, 0xf5, 0xde, 0x3e, 0x58, 0x5a, 0x19, - 0x62, 0x34, 0xc6, 0x72, 0x3f, 0x8c, 0xaa, 0xb5, 0x9a, 0x45, 0xc0, 0x05, 0x10, 0x5b, 0xa9, 0x8c, - 0xb8, 0x64, 0xca, 0x98, 0xbb, 0x02, 0x49, 0x61, 0x07, 0x32, 0x79, 0x13, 0x4b, 0x94, 0x4d, 0xb6, - 0xfc, 0x8e, 0x9d, 0x4c, 0x29, 0x49, 0x5d, 0x3c, 0xbc, 0x0b, 0xd2, 0x9a, 0x5d, 0xf6, 0xb6, 0xf5, - 0x63, 0xd3, 0xb1, 0x93, 0x49, 0x65, 0x48, 0xb3, 0xdd, 0x2d, 0x51, 0xf9, 0x93, 0x31, 0x18, 0x09, - 0xbe, 0x96, 0x40, 0x73, 0x90, 0xac, 0x1b, 0x15, 0x95, 0xba, 0x16, 0x7b, 0x27, 0x76, 0x32, 0xe2, - 0x4d, 0xc6, 0xcc, 0x22, 0xe7, 0x57, 0x5c, 0xc9, 0xdc, 0x1f, 0x4a, 0x90, 0x14, 0x64, 0x74, 0x18, - 0x12, 0xa6, 0xea, 0x6c, 0x53, 0xb8, 0xfe, 0x62, 0x2c, 0x23, 0x29, 0xb4, 0x4c, 0xe8, 0xb6, 0xa9, - 0xea, 0xd4, 0x05, 0x38, 0x9d, 0x94, 0x49, 0xbf, 0xd6, 0xb1, 0x5a, 0xa5, 0xcb, 0x20, 0xa3, 0xd1, - 0xc0, 0xba, 0x63, 0x8b, 0x7e, 0xe5, 0xf4, 0x59, 0x4e, 0x46, 0x0f, 0xc2, 0x98, 0x63, 0xa9, 0x5a, - 0x3d, 0xc0, 0x9b, 0xa0, 0xbc, 0x19, 0xf1, 0xc0, 0x65, 0xce, 0xc3, 0x51, 0x81, 0x5b, 0xc5, 0x8e, - 0x5a, 0xd9, 0xc6, 0x55, 0x4f, 0x68, 0x80, 0x6e, 0x77, 0x1c, 0xe1, 0x0c, 0x73, 0xfc, 0xb9, 0x90, - 0x95, 0xff, 0x48, 0x82, 0x31, 0xb1, 0x70, 0xab, 0xba, 0xc6, 0x5a, 0x02, 0x50, 0x75, 0xdd, 0x70, - 0xfc, 0xe6, 0x6a, 0x75, 0xe5, 0x16, 0xb9, 0x99, 0x82, 0x2b, 0xa4, 0xf8, 0x00, 0x72, 0x0d, 0x00, - 0xef, 0x49, 0x47, 0xb3, 0x4d, 0xc1, 0x10, 0x7f, 0xe7, 0x44, 0x5f, 0x5c, 0xb2, 0xa5, 0x3e, 0x30, - 0x12, 0x59, 0xe1, 0xa1, 0x09, 0xe8, 0xdf, 0xc4, 0x35, 0x4d, 0xe7, 0x3b, 0xc9, 0xac, 0x20, 0x36, - 0x64, 0x12, 0xee, 0x86, 0x4c, 0xf1, 0x6f, 0xc0, 0x78, 0xc5, 0x68, 0x84, 0xd5, 0x2d, 0x66, 0x42, - 0xdb, 0x0d, 0xf6, 0x65, 0xe9, 0x85, 0x87, 0x39, 0x53, 0xcd, 0xa8, 0xab, 0x7a, 0x6d, 0xc6, 0xb0, - 0x6a, 0xde, 0x8b, 0x57, 0x92, 0xf1, 0xd8, 0xbe, 0xd7, 0xaf, 0xe6, 0xe6, 0x5f, 0x48, 0xd2, 0x2f, - 0xc7, 0xe2, 0xf3, 0xab, 0xc5, 0xd7, 0x63, 0xb9, 0x79, 0x26, 0xb8, 0x2a, 0x8c, 0xa1, 0xe0, 0xad, - 0x3a, 0xae, 0x90, 0x06, 0xc2, 0xb7, 0x1e, 0x84, 0x89, 0x9a, 0x51, 0x33, 0x28, 0xd2, 0x69, 0xf2, - 0x8b, 0xbf, 0xb9, 0x4d, 0xb9, 0xd4, 0x5c, 0xe4, 0x6b, 0xde, 0xfc, 0x32, 0x8c, 0x73, 0xe6, 0x32, - 0x7d, 0x75, 0xc4, 0x16, 0x36, 0x68, 0xdf, 0x5d, 0xb5, 0xec, 0x6f, 0x7d, 0x83, 0x4e, 0xdf, 0xca, - 0x18, 0x17, 0x25, 0xcf, 0xd8, 0xda, 0x27, 0xaf, 0xc0, 0xa1, 0x00, 0x1e, 0x1b, 0xa4, 0xd8, 0x8a, - 0x40, 0xfc, 0x7d, 0x8e, 0x38, 0xee, 0x43, 0x5c, 0xe3, 0xa2, 0xf9, 0x59, 0x18, 0xee, 0x05, 0xeb, - 0x5f, 0x70, 0xac, 0x34, 0xf6, 0x83, 0xcc, 0xc3, 0x28, 0x05, 0xa9, 0x34, 0x6d, 0xc7, 0x68, 0xd0, - 0x08, 0xb8, 0x3f, 0xcc, 0xbf, 0xfc, 0x06, 0x1b, 0x35, 0x23, 0x44, 0x6c, 0xd6, 0x95, 0xca, 0xe7, - 0x81, 0xbe, 0x2d, 0xab, 0xe2, 0x4a, 0x3d, 0x02, 0xe1, 0xf3, 0x5c, 0x11, 0x97, 0x3f, 0x7f, 0x15, - 0x26, 0xc8, 0x6f, 0x1a, 0xa0, 0xfc, 0x9a, 0x44, 0x6f, 0xc1, 0x65, 0xff, 0xe8, 0x5d, 0x6c, 0x60, - 0x8e, 0xbb, 0x00, 0x3e, 0x9d, 0x7c, 0xbd, 0x58, 0xc3, 0x8e, 0x83, 0x2d, 0xbb, 0xac, 0xd6, 0xdb, - 0xa9, 0xe7, 0xdb, 0xc3, 0xc8, 0xfe, 0xd2, 0xb7, 0x83, 0xbd, 0x38, 0xcf, 0x24, 0x0b, 0xf5, 0x7a, - 0x7e, 0x03, 0x8e, 0xb4, 0xf1, 0x8a, 0x2e, 0x30, 0x5f, 0xe3, 0x98, 0x13, 0x2d, 0x9e, 0x41, 0x60, - 0x57, 0x41, 0xd0, 0xdd, 0xbe, 0xec, 0x02, 0xf3, 0xc3, 0x1c, 0x13, 0x71, 0x59, 0xd1, 0xa5, 0x04, - 0xf1, 0x0a, 0x8c, 0x5d, 0xc3, 0xd6, 0xa6, 0x61, 0xf3, 0x7d, 0xa3, 0x2e, 0xe0, 0x3e, 0xc2, 0xe1, - 0x46, 0xb9, 0x20, 0xdd, 0x48, 0x22, 0x58, 0x4f, 0x42, 0x72, 0x4b, 0xad, 0xe0, 0x2e, 0x20, 0x6e, - 0x70, 0x88, 0x41, 0xc2, 0x4f, 0x44, 0x0b, 0x90, 0xae, 0x19, 0x7c, 0x8e, 0x8a, 0x16, 0xff, 0x28, - 0x17, 0x1f, 0x12, 0x32, 0x1c, 0xc2, 0x34, 0xcc, 0x66, 0x9d, 0x4c, 0x60, 0xd1, 0x10, 0x7f, 0x47, - 0x40, 0x08, 0x19, 0x0e, 0xd1, 0x83, 0x59, 0x3f, 0x26, 0x20, 0x6c, 0x9f, 0x3d, 0x2f, 0xc2, 0x90, - 0xa1, 0xd7, 0xf7, 0x0c, 0xbd, 0x1b, 0x25, 0x3e, 0xce, 0x11, 0x80, 0x8b, 0x10, 0x80, 0x0b, 0x90, - 0xea, 0xb6, 0x23, 0xfe, 0xee, 0xb7, 0xc5, 0xf0, 0x10, 0x3d, 0x30, 0x0f, 0xa3, 0x22, 0x40, 0x69, - 0x86, 0xde, 0x05, 0xc4, 0xdf, 0xe3, 0x10, 0x23, 0x3e, 0x31, 0xde, 0x0c, 0x07, 0xdb, 0x4e, 0x0d, - 0x77, 0x03, 0xf2, 0x49, 0xd1, 0x0c, 0x2e, 0xc2, 0x4d, 0xb9, 0x89, 0xf5, 0xca, 0x76, 0x77, 0x08, - 0xbf, 0x2a, 0x4c, 0x29, 0x64, 0x08, 0xc4, 0x2c, 0x0c, 0x37, 0x54, 0xcb, 0xde, 0x56, 0xeb, 0x5d, - 0x75, 0xc7, 0xdf, 0xe7, 0x18, 0x69, 0x57, 0x88, 0x5b, 0xa4, 0xa9, 0xf7, 0x02, 0xf3, 0xba, 0xb0, - 0x88, 0x4f, 0x8c, 0x0f, 0x3d, 0xdb, 0xa1, 0x9b, 0x6c, 0xbd, 0xa0, 0xfd, 0x03, 0x31, 0xf4, 0x98, - 0xec, 0x92, 0x1f, 0xf1, 0x02, 0xa4, 0x6c, 0xed, 0xe5, 0xae, 0x60, 0x7e, 0x4d, 0xf4, 0x34, 0x15, - 0x20, 0xc2, 0x6f, 0x83, 0xa3, 0x6d, 0xa7, 0x89, 0x2e, 0xc0, 0xfe, 0x21, 0x07, 0x3b, 0xdc, 0x66, - 0xaa, 0xe0, 0x21, 0xa1, 0x57, 0xc8, 0x5f, 0x17, 0x21, 0x01, 0x87, 0xb0, 0x56, 0xc9, 0xaa, 0xc1, - 0x56, 0xb7, 0x7a, 0xb3, 0xda, 0x6f, 0x08, 0xab, 0x31, 0xd9, 0x80, 0xd5, 0xd6, 0xe1, 0x30, 0x47, - 0xec, 0xad, 0x5f, 0x7f, 0x53, 0x04, 0x56, 0x26, 0xbd, 0x11, 0xec, 0xdd, 0x1f, 0x83, 0x9c, 0x6b, - 0x4e, 0x91, 0x9e, 0xda, 0xe5, 0x86, 0x6a, 0x76, 0x81, 0xfc, 0x5b, 0x1c, 0x59, 0x44, 0x7c, 0x37, - 0xbf, 0xb5, 0x97, 0x54, 0x93, 0x80, 0x3f, 0x0f, 0x59, 0x01, 0xde, 0xd4, 0x2d, 0x5c, 0x31, 0x6a, - 0xba, 0xf6, 0x32, 0xae, 0x76, 0x01, 0xfd, 0xa9, 0x50, 0x57, 0x6d, 0xf8, 0xc4, 0x09, 0xf2, 0x02, - 0x64, 0xdc, 0x5c, 0xa5, 0xac, 0x35, 0x4c, 0xc3, 0x72, 0x22, 0x10, 0x7f, 0x5b, 0xf4, 0x94, 0x2b, - 0xb7, 0x40, 0xc5, 0xf2, 0x25, 0x60, 0x6f, 0x9e, 0xbb, 0x75, 0xc9, 0x4f, 0x73, 0xa0, 0x61, 0x4f, - 0x8a, 0x07, 0x8e, 0x8a, 0xd1, 0x30, 0x55, 0xab, 0x9b, 0xf8, 0xf7, 0x3b, 0x22, 0x70, 0x70, 0x11, - 0x1e, 0x38, 0x48, 0x46, 0x47, 0x66, 0xfb, 0x2e, 0x10, 0x3e, 0x23, 0x02, 0x87, 0x90, 0xe1, 0x10, - 0x22, 0x61, 0xe8, 0x02, 0xe2, 0x1f, 0x09, 0x08, 0x21, 0x43, 0x20, 0x9e, 0xf5, 0x26, 0x5a, 0x0b, - 0xd7, 0x34, 0xdb, 0xb1, 0x58, 0x52, 0xbc, 0x3f, 0xd4, 0x3f, 0xfe, 0x76, 0x30, 0x09, 0x53, 0x7c, - 0xa2, 0x24, 0x12, 0xf1, 0x6d, 0x57, 0xba, 0x66, 0x8a, 0x56, 0xec, 0x77, 0x45, 0x24, 0xf2, 0x89, - 0x11, 0xdd, 0x7c, 0x19, 0x22, 0x31, 0x7b, 0x85, 0xac, 0x14, 0xba, 0x80, 0xfb, 0x27, 0x21, 0xe5, - 0xd6, 0x84, 0x2c, 0xc1, 0xf4, 0xe5, 0x3f, 0x4d, 0x7d, 0x07, 0xef, 0x75, 0xe5, 0x9d, 0xbf, 0x17, - 0xca, 0x7f, 0x36, 0x98, 0x24, 0x8b, 0x21, 0xa3, 0xa1, 0x7c, 0x0a, 0x45, 0x9d, 0x33, 0xca, 0xfe, - 0xd4, 0x77, 0x79, 0x7b, 0x83, 0xe9, 0x54, 0x7e, 0x91, 0x38, 0x79, 0x30, 0xe9, 0x89, 0x06, 0x7b, - 0xd7, 0x77, 0x5d, 0x3f, 0x0f, 0xe4, 0x3c, 0xf9, 0x4b, 0x30, 0x1c, 0x48, 0x78, 0xa2, 0xa1, 0x7e, - 0x9a, 0x43, 0xa5, 0xfd, 0xf9, 0x4e, 0xfe, 0x1c, 0x24, 0x48, 0xf2, 0x12, 0x2d, 0xfe, 0x33, 0x5c, - 0x9c, 0xb2, 0xe7, 0x9f, 0x82, 0xa4, 0x48, 0x5a, 0xa2, 0x45, 0x7f, 0x96, 0x8b, 0xba, 0x22, 0x44, - 0x5c, 0x24, 0x2c, 0xd1, 0xe2, 0x3f, 0x27, 0xc4, 0x85, 0x08, 0x11, 0xef, 0xde, 0x84, 0x9f, 0xfd, - 0x85, 0x04, 0x9f, 0x74, 0x84, 0xed, 0x2e, 0xc0, 0x20, 0xcf, 0x54, 0xa2, 0xa5, 0x7f, 0x9e, 0x57, - 0x2e, 0x24, 0xf2, 0x8f, 0x43, 0x7f, 0x97, 0x06, 0x7f, 0x0f, 0x17, 0x65, 0xfc, 0xf9, 0x59, 0x18, - 0xf2, 0x65, 0x27, 0xd1, 0xe2, 0x7f, 0x93, 0x8b, 0xfb, 0xa5, 0x88, 0xea, 0x3c, 0x3b, 0x89, 0x06, - 0x78, 0xaf, 0x50, 0x9d, 0x4b, 0x10, 0xb3, 0x89, 0xc4, 0x24, 0x5a, 0xfa, 0x7d, 0xc2, 0xea, 0x42, - 0x24, 0x7f, 0x11, 0x52, 0xee, 0x64, 0x13, 0x2d, 0xff, 0x7e, 0x2e, 0xef, 0xc9, 0x10, 0x0b, 0xf8, - 0x26, 0xbb, 0x68, 0x88, 0x5f, 0x14, 0x16, 0xf0, 0x49, 0x91, 0x61, 0x14, 0x4e, 0x60, 0xa2, 0x91, - 0x3e, 0x20, 0x86, 0x51, 0x28, 0x7f, 0x21, 0xbd, 0x49, 0x63, 0x7e, 0x34, 0xc4, 0xdf, 0x12, 0xbd, - 0x49, 0xf9, 0x89, 0x1a, 0xe1, 0x8c, 0x20, 0x1a, 0xe3, 0x83, 0x42, 0x8d, 0x50, 0x42, 0x90, 0x5f, - 0x05, 0xd4, 0x9a, 0x0d, 0x44, 0xe3, 0x7d, 0x88, 0xe3, 0x8d, 0xb5, 0x24, 0x03, 0xf9, 0xe7, 0xe0, - 0x70, 0xfb, 0x4c, 0x20, 0x1a, 0xf5, 0x97, 0xbe, 0x1b, 0x5a, 0xbb, 0xf9, 0x13, 0x81, 0xfc, 0xba, - 0x37, 0xa5, 0xf8, 0xb3, 0x80, 0x68, 0xd8, 0xd7, 0xbe, 0x1b, 0x0c, 0xdc, 0xfe, 0x24, 0x20, 0x5f, - 0x00, 0xf0, 0x26, 0xe0, 0x68, 0xac, 0x8f, 0x70, 0x2c, 0x9f, 0x10, 0x19, 0x1a, 0x7c, 0xfe, 0x8d, - 0x96, 0xbf, 0x21, 0x86, 0x06, 0x97, 0x20, 0x43, 0x43, 0x4c, 0xbd, 0xd1, 0xd2, 0x1f, 0x15, 0x43, - 0x43, 0x88, 0x10, 0xcf, 0xf6, 0xcd, 0x6e, 0xd1, 0x08, 0x1f, 0x17, 0x9e, 0xed, 0x93, 0xca, 0x2f, - 0xc3, 0x58, 0xcb, 0x84, 0x18, 0x0d, 0xf5, 0xcb, 0x1c, 0x2a, 0x13, 0x9e, 0x0f, 0xfd, 0x93, 0x17, - 0x9f, 0x0c, 0xa3, 0xd1, 0x3e, 0x11, 0x9a, 0xbc, 0xf8, 0x5c, 0x98, 0xbf, 0x00, 0x49, 0xbd, 0x59, - 0xaf, 0x93, 0xc1, 0x83, 0xf6, 0x3f, 0x1b, 0x98, 0xfd, 0x2f, 0xdf, 0xe7, 0xd6, 0x11, 0x02, 0xf9, - 0x73, 0xd0, 0x8f, 0x1b, 0x9b, 0xb8, 0x1a, 0x25, 0xf9, 0xad, 0xef, 0x8b, 0x80, 0x49, 0xb8, 0xf3, - 0x17, 0x01, 0xd8, 0xd6, 0x08, 0x7d, 0x19, 0x18, 0x21, 0xfb, 0x5f, 0xbf, 0xcf, 0x0f, 0xe3, 0x78, - 0x22, 0x1e, 0x00, 0x3b, 0xda, 0xb3, 0x3f, 0xc0, 0xb7, 0x83, 0x00, 0xb4, 0x47, 0x9e, 0x84, 0xc1, - 0x17, 0x6d, 0x43, 0x77, 0xd4, 0x5a, 0x94, 0xf4, 0x7f, 0xe3, 0xd2, 0x82, 0x9f, 0x18, 0xac, 0x61, - 0x58, 0xd8, 0x51, 0x6b, 0x76, 0x94, 0xec, 0x7f, 0xe7, 0xb2, 0xae, 0x00, 0x11, 0xae, 0xa8, 0xb6, - 0xd3, 0x4d, 0xbb, 0xff, 0x4c, 0x08, 0x0b, 0x01, 0xa2, 0x34, 0xf9, 0xbd, 0x83, 0xf7, 0xa2, 0x64, - 0xbf, 0x23, 0x94, 0xe6, 0xfc, 0xf9, 0xa7, 0x20, 0x45, 0x7e, 0xb2, 0x13, 0x76, 0x11, 0xc2, 0x7f, - 0xce, 0x85, 0x3d, 0x09, 0x52, 0xb3, 0xed, 0x54, 0x1d, 0x2d, 0xda, 0xd8, 0xb7, 0x78, 0x4f, 0x0b, - 0xfe, 0x7c, 0x01, 0x86, 0x6c, 0xa7, 0x5a, 0x6d, 0xf2, 0xfc, 0x34, 0x42, 0xfc, 0x7f, 0x7c, 0xdf, - 0xdd, 0xb2, 0x70, 0x65, 0x48, 0x6f, 0x5f, 0xdf, 0x71, 0x4c, 0x83, 0xbe, 0xf0, 0x88, 0x42, 0xf8, - 0x2e, 0x47, 0xf0, 0x89, 0xe4, 0x67, 0x21, 0x4d, 0xda, 0x62, 0x61, 0x13, 0xd3, 0xb7, 0x53, 0x11, - 0x10, 0xdf, 0xe3, 0x06, 0x08, 0x08, 0x15, 0x7f, 0xfc, 0xf3, 0x6f, 0x4c, 0x4a, 0x5f, 0x7c, 0x63, - 0x52, 0xfa, 0xea, 0x1b, 0x93, 0xd2, 0xfb, 0xbe, 0x3e, 0xd9, 0xf7, 0xc5, 0xaf, 0x4f, 0xf6, 0x7d, - 0xf9, 0xeb, 0x93, 0x7d, 0xed, 0x77, 0x89, 0x61, 0xde, 0x98, 0x37, 0xd8, 0xfe, 0xf0, 0x0b, 0x72, - 0x4d, 0x73, 0xb6, 0x9b, 0x9b, 0x33, 0x15, 0xa3, 0x41, 0xb7, 0x71, 0xbd, 0xdd, 0x5a, 0x77, 0x91, - 0x03, 0xdf, 0x93, 0xc8, 0x82, 0x39, 0xb8, 0x97, 0xab, 0xea, 0x7b, 0x1d, 0xee, 0xea, 0xe4, 0xda, - 0x6e, 0x0c, 0xcb, 0x6f, 0x81, 0x78, 0x41, 0xdf, 0x43, 0x47, 0x59, 0xcc, 0x2b, 0x37, 0xad, 0x3a, - 0x3f, 0xf9, 0x35, 0x48, 0xca, 0x1b, 0x56, 0x1d, 0x4d, 0x78, 0xc7, 0x33, 0xa5, 0x93, 0x69, 0x7e, - 0xe6, 0x32, 0x9f, 0xf8, 0xce, 0xc7, 0xa7, 0xfa, 0x8a, 0x3b, 0xe1, 0x16, 0x7e, 0x36, 0xb2, 0x95, - 0xc9, 0x82, 0xbe, 0x47, 0x1b, 0xb9, 0x2a, 0xbd, 0xd0, 0x4f, 0x37, 0xba, 0xc5, 0xc6, 0xf6, 0x64, - 0x78, 0x63, 0xfb, 0x39, 0x5c, 0xaf, 0x3f, 0xa3, 0x1b, 0xd7, 0xf5, 0x75, 0xc2, 0xb6, 0x39, 0xc0, - 0x8e, 0x11, 0xc3, 0x07, 0x63, 0x30, 0x15, 0x6e, 0x37, 0x71, 0x1c, 0xdb, 0x51, 0x1b, 0x66, 0xa7, - 0x9b, 0x4a, 0x17, 0x20, 0xb5, 0x2e, 0x78, 0x50, 0x16, 0x06, 0x6d, 0x5c, 0x31, 0xf4, 0xaa, 0x4d, - 0x1b, 0x1b, 0x57, 0x44, 0x91, 0x34, 0x56, 0x57, 0x75, 0xc3, 0xe6, 0xe7, 0x23, 0x59, 0xa1, 0x78, - 0x43, 0xea, 0xad, 0x27, 0x47, 0xdc, 0xaa, 0x44, 0x4b, 0xcf, 0x44, 0xee, 0xf6, 0xef, 0x90, 0x86, - 0x7a, 0xed, 0x08, 0x6c, 0xf9, 0x77, 0x6b, 0x99, 0x77, 0xc6, 0xe1, 0x68, 0xc5, 0xb0, 0x1b, 0x86, - 0x5d, 0x66, 0x1d, 0xcd, 0x0a, 0xdc, 0x26, 0x69, 0xff, 0xa3, 0x2e, 0x5e, 0x03, 0x5c, 0x86, 0x11, - 0x3a, 0x18, 0xe8, 0x06, 0x28, 0x8d, 0x3f, 0x91, 0x53, 0xc6, 0x1f, 0xfc, 0xbb, 0x7e, 0xea, 0x3c, - 0xc3, 0xae, 0x20, 0x3d, 0xcf, 0xb1, 0x0e, 0x13, 0x5a, 0xc3, 0xac, 0x63, 0xfa, 0xe2, 0xa7, 0xec, - 0x3e, 0x8b, 0xc6, 0xfb, 0x02, 0xc7, 0x1b, 0xf7, 0xc4, 0x17, 0x84, 0x74, 0x7e, 0x11, 0xc6, 0xd4, - 0x4a, 0x05, 0x9b, 0x01, 0xc8, 0x88, 0x81, 0x2a, 0x14, 0xcc, 0x70, 0x49, 0x17, 0xad, 0x78, 0xb1, - 0x53, 0x17, 0xbf, 0x70, 0xaf, 0x6f, 0x2c, 0x5a, 0xb8, 0x86, 0xf5, 0x87, 0x75, 0xec, 0x5c, 0x37, - 0xac, 0x1d, 0x6e, 0xde, 0x87, 0x59, 0x55, 0xa2, 0x13, 0x7e, 0x3a, 0x0e, 0x93, 0xec, 0xc1, 0xe9, - 0x4d, 0xd5, 0xc6, 0xa7, 0xaf, 0x3d, 0xba, 0x89, 0x1d, 0xf5, 0xd1, 0xd3, 0x15, 0x43, 0xd3, 0x79, - 0x4f, 0x8c, 0xf3, 0x7e, 0x21, 0xcf, 0x67, 0xf8, 0xf3, 0x0e, 0xe3, 0x73, 0x1e, 0x12, 0xb3, 0x86, - 0xa6, 0x13, 0xc7, 0xac, 0x62, 0xdd, 0x68, 0xf0, 0xd1, 0xc9, 0x0a, 0xe8, 0x6e, 0x18, 0x50, 0x1b, - 0x46, 0x53, 0x77, 0xd8, 0x3b, 0xab, 0xe2, 0xd0, 0xe7, 0x6f, 0x4e, 0xf5, 0xfd, 0xc9, 0xcd, 0xa9, - 0xf8, 0x82, 0xee, 0x28, 0xfc, 0x51, 0x3e, 0xf1, 0xcd, 0x8f, 0x4d, 0x49, 0xf2, 0x15, 0x18, 0x9c, - 0xc3, 0x95, 0x83, 0x60, 0xcd, 0xe1, 0x4a, 0x08, 0xeb, 0x01, 0x48, 0x2e, 0xe8, 0x0e, 0x3b, 0x39, - 0x7b, 0x02, 0xe2, 0x9a, 0xce, 0x0e, 0x63, 0x85, 0xea, 0x27, 0x74, 0xc2, 0x3a, 0x87, 0x2b, 0x2e, - 0x6b, 0x15, 0x57, 0xc2, 0xac, 0x04, 0x9e, 0xd0, 0x8b, 0x73, 0x5f, 0xfe, 0xda, 0x64, 0xdf, 0x2b, - 0x6f, 0x4c, 0xf6, 0x75, 0xec, 0x09, 0x7f, 0x54, 0xe4, 0x26, 0xe6, 0x5d, 0x60, 0x57, 0x77, 0xd8, - 0x38, 0x72, 0xbb, 0xe1, 0x03, 0x31, 0x98, 0x6c, 0x71, 0x71, 0x3e, 0x3f, 0x74, 0x0a, 0x12, 0x79, - 0x48, 0xce, 0x89, 0x69, 0xa7, 0xd7, 0x18, 0xf1, 0xe1, 0x1e, 0x63, 0xc4, 0xb0, 0xa8, 0x49, 0x84, - 0x88, 0x47, 0xbb, 0x0c, 0x11, 0xa2, 0x11, 0x07, 0x8a, 0x10, 0xaf, 0x27, 0xe0, 0x04, 0xbd, 0x4a, - 0x62, 0x35, 0x34, 0xdd, 0x39, 0x5d, 0xb1, 0xf6, 0x4c, 0x87, 0x4e, 0x2e, 0xc6, 0x16, 0x37, 0xca, - 0x98, 0xf7, 0x78, 0x86, 0x3d, 0xee, 0xe0, 0x99, 0x5b, 0xd0, 0xbf, 0x4a, 0xe4, 0x88, 0x3d, 0x1c, - 0xc3, 0x51, 0xeb, 0xdc, 0x4e, 0xac, 0x40, 0xa8, 0xec, 0xfa, 0x49, 0x8c, 0x51, 0x35, 0x71, 0xf3, - 0xa4, 0x8e, 0xd5, 0x2d, 0x76, 0x8a, 0x37, 0x4e, 0x27, 0x94, 0x24, 0x21, 0xd0, 0x03, 0xbb, 0x13, - 0xd0, 0xaf, 0x36, 0xd9, 0xeb, 0xe6, 0x38, 0x99, 0x69, 0x68, 0x41, 0x7e, 0x06, 0x06, 0xf9, 0x4b, - 0x2f, 0x94, 0x81, 0xf8, 0x0e, 0xde, 0xa3, 0xf5, 0xa4, 0x15, 0xf2, 0x13, 0xcd, 0x40, 0x3f, 0x55, - 0x9e, 0x5f, 0x4f, 0xc8, 0xce, 0xb4, 0x68, 0x3f, 0x43, 0x95, 0x54, 0x18, 0x9b, 0x7c, 0x05, 0x92, - 0x73, 0x46, 0x43, 0xd3, 0x8d, 0x20, 0x5a, 0x8a, 0xa1, 0x51, 0x9d, 0xcd, 0x26, 0x1f, 0x01, 0x0a, - 0x2b, 0xa0, 0xc3, 0x30, 0xc0, 0x4e, 0x75, 0xf3, 0x57, 0xe6, 0xbc, 0x24, 0xcf, 0xc2, 0x20, 0xc5, - 0x5e, 0x31, 0x11, 0xe2, 0xf7, 0x81, 0xf8, 0xf1, 0x71, 0x1a, 0x2c, 0x39, 0x7c, 0xcc, 0x53, 0x16, - 0x41, 0xa2, 0xaa, 0x3a, 0x2a, 0x6f, 0x37, 0xfd, 0x2d, 0x3f, 0x0d, 0x49, 0x0e, 0x62, 0xa3, 0x33, - 0x10, 0x37, 0x4c, 0x9b, 0xbf, 0xf4, 0xce, 0x75, 0x6a, 0xca, 0x8a, 0x59, 0x4c, 0x90, 0xb1, 0xa3, - 0x10, 0xe6, 0xa2, 0xd2, 0x71, 0xb0, 0x3c, 0xe1, 0x1b, 0x2c, 0xbe, 0x2e, 0xf7, 0xfd, 0x64, 0x5d, - 0xda, 0xe2, 0x0e, 0xae, 0xb3, 0x7c, 0x3c, 0x06, 0x93, 0xbe, 0xa7, 0xd7, 0xb0, 0x45, 0x56, 0x7e, - 0xcc, 0x19, 0xb9, 0xb7, 0x20, 0x9f, 0x92, 0xfc, 0x79, 0x07, 0x77, 0x79, 0x0a, 0xe2, 0x05, 0xd3, - 0x44, 0x39, 0x48, 0xd2, 0x72, 0xc5, 0x60, 0xfe, 0x92, 0x50, 0xdc, 0x32, 0x79, 0x66, 0x1b, 0x5b, - 0xce, 0x75, 0xd5, 0x72, 0x2f, 0x3e, 0x89, 0xb2, 0xfc, 0x24, 0xa4, 0x66, 0x0d, 0xdd, 0xc6, 0xba, - 0xdd, 0xa4, 0x23, 0x70, 0xb3, 0x6e, 0x54, 0x76, 0x38, 0x02, 0x2b, 0x10, 0x83, 0xab, 0xa6, 0x49, - 0x25, 0x13, 0x0a, 0xf9, 0xc9, 0xa2, 0x55, 0x71, 0xad, 0xa3, 0x89, 0x9e, 0xec, 0xdd, 0x44, 0xbc, - 0x91, 0xae, 0x8d, 0xfe, 0x97, 0x04, 0xc7, 0x5b, 0x07, 0xd4, 0x0e, 0xde, 0xb3, 0x7b, 0x1d, 0x4f, - 0xcf, 0x43, 0x6a, 0x95, 0xde, 0x3e, 0x7e, 0x06, 0xef, 0xa1, 0x1c, 0x0c, 0xe2, 0xea, 0x99, 0x73, - 0xe7, 0x1e, 0x7d, 0x92, 0x79, 0xfb, 0xe5, 0x3e, 0x45, 0x10, 0xd0, 0x24, 0xa4, 0x6c, 0x5c, 0x31, - 0xcf, 0x9c, 0x3b, 0xbf, 0xf3, 0x28, 0x73, 0xaf, 0xcb, 0x7d, 0x8a, 0x47, 0xca, 0x27, 0x49, 0xab, - 0xbf, 0xf9, 0xf1, 0x29, 0xa9, 0xd8, 0x0f, 0x71, 0xbb, 0xd9, 0xb8, 0xa3, 0x3e, 0xf2, 0x5a, 0x3f, - 0x4c, 0xfb, 0x25, 0x69, 0xa0, 0xba, 0xa6, 0xd6, 0xb5, 0xaa, 0xea, 0xdd, 0x1b, 0xcf, 0xf8, 0x6c, - 0x40, 0x39, 0xda, 0x9b, 0x20, 0xb7, 0xaf, 0x25, 0xe5, 0x4f, 0x49, 0x90, 0xbe, 0x2a, 0x90, 0xd7, - 0xb0, 0x83, 0x2e, 0x00, 0xb8, 0x35, 0x89, 0x61, 0x73, 0x6c, 0x26, 0x5c, 0xd7, 0x8c, 0x2b, 0xa3, - 0xf8, 0xd8, 0xd1, 0xe3, 0xd4, 0x11, 0x4d, 0xc3, 0xe6, 0x97, 0x61, 0x22, 0x44, 0x5d, 0x66, 0xf4, - 0x10, 0x20, 0x1a, 0xe1, 0xca, 0xd7, 0x0c, 0x47, 0xd3, 0x6b, 0x65, 0xd3, 0xb8, 0xce, 0xaf, 0x18, - 0xc6, 0x95, 0x0c, 0x7d, 0x72, 0x95, 0x3e, 0x58, 0x25, 0x74, 0xa2, 0x74, 0xca, 0x45, 0x21, 0x93, - 0x8a, 0x5a, 0xad, 0x5a, 0xd8, 0xb6, 0x79, 0x10, 0x13, 0x45, 0x74, 0x01, 0x06, 0xcd, 0xe6, 0x66, - 0x59, 0x44, 0x8c, 0xa1, 0x33, 0xc7, 0xdb, 0x8d, 0x7f, 0xe1, 0x1f, 0x3c, 0x02, 0x0c, 0x98, 0xcd, - 0x4d, 0xe2, 0x2d, 0x77, 0x41, 0xba, 0x8d, 0x32, 0x43, 0xd7, 0x3c, 0x3d, 0xe8, 0xa5, 0x77, 0xde, - 0x82, 0xb2, 0x69, 0x69, 0x86, 0xa5, 0x39, 0x7b, 0xf4, 0xe4, 0x4a, 0x5c, 0xc9, 0x88, 0x07, 0xab, - 0x9c, 0x2e, 0xef, 0xc0, 0xe8, 0x1a, 0xcd, 0xb8, 0x3c, 0xcd, 0xcf, 0x79, 0xfa, 0x49, 0xd1, 0xfa, - 0x75, 0xd4, 0x2c, 0xd6, 0xa2, 0x59, 0xf1, 0xd9, 0x8e, 0xde, 0xf9, 0x78, 0xef, 0xde, 0x19, 0xcc, - 0x01, 0xfe, 0xec, 0x68, 0x60, 0x70, 0x32, 0xe7, 0xf4, 0x87, 0xaf, 0x6e, 0x1d, 0x33, 0x6a, 0xbd, - 0x91, 0xdb, 0x7f, 0x52, 0xcd, 0x45, 0x84, 0xd1, 0x5c, 0xe4, 0x10, 0x92, 0x9f, 0x84, 0xe1, 0x55, - 0xd5, 0x72, 0xd6, 0xb0, 0x73, 0x19, 0xab, 0x55, 0x6c, 0x05, 0x67, 0xdd, 0x61, 0x31, 0xeb, 0x22, - 0x48, 0xd0, 0xa9, 0x95, 0xcd, 0x3a, 0xf4, 0xb7, 0xbc, 0x0d, 0x09, 0x7a, 0x7a, 0xcd, 0x9d, 0x91, - 0xb9, 0x04, 0x9b, 0x91, 0x49, 0x2c, 0xdd, 0x73, 0xb0, 0x2d, 0x96, 0x77, 0xb4, 0x80, 0xce, 0x8a, - 0x79, 0x35, 0xbe, 0xff, 0xbc, 0xca, 0x1d, 0x91, 0xcf, 0xae, 0x75, 0x18, 0x2c, 0x92, 0x50, 0xbc, - 0x30, 0xe7, 0x2a, 0x22, 0x79, 0x8a, 0xa0, 0x25, 0x18, 0x35, 0x55, 0xcb, 0xa1, 0x07, 0xf9, 0xb7, - 0x69, 0x2b, 0xb8, 0xaf, 0x4f, 0xb5, 0x8e, 0xbc, 0x40, 0x63, 0x79, 0x2d, 0xc3, 0xa6, 0x9f, 0x28, - 0xff, 0x69, 0x02, 0x06, 0xb8, 0x31, 0x9e, 0x82, 0x41, 0x6e, 0x56, 0xee, 0x9d, 0x27, 0x66, 0x5a, - 0x27, 0xa6, 0x19, 0x77, 0x02, 0xe1, 0x78, 0x42, 0x06, 0xdd, 0x07, 0xc9, 0xca, 0xb6, 0xaa, 0xe9, - 0x65, 0xad, 0x2a, 0x92, 0xdf, 0x37, 0x6e, 0x4e, 0x0d, 0xce, 0x12, 0xda, 0xc2, 0x9c, 0x32, 0x48, - 0x1f, 0x2e, 0x54, 0x49, 0x26, 0xb0, 0x8d, 0xb5, 0xda, 0xb6, 0xc3, 0x47, 0x18, 0x2f, 0xa1, 0x27, - 0x20, 0x41, 0x1c, 0x82, 0x5f, 0xf3, 0xca, 0xb5, 0x2c, 0x41, 0xdc, 0xe5, 0x60, 0x31, 0x49, 0x2a, - 0x7e, 0xdf, 0x57, 0xa6, 0x24, 0x85, 0x4a, 0xa0, 0x59, 0x18, 0xae, 0xab, 0xb6, 0x53, 0xa6, 0x33, - 0x18, 0xa9, 0xbe, 0x9f, 0x42, 0x1c, 0x6d, 0x35, 0x08, 0x37, 0x2c, 0x57, 0x7d, 0x88, 0x48, 0x31, - 0x52, 0x15, 0x9d, 0x84, 0x0c, 0x05, 0xa9, 0x18, 0x8d, 0x86, 0xe6, 0xb0, 0xdc, 0x6a, 0x80, 0xda, - 0x7d, 0x84, 0xd0, 0x67, 0x29, 0x99, 0x66, 0x58, 0xc7, 0x20, 0x45, 0x2f, 0x96, 0x50, 0x16, 0x76, - 0x64, 0x32, 0x49, 0x08, 0xf4, 0xe1, 0xfd, 0x30, 0xea, 0xc5, 0x47, 0xc6, 0x92, 0x64, 0x28, 0x1e, - 0x99, 0x32, 0x3e, 0x02, 0x13, 0x3a, 0xde, 0xa5, 0x87, 0x38, 0x03, 0xdc, 0x29, 0xca, 0x8d, 0xc8, - 0xb3, 0xab, 0x41, 0x89, 0x7b, 0x61, 0xa4, 0x22, 0x8c, 0xcf, 0x78, 0x81, 0xf2, 0x0e, 0xbb, 0x54, - 0xca, 0x76, 0x14, 0x92, 0xaa, 0x69, 0x32, 0x86, 0x21, 0x1e, 0x1f, 0x4d, 0x93, 0x3e, 0x3a, 0x05, - 0x63, 0xb4, 0x8d, 0x16, 0xb6, 0x9b, 0x75, 0x87, 0x83, 0xa4, 0x29, 0xcf, 0x28, 0x79, 0xa0, 0x30, - 0x3a, 0xe5, 0xbd, 0x1b, 0x86, 0xf1, 0x35, 0xad, 0x8a, 0xf5, 0x0a, 0x66, 0x7c, 0xc3, 0x94, 0x2f, - 0x2d, 0x88, 0x94, 0xe9, 0x01, 0x70, 0xe3, 0x5e, 0x59, 0xc4, 0xe4, 0x11, 0x86, 0x27, 0xe8, 0x05, - 0x46, 0x96, 0xb3, 0x90, 0x98, 0x53, 0x1d, 0x95, 0x24, 0x18, 0xce, 0x2e, 0x9b, 0x68, 0xd2, 0x0a, - 0xf9, 0x29, 0x7f, 0x33, 0x06, 0x89, 0xab, 0x86, 0x83, 0xd1, 0x63, 0xbe, 0x04, 0x70, 0xa4, 0x9d, - 0x3f, 0xaf, 0x69, 0x35, 0x1d, 0x57, 0x97, 0xec, 0x9a, 0xef, 0x16, 0xb8, 0xe7, 0x4e, 0xb1, 0x80, - 0x3b, 0x4d, 0x40, 0xbf, 0x65, 0x34, 0xf5, 0xaa, 0x38, 0x6d, 0x48, 0x0b, 0xa8, 0x04, 0x49, 0xd7, - 0x4b, 0x12, 0x51, 0x5e, 0x32, 0x4a, 0xbc, 0x84, 0xf8, 0x30, 0x27, 0x28, 0x83, 0x9b, 0xdc, 0x59, - 0x8a, 0x90, 0x72, 0x83, 0x17, 0xf7, 0xb6, 0xee, 0x1c, 0xd6, 0x13, 0x23, 0x93, 0x89, 0xdb, 0xf7, - 0xae, 0xf1, 0x98, 0xc7, 0x65, 0xdc, 0x07, 0xdc, 0x7a, 0x01, 0xb7, 0xe2, 0x37, 0xd2, 0x07, 0x69, - 0xbb, 0x3c, 0xb7, 0x62, 0xb7, 0xd2, 0x8f, 0x43, 0xca, 0xd6, 0x6a, 0xba, 0xea, 0x34, 0x2d, 0xcc, - 0x3d, 0xcf, 0x23, 0xc8, 0x9f, 0x95, 0x60, 0x80, 0x79, 0xb2, 0xcf, 0x6e, 0x52, 0x7b, 0xbb, 0xc5, - 0x3a, 0xd9, 0x2d, 0x7e, 0x70, 0xbb, 0x15, 0x00, 0x5c, 0x65, 0x6c, 0x7e, 0x51, 0xb8, 0x4d, 0xc6, - 0xc0, 0x54, 0x5c, 0xd3, 0x6a, 0x7c, 0xa0, 0xfa, 0x84, 0xe4, 0xff, 0x28, 0x91, 0x24, 0x96, 0x3f, - 0x47, 0x05, 0x18, 0x16, 0x7a, 0x95, 0xb7, 0xea, 0x6a, 0x8d, 0xfb, 0xce, 0x89, 0x8e, 0xca, 0x5d, - 0xaa, 0xab, 0x35, 0x65, 0x88, 0xeb, 0x43, 0x0a, 0xed, 0xfb, 0x21, 0xd6, 0xa1, 0x1f, 0x02, 0x1d, - 0x1f, 0x3f, 0x58, 0xc7, 0x07, 0xba, 0x28, 0x11, 0xee, 0xa2, 0xdf, 0x8e, 0xd1, 0xc5, 0x8c, 0x69, - 0xd8, 0x6a, 0xfd, 0xcd, 0x18, 0x11, 0xc7, 0x20, 0x65, 0x1a, 0xf5, 0x32, 0x7b, 0xc2, 0x4e, 0xe1, - 0x26, 0x4d, 0xa3, 0xae, 0xb4, 0x74, 0x7b, 0xff, 0x6d, 0x1a, 0x2e, 0x03, 0xb7, 0xc1, 0x6a, 0x83, - 0x61, 0xab, 0x59, 0x90, 0x66, 0xa6, 0xe0, 0x73, 0xd9, 0x23, 0xc4, 0x06, 0x74, 0x72, 0x94, 0x5a, - 0xe7, 0x5e, 0xa6, 0x36, 0xe3, 0x54, 0x38, 0x1f, 0x91, 0x60, 0xa1, 0xbf, 0xdd, 0x2a, 0xd8, 0xef, - 0x96, 0x0a, 0xe7, 0x93, 0xff, 0xb6, 0x04, 0xb0, 0x48, 0x2c, 0x4b, 0xdb, 0x4b, 0x66, 0x21, 0x9b, - 0xaa, 0x50, 0x0e, 0xd4, 0x3c, 0xd9, 0xa9, 0xd3, 0x78, 0xfd, 0x69, 0xdb, 0xaf, 0xf7, 0x2c, 0x0c, - 0x7b, 0xce, 0x68, 0x63, 0xa1, 0xcc, 0xe4, 0x3e, 0x59, 0xf5, 0x1a, 0x76, 0x94, 0xf4, 0x35, 0x5f, - 0x49, 0xfe, 0x67, 0x12, 0xa4, 0xa8, 0x4e, 0x4b, 0xd8, 0x51, 0x03, 0x7d, 0x28, 0x1d, 0xbc, 0x0f, - 0x4f, 0x00, 0x30, 0x18, 0x5b, 0x7b, 0x19, 0x73, 0xcf, 0x4a, 0x51, 0xca, 0x9a, 0xf6, 0x32, 0x46, - 0xe7, 0x5d, 0x83, 0xc7, 0xf7, 0x37, 0xb8, 0xc8, 0xba, 0xb9, 0xd9, 0x8f, 0xc0, 0x20, 0xfd, 0xb0, - 0xce, 0xae, 0xcd, 0x13, 0xe9, 0x01, 0xbd, 0xd9, 0x58, 0xdf, 0xb5, 0xe5, 0x17, 0x61, 0x70, 0x7d, - 0x97, 0xed, 0x8d, 0x1c, 0x83, 0x94, 0x65, 0x18, 0x7c, 0x4e, 0x66, 0xb9, 0x50, 0x92, 0x10, 0xe8, - 0x14, 0x24, 0xf6, 0x03, 0x62, 0xde, 0x7e, 0x80, 0xb7, 0xa1, 0x11, 0xef, 0x6a, 0x43, 0xe3, 0xd4, - 0x97, 0x24, 0x18, 0xf2, 0xc5, 0x07, 0xf4, 0x28, 0x1c, 0x2a, 0x2e, 0xae, 0xcc, 0x3e, 0x53, 0x5e, - 0x98, 0x2b, 0x5f, 0x5a, 0x2c, 0xcc, 0x7b, 0xf7, 0x4c, 0x72, 0x87, 0x5f, 0xbd, 0x31, 0x8d, 0x7c, - 0xbc, 0x1b, 0x3a, 0xdd, 0x50, 0x42, 0xa7, 0x61, 0x22, 0x28, 0x52, 0x28, 0xae, 0x95, 0x96, 0xd7, - 0x33, 0x52, 0xee, 0xd0, 0xab, 0x37, 0xa6, 0xc7, 0x7c, 0x12, 0x85, 0x4d, 0x1b, 0xeb, 0x4e, 0xab, - 0xc0, 0xec, 0xca, 0xd2, 0xd2, 0xc2, 0x7a, 0x26, 0xd6, 0x22, 0xc0, 0x03, 0xf6, 0x03, 0x30, 0x16, - 0x14, 0x58, 0x5e, 0x58, 0xcc, 0xc4, 0x73, 0xe8, 0xd5, 0x1b, 0xd3, 0x23, 0x3e, 0xee, 0x65, 0xad, - 0x9e, 0x4b, 0xbe, 0xfb, 0x13, 0x93, 0x7d, 0xbf, 0xfa, 0x2b, 0x93, 0x12, 0x69, 0xd9, 0x70, 0x20, - 0x46, 0xa0, 0x87, 0xe0, 0xc8, 0xda, 0xc2, 0xfc, 0x72, 0x69, 0xae, 0xbc, 0xb4, 0x36, 0x5f, 0x66, - 0x5f, 0xdc, 0x70, 0x5b, 0x37, 0xfa, 0xea, 0x8d, 0xe9, 0x21, 0xde, 0xa4, 0x4e, 0xdc, 0xab, 0x4a, - 0xe9, 0xea, 0xca, 0x7a, 0x29, 0x23, 0x31, 0xee, 0x55, 0x0b, 0x5f, 0x33, 0x1c, 0xf6, 0xe5, 0xad, - 0x47, 0xe0, 0x68, 0x1b, 0x6e, 0xb7, 0x61, 0x63, 0xaf, 0xde, 0x98, 0x1e, 0x5e, 0xb5, 0x30, 0x1b, - 0x3f, 0x54, 0x62, 0x06, 0xb2, 0xad, 0x12, 0x2b, 0xab, 0x2b, 0x6b, 0x85, 0xc5, 0xcc, 0x74, 0x2e, - 0xf3, 0xea, 0x8d, 0xe9, 0xb4, 0x08, 0x86, 0x84, 0xdf, 0x6b, 0xd9, 0x9d, 0x5c, 0xf1, 0x7c, 0x6d, - 0x06, 0x4e, 0xd8, 0x8e, 0xba, 0xa3, 0xe9, 0x35, 0x77, 0xe3, 0x99, 0x97, 0xf9, 0x92, 0xe7, 0x44, - 0x5d, 0x7b, 0xa9, 0xa9, 0x55, 0x05, 0x51, 0xfc, 0xdd, 0x77, 0x17, 0x3a, 0xd7, 0xf9, 0x3d, 0x53, - 0x2e, 0x62, 0x93, 0x35, 0x7a, 0xe9, 0xd4, 0xf9, 0x8d, 0x45, 0x2e, 0x62, 0x1f, 0x3d, 0xb7, 0xef, - 0xe2, 0x4e, 0x7e, 0x9f, 0x04, 0x23, 0x97, 0x35, 0xdb, 0x31, 0x2c, 0xad, 0xa2, 0xd6, 0xe9, 0xed, - 0x92, 0xf3, 0xdd, 0xc6, 0xd6, 0xd0, 0x50, 0xbf, 0x04, 0x03, 0xd7, 0xd4, 0x3a, 0x0b, 0x6a, 0xec, - 0x02, 0xcf, 0xbe, 0x56, 0xf4, 0x22, 0x9c, 0xc0, 0x61, 0xd2, 0xf2, 0x6f, 0xc4, 0x60, 0x94, 0x8e, - 0x09, 0x9b, 0x7d, 0x3f, 0x89, 0x2c, 0xb5, 0x8a, 0x90, 0xb0, 0x54, 0x87, 0xef, 0x1d, 0x16, 0x67, - 0xf8, 0xb6, 0xf8, 0x7d, 0xd1, 0x5b, 0xdd, 0x33, 0x73, 0xb8, 0xa2, 0x50, 0x59, 0xf4, 0xd7, 0x20, - 0xd9, 0x50, 0x77, 0xcb, 0x14, 0x87, 0x2d, 0x60, 0x0a, 0xbd, 0xe1, 0xdc, 0xba, 0x39, 0x35, 0xba, - 0xa7, 0x36, 0xea, 0x79, 0x59, 0xe0, 0xc8, 0xca, 0x60, 0x43, 0xdd, 0x25, 0x2a, 0x22, 0x13, 0x46, - 0x09, 0xb5, 0xb2, 0xad, 0xea, 0x35, 0xcc, 0x2a, 0xa1, 0x3b, 0xa1, 0xc5, 0xcb, 0x3d, 0x57, 0x72, - 0xd8, 0xab, 0xc4, 0x07, 0x27, 0x2b, 0xc3, 0x0d, 0x75, 0x77, 0x96, 0x12, 0x48, 0x8d, 0xf9, 0xe4, - 0x87, 0x3e, 0x36, 0xd5, 0x47, 0x5f, 0x35, 0x7c, 0x59, 0x02, 0xf0, 0x2c, 0x86, 0x2a, 0x90, 0xa9, - 0xb8, 0x25, 0x2a, 0x6b, 0xf3, 0xae, 0x9c, 0x89, 0xe8, 0x92, 0x90, 0xd9, 0xd9, 0x4c, 0xfd, 0xc5, - 0x9b, 0x53, 0x92, 0x32, 0x5a, 0x09, 0xf5, 0xc8, 0x8f, 0xc1, 0x50, 0xd3, 0xac, 0xaa, 0x0e, 0x2e, - 0xd3, 0x55, 0x5d, 0x2c, 0x72, 0xd6, 0x9f, 0x24, 0x58, 0xb7, 0x6e, 0x4e, 0x21, 0xd6, 0x3a, 0x9f, - 0xb0, 0x4c, 0x73, 0x01, 0x60, 0x14, 0x22, 0xe0, 0x6b, 0xda, 0x1f, 0x48, 0x30, 0x34, 0xe7, 0x3b, - 0x05, 0x96, 0x85, 0xc1, 0x86, 0xa1, 0x6b, 0x3b, 0xdc, 0x3b, 0x53, 0x8a, 0x28, 0xa2, 0x1c, 0x24, - 0xd9, 0xf5, 0x3b, 0x67, 0x4f, 0x6c, 0x8c, 0x8a, 0x32, 0x91, 0xba, 0x8e, 0x37, 0x6d, 0x4d, 0x74, - 0x8a, 0x22, 0x8a, 0xe8, 0x12, 0x64, 0x6c, 0x5c, 0x69, 0x5a, 0x9a, 0xb3, 0x57, 0xae, 0x18, 0xba, - 0xa3, 0x56, 0x1c, 0x76, 0x91, 0xab, 0x78, 0xec, 0xd6, 0xcd, 0xa9, 0x23, 0x4c, 0xd7, 0x30, 0x87, - 0xac, 0x8c, 0x0a, 0xd2, 0x2c, 0xa3, 0x90, 0x1a, 0xaa, 0xd8, 0x51, 0xb5, 0xba, 0x9d, 0x65, 0x2f, - 0xcf, 0x44, 0xd1, 0xd7, 0x96, 0xcf, 0x0d, 0xfa, 0xb7, 0xb9, 0x2e, 0x41, 0xc6, 0x30, 0xb1, 0x15, - 0x48, 0x4b, 0xa5, 0x70, 0xcd, 0x61, 0x0e, 0x59, 0x19, 0x15, 0x24, 0x91, 0xb2, 0x3a, 0xa4, 0xb7, - 0xc5, 0xb2, 0xd1, 0x6c, 0x6e, 0x7a, 0xbb, 0x63, 0x13, 0x2d, 0xbd, 0x51, 0xd0, 0xf7, 0x8a, 0x8f, - 0x79, 0xe8, 0x61, 0x39, 0xf9, 0x0b, 0x9f, 0x7e, 0x78, 0x82, 0x07, 0x17, 0x6f, 0xb7, 0xea, 0x19, - 0xbc, 0x47, 0xba, 0x9f, 0xb3, 0xae, 0x52, 0x4e, 0x92, 0x84, 0xbe, 0xa8, 0x6a, 0x75, 0x71, 0x21, - 0x59, 0xe1, 0x25, 0x54, 0x80, 0x01, 0xdb, 0x51, 0x9d, 0xa6, 0xcd, 0x3f, 0x1c, 0xf6, 0x40, 0x84, - 0xc7, 0x15, 0x0d, 0xbd, 0xba, 0x46, 0x05, 0x14, 0x2e, 0x48, 0xe2, 0x88, 0x63, 0xec, 0x60, 0x9d, - 0x5b, 0xb2, 0xa7, 0xd1, 0x4e, 0x5f, 0xe9, 0x31, 0x69, 0x62, 0x98, 0x2a, 0xae, 0xe3, 0x1a, 0xcb, - 0xb5, 0xb6, 0x55, 0xb2, 0x24, 0xa1, 0x9f, 0x11, 0x2b, 0x2e, 0xf4, 0x3c, 0x24, 0xb9, 0xc1, 0xc2, - 0x78, 0xb2, 0x32, 0xea, 0x92, 0xd6, 0x28, 0x05, 0x29, 0x81, 0x53, 0x8b, 0xfc, 0x5b, 0x7b, 0xa7, - 0x22, 0xac, 0xe0, 0xf3, 0x70, 0xb1, 0x77, 0xe1, 0x3f, 0xfa, 0x78, 0x09, 0x32, 0x4d, 0x7d, 0xd3, - 0xd0, 0xe9, 0x1d, 0x42, 0x9e, 0xfb, 0x93, 0xb5, 0x5f, 0xdc, 0xef, 0x2a, 0x61, 0x0e, 0x59, 0x19, - 0x75, 0x49, 0x97, 0xd9, 0x0a, 0xa1, 0x0a, 0x23, 0x1e, 0x17, 0x1d, 0xb6, 0xa9, 0xc8, 0x61, 0x7b, - 0x17, 0x1f, 0xb6, 0x87, 0xc2, 0xb5, 0x78, 0x23, 0x77, 0xd8, 0x25, 0x12, 0x31, 0xb4, 0x02, 0xe0, - 0x05, 0x0b, 0xba, 0x87, 0x31, 0x14, 0xe9, 0x06, 0x5e, 0xe0, 0x11, 0x4b, 0x42, 0x0f, 0x02, 0xbd, - 0x1d, 0xc6, 0x1b, 0x9a, 0x5e, 0xb6, 0x71, 0x7d, 0xab, 0xcc, 0xcd, 0x4d, 0x90, 0xe9, 0xb7, 0x61, - 0x8a, 0x8b, 0xbd, 0x79, 0xc7, 0xad, 0x9b, 0x53, 0x39, 0x1e, 0x5e, 0x5b, 0x21, 0x65, 0x65, 0xac, - 0xa1, 0xe9, 0x6b, 0xb8, 0xbe, 0x35, 0xe7, 0xd2, 0xf2, 0xe9, 0x77, 0x7f, 0x6c, 0xaa, 0x8f, 0x8f, - 0xe1, 0x3e, 0xf9, 0x3c, 0xdd, 0x5e, 0xe7, 0x63, 0x0f, 0xdb, 0x64, 0xd9, 0xa2, 0x8a, 0x02, 0xdd, - 0xf4, 0x48, 0x29, 0x1e, 0x81, 0x8d, 0xfd, 0x57, 0xfe, 0xc3, 0xb4, 0x24, 0xff, 0x9a, 0x04, 0x03, - 0x73, 0x57, 0x57, 0x55, 0xcd, 0x42, 0x0b, 0x30, 0xe6, 0xf9, 0x51, 0x70, 0xe4, 0x1f, 0xbf, 0x75, - 0x73, 0x2a, 0x1b, 0x76, 0x35, 0x77, 0xe8, 0x7b, 0xee, 0x2c, 0xc6, 0xfe, 0x42, 0xa7, 0xb5, 0x6d, - 0x00, 0xaa, 0x85, 0x45, 0x6e, 0x5d, 0xf9, 0x86, 0x9a, 0xb9, 0x08, 0x83, 0x4c, 0x5b, 0xfa, 0xe1, - 0x0b, 0x93, 0xfc, 0xe0, 0xef, 0x0e, 0xee, 0x8d, 0x72, 0x65, 0x2a, 0xe6, 0x6e, 0x79, 0x12, 0x49, - 0xf9, 0xfd, 0x31, 0x80, 0xb9, 0xab, 0x57, 0xd7, 0x2d, 0xcd, 0xac, 0x63, 0xe7, 0x76, 0x1a, 0x60, - 0x1d, 0x0e, 0xf9, 0xd6, 0x53, 0x56, 0x25, 0x64, 0x84, 0xe9, 0x5b, 0x37, 0xa7, 0x8e, 0x87, 0x8d, - 0xe0, 0x63, 0x93, 0x95, 0x71, 0x6f, 0x65, 0x65, 0x55, 0xda, 0xa2, 0x56, 0x6d, 0xc7, 0x45, 0x8d, - 0x77, 0x46, 0xf5, 0xb1, 0xf9, 0x51, 0xe7, 0x6c, 0xa7, 0xbd, 0x85, 0x5f, 0x80, 0x21, 0xcf, 0x24, - 0x36, 0x7a, 0x06, 0x92, 0x0e, 0xff, 0xcd, 0x0d, 0xfd, 0x40, 0xa4, 0xa1, 0x85, 0x34, 0x37, 0xb6, - 0x0b, 0x20, 0xff, 0x85, 0x04, 0xe0, 0x79, 0xf0, 0x8f, 0xa6, 0xc3, 0x91, 0x30, 0xcf, 0x83, 0x72, - 0xfc, 0x40, 0x49, 0x1d, 0x97, 0x0e, 0x99, 0xf5, 0x17, 0x63, 0x30, 0xbe, 0x21, 0xc2, 0xd1, 0x8f, - 0xbc, 0x0d, 0x9e, 0x83, 0x41, 0xac, 0x3b, 0x96, 0x46, 0x8d, 0x40, 0x3a, 0xfd, 0xf1, 0x88, 0x4e, - 0x6f, 0xd3, 0x34, 0xfa, 0xc9, 0x1c, 0xb1, 0x59, 0xcf, 0xd1, 0x42, 0x46, 0x79, 0x6f, 0x1c, 0xb2, - 0x9d, 0x24, 0xd1, 0x2c, 0x8c, 0x56, 0x2c, 0x4c, 0x09, 0x65, 0xff, 0x8e, 0x61, 0x31, 0xe7, 0xa5, - 0xa2, 0x21, 0x06, 0x59, 0x19, 0x11, 0x14, 0x3e, 0xb3, 0xd4, 0x80, 0x24, 0x88, 0xc4, 0xfb, 0x08, - 0x57, 0x97, 0x19, 0xa1, 0xcc, 0xa7, 0x16, 0x51, 0x49, 0x10, 0x80, 0xcd, 0x2d, 0x23, 0x1e, 0x95, - 0x4e, 0x2e, 0x2f, 0xc1, 0xa8, 0xa6, 0x6b, 0x8e, 0xa6, 0xd6, 0xcb, 0x9b, 0x6a, 0x5d, 0xd5, 0x2b, - 0x07, 0x49, 0xb3, 0xd9, 0x3c, 0xc0, 0xab, 0x0d, 0xc1, 0xc9, 0xca, 0x08, 0xa7, 0x14, 0x19, 0x01, - 0x5d, 0x86, 0x41, 0x51, 0x55, 0xe2, 0x40, 0x09, 0x89, 0x10, 0xf7, 0xa5, 0x82, 0xef, 0x89, 0xc3, - 0x98, 0x82, 0xab, 0xff, 0xbf, 0x2b, 0x7a, 0xeb, 0x8a, 0x25, 0x00, 0x36, 0xea, 0x49, 0xb8, 0x3d, - 0x40, 0x6f, 0x90, 0xb8, 0x91, 0x62, 0x08, 0x73, 0xb6, 0xe3, 0xeb, 0x8f, 0xff, 0x14, 0x83, 0xb4, - 0xbf, 0x3f, 0xfe, 0x8a, 0xce, 0x51, 0x68, 0xd5, 0x0b, 0x48, 0x6c, 0xf7, 0xfe, 0x91, 0x88, 0x80, - 0xd4, 0xe2, 0xc4, 0xfb, 0x47, 0xa2, 0xff, 0x19, 0x83, 0x81, 0x55, 0xd5, 0x52, 0x1b, 0x36, 0xaa, - 0xb4, 0x24, 0xa3, 0x62, 0xf7, 0xb2, 0xe5, 0xab, 0xd2, 0x7c, 0xb3, 0x24, 0x22, 0x17, 0xfd, 0x50, - 0x9b, 0x5c, 0xf4, 0xad, 0x30, 0x42, 0x96, 0xd1, 0xbe, 0x13, 0x10, 0xc4, 0xe8, 0xc3, 0xc5, 0xa3, - 0x1e, 0x4a, 0xf0, 0x39, 0x5b, 0x65, 0x5f, 0xf5, 0x1f, 0x81, 0x18, 0x22, 0x1c, 0x5e, 0x98, 0x26, - 0xe2, 0x87, 0xbd, 0x75, 0xac, 0xef, 0xa1, 0xac, 0x40, 0x43, 0xdd, 0x2d, 0xb1, 0x02, 0x5a, 0x04, - 0xb4, 0xed, 0x6e, 0xac, 0x94, 0x3d, 0xab, 0x12, 0xf9, 0x13, 0xb7, 0x6e, 0x4e, 0x1d, 0x65, 0xf2, - 0xad, 0x3c, 0xb2, 0x32, 0xe6, 0x11, 0x05, 0xda, 0x59, 0x00, 0xd2, 0xae, 0x32, 0x3b, 0x93, 0xc8, - 0x16, 0x46, 0x87, 0x6e, 0xdd, 0x9c, 0x1a, 0x63, 0x28, 0xde, 0x33, 0x59, 0x49, 0x91, 0xc2, 0x1c, - 0xf9, 0xed, 0x73, 0xf0, 0xd7, 0x25, 0x40, 0x5e, 0xe4, 0x57, 0xb0, 0x6d, 0x92, 0x05, 0x1d, 0xc9, - 0xd5, 0x7d, 0x19, 0xb5, 0xd4, 0x55, 0xae, 0xee, 0xc1, 0x88, 0x5c, 0xdd, 0x37, 0x6e, 0x9e, 0xf4, - 0x82, 0x65, 0x8c, 0x77, 0x67, 0x9b, 0x73, 0x9c, 0x33, 0xb3, 0x86, 0x26, 0xa4, 0x5b, 0xa2, 0x63, - 0x9f, 0xfc, 0xc7, 0x12, 0x1c, 0x6d, 0x71, 0x2c, 0x57, 0x67, 0x0c, 0xc8, 0xf2, 0x3d, 0xe4, 0xdf, - 0x90, 0x63, 0xba, 0x1f, 0xd4, 0x5d, 0xc7, 0xac, 0x96, 0x60, 0x7c, 0xfb, 0xc2, 0x3e, 0x3b, 0x0f, - 0xfa, 0xaf, 0x24, 0x98, 0xf0, 0x57, 0xef, 0xb6, 0x67, 0x03, 0xd2, 0xfe, 0xda, 0x79, 0x4b, 0x1e, - 0xec, 0xa1, 0x25, 0xbc, 0x11, 0x01, 0x18, 0xf4, 0xbc, 0x37, 0x94, 0xd9, 0x7e, 0xdc, 0x13, 0xbd, - 0xda, 0x46, 0x68, 0x18, 0x1e, 0xd2, 0x09, 0xda, 0x49, 0xff, 0x47, 0x82, 0xc4, 0xaa, 0x61, 0xd4, - 0x91, 0x01, 0x63, 0xba, 0xe1, 0x94, 0x89, 0xd7, 0xe1, 0x6a, 0x99, 0x2f, 0xdd, 0x59, 0xa8, 0x9c, - 0xed, 0xcd, 0x64, 0xdf, 0xba, 0x39, 0xd5, 0x0a, 0xa5, 0x8c, 0xea, 0x86, 0x53, 0xa4, 0x94, 0x75, - 0xb6, 0xb0, 0x7f, 0x3b, 0x0c, 0x07, 0x2b, 0x63, 0x81, 0xf4, 0xb9, 0x9e, 0x2b, 0x0b, 0xc2, 0xdc, - 0xba, 0x39, 0x35, 0xe1, 0x8d, 0x26, 0x97, 0x2c, 0x2b, 0xe9, 0x4d, 0x5f, 0xed, 0xec, 0xe4, 0xd8, - 0x77, 0x3e, 0x36, 0x25, 0x9d, 0xfa, 0x8c, 0x04, 0xe0, 0xed, 0x5f, 0xa0, 0x87, 0xe0, 0x48, 0x71, - 0x65, 0x79, 0xae, 0xbc, 0xb6, 0x5e, 0x58, 0xdf, 0x58, 0x2b, 0x6f, 0x2c, 0xaf, 0xad, 0x96, 0x66, - 0x17, 0x2e, 0x2d, 0x94, 0xe6, 0xbc, 0x9d, 0x77, 0xdb, 0xc4, 0x15, 0x6d, 0x4b, 0xc3, 0x55, 0x74, - 0x1f, 0x4c, 0x04, 0xb9, 0x49, 0xa9, 0x34, 0x97, 0x91, 0x72, 0xe9, 0x57, 0x6f, 0x4c, 0x27, 0x59, - 0xba, 0x86, 0xab, 0xe8, 0x24, 0x1c, 0x6a, 0xe5, 0x5b, 0x58, 0x9e, 0xcf, 0xc4, 0x72, 0xc3, 0xaf, - 0xde, 0x98, 0x4e, 0xb9, 0x79, 0x1d, 0x92, 0x01, 0xf9, 0x39, 0x39, 0x5e, 0x3c, 0x07, 0xaf, 0xde, - 0x98, 0x1e, 0x60, 0x06, 0xcc, 0x25, 0xde, 0xfd, 0x89, 0xc9, 0xbe, 0xe2, 0xdb, 0x3a, 0xee, 0xad, - 0x5f, 0xf4, 0xd9, 0x4e, 0x7b, 0xa9, 0xde, 0x24, 0xeb, 0x6f, 0x4d, 0xaf, 0x9c, 0x66, 0x9e, 0xa3, - 0x39, 0x7b, 0x0f, 0x73, 0xaf, 0x79, 0xb8, 0x61, 0x54, 0x9b, 0x75, 0x7c, 0x7a, 0x57, 0xec, 0x9c, - 0x87, 0xf6, 0xd8, 0xff, 0xfc, 0x08, 0x64, 0xc3, 0x7b, 0xec, 0xce, 0x6e, 0x77, 0xdb, 0xeb, 0xfb, - 0x6c, 0xa4, 0x47, 0x6e, 0x94, 0x77, 0xd8, 0x9a, 0x3f, 0xf8, 0xf6, 0xf9, 0xfe, 0x6f, 0x0a, 0xe4, - 0x7f, 0x9f, 0x00, 0xb4, 0x64, 0xd7, 0x66, 0x49, 0x0e, 0xe6, 0x3b, 0x09, 0x16, 0xda, 0x05, 0x92, - 0x6e, 0xc7, 0x2e, 0xd0, 0x7a, 0x60, 0x5f, 0x25, 0x76, 0xa0, 0x0d, 0xdd, 0xae, 0x37, 0x57, 0xe2, - 0x6f, 0xca, 0xe6, 0x4a, 0xfb, 0x34, 0x2b, 0x71, 0xfb, 0x96, 0x65, 0xfd, 0x07, 0x5d, 0x9a, 0xf2, - 0x8d, 0xd4, 0x81, 0x7d, 0x36, 0x52, 0xb3, 0x1d, 0x77, 0x4b, 0xb9, 0x34, 0x3a, 0x27, 0x6e, 0x05, - 0x0d, 0x76, 0x37, 0x15, 0xf2, 0x6b, 0x43, 0xc9, 0x77, 0x8b, 0x89, 0xf0, 0x38, 0xe4, 0x5a, 0x9d, - 0x4b, 0x84, 0x65, 0xf9, 0xb5, 0x38, 0x64, 0x96, 0xec, 0x5a, 0xa9, 0xaa, 0x39, 0x77, 0xd6, 0xf3, - 0x2e, 0x76, 0x5e, 0xf1, 0xa2, 0x5b, 0x37, 0xa7, 0x46, 0x98, 0x69, 0xf7, 0x31, 0x68, 0x03, 0x46, - 0x43, 0x6f, 0x24, 0xb8, 0x83, 0xcd, 0x1d, 0xe4, 0xc5, 0x48, 0x08, 0x4a, 0xa6, 0x2b, 0x13, 0x9f, - 0x9b, 0xa3, 0xdd, 0xf6, 0x3e, 0xcd, 0xfc, 0xea, 0xf2, 0x9d, 0xdc, 0x2c, 0xf4, 0xba, 0x2e, 0x07, - 0xd9, 0x70, 0xdf, 0xb8, 0x1d, 0xf7, 0xa7, 0x12, 0x0c, 0x2d, 0xd9, 0x62, 0x25, 0x8e, 0x7f, 0x44, - 0x37, 0x27, 0x1e, 0x77, 0xef, 0xba, 0xc4, 0xbb, 0x73, 0x5f, 0x71, 0xff, 0xc5, 0x33, 0xc2, 0x21, - 0x18, 0xf7, 0xb5, 0xd3, 0x6d, 0xff, 0x1f, 0xc6, 0x68, 0xd0, 0x2c, 0xe2, 0x9a, 0xa6, 0xbb, 0x59, - 0x07, 0xfe, 0xab, 0xba, 0xe6, 0xf2, 0xec, 0x9c, 0x38, 0xa8, 0x9d, 0x77, 0x68, 0x9c, 0x08, 0xd9, - 0xd3, 0x4d, 0x30, 0x97, 0x5a, 0x77, 0x04, 0xa4, 0x1e, 0x0e, 0xe9, 0x84, 0xd6, 0xfd, 0xf2, 0x37, - 0x25, 0x18, 0x5e, 0xb2, 0x6b, 0x1b, 0x7a, 0xf5, 0xff, 0x79, 0xff, 0xdd, 0x82, 0x43, 0x81, 0x96, - 0xde, 0x21, 0x93, 0x9e, 0xf9, 0x6a, 0x02, 0xe2, 0x4b, 0x76, 0x0d, 0xfd, 0x24, 0x8c, 0x86, 0x33, - 0x89, 0x47, 0x23, 0x42, 0x77, 0xeb, 0xfc, 0x90, 0x7b, 0xb2, 0x67, 0x11, 0xb7, 0x5d, 0x7b, 0x30, - 0x1c, 0x9c, 0x4e, 0x4e, 0x47, 0x63, 0x05, 0x04, 0x72, 0x8f, 0xf7, 0x28, 0xe0, 0x56, 0xfd, 0x22, - 0x24, 0xdd, 0x80, 0x78, 0x2a, 0x1a, 0x44, 0xf0, 0xe6, 0xce, 0x74, 0xcf, 0xeb, 0xd6, 0xf5, 0x93, - 0x30, 0x1a, 0x0e, 0x3e, 0x5d, 0xd8, 0x39, 0x24, 0xd2, 0x8d, 0x9d, 0x3b, 0x0d, 0x49, 0x13, 0xc0, - 0x37, 0x7e, 0x1e, 0x8a, 0x06, 0xf2, 0xb8, 0x73, 0x67, 0x7b, 0xe1, 0x76, 0xd7, 0x70, 0x6f, 0x42, - 0xce, 0xff, 0x95, 0x18, 0x9c, 0xf2, 0x67, 0xd3, 0x2f, 0x35, 0xb1, 0xb5, 0xe7, 0xe6, 0xcd, 0xa6, - 0x5a, 0xd3, 0x74, 0xff, 0xcd, 0xc2, 0xa3, 0xfe, 0xe1, 0x48, 0x79, 0x45, 0x13, 0xe4, 0x77, 0x4b, - 0x30, 0xb4, 0xaa, 0xd6, 0xb0, 0x82, 0x5f, 0x6a, 0x62, 0xdb, 0x69, 0x73, 0xa7, 0xed, 0x30, 0x0c, - 0x18, 0x5b, 0x5b, 0xe2, 0x04, 0x5d, 0x42, 0xe1, 0x25, 0x34, 0x01, 0xfd, 0x75, 0xad, 0xa1, 0xb1, - 0x31, 0x9f, 0x50, 0x58, 0x01, 0x4d, 0xc1, 0x50, 0x85, 0x0c, 0xed, 0x32, 0xbb, 0x0d, 0x90, 0x10, - 0x5f, 0x9f, 0x6a, 0xea, 0xce, 0x3a, 0xbd, 0x12, 0x90, 0x85, 0x41, 0x0b, 0x5f, 0xc3, 0x96, 0xcd, - 0xbe, 0xb7, 0x9b, 0x54, 0x44, 0x51, 0xbe, 0x08, 0x69, 0xa6, 0x09, 0xef, 0xb9, 0xa3, 0x90, 0xa4, - 0xe7, 0xba, 0x3d, 0x7d, 0x06, 0x49, 0xf9, 0x19, 0x76, 0x33, 0x8e, 0xe1, 0x33, 0x95, 0x58, 0xa1, - 0x58, 0xec, 0x68, 0xf8, 0x93, 0xd1, 0x59, 0x08, 0xb3, 0xa1, 0x6b, 0xe1, 0xdf, 0xef, 0x87, 0x43, - 0x7c, 0x05, 0xa4, 0x9a, 0xda, 0xe9, 0x6d, 0xc7, 0x11, 0x77, 0xb9, 0x81, 0x87, 0x1d, 0xd5, 0xd4, - 0xe4, 0x3d, 0x48, 0x5c, 0x76, 0x1c, 0x13, 0x9d, 0x82, 0x7e, 0xab, 0x59, 0xc7, 0xe2, 0x85, 0x92, - 0x9b, 0xc5, 0xaa, 0xa6, 0x36, 0x43, 0x18, 0x94, 0x66, 0x1d, 0x2b, 0x8c, 0x05, 0x95, 0x60, 0x6a, - 0xab, 0x59, 0xaf, 0xef, 0x95, 0xab, 0x98, 0xfe, 0x4b, 0x41, 0xf7, 0x9f, 0xf2, 0xe0, 0x5d, 0x53, - 0xd5, 0xdd, 0x15, 0x47, 0x52, 0x39, 0x4e, 0xd9, 0xe6, 0x28, 0x97, 0xf8, 0x87, 0x3c, 0x25, 0xc1, - 0x23, 0xff, 0x49, 0x0c, 0x92, 0x02, 0x9a, 0x5e, 0x55, 0xc3, 0x75, 0x5c, 0x71, 0x0c, 0x71, 0x58, - 0xc3, 0x2d, 0x23, 0x04, 0xf1, 0x1a, 0xef, 0xbc, 0xd4, 0xe5, 0x3e, 0x85, 0x14, 0x08, 0xcd, 0xbd, - 0x40, 0x48, 0x68, 0x66, 0x93, 0xf4, 0x67, 0xc2, 0x34, 0xc4, 0x5e, 0xef, 0xe5, 0x3e, 0x85, 0x96, - 0x50, 0x16, 0x06, 0x88, 0x83, 0x3b, 0xac, 0xb7, 0x08, 0x9d, 0x97, 0xd1, 0x61, 0xe8, 0x37, 0x55, - 0xa7, 0xc2, 0xce, 0xf6, 0x93, 0x07, 0xac, 0x48, 0x26, 0x03, 0xf6, 0x9d, 0x8a, 0xf0, 0xff, 0xeb, - 0x22, 0xc6, 0x60, 0x1f, 0x04, 0x25, 0x7a, 0xaf, 0xaa, 0x8e, 0x83, 0x2d, 0x9d, 0x00, 0x32, 0x76, - 0x84, 0x20, 0xb1, 0x69, 0x54, 0xf7, 0xf8, 0xff, 0x10, 0xa3, 0xbf, 0xf9, 0x3f, 0x2d, 0xa2, 0xfe, - 0x50, 0xa6, 0x0f, 0xd9, 0xbf, 0x4e, 0x4c, 0x0b, 0x62, 0x91, 0x30, 0x95, 0x60, 0x5c, 0xad, 0x56, - 0x35, 0xf6, 0xef, 0xbc, 0xca, 0x9b, 0x1a, 0x5d, 0xa4, 0xdb, 0xf4, 0x1f, 0x63, 0x76, 0xea, 0x0b, - 0xe4, 0x09, 0x14, 0x39, 0x7f, 0x31, 0x05, 0x83, 0x26, 0x53, 0x4a, 0xbe, 0x00, 0x63, 0x2d, 0x9a, - 0x12, 0xfd, 0x76, 0x34, 0xbd, 0x2a, 0x6e, 0x55, 0x92, 0xdf, 0x84, 0x46, 0x3f, 0xe1, 0xcb, 0x8e, - 0xc1, 0xd0, 0xdf, 0xc5, 0x77, 0x76, 0xbe, 0x7a, 0x3b, 0xe2, 0xbb, 0x7a, 0xab, 0x9a, 0x5a, 0x31, - 0x45, 0xf1, 0xf9, 0x8d, 0xdb, 0x42, 0xeb, 0x8d, 0xdb, 0x1a, 0xd6, 0xc5, 0x0a, 0x9b, 0x3c, 0x52, - 0x4d, 0xcd, 0xa6, 0xee, 0xe8, 0x7d, 0x52, 0xd8, 0xbe, 0xe0, 0xfb, 0x4d, 0x6f, 0xe0, 0x26, 0xe6, - 0x0b, 0xab, 0x0b, 0xae, 0x1f, 0x7f, 0x2e, 0x06, 0xc7, 0x7d, 0x7e, 0xec, 0x63, 0x6e, 0x75, 0xe7, - 0x5c, 0x7b, 0x8f, 0xef, 0xe2, 0x6e, 0xfe, 0x33, 0x90, 0x20, 0xfc, 0x28, 0xe2, 0x5f, 0x0a, 0x65, - 0x7f, 0xf3, 0x0b, 0xff, 0x54, 0x0e, 0xae, 0xf3, 0x02, 0xbd, 0x42, 0x41, 0x8a, 0x3f, 0xdb, 0xbd, - 0xfd, 0x32, 0xde, 0xd7, 0x94, 0xed, 0xdb, 0x67, 0xc6, 0xb0, 0x0d, 0x3f, 0xf8, 0x04, 0x1c, 0x0b, - 0xef, 0x4d, 0xb0, 0x28, 0xda, 0xd5, 0x26, 0x4b, 0x0f, 0x91, 0xba, 0xd3, 0x45, 0xc4, 0xfd, 0x7a, - 0x30, 0x6a, 0xdf, 0x64, 0x17, 0x0e, 0x3f, 0x4b, 0x2a, 0xf5, 0x76, 0xda, 0x45, 0xac, 0x3f, 0xec, - 0x9e, 0x20, 0x92, 0xf8, 0x3f, 0x24, 0x15, 0xc7, 0x82, 0xc0, 0x53, 0x8c, 0x6f, 0x7f, 0xdc, 0x37, - 0xd3, 0x71, 0x0e, 0x99, 0xf1, 0xcd, 0x1f, 0x8a, 0x4f, 0x52, 0xfe, 0x94, 0x04, 0x47, 0x5a, 0xaa, - 0xe6, 0xc1, 0x7d, 0xb9, 0xcd, 0x65, 0xc9, 0x5e, 0x8f, 0x31, 0xfa, 0xef, 0x4f, 0xce, 0xb7, 0xd1, - 0xf9, 0xfe, 0x48, 0x9d, 0x99, 0x32, 0x01, 0xa5, 0x9f, 0x86, 0x43, 0x41, 0x9d, 0x85, 0xb5, 0xee, - 0x85, 0x91, 0x60, 0x32, 0xcc, 0xad, 0x36, 0x1c, 0x48, 0x87, 0xe5, 0xad, 0xb0, 0xb9, 0xdd, 0x26, - 0x2f, 0x42, 0xca, 0x65, 0xe5, 0x39, 0x6c, 0xaf, 0x2d, 0xf6, 0x00, 0xe4, 0xf7, 0x4b, 0x30, 0x1d, - 0xac, 0xc8, 0x5b, 0x1c, 0xdb, 0xbd, 0xe9, 0x7c, 0xdb, 0x3a, 0xfc, 0x3b, 0x12, 0xdc, 0xb5, 0x8f, - 0x4e, 0xdc, 0x0e, 0x3f, 0x25, 0xc1, 0x84, 0xef, 0xa5, 0x82, 0x08, 0xe5, 0xc2, 0x0b, 0x1e, 0xed, - 0xfa, 0xa5, 0x88, 0x9b, 0x71, 0x1d, 0x23, 0xc6, 0x79, 0xfd, 0x2b, 0x53, 0xe3, 0xad, 0xcf, 0x6c, - 0x65, 0xbc, 0xf5, 0x45, 0xc0, 0x6d, 0x74, 0x97, 0xd7, 0x24, 0x78, 0x20, 0xd8, 0xe4, 0x36, 0xaf, - 0xff, 0x7f, 0x58, 0xfd, 0xf1, 0x55, 0x09, 0x4e, 0x75, 0xa3, 0x1c, 0xef, 0x18, 0x0d, 0xc6, 0xbd, - 0x17, 0x7d, 0xe1, 0x6e, 0x39, 0xd3, 0xfb, 0x79, 0x09, 0xee, 0xb4, 0xc8, 0x05, 0xbd, 0x03, 0xf6, - 0x37, 0xf9, 0x70, 0xf3, 0xf7, 0xbc, 0x6b, 0xeb, 0xe0, 0x3a, 0x58, 0xd8, 0x3a, 0xb0, 0x12, 0x6e, - 0xd3, 0x25, 0xb1, 0x36, 0x5d, 0xe2, 0x5b, 0xa9, 0xbe, 0x83, 0x07, 0xb5, 0x36, 0xef, 0xf8, 0x36, - 0x61, 0xbc, 0x8d, 0x63, 0xf3, 0xb1, 0xde, 0xbb, 0x5f, 0x2b, 0xa8, 0xd5, 0x75, 0xe5, 0x3d, 0x98, - 0xa2, 0xd5, 0xb7, 0xb1, 0xf7, 0x9d, 0x6e, 0xb9, 0xc3, 0x23, 0x4e, 0xdb, 0xaa, 0xb9, 0x09, 0x56, - 0x61, 0x80, 0x75, 0x37, 0x6f, 0xf5, 0xc1, 0xdd, 0x86, 0xe3, 0xc8, 0x1f, 0x16, 0x81, 0x6e, 0x4e, - 0x68, 0xdf, 0x7e, 0x60, 0x75, 0xd3, 0xe4, 0xdb, 0x34, 0xb0, 0x7c, 0x36, 0xf9, 0xb2, 0x08, 0x79, - 0xed, 0xb5, 0x73, 0x57, 0xdc, 0xb7, 0x39, 0xe2, 0x31, 0x13, 0xdd, 0xd9, 0xd0, 0xf6, 0x2b, 0x22, - 0xb4, 0xb9, 0x4d, 0x8b, 0x08, 0x6d, 0x3f, 0x9c, 0x1e, 0x70, 0x83, 0x5c, 0x84, 0x9a, 0x7f, 0x89, - 0x83, 0xdc, 0x77, 0x24, 0x38, 0x4a, 0x9b, 0xe8, 0x7f, 0x71, 0xdc, 0xab, 0xe5, 0x1f, 0x02, 0x64, - 0x5b, 0x95, 0x72, 0xdb, 0x21, 0x9f, 0xb1, 0xad, 0xca, 0xd5, 0xc0, 0x14, 0xf4, 0x10, 0xa0, 0xaa, - 0xed, 0x84, 0xb9, 0xd9, 0x91, 0xfe, 0x4c, 0xd5, 0x76, 0xae, 0xee, 0x33, 0x61, 0x25, 0x6e, 0x43, - 0xaf, 0x7e, 0x49, 0x82, 0x5c, 0xbb, 0x26, 0xbb, 0xbb, 0x3a, 0x87, 0x03, 0x27, 0x13, 0xc2, 0x1d, - 0xf9, 0x58, 0x0f, 0x6f, 0xe0, 0x43, 0x83, 0xea, 0x90, 0x85, 0xef, 0x74, 0xc6, 0x30, 0x15, 0xf4, - 0xd7, 0xd6, 0xcc, 0xfc, 0x87, 0x36, 0x98, 0x7e, 0xaf, 0x25, 0xd8, 0xfe, 0x65, 0xca, 0xdd, 0x77, - 0x61, 0xb2, 0x83, 0xf2, 0x77, 0x7a, 0x6a, 0x34, 0x3a, 0xf6, 0xe9, 0x1d, 0x4a, 0xff, 0xcf, 0xf2, - 0xe1, 0x11, 0xbc, 0x51, 0xe6, 0x5b, 0xd9, 0xb5, 0xbb, 0x92, 0x2e, 0xff, 0x75, 0x38, 0xd6, 0x56, - 0x8a, 0xab, 0x58, 0x80, 0xc4, 0xb6, 0x66, 0x3b, 0x5c, 0xbb, 0x87, 0x23, 0xb4, 0x0b, 0x81, 0x50, - 0x51, 0x19, 0x41, 0x86, 0xd6, 0xb0, 0x6a, 0x18, 0x75, 0xae, 0x8d, 0xac, 0xc0, 0x98, 0x8f, 0xc6, - 0xeb, 0x7a, 0x0a, 0x12, 0xa6, 0xc1, 0xbf, 0xba, 0x34, 0x74, 0xe6, 0xee, 0x88, 0xba, 0x88, 0x28, - 0x37, 0x02, 0x15, 0x93, 0x27, 0x00, 0x31, 0x4c, 0x7a, 0xc4, 0x4d, 0xd4, 0xf4, 0x02, 0x8c, 0x07, - 0xa8, 0xbc, 0xae, 0x59, 0x18, 0x30, 0x29, 0x85, 0xd7, 0x16, 0x75, 0xb2, 0x9e, 0x89, 0xbb, 0x5f, - 0xb5, 0xa1, 0xa5, 0x33, 0xbf, 0x7e, 0x04, 0xfa, 0x29, 0x38, 0xfa, 0xa4, 0x04, 0xe0, 0x3b, 0xb7, - 0x76, 0x2e, 0x02, 0xad, 0xfd, 0xea, 0x3b, 0x77, 0xbe, 0x57, 0x31, 0x9e, 0x00, 0x9e, 0x7a, 0xe7, - 0xbf, 0xf9, 0xc6, 0x07, 0x62, 0xf7, 0x20, 0x59, 0xec, 0x64, 0x86, 0x97, 0xff, 0xbe, 0x91, 0xf5, - 0x3b, 0x81, 0xcf, 0xfd, 0x9c, 0xed, 0xa9, 0x46, 0xa1, 0xe7, 0xb9, 0x1e, 0xa5, 0xb8, 0x9a, 0x17, - 0xa8, 0x9a, 0xe7, 0xd0, 0x63, 0xd1, 0x6a, 0x9e, 0xfe, 0x89, 0xe0, 0x60, 0x7b, 0x07, 0x7a, 0x43, - 0x82, 0x89, 0x76, 0x6b, 0x48, 0x74, 0xb1, 0x27, 0x65, 0x5a, 0xd3, 0x94, 0xdc, 0x5b, 0x0f, 0x0e, - 0xc0, 0x1b, 0x36, 0x4f, 0x1b, 0x56, 0x40, 0x17, 0x0f, 0xd0, 0xb0, 0xd3, 0xbe, 0xb9, 0x0c, 0xfd, - 0x5c, 0x0c, 0x4e, 0xec, 0xbb, 0x30, 0x43, 0x97, 0x7b, 0x52, 0x76, 0x9f, 0xec, 0x2c, 0xb7, 0x70, - 0x1b, 0x90, 0x78, 0xfb, 0x9f, 0xa5, 0xed, 0x7f, 0x06, 0x2d, 0x1c, 0xa4, 0xfd, 0x5e, 0xea, 0xe5, - 0xb7, 0xc4, 0xbf, 0x0d, 0xde, 0xa2, 0xe8, 0xca, 0xe3, 0x5a, 0x96, 0x3d, 0xdd, 0x0d, 0xa8, 0xd6, - 0x5c, 0x5a, 0x7e, 0x9e, 0x36, 0x48, 0x41, 0xab, 0x3f, 0x60, 0x87, 0x9e, 0xfe, 0x89, 0xe0, 0xd4, - 0xf2, 0x0e, 0xf4, 0x33, 0x1d, 0xae, 0x48, 0x3c, 0xdd, 0x8d, 0xa6, 0x9d, 0x17, 0x78, 0xb9, 0x8b, - 0x07, 0x96, 0xe7, 0x4d, 0x6e, 0xd0, 0x26, 0xd7, 0x10, 0xbe, 0xdd, 0x4d, 0x6e, 0xdb, 0xc1, 0xe8, - 0x4b, 0x12, 0x4c, 0xb4, 0x5b, 0x1f, 0x75, 0x37, 0x9c, 0xf7, 0x59, 0xf7, 0x75, 0x37, 0x9c, 0xf7, - 0x5b, 0x9a, 0xc9, 0x6f, 0xa1, 0xa6, 0x38, 0x8f, 0xce, 0x76, 0x32, 0xc5, 0xbe, 0x3d, 0x4c, 0xc6, - 0xf0, 0xbe, 0xeb, 0x8e, 0xee, 0xc6, 0x70, 0x37, 0x2b, 0xac, 0xee, 0xc6, 0x70, 0x57, 0x8b, 0xa0, - 0xe8, 0x31, 0xec, 0xb6, 0xb3, 0xcb, 0x2e, 0xb6, 0xd1, 0xbf, 0x96, 0x60, 0x38, 0x90, 0xab, 0xa3, - 0x27, 0xba, 0xd1, 0xb7, 0xdd, 0x8a, 0x26, 0xf2, 0x75, 0x6f, 0xe7, 0x85, 0x81, 0xbc, 0x40, 0x5b, - 0x36, 0x8b, 0x0a, 0x07, 0x69, 0x99, 0x15, 0xd0, 0xff, 0xa6, 0x04, 0xe3, 0x6d, 0xd2, 0xe0, 0xee, - 0x46, 0x6f, 0xe7, 0xe4, 0x3e, 0x77, 0xf1, 0xc0, 0xf2, 0xbc, 0x8d, 0x97, 0x68, 0x1b, 0xdf, 0x8a, - 0x9e, 0x3e, 0x48, 0x1b, 0x7d, 0xd9, 0xc1, 0xb7, 0xbd, 0x93, 0xea, 0xbe, 0x7a, 0xd0, 0x53, 0x07, - 0xd3, 0x4f, 0x34, 0xef, 0xe9, 0x83, 0x8a, 0xf3, 0xd6, 0x3d, 0x47, 0x5b, 0xf7, 0x2c, 0x5a, 0xf9, - 0xc1, 0x5a, 0xd7, 0x9a, 0x54, 0x7c, 0xae, 0xf5, 0x03, 0x0c, 0x5d, 0x39, 0x5a, 0xdb, 0x14, 0x3b, - 0x97, 0x3f, 0x88, 0x28, 0x6f, 0xe2, 0x13, 0xb4, 0x89, 0x67, 0xd0, 0x23, 0x9d, 0x9a, 0xe8, 0xbb, - 0xaa, 0xa0, 0xe9, 0x5b, 0xc6, 0xe9, 0x9f, 0x60, 0xf9, 0xfb, 0x3b, 0xd0, 0x7b, 0xc5, 0x51, 0xf0, - 0xd3, 0xdd, 0x54, 0xef, 0x4b, 0xc2, 0x73, 0x8f, 0x74, 0x2f, 0xc0, 0xb5, 0xbc, 0x87, 0x6a, 0x39, - 0x89, 0x8e, 0x77, 0xd2, 0x92, 0x24, 0xe2, 0xe8, 0x83, 0x92, 0x7b, 0xcf, 0xe4, 0xd1, 0xae, 0xaa, - 0xf0, 0x27, 0xec, 0x91, 0x47, 0x4a, 0xda, 0x64, 0xf3, 0xf2, 0x7d, 0x54, 0xaf, 0x69, 0x34, 0xd9, - 0x51, 0x2f, 0x96, 0xbe, 0xbf, 0x09, 0xe7, 0x30, 0xbe, 0x37, 0xd0, 0xfa, 0x66, 0x50, 0x6d, 0x3a, - 0xdb, 0x2f, 0xff, 0x40, 0x5f, 0x37, 0x39, 0xf0, 0x11, 0x6a, 0xf9, 0x6b, 0x71, 0x40, 0x6b, 0x8e, - 0xba, 0x83, 0x0b, 0x4d, 0x67, 0xdb, 0xb0, 0xb4, 0x97, 0xd9, 0xfc, 0x8b, 0x01, 0x1a, 0xea, 0xae, - 0xff, 0xc2, 0xc0, 0xbe, 0x67, 0xb4, 0x1e, 0x7c, 0xfd, 0x2b, 0x53, 0xf7, 0x77, 0x71, 0x6e, 0x93, - 0x30, 0x2b, 0xa9, 0x86, 0xba, 0xcb, 0x6f, 0x0b, 0xfc, 0x38, 0xb0, 0x7f, 0xa6, 0x5e, 0xae, 0x93, - 0x45, 0x24, 0x5b, 0xc7, 0xbf, 0x25, 0xa2, 0x83, 0x5b, 0xb5, 0x9d, 0xf1, 0x7d, 0xac, 0xaf, 0x4f, - 0x49, 0x51, 0xc4, 0x45, 0xcd, 0x76, 0xd0, 0x8f, 0x41, 0xaa, 0x8a, 0xf5, 0x3d, 0x86, 0x1e, 0xbf, - 0x2d, 0xe8, 0x49, 0x02, 0x48, 0xc1, 0xcb, 0x80, 0x54, 0x3f, 0x1f, 0xfd, 0xc2, 0x3c, 0xff, 0xb2, - 0x42, 0xd4, 0xd0, 0x09, 0x54, 0x40, 0x3f, 0x1f, 0x36, 0xa6, 0x86, 0x49, 0xb9, 0xfb, 0x02, 0x6b, - 0xc6, 0xc0, 0x97, 0x57, 0xe3, 0x27, 0x53, 0xee, 0x97, 0x57, 0xf3, 0x63, 0x7f, 0xfc, 0xe9, 0x87, - 0x87, 0x03, 0x88, 0xc5, 0xb4, 0x7f, 0xbf, 0xe5, 0xd4, 0x47, 0x25, 0x18, 0x6b, 0xa9, 0x11, 0xc9, - 0x30, 0x59, 0xd8, 0x58, 0xbf, 0xbc, 0xa2, 0x2c, 0xbc, 0x50, 0x58, 0x5f, 0x58, 0x59, 0x16, 0xdf, - 0x23, 0xf2, 0xdd, 0x8c, 0x40, 0x53, 0x70, 0xac, 0x0d, 0xcf, 0x5c, 0x69, 0xb1, 0x34, 0x5f, 0x58, - 0x2f, 0x65, 0x24, 0x74, 0x17, 0x9c, 0x68, 0x0b, 0xe2, 0xb2, 0xc4, 0x3a, 0xb0, 0x28, 0x25, 0x97, - 0x25, 0xfe, 0x66, 0x8c, 0xbb, 0x4f, 0x26, 0x5b, 0xbf, 0x2b, 0x54, 0xc3, 0x3a, 0xb6, 0x35, 0xfb, - 0x07, 0x19, 0x79, 0x11, 0x6f, 0xd2, 0xff, 0x77, 0x3f, 0xa4, 0xe7, 0x59, 0x2d, 0x6b, 0x8e, 0xea, - 0xdc, 0x9e, 0x7d, 0x05, 0x64, 0xf3, 0xcf, 0x65, 0xb2, 0xaf, 0xf8, 0x7a, 0xdf, 0xa5, 0x4d, 0xf7, - 0xf4, 0xf1, 0x0c, 0x76, 0x86, 0x9a, 0x7f, 0xa0, 0x22, 0x8c, 0x27, 0xb3, 0x2f, 0x6f, 0xd2, 0x03, - 0x58, 0xec, 0xfb, 0xbb, 0xbf, 0x20, 0xc1, 0x21, 0xca, 0xe5, 0x4d, 0x92, 0x94, 0x53, 0xdc, 0x8e, - 0x8e, 0x0a, 0xe5, 0x8b, 0xaa, 0x6f, 0x0b, 0x98, 0x7d, 0x38, 0xf7, 0x1e, 0x7e, 0x65, 0xf0, 0xb8, - 0x4f, 0x87, 0x30, 0xba, 0xac, 0x8c, 0xd7, 0x5b, 0x24, 0xed, 0xd0, 0x86, 0x62, 0xe2, 0x07, 0xde, - 0x50, 0x7c, 0x16, 0x86, 0x7c, 0x89, 0x5c, 0xb6, 0xbf, 0xbb, 0x5b, 0xfe, 0xe1, 0x2d, 0x7d, 0x3f, - 0x06, 0x7a, 0x8f, 0x04, 0x87, 0xda, 0x26, 0xbe, 0xf4, 0xff, 0x8a, 0x1f, 0xec, 0xcd, 0x41, 0xc8, - 0x62, 0x6d, 0xe1, 0x65, 0x65, 0xa2, 0xd9, 0x6e, 0x59, 0xf1, 0x1c, 0x0c, 0x07, 0xb2, 0xd5, 0xec, - 0x20, 0x55, 0xe3, 0x00, 0x77, 0xd9, 0x82, 0x38, 0x28, 0x07, 0x49, 0xbc, 0x6b, 0x1a, 0x96, 0x83, - 0xab, 0xf4, 0x00, 0x57, 0x52, 0x71, 0xcb, 0xf2, 0x32, 0xa0, 0xd6, 0x8e, 0x0f, 0x7f, 0x45, 0xda, - 0x8b, 0x65, 0x68, 0x02, 0xfa, 0xfd, 0xdf, 0x59, 0x66, 0x05, 0x6f, 0xd7, 0xf4, 0x4d, 0x88, 0x14, - 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x1b, 0xef, 0x27, 0x54, 0x49, 0x9a, 0x00, 0x00, + // 10140 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x24, 0xc7, + 0x75, 0x18, 0x7e, 0xb3, 0xbb, 0x00, 0x76, 0x1f, 0xbe, 0x16, 0x0d, 0xdc, 0xdd, 0xde, 0xde, 0x1d, + 0x00, 0x0e, 0xbf, 0x8e, 0x47, 0x1e, 0x40, 0x1e, 0xef, 0x8b, 0x7b, 0x22, 0x4f, 0xbb, 0xc0, 0x1e, + 0x0e, 0x24, 0xbe, 0x38, 0x00, 0x8e, 0x14, 0xfd, 0x73, 0xed, 0x6f, 0xb0, 0xdb, 0x58, 0x0c, 0xb1, + 0x3b, 0x33, 0x9c, 0x99, 0xbd, 0x03, 0x28, 0xa9, 0x4c, 0x4b, 0xfe, 0xa0, 0xe9, 0x28, 0xfa, 0xb0, + 0x4b, 0x92, 0x29, 0x9d, 0x22, 0x59, 0x4e, 0xa4, 0x30, 0x8e, 0x3f, 0x64, 0x59, 0x89, 0xe3, 0xfc, + 0x21, 0xb9, 0xca, 0x89, 0xac, 0xaa, 0xd8, 0x92, 0x53, 0x89, 0x54, 0x4e, 0x72, 0x92, 0x29, 0xc5, + 0x51, 0x14, 0x25, 0x56, 0x2e, 0x52, 0xca, 0x55, 0xaa, 0x7c, 0x54, 0x7f, 0xcd, 0xd7, 0xee, 0x62, + 0x76, 0xc1, 0x3b, 0x4a, 0xb6, 0xf3, 0x17, 0xb6, 0x5f, 0xbf, 0xf7, 0xfa, 0xf5, 0xeb, 0xd7, 0xaf, + 0x5f, 0xbf, 0xe9, 0x6e, 0xc0, 0x47, 0x2e, 0xc2, 0x64, 0xd5, 0x30, 0xaa, 0x35, 0x3c, 0x6d, 0x5a, + 0x86, 0x63, 0x6c, 0x34, 0x36, 0xa7, 0x2b, 0xd8, 0x2e, 0x5b, 0x9a, 0xe9, 0x18, 0xd6, 0x14, 0x85, + 0xa1, 0x61, 0x86, 0x31, 0x25, 0x30, 0xe4, 0x45, 0x18, 0xb9, 0xac, 0xd5, 0xf0, 0xac, 0x8b, 0xb8, + 0x8a, 0x1d, 0x74, 0x01, 0x12, 0x9b, 0x5a, 0x0d, 0x67, 0xa4, 0xc9, 0xf8, 0x89, 0xfe, 0xd3, 0xf7, + 0x4c, 0x85, 0x88, 0xa6, 0x82, 0x14, 0x2b, 0x04, 0xac, 0x50, 0x0a, 0xf9, 0x5b, 0x09, 0x18, 0x6d, + 0x51, 0x8b, 0x10, 0x24, 0x74, 0xb5, 0x4e, 0x38, 0x4a, 0x27, 0x52, 0x0a, 0xfd, 0x8d, 0x32, 0xd0, + 0x67, 0xaa, 0xe5, 0x6d, 0xb5, 0x8a, 0x33, 0x31, 0x0a, 0x16, 0x45, 0x34, 0x0e, 0x50, 0xc1, 0x26, + 0xd6, 0x2b, 0x58, 0x2f, 0xef, 0x66, 0xe2, 0x93, 0xf1, 0x13, 0x29, 0xc5, 0x07, 0x41, 0x0f, 0xc2, + 0x88, 0xd9, 0xd8, 0xa8, 0x69, 0xe5, 0x92, 0x0f, 0x0d, 0x26, 0xe3, 0x27, 0x7a, 0x94, 0x34, 0xab, + 0x98, 0xf5, 0x90, 0xef, 0x87, 0xe1, 0xeb, 0x58, 0xdd, 0xf6, 0xa3, 0xf6, 0x53, 0xd4, 0x21, 0x02, + 0xf6, 0x21, 0xce, 0xc0, 0x40, 0x1d, 0xdb, 0xb6, 0x5a, 0xc5, 0x25, 0x67, 0xd7, 0xc4, 0x99, 0x04, + 0xed, 0xfd, 0x64, 0x53, 0xef, 0xc3, 0x3d, 0xef, 0xe7, 0x54, 0x6b, 0xbb, 0x26, 0x46, 0x79, 0x48, + 0x61, 0xbd, 0x51, 0x67, 0x1c, 0x7a, 0xda, 0xe8, 0xaf, 0xa8, 0x37, 0xea, 0x61, 0x2e, 0x49, 0x42, + 0xc6, 0x59, 0xf4, 0xd9, 0xd8, 0xba, 0xa6, 0x95, 0x71, 0xa6, 0x97, 0x32, 0xb8, 0xbf, 0x89, 0xc1, + 0x2a, 0xab, 0x0f, 0xf3, 0x10, 0x74, 0x68, 0x06, 0x52, 0x78, 0xc7, 0xc1, 0xba, 0xad, 0x19, 0x7a, + 0xa6, 0x8f, 0x32, 0xb9, 0xb7, 0xc5, 0x28, 0xe2, 0x5a, 0x25, 0xcc, 0xc2, 0xa3, 0x43, 0xe7, 0xa0, + 0xcf, 0x30, 0x1d, 0xcd, 0xd0, 0xed, 0x4c, 0x72, 0x52, 0x3a, 0xd1, 0x7f, 0xfa, 0x58, 0x4b, 0x43, + 0x58, 0x66, 0x38, 0x8a, 0x40, 0x46, 0xf3, 0x90, 0xb6, 0x8d, 0x86, 0x55, 0xc6, 0xa5, 0xb2, 0x51, + 0xc1, 0x25, 0x4d, 0xdf, 0x34, 0x32, 0x29, 0xca, 0x60, 0xa2, 0xb9, 0x23, 0x14, 0x71, 0xc6, 0xa8, + 0xe0, 0x79, 0x7d, 0xd3, 0x50, 0x86, 0xec, 0x40, 0x19, 0x1d, 0x82, 0x5e, 0x7b, 0x57, 0x77, 0xd4, + 0x9d, 0xcc, 0x00, 0xb5, 0x10, 0x5e, 0x92, 0x7f, 0xaf, 0x17, 0x86, 0x3b, 0x31, 0xb1, 0x8b, 0xd0, + 0xb3, 0x49, 0x7a, 0x99, 0x89, 0x75, 0xa3, 0x03, 0x46, 0x13, 0x54, 0x62, 0xef, 0x3e, 0x95, 0x98, + 0x87, 0x7e, 0x1d, 0xdb, 0x0e, 0xae, 0x30, 0x8b, 0x88, 0x77, 0x68, 0x53, 0xc0, 0x88, 0x9a, 0x4d, + 0x2a, 0xb1, 0x2f, 0x93, 0x7a, 0x16, 0x86, 0x5d, 0x91, 0x4a, 0x96, 0xaa, 0x57, 0x85, 0x6d, 0x4e, + 0x47, 0x49, 0x32, 0x55, 0x14, 0x74, 0x0a, 0x21, 0x53, 0x86, 0x70, 0xa0, 0x8c, 0x66, 0x01, 0x0c, + 0x1d, 0x1b, 0x9b, 0xa5, 0x0a, 0x2e, 0xd7, 0x32, 0xc9, 0x36, 0x5a, 0x5a, 0x26, 0x28, 0x4d, 0x5a, + 0x32, 0x18, 0xb4, 0x5c, 0x43, 0x8f, 0x79, 0xa6, 0xd6, 0xd7, 0xc6, 0x52, 0x16, 0xd9, 0x24, 0x6b, + 0xb2, 0xb6, 0x75, 0x18, 0xb2, 0x30, 0xb1, 0x7b, 0x5c, 0xe1, 0x3d, 0x4b, 0x51, 0x21, 0xa6, 0x22, + 0x7b, 0xa6, 0x70, 0x32, 0xd6, 0xb1, 0x41, 0xcb, 0x5f, 0x44, 0x77, 0x83, 0x0b, 0x28, 0x51, 0xb3, + 0x02, 0xea, 0x85, 0x06, 0x04, 0x70, 0x49, 0xad, 0xe3, 0xec, 0x8b, 0x30, 0x14, 0x54, 0x0f, 0x1a, + 0x83, 0x1e, 0xdb, 0x51, 0x2d, 0x87, 0x5a, 0x61, 0x8f, 0xc2, 0x0a, 0x28, 0x0d, 0x71, 0xac, 0x57, + 0xa8, 0x97, 0xeb, 0x51, 0xc8, 0x4f, 0xf4, 0x56, 0xaf, 0xc3, 0x71, 0xda, 0xe1, 0xfb, 0x9a, 0x47, + 0x34, 0xc0, 0x39, 0xdc, 0xef, 0xec, 0x79, 0x18, 0x0c, 0x74, 0xa0, 0xd3, 0xa6, 0xe5, 0x77, 0xc0, + 0xc1, 0x96, 0xac, 0xd1, 0xb3, 0x30, 0xd6, 0xd0, 0x35, 0xdd, 0xc1, 0x96, 0x69, 0x61, 0x62, 0xb1, + 0xac, 0xa9, 0xcc, 0x7f, 0xea, 0x6b, 0x63, 0x73, 0xeb, 0x7e, 0x6c, 0xc6, 0x45, 0x19, 0x6d, 0x34, + 0x03, 0x4f, 0xa6, 0x92, 0xdf, 0xee, 0x4b, 0xbf, 0xf4, 0xd2, 0x4b, 0x2f, 0xc5, 0xe4, 0x0f, 0xf7, + 0xc2, 0x58, 0xab, 0x39, 0xd3, 0x72, 0xfa, 0x1e, 0x82, 0x5e, 0xbd, 0x51, 0xdf, 0xc0, 0x16, 0x55, + 0x52, 0x8f, 0xc2, 0x4b, 0x28, 0x0f, 0x3d, 0x35, 0x75, 0x03, 0xd7, 0x32, 0x89, 0x49, 0xe9, 0xc4, + 0xd0, 0xe9, 0x07, 0x3b, 0x9a, 0x95, 0x53, 0x0b, 0x84, 0x44, 0x61, 0x94, 0xe8, 0x09, 0x48, 0x70, + 0x17, 0x4d, 0x38, 0x9c, 0xec, 0x8c, 0x03, 0x99, 0x4b, 0x0a, 0xa5, 0x43, 0x47, 0x21, 0x45, 0xfe, + 0x32, 0xdb, 0xe8, 0xa5, 0x32, 0x27, 0x09, 0x80, 0xd8, 0x05, 0xca, 0x42, 0x92, 0x4e, 0x93, 0x0a, + 0x16, 0x4b, 0x9b, 0x5b, 0x26, 0x86, 0x55, 0xc1, 0x9b, 0x6a, 0xa3, 0xe6, 0x94, 0xae, 0xa9, 0xb5, + 0x06, 0xa6, 0x06, 0x9f, 0x52, 0x06, 0x38, 0xf0, 0x2a, 0x81, 0xa1, 0x09, 0xe8, 0x67, 0xb3, 0x4a, + 0xd3, 0x2b, 0x78, 0x87, 0x7a, 0xcf, 0x1e, 0x85, 0x4d, 0xb4, 0x79, 0x02, 0x21, 0xcd, 0x3f, 0x6f, + 0x1b, 0xba, 0x30, 0x4d, 0xda, 0x04, 0x01, 0xd0, 0xe6, 0xcf, 0x87, 0x1d, 0xf7, 0xf1, 0xd6, 0xdd, + 0x0b, 0xdb, 0x94, 0xfc, 0xb9, 0x18, 0x24, 0xa8, 0xbf, 0x18, 0x86, 0xfe, 0xb5, 0xb7, 0xad, 0x14, + 0x4b, 0xb3, 0xcb, 0xeb, 0x85, 0x85, 0x62, 0x5a, 0x42, 0x43, 0x00, 0x14, 0x70, 0x79, 0x61, 0x39, + 0xbf, 0x96, 0x8e, 0xb9, 0xe5, 0xf9, 0xa5, 0xb5, 0x73, 0x67, 0xd2, 0x71, 0x97, 0x60, 0x9d, 0x01, + 0x12, 0x7e, 0x84, 0x47, 0x4f, 0xa7, 0x7b, 0x50, 0x1a, 0x06, 0x18, 0x83, 0xf9, 0x67, 0x8b, 0xb3, + 0xe7, 0xce, 0xa4, 0x7b, 0x83, 0x90, 0x47, 0x4f, 0xa7, 0xfb, 0xd0, 0x20, 0xa4, 0x28, 0xa4, 0xb0, + 0xbc, 0xbc, 0x90, 0x4e, 0xba, 0x3c, 0x57, 0xd7, 0x94, 0xf9, 0xa5, 0xb9, 0x74, 0xca, 0xe5, 0x39, + 0xa7, 0x2c, 0xaf, 0xaf, 0xa4, 0xc1, 0xe5, 0xb0, 0x58, 0x5c, 0x5d, 0xcd, 0xcf, 0x15, 0xd3, 0xfd, + 0x2e, 0x46, 0xe1, 0x6d, 0x6b, 0xc5, 0xd5, 0xf4, 0x40, 0x40, 0xac, 0x47, 0x4f, 0xa7, 0x07, 0xdd, + 0x26, 0x8a, 0x4b, 0xeb, 0x8b, 0xe9, 0x21, 0x34, 0x02, 0x83, 0xac, 0x09, 0x21, 0xc4, 0x70, 0x08, + 0x74, 0xee, 0x4c, 0x3a, 0xed, 0x09, 0xc2, 0xb8, 0x8c, 0x04, 0x00, 0xe7, 0xce, 0xa4, 0x91, 0x3c, + 0x03, 0x3d, 0xd4, 0xba, 0x10, 0x82, 0xa1, 0x85, 0x7c, 0xa1, 0xb8, 0x50, 0x5a, 0x5e, 0x59, 0x9b, + 0x5f, 0x5e, 0xca, 0x2f, 0xa4, 0x25, 0x0f, 0xa6, 0x14, 0x9f, 0x5e, 0x9f, 0x57, 0x8a, 0xb3, 0xe9, + 0x98, 0x1f, 0xb6, 0x52, 0xcc, 0xaf, 0x15, 0x67, 0xd3, 0x71, 0xb9, 0x0c, 0x63, 0xad, 0xfc, 0x64, + 0xcb, 0x99, 0xe1, 0x1b, 0xe2, 0x58, 0x9b, 0x21, 0xa6, 0xbc, 0x9a, 0x86, 0xf8, 0x9b, 0x31, 0x18, + 0x6d, 0xb1, 0x56, 0xb4, 0x6c, 0xe4, 0x12, 0xf4, 0x30, 0x13, 0x65, 0xab, 0xe7, 0x03, 0x2d, 0x17, + 0x1d, 0x6a, 0xb0, 0x4d, 0x2b, 0x28, 0xa5, 0xf3, 0x47, 0x10, 0xf1, 0x36, 0x11, 0x04, 0x61, 0xd1, + 0xe4, 0xd3, 0x7f, 0xb2, 0xc9, 0xa7, 0xb3, 0x65, 0xef, 0x5c, 0x27, 0xcb, 0x1e, 0x85, 0x75, 0xe7, + 0xdb, 0x7b, 0x5a, 0xf8, 0xf6, 0x8b, 0x30, 0xd2, 0xc4, 0xa8, 0x63, 0x1f, 0xfb, 0x6e, 0x09, 0x32, + 0xed, 0x94, 0x13, 0xe1, 0xe9, 0x62, 0x01, 0x4f, 0x77, 0x31, 0xac, 0xc1, 0xbb, 0xda, 0x0f, 0x42, + 0xd3, 0x58, 0x7f, 0x4a, 0x82, 0x43, 0xad, 0x23, 0xc5, 0x96, 0x32, 0x3c, 0x01, 0xbd, 0x75, 0xec, + 0x6c, 0x19, 0x22, 0x5a, 0xba, 0xaf, 0xc5, 0x1a, 0x4c, 0xaa, 0xc3, 0x83, 0xcd, 0xa9, 0xfc, 0x8b, + 0x78, 0xbc, 0x5d, 0xb8, 0xc7, 0xa4, 0x69, 0x92, 0xf4, 0x17, 0x62, 0x70, 0xb0, 0x25, 0xf3, 0x96, + 0x82, 0x1e, 0x07, 0xd0, 0x74, 0xb3, 0xe1, 0xb0, 0x88, 0x88, 0x39, 0xd8, 0x14, 0x85, 0x50, 0xe7, + 0x45, 0x9c, 0x67, 0xc3, 0x71, 0xeb, 0xe3, 0xb4, 0x1e, 0x18, 0x88, 0x22, 0x5c, 0xf0, 0x04, 0x4d, + 0x50, 0x41, 0xc7, 0xdb, 0xf4, 0xb4, 0xc9, 0x30, 0x1f, 0x86, 0x74, 0xb9, 0xa6, 0x61, 0xdd, 0x29, + 0xd9, 0x8e, 0x85, 0xd5, 0xba, 0xa6, 0x57, 0xe9, 0x0a, 0x92, 0xcc, 0xf5, 0x6c, 0xaa, 0x35, 0x1b, + 0x2b, 0xc3, 0xac, 0x7a, 0x55, 0xd4, 0x12, 0x0a, 0x6a, 0x40, 0x96, 0x8f, 0xa2, 0x37, 0x40, 0xc1, + 0xaa, 0x5d, 0x0a, 0xf9, 0x03, 0x29, 0xe8, 0xf7, 0xc5, 0xd5, 0xe8, 0x2e, 0x18, 0x78, 0x5e, 0xbd, + 0xa6, 0x96, 0xc4, 0x5e, 0x89, 0x69, 0xa2, 0x9f, 0xc0, 0x56, 0xf8, 0x7e, 0xe9, 0x61, 0x18, 0xa3, + 0x28, 0x46, 0xc3, 0xc1, 0x56, 0xa9, 0x5c, 0x53, 0x6d, 0x9b, 0x2a, 0x2d, 0x49, 0x51, 0x11, 0xa9, + 0x5b, 0x26, 0x55, 0x33, 0xa2, 0x06, 0x9d, 0x85, 0x51, 0x4a, 0x51, 0x6f, 0xd4, 0x1c, 0xcd, 0xac, + 0xe1, 0x12, 0xd9, 0xbd, 0xd9, 0x74, 0x25, 0x71, 0x25, 0x1b, 0x21, 0x18, 0x8b, 0x1c, 0x81, 0x48, + 0x64, 0xa3, 0x59, 0x38, 0x4e, 0xc9, 0xaa, 0x58, 0xc7, 0x96, 0xea, 0xe0, 0x12, 0x7e, 0xa1, 0xa1, + 0xd6, 0xec, 0x92, 0xaa, 0x57, 0x4a, 0x5b, 0xaa, 0xbd, 0x95, 0x19, 0x23, 0x0c, 0x0a, 0xb1, 0x8c, + 0xa4, 0x1c, 0x21, 0x88, 0x73, 0x1c, 0xaf, 0x48, 0xd1, 0xf2, 0x7a, 0xe5, 0x8a, 0x6a, 0x6f, 0xa1, + 0x1c, 0x1c, 0xa2, 0x5c, 0x6c, 0xc7, 0xd2, 0xf4, 0x6a, 0xa9, 0xbc, 0x85, 0xcb, 0xdb, 0xa5, 0x86, + 0xb3, 0x79, 0x21, 0x73, 0xd4, 0xdf, 0x3e, 0x95, 0x70, 0x95, 0xe2, 0xcc, 0x10, 0x94, 0x75, 0x67, + 0xf3, 0x02, 0x5a, 0x85, 0x01, 0x32, 0x18, 0x75, 0xed, 0x45, 0x5c, 0xda, 0x34, 0x2c, 0xba, 0x34, + 0x0e, 0xb5, 0x70, 0x4d, 0x3e, 0x0d, 0x4e, 0x2d, 0x73, 0x82, 0x45, 0xa3, 0x82, 0x73, 0x3d, 0xab, + 0x2b, 0xc5, 0xe2, 0xac, 0xd2, 0x2f, 0xb8, 0x5c, 0x36, 0x2c, 0x62, 0x50, 0x55, 0xc3, 0x55, 0x70, + 0x3f, 0x33, 0xa8, 0xaa, 0x21, 0xd4, 0x7b, 0x16, 0x46, 0xcb, 0x65, 0xd6, 0x67, 0xad, 0x5c, 0xe2, + 0x7b, 0x2c, 0x3b, 0x93, 0x0e, 0x28, 0xab, 0x5c, 0x9e, 0x63, 0x08, 0xdc, 0xc6, 0x6d, 0xf4, 0x18, + 0x1c, 0xf4, 0x94, 0xe5, 0x27, 0x1c, 0x69, 0xea, 0x65, 0x98, 0xf4, 0x2c, 0x8c, 0x9a, 0xbb, 0xcd, + 0x84, 0x28, 0xd0, 0xa2, 0xb9, 0x1b, 0x26, 0x3b, 0x0f, 0x63, 0xe6, 0x96, 0xd9, 0x4c, 0x77, 0xd2, + 0x4f, 0x87, 0xcc, 0x2d, 0x33, 0x4c, 0x78, 0x2f, 0xdd, 0x70, 0x5b, 0xb8, 0xac, 0x3a, 0xb8, 0x92, + 0x39, 0xec, 0x47, 0xf7, 0x55, 0xa0, 0x69, 0x48, 0x97, 0xcb, 0x25, 0xac, 0xab, 0x1b, 0x35, 0x5c, + 0x52, 0x2d, 0xac, 0xab, 0x76, 0x66, 0xc2, 0x8f, 0x3c, 0x54, 0x2e, 0x17, 0x69, 0x6d, 0x9e, 0x56, + 0xa2, 0x93, 0x30, 0x62, 0x6c, 0x3c, 0x5f, 0x66, 0x26, 0x59, 0x32, 0x2d, 0xbc, 0xa9, 0xed, 0x64, + 0xee, 0xa1, 0xfa, 0x1d, 0x26, 0x15, 0xd4, 0x20, 0x57, 0x28, 0x18, 0x3d, 0x00, 0xe9, 0xb2, 0xbd, + 0xa5, 0x5a, 0x26, 0xf5, 0xc9, 0xb6, 0xa9, 0x96, 0x71, 0xe6, 0x5e, 0x86, 0xca, 0xe0, 0x4b, 0x02, + 0x4c, 0xa6, 0x84, 0x7d, 0x5d, 0xdb, 0x74, 0x04, 0xc7, 0xfb, 0xd9, 0x94, 0xa0, 0x30, 0xce, 0xed, + 0x04, 0xa4, 0x89, 0x2a, 0x02, 0x0d, 0x9f, 0xa0, 0x68, 0x43, 0xe6, 0x96, 0xe9, 0x6f, 0xf7, 0x6e, + 0x18, 0x24, 0x98, 0x5e, 0xa3, 0x0f, 0xb0, 0x80, 0xcc, 0xdc, 0xf2, 0xb5, 0x78, 0x06, 0x0e, 0x11, + 0xa4, 0x3a, 0x76, 0xd4, 0x8a, 0xea, 0xa8, 0x3e, 0xec, 0x87, 0x28, 0x36, 0xd1, 0xfb, 0x22, 0xaf, + 0x0c, 0xc8, 0x69, 0x35, 0x36, 0x76, 0x5d, 0xcb, 0x3a, 0xc5, 0xe4, 0x24, 0x30, 0x61, 0x5b, 0x77, + 0x2c, 0xe8, 0x96, 0x73, 0x30, 0xe0, 0x37, 0x7c, 0x94, 0x02, 0x66, 0xfa, 0x69, 0x89, 0x44, 0x41, + 0x33, 0xcb, 0xb3, 0x24, 0x7e, 0x79, 0xae, 0x98, 0x8e, 0x91, 0x38, 0x6a, 0x61, 0x7e, 0xad, 0x58, + 0x52, 0xd6, 0x97, 0xd6, 0xe6, 0x17, 0x8b, 0xe9, 0xb8, 0x2f, 0x60, 0x7f, 0x32, 0x91, 0xbc, 0x2f, + 0x7d, 0xbf, 0xfc, 0x95, 0x18, 0x0c, 0x05, 0x77, 0x60, 0xe8, 0x2d, 0x70, 0x58, 0xa4, 0x4b, 0x6c, + 0xec, 0x94, 0xae, 0x6b, 0x16, 0x9d, 0x91, 0x75, 0x95, 0xad, 0x8e, 0xae, 0x4d, 0x8c, 0x71, 0xac, + 0x55, 0xec, 0x3c, 0xa3, 0x59, 0x64, 0xbe, 0xd5, 0x55, 0x07, 0x2d, 0xc0, 0x84, 0x6e, 0x94, 0x6c, + 0x47, 0xd5, 0x2b, 0xaa, 0x55, 0x29, 0x79, 0x89, 0xaa, 0x92, 0x5a, 0x2e, 0x63, 0xdb, 0x36, 0xd8, + 0x4a, 0xe8, 0x72, 0x39, 0xa6, 0x1b, 0xab, 0x1c, 0xd9, 0x5b, 0x22, 0xf2, 0x1c, 0x35, 0x64, 0xbf, + 0xf1, 0x76, 0xf6, 0x7b, 0x14, 0x52, 0x75, 0xd5, 0x2c, 0x61, 0xdd, 0xb1, 0x76, 0x69, 0xdc, 0x9d, + 0x54, 0x92, 0x75, 0xd5, 0x2c, 0x92, 0xf2, 0x9b, 0xb2, 0xfd, 0x79, 0x32, 0x91, 0x4c, 0xa6, 0x53, + 0x4f, 0x26, 0x92, 0xa9, 0x34, 0xc8, 0xaf, 0xc7, 0x61, 0xc0, 0x1f, 0x87, 0x93, 0x6d, 0x4d, 0x99, + 0x2e, 0x59, 0x12, 0x75, 0x6a, 0x77, 0xef, 0x19, 0xb5, 0x4f, 0xcd, 0x90, 0xb5, 0x2c, 0xd7, 0xcb, + 0xa2, 0x63, 0x85, 0x51, 0x92, 0x38, 0x82, 0x18, 0x1b, 0x66, 0xd1, 0x48, 0x52, 0xe1, 0x25, 0x34, + 0x07, 0xbd, 0xcf, 0xdb, 0x94, 0x77, 0x2f, 0xe5, 0x7d, 0xcf, 0xde, 0xbc, 0x9f, 0x5c, 0xa5, 0xcc, + 0x53, 0x4f, 0xae, 0x96, 0x96, 0x96, 0x95, 0xc5, 0xfc, 0x82, 0xc2, 0xc9, 0xd1, 0x11, 0x48, 0xd4, + 0xd4, 0x17, 0x77, 0x83, 0xab, 0x1e, 0x05, 0x75, 0x3a, 0x08, 0x47, 0x20, 0x71, 0x1d, 0xab, 0xdb, + 0xc1, 0xb5, 0x86, 0x82, 0xee, 0xe0, 0x64, 0x98, 0x86, 0x1e, 0xaa, 0x2f, 0x04, 0xc0, 0x35, 0x96, + 0x3e, 0x80, 0x92, 0x90, 0x98, 0x59, 0x56, 0xc8, 0x84, 0x48, 0xc3, 0x00, 0x83, 0x96, 0x56, 0xe6, + 0x8b, 0x33, 0xc5, 0x74, 0x4c, 0x3e, 0x0b, 0xbd, 0x4c, 0x09, 0x64, 0xb2, 0xb8, 0x6a, 0x48, 0x1f, + 0xe0, 0x45, 0xce, 0x43, 0x12, 0xb5, 0xeb, 0x8b, 0x85, 0xa2, 0x92, 0x8e, 0x05, 0x87, 0x3a, 0x91, + 0xee, 0x91, 0x6d, 0x18, 0xf0, 0x07, 0xe2, 0x6f, 0xce, 0x26, 0xfb, 0xf3, 0x12, 0xf4, 0xfb, 0x02, + 0x6b, 0x12, 0x11, 0xa9, 0xb5, 0x9a, 0x71, 0xbd, 0xa4, 0xd6, 0x34, 0xd5, 0xe6, 0xa6, 0x01, 0x14, + 0x94, 0x27, 0x90, 0x4e, 0x87, 0xee, 0x4d, 0x9a, 0x22, 0x3d, 0xe9, 0x5e, 0xf9, 0x63, 0x12, 0xa4, + 0xc3, 0x91, 0x6d, 0x48, 0x4c, 0xe9, 0x47, 0x29, 0xa6, 0xfc, 0x51, 0x09, 0x86, 0x82, 0xe1, 0x6c, + 0x48, 0xbc, 0xbb, 0x7e, 0xa4, 0xe2, 0x7d, 0x23, 0x06, 0x83, 0x81, 0x20, 0xb6, 0x53, 0xe9, 0x5e, + 0x80, 0x11, 0xad, 0x82, 0xeb, 0xa6, 0xe1, 0x60, 0xbd, 0xbc, 0x5b, 0xaa, 0xe1, 0x6b, 0xb8, 0x96, + 0x91, 0xa9, 0xd3, 0x98, 0xde, 0x3b, 0x4c, 0x9e, 0x9a, 0xf7, 0xe8, 0x16, 0x08, 0x59, 0x6e, 0x74, + 0x7e, 0xb6, 0xb8, 0xb8, 0xb2, 0xbc, 0x56, 0x5c, 0x9a, 0x79, 0x5b, 0x69, 0x7d, 0xe9, 0xa9, 0xa5, + 0xe5, 0x67, 0x96, 0x94, 0xb4, 0x16, 0x42, 0xbb, 0x83, 0xd3, 0x7e, 0x05, 0xd2, 0x61, 0xa1, 0xd0, + 0x61, 0x68, 0x25, 0x56, 0xfa, 0x00, 0x1a, 0x85, 0xe1, 0xa5, 0xe5, 0xd2, 0xea, 0xfc, 0x6c, 0xb1, + 0x54, 0xbc, 0x7c, 0xb9, 0x38, 0xb3, 0xb6, 0xca, 0x12, 0x1f, 0x2e, 0xf6, 0x5a, 0x60, 0x82, 0xcb, + 0xaf, 0xc6, 0x61, 0xb4, 0x85, 0x24, 0x28, 0xcf, 0xb7, 0x2c, 0x6c, 0x17, 0x75, 0xaa, 0x13, 0xe9, + 0xa7, 0x48, 0xcc, 0xb0, 0xa2, 0x5a, 0x0e, 0xdf, 0xe1, 0x3c, 0x00, 0x44, 0x4b, 0xba, 0xa3, 0x6d, + 0x6a, 0xd8, 0xe2, 0x79, 0x22, 0xb6, 0x8f, 0x19, 0xf6, 0xe0, 0x2c, 0x55, 0xf4, 0x10, 0x20, 0xd3, + 0xb0, 0x35, 0x47, 0xbb, 0x86, 0x4b, 0x9a, 0x2e, 0x92, 0x4a, 0x64, 0x5f, 0x93, 0x50, 0xd2, 0xa2, + 0x66, 0x5e, 0x77, 0x5c, 0x6c, 0x1d, 0x57, 0xd5, 0x10, 0x36, 0x71, 0xe6, 0x71, 0x25, 0x2d, 0x6a, + 0x5c, 0xec, 0xbb, 0x60, 0xa0, 0x62, 0x34, 0x48, 0xb0, 0xc7, 0xf0, 0xc8, 0xda, 0x21, 0x29, 0xfd, + 0x0c, 0xe6, 0xa2, 0xf0, 0x30, 0xde, 0xcb, 0x66, 0x0d, 0x28, 0xfd, 0x0c, 0xc6, 0x50, 0xee, 0x87, + 0x61, 0xb5, 0x5a, 0xb5, 0x08, 0x73, 0xc1, 0x88, 0x6d, 0x4c, 0x86, 0x5c, 0x30, 0x45, 0xcc, 0x3e, + 0x09, 0x49, 0xa1, 0x07, 0xb2, 0x54, 0x13, 0x4d, 0x94, 0x4c, 0xb6, 0xdb, 0x8e, 0x9d, 0x48, 0x29, + 0x49, 0x5d, 0x54, 0xde, 0x05, 0x03, 0x9a, 0x5d, 0xf2, 0x92, 0xf3, 0xb1, 0xc9, 0xd8, 0x89, 0xa4, + 0xd2, 0xaf, 0xd9, 0x6e, 0x62, 0x53, 0xfe, 0x54, 0x0c, 0x86, 0x82, 0x1f, 0x17, 0xd0, 0x2c, 0x24, + 0x6b, 0x46, 0x59, 0xa5, 0xa6, 0xc5, 0xbe, 0x6c, 0x9d, 0x88, 0xf8, 0x1e, 0x31, 0xb5, 0xc0, 0xf1, + 0x15, 0x97, 0x32, 0xfb, 0xc7, 0x12, 0x24, 0x05, 0x18, 0x1d, 0x82, 0x84, 0xa9, 0x3a, 0x5b, 0x94, + 0x5d, 0x4f, 0x21, 0x96, 0x96, 0x14, 0x5a, 0x26, 0x70, 0xdb, 0x54, 0x75, 0x6a, 0x02, 0x1c, 0x4e, + 0xca, 0x64, 0x5c, 0x6b, 0x58, 0xad, 0xd0, 0x5d, 0x8f, 0x51, 0xaf, 0x63, 0xdd, 0xb1, 0xc5, 0xb8, + 0x72, 0xf8, 0x0c, 0x07, 0xa3, 0x07, 0x61, 0xc4, 0xb1, 0x54, 0xad, 0x16, 0xc0, 0x4d, 0x50, 0xdc, + 0xb4, 0xa8, 0x70, 0x91, 0x73, 0x70, 0x44, 0xf0, 0xad, 0x60, 0x47, 0x2d, 0x6f, 0xe1, 0x8a, 0x47, + 0xd4, 0x4b, 0xb3, 0x1b, 0x87, 0x39, 0xc2, 0x2c, 0xaf, 0x17, 0xb4, 0xf2, 0x57, 0x24, 0x18, 0x11, + 0xfb, 0xb4, 0x8a, 0xab, 0xac, 0x45, 0x00, 0x55, 0xd7, 0x0d, 0xc7, 0xaf, 0xae, 0x66, 0x53, 0x6e, + 0xa2, 0x9b, 0xca, 0xbb, 0x44, 0x8a, 0x8f, 0x41, 0xb6, 0x0e, 0xe0, 0xd5, 0xb4, 0x55, 0xdb, 0x04, + 0xf4, 0xf3, 0x2f, 0x47, 0xf4, 0xf3, 0x23, 0xdb, 0xd9, 0x03, 0x03, 0x91, 0x0d, 0x1d, 0x1a, 0x83, + 0x9e, 0x0d, 0x5c, 0xd5, 0x74, 0x9e, 0x0f, 0x66, 0x05, 0x91, 0x7f, 0x49, 0xb8, 0xf9, 0x97, 0xc2, + 0x7b, 0x25, 0x18, 0x2d, 0x1b, 0xf5, 0xb0, 0xbc, 0x85, 0x74, 0x28, 0xbd, 0x60, 0x5f, 0x91, 0x9e, + 0x7b, 0xa2, 0xaa, 0x39, 0x5b, 0x8d, 0x8d, 0xa9, 0xb2, 0x51, 0x9f, 0xae, 0x1a, 0x35, 0x55, 0xaf, + 0x7a, 0xdf, 0x4f, 0xe9, 0x8f, 0xf2, 0xa9, 0x2a, 0xd6, 0x4f, 0x55, 0x0d, 0xdf, 0xd7, 0xd4, 0x8b, + 0xde, 0xcf, 0xbf, 0x92, 0xa4, 0x5f, 0x8d, 0xc5, 0xe7, 0x56, 0x0a, 0xaf, 0xc5, 0xb2, 0x73, 0xac, + 0xb9, 0x15, 0xa1, 0x1e, 0x05, 0x6f, 0xd6, 0x70, 0x99, 0x74, 0x19, 0xbe, 0xf3, 0x20, 0x8c, 0x55, + 0x8d, 0xaa, 0x41, 0x39, 0x4e, 0x93, 0x5f, 0xfc, 0x8b, 0x6c, 0xca, 0x85, 0x66, 0x23, 0x3f, 0xdf, + 0xe6, 0x96, 0x60, 0x94, 0x23, 0x97, 0xe8, 0x27, 0x21, 0xb6, 0xb1, 0x41, 0x7b, 0xa6, 0xd5, 0x32, + 0xbf, 0xfd, 0x2d, 0xba, 0xa0, 0x2b, 0x23, 0x9c, 0x94, 0xd4, 0xb1, 0xbd, 0x4f, 0x4e, 0x81, 0x83, + 0x01, 0x7e, 0x6c, 0xda, 0x62, 0x2b, 0x82, 0xe3, 0x1f, 0x72, 0x8e, 0xa3, 0x3e, 0x8e, 0xab, 0x9c, + 0x34, 0x37, 0x03, 0x83, 0xdd, 0xf0, 0xfa, 0x17, 0x9c, 0xd7, 0x00, 0xf6, 0x33, 0x99, 0x83, 0x61, + 0xca, 0xa4, 0xdc, 0xb0, 0x1d, 0xa3, 0x4e, 0x7d, 0xe2, 0xde, 0x6c, 0xfe, 0xe5, 0xb7, 0xd8, 0x3c, + 0x1a, 0x22, 0x64, 0x33, 0x2e, 0x55, 0x2e, 0x07, 0xf4, 0x2b, 0x58, 0x05, 0x97, 0x6b, 0x11, 0x1c, + 0xbe, 0xc8, 0x05, 0x71, 0xf1, 0x73, 0x57, 0x61, 0x8c, 0xfc, 0xa6, 0x2e, 0xcb, 0x2f, 0x49, 0x74, + 0x0e, 0x2e, 0xf3, 0x95, 0x77, 0xb3, 0xa9, 0x3a, 0xea, 0x32, 0xf0, 0xc9, 0xe4, 0x1b, 0xc5, 0x2a, + 0x76, 0x1c, 0x6c, 0xd9, 0x25, 0xb5, 0xd6, 0x4a, 0x3c, 0x5f, 0x12, 0x23, 0xf3, 0x2b, 0xdf, 0x0d, + 0x8e, 0xe2, 0x1c, 0xa3, 0xcc, 0xd7, 0x6a, 0xb9, 0x75, 0x38, 0xdc, 0xc2, 0x2a, 0x3a, 0xe0, 0xf9, + 0x2a, 0xe7, 0x39, 0xd6, 0x64, 0x19, 0x84, 0xed, 0x0a, 0x08, 0xb8, 0x3b, 0x96, 0x1d, 0xf0, 0xfc, + 0x08, 0xe7, 0x89, 0x38, 0xad, 0x18, 0x52, 0xc2, 0xf1, 0x49, 0x18, 0xb9, 0x86, 0xad, 0x0d, 0xc3, + 0xe6, 0x89, 0xa3, 0x0e, 0xd8, 0x7d, 0x94, 0xb3, 0x1b, 0xe6, 0x84, 0x34, 0x93, 0x44, 0x78, 0x3d, + 0x06, 0xc9, 0x4d, 0xb5, 0x8c, 0x3b, 0x60, 0x71, 0x83, 0xb3, 0xe8, 0x23, 0xf8, 0x84, 0x34, 0x0f, + 0x03, 0x55, 0x83, 0xaf, 0x5a, 0xd1, 0xe4, 0x1f, 0xe3, 0xe4, 0xfd, 0x82, 0x86, 0xb3, 0x30, 0x0d, + 0xb3, 0x51, 0x23, 0x4b, 0x5a, 0x34, 0x8b, 0xbf, 0x27, 0x58, 0x08, 0x1a, 0xce, 0xa2, 0x0b, 0xb5, + 0x7e, 0x5c, 0xb0, 0xb0, 0x7d, 0xfa, 0xbc, 0x04, 0xfd, 0x86, 0x5e, 0xdb, 0x35, 0xf4, 0x4e, 0x84, + 0xf8, 0x04, 0xe7, 0x00, 0x9c, 0x84, 0x30, 0xb8, 0x08, 0xa9, 0x4e, 0x07, 0xe2, 0xef, 0x7f, 0x57, + 0x4c, 0x0f, 0x31, 0x02, 0x73, 0x30, 0x2c, 0x1c, 0x94, 0x66, 0xe8, 0x1d, 0xb0, 0xf8, 0x07, 0x9c, + 0xc5, 0x90, 0x8f, 0x8c, 0x77, 0xc3, 0xc1, 0xb6, 0x53, 0xc5, 0x9d, 0x30, 0xf9, 0x94, 0xe8, 0x06, + 0x27, 0xe1, 0xaa, 0xdc, 0xc0, 0x7a, 0x79, 0xab, 0x33, 0x0e, 0x9f, 0x16, 0xaa, 0x14, 0x34, 0x84, + 0xc5, 0x0c, 0x0c, 0xd6, 0x55, 0xcb, 0xde, 0x52, 0x6b, 0x1d, 0x0d, 0xc7, 0x3f, 0xe4, 0x3c, 0x06, + 0x5c, 0x22, 0xae, 0x91, 0x86, 0xde, 0x0d, 0x9b, 0xd7, 0x84, 0x46, 0x7c, 0x64, 0x7c, 0xea, 0xd9, + 0x0e, 0xcd, 0xb2, 0x75, 0xc3, 0xed, 0x1f, 0x89, 0xa9, 0xc7, 0x68, 0x17, 0xfd, 0x1c, 0x2f, 0x42, + 0xca, 0xd6, 0x5e, 0xec, 0x88, 0xcd, 0xaf, 0x8b, 0x91, 0xa6, 0x04, 0x84, 0xf8, 0x6d, 0x70, 0xa4, + 0xe5, 0x32, 0xd1, 0x01, 0xb3, 0x7f, 0xcc, 0x99, 0x1d, 0x6a, 0xb1, 0x54, 0x70, 0x97, 0xd0, 0x2d, + 0xcb, 0xdf, 0x10, 0x2e, 0x01, 0x87, 0x78, 0xad, 0x90, 0x7d, 0x84, 0xad, 0x6e, 0x76, 0xa7, 0xb5, + 0xdf, 0x14, 0x5a, 0x63, 0xb4, 0x01, 0xad, 0xad, 0xc1, 0x21, 0xce, 0xb1, 0xbb, 0x71, 0xfd, 0x2d, + 0xe1, 0x58, 0x19, 0xf5, 0x7a, 0x70, 0x74, 0x7f, 0x02, 0xb2, 0xae, 0x3a, 0x45, 0xc0, 0x6a, 0x97, + 0xea, 0xaa, 0xd9, 0x01, 0xe7, 0xdf, 0xe6, 0x9c, 0x85, 0xc7, 0x77, 0x23, 0x5e, 0x7b, 0x51, 0x35, + 0x09, 0xf3, 0x67, 0x21, 0x23, 0x98, 0x37, 0x74, 0x0b, 0x97, 0x8d, 0xaa, 0xae, 0xbd, 0x88, 0x2b, + 0x1d, 0xb0, 0xfe, 0x4c, 0x68, 0xa8, 0xd6, 0x7d, 0xe4, 0x84, 0xf3, 0x3c, 0xa4, 0xdd, 0x58, 0xa5, + 0xa4, 0xd5, 0x4d, 0xc3, 0x72, 0x22, 0x38, 0xfe, 0x8e, 0x18, 0x29, 0x97, 0x6e, 0x9e, 0x92, 0xe5, + 0x8a, 0x30, 0x44, 0x8b, 0x9d, 0x9a, 0xe4, 0x67, 0x39, 0xa3, 0x41, 0x8f, 0x8a, 0x3b, 0x8e, 0xb2, + 0x51, 0x37, 0x55, 0xab, 0x13, 0xff, 0xf7, 0xbb, 0xc2, 0x71, 0x70, 0x12, 0xee, 0x38, 0x9c, 0x5d, + 0x13, 0x93, 0xd5, 0xbe, 0x03, 0x0e, 0x9f, 0x13, 0x8e, 0x43, 0xd0, 0x70, 0x16, 0x22, 0x60, 0xe8, + 0x80, 0xc5, 0x3f, 0x11, 0x2c, 0x04, 0x0d, 0x61, 0xf1, 0xb4, 0xb7, 0xd0, 0x5a, 0xb8, 0xaa, 0xd9, + 0x8e, 0xc5, 0xc2, 0xe4, 0xbd, 0x59, 0xfd, 0xd3, 0xef, 0x06, 0x83, 0x30, 0xc5, 0x47, 0x4a, 0x3c, + 0x11, 0x4f, 0xbb, 0xd2, 0x5d, 0x54, 0xb4, 0x60, 0xbf, 0x27, 0x3c, 0x91, 0x8f, 0x8c, 0xc8, 0xe6, + 0x8b, 0x10, 0x89, 0xda, 0xcb, 0x64, 0xef, 0xd0, 0x01, 0xbb, 0x7f, 0x16, 0x12, 0x6e, 0x55, 0xd0, + 0x12, 0x9e, 0xbe, 0xf8, 0xa7, 0xa1, 0x6f, 0xe3, 0xdd, 0x8e, 0xac, 0xf3, 0xf7, 0x43, 0xf1, 0xcf, + 0x3a, 0xa3, 0x64, 0x3e, 0x64, 0x38, 0x14, 0x4f, 0xa1, 0xa8, 0xf3, 0x43, 0x99, 0x9f, 0xfe, 0x3e, + 0xef, 0x6f, 0x30, 0x9c, 0xca, 0x2d, 0x10, 0x23, 0x0f, 0x06, 0x3d, 0xd1, 0xcc, 0xde, 0xfd, 0x7d, + 0xd7, 0xce, 0x03, 0x31, 0x4f, 0xee, 0x32, 0x0c, 0x06, 0x02, 0x9e, 0x68, 0x56, 0x3f, 0xc3, 0x59, + 0x0d, 0xf8, 0xe3, 0x9d, 0xdc, 0x59, 0x48, 0x90, 0xe0, 0x25, 0x9a, 0xfc, 0x67, 0x39, 0x39, 0x45, + 0xcf, 0x3d, 0x0e, 0x49, 0x11, 0xb4, 0x44, 0x93, 0xfe, 0x1c, 0x27, 0x75, 0x49, 0x08, 0xb9, 0x08, + 0x58, 0xa2, 0xc9, 0x7f, 0x5e, 0x90, 0x0b, 0x12, 0x42, 0xde, 0xb9, 0x0a, 0x3f, 0xff, 0x8b, 0x09, + 0xbe, 0xe8, 0x08, 0xdd, 0x5d, 0x84, 0x3e, 0x1e, 0xa9, 0x44, 0x53, 0xff, 0x02, 0x6f, 0x5c, 0x50, + 0xe4, 0xce, 0x43, 0x4f, 0x87, 0x0a, 0x7f, 0x0f, 0x27, 0x65, 0xf8, 0xb9, 0x19, 0xe8, 0xf7, 0x45, + 0x27, 0xd1, 0xe4, 0x7f, 0x97, 0x93, 0xfb, 0xa9, 0x88, 0xe8, 0x3c, 0x3a, 0x89, 0x66, 0xf0, 0x5e, + 0x21, 0x3a, 0xa7, 0x20, 0x6a, 0x13, 0x81, 0x49, 0x34, 0xf5, 0xfb, 0x84, 0xd6, 0x05, 0x49, 0xee, + 0x12, 0xa4, 0xdc, 0xc5, 0x26, 0x9a, 0xfe, 0xfd, 0x9c, 0xde, 0xa3, 0x21, 0x1a, 0xf0, 0x2d, 0x76, + 0xd1, 0x2c, 0x3e, 0x20, 0x34, 0xe0, 0xa3, 0x22, 0xd3, 0x28, 0x1c, 0xc0, 0x44, 0x73, 0xfa, 0x25, + 0x31, 0x8d, 0x42, 0xf1, 0x0b, 0x19, 0x4d, 0xea, 0xf3, 0xa3, 0x59, 0xfc, 0xb2, 0x18, 0x4d, 0x8a, + 0x4f, 0xc4, 0x08, 0x47, 0x04, 0xd1, 0x3c, 0x3e, 0x24, 0xc4, 0x08, 0x05, 0x04, 0xb9, 0x15, 0x40, + 0xcd, 0xd1, 0x40, 0x34, 0xbf, 0x0f, 0x73, 0x7e, 0x23, 0x4d, 0xc1, 0x40, 0xee, 0x19, 0x38, 0xd4, + 0x3a, 0x12, 0x88, 0xe6, 0xfa, 0x2b, 0xdf, 0x0f, 0xed, 0xdd, 0xfc, 0x81, 0x40, 0x6e, 0xcd, 0x5b, + 0x52, 0xfc, 0x51, 0x40, 0x34, 0xdb, 0x57, 0xbf, 0x1f, 0x74, 0xdc, 0xfe, 0x20, 0x20, 0x97, 0x07, + 0xf0, 0x16, 0xe0, 0x68, 0x5e, 0x1f, 0xe5, 0xbc, 0x7c, 0x44, 0x64, 0x6a, 0xf0, 0xf5, 0x37, 0x9a, + 0xfe, 0x86, 0x98, 0x1a, 0x9c, 0x82, 0x4c, 0x0d, 0xb1, 0xf4, 0x46, 0x53, 0x7f, 0x4c, 0x4c, 0x0d, + 0x41, 0x42, 0x2c, 0xdb, 0xb7, 0xba, 0x45, 0x73, 0xf8, 0x84, 0xb0, 0x6c, 0x1f, 0x55, 0x6e, 0x09, + 0x46, 0x9a, 0x16, 0xc4, 0x68, 0x56, 0xbf, 0xca, 0x59, 0xa5, 0xc3, 0xeb, 0xa1, 0x7f, 0xf1, 0xe2, + 0x8b, 0x61, 0x34, 0xb7, 0x4f, 0x86, 0x16, 0x2f, 0xbe, 0x16, 0xe6, 0x2e, 0x42, 0x52, 0x6f, 0xd4, + 0x6a, 0x64, 0xf2, 0xa0, 0xbd, 0xcf, 0xfc, 0x65, 0xfe, 0xf3, 0x0f, 0xb9, 0x76, 0x04, 0x41, 0xee, + 0x2c, 0xf4, 0xe0, 0xfa, 0x06, 0xae, 0x44, 0x51, 0x7e, 0xe7, 0x87, 0xc2, 0x61, 0x12, 0xec, 0xdc, + 0x25, 0x00, 0x96, 0x1a, 0xa1, 0x9f, 0x07, 0x23, 0x68, 0xff, 0xcb, 0x0f, 0xf9, 0x69, 0x1c, 0x8f, + 0xc4, 0x63, 0xc0, 0xce, 0xf6, 0xec, 0xcd, 0xe0, 0xbb, 0x41, 0x06, 0x74, 0x44, 0x1e, 0x83, 0xbe, + 0xe7, 0x6d, 0x43, 0x77, 0xd4, 0x6a, 0x14, 0xf5, 0x7f, 0xe5, 0xd4, 0x02, 0x9f, 0x28, 0xac, 0x6e, + 0x58, 0xd8, 0x51, 0xab, 0x76, 0x14, 0xed, 0x7f, 0xe3, 0xb4, 0x2e, 0x01, 0x21, 0x2e, 0xab, 0xb6, + 0xd3, 0x49, 0xbf, 0xff, 0x52, 0x10, 0x0b, 0x02, 0x22, 0x34, 0xf9, 0xbd, 0x8d, 0x77, 0xa3, 0x68, + 0xbf, 0x27, 0x84, 0xe6, 0xf8, 0xb9, 0xc7, 0x21, 0x45, 0x7e, 0xb2, 0x23, 0x76, 0x11, 0xc4, 0xff, + 0x9d, 0x13, 0x7b, 0x14, 0xa4, 0x65, 0xdb, 0xa9, 0x38, 0x5a, 0xb4, 0xb2, 0x6f, 0xf1, 0x91, 0x16, + 0xf8, 0xb9, 0x3c, 0xf4, 0xdb, 0x4e, 0xa5, 0xd2, 0xe0, 0xf1, 0x69, 0x04, 0xf9, 0xff, 0xf8, 0xa1, + 0x9b, 0xb2, 0x70, 0x69, 0xc8, 0x68, 0x5f, 0xdf, 0x76, 0x4c, 0x83, 0x7e, 0x02, 0x89, 0xe2, 0xf0, + 0x7d, 0xce, 0xc1, 0x47, 0x92, 0x9b, 0x81, 0x01, 0xd2, 0x17, 0x0b, 0x9b, 0x98, 0x7e, 0xaf, 0x8a, + 0x60, 0xf1, 0x03, 0xae, 0x80, 0x00, 0x51, 0xe1, 0x27, 0xbf, 0xf8, 0xfa, 0xb8, 0xf4, 0xe5, 0xd7, + 0xc7, 0xa5, 0x6f, 0xbc, 0x3e, 0x2e, 0xbd, 0xef, 0x9b, 0xe3, 0x07, 0xbe, 0xfc, 0xcd, 0xf1, 0x03, + 0x5f, 0xfb, 0xe6, 0xf8, 0x81, 0xd6, 0x69, 0x63, 0x98, 0x33, 0xe6, 0x0c, 0x96, 0x30, 0x7e, 0x4e, + 0x0e, 0xa4, 0x8b, 0xab, 0x86, 0x97, 0xad, 0x75, 0x37, 0x39, 0xf0, 0x03, 0x89, 0x6c, 0x98, 0x83, + 0xb9, 0x5c, 0x55, 0xdf, 0x6d, 0x73, 0x07, 0x27, 0xdb, 0x32, 0x31, 0x2c, 0xbf, 0x05, 0xe2, 0x79, + 0x7d, 0x17, 0x1d, 0x61, 0x3e, 0xaf, 0xd4, 0xb0, 0x6a, 0xfc, 0xe8, 0x57, 0x1f, 0x29, 0xaf, 0x5b, + 0x35, 0x34, 0xe6, 0x9d, 0xcf, 0x94, 0x4e, 0x0c, 0xf0, 0x43, 0x97, 0xb9, 0xc4, 0xf7, 0x3e, 0x31, + 0x71, 0xa0, 0xb0, 0x1d, 0xee, 0xe1, 0xe7, 0x23, 0x7b, 0x99, 0xcc, 0xeb, 0xbb, 0xb4, 0x93, 0x2b, + 0xd2, 0x73, 0x3d, 0xa4, 0x0d, 0x5b, 0x24, 0xb6, 0xc7, 0xc3, 0x89, 0xed, 0x67, 0x70, 0xad, 0xf6, + 0x94, 0x6e, 0x5c, 0xd7, 0xd7, 0x08, 0xda, 0x46, 0x2f, 0xe5, 0xf1, 0x28, 0xbc, 0x2f, 0x06, 0x13, + 0xe1, 0x7e, 0x13, 0xc3, 0xb1, 0x1d, 0xb5, 0x6e, 0xb6, 0xbb, 0x81, 0x74, 0x11, 0x52, 0x6b, 0x02, + 0x07, 0x65, 0xa0, 0xcf, 0xc6, 0x65, 0x43, 0xaf, 0xd8, 0xb4, 0xb3, 0x71, 0x45, 0x14, 0x49, 0x67, + 0x75, 0x55, 0x37, 0x6c, 0x7e, 0x40, 0x92, 0x15, 0x0a, 0x1f, 0x94, 0xba, 0x1b, 0xc9, 0x21, 0xb7, + 0x29, 0xd1, 0xd3, 0x07, 0xf7, 0x4a, 0xff, 0x53, 0x2d, 0x78, 0x5d, 0xf0, 0xe5, 0xfa, 0x3b, 0x55, + 0xc9, 0xbb, 0xe2, 0x70, 0xa4, 0x6c, 0xd8, 0x75, 0xc3, 0x2e, 0xb1, 0x11, 0x66, 0x05, 0xae, 0x8c, + 0x01, 0x7f, 0x55, 0x07, 0xf9, 0xff, 0x2b, 0x30, 0x44, 0x67, 0x01, 0xcd, 0x7c, 0x52, 0xc7, 0x13, + 0xb9, 0x56, 0xfc, 0xd1, 0xbf, 0xed, 0xa1, 0x56, 0x33, 0xe8, 0x12, 0xd2, 0xa3, 0x1d, 0x6b, 0x30, + 0xa6, 0xd5, 0xcd, 0x1a, 0xa6, 0xdf, 0x80, 0x4a, 0x6e, 0x5d, 0x34, 0xbf, 0x2f, 0x71, 0x7e, 0xa3, + 0x1e, 0xf9, 0xbc, 0xa0, 0xce, 0x2d, 0xc0, 0x88, 0x5a, 0x2e, 0x63, 0x33, 0xc0, 0x32, 0x62, 0x86, + 0x0a, 0x01, 0xd3, 0x9c, 0xd2, 0xe5, 0x56, 0xb8, 0xd4, 0x6e, 0x6c, 0x9f, 0xbb, 0xd7, 0x37, 0x68, + 0x16, 0xae, 0x62, 0xfd, 0x94, 0x8e, 0x9d, 0xeb, 0x86, 0xb5, 0xcd, 0xd5, 0x7b, 0x8a, 0x35, 0x25, + 0x06, 0xe1, 0x67, 0xe2, 0x30, 0xce, 0x2a, 0xa6, 0x37, 0x54, 0x1b, 0x4f, 0x5f, 0x7b, 0x64, 0x03, + 0x3b, 0xea, 0x23, 0xd3, 0x65, 0x43, 0xd3, 0xf9, 0x48, 0x8c, 0xf2, 0x71, 0x21, 0xf5, 0x53, 0xbc, + 0xbe, 0xcd, 0xc4, 0x9c, 0x83, 0xc4, 0x8c, 0xa1, 0xe9, 0xc4, 0x22, 0x2b, 0x58, 0x37, 0xea, 0x7c, + 0x5a, 0xb2, 0x02, 0xba, 0x1b, 0x7a, 0xd5, 0xba, 0xd1, 0xd0, 0x1d, 0xf6, 0xf9, 0xaa, 0xd0, 0xff, + 0xc5, 0x9b, 0x13, 0x07, 0xfe, 0xec, 0xe6, 0x44, 0x7c, 0x5e, 0x77, 0x14, 0x5e, 0x95, 0x4b, 0x7c, + 0xfb, 0xe3, 0x13, 0x92, 0xfc, 0x24, 0xf4, 0xcd, 0xe2, 0xf2, 0x7e, 0x78, 0xcd, 0xe2, 0x72, 0x88, + 0xd7, 0x03, 0x90, 0x9c, 0xd7, 0x1d, 0x76, 0x66, 0xf6, 0x38, 0xc4, 0x35, 0x9d, 0x9d, 0xc2, 0x0a, + 0xb5, 0x4f, 0xe0, 0x04, 0x75, 0x16, 0x97, 0x5d, 0xd4, 0x0a, 0x2e, 0x87, 0x51, 0x09, 0x7b, 0x02, + 0x2f, 0xcc, 0x7e, 0xed, 0xcf, 0xc7, 0x0f, 0xbc, 0xf4, 0xfa, 0xf8, 0x81, 0xb6, 0x23, 0xe1, 0x77, + 0x87, 0x5c, 0xc5, 0x7c, 0x08, 0xec, 0xca, 0xf6, 0xb4, 0x13, 0x98, 0x0b, 0x7f, 0x27, 0x06, 0xe3, + 0x4d, 0x26, 0xce, 0x17, 0x86, 0x76, 0xde, 0x21, 0x07, 0xc9, 0x59, 0xb1, 0xde, 0x74, 0xeb, 0x1c, + 0x7e, 0xb9, 0x4b, 0xe7, 0x30, 0x28, 0x5a, 0x12, 0xbe, 0xe1, 0x64, 0xb4, 0x6f, 0x10, 0xf2, 0xef, + 0xc3, 0x35, 0xbc, 0x96, 0x80, 0xe3, 0xf4, 0x52, 0x88, 0x55, 0xd7, 0x74, 0x67, 0xba, 0x6c, 0xed, + 0x9a, 0x0e, 0x5d, 0x4e, 0x8c, 0x4d, 0xae, 0x8d, 0x11, 0xaf, 0x7a, 0x8a, 0x55, 0xb7, 0x31, 0xc9, + 0x4d, 0xe8, 0x59, 0x21, 0x74, 0x44, 0x11, 0x8e, 0xe1, 0xa8, 0x35, 0xae, 0x20, 0x56, 0x20, 0x50, + 0x76, 0x91, 0x24, 0xc6, 0xa0, 0x9a, 0xb8, 0x43, 0x52, 0xc3, 0xea, 0x26, 0x3b, 0xb8, 0x1b, 0xa7, + 0x4b, 0x48, 0x92, 0x00, 0xe8, 0x19, 0xdd, 0x31, 0xe8, 0x51, 0x1b, 0xec, 0x93, 0x73, 0x9c, 0xac, + 0x2d, 0xb4, 0x20, 0x3f, 0x05, 0x7d, 0xfc, 0x33, 0x17, 0x4a, 0x43, 0x7c, 0x1b, 0xef, 0xd2, 0x76, + 0x06, 0x14, 0xf2, 0x13, 0x4d, 0x41, 0x0f, 0x15, 0x9e, 0xdf, 0x48, 0xc8, 0x4c, 0x35, 0x49, 0x3f, + 0x45, 0x85, 0x54, 0x18, 0x9a, 0xfc, 0x24, 0x24, 0x67, 0x8d, 0xba, 0xa6, 0x1b, 0x41, 0x6e, 0x29, + 0xc6, 0x8d, 0xca, 0x6c, 0x36, 0xb8, 0xe9, 0x2b, 0xac, 0x80, 0x0e, 0x41, 0x2f, 0x3b, 0xc8, 0xcd, + 0x3f, 0x9b, 0xf3, 0x92, 0x3c, 0x03, 0x7d, 0x94, 0xf7, 0xb2, 0x89, 0x10, 0xbf, 0xd9, 0xc3, 0x4f, + 0x8c, 0x53, 0x2f, 0xc9, 0xd9, 0xc7, 0x3c, 0x61, 0x11, 0x24, 0x2a, 0xaa, 0xa3, 0xf2, 0x7e, 0xd3, + 0xdf, 0xf2, 0x13, 0x90, 0xe4, 0x4c, 0x6c, 0x74, 0x1a, 0xe2, 0x86, 0x69, 0xf3, 0x0f, 0xdf, 0xd9, + 0x76, 0x5d, 0x59, 0x36, 0x0b, 0x09, 0x32, 0x69, 0x14, 0x82, 0x5c, 0x50, 0xda, 0xce, 0x92, 0x0b, + 0x3e, 0x43, 0xf2, 0x0d, 0xb9, 0xef, 0x27, 0x1b, 0xd2, 0x26, 0x73, 0x70, 0x8d, 0xe5, 0x13, 0x31, + 0x18, 0xf7, 0xd5, 0x5e, 0xc3, 0x16, 0xd9, 0xeb, 0xb1, 0x09, 0xc6, 0xad, 0x05, 0xf9, 0x84, 0xe4, + 0xf5, 0x6d, 0xcc, 0xe5, 0x71, 0x88, 0xe7, 0x4d, 0x13, 0x65, 0x21, 0xc9, 0x3e, 0x70, 0x1b, 0xcc, + 0x5e, 0x12, 0x8a, 0x5b, 0x26, 0x75, 0xb6, 0xb1, 0xe9, 0x5c, 0x57, 0x2d, 0xf7, 0x0a, 0x93, 0x28, + 0xcb, 0x8f, 0x41, 0x6a, 0xc6, 0xd0, 0x6d, 0xac, 0xdb, 0x0d, 0x3a, 0xf5, 0x36, 0x6a, 0x46, 0x79, + 0x9b, 0x73, 0x60, 0x05, 0xa2, 0x70, 0xd5, 0x34, 0x29, 0x65, 0x42, 0x21, 0x3f, 0x99, 0x9b, 0x2a, + 0xac, 0xb6, 0x55, 0xd1, 0x63, 0xdd, 0xab, 0x88, 0x77, 0xd2, 0xd5, 0xd1, 0xff, 0x92, 0xe0, 0x58, + 0xf3, 0x84, 0xda, 0xc6, 0xbb, 0x76, 0xb7, 0xf3, 0xe9, 0x59, 0x48, 0xad, 0xd0, 0x7b, 0xc4, 0x4f, + 0xe1, 0x5d, 0x94, 0x85, 0x3e, 0x5c, 0x39, 0x7d, 0xf6, 0xec, 0x23, 0x8f, 0x31, 0x6b, 0xbf, 0x72, + 0x40, 0x11, 0x00, 0x34, 0x0e, 0x29, 0x1b, 0x97, 0xcd, 0xd3, 0x67, 0xcf, 0x6d, 0x3f, 0xc2, 0xcc, + 0xeb, 0xca, 0x01, 0xc5, 0x03, 0xe5, 0x92, 0xa4, 0xd7, 0xdf, 0xfe, 0xc4, 0x84, 0x54, 0xe8, 0x81, + 0xb8, 0xdd, 0xa8, 0xdf, 0x51, 0x1b, 0x79, 0xb5, 0x07, 0x26, 0xfd, 0x94, 0xd4, 0x41, 0x5d, 0x53, + 0x6b, 0x5a, 0x45, 0xf5, 0x6e, 0x80, 0xa7, 0x7d, 0x3a, 0xa0, 0x18, 0xad, 0x55, 0x90, 0xdd, 0x53, + 0x93, 0xf2, 0x67, 0x24, 0x18, 0xb8, 0x2a, 0x38, 0xaf, 0x62, 0x07, 0x5d, 0x04, 0x70, 0x5b, 0x12, + 0xd3, 0xe6, 0xe8, 0x54, 0xb8, 0xad, 0x29, 0x97, 0x46, 0xf1, 0xa1, 0xa3, 0xf3, 0xd4, 0x10, 0x4d, + 0xc3, 0xe6, 0xf7, 0x5f, 0x22, 0x48, 0x5d, 0x64, 0xf4, 0x10, 0x20, 0xea, 0xe1, 0x4a, 0xd7, 0x0c, + 0x47, 0xd3, 0xab, 0x25, 0xd3, 0xb8, 0xce, 0x2f, 0x0b, 0xc6, 0x95, 0x34, 0xad, 0xb9, 0x4a, 0x2b, + 0x56, 0x08, 0x9c, 0x08, 0x9d, 0x72, 0xb9, 0x90, 0xd5, 0x44, 0xad, 0x54, 0x2c, 0x6c, 0xdb, 0xdc, + 0x89, 0x89, 0x22, 0xba, 0x08, 0x7d, 0x66, 0x63, 0xa3, 0x24, 0x3c, 0x46, 0xff, 0xe9, 0x63, 0xad, + 0xe6, 0xbf, 0xb0, 0x0f, 0xee, 0x01, 0x7a, 0xcd, 0xc6, 0x06, 0xb1, 0x96, 0xbb, 0x60, 0xa0, 0x85, + 0x30, 0xfd, 0xd7, 0x3c, 0x39, 0xe8, 0xf5, 0x75, 0xde, 0x83, 0x92, 0x69, 0x69, 0x86, 0xa5, 0x39, + 0xbb, 0xf4, 0xf4, 0x4a, 0x5c, 0x49, 0x8b, 0x8a, 0x15, 0x0e, 0x97, 0xb7, 0x61, 0x78, 0x95, 0x86, + 0x5a, 0x9e, 0xe4, 0x67, 0x3d, 0xf9, 0xa4, 0x68, 0xf9, 0xda, 0x4a, 0x16, 0x6b, 0x92, 0xac, 0xf0, + 0x74, 0x5b, 0xeb, 0x3c, 0xdf, 0xbd, 0x75, 0x06, 0x17, 0xff, 0xbf, 0x3c, 0x12, 0x98, 0x9c, 0x3c, + 0xb2, 0xf6, 0xb9, 0xaf, 0x4e, 0x0d, 0x33, 0x6a, 0x87, 0x91, 0xdd, 0x7b, 0x51, 0xcd, 0x46, 0xb8, + 0xd1, 0x6c, 0xe4, 0x14, 0x92, 0x1f, 0x83, 0xc1, 0x15, 0xd5, 0x72, 0x56, 0xb1, 0x73, 0x05, 0xab, + 0x15, 0x6c, 0x05, 0x57, 0xdd, 0x41, 0xb1, 0xea, 0x22, 0x48, 0xd0, 0xa5, 0x95, 0xad, 0x3a, 0xf4, + 0xb7, 0xbc, 0x05, 0x09, 0x7a, 0x82, 0xcd, 0x5d, 0x91, 0x39, 0x05, 0x5b, 0x91, 0x89, 0x2f, 0xdd, + 0x75, 0xb0, 0x2d, 0x36, 0x74, 0xb4, 0x80, 0xce, 0x88, 0x75, 0x35, 0xbe, 0xf7, 0xba, 0xca, 0x0d, + 0x91, 0xaf, 0xae, 0x35, 0xe8, 0x2b, 0x10, 0x57, 0x3c, 0x3f, 0xeb, 0x0a, 0x22, 0x79, 0x82, 0xa0, + 0x45, 0x18, 0x36, 0x55, 0xcb, 0xa1, 0x47, 0xf7, 0xb7, 0x68, 0x2f, 0xb8, 0xad, 0x4f, 0x34, 0xcf, + 0xbc, 0x40, 0x67, 0x79, 0x2b, 0x83, 0xa6, 0x1f, 0x28, 0xff, 0x45, 0x02, 0x7a, 0xb9, 0x32, 0x1e, + 0x87, 0x3e, 0xae, 0x56, 0x6e, 0x9d, 0xc7, 0xa7, 0x9a, 0x17, 0xa6, 0x29, 0x77, 0x01, 0xe1, 0xfc, + 0x04, 0x0d, 0xba, 0x0f, 0x92, 0xe5, 0x2d, 0x55, 0xd3, 0x4b, 0x5a, 0x45, 0x44, 0xbd, 0xaf, 0xdf, + 0x9c, 0xe8, 0x9b, 0x21, 0xb0, 0xf9, 0x59, 0xa5, 0x8f, 0x56, 0xce, 0x57, 0x48, 0x24, 0xb0, 0x85, + 0xb5, 0xea, 0x96, 0xc3, 0x67, 0x18, 0x2f, 0xa1, 0x0b, 0x90, 0x20, 0x06, 0xc1, 0x6f, 0x76, 0x65, + 0x9b, 0xf6, 0x1e, 0xee, 0x06, 0xb0, 0x90, 0x24, 0x0d, 0xbf, 0xef, 0xeb, 0x13, 0x92, 0x42, 0x29, + 0xd0, 0x0c, 0x0c, 0xd6, 0x54, 0xdb, 0x29, 0xd1, 0x15, 0x8c, 0x34, 0xdf, 0x43, 0x59, 0x1c, 0x69, + 0x56, 0x08, 0x57, 0x2c, 0x17, 0xbd, 0x9f, 0x50, 0x31, 0x50, 0x05, 0x9d, 0x80, 0x34, 0x65, 0x52, + 0x36, 0xea, 0x75, 0xcd, 0x61, 0xb1, 0x55, 0x2f, 0xd5, 0xfb, 0x10, 0x81, 0xcf, 0x50, 0x30, 0x8d, + 0xb0, 0x8e, 0x42, 0x8a, 0x5e, 0x25, 0xa1, 0x28, 0xec, 0xd8, 0x64, 0x92, 0x00, 0x68, 0xe5, 0xfd, + 0x30, 0xec, 0xf9, 0x47, 0x86, 0x92, 0x64, 0x5c, 0x3c, 0x30, 0x45, 0x7c, 0x18, 0xc6, 0x74, 0xbc, + 0x43, 0x0f, 0x72, 0x06, 0xb0, 0x53, 0x14, 0x1b, 0x91, 0xba, 0xab, 0x41, 0x8a, 0x7b, 0x61, 0xa8, + 0x2c, 0x94, 0xcf, 0x70, 0x81, 0xe2, 0x0e, 0xba, 0x50, 0x8a, 0x76, 0x04, 0x92, 0xaa, 0x69, 0x32, + 0x84, 0x7e, 0xee, 0x1f, 0x4d, 0x93, 0x56, 0x9d, 0x84, 0x11, 0xda, 0x47, 0x0b, 0xdb, 0x8d, 0x9a, + 0xc3, 0x99, 0x0c, 0x50, 0x9c, 0x61, 0x52, 0xa1, 0x30, 0x38, 0xc5, 0xbd, 0x1b, 0x06, 0xf1, 0x35, + 0xad, 0x82, 0xf5, 0x32, 0x66, 0x78, 0x83, 0x14, 0x6f, 0x40, 0x00, 0x29, 0xd2, 0x03, 0xe0, 0xfa, + 0xbd, 0x92, 0xf0, 0xc9, 0x43, 0x8c, 0x9f, 0x80, 0xe7, 0x19, 0x58, 0xce, 0x40, 0x62, 0x56, 0x75, + 0x54, 0x12, 0x60, 0x38, 0x3b, 0x6c, 0xa1, 0x19, 0x50, 0xc8, 0x4f, 0xf9, 0xdb, 0x31, 0x48, 0x5c, + 0x35, 0x1c, 0x8c, 0x1e, 0xf5, 0x05, 0x80, 0x43, 0xad, 0xec, 0x79, 0x55, 0xab, 0xea, 0xb8, 0xb2, + 0x68, 0x57, 0x7d, 0xf7, 0xb9, 0x3d, 0x73, 0x8a, 0x05, 0xcc, 0x69, 0x0c, 0x7a, 0x2c, 0xa3, 0xa1, + 0x57, 0xc4, 0x89, 0x43, 0x5a, 0x40, 0x45, 0x48, 0xba, 0x56, 0x92, 0x88, 0xb2, 0x92, 0x61, 0x62, + 0x25, 0xc4, 0x86, 0x39, 0x40, 0xe9, 0xdb, 0xe0, 0xc6, 0x52, 0x80, 0x94, 0xeb, 0xbc, 0xb8, 0xb5, + 0x75, 0x66, 0xb0, 0x1e, 0x19, 0x59, 0x4c, 0xdc, 0xb1, 0x77, 0x95, 0xc7, 0x2c, 0x2e, 0xed, 0x56, + 0x70, 0xed, 0x05, 0xcc, 0x8a, 0xdf, 0x2d, 0xef, 0xa3, 0xfd, 0xf2, 0xcc, 0x8a, 0xdd, 0x2f, 0x3f, + 0x06, 0x29, 0x5b, 0xab, 0xea, 0xaa, 0xd3, 0xb0, 0x30, 0xb7, 0x3c, 0x0f, 0x20, 0x7f, 0x5e, 0x82, + 0x5e, 0x66, 0xc9, 0x3e, 0xbd, 0x49, 0xad, 0xf5, 0x16, 0x6b, 0xa7, 0xb7, 0xf8, 0xfe, 0xf5, 0x96, + 0x07, 0x70, 0x85, 0xb1, 0xf9, 0xdd, 0xe0, 0x16, 0x11, 0x03, 0x13, 0x71, 0x55, 0xab, 0xf2, 0x89, + 0xea, 0x23, 0x92, 0xff, 0x83, 0x44, 0x82, 0x58, 0x5e, 0x8f, 0xf2, 0x30, 0x28, 0xe4, 0x2a, 0x6d, + 0xd6, 0xd4, 0x2a, 0xb7, 0x9d, 0xe3, 0x6d, 0x85, 0xbb, 0x5c, 0x53, 0xab, 0x4a, 0x3f, 0x97, 0x87, + 0x14, 0x5a, 0x8f, 0x43, 0xac, 0xcd, 0x38, 0x04, 0x06, 0x3e, 0xbe, 0xbf, 0x81, 0x0f, 0x0c, 0x51, + 0x22, 0x3c, 0x44, 0xbf, 0x13, 0xa3, 0x9b, 0x19, 0xd3, 0xb0, 0xd5, 0xda, 0x9b, 0x31, 0x23, 0x8e, + 0x42, 0xca, 0x34, 0x6a, 0x25, 0x56, 0xc3, 0x4e, 0xe2, 0x26, 0x4d, 0xa3, 0xa6, 0x34, 0x0d, 0x7b, + 0xcf, 0x6d, 0x9a, 0x2e, 0xbd, 0xb7, 0x41, 0x6b, 0x7d, 0x61, 0xad, 0x59, 0x30, 0xc0, 0x54, 0xc1, + 0xd7, 0xb2, 0x87, 0x89, 0x0e, 0xe8, 0xe2, 0x28, 0x35, 0xaf, 0xbd, 0x4c, 0x6c, 0x86, 0xa9, 0x70, + 0x3c, 0x42, 0xc1, 0x5c, 0x7f, 0xab, 0x5d, 0xb0, 0xdf, 0x2c, 0x15, 0x8e, 0x27, 0x7f, 0x50, 0x02, + 0x58, 0x20, 0x9a, 0xa5, 0xfd, 0x25, 0xab, 0x90, 0x4d, 0x45, 0x28, 0x05, 0x5a, 0x1e, 0x6f, 0x37, + 0x68, 0xbc, 0xfd, 0x01, 0xdb, 0x2f, 0xf7, 0x0c, 0x0c, 0x7a, 0xc6, 0x68, 0x63, 0x21, 0xcc, 0xf8, + 0x1e, 0x51, 0xf5, 0x2a, 0x76, 0x94, 0x81, 0x6b, 0xbe, 0x92, 0xfc, 0x07, 0x12, 0xa4, 0xa8, 0x4c, + 0x8b, 0xd8, 0x51, 0x03, 0x63, 0x28, 0xed, 0x7f, 0x0c, 0x8f, 0x03, 0x30, 0x36, 0xb6, 0xf6, 0x22, + 0xe6, 0x96, 0x95, 0xa2, 0x90, 0x55, 0xed, 0x45, 0x8c, 0xce, 0xb9, 0x0a, 0x8f, 0xef, 0xad, 0x70, + 0x11, 0x75, 0x73, 0xb5, 0x1f, 0x86, 0x3e, 0xfa, 0x44, 0xce, 0x8e, 0xcd, 0x03, 0xe9, 0x5e, 0xbd, + 0x51, 0x5f, 0xdb, 0xb1, 0xe5, 0xe7, 0xa1, 0x6f, 0x6d, 0x87, 0xe5, 0x46, 0x8e, 0x42, 0xca, 0x32, + 0x0c, 0xbe, 0x26, 0xb3, 0x58, 0x28, 0x49, 0x00, 0x74, 0x09, 0x12, 0xf9, 0x80, 0x98, 0x97, 0x0f, + 0xf0, 0x12, 0x1a, 0xf1, 0x8e, 0x12, 0x1a, 0x27, 0xbf, 0x2a, 0x41, 0xbf, 0xcf, 0x3f, 0xa0, 0x47, + 0xe0, 0x60, 0x61, 0x61, 0x79, 0xe6, 0xa9, 0xd2, 0xfc, 0x6c, 0xe9, 0xf2, 0x42, 0x7e, 0xce, 0xbb, + 0x6b, 0x92, 0x3d, 0xf4, 0xca, 0x8d, 0x49, 0xe4, 0xc3, 0x5d, 0xd7, 0xb7, 0x75, 0xe3, 0xba, 0x8e, + 0xa6, 0x61, 0x2c, 0x48, 0x92, 0x2f, 0xac, 0x16, 0x97, 0xd6, 0xd2, 0x52, 0xf6, 0xe0, 0x2b, 0x37, + 0x26, 0x47, 0x7c, 0x14, 0xf9, 0x0d, 0x1b, 0xeb, 0x4e, 0x33, 0xc1, 0xcc, 0xf2, 0xe2, 0xe2, 0xfc, + 0x5a, 0x3a, 0xd6, 0x44, 0xc0, 0x1d, 0xf6, 0x03, 0x30, 0x12, 0x24, 0x58, 0x9a, 0x5f, 0x48, 0xc7, + 0xb3, 0xe8, 0x95, 0x1b, 0x93, 0x43, 0x3e, 0xec, 0x25, 0xad, 0x96, 0x4d, 0xbe, 0xfc, 0xc9, 0xf1, + 0x03, 0x9f, 0xfe, 0xb5, 0x71, 0x89, 0xf4, 0x6c, 0x30, 0xe0, 0x23, 0xd0, 0x43, 0x70, 0x78, 0x75, + 0x7e, 0x6e, 0xa9, 0x38, 0x5b, 0x5a, 0x5c, 0x9d, 0x2b, 0xb1, 0x47, 0x36, 0xdc, 0xde, 0x0d, 0xbf, + 0x72, 0x63, 0xb2, 0x9f, 0x77, 0xa9, 0x1d, 0xf6, 0x8a, 0x52, 0xbc, 0xba, 0xbc, 0x56, 0x4c, 0x4b, + 0x0c, 0x7b, 0xc5, 0xc2, 0xd7, 0x0c, 0x87, 0xbd, 0xa1, 0xf5, 0x30, 0x1c, 0x69, 0x81, 0xed, 0x76, + 0x6c, 0xe4, 0x95, 0x1b, 0x93, 0x83, 0x2b, 0x16, 0x66, 0xf3, 0x87, 0x52, 0x4c, 0x41, 0xa6, 0x99, + 0x62, 0x79, 0x65, 0x79, 0x35, 0xbf, 0x90, 0x9e, 0xcc, 0xa6, 0x5f, 0xb9, 0x31, 0x39, 0x20, 0x9c, + 0x21, 0xc1, 0xf7, 0x7a, 0x76, 0x27, 0x77, 0x3c, 0x1f, 0x7c, 0x18, 0x8e, 0xdb, 0x8e, 0xba, 0xad, + 0xe9, 0x55, 0x37, 0xe3, 0xcc, 0xcb, 0x7c, 0xcb, 0x73, 0xbc, 0xa6, 0xbd, 0xd0, 0xd0, 0x2a, 0x02, + 0x28, 0xfe, 0xee, 0x99, 0x7e, 0xce, 0xb6, 0xff, 0xb2, 0x94, 0x8d, 0xc8, 0xae, 0x46, 0x6f, 0x9d, + 0xda, 0x7f, 0xaa, 0xc8, 0x46, 0x24, 0xd0, 0xb3, 0x7b, 0x6e, 0xee, 0xe4, 0xf7, 0x49, 0x30, 0x74, + 0x45, 0xb3, 0x1d, 0xc3, 0xd2, 0xca, 0x6a, 0x8d, 0xde, 0x30, 0x39, 0xd7, 0xa9, 0x6f, 0x0d, 0x4d, + 0xf5, 0xcb, 0xd0, 0x7b, 0x4d, 0xad, 0x31, 0xa7, 0xc6, 0x2e, 0xf1, 0xec, 0xa9, 0x45, 0xcf, 0xc3, + 0x09, 0x3e, 0x8c, 0x5a, 0xfe, 0xcd, 0x18, 0x0c, 0xd3, 0x39, 0x61, 0xb3, 0x97, 0x90, 0xc8, 0x56, + 0xab, 0x00, 0x09, 0x4b, 0x75, 0x78, 0xee, 0xb0, 0x30, 0xc5, 0xf3, 0xe1, 0xf7, 0x45, 0xe7, 0xb8, + 0xa7, 0x66, 0x71, 0x59, 0xa1, 0xb4, 0xe8, 0xff, 0x83, 0x64, 0x5d, 0xdd, 0x29, 0x51, 0x3e, 0x6c, + 0x03, 0x93, 0xef, 0x8e, 0xcf, 0xad, 0x9b, 0x13, 0xc3, 0xbb, 0x6a, 0xbd, 0x96, 0x93, 0x05, 0x1f, + 0x59, 0xe9, 0xab, 0xab, 0x3b, 0x44, 0x44, 0x64, 0xc2, 0x30, 0x81, 0x96, 0xb7, 0x54, 0xbd, 0x8a, + 0x59, 0x23, 0x34, 0x13, 0x5a, 0xb8, 0xd2, 0x75, 0x23, 0x87, 0xbc, 0x46, 0x7c, 0xec, 0x64, 0x65, + 0xb0, 0xae, 0xee, 0xcc, 0x50, 0x00, 0x69, 0x31, 0x97, 0xfc, 0xf0, 0xc7, 0x27, 0x0e, 0xd0, 0x6f, + 0x0c, 0x5f, 0x93, 0x00, 0x3c, 0x8d, 0xa1, 0x32, 0xa4, 0xcb, 0x6e, 0x89, 0xd2, 0xda, 0x7c, 0x28, + 0xa7, 0x22, 0x86, 0x24, 0xa4, 0x76, 0xb6, 0x52, 0x7f, 0xf9, 0xe6, 0x84, 0xa4, 0x0c, 0x97, 0x43, + 0x23, 0xf2, 0x13, 0xd0, 0xdf, 0x30, 0x2b, 0xaa, 0x83, 0x4b, 0x74, 0x57, 0x17, 0x8b, 0x5c, 0xf5, + 0xc7, 0x09, 0xaf, 0x5b, 0x37, 0x27, 0x10, 0xeb, 0x9d, 0x8f, 0x58, 0xa6, 0xb1, 0x00, 0x30, 0x08, + 0x21, 0xf0, 0x75, 0xed, 0x8f, 0x24, 0xe8, 0x9f, 0xf5, 0x9d, 0xfb, 0xca, 0x40, 0x5f, 0xdd, 0xd0, + 0xb5, 0x6d, 0x6e, 0x9d, 0x29, 0x45, 0x14, 0x51, 0x16, 0x92, 0xec, 0x0a, 0x9e, 0xb3, 0x2b, 0x12, + 0xa3, 0xa2, 0x4c, 0xa8, 0xae, 0xe3, 0x0d, 0x5b, 0x13, 0x83, 0xa2, 0x88, 0x22, 0xba, 0x0c, 0x69, + 0x1b, 0x97, 0x1b, 0x96, 0xe6, 0xec, 0x96, 0xca, 0x86, 0xee, 0xa8, 0x65, 0x87, 0x5d, 0xe6, 0x2a, + 0x1c, 0xbd, 0x75, 0x73, 0xe2, 0x30, 0x93, 0x35, 0x8c, 0x21, 0x2b, 0xc3, 0x02, 0x34, 0xc3, 0x20, + 0xa4, 0x85, 0x0a, 0x76, 0x54, 0xad, 0x66, 0x67, 0xd8, 0x57, 0x33, 0x51, 0xf4, 0xf5, 0xe5, 0x0b, + 0x7d, 0xfe, 0x34, 0xd7, 0x65, 0x48, 0x1b, 0x26, 0xb6, 0x02, 0x61, 0xa9, 0x14, 0x6e, 0x39, 0x8c, + 0x21, 0x2b, 0xc3, 0x02, 0x24, 0x42, 0x56, 0x87, 0x8c, 0xb6, 0xd8, 0x36, 0x9a, 0x8d, 0x0d, 0x2f, + 0x3b, 0x36, 0xd6, 0x34, 0x1a, 0x79, 0x7d, 0xb7, 0xf0, 0xa8, 0xc7, 0x3d, 0x4c, 0x27, 0x7f, 0xe9, + 0xb3, 0xa7, 0xc6, 0xb8, 0x73, 0xf1, 0xb2, 0x55, 0x4f, 0xe1, 0x5d, 0x32, 0xfc, 0x1c, 0x75, 0x85, + 0x62, 0x92, 0x20, 0xf4, 0x79, 0x55, 0xab, 0x89, 0x4b, 0xc9, 0x0a, 0x2f, 0xa1, 0x3c, 0xf4, 0xda, + 0x8e, 0xea, 0x34, 0x6c, 0xfe, 0x04, 0xd8, 0x03, 0x11, 0x16, 0x57, 0x30, 0xf4, 0xca, 0x2a, 0x25, + 0x50, 0x38, 0x21, 0xf1, 0x23, 0x8e, 0xb1, 0x8d, 0x75, 0xae, 0xc9, 0xae, 0x66, 0x3b, 0xfd, 0x96, + 0xc7, 0xa8, 0x89, 0x62, 0x2a, 0xb8, 0x86, 0xab, 0x2c, 0xd6, 0xda, 0x52, 0xc9, 0x96, 0x84, 0x3e, + 0x08, 0x56, 0x98, 0xef, 0x7a, 0x4a, 0x72, 0x85, 0x85, 0xf9, 0xc9, 0xca, 0xb0, 0x0b, 0x5a, 0xa5, + 0x10, 0xa4, 0x04, 0xce, 0x29, 0xf2, 0x57, 0xf3, 0x4e, 0x46, 0x68, 0xc1, 0x67, 0xe1, 0x22, 0x77, + 0xe1, 0x3f, 0xec, 0x78, 0x19, 0xd2, 0x0d, 0x7d, 0xc3, 0xd0, 0xe9, 0x3d, 0x42, 0x1e, 0xfb, 0x93, + 0xbd, 0x5f, 0xdc, 0x6f, 0x2a, 0x61, 0x0c, 0x59, 0x19, 0x76, 0x41, 0x57, 0xd8, 0x0e, 0xa1, 0x02, + 0x43, 0x1e, 0x16, 0x9d, 0xb6, 0xa9, 0xc8, 0x69, 0x7b, 0x17, 0x9f, 0xb6, 0x07, 0xc3, 0xad, 0x78, + 0x33, 0x77, 0xd0, 0x05, 0x12, 0x32, 0xb4, 0x0c, 0xe0, 0x39, 0x0b, 0x9a, 0xc3, 0xe8, 0x8f, 0x34, + 0x03, 0xcf, 0xf1, 0x88, 0x2d, 0xa1, 0xc7, 0x02, 0xbd, 0x03, 0x46, 0xeb, 0x9a, 0x5e, 0xb2, 0x71, + 0x6d, 0xb3, 0xc4, 0xd5, 0x4d, 0x38, 0xd3, 0xe7, 0x60, 0x0a, 0x0b, 0xdd, 0x59, 0xc7, 0xad, 0x9b, + 0x13, 0x59, 0xee, 0x5e, 0x9b, 0x59, 0xca, 0xca, 0x48, 0x5d, 0xd3, 0x57, 0x71, 0x6d, 0x73, 0xd6, + 0x85, 0xe5, 0x06, 0x5e, 0xfe, 0xf8, 0xc4, 0x01, 0x3e, 0x87, 0x0f, 0xc8, 0xe7, 0x68, 0x7a, 0x9d, + 0xcf, 0x3d, 0x6c, 0x93, 0x6d, 0x8b, 0x2a, 0x0a, 0x34, 0xe9, 0x91, 0x52, 0x3c, 0x00, 0x9b, 0xfb, + 0x2f, 0xfd, 0xfb, 0x49, 0x49, 0xfe, 0x75, 0x09, 0x7a, 0x67, 0xaf, 0xae, 0xa8, 0x9a, 0x85, 0xe6, + 0x61, 0xc4, 0xb3, 0xa3, 0xe0, 0xcc, 0x3f, 0x76, 0xeb, 0xe6, 0x44, 0x26, 0x6c, 0x6a, 0xee, 0xd4, + 0xf7, 0xcc, 0x59, 0xcc, 0xfd, 0xf9, 0x76, 0x7b, 0xdb, 0x00, 0xab, 0x26, 0x14, 0xb9, 0x79, 0xe7, + 0x1b, 0xea, 0xe6, 0x02, 0xf4, 0x31, 0x69, 0xe9, 0xe3, 0x17, 0x26, 0xf9, 0xc1, 0xbf, 0x1d, 0xdc, + 0x1b, 0x65, 0xca, 0x94, 0xcc, 0x4d, 0x79, 0x12, 0x4a, 0xf9, 0xfd, 0x31, 0x80, 0xd9, 0xab, 0x57, + 0xd7, 0x2c, 0xcd, 0xac, 0x61, 0xe7, 0x76, 0x2a, 0x60, 0x0d, 0x0e, 0xfa, 0xf6, 0x53, 0x56, 0x39, + 0xa4, 0x84, 0xc9, 0x5b, 0x37, 0x27, 0x8e, 0x85, 0x95, 0xe0, 0x43, 0x93, 0x95, 0x51, 0x6f, 0x67, + 0x65, 0x95, 0x5b, 0x72, 0xad, 0xd8, 0x8e, 0xcb, 0x35, 0xde, 0x9e, 0xab, 0x0f, 0xcd, 0xcf, 0x75, + 0xd6, 0x76, 0x5a, 0x6b, 0xf8, 0x39, 0xe8, 0xf7, 0x54, 0x62, 0xa3, 0xa7, 0x20, 0xe9, 0xf0, 0xdf, + 0x5c, 0xd1, 0x0f, 0x44, 0x2a, 0x5a, 0x50, 0x73, 0x65, 0xbb, 0x0c, 0xe4, 0xbf, 0x92, 0x00, 0x3c, + 0x0b, 0xfe, 0xf1, 0x34, 0x38, 0xe2, 0xe6, 0xb9, 0x53, 0x8e, 0xef, 0x2b, 0xa8, 0xe3, 0xd4, 0x21, + 0xb5, 0x7e, 0x20, 0x06, 0xa3, 0xeb, 0xc2, 0x1d, 0xfd, 0xd8, 0xeb, 0xe0, 0x19, 0xe8, 0xc3, 0xba, + 0x63, 0x69, 0x54, 0x09, 0x64, 0xd0, 0xcf, 0x47, 0x0c, 0x7a, 0x8b, 0xae, 0xd1, 0x47, 0x72, 0x44, + 0xb2, 0x9e, 0x73, 0x0b, 0x29, 0xe5, 0xbd, 0x71, 0xc8, 0xb4, 0xa3, 0x44, 0x33, 0x30, 0x5c, 0xb6, + 0x30, 0x05, 0x94, 0xfc, 0x19, 0xc3, 0x42, 0xd6, 0x0b, 0x45, 0x43, 0x08, 0xb2, 0x32, 0x24, 0x20, + 0x7c, 0x65, 0xa9, 0x02, 0x09, 0x10, 0x89, 0xf5, 0x11, 0xac, 0x0e, 0x23, 0x42, 0x99, 0x2f, 0x2d, + 0xa2, 0x91, 0x20, 0x03, 0xb6, 0xb6, 0x0c, 0x79, 0x50, 0xba, 0xb8, 0xbc, 0x00, 0xc3, 0x9a, 0xae, + 0x39, 0x9a, 0x5a, 0x2b, 0x6d, 0xa8, 0x35, 0x55, 0x2f, 0xef, 0x27, 0xcc, 0x66, 0xeb, 0x00, 0x6f, + 0x36, 0xc4, 0x4e, 0x56, 0x86, 0x38, 0xa4, 0xc0, 0x00, 0xe8, 0x0a, 0xf4, 0x89, 0xa6, 0x12, 0xfb, + 0x0a, 0x48, 0x04, 0xb9, 0x2f, 0x14, 0x7c, 0x4f, 0x1c, 0x46, 0x14, 0x5c, 0xf9, 0x7f, 0x43, 0xd1, + 0xdd, 0x50, 0x2c, 0x02, 0xb0, 0x59, 0x4f, 0xdc, 0xed, 0x3e, 0x46, 0x83, 0xf8, 0x8d, 0x14, 0xe3, + 0x30, 0x6b, 0x3b, 0xbe, 0xf1, 0xf8, 0x8f, 0x31, 0x18, 0xf0, 0x8f, 0xc7, 0xdf, 0xd2, 0x35, 0x0a, + 0xad, 0x78, 0x0e, 0x89, 0x65, 0xef, 0x1f, 0x8e, 0x70, 0x48, 0x4d, 0x46, 0xbc, 0xb7, 0x27, 0xfa, + 0x9f, 0x31, 0xe8, 0x5d, 0x51, 0x2d, 0xb5, 0x6e, 0xa3, 0x72, 0x53, 0x30, 0x2a, 0xb2, 0x97, 0x4d, + 0xef, 0x43, 0xf3, 0x64, 0x49, 0x44, 0x2c, 0xfa, 0xe1, 0x16, 0xb1, 0xe8, 0x5b, 0x61, 0x88, 0x6c, + 0xa3, 0x7d, 0x27, 0x20, 0x88, 0xd2, 0x07, 0x0b, 0x47, 0x3c, 0x2e, 0xc1, 0x7a, 0xb6, 0xcb, 0xbe, + 0xea, 0x3f, 0x02, 0xd1, 0x4f, 0x30, 0x3c, 0x37, 0x4d, 0xc8, 0x0f, 0x79, 0xfb, 0x58, 0x5f, 0xa5, + 0xac, 0x40, 0x5d, 0xdd, 0x29, 0xb2, 0x02, 0x5a, 0x00, 0xb4, 0xe5, 0x26, 0x56, 0x4a, 0x9e, 0x56, + 0x09, 0xfd, 0xf1, 0x5b, 0x37, 0x27, 0x8e, 0x30, 0xfa, 0x66, 0x1c, 0x59, 0x19, 0xf1, 0x80, 0x82, + 0xdb, 0x19, 0x00, 0xd2, 0xaf, 0x12, 0x3b, 0x8c, 0xc8, 0x36, 0x46, 0x07, 0x6f, 0xdd, 0x9c, 0x18, + 0x61, 0x5c, 0xbc, 0x3a, 0x59, 0x49, 0x91, 0xc2, 0x2c, 0xf9, 0xed, 0x33, 0xf0, 0xd7, 0x24, 0x40, + 0x9e, 0xe7, 0x57, 0xb0, 0x6d, 0x92, 0x0d, 0x1d, 0x89, 0xd5, 0x7d, 0x11, 0xb5, 0xd4, 0x51, 0xac, + 0xee, 0xb1, 0x11, 0xb1, 0xba, 0x6f, 0xde, 0x3c, 0xe6, 0x39, 0xcb, 0x18, 0x1f, 0xce, 0x16, 0x07, + 0x38, 0xa7, 0x66, 0x0c, 0x4d, 0x50, 0x37, 0x79, 0xc7, 0x03, 0xf2, 0x9f, 0x4a, 0x70, 0xa4, 0xc9, + 0xb0, 0x5c, 0x99, 0x31, 0x20, 0xcb, 0x57, 0xc9, 0x5f, 0x8d, 0x63, 0xb2, 0xef, 0xd7, 0x5c, 0x47, + 0xac, 0x26, 0x67, 0x7c, 0xfb, 0xdc, 0x3e, 0x3b, 0x08, 0xfa, 0xaf, 0x24, 0x18, 0xf3, 0x37, 0xef, + 0xf6, 0x67, 0x1d, 0x06, 0xfc, 0xad, 0xf3, 0x9e, 0x3c, 0xd8, 0x45, 0x4f, 0x78, 0x27, 0x02, 0x6c, + 0xd0, 0xb3, 0xde, 0x54, 0x66, 0xf9, 0xb8, 0x0b, 0xdd, 0xea, 0x46, 0x48, 0x18, 0x9e, 0xd2, 0x09, + 0x3a, 0x48, 0xff, 0x47, 0x82, 0xc4, 0x8a, 0x61, 0xd4, 0x90, 0x01, 0x23, 0xba, 0xe1, 0x94, 0x88, + 0xd5, 0xe1, 0x4a, 0x89, 0x6f, 0xdd, 0x99, 0xab, 0x9c, 0xe9, 0x4e, 0x65, 0xdf, 0xb9, 0x39, 0xd1, + 0xcc, 0x4a, 0x19, 0xd6, 0x0d, 0xa7, 0x40, 0x21, 0x6b, 0x6c, 0x63, 0xff, 0x0e, 0x18, 0x0c, 0x36, + 0xc6, 0x1c, 0xe9, 0x33, 0x5d, 0x37, 0x16, 0x64, 0x73, 0xeb, 0xe6, 0xc4, 0x98, 0x37, 0x9b, 0x5c, + 0xb0, 0xac, 0x0c, 0x6c, 0xf8, 0x5a, 0x67, 0x27, 0xc7, 0xbe, 0x47, 0x46, 0xf4, 0x33, 0x12, 0x8c, + 0x52, 0xa0, 0xf6, 0x22, 0xa6, 0xbb, 0x7f, 0x05, 0x97, 0x0d, 0xab, 0x82, 0x86, 0x20, 0xc6, 0xbf, + 0xc5, 0x24, 0x94, 0x98, 0x56, 0x41, 0x63, 0xd0, 0x63, 0x5c, 0xd7, 0xf9, 0x41, 0x8e, 0x94, 0xc2, + 0x0a, 0xe8, 0x24, 0x8c, 0xd0, 0x95, 0x88, 0x35, 0xc3, 0x27, 0x36, 0x7f, 0x73, 0x88, 0x56, 0x50, + 0xd6, 0x74, 0x1e, 0xa3, 0x7b, 0x61, 0xa8, 0x6e, 0x54, 0x1a, 0x35, 0x5c, 0x52, 0xcb, 0x65, 0x7a, + 0xee, 0x98, 0xbd, 0x62, 0x32, 0xc8, 0xa0, 0x79, 0x06, 0x24, 0x9b, 0x51, 0xd7, 0x93, 0xf1, 0x34, + 0x94, 0x07, 0x60, 0x66, 0x78, 0xf2, 0x73, 0x12, 0x80, 0x97, 0x74, 0x41, 0x0f, 0xc1, 0xe1, 0xc2, + 0xf2, 0xd2, 0x6c, 0x69, 0x75, 0x2d, 0xbf, 0xb6, 0xbe, 0x5a, 0x5a, 0x5f, 0x5a, 0x5d, 0x29, 0xce, + 0xcc, 0x5f, 0x9e, 0x2f, 0xce, 0x7a, 0x9f, 0x0b, 0x6c, 0x13, 0x97, 0xb5, 0x4d, 0x0d, 0x57, 0xd0, + 0x7d, 0x30, 0x16, 0xc4, 0x26, 0xa5, 0xe2, 0x6c, 0x5a, 0xca, 0x0e, 0xbc, 0x72, 0x63, 0x32, 0xc9, + 0x62, 0x4c, 0x5c, 0x41, 0x27, 0xe0, 0x60, 0x33, 0xde, 0xfc, 0xd2, 0x5c, 0x3a, 0x96, 0x1d, 0x7c, + 0xe5, 0xc6, 0x64, 0xca, 0x0d, 0x46, 0x91, 0x0c, 0xc8, 0x8f, 0xc9, 0xf9, 0xc5, 0xb3, 0xf0, 0xca, + 0x8d, 0xc9, 0x5e, 0x36, 0xea, 0xd9, 0xc4, 0xcb, 0x9f, 0x1c, 0x3f, 0x50, 0x78, 0x5b, 0xdb, 0x0f, + 0x02, 0x97, 0x7c, 0x03, 0xae, 0xbd, 0x50, 0x6b, 0xd8, 0x9a, 0xa1, 0x6b, 0x7a, 0x79, 0x9a, 0x99, + 0xbb, 0xe6, 0xec, 0x9e, 0xe2, 0xa6, 0x7e, 0x8a, 0xa9, 0x6b, 0x7a, 0x47, 0xa4, 0xfb, 0x43, 0x1f, + 0x06, 0xfe, 0xe4, 0x2e, 0xc8, 0x84, 0x3f, 0x0c, 0x38, 0x3b, 0x9d, 0x7d, 0x13, 0xd8, 0x23, 0xfb, + 0x1f, 0x99, 0xdd, 0x6f, 0xf3, 0x3d, 0x61, 0xff, 0x39, 0xff, 0xbd, 0x3f, 0x6f, 0xc8, 0xff, 0x2e, + 0x01, 0x68, 0xd1, 0xae, 0xce, 0x90, 0xc0, 0xd1, 0x77, 0x7c, 0x2d, 0x94, 0xba, 0x92, 0x6e, 0x47, + 0xea, 0x6a, 0x2d, 0x90, 0x0c, 0x8a, 0xed, 0x2b, 0x0b, 0xdd, 0x71, 0x46, 0x28, 0xfe, 0xa6, 0x64, + 0x84, 0x5a, 0xc7, 0x86, 0x89, 0xdb, 0xb7, 0x97, 0xec, 0xd9, 0xef, 0x7e, 0x9a, 0x67, 0x7f, 0x7b, + 0xf7, 0xc8, 0xfe, 0x66, 0xda, 0xa6, 0x78, 0x39, 0x35, 0x3a, 0x2b, 0x2e, 0x2f, 0xf5, 0x75, 0xb6, + 0x7e, 0xf3, 0xdb, 0x4d, 0xc9, 0x97, 0xc5, 0xea, 0x7d, 0x0c, 0xb2, 0xcd, 0xc6, 0x25, 0xd6, 0x12, + 0xf9, 0xd5, 0x38, 0xa4, 0x17, 0xed, 0x6a, 0xb1, 0xa2, 0x39, 0x77, 0xd6, 0xf2, 0x2e, 0xb5, 0xdf, + 0xa6, 0xa3, 0x5b, 0x37, 0x27, 0x86, 0x98, 0x6a, 0xf7, 0x50, 0x68, 0x1d, 0x86, 0x43, 0x9f, 0x51, + 0xb8, 0x81, 0xcd, 0xee, 0xe7, 0x6b, 0x4e, 0x88, 0x95, 0x4c, 0xb7, 0x53, 0x3e, 0x33, 0x47, 0x3b, + 0xad, 0x6d, 0x9a, 0xd9, 0xd5, 0x95, 0x3b, 0x99, 0xe1, 0xf4, 0x86, 0x2e, 0x0b, 0x99, 0xf0, 0xd8, + 0xb8, 0x03, 0xf7, 0x17, 0x12, 0xf4, 0x2f, 0xda, 0x22, 0x7d, 0x80, 0x7f, 0x4c, 0x33, 0x2a, 0xe7, + 0xdd, 0x9b, 0x39, 0xf1, 0xce, 0xcc, 0x57, 0xdc, 0xd6, 0xf1, 0x94, 0x70, 0x10, 0x46, 0x7d, 0xfd, + 0x74, 0xfb, 0xff, 0xc7, 0x31, 0xea, 0x34, 0x0b, 0xb8, 0xaa, 0xe9, 0x6e, 0xa8, 0x84, 0xff, 0xb6, + 0x6e, 0x14, 0x3d, 0x3d, 0x27, 0xf6, 0xab, 0xe7, 0x6d, 0xea, 0x27, 0x42, 0xfa, 0x74, 0xa3, 0xe2, + 0xc5, 0xe6, 0x34, 0x86, 0xd4, 0xc5, 0xc9, 0xa2, 0x50, 0xb2, 0x42, 0xfe, 0xb6, 0x04, 0x83, 0x8b, + 0x76, 0x75, 0x5d, 0xaf, 0xfc, 0x8d, 0xb7, 0xdf, 0x4d, 0x38, 0x18, 0xe8, 0xe9, 0x9d, 0x52, 0xe9, + 0x1f, 0xc4, 0x60, 0x64, 0xd1, 0xae, 0x06, 0x22, 0x60, 0xfb, 0x6f, 0x98, 0x5a, 0xc9, 0xec, 0x71, + 0x78, 0x07, 0x2b, 0xec, 0xa3, 0x5f, 0x89, 0xc5, 0xf2, 0x89, 0xf0, 0xec, 0x69, 0x89, 0x26, 0x2b, + 0xa3, 0x2e, 0x9c, 0x2a, 0x68, 0x99, 0x40, 0x7d, 0x83, 0xb5, 0x06, 0x47, 0x9a, 0x74, 0xe8, 0x0e, + 0x98, 0x27, 0xb5, 0xd4, 0x95, 0xd4, 0xf2, 0xa7, 0x25, 0xea, 0xc8, 0xc9, 0xb4, 0xc2, 0x75, 0xb6, + 0x6f, 0xd9, 0x74, 0xbf, 0x50, 0xde, 0xc6, 0x11, 0x3a, 0x1f, 0xb8, 0x07, 0xb9, 0x2f, 0x6b, 0x95, + 0x61, 0xb2, 0x9d, 0xa4, 0xae, 0xeb, 0xfd, 0xb0, 0x04, 0xe3, 0x44, 0x4b, 0x96, 0xaa, 0xdb, 0x9b, + 0xd8, 0x6a, 0xb5, 0xe7, 0x3a, 0x0f, 0x19, 0xa1, 0x68, 0xae, 0x7f, 0x8b, 0x56, 0x94, 0xdc, 0x9d, + 0x98, 0x3b, 0x8e, 0x3e, 0x32, 0x76, 0x5c, 0xdd, 0xa6, 0xc7, 0x5b, 0xf8, 0xee, 0x8c, 0x97, 0xe8, + 0x3b, 0xb7, 0xf8, 0x3a, 0x1f, 0x6c, 0xfe, 0x48, 0x80, 0x8e, 0xaf, 0x87, 0xc7, 0xef, 0x04, 0xdc, + 0xb7, 0xb7, 0x64, 0xa2, 0x13, 0xa7, 0xdf, 0x9b, 0x84, 0xf8, 0xa2, 0x5d, 0x45, 0x3f, 0x05, 0xc3, + 0xe1, 0xc0, 0xfb, 0x91, 0x88, 0x48, 0xa7, 0x39, 0x9c, 0xca, 0x3e, 0xd6, 0x35, 0x89, 0x6b, 0x55, + 0xbb, 0x30, 0x18, 0x8c, 0xbe, 0xa6, 0xa3, 0x79, 0x05, 0x08, 0xb2, 0xe7, 0xbb, 0x24, 0x70, 0x9b, + 0x7e, 0x1e, 0x92, 0x6e, 0xfc, 0x70, 0x32, 0x9a, 0x89, 0xc0, 0xcd, 0x9e, 0xee, 0x1c, 0xd7, 0x6d, + 0xeb, 0xa7, 0x60, 0x38, 0xbc, 0x56, 0x77, 0xa0, 0xe7, 0x10, 0x49, 0x27, 0x7a, 0x6e, 0xb7, 0x82, + 0x99, 0x00, 0xbe, 0xe5, 0xe6, 0xa1, 0x68, 0x46, 0x1e, 0x76, 0xf6, 0x4c, 0x37, 0xd8, 0x6e, 0x8b, + 0xef, 0x80, 0xa1, 0x90, 0x37, 0x7e, 0x38, 0x9a, 0x4f, 0x90, 0x22, 0x7b, 0xa1, 0x5b, 0x0a, 0xb7, + 0xf5, 0x97, 0x25, 0x96, 0x43, 0x17, 0xf3, 0x18, 0x75, 0x60, 0x26, 0x2d, 0xe7, 0x7d, 0xf6, 0xd2, + 0x3e, 0x09, 0x5d, 0x51, 0x3e, 0x29, 0xc1, 0xd1, 0xbd, 0xbc, 0xc5, 0xe3, 0x1d, 0x74, 0xb2, 0x3d, + 0x79, 0xb6, 0xf8, 0x86, 0xc8, 0xdd, 0xb4, 0xda, 0x9b, 0x90, 0xd1, 0xf8, 0x7a, 0x0c, 0x4e, 0xfa, + 0x73, 0x05, 0x2f, 0x34, 0xb0, 0xb5, 0xeb, 0x66, 0x05, 0x4c, 0xb5, 0xaa, 0xe9, 0xfe, 0x5b, 0xde, + 0x47, 0xfc, 0xee, 0x9b, 0xe2, 0x8a, 0x3e, 0xc9, 0x2f, 0x4b, 0xd0, 0xbf, 0xa2, 0x56, 0xb1, 0x82, + 0x5f, 0x68, 0x60, 0xdb, 0x69, 0x71, 0xcd, 0xf8, 0x10, 0xf4, 0x1a, 0x9b, 0x9b, 0xe2, 0x50, 0x73, + 0x42, 0xe1, 0x25, 0x34, 0x06, 0x3d, 0x35, 0xad, 0xae, 0xb1, 0xa5, 0x37, 0xa1, 0xb0, 0x02, 0x9a, + 0x80, 0x7e, 0x9a, 0xb4, 0x2a, 0xb1, 0x0b, 0x5a, 0x09, 0xf1, 0x04, 0x60, 0x43, 0x77, 0xd6, 0xe8, + 0x2d, 0xad, 0x0c, 0xf4, 0x59, 0xf8, 0x1a, 0xb6, 0x6c, 0xf6, 0x0c, 0x7a, 0x52, 0x11, 0x45, 0xf9, + 0x12, 0x0c, 0x30, 0x49, 0xf8, 0x68, 0x1f, 0x81, 0x24, 0xbd, 0x6a, 0xe3, 0xc9, 0xd3, 0x47, 0xca, + 0x4f, 0xb1, 0xcb, 0xca, 0x8c, 0x3f, 0x13, 0x89, 0x15, 0x0a, 0x85, 0xb6, 0x8a, 0x3f, 0x11, 0xbd, + 0xc7, 0x62, 0x3a, 0x74, 0x35, 0xfc, 0x87, 0x3d, 0x70, 0x90, 0xe7, 0x77, 0x54, 0x53, 0x9b, 0xde, + 0x72, 0x1c, 0xf1, 0xa0, 0x06, 0xf0, 0xa0, 0x4a, 0x35, 0x35, 0x79, 0x17, 0x12, 0x57, 0x1c, 0xc7, + 0x44, 0x27, 0xa1, 0xc7, 0x6a, 0xd4, 0xb0, 0xf8, 0xc6, 0xef, 0xee, 0xd1, 0x55, 0x53, 0x9b, 0x22, + 0x08, 0x4a, 0xa3, 0x86, 0x15, 0x86, 0x82, 0x8a, 0x30, 0xb1, 0xd9, 0xa8, 0xd5, 0x76, 0x4b, 0x15, + 0x4c, 0xff, 0x5f, 0xab, 0xfb, 0xaf, 0xd1, 0xf0, 0x8e, 0xa9, 0xea, 0x6e, 0x3e, 0x25, 0xa9, 0x1c, + 0xa3, 0x68, 0xb3, 0x14, 0x4b, 0xfc, 0x5b, 0xb4, 0xa2, 0xc0, 0x91, 0xff, 0x2c, 0x06, 0x49, 0xc1, + 0x9a, 0xde, 0x1e, 0xc6, 0x35, 0x5c, 0x76, 0x0c, 0x71, 0x7e, 0xce, 0x2d, 0x23, 0x04, 0xf1, 0x2a, + 0x1f, 0xbc, 0xd4, 0x95, 0x03, 0x0a, 0x29, 0x10, 0x98, 0x7b, 0xa7, 0x9b, 0xc0, 0xcc, 0x06, 0x19, + 0xcf, 0x84, 0x69, 0x88, 0xcf, 0x6f, 0x57, 0x0e, 0x28, 0xb4, 0x84, 0x32, 0xd0, 0x4b, 0xfc, 0x91, + 0xc3, 0x46, 0x8b, 0xc0, 0x79, 0x19, 0x1d, 0x82, 0x1e, 0x53, 0x75, 0xca, 0xec, 0xba, 0x15, 0xa9, + 0x60, 0x45, 0x12, 0x3c, 0xb0, 0xc7, 0x82, 0xc2, 0xff, 0x0c, 0x91, 0x28, 0x83, 0xbd, 0xca, 0x4c, + 0xe4, 0x5e, 0x51, 0x1d, 0x07, 0x5b, 0x3a, 0x61, 0xc8, 0xd0, 0x11, 0x82, 0xc4, 0x86, 0x51, 0xd9, + 0xe5, 0xff, 0xa0, 0x91, 0xfe, 0xe6, 0xff, 0x3a, 0x8e, 0xda, 0x43, 0x89, 0x56, 0xb2, 0xff, 0x4b, + 0x3b, 0x20, 0x80, 0x05, 0x82, 0x54, 0x84, 0x51, 0xb5, 0x52, 0xd1, 0x88, 0xc1, 0xab, 0xb5, 0xd2, + 0x86, 0x46, 0x53, 0x90, 0x36, 0xfd, 0xaf, 0xc3, 0xed, 0xc6, 0x02, 0x79, 0x04, 0x05, 0x8e, 0x5f, + 0x48, 0x41, 0x9f, 0xc9, 0x84, 0x92, 0x2f, 0xc2, 0x48, 0x93, 0xa4, 0x44, 0xbe, 0x6d, 0x4d, 0xaf, + 0x88, 0x8b, 0xee, 0xe4, 0x37, 0x81, 0xd1, 0x97, 0xd5, 0x59, 0x90, 0x41, 0x7f, 0x17, 0xde, 0xd5, + 0xfe, 0x19, 0x84, 0x21, 0xdf, 0x33, 0x08, 0xaa, 0xa9, 0x15, 0x52, 0x94, 0x3f, 0x7f, 0xfd, 0x20, + 0xcf, 0x2b, 0xd8, 0xcb, 0x07, 0x53, 0x86, 0x55, 0x9d, 0xae, 0x62, 0x5d, 0xe4, 0x0f, 0x49, 0x95, + 0x6a, 0x6a, 0x36, 0x35, 0x47, 0xef, 0xa5, 0x77, 0xfb, 0xa2, 0xef, 0x37, 0x7d, 0x14, 0x21, 0x31, + 0x97, 0x5f, 0x99, 0x77, 0xed, 0xf8, 0x0b, 0x31, 0x38, 0xe6, 0xb3, 0x63, 0x1f, 0x72, 0xb3, 0x39, + 0x67, 0x5b, 0x5b, 0x7c, 0x07, 0xef, 0xa4, 0x3c, 0x05, 0x09, 0x82, 0x8f, 0x22, 0xfe, 0xb1, 0x5b, + 0xe6, 0xb7, 0xbe, 0xf4, 0xcf, 0xe5, 0x60, 0x16, 0x2b, 0x30, 0x2a, 0x94, 0x49, 0xe1, 0xe7, 0x3a, + 0xd7, 0x5f, 0xda, 0x7b, 0xe4, 0xde, 0xbe, 0x7d, 0x6a, 0x0c, 0xeb, 0xf0, 0x43, 0x17, 0xe0, 0x68, + 0x38, 0xf3, 0xca, 0xbc, 0x68, 0x47, 0x29, 0xe4, 0x2e, 0x3c, 0x75, 0xbb, 0xbb, 0xe1, 0x7b, 0x8d, + 0x60, 0x54, 0x56, 0x78, 0x07, 0x0e, 0x3d, 0x4d, 0x1a, 0xf5, 0x3e, 0x7e, 0x0a, 0x5f, 0x7f, 0xc8, + 0x3d, 0xd4, 0x29, 0xf1, 0x18, 0x59, 0x9c, 0xd4, 0x04, 0x4f, 0x30, 0xbe, 0x05, 0xb8, 0x6f, 0xaa, + 0xed, 0x1a, 0x32, 0xe5, 0x5b, 0x3f, 0x14, 0x1f, 0xa5, 0xfc, 0x19, 0x09, 0x0e, 0x37, 0x35, 0xcd, + 0x9d, 0xfb, 0x52, 0x8b, 0xfb, 0xeb, 0xdd, 0x9e, 0x2c, 0xf7, 0x5f, 0x69, 0x9f, 0x6b, 0x21, 0xf3, + 0xfd, 0x91, 0x32, 0x33, 0x61, 0x02, 0x42, 0x3f, 0x01, 0x07, 0x83, 0x32, 0x0b, 0x6d, 0xdd, 0x0b, + 0x43, 0xc1, 0x3d, 0x29, 0xd7, 0xda, 0x60, 0x60, 0x57, 0x2a, 0x6f, 0x86, 0xd5, 0xed, 0x76, 0x79, + 0xc1, 0xff, 0x19, 0x87, 0xed, 0xfc, 0xba, 0xed, 0xb1, 0xc7, 0x40, 0x7e, 0xbf, 0x04, 0x93, 0xc1, + 0x86, 0xbc, 0xd4, 0x9f, 0xdd, 0x9d, 0xcc, 0xb7, 0x6d, 0xc0, 0xbf, 0x27, 0xc1, 0x5d, 0x7b, 0xc8, + 0xc4, 0xf5, 0xf0, 0xd3, 0x12, 0x8c, 0xf9, 0xbe, 0xf3, 0x0a, 0x57, 0x2e, 0xac, 0xe0, 0x91, 0x8e, + 0xbf, 0x53, 0xbb, 0x11, 0xd7, 0x51, 0xa2, 0x9c, 0xd7, 0xbe, 0x3e, 0x31, 0xda, 0x5c, 0x67, 0x2b, + 0xa3, 0xcd, 0xdf, 0x66, 0x6f, 0xa3, 0xb9, 0xbc, 0x2a, 0xc1, 0x03, 0xc1, 0x2e, 0xb7, 0x38, 0x91, + 0xf5, 0xa3, 0x1a, 0x8f, 0x6f, 0x48, 0x70, 0xb2, 0x13, 0xe1, 0xf8, 0xc0, 0x68, 0x30, 0xea, 0x9d, + 0xbd, 0x08, 0x0f, 0xcb, 0xe9, 0xee, 0x8f, 0xb0, 0x71, 0xa3, 0x45, 0x2e, 0xd3, 0x3b, 0xa0, 0x7f, + 0x93, 0x4f, 0x37, 0xff, 0xc8, 0xbb, 0xba, 0x0e, 0x26, 0x3b, 0x84, 0xae, 0x03, 0xe9, 0x8e, 0x16, + 0x43, 0x12, 0x6b, 0x31, 0x24, 0xbe, 0xd4, 0xc0, 0x3b, 0xb9, 0x53, 0x6b, 0x71, 0xec, 0x62, 0x03, + 0x46, 0x5b, 0x18, 0x36, 0x9f, 0xeb, 0xdd, 0xdb, 0xb5, 0x82, 0x9a, 0x4d, 0x57, 0xde, 0x85, 0x09, + 0xda, 0x7c, 0x0b, 0x7d, 0xdf, 0xe9, 0x9e, 0x3b, 0xdc, 0xe3, 0xb4, 0x6c, 0x9a, 0xab, 0x60, 0x05, + 0x7a, 0xd9, 0x70, 0xf3, 0x5e, 0xef, 0xdf, 0x6c, 0x38, 0x1f, 0xf9, 0x23, 0xc2, 0xd1, 0xcd, 0x0a, + 0xe9, 0x5b, 0x4f, 0xac, 0x4e, 0xba, 0x7c, 0x9b, 0x26, 0x96, 0x4f, 0x27, 0x5f, 0x13, 0x2e, 0xaf, + 0xb5, 0x74, 0x6e, 0x82, 0xe4, 0x36, 0x7b, 0x3c, 0xa6, 0xa2, 0x3b, 0xeb, 0xda, 0x7e, 0x4d, 0xb8, + 0x36, 0xb7, 0x6b, 0x11, 0xae, 0xed, 0x47, 0x33, 0x02, 0xae, 0x93, 0x8b, 0x10, 0xf3, 0xaf, 0xb1, + 0x93, 0xfb, 0x9e, 0x04, 0x47, 0x68, 0x17, 0xfd, 0x67, 0x79, 0xba, 0xd5, 0xfc, 0x43, 0x80, 0x6c, + 0xab, 0x5c, 0x6a, 0x39, 0xe5, 0xd3, 0xb6, 0x55, 0xbe, 0x1a, 0x58, 0x82, 0x1e, 0x02, 0x54, 0xb1, + 0x9d, 0x30, 0x36, 0x4b, 0x98, 0xa6, 0x2b, 0xb6, 0x73, 0x75, 0x8f, 0x05, 0x2b, 0x71, 0x1b, 0x46, + 0xf5, 0xab, 0x12, 0x64, 0x5b, 0x75, 0xd9, 0x4d, 0xc2, 0x1d, 0x0a, 0x1c, 0x16, 0x0b, 0x0f, 0xe4, + 0xa3, 0x5d, 0x1c, 0x8a, 0x0a, 0x4d, 0xaa, 0x83, 0x16, 0xbe, 0xd3, 0x11, 0xc3, 0x44, 0xd0, 0x5e, + 0x9b, 0x23, 0xf3, 0x1f, 0xd9, 0x64, 0xfa, 0xfd, 0x26, 0x67, 0xfb, 0xd7, 0x29, 0x76, 0xdf, 0x81, + 0xf1, 0x36, 0xc2, 0xdf, 0xe9, 0xa5, 0xd1, 0x68, 0x3b, 0xa6, 0x77, 0x28, 0xfc, 0x3f, 0xc3, 0xa7, + 0x47, 0xf0, 0x92, 0xaf, 0x6f, 0x67, 0xd7, 0xea, 0x95, 0x10, 0xf9, 0xff, 0x87, 0xa3, 0x2d, 0xa9, + 0xb8, 0x88, 0x79, 0x48, 0x6c, 0x69, 0xb6, 0xf8, 0x2c, 0x75, 0x2a, 0x42, 0xba, 0x10, 0x13, 0x4a, + 0x2a, 0x23, 0x48, 0xd3, 0x16, 0x56, 0x0c, 0xa3, 0xc6, 0xa5, 0x91, 0x15, 0x18, 0xf1, 0xc1, 0x78, + 0x5b, 0x8f, 0x43, 0xc2, 0x34, 0xf8, 0x43, 0x78, 0xfd, 0xa7, 0xef, 0x8e, 0x68, 0x8b, 0x90, 0x72, + 0x25, 0x50, 0x32, 0x79, 0x0c, 0x10, 0xe3, 0x49, 0x4f, 0x1d, 0x8b, 0x96, 0x9e, 0x83, 0xd1, 0x00, + 0x94, 0xb7, 0x35, 0x03, 0xbd, 0x26, 0x85, 0xf0, 0xd6, 0xa2, 0x2e, 0x3b, 0x31, 0x72, 0xf7, 0xa1, + 0x31, 0x5a, 0x3a, 0xfd, 0x1b, 0x87, 0xa1, 0x87, 0x32, 0x47, 0x9f, 0x92, 0x00, 0x7c, 0x47, 0x89, + 0xcf, 0x46, 0x70, 0x6b, 0xbd, 0xfb, 0xce, 0x9e, 0xeb, 0x96, 0x8c, 0x07, 0x80, 0x27, 0xdf, 0xf5, + 0xaf, 0xbf, 0xf5, 0x4b, 0xb1, 0x7b, 0x90, 0x2c, 0x32, 0x99, 0xe1, 0xed, 0xbf, 0x6f, 0x66, 0xfd, + 0x6e, 0xe0, 0x05, 0xb6, 0x33, 0x5d, 0xb5, 0x28, 0xe4, 0x3c, 0xdb, 0x25, 0x15, 0x17, 0xf3, 0x22, + 0x15, 0xf3, 0x2c, 0x7a, 0x34, 0x5a, 0xcc, 0xe9, 0xb7, 0x07, 0x27, 0xdb, 0x3b, 0xd1, 0xeb, 0x12, + 0x8c, 0xb5, 0xda, 0x43, 0xa2, 0x4b, 0x5d, 0x09, 0xd3, 0x1c, 0xa6, 0x64, 0xdf, 0xba, 0x7f, 0x06, + 0xbc, 0x63, 0x73, 0xb4, 0x63, 0x79, 0x74, 0x69, 0x1f, 0x1d, 0x9b, 0xf6, 0xad, 0x65, 0xe8, 0xe7, + 0x63, 0x70, 0x7c, 0xcf, 0x8d, 0x19, 0xba, 0xd2, 0x95, 0xb0, 0x7b, 0x44, 0x67, 0xd9, 0xf9, 0xdb, + 0xc0, 0x89, 0xf7, 0xff, 0x69, 0xda, 0xff, 0xa7, 0xd0, 0xfc, 0x7e, 0xfa, 0xef, 0x85, 0x5e, 0x7e, + 0x4d, 0xfc, 0x9b, 0xe0, 0xc5, 0xb6, 0x8e, 0x2c, 0xae, 0x69, 0xdb, 0xd3, 0xd9, 0x84, 0x6a, 0x8e, + 0xa5, 0xe5, 0x67, 0x69, 0x87, 0x14, 0xb4, 0xf2, 0x06, 0x07, 0x74, 0xfa, 0xed, 0xc1, 0xa5, 0xe5, + 0x9d, 0xe8, 0x67, 0xdb, 0xdc, 0x5a, 0x7b, 0xa2, 0x13, 0x49, 0xdb, 0x6f, 0xf0, 0xb2, 0x97, 0xf6, + 0x4d, 0xcf, 0xbb, 0x5c, 0xa7, 0x5d, 0xae, 0x22, 0x7c, 0xbb, 0xbb, 0xdc, 0x72, 0x80, 0xd1, 0x57, + 0x25, 0x18, 0x6b, 0xb5, 0x3f, 0xea, 0x6c, 0x3a, 0xef, 0xb1, 0xef, 0xeb, 0x6c, 0x3a, 0xef, 0xb5, + 0x35, 0x93, 0xdf, 0x42, 0x55, 0x71, 0x0e, 0x9d, 0x69, 0xa7, 0x8a, 0x3d, 0x47, 0x98, 0xcc, 0xe1, + 0x3d, 0xf7, 0x1d, 0x9d, 0xcd, 0xe1, 0x4e, 0x76, 0x58, 0x9d, 0xcd, 0xe1, 0x8e, 0x36, 0x41, 0xd1, + 0x73, 0xd8, 0xed, 0x67, 0x87, 0x43, 0x6c, 0xa3, 0x3f, 0x91, 0x60, 0x30, 0x10, 0xab, 0xa3, 0x0b, + 0x9d, 0xc8, 0xdb, 0x6a, 0x47, 0x13, 0xf9, 0x75, 0xbe, 0xfd, 0xc6, 0x40, 0x9e, 0xa7, 0x3d, 0x9b, + 0x41, 0xf9, 0xfd, 0xf4, 0xcc, 0x0a, 0xc8, 0x7f, 0x53, 0x82, 0xd1, 0x16, 0x61, 0x70, 0x67, 0xb3, + 0xb7, 0x7d, 0x70, 0x9f, 0xbd, 0xb4, 0x6f, 0x7a, 0xde, 0xc7, 0xcb, 0xb4, 0x8f, 0x6f, 0x45, 0x4f, + 0xec, 0xa7, 0x8f, 0xbe, 0xe8, 0xe0, 0xbb, 0xde, 0xe5, 0x21, 0x5f, 0x3b, 0x91, 0x5f, 0xd1, 0xf7, + 0x0e, 0xb1, 0xb3, 0x4f, 0xec, 0x97, 0x9c, 0xf7, 0xee, 0x19, 0xda, 0xbb, 0xa7, 0xd1, 0xf2, 0x1b, + 0xeb, 0x5d, 0x73, 0x50, 0xf1, 0x85, 0xe6, 0x37, 0x71, 0x3a, 0x32, 0xb4, 0x96, 0x21, 0x76, 0x36, + 0xb7, 0x1f, 0x52, 0xde, 0xc5, 0x0b, 0xb4, 0x8b, 0xa7, 0xd1, 0xc3, 0xed, 0xba, 0xe8, 0xbb, 0x3d, + 0xa6, 0xe9, 0x9b, 0xc6, 0xf4, 0xdb, 0x59, 0xfc, 0xfe, 0x4e, 0xf4, 0x5e, 0x71, 0x3b, 0x67, 0xba, + 0x93, 0xe6, 0x7d, 0x41, 0x78, 0xf6, 0xe1, 0xce, 0x09, 0xb8, 0x94, 0xf7, 0x50, 0x29, 0xc7, 0xd1, + 0xb1, 0x76, 0x52, 0x92, 0x40, 0x1c, 0x7d, 0x48, 0x72, 0xaf, 0xfe, 0x3d, 0xd2, 0x51, 0x13, 0xfe, + 0x80, 0x3d, 0xf2, 0x04, 0x50, 0x8b, 0x68, 0x5e, 0xbe, 0x8f, 0xca, 0x35, 0x89, 0xc6, 0xdb, 0xca, + 0xc5, 0xc2, 0xf7, 0x37, 0xe1, 0x1c, 0xc6, 0x0f, 0x7a, 0x9b, 0xbf, 0x0c, 0xaa, 0x0d, 0x67, 0xeb, + 0xc5, 0x37, 0xf4, 0xe0, 0xd4, 0xbe, 0x2f, 0x88, 0xc8, 0x7f, 0x1e, 0x07, 0xb4, 0xea, 0xa8, 0xdb, + 0x38, 0xdf, 0x70, 0xb6, 0x0c, 0x4b, 0x7b, 0x91, 0xad, 0xbf, 0x18, 0xa0, 0xae, 0xee, 0xf8, 0xef, + 0x70, 0xed, 0x79, 0xa6, 0xef, 0xc1, 0xd7, 0xbe, 0x3e, 0x71, 0x7f, 0x07, 0xa7, 0xd2, 0x09, 0xb2, + 0x92, 0xaa, 0xab, 0x3b, 0xfc, 0x60, 0xd0, 0x4f, 0x02, 0xa8, 0xb5, 0x9a, 0x71, 0xbd, 0x54, 0x23, + 0x9b, 0x48, 0xb6, 0x8f, 0x7f, 0x4b, 0xc4, 0x00, 0x37, 0x4b, 0x3b, 0xe5, 0x7b, 0x3f, 0xf5, 0x80, + 0x92, 0xa2, 0x1c, 0x17, 0x34, 0xdb, 0x41, 0x3f, 0x01, 0xa9, 0x0a, 0xd6, 0x77, 0x19, 0xf7, 0xf8, + 0x6d, 0xe1, 0x9e, 0x24, 0x0c, 0x29, 0xf3, 0x12, 0x20, 0xd5, 0x8f, 0x47, 0xff, 0xdb, 0x07, 0x7f, + 0xec, 0x26, 0x6a, 0xea, 0x04, 0x1a, 0xa0, 0x2f, 0x3a, 0x8e, 0xa8, 0x61, 0x50, 0xf6, 0xbe, 0xc0, + 0x9e, 0x31, 0xf0, 0x18, 0x76, 0xfc, 0x44, 0xca, 0x7d, 0x0c, 0x3b, 0x37, 0xf2, 0xa7, 0x9f, 0x3d, + 0x35, 0x18, 0xe0, 0x58, 0x18, 0xf0, 0xe7, 0x5b, 0x4e, 0x7e, 0x4c, 0x82, 0x91, 0xa6, 0x16, 0x91, + 0x0c, 0xe3, 0xf9, 0xf5, 0xb5, 0x2b, 0xcb, 0xca, 0xfc, 0x73, 0xf9, 0xb5, 0xf9, 0xe5, 0x25, 0xf1, + 0x44, 0x9c, 0xef, 0xde, 0x17, 0x9a, 0x80, 0xa3, 0x2d, 0x70, 0x66, 0x8b, 0x0b, 0xc5, 0xb9, 0xfc, + 0x5a, 0x31, 0x2d, 0xa1, 0xbb, 0xe0, 0x78, 0x4b, 0x26, 0x2e, 0x4a, 0xac, 0x0d, 0x8a, 0x52, 0x74, + 0x51, 0xe2, 0x6f, 0xc6, 0xbc, 0xfb, 0x54, 0xb2, 0xf9, 0xa9, 0xb7, 0x2a, 0xd6, 0xb1, 0xad, 0xd9, + 0x6f, 0x64, 0xe6, 0x45, 0x7c, 0x49, 0xff, 0xdf, 0x3d, 0x30, 0x30, 0xc7, 0x5a, 0x59, 0x75, 0x54, + 0xe7, 0xf6, 0xe4, 0x15, 0x90, 0xcd, 0x5f, 0x30, 0x66, 0x0f, 0xab, 0x7b, 0x4f, 0x85, 0x0f, 0x74, + 0xf5, 0x9e, 0x11, 0xbb, 0x21, 0xc2, 0xdf, 0x0c, 0x0a, 0xf3, 0x93, 0xd9, 0x63, 0xc8, 0xf4, 0x00, + 0x16, 0x7b, 0x12, 0xfd, 0x17, 0x25, 0x38, 0x48, 0xb1, 0xbc, 0x45, 0x92, 0x62, 0x8a, 0x07, 0x2b, + 0xa2, 0x5c, 0xf9, 0x82, 0xea, 0x4b, 0x01, 0xb3, 0xb7, 0xcc, 0xef, 0xe1, 0xb7, 0xb8, 0x8f, 0xf9, + 0x64, 0x08, 0x73, 0x97, 0x95, 0xd1, 0x5a, 0x13, 0xa5, 0x1d, 0x4a, 0x28, 0x26, 0xde, 0x70, 0x42, + 0xf1, 0x69, 0xe8, 0xf7, 0x05, 0x72, 0x99, 0x9e, 0xce, 0x1e, 0x5e, 0x09, 0xa7, 0xf4, 0xfd, 0x3c, + 0xd0, 0x7b, 0x24, 0x38, 0xd8, 0x32, 0xf0, 0xcd, 0xf4, 0xee, 0xfb, 0xcb, 0x41, 0x48, 0x63, 0x2d, + 0xd9, 0xcb, 0xca, 0x58, 0xa3, 0xd5, 0xb6, 0xe2, 0x19, 0x18, 0x0c, 0x44, 0xab, 0x99, 0x3e, 0x2a, + 0xc6, 0x3e, 0xae, 0x17, 0x07, 0xf9, 0xa0, 0x2c, 0x24, 0xf1, 0x8e, 0x69, 0x58, 0x0e, 0xae, 0xd0, + 0x03, 0x5c, 0x49, 0xc5, 0x2d, 0xcb, 0x4b, 0x80, 0x9a, 0x07, 0x3e, 0xfc, 0xb0, 0xbf, 0xe7, 0xcb, + 0xd0, 0x18, 0xf4, 0xf8, 0x9f, 0xbe, 0x67, 0x05, 0x2f, 0x6b, 0xfa, 0x26, 0x78, 0x8a, 0xff, 0x1b, + 0x00, 0x00, 0xff, 0xff, 0xfa, 0xaa, 0xcc, 0x3a, 0xa6, 0x9f, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r) @@ -2143,6 +2242,42 @@ func (this *Pool) Equal(that interface{}) bool { } return true } +func (this *TokenizeShareRecord) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*TokenizeShareRecord) + if !ok { + that2, ok := that.(TokenizeShareRecord) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Id != that1.Id { + return false + } + if this.Owner != that1.Owner { + return false + } + if this.ShareTokenDenom != that1.ShareTokenDenom { + return false + } + if this.ModuleAccount != that1.ModuleAccount { + return false + } + if this.Validator != that1.Validator { + return false + } + return true +} func (m *HistoricalInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -3146,6 +3281,62 @@ func (m *Pool) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *TokenizeShareRecord) 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 *TokenizeShareRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TokenizeShareRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Validator) > 0 { + i -= len(m.Validator) + copy(dAtA[i:], m.Validator) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Validator))) + i-- + dAtA[i] = 0x2a + } + if len(m.ModuleAccount) > 0 { + i -= len(m.ModuleAccount) + copy(dAtA[i:], m.ModuleAccount) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ModuleAccount))) + i-- + dAtA[i] = 0x22 + } + if len(m.ShareTokenDenom) > 0 { + i -= len(m.ShareTokenDenom) + copy(dAtA[i:], m.ShareTokenDenom) + i = encodeVarintStaking(dAtA, i, uint64(len(m.ShareTokenDenom))) + i-- + dAtA[i] = 0x1a + } + if len(m.Owner) > 0 { + i -= len(m.Owner) + copy(dAtA[i:], m.Owner) + i = encodeVarintStaking(dAtA, i, uint64(len(m.Owner))) + i-- + dAtA[i] = 0x12 + } + if m.Id != 0 { + i = encodeVarintStaking(dAtA, i, uint64(m.Id)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintStaking(dAtA []byte, offset int, v uint64) int { offset -= sovStaking(v) base := offset @@ -3537,6 +3728,34 @@ func (m *Pool) Size() (n int) { return n } +func (m *TokenizeShareRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != 0 { + n += 1 + sovStaking(uint64(m.Id)) + } + l = len(m.Owner) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ShareTokenDenom) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.ModuleAccount) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + l = len(m.Validator) + if l > 0 { + n += 1 + l + sovStaking(uint64(l)) + } + return n +} + func sovStaking(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -6559,6 +6778,206 @@ func (m *Pool) Unmarshal(dAtA []byte) error { } return nil } +func (m *TokenizeShareRecord) 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: TokenizeShareRecord: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TokenizeShareRecord: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Owner", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Owner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ShareTokenDenom", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ShareTokenDenom = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ModuleAccount", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ModuleAccount = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Validator", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStaking + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthStaking + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthStaking + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Validator = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipStaking(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthStaking + } + if (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/tokenize_share_record.go b/x/staking/types/tokenize_share_record.go new file mode 100644 index 00000000..9d0e16be --- /dev/null +++ b/x/staking/types/tokenize_share_record.go @@ -0,0 +1,10 @@ +package types + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" +) + +func (r TokenizeShareRecord) GetModuleAddress() sdk.AccAddress { + return authtypes.NewModuleAddress(r.ModuleAccount) +} diff --git a/x/staking/types/tx.pb.go b/x/staking/types/tx.pb.go index 6fe2856b..aa633333 100644 --- a/x/staking/types/tx.pb.go +++ b/x/staking/types/tx.pb.go @@ -13,11 +13,11 @@ import ( grpc1 "github.com/gogo/protobuf/grpc" proto "github.com/gogo/protobuf/proto" github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" + _ "github.com/golang/protobuf/ptypes/timestamp" _ "github.com/regen-network/cosmos-proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - _ "google.golang.org/protobuf/types/known/timestamppb" io "io" math "math" math_bits "math/bits" @@ -450,6 +450,241 @@ func (m *MsgUndelegateResponse) GetCompletionTime() time.Time { return time.Time{} } +type MsgTokenizeShares struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + ValidatorAddress string `protobuf:"bytes,2,opt,name=validator_address,json=validatorAddress,proto3" json:"validator_address,omitempty" yaml:"validator_address"` + Amount types1.Coin `protobuf:"bytes,3,opt,name=amount,proto3" json:"amount"` + TokenizedShareOwner string `protobuf:"bytes,4,opt,name=tokenized_share_owner,json=tokenizedShareOwner,proto3" json:"tokenized_share_owner,omitempty" yaml:"tokenized_share_owner"` +} + +func (m *MsgTokenizeShares) Reset() { *m = MsgTokenizeShares{} } +func (m *MsgTokenizeShares) String() string { return proto.CompactTextString(m) } +func (*MsgTokenizeShares) ProtoMessage() {} +func (*MsgTokenizeShares) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{10} +} +func (m *MsgTokenizeShares) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTokenizeShares) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTokenizeShares.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 *MsgTokenizeShares) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTokenizeShares.Merge(m, src) +} +func (m *MsgTokenizeShares) XXX_Size() int { + return m.Size() +} +func (m *MsgTokenizeShares) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTokenizeShares.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTokenizeShares proto.InternalMessageInfo + +type MsgTokenizeSharesResponse struct { + Amount types1.Coin `protobuf:"bytes,1,opt,name=amount,proto3" json:"amount"` +} + +func (m *MsgTokenizeSharesResponse) Reset() { *m = MsgTokenizeSharesResponse{} } +func (m *MsgTokenizeSharesResponse) String() string { return proto.CompactTextString(m) } +func (*MsgTokenizeSharesResponse) ProtoMessage() {} +func (*MsgTokenizeSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{11} +} +func (m *MsgTokenizeSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTokenizeSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTokenizeSharesResponse.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 *MsgTokenizeSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTokenizeSharesResponse.Merge(m, src) +} +func (m *MsgTokenizeSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgTokenizeSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTokenizeSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTokenizeSharesResponse proto.InternalMessageInfo + +func (m *MsgTokenizeSharesResponse) GetAmount() types1.Coin { + if m != nil { + return m.Amount + } + return types1.Coin{} +} + +type MsgRedeemTokensforShares struct { + DelegatorAddress string `protobuf:"bytes,1,opt,name=delegator_address,json=delegatorAddress,proto3" json:"delegator_address,omitempty" yaml:"delegator_address"` + Amount types1.Coin `protobuf:"bytes,2,opt,name=amount,proto3" json:"amount"` +} + +func (m *MsgRedeemTokensforShares) Reset() { *m = MsgRedeemTokensforShares{} } +func (m *MsgRedeemTokensforShares) String() string { return proto.CompactTextString(m) } +func (*MsgRedeemTokensforShares) ProtoMessage() {} +func (*MsgRedeemTokensforShares) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{12} +} +func (m *MsgRedeemTokensforShares) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRedeemTokensforShares) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRedeemTokensforShares.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 *MsgRedeemTokensforShares) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRedeemTokensforShares.Merge(m, src) +} +func (m *MsgRedeemTokensforShares) XXX_Size() int { + return m.Size() +} +func (m *MsgRedeemTokensforShares) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRedeemTokensforShares.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRedeemTokensforShares proto.InternalMessageInfo + +type MsgRedeemTokensforSharesResponse struct { +} + +func (m *MsgRedeemTokensforSharesResponse) Reset() { *m = MsgRedeemTokensforSharesResponse{} } +func (m *MsgRedeemTokensforSharesResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRedeemTokensforSharesResponse) ProtoMessage() {} +func (*MsgRedeemTokensforSharesResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{13} +} +func (m *MsgRedeemTokensforSharesResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRedeemTokensforSharesResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRedeemTokensforSharesResponse.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 *MsgRedeemTokensforSharesResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRedeemTokensforSharesResponse.Merge(m, src) +} +func (m *MsgRedeemTokensforSharesResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRedeemTokensforSharesResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRedeemTokensforSharesResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRedeemTokensforSharesResponse proto.InternalMessageInfo + +type MsgTransferTokenizeShareRecord struct { + TokenizeShareRecordId uint64 `protobuf:"varint,1,opt,name=tokenize_share_record_id,json=tokenizeShareRecordId,proto3" json:"tokenize_share_record_id,omitempty"` + Sender string `protobuf:"bytes,2,opt,name=sender,proto3" json:"sender,omitempty"` + NewOwner string `protobuf:"bytes,3,opt,name=new_owner,json=newOwner,proto3" json:"new_owner,omitempty"` +} + +func (m *MsgTransferTokenizeShareRecord) Reset() { *m = MsgTransferTokenizeShareRecord{} } +func (m *MsgTransferTokenizeShareRecord) String() string { return proto.CompactTextString(m) } +func (*MsgTransferTokenizeShareRecord) ProtoMessage() {} +func (*MsgTransferTokenizeShareRecord) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{14} +} +func (m *MsgTransferTokenizeShareRecord) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTransferTokenizeShareRecord) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTransferTokenizeShareRecord.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 *MsgTransferTokenizeShareRecord) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTransferTokenizeShareRecord.Merge(m, src) +} +func (m *MsgTransferTokenizeShareRecord) XXX_Size() int { + return m.Size() +} +func (m *MsgTransferTokenizeShareRecord) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTransferTokenizeShareRecord.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTransferTokenizeShareRecord proto.InternalMessageInfo + +type MsgTransferTokenizeShareRecordResponse struct { +} + +func (m *MsgTransferTokenizeShareRecordResponse) Reset() { + *m = MsgTransferTokenizeShareRecordResponse{} +} +func (m *MsgTransferTokenizeShareRecordResponse) String() string { return proto.CompactTextString(m) } +func (*MsgTransferTokenizeShareRecordResponse) ProtoMessage() {} +func (*MsgTransferTokenizeShareRecordResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dc1f14f20335eae7, []int{15} +} +func (m *MsgTransferTokenizeShareRecordResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTransferTokenizeShareRecordResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTransferTokenizeShareRecordResponse.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 *MsgTransferTokenizeShareRecordResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTransferTokenizeShareRecordResponse.Merge(m, src) +} +func (m *MsgTransferTokenizeShareRecordResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgTransferTokenizeShareRecordResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTransferTokenizeShareRecordResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTransferTokenizeShareRecordResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgCreateValidator)(nil), "liquidstaking.staking.v1beta1.MsgCreateValidator") proto.RegisterType((*MsgCreateValidatorResponse)(nil), "liquidstaking.staking.v1beta1.MsgCreateValidatorResponse") @@ -461,68 +696,89 @@ func init() { proto.RegisterType((*MsgBeginRedelegateResponse)(nil), "liquidstaking.staking.v1beta1.MsgBeginRedelegateResponse") proto.RegisterType((*MsgUndelegate)(nil), "liquidstaking.staking.v1beta1.MsgUndelegate") proto.RegisterType((*MsgUndelegateResponse)(nil), "liquidstaking.staking.v1beta1.MsgUndelegateResponse") + proto.RegisterType((*MsgTokenizeShares)(nil), "liquidstaking.staking.v1beta1.MsgTokenizeShares") + proto.RegisterType((*MsgTokenizeSharesResponse)(nil), "liquidstaking.staking.v1beta1.MsgTokenizeSharesResponse") + proto.RegisterType((*MsgRedeemTokensforShares)(nil), "liquidstaking.staking.v1beta1.MsgRedeemTokensforShares") + proto.RegisterType((*MsgRedeemTokensforSharesResponse)(nil), "liquidstaking.staking.v1beta1.MsgRedeemTokensforSharesResponse") + proto.RegisterType((*MsgTransferTokenizeShareRecord)(nil), "liquidstaking.staking.v1beta1.MsgTransferTokenizeShareRecord") + proto.RegisterType((*MsgTransferTokenizeShareRecordResponse)(nil), "liquidstaking.staking.v1beta1.MsgTransferTokenizeShareRecordResponse") } func init() { proto.RegisterFile("staking/v1beta1/tx.proto", fileDescriptor_dc1f14f20335eae7) } var fileDescriptor_dc1f14f20335eae7 = []byte{ - // 885 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x56, 0x41, 0x6b, 0xe3, 0x46, - 0x14, 0xb6, 0x6c, 0xaf, 0x9b, 0x4e, 0xd8, 0x4d, 0x56, 0x49, 0x8a, 0x22, 0xb2, 0x56, 0xd0, 0xa1, - 0x2c, 0x4b, 0x2d, 0x91, 0xb4, 0x65, 0xe9, 0x5e, 0x96, 0xf5, 0xba, 0xa5, 0xa1, 0x35, 0x14, 0x25, - 0x2d, 0xb4, 0x17, 0x23, 0x4b, 0x63, 0x75, 0x6a, 0x49, 0xa3, 0x68, 0x46, 0x21, 0x82, 0x42, 0xae, - 0x3d, 0xe6, 0xdc, 0x53, 0x7e, 0x44, 0x7f, 0x44, 0xe8, 0xa1, 0xe4, 0x58, 0x5a, 0x70, 0x43, 0x02, - 0x25, 0x67, 0xff, 0x82, 0x22, 0x69, 0x24, 0xcb, 0xb2, 0x13, 0x3b, 0xa1, 0xbe, 0xec, 0xc9, 0xd6, - 0xcc, 0xf7, 0xbe, 0xa7, 0xf9, 0xe6, 0x7b, 0xef, 0x09, 0x08, 0x84, 0xea, 0x7d, 0xe4, 0x5a, 0xea, - 0xd1, 0x4e, 0x17, 0x52, 0x7d, 0x47, 0xa5, 0xc7, 0x8a, 0xe7, 0x63, 0x8a, 0xf9, 0x67, 0x36, 0x3a, - 0x0c, 0x90, 0xc9, 0xf6, 0x95, 0xf4, 0x97, 0xe1, 0xc4, 0x4d, 0x0b, 0x63, 0xcb, 0x86, 0x6a, 0x0c, - 0xee, 0x06, 0x3d, 0x55, 0x77, 0xc3, 0x24, 0x52, 0x94, 0x8a, 0x5b, 0x14, 0x39, 0x90, 0x50, 0xdd, - 0xf1, 0x18, 0x60, 0xdd, 0xc2, 0x16, 0x8e, 0xff, 0xaa, 0xd1, 0x3f, 0xb6, 0xba, 0x69, 0x60, 0xe2, - 0x60, 0xd2, 0x49, 0x36, 0x92, 0x07, 0xb6, 0x55, 0x4f, 0x9e, 0xd4, 0xae, 0x4e, 0x60, 0xf6, 0xa6, - 0x06, 0x46, 0x2e, 0xdb, 0x7f, 0x56, 0x3c, 0x45, 0xfa, 0xb6, 0xf1, 0xb6, 0xfc, 0x77, 0x15, 0xf0, - 0x6d, 0x62, 0xbd, 0xf5, 0xa1, 0x4e, 0xe1, 0x77, 0xba, 0x8d, 0x4c, 0x9d, 0x62, 0x9f, 0xd7, 0xc0, - 0xb2, 0x09, 0x89, 0xe1, 0x23, 0x8f, 0x22, 0xec, 0x0a, 0xdc, 0x36, 0xf7, 0x7c, 0x79, 0xf7, 0x85, - 0x72, 0xe7, 0xb9, 0x95, 0xd6, 0x28, 0xa2, 0x59, 0x3d, 0x1f, 0x48, 0x25, 0x2d, 0x4f, 0xc2, 0x1f, - 0x00, 0x60, 0x60, 0xc7, 0x41, 0x84, 0x44, 0x94, 0xe5, 0x98, 0x52, 0x99, 0x41, 0xf9, 0x36, 0x0b, - 0xd0, 0x74, 0x0a, 0x09, 0xa3, 0xcd, 0xf1, 0xf0, 0x3f, 0x83, 0x35, 0x07, 0xb9, 0x1d, 0x02, 0xed, - 0x5e, 0xc7, 0x84, 0x36, 0xb4, 0xf4, 0xf8, 0x8d, 0x2b, 0xdb, 0xdc, 0xf3, 0xf7, 0x9b, 0x5f, 0x47, - 0xf0, 0xbf, 0x06, 0xd2, 0x87, 0x16, 0xa2, 0x3f, 0x06, 0x5d, 0xc5, 0xc0, 0x0e, 0x53, 0x8f, 0xfd, - 0x34, 0x88, 0xd9, 0x57, 0x69, 0xe8, 0x41, 0xa2, 0xec, 0xb9, 0x74, 0x38, 0x90, 0xc4, 0x50, 0x77, - 0xec, 0x57, 0xf2, 0x14, 0x4a, 0x59, 0x7b, 0xea, 0x20, 0x77, 0x1f, 0xda, 0xbd, 0x56, 0xb6, 0xc6, - 0xef, 0x81, 0xa7, 0x0c, 0x81, 0xfd, 0x8e, 0x6e, 0x9a, 0x3e, 0x24, 0x44, 0xa8, 0xc6, 0xb9, 0xb7, - 0x86, 0x03, 0x49, 0x48, 0xd8, 0x26, 0x20, 0xb2, 0xb6, 0x9a, 0xad, 0xbd, 0x49, 0x96, 0x22, 0xaa, - 0xa3, 0x54, 0xff, 0x8c, 0xea, 0x51, 0x91, 0x6a, 0x02, 0x22, 0x6b, 0xab, 0xd9, 0x5a, 0x4a, 0xf5, - 0x05, 0xa8, 0x79, 0x41, 0xb7, 0x0f, 0x43, 0xa1, 0x16, 0xab, 0xbc, 0xae, 0x24, 0xb6, 0x53, 0x52, - 0xdb, 0x29, 0x6f, 0xdc, 0xb0, 0x29, 0xfc, 0xfe, 0x5b, 0x63, 0x9d, 0x79, 0xc9, 0xf0, 0x43, 0x8f, - 0x62, 0xe5, 0x9b, 0xa0, 0xfb, 0x15, 0x0c, 0x35, 0x16, 0xcd, 0x7f, 0x0a, 0x1e, 0x1d, 0xe9, 0x76, - 0x00, 0x85, 0xf7, 0x62, 0x9a, 0x4d, 0x85, 0xa1, 0x23, 0xaf, 0xe5, 0xae, 0x08, 0xa5, 0xd7, 0x9d, - 0xa0, 0x5f, 0x2d, 0xfd, 0x72, 0x26, 0x95, 0x6e, 0xce, 0xa4, 0x92, 0xbc, 0x05, 0xc4, 0x49, 0x73, - 0x69, 0x90, 0x78, 0xd8, 0x25, 0x50, 0xfe, 0xb5, 0x02, 0x56, 0xdb, 0xc4, 0xfa, 0xdc, 0x44, 0x74, - 0xb1, 0xce, 0x7b, 0x3d, 0x4d, 0xda, 0x72, 0x2c, 0x2d, 0x3f, 0x1c, 0x48, 0x4f, 0x12, 0x69, 0xef, - 0x10, 0xd4, 0x01, 0x2b, 0x23, 0xcb, 0x75, 0x7c, 0x9d, 0x42, 0x66, 0xb0, 0xd6, 0x9c, 0xe6, 0x6a, - 0x41, 0x63, 0x38, 0x90, 0x3e, 0x48, 0x12, 0x15, 0xa8, 0x64, 0xed, 0x89, 0x31, 0x66, 0x73, 0xfe, - 0x78, 0xba, 0xa7, 0x13, 0x5f, 0x7d, 0xb9, 0x40, 0x3f, 0xe7, 0xae, 0x4e, 0x04, 0x42, 0xf1, 0x6e, - 0xb2, 0x8b, 0xfb, 0x97, 0x03, 0xcb, 0x6d, 0x62, 0xb1, 0x38, 0x38, 0xbd, 0x0a, 0xb8, 0xff, 0xaf, - 0x0a, 0xca, 0x0f, 0xaa, 0x82, 0x97, 0xa0, 0xa6, 0x3b, 0x38, 0x70, 0x69, 0x7c, 0x57, 0x73, 0xd8, - 0x97, 0xc1, 0x73, 0x22, 0x6c, 0x80, 0xb5, 0xdc, 0x39, 0xb3, 0xf3, 0xff, 0x51, 0x8e, 0x9b, 0x66, - 0x13, 0x5a, 0xc8, 0xd5, 0xa0, 0xb9, 0x00, 0x19, 0x0e, 0xc0, 0xc6, 0xe8, 0x8c, 0xc4, 0x37, 0x0a, - 0x52, 0x6c, 0x0f, 0x07, 0xd2, 0x56, 0x51, 0x8a, 0x1c, 0x4c, 0xd6, 0xd6, 0xb2, 0xf5, 0x7d, 0xdf, - 0x98, 0xca, 0x6a, 0x12, 0x9a, 0xb1, 0x56, 0x6e, 0x67, 0xcd, 0xc1, 0xf2, 0xac, 0x2d, 0x42, 0x27, - 0x75, 0xae, 0x3e, 0x54, 0xe7, 0x7e, 0xdc, 0x27, 0x0a, 0x7a, 0xa6, 0x72, 0xf3, 0xed, 0xb8, 0xfa, - 0x3c, 0x1b, 0x46, 0x16, 0xed, 0x44, 0x13, 0x93, 0xb5, 0x05, 0x71, 0xa2, 0xaf, 0x1d, 0xa4, 0xe3, - 0xb4, 0xb9, 0x14, 0xa5, 0x3a, 0xfd, 0x47, 0xe2, 0xe2, 0xea, 0x62, 0xc1, 0xd1, 0xb6, 0x7c, 0xc3, - 0x81, 0xc7, 0x6d, 0x62, 0x7d, 0xeb, 0x9a, 0xef, 0xbc, 0x7f, 0x7b, 0x60, 0x63, 0xec, 0xa4, 0x0b, - 0x92, 0x74, 0xf7, 0xb2, 0x0a, 0x2a, 0x6d, 0x62, 0xf1, 0x27, 0x60, 0xa5, 0xf8, 0x25, 0xb1, 0x33, - 0xa3, 0x75, 0x4f, 0xce, 0x07, 0xf1, 0xb3, 0x7b, 0x87, 0x64, 0xe7, 0x0a, 0xc1, 0xe3, 0xf1, 0x71, - 0xa2, 0xce, 0xe6, 0x1a, 0x0b, 0x10, 0x5f, 0xde, 0x33, 0x20, 0x4b, 0xfd, 0x13, 0x58, 0xca, 0x1a, - 0xe2, 0x8b, 0xd9, 0x24, 0x29, 0x56, 0xdc, 0x9d, 0x1f, 0x9b, 0xe5, 0x3a, 0x01, 0x2b, 0xc5, 0xe6, - 0x33, 0x87, 0xce, 0x85, 0x90, 0x79, 0x74, 0xbe, 0xad, 0x24, 0x3d, 0x00, 0x72, 0xf5, 0xf3, 0xd1, - 0x6c, 0xa2, 0x11, 0x5a, 0xfc, 0xe4, 0x3e, 0xe8, 0x34, 0x63, 0xf3, 0xfb, 0xf3, 0xab, 0x3a, 0x77, - 0x71, 0x55, 0xe7, 0x2e, 0xaf, 0xea, 0xdc, 0xe9, 0x75, 0xbd, 0x74, 0x71, 0x5d, 0x2f, 0xfd, 0x79, - 0x5d, 0x2f, 0xfd, 0xf0, 0x3a, 0x37, 0x0c, 0xd1, 0xa1, 0x1d, 0x44, 0x63, 0x14, 0xb9, 0x86, 0x9a, - 0x64, 0x41, 0x34, 0x6c, 0xb0, 0x0c, 0x0d, 0x07, 0x9b, 0x81, 0x0d, 0xd5, 0xe3, 0xf4, 0x1b, 0x38, - 0x99, 0x94, 0xdd, 0x5a, 0xec, 0xf5, 0x8f, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x55, 0x68, 0x07, - 0x5e, 0xf1, 0x0b, 0x00, 0x00, + // 1122 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x57, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0x3a, 0x69, 0x48, 0x27, 0x34, 0x7f, 0x36, 0x49, 0xe5, 0x6c, 0x53, 0x6f, 0xb4, 0x87, + 0x2a, 0xaa, 0xc8, 0x2e, 0x09, 0xa0, 0x40, 0x25, 0x14, 0xd5, 0x4d, 0x11, 0x11, 0x58, 0xa0, 0x4d, + 0x40, 0x82, 0x8b, 0xb5, 0xde, 0x1d, 0x6f, 0x07, 0xef, 0xee, 0xb8, 0x3b, 0xe3, 0x24, 0x46, 0x95, + 0x7a, 0xed, 0x8d, 0x1e, 0x11, 0xa7, 0x4a, 0x5c, 0xf8, 0x00, 0x7c, 0x02, 0x4e, 0x15, 0x07, 0xd4, + 0x23, 0x02, 0xc9, 0xa0, 0x44, 0x42, 0x3d, 0xfb, 0x13, 0xa0, 0x9d, 0x9d, 0x1d, 0xaf, 0xd7, 0x4e, + 0x6c, 0xa7, 0xcd, 0xa5, 0x27, 0xdb, 0x33, 0xef, 0xfd, 0xe6, 0xbd, 0xdf, 0xfb, 0xbd, 0x37, 0x63, + 0x50, 0x20, 0xd4, 0xaa, 0xa3, 0xc0, 0x35, 0x0e, 0x37, 0xab, 0x90, 0x5a, 0x9b, 0x06, 0x3d, 0xd6, + 0x1b, 0x21, 0xa6, 0x58, 0xbe, 0xe9, 0xa1, 0x87, 0x4d, 0xe4, 0xf0, 0x7d, 0x3d, 0xf9, 0xe4, 0x76, + 0xca, 0x8a, 0x8b, 0xb1, 0xeb, 0x41, 0x83, 0x19, 0x57, 0x9b, 0x35, 0xc3, 0x0a, 0x5a, 0xb1, 0xa7, + 0xa2, 0x66, 0xb7, 0x28, 0xf2, 0x21, 0xa1, 0x96, 0xdf, 0xe0, 0x06, 0x4b, 0x2e, 0x76, 0x31, 0xfb, + 0x6a, 0x44, 0xdf, 0xf8, 0xea, 0x8a, 0x8d, 0x89, 0x8f, 0x49, 0x25, 0xde, 0x88, 0x7f, 0xf0, 0xad, + 0x62, 0xfc, 0xcb, 0xa8, 0x5a, 0x04, 0x8a, 0x48, 0x6d, 0x8c, 0x02, 0xbe, 0x7f, 0x33, 0x9b, 0x45, + 0x12, 0x2d, 0xdb, 0xd6, 0xfe, 0x9e, 0x04, 0x72, 0x99, 0xb8, 0xf7, 0x42, 0x68, 0x51, 0xf8, 0xb5, + 0xe5, 0x21, 0xc7, 0xa2, 0x38, 0x94, 0x4d, 0x30, 0xe3, 0x40, 0x62, 0x87, 0xa8, 0x41, 0x11, 0x0e, + 0x0a, 0xd2, 0x9a, 0xb4, 0x3e, 0xb3, 0x75, 0x5b, 0x3f, 0x37, 0x6f, 0x7d, 0xb7, 0xeb, 0x51, 0x9a, + 0x7c, 0xde, 0x56, 0x73, 0x66, 0x1a, 0x44, 0x3e, 0x00, 0xc0, 0xc6, 0xbe, 0x8f, 0x08, 0x89, 0x20, + 0xf3, 0x0c, 0x52, 0x1f, 0x02, 0x79, 0x4f, 0x38, 0x98, 0x16, 0x85, 0x84, 0xc3, 0xa6, 0x70, 0xe4, + 0x47, 0x60, 0xd1, 0x47, 0x41, 0x85, 0x40, 0xaf, 0x56, 0x71, 0xa0, 0x07, 0x5d, 0x8b, 0x45, 0x3c, + 0xb1, 0x26, 0xad, 0x5f, 0x2d, 0x7d, 0x1e, 0x99, 0xff, 0xd5, 0x56, 0x6f, 0xb9, 0x88, 0x3e, 0x68, + 0x56, 0x75, 0x1b, 0xfb, 0x9c, 0x3d, 0xfe, 0xb1, 0x41, 0x9c, 0xba, 0x41, 0x5b, 0x0d, 0x48, 0xf4, + 0xbd, 0x80, 0x76, 0xda, 0xaa, 0xd2, 0xb2, 0x7c, 0xef, 0x8e, 0x36, 0x00, 0x52, 0x33, 0x17, 0x7c, + 0x14, 0xec, 0x43, 0xaf, 0xb6, 0x2b, 0xd6, 0xe4, 0x3d, 0xb0, 0xc0, 0x2d, 0x70, 0x58, 0xb1, 0x1c, + 0x27, 0x84, 0x84, 0x14, 0x26, 0xd9, 0xd9, 0xab, 0x9d, 0xb6, 0x5a, 0x88, 0xd1, 0xfa, 0x4c, 0x34, + 0x73, 0x5e, 0xac, 0xdd, 0x8d, 0x97, 0x22, 0xa8, 0xc3, 0x84, 0x7f, 0x01, 0x75, 0x25, 0x0b, 0xd5, + 0x67, 0xa2, 0x99, 0xf3, 0x62, 0x2d, 0x81, 0xfa, 0x04, 0x4c, 0x35, 0x9a, 0xd5, 0x3a, 0x6c, 0x15, + 0xa6, 0x18, 0xcb, 0x4b, 0x7a, 0x2c, 0x3b, 0x3d, 0x91, 0x9d, 0x7e, 0x37, 0x68, 0x95, 0x0a, 0xbf, + 0xff, 0xba, 0xb1, 0xc4, 0xb5, 0x64, 0x87, 0xad, 0x06, 0xc5, 0xfa, 0x97, 0xcd, 0xea, 0x67, 0xb0, + 0x65, 0x72, 0x6f, 0xf9, 0x03, 0x70, 0xe5, 0xd0, 0xf2, 0x9a, 0xb0, 0xf0, 0x16, 0x83, 0x59, 0xd1, + 0xb9, 0x75, 0xa4, 0xb5, 0x54, 0x89, 0x50, 0x52, 0xee, 0xd8, 0xfa, 0xce, 0xf4, 0x93, 0x67, 0x6a, + 0xee, 0xe5, 0x33, 0x35, 0xa7, 0xad, 0x02, 0xa5, 0x5f, 0x5c, 0x26, 0x24, 0x0d, 0x1c, 0x10, 0xa8, + 0xfd, 0x34, 0x01, 0xe6, 0xcb, 0xc4, 0xbd, 0xef, 0x20, 0x7a, 0xb9, 0xca, 0xdb, 0x19, 0x44, 0x6d, + 0x9e, 0x51, 0x2b, 0x77, 0xda, 0xea, 0x6c, 0x4c, 0xed, 0x39, 0x84, 0xfa, 0x60, 0xae, 0x2b, 0xb9, + 0x4a, 0x68, 0x51, 0xc8, 0x05, 0xb6, 0x3b, 0xa2, 0xb8, 0x76, 0xa1, 0xdd, 0x69, 0xab, 0xd7, 0xe3, + 0x83, 0x32, 0x50, 0x9a, 0x39, 0x6b, 0xf7, 0xc8, 0x5c, 0x3e, 0x1e, 0xac, 0xe9, 0x58, 0x57, 0x9f, + 0x5e, 0xa2, 0x9e, 0x53, 0xa5, 0x53, 0x40, 0x21, 0x5b, 0x1b, 0x51, 0xb8, 0xff, 0x24, 0x30, 0x53, + 0x26, 0x2e, 0xf7, 0x83, 0x83, 0xbb, 0x40, 0x7a, 0x7d, 0x5d, 0x90, 0xbf, 0x50, 0x17, 0x6c, 0x83, + 0x29, 0xcb, 0xc7, 0xcd, 0x80, 0xb2, 0x5a, 0x8d, 0x20, 0x5f, 0x6e, 0x9e, 0x22, 0x61, 0x19, 0x2c, + 0xa6, 0xf2, 0x14, 0xf9, 0xff, 0x91, 0x67, 0x43, 0xb3, 0x04, 0x5d, 0x14, 0x98, 0xd0, 0xb9, 0x04, + 0x1a, 0x0e, 0xc0, 0x72, 0x37, 0x47, 0x12, 0xda, 0x19, 0x2a, 0xd6, 0x3a, 0x6d, 0x75, 0x35, 0x4b, + 0x45, 0xca, 0x4c, 0x33, 0x17, 0xc5, 0xfa, 0x7e, 0x68, 0x0f, 0x44, 0x75, 0x08, 0x15, 0xa8, 0x13, + 0x67, 0xa3, 0xa6, 0xcc, 0xd2, 0xa8, 0xbb, 0x84, 0xf6, 0xf3, 0x3c, 0x79, 0x51, 0x9e, 0xeb, 0x6c, + 0x4e, 0x64, 0xf8, 0x4c, 0xe8, 0x96, 0xcb, 0xac, 0xfb, 0x1a, 0x1e, 0x8c, 0x24, 0x5a, 0x89, 0x6e, + 0x4c, 0x3e, 0x16, 0x94, 0xbe, 0xb9, 0x76, 0x90, 0x5c, 0xa7, 0xa5, 0xe9, 0xe8, 0xa8, 0xa7, 0xff, + 0xa8, 0x12, 0xeb, 0x2e, 0xee, 0x1c, 0x6d, 0x6b, 0x2f, 0x25, 0x70, 0xad, 0x4c, 0xdc, 0xaf, 0x02, + 0xe7, 0x8d, 0xd7, 0x6f, 0x0d, 0x2c, 0xf7, 0x64, 0x7a, 0x59, 0x94, 0xfe, 0x96, 0x07, 0x0b, 0x65, + 0xe2, 0x1e, 0xe0, 0x3a, 0x0c, 0xd0, 0xf7, 0x70, 0xff, 0x81, 0x15, 0x42, 0xf2, 0x86, 0xd1, 0x1a, + 0x75, 0x0f, 0xe5, 0x09, 0x3a, 0x15, 0x12, 0xa5, 0x58, 0xc1, 0x47, 0x01, 0x0c, 0xf9, 0x5c, 0x4e, + 0x75, 0xcf, 0x40, 0x33, 0xcd, 0x5c, 0x14, 0xeb, 0x8c, 0xa0, 0x2f, 0xa2, 0xd5, 0x54, 0xb1, 0x0e, + 0xc0, 0x4a, 0x1f, 0x87, 0xa2, 0x60, 0xdd, 0xa8, 0xa5, 0xb1, 0xa2, 0xd6, 0x7e, 0x91, 0xd8, 0x20, + 0x8f, 0xda, 0x0a, 0xfa, 0x0c, 0x9c, 0xd4, 0x70, 0xf8, 0xfa, 0x2b, 0xd4, 0x0d, 0x30, 0x7f, 0x51, + 0xb5, 0x6a, 0x60, 0xed, 0xac, 0x48, 0xc5, 0xe8, 0xfd, 0x51, 0x02, 0xc5, 0x88, 0xa5, 0xd0, 0x0a, + 0x48, 0x0d, 0x86, 0x3d, 0x6c, 0x99, 0xd0, 0xc6, 0xa1, 0x23, 0x6f, 0x83, 0x42, 0x42, 0x34, 0xe7, + 0x3f, 0x64, 0x1b, 0x15, 0xe4, 0xb0, 0xdc, 0x26, 0x4d, 0x51, 0xc7, 0x94, 0xdb, 0x9e, 0x23, 0x5f, + 0x07, 0x53, 0x04, 0x06, 0x0e, 0x0c, 0x63, 0x65, 0x99, 0xfc, 0x97, 0x7c, 0x03, 0x5c, 0x0d, 0xe0, + 0x11, 0x2f, 0x36, 0x1b, 0x95, 0xe6, 0x74, 0x00, 0x8f, 0xb2, 0xf5, 0x5b, 0x07, 0xb7, 0xce, 0x8f, + 0x2c, 0x49, 0x62, 0xeb, 0x87, 0x69, 0x30, 0x51, 0x26, 0xae, 0xfc, 0x18, 0xcc, 0x65, 0x1f, 0xde, + 0x9b, 0x43, 0x5e, 0x3a, 0xfd, 0xcf, 0x29, 0xe5, 0xa3, 0xb1, 0x5d, 0x84, 0xaa, 0x5a, 0xe0, 0x5a, + 0xef, 0xeb, 0xcb, 0x18, 0x8e, 0xd5, 0xe3, 0xa0, 0x6c, 0x8f, 0xe9, 0x20, 0x8e, 0xfe, 0x0e, 0x4c, + 0x8b, 0xf7, 0xc3, 0xed, 0xe1, 0x20, 0x89, 0xad, 0xb2, 0x35, 0xba, 0xad, 0x38, 0xeb, 0x31, 0x98, + 0xcb, 0xde, 0xd5, 0x23, 0xf0, 0x9c, 0x71, 0x19, 0x85, 0xe7, 0xb3, 0x6e, 0xb0, 0x06, 0x00, 0xa9, + 0xeb, 0xe6, 0x9d, 0xe1, 0x40, 0x5d, 0x6b, 0xe5, 0xfd, 0x71, 0xac, 0xc5, 0x89, 0x8f, 0xc0, 0x6c, + 0x66, 0x1a, 0xbf, 0x3b, 0x1c, 0xa7, 0xd7, 0x43, 0xf9, 0x70, 0x5c, 0x0f, 0x71, 0xfa, 0x13, 0x09, + 0xbc, 0x9d, 0xee, 0x63, 0x79, 0x04, 0x99, 0x0c, 0xec, 0x7b, 0x65, 0xe7, 0x82, 0x8e, 0x22, 0x94, + 0x9f, 0x25, 0x70, 0xe3, 0xbc, 0x69, 0xf1, 0xf1, 0x08, 0x49, 0x9e, 0xed, 0xae, 0xdc, 0x7f, 0x25, + 0xf7, 0x24, 0xca, 0xd2, 0x37, 0xcf, 0x4f, 0x8a, 0xd2, 0x8b, 0x93, 0xa2, 0xf4, 0xef, 0x49, 0x51, + 0x7a, 0x7a, 0x5a, 0xcc, 0xbd, 0x38, 0x2d, 0xe6, 0xfe, 0x3c, 0x2d, 0xe6, 0xbe, 0xdd, 0x49, 0x3d, + 0xf5, 0xd1, 0x43, 0xaf, 0x19, 0xfd, 0x49, 0x40, 0x81, 0x6d, 0xc4, 0xc7, 0x22, 0xda, 0xda, 0xe0, + 0x47, 0x6e, 0xf8, 0xd8, 0x69, 0x7a, 0xd0, 0x38, 0x4e, 0xfe, 0xe1, 0xc7, 0xff, 0x03, 0xaa, 0x53, + 0xec, 0x26, 0x7f, 0xef, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc7, 0xd8, 0xe4, 0x99, 0xcf, 0x10, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -550,6 +806,14 @@ type MsgClient interface { // Undelegate defines a method for performing an undelegation from a // delegate and a validator. Undelegate(ctx context.Context, in *MsgUndelegate, opts ...grpc.CallOption) (*MsgUndelegateResponse, error) + // TokenizeShares defines a method for tokenizing shares from a validator. + TokenizeShares(ctx context.Context, in *MsgTokenizeShares, opts ...grpc.CallOption) (*MsgTokenizeSharesResponse, error) + // RedeemTokens defines a method for redeeming tokens from a validator for + // shares. + RedeemTokens(ctx context.Context, in *MsgRedeemTokensforShares, opts ...grpc.CallOption) (*MsgRedeemTokensforSharesResponse, error) + // TransferTokenizeShareRecord defines a method to transfer ownership of + // TokenizeShareRecord + TransferTokenizeShareRecord(ctx context.Context, in *MsgTransferTokenizeShareRecord, opts ...grpc.CallOption) (*MsgTransferTokenizeShareRecordResponse, error) } type msgClient struct { @@ -605,6 +869,33 @@ func (c *msgClient) Undelegate(ctx context.Context, in *MsgUndelegate, opts ...g return out, nil } +func (c *msgClient) TokenizeShares(ctx context.Context, in *MsgTokenizeShares, opts ...grpc.CallOption) (*MsgTokenizeSharesResponse, error) { + out := new(MsgTokenizeSharesResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/TokenizeShares", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RedeemTokens(ctx context.Context, in *MsgRedeemTokensforShares, opts ...grpc.CallOption) (*MsgRedeemTokensforSharesResponse, error) { + out := new(MsgRedeemTokensforSharesResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/RedeemTokens", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) TransferTokenizeShareRecord(ctx context.Context, in *MsgTransferTokenizeShareRecord, opts ...grpc.CallOption) (*MsgTransferTokenizeShareRecordResponse, error) { + out := new(MsgTransferTokenizeShareRecordResponse) + err := c.cc.Invoke(ctx, "/liquidstaking.staking.v1beta1.Msg/TransferTokenizeShareRecord", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // CreateValidator defines a method for creating a new validator. @@ -620,6 +911,14 @@ type MsgServer interface { // Undelegate defines a method for performing an undelegation from a // delegate and a validator. Undelegate(context.Context, *MsgUndelegate) (*MsgUndelegateResponse, error) + // TokenizeShares defines a method for tokenizing shares from a validator. + TokenizeShares(context.Context, *MsgTokenizeShares) (*MsgTokenizeSharesResponse, error) + // RedeemTokens defines a method for redeeming tokens from a validator for + // shares. + RedeemTokens(context.Context, *MsgRedeemTokensforShares) (*MsgRedeemTokensforSharesResponse, error) + // TransferTokenizeShareRecord defines a method to transfer ownership of + // TokenizeShareRecord + TransferTokenizeShareRecord(context.Context, *MsgTransferTokenizeShareRecord) (*MsgTransferTokenizeShareRecordResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -641,6 +940,15 @@ func (*UnimplementedMsgServer) BeginRedelegate(ctx context.Context, req *MsgBegi func (*UnimplementedMsgServer) Undelegate(ctx context.Context, req *MsgUndelegate) (*MsgUndelegateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Undelegate not implemented") } +func (*UnimplementedMsgServer) TokenizeShares(ctx context.Context, req *MsgTokenizeShares) (*MsgTokenizeSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TokenizeShares not implemented") +} +func (*UnimplementedMsgServer) RedeemTokens(ctx context.Context, req *MsgRedeemTokensforShares) (*MsgRedeemTokensforSharesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RedeemTokens not implemented") +} +func (*UnimplementedMsgServer) TransferTokenizeShareRecord(ctx context.Context, req *MsgTransferTokenizeShareRecord) (*MsgTransferTokenizeShareRecordResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TransferTokenizeShareRecord not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -736,6 +1044,60 @@ func _Msg_Undelegate_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Msg_TokenizeShares_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgTokenizeShares) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).TokenizeShares(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.staking.v1beta1.Msg/TokenizeShares", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).TokenizeShares(ctx, req.(*MsgTokenizeShares)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RedeemTokens_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRedeemTokensforShares) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RedeemTokens(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.staking.v1beta1.Msg/RedeemTokens", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RedeemTokens(ctx, req.(*MsgRedeemTokensforShares)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_TransferTokenizeShareRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgTransferTokenizeShareRecord) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).TransferTokenizeShareRecord(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/liquidstaking.staking.v1beta1.Msg/TransferTokenizeShareRecord", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).TransferTokenizeShareRecord(ctx, req.(*MsgTransferTokenizeShareRecord)) + } + return interceptor(ctx, in, info, handler) +} + var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "liquidstaking.staking.v1beta1.Msg", HandlerType: (*MsgServer)(nil), @@ -760,6 +1122,18 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "Undelegate", Handler: _Msg_Undelegate_Handler, }, + { + MethodName: "TokenizeShares", + Handler: _Msg_TokenizeShares_Handler, + }, + { + MethodName: "RedeemTokens", + Handler: _Msg_RedeemTokens_Handler, + }, + { + MethodName: "TransferTokenizeShareRecord", + Handler: _Msg_TransferTokenizeShareRecord_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "staking/v1beta1/tx.proto", @@ -1197,58 +1571,273 @@ func (m *MsgUndelegateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func encodeVarintTx(dAtA []byte, offset int, v uint64) int { - offset -= sovTx(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ +func (m *MsgTokenizeShares) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - dAtA[offset] = uint8(v) - return base + return dAtA[:n], nil } -func (m *MsgCreateValidator) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Description.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.Commission.Size() - n += 1 + l + sovTx(uint64(l)) - l = m.MinSelfDelegation.Size() - n += 1 + l + sovTx(uint64(l)) - l = len(m.DelegatorAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - l = len(m.ValidatorAddress) - if l > 0 { - n += 1 + l + sovTx(uint64(l)) - } - if m.Pubkey != nil { - l = m.Pubkey.Size() - n += 1 + l + sovTx(uint64(l)) - } - l = m.Value.Size() - n += 1 + l + sovTx(uint64(l)) - return n + +func (m *MsgTokenizeShares) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *MsgCreateValidatorResponse) Size() (n int) { - if m == nil { - return 0 - } +func (m *MsgTokenizeShares) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - return n -} - -func (m *MsgEditValidator) Size() (n int) { - if m == nil { - return 0 + if len(m.TokenizedShareOwner) > 0 { + i -= len(m.TokenizedShareOwner) + copy(dAtA[i:], m.TokenizedShareOwner) + i = encodeVarintTx(dAtA, i, uint64(len(m.TokenizedShareOwner))) + i-- + dAtA[i] = 0x22 + } + { + size, err := m.Amount.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + if len(m.ValidatorAddress) > 0 { + i -= len(m.ValidatorAddress) + copy(dAtA[i:], m.ValidatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ValidatorAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgTokenizeSharesResponse) 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 *MsgTokenizeSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgTokenizeSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Amount.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MsgRedeemTokensforShares) 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 *MsgRedeemTokensforShares) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRedeemTokensforShares) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Amount.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.DelegatorAddress) > 0 { + i -= len(m.DelegatorAddress) + copy(dAtA[i:], m.DelegatorAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.DelegatorAddress))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRedeemTokensforSharesResponse) 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 *MsgRedeemTokensforSharesResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRedeemTokensforSharesResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgTransferTokenizeShareRecord) 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 *MsgTransferTokenizeShareRecord) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgTransferTokenizeShareRecord) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.NewOwner) > 0 { + i -= len(m.NewOwner) + copy(dAtA[i:], m.NewOwner) + i = encodeVarintTx(dAtA, i, uint64(len(m.NewOwner))) + i-- + dAtA[i] = 0x1a + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0x12 + } + if m.TokenizeShareRecordId != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.TokenizeShareRecordId)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *MsgTransferTokenizeShareRecordResponse) 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 *MsgTransferTokenizeShareRecordResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgTransferTokenizeShareRecordResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgCreateValidator) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Description.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.Commission.Size() + n += 1 + l + sovTx(uint64(l)) + l = m.MinSelfDelegation.Size() + n += 1 + l + sovTx(uint64(l)) + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if m.Pubkey != nil { + l = m.Pubkey.Size() + n += 1 + l + sovTx(uint64(l)) + } + l = m.Value.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgCreateValidatorResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgEditValidator) Size() (n int) { + if m == nil { + return 0 } var l int _ = l @@ -1370,19 +1959,106 @@ func (m *MsgUndelegateResponse) Size() (n int) { return n } -func sovTx(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 +func (m *MsgTokenizeShares) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ValidatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) + l = len(m.TokenizedShareOwner) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n } -func sozTx(x uint64) (n int) { - return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + +func (m *MsgTokenizeSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) + return n } -func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { + +func (m *MsgRedeemTokensforShares) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.DelegatorAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Amount.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgRedeemTokensforSharesResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgTransferTokenizeShareRecord) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TokenizeShareRecordId != 0 { + n += 1 + sovTx(uint64(m.TokenizeShareRecordId)) + } + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.NewOwner) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgTransferTokenizeShareRecordResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgCreateValidator) 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 ErrIntOverflowTx } @@ -1470,42 +2146,727 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { if err := m.Commission.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Pubkey == nil { + m.Pubkey = &types.Any{} + } + if err := m.Pubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgCreateValidatorResponse) 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 ErrIntOverflowTx + } + 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: MsgCreateValidatorResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgCreateValidatorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditValidator) 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 ErrIntOverflowTx + } + 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: MsgEditValidator: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditValidator: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CommissionRate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Dec + m.CommissionRate = &v + if err := m.CommissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + var v github_com_cosmos_cosmos_sdk_types.Int + m.MinSelfDelegation = &v + if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgEditValidatorResponse) 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 ErrIntOverflowTx + } + 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: MsgEditValidatorResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgEditValidatorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDelegate) 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 ErrIntOverflowTx + } + 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: MsgDelegate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDelegate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgDelegateResponse) 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 ErrIntOverflowTx + } + 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: MsgDelegateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgDelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthTx } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgBeginRedelegate) 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 ErrIntOverflowTx } - iNdEx = postIndex - case 4: + 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: MsgBeginRedelegate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgBeginRedelegate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) } @@ -1537,9 +2898,9 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1567,13 +2928,13 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pubkey", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1583,31 +2944,27 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Pubkey == nil { - m.Pubkey = &types.Any{} - } - if err := m.Pubkey.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -1634,7 +2991,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Value.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1662,7 +3019,7 @@ func (m *MsgCreateValidator) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgCreateValidatorResponse) Unmarshal(dAtA []byte) error { +func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1685,12 +3042,45 @@ func (m *MsgCreateValidatorResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgCreateValidatorResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgBeginRedelegateResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgCreateValidatorResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgBeginRedelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -1715,7 +3105,7 @@ func (m *MsgCreateValidatorResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { +func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1738,48 +3128,15 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgEditValidator: wiretype end group for non-group") + return fmt.Errorf("proto: MsgUndelegate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgEditValidator: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgUndelegate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Description", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Description.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1807,11 +3164,11 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CommissionRate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -1839,17 +3196,13 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - var v github_com_cosmos_cosmos_sdk_types.Dec - m.CommissionRate = &v - if err := m.CommissionRate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MinSelfDelegation", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -1859,25 +3212,22 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - var v github_com_cosmos_cosmos_sdk_types.Int - m.MinSelfDelegation = &v - if err := m.MinSelfDelegation.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -1905,7 +3255,7 @@ func (m *MsgEditValidator) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgEditValidatorResponse) Unmarshal(dAtA []byte) error { +func (m *MsgUndelegateResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1924,16 +3274,49 @@ func (m *MsgEditValidatorResponse) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: MsgEditValidatorResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: MsgEditValidatorResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUndelegateResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUndelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -1958,7 +3341,7 @@ func (m *MsgEditValidatorResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgDelegate) Unmarshal(dAtA []byte) error { +func (m *MsgTokenizeShares) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -1981,10 +3364,10 @@ func (m *MsgDelegate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgDelegate: wiretype end group for non-group") + return fmt.Errorf("proto: MsgTokenizeShares: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDelegate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgTokenizeShares: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2084,6 +3467,38 @@ func (m *MsgDelegate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenizedShareOwner", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TokenizedShareOwner = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -2108,7 +3523,7 @@ func (m *MsgDelegate) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgDelegateResponse) Unmarshal(dAtA []byte) error { +func (m *MsgTokenizeSharesResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2131,12 +3546,45 @@ func (m *MsgDelegateResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgDelegateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgTokenizeSharesResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgDelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgTokenizeSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -2161,7 +3609,7 @@ func (m *MsgDelegateResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgBeginRedelegate) Unmarshal(dAtA []byte) error { +func (m *MsgRedeemTokensforShares) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2184,10 +3632,10 @@ func (m *MsgBeginRedelegate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgBeginRedelegate: wiretype end group for non-group") + return fmt.Errorf("proto: MsgRedeemTokensforShares: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBeginRedelegate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgRedeemTokensforShares: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2223,70 +3671,6 @@ func (m *MsgBeginRedelegate) Unmarshal(dAtA []byte) error { m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorSrcAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorSrcAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorDstAddress", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ValidatorDstAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) } @@ -2343,7 +3727,7 @@ func (m *MsgBeginRedelegate) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { +func (m *MsgRedeemTokensforSharesResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2366,45 +3750,12 @@ func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgBeginRedelegateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgRedeemTokensforSharesResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgBeginRedelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgRedeemTokensforSharesResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:]) @@ -2429,7 +3780,7 @@ func (m *MsgBeginRedelegateResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { +func (m *MsgTransferTokenizeShareRecord) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2452,17 +3803,17 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgUndelegate: wiretype end group for non-group") + return fmt.Errorf("proto: MsgTransferTokenizeShareRecord: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUndelegate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgTransferTokenizeShareRecord: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DelegatorAddress", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TokenizeShareRecordId", wireType) } - var stringLen uint64 + m.TokenizeShareRecordId = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2472,27 +3823,14 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.TokenizeShareRecordId |= uint64(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DelegatorAddress = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ValidatorAddress", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Sender", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2520,13 +3858,13 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ValidatorAddress = string(dAtA[iNdEx:postIndex]) + m.Sender = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Amount", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NewOwner", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTx @@ -2536,24 +3874,23 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTx } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTx } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Amount.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.NewOwner = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -2579,7 +3916,7 @@ func (m *MsgUndelegate) Unmarshal(dAtA []byte) error { } return nil } -func (m *MsgUndelegateResponse) Unmarshal(dAtA []byte) error { +func (m *MsgTransferTokenizeShareRecordResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2602,45 +3939,12 @@ func (m *MsgUndelegateResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: MsgUndelegateResponse: wiretype end group for non-group") + return fmt.Errorf("proto: MsgTransferTokenizeShareRecordResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: MsgUndelegateResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MsgTransferTokenizeShareRecordResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CompletionTime", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTx - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTx - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTx - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.CompletionTime, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTx(dAtA[iNdEx:])