feat: add query `groups` in `x/group` (backport #14879) (#15475)

Co-authored-by: atheeshp <59333759+atheeshp@users.noreply.github.com>
Co-authored-by: Julien Robert <julien@rbrt.fr>
This commit is contained in:
mergify[bot] 2023-03-20 18:19:31 +00:00 committed by GitHub
parent 979adcff80
commit a0497b7f17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 2260 additions and 312 deletions

View File

@ -39,6 +39,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Features
* (x/groups) [#14879](https://github.com/cosmos/cosmos-sdk/pull/14879) Add `Query/Groups` query to get all the groups.
* (x/gov,cli) [#14718](https://github.com/cosmos/cosmos-sdk/pull/14718) Added `AddGovPropFlagsToCmd` and `ReadGovPropFlags` functions.
* (cli) [#14655](https://github.com/cosmos/cosmos-sdk/pull/14655) Add a new command to list supported algos.
* (x/genutil,cli) [#15147](https://github.com/cosmos/cosmos-sdk/pull/15147) Add `--initial-height` flag to cli init cmd to provide `genesis.json` with user-defined initial block height.
@ -46,7 +47,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
### Improvements
* (x/distribution) [#15462](https://github.com/cosmos/cosmos-sdk/pull/15462) Add delegator address to the event for withdrawing delegation rewards.
* [#14609](https://github.com/cosmos/cosmos-sdk/pull/14609) Add RetryForBlocks method to use in tests that require waiting for a transaction to be included in a block.
* [#14609](https://github.com/cosmos/cosmos-sdk/pull/14609) Add `RetryForBlocks` method to use in tests that require waiting for a transaction to be included in a block.
### Deprecated

File diff suppressed because it is too large Load Diff

View File

@ -34,6 +34,7 @@ const (
Query_VotesByVoter_FullMethodName = "/cosmos.group.v1.Query/VotesByVoter"
Query_GroupsByMember_FullMethodName = "/cosmos.group.v1.Query/GroupsByMember"
Query_TallyResult_FullMethodName = "/cosmos.group.v1.Query/TallyResult"
Query_Groups_FullMethodName = "/cosmos.group.v1.Query/Groups"
)
// QueryClient is the client API for Query service.
@ -70,6 +71,10 @@ type QueryClient interface {
// then it simply returns the `final_tally_result` state stored in the
// proposal itself.
TallyResult(ctx context.Context, in *QueryTallyResultRequest, opts ...grpc.CallOption) (*QueryTallyResultResponse, error)
// Groups queries all groups in state.
//
// Since: cosmos-sdk 0.47.1
Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error)
}
type queryClient struct {
@ -197,6 +202,15 @@ func (c *queryClient) TallyResult(ctx context.Context, in *QueryTallyResultReque
return out, nil
}
func (c *queryClient) Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error) {
out := new(QueryGroupsResponse)
err := c.cc.Invoke(ctx, Query_Groups_FullMethodName, in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
// All implementations must embed UnimplementedQueryServer
// for forward compatibility
@ -231,6 +245,10 @@ type QueryServer interface {
// then it simply returns the `final_tally_result` state stored in the
// proposal itself.
TallyResult(context.Context, *QueryTallyResultRequest) (*QueryTallyResultResponse, error)
// Groups queries all groups in state.
//
// Since: cosmos-sdk 0.47.1
Groups(context.Context, *QueryGroupsRequest) (*QueryGroupsResponse, error)
mustEmbedUnimplementedQueryServer()
}
@ -277,6 +295,9 @@ func (UnimplementedQueryServer) GroupsByMember(context.Context, *QueryGroupsByMe
func (UnimplementedQueryServer) TallyResult(context.Context, *QueryTallyResultRequest) (*QueryTallyResultResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method TallyResult not implemented")
}
func (UnimplementedQueryServer) Groups(context.Context, *QueryGroupsRequest) (*QueryGroupsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Groups not implemented")
}
func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {}
// UnsafeQueryServer may be embedded to opt out of forward compatibility for this service.
@ -524,6 +545,24 @@ func _Query_TallyResult_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _Query_Groups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryGroupsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Groups(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Query_Groups_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Groups(ctx, req.(*QueryGroupsRequest))
}
return interceptor(ctx, in, info, handler)
}
// Query_ServiceDesc is the grpc.ServiceDesc for Query service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@ -583,6 +622,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{
MethodName: "TallyResult",
Handler: _Query_TallyResult_Handler,
},
{
MethodName: "Groups",
Handler: _Query_Groups_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "cosmos/group/v1/query.proto",

View File

@ -83,6 +83,13 @@ service Query {
rpc TallyResult(QueryTallyResultRequest) returns (QueryTallyResultResponse) {
option (google.api.http).get = "/cosmos/group/v1/proposals/{proposal_id}/tally";
};
// Groups queries all groups in state.
//
// Since: cosmos-sdk 0.47.1
rpc Groups(QueryGroupsRequest) returns (QueryGroupsResponse) {
option (google.api.http).get = "/cosmos/group/v1/groups";
};
}
// QueryGroupInfoRequest is the Query/GroupInfo request type.
@ -291,3 +298,23 @@ message QueryTallyResultResponse {
// tally defines the requested tally.
TallyResult tally = 1 [(gogoproto.nullable) = false, (amino.dont_omitempty) = true];
}
// QueryGroupsRequest is the Query/Groups request type.
//
// Since: cosmos-sdk 0.47.1
message QueryGroupsRequest {
// pagination defines an optional pagination for the request.
cosmos.base.query.v1beta1.PageRequest pagination = 2;
}
// QueryGroupsResponse is the Query/Groups response type.
//
// Since: cosmos-sdk 0.47.1
message QueryGroupsResponse {
// `groups` is all the groups present in state.
repeated GroupInfo groups = 1;
// pagination defines the pagination in the response.
cosmos.base.query.v1beta1.PageResponse pagination = 2;
}

View File

@ -162,6 +162,55 @@ func (s *E2ETestSuite) TestQueryGroupsByMembers() {
}
}
func (s *E2ETestSuite) TestQueryGroups() {
val := s.network.Validators[0]
clientCtx := val.ClientCtx
require := s.Require()
testCases := []struct {
name string
args []string
expectErr bool
expectErrMsg string
numItems int
expectGroups []*group.GroupInfo
}{
{
name: "valid req",
args: []string{fmt.Sprintf("--%s=json", flags.FlagOutput)},
expectErr: false,
numItems: 5,
},
{
name: "valid req with pagination",
args: []string{
"--limit=2",
fmt.Sprintf("--%s=json", flags.FlagOutput),
},
expectErr: false,
numItems: 2,
},
}
for _, tc := range testCases {
tc := tc
s.Run(tc.name, func() {
cmd := client.QueryGroupsCmd()
out, err := clitestutil.ExecTestCLICmd(clientCtx, cmd, tc.args)
if tc.expectErr {
require.Contains(out.String(), tc.expectErrMsg)
} else {
require.NoError(err, out.String())
var resp group.QueryGroupsResponse
val.ClientCtx.Codec.MustUnmarshalJSON(out.Bytes(), &resp)
require.Len(resp.Groups, tc.numItems)
}
})
}
}
func (s *E2ETestSuite) TestQueryGroupMembers() {
val := s.network.Validators[0]
clientCtx := val.ClientCtx

View File

@ -34,6 +34,7 @@ func QueryCmd(name string) *cobra.Command {
QueryVotesByVoterCmd(),
QueryGroupsByMemberCmd(),
QueryTallyResultCmd(),
QueryGroupsCmd(),
)
return queryCmd
@ -518,3 +519,37 @@ func QueryVotesByVoterCmd() *cobra.Command {
return cmd
}
func QueryGroupsCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "groups",
Short: "Query for groups present in the state",
RunE: func(cmd *cobra.Command, args []string) error {
clientCtx, err := client.GetClientQueryContext(cmd)
if err != nil {
return err
}
pageReq, err := client.ReadPageRequest(cmd.Flags())
if err != nil {
return err
}
queryClient := group.NewQueryClient(clientCtx)
res, err := queryClient.Groups(cmd.Context(), &group.QueryGroupsRequest{
Pagination: pageReq,
})
if err != nil {
return err
}
return clientCtx.PrintProto(res)
},
}
flags.AddQueryFlagsToCmd(cmd)
flags.AddPaginationFlagsToCmd(cmd, "groups")
return cmd
}

View File

@ -2,6 +2,7 @@ package keeper
import (
"context"
"math"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@ -357,3 +358,25 @@ func (k Keeper) TallyResult(goCtx context.Context, request *group.QueryTallyResu
Tally: tallyResult,
}, nil
}
// Groups returns all the groups present in the state.
func (k Keeper) Groups(goCtx context.Context, request *group.QueryGroupsRequest) (*group.QueryGroupsResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)
it, err := k.groupTable.PrefixScan(ctx.KVStore(k.key), 1, math.MaxUint64)
if err != nil {
return nil, err
}
defer it.Close()
var groups []*group.GroupInfo
pageRes, err := orm.Paginate(it, request.Pagination, &groups)
if err != nil {
return nil, err
}
return &group.QueryGroupsResponse{
Groups: groups,
Pagination: pageRes,
}, nil
}

View File

@ -5,26 +5,24 @@ import (
"testing"
"github.com/cometbft/cometbft/libs/log"
"github.com/golang/mock/gomock"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/baseapp"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/testutil"
simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims"
sdk "github.com/cosmos/cosmos-sdk/types"
moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil"
"github.com/cosmos/cosmos-sdk/types/query"
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
"github.com/cosmos/cosmos-sdk/x/group"
groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper"
"github.com/cosmos/cosmos-sdk/x/group/module"
"github.com/golang/mock/gomock"
grouptestutil "github.com/cosmos/cosmos-sdk/x/group/testutil"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/testutil"
)
func TestQueryGroupsByMember(t *testing.T) {
func initKeeper(t *testing.T) (sdk.Context, groupkeeper.Keeper, []sdk.AccAddress, group.QueryClient) {
var (
groupKeeper groupkeeper.Keeper
interfaceRegistry codectypes.InterfaceRegistry
@ -35,9 +33,6 @@ func TestQueryGroupsByMember(t *testing.T) {
encCfg := moduletestutil.MakeTestEncodingConfig(module.AppModuleBasic{})
ctx := testCtx.Ctx
sdkCtx := sdk.WrapSDKContext(ctx)
bApp := baseapp.NewBaseApp(
"group",
log.NewNopLogger(),
@ -45,8 +40,6 @@ func TestQueryGroupsByMember(t *testing.T) {
encCfg.TxConfig.TxDecoder(),
)
banktypes.RegisterInterfaces(encCfg.InterfaceRegistry)
addrs := simtestutil.CreateIncrementalAccounts(6)
ctrl := gomock.NewController(t)
accountKeeper := grouptestutil.NewMockAccountKeeper(ctrl)
@ -59,12 +52,22 @@ func TestQueryGroupsByMember(t *testing.T) {
groupKeeper = groupkeeper.NewKeeper(key, encCfg.Codec, bApp.MsgServiceRouter(), accountKeeper, group.DefaultConfig())
queryHelper := baseapp.NewQueryServerTestHelper(ctx, interfaceRegistry)
group.RegisterQueryServer(queryHelper, groupKeeper)
queryClient := group.NewQueryClient(queryHelper)
return ctx, groupKeeper, addrs, queryClient
}
func TestQueryGroupsByMember(t *testing.T) {
ctx, groupKeeper, addrs, queryClient := initKeeper(t)
// Initial group, group policy and balance setup
members := []group.MemberRequest{
{Address: addrs[2].String(), Weight: "1"}, {Address: addrs[3].String(), Weight: "2"},
}
_, err := groupKeeper.CreateGroup(sdkCtx, &group.MsgCreateGroup{
_, err := groupKeeper.CreateGroup(ctx, &group.MsgCreateGroup{
Admin: addrs[0].String(),
Members: members,
})
@ -73,16 +76,12 @@ func TestQueryGroupsByMember(t *testing.T) {
members = []group.MemberRequest{
{Address: addrs[3].String(), Weight: "1"}, {Address: addrs[4].String(), Weight: "2"},
}
_, err = groupKeeper.CreateGroup(sdkCtx, &group.MsgCreateGroup{
_, err = groupKeeper.CreateGroup(ctx, &group.MsgCreateGroup{
Admin: addrs[1].String(),
Members: members,
})
require.NoError(t, err)
queryHelper := baseapp.NewQueryServerTestHelper(ctx, interfaceRegistry)
group.RegisterQueryServer(queryHelper, groupKeeper)
queryClient := group.NewQueryClient(queryHelper)
// not part of any group
resp, err := queryClient.GroupsByMember(context.Background(), &group.QueryGroupsByMemberRequest{
Address: addrs[5].String(),
@ -104,3 +103,70 @@ func TestQueryGroupsByMember(t *testing.T) {
require.NoError(t, err)
require.Len(t, resp.Groups, 2)
}
func TestQueryGroups(t *testing.T) {
ctx, groupKeeper, addrs, queryClient := initKeeper(t)
// Initial group, group policy and balance setup
members := []group.MemberRequest{
{Address: addrs[1].String(), Weight: "1"},
{Address: addrs[3].String(), Weight: "2"},
}
_, err := groupKeeper.CreateGroup(ctx, &group.MsgCreateGroup{
Admin: addrs[0].String(),
Members: members,
})
require.NoError(t, err)
members = []group.MemberRequest{
{Address: addrs[3].String(), Weight: "1"},
}
_, err = groupKeeper.CreateGroup(ctx, &group.MsgCreateGroup{
Admin: addrs[2].String(),
Members: members,
})
require.NoError(t, err)
testCases := []struct {
name string
expErr bool
expLen int
itemsPerPage uint64
}{
{
name: "success case, without pagination",
expErr: false,
expLen: 2,
itemsPerPage: 10,
},
{
name: "success case, with pagination",
expErr: false,
expLen: 1,
itemsPerPage: 1,
},
{
name: "success without pagination",
expErr: false,
expLen: 2,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
resp, err := queryClient.Groups(context.Background(), &group.QueryGroupsRequest{
Pagination: &query.PageRequest{
Limit: tc.itemsPerPage,
},
})
if tc.expErr {
require.Error(t, err)
} else {
require.NoError(t, err)
require.Equal(t, len(resp.Groups), tc.expLen)
}
})
}
}

View File

@ -1381,6 +1381,111 @@ func (m *QueryTallyResultResponse) GetTally() TallyResult {
return TallyResult{}
}
// QueryGroupsRequest is the Query/Groups request type.
//
// Since: cosmos-sdk 0.47.1
type QueryGroupsRequest struct {
// pagination defines an optional pagination for the request.
Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
}
func (m *QueryGroupsRequest) Reset() { *m = QueryGroupsRequest{} }
func (m *QueryGroupsRequest) String() string { return proto.CompactTextString(m) }
func (*QueryGroupsRequest) ProtoMessage() {}
func (*QueryGroupsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_0fcf9f1d74302290, []int{26}
}
func (m *QueryGroupsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryGroupsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryGroupsRequest.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 *QueryGroupsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGroupsRequest.Merge(m, src)
}
func (m *QueryGroupsRequest) XXX_Size() int {
return m.Size()
}
func (m *QueryGroupsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGroupsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGroupsRequest proto.InternalMessageInfo
func (m *QueryGroupsRequest) GetPagination() *query.PageRequest {
if m != nil {
return m.Pagination
}
return nil
}
// QueryGroupsResponse is the Query/Groups response type.
//
// Since: cosmos-sdk 0.47.1
type QueryGroupsResponse struct {
// `groups` is all the groups present in state.
Groups []*GroupInfo `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"`
// pagination defines the pagination in the response.
Pagination *query.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
}
func (m *QueryGroupsResponse) Reset() { *m = QueryGroupsResponse{} }
func (m *QueryGroupsResponse) String() string { return proto.CompactTextString(m) }
func (*QueryGroupsResponse) ProtoMessage() {}
func (*QueryGroupsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_0fcf9f1d74302290, []int{27}
}
func (m *QueryGroupsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryGroupsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryGroupsResponse.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 *QueryGroupsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryGroupsResponse.Merge(m, src)
}
func (m *QueryGroupsResponse) XXX_Size() int {
return m.Size()
}
func (m *QueryGroupsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_QueryGroupsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_QueryGroupsResponse proto.InternalMessageInfo
func (m *QueryGroupsResponse) GetGroups() []*GroupInfo {
if m != nil {
return m.Groups
}
return nil
}
func (m *QueryGroupsResponse) GetPagination() *query.PageResponse {
if m != nil {
return m.Pagination
}
return nil
}
func init() {
proto.RegisterType((*QueryGroupInfoRequest)(nil), "cosmos.group.v1.QueryGroupInfoRequest")
proto.RegisterType((*QueryGroupInfoResponse)(nil), "cosmos.group.v1.QueryGroupInfoResponse")
@ -1408,92 +1513,96 @@ func init() {
proto.RegisterType((*QueryGroupsByMemberResponse)(nil), "cosmos.group.v1.QueryGroupsByMemberResponse")
proto.RegisterType((*QueryTallyResultRequest)(nil), "cosmos.group.v1.QueryTallyResultRequest")
proto.RegisterType((*QueryTallyResultResponse)(nil), "cosmos.group.v1.QueryTallyResultResponse")
proto.RegisterType((*QueryGroupsRequest)(nil), "cosmos.group.v1.QueryGroupsRequest")
proto.RegisterType((*QueryGroupsResponse)(nil), "cosmos.group.v1.QueryGroupsResponse")
}
func init() { proto.RegisterFile("cosmos/group/v1/query.proto", fileDescriptor_0fcf9f1d74302290) }
var fileDescriptor_0fcf9f1d74302290 = []byte{
// 1266 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x98, 0xcf, 0x6f, 0xdc, 0x44,
0x14, 0xc7, 0x33, 0x25, 0x69, 0x92, 0x97, 0xb6, 0x51, 0x87, 0xb4, 0x24, 0x6e, 0xb4, 0x09, 0x06,
0xf2, 0x3b, 0x76, 0x76, 0x93, 0xa6, 0x08, 0x28, 0xa8, 0x2b, 0x41, 0xc8, 0xa1, 0x28, 0x5d, 0x2a,
0x24, 0xb8, 0x44, 0xde, 0xac, 0x63, 0x2c, 0x76, 0x3d, 0xdb, 0xb5, 0x13, 0xb1, 0x8a, 0xf6, 0x82,
0x54, 0x0e, 0x88, 0x03, 0x50, 0x84, 0x4a, 0xc4, 0xa1, 0x07, 0x24, 0x7a, 0xe4, 0x00, 0x42, 0xe2,
0xd6, 0x5b, 0x8f, 0x15, 0x5c, 0x38, 0x21, 0x94, 0x20, 0xf1, 0x6f, 0x20, 0xcf, 0x3c, 0xef, 0xfa,
0xf7, 0x3a, 0x62, 0x45, 0x73, 0x49, 0x62, 0xcf, 0x9b, 0x79, 0x9f, 0xf9, 0xbe, 0xe7, 0xf1, 0xd7,
0x81, 0x2b, 0x3b, 0xcc, 0xae, 0x31, 0x5b, 0x35, 0x1a, 0x6c, 0xaf, 0xae, 0xee, 0xe7, 0xd5, 0x3b,
0x7b, 0x7a, 0xa3, 0xa9, 0xd4, 0x1b, 0xcc, 0x61, 0x74, 0x54, 0x0c, 0x2a, 0x7c, 0x50, 0xd9, 0xcf,
0x4b, 0x63, 0x06, 0x33, 0x18, 0x1f, 0x53, 0xdd, 0xbf, 0x44, 0x98, 0x34, 0x69, 0x30, 0x66, 0x54,
0x75, 0x55, 0xab, 0x9b, 0xaa, 0x66, 0x59, 0xcc, 0xd1, 0x1c, 0x93, 0x59, 0x36, 0x8e, 0x46, 0x32,
0x38, 0xcd, 0xba, 0xee, 0x0d, 0x2e, 0xe0, 0x60, 0x59, 0xb3, 0x75, 0x91, 0x5a, 0xdd, 0xcf, 0x97,
0x75, 0x47, 0xcb, 0xab, 0x75, 0xcd, 0x30, 0x2d, 0xbe, 0x12, 0xc6, 0x4e, 0x88, 0xd8, 0x6d, 0x91,
0x1f, 0xd1, 0xc4, 0xd0, 0x45, 0xad, 0x66, 0x5a, 0x4c, 0xe5, 0x3f, 0xc5, 0x2d, 0xb9, 0x00, 0x97,
0x6e, 0xb9, 0xeb, 0x6d, 0xb8, 0x69, 0x37, 0xad, 0x5d, 0x56, 0xd2, 0xef, 0xec, 0xe9, 0xb6, 0x43,
0x27, 0x60, 0x88, 0xa3, 0x6c, 0x9b, 0x95, 0x71, 0x32, 0x4d, 0xe6, 0xfa, 0x4b, 0x83, 0xfc, 0x7a,
0xb3, 0x22, 0xbf, 0x0d, 0x97, 0xc3, 0x73, 0xec, 0x3a, 0xb3, 0x6c, 0x9d, 0x2a, 0xd0, 0x6f, 0x5a,
0xbb, 0x8c, 0x4f, 0x18, 0x29, 0x48, 0x4a, 0x48, 0x18, 0xa5, 0x33, 0x83, 0xc7, 0xc9, 0xb7, 0xe0,
0x4a, 0x67, 0xa5, 0x2d, 0x56, 0x35, 0x77, 0x9a, 0x7e, 0x86, 0x02, 0x0c, 0x6a, 0x95, 0x4a, 0x43,
0xb7, 0x6d, 0xbe, 0xe2, 0x70, 0x71, 0xfc, 0xb7, 0x9f, 0x96, 0xc7, 0x70, 0xd1, 0x1b, 0x62, 0xe4,
0x5d, 0xa7, 0x61, 0x5a, 0x46, 0xc9, 0x0b, 0x94, 0x6f, 0xc3, 0x64, 0xfc, 0x92, 0x88, 0xb8, 0x16,
0x40, 0x9c, 0x8e, 0x47, 0xf4, 0xcd, 0x13, 0xa0, 0x2d, 0x18, 0xef, 0xac, 0x7a, 0x53, 0xaf, 0x95,
0xf5, 0x86, 0xdd, 0x5d, 0x29, 0xfa, 0x16, 0x40, 0xa7, 0x3e, 0xe3, 0x67, 0x78, 0xca, 0x19, 0x2f,
0xa5, 0x5b, 0x4c, 0x45, 0xf4, 0x11, 0x16, 0x53, 0xd9, 0xd2, 0x0c, 0x1d, 0x97, 0x2d, 0xf9, 0x66,
0xca, 0xdf, 0x11, 0x98, 0x88, 0xc9, 0x8f, 0x5b, 0x5a, 0x87, 0xc1, 0x9a, 0xb8, 0x35, 0x4e, 0xa6,
0x9f, 0x99, 0x1b, 0x29, 0x4c, 0xc6, 0xef, 0x4a, 0xcc, 0x2b, 0x79, 0xc1, 0x74, 0x23, 0x86, 0x6e,
0xb6, 0x2b, 0x9d, 0x48, 0x1a, 0xc0, 0xbb, 0x17, 0xc0, 0xb3, 0x8b, 0xcd, 0x1b, 0x95, 0x9a, 0x69,
0x79, 0xfa, 0x28, 0x30, 0xa0, 0xb9, 0xd7, 0x5d, 0x6b, 0x28, 0xc2, 0x7a, 0x26, 0xda, 0xb7, 0x04,
0xa4, 0x38, 0x2a, 0x54, 0xad, 0x00, 0x67, 0xb9, 0x3c, 0x9e, 0x68, 0x69, 0xdd, 0x8a, 0x91, 0xbd,
0x53, 0xec, 0x2e, 0x81, 0xe9, 0x50, 0x9b, 0x9a, 0xba, 0x5d, 0x14, 0x97, 0xff, 0x63, 0x63, 0xfd,
0x4c, 0xe0, 0xf9, 0x14, 0x0e, 0x94, 0x6a, 0x03, 0x2e, 0x08, 0x90, 0x3a, 0x06, 0xa0, 0x64, 0xdd,
0x9f, 0x9e, 0xf3, 0x86, 0x7f, 0xdd, 0xde, 0xe9, 0x77, 0x98, 0xa0, 0xdf, 0xa9, 0x68, 0xbc, 0x24,
0x51, 0x83, 0xfd, 0x77, 0xfa, 0x44, 0xbd, 0x06, 0x63, 0x1c, 0x7b, 0xab, 0xc1, 0xea, 0xcc, 0xd6,
0xaa, 0x9e, 0x8e, 0x53, 0x30, 0x52, 0xc7, 0x5b, 0x9d, 0x56, 0x04, 0xef, 0xd6, 0x66, 0x45, 0x7e,
0x07, 0x5f, 0x22, 0x9d, 0x89, 0xb8, 0xc7, 0xab, 0x30, 0xe4, 0x85, 0xe1, 0x81, 0x3b, 0x11, 0xd9,
0x5d, 0x7b, 0x52, 0x3b, 0x54, 0x7e, 0x40, 0x40, 0x0e, 0x2c, 0xe8, 0x75, 0xa4, 0x10, 0xe1, 0x3f,
0xbc, 0x1e, 0x7a, 0x56, 0xe3, 0x1f, 0x08, 0xbc, 0x90, 0x8a, 0x88, 0x0a, 0x5c, 0x83, 0x61, 0x6f,
0x5b, 0x5e, 0x81, 0x53, 0x24, 0xe8, 0xc4, 0xf6, 0xae, 0xaa, 0x0d, 0x98, 0xe2, 0xa0, 0xef, 0x31,
0x47, 0x2f, 0xb6, 0x71, 0xdd, 0xab, 0x46, 0xd6, 0x02, 0xbb, 0x4f, 0xd2, 0xbe, 0x3b, 0x81, 0x73,
0xa4, 0x3e, 0x49, 0x3c, 0x4c, 0xbe, 0x89, 0x4f, 0x67, 0x6c, 0x4e, 0x54, 0x66, 0x1e, 0xfa, 0xdd,
0x60, 0xec, 0x8b, 0x4b, 0x11, 0x51, 0xdc, 0xe8, 0x12, 0x0f, 0x91, 0x3f, 0x25, 0xe8, 0x13, 0xdc,
0x7b, 0x76, 0xf1, 0xc4, 0x0d, 0xda, 0xb3, 0xaa, 0x7f, 0x4d, 0xd0, 0x5d, 0x44, 0x40, 0x70, 0x53,
0x8b, 0x42, 0x28, 0xaf, 0xd4, 0x09, 0xbb, 0x12, 0x31, 0xbd, 0x2b, 0xf1, 0x57, 0x04, 0xed, 0x09,
0x62, 0x05, 0x8a, 0xdb, 0xae, 0x1d, 0xc9, 0x54, 0xbb, 0x9e, 0x69, 0xf5, 0xa5, 0x67, 0x0a, 0x82,
0x50, 0x4f, 0x55, 0xa8, 0xfb, 0x61, 0x4b, 0x80, 0x96, 0xe8, 0x14, 0x1c, 0x28, 0x87, 0xc4, 0xef,
0x85, 0x7d, 0x68, 0xa7, 0xc1, 0xae, 0xbc, 0x02, 0xcf, 0x71, 0xb6, 0xdb, 0x5a, 0xb5, 0xea, 0x9e,
0x6d, 0x7b, 0x55, 0x27, 0xf3, 0xcb, 0xe1, 0x7d, 0xec, 0xcd, 0xc0, 0x5c, 0xdc, 0xd4, 0x75, 0x18,
0x70, 0xdc, 0xdb, 0x78, 0x08, 0x44, 0x7d, 0xab, 0x6f, 0x52, 0x71, 0xf8, 0xf1, 0x9f, 0x53, 0x7d,
0x0f, 0xff, 0xf9, 0x71, 0x81, 0x94, 0xc4, 0xac, 0xc2, 0xdd, 0x8b, 0x30, 0xc0, 0xd7, 0xa6, 0x9f,
0x13, 0x18, 0x6e, 0xef, 0x9f, 0xce, 0x44, 0xd6, 0x89, 0xfd, 0xc6, 0x91, 0x66, 0xbb, 0xc6, 0x09,
0x4e, 0x59, 0xf9, 0xe4, 0xf7, 0xbf, 0xef, 0x9d, 0x99, 0xa3, 0x33, 0x6a, 0xf8, 0x2b, 0x0d, 0x0d,
0x9a, 0xb5, 0xcb, 0xd4, 0x03, 0xcf, 0xac, 0xb5, 0xe8, 0xf7, 0x04, 0x46, 0x43, 0x6f, 0x6d, 0xba,
0x94, 0x92, 0x2c, 0xf2, 0xe9, 0x23, 0x2d, 0x67, 0x8c, 0x46, 0xc0, 0x35, 0x0e, 0xa8, 0xd0, 0xa5,
0x04, 0x40, 0xee, 0x31, 0x9a, 0xc8, 0x89, 0xad, 0xdb, 0xa2, 0xf7, 0x09, 0x9c, 0xf3, 0x7f, 0x51,
0xd0, 0xf9, 0x94, 0xac, 0xc1, 0xaf, 0x1e, 0x69, 0x21, 0x4b, 0x28, 0xd2, 0xe5, 0x39, 0xdd, 0x22,
0x9d, 0x4f, 0xa0, 0xc3, 0x0f, 0x12, 0xbf, 0x82, 0x87, 0x04, 0xce, 0x07, 0x7c, 0x3b, 0x4d, 0x4b,
0x18, 0x72, 0x7e, 0xd2, 0x62, 0xa6, 0x58, 0xa4, 0x5b, 0xe1, 0x74, 0x0b, 0x74, 0x2e, 0x9e, 0xce,
0xde, 0x2e, 0x37, 0xb7, 0xb9, 0x41, 0x74, 0x95, 0xab, 0x99, 0x56, 0x8b, 0xfe, 0x4a, 0x60, 0x2c,
0xce, 0x30, 0xd3, 0x7c, 0xb7, 0xaa, 0x45, 0x4c, 0xbe, 0x54, 0x38, 0xc9, 0x14, 0x24, 0x7e, 0x95,
0x13, 0x5f, 0xa5, 0xab, 0x69, 0xd5, 0x36, 0x75, 0x4e, 0x2e, 0x86, 0x7c, 0xca, 0xfe, 0x12, 0x85,
0x17, 0x02, 0x67, 0x83, 0x0f, 0xe8, 0x5c, 0x38, 0xc9, 0x14, 0x84, 0x7f, 0x99, 0xc3, 0x17, 0xe8,
0x4a, 0x06, 0xf8, 0xa0, 0xec, 0x9f, 0x11, 0x18, 0xf2, 0xde, 0xb8, 0xf4, 0xa5, 0xf8, 0xd4, 0x21,
0x6b, 0x20, 0xcd, 0x74, 0x0b, 0x43, 0x2a, 0x95, 0x53, 0xcd, 0xd3, 0xd9, 0x08, 0x95, 0x77, 0x94,
0xa9, 0x07, 0xbe, 0x73, 0xae, 0x45, 0x1f, 0x11, 0xb8, 0x1c, 0xef, 0xfd, 0xe8, 0x6a, 0x7a, 0xce,
0x58, 0x33, 0x2b, 0xad, 0x9d, 0x6c, 0x12, 0x62, 0xbf, 0xc6, 0xb1, 0xd7, 0xe9, 0x5a, 0x22, 0x76,
0xa7, 0x09, 0xf0, 0x10, 0xf0, 0x3d, 0xff, 0x8f, 0x08, 0x3c, 0x1b, 0x63, 0xd1, 0xe8, 0x4a, 0x3c,
0x4b, 0xb2, 0x83, 0x94, 0xf2, 0x27, 0x98, 0x81, 0xe8, 0x6f, 0x72, 0xf4, 0x37, 0xe8, 0xf5, 0x08,
0xba, 0xfb, 0xd2, 0x77, 0xa9, 0xdb, 0x7a, 0x73, 0x63, 0x12, 0xd4, 0x5f, 0x3d, 0xe0, 0x37, 0x5b,
0xf4, 0x21, 0x81, 0xd1, 0x90, 0x1b, 0x4b, 0x3a, 0x6a, 0xe3, 0xdd, 0x63, 0xd2, 0x51, 0x9b, 0x60,
0xf1, 0x52, 0xfa, 0x97, 0x9b, 0x15, 0x3f, 0x78, 0xa8, 0x65, 0xbe, 0x21, 0x70, 0xce, 0x6f, 0x86,
0x92, 0x8e, 0xdb, 0x18, 0x17, 0x97, 0x74, 0xdc, 0xc6, 0x79, 0xab, 0x94, 0x5e, 0x6e, 0x13, 0xa2,
0xa2, 0xa8, 0xe1, 0x03, 0x02, 0x17, 0x82, 0xb6, 0x83, 0x76, 0x39, 0x41, 0x03, 0xbe, 0x49, 0x5a,
0xca, 0x16, 0x8c, 0x78, 0xab, 0x1c, 0x6f, 0x99, 0x2e, 0xa6, 0x9c, 0xb7, 0xe2, 0x8d, 0xe0, 0x6b,
0xd5, 0x43, 0x02, 0x23, 0x3e, 0x33, 0x40, 0xe7, 0xe2, 0x53, 0x46, 0x0d, 0x8a, 0x34, 0x9f, 0x21,
0x12, 0xc9, 0xd6, 0x39, 0xd9, 0x0a, 0x55, 0x92, 0x9f, 0xa6, 0x50, 0x17, 0x72, 0x1f, 0x52, 0x7c,
0xfd, 0xf1, 0x51, 0x8e, 0x3c, 0x39, 0xca, 0x91, 0xbf, 0x8e, 0x72, 0xe4, 0x8b, 0xe3, 0x5c, 0xdf,
0x93, 0xe3, 0x5c, 0xdf, 0x1f, 0xc7, 0xb9, 0xbe, 0x0f, 0x5e, 0x34, 0x4c, 0xe7, 0xc3, 0xbd, 0xb2,
0xb2, 0xc3, 0x6a, 0xde, 0x9a, 0xe2, 0xd7, 0xb2, 0x5d, 0xf9, 0x48, 0xfd, 0x58, 0x24, 0x28, 0x9f,
0xe5, 0xff, 0x8b, 0x5d, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0x4d, 0xc7, 0x67, 0x78, 0x66, 0x16,
0x00, 0x00,
// 1310 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x98, 0xcf, 0x6f, 0x1b, 0x45,
0x14, 0xc7, 0x33, 0x25, 0x3f, 0x5f, 0xda, 0x46, 0x9d, 0xa6, 0x6d, 0xb2, 0x8d, 0x9c, 0xb0, 0x2d,
0xf9, 0x9d, 0xdd, 0xd8, 0x49, 0x53, 0x04, 0x14, 0x54, 0x4b, 0x10, 0x72, 0x28, 0x4a, 0x4d, 0x85,
0x04, 0x42, 0x8a, 0xd6, 0xf1, 0xc6, 0xac, 0xb0, 0x77, 0x5c, 0xef, 0x26, 0xc2, 0x8a, 0x7c, 0x41,
0x82, 0x03, 0xe2, 0x00, 0x2d, 0x42, 0x25, 0xe2, 0xd0, 0x03, 0x12, 0x3d, 0x72, 0x00, 0x21, 0x71,
0xeb, 0xad, 0xc7, 0x0a, 0x2e, 0x9c, 0x10, 0x4a, 0x90, 0xf8, 0x23, 0xb8, 0xa0, 0x9d, 0x79, 0x6b,
0xef, 0x6f, 0x6f, 0x84, 0x45, 0x73, 0x69, 0xeb, 0x9d, 0x37, 0xf3, 0x3e, 0xf3, 0x7d, 0x6f, 0x67,
0xbf, 0x53, 0xb8, 0xbc, 0xcd, 0xac, 0x2a, 0xb3, 0xd4, 0x72, 0x9d, 0xed, 0xd6, 0xd4, 0xbd, 0xac,
0x7a, 0x77, 0x57, 0xaf, 0x37, 0x94, 0x5a, 0x9d, 0xd9, 0x8c, 0x8e, 0x88, 0x41, 0x85, 0x0f, 0x2a,
0x7b, 0x59, 0x69, 0xb4, 0xcc, 0xca, 0x8c, 0x8f, 0xa9, 0xce, 0xbf, 0x44, 0x98, 0x34, 0x51, 0x66,
0xac, 0x5c, 0xd1, 0x55, 0xad, 0x66, 0xa8, 0x9a, 0x69, 0x32, 0x5b, 0xb3, 0x0d, 0x66, 0x5a, 0x38,
0x1a, 0xca, 0x60, 0x37, 0x6a, 0xba, 0x3b, 0x38, 0x8f, 0x83, 0x45, 0xcd, 0xd2, 0x45, 0x6a, 0x75,
0x2f, 0x5b, 0xd4, 0x6d, 0x2d, 0xab, 0xd6, 0xb4, 0xb2, 0x61, 0xf2, 0x95, 0x30, 0x76, 0x5c, 0xc4,
0x6e, 0x89, 0xfc, 0x88, 0x26, 0x86, 0xce, 0x69, 0x55, 0xc3, 0x64, 0x2a, 0xff, 0x53, 0x3c, 0x92,
0x73, 0x70, 0xe1, 0xb6, 0xb3, 0xde, 0xba, 0x93, 0x76, 0xc3, 0xdc, 0x61, 0x05, 0xfd, 0xee, 0xae,
0x6e, 0xd9, 0x74, 0x1c, 0x06, 0x39, 0xca, 0x96, 0x51, 0x1a, 0x23, 0x53, 0x64, 0xb6, 0xb7, 0x30,
0xc0, 0x7f, 0x6f, 0x94, 0xe4, 0x37, 0xe1, 0x62, 0x70, 0x8e, 0x55, 0x63, 0xa6, 0xa5, 0x53, 0x05,
0x7a, 0x0d, 0x73, 0x87, 0xf1, 0x09, 0xc3, 0x39, 0x49, 0x09, 0x08, 0xa3, 0xb4, 0x67, 0xf0, 0x38,
0xf9, 0x36, 0x5c, 0x6e, 0xaf, 0xb4, 0xc9, 0x2a, 0xc6, 0x76, 0xc3, 0xcb, 0x90, 0x83, 0x01, 0xad,
0x54, 0xaa, 0xeb, 0x96, 0xc5, 0x57, 0x1c, 0xca, 0x8f, 0xfd, 0xfa, 0xe3, 0xd2, 0x28, 0x2e, 0x7a,
0x53, 0x8c, 0xbc, 0x6d, 0xd7, 0x0d, 0xb3, 0x5c, 0x70, 0x03, 0xe5, 0x3b, 0x30, 0x11, 0xbd, 0x24,
0x22, 0xae, 0xfa, 0x10, 0xa7, 0xa2, 0x11, 0x3d, 0xf3, 0x04, 0x68, 0x13, 0xc6, 0xda, 0xab, 0xde,
0xd2, 0xab, 0x45, 0xbd, 0x6e, 0x75, 0x56, 0x8a, 0xbe, 0x01, 0xd0, 0xae, 0xcf, 0xd8, 0x29, 0x9e,
0x72, 0xda, 0x4d, 0xe9, 0x14, 0x53, 0x11, 0x7d, 0x84, 0xc5, 0x54, 0x36, 0xb5, 0xb2, 0x8e, 0xcb,
0x16, 0x3c, 0x33, 0xe5, 0x6f, 0x09, 0x8c, 0x47, 0xe4, 0xc7, 0x2d, 0xad, 0xc1, 0x40, 0x55, 0x3c,
0x1a, 0x23, 0x53, 0xcf, 0xcd, 0x0e, 0xe7, 0x26, 0xa2, 0x77, 0x25, 0xe6, 0x15, 0xdc, 0x60, 0xba,
0x1e, 0x41, 0x37, 0xd3, 0x91, 0x4e, 0x24, 0xf5, 0xe1, 0xdd, 0xf7, 0xe1, 0x59, 0xf9, 0xc6, 0xcd,
0x52, 0xd5, 0x30, 0x5d, 0x7d, 0x14, 0xe8, 0xd3, 0x9c, 0xdf, 0x1d, 0x6b, 0x28, 0xc2, 0xba, 0x26,
0xda, 0x37, 0x04, 0xa4, 0x28, 0x2a, 0x54, 0x2d, 0x07, 0xfd, 0x5c, 0x1e, 0x57, 0xb4, 0xa4, 0x6e,
0xc5, 0xc8, 0xee, 0x29, 0xf6, 0x09, 0x81, 0xa9, 0x40, 0x9b, 0x1a, 0xba, 0x95, 0x17, 0x3f, 0xff,
0xc7, 0xc6, 0xfa, 0x89, 0xc0, 0xf3, 0x09, 0x1c, 0x28, 0xd5, 0x3a, 0x9c, 0x15, 0x20, 0x35, 0x0c,
0x40, 0xc9, 0x3a, 0xbf, 0x3d, 0x67, 0xca, 0xde, 0x75, 0xbb, 0xa7, 0xdf, 0x41, 0x8c, 0x7e, 0x27,
0xa2, 0xf1, 0xe2, 0x44, 0xf5, 0xf7, 0xdf, 0xc9, 0x13, 0xf5, 0x3a, 0x8c, 0x72, 0xec, 0xcd, 0x3a,
0xab, 0x31, 0x4b, 0xab, 0xb8, 0x3a, 0x4e, 0xc2, 0x70, 0x0d, 0x1f, 0xb5, 0x5b, 0x11, 0xdc, 0x47,
0x1b, 0x25, 0xf9, 0x2d, 0xfc, 0x88, 0xb4, 0x27, 0xe2, 0x1e, 0xaf, 0xc1, 0xa0, 0x1b, 0x86, 0x07,
0xee, 0x78, 0x68, 0x77, 0xad, 0x49, 0xad, 0x50, 0xf9, 0x21, 0x01, 0xd9, 0xb7, 0xa0, 0xdb, 0x91,
0x42, 0x84, 0xff, 0xf0, 0x79, 0xe8, 0x5a, 0x8d, 0xbf, 0x27, 0x70, 0x25, 0x11, 0x11, 0x15, 0xb8,
0x0e, 0x43, 0xee, 0xb6, 0xdc, 0x02, 0x27, 0x48, 0xd0, 0x8e, 0xed, 0x5e, 0x55, 0xeb, 0x30, 0xc9,
0x41, 0xdf, 0x61, 0xb6, 0x9e, 0x6f, 0xe1, 0x3a, 0xbf, 0xea, 0x69, 0x0b, 0xec, 0xbc, 0x49, 0x7b,
0xce, 0x04, 0xce, 0x91, 0xf8, 0x26, 0xf1, 0x30, 0xf9, 0x16, 0xbe, 0x9d, 0x91, 0x39, 0x51, 0x99,
0x39, 0xe8, 0x75, 0x82, 0xb1, 0x2f, 0x2e, 0x84, 0x44, 0x71, 0xa2, 0x0b, 0x3c, 0x44, 0xfe, 0x94,
0xa0, 0x4f, 0x70, 0x9e, 0x59, 0xf9, 0x63, 0x37, 0x68, 0xd7, 0xaa, 0xfe, 0x15, 0x41, 0x77, 0x11,
0x02, 0xc1, 0x4d, 0x2d, 0x08, 0xa1, 0xdc, 0x52, 0xc7, 0xec, 0x4a, 0xc4, 0x74, 0xaf, 0xc4, 0xf7,
0x08, 0xda, 0x13, 0xc4, 0xf2, 0x15, 0xb7, 0x55, 0x3b, 0x92, 0xaa, 0x76, 0x5d, 0xd3, 0xea, 0x4b,
0xd7, 0x14, 0xf8, 0xa1, 0x9e, 0xa9, 0x50, 0x0f, 0x82, 0x96, 0x00, 0x2d, 0xd1, 0x09, 0x38, 0x50,
0x0e, 0x88, 0xd7, 0x0b, 0x7b, 0xd0, 0x4e, 0x82, 0x5d, 0x79, 0x09, 0x2e, 0x71, 0xb6, 0x3b, 0x5a,
0xa5, 0xe2, 0x9c, 0x6d, 0xbb, 0x15, 0x3b, 0xf5, 0xc7, 0xe1, 0x5d, 0xec, 0x4d, 0xdf, 0x5c, 0xdc,
0xd4, 0x0d, 0xe8, 0xb3, 0x9d, 0xc7, 0x78, 0x08, 0x84, 0x7d, 0xab, 0x67, 0x52, 0x7e, 0xe8, 0xc9,
0x1f, 0x93, 0x3d, 0x8f, 0xfe, 0xfe, 0x61, 0x9e, 0x14, 0xc4, 0x2c, 0xf9, 0x7d, 0xa0, 0x1e, 0xc9,
0x5c, 0xa2, 0x6e, 0x55, 0xe4, 0x1e, 0x81, 0xf3, 0xbe, 0xe5, 0x4f, 0x40, 0x25, 0x72, 0xff, 0x9c,
0x83, 0x3e, 0x0e, 0x45, 0x3f, 0x27, 0x30, 0xd4, 0x4a, 0x44, 0xa7, 0x43, 0x10, 0x91, 0xd7, 0x3a,
0x69, 0xa6, 0x63, 0x9c, 0x48, 0x2a, 0x2b, 0x1f, 0xff, 0xf6, 0xd7, 0xfd, 0x53, 0xb3, 0x74, 0x5a,
0x0d, 0x5e, 0x4c, 0xd1, 0x93, 0x9a, 0x3b, 0x4c, 0xdd, 0x77, 0xfd, 0x69, 0x93, 0x7e, 0x47, 0x60,
0x24, 0x60, 0x54, 0xe8, 0x62, 0x42, 0xb2, 0xd0, 0x6d, 0x4f, 0x5a, 0x4a, 0x19, 0x8d, 0x80, 0xab,
0x1c, 0x50, 0xa1, 0x8b, 0x31, 0x80, 0xdc, 0x56, 0x35, 0x90, 0x13, 0xdf, 0xd6, 0x26, 0x7d, 0x40,
0xe0, 0xb4, 0xf7, 0x12, 0x45, 0xe7, 0x12, 0xb2, 0xfa, 0x2f, 0x7a, 0xd2, 0x7c, 0x9a, 0x50, 0xa4,
0xcb, 0x72, 0xba, 0x05, 0x3a, 0x17, 0x43, 0x87, 0x77, 0x30, 0xaf, 0x82, 0x07, 0x04, 0xce, 0xf8,
0xae, 0x2a, 0x34, 0x29, 0x61, 0xc0, 0xec, 0x4a, 0x0b, 0xa9, 0x62, 0x91, 0x6e, 0x99, 0xd3, 0xcd,
0xd3, 0xd9, 0x68, 0x3a, 0x6b, 0xab, 0xd8, 0xd8, 0xe2, 0x9e, 0xd8, 0x51, 0xae, 0x6a, 0x98, 0x4d,
0xfa, 0x0b, 0x81, 0xd1, 0xa8, 0x3b, 0x02, 0xcd, 0x76, 0xaa, 0x5a, 0xe8, 0x5e, 0x23, 0xe5, 0x8e,
0x33, 0x05, 0x89, 0x5f, 0xe6, 0xc4, 0xd7, 0xe8, 0x4a, 0x52, 0xb5, 0x0d, 0x9d, 0x93, 0x8b, 0x21,
0x8f, 0xb2, 0x3f, 0x87, 0xe1, 0x85, 0xc0, 0xe9, 0xe0, 0x7d, 0x3a, 0xe7, 0x8e, 0x33, 0x05, 0xe1,
0x5f, 0xe4, 0xf0, 0x39, 0xba, 0x9c, 0x02, 0xde, 0x2f, 0xfb, 0x67, 0x04, 0x06, 0x5d, 0x93, 0x41,
0x5f, 0x88, 0x4e, 0x1d, 0x70, 0x43, 0xd2, 0x74, 0xa7, 0x30, 0xa4, 0x52, 0x39, 0xd5, 0x1c, 0x9d,
0x09, 0x51, 0xb9, 0xa7, 0xb7, 0xba, 0xef, 0x39, 0xda, 0x9b, 0xf4, 0x31, 0x81, 0x8b, 0xd1, 0x76,
0x97, 0xae, 0x24, 0xe7, 0x8c, 0xf4, 0xef, 0xd2, 0xea, 0xf1, 0x26, 0x21, 0xf6, 0x2b, 0x1c, 0x7b,
0x8d, 0xae, 0xc6, 0x62, 0xb7, 0x9b, 0x00, 0x0f, 0x01, 0xcf, 0xfb, 0xff, 0x98, 0xc0, 0xf9, 0x08,
0x57, 0x4a, 0x97, 0xa3, 0x59, 0xe2, 0x4d, 0xb3, 0x94, 0x3d, 0xc6, 0x0c, 0x44, 0x7f, 0x9d, 0xa3,
0xbf, 0x46, 0x6f, 0x84, 0xd0, 0x1d, 0x9f, 0xe3, 0x50, 0xb7, 0xf4, 0xe6, 0x5e, 0xcc, 0xaf, 0xbf,
0xba, 0xcf, 0x1f, 0x36, 0xe9, 0x23, 0x02, 0x23, 0x01, 0x03, 0x1a, 0x77, 0xd4, 0x46, 0x1b, 0xe6,
0xb8, 0xa3, 0x36, 0xc6, 0xd5, 0x26, 0xf4, 0x2f, 0xf7, 0x67, 0x5e, 0xf0, 0x40, 0xcb, 0x7c, 0x4d,
0xe0, 0xb4, 0xd7, 0xff, 0xc5, 0x1d, 0xb7, 0x11, 0xc6, 0x35, 0xee, 0xb8, 0x8d, 0xb2, 0x93, 0x09,
0xbd, 0xdc, 0x22, 0x44, 0x45, 0x51, 0xc3, 0x87, 0x04, 0xce, 0xfa, 0x9d, 0x16, 0xed, 0x70, 0x82,
0xfa, 0xac, 0xa2, 0xb4, 0x98, 0x2e, 0x18, 0xf1, 0x56, 0x38, 0xde, 0x12, 0x5d, 0x48, 0x38, 0x6f,
0xc5, 0x17, 0xc1, 0xd3, 0xaa, 0x07, 0x04, 0x86, 0x3d, 0xfe, 0x87, 0xce, 0x46, 0xa7, 0x0c, 0x7b,
0x32, 0x69, 0x2e, 0x45, 0x24, 0x92, 0xad, 0x71, 0xb2, 0x65, 0xaa, 0xc4, 0xbf, 0x4d, 0x81, 0x2e,
0xe4, 0xd6, 0x8b, 0xda, 0xd0, 0x2f, 0xf6, 0x4a, 0xaf, 0x24, 0x29, 0xe1, 0x12, 0x5d, 0x4d, 0x0e,
0x42, 0x98, 0x49, 0x0e, 0x33, 0x4e, 0x2f, 0xc5, 0xc8, 0x94, 0x7f, 0xf5, 0xc9, 0x61, 0x86, 0x3c,
0x3d, 0xcc, 0x90, 0x3f, 0x0f, 0x33, 0xe4, 0x8b, 0xa3, 0x4c, 0xcf, 0xd3, 0xa3, 0x4c, 0xcf, 0xef,
0x47, 0x99, 0x9e, 0xf7, 0xae, 0x96, 0x0d, 0xfb, 0x83, 0xdd, 0xa2, 0xb2, 0xcd, 0xaa, 0xee, 0x64,
0xf1, 0xd7, 0x92, 0x55, 0xfa, 0x50, 0xfd, 0x48, 0x2c, 0x50, 0xec, 0xe7, 0xff, 0xe9, 0xbd, 0xf2,
0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x22, 0xb3, 0x86, 0xf8, 0xcf, 0x17, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@ -1538,6 +1647,10 @@ type QueryClient interface {
// then it simply returns the `final_tally_result` state stored in the
// proposal itself.
TallyResult(ctx context.Context, in *QueryTallyResultRequest, opts ...grpc.CallOption) (*QueryTallyResultResponse, error)
// Groups queries all groups in state.
//
// Since: cosmos-sdk 0.47.1
Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error)
}
type queryClient struct {
@ -1665,6 +1778,15 @@ func (c *queryClient) TallyResult(ctx context.Context, in *QueryTallyResultReque
return out, nil
}
func (c *queryClient) Groups(ctx context.Context, in *QueryGroupsRequest, opts ...grpc.CallOption) (*QueryGroupsResponse, error) {
out := new(QueryGroupsResponse)
err := c.cc.Invoke(ctx, "/cosmos.group.v1.Query/Groups", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// QueryServer is the server API for Query service.
type QueryServer interface {
// GroupInfo queries group info based on group id.
@ -1697,6 +1819,10 @@ type QueryServer interface {
// then it simply returns the `final_tally_result` state stored in the
// proposal itself.
TallyResult(context.Context, *QueryTallyResultRequest) (*QueryTallyResultResponse, error)
// Groups queries all groups in state.
//
// Since: cosmos-sdk 0.47.1
Groups(context.Context, *QueryGroupsRequest) (*QueryGroupsResponse, error)
}
// UnimplementedQueryServer can be embedded to have forward compatible implementations.
@ -1742,6 +1868,9 @@ func (*UnimplementedQueryServer) GroupsByMember(ctx context.Context, req *QueryG
func (*UnimplementedQueryServer) TallyResult(ctx context.Context, req *QueryTallyResultRequest) (*QueryTallyResultResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method TallyResult not implemented")
}
func (*UnimplementedQueryServer) Groups(ctx context.Context, req *QueryGroupsRequest) (*QueryGroupsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method Groups not implemented")
}
func RegisterQueryServer(s grpc1.Server, srv QueryServer) {
s.RegisterService(&_Query_serviceDesc, srv)
@ -1981,6 +2110,24 @@ func _Query_TallyResult_Handler(srv interface{}, ctx context.Context, dec func(i
return interceptor(ctx, in, info, handler)
}
func _Query_Groups_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QueryGroupsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(QueryServer).Groups(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/cosmos.group.v1.Query/Groups",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(QueryServer).Groups(ctx, req.(*QueryGroupsRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Query_serviceDesc = grpc.ServiceDesc{
ServiceName: "cosmos.group.v1.Query",
HandlerType: (*QueryServer)(nil),
@ -2037,6 +2184,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{
MethodName: "TallyResult",
Handler: _Query_TallyResult_Handler,
},
{
MethodName: "Groups",
Handler: _Query_Groups_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "cosmos/group/v1/query.proto",
@ -3086,6 +3237,90 @@ func (m *QueryTallyResultResponse) MarshalToSizedBuffer(dAtA []byte) (int, error
return len(dAtA) - i, nil
}
func (m *QueryGroupsRequest) 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 *QueryGroupsRequest) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryGroupsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Pagination != nil {
{
size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
return len(dAtA) - i, nil
}
func (m *QueryGroupsResponse) 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 *QueryGroupsResponse) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryGroupsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Pagination != nil {
{
size, err := m.Pagination.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
if len(m.Groups) > 0 {
for iNdEx := len(m.Groups) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Groups[iNdEx].MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0xa
}
}
return len(dAtA) - i, nil
}
func encodeVarintQuery(dAtA []byte, offset int, v uint64) int {
offset -= sovQuery(v)
base := offset
@ -3510,6 +3745,38 @@ func (m *QueryTallyResultResponse) Size() (n int) {
return n
}
func (m *QueryGroupsRequest) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if m.Pagination != nil {
l = m.Pagination.Size()
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func (m *QueryGroupsResponse) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
if len(m.Groups) > 0 {
for _, e := range m.Groups {
l = e.Size()
n += 1 + l + sovQuery(uint64(l))
}
}
if m.Pagination != nil {
l = m.Pagination.Size()
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func sovQuery(x uint64) (n int) {
return (math_bits.Len64(x|1) + 6) / 7
}
@ -6198,6 +6465,212 @@ func (m *QueryTallyResultResponse) Unmarshal(dAtA []byte) error {
}
return nil
}
func (m *QueryGroupsRequest) 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 ErrIntOverflowQuery
}
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: QueryGroupsRequest: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryGroupsRequest: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Pagination == nil {
m.Pagination = &query.PageRequest{}
}
if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func (m *QueryGroupsResponse) 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 ErrIntOverflowQuery
}
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: QueryGroupsResponse: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: QueryGroupsResponse: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Groups", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Groups = append(m.Groups, &GroupInfo{})
if err := m.Groups[len(m.Groups)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
msglen |= int(b&0x7F) << shift
if b < 0x80 {
break
}
}
if msglen < 0 {
return ErrInvalidLengthQuery
}
postIndex := iNdEx + msglen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
if m.Pagination == nil {
m.Pagination = &query.PageResponse{}
}
if err := m.Pagination.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipQuery(dAtA[iNdEx:])
if err != nil {
return err
}
if (skippy < 0) || (iNdEx+skippy) < 0 {
return ErrInvalidLengthQuery
}
if (iNdEx + skippy) > l {
return io.ErrUnexpectedEOF
}
iNdEx += skippy
}
}
if iNdEx > l {
return io.ErrUnexpectedEOF
}
return nil
}
func skipQuery(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0

View File

@ -901,6 +901,42 @@ func local_request_Query_TallyResult_0(ctx context.Context, marshaler runtime.Ma
}
var (
filter_Query_Groups_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)}
)
func request_Query_Groups_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryGroupsRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Groups_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := client.Groups(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Query_Groups_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq QueryGroupsRequest
var metadata runtime.ServerMetadata
if err := req.ParseForm(); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Query_Groups_0); err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
}
msg, err := server.Groups(ctx, &protoReq)
return msg, metadata, err
}
// RegisterQueryHandlerServer registers the http handlers for service Query to "mux".
// UnaryRPC :call QueryServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -1206,6 +1242,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv
})
mux.Handle("GET", pattern_Query_Groups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
var stream runtime.ServerTransportStream
ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Query_Groups_0(rctx, inboundMarshaler, server, req, pathParams)
md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Groups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -1507,6 +1566,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie
})
mux.Handle("GET", pattern_Query_Groups_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Query_Groups_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Query_Groups_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil
}
@ -1536,6 +1615,8 @@ var (
pattern_Query_GroupsByMember_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4}, []string{"cosmos", "group", "v1", "groups_by_member", "address"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_TallyResult_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 1, 0, 4, 1, 5, 4, 2, 5}, []string{"cosmos", "group", "v1", "proposals", "proposal_id", "tally"}, "", runtime.AssumeColonVerbOpt(false)))
pattern_Query_Groups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmos", "group", "v1", "groups"}, "", runtime.AssumeColonVerbOpt(false)))
)
var (
@ -1564,4 +1645,6 @@ var (
forward_Query_GroupsByMember_0 = runtime.ForwardResponseMessage
forward_Query_TallyResult_0 = runtime.ForwardResponseMessage
forward_Query_Groups_0 = runtime.ForwardResponseMessage
)