nameservice: queryRecords filter by attributes

This commit is contained in:
nabarun 2022-04-13 17:33:42 +05:30
parent 8f5449f397
commit d762ce98b3
6 changed files with 743 additions and 84 deletions

View File

@ -116,7 +116,14 @@ func (q queryResolver) LookupNames(ctx context.Context, names []string) ([]*Name
func (q queryResolver) QueryRecords(ctx context.Context, attributes []*KeyValueInput, all *bool) ([]*Record, error) { func (q queryResolver) QueryRecords(ctx context.Context, attributes []*KeyValueInput, all *bool) ([]*Record, error) {
nsQueryClient := nstypes.NewQueryClient(q.ctx) nsQueryClient := nstypes.NewQueryClient(q.ctx)
res, err := nsQueryClient.ListRecords(context.Background(), &nstypes.QueryListRecordsRequest{})
res, err := nsQueryClient.ListRecords(
context.Background(),
&nstypes.QueryListRecordsRequest{
Attributes: parseRequestAttributes(attributes),
},
)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -266,3 +266,26 @@ func mapToKeyValuePairs(attrs map[string]interface{}) ([]*KeyValue, error) {
return kvPairs, nil return kvPairs, nil
} }
func parseRequestAttributes(attrs []*KeyValueInput) []*nstypes.QueryListRecordsRequest_KeyValueInput {
kvPairs := []*nstypes.QueryListRecordsRequest_KeyValueInput{}
for _, value := range attrs {
kvPair := &nstypes.QueryListRecordsRequest_KeyValueInput{
Key: value.Key,
Value: &nstypes.QueryListRecordsRequest_ValueInput{},
}
if value.Value.String != nil {
kvPair.Value.String_ = *value.Value.String
}
if value.Value.Int != nil {
kvPair.Value.Int = int64(*value.Value.Int)
}
kvPairs = append(kvPairs, kvPair)
}
return kvPairs
}

View File

@ -68,8 +68,18 @@ message QueryParamsResponse{
// QueryListRecordsRequest is request type for nameservice records list // QueryListRecordsRequest is request type for nameservice records list
message QueryListRecordsRequest{ message QueryListRecordsRequest{
message ValueInput {
string string = 1;
int64 int = 2;
}
message KeyValueInput {
string key = 1;
ValueInput value = 2;
}
repeated KeyValueInput attributes = 1;
// pagination defines an optional pagination for the request. // pagination defines an optional pagination for the request.
cosmos.base.query.v1beta1.PageRequest pagination = 1; cosmos.base.query.v1beta1.PageRequest pagination = 2;
} }
// QueryListRecordsResponse is response type for nameservice records list // QueryListRecordsResponse is response type for nameservice records list

View File

@ -2,11 +2,18 @@ package keeper
import ( import (
"context" "context"
sdk "github.com/cosmos/cosmos-sdk/types" sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/tharsis/ethermint/x/nameservice/types" "github.com/tharsis/ethermint/x/nameservice/types"
) )
// BondIDAttributeName denotes the record bond ID.
const BondIDAttributeName = "bondId"
// ExpiryTimeAttributeName denotes the record expiry time.
const ExpiryTimeAttributeName = "expiryTime"
type Querier struct { type Querier struct {
Keeper Keeper
} }
@ -19,9 +26,19 @@ func (q Querier) Params(c context.Context, _ *types.QueryParamsRequest) (*types.
return &types.QueryParamsResponse{Params: &params}, nil return &types.QueryParamsResponse{Params: &params}, nil
} }
func (q Querier) ListRecords(c context.Context, _ *types.QueryListRecordsRequest) (*types.QueryListRecordsResponse, error) { func (q Querier) ListRecords(c context.Context, req *types.QueryListRecordsRequest) (*types.QueryListRecordsResponse, error) {
ctx := sdk.UnwrapSDKContext(c) ctx := sdk.UnwrapSDKContext(c)
records := q.Keeper.ListRecords(ctx) attributes := req.GetAttributes()
records := []types.Record{}
if len(attributes) > 0 {
records = q.Keeper.MatchRecords(ctx, func(record *types.RecordType) bool {
return MatchOnAttributes(record, attributes)
})
} else {
records = q.Keeper.ListRecords(ctx)
}
return &types.QueryListRecordsResponse{Records: records}, nil return &types.QueryListRecordsResponse{Records: records}, nil
} }
@ -95,3 +112,78 @@ func (q Querier) GetAuthorityExpiryQueue(c context.Context, _ *types.QueryGetAut
authorities := q.Keeper.GetAuthorityExpiryQueue(ctx) authorities := q.Keeper.GetAuthorityExpiryQueue(ctx)
return &types.QueryGetAuthorityExpiryQueueResponse{Authorities: authorities}, nil return &types.QueryGetAuthorityExpiryQueueResponse{Authorities: authorities}, nil
} }
func matchOnRecordField(record *types.RecordType, attr *types.QueryListRecordsRequest_KeyValueInput) (fieldFound bool, matched bool) {
fieldFound = false
matched = true
switch attr.Key {
case BondIDAttributeName:
{
fieldFound = true
if record.BondId != attr.Value.GetString_() {
matched = false
return
}
}
case ExpiryTimeAttributeName:
{
fieldFound = true
if record.ExpiryTime != attr.Value.GetString_() {
matched = false
return
}
}
}
return
}
func MatchOnAttributes(record *types.RecordType, attributes []*types.QueryListRecordsRequest_KeyValueInput) bool {
// Filter deleted records.
if record.Deleted {
return false
}
recAttrs := record.Attributes
for _, attr := range attributes {
// First try matching on record struct fields.
fieldFound, matched := matchOnRecordField(record, attr)
if fieldFound {
if !matched {
return false
}
continue
}
recAttrVal, recAttrFound := recAttrs[attr.Key]
if !recAttrFound {
return false
}
if attr.Value.Int != 0 {
recAttrValInt, ok := recAttrVal.(int)
if !ok || int(attr.Value.GetInt()) != recAttrValInt {
return false
}
}
if attr.Value.String_ != "" {
recAttrValString, ok := recAttrVal.(string)
if !ok {
return false
}
if attr.Value.GetString_() != recAttrValString {
return false
}
}
// TODO: Handle other attribute value types.
}
return true
}

View File

@ -127,6 +127,29 @@ func (k Keeper) ListRecords(ctx sdk.Context) []types.Record {
return records return records
} }
// MatchRecords - get all matching records.
func (k Keeper) MatchRecords(ctx sdk.Context, matchFn func(*types.RecordType) bool) []types.Record {
var records []types.Record
store := ctx.KVStore(k.storeKey)
itr := sdk.KVStorePrefixIterator(store, PrefixCIDToRecordIndex)
defer itr.Close()
for ; itr.Valid(); itr.Next() {
bz := store.Get(itr.Key())
if bz != nil {
var obj types.Record
k.cdc.MustUnmarshal(bz, &obj)
record := obj.ToRecordType()
// record := recordObjToRecord(store, codec, obj)
if matchFn(&record) {
records = append(records, obj)
}
}
}
return records
}
func (k Keeper) GetRecordExpiryQueue(ctx sdk.Context) []*types.ExpiryQueueRecord { func (k Keeper) GetRecordExpiryQueue(ctx sdk.Context) []*types.ExpiryQueueRecord {
var records []*types.ExpiryQueueRecord var records []*types.ExpiryQueueRecord
@ -200,7 +223,8 @@ func (k Keeper) processRecord(ctx sdk.Context, record *types.RecordType, isRenew
} }
record.CreateTime = ctx.BlockHeader().Time.Format(time.RFC3339) record.CreateTime = ctx.BlockHeader().Time.Format(time.RFC3339)
record.ExpiryTime = ctx.BlockHeader().Time.Add(params.RecordRentDuration).Format(time.RFC3339) // record.ExpiryTime = ctx.BlockHeader().Time.Add(params.RecordRentDuration).Format(time.RFC3339)
record.ExpiryTime = ctx.BlockHeader().Time.Add(time.Minute).Format(time.RFC3339)
record.Deleted = false record.Deleted = false
k.PutRecord(ctx, record.ToRecordObj()) k.PutRecord(ctx, record.ToRecordObj())

View File

@ -116,8 +116,9 @@ func (m *QueryParamsResponse) GetParams() *Params {
// QueryListRecordsRequest is request type for nameservice records list // QueryListRecordsRequest is request type for nameservice records list
type QueryListRecordsRequest struct { type QueryListRecordsRequest struct {
Attributes []*QueryListRecordsRequest_KeyValueInput `protobuf:"bytes,1,rep,name=attributes,proto3" json:"attributes,omitempty"`
// pagination defines an optional pagination for the request. // pagination defines an optional pagination for the request.
Pagination *query.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` Pagination *query.PageRequest `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"`
} }
func (m *QueryListRecordsRequest) Reset() { *m = QueryListRecordsRequest{} } func (m *QueryListRecordsRequest) Reset() { *m = QueryListRecordsRequest{} }
@ -153,6 +154,13 @@ func (m *QueryListRecordsRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_QueryListRecordsRequest proto.InternalMessageInfo var xxx_messageInfo_QueryListRecordsRequest proto.InternalMessageInfo
func (m *QueryListRecordsRequest) GetAttributes() []*QueryListRecordsRequest_KeyValueInput {
if m != nil {
return m.Attributes
}
return nil
}
func (m *QueryListRecordsRequest) GetPagination() *query.PageRequest { func (m *QueryListRecordsRequest) GetPagination() *query.PageRequest {
if m != nil { if m != nil {
return m.Pagination return m.Pagination
@ -160,6 +168,110 @@ func (m *QueryListRecordsRequest) GetPagination() *query.PageRequest {
return nil return nil
} }
type QueryListRecordsRequest_ValueInput struct {
String_ string `protobuf:"bytes,1,opt,name=string,proto3" json:"string,omitempty"`
Int int64 `protobuf:"varint,2,opt,name=int,proto3" json:"int,omitempty"`
}
func (m *QueryListRecordsRequest_ValueInput) Reset() { *m = QueryListRecordsRequest_ValueInput{} }
func (m *QueryListRecordsRequest_ValueInput) String() string { return proto.CompactTextString(m) }
func (*QueryListRecordsRequest_ValueInput) ProtoMessage() {}
func (*QueryListRecordsRequest_ValueInput) Descriptor() ([]byte, []int) {
return fileDescriptor_73d2465766c8f876, []int{2, 0}
}
func (m *QueryListRecordsRequest_ValueInput) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryListRecordsRequest_ValueInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryListRecordsRequest_ValueInput.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 *QueryListRecordsRequest_ValueInput) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryListRecordsRequest_ValueInput.Merge(m, src)
}
func (m *QueryListRecordsRequest_ValueInput) XXX_Size() int {
return m.Size()
}
func (m *QueryListRecordsRequest_ValueInput) XXX_DiscardUnknown() {
xxx_messageInfo_QueryListRecordsRequest_ValueInput.DiscardUnknown(m)
}
var xxx_messageInfo_QueryListRecordsRequest_ValueInput proto.InternalMessageInfo
func (m *QueryListRecordsRequest_ValueInput) GetString_() string {
if m != nil {
return m.String_
}
return ""
}
func (m *QueryListRecordsRequest_ValueInput) GetInt() int64 {
if m != nil {
return m.Int
}
return 0
}
type QueryListRecordsRequest_KeyValueInput struct {
Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
Value *QueryListRecordsRequest_ValueInput `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
}
func (m *QueryListRecordsRequest_KeyValueInput) Reset() { *m = QueryListRecordsRequest_KeyValueInput{} }
func (m *QueryListRecordsRequest_KeyValueInput) String() string { return proto.CompactTextString(m) }
func (*QueryListRecordsRequest_KeyValueInput) ProtoMessage() {}
func (*QueryListRecordsRequest_KeyValueInput) Descriptor() ([]byte, []int) {
return fileDescriptor_73d2465766c8f876, []int{2, 1}
}
func (m *QueryListRecordsRequest_KeyValueInput) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
func (m *QueryListRecordsRequest_KeyValueInput) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
return xxx_messageInfo_QueryListRecordsRequest_KeyValueInput.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 *QueryListRecordsRequest_KeyValueInput) XXX_Merge(src proto.Message) {
xxx_messageInfo_QueryListRecordsRequest_KeyValueInput.Merge(m, src)
}
func (m *QueryListRecordsRequest_KeyValueInput) XXX_Size() int {
return m.Size()
}
func (m *QueryListRecordsRequest_KeyValueInput) XXX_DiscardUnknown() {
xxx_messageInfo_QueryListRecordsRequest_KeyValueInput.DiscardUnknown(m)
}
var xxx_messageInfo_QueryListRecordsRequest_KeyValueInput proto.InternalMessageInfo
func (m *QueryListRecordsRequest_KeyValueInput) GetKey() string {
if m != nil {
return m.Key
}
return ""
}
func (m *QueryListRecordsRequest_KeyValueInput) GetValue() *QueryListRecordsRequest_ValueInput {
if m != nil {
return m.Value
}
return nil
}
// QueryListRecordsResponse is response type for nameservice records list // QueryListRecordsResponse is response type for nameservice records list
type QueryListRecordsResponse struct { type QueryListRecordsResponse struct {
Records []Record `protobuf:"bytes,1,rep,name=records,proto3" json:"records"` Records []Record `protobuf:"bytes,1,rep,name=records,proto3" json:"records"`
@ -1174,6 +1286,8 @@ func init() {
proto.RegisterType((*QueryParamsRequest)(nil), "vulcanize.nameservice.v1beta1.QueryParamsRequest") proto.RegisterType((*QueryParamsRequest)(nil), "vulcanize.nameservice.v1beta1.QueryParamsRequest")
proto.RegisterType((*QueryParamsResponse)(nil), "vulcanize.nameservice.v1beta1.QueryParamsResponse") proto.RegisterType((*QueryParamsResponse)(nil), "vulcanize.nameservice.v1beta1.QueryParamsResponse")
proto.RegisterType((*QueryListRecordsRequest)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsRequest") proto.RegisterType((*QueryListRecordsRequest)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsRequest")
proto.RegisterType((*QueryListRecordsRequest_ValueInput)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsRequest.ValueInput")
proto.RegisterType((*QueryListRecordsRequest_KeyValueInput)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsRequest.KeyValueInput")
proto.RegisterType((*QueryListRecordsResponse)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsResponse") proto.RegisterType((*QueryListRecordsResponse)(nil), "vulcanize.nameservice.v1beta1.QueryListRecordsResponse")
proto.RegisterType((*QueryRecordByIdRequest)(nil), "vulcanize.nameservice.v1beta1.QueryRecordByIdRequest") proto.RegisterType((*QueryRecordByIdRequest)(nil), "vulcanize.nameservice.v1beta1.QueryRecordByIdRequest")
proto.RegisterType((*QueryRecordByIdResponse)(nil), "vulcanize.nameservice.v1beta1.QueryRecordByIdResponse") proto.RegisterType((*QueryRecordByIdResponse)(nil), "vulcanize.nameservice.v1beta1.QueryRecordByIdResponse")
@ -1202,84 +1316,90 @@ func init() {
} }
var fileDescriptor_73d2465766c8f876 = []byte{ var fileDescriptor_73d2465766c8f876 = []byte{
// 1218 bytes of a gzipped FileDescriptorProto // 1313 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4d, 0x6c, 0xdc, 0x44, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0x4f, 0x6c, 0xdc, 0xc4,
0x14, 0xce, 0x6c, 0x9a, 0x94, 0xbc, 0x40, 0x42, 0x86, 0x88, 0xa6, 0x6e, 0xbb, 0x09, 0x6e, 0x7e, 0x17, 0xce, 0x64, 0x9b, 0xf4, 0x97, 0xb7, 0xbf, 0x26, 0x64, 0x88, 0xda, 0xd4, 0x4d, 0x37, 0xc5,
0x36, 0x90, 0xb5, 0xb3, 0x29, 0x4d, 0xdb, 0x54, 0x20, 0xb2, 0x21, 0x44, 0xad, 0x0a, 0x22, 0x06, 0xcd, 0x9f, 0x0d, 0x64, 0xed, 0x6c, 0x4a, 0xd3, 0x36, 0x15, 0x88, 0x6c, 0x1a, 0xa2, 0x94, 0x82,
0x29, 0x88, 0x03, 0x95, 0x77, 0x3d, 0x6c, 0x4c, 0x77, 0x3d, 0x5b, 0xff, 0xa4, 0x5d, 0xaa, 0x5e, 0x88, 0x41, 0x04, 0x71, 0xa0, 0xf2, 0xee, 0x0e, 0x1b, 0x93, 0x5d, 0xcf, 0xd6, 0x1e, 0x27, 0xdd,
0x38, 0xf4, 0x8c, 0xc4, 0x19, 0x04, 0x12, 0xa7, 0x4a, 0x85, 0x6b, 0xef, 0x5c, 0x22, 0x4e, 0x95, 0x56, 0xbd, 0x70, 0x28, 0x57, 0x24, 0xce, 0x20, 0x90, 0x38, 0x55, 0x02, 0xae, 0xbd, 0x73, 0x89,
0xe0, 0xc0, 0x29, 0xa0, 0x04, 0x89, 0x7b, 0x8f, 0x9c, 0x90, 0x67, 0xc6, 0x8e, 0x9d, 0xdd, 0xc4, 0x38, 0x55, 0x82, 0x03, 0xa7, 0x80, 0x12, 0x24, 0xee, 0x3d, 0x72, 0x42, 0x1e, 0x8f, 0xbd, 0x76,
0xf6, 0x36, 0x95, 0x38, 0xc5, 0x9e, 0x79, 0xdf, 0x7b, 0xdf, 0xf7, 0xde, 0xcc, 0xf3, 0xdb, 0xc0, 0xb2, 0x89, 0xbd, 0x9b, 0x20, 0x71, 0x8a, 0x77, 0xe6, 0xfd, 0xf9, 0xbe, 0xf7, 0x66, 0x9e, 0x3f,
0xec, 0x96, 0x57, 0xaf, 0xea, 0x96, 0xf9, 0x25, 0x51, 0x2d, 0xbd, 0x41, 0x1c, 0x62, 0x6f, 0x99, 0x07, 0xa6, 0x36, 0x9d, 0x6a, 0x49, 0x37, 0x8d, 0x07, 0x44, 0x35, 0xf5, 0x1a, 0xb1, 0x89, 0xb5,
0x55, 0xa2, 0x6e, 0x95, 0x2a, 0xc4, 0xd5, 0x4b, 0xea, 0x6d, 0x8f, 0xd8, 0x2d, 0xa5, 0x69, 0x53, 0x69, 0x94, 0x88, 0xba, 0x99, 0x2f, 0x12, 0xa6, 0xe7, 0xd5, 0x7b, 0x0e, 0xb1, 0x1a, 0x4a, 0xdd,
0x97, 0xe2, 0x73, 0xa1, 0xa9, 0x12, 0x31, 0x55, 0x84, 0xa9, 0xa4, 0x1e, 0xed, 0x29, 0x0a, 0x61, 0xa2, 0x8c, 0xe2, 0x8b, 0x81, 0xa9, 0x12, 0x32, 0x55, 0x84, 0xa9, 0xa4, 0x1e, 0x1d, 0x29, 0xec,
0xfe, 0xa4, 0xb3, 0x35, 0x4a, 0x6b, 0x75, 0xa2, 0xea, 0x4d, 0x53, 0xd5, 0x2d, 0x8b, 0xba, 0xba, 0xc2, 0xe3, 0x49, 0x23, 0x15, 0x4a, 0x2b, 0x55, 0xa2, 0xea, 0x75, 0x43, 0xd5, 0x4d, 0x93, 0x32,
0x6b, 0x52, 0xcb, 0x11, 0xbb, 0xaf, 0x57, 0xa9, 0xd3, 0xa0, 0x8e, 0x5a, 0xd1, 0x1d, 0xc2, 0x69, 0x9d, 0x19, 0xd4, 0xb4, 0xc5, 0xee, 0xcb, 0x25, 0x6a, 0xd7, 0xa8, 0xad, 0x16, 0x75, 0x9b, 0x78,
0x84, 0xae, 0x9a, 0x7a, 0xcd, 0xb4, 0x98, 0xb1, 0xb0, 0x1d, 0xad, 0xd1, 0x1a, 0x65, 0x8f, 0xaa, 0x30, 0x82, 0x50, 0x75, 0xbd, 0x62, 0x98, 0xdc, 0x58, 0xd8, 0x0e, 0x55, 0x68, 0x85, 0xf2, 0x47,
0xff, 0x24, 0x56, 0xf3, 0x51, 0x0f, 0x01, 0xb6, 0x4a, 0x4d, 0x81, 0x92, 0x47, 0x01, 0xaf, 0xfb, 0xd5, 0x7d, 0x12, 0xab, 0x99, 0x70, 0x04, 0xdf, 0xb7, 0x44, 0x0d, 0xe1, 0x25, 0x0f, 0x01, 0x5e,
0x7e, 0x3f, 0xd4, 0x6d, 0xbd, 0xe1, 0x68, 0xe4, 0xb6, 0x47, 0x1c, 0x57, 0xfe, 0x18, 0x5e, 0x89, 0x75, 0xe3, 0xbe, 0xab, 0x5b, 0x7a, 0xcd, 0xd6, 0xc8, 0x3d, 0x87, 0xd8, 0x4c, 0x7e, 0x1f, 0x5e,
0xad, 0x3a, 0x4d, 0x6a, 0x39, 0x04, 0xbf, 0x05, 0xfd, 0x4d, 0xb6, 0x32, 0x86, 0x26, 0x50, 0x61, 0x8c, 0xac, 0xda, 0x75, 0x6a, 0xda, 0x04, 0xbf, 0x06, 0xbd, 0x75, 0xbe, 0x32, 0x8c, 0x2e, 0xa1,
0x70, 0x61, 0x4a, 0x39, 0x32, 0x1b, 0x8a, 0x80, 0x0b, 0x90, 0xac, 0xc3, 0x29, 0xe6, 0xf5, 0x86, 0x6c, 0x7a, 0x76, 0x5c, 0x39, 0xb2, 0x1a, 0x8a, 0x70, 0x17, 0x4e, 0xf2, 0xe7, 0x29, 0x38, 0xc7,
0xe9, 0xb8, 0x1a, 0xa9, 0x52, 0xdb, 0x08, 0x02, 0xe2, 0xf7, 0x00, 0xf6, 0x05, 0x09, 0xef, 0xd3, 0xc3, 0xde, 0x31, 0x6c, 0xa6, 0x91, 0x12, 0xb5, 0xca, 0x7e, 0x46, 0x5c, 0x06, 0xd0, 0x19, 0xb3,
0x0a, 0xe7, 0xae, 0xf8, 0xdc, 0x15, 0x5e, 0x84, 0x7d, 0xcf, 0x35, 0x22, 0xb0, 0x5a, 0x04, 0x29, 0x8c, 0xa2, 0xc3, 0x88, 0x1b, 0x3e, 0x95, 0x4d, 0xcf, 0xde, 0x8a, 0x09, 0x7f, 0x48, 0x2c, 0xe5,
0x3f, 0x44, 0x30, 0xd6, 0x1e, 0x43, 0xd0, 0x5f, 0x85, 0x93, 0x36, 0x5f, 0x1a, 0x43, 0x13, 0xbd, 0x2d, 0xd2, 0xf8, 0x40, 0xaf, 0x3a, 0x64, 0xc5, 0xac, 0x3b, 0x4c, 0x0b, 0xc5, 0xc5, 0x6f, 0x02,
0x29, 0xf8, 0x73, 0x07, 0xe5, 0x13, 0xdb, 0x3b, 0xe3, 0x3d, 0x5a, 0x80, 0xc5, 0x6b, 0x31, 0xae, 0x34, 0xeb, 0x36, 0xdc, 0xcd, 0x49, 0x4c, 0x28, 0x5e, 0x89, 0x14, 0xb7, 0x44, 0x8a, 0xd7, 0xeb,
0x39, 0xc6, 0x75, 0x26, 0x91, 0x2b, 0xe7, 0x10, 0x23, 0x5b, 0x80, 0x57, 0x19, 0x57, 0x11, 0xa6, 0x26, 0x81, 0x0a, 0x11, 0x51, 0xb5, 0x90, 0xa7, 0x54, 0x00, 0x68, 0x66, 0xc0, 0x23, 0xd0, 0x6b,
0x75, 0xcd, 0x08, 0xd2, 0x31, 0x04, 0x39, 0xd3, 0x60, 0x69, 0x18, 0xd0, 0x72, 0xa6, 0x21, 0x7f, 0x33, 0xcb, 0x30, 0x2b, 0xbc, 0x2c, 0x7d, 0x85, 0x53, 0xdb, 0x3b, 0xa3, 0x48, 0x13, 0x6b, 0xf8,
0x26, 0x32, 0x17, 0xb5, 0x14, 0xa2, 0x56, 0xa0, 0x9f, 0x13, 0x4b, 0x59, 0x93, 0x98, 0x26, 0x01, 0x2c, 0xa4, 0x0c, 0x93, 0xf1, 0x64, 0x29, 0xb1, 0xe5, 0x2e, 0x48, 0x0f, 0xe0, 0x4c, 0x04, 0x28,
0x95, 0x5d, 0x90, 0x62, 0xfe, 0xcb, 0xd4, 0x32, 0x0e, 0x65, 0x73, 0xa0, 0x58, 0xb9, 0xae, 0x8b, 0x7e, 0x01, 0x52, 0x1b, 0xa4, 0xe1, 0xc5, 0xd0, 0xdc, 0x47, 0xbc, 0x06, 0x3d, 0x9b, 0xee, 0xbe,
0xf5, 0x08, 0xc1, 0x99, 0x8e, 0x61, 0xff, 0xa7, 0xf5, 0x9a, 0x04, 0x79, 0x8d, 0xb8, 0x1f, 0xe8, 0x40, 0xba, 0xd0, 0x61, 0x3d, 0x42, 0xc5, 0xf0, 0xe2, 0xc9, 0x4f, 0x10, 0x0c, 0x1f, 0xb4, 0x16,
0x0d, 0xf2, 0x11, 0x0f, 0xfc, 0x3e, 0x35, 0xbc, 0x3a, 0x29, 0xeb, 0x75, 0xdd, 0xaa, 0x06, 0x0a, 0x5d, 0x5e, 0x82, 0xd3, 0x96, 0xb7, 0x24, 0xfa, 0x10, 0xd7, 0x66, 0x2f, 0x00, 0xe7, 0xd6, 0xa5,
0xe5, 0x26, 0x9c, 0x3f, 0xd2, 0x4a, 0x88, 0xbb, 0x06, 0x2f, 0x54, 0xf8, 0x52, 0xa0, 0xae, 0x98, 0xf9, 0xbe, 0x78, 0xb9, 0x45, 0xad, 0x27, 0x63, 0x6b, 0xed, 0x61, 0x08, 0x17, 0x5b, 0xce, 0xc2,
0xa0, 0x6e, 0xb9, 0x5a, 0xa5, 0x9e, 0xe5, 0x06, 0x8e, 0x42, 0xb8, 0xfc, 0x0f, 0x82, 0xa1, 0xf8, 0x59, 0x8e, 0x55, 0xa4, 0x69, 0xac, 0x94, 0xfd, 0x43, 0xd3, 0x0f, 0xdd, 0x46, 0x59, 0x14, 0xac,
0x26, 0xbe, 0x01, 0x2f, 0xea, 0x7c, 0xe5, 0xa6, 0xef, 0x8a, 0x17, 0xaf, 0x3c, 0xfb, 0x74, 0x67, 0xdb, 0x28, 0xcb, 0x1f, 0x8b, 0xf3, 0x15, 0xb6, 0x14, 0xa4, 0x16, 0xa1, 0xd7, 0x03, 0x96, 0xf0,
0x7c, 0xea, 0x0b, 0x87, 0x5a, 0x4b, 0xb2, 0xd8, 0xf5, 0x69, 0xca, 0x13, 0x2d, 0xbd, 0x51, 0x8f, 0xe8, 0x46, 0x38, 0x09, 0x57, 0x99, 0x81, 0x14, 0x89, 0x5f, 0xa0, 0x66, 0xf9, 0x50, 0x34, 0x27,
0x2f, 0x69, 0x83, 0x91, 0x37, 0xfc, 0x00, 0xc1, 0x49, 0x11, 0x6d, 0xac, 0x97, 0x71, 0x3d, 0x1d, 0x75, 0xd8, 0xe4, 0xef, 0x11, 0x5c, 0x68, 0x99, 0xf6, 0x3f, 0xda, 0xaf, 0x31, 0x90, 0x97, 0x09,
0xcb, 0x5f, 0xc0, 0x70, 0x85, 0x9a, 0x56, 0x79, 0xdd, 0xcf, 0xfe, 0xd3, 0x9d, 0xf1, 0x73, 0x3c, 0x7b, 0x47, 0xaf, 0x91, 0xf7, 0xbc, 0xc4, 0x6f, 0xd3, 0xb2, 0x53, 0x25, 0x05, 0xbd, 0xaa, 0x9b,
0x90, 0xc0, 0x05, 0x41, 0x82, 0xd7, 0x87, 0x7f, 0x8e, 0x17, 0x6a, 0xa6, 0xbb, 0xe9, 0x55, 0x94, 0x25, 0x9f, 0xa1, 0x5c, 0x87, 0xcb, 0x47, 0x5a, 0x09, 0x72, 0x2b, 0xf0, 0xbf, 0xa2, 0xb7, 0xe4,
0x2a, 0x6d, 0xa8, 0xa2, 0x4b, 0xf1, 0x3f, 0x45, 0xc7, 0xb8, 0xa5, 0xba, 0xad, 0x26, 0x71, 0x98, 0xb3, 0xcb, 0xc5, 0xb0, 0x5b, 0x28, 0x95, 0xa8, 0x63, 0x32, 0x3f, 0x50, 0xe0, 0x2e, 0xff, 0x85,
0x47, 0x47, 0x0b, 0x82, 0xcb, 0x44, 0x1c, 0x18, 0xff, 0x76, 0xfb, 0xcc, 0x9e, 0x53, 0x17, 0x79, 0xa0, 0x3f, 0xba, 0x89, 0xef, 0xc0, 0xff, 0x75, 0x6f, 0xe5, 0xae, 0x1b, 0x4a, 0xdc, 0xdf, 0xa9,
0x84, 0xe0, 0x6c, 0xe7, 0x38, 0xa2, 0x78, 0xef, 0x42, 0x1f, 0xab, 0x90, 0xa8, 0x5c, 0x21, 0xa1, 0xe7, 0x3b, 0xa3, 0xe3, 0x9f, 0xda, 0xd4, 0x9c, 0x97, 0xc5, 0xae, 0x0b, 0x53, 0xbe, 0xd4, 0xd0,
0x72, 0xbe, 0x8b, 0x55, 0xcb, 0xb5, 0x5b, 0xe2, 0x68, 0x72, 0xf0, 0xf1, 0x1d, 0xcc, 0x19, 0x18, 0x6b, 0xd5, 0xe8, 0x92, 0x96, 0x0e, 0xfd, 0xc2, 0x8f, 0x11, 0x9c, 0x16, 0xd9, 0x86, 0x53, 0x1c,
0x61, 0x74, 0x37, 0x36, 0xa9, 0x19, 0x26, 0x03, 0xc3, 0x89, 0xfd, 0xd2, 0x6b, 0xec, 0x59, 0xfe, 0xeb, 0xf9, 0x48, 0xfd, 0x7c, 0x84, 0x8b, 0xd4, 0x30, 0x0b, 0xab, 0x6e, 0xf5, 0x9f, 0xef, 0x8c,
0x16, 0x89, 0x76, 0x2f, 0x2c, 0x85, 0x9c, 0x07, 0x08, 0x86, 0xfc, 0xfd, 0x9b, 0xba, 0xe7, 0x6e, 0x5e, 0xf4, 0x12, 0x09, 0x3f, 0x3f, 0x89, 0xff, 0xf3, 0xc9, 0xef, 0xa3, 0xd9, 0x8a, 0xc1, 0xd6,
0x52, 0xdb, 0x74, 0x5b, 0x22, 0x79, 0x73, 0x29, 0x84, 0x2d, 0x07, 0x98, 0x72, 0x49, 0x54, 0x7e, 0x9d, 0xa2, 0x52, 0xa2, 0x35, 0x55, 0x0c, 0x73, 0xef, 0x4f, 0xce, 0x2e, 0x6f, 0xa8, 0xac, 0x51,
0x96, 0x57, 0xde, 0x8a, 0x6e, 0x06, 0xf5, 0x8f, 0x2f, 0x6a, 0x2f, 0xc5, 0xdf, 0x65, 0x18, 0xe2, 0x27, 0x36, 0x8f, 0x68, 0x6b, 0x7e, 0x72, 0x99, 0x88, 0x03, 0xe3, 0xde, 0x6e, 0x17, 0xd9, 0xbe,
0x79, 0xa7, 0xf4, 0x96, 0xd7, 0xdc, 0xb0, 0x2d, 0xfc, 0x32, 0xf4, 0xde, 0xb1, 0x2d, 0x21, 0xc2, 0x59, 0x1b, 0x3d, 0x98, 0xe8, 0x38, 0x07, 0x73, 0xa4, 0x75, 0x1e, 0xd1, 0xbc, 0x5b, 0xd0, 0xc3,
0x7f, 0x94, 0x37, 0x44, 0xd7, 0x0c, 0x6d, 0x22, 0x9f, 0xa7, 0x7d, 0xc5, 0x83, 0x0b, 0xb3, 0x29, 0x3b, 0x24, 0x3a, 0x97, 0x8d, 0xe9, 0x9c, 0x1b, 0x62, 0xc9, 0x64, 0x56, 0x43, 0x1c, 0x4d, 0xcf,
0xb8, 0xf3, 0xba, 0x8a, 0xe4, 0x9c, 0x87, 0x61, 0xd1, 0x8d, 0x1c, 0x5a, 0xdf, 0x22, 0x9d, 0xa3, 0xf9, 0xe4, 0x0e, 0xe6, 0x24, 0x0c, 0x72, 0xb8, 0x6b, 0xeb, 0xd4, 0x08, 0x8a, 0x81, 0xe1, 0x54,
0x7f, 0x12, 0x76, 0xe2, 0xc0, 0x28, 0xfa, 0x75, 0xec, 0xa2, 0x13, 0x87, 0x3d, 0xb8, 0x0a, 0xa7, 0xb3, 0xf5, 0x1a, 0x7f, 0x96, 0xbf, 0x42, 0xe2, 0xad, 0x28, 0x2c, 0x05, 0x9d, 0xc7, 0x08, 0xfa,
0x99, 0xe7, 0x35, 0x22, 0x3e, 0x5c, 0xab, 0x77, 0x9b, 0xa6, 0xdd, 0x5a, 0xf7, 0x88, 0x47, 0x8e, 0xdd, 0xfd, 0xbb, 0xba, 0xc3, 0xd6, 0xa9, 0x65, 0xb0, 0x86, 0x28, 0xde, 0x74, 0x02, 0x62, 0x0b,
0xed, 0x64, 0x3f, 0x46, 0xf0, 0xda, 0xa1, 0x51, 0x42, 0x25, 0xd7, 0x0f, 0x36, 0xde, 0xf9, 0x04, 0xbe, 0x4f, 0x21, 0x2f, 0x3a, 0x3f, 0xe5, 0x75, 0xde, 0x0c, 0x6f, 0xfa, 0xfd, 0x8f, 0x2e, 0x6a,
0x29, 0x31, 0x27, 0x4c, 0xd5, 0xf1, 0x77, 0xdf, 0x2b, 0x30, 0xd2, 0x16, 0xa6, 0xed, 0xd3, 0x34, 0x67, 0xa2, 0xbf, 0x65, 0xe8, 0xf7, 0xea, 0x4e, 0xe9, 0x86, 0x53, 0x5f, 0xb3, 0x4c, 0xf7, 0xdd,
0x0a, 0x7d, 0x5b, 0x7a, 0xdd, 0x23, 0x63, 0xb9, 0x89, 0xde, 0xc2, 0x80, 0xc6, 0x5f, 0xe4, 0xcf, 0xb1, 0x65, 0x99, 0xfe, 0xbb, 0x63, 0xcb, 0x32, 0xe5, 0x35, 0x31, 0x35, 0x03, 0x9b, 0xd0, 0x5b,
0xc5, 0x75, 0x5e, 0x23, 0x6e, 0x78, 0xd6, 0x9e, 0x47, 0x76, 0x7f, 0x41, 0x30, 0x79, 0x54, 0xa0, 0xbc, 0xc9, 0x38, 0x3d, 0x3b, 0x95, 0x00, 0xbb, 0xd7, 0x57, 0x51, 0x9c, 0xcb, 0x30, 0x20, 0xa6,
0x30, 0xc1, 0x1a, 0x0c, 0x06, 0x57, 0xcd, 0x24, 0xdd, 0x27, 0x39, 0xea, 0xe4, 0xd8, 0x12, 0xbd, 0x91, 0x4d, 0xab, 0x9b, 0xa4, 0x75, 0xf6, 0x0f, 0x83, 0x49, 0xec, 0x1b, 0x85, 0x45, 0x44, 0x07,
0xf0, 0xef, 0x30, 0xf4, 0x31, 0x15, 0xf8, 0x3b, 0x04, 0xfd, 0x7c, 0x86, 0xc3, 0xa5, 0x04, 0x72, 0x93, 0x38, 0x98, 0xc1, 0x25, 0x38, 0xcf, 0x23, 0x2f, 0x13, 0xf1, 0xe2, 0x5a, 0xba, 0x5f, 0x37,
0xed, 0x43, 0xa4, 0xb4, 0x90, 0x05, 0xc2, 0x79, 0xc8, 0xc5, 0xaf, 0x7e, 0xfb, 0xfb, 0x9b, 0xdc, 0xac, 0xc6, 0xaa, 0x43, 0x1c, 0x72, 0x62, 0x27, 0xfb, 0x29, 0x82, 0x97, 0x0e, 0xcd, 0x12, 0x30,
0x0c, 0x9e, 0x4a, 0x18, 0xa4, 0xf9, 0x44, 0x89, 0x7f, 0x42, 0x30, 0x18, 0x99, 0xf4, 0xf0, 0x62, 0xb9, 0xbd, 0x7f, 0xf0, 0xce, 0xc4, 0x50, 0x89, 0x04, 0xe1, 0xac, 0x4e, 0x7e, 0xfa, 0xde, 0x80,
0x9a, 0x90, 0xed, 0xe3, 0xa7, 0x74, 0x29, 0x33, 0x4e, 0xf0, 0x55, 0x18, 0xdf, 0x02, 0x9e, 0x4e, 0xc1, 0x03, 0x69, 0x0e, 0xbc, 0x9a, 0x86, 0x9a, 0xc2, 0x22, 0x95, 0xed, 0xf3, 0x55, 0xc1, 0x27,
0xe0, 0x1b, 0xdc, 0x86, 0x9f, 0x11, 0x0c, 0x84, 0x57, 0x0f, 0x5f, 0x4c, 0x13, 0xb6, 0x6d, 0x3a, 0xe2, 0x3a, 0x2f, 0x13, 0x16, 0x9c, 0xb5, 0x7f, 0xa3, 0xba, 0x3f, 0x21, 0x18, 0x3b, 0x2a, 0x51,
0x94, 0x16, 0xb3, 0xc2, 0x04, 0xd9, 0x0b, 0x8c, 0x6c, 0x11, 0xbf, 0x91, 0x8e, 0xac, 0x7a, 0xcf, 0x50, 0x60, 0x0d, 0xd2, 0xfe, 0x55, 0x33, 0x48, 0xe7, 0x45, 0x0e, 0x07, 0x39, 0xb1, 0x42, 0xcf,
0x34, 0xee, 0xe3, 0x5f, 0x11, 0x8c, 0x84, 0x8c, 0x83, 0x11, 0x0d, 0x5f, 0xc9, 0x42, 0x21, 0x36, 0xfe, 0x3d, 0x00, 0x3d, 0x9c, 0x05, 0xfe, 0x1a, 0x41, 0xaf, 0x27, 0x75, 0x71, 0x3e, 0x89, 0x44,
0x4d, 0x4a, 0x4b, 0xdd, 0x40, 0x85, 0x82, 0xb7, 0x99, 0x82, 0xcb, 0x78, 0x31, 0x9d, 0x82, 0x62, 0x8b, 0x68, 0x6d, 0x69, 0xb6, 0x1d, 0x17, 0x0f, 0x87, 0x9c, 0xfb, 0xec, 0x97, 0x3f, 0xbf, 0xec,
0xa5, 0x55, 0xac, 0x50, 0xcb, 0x28, 0x9a, 0x06, 0x17, 0xf3, 0x3b, 0x82, 0x33, 0x47, 0x0c, 0x67, 0x9e, 0xc4, 0xe3, 0x31, 0xdf, 0x1b, 0x9e, 0xf0, 0xc6, 0x3f, 0x20, 0x48, 0x87, 0x94, 0x1e, 0x9e,
0x78, 0x39, 0x81, 0x5b, 0xf2, 0xf8, 0x27, 0x95, 0x9f, 0xc5, 0x45, 0xc6, 0x53, 0x25, 0xc6, 0x22, 0xeb, 0x4c, 0x48, 0x4a, 0xd7, 0xda, 0xf6, 0x13, 0x78, 0x15, 0x8e, 0x37, 0x8b, 0x27, 0x62, 0xf0,
0xfc, 0x18, 0xc1, 0xf0, 0x81, 0x51, 0x05, 0x2f, 0xa5, 0x3d, 0xd2, 0xed, 0x73, 0x94, 0x74, 0xb5, 0xfa, 0xb7, 0xe1, 0x47, 0x04, 0x7d, 0xc1, 0xd5, 0xc3, 0x57, 0x93, 0xa4, 0x3d, 0xa0, 0x0e, 0xa5,
0x2b, 0xac, 0x20, 0x3f, 0xc7, 0xc8, 0x4f, 0xe3, 0xc9, 0x34, 0xbf, 0x85, 0xf1, 0x0f, 0x08, 0xfa, 0xb9, 0x76, 0xdd, 0x04, 0xd8, 0x2b, 0x1c, 0x6c, 0x0e, 0xbf, 0x92, 0x0c, 0xac, 0xfa, 0xd0, 0x28,
0xd8, 0x30, 0x82, 0xe7, 0xd3, 0x04, 0x8d, 0x4e, 0x38, 0x52, 0x29, 0x03, 0x22, 0xe3, 0x15, 0xb8, 0x3f, 0xc2, 0x3f, 0x23, 0x18, 0x0c, 0x10, 0xfb, 0x12, 0x0d, 0xdf, 0x68, 0x07, 0x42, 0x44, 0x4d,
0xe3, 0xa3, 0xd4, 0x7b, 0xfe, 0xd6, 0x7d, 0xfc, 0x3d, 0x82, 0x81, 0xfd, 0x89, 0xa4, 0x98, 0x2a, 0x4a, 0xf3, 0x9d, 0xb8, 0x0a, 0x06, 0xaf, 0x73, 0x06, 0xd7, 0xf1, 0x5c, 0x32, 0x06, 0xb9, 0x62,
0x39, 0x81, 0xb9, 0x74, 0x31, 0x93, 0x79, 0xe6, 0x46, 0x58, 0x67, 0x48, 0xfc, 0x23, 0x02, 0x88, 0x23, 0x57, 0xa4, 0x66, 0x39, 0x67, 0x94, 0x3d, 0x32, 0xbf, 0x22, 0xb8, 0x70, 0x84, 0x38, 0xc3,
0xcc, 0x2d, 0x4a, 0xba, 0x3b, 0x16, 0xd8, 0xa7, 0xed, 0x28, 0x07, 0x47, 0x9e, 0x0c, 0xed, 0x8f, 0x71, 0x1f, 0x22, 0xf1, 0xf2, 0x4f, 0x2a, 0x1c, 0x27, 0x44, 0x9b, 0xa7, 0x4a, 0xc8, 0x22, 0xfc,
0x41, 0xf1, 0x36, 0x82, 0xd1, 0x8e, 0xf3, 0xcd, 0xe5, 0x34, 0x04, 0x3a, 0x21, 0xa5, 0x77, 0xba, 0x14, 0xc1, 0xc0, 0x3e, 0xa9, 0x82, 0xe7, 0x93, 0x1e, 0xe9, 0x83, 0x3a, 0x4a, 0xba, 0xd9, 0x91,
0x45, 0x86, 0x22, 0xde, 0x64, 0x22, 0x14, 0x3c, 0x97, 0xaa, 0xa9, 0x14, 0x09, 0x73, 0xe1, 0xb7, 0xaf, 0x00, 0x3f, 0xcd, 0xc1, 0x4f, 0xe0, 0xb1, 0x24, 0xff, 0x32, 0xc0, 0xdf, 0x22, 0xe8, 0xe1,
0x92, 0x53, 0x87, 0xcd, 0x13, 0x57, 0x53, 0x72, 0xea, 0x04, 0x96, 0x56, 0x9e, 0x01, 0x1c, 0x6a, 0x62, 0x04, 0xcf, 0x24, 0x49, 0x1a, 0x56, 0x38, 0x52, 0xbe, 0x0d, 0x8f, 0x36, 0xaf, 0xc0, 0x96,
0xba, 0xc4, 0x34, 0x95, 0xb0, 0x9a, 0xa0, 0x29, 0x1c, 0xf8, 0x85, 0xac, 0xf2, 0xf5, 0xed, 0xdd, 0xeb, 0xa5, 0x3e, 0x74, 0xb7, 0x1e, 0xe1, 0x6f, 0x10, 0xf4, 0x35, 0x15, 0x49, 0x2e, 0x51, 0x71,
0x3c, 0x7a, 0xb2, 0x9b, 0x47, 0x7f, 0xed, 0xe6, 0xd1, 0xd7, 0x7b, 0xf9, 0x9e, 0x27, 0x7b, 0xf9, 0x7c, 0x73, 0xe9, 0x6a, 0x5b, 0xe6, 0x6d, 0x0f, 0xc2, 0x2a, 0xf7, 0xc4, 0xdf, 0x21, 0x80, 0x90,
0x9e, 0x3f, 0xf6, 0xf2, 0x3d, 0x9f, 0xce, 0x47, 0x7e, 0xae, 0xb9, 0x9b, 0xba, 0xed, 0x98, 0x8e, 0x6e, 0x51, 0x92, 0xdd, 0x31, 0xdf, 0x3e, 0xe9, 0x44, 0xd9, 0x2f, 0x79, 0xda, 0x18, 0x7f, 0xdc,
0x4a, 0xdc, 0x4d, 0x62, 0x37, 0x4c, 0xcb, 0x55, 0xef, 0xc6, 0xdc, 0xb3, 0x1f, 0x6f, 0x95, 0x7e, 0x15, 0x6f, 0x23, 0x18, 0x6a, 0xa9, 0x6f, 0xae, 0x27, 0x01, 0xd0, 0xca, 0x53, 0x7a, 0xa3, 0x53,
0xf6, 0x2f, 0xa6, 0x0b, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x7c, 0xa9, 0x7f, 0x91, 0x5f, 0x13, 0xcf, 0x80, 0xc4, 0xab, 0x9c, 0x84, 0x82, 0xa7, 0x13, 0x0d, 0x95, 0x1c, 0xe1, 0x21, 0xdc, 0x51,
0x00, 0x00, 0x72, 0xee, 0x30, 0x3d, 0x71, 0x33, 0x21, 0xa6, 0x56, 0xce, 0xd2, 0xe2, 0x31, 0x9c, 0x03, 0x4e,
0xd7, 0x38, 0xa7, 0x3c, 0x56, 0x63, 0x38, 0x05, 0x82, 0x5f, 0xd0, 0x2a, 0xdc, 0xde, 0xde, 0xcd,
0xa0, 0x67, 0xbb, 0x19, 0xf4, 0xc7, 0x6e, 0x06, 0x7d, 0xb1, 0x97, 0xe9, 0x7a, 0xb6, 0x97, 0xe9,
0xfa, 0x6d, 0x2f, 0xd3, 0xf5, 0xd1, 0x4c, 0xe8, 0x73, 0x8d, 0xad, 0xeb, 0x96, 0x6d, 0xd8, 0x2a,
0x61, 0xeb, 0xc4, 0xaa, 0x19, 0x26, 0x53, 0xef, 0x47, 0xc2, 0xf3, 0x8f, 0xb7, 0x62, 0x2f, 0xff,
0x4f, 0xdc, 0x95, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x86, 0x11, 0x51, 0x16, 0x86, 0x14, 0x00,
0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -1832,6 +1952,97 @@ func (m *QueryListRecordsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error)
i = encodeVarintQuery(dAtA, i, uint64(size)) i = encodeVarintQuery(dAtA, i, uint64(size))
} }
i-- i--
dAtA[i] = 0x12
}
if len(m.Attributes) > 0 {
for iNdEx := len(m.Attributes) - 1; iNdEx >= 0; iNdEx-- {
{
size, err := m.Attributes[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 (m *QueryListRecordsRequest_ValueInput) 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 *QueryListRecordsRequest_ValueInput) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryListRecordsRequest_ValueInput) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Int != 0 {
i = encodeVarintQuery(dAtA, i, uint64(m.Int))
i--
dAtA[i] = 0x10
}
if len(m.String_) > 0 {
i -= len(m.String_)
copy(dAtA[i:], m.String_)
i = encodeVarintQuery(dAtA, i, uint64(len(m.String_)))
i--
dAtA[i] = 0xa
}
return len(dAtA) - i, nil
}
func (m *QueryListRecordsRequest_KeyValueInput) 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 *QueryListRecordsRequest_KeyValueInput) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
func (m *QueryListRecordsRequest_KeyValueInput) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
_ = l
if m.Value != nil {
{
size, err := m.Value.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
i -= size
i = encodeVarintQuery(dAtA, i, uint64(size))
}
i--
dAtA[i] = 0x12
}
if len(m.Key) > 0 {
i -= len(m.Key)
copy(dAtA[i:], m.Key)
i = encodeVarintQuery(dAtA, i, uint64(len(m.Key)))
i--
dAtA[i] = 0xa dAtA[i] = 0xa
} }
return len(dAtA) - i, nil return len(dAtA) - i, nil
@ -2667,6 +2878,12 @@ func (m *QueryListRecordsRequest) Size() (n int) {
} }
var l int var l int
_ = l _ = l
if len(m.Attributes) > 0 {
for _, e := range m.Attributes {
l = e.Size()
n += 1 + l + sovQuery(uint64(l))
}
}
if m.Pagination != nil { if m.Pagination != nil {
l = m.Pagination.Size() l = m.Pagination.Size()
n += 1 + l + sovQuery(uint64(l)) n += 1 + l + sovQuery(uint64(l))
@ -2674,6 +2891,39 @@ func (m *QueryListRecordsRequest) Size() (n int) {
return n return n
} }
func (m *QueryListRecordsRequest_ValueInput) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.String_)
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
if m.Int != 0 {
n += 1 + sovQuery(uint64(m.Int))
}
return n
}
func (m *QueryListRecordsRequest_KeyValueInput) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
l = len(m.Key)
if l > 0 {
n += 1 + l + sovQuery(uint64(l))
}
if m.Value != nil {
l = m.Value.Size()
n += 1 + l + sovQuery(uint64(l))
}
return n
}
func (m *QueryListRecordsResponse) Size() (n int) { func (m *QueryListRecordsResponse) Size() (n int) {
if m == nil { if m == nil {
return 0 return 0
@ -3159,6 +3409,40 @@ func (m *QueryListRecordsRequest) Unmarshal(dAtA []byte) error {
} }
switch fieldNum { switch fieldNum {
case 1: case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Attributes", 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.Attributes = append(m.Attributes, &QueryListRecordsRequest_KeyValueInput{})
if err := m.Attributes[len(m.Attributes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 { if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType) return fmt.Errorf("proto: wrong wireType = %d for field Pagination", wireType)
} }
@ -3215,6 +3499,225 @@ func (m *QueryListRecordsRequest) Unmarshal(dAtA []byte) error {
} }
return nil return nil
} }
func (m *QueryListRecordsRequest_ValueInput) 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: ValueInput: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: ValueInput: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field String_", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
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 ErrInvalidLengthQuery
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.String_ = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
if wireType != 0 {
return fmt.Errorf("proto: wrong wireType = %d for field Int", wireType)
}
m.Int = 0
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
if iNdEx >= l {
return io.ErrUnexpectedEOF
}
b := dAtA[iNdEx]
iNdEx++
m.Int |= int64(b&0x7F) << shift
if b < 0x80 {
break
}
}
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 *QueryListRecordsRequest_KeyValueInput) 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: KeyValueInput: wiretype end group for non-group")
}
if fieldNum <= 0 {
return fmt.Errorf("proto: KeyValueInput: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
return fmt.Errorf("proto: wrong wireType = %d for field Key", wireType)
}
var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowQuery
}
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 ErrInvalidLengthQuery
}
postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthQuery
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
m.Key = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
case 2:
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 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.Value == nil {
m.Value = &QueryListRecordsRequest_ValueInput{}
}
if err := m.Value.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 *QueryListRecordsResponse) Unmarshal(dAtA []byte) error { func (m *QueryListRecordsResponse) Unmarshal(dAtA []byte) error {
l := len(dAtA) l := len(dAtA)
iNdEx := 0 iNdEx := 0