From ff779eca8d033d3d3d9d1d2dade5afea413b7b30 Mon Sep 17 00:00:00 2001 From: Alex | Interchain Labs Date: Wed, 26 Feb 2025 16:10:00 -0500 Subject: [PATCH] feat(epochs): backport (#23815) Co-authored-by: Tyler <48813565+technicallyty@users.noreply.github.com> --- CHANGELOG.md | 3 +- api/cosmos/epochs/module/v1/module.pulsar.go | 505 +++++ api/cosmos/epochs/v1beta1/events.pulsar.go | 1072 ++++++++++ api/cosmos/epochs/v1beta1/genesis.pulsar.go | 1630 ++++++++++++++ api/cosmos/epochs/v1beta1/query.pulsar.go | 2016 ++++++++++++++++++ api/cosmos/epochs/v1beta1/query_grpc.pb.go | 169 ++ proto/cosmos/epochs/module/v1/module.proto | 13 + proto/cosmos/epochs/v1beta1/events.proto | 17 + proto/cosmos/epochs/v1beta1/genesis.proto | 61 + proto/cosmos/epochs/v1beta1/query.proto | 43 + simapp/app.go | 19 + simapp/app_config.go | 9 + simapp/app_di.go | 3 + simapp/app_test.go | 44 +- simapp/go.mod | 1 + simapp/go.sum | 2 - tests/go.mod | 1 + tests/go.sum | 2 - x/epochs/README.md | 177 ++ x/epochs/autocli.go | 27 + x/epochs/depinject.go | 71 + x/epochs/keeper/abci.go | 91 + x/epochs/keeper/abci_test.go | 190 ++ x/epochs/keeper/epoch.go | 66 + x/epochs/keeper/epoch_test.go | 101 + x/epochs/keeper/genesis.go | 28 + x/epochs/keeper/genesis_test.go | 95 + x/epochs/keeper/grpc_query.go | 54 + x/epochs/keeper/grpc_query_test.go | 22 + x/epochs/keeper/hooks.go | 27 + x/epochs/keeper/keeper.go | 45 + x/epochs/keeper/keeper_test.go | 89 + x/epochs/module.go | 155 ++ x/epochs/simulation/genesis.go | 38 + x/epochs/types/events.pb.go | 495 +++++ x/epochs/types/genesis.go | 69 + x/epochs/types/genesis.pb.go | 821 +++++++ x/epochs/types/hooks.go | 46 + x/epochs/types/hooks_test.go | 111 + x/epochs/types/keys.go | 16 + x/epochs/types/query.pb.go | 919 ++++++++ x/epochs/types/query.pb.gw.go | 236 ++ x/staking/types/staking.pb.go | 1559 +++++++------- 43 files changed, 10362 insertions(+), 796 deletions(-) create mode 100644 api/cosmos/epochs/module/v1/module.pulsar.go create mode 100644 api/cosmos/epochs/v1beta1/events.pulsar.go create mode 100644 api/cosmos/epochs/v1beta1/genesis.pulsar.go create mode 100644 api/cosmos/epochs/v1beta1/query.pulsar.go create mode 100644 api/cosmos/epochs/v1beta1/query_grpc.pb.go create mode 100644 proto/cosmos/epochs/module/v1/module.proto create mode 100644 proto/cosmos/epochs/v1beta1/events.proto create mode 100644 proto/cosmos/epochs/v1beta1/genesis.proto create mode 100644 proto/cosmos/epochs/v1beta1/query.proto create mode 100644 x/epochs/README.md create mode 100644 x/epochs/autocli.go create mode 100644 x/epochs/depinject.go create mode 100644 x/epochs/keeper/abci.go create mode 100644 x/epochs/keeper/abci_test.go create mode 100644 x/epochs/keeper/epoch.go create mode 100644 x/epochs/keeper/epoch_test.go create mode 100644 x/epochs/keeper/genesis.go create mode 100644 x/epochs/keeper/genesis_test.go create mode 100644 x/epochs/keeper/grpc_query.go create mode 100644 x/epochs/keeper/grpc_query_test.go create mode 100644 x/epochs/keeper/hooks.go create mode 100644 x/epochs/keeper/keeper.go create mode 100644 x/epochs/keeper/keeper_test.go create mode 100644 x/epochs/module.go create mode 100644 x/epochs/simulation/genesis.go create mode 100644 x/epochs/types/events.pb.go create mode 100644 x/epochs/types/genesis.go create mode 100644 x/epochs/types/genesis.pb.go create mode 100644 x/epochs/types/hooks.go create mode 100644 x/epochs/types/hooks_test.go create mode 100644 x/epochs/types/keys.go create mode 100644 x/epochs/types/query.pb.go create mode 100644 x/epochs/types/query.pb.gw.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 511faab169..a5a2cebe52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,8 +38,9 @@ Ref: https://keepachangelog.com/en/1.0.0/ ## [Unreleased] -### Features +### Features +* (x/epochs) [#23815](https://github.com/cosmos/cosmos-sdk/pull/23815) Upstream `x/epochs` from Osmosis * (client) [#21074](https://github.com/cosmos/cosmos-sdk/pull/21074) Add auto cli for node service ### Bug Fixes diff --git a/api/cosmos/epochs/module/v1/module.pulsar.go b/api/cosmos/epochs/module/v1/module.pulsar.go new file mode 100644 index 0000000000..8f3ee88471 --- /dev/null +++ b/api/cosmos/epochs/module/v1/module.pulsar.go @@ -0,0 +1,505 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package modulev1 + +import ( + _ "cosmossdk.io/api/cosmos/app/v1alpha1" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_Module protoreflect.MessageDescriptor +) + +func init() { + file_cosmos_epochs_module_v1_module_proto_init() + md_Module = File_cosmos_epochs_module_v1_module_proto.Messages().ByName("Module") +} + +var _ protoreflect.Message = (*fastReflection_Module)(nil) + +type fastReflection_Module Module + +func (x *Module) ProtoReflect() protoreflect.Message { + return (*fastReflection_Module)(x) +} + +func (x *Module) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_module_v1_module_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_Module_messageType fastReflection_Module_messageType +var _ protoreflect.MessageType = fastReflection_Module_messageType{} + +type fastReflection_Module_messageType struct{} + +func (x fastReflection_Module_messageType) Zero() protoreflect.Message { + return (*fastReflection_Module)(nil) +} +func (x fastReflection_Module_messageType) New() protoreflect.Message { + return new(fastReflection_Module) +} +func (x fastReflection_Module_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_Module +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_Module) Descriptor() protoreflect.MessageDescriptor { + return md_Module +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_Module) Type() protoreflect.MessageType { + return _fastReflection_Module_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_Module) New() protoreflect.Message { + return new(fastReflection_Module) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_Module) Interface() protoreflect.ProtoMessage { + return (*Module)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_Module) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_Module) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_Module) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_Module) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.module.v1.Module")) + } + panic(fmt.Errorf("message cosmos.epochs.module.v1.Module does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_Module) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.module.v1.Module", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_Module) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Module) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_Module) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_Module) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*Module) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Module: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Module: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Since: cosmos-sdk 0.53 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/epochs/module/v1/module.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Module is the config object of the epochs module. +type Module struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Module) Reset() { + *x = Module{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_module_v1_module_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Module) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Module) ProtoMessage() {} + +// Deprecated: Use Module.ProtoReflect.Descriptor instead. +func (*Module) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_module_v1_module_proto_rawDescGZIP(), []int{0} +} + +var File_cosmos_epochs_module_v1_module_proto protoreflect.FileDescriptor + +var file_cosmos_epochs_module_v1_module_proto_rawDesc = []byte{ + 0x0a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, + 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x17, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x1a, + 0x20, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x70, 0x2f, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x31, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x37, 0x0a, 0x06, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3a, 0x2d, 0xba, 0xc0, 0x96, + 0xda, 0x01, 0x27, 0x0a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, + 0x6b, 0x2f, 0x78, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0xdc, 0x01, 0x0a, 0x1b, 0x63, + 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x4d, 0x6f, 0x64, 0x75, + 0x6c, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x2f, 0x76, 0x31, 0x3b, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x43, + 0x45, 0x4d, 0xaa, 0x02, 0x17, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x17, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x23, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1a, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x3a, 0x3a, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_cosmos_epochs_module_v1_module_proto_rawDescOnce sync.Once + file_cosmos_epochs_module_v1_module_proto_rawDescData = file_cosmos_epochs_module_v1_module_proto_rawDesc +) + +func file_cosmos_epochs_module_v1_module_proto_rawDescGZIP() []byte { + file_cosmos_epochs_module_v1_module_proto_rawDescOnce.Do(func() { + file_cosmos_epochs_module_v1_module_proto_rawDescData = protoimpl.X.CompressGZIP(file_cosmos_epochs_module_v1_module_proto_rawDescData) + }) + return file_cosmos_epochs_module_v1_module_proto_rawDescData +} + +var file_cosmos_epochs_module_v1_module_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_cosmos_epochs_module_v1_module_proto_goTypes = []interface{}{ + (*Module)(nil), // 0: cosmos.epochs.module.v1.Module +} +var file_cosmos_epochs_module_v1_module_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cosmos_epochs_module_v1_module_proto_init() } +func file_cosmos_epochs_module_v1_module_proto_init() { + if File_cosmos_epochs_module_v1_module_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_cosmos_epochs_module_v1_module_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Module); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cosmos_epochs_module_v1_module_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cosmos_epochs_module_v1_module_proto_goTypes, + DependencyIndexes: file_cosmos_epochs_module_v1_module_proto_depIdxs, + MessageInfos: file_cosmos_epochs_module_v1_module_proto_msgTypes, + }.Build() + File_cosmos_epochs_module_v1_module_proto = out.File + file_cosmos_epochs_module_v1_module_proto_rawDesc = nil + file_cosmos_epochs_module_v1_module_proto_goTypes = nil + file_cosmos_epochs_module_v1_module_proto_depIdxs = nil +} diff --git a/api/cosmos/epochs/v1beta1/events.pulsar.go b/api/cosmos/epochs/v1beta1/events.pulsar.go new file mode 100644 index 0000000000..fd0676c364 --- /dev/null +++ b/api/cosmos/epochs/v1beta1/events.pulsar.go @@ -0,0 +1,1072 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package epochsv1beta1 + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_EventEpochEnd protoreflect.MessageDescriptor + fd_EventEpochEnd_epoch_number protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_events_proto_init() + md_EventEpochEnd = File_cosmos_epochs_v1beta1_events_proto.Messages().ByName("EventEpochEnd") + fd_EventEpochEnd_epoch_number = md_EventEpochEnd.Fields().ByName("epoch_number") +} + +var _ protoreflect.Message = (*fastReflection_EventEpochEnd)(nil) + +type fastReflection_EventEpochEnd EventEpochEnd + +func (x *EventEpochEnd) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventEpochEnd)(x) +} + +func (x *EventEpochEnd) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_events_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EventEpochEnd_messageType fastReflection_EventEpochEnd_messageType +var _ protoreflect.MessageType = fastReflection_EventEpochEnd_messageType{} + +type fastReflection_EventEpochEnd_messageType struct{} + +func (x fastReflection_EventEpochEnd_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventEpochEnd)(nil) +} +func (x fastReflection_EventEpochEnd_messageType) New() protoreflect.Message { + return new(fastReflection_EventEpochEnd) +} +func (x fastReflection_EventEpochEnd_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventEpochEnd +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventEpochEnd) Descriptor() protoreflect.MessageDescriptor { + return md_EventEpochEnd +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EventEpochEnd) Type() protoreflect.MessageType { + return _fastReflection_EventEpochEnd_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventEpochEnd) New() protoreflect.Message { + return new(fastReflection_EventEpochEnd) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventEpochEnd) Interface() protoreflect.ProtoMessage { + return (*EventEpochEnd)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EventEpochEnd) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.EpochNumber != int64(0) { + value := protoreflect.ValueOfInt64(x.EpochNumber) + if !f(fd_EventEpochEnd_epoch_number, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EventEpochEnd) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + return x.EpochNumber != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochEnd) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + x.EpochNumber = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EventEpochEnd) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + value := x.EpochNumber + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochEnd) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + x.EpochNumber = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochEnd) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + panic(fmt.Errorf("field epoch_number of message cosmos.epochs.v1beta1.EventEpochEnd is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EventEpochEnd) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochEnd.epoch_number": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochEnd")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochEnd does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EventEpochEnd) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.EventEpochEnd", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EventEpochEnd) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochEnd) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EventEpochEnd) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EventEpochEnd) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventEpochEnd) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.EpochNumber != 0 { + n += 1 + runtime.Sov(uint64(x.EpochNumber)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EventEpochEnd) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.EpochNumber != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.EpochNumber)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EventEpochEnd) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventEpochEnd: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventEpochEnd: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochNumber", wireType) + } + x.EpochNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.EpochNumber |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_EventEpochStart protoreflect.MessageDescriptor + fd_EventEpochStart_epoch_number protoreflect.FieldDescriptor + fd_EventEpochStart_epoch_start_time protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_events_proto_init() + md_EventEpochStart = File_cosmos_epochs_v1beta1_events_proto.Messages().ByName("EventEpochStart") + fd_EventEpochStart_epoch_number = md_EventEpochStart.Fields().ByName("epoch_number") + fd_EventEpochStart_epoch_start_time = md_EventEpochStart.Fields().ByName("epoch_start_time") +} + +var _ protoreflect.Message = (*fastReflection_EventEpochStart)(nil) + +type fastReflection_EventEpochStart EventEpochStart + +func (x *EventEpochStart) ProtoReflect() protoreflect.Message { + return (*fastReflection_EventEpochStart)(x) +} + +func (x *EventEpochStart) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_events_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EventEpochStart_messageType fastReflection_EventEpochStart_messageType +var _ protoreflect.MessageType = fastReflection_EventEpochStart_messageType{} + +type fastReflection_EventEpochStart_messageType struct{} + +func (x fastReflection_EventEpochStart_messageType) Zero() protoreflect.Message { + return (*fastReflection_EventEpochStart)(nil) +} +func (x fastReflection_EventEpochStart_messageType) New() protoreflect.Message { + return new(fastReflection_EventEpochStart) +} +func (x fastReflection_EventEpochStart_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EventEpochStart +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EventEpochStart) Descriptor() protoreflect.MessageDescriptor { + return md_EventEpochStart +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EventEpochStart) Type() protoreflect.MessageType { + return _fastReflection_EventEpochStart_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EventEpochStart) New() protoreflect.Message { + return new(fastReflection_EventEpochStart) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EventEpochStart) Interface() protoreflect.ProtoMessage { + return (*EventEpochStart)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EventEpochStart) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.EpochNumber != int64(0) { + value := protoreflect.ValueOfInt64(x.EpochNumber) + if !f(fd_EventEpochStart_epoch_number, value) { + return + } + } + if x.EpochStartTime != int64(0) { + value := protoreflect.ValueOfInt64(x.EpochStartTime) + if !f(fd_EventEpochStart_epoch_start_time, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EventEpochStart) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + return x.EpochNumber != int64(0) + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + return x.EpochStartTime != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochStart) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + x.EpochNumber = int64(0) + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + x.EpochStartTime = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EventEpochStart) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + value := x.EpochNumber + return protoreflect.ValueOfInt64(value) + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + value := x.EpochStartTime + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochStart) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + x.EpochNumber = value.Int() + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + x.EpochStartTime = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochStart) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + panic(fmt.Errorf("field epoch_number of message cosmos.epochs.v1beta1.EventEpochStart is not mutable")) + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + panic(fmt.Errorf("field epoch_start_time of message cosmos.epochs.v1beta1.EventEpochStart is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EventEpochStart) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_number": + return protoreflect.ValueOfInt64(int64(0)) + case "cosmos.epochs.v1beta1.EventEpochStart.epoch_start_time": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EventEpochStart")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EventEpochStart does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EventEpochStart) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.EventEpochStart", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EventEpochStart) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EventEpochStart) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EventEpochStart) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EventEpochStart) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EventEpochStart) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.EpochNumber != 0 { + n += 1 + runtime.Sov(uint64(x.EpochNumber)) + } + if x.EpochStartTime != 0 { + n += 1 + runtime.Sov(uint64(x.EpochStartTime)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EventEpochStart) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.EpochStartTime != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.EpochStartTime)) + i-- + dAtA[i] = 0x10 + } + if x.EpochNumber != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.EpochNumber)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EventEpochStart) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventEpochStart: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EventEpochStart: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochNumber", wireType) + } + x.EpochNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.EpochNumber |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochStartTime", wireType) + } + x.EpochStartTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.EpochStartTime |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Since: cosmos-sdk 0.53 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/epochs/v1beta1/events.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// EventEpochEnd is an event emitted when an epoch end. +type EventEpochEnd struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochNumber int64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` +} + +func (x *EventEpochEnd) Reset() { + *x = EventEpochEnd{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_events_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventEpochEnd) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventEpochEnd) ProtoMessage() {} + +// Deprecated: Use EventEpochEnd.ProtoReflect.Descriptor instead. +func (*EventEpochEnd) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_events_proto_rawDescGZIP(), []int{0} +} + +func (x *EventEpochEnd) GetEpochNumber() int64 { + if x != nil { + return x.EpochNumber + } + return 0 +} + +// EventEpochStart is an event emitted when an epoch start. +type EventEpochStart struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochNumber int64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` + EpochStartTime int64 `protobuf:"varint,2,opt,name=epoch_start_time,json=epochStartTime,proto3" json:"epoch_start_time,omitempty"` +} + +func (x *EventEpochStart) Reset() { + *x = EventEpochStart{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EventEpochStart) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EventEpochStart) ProtoMessage() {} + +// Deprecated: Use EventEpochStart.ProtoReflect.Descriptor instead. +func (*EventEpochStart) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_events_proto_rawDescGZIP(), []int{1} +} + +func (x *EventEpochStart) GetEpochNumber() int64 { + if x != nil { + return x.EpochNumber + } + return 0 +} + +func (x *EventEpochStart) GetEpochStartTime() int64 { + if x != nil { + return x.EpochStartTime + } + return 0 +} + +var File_cosmos_epochs_v1beta1_events_proto protoreflect.FileDescriptor + +var file_cosmos_epochs_v1beta1_events_proto_rawDesc = []byte{ + 0x0a, 0x22, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x22, 0x32, 0x0a, 0x0d, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x45, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x5e, 0x0a, 0x0f, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x42, + 0xd4, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0b, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x3b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x58, 0xaa, 0x02, 0x15, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0xca, 0x02, 0x15, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x21, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x17, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_cosmos_epochs_v1beta1_events_proto_rawDescOnce sync.Once + file_cosmos_epochs_v1beta1_events_proto_rawDescData = file_cosmos_epochs_v1beta1_events_proto_rawDesc +) + +func file_cosmos_epochs_v1beta1_events_proto_rawDescGZIP() []byte { + file_cosmos_epochs_v1beta1_events_proto_rawDescOnce.Do(func() { + file_cosmos_epochs_v1beta1_events_proto_rawDescData = protoimpl.X.CompressGZIP(file_cosmos_epochs_v1beta1_events_proto_rawDescData) + }) + return file_cosmos_epochs_v1beta1_events_proto_rawDescData +} + +var file_cosmos_epochs_v1beta1_events_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_cosmos_epochs_v1beta1_events_proto_goTypes = []interface{}{ + (*EventEpochEnd)(nil), // 0: cosmos.epochs.v1beta1.EventEpochEnd + (*EventEpochStart)(nil), // 1: cosmos.epochs.v1beta1.EventEpochStart +} +var file_cosmos_epochs_v1beta1_events_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_cosmos_epochs_v1beta1_events_proto_init() } +func file_cosmos_epochs_v1beta1_events_proto_init() { + if File_cosmos_epochs_v1beta1_events_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_cosmos_epochs_v1beta1_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventEpochEnd); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_epochs_v1beta1_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventEpochStart); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cosmos_epochs_v1beta1_events_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cosmos_epochs_v1beta1_events_proto_goTypes, + DependencyIndexes: file_cosmos_epochs_v1beta1_events_proto_depIdxs, + MessageInfos: file_cosmos_epochs_v1beta1_events_proto_msgTypes, + }.Build() + File_cosmos_epochs_v1beta1_events_proto = out.File + file_cosmos_epochs_v1beta1_events_proto_rawDesc = nil + file_cosmos_epochs_v1beta1_events_proto_goTypes = nil + file_cosmos_epochs_v1beta1_events_proto_depIdxs = nil +} diff --git a/api/cosmos/epochs/v1beta1/genesis.pulsar.go b/api/cosmos/epochs/v1beta1/genesis.pulsar.go new file mode 100644 index 0000000000..fbb7da70d6 --- /dev/null +++ b/api/cosmos/epochs/v1beta1/genesis.pulsar.go @@ -0,0 +1,1630 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package epochsv1beta1 + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_EpochInfo protoreflect.MessageDescriptor + fd_EpochInfo_identifier protoreflect.FieldDescriptor + fd_EpochInfo_start_time protoreflect.FieldDescriptor + fd_EpochInfo_duration protoreflect.FieldDescriptor + fd_EpochInfo_current_epoch protoreflect.FieldDescriptor + fd_EpochInfo_current_epoch_start_time protoreflect.FieldDescriptor + fd_EpochInfo_epoch_counting_started protoreflect.FieldDescriptor + fd_EpochInfo_current_epoch_start_height protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_genesis_proto_init() + md_EpochInfo = File_cosmos_epochs_v1beta1_genesis_proto.Messages().ByName("EpochInfo") + fd_EpochInfo_identifier = md_EpochInfo.Fields().ByName("identifier") + fd_EpochInfo_start_time = md_EpochInfo.Fields().ByName("start_time") + fd_EpochInfo_duration = md_EpochInfo.Fields().ByName("duration") + fd_EpochInfo_current_epoch = md_EpochInfo.Fields().ByName("current_epoch") + fd_EpochInfo_current_epoch_start_time = md_EpochInfo.Fields().ByName("current_epoch_start_time") + fd_EpochInfo_epoch_counting_started = md_EpochInfo.Fields().ByName("epoch_counting_started") + fd_EpochInfo_current_epoch_start_height = md_EpochInfo.Fields().ByName("current_epoch_start_height") +} + +var _ protoreflect.Message = (*fastReflection_EpochInfo)(nil) + +type fastReflection_EpochInfo EpochInfo + +func (x *EpochInfo) ProtoReflect() protoreflect.Message { + return (*fastReflection_EpochInfo)(x) +} + +func (x *EpochInfo) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_EpochInfo_messageType fastReflection_EpochInfo_messageType +var _ protoreflect.MessageType = fastReflection_EpochInfo_messageType{} + +type fastReflection_EpochInfo_messageType struct{} + +func (x fastReflection_EpochInfo_messageType) Zero() protoreflect.Message { + return (*fastReflection_EpochInfo)(nil) +} +func (x fastReflection_EpochInfo_messageType) New() protoreflect.Message { + return new(fastReflection_EpochInfo) +} +func (x fastReflection_EpochInfo_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_EpochInfo +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_EpochInfo) Descriptor() protoreflect.MessageDescriptor { + return md_EpochInfo +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_EpochInfo) Type() protoreflect.MessageType { + return _fastReflection_EpochInfo_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_EpochInfo) New() protoreflect.Message { + return new(fastReflection_EpochInfo) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_EpochInfo) Interface() protoreflect.ProtoMessage { + return (*EpochInfo)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_EpochInfo) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Identifier != "" { + value := protoreflect.ValueOfString(x.Identifier) + if !f(fd_EpochInfo_identifier, value) { + return + } + } + if x.StartTime != nil { + value := protoreflect.ValueOfMessage(x.StartTime.ProtoReflect()) + if !f(fd_EpochInfo_start_time, value) { + return + } + } + if x.Duration != nil { + value := protoreflect.ValueOfMessage(x.Duration.ProtoReflect()) + if !f(fd_EpochInfo_duration, value) { + return + } + } + if x.CurrentEpoch != int64(0) { + value := protoreflect.ValueOfInt64(x.CurrentEpoch) + if !f(fd_EpochInfo_current_epoch, value) { + return + } + } + if x.CurrentEpochStartTime != nil { + value := protoreflect.ValueOfMessage(x.CurrentEpochStartTime.ProtoReflect()) + if !f(fd_EpochInfo_current_epoch_start_time, value) { + return + } + } + if x.EpochCountingStarted != false { + value := protoreflect.ValueOfBool(x.EpochCountingStarted) + if !f(fd_EpochInfo_epoch_counting_started, value) { + return + } + } + if x.CurrentEpochStartHeight != int64(0) { + value := protoreflect.ValueOfInt64(x.CurrentEpochStartHeight) + if !f(fd_EpochInfo_current_epoch_start_height, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_EpochInfo) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + return x.Identifier != "" + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + return x.StartTime != nil + case "cosmos.epochs.v1beta1.EpochInfo.duration": + return x.Duration != nil + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + return x.CurrentEpoch != int64(0) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + return x.CurrentEpochStartTime != nil + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + return x.EpochCountingStarted != false + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + return x.CurrentEpochStartHeight != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EpochInfo) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + x.Identifier = "" + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + x.StartTime = nil + case "cosmos.epochs.v1beta1.EpochInfo.duration": + x.Duration = nil + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + x.CurrentEpoch = int64(0) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + x.CurrentEpochStartTime = nil + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + x.EpochCountingStarted = false + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + x.CurrentEpochStartHeight = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_EpochInfo) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + value := x.Identifier + return protoreflect.ValueOfString(value) + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + value := x.StartTime + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.duration": + value := x.Duration + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + value := x.CurrentEpoch + return protoreflect.ValueOfInt64(value) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + value := x.CurrentEpochStartTime + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + value := x.EpochCountingStarted + return protoreflect.ValueOfBool(value) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + value := x.CurrentEpochStartHeight + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EpochInfo) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + x.Identifier = value.Interface().(string) + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + x.StartTime = value.Message().Interface().(*timestamppb.Timestamp) + case "cosmos.epochs.v1beta1.EpochInfo.duration": + x.Duration = value.Message().Interface().(*durationpb.Duration) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + x.CurrentEpoch = value.Int() + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + x.CurrentEpochStartTime = value.Message().Interface().(*timestamppb.Timestamp) + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + x.EpochCountingStarted = value.Bool() + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + x.CurrentEpochStartHeight = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EpochInfo) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + if x.StartTime == nil { + x.StartTime = new(timestamppb.Timestamp) + } + return protoreflect.ValueOfMessage(x.StartTime.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.duration": + if x.Duration == nil { + x.Duration = new(durationpb.Duration) + } + return protoreflect.ValueOfMessage(x.Duration.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + if x.CurrentEpochStartTime == nil { + x.CurrentEpochStartTime = new(timestamppb.Timestamp) + } + return protoreflect.ValueOfMessage(x.CurrentEpochStartTime.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + panic(fmt.Errorf("field identifier of message cosmos.epochs.v1beta1.EpochInfo is not mutable")) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + panic(fmt.Errorf("field current_epoch of message cosmos.epochs.v1beta1.EpochInfo is not mutable")) + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + panic(fmt.Errorf("field epoch_counting_started of message cosmos.epochs.v1beta1.EpochInfo is not mutable")) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + panic(fmt.Errorf("field current_epoch_start_height of message cosmos.epochs.v1beta1.EpochInfo is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_EpochInfo) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.EpochInfo.identifier": + return protoreflect.ValueOfString("") + case "cosmos.epochs.v1beta1.EpochInfo.start_time": + m := new(timestamppb.Timestamp) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.duration": + m := new(durationpb.Duration) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch": + return protoreflect.ValueOfInt64(int64(0)) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time": + m := new(timestamppb.Timestamp) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "cosmos.epochs.v1beta1.EpochInfo.epoch_counting_started": + return protoreflect.ValueOfBool(false) + case "cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_height": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.EpochInfo")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.EpochInfo does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_EpochInfo) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.EpochInfo", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_EpochInfo) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_EpochInfo) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_EpochInfo) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_EpochInfo) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*EpochInfo) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Identifier) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.StartTime != nil { + l = options.Size(x.StartTime) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Duration != nil { + l = options.Size(x.Duration) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.CurrentEpoch != 0 { + n += 1 + runtime.Sov(uint64(x.CurrentEpoch)) + } + if x.CurrentEpochStartTime != nil { + l = options.Size(x.CurrentEpochStartTime) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.EpochCountingStarted { + n += 2 + } + if x.CurrentEpochStartHeight != 0 { + n += 1 + runtime.Sov(uint64(x.CurrentEpochStartHeight)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*EpochInfo) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.CurrentEpochStartHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.CurrentEpochStartHeight)) + i-- + dAtA[i] = 0x40 + } + if x.EpochCountingStarted { + i-- + if x.EpochCountingStarted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + if x.CurrentEpochStartTime != nil { + encoded, err := options.Marshal(x.CurrentEpochStartTime) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x2a + } + if x.CurrentEpoch != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.CurrentEpoch)) + i-- + dAtA[i] = 0x20 + } + if x.Duration != nil { + encoded, err := options.Marshal(x.Duration) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x1a + } + if x.StartTime != nil { + encoded, err := options.Marshal(x.StartTime) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.Identifier) > 0 { + i -= len(x.Identifier) + copy(dAtA[i:], x.Identifier) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Identifier))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*EpochInfo) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EpochInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: EpochInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Identifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Identifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field StartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.StartTime == nil { + x.StartTime = ×tamppb.Timestamp{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.StartTime); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Duration", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Duration == nil { + x.Duration = &durationpb.Duration{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Duration); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentEpoch", wireType) + } + x.CurrentEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.CurrentEpoch |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentEpochStartTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.CurrentEpochStartTime == nil { + x.CurrentEpochStartTime = ×tamppb.Timestamp{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.CurrentEpochStartTime); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochCountingStarted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.EpochCountingStarted = bool(v != 0) + case 8: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentEpochStartHeight", wireType) + } + x.CurrentEpochStartHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.CurrentEpochStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var _ protoreflect.List = (*_GenesisState_1_list)(nil) + +type _GenesisState_1_list struct { + list *[]*EpochInfo +} + +func (x *_GenesisState_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_GenesisState_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_GenesisState_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*EpochInfo) + (*x.list)[i] = concreteValue +} + +func (x *_GenesisState_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*EpochInfo) + *x.list = append(*x.list, concreteValue) +} + +func (x *_GenesisState_1_list) AppendMutable() protoreflect.Value { + v := new(EpochInfo) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_GenesisState_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_GenesisState_1_list) NewElement() protoreflect.Value { + v := new(EpochInfo) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_GenesisState_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_GenesisState protoreflect.MessageDescriptor + fd_GenesisState_epochs protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_genesis_proto_init() + md_GenesisState = File_cosmos_epochs_v1beta1_genesis_proto.Messages().ByName("GenesisState") + fd_GenesisState_epochs = md_GenesisState.Fields().ByName("epochs") +} + +var _ protoreflect.Message = (*fastReflection_GenesisState)(nil) + +type fastReflection_GenesisState GenesisState + +func (x *GenesisState) ProtoReflect() protoreflect.Message { + return (*fastReflection_GenesisState)(x) +} + +func (x *GenesisState) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_GenesisState_messageType fastReflection_GenesisState_messageType +var _ protoreflect.MessageType = fastReflection_GenesisState_messageType{} + +type fastReflection_GenesisState_messageType struct{} + +func (x fastReflection_GenesisState_messageType) Zero() protoreflect.Message { + return (*fastReflection_GenesisState)(nil) +} +func (x fastReflection_GenesisState_messageType) New() protoreflect.Message { + return new(fastReflection_GenesisState) +} +func (x fastReflection_GenesisState_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_GenesisState +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_GenesisState) Descriptor() protoreflect.MessageDescriptor { + return md_GenesisState +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_GenesisState) Type() protoreflect.MessageType { + return _fastReflection_GenesisState_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_GenesisState) New() protoreflect.Message { + return new(fastReflection_GenesisState) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_GenesisState) Interface() protoreflect.ProtoMessage { + return (*GenesisState)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_GenesisState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Epochs) != 0 { + value := protoreflect.ValueOfList(&_GenesisState_1_list{list: &x.Epochs}) + if !f(fd_GenesisState_epochs, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_GenesisState) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + return len(x.Epochs) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_GenesisState) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + x.Epochs = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_GenesisState) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + if len(x.Epochs) == 0 { + return protoreflect.ValueOfList(&_GenesisState_1_list{}) + } + listValue := &_GenesisState_1_list{list: &x.Epochs} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_GenesisState) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + lv := value.List() + clv := lv.(*_GenesisState_1_list) + x.Epochs = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_GenesisState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + if x.Epochs == nil { + x.Epochs = []*EpochInfo{} + } + value := &_GenesisState_1_list{list: &x.Epochs} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_GenesisState) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.GenesisState.epochs": + list := []*EpochInfo{} + return protoreflect.ValueOfList(&_GenesisState_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.GenesisState")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.GenesisState does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_GenesisState) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.GenesisState", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_GenesisState) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_GenesisState) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_GenesisState) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*GenesisState) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Epochs) > 0 { + for _, e := range x.Epochs { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*GenesisState) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Epochs) > 0 { + for iNdEx := len(x.Epochs) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Epochs[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*GenesisState) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Epochs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Epochs = append(x.Epochs, &EpochInfo{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Epochs[len(x.Epochs)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Since: cosmos-sdk 0.53 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/epochs/v1beta1/genesis.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// EpochInfo is a struct that describes the data going into +// a timer defined by the x/epochs module. +type EpochInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // identifier is a unique reference to this particular timer. + Identifier string `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` + // start_time is the time at which the timer first ever ticks. + // If start_time is in the future, the epoch will not begin until the start + // time. + StartTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + // duration is the time in between epoch ticks. + // In order for intended behavior to be met, duration should + // be greater than the chains expected block time. + // Duration must be non-zero. + Duration *durationpb.Duration `protobuf:"bytes,3,opt,name=duration,proto3" json:"duration,omitempty"` + // current_epoch is the current epoch number, or in other words, + // how many times has the timer 'ticked'. + // The first tick (current_epoch=1) is defined as + // the first block whose blocktime is greater than the EpochInfo start_time. + CurrentEpoch int64 `protobuf:"varint,4,opt,name=current_epoch,json=currentEpoch,proto3" json:"current_epoch,omitempty"` + // current_epoch_start_time describes the start time of the current timer + // interval. The interval is (current_epoch_start_time, + // current_epoch_start_time + duration] When the timer ticks, this is set to + // current_epoch_start_time = last_epoch_start_time + duration only one timer + // tick for a given identifier can occur per block. + // + // NOTE! The current_epoch_start_time may diverge significantly from the + // wall-clock time the epoch began at. Wall-clock time of epoch start may be + // >> current_epoch_start_time. Suppose current_epoch_start_time = 10, + // duration = 5. Suppose the chain goes offline at t=14, and comes back online + // at t=30, and produces blocks at every successive time. (t=31, 32, etc.) + // * The t=30 block will start the epoch for (10, 15] + // * The t=31 block will start the epoch for (15, 20] + // * The t=32 block will start the epoch for (20, 25] + // * The t=33 block will start the epoch for (25, 30] + // * The t=34 block will start the epoch for (30, 35] + // * The **t=36** block will start the epoch for (35, 40] + CurrentEpochStartTime *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=current_epoch_start_time,json=currentEpochStartTime,proto3" json:"current_epoch_start_time,omitempty"` + // epoch_counting_started is a boolean, that indicates whether this + // epoch timer has began yet. + EpochCountingStarted bool `protobuf:"varint,6,opt,name=epoch_counting_started,json=epochCountingStarted,proto3" json:"epoch_counting_started,omitempty"` + // current_epoch_start_height is the block height at which the current epoch + // started. (The block height at which the timer last ticked) + CurrentEpochStartHeight int64 `protobuf:"varint,8,opt,name=current_epoch_start_height,json=currentEpochStartHeight,proto3" json:"current_epoch_start_height,omitempty"` +} + +func (x *EpochInfo) Reset() { + *x = EpochInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EpochInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EpochInfo) ProtoMessage() {} + +// Deprecated: Use EpochInfo.ProtoReflect.Descriptor instead. +func (*EpochInfo) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_genesis_proto_rawDescGZIP(), []int{0} +} + +func (x *EpochInfo) GetIdentifier() string { + if x != nil { + return x.Identifier + } + return "" +} + +func (x *EpochInfo) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *EpochInfo) GetDuration() *durationpb.Duration { + if x != nil { + return x.Duration + } + return nil +} + +func (x *EpochInfo) GetCurrentEpoch() int64 { + if x != nil { + return x.CurrentEpoch + } + return 0 +} + +func (x *EpochInfo) GetCurrentEpochStartTime() *timestamppb.Timestamp { + if x != nil { + return x.CurrentEpochStartTime + } + return nil +} + +func (x *EpochInfo) GetEpochCountingStarted() bool { + if x != nil { + return x.EpochCountingStarted + } + return false +} + +func (x *EpochInfo) GetCurrentEpochStartHeight() int64 { + if x != nil { + return x.CurrentEpochStartHeight + } + return 0 +} + +// GenesisState defines the epochs module's genesis state. +type GenesisState struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Epochs []*EpochInfo `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs,omitempty"` +} + +func (x *GenesisState) Reset() { + *x = GenesisState{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenesisState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenesisState) ProtoMessage() {} + +// Deprecated: Use GenesisState.ProtoReflect.Descriptor instead. +func (*GenesisState) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_genesis_proto_rawDescGZIP(), []int{1} +} + +func (x *GenesisState) GetEpochs() []*EpochInfo { + if x != nil { + return x.Epochs + } + return nil +} + +var File_cosmos_epochs_v1beta1_genesis_proto protoreflect.FileDescriptor + +var file_cosmos_epochs_v1beta1_genesis_proto_rawDesc = []byte{ + 0x0a, 0x23, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x1a, 0x14, 0x67, 0x6f, + 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0xc4, 0x03, 0x0a, 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x12, 0x43, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x1e, 0xc8, 0xde, 0x1f, 0x00, 0xea, 0xde, 0x1f, 0x12, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x98, + 0xdf, 0x1f, 0x01, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, + 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x5d, 0x0a, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x42, 0x08, 0xc8, 0xde, 0x1f, 0x00, 0x90, 0xdf, 0x1f, 0x01, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x14, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x4e, 0x0a, 0x0c, 0x47, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x06, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0xd5, 0x01, 0x0a, 0x19, 0x63, + 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x3b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, + 0x03, 0x43, 0x45, 0x58, 0xaa, 0x02, 0x15, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x15, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x56, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x21, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x17, 0x43, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x3a, 0x3a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_cosmos_epochs_v1beta1_genesis_proto_rawDescOnce sync.Once + file_cosmos_epochs_v1beta1_genesis_proto_rawDescData = file_cosmos_epochs_v1beta1_genesis_proto_rawDesc +) + +func file_cosmos_epochs_v1beta1_genesis_proto_rawDescGZIP() []byte { + file_cosmos_epochs_v1beta1_genesis_proto_rawDescOnce.Do(func() { + file_cosmos_epochs_v1beta1_genesis_proto_rawDescData = protoimpl.X.CompressGZIP(file_cosmos_epochs_v1beta1_genesis_proto_rawDescData) + }) + return file_cosmos_epochs_v1beta1_genesis_proto_rawDescData +} + +var file_cosmos_epochs_v1beta1_genesis_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_cosmos_epochs_v1beta1_genesis_proto_goTypes = []interface{}{ + (*EpochInfo)(nil), // 0: cosmos.epochs.v1beta1.EpochInfo + (*GenesisState)(nil), // 1: cosmos.epochs.v1beta1.GenesisState + (*timestamppb.Timestamp)(nil), // 2: google.protobuf.Timestamp + (*durationpb.Duration)(nil), // 3: google.protobuf.Duration +} +var file_cosmos_epochs_v1beta1_genesis_proto_depIdxs = []int32{ + 2, // 0: cosmos.epochs.v1beta1.EpochInfo.start_time:type_name -> google.protobuf.Timestamp + 3, // 1: cosmos.epochs.v1beta1.EpochInfo.duration:type_name -> google.protobuf.Duration + 2, // 2: cosmos.epochs.v1beta1.EpochInfo.current_epoch_start_time:type_name -> google.protobuf.Timestamp + 0, // 3: cosmos.epochs.v1beta1.GenesisState.epochs:type_name -> cosmos.epochs.v1beta1.EpochInfo + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_cosmos_epochs_v1beta1_genesis_proto_init() } +func file_cosmos_epochs_v1beta1_genesis_proto_init() { + if File_cosmos_epochs_v1beta1_genesis_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EpochInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_epochs_v1beta1_genesis_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GenesisState); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cosmos_epochs_v1beta1_genesis_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_cosmos_epochs_v1beta1_genesis_proto_goTypes, + DependencyIndexes: file_cosmos_epochs_v1beta1_genesis_proto_depIdxs, + MessageInfos: file_cosmos_epochs_v1beta1_genesis_proto_msgTypes, + }.Build() + File_cosmos_epochs_v1beta1_genesis_proto = out.File + file_cosmos_epochs_v1beta1_genesis_proto_rawDesc = nil + file_cosmos_epochs_v1beta1_genesis_proto_goTypes = nil + file_cosmos_epochs_v1beta1_genesis_proto_depIdxs = nil +} diff --git a/api/cosmos/epochs/v1beta1/query.pulsar.go b/api/cosmos/epochs/v1beta1/query.pulsar.go new file mode 100644 index 0000000000..52bb74d955 --- /dev/null +++ b/api/cosmos/epochs/v1beta1/query.pulsar.go @@ -0,0 +1,2016 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package epochsv1beta1 + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + _ "google.golang.org/genproto/googleapis/api/annotations" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_QueryEpochInfosRequest protoreflect.MessageDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_query_proto_init() + md_QueryEpochInfosRequest = File_cosmos_epochs_v1beta1_query_proto.Messages().ByName("QueryEpochInfosRequest") +} + +var _ protoreflect.Message = (*fastReflection_QueryEpochInfosRequest)(nil) + +type fastReflection_QueryEpochInfosRequest QueryEpochInfosRequest + +func (x *QueryEpochInfosRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryEpochInfosRequest)(x) +} + +func (x *QueryEpochInfosRequest) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryEpochInfosRequest_messageType fastReflection_QueryEpochInfosRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryEpochInfosRequest_messageType{} + +type fastReflection_QueryEpochInfosRequest_messageType struct{} + +func (x fastReflection_QueryEpochInfosRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryEpochInfosRequest)(nil) +} +func (x fastReflection_QueryEpochInfosRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryEpochInfosRequest) +} +func (x fastReflection_QueryEpochInfosRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryEpochInfosRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryEpochInfosRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryEpochInfosRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryEpochInfosRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryEpochInfosRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryEpochInfosRequest) New() protoreflect.Message { + return new(fastReflection_QueryEpochInfosRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryEpochInfosRequest) Interface() protoreflect.ProtoMessage { + return (*QueryEpochInfosRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryEpochInfosRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryEpochInfosRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryEpochInfosRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryEpochInfosRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryEpochInfosRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.QueryEpochInfosRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryEpochInfosRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryEpochInfosRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryEpochInfosRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryEpochInfosRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryEpochInfosRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryEpochInfosRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryEpochInfosRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryEpochInfosRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var _ protoreflect.List = (*_QueryEpochInfosResponse_1_list)(nil) + +type _QueryEpochInfosResponse_1_list struct { + list *[]*EpochInfo +} + +func (x *_QueryEpochInfosResponse_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_QueryEpochInfosResponse_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_QueryEpochInfosResponse_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*EpochInfo) + (*x.list)[i] = concreteValue +} + +func (x *_QueryEpochInfosResponse_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*EpochInfo) + *x.list = append(*x.list, concreteValue) +} + +func (x *_QueryEpochInfosResponse_1_list) AppendMutable() protoreflect.Value { + v := new(EpochInfo) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_QueryEpochInfosResponse_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_QueryEpochInfosResponse_1_list) NewElement() protoreflect.Value { + v := new(EpochInfo) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_QueryEpochInfosResponse_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_QueryEpochInfosResponse protoreflect.MessageDescriptor + fd_QueryEpochInfosResponse_epochs protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_query_proto_init() + md_QueryEpochInfosResponse = File_cosmos_epochs_v1beta1_query_proto.Messages().ByName("QueryEpochInfosResponse") + fd_QueryEpochInfosResponse_epochs = md_QueryEpochInfosResponse.Fields().ByName("epochs") +} + +var _ protoreflect.Message = (*fastReflection_QueryEpochInfosResponse)(nil) + +type fastReflection_QueryEpochInfosResponse QueryEpochInfosResponse + +func (x *QueryEpochInfosResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryEpochInfosResponse)(x) +} + +func (x *QueryEpochInfosResponse) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryEpochInfosResponse_messageType fastReflection_QueryEpochInfosResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryEpochInfosResponse_messageType{} + +type fastReflection_QueryEpochInfosResponse_messageType struct{} + +func (x fastReflection_QueryEpochInfosResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryEpochInfosResponse)(nil) +} +func (x fastReflection_QueryEpochInfosResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryEpochInfosResponse) +} +func (x fastReflection_QueryEpochInfosResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryEpochInfosResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryEpochInfosResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryEpochInfosResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryEpochInfosResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryEpochInfosResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryEpochInfosResponse) New() protoreflect.Message { + return new(fastReflection_QueryEpochInfosResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryEpochInfosResponse) Interface() protoreflect.ProtoMessage { + return (*QueryEpochInfosResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryEpochInfosResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Epochs) != 0 { + value := protoreflect.ValueOfList(&_QueryEpochInfosResponse_1_list{list: &x.Epochs}) + if !f(fd_QueryEpochInfosResponse_epochs, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryEpochInfosResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + return len(x.Epochs) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + x.Epochs = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryEpochInfosResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + if len(x.Epochs) == 0 { + return protoreflect.ValueOfList(&_QueryEpochInfosResponse_1_list{}) + } + listValue := &_QueryEpochInfosResponse_1_list{list: &x.Epochs} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + lv := value.List() + clv := lv.(*_QueryEpochInfosResponse_1_list) + x.Epochs = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + if x.Epochs == nil { + x.Epochs = []*EpochInfo{} + } + value := &_QueryEpochInfosResponse_1_list{list: &x.Epochs} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryEpochInfosResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs": + list := []*EpochInfo{} + return protoreflect.ValueOfList(&_QueryEpochInfosResponse_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryEpochInfosResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryEpochInfosResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryEpochInfosResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.QueryEpochInfosResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryEpochInfosResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryEpochInfosResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryEpochInfosResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryEpochInfosResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryEpochInfosResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.Epochs) > 0 { + for _, e := range x.Epochs { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryEpochInfosResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Epochs) > 0 { + for iNdEx := len(x.Epochs) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Epochs[iNdEx]) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryEpochInfosResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryEpochInfosResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryEpochInfosResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Epochs", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Epochs = append(x.Epochs, &EpochInfo{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Epochs[len(x.Epochs)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryCurrentEpochRequest protoreflect.MessageDescriptor + fd_QueryCurrentEpochRequest_identifier protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_query_proto_init() + md_QueryCurrentEpochRequest = File_cosmos_epochs_v1beta1_query_proto.Messages().ByName("QueryCurrentEpochRequest") + fd_QueryCurrentEpochRequest_identifier = md_QueryCurrentEpochRequest.Fields().ByName("identifier") +} + +var _ protoreflect.Message = (*fastReflection_QueryCurrentEpochRequest)(nil) + +type fastReflection_QueryCurrentEpochRequest QueryCurrentEpochRequest + +func (x *QueryCurrentEpochRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryCurrentEpochRequest)(x) +} + +func (x *QueryCurrentEpochRequest) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryCurrentEpochRequest_messageType fastReflection_QueryCurrentEpochRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryCurrentEpochRequest_messageType{} + +type fastReflection_QueryCurrentEpochRequest_messageType struct{} + +func (x fastReflection_QueryCurrentEpochRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryCurrentEpochRequest)(nil) +} +func (x fastReflection_QueryCurrentEpochRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryCurrentEpochRequest) +} +func (x fastReflection_QueryCurrentEpochRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryCurrentEpochRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryCurrentEpochRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryCurrentEpochRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryCurrentEpochRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryCurrentEpochRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryCurrentEpochRequest) New() protoreflect.Message { + return new(fastReflection_QueryCurrentEpochRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryCurrentEpochRequest) Interface() protoreflect.ProtoMessage { + return (*QueryCurrentEpochRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryCurrentEpochRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Identifier != "" { + value := protoreflect.ValueOfString(x.Identifier) + if !f(fd_QueryCurrentEpochRequest_identifier, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryCurrentEpochRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + return x.Identifier != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + x.Identifier = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryCurrentEpochRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + value := x.Identifier + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + x.Identifier = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + panic(fmt.Errorf("field identifier of message cosmos.epochs.v1beta1.QueryCurrentEpochRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryCurrentEpochRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochRequest.identifier": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochRequest")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryCurrentEpochRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.QueryCurrentEpochRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryCurrentEpochRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryCurrentEpochRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryCurrentEpochRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryCurrentEpochRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Identifier) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryCurrentEpochRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Identifier) > 0 { + i -= len(x.Identifier) + copy(dAtA[i:], x.Identifier) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Identifier))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryCurrentEpochRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryCurrentEpochRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryCurrentEpochRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Identifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Identifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryCurrentEpochResponse protoreflect.MessageDescriptor + fd_QueryCurrentEpochResponse_current_epoch protoreflect.FieldDescriptor +) + +func init() { + file_cosmos_epochs_v1beta1_query_proto_init() + md_QueryCurrentEpochResponse = File_cosmos_epochs_v1beta1_query_proto.Messages().ByName("QueryCurrentEpochResponse") + fd_QueryCurrentEpochResponse_current_epoch = md_QueryCurrentEpochResponse.Fields().ByName("current_epoch") +} + +var _ protoreflect.Message = (*fastReflection_QueryCurrentEpochResponse)(nil) + +type fastReflection_QueryCurrentEpochResponse QueryCurrentEpochResponse + +func (x *QueryCurrentEpochResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryCurrentEpochResponse)(x) +} + +func (x *QueryCurrentEpochResponse) slowProtoReflect() protoreflect.Message { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryCurrentEpochResponse_messageType fastReflection_QueryCurrentEpochResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryCurrentEpochResponse_messageType{} + +type fastReflection_QueryCurrentEpochResponse_messageType struct{} + +func (x fastReflection_QueryCurrentEpochResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryCurrentEpochResponse)(nil) +} +func (x fastReflection_QueryCurrentEpochResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryCurrentEpochResponse) +} +func (x fastReflection_QueryCurrentEpochResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryCurrentEpochResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryCurrentEpochResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryCurrentEpochResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryCurrentEpochResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryCurrentEpochResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryCurrentEpochResponse) New() protoreflect.Message { + return new(fastReflection_QueryCurrentEpochResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryCurrentEpochResponse) Interface() protoreflect.ProtoMessage { + return (*QueryCurrentEpochResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryCurrentEpochResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.CurrentEpoch != int64(0) { + value := protoreflect.ValueOfInt64(x.CurrentEpoch) + if !f(fd_QueryCurrentEpochResponse_current_epoch, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryCurrentEpochResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + return x.CurrentEpoch != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + x.CurrentEpoch = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryCurrentEpochResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + value := x.CurrentEpoch + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + x.CurrentEpoch = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + panic(fmt.Errorf("field current_epoch of message cosmos.epochs.v1beta1.QueryCurrentEpochResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryCurrentEpochResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "cosmos.epochs.v1beta1.QueryCurrentEpochResponse.current_epoch": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: cosmos.epochs.v1beta1.QueryCurrentEpochResponse")) + } + panic(fmt.Errorf("message cosmos.epochs.v1beta1.QueryCurrentEpochResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryCurrentEpochResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in cosmos.epochs.v1beta1.QueryCurrentEpochResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryCurrentEpochResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryCurrentEpochResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryCurrentEpochResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryCurrentEpochResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryCurrentEpochResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.CurrentEpoch != 0 { + n += 1 + runtime.Sov(uint64(x.CurrentEpoch)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryCurrentEpochResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.CurrentEpoch != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.CurrentEpoch)) + i-- + dAtA[i] = 0x8 + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryCurrentEpochResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, 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 protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryCurrentEpochResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryCurrentEpochResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentEpoch", wireType) + } + x.CurrentEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.CurrentEpoch |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Since: cosmos-sdk 0.53 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: cosmos/epochs/v1beta1/query.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// QueryEpochInfosRequest defines the gRPC request structure for +// querying all epoch info. +type QueryEpochInfosRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *QueryEpochInfosRequest) Reset() { + *x = QueryEpochInfosRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryEpochInfosRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryEpochInfosRequest) ProtoMessage() {} + +// Deprecated: Use QueryEpochInfosRequest.ProtoReflect.Descriptor instead. +func (*QueryEpochInfosRequest) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_query_proto_rawDescGZIP(), []int{0} +} + +// QueryEpochInfosRequest defines the gRPC response structure for +// querying all epoch info. +type QueryEpochInfosResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Epochs []*EpochInfo `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs,omitempty"` +} + +func (x *QueryEpochInfosResponse) Reset() { + *x = QueryEpochInfosResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryEpochInfosResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryEpochInfosResponse) ProtoMessage() {} + +// Deprecated: Use QueryEpochInfosResponse.ProtoReflect.Descriptor instead. +func (*QueryEpochInfosResponse) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_query_proto_rawDescGZIP(), []int{1} +} + +func (x *QueryEpochInfosResponse) GetEpochs() []*EpochInfo { + if x != nil { + return x.Epochs + } + return nil +} + +// QueryCurrentEpochRequest defines the gRPC request structure for +// querying an epoch by its identifier. +type QueryCurrentEpochRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Identifier string `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` +} + +func (x *QueryCurrentEpochRequest) Reset() { + *x = QueryCurrentEpochRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryCurrentEpochRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryCurrentEpochRequest) ProtoMessage() {} + +// Deprecated: Use QueryCurrentEpochRequest.ProtoReflect.Descriptor instead. +func (*QueryCurrentEpochRequest) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_query_proto_rawDescGZIP(), []int{2} +} + +func (x *QueryCurrentEpochRequest) GetIdentifier() string { + if x != nil { + return x.Identifier + } + return "" +} + +// QueryCurrentEpochResponse defines the gRPC response structure for +// querying an epoch by its identifier. +type QueryCurrentEpochResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentEpoch int64 `protobuf:"varint,1,opt,name=current_epoch,json=currentEpoch,proto3" json:"current_epoch,omitempty"` +} + +func (x *QueryCurrentEpochResponse) Reset() { + *x = QueryCurrentEpochResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_cosmos_epochs_v1beta1_query_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryCurrentEpochResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryCurrentEpochResponse) ProtoMessage() {} + +// Deprecated: Use QueryCurrentEpochResponse.ProtoReflect.Descriptor instead. +func (*QueryCurrentEpochResponse) Descriptor() ([]byte, []int) { + return file_cosmos_epochs_v1beta1_query_proto_rawDescGZIP(), []int{3} +} + +func (x *QueryCurrentEpochResponse) GetCurrentEpoch() int64 { + if x != nil { + return x.CurrentEpoch + } + return 0 +} + +var File_cosmos_epochs_v1beta1_query_proto protoreflect.FileDescriptor + +var file_cosmos_epochs_v1beta1_query_proto_rawDesc = []byte{ + 0x0a, 0x21, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x15, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x22, 0x18, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, 0x0a, + 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, + 0x52, 0x06, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x22, 0x3a, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x22, 0x40, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x32, 0xbe, 0x02, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x92, 0x01, 0x0a, 0x0a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, + 0x2d, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x12, 0x9f, 0x01, 0x0a, 0x0c, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2f, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x26, 0x12, 0x24, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x42, 0xd3, 0x01, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, + 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x73, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x43, 0x45, 0x58, 0xaa, + 0x02, 0x15, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x2e, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x15, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, + 0x02, 0x21, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x17, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x3a, 0x3a, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_cosmos_epochs_v1beta1_query_proto_rawDescOnce sync.Once + file_cosmos_epochs_v1beta1_query_proto_rawDescData = file_cosmos_epochs_v1beta1_query_proto_rawDesc +) + +func file_cosmos_epochs_v1beta1_query_proto_rawDescGZIP() []byte { + file_cosmos_epochs_v1beta1_query_proto_rawDescOnce.Do(func() { + file_cosmos_epochs_v1beta1_query_proto_rawDescData = protoimpl.X.CompressGZIP(file_cosmos_epochs_v1beta1_query_proto_rawDescData) + }) + return file_cosmos_epochs_v1beta1_query_proto_rawDescData +} + +var file_cosmos_epochs_v1beta1_query_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_cosmos_epochs_v1beta1_query_proto_goTypes = []interface{}{ + (*QueryEpochInfosRequest)(nil), // 0: cosmos.epochs.v1beta1.QueryEpochInfosRequest + (*QueryEpochInfosResponse)(nil), // 1: cosmos.epochs.v1beta1.QueryEpochInfosResponse + (*QueryCurrentEpochRequest)(nil), // 2: cosmos.epochs.v1beta1.QueryCurrentEpochRequest + (*QueryCurrentEpochResponse)(nil), // 3: cosmos.epochs.v1beta1.QueryCurrentEpochResponse + (*EpochInfo)(nil), // 4: cosmos.epochs.v1beta1.EpochInfo +} +var file_cosmos_epochs_v1beta1_query_proto_depIdxs = []int32{ + 4, // 0: cosmos.epochs.v1beta1.QueryEpochInfosResponse.epochs:type_name -> cosmos.epochs.v1beta1.EpochInfo + 0, // 1: cosmos.epochs.v1beta1.Query.EpochInfos:input_type -> cosmos.epochs.v1beta1.QueryEpochInfosRequest + 2, // 2: cosmos.epochs.v1beta1.Query.CurrentEpoch:input_type -> cosmos.epochs.v1beta1.QueryCurrentEpochRequest + 1, // 3: cosmos.epochs.v1beta1.Query.EpochInfos:output_type -> cosmos.epochs.v1beta1.QueryEpochInfosResponse + 3, // 4: cosmos.epochs.v1beta1.Query.CurrentEpoch:output_type -> cosmos.epochs.v1beta1.QueryCurrentEpochResponse + 3, // [3:5] is the sub-list for method output_type + 1, // [1:3] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_cosmos_epochs_v1beta1_query_proto_init() } +func file_cosmos_epochs_v1beta1_query_proto_init() { + if File_cosmos_epochs_v1beta1_query_proto != nil { + return + } + file_cosmos_epochs_v1beta1_genesis_proto_init() + if !protoimpl.UnsafeEnabled { + file_cosmos_epochs_v1beta1_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryEpochInfosRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_epochs_v1beta1_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryEpochInfosResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_epochs_v1beta1_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryCurrentEpochRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_cosmos_epochs_v1beta1_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryCurrentEpochResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_cosmos_epochs_v1beta1_query_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_cosmos_epochs_v1beta1_query_proto_goTypes, + DependencyIndexes: file_cosmos_epochs_v1beta1_query_proto_depIdxs, + MessageInfos: file_cosmos_epochs_v1beta1_query_proto_msgTypes, + }.Build() + File_cosmos_epochs_v1beta1_query_proto = out.File + file_cosmos_epochs_v1beta1_query_proto_rawDesc = nil + file_cosmos_epochs_v1beta1_query_proto_goTypes = nil + file_cosmos_epochs_v1beta1_query_proto_depIdxs = nil +} diff --git a/api/cosmos/epochs/v1beta1/query_grpc.pb.go b/api/cosmos/epochs/v1beta1/query_grpc.pb.go new file mode 100644 index 0000000000..bc4dd21a51 --- /dev/null +++ b/api/cosmos/epochs/v1beta1/query_grpc.pb.go @@ -0,0 +1,169 @@ +// Since: cosmos-sdk 0.53 + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: cosmos/epochs/v1beta1/query.proto + +package epochsv1beta1 + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + Query_EpochInfos_FullMethodName = "/cosmos.epochs.v1beta1.Query/EpochInfos" + Query_CurrentEpoch_FullMethodName = "/cosmos.epochs.v1beta1.Query/CurrentEpoch" +) + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// Query defines the gRPC querier service. +type QueryClient interface { + // EpochInfos provide running epochInfos + EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) + // CurrentEpoch provide current epoch of specified identifier + CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) +} + +type queryClient struct { + cc grpc.ClientConnInterface +} + +func NewQueryClient(cc grpc.ClientConnInterface) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryEpochInfosResponse) + err := c.cc.Invoke(ctx, Query_EpochInfos_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(QueryCurrentEpochResponse) + err := c.cc.Invoke(ctx, Query_CurrentEpoch_FullMethodName, in, out, cOpts...) + 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. +// +// Query defines the gRPC querier service. +type QueryServer interface { + // EpochInfos provide running epochInfos + EpochInfos(context.Context, *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) + // CurrentEpoch provide current epoch of specified identifier + CurrentEpoch(context.Context, *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) + mustEmbedUnimplementedQueryServer() +} + +// UnimplementedQueryServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedQueryServer struct{} + +func (UnimplementedQueryServer) EpochInfos(context.Context, *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EpochInfos not implemented") +} +func (UnimplementedQueryServer) CurrentEpoch(context.Context, *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CurrentEpoch not implemented") +} +func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} +func (UnimplementedQueryServer) testEmbeddedByValue() {} + +// UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to QueryServer will +// result in compilation errors. +type UnsafeQueryServer interface { + mustEmbedUnimplementedQueryServer() +} + +func RegisterQueryServer(s grpc.ServiceRegistrar, srv QueryServer) { + // If the following call pancis, it indicates UnimplementedQueryServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&Query_ServiceDesc, srv) +} + +func _Query_EpochInfos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryEpochInfosRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).EpochInfos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_EpochInfos_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).EpochInfos(ctx, req.(*QueryEpochInfosRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CurrentEpoch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCurrentEpochRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CurrentEpoch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_CurrentEpoch_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CurrentEpoch(ctx, req.(*QueryCurrentEpochRequest)) + } + 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) +var Query_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "cosmos.epochs.v1beta1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EpochInfos", + Handler: _Query_EpochInfos_Handler, + }, + { + MethodName: "CurrentEpoch", + Handler: _Query_CurrentEpoch_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "cosmos/epochs/v1beta1/query.proto", +} diff --git a/proto/cosmos/epochs/module/v1/module.proto b/proto/cosmos/epochs/module/v1/module.proto new file mode 100644 index 0000000000..a21b9f36be --- /dev/null +++ b/proto/cosmos/epochs/module/v1/module.proto @@ -0,0 +1,13 @@ +// Since: cosmos-sdk 0.53 +syntax = "proto3"; + +package cosmos.epochs.module.v1; + +import "cosmos/app/v1alpha1/module.proto"; + +// Module is the config object of the epochs module. +message Module { + option (cosmos.app.v1alpha1.module) = { + go_import: "github.com/cosmos/cosmos-sdk/x/epochs" + }; +} \ No newline at end of file diff --git a/proto/cosmos/epochs/v1beta1/events.proto b/proto/cosmos/epochs/v1beta1/events.proto new file mode 100644 index 0000000000..2b37f204fb --- /dev/null +++ b/proto/cosmos/epochs/v1beta1/events.proto @@ -0,0 +1,17 @@ +// Since: cosmos-sdk 0.53 +syntax = "proto3"; + +package cosmos.epochs.v1beta1; + +option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types"; + +// EventEpochEnd is an event emitted when an epoch end. +message EventEpochEnd { + int64 epoch_number = 1; +} + +// EventEpochStart is an event emitted when an epoch start. +message EventEpochStart { + int64 epoch_number = 1; + int64 epoch_start_time = 2; +} diff --git a/proto/cosmos/epochs/v1beta1/genesis.proto b/proto/cosmos/epochs/v1beta1/genesis.proto new file mode 100644 index 0000000000..e274ac73e5 --- /dev/null +++ b/proto/cosmos/epochs/v1beta1/genesis.proto @@ -0,0 +1,61 @@ +// Since: cosmos-sdk 0.53 +syntax = "proto3"; +package cosmos.epochs.v1beta1; + +import "gogoproto/gogo.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types"; + +// EpochInfo is a struct that describes the data going into +// a timer defined by the x/epochs module. +message EpochInfo { + // identifier is a unique reference to this particular timer. + string identifier = 1; + // start_time is the time at which the timer first ever ticks. + // If start_time is in the future, the epoch will not begin until the start + // time. + google.protobuf.Timestamp start_time = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + // duration is the time in between epoch ticks. + // In order for intended behavior to be met, duration should + // be greater than the chains expected block time. + // Duration must be non-zero. + google.protobuf.Duration duration = 3 + [(gogoproto.nullable) = false, (gogoproto.stdduration) = true, (gogoproto.jsontag) = "duration,omitempty"]; + // current_epoch is the current epoch number, or in other words, + // how many times has the timer 'ticked'. + // The first tick (current_epoch=1) is defined as + // the first block whose blocktime is greater than the EpochInfo start_time. + int64 current_epoch = 4; + // current_epoch_start_time describes the start time of the current timer + // interval. The interval is (current_epoch_start_time, + // current_epoch_start_time + duration] When the timer ticks, this is set to + // current_epoch_start_time = last_epoch_start_time + duration only one timer + // tick for a given identifier can occur per block. + // + // NOTE! The current_epoch_start_time may diverge significantly from the + // wall-clock time the epoch began at. Wall-clock time of epoch start may be + // >> current_epoch_start_time. Suppose current_epoch_start_time = 10, + // duration = 5. Suppose the chain goes offline at t=14, and comes back online + // at t=30, and produces blocks at every successive time. (t=31, 32, etc.) + // * The t=30 block will start the epoch for (10, 15] + // * The t=31 block will start the epoch for (15, 20] + // * The t=32 block will start the epoch for (20, 25] + // * The t=33 block will start the epoch for (25, 30] + // * The t=34 block will start the epoch for (30, 35] + // * The **t=36** block will start the epoch for (35, 40] + google.protobuf.Timestamp current_epoch_start_time = 5 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; + // epoch_counting_started is a boolean, that indicates whether this + // epoch timer has began yet. + bool epoch_counting_started = 6; + reserved 7; + // current_epoch_start_height is the block height at which the current epoch + // started. (The block height at which the timer last ticked) + int64 current_epoch_start_height = 8; +} + +// GenesisState defines the epochs module's genesis state. +message GenesisState { + repeated EpochInfo epochs = 1 [(gogoproto.nullable) = false]; +} diff --git a/proto/cosmos/epochs/v1beta1/query.proto b/proto/cosmos/epochs/v1beta1/query.proto new file mode 100644 index 0000000000..52f846fd98 --- /dev/null +++ b/proto/cosmos/epochs/v1beta1/query.proto @@ -0,0 +1,43 @@ +// Since: cosmos-sdk 0.53 +syntax = "proto3"; +package cosmos.epochs.v1beta1; + +import "gogoproto/gogo.proto"; +import "google/api/annotations.proto"; +import "cosmos/epochs/v1beta1/genesis.proto"; + +option go_package = "github.com/cosmos/cosmos-sdk/x/epochs/types"; + +// Query defines the gRPC querier service. +service Query { + // EpochInfos provide running epochInfos + rpc EpochInfos(QueryEpochInfosRequest) returns (QueryEpochInfosResponse) { + option (google.api.http).get = "/cosmos/epochs/v1beta1/epochs"; + } + // CurrentEpoch provide current epoch of specified identifier + rpc CurrentEpoch(QueryCurrentEpochRequest) returns (QueryCurrentEpochResponse) { + option (google.api.http).get = "/cosmos/epochs/v1beta1/current_epoch"; + } +} + +// QueryEpochInfosRequest defines the gRPC request structure for +// querying all epoch info. +message QueryEpochInfosRequest {} + +// QueryEpochInfosRequest defines the gRPC response structure for +// querying all epoch info. +message QueryEpochInfosResponse { + repeated EpochInfo epochs = 1 [(gogoproto.nullable) = false]; +} + +// QueryCurrentEpochRequest defines the gRPC request structure for +// querying an epoch by its identifier. +message QueryCurrentEpochRequest { + string identifier = 1; +} + +// QueryCurrentEpochResponse defines the gRPC response structure for +// querying an epoch by its identifier. +message QueryCurrentEpochResponse { + int64 current_epoch = 1; +} \ No newline at end of file diff --git a/simapp/app.go b/simapp/app.go index 22923ec6cf..a8da73b14c 100644 --- a/simapp/app.go +++ b/simapp/app.go @@ -81,6 +81,9 @@ import ( distr "github.com/cosmos/cosmos-sdk/x/distribution" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/epochs" + epochskeeper "github.com/cosmos/cosmos-sdk/x/epochs/keeper" + epochstypes "github.com/cosmos/cosmos-sdk/x/epochs/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" @@ -154,6 +157,7 @@ type SimApp struct { NFTKeeper nftkeeper.Keeper ConsensusParamsKeeper consensusparamkeeper.Keeper CircuitKeeper circuitkeeper.Keeper + EpochsKeeper epochskeeper.Keeper // the module manager ModuleManager *module.Manager @@ -260,6 +264,7 @@ func NewSimApp( authzkeeper.StoreKey, nftkeeper.StoreKey, group.StoreKey, + epochstypes.StoreKey, ) // register streaming services @@ -381,6 +386,17 @@ func NewSimApp( // If evidence needs to be handled for the app, set routes in router here and seal app.EvidenceKeeper = *evidenceKeeper + app.EpochsKeeper = epochskeeper.NewKeeper( + runtime.NewKVStoreService(keys[epochstypes.StoreKey]), + appCodec, + ) + + app.EpochsKeeper.SetHooks( + epochstypes.NewMultiEpochHooks( + // insert epoch hooks receivers here + ), + ) + /**** Module Options ****/ // NOTE: Any module instantiated in the module manager that is later modified @@ -406,6 +422,7 @@ func NewSimApp( nftmodule.NewAppModule(appCodec, app.NFTKeeper, app.AccountKeeper, app.BankKeeper, app.interfaceRegistry), consensus.NewAppModule(appCodec, app.ConsensusParamsKeeper), circuit.NewAppModule(appCodec, app.CircuitKeeper), + epochs.NewAppModule(appCodec, app.EpochsKeeper), ) // BasicModuleManager defines the module BasicManager is in charge of setting up basic, @@ -439,6 +456,7 @@ func NewSimApp( stakingtypes.ModuleName, genutiltypes.ModuleName, authz.ModuleName, + epochstypes.ModuleName, ) app.ModuleManager.SetOrderEndBlockers( govtypes.ModuleName, @@ -469,6 +487,7 @@ func NewSimApp( vestingtypes.ModuleName, consensusparamtypes.ModuleName, circuittypes.ModuleName, + epochstypes.ModuleName, } app.ModuleManager.SetOrderInitGenesis(genesisModuleOrder...) app.ModuleManager.SetOrderExportGenesis(genesisModuleOrder...) diff --git a/simapp/app_config.go b/simapp/app_config.go index b6c5d3171b..51b5cb9208 100644 --- a/simapp/app_config.go +++ b/simapp/app_config.go @@ -13,6 +13,7 @@ import ( circuitmodulev1 "cosmossdk.io/api/cosmos/circuit/module/v1" consensusmodulev1 "cosmossdk.io/api/cosmos/consensus/module/v1" distrmodulev1 "cosmossdk.io/api/cosmos/distribution/module/v1" + epochsmodulev1 "cosmossdk.io/api/cosmos/epochs/module/v1" evidencemodulev1 "cosmossdk.io/api/cosmos/evidence/module/v1" feegrantmodulev1 "cosmossdk.io/api/cosmos/feegrant/module/v1" genutilmodulev1 "cosmossdk.io/api/cosmos/genutil/module/v1" @@ -52,6 +53,8 @@ import ( consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" _ "github.com/cosmos/cosmos-sdk/x/distribution" // import for side-effects distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + _ "github.com/cosmos/cosmos-sdk/x/epochs" // import for side-effects + epochstypes "github.com/cosmos/cosmos-sdk/x/epochs/types" "github.com/cosmos/cosmos-sdk/x/genutil" genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" @@ -113,6 +116,7 @@ var ( evidencetypes.ModuleName, stakingtypes.ModuleName, authz.ModuleName, + epochstypes.ModuleName, }, EndBlockers: []string{ govtypes.ModuleName, @@ -146,6 +150,7 @@ var ( upgradetypes.ModuleName, vestingtypes.ModuleName, circuittypes.ModuleName, + epochstypes.ModuleName, }, // When ExportGenesis is not specified, the export genesis module order // is equal to the init genesis order @@ -244,6 +249,10 @@ var ( Name: circuittypes.ModuleName, Config: appconfig.WrapAny(&circuitmodulev1.Module{}), }, + { + Name: epochstypes.ModuleName, + Config: appconfig.WrapAny(&epochsmodulev1.Module{}), + }, }, }), depinject.Supply( diff --git a/simapp/app_di.go b/simapp/app_di.go index 41256bcb77..d6e93ffe7c 100644 --- a/simapp/app_di.go +++ b/simapp/app_di.go @@ -37,6 +37,7 @@ import ( bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + epochskeeper "github.com/cosmos/cosmos-sdk/x/epochs/keeper" govkeeper "github.com/cosmos/cosmos-sdk/x/gov/keeper" groupkeeper "github.com/cosmos/cosmos-sdk/x/group/keeper" mintkeeper "github.com/cosmos/cosmos-sdk/x/mint/keeper" @@ -78,6 +79,7 @@ type SimApp struct { NFTKeeper nftkeeper.Keeper ConsensusParamsKeeper consensuskeeper.Keeper CircuitKeeper circuitkeeper.Keeper + EpochsKeeper epochskeeper.Keeper // simulation manager sm *module.SimulationManager @@ -177,6 +179,7 @@ func NewSimApp( &app.NFTKeeper, &app.ConsensusParamsKeeper, &app.CircuitKeeper, + &app.EpochsKeeper, ); err != nil { panic(err) } diff --git a/simapp/app_test.go b/simapp/app_test.go index df441b11dd..011e6c932e 100644 --- a/simapp/app_test.go +++ b/simapp/app_test.go @@ -17,8 +17,11 @@ import ( "cosmossdk.io/depinject" "cosmossdk.io/log" "cosmossdk.io/x/evidence" + evidencetypes "cosmossdk.io/x/evidence/types" + "cosmossdk.io/x/feegrant" feegrantmodule "cosmossdk.io/x/feegrant/module" "cosmossdk.io/x/upgrade" + upgradetypes "cosmossdk.io/x/upgrade/types" "github.com/cosmos/cosmos-sdk/baseapp" "github.com/cosmos/cosmos-sdk/runtime" @@ -29,17 +32,29 @@ import ( "github.com/cosmos/cosmos-sdk/types/module" "github.com/cosmos/cosmos-sdk/types/msgservice" "github.com/cosmos/cosmos-sdk/x/auth" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/auth/vesting" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "github.com/cosmos/cosmos-sdk/x/authz" authzmodule "github.com/cosmos/cosmos-sdk/x/authz/module" "github.com/cosmos/cosmos-sdk/x/bank" banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" "github.com/cosmos/cosmos-sdk/x/distribution" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" + "github.com/cosmos/cosmos-sdk/x/epochs" + epochstypes "github.com/cosmos/cosmos-sdk/x/epochs/types" "github.com/cosmos/cosmos-sdk/x/genutil" + genutiltypes "github.com/cosmos/cosmos-sdk/x/genutil/types" "github.com/cosmos/cosmos-sdk/x/gov" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + grouptypes "github.com/cosmos/cosmos-sdk/x/group" group "github.com/cosmos/cosmos-sdk/x/group/module" "github.com/cosmos/cosmos-sdk/x/mint" + minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" "github.com/cosmos/cosmos-sdk/x/slashing" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" "github.com/cosmos/cosmos-sdk/x/staking" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" ) func TestSimAppExportAndBlockedAddrs(t *testing.T) { @@ -193,20 +208,21 @@ func TestRunMigrations(t *testing.T) { _, err = app.ModuleManager.RunMigrations( app.NewContextLegacy(true, cmtproto.Header{Height: app.LastBlockHeight()}), configurator, module.VersionMap{ - "bank": 1, - "auth": auth.AppModule{}.ConsensusVersion(), - "authz": authzmodule.AppModule{}.ConsensusVersion(), - "staking": staking.AppModule{}.ConsensusVersion(), - "mint": mint.AppModule{}.ConsensusVersion(), - "distribution": distribution.AppModule{}.ConsensusVersion(), - "slashing": slashing.AppModule{}.ConsensusVersion(), - "gov": gov.AppModule{}.ConsensusVersion(), - "group": group.AppModule{}.ConsensusVersion(), - "upgrade": upgrade.AppModule{}.ConsensusVersion(), - "vesting": vesting.AppModule{}.ConsensusVersion(), - "feegrant": feegrantmodule.AppModule{}.ConsensusVersion(), - "evidence": evidence.AppModule{}.ConsensusVersion(), - "genutil": genutil.AppModule{}.ConsensusVersion(), + banktypes.ModuleName: 1, + authtypes.ModuleName: auth.AppModule{}.ConsensusVersion(), + authz.ModuleName: authzmodule.AppModule{}.ConsensusVersion(), + stakingtypes.ModuleName: staking.AppModule{}.ConsensusVersion(), + minttypes.ModuleName: mint.AppModule{}.ConsensusVersion(), + distrtypes.ModuleName: distribution.AppModule{}.ConsensusVersion(), + slashingtypes.ModuleName: slashing.AppModule{}.ConsensusVersion(), + govtypes.ModuleName: gov.AppModule{}.ConsensusVersion(), + grouptypes.ModuleName: group.AppModule{}.ConsensusVersion(), + upgradetypes.ModuleName: upgrade.AppModule{}.ConsensusVersion(), + vestingtypes.ModuleName: vesting.AppModule{}.ConsensusVersion(), + feegrant.ModuleName: feegrantmodule.AppModule{}.ConsensusVersion(), + evidencetypes.ModuleName: evidence.AppModule{}.ConsensusVersion(), + genutiltypes.ModuleName: genutil.AppModule{}.ConsensusVersion(), + epochstypes.ModuleName: epochs.AppModule{}.ConsensusVersion(), }, ) if tc.expRunErr { diff --git a/simapp/go.mod b/simapp/go.mod index 5f39817237..3f6c666137 100644 --- a/simapp/go.mod +++ b/simapp/go.mod @@ -214,6 +214,7 @@ require ( // Below are the long-lived replace of the SimApp replace ( + cosmossdk.io/api => ../api // use cosmos fork of keyring github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 // Simapp always use the latest version of the cosmos-sdk diff --git a/simapp/go.sum b/simapp/go.sum index 26fb26bb28..2b07535d94 100644 --- a/simapp/go.sum +++ b/simapp/go.sum @@ -182,8 +182,6 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= -cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/client/v2 v2.0.0-beta.5.0.20241121152743-3dad36d9a29e h1:NqQEVIjRqSdsAfTI9uDRZ1oU/cQuCoAbUuIkndQM+Bo= cosmossdk.io/client/v2 v2.0.0-beta.5.0.20241121152743-3dad36d9a29e/go.mod h1:4p0P6o0ro+FizakJUYS9SeM94RNbv0thLmkHRw5o5as= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= diff --git a/tests/go.mod b/tests/go.mod index 0b9fac5ab6..fb7676fa2a 100644 --- a/tests/go.mod +++ b/tests/go.mod @@ -212,6 +212,7 @@ require ( // Below are the long-lived replace for tests. replace ( + cosmossdk.io/api => ../api // We always want to test against the latest version of the simapp. cosmossdk.io/simapp => ../simapp github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0 diff --git a/tests/go.sum b/tests/go.sum index 35962d242c..6bf35edeab 100644 --- a/tests/go.sum +++ b/tests/go.sum @@ -182,8 +182,6 @@ cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xX cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cosmossdk.io/api v0.7.6 h1:PC20PcXy1xYKH2KU4RMurVoFjjKkCgYRbVAD4PdqUuY= -cosmossdk.io/api v0.7.6/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= cosmossdk.io/client/v2 v2.0.0-beta.5.0.20241121152743-3dad36d9a29e h1:NqQEVIjRqSdsAfTI9uDRZ1oU/cQuCoAbUuIkndQM+Bo= cosmossdk.io/client/v2 v2.0.0-beta.5.0.20241121152743-3dad36d9a29e/go.mod h1:4p0P6o0ro+FizakJUYS9SeM94RNbv0thLmkHRw5o5as= cosmossdk.io/collections v0.4.0 h1:PFmwj2W8szgpD5nOd8GWH6AbYNi1f2J6akWXJ7P5t9s= diff --git a/x/epochs/README.md b/x/epochs/README.md new file mode 100644 index 0000000000..7b0b0b2857 --- /dev/null +++ b/x/epochs/README.md @@ -0,0 +1,177 @@ +--- +sidebar_position: 1 +--- + +# `x/epochs` + +## Abstract + +Often in the SDK, we would like to run certain code every-so often. The +purpose of `epochs` module is to allow other modules to set that they +would like to be signaled once every period. So another module can +specify it wants to execute code once a week, starting at UTC-time = x. +`epochs` creates a generalized epoch interface to other modules so that +they can easily be signaled upon such events. + +## Contents + +1. **[Concept](#concepts)** +2. **[State](#state)** +3. **[Events](#events)** +4. **[Keeper](#keepers)** +5. **[Hooks](#hooks)** +6. **[Queries](#queries)** + +## Concepts + +The epochs module defines on-chain timers that execute at fixed time intervals. +Other SDK modules can then register logic to be executed at the timer ticks. +We refer to the period in between two timer ticks as an "epoch". + +Every timer has a unique identifier. +Every epoch will have a start time, and an end time, where `end time = start time + timer interval`. +On mainnet, we only utilize one identifier, with a time interval of `one day`. + +The timer will tick at the first block whose block time is greater than the timer end time, +and set the start as the prior timer end time. (Notably, it's not set to the block time!) +This means that if the chain has been down for a while, you will get one timer tick per block, +until the timer has caught up. + +## State + +The Epochs module keeps a single `EpochInfo` per identifier. +This contains the current state of the timer with the corresponding identifier. +Its fields are modified at every timer tick. +EpochInfos are initialized as part of genesis initialization or upgrade logic, +and are only modified on begin blockers. + +## Events + +The `epochs` module emits the following events: + +### BeginBlocker + +| Type | Attribute Key | Attribute Value | +| ----------- | ------------- | --------------- | +| epoch_start | epoch_number | {epoch_number} | +| epoch_start | start_time | {start_time} | + +### EndBlocker + +| Type | Attribute Key | Attribute Value | +| --------- | ------------- | --------------- | +| epoch_end | epoch_number | {epoch_number} | + +## Keepers + +### Keeper functions + +Epochs keeper module provides utility functions to manage epochs. + +## Hooks + +```go + // the first block whose timestamp is after the duration is counted as the end of the epoch + AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber int64) + // new epoch is next block of epoch end block + BeforeEpochStart(ctx sdk.Context, epochIdentifier string, epochNumber int64) +``` + +### How modules receive hooks + +On hook receiver function of other modules, they need to filter +`epochIdentifier` and only do executions for only specific +epochIdentifier. Filtering epochIdentifier could be in `Params` of other +modules so that they can be modified by governance. + +This is the standard dev UX of this: + +```golang +func (k MyModuleKeeper) AfterEpochEnd(ctx sdk.Context, epochIdentifier string, epochNumber int64) { + params := k.GetParams(ctx) + if epochIdentifier == params.DistrEpochIdentifier { + // my logic + } +} +``` + +### Panic isolation + +If a given epoch hook panics, its state update is reverted, but we keep +proceeding through the remaining hooks. This allows more advanced epoch +logic to be used, without concern over state machine halting, or halting +subsequent modules. + +This does mean that if there is behavior you expect from a prior epoch +hook, and that epoch hook reverted, your hook may also have an issue. So +do keep in mind "what if a prior hook didn't get executed" in the safety +checks you consider for a new epoch hook. + +## Queries + +The Epochs module provides the following queries to check the module's state. + +```protobuf +service Query { + // EpochInfos provide running epochInfos + rpc EpochInfos(QueryEpochsInfoRequest) returns (QueryEpochsInfoResponse) {} + // CurrentEpoch provide current epoch of specified identifier + rpc CurrentEpoch(QueryCurrentEpochRequest) returns (QueryCurrentEpochResponse) {} +} +``` + +### Epoch Infos + +Query the currently running epochInfos + +```sh + query epochs epoch-infos +``` + +:::details Example + +An example output: + +```sh +epochs: +- current_epoch: "183" + current_epoch_start_height: "2438409" + current_epoch_start_time: "2021-12-18T17:16:09.898160996Z" + duration: 86400s + epoch_counting_started: true + identifier: day + start_time: "2021-06-18T17:00:00Z" +- current_epoch: "26" + current_epoch_start_height: "2424854" + current_epoch_start_time: "2021-12-17T17:02:07.229632445Z" + duration: 604800s + epoch_counting_started: true + identifier: week + start_time: "2021-06-18T17:00:00Z" +``` + +::: + +### Current Epoch + +Query the current epoch by the specified identifier + +```sh + query epochs current-epoch [identifier] +``` + +:::details Example + +Query the current `day` epoch: + +```sh + query epochs current-epoch day +``` + +Which in this example outputs: + +```sh +current_epoch: "183" +``` + +::: diff --git a/x/epochs/autocli.go b/x/epochs/autocli.go new file mode 100644 index 0000000000..decba091d0 --- /dev/null +++ b/x/epochs/autocli.go @@ -0,0 +1,27 @@ +package epochs + +import ( + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + epochsv1beta1 "cosmossdk.io/api/cosmos/epochs/v1beta1" +) + +// AutoCLIOptions implements the autocli.HasAutoCLIConfig interface. +func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { + return &autocliv1.ModuleOptions{ + Query: &autocliv1.ServiceCommandDescriptor{ + Service: epochsv1beta1.Query_ServiceDesc.ServiceName, + RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "EpochInfos", + Use: "epoch-infos", + Short: "Query running epoch infos", + }, + { + RpcMethod: "CurrentEpoch", + Use: "current-epoch", + Short: "Query current epoch by specified identifier", + }, + }, + }, + } +} diff --git a/x/epochs/depinject.go b/x/epochs/depinject.go new file mode 100644 index 0000000000..f9cd652943 --- /dev/null +++ b/x/epochs/depinject.go @@ -0,0 +1,71 @@ +package epochs + +import ( + "fmt" + "maps" + "slices" + + modulev1 "cosmossdk.io/api/cosmos/epochs/module/v1" + "cosmossdk.io/core/appmodule" + "cosmossdk.io/core/store" + "cosmossdk.io/depinject" + "cosmossdk.io/depinject/appconfig" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/x/epochs/keeper" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +var _ depinject.OnePerModuleType = AppModule{} + +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (am AppModule) IsOnePerModuleType() {} + +func init() { + appconfig.RegisterModule(&modulev1.Module{}, + appconfig.Provide(ProvideModule), + appconfig.Invoke(InvokeSetHooks), + ) +} + +type ModuleInputs struct { + depinject.In + + Config *modulev1.Module + Cdc codec.Codec + StoreService store.KVStoreService +} + +type ModuleOutputs struct { + depinject.Out + + EpochKeeper keeper.Keeper + Module appmodule.AppModule +} + +func ProvideModule(in ModuleInputs) ModuleOutputs { + k := keeper.NewKeeper(in.StoreService, in.Cdc) + m := NewAppModule(in.Cdc, k) + return ModuleOutputs{EpochKeeper: k, Module: m} +} + +func InvokeSetHooks(keeper keeper.Keeper, hooks map[string]types.EpochHooksWrapper) error { + if hooks == nil { + return nil + } + + // Default ordering is lexical by module name. + // Explicit ordering can be added to the module config if required. + modNames := slices.Sorted(maps.Keys(hooks)) + var multiHooks types.MultiEpochHooks + for _, modName := range modNames { + hook, ok := hooks[modName] + if !ok { + return fmt.Errorf("can't find epoch hooks for module %s", modName) + } + multiHooks = append(multiHooks, hook) + } + + keeper.SetHooks(multiHooks) + return nil +} diff --git a/x/epochs/keeper/abci.go b/x/epochs/keeper/abci.go new file mode 100644 index 0000000000..2685cb950f --- /dev/null +++ b/x/epochs/keeper/abci.go @@ -0,0 +1,91 @@ +package keeper + +import ( + "fmt" + + "github.com/cosmos/cosmos-sdk/telemetry" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// BeginBlocker of epochs module. +func (k *Keeper) BeginBlocker(ctx sdk.Context) error { + start := telemetry.Now() + defer telemetry.ModuleMeasureSince(types.ModuleName, start, telemetry.MetricKeyBeginBlocker) + + header := ctx.BlockHeader() + err := k.EpochInfo.Walk( + ctx, + nil, + func(key string, epochInfo types.EpochInfo) (stop bool, err error) { + // If blocktime < initial epoch start time, return + if header.Time.Before(epochInfo.StartTime) { + return false, nil + } + // if epoch counting hasn't started, signal we need to start. + shouldInitialEpochStart := !epochInfo.EpochCountingStarted + + epochEndTime := epochInfo.CurrentEpochStartTime.Add(epochInfo.Duration) + shouldEpochStart := (header.Time.After(epochEndTime)) || shouldInitialEpochStart + + if !shouldEpochStart { + return false, nil + } + epochInfo.CurrentEpochStartHeight = header.Height + + if shouldInitialEpochStart { + epochInfo.EpochCountingStarted = true + epochInfo.CurrentEpoch = 1 + epochInfo.CurrentEpochStartTime = epochInfo.StartTime + ctx.Logger().Debug(fmt.Sprintf("Starting new epoch with identifier %s epoch number %d", epochInfo.Identifier, epochInfo.CurrentEpoch)) + } else { + err := ctx.EventManager().EmitTypedEvent(&types.EventEpochEnd{ + EpochNumber: epochInfo.CurrentEpoch, + }) + if err != nil { + return false, err + } + if err != nil { + return false, nil + } + + cacheCtx, writeFn := ctx.CacheContext() + if err := k.AfterEpochEnd(cacheCtx, epochInfo.Identifier, epochInfo.CurrentEpoch); err != nil { + // purposely ignoring the error here not to halt the chain if the hook fails + ctx.Logger().Error(fmt.Sprintf("Error after epoch end with identifier %s epoch number %d", epochInfo.Identifier, epochInfo.CurrentEpoch)) + } else { + writeFn() + } + + epochInfo.CurrentEpoch += 1 + epochInfo.CurrentEpochStartTime = epochInfo.CurrentEpochStartTime.Add(epochInfo.Duration) + ctx.Logger().Debug(fmt.Sprintf("Starting epoch with identifier %s epoch number %d", epochInfo.Identifier, epochInfo.CurrentEpoch)) + } + + // emit new epoch start event, set epoch info, and run BeforeEpochStart hook + err = ctx.EventManager().EmitTypedEvent(&types.EventEpochStart{ + EpochNumber: epochInfo.CurrentEpoch, + EpochStartTime: epochInfo.CurrentEpochStartTime.Unix(), + }) + if err != nil { + return false, err + } + err = k.EpochInfo.Set(ctx, epochInfo.Identifier, epochInfo) + if err != nil { + ctx.Logger().Error(fmt.Sprintf("Error set epoch info with identifier %s epoch number %d", epochInfo.Identifier, epochInfo.CurrentEpoch)) + return false, nil + } + + cacheCtx, writeFn := ctx.CacheContext() + if err := k.BeforeEpochStart(cacheCtx, epochInfo.Identifier, epochInfo.CurrentEpoch); err != nil { + // purposely ignoring the error here not to halt the chain if the hook fails + ctx.Logger().Error(fmt.Sprintf("Error before epoch start with identifier %s epoch number %d", epochInfo.Identifier, epochInfo.CurrentEpoch)) + } else { + writeFn() + } + + return false, nil + }, + ) + return err +} diff --git a/x/epochs/keeper/abci_test.go b/x/epochs/keeper/abci_test.go new file mode 100644 index 0000000000..154a145a78 --- /dev/null +++ b/x/epochs/keeper/abci_test.go @@ -0,0 +1,190 @@ +package keeper_test + +import ( + "maps" + "slices" + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// This test is responsible for testing how epochs increment based off +// of their initial conditions, and subsequent block height / times. +func (suite *KeeperTestSuite) TestEpochInfoBeginBlockChanges() { + block1Time := time.Unix(1656907200, 0).UTC() + const defaultIdentifier = "hourly" + const defaultDuration = time.Hour + // eps is short for epsilon - in this case a negligible amount of time. + const eps = time.Nanosecond + + tests := map[string]struct { + // if identifier, duration is not set, we make it defaultIdentifier and defaultDuration. + // EpochCountingStarted, if unspecified, is inferred by CurrentEpoch == 0 + // StartTime is inferred to be block1Time if left blank. + initialEpochInfo types.EpochInfo + blockHeightTimePairs map[int]time.Time + expEpochInfo types.EpochInfo + }{ + "First block running at exactly start time sets epoch tick": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 1, CurrentEpochStartTime: block1Time, CurrentEpochStartHeight: 1}, + }, + "First block run sets start time, subsequent blocks within timer interval do not cause timer tick": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(time.Second), 3: block1Time.Add(time.Minute), 4: block1Time.Add(30 * time.Minute)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 1, CurrentEpochStartTime: block1Time, CurrentEpochStartHeight: 1}, + }, + "Second block at exactly timer interval later does not tick": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(defaultDuration)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 1, CurrentEpochStartTime: block1Time, CurrentEpochStartHeight: 1}, + }, + "Second block at timer interval + epsilon later does tick": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(defaultDuration).Add(eps)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 2, CurrentEpochStartTime: block1Time.Add(time.Hour), CurrentEpochStartHeight: 2}, + }, + "Downtime recovery (many intervals), first block causes 1 tick and sets current start time 1 interval ahead": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(24 * time.Hour)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 2, CurrentEpochStartTime: block1Time.Add(time.Hour), CurrentEpochStartHeight: 2}, + }, + "Downtime recovery (many intervals), second block is at tick 2, w/ start time 2 intervals ahead": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(24 * time.Hour), 3: block1Time.Add(24 * time.Hour).Add(eps)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 3, CurrentEpochStartTime: block1Time.Add(2 * time.Hour), CurrentEpochStartHeight: 3}, + }, + "Many blocks between first and second tick": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 1, CurrentEpochStartTime: block1Time}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(time.Second), 3: block1Time.Add(2 * time.Second), 4: block1Time.Add(time.Hour).Add(eps)}, + expEpochInfo: types.EpochInfo{StartTime: block1Time, CurrentEpoch: 2, CurrentEpochStartTime: block1Time.Add(time.Hour), CurrentEpochStartHeight: 4}, + }, + "Distinct identifier and duration still works": { + initialEpochInfo: types.EpochInfo{Identifier: "hello", Duration: time.Minute, StartTime: block1Time, CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + blockHeightTimePairs: map[int]time.Time{2: block1Time.Add(time.Second), 3: block1Time.Add(time.Minute).Add(eps)}, + expEpochInfo: types.EpochInfo{Identifier: "hello", Duration: time.Minute, StartTime: block1Time, CurrentEpoch: 2, CurrentEpochStartTime: block1Time.Add(time.Minute), CurrentEpochStartHeight: 3}, + }, + "StartTime in future won't get ticked on first block": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time.Add(time.Second), CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + // currentEpochStartHeight is 1 because that's when the timer was created on-chain + expEpochInfo: types.EpochInfo{StartTime: block1Time.Add(time.Second), CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}, CurrentEpochStartHeight: 1}, + }, + "StartTime in past will get ticked on first block": { + initialEpochInfo: types.EpochInfo{StartTime: block1Time.Add(-time.Second), CurrentEpoch: 0, CurrentEpochStartTime: time.Time{}}, + expEpochInfo: types.EpochInfo{StartTime: block1Time.Add(-time.Second), CurrentEpoch: 1, CurrentEpochStartTime: block1Time.Add(-time.Second), CurrentEpochStartHeight: 1}, + }, + } + for name, test := range tests { + suite.Run(name, func() { + suite.SetupTest() + suite.Ctx = suite.Ctx.WithBlockHeight(1).WithBlockTime(block1Time) + initialEpoch := initializeBlankEpochInfoFields(test.initialEpochInfo, defaultIdentifier, defaultDuration) + err := suite.EpochsKeeper.AddEpochInfo(suite.Ctx, initialEpoch) + suite.Require().NoError(err) + err = suite.EpochsKeeper.BeginBlocker(suite.Ctx) + suite.Require().NoError(err) + + // get sorted heights + heights := slices.SortedFunc(maps.Keys(test.blockHeightTimePairs), func(i, j int) int { + if test.blockHeightTimePairs[i].Before(test.blockHeightTimePairs[j]) { + return -1 + } else if test.blockHeightTimePairs[i].After(test.blockHeightTimePairs[j]) { + return 1 + } + return 0 + }) + for _, h := range heights { + // for each height in order, run begin block + suite.Ctx = suite.Ctx.WithBlockHeight(int64(h)).WithBlockTime(test.blockHeightTimePairs[h]) + err := suite.EpochsKeeper.BeginBlocker(suite.Ctx) + suite.Require().NoError(err) + } + expEpoch := initializeBlankEpochInfoFields(test.expEpochInfo, initialEpoch.Identifier, initialEpoch.Duration) + actEpoch, err := suite.EpochsKeeper.EpochInfo.Get(suite.Ctx, initialEpoch.Identifier) + suite.Require().NoError(err) + suite.Require().Equal(expEpoch, actEpoch) + }) + } +} + +// initializeBlankEpochInfoFields set identifier, duration and epochCountingStarted if blank in epoch +func initializeBlankEpochInfoFields(epoch types.EpochInfo, identifier string, duration time.Duration) types.EpochInfo { + if epoch.Identifier == "" { + epoch.Identifier = identifier + } + if epoch.Duration == time.Duration(0) { + epoch.Duration = duration + } + epoch.EpochCountingStarted = (epoch.CurrentEpoch != 0) + return epoch +} + +func TestEpochStartingOneMonthAfterInitGenesis(t *testing.T) { + ctx, epochsKeeper := Setup(t) + // On init genesis, default epochs information is set + // To check init genesis again, should make it fresh status + epochInfos, err := epochsKeeper.AllEpochInfos(ctx) + require.NoError(t, err) + for _, epochInfo := range epochInfos { + err := epochsKeeper.EpochInfo.Remove(ctx, epochInfo.Identifier) + require.NoError(t, err) + } + + now := time.Now() + week := time.Hour * 24 * 7 + month := time.Hour * 24 * 30 + initialBlockHeight := int64(1) + ctx = ctx.WithBlockHeight(initialBlockHeight).WithBlockTime(now) + + err = epochsKeeper.InitGenesis(ctx, types.GenesisState{ + Epochs: []types.EpochInfo{ + { + Identifier: "monthly", + StartTime: now.Add(month), + Duration: time.Hour * 24 * 30, + CurrentEpoch: 0, + CurrentEpochStartHeight: ctx.BlockHeight(), + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, + }, + }) + require.NoError(t, err) + + // epoch not started yet + epochInfo, err := epochsKeeper.EpochInfo.Get(ctx, "monthly") + require.NoError(t, err) + require.Equal(t, epochInfo.CurrentEpoch, int64(0)) + require.Equal(t, epochInfo.CurrentEpochStartHeight, initialBlockHeight) + require.Equal(t, epochInfo.CurrentEpochStartTime, time.Time{}) + require.Equal(t, epochInfo.EpochCountingStarted, false) + + // after 1 week + ctx = ctx.WithBlockHeight(2).WithBlockTime(now.Add(week)) + err = epochsKeeper.BeginBlocker(ctx) + require.NoError(t, err) + + // epoch not started yet + epochInfo, err = epochsKeeper.EpochInfo.Get(ctx, "monthly") + require.NoError(t, err) + require.Equal(t, epochInfo.CurrentEpoch, int64(0)) + require.Equal(t, epochInfo.CurrentEpochStartHeight, initialBlockHeight) + require.Equal(t, epochInfo.CurrentEpochStartTime, time.Time{}) + require.Equal(t, epochInfo.EpochCountingStarted, false) + + // after 1 month + ctx = ctx.WithBlockHeight(3).WithBlockTime(now.Add(month)) + err = epochsKeeper.BeginBlocker(ctx) + require.NoError(t, err) + + // epoch started + epochInfo, err = epochsKeeper.EpochInfo.Get(ctx, "monthly") + require.NoError(t, err) + require.Equal(t, epochInfo.CurrentEpoch, int64(1)) + require.Equal(t, epochInfo.CurrentEpochStartHeight, ctx.BlockHeight()) + require.Equal(t, epochInfo.CurrentEpochStartTime.UTC().String(), now.Add(month).UTC().String()) + require.Equal(t, epochInfo.EpochCountingStarted, true) +} diff --git a/x/epochs/keeper/epoch.go b/x/epochs/keeper/epoch.go new file mode 100644 index 0000000000..45f5ef7202 --- /dev/null +++ b/x/epochs/keeper/epoch.go @@ -0,0 +1,66 @@ +package keeper + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// GetEpochInfo returns epoch info by identifier. +func (k *Keeper) GetEpochInfo(ctx sdk.Context, identifier string) (types.EpochInfo, error) { + return k.EpochInfo.Get(ctx, identifier) +} + +// AddEpochInfo adds a new epoch info. Will return an error if the epoch fails validation, +// or re-uses an existing identifier. +// This method also sets the start time if left unset, and sets the epoch start height. +func (k *Keeper) AddEpochInfo(ctx sdk.Context, epoch types.EpochInfo) error { + err := epoch.Validate() + if err != nil { + return err + } + // Check if identifier already exists + isExist, err := k.EpochInfo.Has(ctx, epoch.Identifier) + if err != nil { + return err + } + if isExist { + return fmt.Errorf("epoch with identifier %s already exists", epoch.Identifier) + } + + // Initialize empty and default epoch values + if epoch.StartTime.IsZero() { + epoch.StartTime = ctx.BlockTime() + } + if epoch.CurrentEpochStartHeight == 0 { + epoch.CurrentEpochStartHeight = ctx.BlockHeight() + } + return k.EpochInfo.Set(ctx, epoch.Identifier, epoch) +} + +// AllEpochInfos iterate through epochs to return all epochs info. +func (k *Keeper) AllEpochInfos(ctx sdk.Context) ([]types.EpochInfo, error) { + epochs := []types.EpochInfo{} + err := k.EpochInfo.Walk( + ctx, + nil, + func(key string, value types.EpochInfo) (stop bool, err error) { + epochs = append(epochs, value) + return false, nil + }, + ) + return epochs, err +} + +// NumBlocksSinceEpochStart returns the number of blocks since the epoch started. +// if the epoch started on block N, then calling this during block N (after BeforeEpochStart) +// would return 0. +// Calling it any point in block N+1 (assuming the epoch doesn't increment) would return 1. +func (k *Keeper) NumBlocksSinceEpochStart(ctx sdk.Context, identifier string) (int64, error) { + epoch, err := k.EpochInfo.Get(ctx, identifier) + if err != nil { + return 0, fmt.Errorf("epoch with identifier %s not found", identifier) + } + return ctx.BlockHeight() - epoch.CurrentEpochStartHeight, nil +} diff --git a/x/epochs/keeper/epoch_test.go b/x/epochs/keeper/epoch_test.go new file mode 100644 index 0000000000..defd2dbd61 --- /dev/null +++ b/x/epochs/keeper/epoch_test.go @@ -0,0 +1,101 @@ +package keeper_test + +import ( + "time" + + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +func (s *KeeperTestSuite) TestAddEpochInfo() { + defaultIdentifier := "default_add_epoch_info_id" + defaultDuration := time.Hour + startBlockHeight := int64(100) + startBlockTime := time.Unix(1656907200, 0).UTC() + tests := map[string]struct { + addedEpochInfo types.EpochInfo + expErr bool + expEpochInfo types.EpochInfo + }{ + "simple_add": { + addedEpochInfo: types.EpochInfo{ + Identifier: defaultIdentifier, + StartTime: time.Time{}, + Duration: defaultDuration, + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, + expErr: false, + expEpochInfo: types.EpochInfo{ + Identifier: defaultIdentifier, + StartTime: startBlockTime, + Duration: defaultDuration, + CurrentEpoch: 0, + CurrentEpochStartHeight: startBlockHeight, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, + }, + "zero_duration": { + addedEpochInfo: types.EpochInfo{ + Identifier: defaultIdentifier, + StartTime: time.Time{}, + Duration: time.Duration(0), + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + }, + expErr: true, + }, + } + for name, test := range tests { + s.Run(name, func() { + s.SetupTest() + s.Ctx = s.Ctx.WithBlockHeight(startBlockHeight).WithBlockTime(startBlockTime) + err := s.EpochsKeeper.AddEpochInfo(s.Ctx, test.addedEpochInfo) + if !test.expErr { + s.Require().NoError(err) + actualEpochInfo, err := s.EpochsKeeper.EpochInfo.Get(s.Ctx, test.addedEpochInfo.Identifier) + s.Require().NoError(err) + s.Require().Equal(test.expEpochInfo, actualEpochInfo) + } else { + s.Require().Error(err) + } + }) + } +} + +func (s *KeeperTestSuite) TestDuplicateAddEpochInfo() { + identifier := "duplicate_add_epoch_info" + epochInfo := types.NewGenesisEpochInfo(identifier, time.Hour*24*30) + err := s.EpochsKeeper.AddEpochInfo(s.Ctx, epochInfo) + s.Require().NoError(err) + err = s.EpochsKeeper.AddEpochInfo(s.Ctx, epochInfo) + s.Require().Error(err) +} + +func (s *KeeperTestSuite) TestEpochLifeCycle() { + s.SetupTest() + + epochInfo := types.NewGenesisEpochInfo("monthly", time.Hour*24*30) + err := s.EpochsKeeper.AddEpochInfo(s.Ctx, epochInfo) + s.Require().NoError(err) + epochInfoSaved, err := s.EpochsKeeper.EpochInfo.Get(s.Ctx, "monthly") + s.Require().NoError(err) + // setup expected epoch info + expectedEpochInfo := epochInfo + expectedEpochInfo.StartTime = s.Ctx.BlockTime() + expectedEpochInfo.CurrentEpochStartHeight = s.Ctx.BlockHeight() + s.Require().Equal(expectedEpochInfo, epochInfoSaved) + + allEpochs, err := s.EpochsKeeper.AllEpochInfos(s.Ctx) + s.Require().NoError(err) + s.Require().Len(allEpochs, 5) + s.Require().Equal(allEpochs[0].Identifier, "day") // alphabetical order + s.Require().Equal(allEpochs[1].Identifier, "hour") + s.Require().Equal(allEpochs[2].Identifier, "minute") + s.Require().Equal(allEpochs[3].Identifier, "monthly") + s.Require().Equal(allEpochs[4].Identifier, "week") +} diff --git a/x/epochs/keeper/genesis.go b/x/epochs/keeper/genesis.go new file mode 100644 index 0000000000..316f1139de --- /dev/null +++ b/x/epochs/keeper/genesis.go @@ -0,0 +1,28 @@ +package keeper + +import ( + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// InitGenesis sets epoch info from genesis +func (k *Keeper) InitGenesis(ctx sdk.Context, genState types.GenesisState) error { + for _, epoch := range genState.Epochs { + err := k.AddEpochInfo(ctx, epoch) + if err != nil { + return err + } + } + return nil +} + +// ExportGenesis returns the capability module's exported genesis. +func (k *Keeper) ExportGenesis(ctx sdk.Context) (*types.GenesisState, error) { + genesis := types.DefaultGenesis() + epochs, err := k.AllEpochInfos(ctx) + if err != nil { + return nil, err + } + genesis.Epochs = epochs + return genesis, nil +} diff --git a/x/epochs/keeper/genesis_test.go b/x/epochs/keeper/genesis_test.go new file mode 100644 index 0000000000..55175ae7d1 --- /dev/null +++ b/x/epochs/keeper/genesis_test.go @@ -0,0 +1,95 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +func TestEpochsExportGenesis(t *testing.T) { + ctx, epochsKeeper := Setup(t) + + chainStartTime := ctx.BlockTime() + chainStartHeight := ctx.BlockHeight() + + genesis, err := epochsKeeper.ExportGenesis(ctx) + require.NoError(t, err) + require.Len(t, genesis.Epochs, 4) + + expectedEpochs := types.DefaultGenesis().Epochs + for i := 0; i < len(expectedEpochs); i++ { + expectedEpochs[i].CurrentEpochStartHeight = chainStartHeight + expectedEpochs[i].StartTime = chainStartTime + } + require.Equal(t, expectedEpochs, genesis.Epochs) +} + +func TestEpochsInitGenesis(t *testing.T) { + ctx, epochsKeeper := Setup(t) + + // On init genesis, default epochs information is set + // To check init genesis again, should make it fresh status + epochInfos, err := epochsKeeper.AllEpochInfos(ctx) + require.NoError(t, err) + for _, epochInfo := range epochInfos { + err := epochsKeeper.EpochInfo.Remove(ctx, epochInfo.Identifier) + require.NoError(t, err) + } + + // now := time.Now() + ctx = ctx.WithBlockHeight(1).WithBlockTime(time.Now().UTC()) + + // test genesisState validation + genesisState := types.GenesisState{ + Epochs: []types.EpochInfo{ + { + Identifier: "monthly", + StartTime: time.Time{}, + Duration: time.Hour * 24, + CurrentEpoch: 0, + CurrentEpochStartHeight: ctx.BlockHeight(), + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: true, + }, + { + Identifier: "monthly", + StartTime: time.Time{}, + Duration: time.Hour * 24, + CurrentEpoch: 0, + CurrentEpochStartHeight: ctx.BlockHeight(), + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: true, + }, + }, + } + require.EqualError(t, genesisState.Validate(), "epoch identifier should be unique") + + genesisState = types.GenesisState{ + Epochs: []types.EpochInfo{ + { + Identifier: "monthly", + StartTime: time.Time{}, + Duration: time.Hour * 24, + CurrentEpoch: 0, + CurrentEpochStartHeight: ctx.BlockHeight(), + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: true, + }, + }, + } + + err = epochsKeeper.InitGenesis(ctx, genesisState) + require.NoError(t, err) + epochInfo, err := epochsKeeper.EpochInfo.Get(ctx, "monthly") + require.NoError(t, err) + require.Equal(t, epochInfo.Identifier, "monthly") + require.Equal(t, epochInfo.StartTime.UTC().String(), ctx.BlockTime().UTC().String()) + require.Equal(t, epochInfo.Duration, time.Hour*24) + require.Equal(t, epochInfo.CurrentEpoch, int64(0)) + require.Equal(t, epochInfo.CurrentEpochStartHeight, ctx.BlockHeight()) + require.Equal(t, epochInfo.CurrentEpochStartTime.UTC().String(), time.Time{}.String()) + require.Equal(t, epochInfo.EpochCountingStarted, true) +} diff --git a/x/epochs/keeper/grpc_query.go b/x/epochs/keeper/grpc_query.go new file mode 100644 index 0000000000..2e76899528 --- /dev/null +++ b/x/epochs/keeper/grpc_query.go @@ -0,0 +1,54 @@ +package keeper + +import ( + "context" + "errors" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +var _ types.QueryServer = Querier{} + +// Querier defines a wrapper around the x/epochs keeper providing gRPC method +// handlers. +type Querier struct { + Keeper +} + +// NewQuerier initializes new querier. +func NewQuerier(k Keeper) Querier { + return Querier{Keeper: k} +} + +// EpochInfos provide running epochInfos. +func (q Querier) EpochInfos(ctx context.Context, _ *types.QueryEpochInfosRequest) (*types.QueryEpochInfosResponse, error) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + + epochs, err := q.Keeper.AllEpochInfos(sdkCtx) + return &types.QueryEpochInfosResponse{ + Epochs: epochs, + }, err +} + +// CurrentEpoch provides current epoch of specified identifier. +func (q Querier) CurrentEpoch(ctx context.Context, req *types.QueryCurrentEpochRequest) (*types.QueryCurrentEpochResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "empty request") + } + if req.Identifier == "" { + return nil, status.Error(codes.InvalidArgument, "identifier is empty") + } + + info, err := q.Keeper.EpochInfo.Get(ctx, req.Identifier) + if err != nil { + return nil, errors.New("not available identifier") + } + + return &types.QueryCurrentEpochResponse{ + CurrentEpoch: info.CurrentEpoch, + }, nil +} diff --git a/x/epochs/keeper/grpc_query_test.go b/x/epochs/keeper/grpc_query_test.go new file mode 100644 index 0000000000..0101e68197 --- /dev/null +++ b/x/epochs/keeper/grpc_query_test.go @@ -0,0 +1,22 @@ +package keeper_test + +import ( + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +func (s *KeeperTestSuite) TestQueryEpochInfos() { + s.SetupTest() + queryClient := s.queryClient + + // Check that querying epoch infos on default genesis returns the default genesis epoch infos + epochInfosResponse, err := queryClient.EpochInfos(s.Ctx, &types.QueryEpochInfosRequest{}) + s.Require().NoError(err) + s.Require().Len(epochInfosResponse.Epochs, 4) + expectedEpochs := types.DefaultGenesis().Epochs + for id := range expectedEpochs { + expectedEpochs[id].StartTime = s.Ctx.BlockTime() + expectedEpochs[id].CurrentEpochStartHeight = s.Ctx.BlockHeight() + } + + s.Require().Equal(expectedEpochs, epochInfosResponse.Epochs) +} diff --git a/x/epochs/keeper/hooks.go b/x/epochs/keeper/hooks.go new file mode 100644 index 0000000000..558b17b4a6 --- /dev/null +++ b/x/epochs/keeper/hooks.go @@ -0,0 +1,27 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// Hooks gets the hooks for governance Keeper +func (k *Keeper) Hooks() types.EpochHooks { + if k.hooks == nil { + // return a no-op implementation if no hooks are set + return types.MultiEpochHooks{} + } + + return k.hooks +} + +// AfterEpochEnd gets called at the end of the epoch, end of epoch is the timestamp of first block produced after epoch duration. +func (k *Keeper) AfterEpochEnd(ctx context.Context, identifier string, epochNumber int64) error { + return k.Hooks().AfterEpochEnd(ctx, identifier, epochNumber) +} + +// BeforeEpochStart new epoch is next block of epoch end block +func (k *Keeper) BeforeEpochStart(ctx context.Context, identifier string, epochNumber int64) error { + return k.Hooks().BeforeEpochStart(ctx, identifier, epochNumber) +} diff --git a/x/epochs/keeper/keeper.go b/x/epochs/keeper/keeper.go new file mode 100644 index 0000000000..ba5f6299b1 --- /dev/null +++ b/x/epochs/keeper/keeper.go @@ -0,0 +1,45 @@ +package keeper + +import ( + "cosmossdk.io/collections" + "cosmossdk.io/core/store" + + "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +type Keeper struct { + storeService store.KVStoreService + + cdc codec.BinaryCodec + hooks types.EpochHooks + + Schema collections.Schema + EpochInfo collections.Map[string, types.EpochInfo] +} + +// NewKeeper returns a new keeper by codec and storeKey inputs. +func NewKeeper(storeService store.KVStoreService, cdc codec.BinaryCodec) Keeper { + sb := collections.NewSchemaBuilder(storeService) + k := Keeper{ + storeService: storeService, + cdc: cdc, + EpochInfo: collections.NewMap(sb, types.KeyPrefixEpoch, "epoch_info", collections.StringKey, codec.CollValue[types.EpochInfo](cdc)), + } + + schema, err := sb.Build() + if err != nil { + panic(err) + } + k.Schema = schema + return k +} + +// SetHooks sets the hooks on the x/epochs keeper. +func (k *Keeper) SetHooks(eh types.EpochHooks) { + if k.hooks != nil { + panic("cannot set epochs hooks twice") + } + + k.hooks = eh +} diff --git a/x/epochs/keeper/keeper_test.go b/x/epochs/keeper/keeper_test.go new file mode 100644 index 0000000000..dad485b488 --- /dev/null +++ b/x/epochs/keeper/keeper_test.go @@ -0,0 +1,89 @@ +package keeper_test + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" + "github.com/stretchr/testify/suite" + + storetypes "cosmossdk.io/store/types" + + "github.com/cosmos/cosmos-sdk/baseapp" + "github.com/cosmos/cosmos-sdk/runtime" + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + moduletestutil "github.com/cosmos/cosmos-sdk/types/module/testutil" + epochskeeper "github.com/cosmos/cosmos-sdk/x/epochs/keeper" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +type KeeperTestSuite struct { + suite.Suite + Ctx sdk.Context + EpochsKeeper epochskeeper.Keeper + queryClient types.QueryClient +} + +func (s *KeeperTestSuite) SetupTest() { + ctx, epochsKeeper := Setup(s.T()) + + s.Ctx = ctx + s.EpochsKeeper = epochsKeeper + queryRouter := baseapp.NewGRPCQueryRouter() + cfg := module.NewConfigurator(nil, nil, queryRouter) + types.RegisterQueryServer(cfg.QueryServer(), epochskeeper.NewQuerier(s.EpochsKeeper)) + grpcQueryService := &baseapp.QueryServiceTestHelper{ + GRPCQueryRouter: queryRouter, + Ctx: s.Ctx, + } + encCfg := moduletestutil.MakeTestEncodingConfig() + grpcQueryService.SetInterfaceRegistry(encCfg.InterfaceRegistry) + s.queryClient = types.NewQueryClient(grpcQueryService) +} + +func Setup(t *testing.T) (sdk.Context, epochskeeper.Keeper) { + t.Helper() + + key := storetypes.NewKVStoreKey(types.StoreKey) + storeService := runtime.NewKVStoreService(key) + testCtx := testutil.DefaultContextWithDB(t, key, storetypes.NewTransientStoreKey("transient_test")) + ctx := testCtx.Ctx.WithBlockTime(time.Now().UTC()) + encCfg := moduletestutil.MakeTestEncodingConfig() + + epochsKeeper := epochskeeper.NewKeeper( + storeService, + encCfg.Codec, + ) + epochsKeeper.SetHooks(types.NewMultiEpochHooks()) + ctx = ctx.WithBlockTime(time.Now().UTC()).WithBlockHeight(1).WithChainID("epochs") + + err := epochsKeeper.InitGenesis(ctx, *types.DefaultGenesis()) + require.NoError(t, err) + SetEpochStartTime(ctx, epochsKeeper) + + return ctx, epochsKeeper +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} + +func SetEpochStartTime(ctx sdk.Context, epochsKeeper epochskeeper.Keeper) { + epochs, err := epochsKeeper.AllEpochInfos(ctx) + if err != nil { + panic(err) + } + for _, epoch := range epochs { + epoch.StartTime = ctx.BlockTime() + err := epochsKeeper.EpochInfo.Remove(ctx, epoch.Identifier) + if err != nil { + panic(err) + } + err = epochsKeeper.AddEpochInfo(ctx, epoch) + if err != nil { + panic(err) + } + } +} diff --git a/x/epochs/module.go b/x/epochs/module.go new file mode 100644 index 0000000000..d2d9e40981 --- /dev/null +++ b/x/epochs/module.go @@ -0,0 +1,155 @@ +package epochs + +import ( + "context" + "encoding/json" + "fmt" + + gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime" + "google.golang.org/grpc" + + "cosmossdk.io/core/appmodule" + + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/codec" + codectypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + simtypes "github.com/cosmos/cosmos-sdk/types/simulation" + "github.com/cosmos/cosmos-sdk/x/epochs/keeper" + "github.com/cosmos/cosmos-sdk/x/epochs/simulation" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +var ( + _ module.AppModuleSimulation = AppModule{} + _ module.HasGenesis = AppModule{} + + _ appmodule.AppModule = AppModule{} + _ appmodule.HasBeginBlocker = AppModule{} +) + +const ConsensusVersion = 1 + +// AppModule implements the AppModule interface for the epochs module. +type AppModule struct { + cdc codec.Codec + keeper keeper.Keeper +} + +// NewAppModule creates a new AppModule object. +func NewAppModule(cdc codec.Codec, keeper keeper.Keeper) AppModule { + return AppModule{ + cdc: cdc, + keeper: keeper, + } +} + +// IsAppModule implements the appmodule.AppModule interface. +func (am AppModule) IsAppModule() {} + +// Name returns the epochs module's name. +// Deprecated: kept for legacy reasons. +func (AppModule) Name() string { + return types.ModuleName +} + +// RegisterLegacyAminoCodec registers the epochs module's types for the given codec. +func (AppModule) RegisterLegacyAminoCodec(_ *codec.LegacyAmino) {} + +func (AppModule) RegisterInterfaces(_ codectypes.InterfaceRegistry) {} + +// RegisterGRPCGatewayRoutes registers the gRPC Gateway routes for the epochs module. +func (AppModule) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *gwruntime.ServeMux) { + if err := types.RegisterQueryHandlerClient(context.Background(), mux, types.NewQueryClient(clientCtx)); err != nil { + panic(err) + } +} + +// RegisterServices registers module services. +func (am AppModule) RegisterServices(registrar grpc.ServiceRegistrar) error { + types.RegisterQueryServer(registrar, keeper.NewQuerier(am.keeper)) + return nil +} + +// DefaultGenesis returns the epochs module's default genesis state. +func (am AppModule) DefaultGenesis(_ codec.JSONCodec) json.RawMessage { + data, err := am.cdc.MarshalJSON(types.DefaultGenesis()) + if err != nil { + panic(err) + } + return data +} + +// ValidateGenesis performs genesis state validation for the epochs module. +func (am AppModule) ValidateGenesis(_ codec.JSONCodec, _ client.TxEncodingConfig, bz json.RawMessage) error { + var gs types.GenesisState + if err := am.cdc.UnmarshalJSON(bz, &gs); err != nil { + return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) + } + + return gs.Validate() +} + +// InitGenesis performs the epochs module's genesis initialization +func (am AppModule) InitGenesis(ctx sdk.Context, _ codec.JSONCodec, bz json.RawMessage) { + var gs types.GenesisState + err := am.cdc.UnmarshalJSON(bz, &gs) + if err != nil { + panic(fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err)) + } + + if err := am.keeper.InitGenesis(ctx, gs); err != nil { + panic(err) + } +} + +// ExportGenesis returns the epochs module's exported genesis state as raw JSON bytes. +func (am AppModule) ExportGenesis(ctx sdk.Context, _ codec.JSONCodec) json.RawMessage { + gs, err := am.keeper.ExportGenesis(ctx) + if err != nil { + panic(err) + } + + bz, err := am.cdc.MarshalJSON(gs) + if err != nil { + panic(err) + } + + return bz +} + +// ConsensusVersion implements HasConsensusVersion +func (AppModule) ConsensusVersion() uint64 { return ConsensusVersion } + +// BeginBlock executes all ABCI BeginBlock logic respective to the epochs module. +func (am AppModule) BeginBlock(ctx context.Context) error { + sdkCtx := sdk.UnwrapSDKContext(ctx) + return am.keeper.BeginBlocker(sdkCtx) +} + +// AppModuleSimulation functions + +// WeightedOperations is a no-op. +func (am AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { + return nil +} + +// GenerateGenesisState creates a randomized GenState of the epochs module. +func (AppModule) GenerateGenesisState(simState *module.SimulationState) { + simulation.RandomizedGenState(simState) +} + +// RegisterStoreDecoder registers a decoder for epochs module's types +func (am AppModule) RegisterStoreDecoder(sdr simtypes.StoreDecoderRegistry) { + sdr[types.StoreKey] = simtypes.NewStoreDecoderFuncFromCollectionsSchema(am.keeper.Schema) +} + +// TODO add when we have collections full support with schema +/* +// ModuleCodec implements schema.HasModuleCodec. +// It allows the indexer to decode the module's KVPairUpdate. +func (am AppModule) ModuleCodec() (schema.ModuleCodec, error) { + return am.keeper.Schema.ModuleCodec(collections.IndexingOptions{}) +} +*/ diff --git a/x/epochs/simulation/genesis.go b/x/epochs/simulation/genesis.go new file mode 100644 index 0000000000..fc5d1f77cc --- /dev/null +++ b/x/epochs/simulation/genesis.go @@ -0,0 +1,38 @@ +package simulation + +import ( + "math/rand" + "strconv" + "time" + + "github.com/cosmos/cosmos-sdk/types/module" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +// GenDuration randomized GenDuration +func GenDuration(r *rand.Rand) time.Duration { + return time.Hour * time.Duration(r.Intn(168)+1) // between 1 hour to 1 week +} + +func RandomizedEpochs(r *rand.Rand) []types.EpochInfo { + // Gen max 10 epoch + n := r.Intn(11) + var epochs []types.EpochInfo + for i := 0; i < n; i++ { + identifier := "identifier-" + strconv.Itoa(i) + duration := GenDuration(r) + epoch := types.NewGenesisEpochInfo(identifier, duration) + epochs = append(epochs, epoch) + } + return epochs +} + +// RandomizedGenState generates a random GenesisState for distribution +func RandomizedGenState(simState *module.SimulationState) { + epochs := RandomizedEpochs(simState.Rand) + epochsGenesis := types.GenesisState{ + Epochs: epochs, + } + + simState.GenState[types.ModuleName] = simState.Cdc.MustMarshalJSON(&epochsGenesis) +} diff --git a/x/epochs/types/events.pb.go b/x/epochs/types/events.pb.go new file mode 100644 index 0000000000..59466abf00 --- /dev/null +++ b/x/epochs/types/events.pb.go @@ -0,0 +1,495 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/epochs/v1beta1/events.proto + +package types + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// EventEpochEnd is an event emitted when an epoch end. +type EventEpochEnd struct { + EpochNumber int64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` +} + +func (m *EventEpochEnd) Reset() { *m = EventEpochEnd{} } +func (m *EventEpochEnd) String() string { return proto.CompactTextString(m) } +func (*EventEpochEnd) ProtoMessage() {} +func (*EventEpochEnd) Descriptor() ([]byte, []int) { + return fileDescriptor_691f9b4b0a500cb4, []int{0} +} +func (m *EventEpochEnd) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventEpochEnd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventEpochEnd.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 *EventEpochEnd) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventEpochEnd.Merge(m, src) +} +func (m *EventEpochEnd) XXX_Size() int { + return m.Size() +} +func (m *EventEpochEnd) XXX_DiscardUnknown() { + xxx_messageInfo_EventEpochEnd.DiscardUnknown(m) +} + +var xxx_messageInfo_EventEpochEnd proto.InternalMessageInfo + +func (m *EventEpochEnd) GetEpochNumber() int64 { + if m != nil { + return m.EpochNumber + } + return 0 +} + +// EventEpochStart is an event emitted when an epoch start. +type EventEpochStart struct { + EpochNumber int64 `protobuf:"varint,1,opt,name=epoch_number,json=epochNumber,proto3" json:"epoch_number,omitempty"` + EpochStartTime int64 `protobuf:"varint,2,opt,name=epoch_start_time,json=epochStartTime,proto3" json:"epoch_start_time,omitempty"` +} + +func (m *EventEpochStart) Reset() { *m = EventEpochStart{} } +func (m *EventEpochStart) String() string { return proto.CompactTextString(m) } +func (*EventEpochStart) ProtoMessage() {} +func (*EventEpochStart) Descriptor() ([]byte, []int) { + return fileDescriptor_691f9b4b0a500cb4, []int{1} +} +func (m *EventEpochStart) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventEpochStart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventEpochStart.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 *EventEpochStart) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventEpochStart.Merge(m, src) +} +func (m *EventEpochStart) XXX_Size() int { + return m.Size() +} +func (m *EventEpochStart) XXX_DiscardUnknown() { + xxx_messageInfo_EventEpochStart.DiscardUnknown(m) +} + +var xxx_messageInfo_EventEpochStart proto.InternalMessageInfo + +func (m *EventEpochStart) GetEpochNumber() int64 { + if m != nil { + return m.EpochNumber + } + return 0 +} + +func (m *EventEpochStart) GetEpochStartTime() int64 { + if m != nil { + return m.EpochStartTime + } + return 0 +} + +func init() { + proto.RegisterType((*EventEpochEnd)(nil), "cosmos.epochs.v1beta1.EventEpochEnd") + proto.RegisterType((*EventEpochStart)(nil), "cosmos.epochs.v1beta1.EventEpochStart") +} + +func init() { + proto.RegisterFile("cosmos/epochs/v1beta1/events.proto", fileDescriptor_691f9b4b0a500cb4) +} + +var fileDescriptor_691f9b4b0a500cb4 = []byte{ + // 211 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0x4a, 0xce, 0x2f, 0xce, + 0xcd, 0x2f, 0xd6, 0x4f, 0x2d, 0xc8, 0x4f, 0xce, 0x28, 0xd6, 0x2f, 0x33, 0x4c, 0x4a, 0x2d, 0x49, + 0x34, 0xd4, 0x4f, 0x2d, 0x4b, 0xcd, 0x2b, 0x29, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, + 0x85, 0xa8, 0xd1, 0x83, 0xa8, 0xd1, 0x83, 0xaa, 0x51, 0x32, 0xe2, 0xe2, 0x75, 0x05, 0x29, 0x73, + 0x05, 0x09, 0xbb, 0xe6, 0xa5, 0x08, 0x29, 0x72, 0xf1, 0x80, 0x95, 0xc4, 0xe7, 0x95, 0xe6, 0x26, + 0xa5, 0x16, 0x49, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0x71, 0x83, 0xc5, 0xfc, 0xc0, 0x42, 0x4a, + 0x71, 0x5c, 0xfc, 0x08, 0x3d, 0xc1, 0x25, 0x89, 0x45, 0x25, 0x44, 0xe8, 0x12, 0xd2, 0xe0, 0x12, + 0x80, 0x28, 0x29, 0x06, 0xe9, 0x88, 0x2f, 0xc9, 0xcc, 0x4d, 0x95, 0x60, 0x02, 0x2b, 0xe3, 0x4b, + 0x85, 0x1b, 0x14, 0x92, 0x99, 0x9b, 0xea, 0xe4, 0x7a, 0xe2, 0x91, 0x1c, 0xe3, 0x85, 0x47, 0x72, + 0x8c, 0x0f, 0x1e, 0xc9, 0x31, 0x4e, 0x78, 0x2c, 0xc7, 0x70, 0xe1, 0xb1, 0x1c, 0xc3, 0x8d, 0xc7, + 0x72, 0x0c, 0x51, 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x50, + 0x3f, 0x43, 0x28, 0xdd, 0xe2, 0x94, 0x6c, 0xfd, 0x0a, 0x58, 0x00, 0x94, 0x54, 0x16, 0xa4, 0x16, + 0x27, 0xb1, 0x81, 0x3d, 0x6e, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0xf7, 0x2e, 0xe8, 0x93, 0x1e, + 0x01, 0x00, 0x00, +} + +func (m *EventEpochEnd) 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 *EventEpochEnd) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventEpochEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.EpochNumber != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.EpochNumber)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EventEpochStart) 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 *EventEpochStart) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventEpochStart) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.EpochStartTime != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.EpochStartTime)) + i-- + dAtA[i] = 0x10 + } + if m.EpochNumber != 0 { + i = encodeVarintEvents(dAtA, i, uint64(m.EpochNumber)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { + offset -= sovEvents(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *EventEpochEnd) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EpochNumber != 0 { + n += 1 + sovEvents(uint64(m.EpochNumber)) + } + return n +} + +func (m *EventEpochStart) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EpochNumber != 0 { + n += 1 + sovEvents(uint64(m.EpochNumber)) + } + if m.EpochStartTime != 0 { + n += 1 + sovEvents(uint64(m.EpochStartTime)) + } + return n +} + +func sovEvents(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozEvents(x uint64) (n int) { + return sovEvents(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *EventEpochEnd) 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 ErrIntOverflowEvents + } + 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: EventEpochEnd: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventEpochEnd: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochNumber", wireType) + } + m.EpochNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochNumber |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventEpochStart) 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 ErrIntOverflowEvents + } + 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: EventEpochStart: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventEpochStart: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochNumber", wireType) + } + m.EpochNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochNumber |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochStartTime", wireType) + } + m.EpochStartTime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochStartTime |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipEvents(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvents + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvents + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowEvents + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthEvents + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupEvents + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthEvents + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthEvents = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowEvents = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupEvents = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/epochs/types/genesis.go b/x/epochs/types/genesis.go new file mode 100644 index 0000000000..1cdea892df --- /dev/null +++ b/x/epochs/types/genesis.go @@ -0,0 +1,69 @@ +package types + +import ( + "errors" + "time" +) + +// DefaultIndex is the default capability global index. +const DefaultIndex uint64 = 1 + +func NewGenesisState(epochs []EpochInfo) *GenesisState { + return &GenesisState{Epochs: epochs} +} + +// DefaultGenesis returns the default Capability genesis state. +func DefaultGenesis() *GenesisState { + epochs := []EpochInfo{ + NewGenesisEpochInfo("day", time.Hour*24), // alphabetical order + NewGenesisEpochInfo("hour", time.Hour), + NewGenesisEpochInfo("minute", time.Minute), + NewGenesisEpochInfo("week", time.Hour*24*7), + } + return NewGenesisState(epochs) +} + +// Validate performs basic genesis state validation returning an error upon any +// failure. +func (gs GenesisState) Validate() error { + epochIdentifiers := map[string]bool{} + for _, epoch := range gs.Epochs { + if err := epoch.Validate(); err != nil { + return err + } + if epochIdentifiers[epoch.Identifier] { + return errors.New("epoch identifier should be unique") + } + epochIdentifiers[epoch.Identifier] = true + } + return nil +} + +// Validate also validates epoch info. +func (epoch EpochInfo) Validate() error { + if epoch.Identifier == "" { + return errors.New("epoch identifier should NOT be empty") + } + if epoch.Duration == 0 { + return errors.New("epoch duration should NOT be 0") + } + if epoch.CurrentEpoch < 0 { + return errors.New("epoch CurrentEpoch must be non-negative") + } + if epoch.CurrentEpochStartHeight < 0 { + return errors.New("epoch CurrentEpochStartHeight must be non-negative") + } + return nil +} + +func NewGenesisEpochInfo(identifier string, duration time.Duration) EpochInfo { + return EpochInfo{ + Identifier: identifier, + StartTime: time.Time{}, + Duration: duration, + CurrentEpoch: 0, + CurrentEpochStartHeight: 0, + CurrentEpochStartTime: time.Time{}, + EpochCountingStarted: false, + } +} diff --git a/x/epochs/types/genesis.pb.go b/x/epochs/types/genesis.pb.go new file mode 100644 index 0000000000..75f50b89e9 --- /dev/null +++ b/x/epochs/types/genesis.pb.go @@ -0,0 +1,821 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/epochs/v1beta1/genesis.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + github_com_cosmos_gogoproto_types "github.com/cosmos/gogoproto/types" + _ "google.golang.org/protobuf/types/known/durationpb" + _ "google.golang.org/protobuf/types/known/timestamppb" + io "io" + math "math" + math_bits "math/bits" + time "time" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf +var _ = time.Kitchen + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// EpochInfo is a struct that describes the data going into +// a timer defined by the x/epochs module. +type EpochInfo struct { + // identifier is a unique reference to this particular timer. + Identifier string `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` + // start_time is the time at which the timer first ever ticks. + // If start_time is in the future, the epoch will not begin until the start + // time. + StartTime time.Time `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3,stdtime" json:"start_time"` + // duration is the time in between epoch ticks. + // In order for intended behavior to be met, duration should + // be greater than the chains expected block time. + // Duration must be non-zero. + Duration time.Duration `protobuf:"bytes,3,opt,name=duration,proto3,stdduration" json:"duration,omitempty"` + // current_epoch is the current epoch number, or in other words, + // how many times has the timer 'ticked'. + // The first tick (current_epoch=1) is defined as + // the first block whose blocktime is greater than the EpochInfo start_time. + CurrentEpoch int64 `protobuf:"varint,4,opt,name=current_epoch,json=currentEpoch,proto3" json:"current_epoch,omitempty"` + // current_epoch_start_time describes the start time of the current timer + // interval. The interval is (current_epoch_start_time, + // current_epoch_start_time + duration] When the timer ticks, this is set to + // current_epoch_start_time = last_epoch_start_time + duration only one timer + // tick for a given identifier can occur per block. + // + // NOTE! The current_epoch_start_time may diverge significantly from the + // wall-clock time the epoch began at. Wall-clock time of epoch start may be + // >> current_epoch_start_time. Suppose current_epoch_start_time = 10, + // duration = 5. Suppose the chain goes offline at t=14, and comes back online + // at t=30, and produces blocks at every successive time. (t=31, 32, etc.) + // * The t=30 block will start the epoch for (10, 15] + // * The t=31 block will start the epoch for (15, 20] + // * The t=32 block will start the epoch for (20, 25] + // * The t=33 block will start the epoch for (25, 30] + // * The t=34 block will start the epoch for (30, 35] + // * The **t=36** block will start the epoch for (35, 40] + CurrentEpochStartTime time.Time `protobuf:"bytes,5,opt,name=current_epoch_start_time,json=currentEpochStartTime,proto3,stdtime" json:"current_epoch_start_time"` + // epoch_counting_started is a boolean, that indicates whether this + // epoch timer has began yet. + EpochCountingStarted bool `protobuf:"varint,6,opt,name=epoch_counting_started,json=epochCountingStarted,proto3" json:"epoch_counting_started,omitempty"` + // current_epoch_start_height is the block height at which the current epoch + // started. (The block height at which the timer last ticked) + CurrentEpochStartHeight int64 `protobuf:"varint,8,opt,name=current_epoch_start_height,json=currentEpochStartHeight,proto3" json:"current_epoch_start_height,omitempty"` +} + +func (m *EpochInfo) Reset() { *m = EpochInfo{} } +func (m *EpochInfo) String() string { return proto.CompactTextString(m) } +func (*EpochInfo) ProtoMessage() {} +func (*EpochInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_3a3d6d4398875177, []int{0} +} +func (m *EpochInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EpochInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EpochInfo.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 *EpochInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_EpochInfo.Merge(m, src) +} +func (m *EpochInfo) XXX_Size() int { + return m.Size() +} +func (m *EpochInfo) XXX_DiscardUnknown() { + xxx_messageInfo_EpochInfo.DiscardUnknown(m) +} + +var xxx_messageInfo_EpochInfo proto.InternalMessageInfo + +func (m *EpochInfo) GetIdentifier() string { + if m != nil { + return m.Identifier + } + return "" +} + +func (m *EpochInfo) GetStartTime() time.Time { + if m != nil { + return m.StartTime + } + return time.Time{} +} + +func (m *EpochInfo) GetDuration() time.Duration { + if m != nil { + return m.Duration + } + return 0 +} + +func (m *EpochInfo) GetCurrentEpoch() int64 { + if m != nil { + return m.CurrentEpoch + } + return 0 +} + +func (m *EpochInfo) GetCurrentEpochStartTime() time.Time { + if m != nil { + return m.CurrentEpochStartTime + } + return time.Time{} +} + +func (m *EpochInfo) GetEpochCountingStarted() bool { + if m != nil { + return m.EpochCountingStarted + } + return false +} + +func (m *EpochInfo) GetCurrentEpochStartHeight() int64 { + if m != nil { + return m.CurrentEpochStartHeight + } + return 0 +} + +// GenesisState defines the epochs module's genesis state. +type GenesisState struct { + Epochs []EpochInfo `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs"` +} + +func (m *GenesisState) Reset() { *m = GenesisState{} } +func (m *GenesisState) String() string { return proto.CompactTextString(m) } +func (*GenesisState) ProtoMessage() {} +func (*GenesisState) Descriptor() ([]byte, []int) { + return fileDescriptor_3a3d6d4398875177, []int{1} +} +func (m *GenesisState) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GenesisState.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 *GenesisState) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenesisState.Merge(m, src) +} +func (m *GenesisState) XXX_Size() int { + return m.Size() +} +func (m *GenesisState) XXX_DiscardUnknown() { + xxx_messageInfo_GenesisState.DiscardUnknown(m) +} + +var xxx_messageInfo_GenesisState proto.InternalMessageInfo + +func (m *GenesisState) GetEpochs() []EpochInfo { + if m != nil { + return m.Epochs + } + return nil +} + +func init() { + proto.RegisterType((*EpochInfo)(nil), "cosmos.epochs.v1beta1.EpochInfo") + proto.RegisterType((*GenesisState)(nil), "cosmos.epochs.v1beta1.GenesisState") +} + +func init() { + proto.RegisterFile("cosmos/epochs/v1beta1/genesis.proto", fileDescriptor_3a3d6d4398875177) +} + +var fileDescriptor_3a3d6d4398875177 = []byte{ + // 445 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x52, 0x3f, 0x6f, 0xd3, 0x40, + 0x1c, 0xcd, 0x91, 0x10, 0x9c, 0x6b, 0x91, 0xd0, 0xa9, 0x05, 0x93, 0xe1, 0x62, 0xb5, 0x8b, 0x25, + 0xe0, 0x4e, 0x2d, 0x6c, 0x48, 0x0c, 0x29, 0x15, 0x7f, 0x06, 0x06, 0x07, 0x16, 0x24, 0x14, 0x39, + 0xce, 0xe5, 0x7c, 0x02, 0xfb, 0x2c, 0xdf, 0xcf, 0x88, 0x7e, 0x8b, 0x8e, 0x7c, 0x20, 0x86, 0x8e, + 0x1d, 0x99, 0x0a, 0x4a, 0x36, 0x3e, 0x05, 0xf2, 0x9d, 0x1d, 0x05, 0x9a, 0xa5, 0x93, 0xed, 0x7b, + 0xef, 0xf7, 0xde, 0xbd, 0x9f, 0x1f, 0x3e, 0x4c, 0xb4, 0xc9, 0xb4, 0xe1, 0xa2, 0xd0, 0x49, 0x6a, + 0xf8, 0xd7, 0xa3, 0x99, 0x80, 0xf8, 0x88, 0x4b, 0x91, 0x0b, 0xa3, 0x0c, 0x2b, 0x4a, 0x0d, 0x9a, + 0xec, 0x3b, 0x12, 0x73, 0x24, 0xd6, 0x90, 0x86, 0x7b, 0x52, 0x4b, 0x6d, 0x19, 0xbc, 0x7e, 0x73, + 0xe4, 0x21, 0x95, 0x5a, 0xcb, 0x2f, 0x82, 0xdb, 0xaf, 0x59, 0xb5, 0xe0, 0xf3, 0xaa, 0x8c, 0x41, + 0xe9, 0xbc, 0xc1, 0x47, 0xff, 0xe3, 0xa0, 0x32, 0x61, 0x20, 0xce, 0x0a, 0x47, 0x38, 0xf8, 0xd1, + 0xc5, 0x83, 0xd3, 0xda, 0xe9, 0x4d, 0xbe, 0xd0, 0x84, 0x62, 0xac, 0xe6, 0x22, 0x07, 0xb5, 0x50, + 0xa2, 0xf4, 0x51, 0x80, 0xc2, 0x41, 0xb4, 0x71, 0x42, 0x4e, 0x30, 0x36, 0x10, 0x97, 0x30, 0xad, + 0x65, 0xfc, 0x5b, 0x01, 0x0a, 0x77, 0x8e, 0x87, 0xcc, 0x79, 0xb0, 0xd6, 0x83, 0xbd, 0x6f, 0x3d, + 0xc6, 0xde, 0xc5, 0xd5, 0xa8, 0x73, 0xfe, 0x6b, 0x84, 0xa2, 0x81, 0x9d, 0xab, 0x11, 0xf2, 0x01, + 0x7b, 0xed, 0x2d, 0xfd, 0xae, 0x95, 0x78, 0x78, 0x4d, 0xe2, 0x65, 0x43, 0x18, 0xd3, 0x5a, 0xe1, + 0xcf, 0xd5, 0x88, 0xb4, 0x23, 0x8f, 0x75, 0xa6, 0x40, 0x64, 0x05, 0x9c, 0x7d, 0xaf, 0x75, 0xd7, + 0x52, 0xe4, 0x10, 0xdf, 0x4d, 0xaa, 0xb2, 0x14, 0x39, 0x4c, 0xed, 0xea, 0xfc, 0x5e, 0x80, 0xc2, + 0x6e, 0xb4, 0xdb, 0x1c, 0xda, 0x90, 0xe4, 0x13, 0xf6, 0xff, 0x21, 0x4d, 0x37, 0xe2, 0xdc, 0xbe, + 0x41, 0x9c, 0xfd, 0x4d, 0xd5, 0xc9, 0x3a, 0xda, 0x33, 0x7c, 0xdf, 0xc9, 0x26, 0xba, 0xca, 0x41, + 0xe5, 0xd2, 0xe9, 0x8b, 0xb9, 0xdf, 0x0f, 0x50, 0xe8, 0x45, 0x7b, 0x16, 0x3d, 0x69, 0xc0, 0x89, + 0xc3, 0xc8, 0x73, 0x3c, 0xdc, 0x76, 0xa9, 0x54, 0x28, 0x99, 0x82, 0xef, 0xd9, 0x18, 0x0f, 0xae, + 0x19, 0xbe, 0xb6, 0xf0, 0xdb, 0x9e, 0x77, 0xe7, 0x9e, 0x77, 0xf0, 0x0e, 0xef, 0xbe, 0x72, 0x2d, + 0x9a, 0x40, 0x0c, 0x82, 0xbc, 0xc0, 0x7d, 0xd7, 0x1f, 0x1f, 0x05, 0xdd, 0x70, 0xe7, 0x38, 0x60, + 0x5b, 0x5b, 0xc5, 0xd6, 0xbf, 0x7e, 0xdc, 0xab, 0xb3, 0x45, 0xcd, 0xd4, 0xf8, 0xf4, 0x62, 0x49, + 0xd1, 0xe5, 0x92, 0xa2, 0xdf, 0x4b, 0x8a, 0xce, 0x57, 0xb4, 0x73, 0xb9, 0xa2, 0x9d, 0x9f, 0x2b, + 0xda, 0xf9, 0xf8, 0x48, 0x2a, 0x48, 0xab, 0x19, 0x4b, 0x74, 0xc6, 0x9b, 0x3a, 0xbb, 0xc7, 0x13, + 0x33, 0xff, 0xcc, 0xbf, 0xb5, 0xdd, 0x86, 0xb3, 0x42, 0x98, 0x59, 0xdf, 0x2e, 0xf1, 0xe9, 0xdf, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x71, 0xa8, 0x51, 0xe8, 0xf9, 0x02, 0x00, 0x00, +} + +func (m *EpochInfo) 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 *EpochInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EpochInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CurrentEpochStartHeight != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.CurrentEpochStartHeight)) + i-- + dAtA[i] = 0x40 + } + if m.EpochCountingStarted { + i-- + if m.EpochCountingStarted { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x30 + } + n1, err1 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.CurrentEpochStartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime):]) + if err1 != nil { + return 0, err1 + } + i -= n1 + i = encodeVarintGenesis(dAtA, i, uint64(n1)) + i-- + dAtA[i] = 0x2a + if m.CurrentEpoch != 0 { + i = encodeVarintGenesis(dAtA, i, uint64(m.CurrentEpoch)) + i-- + dAtA[i] = 0x20 + } + n2, err2 := github_com_cosmos_gogoproto_types.StdDurationMarshalTo(m.Duration, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration):]) + if err2 != nil { + return 0, err2 + } + i -= n2 + i = encodeVarintGenesis(dAtA, i, uint64(n2)) + i-- + dAtA[i] = 0x1a + n3, err3 := github_com_cosmos_gogoproto_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime):]) + if err3 != nil { + return 0, err3 + } + i -= n3 + i = encodeVarintGenesis(dAtA, i, uint64(n3)) + i-- + dAtA[i] = 0x12 + if len(m.Identifier) > 0 { + i -= len(m.Identifier) + copy(dAtA[i:], m.Identifier) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.Identifier))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GenesisState) 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 *GenesisState) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Epochs) > 0 { + for iNdEx := len(m.Epochs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Epochs[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { + offset -= sovGenesis(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *EpochInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Identifier) + if l > 0 { + n += 1 + l + sovGenesis(uint64(l)) + } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.StartTime) + n += 1 + l + sovGenesis(uint64(l)) + l = github_com_cosmos_gogoproto_types.SizeOfStdDuration(m.Duration) + n += 1 + l + sovGenesis(uint64(l)) + if m.CurrentEpoch != 0 { + n += 1 + sovGenesis(uint64(m.CurrentEpoch)) + } + l = github_com_cosmos_gogoproto_types.SizeOfStdTime(m.CurrentEpochStartTime) + n += 1 + l + sovGenesis(uint64(l)) + if m.EpochCountingStarted { + n += 2 + } + if m.CurrentEpochStartHeight != 0 { + n += 1 + sovGenesis(uint64(m.CurrentEpochStartHeight)) + } + return n +} + +func (m *GenesisState) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Epochs) > 0 { + for _, e := range m.Epochs { + l = e.Size() + n += 1 + l + sovGenesis(uint64(l)) + } + } + return n +} + +func sovGenesis(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenesis(x uint64) (n int) { + return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *EpochInfo) 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 ErrIntOverflowGenesis + } + 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: EpochInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EpochInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identifier", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + 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 ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Identifier = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StartTime", 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 + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.StartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Duration", 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 + } + if err := github_com_cosmos_gogoproto_types.StdDurationUnmarshal(&m.Duration, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentEpoch", wireType) + } + m.CurrentEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentEpoch |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentEpochStartTime", 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 + } + if err := github_com_cosmos_gogoproto_types.StdTimeUnmarshal(&m.CurrentEpochStartTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochCountingStarted", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.EpochCountingStarted = bool(v != 0) + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentEpochStartHeight", wireType) + } + m.CurrentEpochStartHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentEpochStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GenesisState) 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 ErrIntOverflowGenesis + } + 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: GenesisState: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Epochs", 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.Epochs = append(m.Epochs, EpochInfo{}) + if err := m.Epochs[len(m.Epochs)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenesis(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenesis + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenesis(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenesis + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenesis + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenesis + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenesis + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/epochs/types/hooks.go b/x/epochs/types/hooks.go new file mode 100644 index 0000000000..f8609a3905 --- /dev/null +++ b/x/epochs/types/hooks.go @@ -0,0 +1,46 @@ +package types + +import ( + "context" + "errors" +) + +type EpochHooks interface { + // the first block whose timestamp is after the duration is counted as the end of the epoch + AfterEpochEnd(ctx context.Context, epochIdentifier string, epochNumber int64) error + // new epoch is next block of epoch end block + BeforeEpochStart(ctx context.Context, epochIdentifier string, epochNumber int64) error +} + +var _ EpochHooks = MultiEpochHooks{} + +// combine multiple gamm hooks, all hook functions are run in array sequence. +type MultiEpochHooks []EpochHooks + +func NewMultiEpochHooks(hooks ...EpochHooks) MultiEpochHooks { + return hooks +} + +// AfterEpochEnd is called when epoch is going to be ended, epochNumber is the number of epoch that is ending. +func (h MultiEpochHooks) AfterEpochEnd(ctx context.Context, epochIdentifier string, epochNumber int64) error { + var errs error + for i := range h { + errs = errors.Join(errs, h[i].AfterEpochEnd(ctx, epochIdentifier, epochNumber)) + } + return errs +} + +// BeforeEpochStart is called when epoch is going to be started, epochNumber is the number of epoch that is starting. +func (h MultiEpochHooks) BeforeEpochStart(ctx context.Context, epochIdentifier string, epochNumber int64) error { + var errs error + for i := range h { + errs = errors.Join(errs, h[i].BeforeEpochStart(ctx, epochIdentifier, epochNumber)) + } + return errs +} + +// EpochHooksWrapper is a wrapper for modules to inject EpochHooks using depinject. +type EpochHooksWrapper struct{ EpochHooks } + +// IsOnePerModuleType implements the depinject.OnePerModuleType interface. +func (EpochHooksWrapper) IsOnePerModuleType() {} diff --git a/x/epochs/types/hooks_test.go b/x/epochs/types/hooks_test.go new file mode 100644 index 0000000000..5ee22c1a18 --- /dev/null +++ b/x/epochs/types/hooks_test.go @@ -0,0 +1,111 @@ +package types_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + + "cosmossdk.io/errors" + storetypes "cosmossdk.io/store/types" + + "github.com/cosmos/cosmos-sdk/testutil" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/epochs/types" +) + +type KeeperTestSuite struct { + suite.Suite + Ctx sdk.Context +} + +func TestKeeperTestSuite(t *testing.T) { + suite.Run(t, new(KeeperTestSuite)) +} + +func (s *KeeperTestSuite) SetupTest() { + s.Ctx = testutil.DefaultContext(storetypes.NewKVStoreKey(types.StoreKey), storetypes.NewTransientStoreKey("transient_test")) +} + +var dummyErr = errors.New("9", 9, "dummyError") + +// dummyEpochHook is a struct satisfying the epoch hook interface, +// that maintains a counter for how many times its been successfully called, +// and a boolean for whether it should panic during its execution. +type dummyEpochHook struct { + successCounter int + shouldError bool +} + +func (hook *dummyEpochHook) AfterEpochEnd(ctx context.Context, epochIdentifier string, epochNumber int64) error { + if hook.shouldError { + return dummyErr + } + hook.successCounter += 1 + return nil +} + +func (hook *dummyEpochHook) BeforeEpochStart(ctx context.Context, epochIdentifier string, epochNumber int64) error { + if hook.shouldError { + return dummyErr + } + hook.successCounter += 1 + return nil +} + +func (hook *dummyEpochHook) Clone() *dummyEpochHook { + newHook := dummyEpochHook{successCounter: hook.successCounter, shouldError: hook.shouldError} + return &newHook +} + +var _ types.EpochHooks = &dummyEpochHook{} + +func (s *KeeperTestSuite) TestHooksPanicRecovery() { + errorHook := dummyEpochHook{shouldError: true} + noErrorHook := dummyEpochHook{shouldError: false} + simpleHooks := []dummyEpochHook{errorHook, noErrorHook} + + tests := []struct { + hooks []dummyEpochHook + expectedCounterValues []int + lenEvents int + expErr bool + }{ + {[]dummyEpochHook{errorHook}, []int{0}, 0, true}, + {simpleHooks, []int{0, 1, 0, 1}, 2, true}, + } + + for tcIndex, tc := range tests { + for epochActionSelector := 0; epochActionSelector < 2; epochActionSelector++ { + s.SetupTest() + hookRefs := []types.EpochHooks{} + + for _, hook := range tc.hooks { + hookRefs = append(hookRefs, hook.Clone()) + } + + hooks := types.NewMultiEpochHooks(hookRefs...) + + if epochActionSelector == 0 { + err := hooks.BeforeEpochStart(s.Ctx, "id", 0) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + } + } else if epochActionSelector == 1 { + err := hooks.AfterEpochEnd(s.Ctx, "id", 0) + if tc.expErr { + s.Require().Error(err) + } else { + s.Require().NoError(err) + } + } + + for i := 0; i < len(hooks); i++ { + epochHook := hookRefs[i].(*dummyEpochHook) + s.Require().Equal(tc.expectedCounterValues[i], epochHook.successCounter, "test case index %d", tcIndex) + } + } + } +} diff --git a/x/epochs/types/keys.go b/x/epochs/types/keys.go new file mode 100644 index 0000000000..27d7a7245c --- /dev/null +++ b/x/epochs/types/keys.go @@ -0,0 +1,16 @@ +package types + +import ( + "cosmossdk.io/collections" +) + +const ( + // ModuleName defines the module name. + ModuleName = "epochs" + + // StoreKey defines the primary module store key. + StoreKey = ModuleName +) + +// KeyPrefixEpoch defines prefix key for storing epochs. +var KeyPrefixEpoch = collections.NewPrefix(1) diff --git a/x/epochs/types/query.pb.go b/x/epochs/types/query.pb.go new file mode 100644 index 0000000000..09210b268b --- /dev/null +++ b/x/epochs/types/query.pb.go @@ -0,0 +1,919 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: cosmos/epochs/v1beta1/query.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + _ "google.golang.org/genproto/googleapis/api/annotations" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// QueryEpochInfosRequest defines the gRPC request structure for +// querying all epoch info. +type QueryEpochInfosRequest struct { +} + +func (m *QueryEpochInfosRequest) Reset() { *m = QueryEpochInfosRequest{} } +func (m *QueryEpochInfosRequest) String() string { return proto.CompactTextString(m) } +func (*QueryEpochInfosRequest) ProtoMessage() {} +func (*QueryEpochInfosRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dacbc976c75f2414, []int{0} +} +func (m *QueryEpochInfosRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryEpochInfosRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryEpochInfosRequest.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 *QueryEpochInfosRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochInfosRequest.Merge(m, src) +} +func (m *QueryEpochInfosRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryEpochInfosRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochInfosRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryEpochInfosRequest proto.InternalMessageInfo + +// QueryEpochInfosRequest defines the gRPC response structure for +// querying all epoch info. +type QueryEpochInfosResponse struct { + Epochs []EpochInfo `protobuf:"bytes,1,rep,name=epochs,proto3" json:"epochs"` +} + +func (m *QueryEpochInfosResponse) Reset() { *m = QueryEpochInfosResponse{} } +func (m *QueryEpochInfosResponse) String() string { return proto.CompactTextString(m) } +func (*QueryEpochInfosResponse) ProtoMessage() {} +func (*QueryEpochInfosResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dacbc976c75f2414, []int{1} +} +func (m *QueryEpochInfosResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryEpochInfosResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryEpochInfosResponse.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 *QueryEpochInfosResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryEpochInfosResponse.Merge(m, src) +} +func (m *QueryEpochInfosResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryEpochInfosResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryEpochInfosResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryEpochInfosResponse proto.InternalMessageInfo + +func (m *QueryEpochInfosResponse) GetEpochs() []EpochInfo { + if m != nil { + return m.Epochs + } + return nil +} + +// QueryCurrentEpochRequest defines the gRPC request structure for +// querying an epoch by its identifier. +type QueryCurrentEpochRequest struct { + Identifier string `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"` +} + +func (m *QueryCurrentEpochRequest) Reset() { *m = QueryCurrentEpochRequest{} } +func (m *QueryCurrentEpochRequest) String() string { return proto.CompactTextString(m) } +func (*QueryCurrentEpochRequest) ProtoMessage() {} +func (*QueryCurrentEpochRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_dacbc976c75f2414, []int{2} +} +func (m *QueryCurrentEpochRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCurrentEpochRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCurrentEpochRequest.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 *QueryCurrentEpochRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCurrentEpochRequest.Merge(m, src) +} +func (m *QueryCurrentEpochRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryCurrentEpochRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCurrentEpochRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCurrentEpochRequest proto.InternalMessageInfo + +func (m *QueryCurrentEpochRequest) GetIdentifier() string { + if m != nil { + return m.Identifier + } + return "" +} + +// QueryCurrentEpochResponse defines the gRPC response structure for +// querying an epoch by its identifier. +type QueryCurrentEpochResponse struct { + CurrentEpoch int64 `protobuf:"varint,1,opt,name=current_epoch,json=currentEpoch,proto3" json:"current_epoch,omitempty"` +} + +func (m *QueryCurrentEpochResponse) Reset() { *m = QueryCurrentEpochResponse{} } +func (m *QueryCurrentEpochResponse) String() string { return proto.CompactTextString(m) } +func (*QueryCurrentEpochResponse) ProtoMessage() {} +func (*QueryCurrentEpochResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_dacbc976c75f2414, []int{3} +} +func (m *QueryCurrentEpochResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryCurrentEpochResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryCurrentEpochResponse.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 *QueryCurrentEpochResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryCurrentEpochResponse.Merge(m, src) +} +func (m *QueryCurrentEpochResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryCurrentEpochResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryCurrentEpochResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryCurrentEpochResponse proto.InternalMessageInfo + +func (m *QueryCurrentEpochResponse) GetCurrentEpoch() int64 { + if m != nil { + return m.CurrentEpoch + } + return 0 +} + +func init() { + proto.RegisterType((*QueryEpochInfosRequest)(nil), "cosmos.epochs.v1beta1.QueryEpochInfosRequest") + proto.RegisterType((*QueryEpochInfosResponse)(nil), "cosmos.epochs.v1beta1.QueryEpochInfosResponse") + proto.RegisterType((*QueryCurrentEpochRequest)(nil), "cosmos.epochs.v1beta1.QueryCurrentEpochRequest") + proto.RegisterType((*QueryCurrentEpochResponse)(nil), "cosmos.epochs.v1beta1.QueryCurrentEpochResponse") +} + +func init() { proto.RegisterFile("cosmos/epochs/v1beta1/query.proto", fileDescriptor_dacbc976c75f2414) } + +var fileDescriptor_dacbc976c75f2414 = []byte{ + // 386 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xcf, 0x4e, 0xe2, 0x40, + 0x1c, 0xc7, 0x3b, 0xb0, 0x4b, 0xb2, 0xb3, 0xec, 0x65, 0xb2, 0xbb, 0xd6, 0x46, 0x0b, 0x16, 0x35, + 0x24, 0x4a, 0x47, 0xf0, 0xe6, 0xc1, 0x18, 0x0c, 0x07, 0x8f, 0xf6, 0xa6, 0x17, 0x53, 0xca, 0x50, + 0x1a, 0x65, 0xa6, 0x74, 0xa6, 0x46, 0xae, 0x3e, 0x81, 0xd1, 0x07, 0xf0, 0x4d, 0x3c, 0x73, 0x24, + 0xf1, 0xe2, 0xc9, 0x18, 0xf0, 0x41, 0x0c, 0x33, 0x45, 0x31, 0x16, 0xc3, 0x09, 0x3a, 0xf3, 0xf9, + 0xfe, 0xf9, 0xfd, 0x5a, 0xb8, 0xe6, 0x31, 0xde, 0x65, 0x1c, 0x93, 0x90, 0x79, 0x1d, 0x8e, 0x2f, + 0xab, 0x4d, 0x22, 0xdc, 0x2a, 0xee, 0xc5, 0x24, 0xea, 0xdb, 0x61, 0xc4, 0x04, 0x43, 0xff, 0x14, + 0x62, 0x2b, 0xc4, 0x4e, 0x10, 0xe3, 0xaf, 0xcf, 0x7c, 0x26, 0x09, 0x3c, 0xf9, 0xa7, 0x60, 0x63, + 0xc5, 0x67, 0xcc, 0xbf, 0x20, 0xd8, 0x0d, 0x03, 0xec, 0x52, 0xca, 0x84, 0x2b, 0x02, 0x46, 0x79, + 0x72, 0x5b, 0x4a, 0x4f, 0xf3, 0x09, 0x25, 0x3c, 0x48, 0x20, 0x4b, 0x87, 0xff, 0x8f, 0x27, 0xf1, + 0x8d, 0x09, 0x74, 0x44, 0xdb, 0x8c, 0x3b, 0xa4, 0x17, 0x13, 0x2e, 0xac, 0x13, 0xb8, 0xf4, 0xe5, + 0x86, 0x87, 0x8c, 0x72, 0x82, 0xf6, 0x61, 0x4e, 0x99, 0xea, 0xa0, 0x98, 0x2d, 0xff, 0xae, 0x15, + 0xed, 0xd4, 0xd6, 0xf6, 0xbb, 0xb4, 0xfe, 0x63, 0xf0, 0x5c, 0xd0, 0x9c, 0x44, 0x65, 0xed, 0x41, + 0x5d, 0x5a, 0x1f, 0xc6, 0x51, 0x44, 0xa8, 0x90, 0x58, 0x12, 0x8b, 0x4c, 0x08, 0x83, 0x16, 0xa1, + 0x22, 0x68, 0x07, 0x24, 0xd2, 0x41, 0x11, 0x94, 0x7f, 0x39, 0x33, 0x27, 0xd6, 0x01, 0x5c, 0x4e, + 0xd1, 0x26, 0xc5, 0x4a, 0xf0, 0x8f, 0xa7, 0xce, 0xcf, 0x64, 0x94, 0xd4, 0x67, 0x9d, 0xbc, 0x37, + 0x03, 0xd7, 0x1e, 0x32, 0xf0, 0xa7, 0xb4, 0x40, 0xb7, 0x00, 0xc2, 0x8f, 0xf1, 0x50, 0x65, 0xce, + 0x18, 0xe9, 0x0b, 0x32, 0xec, 0x45, 0x71, 0x55, 0xce, 0xda, 0xb8, 0x7e, 0x7c, 0xbd, 0xcb, 0x14, + 0xd0, 0x2a, 0x4e, 0x7f, 0x31, 0xea, 0x11, 0xdd, 0x03, 0x98, 0x9f, 0x1d, 0x0e, 0xe1, 0xef, 0x72, + 0x52, 0x56, 0x68, 0xec, 0x2c, 0x2e, 0x48, 0xaa, 0x6d, 0xcb, 0x6a, 0x9b, 0x68, 0x7d, 0x4e, 0xb5, + 0x4f, 0x4b, 0xad, 0x37, 0x06, 0x23, 0x13, 0x0c, 0x47, 0x26, 0x78, 0x19, 0x99, 0xe0, 0x66, 0x6c, + 0x6a, 0xc3, 0xb1, 0xa9, 0x3d, 0x8d, 0x4d, 0xed, 0x74, 0xcb, 0x0f, 0x44, 0x27, 0x6e, 0xda, 0x1e, + 0xeb, 0x4e, 0x9d, 0xd4, 0x4f, 0x85, 0xb7, 0xce, 0xf1, 0xd5, 0xd4, 0x56, 0xf4, 0x43, 0xc2, 0x9b, + 0x39, 0xf9, 0x05, 0xee, 0xbe, 0x05, 0x00, 0x00, 0xff, 0xff, 0xfa, 0x90, 0xfa, 0x87, 0x16, 0x03, + 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// QueryClient is the client API for Query service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type QueryClient interface { + // EpochInfos provide running epochInfos + EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) + // CurrentEpoch provide current epoch of specified identifier + CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) +} + +type queryClient struct { + cc grpc1.ClientConn +} + +func NewQueryClient(cc grpc1.ClientConn) QueryClient { + return &queryClient{cc} +} + +func (c *queryClient) EpochInfos(ctx context.Context, in *QueryEpochInfosRequest, opts ...grpc.CallOption) (*QueryEpochInfosResponse, error) { + out := new(QueryEpochInfosResponse) + err := c.cc.Invoke(ctx, "/cosmos.epochs.v1beta1.Query/EpochInfos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *queryClient) CurrentEpoch(ctx context.Context, in *QueryCurrentEpochRequest, opts ...grpc.CallOption) (*QueryCurrentEpochResponse, error) { + out := new(QueryCurrentEpochResponse) + err := c.cc.Invoke(ctx, "/cosmos.epochs.v1beta1.Query/CurrentEpoch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// QueryServer is the server API for Query service. +type QueryServer interface { + // EpochInfos provide running epochInfos + EpochInfos(context.Context, *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) + // CurrentEpoch provide current epoch of specified identifier + CurrentEpoch(context.Context, *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) +} + +// UnimplementedQueryServer can be embedded to have forward compatible implementations. +type UnimplementedQueryServer struct { +} + +func (*UnimplementedQueryServer) EpochInfos(ctx context.Context, req *QueryEpochInfosRequest) (*QueryEpochInfosResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method EpochInfos not implemented") +} +func (*UnimplementedQueryServer) CurrentEpoch(ctx context.Context, req *QueryCurrentEpochRequest) (*QueryCurrentEpochResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CurrentEpoch not implemented") +} + +func RegisterQueryServer(s grpc1.Server, srv QueryServer) { + s.RegisterService(&_Query_serviceDesc, srv) +} + +func _Query_EpochInfos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryEpochInfosRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).EpochInfos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.epochs.v1beta1.Query/EpochInfos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).EpochInfos(ctx, req.(*QueryEpochInfosRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Query_CurrentEpoch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryCurrentEpochRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).CurrentEpoch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cosmos.epochs.v1beta1.Query/CurrentEpoch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).CurrentEpoch(ctx, req.(*QueryCurrentEpochRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var Query_serviceDesc = _Query_serviceDesc +var _Query_serviceDesc = grpc.ServiceDesc{ + ServiceName: "cosmos.epochs.v1beta1.Query", + HandlerType: (*QueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "EpochInfos", + Handler: _Query_EpochInfos_Handler, + }, + { + MethodName: "CurrentEpoch", + Handler: _Query_CurrentEpoch_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "cosmos/epochs/v1beta1/query.proto", +} + +func (m *QueryEpochInfosRequest) 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 *QueryEpochInfosRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryEpochInfosRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryEpochInfosResponse) 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 *QueryEpochInfosResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryEpochInfosResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Epochs) > 0 { + for iNdEx := len(m.Epochs) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Epochs[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 *QueryCurrentEpochRequest) 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 *QueryCurrentEpochRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCurrentEpochRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Identifier) > 0 { + i -= len(m.Identifier) + copy(dAtA[i:], m.Identifier) + i = encodeVarintQuery(dAtA, i, uint64(len(m.Identifier))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *QueryCurrentEpochResponse) 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 *QueryCurrentEpochResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryCurrentEpochResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.CurrentEpoch != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.CurrentEpoch)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { + offset -= sovQuery(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *QueryEpochInfosRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryEpochInfosResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Epochs) > 0 { + for _, e := range m.Epochs { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + +func (m *QueryCurrentEpochRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Identifier) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + return n +} + +func (m *QueryCurrentEpochResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CurrentEpoch != 0 { + n += 1 + sovQuery(uint64(m.CurrentEpoch)) + } + return n +} + +func sovQuery(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozQuery(x uint64) (n int) { + return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *QueryEpochInfosRequest) 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: QueryEpochInfosRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryEpochInfosRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + 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 *QueryEpochInfosResponse) 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: QueryEpochInfosResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryEpochInfosResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Epochs", 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.Epochs = append(m.Epochs, EpochInfo{}) + if err := m.Epochs[len(m.Epochs)-1].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 *QueryCurrentEpochRequest) 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: QueryCurrentEpochRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCurrentEpochRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Identifier", 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.Identifier = string(dAtA[iNdEx:postIndex]) + 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 *QueryCurrentEpochResponse) 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: QueryCurrentEpochResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryCurrentEpochResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentEpoch", wireType) + } + m.CurrentEpoch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentEpoch |= 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 skipQuery(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowQuery + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthQuery + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupQuery + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthQuery + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/epochs/types/query.pb.gw.go b/x/epochs/types/query.pb.gw.go new file mode 100644 index 0000000000..caabc82c64 --- /dev/null +++ b/x/epochs/types/query.pb.gw.go @@ -0,0 +1,236 @@ +// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. +// source: cosmos/epochs/v1beta1/query.proto + +/* +Package types is a reverse proxy. + +It translates gRPC into RESTful JSON APIs. +*/ +package types + +import ( + "context" + "io" + "net/http" + + "github.com/golang/protobuf/descriptor" + "github.com/golang/protobuf/proto" + "github.com/grpc-ecosystem/grpc-gateway/runtime" + "github.com/grpc-ecosystem/grpc-gateway/utilities" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/grpclog" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// Suppress "imported and not used" errors +var _ codes.Code +var _ io.Reader +var _ status.Status +var _ = runtime.String +var _ = utilities.NewDoubleArray +var _ = descriptor.ForMessage +var _ = metadata.Join + +func request_Query_EpochInfos_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochInfosRequest + var metadata runtime.ServerMetadata + + msg, err := client.EpochInfos(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_EpochInfos_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryEpochInfosRequest + var metadata runtime.ServerMetadata + + msg, err := server.EpochInfos(ctx, &protoReq) + return msg, metadata, err + +} + +var ( + filter_Query_CurrentEpoch_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Query_CurrentEpoch_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCurrentEpochRequest + 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_CurrentEpoch_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.CurrentEpoch(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_CurrentEpoch_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryCurrentEpochRequest + 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_CurrentEpoch_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.CurrentEpoch(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. +// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. +func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + + mux.Handle("GET", pattern_Query_EpochInfos_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_EpochInfos_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_EpochInfos_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CurrentEpoch_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_CurrentEpoch_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_CurrentEpoch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but +// automatically dials to "endpoint" and closes the connection when "ctx" gets done. +func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { + conn, err := grpc.Dial(endpoint, opts...) + if err != nil { + return err + } + defer func() { + if err != nil { + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + return + } + go func() { + <-ctx.Done() + if cerr := conn.Close(); cerr != nil { + grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) + } + }() + }() + + return RegisterQueryHandler(ctx, mux, conn) +} + +// RegisterQueryHandler registers the http handlers for service Query to "mux". +// The handlers forward requests to the grpc endpoint over "conn". +func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { + return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) +} + +// RegisterQueryHandlerClient registers the http handlers for service Query +// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". +// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" +// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in +// "QueryClient" to call the correct interceptors. +func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + + mux.Handle("GET", pattern_Query_EpochInfos_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_EpochInfos_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_EpochInfos_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_Query_CurrentEpoch_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_CurrentEpoch_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_CurrentEpoch_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + return nil +} + +var ( + pattern_Query_EpochInfos_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 1}, []string{"cosmos", "epochs", "v1beta1"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_CurrentEpoch_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"cosmos", "epochs", "v1beta1", "current_epoch"}, "", runtime.AssumeColonVerbOpt(false))) +) + +var ( + forward_Query_EpochInfos_0 = runtime.ForwardResponseMessage + + forward_Query_CurrentEpoch_0 = runtime.ForwardResponseMessage +) diff --git a/x/staking/types/staking.pb.go b/x/staking/types/staking.pb.go index dae487a8af..b30d3498e2 100644 --- a/x/staking/types/staking.pb.go +++ b/x/staking/types/staking.pb.go @@ -1404,789 +1404,794 @@ func (this *Pool) Description() (desc *github_com_cosmos_gogoproto_protoc_gen_go func StakingDescription() (desc *github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet) { d := &github_com_cosmos_gogoproto_protoc_gen_gogo_descriptor.FileDescriptorSet{} var gzipped = []byte{ - // 12499 bytes of a gzipped FileDescriptorSet - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x90, 0x64, 0xd7, - 0x55, 0x18, 0x3e, 0xaf, 0xbf, 0xfb, 0x74, 0x4f, 0xf7, 0x9b, 0x3b, 0xb3, 0xbb, 0xbd, 0xbd, 0xd2, + // 12584 bytes of a gzipped FileDescriptorSet + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x90, 0x64, 0xd7, + 0x59, 0x18, 0x3e, 0xb7, 0xdf, 0xfd, 0x75, 0x4f, 0xf7, 0x9d, 0x33, 0xb3, 0xbb, 0xbd, 0xbd, 0xd2, 0xce, 0xa8, 0x65, 0x49, 0xab, 0x95, 0x34, 0xab, 0x1d, 0x69, 0x57, 0xda, 0x59, 0xcb, 0xfa, 0xf5, - 0xd7, 0xce, 0xf6, 0x6a, 0xa6, 0x7b, 0xf4, 0xba, 0x67, 0xa5, 0x15, 0xe0, 0xc7, 0x9b, 0xee, 0x3b, - 0x33, 0x4f, 0xdb, 0xfd, 0x5e, 0xbb, 0xdf, 0xeb, 0xd5, 0x8c, 0x7e, 0x55, 0x94, 0xc0, 0x86, 0x18, - 0x19, 0x13, 0x13, 0x28, 0x10, 0xd8, 0x6b, 0x6c, 0x08, 0x60, 0x08, 0x24, 0x60, 0x1c, 0x3e, 0x92, - 0x0a, 0x81, 0x7c, 0x82, 0x8b, 0x24, 0x86, 0xaa, 0x24, 0x24, 0x55, 0x28, 0xc1, 0xa6, 0x90, 0x30, - 0x26, 0x7c, 0x89, 0x84, 0x94, 0x2b, 0xe5, 0xd4, 0xfd, 0x7a, 0x1f, 0xfd, 0x31, 0xdd, 0xb3, 0x96, - 0x1d, 0x05, 0xf2, 0xcf, 0x4c, 0xdf, 0x7b, 0xcf, 0x39, 0xf7, 0xde, 0x73, 0xcf, 0x3d, 0xf7, 0x9c, - 0x73, 0x3f, 0x1e, 0xbc, 0xb1, 0x0d, 0x4b, 0xbb, 0xa6, 0xb9, 0xdb, 0xc6, 0xe7, 0xba, 0x3d, 0xd3, - 0x36, 0xb7, 0xfb, 0x3b, 0xe7, 0x5a, 0xd8, 0x6a, 0xf6, 0xf4, 0xae, 0x6d, 0xf6, 0x96, 0x69, 0x1e, - 0x4a, 0x33, 0x88, 0x65, 0x01, 0x91, 0xfb, 0xac, 0x04, 0x73, 0x57, 0xf4, 0x36, 0x2e, 0x39, 0x90, - 0x75, 0x6c, 0xa3, 0x27, 0x21, 0xb4, 0xa3, 0xb7, 0x71, 0x46, 0x5a, 0x0a, 0x9e, 0x49, 0xac, 0xbc, - 0x6b, 0x79, 0x00, 0x6b, 0xd9, 0x8f, 0xb1, 0x49, 0xb2, 0x15, 0x8a, 0x71, 0xf6, 0xff, 0x8f, 0xbd, - 0xf2, 0xa5, 0xcf, 0x7e, 0x45, 0x92, 0xbf, 0x95, 0xfc, 0xcd, 0x76, 0xd0, 0x4d, 0x96, 0x46, 0x8f, - 0x2f, 0x13, 0x3c, 0x4f, 0x7b, 0x6e, 0x9d, 0x27, 0x39, 0x2a, 0x41, 0x52, 0xdd, 0x6c, 0xd5, 0xc2, - 0xb6, 0x8a, 0xf7, 0x6d, 0x6c, 0x58, 0xba, 0x69, 0x64, 0x1f, 0x19, 0x81, 0x35, 0xd4, 0xda, 0xb2, - 0x00, 0xcf, 0xbd, 0x16, 0x86, 0xf9, 0x11, 0x4d, 0x43, 0x08, 0x42, 0x86, 0xd6, 0x21, 0xdd, 0x91, - 0xce, 0xc4, 0x15, 0xfa, 0x1b, 0x65, 0x20, 0xda, 0xd5, 0x9a, 0x37, 0xb5, 0x5d, 0x9c, 0x09, 0xd0, - 0x6c, 0x91, 0x44, 0xa7, 0x01, 0x5a, 0xb8, 0x8b, 0x8d, 0x16, 0x36, 0x9a, 0x07, 0x99, 0xe0, 0x52, - 0xf0, 0x4c, 0x5c, 0xf1, 0xe4, 0xa0, 0x87, 0x60, 0xae, 0xdb, 0xdf, 0x6e, 0xeb, 0x4d, 0xd5, 0x03, - 0x06, 0x4b, 0xc1, 0x33, 0x61, 0x45, 0x66, 0x05, 0x25, 0x17, 0xf8, 0x01, 0x48, 0xbf, 0x84, 0xb5, - 0x9b, 0x5e, 0xd0, 0x04, 0x05, 0x4d, 0x91, 0x6c, 0x0f, 0x60, 0x11, 0x92, 0x1d, 0x6c, 0x59, 0xda, - 0x2e, 0x56, 0xed, 0x83, 0x2e, 0xce, 0x84, 0x28, 0xeb, 0x97, 0x86, 0x58, 0x3f, 0xc8, 0xf6, 0x04, - 0xc7, 0x6a, 0x1c, 0x74, 0x31, 0xca, 0x43, 0x1c, 0x1b, 0xfd, 0x0e, 0xa3, 0x10, 0x1e, 0x33, 0x78, - 0x65, 0xa3, 0xdf, 0x19, 0xa4, 0x12, 0x23, 0x68, 0x9c, 0x44, 0xd4, 0xc2, 0xbd, 0x5b, 0x7a, 0x13, - 0x67, 0x22, 0x94, 0xc0, 0x03, 0x43, 0x04, 0xea, 0xac, 0x7c, 0x90, 0x86, 0xc0, 0x43, 0x45, 0x88, - 0x3b, 0x43, 0x98, 0x89, 0x52, 0x22, 0xf7, 0x8d, 0x10, 0x21, 0xdc, 0x6e, 0x0d, 0x92, 0x70, 0xf1, - 0xd0, 0x45, 0x88, 0x9a, 0x5d, 0x5b, 0x37, 0x0d, 0x2b, 0x13, 0x5b, 0x92, 0xce, 0x24, 0x56, 0xee, - 0x1a, 0x29, 0x85, 0x35, 0x06, 0xa3, 0x08, 0x60, 0x54, 0x01, 0xd9, 0x32, 0xfb, 0xbd, 0x26, 0x56, - 0x9b, 0x66, 0x0b, 0xab, 0xba, 0xb1, 0x63, 0x66, 0xe2, 0x94, 0xc0, 0xe2, 0x70, 0x47, 0x28, 0x60, - 0xd1, 0x6c, 0xe1, 0x8a, 0xb1, 0x63, 0x2a, 0x29, 0xcb, 0x97, 0x46, 0xc7, 0x21, 0x62, 0x1d, 0x18, - 0xb6, 0xb6, 0x9f, 0x49, 0x52, 0x09, 0xe1, 0x29, 0xb4, 0x02, 0x51, 0xdc, 0xd2, 0x49, 0x75, 0x99, - 0xd4, 0x92, 0x74, 0x26, 0xb5, 0x92, 0x19, 0xe6, 0x31, 0x2b, 0x57, 0x04, 0x60, 0xee, 0x97, 0x23, - 0x90, 0x9e, 0x46, 0x2c, 0x2f, 0x43, 0x78, 0x87, 0x70, 0x26, 0x13, 0x38, 0x0a, 0xdf, 0x18, 0x8e, - 0x9f, 0xf1, 0x91, 0x3b, 0x64, 0x7c, 0x1e, 0x12, 0x06, 0xb6, 0x6c, 0xdc, 0x62, 0x52, 0x14, 0x9c, - 0x52, 0x0e, 0x81, 0x21, 0x0d, 0x8b, 0x61, 0xe8, 0x8e, 0xc4, 0xf0, 0x79, 0x48, 0x3b, 0x4d, 0x52, - 0x7b, 0x9a, 0xb1, 0x2b, 0xe4, 0xf9, 0xdc, 0xa4, 0x96, 0x2c, 0x3b, 0xfa, 0x40, 0x21, 0x68, 0x4a, - 0x0a, 0xfb, 0xd2, 0xa8, 0x04, 0x60, 0x1a, 0xd8, 0xdc, 0x51, 0x5b, 0xb8, 0xd9, 0xce, 0xc4, 0xc6, - 0x70, 0xa9, 0x46, 0x40, 0x86, 0xb8, 0x64, 0xb2, 0xdc, 0x66, 0x1b, 0x5d, 0x72, 0xc5, 0x33, 0x3a, - 0x46, 0xba, 0x36, 0xd8, 0xc4, 0x1c, 0x92, 0xd0, 0x2d, 0x48, 0xf5, 0x30, 0x99, 0x2b, 0xb8, 0xc5, - 0x7b, 0x16, 0xa7, 0x8d, 0x58, 0x9e, 0xd8, 0x33, 0x85, 0xa3, 0xb1, 0x8e, 0xcd, 0xf6, 0xbc, 0x49, - 0x74, 0x2f, 0x38, 0x19, 0x2a, 0x15, 0x2b, 0xa0, 0x9a, 0x2b, 0x29, 0x32, 0xab, 0x5a, 0x07, 0x67, - 0x5f, 0x86, 0x94, 0x9f, 0x3d, 0x68, 0x01, 0xc2, 0x96, 0xad, 0xf5, 0x6c, 0x2a, 0x85, 0x61, 0x85, - 0x25, 0x90, 0x0c, 0x41, 0x6c, 0xb4, 0xa8, 0x66, 0x0c, 0x2b, 0xe4, 0x27, 0xfa, 0xff, 0xdc, 0x0e, - 0x07, 0x69, 0x87, 0xef, 0x1f, 0x1e, 0x51, 0x1f, 0xe5, 0xc1, 0x7e, 0x67, 0x9f, 0x80, 0x59, 0x5f, - 0x07, 0xa6, 0xad, 0x3a, 0xf7, 0x9b, 0x21, 0x38, 0x36, 0x92, 0x36, 0x7a, 0x1e, 0x16, 0xfa, 0x86, - 0x6e, 0xd8, 0xb8, 0xd7, 0xed, 0x61, 0x22, 0xb2, 0xac, 0xae, 0xcc, 0x1b, 0xd1, 0x31, 0x42, 0xb7, - 0xe5, 0x85, 0x66, 0x54, 0x94, 0xf9, 0xfe, 0x70, 0x26, 0xba, 0x01, 0x09, 0x22, 0x1f, 0x5a, 0x4f, - 0xa3, 0x04, 0xd9, 0x6c, 0x5c, 0x99, 0xae, 0xcb, 0xcb, 0x25, 0x17, 0xb3, 0x10, 0xfc, 0xa0, 0x14, - 0x50, 0xbc, 0xb4, 0xd0, 0x13, 0x10, 0xdb, 0xc1, 0x9a, 0xdd, 0xef, 0x61, 0x2b, 0xb3, 0x42, 0x59, - 0x79, 0x6a, 0x78, 0x92, 0x32, 0x80, 0x3a, 0xb6, 0x15, 0x07, 0x18, 0x75, 0x20, 0x79, 0x0b, 0xf7, - 0xf4, 0x1d, 0xbd, 0xc9, 0x1a, 0x15, 0xa4, 0xca, 0xe7, 0xc9, 0x29, 0x1b, 0x75, 0xdd, 0x83, 0x5a, - 0xb7, 0x35, 0x1b, 0xaf, 0xc2, 0x56, 0xf5, 0x7a, 0x59, 0xa9, 0x5c, 0xa9, 0x94, 0x4b, 0xac, 0x99, - 0x3e, 0xf2, 0xd9, 0xef, 0x93, 0x20, 0xe1, 0xe9, 0x09, 0x51, 0x87, 0x46, 0xbf, 0xb3, 0x8d, 0x7b, - 0x7c, 0xbc, 0x78, 0x0a, 0x9d, 0x82, 0xf8, 0x4e, 0xbf, 0xdd, 0x66, 0x42, 0xc7, 0xd6, 0xd2, 0x18, - 0xc9, 0x20, 0x02, 0x47, 0x74, 0x1c, 0x57, 0x23, 0x54, 0xc7, 0x91, 0xdf, 0x28, 0x0b, 0x31, 0x21, - 0x94, 0x99, 0xf0, 0x92, 0x74, 0x26, 0xa6, 0x38, 0x69, 0x56, 0xd6, 0xc5, 0x9a, 0x8d, 0x5b, 0x99, - 0x88, 0x28, 0x63, 0xe9, 0x6b, 0xa1, 0x58, 0x48, 0x0e, 0xe7, 0x1e, 0x87, 0xb9, 0xa1, 0xae, 0xa0, - 0x34, 0x24, 0x4a, 0xe5, 0xe2, 0x7a, 0x5e, 0xc9, 0x37, 0x2a, 0xb5, 0xaa, 0x3c, 0x83, 0x52, 0xe0, - 0xe9, 0x9d, 0x2c, 0x9d, 0x8d, 0xc7, 0xde, 0x8c, 0xca, 0xaf, 0xbc, 0xf2, 0xca, 0x2b, 0x81, 0xdc, - 0xaf, 0x45, 0x60, 0x61, 0x94, 0x12, 0x1c, 0xa9, 0x8f, 0xdd, 0x4e, 0x07, 0x7d, 0x9d, 0xce, 0x43, - 0xb8, 0xad, 0x6d, 0xe3, 0x76, 0x26, 0x44, 0x07, 0xe1, 0xa1, 0xa9, 0xd4, 0xec, 0xf2, 0x3a, 0x41, - 0x51, 0x18, 0x26, 0x7a, 0x0f, 0x67, 0x4d, 0x98, 0x52, 0x38, 0x3b, 0x1d, 0x05, 0xa2, 0x1c, 0x39, - 0x1b, 0x4f, 0x41, 0x9c, 0xfc, 0x67, 0x7c, 0x8f, 0x30, 0xbe, 0x93, 0x0c, 0xca, 0xf7, 0x2c, 0xc4, - 0xa8, 0xde, 0x6b, 0x61, 0x67, 0x4c, 0x44, 0x9a, 0x68, 0x8a, 0x16, 0xde, 0xd1, 0xfa, 0x6d, 0x5b, - 0xbd, 0xa5, 0xb5, 0xfb, 0x98, 0x6a, 0xb0, 0xb8, 0x92, 0xe4, 0x99, 0xd7, 0x49, 0x1e, 0x5a, 0x84, - 0x04, 0x53, 0x93, 0xba, 0xd1, 0xc2, 0xfb, 0x74, 0x09, 0x0d, 0x2b, 0x4c, 0x73, 0x56, 0x48, 0x0e, - 0xa9, 0xfe, 0x45, 0xcb, 0x34, 0x84, 0xae, 0xa1, 0x55, 0x90, 0x0c, 0x5a, 0xfd, 0x13, 0x83, 0xab, - 0xf7, 0xdd, 0xa3, 0xbb, 0x37, 0xa4, 0x1c, 0x1f, 0x80, 0x34, 0x85, 0x78, 0x8c, 0x4f, 0x65, 0xad, - 0x9d, 0x99, 0xa3, 0x62, 0x90, 0x62, 0xd9, 0x35, 0x9e, 0x9b, 0xfb, 0x85, 0x00, 0x84, 0xe8, 0x4a, - 0x91, 0x86, 0x44, 0xe3, 0xc6, 0x66, 0x59, 0x2d, 0xd5, 0xb6, 0x0a, 0xeb, 0x65, 0x59, 0x22, 0x43, - 0x4f, 0x33, 0xae, 0xac, 0xd7, 0xf2, 0x0d, 0x39, 0xe0, 0xa4, 0x2b, 0xd5, 0xc6, 0xc5, 0xc7, 0xe5, - 0xa0, 0x83, 0xb0, 0xc5, 0x32, 0x42, 0x5e, 0x80, 0xc7, 0x56, 0xe4, 0x30, 0x92, 0x21, 0xc9, 0x08, - 0x54, 0x9e, 0x2f, 0x97, 0x2e, 0x3e, 0x2e, 0x47, 0xfc, 0x39, 0x8f, 0xad, 0xc8, 0x51, 0x34, 0x0b, - 0x71, 0x9a, 0x53, 0xa8, 0xd5, 0xd6, 0xe5, 0x98, 0x43, 0xb3, 0xde, 0x50, 0x2a, 0xd5, 0x35, 0x39, - 0xee, 0xd0, 0x5c, 0x53, 0x6a, 0x5b, 0x9b, 0x32, 0x38, 0x14, 0x36, 0xca, 0xf5, 0x7a, 0x7e, 0xad, - 0x2c, 0x27, 0x1c, 0x88, 0xc2, 0x8d, 0x46, 0xb9, 0x2e, 0x27, 0x7d, 0xcd, 0x7a, 0x6c, 0x45, 0x9e, - 0x75, 0xaa, 0x28, 0x57, 0xb7, 0x36, 0xe4, 0x14, 0x9a, 0x83, 0x59, 0x56, 0x85, 0x68, 0x44, 0x7a, - 0x20, 0xeb, 0xe2, 0xe3, 0xb2, 0xec, 0x36, 0x84, 0x51, 0x99, 0xf3, 0x65, 0x5c, 0x7c, 0x5c, 0x46, - 0xb9, 0x22, 0x84, 0xa9, 0x18, 0x22, 0x04, 0xa9, 0xf5, 0x7c, 0xa1, 0xbc, 0xae, 0xd6, 0x36, 0xc9, - 0xa4, 0xc9, 0xaf, 0xcb, 0x92, 0x9b, 0xa7, 0x94, 0x37, 0xcb, 0xf9, 0x46, 0xb9, 0x24, 0x07, 0xbd, - 0x79, 0xcf, 0x6e, 0x55, 0x94, 0x72, 0x49, 0x0e, 0xe4, 0x9a, 0xb0, 0x30, 0x6a, 0x85, 0x1c, 0x39, - 0x85, 0x3c, 0xb2, 0x10, 0x18, 0x23, 0x0b, 0x94, 0xd6, 0xa0, 0x2c, 0xe4, 0xbe, 0x10, 0x80, 0xf9, - 0x11, 0x56, 0xc2, 0xc8, 0x4a, 0x9e, 0x86, 0x30, 0x93, 0x65, 0xa6, 0xa9, 0x1f, 0x1c, 0x69, 0x6e, - 0x50, 0xc9, 0x1e, 0xb2, 0x9d, 0x28, 0x9e, 0xd7, 0xde, 0x0c, 0x8e, 0xb1, 0x37, 0x09, 0x89, 0x21, - 0x81, 0xfd, 0xa6, 0xa1, 0xd5, 0x9c, 0x19, 0x3c, 0x17, 0xa7, 0x31, 0x78, 0x68, 0xde, 0xd1, 0x56, - 0xf5, 0xf0, 0x88, 0x55, 0xfd, 0x32, 0xcc, 0x0d, 0x11, 0x9a, 0x7a, 0x75, 0x7d, 0xbf, 0x04, 0x99, - 0x71, 0xcc, 0x99, 0xa0, 0x12, 0x03, 0x3e, 0x95, 0x78, 0x79, 0x90, 0x83, 0xf7, 0x8c, 0x1f, 0x84, - 0xa1, 0xb1, 0xfe, 0x09, 0x09, 0x8e, 0x8f, 0xf6, 0x2b, 0x46, 0xb6, 0xe1, 0x3d, 0x10, 0xe9, 0x60, - 0x7b, 0xcf, 0x14, 0x76, 0xf2, 0xfd, 0x23, 0xac, 0x2f, 0x52, 0x3c, 0x38, 0xd8, 0x1c, 0xcb, 0x6b, - 0xbe, 0x05, 0xc7, 0x39, 0x07, 0xac, 0x35, 0x43, 0x2d, 0xfd, 0xce, 0x00, 0x1c, 0x1b, 0x49, 0x7c, - 0x64, 0x43, 0xef, 0x06, 0xd0, 0x8d, 0x6e, 0xdf, 0x66, 0xb6, 0x30, 0xd3, 0xc4, 0x71, 0x9a, 0x43, - 0x95, 0x17, 0xd1, 0xb2, 0x7d, 0xdb, 0x29, 0x67, 0xab, 0x24, 0xb0, 0x2c, 0x0a, 0xf0, 0xa4, 0xdb, - 0xd0, 0x10, 0x6d, 0xe8, 0xe9, 0x31, 0x3d, 0x1d, 0x12, 0xcc, 0x47, 0x41, 0x6e, 0xb6, 0x75, 0x6c, - 0xd8, 0xaa, 0x65, 0xf7, 0xb0, 0xd6, 0xd1, 0x8d, 0x5d, 0xb6, 0xda, 0xae, 0x86, 0x77, 0xb4, 0xb6, - 0x85, 0x95, 0x34, 0x2b, 0xae, 0x8b, 0x52, 0x82, 0x41, 0x05, 0xa8, 0xe7, 0xc1, 0x88, 0xf8, 0x30, - 0x58, 0xb1, 0x83, 0x91, 0xfb, 0x99, 0x38, 0x24, 0x3c, 0x5e, 0x18, 0xba, 0x07, 0x92, 0x2f, 0x6a, - 0xb7, 0x34, 0x55, 0x78, 0xd6, 0x8c, 0x13, 0x09, 0x92, 0xb7, 0xc9, 0xbd, 0xeb, 0x47, 0x61, 0x81, - 0x82, 0x98, 0x7d, 0x1b, 0xf7, 0xd4, 0x66, 0x5b, 0xb3, 0x2c, 0xca, 0xb4, 0x18, 0x05, 0x45, 0xa4, - 0xac, 0x46, 0x8a, 0x8a, 0xa2, 0x04, 0x5d, 0x80, 0x79, 0x8a, 0xd1, 0xe9, 0xb7, 0x6d, 0xbd, 0xdb, - 0xc6, 0x34, 0x66, 0x60, 0xd1, 0x25, 0xc7, 0x69, 0xd9, 0x1c, 0x81, 0xd8, 0xe0, 0x00, 0xa4, 0x45, - 0x16, 0x2a, 0xc1, 0xdd, 0x14, 0x6d, 0x17, 0x1b, 0xb8, 0xa7, 0xd9, 0x58, 0xc5, 0xef, 0xeb, 0x6b, - 0x6d, 0x4b, 0xd5, 0x8c, 0x96, 0xba, 0xa7, 0x59, 0x7b, 0x99, 0x05, 0x42, 0xa0, 0x10, 0xc8, 0x48, - 0xca, 0x49, 0x02, 0xb8, 0xc6, 0xe1, 0xca, 0x14, 0x2c, 0x6f, 0xb4, 0xae, 0x6a, 0xd6, 0x1e, 0x5a, - 0x85, 0xe3, 0x94, 0x8a, 0x65, 0xf7, 0x74, 0x63, 0x57, 0x6d, 0xee, 0xe1, 0xe6, 0x4d, 0xb5, 0x6f, - 0xef, 0x3c, 0x99, 0x39, 0xe5, 0xad, 0x9f, 0xb6, 0xb0, 0x4e, 0x61, 0x8a, 0x04, 0x64, 0xcb, 0xde, - 0x79, 0x12, 0xd5, 0x21, 0x49, 0x06, 0xa3, 0xa3, 0xbf, 0x8c, 0xd5, 0x1d, 0xb3, 0x47, 0xd7, 0xd0, - 0xd4, 0x08, 0xd5, 0xe4, 0xe1, 0xe0, 0x72, 0x8d, 0x23, 0x6c, 0x98, 0x2d, 0xbc, 0x1a, 0xae, 0x6f, - 0x96, 0xcb, 0x25, 0x25, 0x21, 0xa8, 0x5c, 0x31, 0x7b, 0x44, 0xa0, 0x76, 0x4d, 0x87, 0xc1, 0x09, - 0x26, 0x50, 0xbb, 0xa6, 0x60, 0xef, 0x05, 0x98, 0x6f, 0x36, 0x59, 0x9f, 0xf5, 0xa6, 0xca, 0x3d, - 0x72, 0x2b, 0x23, 0xfb, 0x98, 0xd5, 0x6c, 0xae, 0x31, 0x00, 0x2e, 0xe3, 0x16, 0xba, 0x04, 0xc7, - 0x5c, 0x66, 0x79, 0x11, 0xe7, 0x86, 0x7a, 0x39, 0x88, 0x7a, 0x01, 0xe6, 0xbb, 0x07, 0xc3, 0x88, - 0xc8, 0x57, 0x63, 0xf7, 0x60, 0x10, 0xed, 0x3e, 0x1a, 0x65, 0xe9, 0xe1, 0x26, 0x35, 0xf5, 0x4e, - 0x78, 0xa1, 0x3d, 0x05, 0x68, 0x19, 0xe4, 0x66, 0x53, 0xc5, 0x86, 0xb6, 0xdd, 0xc6, 0xaa, 0xd6, - 0xc3, 0x86, 0x66, 0x65, 0x16, 0x29, 0x70, 0xc8, 0xee, 0xf5, 0xb1, 0x92, 0x6a, 0x36, 0xcb, 0xb4, - 0x30, 0x4f, 0xcb, 0xd0, 0x59, 0x98, 0x33, 0xb7, 0x5f, 0x6c, 0x32, 0xc1, 0x52, 0xbb, 0x3d, 0xbc, - 0xa3, 0xef, 0x67, 0xde, 0x45, 0xb9, 0x94, 0x26, 0x05, 0x54, 0xac, 0x36, 0x69, 0x36, 0x7a, 0x10, - 0xe4, 0xa6, 0xb5, 0xa7, 0xf5, 0xba, 0x54, 0xb3, 0x5a, 0x5d, 0xad, 0x89, 0x33, 0xf7, 0x31, 0x50, - 0x96, 0x5f, 0x15, 0xd9, 0x44, 0xb0, 0xad, 0x97, 0xf4, 0x1d, 0x5b, 0x50, 0x7c, 0x80, 0x09, 0x36, - 0xcd, 0xe3, 0xd4, 0xce, 0x80, 0xdc, 0xdd, 0xeb, 0xfa, 0x2b, 0x3e, 0x43, 0xc1, 0x52, 0xdd, 0xbd, - 0xae, 0xb7, 0xde, 0x7b, 0x61, 0x96, 0x40, 0xba, 0x95, 0x3e, 0xc8, 0xec, 0xaf, 0xee, 0x9e, 0xa7, - 0xc6, 0xc7, 0xe1, 0x38, 0x01, 0xea, 0x60, 0x5b, 0x6b, 0x69, 0xb6, 0xe6, 0x81, 0x7e, 0x98, 0x42, - 0x2f, 0x74, 0xf7, 0xba, 0x1b, 0xbc, 0xd0, 0xd7, 0xce, 0x5e, 0x7f, 0xfb, 0xc0, 0x91, 0x8f, 0x47, - 0x58, 0x3b, 0x49, 0x9e, 0x90, 0x90, 0x3b, 0x76, 0x3f, 0xbe, 0x66, 0xce, 0x56, 0x6e, 0x15, 0x92, - 0x5e, 0xb9, 0x47, 0x71, 0x60, 0x92, 0x2f, 0x4b, 0xc4, 0x08, 0x2a, 0xd6, 0x4a, 0xc4, 0x7c, 0x79, - 0xa1, 0x2c, 0x07, 0x88, 0x19, 0xb5, 0x5e, 0x69, 0x94, 0x55, 0x65, 0xab, 0xda, 0xa8, 0x6c, 0x94, - 0xe5, 0xa0, 0xc7, 0xb0, 0xbf, 0x16, 0x8a, 0x9d, 0x95, 0x1f, 0xba, 0x16, 0x8a, 0xdd, 0x2f, 0x3f, - 0x40, 0xd9, 0x33, 0x24, 0x94, 0xb9, 0xb7, 0x82, 0x90, 0xf2, 0xbb, 0xe5, 0xe8, 0xdd, 0x70, 0x42, - 0xc4, 0xdd, 0x2c, 0x6c, 0xab, 0x2f, 0xe9, 0x3d, 0x3a, 0x59, 0x3b, 0x1a, 0x5b, 0x38, 0x1d, 0xa1, - 0x5c, 0xe0, 0x50, 0x75, 0x6c, 0x3f, 0xa7, 0xf7, 0xc8, 0x54, 0xec, 0x68, 0x36, 0x5a, 0x87, 0x45, - 0xc3, 0x54, 0x2d, 0x5b, 0x33, 0x5a, 0x5a, 0xaf, 0xe5, 0x0d, 0x64, 0x6a, 0xcd, 0x26, 0xb6, 0x2c, - 0x93, 0x2d, 0x92, 0x0e, 0x95, 0xbb, 0x0c, 0xb3, 0xce, 0x81, 0xdd, 0xd5, 0x23, 0xcf, 0x41, 0x07, - 0xe6, 0x44, 0x70, 0xdc, 0x9c, 0x38, 0x05, 0xf1, 0x8e, 0xd6, 0x55, 0xb1, 0x61, 0xf7, 0x0e, 0xa8, - 0xed, 0x1e, 0x53, 0x62, 0x1d, 0xad, 0x5b, 0x26, 0x69, 0x74, 0x1d, 0xee, 0x77, 0x41, 0xd5, 0x36, - 0xde, 0xd5, 0x9a, 0x07, 0x2a, 0x35, 0xd4, 0x69, 0x8c, 0x48, 0x6d, 0x9a, 0xc6, 0x4e, 0x5b, 0x6f, - 0xda, 0x16, 0xd5, 0x1d, 0x4c, 0xff, 0xe5, 0x5c, 0x8c, 0x75, 0x8a, 0x70, 0xcd, 0x32, 0x0d, 0x6a, - 0x9f, 0x17, 0x05, 0xb4, 0x4f, 0x6c, 0x92, 0xef, 0x08, 0xb1, 0xf1, 0x0f, 0x7d, 0x48, 0x0e, 0x5f, - 0x0b, 0xc5, 0xc2, 0x72, 0xe4, 0x5a, 0x28, 0x16, 0x91, 0xa3, 0xd7, 0x42, 0xb1, 0x98, 0x1c, 0xbf, - 0x16, 0x8a, 0xc5, 0x65, 0xc8, 0xdd, 0x9e, 0x85, 0xa4, 0xd7, 0xdd, 0x20, 0xde, 0x5b, 0x93, 0x2e, - 0xb8, 0x12, 0x55, 0xc9, 0xf7, 0x1e, 0xea, 0x9c, 0x2c, 0x17, 0xc9, 0x4a, 0xbc, 0x1a, 0x61, 0xb6, - 0xbd, 0xc2, 0x30, 0x89, 0x15, 0x44, 0x26, 0x19, 0x66, 0xb6, 0x54, 0x4c, 0xe1, 0x29, 0xb4, 0x06, - 0x91, 0x17, 0x2d, 0x4a, 0x3b, 0x42, 0x69, 0xbf, 0xeb, 0x70, 0xda, 0xd7, 0xea, 0x94, 0x78, 0xfc, - 0x5a, 0x5d, 0xad, 0xd6, 0x94, 0x8d, 0xfc, 0xba, 0xc2, 0xd1, 0xd1, 0x49, 0x08, 0xb5, 0xb5, 0x97, - 0x0f, 0xfc, 0x6b, 0x36, 0xcd, 0x42, 0xcb, 0x90, 0xee, 0x1b, 0xcc, 0x57, 0x27, 0x63, 0x4c, 0xa0, - 0xd2, 0x5e, 0xa8, 0x94, 0x5b, 0xba, 0x4e, 0xe0, 0xa7, 0x94, 0xab, 0x93, 0x10, 0x7a, 0x09, 0x6b, - 0x37, 0xfd, 0x2b, 0x2b, 0xcd, 0x42, 0x67, 0x20, 0xd9, 0xc2, 0xdb, 0xfd, 0x5d, 0xb5, 0x87, 0x5b, - 0x5a, 0xd3, 0xf6, 0xaf, 0x27, 0x09, 0x5a, 0xa4, 0xd0, 0x12, 0xf4, 0x0c, 0xc4, 0xc9, 0x18, 0x19, - 0x74, 0x8c, 0xe7, 0x28, 0x0b, 0x1e, 0x39, 0x9c, 0x05, 0x7c, 0x88, 0x05, 0x92, 0xe2, 0xe2, 0xa3, - 0xab, 0x10, 0xb5, 0xb5, 0xde, 0x2e, 0xb6, 0xad, 0xcc, 0xfc, 0x52, 0xf0, 0x4c, 0x6a, 0x44, 0x8c, - 0x6c, 0x04, 0xa9, 0x06, 0x45, 0xa1, 0x9e, 0xb2, 0x40, 0x47, 0xcf, 0x81, 0xcc, 0x43, 0xb1, 0x2a, - 0x77, 0x73, 0xad, 0xcc, 0x02, 0x15, 0xc0, 0x87, 0x0f, 0x27, 0xc9, 0x23, 0xb9, 0x25, 0x86, 0xa4, - 0xa4, 0xb1, 0x2f, 0xed, 0x9f, 0x17, 0xc7, 0x8e, 0x32, 0x2f, 0xb6, 0x20, 0xcd, 0x7f, 0xab, 0x56, - 0xbf, 0xdb, 0x35, 0x7b, 0x76, 0xe6, 0x38, 0xc5, 0x9f, 0xd0, 0x20, 0x41, 0x8c, 0xe1, 0x28, 0xa9, - 0x1d, 0x5f, 0xfa, 0x6b, 0x37, 0xdd, 0xb2, 0x2f, 0x40, 0xca, 0xcf, 0x0c, 0x6f, 0x20, 0x3c, 0x38, - 0x65, 0x20, 0x9c, 0xb8, 0x25, 0xc2, 0x51, 0x23, 0x4b, 0x13, 0x4b, 0x64, 0xbf, 0x3f, 0x00, 0x29, - 0x7f, 0xc7, 0xd0, 0x1a, 0x20, 0x31, 0x62, 0xba, 0x61, 0xf7, 0xcc, 0x56, 0xbf, 0x89, 0x5b, 0x7c, - 0xc2, 0x8e, 0xaf, 0x67, 0x8e, 0xe3, 0x54, 0x1c, 0x14, 0x2f, 0x21, 0xcf, 0x2c, 0x08, 0x4c, 0x49, - 0xa8, 0xe4, 0xce, 0x8f, 0x73, 0x30, 0x2f, 0x08, 0x10, 0x62, 0x2f, 0x69, 0x3d, 0x83, 0x98, 0xc8, - 0xcc, 0x68, 0x47, 0x9e, 0xa2, 0xe7, 0x58, 0x09, 0xca, 0x83, 0x10, 0x17, 0xb5, 0x87, 0x3b, 0xe6, - 0x2d, 0xdc, 0xe2, 0xe1, 0xa2, 0xf1, 0xd5, 0xa6, 0x38, 0x82, 0xc2, 0xe0, 0x73, 0xe7, 0x20, 0x4c, - 0xd5, 0x0f, 0x02, 0xe0, 0x0a, 0x48, 0x9e, 0x41, 0x31, 0x08, 0x15, 0x6b, 0x0a, 0x59, 0x1e, 0x65, - 0x48, 0xb2, 0x5c, 0x75, 0xb3, 0x52, 0x2e, 0x96, 0xe5, 0x40, 0xee, 0x02, 0x44, 0x98, 0x4e, 0x21, - 0x4b, 0xa7, 0xa3, 0x55, 0xe4, 0x19, 0x9e, 0xe4, 0x34, 0x24, 0x51, 0xba, 0xb5, 0x51, 0x28, 0x2b, - 0x72, 0x20, 0xb7, 0x05, 0xe9, 0x81, 0x79, 0x88, 0x8e, 0xc1, 0x9c, 0x52, 0x6e, 0x94, 0xab, 0x8d, - 0x4a, 0xad, 0xaa, 0x6e, 0x55, 0x9f, 0xa9, 0xd6, 0x9e, 0xab, 0xca, 0x33, 0xfe, 0x6c, 0xb1, 0x0e, - 0x4b, 0x68, 0x01, 0x64, 0x37, 0xbb, 0x5e, 0xdb, 0x52, 0x68, 0x6b, 0xbe, 0x2b, 0x00, 0xf2, 0xe0, - 0xa4, 0x44, 0x27, 0x60, 0xbe, 0x91, 0x57, 0xd6, 0xca, 0x0d, 0x95, 0x05, 0x3c, 0x1c, 0xd2, 0x0b, - 0x20, 0x7b, 0x0b, 0xae, 0x54, 0x68, 0x3c, 0x67, 0x11, 0x4e, 0x79, 0x73, 0xcb, 0xcf, 0x37, 0xca, - 0xd5, 0x3a, 0xad, 0x3c, 0x5f, 0x5d, 0x23, 0x46, 0xc1, 0x00, 0x3d, 0x11, 0x62, 0x09, 0x92, 0xa6, - 0xfa, 0xe9, 0x95, 0xd7, 0x4b, 0x72, 0x68, 0x30, 0xbb, 0x56, 0x2d, 0xd7, 0xae, 0xc8, 0xe1, 0xc1, - 0xda, 0x69, 0xd8, 0x25, 0x82, 0xb2, 0x70, 0x7c, 0x30, 0x57, 0x2d, 0x57, 0x1b, 0xca, 0x0d, 0x39, - 0x3a, 0x58, 0x71, 0xbd, 0xac, 0x5c, 0xaf, 0x14, 0xcb, 0x72, 0x0c, 0x1d, 0x07, 0xe4, 0x6f, 0x51, - 0xe3, 0x6a, 0xad, 0x24, 0xc7, 0x47, 0xad, 0x58, 0x48, 0x9e, 0xcf, 0xfd, 0xb4, 0x04, 0x49, 0x6f, - 0x08, 0xc4, 0xa7, 0x54, 0xa4, 0x77, 0xda, 0x62, 0x9b, 0xfb, 0xad, 0x00, 0x24, 0x3c, 0xb1, 0x10, - 0xe2, 0xc4, 0x6a, 0xed, 0xb6, 0xf9, 0x92, 0xaa, 0xb5, 0x75, 0xcd, 0xe2, 0xeb, 0x21, 0xd0, 0xac, - 0x3c, 0xc9, 0x99, 0x76, 0xfd, 0x99, 0xde, 0x74, 0x89, 0xdc, 0xb1, 0xe9, 0x12, 0x7d, 0x07, 0x9a, - 0x2e, 0x61, 0x39, 0x92, 0xfb, 0x9d, 0x00, 0xc8, 0x83, 0xd1, 0x91, 0x01, 0xbe, 0x49, 0xe3, 0xf8, - 0xe6, 0xed, 0x5f, 0xe0, 0x28, 0xfd, 0x1b, 0x5c, 0xd5, 0x83, 0x63, 0x57, 0xf5, 0x11, 0x8b, 0x55, - 0xe8, 0x9d, 0xbc, 0x58, 0x79, 0xc5, 0xf5, 0xdf, 0x4b, 0x90, 0xf2, 0x07, 0x73, 0x7c, 0x1c, 0xcb, - 0x1d, 0x85, 0x63, 0xfe, 0x11, 0xb9, 0x67, 0xdc, 0x88, 0x7c, 0x5d, 0xfa, 0xf5, 0x83, 0x41, 0x98, - 0xf5, 0xc5, 0x7e, 0xa6, 0x6d, 0xdd, 0xfb, 0x60, 0x4e, 0x6f, 0xe1, 0x4e, 0xd7, 0xb4, 0xb1, 0xd1, - 0x3c, 0x50, 0xdb, 0xf8, 0x16, 0x6e, 0x53, 0x36, 0xa4, 0x46, 0xec, 0xae, 0xfa, 0x6a, 0x58, 0xae, - 0xb8, 0x78, 0xeb, 0x04, 0x6d, 0x75, 0xbe, 0x52, 0x2a, 0x6f, 0x6c, 0xd6, 0x1a, 0xe5, 0x6a, 0xf1, - 0x86, 0xd0, 0xe4, 0x8a, 0xac, 0x0f, 0x80, 0xf9, 0x18, 0x7e, 0xef, 0x3b, 0xc3, 0xe9, 0xdc, 0x04, - 0x79, 0xb0, 0x37, 0x44, 0xa1, 0x8f, 0xe8, 0x8f, 0x3c, 0x83, 0xe6, 0x21, 0x5d, 0xad, 0xa9, 0xf5, - 0x4a, 0xa9, 0xac, 0x96, 0xaf, 0x5c, 0x29, 0x17, 0x1b, 0x75, 0xb6, 0xd1, 0xe0, 0x40, 0x37, 0xe4, - 0x80, 0x77, 0x6c, 0x7e, 0x28, 0x08, 0xf3, 0x23, 0x5a, 0x82, 0xf2, 0x3c, 0x44, 0xc8, 0xa2, 0x96, - 0x8f, 0x4c, 0xd3, 0xfa, 0x65, 0xe2, 0xdd, 0x6f, 0x6a, 0x3d, 0x9b, 0x47, 0x14, 0x1f, 0x04, 0xc2, - 0x5e, 0xc3, 0x26, 0xe6, 0x7d, 0x8f, 0x6f, 0xe0, 0x30, 0x13, 0x24, 0xed, 0xe6, 0xb3, 0x3d, 0x9c, - 0x87, 0x01, 0x75, 0x4d, 0x4b, 0xb7, 0xf5, 0x5b, 0x98, 0xd8, 0x50, 0x1c, 0x98, 0x4c, 0xdc, 0x90, - 0x22, 0x8b, 0x92, 0x8a, 0x61, 0x3b, 0xd0, 0x06, 0xde, 0xd5, 0x06, 0xa0, 0x89, 0xfb, 0x11, 0x54, - 0x64, 0x51, 0xe2, 0x40, 0xdf, 0x03, 0xc9, 0x96, 0xd9, 0xdf, 0x6e, 0x63, 0x0e, 0x47, 0x54, 0xb2, - 0xa4, 0x24, 0x58, 0x9e, 0x03, 0xc2, 0xc3, 0x66, 0xee, 0x36, 0x53, 0x52, 0x49, 0xb0, 0x3c, 0x06, - 0xf2, 0x00, 0xa4, 0xb5, 0xdd, 0xdd, 0x1e, 0x21, 0x2e, 0x08, 0xb1, 0x40, 0x60, 0xca, 0xc9, 0xa6, - 0x80, 0xd9, 0x6b, 0x10, 0x13, 0x7c, 0x20, 0xfe, 0x2f, 0xe1, 0x84, 0xda, 0x65, 0xd1, 0xed, 0xc0, - 0x99, 0xb8, 0x12, 0x33, 0x44, 0xe1, 0x3d, 0x90, 0xd4, 0x2d, 0xf7, 0x08, 0x51, 0x26, 0xb0, 0x14, - 0x38, 0x13, 0x53, 0x12, 0xba, 0xe5, 0x1e, 0x13, 0xfa, 0x99, 0x04, 0x80, 0x2b, 0x6c, 0xe8, 0x7b, - 0x24, 0x48, 0xb1, 0x05, 0xa6, 0xdb, 0xc3, 0x16, 0x36, 0x9a, 0xc2, 0x2d, 0x7c, 0xf0, 0x10, 0x11, - 0x65, 0x6a, 0x6e, 0x93, 0x23, 0x14, 0x9e, 0xfe, 0xa0, 0x24, 0xbd, 0x26, 0x85, 0x5e, 0x93, 0xa4, - 0x1f, 0x91, 0x66, 0x51, 0xac, 0xfc, 0xfc, 0xe6, 0x7a, 0xa5, 0x58, 0x69, 0x64, 0x3e, 0x10, 0xa5, - 0xe9, 0xca, 0x06, 0x4f, 0xbf, 0x11, 0xf5, 0x97, 0xbf, 0x19, 0xfd, 0xb4, 0x14, 0x8c, 0xbd, 0x19, - 0x55, 0x66, 0x77, 0xbc, 0xf4, 0x50, 0xdb, 0x7b, 0x82, 0x22, 0x30, 0xce, 0x91, 0x74, 0x5b, 0x53, - 0xe6, 0xe7, 0x26, 0x0a, 0x0f, 0xd2, 0x86, 0x44, 0x68, 0x43, 0x12, 0x28, 0x52, 0x5c, 0xaf, 0xd5, - 0xcb, 0x25, 0xda, 0x8c, 0x38, 0x0a, 0xd5, 0x36, 0xcb, 0xd5, 0xcc, 0x1b, 0xa2, 0x4a, 0xf7, 0xb0, - 0xc5, 0x6b, 0x12, 0x9c, 0x10, 0xbb, 0xac, 0x7c, 0xad, 0xc5, 0x46, 0xd3, 0x6c, 0x09, 0xeb, 0x36, - 0xb5, 0x72, 0xfe, 0xb0, 0xca, 0x15, 0x8e, 0x4a, 0x59, 0x52, 0xe6, 0x88, 0x85, 0x47, 0x86, 0x58, - 0x92, 0xaf, 0x96, 0x78, 0x5b, 0x12, 0x28, 0xb2, 0x99, 0x2f, 0x3e, 0x53, 0x2e, 0xb9, 0xad, 0x39, - 0xd6, 0x1b, 0x45, 0x05, 0x7d, 0x0b, 0xa4, 0xfb, 0xf6, 0xce, 0x93, 0x44, 0x36, 0xf4, 0x16, 0xdb, - 0xf6, 0x0e, 0x8d, 0xdb, 0x2f, 0x75, 0x5b, 0xb4, 0x65, 0xef, 0x3c, 0x79, 0xdd, 0xc1, 0xe0, 0x4c, - 0x61, 0x4d, 0x89, 0xa3, 0x50, 0xb5, 0x56, 0x2d, 0x8b, 0x66, 0xd0, 0x2d, 0xe2, 0x1b, 0x6e, 0x33, - 0x52, 0x7d, 0x1f, 0x2a, 0xfa, 0x16, 0x90, 0x45, 0x78, 0xc8, 0x61, 0x49, 0x78, 0xdc, 0x96, 0xaf, - 0xdb, 0x00, 0x1e, 0x64, 0x72, 0x98, 0x71, 0xbf, 0xa7, 0x05, 0x0b, 0x28, 0xbd, 0x5e, 0xae, 0xae, - 0x35, 0xae, 0xaa, 0x9b, 0x4a, 0x99, 0xee, 0xdc, 0x65, 0x3e, 0x20, 0xaa, 0x4f, 0x77, 0xfc, 0x88, - 0xe8, 0xdb, 0x24, 0x48, 0x30, 0x13, 0x88, 0xc5, 0xa4, 0x58, 0x50, 0xe1, 0xfe, 0xc3, 0xea, 0xa6, - 0x16, 0x10, 0x85, 0x2e, 0x5c, 0xa2, 0xd5, 0x06, 0x85, 0x40, 0x9c, 0x40, 0x68, 0xbd, 0xbc, 0x96, - 0x2f, 0xde, 0x50, 0x0b, 0xe5, 0x7a, 0x83, 0x68, 0xb2, 0x9a, 0xc2, 0x64, 0x14, 0x50, 0x38, 0xbf, - 0xbe, 0x5e, 0x7b, 0xce, 0x65, 0x04, 0xbc, 0xe8, 0x90, 0xc9, 0x7d, 0x23, 0xcc, 0xfa, 0xc4, 0x9d, - 0x18, 0xc5, 0xd4, 0x98, 0x26, 0x3d, 0xa8, 0x97, 0xab, 0x45, 0xaf, 0x11, 0x9f, 0x04, 0x47, 0xbc, - 0x65, 0x89, 0xa4, 0x84, 0xf0, 0xcb, 0x01, 0xa2, 0x46, 0x79, 0x03, 0x9c, 0xbd, 0xc4, 0x60, 0xee, - 0x09, 0x88, 0x09, 0xf1, 0x25, 0xa6, 0x39, 0xb5, 0xb0, 0x07, 0x1c, 0x83, 0x18, 0x50, 0xd9, 0x95, - 0x25, 0xe2, 0x06, 0x31, 0x99, 0x96, 0x03, 0xb9, 0xeb, 0x70, 0x6c, 0xa4, 0xe8, 0xa1, 0x7b, 0x61, - 0x51, 0xec, 0x5f, 0x32, 0xa3, 0x5f, 0x2d, 0x57, 0x8b, 0xb5, 0x12, 0x71, 0x93, 0x5c, 0x9a, 0x00, - 0x5c, 0x06, 0x59, 0x2b, 0x85, 0x7c, 0xca, 0x81, 0x5c, 0x05, 0x52, 0x7e, 0x01, 0x42, 0xa7, 0xe0, - 0xc4, 0x56, 0xe3, 0xca, 0x93, 0xea, 0xf5, 0xfc, 0x7a, 0xa5, 0x94, 0x1f, 0x70, 0x88, 0x00, 0xb8, - 0x14, 0xc9, 0x01, 0xd2, 0x50, 0x22, 0x5d, 0x72, 0x30, 0x17, 0x8a, 0x49, 0xb2, 0x94, 0xab, 0x43, - 0x7a, 0x40, 0x14, 0xd0, 0x5d, 0x90, 0xe1, 0x1e, 0xca, 0xa8, 0x56, 0x51, 0x0e, 0xf9, 0x84, 0x83, - 0xf9, 0x6a, 0xa5, 0xf2, 0x7a, 0x65, 0xa3, 0xd2, 0xa0, 0xed, 0xbb, 0x0a, 0xe0, 0x8e, 0x31, 0x59, - 0xb3, 0xae, 0xd5, 0x6b, 0x55, 0xf5, 0x0a, 0x71, 0xf4, 0x1a, 0x1e, 0x52, 0x71, 0x60, 0x63, 0x2a, - 0x4b, 0xc4, 0x1f, 0x19, 0x1e, 0x78, 0x39, 0x70, 0xf6, 0x43, 0x12, 0x59, 0xb2, 0x3e, 0x54, 0xcd, - 0x7e, 0x9b, 0x84, 0xee, 0x8e, 0xbd, 0x19, 0x45, 0xd1, 0xe5, 0xee, 0xf6, 0x72, 0xb3, 0xdb, 0xcd, - 0xa6, 0xc9, 0x8f, 0x62, 0xb7, 0x7b, 0x45, 0x2c, 0xc4, 0x8b, 0xb1, 0x3f, 0x8c, 0xa2, 0x18, 0xc9, - 0x7d, 0x51, 0xbb, 0xa5, 0x65, 0x65, 0xf2, 0xeb, 0x9a, 0x76, 0x4b, 0x73, 0x00, 0x4e, 0xc5, 0xbe, - 0x18, 0x45, 0x11, 0x92, 0xbd, 0x6b, 0x66, 0x53, 0xe4, 0xff, 0x9a, 0xe9, 0x14, 0xde, 0x1b, 0xfb, - 0x8e, 0x2a, 0x02, 0x92, 0x49, 0x25, 0xf6, 0x7c, 0x16, 0x91, 0xdf, 0x74, 0xdb, 0xec, 0xbc, 0x00, + 0x6b, 0x77, 0x7a, 0x35, 0xd3, 0x3d, 0xba, 0xdd, 0xb3, 0xd2, 0x0a, 0xf0, 0xe5, 0x4e, 0xf7, 0x99, + 0x99, 0xab, 0xed, 0xbe, 0xb7, 0xdd, 0xf7, 0xf6, 0x6a, 0x46, 0xbf, 0x2a, 0x4a, 0x60, 0xc3, 0xcf, + 0xc8, 0x98, 0x9f, 0xf9, 0x41, 0x81, 0xc0, 0x5e, 0x63, 0xc3, 0x0f, 0x30, 0x04, 0x12, 0xb0, 0x1d, + 0x1e, 0x49, 0x85, 0x47, 0x9e, 0xe0, 0x90, 0xc4, 0x50, 0x95, 0x84, 0xa4, 0x0a, 0x25, 0xd8, 0x14, + 0x12, 0xc6, 0x84, 0x97, 0x48, 0x48, 0xb9, 0x52, 0x4e, 0x9d, 0xd7, 0x7d, 0xf4, 0x63, 0xba, 0x67, + 0x2d, 0x13, 0x05, 0xf2, 0xcf, 0xee, 0xdc, 0x73, 0xbe, 0xef, 0x3b, 0xe7, 0x7c, 0xe7, 0x3b, 0xdf, + 0xeb, 0x3c, 0x1a, 0xde, 0xd8, 0x86, 0xa5, 0x5d, 0xd3, 0xdc, 0x6d, 0xe3, 0x73, 0xdd, 0x9e, 0x69, + 0x9b, 0xdb, 0xfd, 0x9d, 0x73, 0x2d, 0x6c, 0x35, 0x7b, 0x7a, 0xd7, 0x36, 0x7b, 0xcb, 0xb4, 0x0c, + 0xa5, 0x19, 0xc4, 0xb2, 0x80, 0xc8, 0x7d, 0x4e, 0x82, 0xb9, 0x2b, 0x7a, 0x1b, 0x97, 0x1c, 0xc8, + 0x3a, 0xb6, 0xd1, 0x93, 0x10, 0xda, 0xd1, 0xdb, 0x38, 0x23, 0x2d, 0x05, 0xcf, 0x24, 0x56, 0xde, + 0xb5, 0x3c, 0x80, 0xb5, 0xec, 0xc7, 0xd8, 0x24, 0xc5, 0x0a, 0xc5, 0x38, 0xfb, 0x7f, 0xc7, 0x5e, + 0xf9, 0xf2, 0xe7, 0xbe, 0x2a, 0xc9, 0xdf, 0x4a, 0xfe, 0xcd, 0x76, 0xd0, 0x4d, 0xf6, 0x8d, 0x1e, + 0x5f, 0x26, 0x78, 0x9e, 0xfe, 0xdc, 0x3a, 0x4f, 0x4a, 0x54, 0x82, 0xa4, 0xba, 0xc5, 0xaa, 0x85, + 0x6d, 0x15, 0xef, 0xdb, 0xd8, 0xb0, 0x74, 0xd3, 0xc8, 0x3e, 0x32, 0x02, 0x6b, 0xa8, 0xb7, 0x65, + 0x01, 0x9e, 0x7b, 0x2d, 0x0c, 0xf3, 0x23, 0xba, 0x86, 0x10, 0x84, 0x0c, 0xad, 0x43, 0x86, 0x23, + 0x9d, 0x89, 0x2b, 0xf4, 0x6f, 0x94, 0x81, 0x68, 0x57, 0x6b, 0xde, 0xd4, 0x76, 0x71, 0x26, 0x40, + 0x8b, 0xc5, 0x27, 0x3a, 0x0d, 0xd0, 0xc2, 0x5d, 0x6c, 0xb4, 0xb0, 0xd1, 0x3c, 0xc8, 0x04, 0x97, + 0x82, 0x67, 0xe2, 0x8a, 0xa7, 0x04, 0x3d, 0x04, 0x73, 0xdd, 0xfe, 0x76, 0x5b, 0x6f, 0xaa, 0x1e, + 0x30, 0x58, 0x0a, 0x9e, 0x09, 0x2b, 0x32, 0xab, 0x28, 0xb9, 0xc0, 0x0f, 0x40, 0xfa, 0x25, 0xac, + 0xdd, 0xf4, 0x82, 0x26, 0x28, 0x68, 0x8a, 0x14, 0x7b, 0x00, 0x8b, 0x90, 0xec, 0x60, 0xcb, 0xd2, + 0x76, 0xb1, 0x6a, 0x1f, 0x74, 0x71, 0x26, 0x44, 0x59, 0xbf, 0x34, 0xc4, 0xfa, 0x41, 0xb6, 0x27, + 0x38, 0x56, 0xe3, 0xa0, 0x8b, 0x51, 0x1e, 0xe2, 0xd8, 0xe8, 0x77, 0x18, 0x85, 0xf0, 0x98, 0xc9, + 0x2b, 0x1b, 0xfd, 0xce, 0x20, 0x95, 0x18, 0x41, 0xe3, 0x24, 0xa2, 0x16, 0xee, 0xdd, 0xd2, 0x9b, + 0x38, 0x13, 0xa1, 0x04, 0x1e, 0x18, 0x22, 0x50, 0x67, 0xf5, 0x83, 0x34, 0x04, 0x1e, 0x2a, 0x42, + 0xdc, 0x99, 0xc2, 0x4c, 0x94, 0x12, 0xb9, 0x6f, 0x84, 0x08, 0xe1, 0x76, 0x6b, 0x90, 0x84, 0x8b, + 0x87, 0x2e, 0x42, 0xd4, 0xec, 0xda, 0xba, 0x69, 0x58, 0x99, 0xd8, 0x92, 0x74, 0x26, 0xb1, 0x72, + 0xd7, 0x48, 0x29, 0xac, 0x31, 0x18, 0x45, 0x00, 0xa3, 0x0a, 0xc8, 0x96, 0xd9, 0xef, 0x35, 0xb1, + 0xda, 0x34, 0x5b, 0x58, 0xd5, 0x8d, 0x1d, 0x33, 0x13, 0xa7, 0x04, 0x16, 0x87, 0x07, 0x42, 0x01, + 0x8b, 0x66, 0x0b, 0x57, 0x8c, 0x1d, 0x53, 0x49, 0x59, 0xbe, 0x6f, 0x74, 0x1c, 0x22, 0xd6, 0x81, + 0x61, 0x6b, 0xfb, 0x99, 0x24, 0x95, 0x10, 0xfe, 0x85, 0x56, 0x20, 0x8a, 0x5b, 0x3a, 0x69, 0x2e, + 0x93, 0x5a, 0x92, 0xce, 0xa4, 0x56, 0x32, 0xc3, 0x3c, 0x66, 0xf5, 0x8a, 0x00, 0xcc, 0xfd, 0x52, + 0x04, 0xd2, 0xd3, 0x88, 0xe5, 0x65, 0x08, 0xef, 0x10, 0xce, 0x64, 0x02, 0x47, 0xe1, 0x1b, 0xc3, + 0xf1, 0x33, 0x3e, 0x72, 0x87, 0x8c, 0xcf, 0x43, 0xc2, 0xc0, 0x96, 0x8d, 0x5b, 0x4c, 0x8a, 0x82, + 0x53, 0xca, 0x21, 0x30, 0xa4, 0x61, 0x31, 0x0c, 0xdd, 0x91, 0x18, 0x3e, 0x0f, 0x69, 0xa7, 0x4b, + 0x6a, 0x4f, 0x33, 0x76, 0x85, 0x3c, 0x9f, 0x9b, 0xd4, 0x93, 0x65, 0x47, 0x1f, 0x28, 0x04, 0x4d, + 0x49, 0x61, 0xdf, 0x37, 0x2a, 0x01, 0x98, 0x06, 0x36, 0x77, 0xd4, 0x16, 0x6e, 0xb6, 0x33, 0xb1, + 0x31, 0x5c, 0xaa, 0x11, 0x90, 0x21, 0x2e, 0x99, 0xac, 0xb4, 0xd9, 0x46, 0x97, 0x5c, 0xf1, 0x8c, + 0x8e, 0x91, 0xae, 0x0d, 0xb6, 0x30, 0x87, 0x24, 0x74, 0x0b, 0x52, 0x3d, 0x4c, 0xd6, 0x0a, 0x6e, + 0xf1, 0x91, 0xc5, 0x69, 0x27, 0x96, 0x27, 0x8e, 0x4c, 0xe1, 0x68, 0x6c, 0x60, 0xb3, 0x3d, 0xef, + 0x27, 0xba, 0x17, 0x9c, 0x02, 0x95, 0x8a, 0x15, 0x50, 0xcd, 0x95, 0x14, 0x85, 0x55, 0xad, 0x83, + 0xb3, 0x2f, 0x43, 0xca, 0xcf, 0x1e, 0xb4, 0x00, 0x61, 0xcb, 0xd6, 0x7a, 0x36, 0x95, 0xc2, 0xb0, + 0xc2, 0x3e, 0x90, 0x0c, 0x41, 0x6c, 0xb4, 0xa8, 0x66, 0x0c, 0x2b, 0xe4, 0x4f, 0xf4, 0x7f, 0xb9, + 0x03, 0x0e, 0xd2, 0x01, 0xdf, 0x3f, 0x3c, 0xa3, 0x3e, 0xca, 0x83, 0xe3, 0xce, 0x3e, 0x01, 0xb3, + 0xbe, 0x01, 0x4c, 0xdb, 0x74, 0xee, 0x37, 0x43, 0x70, 0x6c, 0x24, 0x6d, 0xf4, 0x3c, 0x2c, 0xf4, + 0x0d, 0xdd, 0xb0, 0x71, 0xaf, 0xdb, 0xc3, 0x44, 0x64, 0x59, 0x5b, 0x99, 0x37, 0xa2, 0x63, 0x84, + 0x6e, 0xcb, 0x0b, 0xcd, 0xa8, 0x28, 0xf3, 0xfd, 0xe1, 0x42, 0x74, 0x03, 0x12, 0x44, 0x3e, 0xb4, + 0x9e, 0x46, 0x09, 0xb2, 0xd5, 0xb8, 0x32, 0xdd, 0x90, 0x97, 0x4b, 0x2e, 0x66, 0x21, 0xf8, 0x41, + 0x29, 0xa0, 0x78, 0x69, 0xa1, 0x27, 0x20, 0xb6, 0x83, 0x35, 0xbb, 0xdf, 0xc3, 0x56, 0x66, 0x85, + 0xb2, 0xf2, 0xd4, 0xf0, 0x22, 0x65, 0x00, 0x75, 0x6c, 0x2b, 0x0e, 0x30, 0xea, 0x40, 0xf2, 0x16, + 0xee, 0xe9, 0x3b, 0x7a, 0x93, 0x75, 0x2a, 0x48, 0x95, 0xcf, 0x93, 0x53, 0x76, 0xea, 0xba, 0x07, + 0xb5, 0x6e, 0x6b, 0x36, 0x5e, 0x85, 0xad, 0xea, 0xf5, 0xb2, 0x52, 0xb9, 0x52, 0x29, 0x97, 0x58, + 0x37, 0x7d, 0xe4, 0xb3, 0xdf, 0x27, 0x41, 0xc2, 0x33, 0x12, 0xa2, 0x0e, 0x8d, 0x7e, 0x67, 0x1b, + 0xf7, 0xf8, 0x7c, 0xf1, 0x2f, 0x74, 0x0a, 0xe2, 0x3b, 0xfd, 0x76, 0x9b, 0x09, 0x1d, 0xb3, 0xa5, + 0x31, 0x52, 0x40, 0x04, 0x8e, 0xe8, 0x38, 0xae, 0x46, 0xa8, 0x8e, 0x23, 0x7f, 0xa3, 0x2c, 0xc4, + 0x84, 0x50, 0x66, 0xc2, 0x4b, 0xd2, 0x99, 0x98, 0xe2, 0x7c, 0xb3, 0xba, 0x2e, 0xd6, 0x6c, 0xdc, + 0xca, 0x44, 0x44, 0x1d, 0xfb, 0xbe, 0x16, 0x8a, 0x85, 0xe4, 0x70, 0xee, 0x71, 0x98, 0x1b, 0x1a, + 0x0a, 0x4a, 0x43, 0xa2, 0x54, 0x2e, 0xae, 0xe7, 0x95, 0x7c, 0xa3, 0x52, 0xab, 0xca, 0x33, 0x28, + 0x05, 0x9e, 0xd1, 0xc9, 0xd2, 0xd9, 0x78, 0xec, 0xcd, 0xa8, 0xfc, 0xca, 0x2b, 0xaf, 0xbc, 0x12, + 0xc8, 0xfd, 0x5a, 0x04, 0x16, 0x46, 0x29, 0xc1, 0x91, 0xfa, 0xd8, 0x1d, 0x74, 0xd0, 0x37, 0xe8, + 0x3c, 0x84, 0xdb, 0xda, 0x36, 0x6e, 0x67, 0x42, 0x74, 0x12, 0x1e, 0x9a, 0x4a, 0xcd, 0x2e, 0xaf, + 0x13, 0x14, 0x85, 0x61, 0xa2, 0xf7, 0x70, 0xd6, 0x84, 0x29, 0x85, 0xb3, 0xd3, 0x51, 0x20, 0xca, + 0x91, 0xb3, 0xf1, 0x14, 0xc4, 0xc9, 0xff, 0x8c, 0xef, 0x11, 0xc6, 0x77, 0x52, 0x40, 0xf9, 0x9e, + 0x85, 0x18, 0xd5, 0x7b, 0x2d, 0xec, 0xcc, 0x89, 0xf8, 0x26, 0x9a, 0xa2, 0x85, 0x77, 0xb4, 0x7e, + 0xdb, 0x56, 0x6f, 0x69, 0xed, 0x3e, 0xa6, 0x1a, 0x2c, 0xae, 0x24, 0x79, 0xe1, 0x75, 0x52, 0x86, + 0x16, 0x21, 0xc1, 0xd4, 0xa4, 0x6e, 0xb4, 0xf0, 0x3e, 0x35, 0xa1, 0x61, 0x85, 0x69, 0xce, 0x0a, + 0x29, 0x21, 0xcd, 0xbf, 0x68, 0x99, 0x86, 0xd0, 0x35, 0xb4, 0x09, 0x52, 0x40, 0x9b, 0x7f, 0x62, + 0xd0, 0x7a, 0xdf, 0x3d, 0x7a, 0x78, 0x43, 0xca, 0xf1, 0x01, 0x48, 0x53, 0x88, 0xc7, 0xf8, 0x52, + 0xd6, 0xda, 0x99, 0x39, 0x2a, 0x06, 0x29, 0x56, 0x5c, 0xe3, 0xa5, 0xb9, 0x9f, 0x0f, 0x40, 0x88, + 0x5a, 0x8a, 0x34, 0x24, 0x1a, 0x37, 0x36, 0xcb, 0x6a, 0xa9, 0xb6, 0x55, 0x58, 0x2f, 0xcb, 0x12, + 0x99, 0x7a, 0x5a, 0x70, 0x65, 0xbd, 0x96, 0x6f, 0xc8, 0x01, 0xe7, 0xbb, 0x52, 0x6d, 0x5c, 0x7c, + 0x5c, 0x0e, 0x3a, 0x08, 0x5b, 0xac, 0x20, 0xe4, 0x05, 0x78, 0x6c, 0x45, 0x0e, 0x23, 0x19, 0x92, + 0x8c, 0x40, 0xe5, 0xf9, 0x72, 0xe9, 0xe2, 0xe3, 0x72, 0xc4, 0x5f, 0xf2, 0xd8, 0x8a, 0x1c, 0x45, + 0xb3, 0x10, 0xa7, 0x25, 0x85, 0x5a, 0x6d, 0x5d, 0x8e, 0x39, 0x34, 0xeb, 0x0d, 0xa5, 0x52, 0xbd, + 0x2a, 0xc7, 0x1d, 0x9a, 0x57, 0x95, 0xda, 0xd6, 0xa6, 0x0c, 0x0e, 0x85, 0x8d, 0x72, 0xbd, 0x9e, + 0xbf, 0x5a, 0x96, 0x13, 0x0e, 0x44, 0xe1, 0x46, 0xa3, 0x5c, 0x97, 0x93, 0xbe, 0x6e, 0x3d, 0xb6, + 0x22, 0xcf, 0x3a, 0x4d, 0x94, 0xab, 0x5b, 0x1b, 0x72, 0x0a, 0xcd, 0xc1, 0x2c, 0x6b, 0x42, 0x74, + 0x22, 0x3d, 0x50, 0x74, 0xf1, 0x71, 0x59, 0x76, 0x3b, 0xc2, 0xa8, 0xcc, 0xf9, 0x0a, 0x2e, 0x3e, + 0x2e, 0xa3, 0x5c, 0x11, 0xc2, 0x54, 0x0c, 0x11, 0x82, 0xd4, 0x7a, 0xbe, 0x50, 0x5e, 0x57, 0x6b, + 0x9b, 0x64, 0xd1, 0xe4, 0xd7, 0x65, 0xc9, 0x2d, 0x53, 0xca, 0x9b, 0xe5, 0x7c, 0xa3, 0x5c, 0x92, + 0x83, 0xde, 0xb2, 0x67, 0xb7, 0x2a, 0x4a, 0xb9, 0x24, 0x07, 0x72, 0x4d, 0x58, 0x18, 0x65, 0x21, + 0x47, 0x2e, 0x21, 0x8f, 0x2c, 0x04, 0xc6, 0xc8, 0x02, 0xa5, 0x35, 0x28, 0x0b, 0xb9, 0x2f, 0x06, + 0x60, 0x7e, 0x84, 0x97, 0x30, 0xb2, 0x91, 0xa7, 0x21, 0xcc, 0x64, 0x99, 0x69, 0xea, 0x07, 0x47, + 0xba, 0x1b, 0x54, 0xb2, 0x87, 0x7c, 0x27, 0x8a, 0xe7, 0xf5, 0x37, 0x83, 0x63, 0xfc, 0x4d, 0x42, + 0x62, 0x48, 0x60, 0xbf, 0x69, 0xc8, 0x9a, 0x33, 0x87, 0xe7, 0xe2, 0x34, 0x0e, 0x0f, 0x2d, 0x3b, + 0x9a, 0x55, 0x0f, 0x8f, 0xb0, 0xea, 0x97, 0x61, 0x6e, 0x88, 0xd0, 0xd4, 0xd6, 0xf5, 0xfd, 0x12, + 0x64, 0xc6, 0x31, 0x67, 0x82, 0x4a, 0x0c, 0xf8, 0x54, 0xe2, 0xe5, 0x41, 0x0e, 0xde, 0x33, 0x7e, + 0x12, 0x86, 0xe6, 0xfa, 0x27, 0x24, 0x38, 0x3e, 0x3a, 0xae, 0x18, 0xd9, 0x87, 0xf7, 0x40, 0xa4, + 0x83, 0xed, 0x3d, 0x53, 0xf8, 0xc9, 0xf7, 0x8f, 0xf0, 0xbe, 0x48, 0xf5, 0xe0, 0x64, 0x73, 0x2c, + 0xaf, 0xfb, 0x16, 0x1c, 0x17, 0x1c, 0xb0, 0xde, 0x0c, 0xf5, 0xf4, 0x3b, 0x03, 0x70, 0x6c, 0x24, + 0xf1, 0x91, 0x1d, 0xbd, 0x1b, 0x40, 0x37, 0xba, 0x7d, 0x9b, 0xf9, 0xc2, 0x4c, 0x13, 0xc7, 0x69, + 0x09, 0x55, 0x5e, 0x44, 0xcb, 0xf6, 0x6d, 0xa7, 0x9e, 0x59, 0x49, 0x60, 0x45, 0x14, 0xe0, 0x49, + 0xb7, 0xa3, 0x21, 0xda, 0xd1, 0xd3, 0x63, 0x46, 0x3a, 0x24, 0x98, 0x8f, 0x82, 0xdc, 0x6c, 0xeb, + 0xd8, 0xb0, 0x55, 0xcb, 0xee, 0x61, 0xad, 0xa3, 0x1b, 0xbb, 0xcc, 0xda, 0xae, 0x86, 0x77, 0xb4, + 0xb6, 0x85, 0x95, 0x34, 0xab, 0xae, 0x8b, 0x5a, 0x82, 0x41, 0x05, 0xa8, 0xe7, 0xc1, 0x88, 0xf8, + 0x30, 0x58, 0xb5, 0x83, 0x91, 0xfb, 0x99, 0x38, 0x24, 0x3c, 0x51, 0x18, 0xba, 0x07, 0x92, 0x2f, + 0x6a, 0xb7, 0x34, 0x55, 0x44, 0xd6, 0x8c, 0x13, 0x09, 0x52, 0xb6, 0xc9, 0xa3, 0xeb, 0x47, 0x61, + 0x81, 0x82, 0x98, 0x7d, 0x1b, 0xf7, 0xd4, 0x66, 0x5b, 0xb3, 0x2c, 0xca, 0xb4, 0x18, 0x05, 0x45, + 0xa4, 0xae, 0x46, 0xaa, 0x8a, 0xa2, 0x06, 0x5d, 0x80, 0x79, 0x8a, 0xd1, 0xe9, 0xb7, 0x6d, 0xbd, + 0xdb, 0xc6, 0x34, 0x67, 0x60, 0x51, 0x93, 0xe3, 0xf4, 0x6c, 0x8e, 0x40, 0x6c, 0x70, 0x00, 0xd2, + 0x23, 0x0b, 0x95, 0xe0, 0x6e, 0x8a, 0xb6, 0x8b, 0x0d, 0xdc, 0xd3, 0x6c, 0xac, 0xe2, 0xf7, 0xf5, + 0xb5, 0xb6, 0xa5, 0x6a, 0x46, 0x4b, 0xdd, 0xd3, 0xac, 0xbd, 0xcc, 0x02, 0x21, 0x50, 0x08, 0x64, + 0x24, 0xe5, 0x24, 0x01, 0xbc, 0xca, 0xe1, 0xca, 0x14, 0x2c, 0x6f, 0xb4, 0xd6, 0x34, 0x6b, 0x0f, + 0xad, 0xc2, 0x71, 0x4a, 0xc5, 0xb2, 0x7b, 0xba, 0xb1, 0xab, 0x36, 0xf7, 0x70, 0xf3, 0xa6, 0xda, + 0xb7, 0x77, 0x9e, 0xcc, 0x9c, 0xf2, 0xb6, 0x4f, 0x7b, 0x58, 0xa7, 0x30, 0x45, 0x02, 0xb2, 0x65, + 0xef, 0x3c, 0x89, 0xea, 0x90, 0x24, 0x93, 0xd1, 0xd1, 0x5f, 0xc6, 0xea, 0x8e, 0xd9, 0xa3, 0x36, + 0x34, 0x35, 0x42, 0x35, 0x79, 0x38, 0xb8, 0x5c, 0xe3, 0x08, 0x1b, 0x66, 0x0b, 0xaf, 0x86, 0xeb, + 0x9b, 0xe5, 0x72, 0x49, 0x49, 0x08, 0x2a, 0x57, 0xcc, 0x1e, 0x11, 0xa8, 0x5d, 0xd3, 0x61, 0x70, + 0x82, 0x09, 0xd4, 0xae, 0x29, 0xd8, 0x7b, 0x01, 0xe6, 0x9b, 0x4d, 0x36, 0x66, 0xbd, 0xa9, 0xf2, + 0x88, 0xdc, 0xca, 0xc8, 0x3e, 0x66, 0x35, 0x9b, 0x57, 0x19, 0x00, 0x97, 0x71, 0x0b, 0x5d, 0x82, + 0x63, 0x2e, 0xb3, 0xbc, 0x88, 0x73, 0x43, 0xa3, 0x1c, 0x44, 0xbd, 0x00, 0xf3, 0xdd, 0x83, 0x61, + 0x44, 0xe4, 0x6b, 0xb1, 0x7b, 0x30, 0x88, 0x76, 0x1f, 0xcd, 0xb2, 0xf4, 0x70, 0x93, 0xba, 0x7a, + 0x27, 0xbc, 0xd0, 0x9e, 0x0a, 0xb4, 0x0c, 0x72, 0xb3, 0xa9, 0x62, 0x43, 0xdb, 0x6e, 0x63, 0x55, + 0xeb, 0x61, 0x43, 0xb3, 0x32, 0x8b, 0x14, 0x38, 0x64, 0xf7, 0xfa, 0x58, 0x49, 0x35, 0x9b, 0x65, + 0x5a, 0x99, 0xa7, 0x75, 0xe8, 0x2c, 0xcc, 0x99, 0xdb, 0x2f, 0x36, 0x99, 0x60, 0xa9, 0xdd, 0x1e, + 0xde, 0xd1, 0xf7, 0x33, 0xef, 0xa2, 0x5c, 0x4a, 0x93, 0x0a, 0x2a, 0x56, 0x9b, 0xb4, 0x18, 0x3d, + 0x08, 0x72, 0xd3, 0xda, 0xd3, 0x7a, 0x5d, 0xaa, 0x59, 0xad, 0xae, 0xd6, 0xc4, 0x99, 0xfb, 0x18, + 0x28, 0x2b, 0xaf, 0x8a, 0x62, 0x22, 0xd8, 0xd6, 0x4b, 0xfa, 0x8e, 0x2d, 0x28, 0x3e, 0xc0, 0x04, + 0x9b, 0x96, 0x71, 0x6a, 0x67, 0x40, 0xee, 0xee, 0x75, 0xfd, 0x0d, 0x9f, 0xa1, 0x60, 0xa9, 0xee, + 0x5e, 0xd7, 0xdb, 0xee, 0xbd, 0x30, 0x4b, 0x20, 0xdd, 0x46, 0x1f, 0x64, 0xfe, 0x57, 0x77, 0xcf, + 0xd3, 0xe2, 0xe3, 0x70, 0x9c, 0x00, 0x75, 0xb0, 0xad, 0xb5, 0x34, 0x5b, 0xf3, 0x40, 0x3f, 0x4c, + 0xa1, 0x17, 0xba, 0x7b, 0xdd, 0x0d, 0x5e, 0xe9, 0xeb, 0x67, 0xaf, 0xbf, 0x7d, 0xe0, 0xc8, 0xc7, + 0x23, 0xac, 0x9f, 0xa4, 0x4c, 0x48, 0xc8, 0x1d, 0x87, 0x1f, 0x5f, 0xb7, 0x60, 0x2b, 0xb7, 0x0a, + 0x49, 0xaf, 0xdc, 0xa3, 0x38, 0x30, 0xc9, 0x97, 0x25, 0xe2, 0x04, 0x15, 0x6b, 0x25, 0xe2, 0xbe, + 0xbc, 0x50, 0x96, 0x03, 0xc4, 0x8d, 0x5a, 0xaf, 0x34, 0xca, 0xaa, 0xb2, 0x55, 0x6d, 0x54, 0x36, + 0xca, 0x72, 0xd0, 0xe3, 0xd8, 0x5f, 0x0b, 0xc5, 0xce, 0xca, 0x0f, 0x5d, 0x0b, 0xc5, 0xee, 0x97, + 0x1f, 0xa0, 0xec, 0x19, 0x12, 0xca, 0xdc, 0x5b, 0x41, 0x48, 0xf9, 0xc3, 0x72, 0xf4, 0x6e, 0x38, + 0x21, 0xf2, 0x6e, 0x16, 0xb6, 0xd5, 0x97, 0xf4, 0x1e, 0x5d, 0xac, 0x1d, 0x8d, 0x19, 0x4e, 0x47, + 0x28, 0x17, 0x38, 0x54, 0x1d, 0xdb, 0xcf, 0xe9, 0x3d, 0xb2, 0x14, 0x3b, 0x9a, 0x8d, 0xd6, 0x61, + 0xd1, 0x30, 0x55, 0xcb, 0xd6, 0x8c, 0x96, 0xd6, 0x6b, 0x79, 0x13, 0x99, 0x5a, 0xb3, 0x89, 0x2d, + 0xcb, 0x64, 0x46, 0xd2, 0xa1, 0x72, 0x97, 0x61, 0xd6, 0x39, 0xb0, 0x6b, 0x3d, 0xf2, 0x1c, 0x74, + 0x60, 0x4d, 0x04, 0xc7, 0xad, 0x89, 0x53, 0x10, 0xef, 0x68, 0x5d, 0x15, 0x1b, 0x76, 0xef, 0x80, + 0xfa, 0xee, 0x31, 0x25, 0xd6, 0xd1, 0xba, 0x65, 0xf2, 0x8d, 0xae, 0xc3, 0xfd, 0x2e, 0xa8, 0xda, + 0xc6, 0xbb, 0x5a, 0xf3, 0x40, 0xa5, 0x8e, 0x3a, 0xcd, 0x11, 0xa9, 0x4d, 0xd3, 0xd8, 0x69, 0xeb, + 0x4d, 0xdb, 0xa2, 0xba, 0x83, 0xe9, 0xbf, 0x9c, 0x8b, 0xb1, 0x4e, 0x11, 0xae, 0x59, 0xa6, 0x41, + 0xfd, 0xf3, 0xa2, 0x80, 0xf6, 0x89, 0x4d, 0xf2, 0x1d, 0x21, 0x36, 0xfe, 0xa9, 0x0f, 0xc9, 0xe1, + 0x6b, 0xa1, 0x58, 0x58, 0x8e, 0x5c, 0x0b, 0xc5, 0x22, 0x72, 0xf4, 0x5a, 0x28, 0x16, 0x93, 0xe3, + 0xd7, 0x42, 0xb1, 0xb8, 0x0c, 0xb9, 0xdb, 0xb3, 0x90, 0xf4, 0x86, 0x1b, 0x24, 0x7a, 0x6b, 0x52, + 0x83, 0x2b, 0x51, 0x95, 0x7c, 0xef, 0xa1, 0xc1, 0xc9, 0x72, 0x91, 0x58, 0xe2, 0xd5, 0x08, 0xf3, + 0xed, 0x15, 0x86, 0x49, 0xbc, 0x20, 0xb2, 0xc8, 0x30, 0xf3, 0xa5, 0x62, 0x0a, 0xff, 0x42, 0x57, + 0x21, 0xf2, 0xa2, 0x45, 0x69, 0x47, 0x28, 0xed, 0x77, 0x1d, 0x4e, 0xfb, 0x5a, 0x9d, 0x12, 0x8f, + 0x5f, 0xab, 0xab, 0xd5, 0x9a, 0xb2, 0x91, 0x5f, 0x57, 0x38, 0x3a, 0x3a, 0x09, 0xa1, 0xb6, 0xf6, + 0xf2, 0x81, 0xdf, 0x66, 0xd3, 0x22, 0xb4, 0x0c, 0xe9, 0xbe, 0xc1, 0x62, 0x75, 0x32, 0xc7, 0x04, + 0x2a, 0xed, 0x85, 0x4a, 0xb9, 0xb5, 0xeb, 0x04, 0x7e, 0x4a, 0xb9, 0x3a, 0x09, 0xa1, 0x97, 0xb0, + 0x76, 0xd3, 0x6f, 0x59, 0x69, 0x11, 0x3a, 0x03, 0xc9, 0x16, 0xde, 0xee, 0xef, 0xaa, 0x3d, 0xdc, + 0xd2, 0x9a, 0xb6, 0xdf, 0x9e, 0x24, 0x68, 0x95, 0x42, 0x6b, 0xd0, 0x33, 0x10, 0x27, 0x73, 0x64, + 0xd0, 0x39, 0x9e, 0xa3, 0x2c, 0x78, 0xe4, 0x70, 0x16, 0xf0, 0x29, 0x16, 0x48, 0x8a, 0x8b, 0x8f, + 0xd6, 0x20, 0x6a, 0x6b, 0xbd, 0x5d, 0x6c, 0x5b, 0x99, 0xf9, 0xa5, 0xe0, 0x99, 0xd4, 0x88, 0x1c, + 0xd9, 0x08, 0x52, 0x0d, 0x8a, 0x42, 0x23, 0x65, 0x81, 0x8e, 0x9e, 0x03, 0x99, 0xa7, 0x62, 0x55, + 0x1e, 0xe6, 0x5a, 0x99, 0x05, 0x2a, 0x80, 0x0f, 0x1f, 0x4e, 0x92, 0x67, 0x72, 0x4b, 0x0c, 0x49, + 0x49, 0x63, 0xdf, 0xb7, 0x7f, 0x5d, 0x1c, 0x3b, 0xca, 0xba, 0xd8, 0x82, 0x34, 0xff, 0x5b, 0xb5, + 0xfa, 0xdd, 0xae, 0xd9, 0xb3, 0x33, 0xc7, 0x29, 0xfe, 0x84, 0x0e, 0x09, 0x62, 0x0c, 0x47, 0x49, + 0xed, 0xf8, 0xbe, 0xbf, 0x7e, 0xcb, 0x2d, 0xfb, 0x02, 0xa4, 0xfc, 0xcc, 0xf0, 0x26, 0xc2, 0x83, + 0x53, 0x26, 0xc2, 0x49, 0x58, 0x22, 0x02, 0x35, 0x62, 0x9a, 0xd8, 0x47, 0xf6, 0xfb, 0x03, 0x90, + 0xf2, 0x0f, 0x0c, 0x5d, 0x05, 0x24, 0x66, 0x4c, 0x37, 0xec, 0x9e, 0xd9, 0xea, 0x37, 0x71, 0x8b, + 0x2f, 0xd8, 0xf1, 0xed, 0xcc, 0x71, 0x9c, 0x8a, 0x83, 0xe2, 0x25, 0xe4, 0x59, 0x05, 0x81, 0x29, + 0x09, 0x95, 0xdc, 0xf5, 0x71, 0x0e, 0xe6, 0x05, 0x01, 0x42, 0xec, 0x25, 0xad, 0x67, 0x10, 0x17, + 0x99, 0x39, 0xed, 0xc8, 0x53, 0xf5, 0x1c, 0xab, 0x41, 0x79, 0x10, 0xe2, 0xa2, 0xf6, 0x70, 0xc7, + 0xbc, 0x85, 0x5b, 0x3c, 0x5d, 0x34, 0xbe, 0xd9, 0x14, 0x47, 0x50, 0x18, 0x7c, 0xee, 0x1c, 0x84, + 0xa9, 0xfa, 0x41, 0x00, 0x5c, 0x01, 0xc9, 0x33, 0x28, 0x06, 0xa1, 0x62, 0x4d, 0x21, 0xe6, 0x51, + 0x86, 0x24, 0x2b, 0x55, 0x37, 0x2b, 0xe5, 0x62, 0x59, 0x0e, 0xe4, 0x2e, 0x40, 0x84, 0xe9, 0x14, + 0x62, 0x3a, 0x1d, 0xad, 0x22, 0xcf, 0xf0, 0x4f, 0x4e, 0x43, 0x12, 0xb5, 0x5b, 0x1b, 0x85, 0xb2, + 0x22, 0x07, 0x72, 0x5b, 0x90, 0x1e, 0x58, 0x87, 0xe8, 0x18, 0xcc, 0x29, 0xe5, 0x46, 0xb9, 0xda, + 0xa8, 0xd4, 0xaa, 0xea, 0x56, 0xf5, 0x99, 0x6a, 0xed, 0xb9, 0xaa, 0x3c, 0xe3, 0x2f, 0x16, 0x76, + 0x58, 0x42, 0x0b, 0x20, 0xbb, 0xc5, 0xf5, 0xda, 0x96, 0x42, 0x7b, 0xf3, 0x5d, 0x01, 0x90, 0x07, + 0x17, 0x25, 0x3a, 0x01, 0xf3, 0x8d, 0xbc, 0x72, 0xb5, 0xdc, 0x50, 0x59, 0xc2, 0xc3, 0x21, 0xbd, + 0x00, 0xb2, 0xb7, 0xe2, 0x4a, 0x85, 0xe6, 0x73, 0x16, 0xe1, 0x94, 0xb7, 0xb4, 0xfc, 0x7c, 0xa3, + 0x5c, 0xad, 0xd3, 0xc6, 0xf3, 0xd5, 0xab, 0xc4, 0x29, 0x18, 0xa0, 0x27, 0x52, 0x2c, 0x41, 0xd2, + 0x55, 0x3f, 0xbd, 0xf2, 0x7a, 0x49, 0x0e, 0x0d, 0x16, 0xd7, 0xaa, 0xe5, 0xda, 0x15, 0x39, 0x3c, + 0xd8, 0x3a, 0x4d, 0xbb, 0x44, 0x50, 0x16, 0x8e, 0x0f, 0x96, 0xaa, 0xe5, 0x6a, 0x43, 0xb9, 0x21, + 0x47, 0x07, 0x1b, 0xae, 0x97, 0x95, 0xeb, 0x95, 0x62, 0x59, 0x8e, 0xa1, 0xe3, 0x80, 0xfc, 0x3d, + 0x6a, 0xac, 0xd5, 0x4a, 0x72, 0x7c, 0x94, 0xc5, 0x42, 0xf2, 0x7c, 0xee, 0xa7, 0x25, 0x48, 0x7a, + 0x53, 0x20, 0x3e, 0xa5, 0x22, 0xbd, 0xd3, 0x8c, 0x6d, 0xee, 0xb7, 0x02, 0x90, 0xf0, 0xe4, 0x42, + 0x48, 0x10, 0xab, 0xb5, 0xdb, 0xe6, 0x4b, 0xaa, 0xd6, 0xd6, 0x35, 0x8b, 0xdb, 0x43, 0xa0, 0x45, + 0x79, 0x52, 0x32, 0xad, 0xfd, 0x99, 0xde, 0x75, 0x89, 0xdc, 0xb1, 0xeb, 0x12, 0x7d, 0x07, 0xba, + 0x2e, 0x61, 0x39, 0x92, 0xfb, 0x9d, 0x00, 0xc8, 0x83, 0xd9, 0x91, 0x01, 0xbe, 0x49, 0xe3, 0xf8, + 0xe6, 0x1d, 0x5f, 0xe0, 0x28, 0xe3, 0x1b, 0xb4, 0xea, 0xc1, 0xb1, 0x56, 0x7d, 0x84, 0xb1, 0x0a, + 0xbd, 0x93, 0x8d, 0x95, 0x57, 0x5c, 0xff, 0xad, 0x04, 0x29, 0x7f, 0x32, 0xc7, 0xc7, 0xb1, 0xdc, + 0x51, 0x38, 0xe6, 0x9f, 0x91, 0x7b, 0xc6, 0xcd, 0xc8, 0x5f, 0xcb, 0xb8, 0x7e, 0x30, 0x08, 0xb3, + 0xbe, 0xdc, 0xcf, 0xb4, 0xbd, 0x7b, 0x1f, 0xcc, 0xe9, 0x2d, 0xdc, 0xe9, 0x9a, 0x36, 0x36, 0x9a, + 0x07, 0x6a, 0x1b, 0xdf, 0xc2, 0x6d, 0xca, 0x86, 0xd4, 0x88, 0xdd, 0x55, 0x5f, 0x0b, 0xcb, 0x15, + 0x17, 0x6f, 0x9d, 0xa0, 0xad, 0xce, 0x57, 0x4a, 0xe5, 0x8d, 0xcd, 0x5a, 0xa3, 0x5c, 0x2d, 0xde, + 0x10, 0x9a, 0x5c, 0x91, 0xf5, 0x01, 0x30, 0x1f, 0xc3, 0xef, 0x7d, 0x67, 0x04, 0x9d, 0x9b, 0x20, + 0x0f, 0x8e, 0x86, 0x28, 0xf4, 0x11, 0xe3, 0x91, 0x67, 0xd0, 0x3c, 0xa4, 0xab, 0x35, 0xb5, 0x5e, + 0x29, 0x95, 0xd5, 0xf2, 0x95, 0x2b, 0xe5, 0x62, 0xa3, 0xce, 0x36, 0x1a, 0x1c, 0xe8, 0x86, 0x1c, + 0xf0, 0xce, 0xcd, 0x0f, 0x05, 0x61, 0x7e, 0x44, 0x4f, 0x50, 0x9e, 0xa7, 0x08, 0x59, 0xd6, 0xf2, + 0x91, 0x69, 0x7a, 0xbf, 0x4c, 0xa2, 0xfb, 0x4d, 0xad, 0x67, 0xf3, 0x8c, 0xe2, 0x83, 0x40, 0xd8, + 0x6b, 0xd8, 0xc4, 0xbd, 0xef, 0xf1, 0x0d, 0x1c, 0xe6, 0x82, 0xa4, 0xdd, 0x72, 0xb6, 0x87, 0xf3, + 0x30, 0xa0, 0xae, 0x69, 0xe9, 0xb6, 0x7e, 0x0b, 0x13, 0x1f, 0x8a, 0x03, 0x93, 0x85, 0x1b, 0x52, + 0x64, 0x51, 0x53, 0x31, 0x6c, 0x07, 0xda, 0xc0, 0xbb, 0xda, 0x00, 0x34, 0x09, 0x3f, 0x82, 0x8a, + 0x2c, 0x6a, 0x1c, 0xe8, 0x7b, 0x20, 0xd9, 0x32, 0xfb, 0xdb, 0x6d, 0xcc, 0xe1, 0x88, 0x4a, 0x96, + 0x94, 0x04, 0x2b, 0x73, 0x40, 0x78, 0xda, 0xcc, 0xdd, 0x66, 0x4a, 0x2a, 0x09, 0x56, 0xc6, 0x40, + 0x1e, 0x80, 0xb4, 0xb6, 0xbb, 0xdb, 0x23, 0xc4, 0x05, 0x21, 0x96, 0x08, 0x4c, 0x39, 0xc5, 0x14, + 0x30, 0x7b, 0x0d, 0x62, 0x82, 0x0f, 0x24, 0xfe, 0x25, 0x9c, 0x50, 0xbb, 0x2c, 0xbb, 0x1d, 0x38, + 0x13, 0x57, 0x62, 0x86, 0xa8, 0xbc, 0x07, 0x92, 0xba, 0xe5, 0x1e, 0x21, 0xca, 0x04, 0x96, 0x02, + 0x67, 0x62, 0x4a, 0x42, 0xb7, 0xdc, 0x63, 0x42, 0x3f, 0x93, 0x00, 0x70, 0x85, 0x0d, 0x7d, 0x8f, + 0x04, 0x29, 0x66, 0x60, 0xba, 0x3d, 0x6c, 0x61, 0xa3, 0x29, 0xc2, 0xc2, 0x07, 0x0f, 0x11, 0x51, + 0xa6, 0xe6, 0x36, 0x39, 0x42, 0xe1, 0xe9, 0x0f, 0x4a, 0xd2, 0x6b, 0x52, 0xe8, 0x35, 0x49, 0xfa, + 0x11, 0x69, 0x16, 0xc5, 0xca, 0xcf, 0x6f, 0xae, 0x57, 0x8a, 0x95, 0x46, 0xe6, 0x03, 0x51, 0xfa, + 0x5d, 0xd9, 0xe0, 0xdf, 0x6f, 0x44, 0xfd, 0xf5, 0x6f, 0x46, 0x3f, 0x2d, 0x05, 0x63, 0x6f, 0x46, + 0x95, 0xd9, 0x1d, 0x2f, 0x3d, 0xd4, 0xf6, 0x9e, 0xa0, 0x08, 0x8c, 0x0b, 0x24, 0xdd, 0xde, 0x94, + 0xf9, 0xb9, 0x89, 0xc2, 0x83, 0xb4, 0x23, 0x11, 0xda, 0x91, 0x04, 0x8a, 0x14, 0xd7, 0x6b, 0xf5, + 0x72, 0x89, 0x76, 0x23, 0x8e, 0x42, 0xb5, 0xcd, 0x72, 0x35, 0xf3, 0x86, 0x68, 0xd2, 0x3d, 0x6c, + 0xf1, 0x9a, 0x04, 0x27, 0xc4, 0x2e, 0x2b, 0xb7, 0xb5, 0xd8, 0x68, 0x9a, 0x2d, 0xe1, 0xdd, 0xa6, + 0x56, 0xce, 0x1f, 0xd6, 0xb8, 0xc2, 0x51, 0x29, 0x4b, 0xca, 0x1c, 0xb1, 0xf0, 0xc8, 0x10, 0x4b, + 0xf2, 0xd5, 0x12, 0xef, 0x4b, 0x02, 0x45, 0x36, 0xf3, 0xc5, 0x67, 0xca, 0x25, 0xb7, 0x37, 0xc7, + 0x7a, 0xa3, 0xa8, 0xa0, 0x6f, 0x81, 0x74, 0xdf, 0xde, 0x79, 0x92, 0xc8, 0x86, 0xde, 0x62, 0xdb, + 0xde, 0xa1, 0x71, 0xfb, 0xa5, 0x6e, 0x8f, 0xb6, 0xec, 0x9d, 0x27, 0xaf, 0x3b, 0x18, 0x9c, 0x29, + 0xac, 0x2b, 0x71, 0x14, 0xaa, 0xd6, 0xaa, 0x65, 0xd1, 0x0d, 0xba, 0x45, 0x7c, 0xc3, 0xed, 0x46, + 0xaa, 0xef, 0x43, 0x45, 0xdf, 0x02, 0xb2, 0x48, 0x0f, 0x39, 0x2c, 0x09, 0x8f, 0xdb, 0xf2, 0x75, + 0x3b, 0xc0, 0x93, 0x4c, 0x0e, 0x33, 0xee, 0xf7, 0xf4, 0x60, 0x01, 0xa5, 0xd7, 0xcb, 0xd5, 0xab, + 0x8d, 0x35, 0x75, 0x53, 0x29, 0xd3, 0x9d, 0xbb, 0xcc, 0x07, 0x44, 0xf3, 0xe9, 0x8e, 0x1f, 0x11, + 0x7d, 0x9b, 0x04, 0x09, 0xe6, 0x02, 0xb1, 0x9c, 0x14, 0x4b, 0x2a, 0xdc, 0x7f, 0x58, 0xdb, 0xd4, + 0x03, 0xa2, 0xd0, 0x85, 0x4b, 0xb4, 0xd9, 0xa0, 0x10, 0x88, 0x13, 0x08, 0xad, 0x97, 0xaf, 0xe6, + 0x8b, 0x37, 0xd4, 0x42, 0xb9, 0xde, 0x20, 0x9a, 0xac, 0xa6, 0x30, 0x19, 0x05, 0x14, 0xce, 0xaf, + 0xaf, 0xd7, 0x9e, 0x73, 0x19, 0x01, 0x2f, 0x3a, 0x64, 0x72, 0xdf, 0x08, 0xb3, 0x3e, 0x71, 0x27, + 0x4e, 0x31, 0x75, 0xa6, 0xc9, 0x08, 0xea, 0xe5, 0x6a, 0xd1, 0xeb, 0xc4, 0x27, 0xc1, 0x11, 0x6f, + 0x59, 0x22, 0x5f, 0x42, 0xf8, 0xe5, 0x00, 0x51, 0xa3, 0xbc, 0x03, 0xce, 0x5e, 0x62, 0x30, 0xf7, + 0x04, 0xc4, 0x84, 0xf8, 0x12, 0xd7, 0x9c, 0x7a, 0xd8, 0x03, 0x81, 0x41, 0x0c, 0xa8, 0xec, 0xca, + 0x12, 0x09, 0x83, 0x98, 0x4c, 0xcb, 0x81, 0xdc, 0x75, 0x38, 0x36, 0x52, 0xf4, 0xd0, 0xbd, 0xb0, + 0x28, 0xf6, 0x2f, 0x99, 0xd3, 0xaf, 0x96, 0xab, 0xc5, 0x5a, 0x89, 0x84, 0x49, 0x2e, 0x4d, 0x00, + 0x2e, 0x83, 0xac, 0x97, 0x42, 0x3e, 0xe5, 0x40, 0xae, 0x02, 0x29, 0xbf, 0x00, 0xa1, 0x53, 0x70, + 0x62, 0xab, 0x71, 0xe5, 0x49, 0xf5, 0x7a, 0x7e, 0xbd, 0x52, 0xca, 0x0f, 0x04, 0x44, 0x00, 0x5c, + 0x8a, 0xe4, 0x00, 0xe9, 0x28, 0x91, 0x2e, 0x39, 0x98, 0x0b, 0xc5, 0x24, 0x59, 0xca, 0xd5, 0x21, + 0x3d, 0x20, 0x0a, 0xe8, 0x2e, 0xc8, 0xf0, 0x08, 0x65, 0x54, 0xaf, 0x28, 0x87, 0x7c, 0xc2, 0xc1, + 0x62, 0xb5, 0x52, 0x79, 0xbd, 0xb2, 0x51, 0x69, 0xd0, 0xfe, 0xad, 0x01, 0xb8, 0x73, 0x4c, 0x6c, + 0xd6, 0xb5, 0x7a, 0xad, 0xaa, 0x5e, 0x21, 0x81, 0x5e, 0xc3, 0x43, 0x2a, 0x0e, 0x6c, 0x4e, 0x65, + 0x89, 0xc4, 0x23, 0xc3, 0x13, 0x2f, 0x07, 0xce, 0x7e, 0x48, 0x22, 0x26, 0xeb, 0x43, 0xd5, 0xec, + 0xb7, 0x49, 0xe8, 0xee, 0xd8, 0x9b, 0x51, 0x14, 0x5d, 0xee, 0x6e, 0x2f, 0x37, 0xbb, 0xdd, 0x6c, + 0x9a, 0xfc, 0x51, 0xec, 0x76, 0xaf, 0x08, 0x43, 0xbc, 0x18, 0xfb, 0xc3, 0x28, 0x8a, 0x91, 0xd2, + 0x17, 0xb5, 0x5b, 0x5a, 0x56, 0x26, 0x7f, 0x5d, 0xd3, 0x6e, 0x69, 0x0e, 0xc0, 0xa9, 0xd8, 0x97, + 0xa2, 0x28, 0x42, 0x8a, 0x77, 0xcd, 0x6c, 0x8a, 0xfc, 0x7f, 0xd5, 0x74, 0x2a, 0xef, 0x8d, 0x7d, + 0x47, 0x15, 0x01, 0x29, 0xa4, 0x12, 0x7b, 0x3e, 0x8b, 0xc8, 0xdf, 0x74, 0xdb, 0xec, 0xbc, 0x00, 0x3a, 0x1b, 0x89, 0x7d, 0xa8, 0x2a, 0x7f, 0xa4, 0x7a, 0x36, 0x12, 0xfb, 0x48, 0x55, 0xfe, 0x9e, 0xea, 0xb5, 0x48, 0xec, 0x8d, 0xa8, 0xfc, 0x66, 0x34, 0xf7, 0x27, 0x41, 0x40, 0xae, 0x7c, 0x3b, - 0x91, 0x97, 0xe7, 0x21, 0xe6, 0x84, 0x72, 0xd8, 0x41, 0xd5, 0x77, 0x1f, 0x32, 0x2d, 0x04, 0x9a, - 0x27, 0x6b, 0x20, 0xb4, 0xe3, 0x50, 0x23, 0x7e, 0x7b, 0x47, 0x37, 0xf4, 0x4e, 0xbf, 0xa3, 0x8a, - 0xf8, 0xc6, 0x44, 0xbf, 0x9d, 0x23, 0xf0, 0x34, 0x25, 0xa1, 0xed, 0xfb, 0x48, 0x84, 0x27, 0x92, - 0x60, 0x08, 0x3c, 0x9d, 0xfd, 0x2b, 0x09, 0x32, 0xe3, 0x1a, 0x7b, 0x47, 0xa1, 0x97, 0x2a, 0x2c, - 0x98, 0xb7, 0x70, 0xaf, 0xa7, 0xb7, 0xe8, 0x6e, 0x8a, 0x63, 0x90, 0x85, 0x26, 0x1b, 0x64, 0xf3, - 0x1e, 0x44, 0x67, 0x50, 0x0b, 0x64, 0xdd, 0xdc, 0x27, 0x4b, 0x86, 0xa0, 0x14, 0x9e, 0x4c, 0x69, - 0x96, 0xa2, 0x08, 0x1a, 0xd7, 0xc8, 0x34, 0x21, 0x3e, 0x50, 0x40, 0x0e, 0xba, 0x56, 0x5f, 0xee, - 0xe3, 0x41, 0x48, 0xf9, 0x0f, 0x67, 0xa2, 0x12, 0xc4, 0xda, 0x26, 0x3f, 0xf8, 0xc4, 0x46, 0xfb, - 0xcc, 0x84, 0xf3, 0x9c, 0xcb, 0xeb, 0x1c, 0x5e, 0x71, 0x30, 0xb3, 0xff, 0x56, 0x82, 0x98, 0xc8, - 0x46, 0xc7, 0x21, 0xd4, 0xd5, 0xec, 0x3d, 0x4a, 0x2e, 0x5c, 0x08, 0xc8, 0x92, 0x42, 0xd3, 0x24, - 0xdf, 0xea, 0x6a, 0xec, 0xd0, 0x17, 0xcf, 0x27, 0x69, 0x62, 0x79, 0xb5, 0xb1, 0xd6, 0xa2, 0xfb, - 0x80, 0x66, 0xa7, 0x83, 0x0d, 0xdb, 0x12, 0x96, 0x17, 0xcf, 0x2f, 0xf2, 0x6c, 0xf4, 0x10, 0xcc, - 0xd9, 0x3d, 0x4d, 0x6f, 0xfb, 0x60, 0x43, 0x14, 0x56, 0x16, 0x05, 0x0e, 0xf0, 0x2a, 0x9c, 0x14, - 0x74, 0x5b, 0xd8, 0xd6, 0x9a, 0x7b, 0xb8, 0xe5, 0x22, 0x45, 0xe8, 0x7e, 0xff, 0x09, 0x0e, 0x50, - 0xe2, 0xe5, 0x02, 0xf7, 0x6c, 0xdf, 0x77, 0xde, 0x7a, 0x17, 0x61, 0x7e, 0xde, 0xfa, 0xfc, 0x98, - 0xf3, 0xd6, 0x83, 0x67, 0x63, 0x3d, 0x87, 0xad, 0xcf, 0x8e, 0x40, 0xf1, 0x73, 0xd4, 0x35, 0xa1, - 0x3e, 0x17, 0x80, 0x39, 0xb1, 0x61, 0xda, 0x72, 0xc6, 0x68, 0x03, 0x40, 0x33, 0x0c, 0xd3, 0xf6, - 0x8e, 0xd2, 0xb0, 0x8d, 0x3b, 0x84, 0xb7, 0x9c, 0x77, 0x90, 0x14, 0x0f, 0x81, 0xec, 0x1f, 0x49, - 0x00, 0x6e, 0xd1, 0xd8, 0xe1, 0x5a, 0x84, 0x04, 0xef, 0x15, 0x3d, 0xb3, 0xce, 0xe2, 0x8a, 0xc0, - 0xb2, 0xae, 0xe8, 0x6d, 0x7a, 0x12, 0x62, 0x1b, 0xef, 0xea, 0x06, 0x3f, 0xc2, 0xc5, 0x12, 0xe2, - 0x24, 0x44, 0xc8, 0x3d, 0xe2, 0xa8, 0x40, 0xcc, 0xc2, 0x1d, 0xcd, 0xb0, 0xf5, 0x26, 0x9f, 0xac, - 0x17, 0x8f, 0xd4, 0xf8, 0xe5, 0x3a, 0xc7, 0x56, 0x1c, 0x3a, 0xb9, 0x33, 0x10, 0x13, 0xb9, 0xce, - 0xe2, 0x30, 0x83, 0xa2, 0x10, 0xac, 0x97, 0xc9, 0xf2, 0x48, 0x75, 0x74, 0x25, 0x5f, 0x97, 0x03, - 0x67, 0x7f, 0x22, 0x00, 0x51, 0xa1, 0x3d, 0xe6, 0x21, 0x5d, 0x2e, 0x55, 0x06, 0xd6, 0x99, 0x79, - 0x48, 0x89, 0x4c, 0xa6, 0xcc, 0xe5, 0x0f, 0x44, 0xbd, 0x99, 0x9b, 0x4a, 0xad, 0x51, 0x5b, 0x91, - 0xff, 0x60, 0x38, 0xf3, 0x31, 0xf9, 0x8d, 0x28, 0x9a, 0x83, 0xa4, 0xc8, 0x5c, 0x79, 0x74, 0xe5, - 0x31, 0xf9, 0xcd, 0xc1, 0xac, 0xc7, 0xe5, 0x3f, 0xa4, 0x21, 0x2d, 0x91, 0x75, 0x5e, 0x6d, 0x90, - 0xc5, 0xa2, 0x56, 0x5d, 0xbf, 0x21, 0x4b, 0xde, 0x82, 0x15, 0x4f, 0x41, 0x00, 0xdd, 0x0d, 0x27, - 0x44, 0xc1, 0xa5, 0x4b, 0x97, 0x2e, 0x3d, 0xe1, 0x29, 0xbc, 0xfd, 0xe1, 0xc8, 0x60, 0xf1, 0x93, - 0x9e, 0xe2, 0x8f, 0x0f, 0x17, 0x5f, 0xf2, 0x14, 0xff, 0xf0, 0x87, 0x23, 0x68, 0x1e, 0x12, 0xa2, - 0x78, 0x23, 0xff, 0xbc, 0xfc, 0x95, 0xaf, 0x7c, 0xe5, 0x2b, 0xd1, 0xc2, 0xb7, 0xc0, 0x7c, 0xd3, - 0xec, 0x0c, 0x0e, 0x4d, 0x41, 0x1e, 0x38, 0x8f, 0x61, 0x5d, 0x95, 0x5e, 0x78, 0x84, 0x03, 0xed, - 0x9a, 0x6d, 0xcd, 0xd8, 0x5d, 0x36, 0x7b, 0xbb, 0xee, 0xe5, 0x08, 0x62, 0x5b, 0x5b, 0x9e, 0x2b, - 0x12, 0xdd, 0xed, 0xbf, 0x92, 0xa4, 0x1f, 0x09, 0x04, 0xd7, 0x36, 0x0b, 0x3f, 0x15, 0xc8, 0xae, - 0x31, 0xc4, 0x4d, 0x31, 0xf0, 0x0a, 0xde, 0x69, 0xe3, 0x26, 0x19, 0x1d, 0xf8, 0xe3, 0x87, 0x60, - 0x61, 0xd7, 0xdc, 0x35, 0x29, 0xa5, 0x73, 0xe4, 0x17, 0xbf, 0x5d, 0x11, 0x77, 0x72, 0xb3, 0x13, - 0xaf, 0x62, 0xac, 0x56, 0x61, 0x9e, 0x03, 0xab, 0xd4, 0xd4, 0x67, 0x5b, 0xc6, 0xe8, 0xd0, 0x63, - 0x47, 0x99, 0x9f, 0xfb, 0x7d, 0x1a, 0xa3, 0x51, 0xe6, 0x38, 0x2a, 0x29, 0x63, 0xbb, 0xca, 0xab, - 0x0a, 0x1c, 0xf3, 0xd1, 0x63, 0x6e, 0x16, 0xee, 0x4d, 0xa0, 0xf8, 0x2f, 0x39, 0xc5, 0x79, 0x0f, - 0xc5, 0x3a, 0x47, 0x5d, 0x2d, 0xc2, 0xec, 0x51, 0x68, 0xfd, 0x2b, 0x4e, 0x2b, 0x89, 0xbd, 0x44, - 0xd6, 0x20, 0x4d, 0x89, 0x34, 0xfb, 0x96, 0x6d, 0x76, 0xa8, 0x0f, 0x7b, 0x38, 0x99, 0x7f, 0xfd, - 0xfb, 0x4c, 0xab, 0xa6, 0x08, 0x5a, 0xd1, 0xc1, 0x5a, 0x5d, 0x05, 0xea, 0xb2, 0xb4, 0x70, 0xb3, - 0x3d, 0x81, 0xc2, 0xaf, 0xf3, 0x86, 0x38, 0xf0, 0xab, 0xd7, 0x61, 0x81, 0xfc, 0xa6, 0x2e, 0xa6, - 0xb7, 0x25, 0x93, 0xcf, 0x28, 0x65, 0x7e, 0xeb, 0xfd, 0x4c, 0x71, 0xcf, 0x3b, 0x04, 0x3c, 0x6d, - 0xf2, 0x8c, 0xe2, 0x2e, 0xb6, 0x6d, 0xdc, 0xb3, 0x54, 0xad, 0x3d, 0xaa, 0x79, 0x9e, 0x43, 0x1e, - 0x99, 0x1f, 0xfc, 0x92, 0x7f, 0x14, 0xd7, 0x18, 0x66, 0xbe, 0xdd, 0x5e, 0xdd, 0x82, 0x13, 0x23, - 0xa4, 0x62, 0x0a, 0x9a, 0x3f, 0xc4, 0x69, 0x2e, 0x0c, 0x49, 0x06, 0x21, 0xbb, 0x09, 0x22, 0xdf, - 0x19, 0xcb, 0x29, 0x68, 0x7e, 0x94, 0xd3, 0x44, 0x1c, 0x57, 0x0c, 0x29, 0xa1, 0x78, 0x0d, 0xe6, - 0x6e, 0xe1, 0xde, 0xb6, 0x69, 0xf1, 0x83, 0x35, 0x53, 0x90, 0xfb, 0x18, 0x27, 0x97, 0xe6, 0x88, - 0xf4, 0xa4, 0x0d, 0xa1, 0x75, 0x09, 0x62, 0x3b, 0x5a, 0x13, 0x4f, 0x41, 0xe2, 0x36, 0x27, 0x11, - 0x25, 0xf0, 0x04, 0x35, 0x0f, 0xc9, 0x5d, 0x93, 0x47, 0x19, 0x26, 0xa3, 0x7f, 0x9c, 0xa3, 0x27, - 0x04, 0x0e, 0x27, 0xd1, 0x35, 0xbb, 0xfd, 0xb6, 0x66, 0x4f, 0xd3, 0x82, 0x1f, 0x16, 0x24, 0x04, - 0x0e, 0x27, 0x71, 0x04, 0xb6, 0x7e, 0x42, 0x90, 0xb0, 0x3c, 0xfc, 0x7c, 0x1a, 0x12, 0xa6, 0xd1, - 0x3e, 0x30, 0x8d, 0x69, 0x1a, 0xf1, 0x49, 0x4e, 0x01, 0x38, 0x0a, 0x21, 0x70, 0x19, 0xe2, 0xd3, - 0x0e, 0xc4, 0x8f, 0x7d, 0x49, 0x4c, 0x0f, 0x31, 0x02, 0x6b, 0x90, 0x16, 0x0a, 0x4a, 0x37, 0x8d, - 0x29, 0x48, 0xfc, 0x38, 0x27, 0x91, 0xf2, 0xa0, 0xf1, 0x6e, 0xd8, 0xd8, 0xb2, 0x77, 0xf1, 0x34, - 0x44, 0x7e, 0x42, 0x74, 0x83, 0xa3, 0x70, 0x56, 0x6e, 0x63, 0xa3, 0xb9, 0x37, 0x1d, 0x85, 0x4f, - 0x09, 0x56, 0x0a, 0x1c, 0x42, 0xa2, 0x08, 0xb3, 0x1d, 0xad, 0x67, 0xed, 0x69, 0xed, 0xa9, 0x86, - 0xe3, 0x27, 0x39, 0x8d, 0xa4, 0x83, 0xc4, 0x39, 0xd2, 0x37, 0x8e, 0x42, 0xe6, 0xa7, 0x04, 0x47, - 0x3c, 0x68, 0x7c, 0xea, 0x59, 0x36, 0x35, 0xb8, 0x8f, 0x42, 0xed, 0xef, 0x89, 0xa9, 0xc7, 0x70, - 0x37, 0xbc, 0x14, 0x2f, 0x43, 0xdc, 0xd2, 0x5f, 0x9e, 0x8a, 0xcc, 0x4f, 0x8b, 0x91, 0xa6, 0x08, - 0x04, 0xf9, 0x06, 0x9c, 0x1c, 0xb9, 0x4c, 0x4c, 0x41, 0xec, 0x67, 0x38, 0xb1, 0xe3, 0x23, 0x96, - 0x0a, 0xae, 0x12, 0x8e, 0x4a, 0xf2, 0xef, 0x0b, 0x95, 0x80, 0x07, 0x68, 0x6d, 0xc2, 0x42, 0xdf, - 0xb0, 0xb4, 0x9d, 0xa3, 0x71, 0xed, 0x1f, 0x08, 0xae, 0x31, 0x5c, 0x1f, 0xd7, 0x1a, 0x70, 0x9c, - 0x53, 0x3c, 0xda, 0xb8, 0xfe, 0xac, 0x50, 0xac, 0x0c, 0x7b, 0xcb, 0x3f, 0xba, 0xdf, 0x00, 0x59, - 0x87, 0x9d, 0xc2, 0x3a, 0xb6, 0xd4, 0x8e, 0xd6, 0x9d, 0x82, 0xf2, 0xcf, 0x71, 0xca, 0x42, 0xe3, - 0x3b, 0xe6, 0xb5, 0xb5, 0xa1, 0x75, 0x09, 0xf1, 0xe7, 0x21, 0x23, 0x88, 0xf7, 0x8d, 0x1e, 0x6e, - 0x9a, 0xbb, 0x86, 0xfe, 0x32, 0x6e, 0x4d, 0x41, 0xfa, 0xd3, 0x03, 0x43, 0xb5, 0xe5, 0x41, 0x27, - 0x94, 0x2b, 0x20, 0x3b, 0xb6, 0x8a, 0xaa, 0x77, 0xe8, 0x66, 0xcc, 0xe1, 0x14, 0x7f, 0x5e, 0x8c, - 0x94, 0x83, 0x57, 0xa1, 0x68, 0xab, 0x65, 0x60, 0x47, 0xf3, 0xa7, 0x15, 0xc9, 0xcf, 0x70, 0x42, - 0xb3, 0x2e, 0x16, 0x57, 0x1c, 0x4d, 0xb3, 0xd3, 0xd5, 0x7a, 0xd3, 0xe8, 0xbf, 0x7f, 0x28, 0x14, - 0x07, 0x47, 0xe1, 0x8a, 0x83, 0x58, 0x74, 0x64, 0xb5, 0x9f, 0x82, 0xc2, 0x2f, 0x08, 0xc5, 0x21, - 0x70, 0x38, 0x09, 0x61, 0x30, 0x4c, 0x41, 0xe2, 0x17, 0x05, 0x09, 0x81, 0x43, 0x48, 0x3c, 0xeb, - 0x2e, 0xb4, 0x3d, 0xbc, 0xab, 0x5b, 0x36, 0xbf, 0x3c, 0x73, 0x38, 0xa9, 0x5f, 0xfa, 0x92, 0xdf, - 0x08, 0x53, 0x3c, 0xa8, 0x44, 0x13, 0xf1, 0xa8, 0x20, 0x8d, 0x7a, 0x4f, 0x6e, 0xd8, 0x2f, 0x0b, - 0x4d, 0xe4, 0x41, 0x23, 0x6d, 0xf3, 0x58, 0x88, 0x84, 0xed, 0x4d, 0xe2, 0x49, 0x4e, 0x41, 0xee, - 0x1f, 0x0d, 0x34, 0xae, 0x2e, 0x70, 0x09, 0x4d, 0x8f, 0xfd, 0xd3, 0x37, 0x6e, 0xe2, 0x83, 0xa9, - 0xa4, 0xf3, 0x1f, 0x0f, 0xd8, 0x3f, 0x5b, 0x0c, 0x93, 0xe9, 0x90, 0xf4, 0x80, 0x3d, 0x85, 0x26, - 0xdd, 0xac, 0xcb, 0x7c, 0xeb, 0x5b, 0xbc, 0xbf, 0x7e, 0x73, 0x6a, 0x75, 0x9d, 0x08, 0xb9, 0xdf, - 0xe8, 0x99, 0x4c, 0xec, 0xfd, 0x6f, 0x39, 0x72, 0xee, 0xb3, 0x79, 0x56, 0xaf, 0xc0, 0xac, 0xcf, - 0xe0, 0x99, 0x4c, 0xea, 0x03, 0x9c, 0x54, 0xd2, 0x6b, 0xef, 0xac, 0x5e, 0x80, 0x10, 0x31, 0x5e, - 0x26, 0xa3, 0x7f, 0x3b, 0x47, 0xa7, 0xe0, 0xab, 0x4f, 0x41, 0x4c, 0x18, 0x2d, 0x93, 0x51, 0xbf, - 0x83, 0xa3, 0x3a, 0x28, 0x04, 0x5d, 0x18, 0x2c, 0x93, 0xd1, 0xff, 0x96, 0x40, 0x17, 0x28, 0x04, - 0x7d, 0x7a, 0x16, 0xfe, 0xea, 0x87, 0x42, 0x7c, 0xd1, 0x11, 0xbc, 0xbb, 0x0c, 0x51, 0x6e, 0xa9, - 0x4c, 0xc6, 0xfe, 0x4e, 0x5e, 0xb9, 0xc0, 0x58, 0x7d, 0x02, 0xc2, 0x53, 0x32, 0xfc, 0xc3, 0x1c, - 0x95, 0xc1, 0xaf, 0x16, 0x21, 0xe1, 0xb1, 0x4e, 0x26, 0xa3, 0x7f, 0x37, 0x47, 0xf7, 0x62, 0x91, - 0xa6, 0x73, 0xeb, 0x64, 0x32, 0x81, 0xbf, 0x2d, 0x9a, 0xce, 0x31, 0x08, 0xdb, 0x84, 0x61, 0x32, - 0x19, 0xfb, 0x23, 0x82, 0xeb, 0x02, 0x65, 0xf5, 0x69, 0x88, 0x3b, 0x8b, 0xcd, 0x64, 0xfc, 0xef, - 0xe1, 0xf8, 0x2e, 0x0e, 0xe1, 0x80, 0x67, 0xb1, 0x9b, 0x4c, 0xe2, 0xef, 0x08, 0x0e, 0x78, 0xb0, - 0xc8, 0x34, 0x1a, 0x34, 0x60, 0x26, 0x53, 0xfa, 0x5e, 0x31, 0x8d, 0x06, 0xec, 0x17, 0x32, 0x9a, - 0x54, 0xe7, 0x4f, 0x26, 0xf1, 0x7d, 0x62, 0x34, 0x29, 0x3c, 0x69, 0xc6, 0xa0, 0x45, 0x30, 0x99, - 0xc6, 0x0f, 0x88, 0x66, 0x0c, 0x18, 0x04, 0xab, 0x9b, 0x80, 0x86, 0xad, 0x81, 0xc9, 0xf4, 0x5e, - 0xe3, 0xf4, 0xe6, 0x86, 0x8c, 0x81, 0xd5, 0xe7, 0xe0, 0xf8, 0x68, 0x4b, 0x60, 0x32, 0xd5, 0x1f, - 0x7c, 0x6b, 0xc0, 0x77, 0xf3, 0x1a, 0x02, 0xab, 0x0d, 0x77, 0x49, 0xf1, 0x5a, 0x01, 0x93, 0xc9, - 0xfe, 0xd0, 0x5b, 0x7e, 0xc5, 0xed, 0x35, 0x02, 0x56, 0xf3, 0x00, 0xee, 0x02, 0x3c, 0x99, 0xd6, - 0xc7, 0x38, 0x2d, 0x0f, 0x12, 0x99, 0x1a, 0x7c, 0xfd, 0x9d, 0x8c, 0x7f, 0x5b, 0x4c, 0x0d, 0x8e, - 0x41, 0xa6, 0x86, 0x58, 0x7a, 0x27, 0x63, 0x7f, 0x5c, 0x4c, 0x0d, 0x81, 0x42, 0x24, 0xdb, 0xb3, - 0xba, 0x4d, 0xa6, 0xf0, 0x49, 0x21, 0xd9, 0x1e, 0xac, 0xd5, 0x2a, 0xcc, 0x0d, 0x2d, 0x88, 0x93, - 0x49, 0xfd, 0x08, 0x27, 0x25, 0x0f, 0xae, 0x87, 0xde, 0xc5, 0x8b, 0x2f, 0x86, 0x93, 0xa9, 0xfd, - 0xe8, 0xc0, 0xe2, 0xc5, 0xd7, 0xc2, 0xd5, 0xcb, 0x10, 0x33, 0xfa, 0xed, 0x36, 0x99, 0x3c, 0xe8, - 0xf0, 0xcb, 0x93, 0x99, 0x3f, 0xfc, 0x32, 0xe7, 0x8e, 0x40, 0x58, 0xbd, 0x00, 0x61, 0xdc, 0xd9, - 0xc6, 0xad, 0x49, 0x98, 0x5f, 0xfc, 0xb2, 0x50, 0x98, 0x04, 0x7a, 0xf5, 0x69, 0x00, 0x16, 0x1a, - 0xa1, 0x07, 0x90, 0x27, 0xe0, 0xfe, 0xd1, 0x97, 0xf9, 0x6d, 0x25, 0x17, 0xc5, 0x25, 0xc0, 0xee, - 0x3e, 0x1d, 0x4e, 0xe0, 0x4b, 0x7e, 0x02, 0x74, 0x44, 0x2e, 0x41, 0xf4, 0x45, 0xcb, 0x34, 0x6c, - 0x6d, 0x77, 0x12, 0xf6, 0x1f, 0x73, 0x6c, 0x01, 0x4f, 0x18, 0xd6, 0x31, 0x7b, 0xd8, 0xd6, 0x76, - 0xad, 0x49, 0xb8, 0xff, 0x8d, 0xe3, 0x3a, 0x08, 0x04, 0xb9, 0xa9, 0x59, 0xf6, 0x34, 0xfd, 0xfe, - 0x13, 0x81, 0x2c, 0x10, 0x48, 0xa3, 0xc9, 0xef, 0x9b, 0xf8, 0x60, 0x12, 0xee, 0x9f, 0x8a, 0x46, - 0x73, 0xf8, 0xd5, 0xa7, 0x20, 0x4e, 0x7e, 0xb2, 0x2b, 0x88, 0x13, 0x90, 0xff, 0x8c, 0x23, 0xbb, - 0x18, 0xa4, 0x66, 0xcb, 0x6e, 0xd9, 0xfa, 0x64, 0x66, 0xff, 0x39, 0x1f, 0x69, 0x01, 0xbf, 0x9a, - 0x87, 0x84, 0x65, 0xb7, 0x5a, 0x7d, 0x6e, 0x9f, 0x4e, 0x40, 0xff, 0x8b, 0x2f, 0x3b, 0x21, 0x0b, - 0x07, 0x87, 0x8c, 0xf6, 0x4b, 0x37, 0xed, 0xae, 0x49, 0x8f, 0xac, 0x4c, 0xa2, 0xf0, 0x16, 0xa7, - 0xe0, 0x41, 0x59, 0x2d, 0x42, 0x92, 0xf4, 0x45, 0xec, 0xfc, 0x4f, 0x22, 0xf1, 0x97, 0x9c, 0x01, - 0x3e, 0xa4, 0xc2, 0x37, 0xff, 0xfa, 0xe7, 0x4f, 0x4b, 0x9f, 0xfb, 0xfc, 0x69, 0xe9, 0xbf, 0x7e, - 0xfe, 0xb4, 0xf4, 0x91, 0x2f, 0x9c, 0x9e, 0xf9, 0xdc, 0x17, 0x4e, 0xcf, 0xfc, 0xce, 0x17, 0x4e, - 0xcf, 0x8c, 0x8e, 0x12, 0xc3, 0x9a, 0xb9, 0x66, 0xb2, 0xf8, 0xf0, 0x0b, 0xf7, 0xed, 0xea, 0xf6, - 0x5e, 0x7f, 0x7b, 0xb9, 0x69, 0x76, 0xce, 0x35, 0x4d, 0xab, 0x63, 0x5a, 0xe7, 0xfc, 0x71, 0x5d, - 0xfa, 0x0b, 0xfe, 0x97, 0x44, 0x7c, 0x66, 0x7f, 0x38, 0x57, 0x33, 0x0e, 0xc6, 0x3d, 0xa9, 0x73, - 0x11, 0x82, 0x79, 0xe3, 0x00, 0x9d, 0x64, 0x0a, 0x4e, 0xed, 0xf7, 0xda, 0xfc, 0x1e, 0x5c, 0x94, - 0xa4, 0xb7, 0x7a, 0x6d, 0xff, 0x19, 0xe8, 0x24, 0x3f, 0x03, 0x5d, 0xf8, 0x6e, 0xe9, 0x68, 0x3d, - 0x89, 0xe5, 0x8d, 0x03, 0xda, 0x91, 0x4d, 0xe9, 0x85, 0x87, 0x27, 0xc6, 0xb9, 0x6f, 0x1a, 0xe6, - 0x4b, 0x06, 0x69, 0x76, 0x77, 0x5b, 0xc4, 0xb8, 0x4f, 0x0f, 0xc6, 0xb8, 0x9f, 0xc3, 0xed, 0xf6, - 0x33, 0x04, 0xae, 0x41, 0x50, 0xb6, 0x23, 0xec, 0xca, 0x35, 0x7c, 0x6f, 0x00, 0x4e, 0x0f, 0x85, - 0xb3, 0xb9, 0x10, 0x8c, 0x63, 0xc2, 0x2a, 0xc4, 0x4a, 0x42, 0xb6, 0x32, 0x10, 0xb5, 0x70, 0xd3, - 0x34, 0x5a, 0xec, 0x30, 0x6b, 0x50, 0x11, 0x49, 0xc2, 0x08, 0x43, 0x33, 0x4c, 0x8b, 0xdf, 0x24, - 0x65, 0x89, 0xc2, 0x47, 0x8f, 0xc8, 0x88, 0x59, 0x51, 0x93, 0xe0, 0xc6, 0xf9, 0x29, 0xb9, 0x21, - 0x3a, 0xe1, 0x8b, 0xfc, 0x4f, 0xcb, 0x95, 0x1f, 0x08, 0xc0, 0xe2, 0x20, 0x57, 0xc8, 0xcc, 0xb2, - 0x6c, 0xad, 0xd3, 0x1d, 0xc7, 0x96, 0xcb, 0x10, 0x6f, 0x08, 0x98, 0x23, 0xf3, 0xe5, 0xf6, 0x11, - 0xf9, 0x92, 0x72, 0xaa, 0x12, 0x8c, 0x59, 0x99, 0x92, 0x31, 0x4e, 0x3f, 0xee, 0x88, 0x33, 0xff, - 0x33, 0x02, 0x27, 0xd9, 0x74, 0x52, 0xd9, 0x54, 0x62, 0x09, 0xce, 0x93, 0xa4, 0xb7, 0x68, 0xf2, - 0x3e, 0x49, 0xee, 0x19, 0x98, 0xaf, 0x10, 0x6d, 0x41, 0xbc, 0x20, 0x77, 0x87, 0x67, 0xe4, 0x65, - 0xdb, 0x25, 0x9f, 0xc1, 0xcf, 0x77, 0x02, 0xbd, 0x59, 0xb9, 0x6f, 0x95, 0x40, 0xae, 0x37, 0xb5, - 0xb6, 0xd6, 0xfb, 0x6a, 0x49, 0xa1, 0x27, 0x00, 0xd8, 0x51, 0x29, 0xe7, 0x99, 0x9c, 0xd4, 0x4a, - 0x66, 0xd9, 0xdb, 0xb9, 0x65, 0x56, 0x13, 0xbd, 0x88, 0x12, 0xa7, 0xb0, 0xe4, 0xe7, 0xd9, 0xe7, - 0x01, 0xdc, 0x02, 0x74, 0x0a, 0x4e, 0xd4, 0x8b, 0xf9, 0xf5, 0xbc, 0x22, 0xce, 0xbc, 0xd4, 0x37, - 0xcb, 0x45, 0xf6, 0x6a, 0xc5, 0x0c, 0x3a, 0x0e, 0xc8, 0x5b, 0xe8, 0x1c, 0xde, 0x3f, 0x06, 0x73, - 0xde, 0x7c, 0xf6, 0x84, 0x40, 0x80, 0x58, 0x8a, 0x7a, 0xa7, 0xdb, 0xc6, 0x74, 0x6b, 0x58, 0xd5, - 0x05, 0xd7, 0x26, 0x1b, 0x21, 0xbf, 0xf1, 0x1f, 0xd8, 0xb5, 0xf2, 0x79, 0x17, 0xdd, 0xe1, 0xf9, - 0xea, 0x3a, 0xcc, 0x69, 0xcd, 0x26, 0xee, 0xfa, 0x48, 0x4e, 0x50, 0xd5, 0x84, 0x20, 0xdd, 0xec, - 0xe6, 0x98, 0x2e, 0xb5, 0x27, 0x20, 0x62, 0xd1, 0xde, 0x4f, 0x22, 0xf1, 0x59, 0x4e, 0x82, 0x83, - 0xaf, 0x1a, 0x30, 0xc7, 0x5e, 0x51, 0xc1, 0x9e, 0x66, 0x1c, 0x1e, 0x67, 0xf8, 0x27, 0x3f, 0xff, - 0x28, 0xdd, 0x83, 0xbe, 0xc7, 0x3f, 0x2c, 0x23, 0xc4, 0x49, 0x91, 0x39, 0x6d, 0xb7, 0xa1, 0x18, - 0x52, 0xa2, 0x3e, 0xde, 0xe0, 0xc3, 0x2b, 0xfb, 0x15, 0x5e, 0xd9, 0xe9, 0x51, 0x32, 0xe0, 0xa9, - 0x69, 0x96, 0x53, 0x65, 0x05, 0x85, 0xf2, 0xb8, 0x39, 0xfd, 0xc2, 0x43, 0xc3, 0xab, 0x13, 0xfb, - 0xf7, 0x08, 0xa5, 0x7c, 0xd9, 0x5b, 0x8d, 0x33, 0xf7, 0x3e, 0x1a, 0x82, 0x39, 0xad, 0xa3, 0x1b, - 0xe6, 0x39, 0xfa, 0x97, 0xcf, 0xb9, 0x30, 0x4d, 0x4c, 0xb1, 0x29, 0x79, 0x91, 0x4d, 0x85, 0xc9, - 0x12, 0xf3, 0x67, 0xdf, 0xf5, 0xe3, 0x61, 0x77, 0xba, 0xac, 0x6e, 0x0c, 0x1f, 0x93, 0x9b, 0x4c, - 0xe3, 0xcf, 0x05, 0x8d, 0xc1, 0x53, 0x6f, 0xab, 0xef, 0x86, 0x98, 0x43, 0x66, 0x92, 0x65, 0x22, - 0x88, 0x38, 0x18, 0xc4, 0x2e, 0x61, 0x33, 0x73, 0x1a, 0x2b, 0xf4, 0x2d, 0x81, 0xcf, 0x66, 0x68, - 0x95, 0xf4, 0x66, 0x0d, 0x52, 0x2d, 0xd3, 0xb0, 0x55, 0xb3, 0xa3, 0xdb, 0xb8, 0xd3, 0xb5, 0x27, - 0xda, 0x75, 0x7f, 0xc9, 0x88, 0xc4, 0x94, 0x59, 0x82, 0x57, 0x13, 0x68, 0xa4, 0x25, 0xec, 0x11, - 0x95, 0x69, 0x5a, 0xf2, 0xdf, 0x9d, 0x96, 0x50, 0x1c, 0xd2, 0x92, 0x3b, 0x92, 0x0e, 0xab, 0x75, - 0x93, 0x2b, 0x73, 0x7b, 0x9f, 0x49, 0x81, 0x23, 0x1d, 0xff, 0x3c, 0x04, 0xa7, 0x39, 0xf0, 0xb6, - 0x66, 0xe1, 0x73, 0xb7, 0xce, 0x6f, 0x63, 0x5b, 0x3b, 0x7f, 0xae, 0x69, 0xea, 0x62, 0x25, 0x9f, - 0xe7, 0xca, 0x9a, 0x94, 0x2f, 0xf3, 0xf2, 0xec, 0xc8, 0xed, 0xee, 0xec, 0x78, 0x25, 0x9f, 0x1d, - 0x96, 0xc1, 0x5c, 0x1b, 0x42, 0x45, 0x53, 0xa7, 0x17, 0xc0, 0x5a, 0xd8, 0x30, 0x3b, 0x5c, 0xdd, - 0xb2, 0x04, 0xba, 0x0a, 0x11, 0xad, 0x63, 0xf6, 0x0d, 0x9b, 0xa9, 0xda, 0xc2, 0xa3, 0xbf, 0xfe, - 0xfa, 0xe2, 0xcc, 0x7f, 0x7e, 0x7d, 0xf1, 0x18, 0x23, 0x6b, 0xb5, 0x6e, 0x2e, 0xeb, 0xe6, 0xb9, - 0x8e, 0x66, 0xef, 0x91, 0xe9, 0xfb, 0xdb, 0x9f, 0x79, 0x04, 0x78, 0x7d, 0x15, 0xc3, 0xfe, 0xd4, + 0x99, 0x97, 0xe7, 0x21, 0xe6, 0xa4, 0x72, 0xd8, 0x41, 0xd5, 0x77, 0x1f, 0xb2, 0x2c, 0x04, 0x9a, + 0xa7, 0x68, 0x20, 0xb5, 0xe3, 0x50, 0x23, 0x71, 0x7b, 0x47, 0x37, 0xf4, 0x4e, 0xbf, 0xa3, 0x8a, + 0xfc, 0xc6, 0xc4, 0xb8, 0x9d, 0x23, 0xf0, 0x6f, 0x4a, 0x42, 0xdb, 0xf7, 0x91, 0x08, 0x4f, 0x24, + 0xc1, 0x10, 0xf8, 0x77, 0xf6, 0xaf, 0x24, 0xc8, 0x8c, 0xeb, 0xec, 0x1d, 0xa5, 0x5e, 0xaa, 0xb0, + 0x60, 0xde, 0xc2, 0xbd, 0x9e, 0xde, 0xa2, 0xbb, 0x29, 0x8e, 0x43, 0x16, 0x9a, 0xec, 0x90, 0xcd, + 0x7b, 0x10, 0x9d, 0x49, 0x2d, 0x10, 0xbb, 0xb9, 0x4f, 0x4c, 0x86, 0xa0, 0x14, 0x9e, 0x4c, 0x69, + 0x96, 0xa2, 0x08, 0x1a, 0xd7, 0xc8, 0x32, 0x21, 0x31, 0x50, 0x40, 0x0e, 0xba, 0x5e, 0x5f, 0xee, + 0xe3, 0x41, 0x48, 0xf9, 0x0f, 0x67, 0xa2, 0x12, 0xc4, 0xda, 0x26, 0x3f, 0xf8, 0xc4, 0x66, 0xfb, + 0xcc, 0x84, 0xf3, 0x9c, 0xcb, 0xeb, 0x1c, 0x5e, 0x71, 0x30, 0xb3, 0xff, 0x5a, 0x82, 0x98, 0x28, + 0x46, 0xc7, 0x21, 0xd4, 0xd5, 0xec, 0x3d, 0x4a, 0x2e, 0x5c, 0x08, 0xc8, 0x92, 0x42, 0xbf, 0x49, + 0xb9, 0xd5, 0xd5, 0xd8, 0xa1, 0x2f, 0x5e, 0x4e, 0xbe, 0x89, 0xe7, 0xd5, 0xc6, 0x5a, 0x8b, 0xee, + 0x03, 0x9a, 0x9d, 0x0e, 0x36, 0x6c, 0x4b, 0x78, 0x5e, 0xbc, 0xbc, 0xc8, 0x8b, 0xd1, 0x43, 0x30, + 0x67, 0xf7, 0x34, 0xbd, 0xed, 0x83, 0x0d, 0x51, 0x58, 0x59, 0x54, 0x38, 0xc0, 0xab, 0x70, 0x52, + 0xd0, 0x6d, 0x61, 0x5b, 0x6b, 0xee, 0xe1, 0x96, 0x8b, 0x14, 0xa1, 0xfb, 0xfd, 0x27, 0x38, 0x40, + 0x89, 0xd7, 0x0b, 0xdc, 0xb3, 0x7d, 0xdf, 0x79, 0xeb, 0x5d, 0x84, 0xf9, 0x79, 0xeb, 0xf3, 0x63, + 0xce, 0x5b, 0x0f, 0x9e, 0x8d, 0xf5, 0x1c, 0xb6, 0x3e, 0x3b, 0x02, 0xc5, 0xcf, 0x51, 0xd7, 0x85, + 0xfa, 0x7c, 0x00, 0xe6, 0xc4, 0x86, 0x69, 0xcb, 0x99, 0xa3, 0x0d, 0x00, 0xcd, 0x30, 0x4c, 0xdb, + 0x3b, 0x4b, 0xc3, 0x3e, 0xee, 0x10, 0xde, 0x72, 0xde, 0x41, 0x52, 0x3c, 0x04, 0xb2, 0x7f, 0x24, + 0x01, 0xb8, 0x55, 0x63, 0xa7, 0x6b, 0x11, 0x12, 0x7c, 0x54, 0xf4, 0xcc, 0x3a, 0xcb, 0x2b, 0x02, + 0x2b, 0xba, 0xa2, 0xb7, 0xe9, 0x49, 0x88, 0x6d, 0xbc, 0xab, 0x1b, 0xfc, 0x08, 0x17, 0xfb, 0x10, + 0x27, 0x21, 0x42, 0xee, 0x11, 0x47, 0x05, 0x62, 0x16, 0xee, 0x68, 0x86, 0xad, 0x37, 0xf9, 0x62, + 0xbd, 0x78, 0xa4, 0xce, 0x2f, 0xd7, 0x39, 0xb6, 0xe2, 0xd0, 0xc9, 0x9d, 0x81, 0x98, 0x28, 0x75, + 0x8c, 0xc3, 0x0c, 0x8a, 0x42, 0xb0, 0x5e, 0x26, 0xe6, 0x91, 0xea, 0xe8, 0x4a, 0xbe, 0x2e, 0x07, + 0xce, 0xfe, 0x44, 0x00, 0xa2, 0x42, 0x7b, 0xcc, 0x43, 0xba, 0x5c, 0xaa, 0x0c, 0xd8, 0x99, 0x79, + 0x48, 0x89, 0x42, 0xa6, 0xcc, 0xe5, 0x0f, 0x44, 0xbd, 0x85, 0x9b, 0x4a, 0xad, 0x51, 0x5b, 0x91, + 0xff, 0x60, 0xb8, 0xf0, 0x31, 0xf9, 0x8d, 0x28, 0x9a, 0x83, 0xa4, 0x28, 0x5c, 0x79, 0x74, 0xe5, + 0x31, 0xf9, 0xcd, 0xc1, 0xa2, 0xc7, 0xe5, 0x3f, 0xa4, 0x29, 0x2d, 0x51, 0x74, 0x5e, 0x6d, 0x10, + 0x63, 0x51, 0xab, 0xae, 0xdf, 0x90, 0x25, 0x6f, 0xc5, 0x8a, 0xa7, 0x22, 0x80, 0xee, 0x86, 0x13, + 0xa2, 0xe2, 0xd2, 0xa5, 0x4b, 0x97, 0x9e, 0xf0, 0x54, 0xde, 0xfe, 0x70, 0x64, 0xb0, 0xfa, 0x49, + 0x4f, 0xf5, 0xc7, 0x87, 0xab, 0x2f, 0x79, 0xaa, 0x7f, 0xf8, 0xc3, 0x11, 0x34, 0x0f, 0x09, 0x51, + 0xbd, 0x91, 0x7f, 0x5e, 0xfe, 0xea, 0x57, 0xbf, 0xfa, 0xd5, 0x68, 0xe1, 0x5b, 0x60, 0xbe, 0x69, + 0x76, 0x06, 0xa7, 0xa6, 0x20, 0x0f, 0x9c, 0xc7, 0xb0, 0xd6, 0xa4, 0x17, 0x1e, 0xe1, 0x40, 0xbb, + 0x66, 0x5b, 0x33, 0x76, 0x97, 0xcd, 0xde, 0xae, 0x7b, 0x39, 0x82, 0xf8, 0xd6, 0x96, 0xe7, 0x8a, + 0x44, 0x77, 0xfb, 0xaf, 0x24, 0xe9, 0x47, 0x02, 0xc1, 0xab, 0x9b, 0x85, 0x9f, 0x0a, 0x64, 0xaf, + 0x32, 0xc4, 0x4d, 0x31, 0xf1, 0x0a, 0xde, 0x69, 0xe3, 0x26, 0x99, 0x1d, 0xf8, 0xe3, 0x87, 0x60, + 0x61, 0xd7, 0xdc, 0x35, 0x29, 0xa5, 0x73, 0xe4, 0x2f, 0x7e, 0xbb, 0x22, 0xee, 0x94, 0x66, 0x27, + 0x5e, 0xc5, 0x58, 0xad, 0xc2, 0x3c, 0x07, 0x56, 0xa9, 0xab, 0xcf, 0xb6, 0x8c, 0xd1, 0xa1, 0xc7, + 0x8e, 0x32, 0x3f, 0xf7, 0xfb, 0x34, 0x47, 0xa3, 0xcc, 0x71, 0x54, 0x52, 0xc7, 0x76, 0x95, 0x57, + 0x15, 0x38, 0xe6, 0xa3, 0xc7, 0xc2, 0x2c, 0xdc, 0x9b, 0x40, 0xf1, 0x9f, 0x71, 0x8a, 0xf3, 0x1e, + 0x8a, 0x75, 0x8e, 0xba, 0x5a, 0x84, 0xd9, 0xa3, 0xd0, 0xfa, 0xe7, 0x9c, 0x56, 0x12, 0x7b, 0x89, + 0x5c, 0x85, 0x34, 0x25, 0xd2, 0xec, 0x5b, 0xb6, 0xd9, 0xa1, 0x31, 0xec, 0xe1, 0x64, 0xfe, 0xc5, + 0xef, 0x33, 0xad, 0x9a, 0x22, 0x68, 0x45, 0x07, 0x6b, 0x75, 0x15, 0x68, 0xc8, 0xd2, 0xc2, 0xcd, + 0xf6, 0x04, 0x0a, 0xbf, 0xce, 0x3b, 0xe2, 0xc0, 0xaf, 0x5e, 0x87, 0x05, 0xf2, 0x37, 0x0d, 0x31, + 0xbd, 0x3d, 0x99, 0x7c, 0x46, 0x29, 0xf3, 0x5b, 0xef, 0x67, 0x8a, 0x7b, 0xde, 0x21, 0xe0, 0xe9, + 0x93, 0x67, 0x16, 0x77, 0xb1, 0x6d, 0xe3, 0x9e, 0xa5, 0x6a, 0xed, 0x51, 0xdd, 0xf3, 0x1c, 0xf2, + 0xc8, 0xfc, 0xe0, 0x97, 0xfd, 0xb3, 0x78, 0x95, 0x61, 0xe6, 0xdb, 0xed, 0xd5, 0x2d, 0x38, 0x31, + 0x42, 0x2a, 0xa6, 0xa0, 0xf9, 0x43, 0x9c, 0xe6, 0xc2, 0x90, 0x64, 0x10, 0xb2, 0x9b, 0x20, 0xca, + 0x9d, 0xb9, 0x9c, 0x82, 0xe6, 0x47, 0x39, 0x4d, 0xc4, 0x71, 0xc5, 0x94, 0x12, 0x8a, 0xd7, 0x60, + 0xee, 0x16, 0xee, 0x6d, 0x9b, 0x16, 0x3f, 0x58, 0x33, 0x05, 0xb9, 0x8f, 0x71, 0x72, 0x69, 0x8e, + 0x48, 0x4f, 0xda, 0x10, 0x5a, 0x97, 0x20, 0xb6, 0xa3, 0x35, 0xf1, 0x14, 0x24, 0x6e, 0x73, 0x12, + 0x51, 0x02, 0x4f, 0x50, 0xf3, 0x90, 0xdc, 0x35, 0x79, 0x96, 0x61, 0x32, 0xfa, 0xc7, 0x39, 0x7a, + 0x42, 0xe0, 0x70, 0x12, 0x5d, 0xb3, 0xdb, 0x6f, 0x6b, 0xf6, 0x34, 0x3d, 0xf8, 0x61, 0x41, 0x42, + 0xe0, 0x70, 0x12, 0x47, 0x60, 0xeb, 0x27, 0x04, 0x09, 0xcb, 0xc3, 0xcf, 0xa7, 0x21, 0x61, 0x1a, + 0xed, 0x03, 0xd3, 0x98, 0xa6, 0x13, 0x9f, 0xe4, 0x14, 0x80, 0xa3, 0x10, 0x02, 0x97, 0x21, 0x3e, + 0xed, 0x44, 0xfc, 0xd8, 0x97, 0xc5, 0xf2, 0x10, 0x33, 0x70, 0x15, 0xd2, 0x42, 0x41, 0xe9, 0xa6, + 0x31, 0x05, 0x89, 0x1f, 0xe7, 0x24, 0x52, 0x1e, 0x34, 0x3e, 0x0c, 0x1b, 0x5b, 0xf6, 0x2e, 0x9e, + 0x86, 0xc8, 0x4f, 0x88, 0x61, 0x70, 0x14, 0xce, 0xca, 0x6d, 0x6c, 0x34, 0xf7, 0xa6, 0xa3, 0xf0, + 0x29, 0xc1, 0x4a, 0x81, 0x43, 0x48, 0x14, 0x61, 0xb6, 0xa3, 0xf5, 0xac, 0x3d, 0xad, 0x3d, 0xd5, + 0x74, 0xfc, 0x24, 0xa7, 0x91, 0x74, 0x90, 0x38, 0x47, 0xfa, 0xc6, 0x51, 0xc8, 0xfc, 0x94, 0xe0, + 0x88, 0x07, 0x8d, 0x2f, 0x3d, 0xcb, 0xa6, 0x0e, 0xf7, 0x51, 0xa8, 0xfd, 0x1d, 0xb1, 0xf4, 0x18, + 0xee, 0x86, 0x97, 0xe2, 0x65, 0x88, 0x5b, 0xfa, 0xcb, 0x53, 0x91, 0xf9, 0x69, 0x31, 0xd3, 0x14, + 0x81, 0x20, 0xdf, 0x80, 0x93, 0x23, 0xcd, 0xc4, 0x14, 0xc4, 0x7e, 0x86, 0x13, 0x3b, 0x3e, 0xc2, + 0x54, 0x70, 0x95, 0x70, 0x54, 0x92, 0x7f, 0x57, 0xa8, 0x04, 0x3c, 0x40, 0x6b, 0x13, 0x16, 0xfa, + 0x86, 0xa5, 0xed, 0x1c, 0x8d, 0x6b, 0x7f, 0x4f, 0x70, 0x8d, 0xe1, 0xfa, 0xb8, 0xd6, 0x80, 0xe3, + 0x9c, 0xe2, 0xd1, 0xe6, 0xf5, 0x67, 0x85, 0x62, 0x65, 0xd8, 0x5b, 0xfe, 0xd9, 0xfd, 0x06, 0xc8, + 0x3a, 0xec, 0x14, 0xde, 0xb1, 0xa5, 0x76, 0xb4, 0xee, 0x14, 0x94, 0x7f, 0x8e, 0x53, 0x16, 0x1a, + 0xdf, 0x71, 0xaf, 0xad, 0x0d, 0xad, 0x4b, 0x88, 0x3f, 0x0f, 0x19, 0x41, 0xbc, 0x6f, 0xf4, 0x70, + 0xd3, 0xdc, 0x35, 0xf4, 0x97, 0x71, 0x6b, 0x0a, 0xd2, 0x9f, 0x1e, 0x98, 0xaa, 0x2d, 0x0f, 0x3a, + 0xa1, 0x5c, 0x01, 0xd9, 0xf1, 0x55, 0x54, 0xbd, 0x43, 0x37, 0x63, 0x0e, 0xa7, 0xf8, 0x19, 0x31, + 0x53, 0x0e, 0x5e, 0x85, 0xa2, 0xad, 0x96, 0x81, 0x1d, 0xcd, 0x9f, 0x56, 0x24, 0x3f, 0xcb, 0x09, + 0xcd, 0xba, 0x58, 0x5c, 0x71, 0x34, 0xcd, 0x4e, 0x57, 0xeb, 0x4d, 0xa3, 0xff, 0xfe, 0xbe, 0x50, + 0x1c, 0x1c, 0x85, 0x2b, 0x0e, 0xe2, 0xd1, 0x11, 0x6b, 0x3f, 0x05, 0x85, 0x9f, 0x17, 0x8a, 0x43, + 0xe0, 0x70, 0x12, 0xc2, 0x61, 0x98, 0x82, 0xc4, 0x2f, 0x08, 0x12, 0x02, 0x87, 0x90, 0x78, 0xd6, + 0x35, 0xb4, 0x3d, 0xbc, 0xab, 0x5b, 0x36, 0xbf, 0x3c, 0x73, 0x38, 0xa9, 0x5f, 0xfc, 0xb2, 0xdf, + 0x09, 0x53, 0x3c, 0xa8, 0x44, 0x13, 0xf1, 0xac, 0x20, 0xcd, 0x7a, 0x4f, 0xee, 0xd8, 0x2f, 0x09, + 0x4d, 0xe4, 0x41, 0x23, 0x7d, 0xf3, 0x78, 0x88, 0x84, 0xed, 0x4d, 0x12, 0x49, 0x4e, 0x41, 0xee, + 0x1f, 0x0c, 0x74, 0xae, 0x2e, 0x70, 0x09, 0x4d, 0x8f, 0xff, 0xd3, 0x37, 0x6e, 0xe2, 0x83, 0xa9, + 0xa4, 0xf3, 0x1f, 0x0e, 0xf8, 0x3f, 0x5b, 0x0c, 0x93, 0xe9, 0x90, 0xf4, 0x80, 0x3f, 0x85, 0x26, + 0xdd, 0xac, 0xcb, 0x7c, 0xeb, 0x5b, 0x7c, 0xbc, 0x7e, 0x77, 0x6a, 0x75, 0x9d, 0x08, 0xb9, 0xdf, + 0xe9, 0x99, 0x4c, 0xec, 0xfd, 0x6f, 0x39, 0x72, 0xee, 0xf3, 0x79, 0x56, 0xaf, 0xc0, 0xac, 0xcf, + 0xe1, 0x99, 0x4c, 0xea, 0x03, 0x9c, 0x54, 0xd2, 0xeb, 0xef, 0xac, 0x5e, 0x80, 0x10, 0x71, 0x5e, + 0x26, 0xa3, 0x7f, 0x3b, 0x47, 0xa7, 0xe0, 0xab, 0x4f, 0x41, 0x4c, 0x38, 0x2d, 0x93, 0x51, 0xbf, + 0x83, 0xa3, 0x3a, 0x28, 0x04, 0x5d, 0x38, 0x2c, 0x93, 0xd1, 0xff, 0x1f, 0x81, 0x2e, 0x50, 0x08, + 0xfa, 0xf4, 0x2c, 0xfc, 0xd5, 0x0f, 0x85, 0xb8, 0xd1, 0x11, 0xbc, 0xbb, 0x0c, 0x51, 0xee, 0xa9, + 0x4c, 0xc6, 0xfe, 0x4e, 0xde, 0xb8, 0xc0, 0x58, 0x7d, 0x02, 0xc2, 0x53, 0x32, 0xfc, 0xc3, 0x1c, + 0x95, 0xc1, 0xaf, 0x16, 0x21, 0xe1, 0xf1, 0x4e, 0x26, 0xa3, 0x7f, 0x37, 0x47, 0xf7, 0x62, 0x91, + 0xae, 0x73, 0xef, 0x64, 0x32, 0x81, 0xff, 0x57, 0x74, 0x9d, 0x63, 0x10, 0xb6, 0x09, 0xc7, 0x64, + 0x32, 0xf6, 0x47, 0x04, 0xd7, 0x05, 0xca, 0xea, 0xd3, 0x10, 0x77, 0x8c, 0xcd, 0x64, 0xfc, 0xef, + 0xe1, 0xf8, 0x2e, 0x0e, 0xe1, 0x80, 0xc7, 0xd8, 0x4d, 0x26, 0xf1, 0xff, 0x09, 0x0e, 0x78, 0xb0, + 0xc8, 0x32, 0x1a, 0x74, 0x60, 0x26, 0x53, 0xfa, 0x5e, 0xb1, 0x8c, 0x06, 0xfc, 0x17, 0x32, 0x9b, + 0x54, 0xe7, 0x4f, 0x26, 0xf1, 0x7d, 0x62, 0x36, 0x29, 0x3c, 0xe9, 0xc6, 0xa0, 0x47, 0x30, 0x99, + 0xc6, 0x0f, 0x88, 0x6e, 0x0c, 0x38, 0x04, 0xab, 0x9b, 0x80, 0x86, 0xbd, 0x81, 0xc9, 0xf4, 0x5e, + 0xe3, 0xf4, 0xe6, 0x86, 0x9c, 0x81, 0xd5, 0xe7, 0xe0, 0xf8, 0x68, 0x4f, 0x60, 0x32, 0xd5, 0x1f, + 0x7c, 0x6b, 0x20, 0x76, 0xf3, 0x3a, 0x02, 0xab, 0x0d, 0xd7, 0xa4, 0x78, 0xbd, 0x80, 0xc9, 0x64, + 0x7f, 0xe8, 0x2d, 0xbf, 0xe2, 0xf6, 0x3a, 0x01, 0xab, 0x79, 0x00, 0xd7, 0x00, 0x4f, 0xa6, 0xf5, + 0x31, 0x4e, 0xcb, 0x83, 0x44, 0x96, 0x06, 0xb7, 0xbf, 0x93, 0xf1, 0x6f, 0x8b, 0xa5, 0xc1, 0x31, + 0xc8, 0xd2, 0x10, 0xa6, 0x77, 0x32, 0xf6, 0xc7, 0xc5, 0xd2, 0x10, 0x28, 0x44, 0xb2, 0x3d, 0xd6, + 0x6d, 0x32, 0x85, 0x4f, 0x0a, 0xc9, 0xf6, 0x60, 0xad, 0x56, 0x61, 0x6e, 0xc8, 0x20, 0x4e, 0x26, + 0xf5, 0x23, 0x9c, 0x94, 0x3c, 0x68, 0x0f, 0xbd, 0xc6, 0x8b, 0x1b, 0xc3, 0xc9, 0xd4, 0x7e, 0x74, + 0xc0, 0x78, 0x71, 0x5b, 0xb8, 0x7a, 0x19, 0x62, 0x46, 0xbf, 0xdd, 0x26, 0x8b, 0x07, 0x1d, 0x7e, + 0x79, 0x32, 0xf3, 0x87, 0x5f, 0xe1, 0xdc, 0x11, 0x08, 0xab, 0x17, 0x20, 0x8c, 0x3b, 0xdb, 0xb8, + 0x35, 0x09, 0xf3, 0x4b, 0x5f, 0x11, 0x0a, 0x93, 0x40, 0xaf, 0x3e, 0x0d, 0xc0, 0x52, 0x23, 0xf4, + 0x00, 0xf2, 0x04, 0xdc, 0x3f, 0xfa, 0x0a, 0xbf, 0xad, 0xe4, 0xa2, 0xb8, 0x04, 0xd8, 0xdd, 0xa7, + 0xc3, 0x09, 0x7c, 0xd9, 0x4f, 0x80, 0xce, 0xc8, 0x25, 0x88, 0xbe, 0x68, 0x99, 0x86, 0xad, 0xed, + 0x4e, 0xc2, 0xfe, 0x63, 0x8e, 0x2d, 0xe0, 0x09, 0xc3, 0x3a, 0x66, 0x0f, 0xdb, 0xda, 0xae, 0x35, + 0x09, 0xf7, 0xbf, 0x70, 0x5c, 0x07, 0x81, 0x20, 0x37, 0x35, 0xcb, 0x9e, 0x66, 0xdc, 0x7f, 0x22, + 0x90, 0x05, 0x02, 0xe9, 0x34, 0xf9, 0xfb, 0x26, 0x3e, 0x98, 0x84, 0xfb, 0xa7, 0xa2, 0xd3, 0x1c, + 0x7e, 0xf5, 0x29, 0x88, 0x93, 0x3f, 0xd9, 0x15, 0xc4, 0x09, 0xc8, 0x7f, 0xc6, 0x91, 0x5d, 0x0c, + 0xd2, 0xb2, 0x65, 0xb7, 0x6c, 0x7d, 0x32, 0xb3, 0xff, 0x9c, 0xcf, 0xb4, 0x80, 0x5f, 0xcd, 0x43, + 0xc2, 0xb2, 0x5b, 0xad, 0x3e, 0xf7, 0x4f, 0x27, 0xa0, 0xff, 0xc5, 0x57, 0x9c, 0x94, 0x85, 0x83, + 0x43, 0x66, 0xfb, 0xa5, 0x9b, 0x76, 0xd7, 0xa4, 0x47, 0x56, 0x26, 0x51, 0x78, 0x8b, 0x53, 0xf0, + 0xa0, 0xac, 0x16, 0x21, 0x49, 0xc6, 0x22, 0x76, 0xfe, 0x27, 0x91, 0xf8, 0x4b, 0xce, 0x00, 0x1f, + 0x52, 0xe1, 0x9b, 0x7f, 0xfd, 0x0b, 0xa7, 0xa5, 0xcf, 0x7f, 0xe1, 0xb4, 0xf4, 0x9f, 0xbf, 0x70, + 0x5a, 0xfa, 0xc8, 0x17, 0x4f, 0xcf, 0x7c, 0xfe, 0x8b, 0xa7, 0x67, 0x7e, 0xe7, 0x8b, 0xa7, 0x67, + 0x46, 0x67, 0x89, 0xe1, 0xaa, 0x79, 0xd5, 0x64, 0xf9, 0xe1, 0x17, 0xee, 0xdb, 0xd5, 0xed, 0xbd, + 0xfe, 0xf6, 0x72, 0xd3, 0xec, 0x9c, 0x6b, 0x9a, 0x56, 0xc7, 0xb4, 0xce, 0xf9, 0xf3, 0xba, 0xf4, + 0x2f, 0xf8, 0x1f, 0x12, 0x89, 0x99, 0xfd, 0xe9, 0x5c, 0xcd, 0x38, 0x18, 0xf7, 0xa4, 0xce, 0x45, + 0x08, 0xe6, 0x8d, 0x03, 0x74, 0x92, 0x29, 0x38, 0xb5, 0xdf, 0x6b, 0xf3, 0x7b, 0x70, 0x51, 0xf2, + 0xbd, 0xd5, 0x6b, 0xfb, 0xcf, 0x40, 0x27, 0xf9, 0x19, 0xe8, 0xc2, 0x77, 0x4b, 0x47, 0x1b, 0x49, + 0x2c, 0x6f, 0x1c, 0xd0, 0x81, 0x6c, 0x4a, 0x2f, 0x3c, 0x3c, 0x31, 0xcf, 0x7d, 0xd3, 0x30, 0x5f, + 0x32, 0x48, 0xb7, 0xbb, 0xdb, 0x22, 0xc7, 0x7d, 0x7a, 0x30, 0xc7, 0xfd, 0x1c, 0x6e, 0xb7, 0x9f, + 0x21, 0x70, 0x0d, 0x82, 0xb2, 0x1d, 0x61, 0x57, 0xae, 0xe1, 0x7b, 0x03, 0x70, 0x7a, 0x28, 0x9d, + 0xcd, 0x85, 0x60, 0x1c, 0x13, 0x56, 0x21, 0x56, 0x12, 0xb2, 0x95, 0x81, 0xa8, 0x85, 0x9b, 0xa6, + 0xd1, 0x62, 0x87, 0x59, 0x83, 0x8a, 0xf8, 0x24, 0x8c, 0x30, 0x34, 0xc3, 0xb4, 0xf8, 0x4d, 0x52, + 0xf6, 0x51, 0xf8, 0xe8, 0x11, 0x19, 0x31, 0x2b, 0x5a, 0x12, 0xdc, 0x38, 0x3f, 0x25, 0x37, 0xc4, + 0x20, 0x7c, 0x99, 0xff, 0x69, 0xb9, 0xf2, 0x03, 0x01, 0x58, 0x1c, 0xe4, 0x0a, 0x59, 0x59, 0x96, + 0xad, 0x75, 0xba, 0xe3, 0xd8, 0x72, 0x19, 0xe2, 0x0d, 0x01, 0x73, 0x64, 0xbe, 0xdc, 0x3e, 0x22, + 0x5f, 0x52, 0x4e, 0x53, 0x82, 0x31, 0x2b, 0x53, 0x32, 0xc6, 0x19, 0xc7, 0x1d, 0x71, 0xe6, 0xa3, + 0x71, 0x38, 0xc9, 0x96, 0x93, 0xca, 0x96, 0x12, 0xfb, 0xe0, 0x3c, 0x49, 0x7a, 0xab, 0x26, 0xef, + 0x93, 0xe4, 0x9e, 0x81, 0xf9, 0x0a, 0xd1, 0x16, 0x24, 0x0a, 0x72, 0x77, 0x78, 0x46, 0x5e, 0xb6, + 0x5d, 0xf2, 0x39, 0xfc, 0x7c, 0x27, 0xd0, 0x5b, 0x94, 0xfb, 0x56, 0x09, 0xe4, 0x7a, 0x53, 0x6b, + 0x6b, 0xbd, 0xaf, 0x95, 0x14, 0x7a, 0x02, 0x80, 0x1d, 0x95, 0x72, 0x9e, 0xc9, 0x49, 0xad, 0x64, + 0x96, 0xbd, 0x83, 0x5b, 0x66, 0x2d, 0xd1, 0x8b, 0x28, 0x71, 0x0a, 0x4b, 0xfe, 0x3c, 0xfb, 0x3c, + 0x80, 0x5b, 0x81, 0x4e, 0xc1, 0x89, 0x7a, 0x31, 0xbf, 0x9e, 0x57, 0xc4, 0x99, 0x97, 0xfa, 0x66, + 0xb9, 0xc8, 0x5e, 0xad, 0x98, 0x41, 0xc7, 0x01, 0x79, 0x2b, 0x9d, 0xc3, 0xfb, 0xc7, 0x60, 0xce, + 0x5b, 0xce, 0x9e, 0x10, 0x08, 0xac, 0xae, 0x41, 0x9a, 0xdd, 0x6f, 0x56, 0xb5, 0x56, 0x0b, 0xb7, + 0x54, 0xdd, 0x40, 0x13, 0xae, 0x0b, 0x67, 0x7e, 0xe3, 0xdf, 0x85, 0xe9, 0xd0, 0x66, 0x19, 0x62, + 0x9e, 0xe0, 0x55, 0x0c, 0xe2, 0x73, 0xea, 0x9d, 0x6e, 0x1b, 0xd3, 0x4d, 0x66, 0x55, 0x17, 0xfc, + 0x9f, 0xec, 0xce, 0x10, 0x7a, 0xc1, 0x33, 0x71, 0x65, 0xde, 0x45, 0x77, 0x66, 0x6f, 0xf5, 0x19, + 0xf7, 0x30, 0x95, 0xd3, 0xc1, 0x89, 0x14, 0x3f, 0xc7, 0x7b, 0x28, 0xb2, 0x19, 0xa2, 0x8b, 0xeb, + 0x30, 0xa7, 0x35, 0x9b, 0xb8, 0xeb, 0xeb, 0xdf, 0x04, 0x0b, 0x22, 0x46, 0x2b, 0x73, 0x4c, 0xb7, + 0x6b, 0x4f, 0x40, 0xc4, 0xa2, 0x93, 0x32, 0x89, 0x84, 0xe8, 0x0e, 0x07, 0x5f, 0x2d, 0x8b, 0xc3, + 0x83, 0xce, 0x88, 0x26, 0x10, 0xf8, 0x97, 0x9c, 0x40, 0x92, 0xa2, 0x89, 0xd1, 0x18, 0x30, 0xc7, + 0xde, 0x88, 0xc1, 0x9e, 0xd1, 0x1c, 0x9e, 0x45, 0xf9, 0x47, 0x9f, 0x79, 0x94, 0xee, 0xb0, 0xdf, + 0xe3, 0x17, 0xba, 0x11, 0x8b, 0x45, 0x91, 0x39, 0x6d, 0x77, 0xbc, 0x18, 0x52, 0xa2, 0x3d, 0x3e, + 0xee, 0xc3, 0x1b, 0xfb, 0x65, 0xde, 0xd8, 0xe9, 0x51, 0x12, 0xee, 0x69, 0x69, 0x96, 0x53, 0x65, + 0x15, 0xab, 0x05, 0x98, 0xa5, 0x2f, 0xbc, 0x39, 0xcc, 0x39, 0xbc, 0x95, 0x5f, 0xf9, 0xcc, 0xa3, + 0x6c, 0xa1, 0x11, 0x24, 0xce, 0x9a, 0x42, 0x79, 0x9c, 0xd6, 0x7b, 0xe1, 0xa1, 0x61, 0xfb, 0xcd, + 0xfe, 0x7b, 0x84, 0x52, 0xbf, 0xec, 0xed, 0xaa, 0xab, 0x9d, 0x42, 0x30, 0xa7, 0x75, 0x74, 0xc3, + 0x3c, 0x47, 0xff, 0xe5, 0x5a, 0x29, 0x4c, 0x3f, 0xa6, 0xd8, 0xb6, 0xbd, 0xc8, 0x94, 0xc5, 0x64, + 0xb9, 0xfd, 0xb3, 0xef, 0xfa, 0xf1, 0xb0, 0xab, 0x50, 0x56, 0x37, 0x86, 0x0f, 0x12, 0x4e, 0xa6, + 0xf1, 0xe7, 0x82, 0xc6, 0xe0, 0xb9, 0xc0, 0xd5, 0x77, 0x43, 0xcc, 0x21, 0x33, 0xc9, 0x77, 0x13, + 0x44, 0x1c, 0x0c, 0xe2, 0xb9, 0x31, 0xa1, 0x9d, 0xc6, 0x4f, 0x7f, 0x4b, 0xe0, 0x33, 0x1d, 0x56, + 0x25, 0xa3, 0xb9, 0x0a, 0xa9, 0x96, 0x69, 0xd8, 0xaa, 0xd9, 0xd1, 0x6d, 0xdc, 0xe9, 0xda, 0x13, + 0x3d, 0xdf, 0xbf, 0x64, 0x44, 0x62, 0xca, 0x2c, 0xc1, 0xab, 0x09, 0x34, 0xd2, 0x13, 0xf6, 0xcc, + 0xcc, 0x34, 0x3d, 0xf9, 0xaf, 0x4e, 0x4f, 0x28, 0x0e, 0xe9, 0xc9, 0x1d, 0x49, 0x87, 0xd5, 0xba, + 0xc9, 0xcd, 0x9d, 0xbd, 0xcf, 0xa4, 0xc0, 0x91, 0x8e, 0x7f, 0x12, 0x82, 0xd3, 0x1c, 0x78, 0x5b, + 0xb3, 0xf0, 0xb9, 0x5b, 0xe7, 0xb7, 0xb1, 0xad, 0x9d, 0x3f, 0xd7, 0x34, 0x75, 0xe1, 0xeb, 0xcc, + 0x73, 0x73, 0x46, 0xea, 0x97, 0x79, 0x7d, 0x76, 0xe4, 0x81, 0x80, 0xec, 0x78, 0x33, 0x98, 0x1d, + 0x96, 0xc1, 0x5c, 0x1b, 0x42, 0x45, 0x53, 0xa7, 0x57, 0xe4, 0x5a, 0xd8, 0x30, 0x3b, 0xdc, 0x20, + 0xb1, 0x0f, 0xb4, 0x06, 0x11, 0xad, 0x63, 0xf6, 0x0d, 0x9b, 0x19, 0xa3, 0xc2, 0xa3, 0xbf, 0xfe, + 0xfa, 0xe2, 0xcc, 0x7f, 0x7c, 0x7d, 0xf1, 0x18, 0x23, 0x6b, 0xb5, 0x6e, 0x2e, 0xeb, 0xe6, 0xb9, + 0x8e, 0x66, 0xef, 0x11, 0x15, 0xf0, 0xdb, 0x9f, 0x7d, 0x04, 0x78, 0x7b, 0x15, 0xc3, 0xfe, 0xd4, 0x1b, 0x3f, 0x7b, 0x56, 0x52, 0x38, 0xfe, 0x6a, 0xe8, 0xcd, 0x4f, 0x2c, 0x4a, 0xb9, 0x2e, 0x44, - 0x4b, 0xb8, 0x79, 0x48, 0x85, 0x95, 0x81, 0x0a, 0xcf, 0xf3, 0x0a, 0x4f, 0x0d, 0x57, 0xc8, 0x2e, - 0x96, 0x94, 0x70, 0xd3, 0x53, 0x6d, 0x09, 0x37, 0x07, 0x6a, 0xac, 0x40, 0xac, 0x62, 0xd8, 0xec, - 0x25, 0x88, 0xa7, 0x20, 0xa8, 0x1b, 0xec, 0x02, 0x71, 0xbc, 0xf0, 0xd0, 0x11, 0xba, 0xa2, 0x10, + 0x4b, 0xb8, 0x79, 0x48, 0x83, 0x95, 0x81, 0x06, 0xcf, 0xf3, 0x06, 0x4f, 0x0d, 0x37, 0xc8, 0xae, + 0xde, 0x94, 0x70, 0xd3, 0xd3, 0x6c, 0x09, 0x37, 0x07, 0x5a, 0xac, 0x40, 0xac, 0x62, 0xd8, 0xec, + 0xad, 0x8c, 0xa7, 0x20, 0xa8, 0x1b, 0xec, 0x8a, 0x75, 0xbc, 0xf0, 0xd0, 0x11, 0x86, 0xa2, 0x10, 0xbc, 0x5c, 0x0d, 0x62, 0x25, 0xdc, 0x64, 0xa4, 0x8a, 0x10, 0x6c, 0xe1, 0x26, 0x27, 0x75, 0x07, - 0x8d, 0x24, 0xd8, 0x85, 0xd2, 0xef, 0xfc, 0xde, 0xe9, 0x99, 0x57, 0x3e, 0x7f, 0x7a, 0x66, 0xac, - 0x38, 0xe5, 0x26, 0x8b, 0x93, 0x23, 0x45, 0x3f, 0x1e, 0x82, 0xbb, 0xe9, 0x53, 0x42, 0xbd, 0x8e, + 0x9d, 0x24, 0xd8, 0x85, 0xd2, 0xef, 0xfc, 0xde, 0xe9, 0x99, 0x57, 0xbe, 0x70, 0x7a, 0x66, 0xac, + 0x38, 0xe5, 0x26, 0x8b, 0x93, 0x23, 0x45, 0x3f, 0x1e, 0x82, 0xbb, 0xe9, 0x63, 0x4b, 0xbd, 0x8e, 0x6e, 0xd8, 0xe7, 0x9a, 0xbd, 0x83, 0xae, 0x6d, 0x12, 0xa5, 0x62, 0xee, 0x70, 0x21, 0x9a, 0x73, - 0x8b, 0x97, 0x59, 0xf1, 0x68, 0x11, 0xca, 0xed, 0x40, 0x78, 0x93, 0xe0, 0x91, 0x41, 0xb2, 0x4d, - 0x5b, 0x6b, 0x73, 0x4b, 0x88, 0x25, 0x48, 0x2e, 0x7b, 0x7e, 0x28, 0xc0, 0x72, 0x75, 0xf1, 0xf2, - 0x50, 0x1b, 0x6b, 0x3b, 0xec, 0x15, 0x87, 0x20, 0x35, 0xa1, 0x63, 0x24, 0x83, 0x3e, 0xd8, 0xb0, - 0x00, 0x61, 0xad, 0xcf, 0x4e, 0x5b, 0x05, 0x89, 0x6d, 0x4d, 0x13, 0xb9, 0x67, 0x20, 0xca, 0xf7, - 0xf4, 0x91, 0x0c, 0xc1, 0x9b, 0xf8, 0x80, 0xd6, 0x93, 0x54, 0xc8, 0x4f, 0xb4, 0x0c, 0x61, 0xda, - 0x78, 0x7e, 0x79, 0x26, 0xb3, 0x3c, 0xd4, 0xfa, 0x65, 0xda, 0x48, 0x85, 0x81, 0xe5, 0xae, 0x41, - 0xac, 0x64, 0x12, 0xc9, 0xf6, 0x53, 0x8b, 0x33, 0x6a, 0xb4, 0xcd, 0xdd, 0xbe, 0x2d, 0x2e, 0x38, - 0xd2, 0x04, 0x3a, 0x0e, 0x11, 0xf6, 0xaa, 0x07, 0x3f, 0x31, 0xc6, 0x53, 0xb9, 0x22, 0x44, 0x29, - 0xed, 0x5a, 0xd7, 0x79, 0x2a, 0x4b, 0xf2, 0x3c, 0x95, 0xc5, 0xc9, 0x07, 0xdc, 0xc6, 0x22, 0x08, - 0xb5, 0x34, 0x5b, 0xe3, 0xfd, 0xa6, 0xbf, 0x73, 0xef, 0x81, 0x18, 0x27, 0x62, 0xa1, 0x15, 0x08, - 0x9a, 0x5d, 0x71, 0x20, 0x32, 0x3b, 0xae, 0x2b, 0xb5, 0x6e, 0x21, 0x44, 0x64, 0x49, 0x21, 0xc0, - 0x85, 0xea, 0x58, 0xb1, 0x78, 0xdc, 0x27, 0x16, 0x1d, 0x6c, 0x6f, 0xef, 0xd8, 0xee, 0x0f, 0x36, - 0x9c, 0x43, 0xa2, 0xe0, 0x08, 0xca, 0xed, 0x00, 0x9c, 0xf6, 0x94, 0xde, 0xc2, 0x3d, 0x4b, 0x37, - 0x0d, 0x26, 0x4d, 0x5c, 0x52, 0x90, 0xa7, 0x81, 0xbc, 0x7c, 0x8c, 0xa8, 0x3c, 0x05, 0xc1, 0x7c, - 0xb7, 0x8b, 0xb2, 0x10, 0xa3, 0xe9, 0xa6, 0xc9, 0x64, 0x25, 0xa4, 0x38, 0x69, 0x52, 0x66, 0x99, - 0x3b, 0xf6, 0x4b, 0x5a, 0xcf, 0x79, 0xf4, 0x4a, 0xa4, 0x73, 0x97, 0x20, 0x5e, 0x34, 0x0d, 0x0b, - 0x1b, 0x56, 0x9f, 0xda, 0xd7, 0xdb, 0x6d, 0xb3, 0x79, 0x93, 0x53, 0x60, 0x09, 0xc2, 0x6c, 0xad, - 0xdb, 0xa5, 0x98, 0x21, 0x85, 0xfc, 0x64, 0x33, 0xbb, 0x50, 0x1b, 0xcb, 0x9e, 0x0b, 0x47, 0x63, - 0x0f, 0xef, 0xa0, 0x6b, 0x28, 0x4b, 0x70, 0xd7, 0xf0, 0x44, 0xba, 0x89, 0x0f, 0xac, 0xa3, 0xce, - 0xa3, 0xe7, 0x21, 0xbe, 0x49, 0x9f, 0x1e, 0x7d, 0x06, 0x1f, 0xa0, 0x2c, 0x44, 0x71, 0x6b, 0xe5, - 0xc2, 0x85, 0xf3, 0x97, 0x98, 0x94, 0x5f, 0x9d, 0x51, 0x44, 0x06, 0x3a, 0x0d, 0x71, 0x0b, 0x37, - 0xbb, 0x2b, 0x17, 0x2e, 0xde, 0x3c, 0xcf, 0xc4, 0xea, 0xea, 0x8c, 0xe2, 0x66, 0xad, 0xc6, 0x48, - 0x8f, 0xdf, 0xfc, 0xe4, 0xa2, 0x54, 0x08, 0x43, 0xd0, 0xea, 0x77, 0xbe, 0x66, 0xb2, 0xf1, 0xa7, - 0x11, 0x58, 0xf2, 0x94, 0xb2, 0x05, 0x8b, 0x9f, 0xf2, 0x77, 0x9e, 0xab, 0x95, 0x3d, 0xfd, 0xa7, - 0x10, 0x63, 0x56, 0xa2, 0x43, 0xb9, 0x98, 0xfb, 0xb4, 0x04, 0xc9, 0xeb, 0x82, 0x72, 0x1d, 0xdb, - 0xe8, 0x32, 0x80, 0x53, 0x93, 0x98, 0x2a, 0xa7, 0x96, 0x07, 0xeb, 0x5a, 0x76, 0x70, 0x14, 0x0f, - 0x38, 0x7a, 0x82, 0x0a, 0x60, 0xd7, 0xb4, 0xf8, 0x03, 0x48, 0x13, 0x50, 0x1d, 0x60, 0xf4, 0x30, - 0x20, 0xaa, 0xd5, 0xd4, 0x5b, 0xa6, 0xad, 0x1b, 0xbb, 0x6a, 0xd7, 0x7c, 0x89, 0x3f, 0x2b, 0x17, - 0x54, 0x64, 0x5a, 0x72, 0x9d, 0x16, 0x6c, 0x92, 0x7c, 0xd2, 0xe8, 0xb8, 0x43, 0x85, 0xb8, 0x8a, - 0x5a, 0xab, 0xd5, 0xc3, 0x96, 0xc5, 0x15, 0x97, 0x48, 0xa2, 0xcb, 0x10, 0xed, 0xf6, 0xb7, 0x55, - 0xa1, 0x25, 0x12, 0x2b, 0x77, 0x8d, 0x9a, 0xf3, 0x42, 0x36, 0xf8, 0xac, 0x8f, 0x74, 0xfb, 0xdb, - 0x44, 0x52, 0xee, 0x81, 0xe4, 0x88, 0xc6, 0x24, 0x6e, 0xb9, 0xed, 0xa0, 0xaf, 0xdd, 0xf2, 0x1e, - 0xa8, 0xdd, 0x9e, 0x6e, 0xf6, 0x74, 0xfb, 0x80, 0x1e, 0x9a, 0x0c, 0x2a, 0xb2, 0x28, 0xd8, 0xe4, - 0xf9, 0xb9, 0x9b, 0x90, 0xae, 0x53, 0x17, 0xc2, 0x6d, 0xf9, 0x05, 0xb7, 0x7d, 0xd2, 0xe4, 0xf6, - 0x8d, 0x6d, 0x59, 0x60, 0xa8, 0x65, 0x67, 0xff, 0xa3, 0x04, 0x89, 0x02, 0x99, 0xb8, 0x95, 0xd2, - 0x95, 0xb6, 0xb6, 0x8b, 0xce, 0xc3, 0xb1, 0xc2, 0x7a, 0xad, 0xf8, 0x8c, 0x5a, 0x29, 0xa9, 0x57, - 0xd6, 0xf3, 0x9e, 0x53, 0xf5, 0xd9, 0xe3, 0xaf, 0xde, 0x5e, 0x42, 0x1e, 0xd8, 0x2d, 0x83, 0xfa, - 0xb9, 0xe8, 0x1c, 0x2c, 0xf8, 0x51, 0xf2, 0x85, 0x7a, 0xb9, 0xda, 0x90, 0xa5, 0xec, 0xb1, 0x57, - 0x6f, 0x2f, 0xcd, 0x79, 0x30, 0xf2, 0xdb, 0x16, 0x36, 0xec, 0x61, 0x84, 0x62, 0x6d, 0x63, 0xa3, - 0xd2, 0x90, 0x03, 0x43, 0x08, 0x45, 0xb3, 0xd3, 0xd1, 0x6d, 0xf4, 0x20, 0xcc, 0xf9, 0x11, 0xaa, - 0x95, 0x75, 0x39, 0x98, 0x45, 0xaf, 0xde, 0x5e, 0x4a, 0x79, 0xa0, 0xab, 0x7a, 0x3b, 0x1b, 0xfb, - 0xe0, 0x8f, 0x9e, 0x9e, 0xf9, 0xd4, 0xdf, 0x3d, 0x2d, 0x15, 0x36, 0xc6, 0xce, 0xb9, 0xc7, 0x8e, - 0x36, 0xe7, 0xfc, 0xeb, 0xf6, 0x97, 0xef, 0xf2, 0xa9, 0x1b, 0x6e, 0x23, 0x7a, 0x94, 0xf1, 0xb4, - 0xd3, 0x6d, 0x52, 0xdc, 0x23, 0x7b, 0xb8, 0x79, 0x90, 0x9d, 0xb0, 0x28, 0x64, 0x27, 0x2a, 0x86, - 0xdc, 0x25, 0x98, 0xdd, 0xd4, 0x7a, 0x76, 0x1d, 0xdb, 0x57, 0xb1, 0xd6, 0xc2, 0x3d, 0xbf, 0xfd, - 0x30, 0x2b, 0xec, 0x07, 0x04, 0x21, 0x6a, 0x24, 0xb0, 0xf5, 0x93, 0xfe, 0xce, 0xed, 0x41, 0x88, - 0x5e, 0x14, 0x73, 0x6c, 0x0b, 0x8e, 0xc1, 0x6c, 0x0b, 0xb2, 0x32, 0x1c, 0xd8, 0xfc, 0x22, 0x6d, - 0x52, 0x61, 0x09, 0xf4, 0xb8, 0xb0, 0x10, 0x82, 0x87, 0x5b, 0x08, 0x7c, 0x7a, 0x71, 0x3b, 0xa1, - 0x0d, 0x51, 0x3e, 0xc4, 0x4e, 0x43, 0x24, 0xb7, 0x21, 0x68, 0x03, 0xd2, 0x5d, 0xad, 0x67, 0xd3, - 0x67, 0x67, 0xf6, 0x68, 0x2f, 0xf8, 0x0c, 0x5e, 0x1c, 0xd6, 0x27, 0xbe, 0xce, 0xf2, 0x5a, 0x66, - 0xbb, 0xde, 0xcc, 0xdc, 0x1f, 0x84, 0x20, 0xc2, 0x99, 0xf1, 0x14, 0x44, 0x39, 0x5b, 0xf9, 0x9c, - 0xbb, 0x7b, 0x79, 0x78, 0x99, 0x5d, 0x76, 0x96, 0x43, 0x4e, 0x4f, 0xe0, 0xa0, 0xfb, 0x21, 0xd6, - 0xdc, 0xd3, 0x74, 0x43, 0xd5, 0x5b, 0xdc, 0x38, 0x4e, 0x7c, 0xfe, 0xf5, 0xc5, 0x68, 0x91, 0xe4, - 0x55, 0x4a, 0x4a, 0x94, 0x16, 0x56, 0x5a, 0xc4, 0xa6, 0xd9, 0xc3, 0xfa, 0xee, 0x9e, 0xcd, 0xf5, - 0x06, 0x4f, 0xa1, 0x27, 0x21, 0x44, 0x04, 0x82, 0xdf, 0x2b, 0xc8, 0x0e, 0x79, 0x3d, 0x4e, 0x58, - 0xaa, 0x10, 0x23, 0x15, 0x7f, 0xe4, 0xbf, 0x2c, 0x4a, 0x0a, 0xc5, 0x40, 0x45, 0x98, 0x6d, 0x6b, - 0x96, 0xad, 0xd2, 0xf5, 0x98, 0x54, 0xcf, 0x2e, 0x14, 0x9c, 0x1c, 0x66, 0x08, 0x67, 0x2c, 0x6f, - 0x7a, 0x82, 0x60, 0xb1, 0xac, 0x16, 0x3a, 0x03, 0x32, 0x25, 0xd2, 0xa4, 0x33, 0x90, 0x59, 0x89, - 0x11, 0xca, 0xf7, 0x14, 0xc9, 0x67, 0x13, 0x93, 0xda, 0x8a, 0xa7, 0x20, 0x4e, 0xdf, 0x56, 0xa2, - 0x20, 0xec, 0x76, 0x62, 0x8c, 0x64, 0xd0, 0xc2, 0x07, 0x20, 0xed, 0x6a, 0x7d, 0x06, 0x12, 0x63, - 0x54, 0xdc, 0x6c, 0x0a, 0xf8, 0x28, 0x2c, 0x18, 0x78, 0xdf, 0x56, 0x07, 0xa1, 0xe3, 0x14, 0x1a, - 0x91, 0xb2, 0xeb, 0x7e, 0x8c, 0xfb, 0x20, 0xd5, 0x14, 0xcc, 0x67, 0xb0, 0x40, 0x61, 0x67, 0x9d, - 0x5c, 0x0a, 0x76, 0x12, 0x62, 0x5a, 0xb7, 0xcb, 0x00, 0x12, 0x5c, 0xeb, 0x77, 0xbb, 0xb4, 0xe8, - 0x2c, 0xcc, 0xd1, 0x3e, 0xf6, 0xb0, 0xd5, 0x6f, 0xdb, 0x9c, 0x48, 0x92, 0xc2, 0xa4, 0x49, 0x81, - 0xc2, 0xf2, 0x29, 0xec, 0xbd, 0x30, 0x8b, 0x6f, 0xe9, 0x2d, 0x6c, 0x34, 0x31, 0x83, 0x9b, 0xa5, - 0x70, 0x49, 0x91, 0x49, 0x81, 0x1e, 0x04, 0x47, 0x9b, 0xab, 0x62, 0xa5, 0x49, 0x31, 0x7a, 0x22, - 0x3f, 0xcf, 0xb2, 0x73, 0x19, 0x08, 0x95, 0x34, 0x5b, 0x23, 0xe6, 0x92, 0xbd, 0xcf, 0x96, 0xcf, - 0xa4, 0x42, 0x7e, 0xe6, 0x7e, 0x31, 0x08, 0xa1, 0xeb, 0xa6, 0x8d, 0xd1, 0x63, 0x1e, 0x53, 0x36, - 0x35, 0x4a, 0x9e, 0xeb, 0xfa, 0xae, 0x81, 0x5b, 0x1b, 0xd6, 0xae, 0xe7, 0x3d, 0x53, 0x57, 0x9c, - 0x02, 0x3e, 0x71, 0x5a, 0x80, 0x70, 0xcf, 0xec, 0x1b, 0x2d, 0x71, 0x7c, 0x9f, 0x26, 0x50, 0x19, - 0x62, 0x8e, 0x94, 0x84, 0x26, 0x49, 0x49, 0x9a, 0x48, 0x09, 0x91, 0x61, 0x9e, 0xa1, 0x44, 0xb7, - 0xb9, 0xb0, 0x14, 0x20, 0xee, 0x28, 0x2f, 0x2e, 0x6d, 0xd3, 0x09, 0xac, 0x8b, 0x46, 0x96, 0x48, - 0x67, 0xec, 0x1d, 0xe6, 0x31, 0x89, 0x93, 0x9d, 0x02, 0xce, 0x3d, 0x9f, 0x58, 0xf1, 0xb7, 0x55, - 0xa3, 0xb4, 0x5f, 0xae, 0x58, 0xb1, 0xf7, 0x55, 0xef, 0x82, 0xb8, 0xa5, 0xef, 0x1a, 0xf4, 0x46, - 0x0c, 0x97, 0x3c, 0x37, 0x83, 0x94, 0xba, 0x77, 0x5c, 0x99, 0xa4, 0x79, 0xde, 0xf0, 0x3e, 0x07, - 0xf3, 0xee, 0xeb, 0xd9, 0x2e, 0x15, 0x26, 0x65, 0xc8, 0x29, 0xaa, 0x8b, 0x92, 0xdc, 0xaf, 0x4a, - 0x10, 0xe1, 0x2b, 0x96, 0x3b, 0x0c, 0xd2, 0xe8, 0x61, 0x08, 0x8c, 0x1b, 0x86, 0xe0, 0x9d, 0x0f, - 0x43, 0x1e, 0xc0, 0x69, 0xa6, 0xc5, 0x5f, 0xd0, 0x1c, 0x61, 0x56, 0xb1, 0x26, 0xd6, 0xf5, 0x5d, - 0x3e, 0xef, 0x3d, 0x48, 0xb9, 0xdf, 0x95, 0x88, 0x85, 0xcf, 0xcb, 0x51, 0x1e, 0x66, 0x45, 0xbb, - 0xd4, 0x9d, 0xb6, 0xb6, 0xcb, 0x45, 0xf1, 0xee, 0xb1, 0x8d, 0x23, 0xab, 0xb0, 0x92, 0xe0, 0xed, - 0xa1, 0xf6, 0xc4, 0xc8, 0x61, 0x0d, 0x8c, 0x19, 0x56, 0x9f, 0x1c, 0x05, 0xef, 0x4c, 0x8e, 0x7c, - 0x23, 0x1e, 0x1a, 0x18, 0xf1, 0xdc, 0xef, 0x49, 0xfc, 0xed, 0xee, 0x16, 0xbb, 0xfe, 0xf3, 0x7f, - 0x6a, 0xa8, 0x5e, 0xe0, 0xb2, 0xd5, 0xc2, 0x2d, 0x75, 0x68, 0xcc, 0xee, 0x1d, 0xa6, 0xe8, 0x6f, - 0xb3, 0x3b, 0x76, 0x48, 0x50, 0xa9, 0xbb, 0x63, 0xf8, 0x99, 0x00, 0xcc, 0x0d, 0xc1, 0xff, 0xf5, - 0x1b, 0x4b, 0xff, 0xec, 0x0d, 0x4f, 0x39, 0x7b, 0x23, 0x63, 0x67, 0xef, 0xcf, 0x07, 0x68, 0x00, - 0xa0, 0x6b, 0x5a, 0x5a, 0xfb, 0xeb, 0xa1, 0x7b, 0x4f, 0x41, 0xbc, 0x6b, 0xb6, 0x55, 0x56, 0xc2, - 0x2e, 0x50, 0xc5, 0xba, 0x66, 0x5b, 0x19, 0x12, 0xb3, 0xf0, 0xdb, 0xa4, 0x98, 0x23, 0x6f, 0xc3, - 0x20, 0x44, 0x07, 0x27, 0x54, 0x0f, 0x92, 0x8c, 0x15, 0xdc, 0x6a, 0x7a, 0x94, 0xf0, 0x80, 0x9a, - 0x61, 0xd2, 0xb0, 0x95, 0xc7, 0x9a, 0xcd, 0x20, 0x15, 0x0e, 0x47, 0x30, 0x98, 0x91, 0x31, 0x2a, - 0x72, 0xe4, 0xd5, 0x58, 0x0a, 0x87, 0xcb, 0x7d, 0xbf, 0x04, 0xb0, 0x4e, 0x38, 0x4b, 0xfb, 0x4b, - 0xec, 0x1d, 0x8b, 0x36, 0x41, 0xf5, 0xd5, 0x7c, 0x7a, 0xdc, 0xa0, 0xf1, 0xfa, 0x93, 0x96, 0xb7, - 0xdd, 0x45, 0x98, 0x75, 0x65, 0xdb, 0xc2, 0xa2, 0x31, 0xa7, 0x0f, 0xf1, 0x4a, 0xeb, 0xd8, 0x56, - 0x92, 0xb7, 0x3c, 0xa9, 0xdc, 0x3f, 0x93, 0x20, 0x4e, 0xdb, 0xb4, 0x81, 0x6d, 0xcd, 0x37, 0x86, - 0xd2, 0x9d, 0x8f, 0xe1, 0xdd, 0x00, 0x8c, 0x8c, 0xa5, 0xbf, 0x8c, 0xb9, 0x64, 0xc5, 0x69, 0x4e, - 0x5d, 0x7f, 0x19, 0xa3, 0x8b, 0x0e, 0xc3, 0x83, 0x87, 0x33, 0x5c, 0x78, 0xad, 0x9c, 0xed, 0x27, - 0x20, 0x4a, 0xdf, 0x46, 0xd8, 0xb7, 0xb8, 0x23, 0x1a, 0x31, 0xfa, 0x9d, 0xc6, 0xbe, 0x95, 0x7b, - 0x11, 0xa2, 0x8d, 0x7d, 0x16, 0x4f, 0x3c, 0x05, 0xf1, 0x9e, 0x69, 0x72, 0xeb, 0x8f, 0x59, 0xdd, - 0x31, 0x92, 0x41, 0x8d, 0x1d, 0x11, 0x43, 0x0b, 0xb8, 0x31, 0x34, 0x37, 0x08, 0x18, 0x9c, 0x2a, - 0x08, 0x48, 0xbc, 0xcf, 0x59, 0xdf, 0x4c, 0x42, 0x0f, 0xc3, 0x89, 0x7a, 0x65, 0xad, 0x5a, 0x2e, - 0xa9, 0x1b, 0xf5, 0xb5, 0x81, 0x1b, 0xec, 0xd9, 0xf4, 0xab, 0xb7, 0x97, 0x12, 0xdc, 0xed, 0x1c, - 0x07, 0xbd, 0xa9, 0x94, 0xaf, 0xd7, 0x1a, 0x65, 0x59, 0x62, 0xd0, 0x9b, 0x3d, 0x7c, 0xcb, 0xb4, - 0xd9, 0x87, 0x5d, 0x1e, 0x85, 0x93, 0x23, 0xa0, 0x1d, 0xe7, 0x73, 0xee, 0xd5, 0xdb, 0x4b, 0xb3, - 0x9b, 0x3d, 0xcc, 0xa4, 0x8c, 0x62, 0x2c, 0x43, 0x66, 0x18, 0xa3, 0xb6, 0x59, 0xab, 0xe7, 0xd7, - 0xe5, 0xa5, 0xac, 0xfc, 0xea, 0xed, 0xa5, 0xa4, 0x50, 0x19, 0x04, 0xfe, 0x6b, 0xef, 0x7d, 0x7e, - 0x67, 0xcc, 0x17, 0x35, 0x66, 0x7e, 0x5d, 0x57, 0xeb, 0x69, 0x9d, 0xa3, 0xba, 0x9f, 0x13, 0x0e, - 0x23, 0xe4, 0x3e, 0x1d, 0x80, 0xb4, 0xe3, 0xdc, 0x6c, 0xd2, 0x1a, 0xd0, 0x63, 0xde, 0x88, 0x5f, - 0x62, 0xec, 0xda, 0xc1, 0xa0, 0x45, 0x40, 0xf0, 0xdd, 0x10, 0x13, 0x46, 0x32, 0x9f, 0x54, 0x4b, - 0x23, 0xd6, 0x37, 0x0e, 0xc1, 0x51, 0x1d, 0x0c, 0xf4, 0x34, 0xc4, 0x9d, 0x29, 0xe6, 0xbc, 0x88, - 0x3d, 0x7e, 0x4e, 0x72, 0x7c, 0x17, 0x07, 0x5d, 0x72, 0xdd, 0xb8, 0xd0, 0x38, 0xc7, 0xf0, 0x3a, - 0x03, 0xe0, 0xc8, 0x8e, 0x0b, 0xf7, 0x28, 0x84, 0xb4, 0xed, 0xa6, 0xce, 0x15, 0xf0, 0x5d, 0xc3, - 0x78, 0xf9, 0x42, 0xb1, 0xc2, 0x91, 0x28, 0x64, 0xae, 0xc2, 0x83, 0x29, 0x9c, 0x5f, 0xf4, 0x8d, - 0xd1, 0x7d, 0x95, 0xf9, 0xc2, 0xcc, 0xba, 0x88, 0x75, 0xb4, 0xfd, 0x02, 0x75, 0x87, 0x4f, 0x40, - 0x94, 0x14, 0xee, 0xf2, 0xc7, 0xbe, 0x82, 0x4a, 0xa4, 0xa3, 0xed, 0xaf, 0x69, 0xd6, 0xb5, 0x50, - 0x2c, 0x28, 0x87, 0x72, 0x3f, 0x49, 0x2c, 0x15, 0x1f, 0x57, 0xd0, 0x43, 0x80, 0x08, 0x86, 0xb6, - 0x8b, 0x55, 0x32, 0x75, 0x29, 0x7b, 0x05, 0xdd, 0x74, 0x47, 0xdb, 0xcf, 0xef, 0xe2, 0x6a, 0xbf, - 0x43, 0x1b, 0x60, 0xa1, 0x0d, 0x90, 0x05, 0xb0, 0x18, 0x59, 0xce, 0xfe, 0x93, 0xc3, 0x9f, 0x48, - 0xe1, 0x00, 0x6c, 0x01, 0x78, 0x8d, 0x2c, 0x00, 0x29, 0x46, 0xcf, 0x39, 0x7e, 0xe2, 0xeb, 0x4a, - 0xd0, 0xdf, 0x95, 0xdc, 0xd3, 0x90, 0x1e, 0x18, 0x01, 0x94, 0x83, 0x59, 0x1e, 0xb1, 0xa2, 0x5b, - 0xfb, 0xcc, 0xc3, 0x89, 0x2b, 0x09, 0x16, 0x99, 0xa2, 0x47, 0x1d, 0x56, 0x63, 0xbf, 0xf4, 0x89, - 0x45, 0x89, 0x6e, 0xfb, 0x3c, 0x04, 0xb3, 0xbe, 0x31, 0x10, 0x51, 0x64, 0xc9, 0x8d, 0x22, 0xbb, - 0xc0, 0x2f, 0x40, 0x92, 0x28, 0x20, 0xdc, 0xe2, 0xb0, 0xf7, 0x43, 0x9a, 0x29, 0xc8, 0x41, 0x5e, - 0x33, 0x83, 0x67, 0x43, 0x30, 0x3c, 0x27, 0x2c, 0x20, 0x3f, 0xdb, 0x13, 0x02, 0x6a, 0x4d, 0xb3, - 0x72, 0x35, 0x00, 0x77, 0x50, 0x51, 0x1e, 0xee, 0x26, 0xca, 0xc3, 0x7b, 0x14, 0x95, 0x3f, 0xa2, - 0xec, 0xb3, 0x18, 0xb3, 0x04, 0xc8, 0x3d, 0x6e, 0xca, 0x9e, 0x52, 0xbe, 0x4a, 0x21, 0x0a, 0xcf, - 0x7e, 0xea, 0xf3, 0xa7, 0xa5, 0xaf, 0x8d, 0x2e, 0xf8, 0x4f, 0x37, 0xe0, 0x94, 0xa7, 0x90, 0x08, - 0xa0, 0x2f, 0x10, 0x95, 0xf6, 0xc8, 0x2b, 0x29, 0x9c, 0x14, 0x50, 0x3a, 0x34, 0xfe, 0x9b, 0x3d, - 0x5c, 0xed, 0x4c, 0x8e, 0x36, 0x4d, 0x8e, 0x77, 0x8d, 0x0e, 0xca, 0xff, 0xd3, 0x38, 0x44, 0x15, - 0xfc, 0xbe, 0x3e, 0xb6, 0x6c, 0xb4, 0x02, 0x21, 0xdc, 0xdc, 0x33, 0x47, 0xc5, 0x40, 0x49, 0x07, - 0x97, 0x39, 0x5c, 0xb9, 0xb9, 0x67, 0x5e, 0x9d, 0x51, 0x28, 0x2c, 0xba, 0x00, 0xe1, 0x9d, 0x76, - 0x9f, 0x87, 0xaf, 0x06, 0x74, 0x96, 0x17, 0xe9, 0x0a, 0x01, 0xba, 0x3a, 0xa3, 0x30, 0x68, 0x52, - 0x15, 0xfd, 0xea, 0x55, 0xf0, 0xf0, 0xaa, 0x2a, 0xc6, 0x0e, 0xad, 0x8a, 0xc0, 0xa2, 0x02, 0x80, - 0x6e, 0xe8, 0xb6, 0x4a, 0x43, 0x3b, 0x5c, 0x6b, 0xdc, 0x33, 0x1e, 0x53, 0xb7, 0x69, 0x30, 0xe8, - 0xea, 0x8c, 0x12, 0xd7, 0x45, 0x82, 0x34, 0xf7, 0x7d, 0x7d, 0xdc, 0x3b, 0xe0, 0xd6, 0xda, 0xd8, - 0xe6, 0x3e, 0x4b, 0x80, 0x48, 0x73, 0x29, 0x34, 0x51, 0xb2, 0xec, 0x55, 0x75, 0x7b, 0x9f, 0x7f, - 0x2b, 0x64, 0x71, 0x1c, 0x26, 0x7d, 0x5a, 0xbd, 0xb1, 0x7f, 0x75, 0x46, 0x89, 0x36, 0xd9, 0x4f, - 0xf4, 0xa4, 0x63, 0x82, 0x25, 0x86, 0xad, 0x1e, 0x1f, 0x2e, 0x0b, 0xfb, 0xcc, 0x08, 0x53, 0x0c, - 0x55, 0x21, 0xd5, 0xd6, 0x2d, 0x5b, 0xb5, 0x0c, 0xad, 0x6b, 0xed, 0x99, 0xb6, 0x78, 0xd6, 0xf8, - 0xbe, 0x71, 0x14, 0xd6, 0x75, 0xcb, 0xae, 0x0b, 0xe0, 0xab, 0x33, 0xca, 0x6c, 0xdb, 0x9b, 0x41, - 0xe8, 0x99, 0x3b, 0x3b, 0xb8, 0xe7, 0x10, 0xa4, 0x71, 0x96, 0x43, 0xe8, 0xd5, 0x08, 0xb4, 0xc0, - 0x27, 0xf4, 0x4c, 0x6f, 0x06, 0xfa, 0x06, 0x98, 0x6f, 0x9b, 0x5a, 0xcb, 0x21, 0xa7, 0x36, 0xf7, - 0xfa, 0xc6, 0x4d, 0x1a, 0x94, 0x49, 0xac, 0x3c, 0x38, 0xb6, 0x91, 0xa6, 0xd6, 0x12, 0x24, 0x8a, - 0x04, 0xe1, 0xea, 0x8c, 0x32, 0xd7, 0x1e, 0xcc, 0x44, 0xef, 0x85, 0x05, 0xad, 0xdb, 0x6d, 0x1f, - 0x0c, 0x52, 0x4f, 0x53, 0xea, 0x67, 0xc7, 0x51, 0xcf, 0x13, 0x9c, 0x41, 0xf2, 0x48, 0x1b, 0xca, - 0x45, 0x0d, 0x90, 0xbb, 0x3d, 0x4c, 0x6f, 0x73, 0x75, 0xb9, 0x95, 0x41, 0xdf, 0x0c, 0x4e, 0xac, - 0x3c, 0x30, 0x8e, 0xf6, 0x26, 0x83, 0x17, 0x46, 0xc9, 0xd5, 0x19, 0x25, 0xdd, 0xf5, 0x67, 0x31, - 0xaa, 0x66, 0x13, 0xd3, 0x07, 0xd6, 0x39, 0xd5, 0xb9, 0x49, 0x54, 0x29, 0xbc, 0x9f, 0xaa, 0x2f, - 0x0b, 0x95, 0x21, 0xc1, 0x5c, 0x51, 0x95, 0x28, 0x43, 0xfa, 0x70, 0x7d, 0x62, 0x25, 0x37, 0x76, - 0x86, 0x52, 0xd0, 0xeb, 0xa6, 0x8d, 0xaf, 0xce, 0x28, 0x80, 0x9d, 0x14, 0xd2, 0xe0, 0x18, 0x7d, - 0x74, 0xf9, 0x40, 0xf5, 0x2b, 0xde, 0xcc, 0x3c, 0x25, 0xf8, 0xd0, 0x38, 0x82, 0xf4, 0x63, 0x46, - 0x07, 0xd7, 0xbd, 0x7a, 0xf8, 0xea, 0x8c, 0x32, 0x7f, 0x6b, 0x38, 0x9b, 0x88, 0xd8, 0x8e, 0x6e, - 0x68, 0x6d, 0xfd, 0x65, 0xcc, 0x96, 0x50, 0xfa, 0x0d, 0x83, 0x43, 0x44, 0xec, 0x0a, 0x87, 0xa6, - 0x0b, 0x2b, 0x11, 0xb1, 0x1d, 0x6f, 0x46, 0x21, 0xca, 0xcf, 0xa1, 0x3a, 0x8f, 0x91, 0x46, 0xe5, - 0x18, 0x7b, 0x32, 0xfb, 0x5a, 0x28, 0x06, 0x72, 0x22, 0xf7, 0x00, 0x24, 0x3c, 0x8a, 0x09, 0x65, - 0x20, 0xca, 0x4f, 0xea, 0x88, 0x13, 0xad, 0x3c, 0x99, 0x4b, 0x41, 0xd2, 0xab, 0x8c, 0x72, 0x1f, - 0x91, 0x1c, 0x4c, 0xfa, 0x32, 0x48, 0xc6, 0x1f, 0x91, 0x8e, 0xbb, 0x96, 0xca, 0xbd, 0x62, 0x69, - 0x13, 0xe5, 0x6c, 0xfb, 0x35, 0x49, 0x33, 0xf9, 0xca, 0x8a, 0x16, 0x21, 0xd1, 0x5d, 0xe9, 0x3a, - 0x20, 0x41, 0x0a, 0x02, 0xdd, 0x95, 0xae, 0x00, 0xb8, 0x07, 0x92, 0xa4, 0xdf, 0xaa, 0xd7, 0x5e, - 0x8a, 0x2b, 0x09, 0x92, 0xc7, 0x41, 0x72, 0xbf, 0x19, 0x00, 0x79, 0x50, 0x81, 0x39, 0xa1, 0x6a, - 0xe9, 0xc8, 0xa1, 0xea, 0x93, 0x83, 0x41, 0x72, 0x37, 0x2e, 0xbe, 0x0e, 0xb2, 0x1b, 0xde, 0x65, - 0x4b, 0xcd, 0x78, 0xfb, 0x6f, 0xc0, 0x50, 0x55, 0xd2, 0xcd, 0x01, 0xcb, 0xf5, 0x8a, 0x6f, 0xb3, - 0x52, 0x7c, 0x16, 0x72, 0x70, 0xc0, 0x1d, 0x23, 0x66, 0xab, 0xdb, 0xd2, 0x6c, 0x2c, 0xe2, 0x63, - 0x9e, 0x7d, 0xcb, 0xfb, 0x21, 0xad, 0x75, 0xbb, 0xaa, 0x65, 0x6b, 0x36, 0xe6, 0xb6, 0x06, 0x8b, - 0x3c, 0xcc, 0x6a, 0xdd, 0x2e, 0xfd, 0x8a, 0x16, 0xb3, 0x35, 0xee, 0x83, 0x14, 0xd1, 0xe9, 0xba, - 0xd6, 0x16, 0xa6, 0x42, 0x84, 0x99, 0x24, 0x3c, 0x97, 0x59, 0x07, 0xb9, 0x96, 0x33, 0xe2, 0x54, - 0x9f, 0x3b, 0x3e, 0x95, 0xe4, 0xf1, 0xa9, 0x10, 0x7f, 0xb1, 0x85, 0xf1, 0x47, 0x3c, 0xae, 0x33, - 0x7a, 0xd3, 0x60, 0x81, 0xfa, 0x5f, 0xb7, 0x58, 0xb0, 0x24, 0xa6, 0xb0, 0x44, 0x4e, 0x81, 0x94, - 0x5f, 0xf7, 0xa3, 0x14, 0x04, 0xec, 0x7d, 0x5e, 0x4b, 0xc0, 0xde, 0x27, 0x96, 0xae, 0xe7, 0x91, - 0xbc, 0xe1, 0xd5, 0x8e, 0xe3, 0xb9, 0xb1, 0x8e, 0x5c, 0x1a, 0x66, 0x7d, 0x6b, 0x42, 0xee, 0x38, - 0x2c, 0x8c, 0x52, 0xf1, 0xb9, 0x3d, 0x27, 0xdf, 0xa7, 0xaa, 0xd1, 0x05, 0x88, 0x39, 0x3a, 0x7e, - 0x84, 0x77, 0x4c, 0xab, 0x15, 0xc0, 0x8a, 0x03, 0xea, 0x0b, 0xe7, 0x07, 0x7c, 0xe1, 0xfc, 0xdc, - 0x37, 0x43, 0x66, 0x9c, 0xfe, 0x1e, 0x08, 0xf2, 0x85, 0x1c, 0x86, 0x1d, 0x87, 0x08, 0x7f, 0x13, - 0x2e, 0x40, 0x37, 0xb0, 0x78, 0x8a, 0x30, 0x92, 0xe9, 0xf2, 0x20, 0xdb, 0xd7, 0xa2, 0x89, 0x9c, - 0x0a, 0x27, 0xc7, 0xea, 0xf0, 0xf1, 0x5b, 0x61, 0x8c, 0x10, 0xdf, 0x0a, 0x6b, 0x8a, 0xe6, 0x58, - 0xb4, 0xaf, 0xe2, 0x20, 0x0b, 0x4b, 0xe5, 0x5e, 0x0b, 0xc2, 0xf1, 0xd1, 0x9a, 0x1c, 0x2d, 0x41, - 0x92, 0xd8, 0xad, 0xb6, 0xdf, 0xc4, 0x85, 0x8e, 0xb6, 0xdf, 0xe0, 0xf6, 0x2d, 0xdf, 0x4a, 0x08, - 0x38, 0x5b, 0x09, 0x68, 0x0b, 0xe6, 0xda, 0x66, 0x53, 0x6b, 0xab, 0x9e, 0xad, 0x1c, 0x3e, 0x89, - 0xee, 0x1d, 0x62, 0xb6, 0x3f, 0x64, 0x48, 0x14, 0x0e, 0x97, 0xff, 0x34, 0xa5, 0xb1, 0xee, 0xec, - 0xfa, 0xa0, 0x12, 0x24, 0x3a, 0xba, 0xb5, 0x8d, 0xf7, 0xb4, 0x5b, 0xba, 0xd9, 0xe3, 0xb3, 0x69, - 0x58, 0x68, 0x36, 0x5c, 0x18, 0xb1, 0xc3, 0xe4, 0x41, 0xf3, 0x0c, 0x49, 0x78, 0xe4, 0xc6, 0x57, - 0xe4, 0xc8, 0xda, 0x64, 0xdc, 0x1e, 0x52, 0x74, 0xec, 0x1e, 0xd2, 0xa8, 0x0d, 0x9b, 0xd8, 0xe8, - 0x0d, 0x9b, 0x0f, 0x7a, 0x87, 0xc6, 0xbf, 0xf6, 0x0d, 0xed, 0xe1, 0xa0, 0x3a, 0x2c, 0x70, 0xfc, - 0x96, 0x8f, 0xf7, 0x23, 0x8e, 0x3a, 0xb0, 0xf9, 0x35, 0xc8, 0x73, 0x24, 0xd0, 0xc7, 0xb3, 0x3d, - 0x78, 0x67, 0x6c, 0x17, 0x9b, 0xa8, 0x21, 0xcf, 0x26, 0xea, 0xff, 0x65, 0x43, 0xf1, 0xfe, 0x20, - 0xcc, 0x0d, 0x19, 0x12, 0x23, 0x77, 0x87, 0xc7, 0x45, 0x64, 0x45, 0xc7, 0x82, 0x47, 0xee, 0x18, - 0x1f, 0xeb, 0xd0, 0xe4, 0xb1, 0x0e, 0xbf, 0x8d, 0x63, 0x1d, 0xb9, 0xb3, 0xb1, 0xfe, 0x9a, 0x8e, - 0xc2, 0xc7, 0x24, 0xc8, 0x8e, 0xb7, 0xbe, 0x46, 0x0e, 0xc7, 0x91, 0x36, 0x10, 0xc6, 0xad, 0x71, - 0xf7, 0x41, 0x6a, 0xc0, 0x36, 0x64, 0xa2, 0x3c, 0xeb, 0xf3, 0xc2, 0x73, 0x1f, 0x08, 0x3a, 0x0b, - 0x8f, 0xcf, 0x80, 0x1b, 0x31, 0x5b, 0x9f, 0x85, 0xf9, 0x16, 0x6e, 0xea, 0xad, 0x3b, 0x9d, 0xac, - 0x73, 0x1c, 0xfb, 0xff, 0xcd, 0xd5, 0x61, 0x29, 0xf9, 0x3e, 0x80, 0x98, 0x82, 0xad, 0x2e, 0xb1, - 0xc7, 0x50, 0x01, 0xe2, 0x78, 0xbf, 0x89, 0xbb, 0xb6, 0x7b, 0xa8, 0x62, 0x94, 0x8b, 0xc0, 0xa0, - 0xcb, 0x02, 0x92, 0x38, 0xc8, 0x0e, 0x1a, 0x7a, 0x8c, 0xc7, 0x00, 0xc6, 0xbb, 0xf3, 0x1c, 0xdd, - 0x1b, 0x04, 0xb8, 0x28, 0x82, 0x00, 0xc1, 0xb1, 0xfe, 0x2d, 0xc3, 0x1a, 0x88, 0x02, 0x3c, 0xc6, - 0xa3, 0x00, 0xa1, 0x09, 0x95, 0xf9, 0xc2, 0x00, 0x45, 0x5f, 0x18, 0x20, 0x32, 0xa1, 0x9b, 0x63, - 0xe2, 0x00, 0x17, 0x45, 0x1c, 0x20, 0x3a, 0xa1, 0xc5, 0x03, 0x81, 0x80, 0xa7, 0x3c, 0x81, 0x80, - 0xf8, 0x70, 0xb4, 0xd5, 0x87, 0x3a, 0x22, 0x12, 0x70, 0xc9, 0x89, 0x04, 0x24, 0xc7, 0x46, 0x11, - 0x38, 0xf2, 0x60, 0x28, 0xa0, 0x36, 0x14, 0x0a, 0x98, 0xe5, 0x9f, 0x38, 0x1e, 0x47, 0x62, 0x42, - 0x2c, 0xa0, 0x36, 0x14, 0x0b, 0x48, 0x4d, 0x20, 0x38, 0x21, 0x18, 0xf0, 0x8d, 0xa3, 0x83, 0x01, - 0xe3, 0xdd, 0x75, 0xde, 0xcc, 0xe9, 0xa2, 0x01, 0xea, 0x98, 0x68, 0x80, 0x3c, 0xd6, 0x73, 0x65, - 0xe4, 0xa7, 0x0e, 0x07, 0x6c, 0x8d, 0x08, 0x07, 0x30, 0xc7, 0xfd, 0xcc, 0x58, 0xe2, 0x53, 0xc4, - 0x03, 0xb6, 0x46, 0xc4, 0x03, 0xd0, 0x44, 0xb2, 0x13, 0x03, 0x02, 0x57, 0xfc, 0x01, 0x81, 0xf9, - 0x31, 0x56, 0xa7, 0x3b, 0xdb, 0xc7, 0x44, 0x04, 0xb6, 0xc7, 0x45, 0x04, 0x16, 0xf8, 0xa7, 0x13, - 0xc6, 0x51, 0x3c, 0x42, 0x48, 0xa0, 0x36, 0x14, 0x12, 0x38, 0x36, 0x41, 0xd2, 0xa6, 0x8f, 0x09, - 0xb0, 0x8f, 0x69, 0xb1, 0xcf, 0x68, 0x81, 0x9c, 0xb8, 0x16, 0x8a, 0x25, 0xe4, 0x64, 0xee, 0x41, - 0x62, 0xc1, 0x0c, 0xe8, 0x39, 0xe2, 0x2b, 0xe0, 0x5e, 0xcf, 0xec, 0x89, 0x3b, 0x16, 0x34, 0x91, - 0x3b, 0x43, 0x7c, 0x44, 0x57, 0xa7, 0x1d, 0x12, 0x3f, 0xa0, 0x3e, 0x99, 0x47, 0x8f, 0xe5, 0x7e, - 0x49, 0x72, 0x71, 0x69, 0x04, 0xc1, 0xeb, 0x5f, 0xc6, 0xb9, 0x7f, 0xe9, 0x89, 0x2a, 0x04, 0xfc, - 0x51, 0x85, 0x45, 0x48, 0x10, 0x5f, 0x6b, 0x20, 0x60, 0xa0, 0x75, 0x9d, 0x80, 0x81, 0x38, 0x40, - 0xc5, 0x62, 0x0f, 0x7c, 0x59, 0x62, 0xbb, 0x89, 0x69, 0xe7, 0x30, 0x19, 0x73, 0x75, 0xd1, 0x23, - 0x30, 0xef, 0x81, 0x75, 0x7c, 0x38, 0xe6, 0x3d, 0xcb, 0x0e, 0x74, 0x9e, 0x3b, 0x73, 0xff, 0x42, - 0x72, 0x39, 0xe4, 0x46, 0x1a, 0x46, 0x05, 0x05, 0xa4, 0xb7, 0x29, 0x28, 0x10, 0xb8, 0xe3, 0xa0, - 0x80, 0xd7, 0x27, 0x0d, 0xfa, 0x7d, 0xd2, 0xff, 0x21, 0xb9, 0x63, 0xe2, 0xb8, 0xf8, 0x4d, 0xb3, - 0x85, 0xb9, 0x97, 0x48, 0x7f, 0x13, 0x93, 0xa4, 0x6d, 0x8a, 0x6f, 0x20, 0x91, 0x9f, 0x04, 0xca, - 0x59, 0x78, 0xe2, 0x7c, 0x5d, 0x71, 0x1c, 0xcc, 0xb0, 0xf7, 0x1e, 0x07, 0xbf, 0xdc, 0x10, 0x71, - 0x2f, 0x37, 0x38, 0x17, 0xa3, 0xa3, 0x9e, 0x8b, 0xd1, 0xe8, 0x49, 0x88, 0xd3, 0x60, 0xbf, 0x6a, - 0x76, 0xc5, 0xe7, 0xa4, 0x4f, 0x8d, 0xbf, 0xd8, 0x60, 0xd1, 0x23, 0xd7, 0xec, 0x32, 0x84, 0x6b, - 0x71, 0xc4, 0x7d, 0x16, 0xc7, 0x5d, 0x10, 0x27, 0xad, 0x67, 0xdf, 0x53, 0x04, 0x7e, 0xab, 0x5e, - 0x64, 0xe4, 0x7e, 0x2a, 0x00, 0xe9, 0x81, 0x85, 0x66, 0x64, 0xdf, 0x47, 0x6d, 0x23, 0x4f, 0xc7, - 0x8f, 0xd3, 0x00, 0xbb, 0x9a, 0xa5, 0xbe, 0xa4, 0x19, 0x36, 0xff, 0x06, 0x7a, 0x50, 0xf1, 0xe4, - 0xa0, 0x2c, 0xc4, 0x48, 0xaa, 0x6f, 0xf1, 0xaf, 0xa0, 0x07, 0x15, 0x27, 0x8d, 0xae, 0x42, 0x04, - 0xdf, 0xa2, 0x4f, 0x03, 0xb3, 0x4f, 0x60, 0x1c, 0x1f, 0x76, 0x87, 0x49, 0x71, 0x21, 0x43, 0x06, - 0xfb, 0x8b, 0xaf, 0x2f, 0xca, 0x0c, 0xfa, 0x61, 0xe7, 0x32, 0x9b, 0xc2, 0xf1, 0xfd, 0x5c, 0x88, - 0x0d, 0x70, 0x81, 0xc6, 0x01, 0x93, 0xc2, 0xbd, 0x27, 0x3c, 0x65, 0x67, 0xbc, 0x95, 0xd9, 0x0e, - 0xee, 0x74, 0x4d, 0xb3, 0xad, 0xb2, 0x39, 0x9e, 0x87, 0x94, 0x7f, 0x5d, 0x65, 0x9f, 0x2c, 0xb6, - 0x35, 0xdd, 0x50, 0x7d, 0x46, 0x70, 0x92, 0x65, 0xb2, 0x39, 0xe5, 0x7d, 0xf7, 0x39, 0xb7, 0x09, - 0xc7, 0x46, 0xae, 0xab, 0xe8, 0x09, 0x88, 0xbb, 0x4b, 0x32, 0x3b, 0xa6, 0x7f, 0x48, 0xa4, 0xc5, - 0x85, 0xcd, 0xfd, 0x8a, 0xe4, 0x92, 0xf4, 0xc7, 0x6e, 0xca, 0x10, 0x61, 0x67, 0x26, 0xf9, 0xf9, - 0x98, 0x47, 0xa6, 0x5b, 0x91, 0x97, 0xd9, 0x81, 0x4a, 0x85, 0x23, 0xe7, 0xde, 0x0b, 0x11, 0x96, - 0x83, 0x12, 0x10, 0xf5, 0x3d, 0x05, 0x9f, 0x2f, 0x16, 0xcb, 0x9b, 0xe2, 0x69, 0xdf, 0x02, 0x7d, - 0x66, 0x9d, 0x64, 0x2b, 0xe5, 0x6b, 0xe5, 0x62, 0x43, 0x0e, 0xa2, 0x39, 0x98, 0x65, 0xbf, 0xf9, - 0x83, 0xed, 0x72, 0xc8, 0x93, 0x55, 0x2f, 0x57, 0x4b, 0x65, 0x45, 0x0e, 0xe7, 0xce, 0xc3, 0xc9, - 0xb1, 0x6b, 0xb8, 0x1b, 0x98, 0x91, 0x3c, 0x81, 0x99, 0xdc, 0x6b, 0x01, 0xe2, 0xd4, 0x8c, 0x5b, - 0x98, 0xd1, 0xb5, 0x81, 0x8e, 0xaf, 0x1c, 0x61, 0x55, 0x1f, 0xe8, 0x3d, 0xf1, 0x63, 0x7a, 0x78, - 0x07, 0xdb, 0xcd, 0x3d, 0x66, 0x28, 0x30, 0x0d, 0x34, 0xab, 0xcc, 0xf2, 0x5c, 0x8a, 0x64, 0x31, - 0xb0, 0x17, 0x71, 0xd3, 0x56, 0x99, 0x10, 0x59, 0xd4, 0x99, 0x88, 0x13, 0x30, 0x92, 0x5b, 0x67, - 0x99, 0xb9, 0x6f, 0x3e, 0x12, 0x2f, 0xe3, 0x10, 0x56, 0xca, 0x0d, 0xe5, 0x06, 0xfb, 0x30, 0x39, - 0xfd, 0xa9, 0xd6, 0xab, 0xf9, 0xcd, 0xfa, 0xd5, 0x1a, 0xe1, 0xe5, 0x3c, 0xa4, 0x05, 0x2f, 0x45, - 0x66, 0x38, 0xf7, 0x10, 0x9c, 0x18, 0x63, 0x55, 0x8c, 0x38, 0xc4, 0xfa, 0x49, 0xc9, 0x0b, 0xed, - 0xb7, 0x0c, 0x6a, 0x10, 0xb1, 0x6c, 0xcd, 0xee, 0x5b, 0x9c, 0x89, 0x4f, 0x4c, 0x6b, 0x66, 0x2c, - 0x8b, 0x1f, 0x75, 0x8a, 0xae, 0x70, 0x32, 0xb9, 0x0b, 0x90, 0xf2, 0x97, 0x8c, 0xe7, 0x81, 0x2b, - 0x44, 0x81, 0xdc, 0x65, 0x40, 0xc3, 0xd6, 0xc7, 0x08, 0xf7, 0x52, 0x1a, 0xe5, 0x5e, 0xfe, 0x98, - 0x04, 0xa7, 0x0e, 0xb1, 0x34, 0xd0, 0xb3, 0x03, 0x9d, 0xbc, 0x74, 0x14, 0x3b, 0x65, 0x99, 0xe5, - 0x0d, 0x74, 0xf3, 0x31, 0x48, 0x7a, 0xf3, 0xa7, 0xeb, 0xe4, 0x17, 0x03, 0xee, 0x24, 0xf6, 0xfb, - 0xc1, 0xae, 0x0a, 0x94, 0xbe, 0x4a, 0x15, 0xf8, 0x6e, 0x00, 0x7b, 0x5f, 0x9c, 0xa2, 0xe6, 0xeb, - 0xe8, 0xdd, 0x23, 0xe2, 0x8b, 0xb8, 0xd9, 0xd8, 0xe7, 0x93, 0x20, 0x6e, 0xf3, 0x5f, 0x16, 0xaa, - 0x7b, 0x83, 0x02, 0x7d, 0xba, 0xc6, 0x5a, 0xdc, 0x61, 0x9e, 0x76, 0x31, 0x76, 0x83, 0x07, 0x2c, - 0xdb, 0x42, 0x37, 0xe0, 0xc4, 0x80, 0xa1, 0xe0, 0x90, 0x0e, 0x4d, 0x6b, 0x2f, 0x1c, 0xf3, 0xdb, - 0x0b, 0x82, 0xb4, 0x77, 0xb5, 0x0f, 0xfb, 0x57, 0xfb, 0x1b, 0x00, 0x6e, 0x70, 0xc0, 0x3d, 0xf6, - 0x27, 0x79, 0x8f, 0xfd, 0x5d, 0x80, 0x30, 0x91, 0x24, 0xc1, 0xa7, 0x61, 0x55, 0x4c, 0x24, 0xc1, - 0x13, 0x5c, 0x60, 0xd0, 0x39, 0x1d, 0xd0, 0x70, 0x80, 0x76, 0x4c, 0x15, 0x4f, 0xf9, 0xab, 0xb8, - 0x67, 0x6c, 0xa8, 0x77, 0x74, 0x55, 0x2f, 0x43, 0x98, 0x8e, 0xfc, 0xc8, 0xbb, 0x94, 0xdf, 0x04, - 0xa0, 0xd9, 0x76, 0x4f, 0xdf, 0xee, 0xbb, 0x15, 0x2c, 0x8e, 0x96, 0x9c, 0xbc, 0x80, 0x2b, 0xdc, - 0xc5, 0x45, 0x68, 0xc1, 0x45, 0xf5, 0x88, 0x91, 0x87, 0x60, 0xae, 0x0a, 0x29, 0x3f, 0xee, 0xe8, - 0xbb, 0xa1, 0xc3, 0x1f, 0xbf, 0x74, 0xad, 0x23, 0xfe, 0x18, 0x13, 0x4d, 0xe4, 0x5e, 0x09, 0x40, - 0xd2, 0x2b, 0x78, 0x7f, 0xf3, 0x4c, 0x90, 0xdc, 0xb7, 0x4b, 0x10, 0x73, 0xba, 0x7f, 0xc8, 0x61, - 0x67, 0xf7, 0x8e, 0xb0, 0xb3, 0x79, 0xc1, 0xb6, 0x89, 0x82, 0xce, 0x36, 0xd1, 0x65, 0x67, 0xf9, - 0x1b, 0x17, 0x10, 0xf1, 0xf2, 0x5a, 0x1c, 0x38, 0xe4, 0xab, 0xfd, 0xe5, 0xe9, 0xae, 0xe2, 0x2d, - 0x40, 0xd8, 0x7b, 0x8d, 0x8e, 0x25, 0x72, 0x2d, 0xcf, 0x09, 0x23, 0x36, 0x11, 0xbd, 0x77, 0xf6, - 0xa4, 0x23, 0xdf, 0xd9, 0x73, 0x6a, 0x09, 0x78, 0x6b, 0xf9, 0x5e, 0x09, 0x62, 0x62, 0x4e, 0xa0, - 0xf7, 0x78, 0x4f, 0x9e, 0x89, 0xad, 0xcd, 0xb1, 0xfa, 0x88, 0xd3, 0xf7, 0x1c, 0x3c, 0x1b, 0x3a, - 0x70, 0x1d, 0x3c, 0xea, 0x81, 0x6b, 0x6e, 0xd9, 0xfd, 0x85, 0x04, 0xf2, 0xe0, 0x8c, 0xfd, 0xaa, - 0x5b, 0x37, 0xbc, 0xcc, 0x05, 0x47, 0x2c, 0x73, 0xe3, 0x4e, 0x51, 0x87, 0xc6, 0x9d, 0xa2, 0x1e, - 0xee, 0x75, 0xf8, 0x0e, 0x7b, 0xfd, 0xfe, 0x00, 0x24, 0x3c, 0xe1, 0x51, 0xf4, 0xb8, 0xef, 0x44, - 0xf6, 0xd2, 0x61, 0xa1, 0x54, 0xcf, 0x91, 0x6c, 0x1f, 0x9b, 0x02, 0x47, 0x67, 0xd3, 0xdb, 0x7f, - 0x3b, 0x6b, 0xf4, 0x05, 0xd6, 0xf0, 0x98, 0x0b, 0xac, 0xdf, 0x26, 0x41, 0xcc, 0x31, 0xbb, 0x8f, - 0xba, 0x89, 0x79, 0x1c, 0x22, 0xdc, 0xb2, 0x64, 0xbb, 0x98, 0x3c, 0x35, 0x32, 0xac, 0x9c, 0x85, - 0x98, 0xf8, 0x4a, 0x3e, 0x5f, 0xd5, 0x9c, 0xf4, 0xd9, 0x4b, 0x90, 0xf0, 0x6c, 0x00, 0x13, 0xd5, - 0x58, 0x2d, 0x3f, 0x27, 0xcf, 0x64, 0xa3, 0xaf, 0xde, 0x5e, 0x0a, 0x56, 0xf1, 0x4b, 0x64, 0x36, - 0x2b, 0xe5, 0xe2, 0xd5, 0x72, 0xf1, 0x19, 0x59, 0xca, 0x26, 0x5e, 0xbd, 0xbd, 0x14, 0x55, 0x30, - 0x8d, 0x28, 0x9e, 0x7d, 0x06, 0xd2, 0x03, 0x03, 0xe3, 0x37, 0x5b, 0x10, 0xa4, 0x4a, 0x5b, 0x9b, - 0xeb, 0x95, 0x62, 0xbe, 0x51, 0x56, 0xd9, 0xb9, 0x5d, 0x74, 0x02, 0xe6, 0xd7, 0x2b, 0x6b, 0x57, - 0x1b, 0x6a, 0x71, 0xbd, 0x52, 0xae, 0x36, 0xd4, 0x7c, 0xa3, 0x91, 0x2f, 0x3e, 0x23, 0x07, 0x56, - 0x6e, 0x27, 0x20, 0x94, 0x2f, 0x14, 0x2b, 0xa8, 0x08, 0x21, 0x1a, 0x0a, 0x39, 0xf4, 0x04, 0x58, - 0xf6, 0xf0, 0xd8, 0x30, 0xba, 0x02, 0x61, 0x1a, 0x25, 0x41, 0x87, 0x1f, 0x09, 0xcb, 0x4e, 0x08, - 0x16, 0x93, 0xc6, 0xd0, 0x19, 0x79, 0xe8, 0x19, 0xb1, 0xec, 0xe1, 0xb1, 0x63, 0xb4, 0x0e, 0x51, - 0xe1, 0x24, 0x4f, 0x3a, 0xb8, 0x95, 0x9d, 0x18, 0xd0, 0x25, 0x5d, 0x63, 0xc1, 0x86, 0xc3, 0x8f, - 0x8f, 0x65, 0x27, 0x44, 0x95, 0x51, 0xc5, 0xb9, 0xcf, 0x34, 0xe1, 0x44, 0x58, 0x76, 0x52, 0x9c, - 0x18, 0x29, 0x10, 0x77, 0xc3, 0x38, 0x93, 0x0f, 0xc5, 0x65, 0xa7, 0x08, 0x98, 0xa3, 0xf7, 0xc2, - 0xac, 0xdf, 0xd5, 0x9d, 0xee, 0xd4, 0x59, 0x76, 0xca, 0x88, 0x34, 0xa1, 0xef, 0xf7, 0x7b, 0xa7, - 0x3b, 0x85, 0x96, 0x9d, 0x32, 0x40, 0x8d, 0x5e, 0x84, 0xb9, 0x61, 0xbf, 0x74, 0xfa, 0x43, 0x69, - 0xd9, 0x23, 0x84, 0xac, 0x51, 0x07, 0xd0, 0x08, 0x7f, 0xf6, 0x08, 0x67, 0xd4, 0xb2, 0x47, 0x89, - 0x60, 0xa3, 0x16, 0xa4, 0x07, 0x9d, 0xc4, 0x69, 0xcf, 0xac, 0x65, 0xa7, 0x8e, 0x66, 0xb3, 0x5a, - 0xfc, 0xce, 0xe5, 0xb4, 0x67, 0xd8, 0xb2, 0x53, 0x07, 0xb7, 0xd1, 0x16, 0x80, 0xc7, 0x3f, 0x9c, - 0xe2, 0x4c, 0x5b, 0x76, 0x9a, 0x30, 0x37, 0xea, 0xc2, 0xfc, 0x28, 0xc7, 0xf1, 0x28, 0x47, 0xdc, - 0xb2, 0x47, 0x8a, 0x7e, 0x13, 0x79, 0xf6, 0xbb, 0x80, 0xd3, 0x1d, 0x79, 0xcb, 0x4e, 0x19, 0x06, - 0x2f, 0xe4, 0xc7, 0x9e, 0x73, 0x7e, 0xe0, 0xd0, 0x73, 0xce, 0xee, 0xc9, 0x65, 0xe7, 0x6c, 0xf3, - 0xbf, 0x3b, 0x07, 0xef, 0xe2, 0x2f, 0xe8, 0x58, 0xb6, 0x76, 0x53, 0x37, 0x76, 0x9d, 0x67, 0x96, - 0x78, 0x9a, 0x1f, 0x72, 0x3e, 0xce, 0x5f, 0xe9, 0x11, 0xb9, 0x13, 0x1e, 0x5b, 0x1a, 0xfb, 0x02, - 0xe5, 0xa4, 0xfb, 0x10, 0x93, 0x8f, 0x2f, 0x1f, 0xf2, 0x90, 0xd3, 0x84, 0xe7, 0xa2, 0x46, 0x3c, - 0xf4, 0x94, 0x3d, 0xf4, 0x8d, 0x81, 0xec, 0x61, 0xe7, 0xbe, 0x89, 0x15, 0x9b, 0xba, 0xaa, 0x5b, - 0xb6, 0xd9, 0xd3, 0x9b, 0x5a, 0x9b, 0x2e, 0x2f, 0x97, 0xa7, 0xbd, 0x95, 0x55, 0x88, 0x13, 0x73, - 0x85, 0xbf, 0x05, 0xc5, 0x6f, 0x0a, 0x95, 0x20, 0x72, 0x4b, 0x6b, 0xb3, 0x3b, 0x51, 0xde, 0x87, - 0xe0, 0x06, 0x79, 0xee, 0xb1, 0xa3, 0xbc, 0x54, 0x18, 0x6e, 0xee, 0xfb, 0xe9, 0x7d, 0x92, 0x4e, - 0x47, 0xb7, 0x88, 0x2c, 0x2a, 0xd4, 0x95, 0xbe, 0x06, 0xa1, 0x9e, 0x66, 0x73, 0x07, 0xb3, 0x70, - 0xf1, 0xc8, 0xef, 0x32, 0xb1, 0x1a, 0x28, 0x0d, 0xf4, 0x2c, 0xc4, 0x3a, 0xda, 0xbe, 0x4a, 0xe9, - 0x05, 0xbe, 0x2a, 0x7a, 0xd1, 0x8e, 0xb6, 0x4f, 0xda, 0x87, 0xde, 0x4b, 0x3f, 0x3f, 0xa8, 0x36, - 0xf7, 0x34, 0x63, 0x17, 0x33, 0xca, 0xc1, 0xaf, 0x8a, 0xf2, 0x6c, 0x47, 0xdb, 0x2f, 0x52, 0x6a, - 0x84, 0x3e, 0x7f, 0xf2, 0xea, 0xd7, 0x24, 0x1e, 0x35, 0xa0, 0x8c, 0x41, 0x1a, 0xc8, 0x4d, 0x27, - 0x45, 0x2b, 0x15, 0x5b, 0x1c, 0x0f, 0x8c, 0xe3, 0xfb, 0x00, 0x5b, 0x0b, 0xb3, 0xa4, 0x79, 0x9f, - 0x7b, 0x7d, 0x51, 0x62, 0xb5, 0xa6, 0x9b, 0x43, 0x6c, 0x4f, 0xb0, 0x60, 0x88, 0x4a, 0x6d, 0xd8, - 0xc0, 0x44, 0x1b, 0x76, 0x56, 0xd8, 0xb0, 0x8c, 0x20, 0x30, 0x6c, 0x52, 0xce, 0xfb, 0xf0, 0x29, - 0x09, 0x12, 0x25, 0xcf, 0xb3, 0x8e, 0x19, 0x88, 0x76, 0x4c, 0x43, 0xbf, 0x89, 0x7b, 0xce, 0x1e, - 0x15, 0x4b, 0x12, 0x3b, 0x93, 0x7d, 0x60, 0xd9, 0x3e, 0x10, 0xaf, 0x0b, 0x89, 0x34, 0xc1, 0x7a, - 0x09, 0x6f, 0x5b, 0xba, 0xe0, 0xb3, 0x22, 0x92, 0xe8, 0x41, 0x90, 0x2d, 0xdc, 0xec, 0xf7, 0x74, - 0xfb, 0x40, 0x6d, 0x9a, 0x86, 0xad, 0x35, 0x6d, 0xee, 0x87, 0xa7, 0x45, 0x7e, 0x91, 0x65, 0x13, - 0x22, 0x2d, 0x6c, 0x6b, 0x7a, 0x9b, 0x9d, 0xcc, 0x8c, 0x2b, 0x22, 0xc9, 0x9b, 0xfa, 0x6a, 0xd4, - 0xeb, 0x87, 0x16, 0x41, 0x36, 0xbb, 0xb8, 0xe7, 0x3b, 0x90, 0xc2, 0xa4, 0x31, 0xf3, 0xdb, 0x9f, - 0x79, 0x64, 0x81, 0x33, 0x9c, 0x1f, 0x66, 0x60, 0x5f, 0x31, 0x50, 0xd2, 0x02, 0x43, 0x9c, 0x54, - 0xb9, 0xe1, 0xdb, 0x95, 0xea, 0x6f, 0xbb, 0xcf, 0xc8, 0x2c, 0x0c, 0x31, 0x35, 0x6f, 0x1c, 0x14, - 0x32, 0x9f, 0x75, 0x49, 0xbb, 0x7e, 0xea, 0x33, 0xf8, 0xc0, 0xbb, 0x45, 0x45, 0xc9, 0x10, 0x13, - 0xfe, 0x45, 0x4d, 0x6f, 0x8b, 0x0f, 0xfe, 0x2b, 0x3c, 0x85, 0x56, 0x9d, 0xf0, 0x22, 0xfb, 0xa6, - 0x66, 0x6e, 0x9c, 0x6c, 0x14, 0x4c, 0xa3, 0xe5, 0x8f, 0x23, 0xa2, 0x22, 0x44, 0x6c, 0xf3, 0x26, - 0x36, 0x38, 0x83, 0x8e, 0xf6, 0xb4, 0x1a, 0x47, 0x45, 0xdf, 0x08, 0x72, 0x0b, 0xb7, 0xf1, 0x2e, - 0xbb, 0x2f, 0xb9, 0xa7, 0xf5, 0x30, 0xbb, 0xad, 0x7f, 0x47, 0xcf, 0xab, 0xa5, 0x1d, 0x52, 0x75, - 0x4a, 0x09, 0x6d, 0xfa, 0x1f, 0x0e, 0x8d, 0xf2, 0xcd, 0xe3, 0x31, 0x7d, 0xf4, 0x48, 0x9e, 0x57, - 0xf3, 0xf8, 0x1e, 0x1a, 0x7d, 0x10, 0xe4, 0xbe, 0xb1, 0x6d, 0x1a, 0xf4, 0x03, 0x91, 0xdc, 0x8b, - 0x8a, 0xb1, 0x9d, 0x4a, 0x27, 0x9f, 0xef, 0x54, 0x6e, 0x42, 0xca, 0x05, 0xa5, 0x33, 0x24, 0x7e, - 0xd4, 0x19, 0x32, 0xeb, 0x10, 0x20, 0x20, 0x68, 0x03, 0xc0, 0x9d, 0x83, 0x74, 0xab, 0x2c, 0x31, - 0x7e, 0xc4, 0xdc, 0xd9, 0xec, 0xed, 0x8c, 0x87, 0x00, 0xfa, 0x06, 0x98, 0xef, 0xe8, 0x86, 0x6a, - 0xe1, 0xf6, 0x8e, 0xca, 0x39, 0x47, 0xe8, 0x26, 0x8e, 0x3e, 0x9a, 0x73, 0x1d, 0xdd, 0xa8, 0xe3, - 0xf6, 0x4e, 0xc9, 0xa1, 0x82, 0xde, 0x0d, 0xa7, 0xdc, 0xde, 0x9b, 0x86, 0xba, 0x67, 0xb6, 0x5b, - 0x6a, 0x0f, 0xef, 0xa8, 0x4d, 0xfa, 0xce, 0x5f, 0x92, 0xf2, 0xec, 0x84, 0x03, 0x52, 0x33, 0xae, - 0x9a, 0xed, 0x96, 0x82, 0x77, 0x8a, 0xa4, 0x18, 0xdd, 0x0b, 0x6e, 0xd7, 0x55, 0xbd, 0x65, 0x65, - 0x66, 0x97, 0x82, 0x67, 0x42, 0x4a, 0xd2, 0xc9, 0xac, 0xb4, 0xac, 0xd5, 0xd8, 0x07, 0x3f, 0xb1, - 0x38, 0xf3, 0xe6, 0x27, 0x16, 0x67, 0x72, 0x57, 0xe8, 0x9b, 0x52, 0x7c, 0x1e, 0x61, 0x0b, 0x5d, - 0x84, 0xb8, 0x26, 0x12, 0xec, 0xc6, 0xd8, 0x21, 0xf3, 0xd0, 0x05, 0xcd, 0xfd, 0xa4, 0x04, 0x91, - 0xd2, 0xf5, 0x4d, 0x4d, 0xef, 0xa1, 0x32, 0xcc, 0xb9, 0x82, 0x39, 0xed, 0x94, 0x76, 0x65, 0x59, - 0xcc, 0xe9, 0xea, 0xb8, 0xa3, 0x6a, 0xf1, 0xc2, 0x3d, 0xbf, 0xfd, 0x99, 0x47, 0xee, 0xe6, 0x64, - 0xae, 0x0f, 0x9c, 0x5a, 0x13, 0xf4, 0x06, 0x4f, 0xb3, 0x79, 0xfa, 0x7c, 0x0d, 0xa2, 0xac, 0xa9, - 0x16, 0x7a, 0x1a, 0xc2, 0x5d, 0xf2, 0x83, 0x47, 0xe0, 0x4f, 0x8f, 0x15, 0x70, 0x0a, 0xef, 0x15, - 0x07, 0x86, 0x97, 0xfb, 0x50, 0x00, 0xa0, 0x74, 0xfd, 0x7a, 0xa3, 0xa7, 0x77, 0xdb, 0xd8, 0x7e, - 0xbb, 0xfa, 0xbe, 0x05, 0xc7, 0x3c, 0x77, 0xa1, 0x7b, 0xcd, 0xa3, 0xf7, 0x7f, 0xde, 0xbd, 0x16, - 0xdd, 0x6b, 0x8e, 0x24, 0xdb, 0xb2, 0x6c, 0x87, 0x6c, 0xf0, 0xe8, 0x64, 0x4b, 0x96, 0x3d, 0xcc, - 0xd9, 0xe7, 0x21, 0xe1, 0x32, 0xc3, 0x42, 0x15, 0x88, 0xd9, 0xfc, 0x37, 0x67, 0x70, 0x6e, 0x3c, - 0x83, 0x05, 0x9a, 0x97, 0xc9, 0x0e, 0x7a, 0xee, 0xaf, 0x24, 0x00, 0xcf, 0x1c, 0x79, 0x67, 0xca, - 0x18, 0x71, 0xd7, 0xb9, 0x26, 0x0e, 0xde, 0xf1, 0x6b, 0x9c, 0x8c, 0x80, 0x87, 0xa9, 0x1f, 0x0e, - 0xc0, 0xfc, 0x96, 0x98, 0xbd, 0xef, 0x7c, 0x1e, 0x6c, 0x41, 0x14, 0x1b, 0x76, 0x4f, 0x77, 0xf6, - 0x90, 0x1e, 0x1d, 0x37, 0xe6, 0x23, 0x3a, 0x55, 0x36, 0xec, 0xde, 0x81, 0x57, 0x02, 0x04, 0x2d, - 0x0f, 0x3f, 0x3e, 0x1a, 0x84, 0xcc, 0x38, 0x54, 0xf4, 0x00, 0xa4, 0x9b, 0x3d, 0x4c, 0x33, 0xfc, - 0x57, 0x44, 0x53, 0x22, 0x9b, 0xaf, 0x31, 0x0a, 0x10, 0xab, 0x8c, 0x08, 0x17, 0x01, 0xbd, 0x33, - 0x33, 0x2c, 0xe5, 0x52, 0xa0, 0xab, 0x4c, 0x03, 0xd2, 0xe2, 0xce, 0xc9, 0xb6, 0xd6, 0xd6, 0x8c, - 0xa6, 0x30, 0x57, 0x8f, 0xb4, 0x24, 0x88, 0x7b, 0x2b, 0x05, 0x46, 0x02, 0x95, 0x21, 0x2a, 0xa8, - 0x85, 0x8e, 0x4e, 0x4d, 0xe0, 0xa2, 0x7b, 0x20, 0xe9, 0x5d, 0x18, 0xa8, 0xe9, 0x11, 0x52, 0x12, - 0x9e, 0x75, 0x61, 0xd2, 0xca, 0x13, 0x39, 0x74, 0xe5, 0xe1, 0xd6, 0xdd, 0x0f, 0xd3, 0xa3, 0xe1, - 0xad, 0xbf, 0xfe, 0xc3, 0xb2, 0x09, 0xc0, 0xa6, 0x2a, 0xd1, 0xa4, 0x7c, 0x64, 0xee, 0x60, 0xbe, - 0xc7, 0x19, 0x91, 0x92, 0x65, 0x7f, 0xbd, 0x46, 0xe8, 0x77, 0x03, 0x90, 0xf4, 0x8e, 0xd0, 0xdf, - 0xc8, 0x45, 0x0b, 0x55, 0x5d, 0x35, 0xc5, 0xae, 0xcf, 0x3c, 0x38, 0x4e, 0x4d, 0x0d, 0x49, 0xf3, - 0x04, 0xfd, 0xf4, 0xb1, 0x20, 0x44, 0xf8, 0xf9, 0xb6, 0xda, 0x90, 0x21, 0x2b, 0x4d, 0x7a, 0x00, - 0x60, 0x56, 0x3c, 0x00, 0x30, 0xd2, 0x8e, 0xbd, 0x0f, 0x52, 0xc4, 0x21, 0xf6, 0x1d, 0x9a, 0x93, - 0xce, 0xcc, 0x52, 0xbf, 0xd6, 0x3d, 0x22, 0x8e, 0x16, 0x21, 0x41, 0xc0, 0x5c, 0x3d, 0x4c, 0x60, - 0xa0, 0xa3, 0xed, 0x97, 0x59, 0x0e, 0x7a, 0x04, 0xd0, 0x9e, 0x13, 0xa0, 0x50, 0x5d, 0x46, 0x10, - 0xb8, 0x39, 0xb7, 0x44, 0x80, 0xdf, 0x0d, 0x40, 0x5a, 0xa1, 0xb2, 0x07, 0xa8, 0xf9, 0xf3, 0xde, - 0x24, 0xa7, 0x44, 0x1f, 0xa1, 0xfe, 0x80, 0xc4, 0xec, 0xe1, 0x01, 0xb7, 0x99, 0xbb, 0x23, 0x8d, - 0x29, 0x26, 0xc5, 0x9f, 0xbf, 0xbe, 0x98, 0x3d, 0xd0, 0x3a, 0xed, 0xd5, 0xdc, 0x08, 0x3a, 0xb9, - 0x51, 0x9e, 0x3c, 0x31, 0x9c, 0xfd, 0x6e, 0xf7, 0xea, 0xbb, 0x88, 0x78, 0xbf, 0xfa, 0xc6, 0xcf, - 0x9e, 0x3d, 0xe5, 0x79, 0xf3, 0x79, 0xdf, 0x09, 0x5f, 0xb1, 0x31, 0x21, 0x96, 0x2a, 0x72, 0x57, - 0x0d, 0xe7, 0x64, 0xfc, 0x06, 0x80, 0xc7, 0x92, 0x97, 0x0e, 0xf7, 0x10, 0x5c, 0x7c, 0x9f, 0x87, - 0xe0, 0x99, 0x53, 0xef, 0x71, 0x95, 0xb6, 0x78, 0xf3, 0x61, 0xc4, 0x8b, 0xe4, 0xcb, 0x45, 0x53, - 0xf7, 0x91, 0x10, 0x48, 0x74, 0xaa, 0xce, 0xe4, 0xfe, 0x8d, 0x04, 0x27, 0x87, 0xc4, 0xcf, 0x69, - 0x72, 0x13, 0x50, 0xcf, 0x53, 0x48, 0x87, 0x51, 0x6c, 0xc5, 0xde, 0x99, 0x34, 0xcf, 0xf5, 0x86, - 0x34, 0xf7, 0xdb, 0xb3, 0xfa, 0x70, 0xd5, 0xf3, 0x1b, 0x12, 0x2c, 0x78, 0x1b, 0xe0, 0x74, 0xa5, - 0x0e, 0x49, 0x6f, 0xd5, 0xbc, 0x13, 0xef, 0x9a, 0xa6, 0x13, 0xde, 0xf6, 0xfb, 0x88, 0xa0, 0xeb, - 0xee, 0x14, 0x67, 0x71, 0xb3, 0xf3, 0x53, 0x33, 0x45, 0x34, 0x6c, 0xe4, 0x54, 0x67, 0x63, 0xf3, - 0x47, 0x12, 0x84, 0x36, 0x4d, 0xb3, 0x8d, 0xde, 0x07, 0x73, 0x86, 0x69, 0xab, 0x64, 0x3a, 0xe0, - 0x96, 0xca, 0x1d, 0x7b, 0xa6, 0x3e, 0xcb, 0x87, 0xf2, 0xea, 0x8b, 0xaf, 0x2f, 0x0e, 0x63, 0x8e, - 0x7a, 0x13, 0x3e, 0x6d, 0x98, 0x76, 0x81, 0x02, 0x35, 0x98, 0xef, 0xbf, 0x03, 0xb3, 0xfe, 0xea, - 0x98, 0x8a, 0xcd, 0x4f, 0xaa, 0x6e, 0x76, 0x62, 0x55, 0xc9, 0x6d, 0x4f, 0x3d, 0xec, 0x19, 0xe5, - 0x3f, 0x25, 0x23, 0x77, 0x03, 0xe4, 0xeb, 0x83, 0x47, 0x7c, 0xca, 0x10, 0x15, 0x47, 0x7a, 0xa4, - 0x29, 0x4f, 0x0b, 0x79, 0xd9, 0xc9, 0x71, 0xcf, 0xfe, 0x82, 0x04, 0xe0, 0x06, 0x49, 0xd0, 0xc3, - 0x70, 0xa2, 0x50, 0xab, 0x96, 0xd4, 0x7a, 0x23, 0xdf, 0xd8, 0xaa, 0xfb, 0xbf, 0x24, 0x22, 0xde, - 0x1f, 0xb2, 0xba, 0xb8, 0xa9, 0xef, 0xe8, 0xb8, 0x85, 0xee, 0x87, 0x05, 0x3f, 0x34, 0x49, 0x95, - 0x4b, 0xb2, 0x94, 0x4d, 0xbe, 0x7a, 0x7b, 0x29, 0xc6, 0xec, 0x44, 0xdc, 0x42, 0x67, 0xe0, 0xd8, - 0x30, 0x5c, 0xa5, 0xba, 0x26, 0x07, 0xb2, 0xb3, 0xaf, 0xde, 0x5e, 0x8a, 0x3b, 0x06, 0x25, 0xca, - 0x01, 0xf2, 0x42, 0x72, 0x7a, 0xc1, 0x2c, 0xbc, 0x7a, 0x7b, 0x29, 0xc2, 0x46, 0x21, 0x1b, 0xfa, - 0xe0, 0x8f, 0x9e, 0x9e, 0x39, 0xfb, 0x4d, 0x00, 0x15, 0x63, 0xa7, 0xa7, 0xd1, 0xcf, 0xe9, 0xa3, - 0x2c, 0x1c, 0xaf, 0x54, 0xaf, 0x28, 0xf9, 0x22, 0xfd, 0xcc, 0xbf, 0xff, 0x03, 0x28, 0xfe, 0xb2, - 0x52, 0x6d, 0xab, 0xb0, 0x5e, 0x56, 0xeb, 0x95, 0xb5, 0x2a, 0xdb, 0x6c, 0xf5, 0x95, 0x3d, 0x57, - 0x6d, 0x54, 0x36, 0xca, 0x72, 0xa0, 0x70, 0x65, 0x6c, 0x30, 0xff, 0xe1, 0x43, 0x5f, 0xb9, 0x77, - 0x35, 0x9e, 0x2f, 0xa2, 0xff, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0xc8, 0xcb, 0x92, 0x5a, - 0xb1, 0x00, 0x00, + 0xab, 0x97, 0x59, 0xf5, 0x68, 0x11, 0xca, 0xed, 0x40, 0x78, 0x93, 0xe0, 0x91, 0x49, 0xb2, 0x4d, + 0x5b, 0x6b, 0x73, 0x5f, 0x91, 0x7d, 0x90, 0x52, 0xf6, 0x40, 0x53, 0x80, 0x95, 0xea, 0xe2, 0x6d, + 0xa6, 0x36, 0xd6, 0x76, 0xd8, 0x3b, 0x17, 0x41, 0x1a, 0x64, 0xc4, 0x48, 0x01, 0x7d, 0xd2, 0x62, + 0x01, 0xc2, 0x5a, 0x9f, 0x9d, 0x47, 0x0b, 0x92, 0xe8, 0x83, 0x7e, 0xe4, 0x9e, 0x81, 0x28, 0x3f, + 0xf5, 0x80, 0x64, 0x08, 0xde, 0xc4, 0x07, 0xb4, 0x9d, 0xa4, 0x42, 0xfe, 0x44, 0xcb, 0x10, 0xa6, + 0x9d, 0xe7, 0xd7, 0x8b, 0x32, 0xcb, 0x43, 0xbd, 0x5f, 0xa6, 0x9d, 0x54, 0x18, 0x58, 0xee, 0x1a, + 0xc4, 0x4a, 0x26, 0x91, 0x6c, 0x3f, 0xb5, 0x38, 0xa3, 0x46, 0xfb, 0xdc, 0xed, 0xdb, 0xe2, 0x0a, + 0x28, 0xfd, 0x40, 0xc7, 0x21, 0xc2, 0xde, 0x3d, 0xe1, 0x67, 0xea, 0xf8, 0x57, 0xae, 0x08, 0x51, + 0x4a, 0xbb, 0xd6, 0x75, 0x1e, 0x13, 0x93, 0x3c, 0x8f, 0x89, 0x71, 0xf2, 0x01, 0xb7, 0xb3, 0x08, + 0x42, 0x2d, 0xcd, 0xd6, 0xf8, 0xb8, 0xe9, 0xdf, 0xb9, 0xf7, 0x40, 0x8c, 0x13, 0xb1, 0xd0, 0x0a, + 0x04, 0xcd, 0xae, 0x38, 0x32, 0x9a, 0x1d, 0x37, 0x94, 0x5a, 0xb7, 0x10, 0x22, 0xb2, 0xa4, 0x10, + 0xe0, 0x42, 0x75, 0xac, 0x58, 0x3c, 0xee, 0x13, 0x8b, 0x0e, 0xb6, 0xb7, 0x77, 0x6c, 0xf7, 0x0f, + 0x36, 0x9d, 0x43, 0xa2, 0xe0, 0x08, 0xca, 0xed, 0x00, 0x9c, 0xf6, 0xd4, 0xde, 0xc2, 0x3d, 0x4b, + 0x37, 0x0d, 0x26, 0x4d, 0x5c, 0x52, 0x90, 0xa7, 0x83, 0xbc, 0x7e, 0x8c, 0xa8, 0x3c, 0x05, 0xc1, + 0x7c, 0xb7, 0x8b, 0xb2, 0x10, 0xa3, 0xdf, 0x4d, 0x93, 0xc9, 0x4a, 0x48, 0x71, 0xbe, 0x49, 0x9d, + 0x65, 0xee, 0xd8, 0x2f, 0x69, 0x3d, 0xe7, 0x59, 0x30, 0xf1, 0x9d, 0xbb, 0x04, 0xf1, 0xa2, 0x69, + 0x58, 0xd8, 0xb0, 0xfa, 0x34, 0x02, 0xd9, 0x6e, 0x9b, 0xcd, 0x9b, 0x9c, 0x02, 0xfb, 0x20, 0xcc, + 0xd6, 0xba, 0x5d, 0x8a, 0x19, 0x52, 0xc8, 0x9f, 0x6c, 0x65, 0x17, 0x6a, 0x63, 0xd9, 0x73, 0xe1, + 0x68, 0xec, 0xe1, 0x03, 0x74, 0xf8, 0xf3, 0xdf, 0x25, 0xb8, 0x6b, 0x78, 0x21, 0xdd, 0xc4, 0x07, + 0xd6, 0x51, 0xd7, 0xd1, 0xf3, 0x10, 0xdf, 0xa4, 0x8f, 0xb3, 0x3e, 0x83, 0x0f, 0x50, 0x16, 0xa2, + 0xb8, 0xb5, 0x72, 0xe1, 0xc2, 0xf9, 0x4b, 0x4c, 0xca, 0xd7, 0x66, 0x14, 0x51, 0x80, 0x4e, 0x43, + 0xdc, 0xc2, 0xcd, 0xee, 0xca, 0x85, 0x8b, 0x37, 0xcf, 0x33, 0xb1, 0x5a, 0x9b, 0x51, 0xdc, 0xa2, + 0xd5, 0x18, 0x19, 0xf1, 0x9b, 0x9f, 0x5c, 0x94, 0x0a, 0x61, 0x08, 0x5a, 0xfd, 0xce, 0xd7, 0x4d, + 0x36, 0xfe, 0x34, 0x02, 0x4b, 0x9e, 0x5a, 0x66, 0xb0, 0xf8, 0x3d, 0x08, 0xe7, 0x41, 0x5f, 0xd9, + 0x33, 0x7e, 0x0a, 0x31, 0xc6, 0x12, 0x1d, 0xca, 0xc5, 0xdc, 0xa7, 0x25, 0x48, 0x5e, 0x17, 0x94, + 0xeb, 0xd8, 0x46, 0x97, 0x01, 0x9c, 0x96, 0xc4, 0x52, 0x39, 0xb5, 0x3c, 0xd8, 0xd6, 0xb2, 0x83, + 0xa3, 0x78, 0xc0, 0xd1, 0x13, 0x54, 0x00, 0xbb, 0xa6, 0xc5, 0x9f, 0x88, 0x9a, 0x80, 0xea, 0x00, + 0xa3, 0x87, 0x01, 0x51, 0xad, 0xa6, 0xde, 0x32, 0x6d, 0xdd, 0xd8, 0x55, 0xbb, 0xe6, 0x4b, 0xfc, + 0xe1, 0xbd, 0xa0, 0x22, 0xd3, 0x9a, 0xeb, 0xb4, 0x62, 0x93, 0x94, 0x93, 0x4e, 0xc7, 0x1d, 0x2a, + 0x24, 0x98, 0xd6, 0x5a, 0xad, 0x1e, 0xb6, 0x2c, 0xae, 0xb8, 0xc4, 0x27, 0xba, 0x0c, 0xd1, 0x6e, + 0x7f, 0x5b, 0x15, 0x5a, 0x22, 0xb1, 0x72, 0xd7, 0xa8, 0x35, 0x2f, 0x64, 0x83, 0xaf, 0xfa, 0x48, + 0xb7, 0xbf, 0x4d, 0x24, 0xe5, 0x1e, 0x48, 0x8e, 0xe8, 0x4c, 0xe2, 0x96, 0xdb, 0x0f, 0xfa, 0x1e, + 0x30, 0x1f, 0x81, 0xda, 0xed, 0xe9, 0x66, 0x4f, 0xb7, 0x0f, 0xe8, 0xb1, 0xd2, 0xa0, 0x22, 0x8b, + 0x8a, 0x4d, 0x5e, 0x9e, 0xbb, 0x09, 0xe9, 0x3a, 0x0d, 0x8d, 0xdc, 0x9e, 0x5f, 0x70, 0xfb, 0x27, + 0x4d, 0xee, 0xdf, 0xd8, 0x9e, 0x05, 0x86, 0x7a, 0x76, 0xf6, 0xdf, 0x4b, 0x90, 0x28, 0x90, 0x85, + 0x5b, 0x29, 0x5d, 0x69, 0x6b, 0xbb, 0xe8, 0x3c, 0x1c, 0x2b, 0xac, 0xd7, 0x8a, 0xcf, 0xa8, 0x95, + 0x92, 0x7a, 0x65, 0x3d, 0xef, 0xb9, 0x77, 0x90, 0x3d, 0xfe, 0xea, 0xed, 0x25, 0xe4, 0x81, 0xdd, + 0x32, 0x68, 0x26, 0x00, 0x9d, 0x83, 0x05, 0x3f, 0x4a, 0xbe, 0x50, 0x2f, 0x57, 0x1b, 0xb2, 0x94, + 0x3d, 0xf6, 0xea, 0xed, 0xa5, 0x39, 0x0f, 0x46, 0x7e, 0xdb, 0xc2, 0x86, 0x3d, 0x8c, 0x50, 0xac, + 0x6d, 0x6c, 0x54, 0x1a, 0x72, 0x60, 0x08, 0xa1, 0x68, 0x76, 0x3a, 0xba, 0x8d, 0x1e, 0x84, 0x39, + 0x3f, 0x42, 0xb5, 0xb2, 0x2e, 0x07, 0xb3, 0xe8, 0xd5, 0xdb, 0x4b, 0x29, 0x0f, 0x74, 0x55, 0x6f, + 0x67, 0x63, 0x1f, 0xfc, 0xd1, 0xd3, 0x33, 0x9f, 0xfa, 0xff, 0x4f, 0x4b, 0x85, 0x8d, 0xb1, 0x6b, + 0xee, 0xb1, 0xa3, 0xad, 0x39, 0xbf, 0xdd, 0xfe, 0xca, 0x5d, 0x3e, 0x75, 0xc3, 0x7d, 0x44, 0x8f, + 0x32, 0x9e, 0x76, 0xb9, 0x4d, 0xca, 0x0c, 0x65, 0x0f, 0x77, 0x0f, 0xb2, 0x13, 0x8c, 0x42, 0x76, + 0xa2, 0x62, 0xc8, 0x5d, 0x82, 0xd9, 0x4d, 0xad, 0x67, 0xd7, 0xb1, 0xbd, 0x86, 0xb5, 0x16, 0xee, + 0xf9, 0xfd, 0x87, 0x59, 0xe1, 0x3f, 0x20, 0x08, 0x51, 0x27, 0x81, 0xd9, 0x4f, 0xfa, 0x77, 0x6e, + 0x0f, 0x42, 0xf4, 0x2a, 0x9d, 0xe3, 0x5b, 0x70, 0x0c, 0xe6, 0x5b, 0x10, 0xcb, 0x70, 0x60, 0xf3, + 0xab, 0xc6, 0x49, 0x85, 0x7d, 0xa0, 0xc7, 0x85, 0x87, 0x10, 0x3c, 0xdc, 0x43, 0xe0, 0xcb, 0x8b, + 0xfb, 0x09, 0x6d, 0x88, 0xf2, 0x29, 0x76, 0x3a, 0x22, 0xb9, 0x1d, 0x41, 0x1b, 0x90, 0xee, 0x6a, + 0x3d, 0x9b, 0x3e, 0xcc, 0xb3, 0x47, 0x47, 0xc1, 0x57, 0xf0, 0xe2, 0xb0, 0x3e, 0xf1, 0x0d, 0x96, + 0xb7, 0x32, 0xdb, 0xf5, 0x16, 0xe6, 0xfe, 0x20, 0x04, 0x11, 0xce, 0x8c, 0xa7, 0x20, 0xca, 0xd9, + 0xca, 0xd7, 0xdc, 0xdd, 0xcb, 0xc3, 0x66, 0x76, 0xd9, 0x31, 0x87, 0x9c, 0x9e, 0xc0, 0x41, 0xf7, + 0x43, 0xac, 0xb9, 0xa7, 0xe9, 0x86, 0xaa, 0xb7, 0xb8, 0x73, 0x9c, 0xf8, 0xc2, 0xeb, 0x8b, 0xd1, + 0x22, 0x29, 0xab, 0x94, 0x94, 0x28, 0xad, 0xac, 0xb4, 0x88, 0x4f, 0xb3, 0x87, 0xf5, 0xdd, 0x3d, + 0x9b, 0xeb, 0x0d, 0xfe, 0x85, 0x9e, 0x84, 0x10, 0x11, 0x08, 0x7e, 0xf3, 0x22, 0x3b, 0x14, 0xf5, + 0x38, 0x89, 0xbb, 0x42, 0x8c, 0x34, 0xfc, 0x91, 0xff, 0xb4, 0x28, 0x29, 0x14, 0x03, 0x15, 0x61, + 0xb6, 0xad, 0x59, 0xb6, 0x4a, 0xed, 0x31, 0x69, 0x9e, 0x5d, 0xb9, 0x38, 0x39, 0xcc, 0x10, 0xce, + 0x58, 0xde, 0xf5, 0x04, 0xc1, 0x62, 0x45, 0x2d, 0x74, 0x06, 0x64, 0x4a, 0xa4, 0x49, 0x57, 0x20, + 0xf3, 0x12, 0x23, 0x94, 0xef, 0x29, 0x52, 0xce, 0x16, 0x26, 0xf5, 0x15, 0x4f, 0x41, 0x9c, 0xbe, + 0x3e, 0x45, 0x41, 0xd8, 0xfd, 0xcd, 0x18, 0x29, 0xa0, 0x95, 0x0f, 0x40, 0xda, 0xd5, 0xfa, 0x0c, + 0x24, 0xc6, 0xa8, 0xb8, 0xc5, 0x14, 0xf0, 0x51, 0x58, 0x30, 0xf0, 0xbe, 0xad, 0x0e, 0x42, 0xc7, + 0x29, 0x34, 0x22, 0x75, 0xd7, 0xfd, 0x18, 0xf7, 0x41, 0xaa, 0x29, 0x98, 0xcf, 0x60, 0x81, 0xc2, + 0xce, 0x3a, 0xa5, 0x14, 0xec, 0x24, 0xc4, 0xb4, 0x6e, 0x97, 0x01, 0x24, 0xb8, 0xd6, 0xef, 0x76, + 0x69, 0xd5, 0x59, 0x98, 0xa3, 0x63, 0xec, 0x61, 0xab, 0xdf, 0xb6, 0x39, 0x91, 0x24, 0x85, 0x49, + 0x93, 0x0a, 0x85, 0x95, 0x53, 0xd8, 0x7b, 0x61, 0x16, 0xdf, 0xd2, 0x5b, 0xd8, 0x68, 0x62, 0x06, + 0x37, 0x4b, 0xe1, 0x92, 0xa2, 0x90, 0x02, 0x3d, 0x08, 0x8e, 0x36, 0x57, 0x85, 0xa5, 0x49, 0x31, + 0x7a, 0xa2, 0x3c, 0xcf, 0x8a, 0x73, 0x19, 0x08, 0x95, 0x34, 0x5b, 0x23, 0xee, 0x92, 0xbd, 0xcf, + 0xcc, 0x67, 0x52, 0x21, 0x7f, 0xe6, 0x7e, 0x21, 0x08, 0xa1, 0xeb, 0xa6, 0x8d, 0xd1, 0x63, 0x1e, + 0x57, 0x36, 0x35, 0x4a, 0x9e, 0xeb, 0xfa, 0xae, 0x81, 0x5b, 0x1b, 0xd6, 0xae, 0xe7, 0xc5, 0x57, + 0x57, 0x9c, 0x02, 0x3e, 0x71, 0x5a, 0x80, 0x70, 0xcf, 0xec, 0x1b, 0x2d, 0x71, 0xc1, 0x81, 0x7e, + 0xa0, 0x32, 0xc4, 0x1c, 0x29, 0x09, 0x4d, 0x92, 0x92, 0x34, 0x91, 0x12, 0x22, 0xc3, 0xbc, 0x40, + 0x89, 0x6e, 0x73, 0x61, 0x29, 0x40, 0xdc, 0x51, 0x5e, 0x5c, 0xda, 0xa6, 0x13, 0x58, 0x17, 0x8d, + 0x98, 0x48, 0x67, 0xee, 0x1d, 0xe6, 0x31, 0x89, 0x93, 0x9d, 0x0a, 0xce, 0x3d, 0x9f, 0x58, 0xf1, + 0xd7, 0x67, 0xa3, 0x74, 0x5c, 0xae, 0x58, 0xb1, 0x17, 0x68, 0xef, 0x82, 0xb8, 0xa5, 0xef, 0x1a, + 0xf4, 0xce, 0x10, 0x97, 0x3c, 0xb7, 0x80, 0xd4, 0xba, 0xb7, 0x80, 0x99, 0xa4, 0x79, 0x5e, 0x39, + 0x3f, 0x07, 0xf3, 0xee, 0xfb, 0xe2, 0x2e, 0x15, 0x26, 0x65, 0xc8, 0xa9, 0xaa, 0x8b, 0x9a, 0xdc, + 0xaf, 0x4a, 0x10, 0xe1, 0x16, 0xcb, 0x9d, 0x06, 0x69, 0xf4, 0x34, 0x04, 0xc6, 0x4d, 0x43, 0xf0, + 0xce, 0xa7, 0x21, 0x0f, 0xe0, 0x74, 0xd3, 0xe2, 0x6f, 0x8c, 0x8e, 0x70, 0xab, 0x58, 0x17, 0xeb, + 0xfa, 0x2e, 0x5f, 0xf7, 0x1e, 0xa4, 0xdc, 0xef, 0x4a, 0xc4, 0xc3, 0xe7, 0xf5, 0x28, 0x0f, 0xb3, + 0xa2, 0x5f, 0xea, 0x4e, 0x5b, 0xdb, 0xe5, 0xa2, 0x78, 0xf7, 0xd8, 0xce, 0x11, 0x2b, 0xac, 0x24, + 0x78, 0x7f, 0xa8, 0x3f, 0x31, 0x72, 0x5a, 0x03, 0x63, 0xa6, 0xd5, 0x27, 0x47, 0xc1, 0x3b, 0x93, + 0x23, 0xdf, 0x8c, 0x87, 0x06, 0x66, 0x3c, 0xf7, 0x7b, 0x12, 0x7f, 0xdd, 0xbc, 0xc5, 0x2e, 0x48, + 0xfd, 0xaf, 0x9a, 0xaa, 0x17, 0xb8, 0x6c, 0xb5, 0x70, 0x4b, 0x1d, 0x9a, 0xb3, 0x7b, 0x87, 0x29, + 0xfa, 0xfb, 0xec, 0xce, 0x1d, 0x12, 0x54, 0xea, 0xee, 0x1c, 0x7e, 0x36, 0x00, 0x73, 0x43, 0xf0, + 0x7f, 0xf3, 0xe6, 0xd2, 0xbf, 0x7a, 0xc3, 0x53, 0xae, 0xde, 0xc8, 0xd8, 0xd5, 0xfb, 0x99, 0x00, + 0x4d, 0x00, 0x74, 0x4d, 0x4b, 0x6b, 0xff, 0x75, 0xe8, 0xde, 0x53, 0x10, 0xef, 0x9a, 0x6d, 0x95, + 0xd5, 0xb0, 0x2b, 0x66, 0xb1, 0xae, 0xd9, 0x56, 0x86, 0xc4, 0x2c, 0xfc, 0x36, 0x29, 0xe6, 0xc8, + 0xdb, 0x30, 0x09, 0xd1, 0xc1, 0x05, 0xd5, 0x83, 0x24, 0x63, 0x05, 0xf7, 0x9a, 0x1e, 0x25, 0x3c, + 0xa0, 0x6e, 0x98, 0x34, 0xec, 0xe5, 0xb1, 0x6e, 0x33, 0x48, 0x85, 0xc3, 0x11, 0x0c, 0xe6, 0x64, + 0x8c, 0xca, 0x1c, 0x79, 0x35, 0x96, 0xc2, 0xe1, 0x72, 0xdf, 0x2f, 0x01, 0xac, 0x13, 0xce, 0xd2, + 0xf1, 0x12, 0x7f, 0xc7, 0xa2, 0x5d, 0x50, 0x7d, 0x2d, 0x9f, 0x1e, 0x37, 0x69, 0xbc, 0xfd, 0xa4, + 0xe5, 0xed, 0x77, 0x11, 0x66, 0x5d, 0xd9, 0xb6, 0xb0, 0xe8, 0xcc, 0xe9, 0x43, 0xa2, 0xd2, 0x3a, + 0xb6, 0x95, 0xe4, 0x2d, 0xcf, 0x57, 0xee, 0x1f, 0x4b, 0x10, 0xa7, 0x7d, 0xda, 0xc0, 0xb6, 0xe6, + 0x9b, 0x43, 0xe9, 0xce, 0xe7, 0xf0, 0x6e, 0x00, 0x46, 0xc6, 0xd2, 0x5f, 0xc6, 0x5c, 0xb2, 0xe2, + 0xb4, 0xa4, 0xae, 0xbf, 0x8c, 0xd1, 0x45, 0x87, 0xe1, 0xc1, 0xc3, 0x19, 0x2e, 0xa2, 0x56, 0xce, + 0xf6, 0x13, 0x10, 0xa5, 0xaf, 0x47, 0xec, 0x5b, 0x3c, 0x10, 0x8d, 0x18, 0xfd, 0x4e, 0x63, 0xdf, + 0xca, 0xbd, 0x08, 0xd1, 0xc6, 0x3e, 0xcb, 0x27, 0x9e, 0x82, 0x78, 0xcf, 0x34, 0xb9, 0xf7, 0xc7, + 0xbc, 0xee, 0x18, 0x29, 0xa0, 0xce, 0x8e, 0xc8, 0xa1, 0x05, 0xdc, 0x1c, 0x9a, 0x9b, 0x04, 0x0c, + 0x4e, 0x95, 0x04, 0x24, 0xd1, 0xe7, 0xac, 0x6f, 0x25, 0xa1, 0x87, 0xe1, 0x44, 0xbd, 0x72, 0xb5, + 0x5a, 0x2e, 0xa9, 0x1b, 0xf5, 0xab, 0x03, 0x77, 0xfc, 0xb3, 0xe9, 0x57, 0x6f, 0x2f, 0x25, 0x78, + 0xd8, 0x39, 0x0e, 0x7a, 0x53, 0x29, 0x5f, 0xaf, 0x35, 0xca, 0xb2, 0xc4, 0xa0, 0x37, 0x7b, 0xf8, + 0x96, 0x69, 0xb3, 0x9f, 0xbe, 0x79, 0x14, 0x4e, 0x8e, 0x80, 0x76, 0x82, 0xcf, 0xb9, 0x57, 0x6f, + 0x2f, 0xcd, 0x6e, 0xf6, 0x30, 0x93, 0x32, 0x8a, 0xb1, 0x0c, 0x99, 0x61, 0x8c, 0xda, 0x66, 0xad, + 0x9e, 0x5f, 0x97, 0x97, 0xb2, 0xf2, 0xab, 0xb7, 0x97, 0x92, 0x42, 0x65, 0x10, 0xf8, 0xaf, 0x7f, + 0xf4, 0xf9, 0x9d, 0x31, 0x5f, 0xd6, 0x98, 0xc5, 0x75, 0x5d, 0xad, 0xa7, 0x75, 0x8e, 0x1a, 0x7e, + 0x4e, 0x38, 0xae, 0x91, 0xfb, 0x74, 0x00, 0xd2, 0x4e, 0x70, 0xb3, 0x49, 0x5b, 0x40, 0x8f, 0x79, + 0x33, 0x7e, 0x89, 0xb1, 0xb6, 0x83, 0x41, 0x8b, 0x84, 0xe0, 0xbb, 0x21, 0x26, 0x9c, 0x64, 0xbe, + 0xa8, 0x96, 0x46, 0xd8, 0x37, 0x0e, 0xc1, 0x51, 0x1d, 0x0c, 0xf4, 0x34, 0xc4, 0x9d, 0x25, 0xe6, + 0xbc, 0x19, 0x3e, 0x7e, 0x4d, 0x72, 0x7c, 0x17, 0x07, 0x5d, 0x72, 0xc3, 0xb8, 0xd0, 0xb8, 0xc0, + 0xf0, 0x3a, 0x03, 0xe0, 0xc8, 0x4e, 0x08, 0xf7, 0x28, 0x84, 0xb4, 0xed, 0xa6, 0xce, 0x15, 0xf0, + 0x5d, 0xc3, 0x78, 0xf9, 0x42, 0xb1, 0xc2, 0x91, 0x28, 0x64, 0xae, 0xc2, 0x93, 0x29, 0x9c, 0x5f, + 0xf4, 0x15, 0xd6, 0x7d, 0x95, 0xc5, 0xc2, 0xcc, 0xbb, 0x88, 0x75, 0xb4, 0xfd, 0x02, 0x0d, 0x87, + 0x4f, 0x40, 0x94, 0x54, 0xee, 0xf2, 0xe7, 0xd0, 0x82, 0x4a, 0xa4, 0xa3, 0xed, 0x5f, 0xd5, 0xac, + 0x6b, 0xa1, 0x58, 0x50, 0x0e, 0xe5, 0x7e, 0x92, 0x78, 0x2a, 0x3e, 0xae, 0xa0, 0x87, 0x00, 0x11, + 0x0c, 0x6d, 0x17, 0xab, 0x64, 0xe9, 0x52, 0xf6, 0x0a, 0xba, 0xe9, 0x8e, 0xb6, 0x9f, 0xdf, 0xc5, + 0xd5, 0x7e, 0x87, 0x76, 0xc0, 0x42, 0x1b, 0x20, 0x0b, 0x60, 0x31, 0xb3, 0x9c, 0xfd, 0x27, 0x87, + 0x7f, 0x44, 0x86, 0x03, 0x30, 0x03, 0xf0, 0x1a, 0x31, 0x00, 0x29, 0x46, 0xcf, 0x39, 0xa0, 0xe3, + 0x1b, 0x4a, 0xd0, 0x3f, 0x94, 0xdc, 0xd3, 0x90, 0x1e, 0x98, 0x01, 0x94, 0x83, 0x59, 0x9e, 0xb1, + 0xa2, 0x87, 0x1f, 0x58, 0x84, 0x13, 0x57, 0x12, 0x2c, 0x33, 0x45, 0x0f, 0x83, 0xac, 0xc6, 0x7e, + 0xf1, 0x13, 0x8b, 0x12, 0xdd, 0xf6, 0x79, 0x08, 0x66, 0x7d, 0x73, 0x20, 0xb2, 0xc8, 0x92, 0x9b, + 0x45, 0x76, 0x81, 0x5f, 0x80, 0x24, 0x51, 0x40, 0xb8, 0xc5, 0x61, 0xef, 0x87, 0x34, 0x53, 0x90, + 0x83, 0xbc, 0x66, 0x0e, 0xcf, 0x86, 0x60, 0x78, 0x4e, 0x78, 0x40, 0x7e, 0xb6, 0x27, 0x04, 0xd4, + 0x55, 0xcd, 0xca, 0xd5, 0x00, 0xdc, 0x49, 0x45, 0x79, 0xb8, 0x9b, 0x28, 0x0f, 0xef, 0x61, 0x5d, + 0xfe, 0xcc, 0xb4, 0xcf, 0x63, 0xcc, 0x12, 0x20, 0xf7, 0x40, 0x2e, 0x7b, 0x6c, 0x7a, 0x8d, 0x42, + 0x14, 0x9e, 0xfd, 0xd4, 0x17, 0x4e, 0x4b, 0x5f, 0x1f, 0x5d, 0xf0, 0x1f, 0x6e, 0xc0, 0x29, 0x4f, + 0x25, 0x11, 0x40, 0x5f, 0x22, 0x2a, 0xed, 0x91, 0x57, 0x52, 0x39, 0x29, 0xa1, 0x74, 0x68, 0xfe, + 0x37, 0x7b, 0xb8, 0xda, 0x99, 0x9c, 0x6d, 0x9a, 0x9c, 0xef, 0x1a, 0x9d, 0x94, 0xff, 0x95, 0x38, + 0x44, 0x15, 0xfc, 0xbe, 0x3e, 0xb6, 0x6c, 0xb4, 0x02, 0x21, 0xdc, 0xdc, 0x33, 0x47, 0xe5, 0x40, + 0xc9, 0x00, 0x97, 0x39, 0x5c, 0xb9, 0xb9, 0x67, 0xae, 0xcd, 0x28, 0x14, 0x16, 0x5d, 0x80, 0xf0, + 0x4e, 0xbb, 0xcf, 0xd3, 0x57, 0x03, 0x3a, 0xcb, 0x8b, 0x74, 0x85, 0x00, 0xad, 0xcd, 0x28, 0x0c, + 0x9a, 0x34, 0x45, 0x7f, 0x17, 0x2c, 0x78, 0x78, 0x53, 0x15, 0x63, 0x87, 0x36, 0x45, 0x60, 0x51, + 0x01, 0x40, 0x37, 0x74, 0x5b, 0xa5, 0xa9, 0x1d, 0xae, 0x35, 0xee, 0x19, 0x8f, 0xa9, 0xdb, 0x34, + 0x19, 0xb4, 0x36, 0xa3, 0xc4, 0x75, 0xf1, 0x41, 0xba, 0xfb, 0xbe, 0x3e, 0xee, 0x1d, 0x70, 0x6f, + 0x6d, 0x6c, 0x77, 0x9f, 0x25, 0x40, 0xa4, 0xbb, 0x14, 0x9a, 0x28, 0x59, 0xf6, 0xee, 0xbc, 0xbd, + 0xcf, 0x7f, 0x4d, 0x65, 0x71, 0x1c, 0x26, 0x7d, 0x7c, 0xbe, 0xb1, 0xbf, 0x36, 0xa3, 0x44, 0x9b, + 0xec, 0x4f, 0xf4, 0xa4, 0xe3, 0x82, 0x25, 0x86, 0xbd, 0x1e, 0x1f, 0x2e, 0x4b, 0xfb, 0xcc, 0x08, + 0x57, 0x0c, 0x55, 0x21, 0xd5, 0xd6, 0x2d, 0x5b, 0xb5, 0x0c, 0xad, 0x6b, 0xed, 0x99, 0xb6, 0x78, + 0xf8, 0xf9, 0xbe, 0x71, 0x14, 0xd6, 0x75, 0xcb, 0xae, 0x0b, 0xe0, 0xb5, 0x19, 0x65, 0xb6, 0xed, + 0x2d, 0x20, 0xf4, 0xcc, 0x9d, 0x1d, 0xdc, 0x73, 0x08, 0xd2, 0x3c, 0xcb, 0x21, 0xf4, 0x6a, 0x04, + 0x5a, 0xe0, 0x13, 0x7a, 0xa6, 0xb7, 0x00, 0x7d, 0x03, 0xcc, 0xb7, 0x4d, 0xad, 0xe5, 0x90, 0x53, + 0x9b, 0x7b, 0x7d, 0xe3, 0x26, 0x4d, 0xca, 0x24, 0x56, 0x1e, 0x1c, 0xdb, 0x49, 0x53, 0x6b, 0x09, + 0x12, 0x45, 0x82, 0xb0, 0x36, 0xa3, 0xcc, 0xb5, 0x07, 0x0b, 0xd1, 0x7b, 0x61, 0x41, 0xeb, 0x76, + 0xdb, 0x07, 0x83, 0xd4, 0xd3, 0x94, 0xfa, 0xd9, 0x71, 0xd4, 0xf3, 0x04, 0x67, 0x90, 0x3c, 0xd2, + 0x86, 0x4a, 0x51, 0x03, 0xe4, 0x6e, 0x0f, 0xd3, 0xfb, 0x6e, 0x5d, 0xee, 0x65, 0xd0, 0x57, 0x95, + 0x13, 0x2b, 0x0f, 0x8c, 0xa3, 0xbd, 0xc9, 0xe0, 0x85, 0x53, 0xb2, 0x36, 0xa3, 0xa4, 0xbb, 0xfe, + 0x22, 0x46, 0xd5, 0x6c, 0x62, 0xfa, 0x04, 0x3d, 0xa7, 0x3a, 0x37, 0x89, 0x2a, 0x85, 0xf7, 0x53, + 0xf5, 0x15, 0xa1, 0x32, 0x24, 0x58, 0x28, 0xaa, 0x12, 0x65, 0x48, 0x9f, 0xf6, 0x4f, 0xac, 0xe4, + 0xc6, 0xae, 0x50, 0x0a, 0x7a, 0xdd, 0xb4, 0xf1, 0xda, 0x8c, 0x02, 0xd8, 0xf9, 0x42, 0x1a, 0x1c, + 0xa3, 0xcf, 0x52, 0x1f, 0xa8, 0x7e, 0xc5, 0x9b, 0x99, 0xa7, 0x04, 0x1f, 0x1a, 0x47, 0x90, 0xfe, + 0xdc, 0xd3, 0xc1, 0x75, 0xaf, 0x1e, 0x5e, 0x9b, 0x51, 0xe6, 0x6f, 0x0d, 0x17, 0x13, 0x11, 0xdb, + 0xd1, 0x0d, 0xad, 0xad, 0xbf, 0x8c, 0x99, 0x09, 0xa5, 0xbf, 0xf2, 0x70, 0x88, 0x88, 0x5d, 0xe1, + 0xd0, 0xd4, 0xb0, 0x12, 0x11, 0xdb, 0xf1, 0x16, 0x14, 0xa2, 0xfc, 0xa4, 0xae, 0xf3, 0x5c, 0x6b, + 0x54, 0x8e, 0xb1, 0x47, 0xc5, 0xaf, 0x85, 0x62, 0x20, 0x27, 0x72, 0x0f, 0x40, 0xc2, 0xa3, 0x98, + 0x50, 0x06, 0xa2, 0xfc, 0xa4, 0x8e, 0x38, 0xf3, 0xcb, 0x3f, 0x73, 0x29, 0x48, 0x7a, 0x95, 0x51, + 0xee, 0x23, 0x92, 0x83, 0x49, 0xdf, 0x4e, 0xc9, 0xf8, 0x33, 0xd2, 0x71, 0xd7, 0x53, 0xb9, 0x57, + 0x98, 0x36, 0x51, 0xcf, 0xb6, 0x5f, 0x93, 0xb4, 0x90, 0x5b, 0x56, 0xb4, 0x08, 0x89, 0xee, 0x4a, + 0xd7, 0x01, 0x09, 0x52, 0x10, 0xe8, 0xae, 0x74, 0x05, 0xc0, 0x3d, 0x90, 0x24, 0xe3, 0x56, 0xbd, + 0xfe, 0x52, 0x5c, 0x49, 0x90, 0x32, 0x0e, 0x92, 0xfb, 0xcd, 0x00, 0xc8, 0x83, 0x0a, 0xcc, 0x49, + 0x55, 0x4b, 0x47, 0x4e, 0x55, 0x9f, 0x1c, 0x4c, 0x92, 0xbb, 0x79, 0xf1, 0x75, 0x90, 0xdd, 0xf4, + 0x2e, 0x33, 0x35, 0xe3, 0xfd, 0xbf, 0x01, 0x47, 0x55, 0x49, 0x37, 0x07, 0x3c, 0xd7, 0x2b, 0xbe, + 0xcd, 0x4a, 0xf1, 0xc3, 0x99, 0x83, 0x13, 0xee, 0x38, 0x31, 0x5b, 0xdd, 0x96, 0x66, 0x63, 0x91, + 0x1f, 0xf3, 0xec, 0x5b, 0xde, 0x0f, 0x69, 0xad, 0xdb, 0x55, 0x2d, 0x5b, 0xb3, 0x31, 0xf7, 0x35, + 0x58, 0xe6, 0x61, 0x56, 0xeb, 0x76, 0xe9, 0xef, 0x8c, 0x31, 0x5f, 0xe3, 0x3e, 0x48, 0x11, 0x9d, + 0xae, 0x6b, 0x6d, 0xe1, 0x2a, 0x44, 0x98, 0x4b, 0xc2, 0x4b, 0x99, 0x77, 0x90, 0x6b, 0x39, 0x33, + 0x4e, 0xf5, 0xb9, 0x13, 0x53, 0x49, 0x9e, 0x98, 0x0a, 0xf1, 0x37, 0x6d, 0x18, 0x7f, 0xc4, 0xf3, + 0x43, 0xa3, 0x37, 0x0d, 0x16, 0x68, 0xfc, 0x75, 0x8b, 0x25, 0x4b, 0x62, 0x0a, 0xfb, 0xc8, 0x29, + 0x90, 0xf2, 0xeb, 0x7e, 0x94, 0x82, 0x80, 0xbd, 0xcf, 0x5b, 0x09, 0xd8, 0xfb, 0xc4, 0xd3, 0xf5, + 0x3c, 0x23, 0x38, 0x6c, 0xed, 0x38, 0x9e, 0x9b, 0xeb, 0xc8, 0xa5, 0x61, 0xd6, 0x67, 0x13, 0x72, + 0xc7, 0x61, 0x61, 0x94, 0x8a, 0xcf, 0xed, 0x39, 0xe5, 0x3e, 0x55, 0x8d, 0x2e, 0x40, 0xcc, 0xd1, + 0xf1, 0x23, 0xa2, 0x63, 0xda, 0xac, 0x00, 0x56, 0x1c, 0x50, 0x5f, 0x3a, 0x3f, 0xe0, 0x4b, 0xe7, + 0xe7, 0xbe, 0x19, 0x32, 0xe3, 0xf4, 0xf7, 0x40, 0x92, 0x2f, 0xe4, 0x30, 0xec, 0x38, 0x44, 0xf8, + 0xab, 0x79, 0x01, 0xba, 0x81, 0xc5, 0xbf, 0x08, 0x23, 0x99, 0x2e, 0x0f, 0xb2, 0x7d, 0x2d, 0xfa, + 0x91, 0x53, 0xe1, 0xe4, 0x58, 0x1d, 0x3e, 0x7e, 0x2b, 0x8c, 0x11, 0xe2, 0x5b, 0x61, 0x4d, 0xd1, + 0x1d, 0x8b, 0x8e, 0x55, 0x1c, 0x64, 0x61, 0x5f, 0xb9, 0xd7, 0x82, 0x70, 0x7c, 0xb4, 0x26, 0x47, + 0x4b, 0x90, 0x24, 0x7e, 0xab, 0xed, 0x77, 0x71, 0xa1, 0xa3, 0xed, 0x37, 0xb8, 0x7f, 0xcb, 0xb7, + 0x12, 0x02, 0xce, 0x56, 0x02, 0xda, 0x82, 0xb9, 0xb6, 0xd9, 0xd4, 0xda, 0xaa, 0x67, 0x2b, 0x87, + 0x2f, 0xa2, 0x7b, 0x87, 0x98, 0xed, 0x4f, 0x19, 0x12, 0x85, 0xc3, 0xe5, 0x3f, 0x4d, 0x69, 0xac, + 0x3b, 0xbb, 0x3e, 0xa8, 0x04, 0x89, 0x8e, 0x6e, 0x6d, 0xe3, 0x3d, 0xed, 0x96, 0x6e, 0xf6, 0xf8, + 0x6a, 0x1a, 0x16, 0x9a, 0x0d, 0x17, 0x46, 0xec, 0x30, 0x79, 0xd0, 0x3c, 0x53, 0x12, 0x1e, 0xb9, + 0xf1, 0x15, 0x39, 0xb2, 0x36, 0x19, 0xb7, 0x87, 0x14, 0x1d, 0xbb, 0x87, 0x34, 0x6a, 0xc3, 0x26, + 0x36, 0x7a, 0xc3, 0xe6, 0x83, 0xde, 0xa9, 0xf1, 0xdb, 0xbe, 0xa1, 0x3d, 0x1c, 0x54, 0x87, 0x05, + 0x8e, 0xdf, 0xf2, 0xf1, 0x7e, 0xc4, 0x51, 0x07, 0xb6, 0xbe, 0x06, 0x79, 0x8e, 0x04, 0xfa, 0x78, + 0xb6, 0x07, 0xef, 0x8c, 0xed, 0x62, 0x13, 0x35, 0xe4, 0xd9, 0x44, 0xfd, 0xdf, 0x6c, 0x2a, 0xde, + 0x1f, 0x84, 0xb9, 0x21, 0x47, 0x62, 0xe4, 0xee, 0xf0, 0xb8, 0x8c, 0xac, 0x18, 0x58, 0xf0, 0xc8, + 0x03, 0xe3, 0x73, 0x1d, 0x9a, 0x3c, 0xd7, 0xe1, 0xb7, 0x71, 0xae, 0x23, 0x77, 0x36, 0xd7, 0x5f, + 0xd7, 0x59, 0xf8, 0x98, 0x04, 0xd9, 0xf1, 0xde, 0xd7, 0xc8, 0xe9, 0x38, 0xd2, 0x06, 0xc2, 0x38, + 0x1b, 0x77, 0x1f, 0xa4, 0x06, 0x7c, 0x43, 0x26, 0xca, 0xb3, 0xbe, 0x28, 0x3c, 0xf7, 0x81, 0xa0, + 0x63, 0x78, 0x7c, 0x0e, 0xdc, 0x88, 0xd5, 0xfa, 0x2c, 0xcc, 0xb7, 0x70, 0x53, 0x6f, 0xdd, 0xe9, + 0x62, 0x9d, 0xe3, 0xd8, 0xff, 0x67, 0xad, 0x0e, 0x4b, 0xc9, 0xf7, 0x01, 0xc4, 0x14, 0x6c, 0x75, + 0x89, 0x3f, 0x86, 0x0a, 0x10, 0xc7, 0xfb, 0x4d, 0xdc, 0xb5, 0xdd, 0x43, 0x15, 0xa3, 0x42, 0x04, + 0x06, 0x5d, 0x16, 0x90, 0x24, 0x40, 0x76, 0xd0, 0xd0, 0x63, 0x3c, 0x07, 0x30, 0x3e, 0x9c, 0xe7, + 0xe8, 0xde, 0x24, 0xc0, 0x45, 0x91, 0x04, 0x08, 0x8e, 0x8d, 0x6f, 0x19, 0xd6, 0x40, 0x16, 0xe0, + 0x31, 0x9e, 0x05, 0x08, 0x4d, 0x68, 0xcc, 0x97, 0x06, 0x28, 0xfa, 0xd2, 0x00, 0x91, 0x09, 0xc3, + 0x1c, 0x93, 0x07, 0xb8, 0x28, 0xf2, 0x00, 0xd1, 0x09, 0x3d, 0x1e, 0x48, 0x04, 0x3c, 0xe5, 0x49, + 0x04, 0xc4, 0x87, 0xb3, 0xad, 0x3e, 0xd4, 0x11, 0x99, 0x80, 0x4b, 0x4e, 0x26, 0x20, 0x39, 0x36, + 0x8b, 0xc0, 0x91, 0x07, 0x53, 0x01, 0xb5, 0xa1, 0x54, 0xc0, 0x2c, 0xff, 0x11, 0xe8, 0x71, 0x24, + 0x26, 0xe4, 0x02, 0x6a, 0x43, 0xb9, 0x80, 0xd4, 0x04, 0x82, 0x13, 0x92, 0x01, 0xdf, 0x38, 0x3a, + 0x19, 0x30, 0x3e, 0x5c, 0xe7, 0xdd, 0x9c, 0x2e, 0x1b, 0xa0, 0x8e, 0xc9, 0x06, 0xc8, 0x63, 0x23, + 0x57, 0x46, 0x7e, 0xea, 0x74, 0xc0, 0xd6, 0x88, 0x74, 0x00, 0x0b, 0xdc, 0xcf, 0x8c, 0x25, 0x3e, + 0x45, 0x3e, 0x60, 0x6b, 0x44, 0x3e, 0x00, 0x4d, 0x24, 0x3b, 0x31, 0x21, 0x70, 0xc5, 0x9f, 0x10, + 0x98, 0x1f, 0xe3, 0x75, 0xba, 0xab, 0x7d, 0x4c, 0x46, 0x60, 0x7b, 0x5c, 0x46, 0x60, 0x81, 0xff, + 0xb8, 0xc4, 0x38, 0x8a, 0x47, 0x48, 0x09, 0xd4, 0x86, 0x52, 0x02, 0xc7, 0x26, 0x48, 0xda, 0xf4, + 0x39, 0x01, 0xf6, 0x73, 0x63, 0xec, 0x87, 0xc6, 0x40, 0x4e, 0x5c, 0x0b, 0xc5, 0x12, 0x72, 0x32, + 0xf7, 0x20, 0xf1, 0x60, 0x06, 0xf4, 0x1c, 0x89, 0x15, 0x70, 0xaf, 0x67, 0xf6, 0xc4, 0x1d, 0x0b, + 0xfa, 0x91, 0x3b, 0x43, 0x62, 0x44, 0x57, 0xa7, 0x1d, 0x92, 0x3f, 0xa0, 0x31, 0x99, 0x47, 0x8f, + 0xe5, 0x7e, 0x51, 0x72, 0x71, 0x69, 0x06, 0xc1, 0x1b, 0x5f, 0xc6, 0x79, 0x7c, 0xe9, 0xc9, 0x2a, + 0x04, 0xfc, 0x59, 0x85, 0x45, 0x48, 0x90, 0x58, 0x6b, 0x20, 0x61, 0xa0, 0x75, 0x9d, 0x84, 0x81, + 0x38, 0x40, 0xc5, 0x72, 0x0f, 0xdc, 0x2c, 0xb1, 0xdd, 0xc4, 0xb4, 0x73, 0x98, 0x8c, 0x85, 0xba, + 0xe8, 0x11, 0x98, 0xf7, 0xc0, 0x3a, 0x31, 0x1c, 0x8b, 0x9e, 0x65, 0x07, 0x3a, 0xcf, 0x83, 0xb9, + 0x7f, 0x2a, 0xb9, 0x1c, 0x72, 0x33, 0x0d, 0xa3, 0x92, 0x02, 0xd2, 0xdb, 0x94, 0x14, 0x08, 0xdc, + 0x71, 0x52, 0xc0, 0x1b, 0x93, 0x06, 0xfd, 0x31, 0xe9, 0x7f, 0x93, 0xdc, 0x39, 0x71, 0x42, 0xfc, + 0xa6, 0xd9, 0xc2, 0x3c, 0x4a, 0xa4, 0x7f, 0x13, 0x97, 0xa4, 0x6d, 0x8a, 0x5f, 0x89, 0x22, 0x7f, + 0x12, 0x28, 0xc7, 0xf0, 0xc4, 0xb9, 0x5d, 0x71, 0x02, 0xcc, 0xb0, 0xf7, 0x1e, 0x07, 0xbf, 0xdc, + 0x10, 0x71, 0x2f, 0x37, 0x38, 0x57, 0xc7, 0xa3, 0x9e, 0xab, 0xe3, 0xe8, 0x49, 0x88, 0xd3, 0x64, + 0xbf, 0x6a, 0x76, 0xc5, 0x0f, 0x6e, 0x9f, 0x1a, 0x7f, 0xb1, 0xc1, 0xa2, 0x47, 0xae, 0xd9, 0x65, + 0x08, 0xd7, 0xe3, 0x88, 0xfb, 0x3c, 0x8e, 0xbb, 0x20, 0x4e, 0x7a, 0xcf, 0x7e, 0x71, 0x12, 0xf8, + 0xbb, 0x03, 0xa2, 0x20, 0xf7, 0x53, 0x01, 0x48, 0x0f, 0x18, 0x9a, 0x91, 0x63, 0x1f, 0xb5, 0x8d, + 0x3c, 0x1d, 0x3f, 0x4e, 0x03, 0xec, 0x6a, 0x96, 0xfa, 0x92, 0x66, 0xd8, 0xfc, 0x57, 0xe2, 0x83, + 0x8a, 0xa7, 0x04, 0x65, 0x21, 0x46, 0xbe, 0xfa, 0x16, 0xff, 0x9d, 0xf8, 0xa0, 0xe2, 0x7c, 0xa3, + 0x35, 0x88, 0xe0, 0x5b, 0xf4, 0xf1, 0x64, 0xf6, 0x23, 0x21, 0xc7, 0x87, 0xc3, 0x61, 0x52, 0x5d, + 0xc8, 0x90, 0xc9, 0xfe, 0xd2, 0xeb, 0x8b, 0x32, 0x83, 0x7e, 0xd8, 0xb9, 0xcc, 0xa6, 0x70, 0x7c, + 0x3f, 0x17, 0x62, 0x03, 0x5c, 0xa0, 0x79, 0xc0, 0xa4, 0x08, 0xef, 0x09, 0x4f, 0xd9, 0x19, 0x6f, + 0x65, 0xb6, 0x83, 0x3b, 0x5d, 0xd3, 0x6c, 0xab, 0x6c, 0x8d, 0xe7, 0x21, 0xe5, 0xb7, 0xab, 0xec, + 0x47, 0x9d, 0x6d, 0x4d, 0x37, 0x54, 0x9f, 0x13, 0x9c, 0x64, 0x85, 0x6c, 0x4d, 0x79, 0x5f, 0xc6, + 0xce, 0x6d, 0xc2, 0xb1, 0x91, 0x76, 0x15, 0x3d, 0x01, 0x71, 0xd7, 0x24, 0xb3, 0x63, 0xfa, 0x87, + 0x64, 0x5a, 0x5c, 0xd8, 0xdc, 0x2f, 0x4b, 0x2e, 0x49, 0x7f, 0xee, 0xa6, 0x0c, 0x11, 0x76, 0x66, + 0x92, 0x9f, 0x8f, 0x79, 0x64, 0x3a, 0x8b, 0xbc, 0xcc, 0x0e, 0x54, 0x2a, 0x1c, 0x39, 0xf7, 0x5e, + 0x88, 0xb0, 0x12, 0x94, 0x80, 0xa8, 0xef, 0xb1, 0xfc, 0x7c, 0xb1, 0x58, 0xde, 0x14, 0x8f, 0x1f, + 0x17, 0xe8, 0x43, 0xf4, 0xa4, 0x58, 0x29, 0x5f, 0x2b, 0x17, 0x1b, 0x72, 0x10, 0xcd, 0xc1, 0x2c, + 0xfb, 0x9b, 0x3f, 0x69, 0x2f, 0x87, 0x3c, 0x45, 0xf5, 0x72, 0xb5, 0x54, 0x56, 0xe4, 0x70, 0xee, + 0x3c, 0x9c, 0x1c, 0x6b, 0xc3, 0xdd, 0xc4, 0x8c, 0xe4, 0x49, 0xcc, 0xe4, 0x5e, 0x0b, 0x90, 0xa0, + 0x66, 0x9c, 0x61, 0x46, 0xd7, 0x06, 0x06, 0xbe, 0x72, 0x04, 0xab, 0x3e, 0x30, 0x7a, 0x12, 0xc7, + 0xf4, 0xf0, 0x0e, 0xb6, 0x9b, 0x7b, 0xcc, 0x51, 0x60, 0x1a, 0x68, 0x56, 0x99, 0xe5, 0xa5, 0x14, + 0xc9, 0x62, 0x60, 0x2f, 0xe2, 0xa6, 0xad, 0x32, 0x21, 0xb2, 0x68, 0x30, 0x11, 0x27, 0x60, 0xa4, + 0xb4, 0xce, 0x0a, 0x73, 0xdf, 0x7c, 0x24, 0x5e, 0xc6, 0x21, 0xac, 0x94, 0x1b, 0xca, 0x0d, 0xf6, + 0xd3, 0xed, 0xf4, 0x4f, 0xb5, 0x5e, 0xcd, 0x6f, 0xd6, 0xd7, 0x6a, 0x84, 0x97, 0xf3, 0x90, 0x16, + 0xbc, 0x14, 0x85, 0xe1, 0xdc, 0x43, 0x70, 0x62, 0x8c, 0x57, 0x31, 0xe2, 0x10, 0xeb, 0x27, 0x25, + 0x2f, 0xb4, 0xdf, 0x33, 0xa8, 0x41, 0xc4, 0xb2, 0x35, 0xbb, 0x6f, 0x71, 0x26, 0x3e, 0x31, 0xad, + 0x9b, 0xb1, 0x2c, 0xfe, 0xa8, 0x53, 0x74, 0x85, 0x93, 0xc9, 0x5d, 0x80, 0x94, 0xbf, 0x66, 0x3c, + 0x0f, 0x5c, 0x21, 0x0a, 0xe4, 0x2e, 0x03, 0x1a, 0xf6, 0x3e, 0x46, 0x84, 0x97, 0xd2, 0xa8, 0xf0, + 0xf2, 0xc7, 0x24, 0x38, 0x75, 0x88, 0xa7, 0x81, 0x9e, 0x1d, 0x18, 0xe4, 0xa5, 0xa3, 0xf8, 0x29, + 0xcb, 0xac, 0x6c, 0x60, 0x98, 0x8f, 0x41, 0xd2, 0x5b, 0x3e, 0xdd, 0x20, 0xbf, 0x14, 0x70, 0x17, + 0xb1, 0x3f, 0x0e, 0x76, 0x55, 0xa0, 0xf4, 0x35, 0xaa, 0xc0, 0x77, 0x03, 0xd8, 0xfb, 0xe2, 0x14, + 0x35, 0xb7, 0xa3, 0x77, 0x8f, 0xc8, 0x2f, 0xe2, 0x66, 0x63, 0x9f, 0x2f, 0x82, 0xb8, 0xcd, 0xff, + 0xb2, 0x50, 0xdd, 0x9b, 0x14, 0xe8, 0x53, 0x1b, 0x6b, 0xf1, 0x80, 0x79, 0x5a, 0x63, 0xec, 0x26, + 0x0f, 0x58, 0xb1, 0x85, 0x6e, 0xc0, 0x89, 0x01, 0x47, 0xc1, 0x21, 0x1d, 0x9a, 0xd6, 0x5f, 0x38, + 0xe6, 0xf7, 0x17, 0x04, 0x69, 0xaf, 0xb5, 0x0f, 0xfb, 0xad, 0xfd, 0x0d, 0x00, 0x37, 0x39, 0xe0, + 0x1e, 0xfb, 0x93, 0xbc, 0xc7, 0xfe, 0x2e, 0x40, 0x98, 0x48, 0x92, 0xe0, 0xd3, 0xb0, 0x2a, 0x26, + 0x92, 0xe0, 0x49, 0x2e, 0x30, 0xe8, 0x9c, 0x0e, 0x68, 0x38, 0x41, 0x3b, 0xa6, 0x89, 0xa7, 0xfc, + 0x4d, 0xdc, 0x33, 0x36, 0xd5, 0x3b, 0xba, 0xa9, 0x97, 0x21, 0x4c, 0x67, 0x7e, 0xe4, 0x5d, 0xca, + 0x6f, 0x02, 0xd0, 0x6c, 0xbb, 0xa7, 0x6f, 0xf7, 0xdd, 0x06, 0x16, 0x47, 0x4b, 0x4e, 0x5e, 0xc0, + 0x15, 0xee, 0xe2, 0x22, 0xb4, 0xe0, 0xa2, 0x7a, 0xc4, 0xc8, 0x43, 0x30, 0x57, 0x85, 0x94, 0x1f, + 0x77, 0xf4, 0xdd, 0xd0, 0xe1, 0x9f, 0x07, 0x75, 0xbd, 0x23, 0xfe, 0x5c, 0x15, 0xfd, 0xc8, 0xbd, + 0x12, 0x80, 0xa4, 0x57, 0xf0, 0xfe, 0xf6, 0xb9, 0x20, 0xb9, 0x6f, 0x97, 0x20, 0xe6, 0x0c, 0xff, + 0x90, 0xc3, 0xce, 0xee, 0x1d, 0x61, 0x67, 0xf3, 0x82, 0x6d, 0x13, 0x05, 0x9d, 0x6d, 0xa2, 0xcb, + 0x8e, 0xf9, 0x1b, 0x97, 0x10, 0xf1, 0xf2, 0x5a, 0x1c, 0x38, 0xe4, 0xd6, 0xfe, 0xf2, 0x74, 0x57, + 0xf1, 0x16, 0x20, 0xec, 0xbd, 0x46, 0xc7, 0x3e, 0x72, 0x2d, 0xcf, 0x09, 0x23, 0xb6, 0x10, 0xbd, + 0x77, 0xf6, 0xa4, 0x23, 0xdf, 0xd9, 0x73, 0x5a, 0x09, 0x78, 0x5b, 0xf9, 0x5e, 0x09, 0x62, 0x62, + 0x4d, 0xa0, 0xf7, 0x78, 0x4f, 0x9e, 0x89, 0xad, 0xcd, 0xb1, 0xfa, 0x88, 0xd3, 0xf7, 0x1c, 0x3c, + 0x1b, 0x3a, 0x70, 0x1d, 0x3c, 0xea, 0x81, 0x6b, 0xee, 0xd9, 0xfd, 0x85, 0x04, 0xf2, 0xe0, 0x8a, + 0xfd, 0x9a, 0x7b, 0x37, 0x6c, 0xe6, 0x82, 0x23, 0xcc, 0xdc, 0xb8, 0x53, 0xd4, 0xa1, 0x71, 0xa7, + 0xa8, 0x87, 0x47, 0x1d, 0xbe, 0xc3, 0x51, 0xbf, 0x3f, 0x00, 0x09, 0x4f, 0x7a, 0x14, 0x3d, 0xee, + 0x3b, 0x91, 0xbd, 0x74, 0x58, 0x2a, 0xd5, 0x73, 0x24, 0xdb, 0xc7, 0xa6, 0xc0, 0xd1, 0xd9, 0xf4, + 0xf6, 0xdf, 0xce, 0x1a, 0x7d, 0x81, 0x35, 0x3c, 0xe6, 0x02, 0xeb, 0xb7, 0x49, 0x10, 0x73, 0xdc, + 0xee, 0xa3, 0x6e, 0x62, 0x1e, 0x87, 0x08, 0xf7, 0x2c, 0xd9, 0x2e, 0x26, 0xff, 0x1a, 0x99, 0x56, + 0xce, 0x42, 0xac, 0x83, 0x6d, 0x8d, 0xea, 0x41, 0x66, 0xd5, 0x9c, 0xef, 0xb3, 0x97, 0x20, 0xe1, + 0xd9, 0x00, 0x26, 0xaa, 0xb1, 0x5a, 0x7e, 0x4e, 0x9e, 0xc9, 0x46, 0x5f, 0xbd, 0xbd, 0x14, 0xac, + 0xe2, 0x97, 0xc8, 0x6a, 0x56, 0xca, 0xc5, 0xb5, 0x72, 0xf1, 0x19, 0x59, 0xca, 0x26, 0x5e, 0xbd, + 0xbd, 0x14, 0x55, 0x30, 0xcd, 0x28, 0x9e, 0x7d, 0x06, 0xd2, 0x03, 0x13, 0xe3, 0x77, 0x5b, 0x10, + 0xa4, 0x4a, 0x5b, 0x9b, 0xeb, 0x95, 0x62, 0xbe, 0x51, 0x56, 0xd9, 0xb9, 0x5d, 0x74, 0x02, 0xe6, + 0xd7, 0x2b, 0x57, 0xd7, 0x1a, 0x6a, 0x71, 0xbd, 0x52, 0xae, 0x36, 0xd4, 0x7c, 0xa3, 0x91, 0x2f, + 0x3e, 0x23, 0x07, 0x56, 0x6e, 0x27, 0x20, 0x94, 0x2f, 0x14, 0x2b, 0xa8, 0x08, 0x21, 0x9a, 0x0a, + 0x39, 0xf4, 0x04, 0x58, 0xf6, 0xf0, 0xdc, 0x30, 0xba, 0x02, 0x61, 0x9a, 0x25, 0x41, 0x87, 0x1f, + 0x09, 0xcb, 0x4e, 0x48, 0x16, 0x93, 0xce, 0xd0, 0x15, 0x79, 0xe8, 0x19, 0xb1, 0xec, 0xe1, 0xb9, + 0x63, 0xb4, 0x0e, 0x51, 0x11, 0x24, 0x4f, 0x3a, 0xb8, 0x95, 0x9d, 0x98, 0xd0, 0x25, 0x43, 0x63, + 0xc9, 0x86, 0xc3, 0x8f, 0x8f, 0x65, 0x27, 0x64, 0x95, 0x51, 0xc5, 0xb9, 0xcf, 0x34, 0xe1, 0x44, + 0x58, 0x76, 0x52, 0x9e, 0x18, 0x29, 0x10, 0x77, 0xd3, 0x38, 0x93, 0x0f, 0xc5, 0x65, 0xa7, 0x48, + 0x98, 0xa3, 0xf7, 0xc2, 0xac, 0x3f, 0xd4, 0x9d, 0xee, 0xd4, 0x59, 0x76, 0xca, 0x8c, 0x34, 0xa1, + 0xef, 0x8f, 0x7b, 0xa7, 0x3b, 0x85, 0x96, 0x9d, 0x32, 0x41, 0x8d, 0x5e, 0x84, 0xb9, 0xe1, 0xb8, + 0x74, 0xfa, 0x43, 0x69, 0xd9, 0x23, 0xa4, 0xac, 0x51, 0x07, 0xd0, 0x88, 0x78, 0xf6, 0x08, 0x67, + 0xd4, 0xb2, 0x47, 0xc9, 0x60, 0xa3, 0x16, 0xa4, 0x07, 0x83, 0xc4, 0x69, 0xcf, 0xac, 0x65, 0xa7, + 0xce, 0x66, 0xb3, 0x56, 0xfc, 0xc1, 0xe5, 0xb4, 0x67, 0xd8, 0xb2, 0x53, 0x27, 0xb7, 0xd1, 0x16, + 0x80, 0x27, 0x3e, 0x9c, 0xe2, 0x4c, 0x5b, 0x76, 0x9a, 0x34, 0x37, 0xea, 0xc2, 0xfc, 0xa8, 0xc0, + 0xf1, 0x28, 0x47, 0xdc, 0xb2, 0x47, 0xca, 0x7e, 0x13, 0x79, 0xf6, 0x87, 0x80, 0xd3, 0x1d, 0x79, + 0xcb, 0x4e, 0x99, 0x06, 0x2f, 0xe4, 0xc7, 0x9e, 0x73, 0x7e, 0xe0, 0xd0, 0x73, 0xce, 0xee, 0xc9, + 0x65, 0xe7, 0x6c, 0xf3, 0xbf, 0x39, 0x07, 0xef, 0xe2, 0x2f, 0xe8, 0x58, 0xb6, 0x76, 0x53, 0x37, + 0x76, 0x9d, 0x67, 0x96, 0xf8, 0x37, 0x3f, 0xe4, 0x7c, 0x9c, 0xbf, 0xd2, 0x23, 0x4a, 0x27, 0x3c, + 0xb6, 0x34, 0xf6, 0x8d, 0xce, 0x49, 0xf7, 0x21, 0x26, 0x1f, 0x5f, 0x3e, 0xe4, 0x21, 0xa7, 0x09, + 0xcf, 0x45, 0x8d, 0x78, 0xe8, 0x29, 0x7b, 0xe8, 0x1b, 0x03, 0xd9, 0xc3, 0xce, 0x7d, 0x13, 0x2f, + 0x36, 0xb5, 0xa6, 0x5b, 0xb6, 0xd9, 0xd3, 0x9b, 0x5a, 0x9b, 0x9a, 0x97, 0xcb, 0xd3, 0xde, 0xca, + 0x2a, 0xc4, 0x89, 0xbb, 0xc2, 0xdf, 0x82, 0xe2, 0x37, 0x85, 0x4a, 0x10, 0xb9, 0xa5, 0xb5, 0xd9, + 0x9d, 0x28, 0xef, 0x63, 0x72, 0x83, 0x3c, 0xf7, 0xf8, 0x51, 0x5e, 0x2a, 0x0c, 0x37, 0xf7, 0xfd, + 0xf4, 0x3e, 0x49, 0xa7, 0xa3, 0x5b, 0x44, 0x16, 0x15, 0x1a, 0x4a, 0x5f, 0x83, 0x50, 0x4f, 0xb3, + 0x79, 0x80, 0x59, 0xb8, 0x78, 0xe4, 0x77, 0x99, 0x58, 0x0b, 0x94, 0x06, 0x7a, 0x16, 0x62, 0x1d, + 0x6d, 0x5f, 0xa5, 0xf4, 0x02, 0x5f, 0x13, 0xbd, 0x68, 0x47, 0xdb, 0x27, 0xfd, 0x43, 0xef, 0xa5, + 0x3f, 0xd0, 0xa8, 0x36, 0xf7, 0x34, 0x63, 0x17, 0x33, 0xca, 0xc1, 0xaf, 0x89, 0xf2, 0x6c, 0x47, + 0xdb, 0x2f, 0x52, 0x6a, 0x84, 0x3e, 0x7f, 0xf2, 0xea, 0xd7, 0x24, 0x9e, 0x35, 0xa0, 0x8c, 0x41, + 0x1a, 0xc8, 0x4d, 0xe7, 0x8b, 0x36, 0x2a, 0xb6, 0x38, 0x1e, 0x18, 0xc7, 0xf7, 0x01, 0xb6, 0x16, + 0x66, 0x49, 0xf7, 0x3e, 0xff, 0xfa, 0xa2, 0xc4, 0x5a, 0x4d, 0x37, 0x87, 0xd8, 0x9e, 0x60, 0xc9, + 0x10, 0x95, 0xfa, 0xb0, 0x81, 0x89, 0x3e, 0xec, 0xac, 0xf0, 0x61, 0x19, 0x41, 0x60, 0xd8, 0xa4, + 0x9e, 0x8f, 0xe1, 0x53, 0x12, 0x24, 0x4a, 0x9e, 0x87, 0x2f, 0x33, 0x10, 0xed, 0x98, 0x86, 0x7e, + 0x13, 0xf7, 0x9c, 0x3d, 0x2a, 0xf6, 0x49, 0xfc, 0x4c, 0xf6, 0x13, 0xd4, 0xf6, 0x81, 0x78, 0x5d, + 0x48, 0x7c, 0x13, 0xac, 0x97, 0xf0, 0xb6, 0xa5, 0x0b, 0x3e, 0x2b, 0xe2, 0x13, 0x3d, 0x08, 0xb2, + 0x85, 0x9b, 0xfd, 0x9e, 0x6e, 0x1f, 0xa8, 0x4d, 0xd3, 0xb0, 0xb5, 0xa6, 0xcd, 0xe3, 0xf0, 0xb4, + 0x28, 0x2f, 0xb2, 0x62, 0x42, 0xa4, 0x85, 0x6d, 0x4d, 0x6f, 0xb3, 0x93, 0x99, 0x71, 0x45, 0x7c, + 0xf2, 0xae, 0xbe, 0x1a, 0xf5, 0xc6, 0xa1, 0x45, 0x90, 0xcd, 0x2e, 0xee, 0xf9, 0x0e, 0xa4, 0x30, + 0x69, 0xcc, 0xfc, 0xf6, 0x67, 0x1f, 0x59, 0xe0, 0x0c, 0xe7, 0x87, 0x19, 0xd8, 0xef, 0x3c, 0x28, + 0x69, 0x81, 0x21, 0x4e, 0xaa, 0xdc, 0xf0, 0xed, 0x4a, 0xf5, 0xb7, 0xdd, 0x67, 0x64, 0x16, 0x86, + 0x98, 0x9a, 0x37, 0x0e, 0x0a, 0x99, 0xcf, 0xb9, 0xa4, 0xdd, 0x38, 0xf5, 0x19, 0x7c, 0xe0, 0xdd, + 0xa2, 0xa2, 0x64, 0x88, 0x0b, 0xff, 0xa2, 0xa6, 0xb7, 0x71, 0x8b, 0xa7, 0x35, 0xf8, 0x17, 0x5a, + 0x75, 0xd2, 0x8b, 0xec, 0x57, 0x47, 0x73, 0xe3, 0x64, 0xa3, 0x60, 0x1a, 0x2d, 0x7f, 0x1e, 0x11, + 0x15, 0x21, 0x62, 0x9b, 0x37, 0xb1, 0xc1, 0x19, 0x74, 0xb4, 0xa7, 0xd5, 0x38, 0x2a, 0xfa, 0x46, + 0x90, 0x5b, 0xb8, 0x8d, 0x77, 0xd9, 0x7d, 0xc9, 0x3d, 0xad, 0x87, 0xd9, 0x6d, 0xfd, 0x3b, 0x7a, + 0x5e, 0x2d, 0xed, 0x90, 0xaa, 0x53, 0x4a, 0x68, 0xd3, 0xff, 0xb4, 0x6a, 0x94, 0x6f, 0x1e, 0x8f, + 0x19, 0xa3, 0x47, 0xf2, 0xbc, 0x9a, 0xc7, 0xf7, 0x14, 0xeb, 0x83, 0x20, 0xf7, 0x8d, 0x6d, 0xd3, + 0xa0, 0x3f, 0xa1, 0xc9, 0xa3, 0xa8, 0x18, 0xdb, 0xa9, 0x74, 0xca, 0xf9, 0x4e, 0xe5, 0x26, 0xa4, + 0x5c, 0x50, 0xba, 0x42, 0xe2, 0x47, 0x5d, 0x21, 0xb3, 0x0e, 0x01, 0x02, 0x82, 0x36, 0x00, 0xdc, + 0x35, 0x48, 0xb7, 0xca, 0x12, 0xe3, 0x67, 0xcc, 0x5d, 0xcd, 0xde, 0xc1, 0x78, 0x08, 0xa0, 0x6f, + 0x80, 0xf9, 0x8e, 0x6e, 0xa8, 0x16, 0x6e, 0xef, 0xa8, 0x9c, 0x73, 0x84, 0x6e, 0xe2, 0xe8, 0xb3, + 0x39, 0xd7, 0xd1, 0x8d, 0x3a, 0x6e, 0xef, 0x94, 0x1c, 0x2a, 0xe8, 0xdd, 0x70, 0xca, 0x1d, 0xbd, + 0x69, 0xa8, 0x7b, 0x66, 0xbb, 0xa5, 0xf6, 0xf0, 0x8e, 0xda, 0xa4, 0xef, 0xfc, 0x25, 0x29, 0xcf, + 0x4e, 0x38, 0x20, 0x35, 0x63, 0xcd, 0x6c, 0xb7, 0x14, 0xbc, 0x53, 0x24, 0xd5, 0xe8, 0x5e, 0x70, + 0x87, 0xae, 0xea, 0x2d, 0x2b, 0x33, 0xbb, 0x14, 0x3c, 0x13, 0x52, 0x92, 0x4e, 0x61, 0xa5, 0x65, + 0xad, 0xc6, 0x3e, 0xf8, 0x89, 0xc5, 0x99, 0x37, 0x3f, 0xb1, 0x38, 0x93, 0xbb, 0x42, 0xdf, 0x94, + 0xe2, 0xeb, 0x08, 0x5b, 0xe8, 0x22, 0xc4, 0x35, 0xf1, 0xc1, 0x6e, 0x8c, 0x1d, 0xb2, 0x0e, 0x5d, + 0xd0, 0xdc, 0x4f, 0x4a, 0x10, 0x29, 0x5d, 0xdf, 0xd4, 0xf4, 0x1e, 0x2a, 0xc3, 0x9c, 0x2b, 0x98, + 0xd3, 0x2e, 0x69, 0x57, 0x96, 0xc5, 0x9a, 0xae, 0x8e, 0x3b, 0xaa, 0x16, 0x2f, 0xdc, 0xf3, 0xdb, + 0x9f, 0x7d, 0xe4, 0x6e, 0x4e, 0xe6, 0xfa, 0xc0, 0xa9, 0x35, 0x41, 0x6f, 0xf0, 0x34, 0x9b, 0x67, + 0xcc, 0xd7, 0x20, 0xca, 0xba, 0x6a, 0xa1, 0xa7, 0x21, 0xdc, 0x25, 0x7f, 0xf0, 0x0c, 0xfc, 0xe9, + 0xb1, 0x02, 0x4e, 0xe1, 0xbd, 0xe2, 0xc0, 0xf0, 0x72, 0x1f, 0x0a, 0x00, 0x94, 0xae, 0x5f, 0x6f, + 0xf4, 0xf4, 0x6e, 0x1b, 0xdb, 0x6f, 0xd7, 0xd8, 0xb7, 0xe0, 0x98, 0xe7, 0x2e, 0x74, 0xaf, 0x79, + 0xf4, 0xf1, 0xcf, 0xbb, 0xd7, 0xa2, 0x7b, 0xcd, 0x91, 0x64, 0x5b, 0x96, 0xed, 0x90, 0x0d, 0x1e, + 0x9d, 0x6c, 0xc9, 0xb2, 0x87, 0x39, 0xfb, 0x3c, 0x24, 0x5c, 0x66, 0x58, 0xa8, 0x02, 0x31, 0x9b, + 0xff, 0xcd, 0x19, 0x9c, 0x1b, 0xcf, 0x60, 0x81, 0xe6, 0x65, 0xb2, 0x83, 0x9e, 0xfb, 0x2b, 0x09, + 0xc0, 0xb3, 0x46, 0xde, 0x99, 0x32, 0x46, 0xc2, 0x75, 0xae, 0x89, 0x83, 0x77, 0xfc, 0x1a, 0x27, + 0x23, 0xe0, 0x61, 0xea, 0x87, 0x03, 0x30, 0xbf, 0x25, 0x56, 0xef, 0x3b, 0x9f, 0x07, 0x5b, 0x10, + 0xc5, 0x86, 0xdd, 0xd3, 0x9d, 0x3d, 0xa4, 0x47, 0xc7, 0xcd, 0xf9, 0x88, 0x41, 0x95, 0x0d, 0xbb, + 0x77, 0xe0, 0x95, 0x00, 0x41, 0xcb, 0xc3, 0x8f, 0x8f, 0x06, 0x21, 0x33, 0x0e, 0x15, 0x3d, 0x00, + 0xe9, 0x66, 0x0f, 0xd3, 0x02, 0xff, 0x15, 0xd1, 0x94, 0x28, 0xe6, 0x36, 0x46, 0x01, 0xe2, 0x95, + 0x11, 0xe1, 0x22, 0xa0, 0x77, 0xe6, 0x86, 0xa5, 0x5c, 0x0a, 0xd4, 0xca, 0x34, 0x20, 0x2d, 0xee, + 0x9c, 0x6c, 0x6b, 0x6d, 0xcd, 0x68, 0x0a, 0x77, 0xf5, 0x48, 0x26, 0x41, 0xdc, 0x5b, 0x29, 0x30, + 0x12, 0xa8, 0x0c, 0x51, 0x41, 0x2d, 0x74, 0x74, 0x6a, 0x02, 0x17, 0xdd, 0x03, 0x49, 0xaf, 0x61, + 0xa0, 0xae, 0x47, 0x48, 0x49, 0x78, 0xec, 0xc2, 0x24, 0xcb, 0x13, 0x39, 0xd4, 0xf2, 0x70, 0xef, + 0xee, 0x87, 0xe9, 0xd1, 0xf0, 0xd6, 0xdf, 0xfc, 0x69, 0xd9, 0x04, 0x60, 0x4b, 0x95, 0x68, 0x52, + 0x3e, 0x33, 0x77, 0xb0, 0xde, 0xe3, 0x8c, 0x48, 0xc9, 0xb2, 0xff, 0xba, 0x66, 0xe8, 0x77, 0x03, + 0x90, 0xf4, 0xce, 0xd0, 0xdf, 0x4a, 0xa3, 0x85, 0xaa, 0xae, 0x9a, 0x62, 0xd7, 0x67, 0x1e, 0x1c, + 0xa7, 0xa6, 0x86, 0xa4, 0x79, 0x82, 0x7e, 0xfa, 0x58, 0x10, 0x22, 0xfc, 0x7c, 0x5b, 0x6d, 0xc8, + 0x91, 0x95, 0x26, 0x3d, 0x00, 0x30, 0x2b, 0x1e, 0x00, 0x18, 0xe9, 0xc7, 0xde, 0x07, 0x29, 0x12, + 0x10, 0xfb, 0x0e, 0xcd, 0x49, 0x67, 0x66, 0x69, 0x5c, 0xeb, 0x1e, 0x11, 0x47, 0x8b, 0x90, 0x20, + 0x60, 0xae, 0x1e, 0x26, 0x30, 0xd0, 0xd1, 0xf6, 0xcb, 0xac, 0x04, 0x3d, 0x02, 0x68, 0xcf, 0x49, + 0x50, 0xa8, 0x2e, 0x23, 0x08, 0xdc, 0x9c, 0x5b, 0x23, 0xc0, 0xef, 0x06, 0x20, 0xbd, 0x50, 0xd9, + 0x03, 0xd4, 0xfc, 0x79, 0x6f, 0x52, 0x52, 0xa2, 0x8f, 0x50, 0x7f, 0x40, 0x62, 0xfe, 0xf0, 0x40, + 0xd8, 0xcc, 0xc3, 0x91, 0xc6, 0x14, 0x8b, 0xe2, 0xcf, 0x5f, 0x5f, 0xcc, 0x1e, 0x68, 0x9d, 0xf6, + 0x6a, 0x6e, 0x04, 0x9d, 0xdc, 0xa8, 0x48, 0x9e, 0x38, 0xce, 0xfe, 0xb0, 0x7b, 0xf5, 0x5d, 0x44, + 0xbc, 0x5f, 0x7d, 0xe3, 0x67, 0xcf, 0x9e, 0xf2, 0xbc, 0xf9, 0xbc, 0xef, 0xa4, 0xaf, 0xd8, 0x9c, + 0x10, 0x4f, 0x15, 0xb9, 0x56, 0xc3, 0x39, 0x19, 0xbf, 0x01, 0xe0, 0xf1, 0xe4, 0xa5, 0xc3, 0x23, + 0x04, 0x17, 0xdf, 0x17, 0x21, 0x78, 0xd6, 0xd4, 0x7b, 0x5c, 0xa5, 0x2d, 0xde, 0x7c, 0x18, 0xf1, + 0x22, 0xf9, 0x72, 0xd1, 0xd4, 0x7d, 0x24, 0x04, 0x12, 0x5d, 0xaa, 0x33, 0xb9, 0x7f, 0x25, 0xc1, + 0xc9, 0x21, 0xf1, 0x73, 0xba, 0xdc, 0x04, 0xd4, 0xf3, 0x54, 0xd2, 0x69, 0x14, 0x5b, 0xb1, 0x77, + 0x26, 0xcd, 0x73, 0xbd, 0x21, 0xcd, 0xfd, 0xf6, 0x58, 0x1f, 0xae, 0x7a, 0x7e, 0x43, 0x82, 0x05, + 0x6f, 0x07, 0x9c, 0xa1, 0xd4, 0x21, 0xe9, 0x6d, 0x9a, 0x0f, 0xe2, 0x5d, 0xd3, 0x0c, 0xc2, 0xdb, + 0x7f, 0x1f, 0x11, 0x74, 0xdd, 0x5d, 0xe2, 0x2c, 0x6f, 0x76, 0x7e, 0x6a, 0xa6, 0x88, 0x8e, 0x8d, + 0x5c, 0xea, 0x6c, 0x6e, 0xfe, 0x48, 0x82, 0xd0, 0xa6, 0x69, 0xb6, 0xd1, 0xfb, 0x60, 0xce, 0x30, + 0x6d, 0x95, 0x2c, 0x07, 0xdc, 0x52, 0x79, 0x60, 0xcf, 0xd4, 0x67, 0xf9, 0x50, 0x5e, 0x7d, 0xe9, + 0xf5, 0xc5, 0x61, 0xcc, 0x51, 0x6f, 0xc2, 0xa7, 0x0d, 0xd3, 0x2e, 0x50, 0xa0, 0x06, 0x8b, 0xfd, + 0x77, 0x60, 0xd6, 0xdf, 0x1c, 0x53, 0xb1, 0xf9, 0x49, 0xcd, 0xcd, 0x4e, 0x6c, 0x2a, 0xb9, 0xed, + 0x69, 0x87, 0x3d, 0xa3, 0xfc, 0xa7, 0x64, 0xe6, 0x6e, 0x80, 0x7c, 0x7d, 0xf0, 0x88, 0x4f, 0x19, + 0xa2, 0xe2, 0x48, 0x8f, 0x34, 0xe5, 0x69, 0x21, 0x2f, 0x3b, 0x39, 0xee, 0xd9, 0x9f, 0x97, 0x00, + 0xdc, 0x24, 0x09, 0x7a, 0x18, 0x4e, 0x14, 0x6a, 0xd5, 0x92, 0x5a, 0x6f, 0xe4, 0x1b, 0x5b, 0x75, + 0xff, 0x6f, 0xad, 0x88, 0xf7, 0x87, 0xac, 0x2e, 0x6e, 0xea, 0x3b, 0x3a, 0x6e, 0xa1, 0xfb, 0x61, + 0xc1, 0x0f, 0x4d, 0xbe, 0xca, 0x25, 0x59, 0xca, 0x26, 0x5f, 0xbd, 0xbd, 0x14, 0x63, 0x7e, 0x22, + 0x6e, 0xa1, 0x33, 0x70, 0x6c, 0x18, 0xae, 0x52, 0xbd, 0x2a, 0x07, 0xb2, 0xb3, 0xaf, 0xde, 0x5e, + 0x8a, 0x3b, 0x0e, 0x25, 0xca, 0x01, 0xf2, 0x42, 0x72, 0x7a, 0xc1, 0x2c, 0xbc, 0x7a, 0x7b, 0x29, + 0xc2, 0x66, 0x21, 0x1b, 0xfa, 0xe0, 0x8f, 0x9e, 0x9e, 0x39, 0xfb, 0x4d, 0x00, 0x15, 0x63, 0xa7, + 0xa7, 0x35, 0xa9, 0xb4, 0x65, 0xe1, 0x78, 0xa5, 0x7a, 0x45, 0xc9, 0x17, 0x1b, 0x95, 0x5a, 0x75, + 0xe0, 0x27, 0x62, 0xfc, 0x75, 0xa5, 0xda, 0x56, 0x61, 0xbd, 0xac, 0xd6, 0x2b, 0x57, 0xab, 0x6c, + 0xb3, 0xd5, 0x57, 0xf7, 0x5c, 0xb5, 0x51, 0xd9, 0x28, 0xcb, 0x81, 0xc2, 0x95, 0xb1, 0xc9, 0xfc, + 0x87, 0x0f, 0x7d, 0xe5, 0xde, 0xd5, 0x78, 0xbe, 0x8c, 0xfe, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, + 0x29, 0x2b, 0x22, 0x54, 0x7c, 0xb2, 0x00, 0x00, } r := bytes.NewReader(gzipped) gzipr, err := compress_gzip.NewReader(r)