From 7e7e4c74ca570dbfec1041f2749fda2c992418b3 Mon Sep 17 00:00:00 2001 From: Anton Kaliaev Date: Thu, 11 Oct 2018 15:07:05 +0400 Subject: [PATCH] make `ConsensusParams.EvidenceParams.MaxAge` time Refs #2565 --- Makefile | 2 +- abci/types/types.pb.go | 620 +++++++++++++++++++--------- abci/types/types.proto | 5 +- abci/types/typespb_test.go | 1 + consensus/reactor.go | 20 +- consensus/types/peer_round_state.go | 5 +- evidence/pool.go | 21 +- evidence/reactor.go | 6 +- evidence/reactor_test.go | 16 +- state/state_test.go | 12 +- state/validation.go | 8 +- types/evidence.go | 9 + types/params.go | 10 +- types/params_test.go | 43 +- types/protobuf.go | 11 +- 15 files changed, 520 insertions(+), 269 deletions(-) diff --git a/Makefile b/Makefile index 0b78574b9..c9e1fd0fa 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ protoc_all: protoc_libs protoc_merkle protoc_abci protoc_grpc ## See https://stackoverflow.com/a/25518702 ## Note the $< here is substituted for the %.proto ## Note the $@ here is substituted for the %.pb.go - protoc $(INCLUDE) $< --gogo_out=Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,plugins=grpc:. + protoc $(INCLUDE) $< --gogo_out=Mgoogle/protobuf/timestamp.proto=github.com/golang/protobuf/ptypes/timestamp,Mgoogle/protobuf/duration.proto=github.com/golang/protobuf/ptypes/duration,plugins=grpc:. ######################################## ### Build ABCI diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go index 1ec516024..139cad79c 100644 --- a/abci/types/types.pb.go +++ b/abci/types/types.pb.go @@ -8,6 +8,7 @@ import golang_proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" import _ "github.com/gogo/protobuf/gogoproto" +import _ "github.com/golang/protobuf/ptypes/duration" import _ "github.com/golang/protobuf/ptypes/timestamp" import merkle "github.com/tendermint/tendermint/crypto/merkle" import common "github.com/tendermint/tendermint/libs/common" @@ -61,7 +62,7 @@ func (m *Request) Reset() { *m = Request{} } func (m *Request) String() string { return proto.CompactTextString(m) } func (*Request) ProtoMessage() {} func (*Request) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{0} + return fileDescriptor_types_484dc917594bf763, []int{0} } func (m *Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -483,7 +484,7 @@ func (m *RequestEcho) Reset() { *m = RequestEcho{} } func (m *RequestEcho) String() string { return proto.CompactTextString(m) } func (*RequestEcho) ProtoMessage() {} func (*RequestEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{1} + return fileDescriptor_types_484dc917594bf763, []int{1} } func (m *RequestEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -529,7 +530,7 @@ func (m *RequestFlush) Reset() { *m = RequestFlush{} } func (m *RequestFlush) String() string { return proto.CompactTextString(m) } func (*RequestFlush) ProtoMessage() {} func (*RequestFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{2} + return fileDescriptor_types_484dc917594bf763, []int{2} } func (m *RequestFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -569,7 +570,7 @@ func (m *RequestInfo) Reset() { *m = RequestInfo{} } func (m *RequestInfo) String() string { return proto.CompactTextString(m) } func (*RequestInfo) ProtoMessage() {} func (*RequestInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{3} + return fileDescriptor_types_484dc917594bf763, []int{3} } func (m *RequestInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -618,7 +619,7 @@ func (m *RequestSetOption) Reset() { *m = RequestSetOption{} } func (m *RequestSetOption) String() string { return proto.CompactTextString(m) } func (*RequestSetOption) ProtoMessage() {} func (*RequestSetOption) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{4} + return fileDescriptor_types_484dc917594bf763, []int{4} } func (m *RequestSetOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -676,7 +677,7 @@ func (m *RequestInitChain) Reset() { *m = RequestInitChain{} } func (m *RequestInitChain) String() string { return proto.CompactTextString(m) } func (*RequestInitChain) ProtoMessage() {} func (*RequestInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{5} + return fileDescriptor_types_484dc917594bf763, []int{5} } func (m *RequestInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -754,7 +755,7 @@ func (m *RequestQuery) Reset() { *m = RequestQuery{} } func (m *RequestQuery) String() string { return proto.CompactTextString(m) } func (*RequestQuery) ProtoMessage() {} func (*RequestQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{6} + return fileDescriptor_types_484dc917594bf763, []int{6} } func (m *RequestQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -826,7 +827,7 @@ func (m *RequestBeginBlock) Reset() { *m = RequestBeginBlock{} } func (m *RequestBeginBlock) String() string { return proto.CompactTextString(m) } func (*RequestBeginBlock) ProtoMessage() {} func (*RequestBeginBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{7} + return fileDescriptor_types_484dc917594bf763, []int{7} } func (m *RequestBeginBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -894,7 +895,7 @@ func (m *RequestCheckTx) Reset() { *m = RequestCheckTx{} } func (m *RequestCheckTx) String() string { return proto.CompactTextString(m) } func (*RequestCheckTx) ProtoMessage() {} func (*RequestCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{8} + return fileDescriptor_types_484dc917594bf763, []int{8} } func (m *RequestCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -941,7 +942,7 @@ func (m *RequestDeliverTx) Reset() { *m = RequestDeliverTx{} } func (m *RequestDeliverTx) String() string { return proto.CompactTextString(m) } func (*RequestDeliverTx) ProtoMessage() {} func (*RequestDeliverTx) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{9} + return fileDescriptor_types_484dc917594bf763, []int{9} } func (m *RequestDeliverTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -988,7 +989,7 @@ func (m *RequestEndBlock) Reset() { *m = RequestEndBlock{} } func (m *RequestEndBlock) String() string { return proto.CompactTextString(m) } func (*RequestEndBlock) ProtoMessage() {} func (*RequestEndBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{10} + return fileDescriptor_types_484dc917594bf763, []int{10} } func (m *RequestEndBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1034,7 +1035,7 @@ func (m *RequestCommit) Reset() { *m = RequestCommit{} } func (m *RequestCommit) String() string { return proto.CompactTextString(m) } func (*RequestCommit) ProtoMessage() {} func (*RequestCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{11} + return fileDescriptor_types_484dc917594bf763, []int{11} } func (m *RequestCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1087,7 +1088,7 @@ func (m *Response) Reset() { *m = Response{} } func (m *Response) String() string { return proto.CompactTextString(m) } func (*Response) ProtoMessage() {} func (*Response) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{12} + return fileDescriptor_types_484dc917594bf763, []int{12} } func (m *Response) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1540,7 +1541,7 @@ func (m *ResponseException) Reset() { *m = ResponseException{} } func (m *ResponseException) String() string { return proto.CompactTextString(m) } func (*ResponseException) ProtoMessage() {} func (*ResponseException) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{13} + return fileDescriptor_types_484dc917594bf763, []int{13} } func (m *ResponseException) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1587,7 +1588,7 @@ func (m *ResponseEcho) Reset() { *m = ResponseEcho{} } func (m *ResponseEcho) String() string { return proto.CompactTextString(m) } func (*ResponseEcho) ProtoMessage() {} func (*ResponseEcho) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{14} + return fileDescriptor_types_484dc917594bf763, []int{14} } func (m *ResponseEcho) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1633,7 +1634,7 @@ func (m *ResponseFlush) Reset() { *m = ResponseFlush{} } func (m *ResponseFlush) String() string { return proto.CompactTextString(m) } func (*ResponseFlush) ProtoMessage() {} func (*ResponseFlush) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{15} + return fileDescriptor_types_484dc917594bf763, []int{15} } func (m *ResponseFlush) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1676,7 +1677,7 @@ func (m *ResponseInfo) Reset() { *m = ResponseInfo{} } func (m *ResponseInfo) String() string { return proto.CompactTextString(m) } func (*ResponseInfo) ProtoMessage() {} func (*ResponseInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{16} + return fileDescriptor_types_484dc917594bf763, []int{16} } func (m *ResponseInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1748,7 +1749,7 @@ func (m *ResponseSetOption) Reset() { *m = ResponseSetOption{} } func (m *ResponseSetOption) String() string { return proto.CompactTextString(m) } func (*ResponseSetOption) ProtoMessage() {} func (*ResponseSetOption) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{17} + return fileDescriptor_types_484dc917594bf763, []int{17} } func (m *ResponseSetOption) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1810,7 +1811,7 @@ func (m *ResponseInitChain) Reset() { *m = ResponseInitChain{} } func (m *ResponseInitChain) String() string { return proto.CompactTextString(m) } func (*ResponseInitChain) ProtoMessage() {} func (*ResponseInitChain) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{18} + return fileDescriptor_types_484dc917594bf763, []int{18} } func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1873,7 +1874,7 @@ func (m *ResponseQuery) Reset() { *m = ResponseQuery{} } func (m *ResponseQuery) String() string { return proto.CompactTextString(m) } func (*ResponseQuery) ProtoMessage() {} func (*ResponseQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{19} + return fileDescriptor_types_484dc917594bf763, []int{19} } func (m *ResponseQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1976,7 +1977,7 @@ func (m *ResponseBeginBlock) Reset() { *m = ResponseBeginBlock{} } func (m *ResponseBeginBlock) String() string { return proto.CompactTextString(m) } func (*ResponseBeginBlock) ProtoMessage() {} func (*ResponseBeginBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{20} + return fileDescriptor_types_484dc917594bf763, []int{20} } func (m *ResponseBeginBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2030,7 +2031,7 @@ func (m *ResponseCheckTx) Reset() { *m = ResponseCheckTx{} } func (m *ResponseCheckTx) String() string { return proto.CompactTextString(m) } func (*ResponseCheckTx) ProtoMessage() {} func (*ResponseCheckTx) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{21} + return fileDescriptor_types_484dc917594bf763, []int{21} } func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2133,7 +2134,7 @@ func (m *ResponseDeliverTx) Reset() { *m = ResponseDeliverTx{} } func (m *ResponseDeliverTx) String() string { return proto.CompactTextString(m) } func (*ResponseDeliverTx) ProtoMessage() {} func (*ResponseDeliverTx) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{22} + return fileDescriptor_types_484dc917594bf763, []int{22} } func (m *ResponseDeliverTx) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2231,7 +2232,7 @@ func (m *ResponseEndBlock) Reset() { *m = ResponseEndBlock{} } func (m *ResponseEndBlock) String() string { return proto.CompactTextString(m) } func (*ResponseEndBlock) ProtoMessage() {} func (*ResponseEndBlock) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{23} + return fileDescriptor_types_484dc917594bf763, []int{23} } func (m *ResponseEndBlock) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2293,7 +2294,7 @@ func (m *ResponseCommit) Reset() { *m = ResponseCommit{} } func (m *ResponseCommit) String() string { return proto.CompactTextString(m) } func (*ResponseCommit) ProtoMessage() {} func (*ResponseCommit) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{24} + return fileDescriptor_types_484dc917594bf763, []int{24} } func (m *ResponseCommit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2343,7 +2344,7 @@ func (m *ConsensusParams) Reset() { *m = ConsensusParams{} } func (m *ConsensusParams) String() string { return proto.CompactTextString(m) } func (*ConsensusParams) ProtoMessage() {} func (*ConsensusParams) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{25} + return fileDescriptor_types_484dc917594bf763, []int{25} } func (m *ConsensusParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2402,7 @@ func (m *BlockSize) Reset() { *m = BlockSize{} } func (m *BlockSize) String() string { return proto.CompactTextString(m) } func (*BlockSize) ProtoMessage() {} func (*BlockSize) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{26} + return fileDescriptor_types_484dc917594bf763, []int{26} } func (m *BlockSize) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2446,18 +2447,18 @@ func (m *BlockSize) GetMaxGas() int64 { // EvidenceParams contains limits on the evidence. type EvidenceParams struct { - // Note: must be greater than 0 - MaxAge int64 `protobuf:"varint,1,opt,name=max_age,json=maxAge,proto3" json:"max_age,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // Note: must be greater than 0 if provided + MaxAge *time.Duration `protobuf:"bytes,1,opt,name=max_age,json=maxAge,stdduration" json:"max_age,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *EvidenceParams) Reset() { *m = EvidenceParams{} } func (m *EvidenceParams) String() string { return proto.CompactTextString(m) } func (*EvidenceParams) ProtoMessage() {} func (*EvidenceParams) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{27} + return fileDescriptor_types_484dc917594bf763, []int{27} } func (m *EvidenceParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2486,11 +2487,11 @@ func (m *EvidenceParams) XXX_DiscardUnknown() { var xxx_messageInfo_EvidenceParams proto.InternalMessageInfo -func (m *EvidenceParams) GetMaxAge() int64 { +func (m *EvidenceParams) GetMaxAge() *time.Duration { if m != nil { return m.MaxAge } - return 0 + return nil } type LastCommitInfo struct { @@ -2505,7 +2506,7 @@ func (m *LastCommitInfo) Reset() { *m = LastCommitInfo{} } func (m *LastCommitInfo) String() string { return proto.CompactTextString(m) } func (*LastCommitInfo) ProtoMessage() {} func (*LastCommitInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{28} + return fileDescriptor_types_484dc917594bf763, []int{28} } func (m *LastCommitInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2578,7 +2579,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{29} + return fileDescriptor_types_484dc917594bf763, []int{29} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2724,7 +2725,7 @@ func (m *BlockID) Reset() { *m = BlockID{} } func (m *BlockID) String() string { return proto.CompactTextString(m) } func (*BlockID) ProtoMessage() {} func (*BlockID) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{30} + return fileDescriptor_types_484dc917594bf763, []int{30} } func (m *BlockID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2779,7 +2780,7 @@ func (m *PartSetHeader) Reset() { *m = PartSetHeader{} } func (m *PartSetHeader) String() string { return proto.CompactTextString(m) } func (*PartSetHeader) ProtoMessage() {} func (*PartSetHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{31} + return fileDescriptor_types_484dc917594bf763, []int{31} } func (m *PartSetHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2836,7 +2837,7 @@ func (m *Validator) Reset() { *m = Validator{} } func (m *Validator) String() string { return proto.CompactTextString(m) } func (*Validator) ProtoMessage() {} func (*Validator) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{32} + return fileDescriptor_types_484dc917594bf763, []int{32} } func (m *Validator) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2892,7 +2893,7 @@ func (m *ValidatorUpdate) Reset() { *m = ValidatorUpdate{} } func (m *ValidatorUpdate) String() string { return proto.CompactTextString(m) } func (*ValidatorUpdate) ProtoMessage() {} func (*ValidatorUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{33} + return fileDescriptor_types_484dc917594bf763, []int{33} } func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2948,7 +2949,7 @@ func (m *VoteInfo) Reset() { *m = VoteInfo{} } func (m *VoteInfo) String() string { return proto.CompactTextString(m) } func (*VoteInfo) ProtoMessage() {} func (*VoteInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{34} + return fileDescriptor_types_484dc917594bf763, []int{34} } func (m *VoteInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3003,7 +3004,7 @@ func (m *PubKey) Reset() { *m = PubKey{} } func (m *PubKey) String() string { return proto.CompactTextString(m) } func (*PubKey) ProtoMessage() {} func (*PubKey) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{35} + return fileDescriptor_types_484dc917594bf763, []int{35} } func (m *PubKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3061,7 +3062,7 @@ func (m *Evidence) Reset() { *m = Evidence{} } func (m *Evidence) String() string { return proto.CompactTextString(m) } func (*Evidence) ProtoMessage() {} func (*Evidence) Descriptor() ([]byte, []int) { - return fileDescriptor_types_4a7ab597ee120b05, []int{36} + return fileDescriptor_types_484dc917594bf763, []int{36} } func (m *Evidence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4673,7 +4674,13 @@ func (this *EvidenceParams) Equal(that interface{}) bool { } else if this == nil { return false } - if this.MaxAge != that1.MaxAge { + if this.MaxAge != nil && that1.MaxAge != nil { + if *this.MaxAge != *that1.MaxAge { + return false + } + } else if this.MaxAge != nil { + return false + } else if that1.MaxAge != nil { return false } if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { @@ -6784,10 +6791,15 @@ func (m *EvidenceParams) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if m.MaxAge != 0 { - dAtA[i] = 0x8 + if m.MaxAge != nil { + dAtA[i] = 0xa i++ - i = encodeVarintTypes(dAtA, i, uint64(m.MaxAge)) + i = encodeVarintTypes(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(*m.MaxAge))) + n35, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(*m.MaxAge, dAtA[i:]) + if err != nil { + return 0, err + } + i += n35 } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6862,11 +6874,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintTypes(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Time))) - n35, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) + n36, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) if err != nil { return 0, err } - i += n35 + i += n36 if m.NumTxs != 0 { dAtA[i] = 0x20 i++ @@ -6880,11 +6892,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintTypes(dAtA, i, uint64(m.LastBlockId.Size())) - n36, err := m.LastBlockId.MarshalTo(dAtA[i:]) + n37, err := m.LastBlockId.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n36 + i += n37 if len(m.LastCommitHash) > 0 { dAtA[i] = 0x3a i++ @@ -6969,11 +6981,11 @@ func (m *BlockID) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintTypes(dAtA, i, uint64(m.PartsHeader.Size())) - n37, err := m.PartsHeader.MarshalTo(dAtA[i:]) + n38, err := m.PartsHeader.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n37 + i += n38 if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -7062,11 +7074,11 @@ func (m *ValidatorUpdate) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintTypes(dAtA, i, uint64(m.PubKey.Size())) - n38, err := m.PubKey.MarshalTo(dAtA[i:]) + n39, err := m.PubKey.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n38 + i += n39 if m.Power != 0 { dAtA[i] = 0x10 i++ @@ -7096,11 +7108,11 @@ func (m *VoteInfo) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintTypes(dAtA, i, uint64(m.Validator.Size())) - n39, err := m.Validator.MarshalTo(dAtA[i:]) + n40, err := m.Validator.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n39 + i += n40 if m.SignedLastBlock { dAtA[i] = 0x10 i++ @@ -7174,11 +7186,11 @@ func (m *Evidence) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintTypes(dAtA, i, uint64(m.Validator.Size())) - n40, err := m.Validator.MarshalTo(dAtA[i:]) + n41, err := m.Validator.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n40 + i += n41 if m.Height != 0 { dAtA[i] = 0x18 i++ @@ -7187,11 +7199,11 @@ func (m *Evidence) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintTypes(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Time))) - n41, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) + n42, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i:]) if err != nil { return 0, err } - i += n41 + i += n42 if m.TotalVotingPower != 0 { dAtA[i] = 0x28 i++ @@ -7810,9 +7822,8 @@ func NewPopulatedBlockSize(r randyTypes, easy bool) *BlockSize { func NewPopulatedEvidenceParams(r randyTypes, easy bool) *EvidenceParams { this := &EvidenceParams{} - this.MaxAge = int64(r.Int63()) - if r.Intn(2) == 0 { - this.MaxAge *= -1 + if r.Intn(10) != 0 { + this.MaxAge = github_com_gogo_protobuf_types.NewPopulatedStdDuration(r, easy) } if !easy && r.Intn(10) != 0 { this.XXX_unrecognized = randUnrecognizedTypes(r, 2) @@ -8092,6 +8103,9 @@ func encodeVarintPopulateTypes(dAtA []byte, v uint64) []byte { return dAtA } func (m *Request) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Value != nil { @@ -8104,6 +8118,9 @@ func (m *Request) Size() (n int) { } func (m *Request_Echo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Echo != nil { @@ -8113,6 +8130,9 @@ func (m *Request_Echo) Size() (n int) { return n } func (m *Request_Flush) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Flush != nil { @@ -8122,6 +8142,9 @@ func (m *Request_Flush) Size() (n int) { return n } func (m *Request_Info) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Info != nil { @@ -8131,6 +8154,9 @@ func (m *Request_Info) Size() (n int) { return n } func (m *Request_SetOption) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.SetOption != nil { @@ -8140,6 +8166,9 @@ func (m *Request_SetOption) Size() (n int) { return n } func (m *Request_InitChain) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.InitChain != nil { @@ -8149,6 +8178,9 @@ func (m *Request_InitChain) Size() (n int) { return n } func (m *Request_Query) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Query != nil { @@ -8158,6 +8190,9 @@ func (m *Request_Query) Size() (n int) { return n } func (m *Request_BeginBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.BeginBlock != nil { @@ -8167,6 +8202,9 @@ func (m *Request_BeginBlock) Size() (n int) { return n } func (m *Request_CheckTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.CheckTx != nil { @@ -8176,6 +8214,9 @@ func (m *Request_CheckTx) Size() (n int) { return n } func (m *Request_EndBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.EndBlock != nil { @@ -8185,6 +8226,9 @@ func (m *Request_EndBlock) Size() (n int) { return n } func (m *Request_Commit) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Commit != nil { @@ -8194,6 +8238,9 @@ func (m *Request_Commit) Size() (n int) { return n } func (m *Request_DeliverTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.DeliverTx != nil { @@ -8203,6 +8250,9 @@ func (m *Request_DeliverTx) Size() (n int) { return n } func (m *RequestEcho) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Message) @@ -8216,6 +8266,9 @@ func (m *RequestEcho) Size() (n int) { } func (m *RequestFlush) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.XXX_unrecognized != nil { @@ -8225,6 +8278,9 @@ func (m *RequestFlush) Size() (n int) { } func (m *RequestInfo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Version) @@ -8238,6 +8294,9 @@ func (m *RequestInfo) Size() (n int) { } func (m *RequestSetOption) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Key) @@ -8255,6 +8314,9 @@ func (m *RequestSetOption) Size() (n int) { } func (m *RequestInitChain) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Time) @@ -8284,6 +8346,9 @@ func (m *RequestInitChain) Size() (n int) { } func (m *RequestQuery) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Data) @@ -8307,6 +8372,9 @@ func (m *RequestQuery) Size() (n int) { } func (m *RequestBeginBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Hash) @@ -8330,6 +8398,9 @@ func (m *RequestBeginBlock) Size() (n int) { } func (m *RequestCheckTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Tx) @@ -8343,6 +8414,9 @@ func (m *RequestCheckTx) Size() (n int) { } func (m *RequestDeliverTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Tx) @@ -8356,6 +8430,9 @@ func (m *RequestDeliverTx) Size() (n int) { } func (m *RequestEndBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Height != 0 { @@ -8368,6 +8445,9 @@ func (m *RequestEndBlock) Size() (n int) { } func (m *RequestCommit) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.XXX_unrecognized != nil { @@ -8377,6 +8457,9 @@ func (m *RequestCommit) Size() (n int) { } func (m *Response) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Value != nil { @@ -8389,6 +8472,9 @@ func (m *Response) Size() (n int) { } func (m *Response_Exception) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Exception != nil { @@ -8398,6 +8484,9 @@ func (m *Response_Exception) Size() (n int) { return n } func (m *Response_Echo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Echo != nil { @@ -8407,6 +8496,9 @@ func (m *Response_Echo) Size() (n int) { return n } func (m *Response_Flush) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Flush != nil { @@ -8416,6 +8508,9 @@ func (m *Response_Flush) Size() (n int) { return n } func (m *Response_Info) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Info != nil { @@ -8425,6 +8520,9 @@ func (m *Response_Info) Size() (n int) { return n } func (m *Response_SetOption) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.SetOption != nil { @@ -8434,6 +8532,9 @@ func (m *Response_SetOption) Size() (n int) { return n } func (m *Response_InitChain) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.InitChain != nil { @@ -8443,6 +8544,9 @@ func (m *Response_InitChain) Size() (n int) { return n } func (m *Response_Query) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Query != nil { @@ -8452,6 +8556,9 @@ func (m *Response_Query) Size() (n int) { return n } func (m *Response_BeginBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.BeginBlock != nil { @@ -8461,6 +8568,9 @@ func (m *Response_BeginBlock) Size() (n int) { return n } func (m *Response_CheckTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.CheckTx != nil { @@ -8470,6 +8580,9 @@ func (m *Response_CheckTx) Size() (n int) { return n } func (m *Response_DeliverTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.DeliverTx != nil { @@ -8479,6 +8592,9 @@ func (m *Response_DeliverTx) Size() (n int) { return n } func (m *Response_EndBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.EndBlock != nil { @@ -8488,6 +8604,9 @@ func (m *Response_EndBlock) Size() (n int) { return n } func (m *Response_Commit) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Commit != nil { @@ -8497,6 +8616,9 @@ func (m *Response_Commit) Size() (n int) { return n } func (m *ResponseException) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Error) @@ -8510,6 +8632,9 @@ func (m *ResponseException) Size() (n int) { } func (m *ResponseEcho) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Message) @@ -8523,6 +8648,9 @@ func (m *ResponseEcho) Size() (n int) { } func (m *ResponseFlush) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.XXX_unrecognized != nil { @@ -8532,6 +8660,9 @@ func (m *ResponseFlush) Size() (n int) { } func (m *ResponseInfo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Data) @@ -8556,6 +8687,9 @@ func (m *ResponseInfo) Size() (n int) { } func (m *ResponseSetOption) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Code != 0 { @@ -8576,6 +8710,9 @@ func (m *ResponseSetOption) Size() (n int) { } func (m *ResponseInitChain) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.ConsensusParams != nil { @@ -8595,6 +8732,9 @@ func (m *ResponseInitChain) Size() (n int) { } func (m *ResponseQuery) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Code != 0 { @@ -8637,6 +8777,9 @@ func (m *ResponseQuery) Size() (n int) { } func (m *ResponseBeginBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if len(m.Tags) > 0 { @@ -8652,6 +8795,9 @@ func (m *ResponseBeginBlock) Size() (n int) { } func (m *ResponseCheckTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Code != 0 { @@ -8692,6 +8838,9 @@ func (m *ResponseCheckTx) Size() (n int) { } func (m *ResponseDeliverTx) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Code != 0 { @@ -8732,6 +8881,9 @@ func (m *ResponseDeliverTx) Size() (n int) { } func (m *ResponseEndBlock) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if len(m.ValidatorUpdates) > 0 { @@ -8757,6 +8909,9 @@ func (m *ResponseEndBlock) Size() (n int) { } func (m *ResponseCommit) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Data) @@ -8770,6 +8925,9 @@ func (m *ResponseCommit) Size() (n int) { } func (m *ConsensusParams) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.BlockSize != nil { @@ -8787,6 +8945,9 @@ func (m *ConsensusParams) Size() (n int) { } func (m *BlockSize) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.MaxBytes != 0 { @@ -8802,10 +8963,14 @@ func (m *BlockSize) Size() (n int) { } func (m *EvidenceParams) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l - if m.MaxAge != 0 { - n += 1 + sovTypes(uint64(m.MaxAge)) + if m.MaxAge != nil { + l = github_com_gogo_protobuf_types.SizeOfStdDuration(*m.MaxAge) + n += 1 + l + sovTypes(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8814,6 +8979,9 @@ func (m *EvidenceParams) Size() (n int) { } func (m *LastCommitInfo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Round != 0 { @@ -8832,6 +9000,9 @@ func (m *LastCommitInfo) Size() (n int) { } func (m *Header) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.ChainID) @@ -8894,6 +9065,9 @@ func (m *Header) Size() (n int) { } func (m *BlockID) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Hash) @@ -8909,6 +9083,9 @@ func (m *BlockID) Size() (n int) { } func (m *PartSetHeader) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l if m.Total != 0 { @@ -8925,6 +9102,9 @@ func (m *PartSetHeader) Size() (n int) { } func (m *Validator) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Address) @@ -8941,6 +9121,9 @@ func (m *Validator) Size() (n int) { } func (m *ValidatorUpdate) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = m.PubKey.Size() @@ -8955,6 +9138,9 @@ func (m *ValidatorUpdate) Size() (n int) { } func (m *VoteInfo) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = m.Validator.Size() @@ -8969,6 +9155,9 @@ func (m *VoteInfo) Size() (n int) { } func (m *PubKey) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Type) @@ -8986,6 +9175,9 @@ func (m *PubKey) Size() (n int) { } func (m *Evidence) Size() (n int) { + if m == nil { + return 0 + } var l int _ = l l = len(m.Type) @@ -12955,10 +13147,10 @@ func (m *EvidenceParams) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { + if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field MaxAge", wireType) } - m.MaxAge = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -12968,11 +13160,25 @@ func (m *EvidenceParams) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.MaxAge |= (int64(b) & 0x7F) << shift + msglen |= (int(b) & 0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.MaxAge == nil { + m.MaxAge = new(time.Duration) + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(m.MaxAge, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -14481,143 +14687,145 @@ var ( ErrIntOverflowTypes = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("abci/types/types.proto", fileDescriptor_types_4a7ab597ee120b05) } +func init() { proto.RegisterFile("abci/types/types.proto", fileDescriptor_types_484dc917594bf763) } func init() { - golang_proto.RegisterFile("abci/types/types.proto", fileDescriptor_types_4a7ab597ee120b05) + golang_proto.RegisterFile("abci/types/types.proto", fileDescriptor_types_484dc917594bf763) } -var fileDescriptor_types_4a7ab597ee120b05 = []byte{ - // 2107 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x73, 0x23, 0x47, - 0x15, 0xf7, 0x48, 0xb2, 0xa4, 0x79, 0xb6, 0x25, 0xa7, 0xd7, 0x6b, 0x6b, 0x45, 0xb0, 0xb7, 0x26, - 0x90, 0xd8, 0xc4, 0x91, 0x53, 0x0e, 0xa1, 0xbc, 0xd9, 0x90, 0x2a, 0x6b, 0x77, 0xc1, 0xae, 0x04, - 0x30, 0xb3, 0xbb, 0xe6, 0x42, 0xd5, 0x54, 0x4b, 0xd3, 0x96, 0xa6, 0x56, 0x9a, 0x99, 0xcc, 0xb4, - 0x1c, 0x79, 0x8f, 0x9c, 0x73, 0xc8, 0x81, 0x2a, 0xfe, 0x05, 0xfe, 0x04, 0x8e, 0x9c, 0xa8, 0x1c, - 0x29, 0x8a, 0xf3, 0x02, 0xa6, 0x38, 0xc0, 0x95, 0xa2, 0x8a, 0x23, 0xd5, 0xaf, 0xbb, 0xe7, 0xcb, - 0xa3, 0x25, 0x1b, 0x6e, 0x5c, 0xa4, 0xee, 0xf7, 0xd1, 0x1f, 0x6f, 0xde, 0x7b, 0xbf, 0xf7, 0x1a, - 0x36, 0xe9, 0x60, 0xe8, 0x1d, 0xf0, 0xab, 0x90, 0xc5, 0xf2, 0xb7, 0x17, 0x46, 0x01, 0x0f, 0xc8, - 0x32, 0x4e, 0xba, 0xef, 0x8c, 0x3c, 0x3e, 0x9e, 0x0d, 0x7a, 0xc3, 0x60, 0x7a, 0x30, 0x0a, 0x46, - 0xc1, 0x01, 0x72, 0x07, 0xb3, 0x0b, 0x9c, 0xe1, 0x04, 0x47, 0x52, 0xab, 0xbb, 0x33, 0x0a, 0x82, - 0xd1, 0x84, 0xa5, 0x52, 0xdc, 0x9b, 0xb2, 0x98, 0xd3, 0x69, 0xa8, 0x04, 0x8e, 0x32, 0xeb, 0x71, - 0xe6, 0xbb, 0x2c, 0x9a, 0x7a, 0x3e, 0xcf, 0x0e, 0x27, 0xde, 0x20, 0x3e, 0x18, 0x06, 0xd3, 0x69, - 0xe0, 0x67, 0x0f, 0xd4, 0xbd, 0xff, 0x5f, 0x35, 0x87, 0xd1, 0x55, 0xc8, 0x83, 0x83, 0x29, 0x8b, - 0x9e, 0x4d, 0x98, 0xfa, 0x93, 0xca, 0xd6, 0xef, 0x6a, 0xd0, 0xb0, 0xd9, 0xa7, 0x33, 0x16, 0x73, - 0xb2, 0x0b, 0x35, 0x36, 0x1c, 0x07, 0x9d, 0xca, 0x5d, 0x63, 0x77, 0xe5, 0x90, 0xf4, 0xe4, 0x26, - 0x8a, 0xfb, 0x68, 0x38, 0x0e, 0x4e, 0x96, 0x6c, 0x94, 0x20, 0x6f, 0xc3, 0xf2, 0xc5, 0x64, 0x16, - 0x8f, 0x3b, 0x55, 0x14, 0xbd, 0x95, 0x17, 0xfd, 0x81, 0x60, 0x9d, 0x2c, 0xd9, 0x52, 0x46, 0x2c, - 0xeb, 0xf9, 0x17, 0x41, 0xa7, 0x56, 0xb6, 0xec, 0xa9, 0x7f, 0x81, 0xcb, 0x0a, 0x09, 0x72, 0x04, - 0x10, 0x33, 0xee, 0x04, 0x21, 0xf7, 0x02, 0xbf, 0xb3, 0x8c, 0xf2, 0x5b, 0x79, 0xf9, 0xc7, 0x8c, - 0xff, 0x04, 0xd9, 0x27, 0x4b, 0xb6, 0x19, 0xeb, 0x89, 0xd0, 0xf4, 0x7c, 0x8f, 0x3b, 0xc3, 0x31, - 0xf5, 0xfc, 0x4e, 0xbd, 0x4c, 0xf3, 0xd4, 0xf7, 0xf8, 0x03, 0xc1, 0x16, 0x9a, 0x9e, 0x9e, 0x88, - 0xab, 0x7c, 0x3a, 0x63, 0xd1, 0x55, 0xa7, 0x51, 0x76, 0x95, 0x9f, 0x0a, 0x96, 0xb8, 0x0a, 0xca, - 0x90, 0xfb, 0xb0, 0x32, 0x60, 0x23, 0xcf, 0x77, 0x06, 0x93, 0x60, 0xf8, 0xac, 0xd3, 0x44, 0x95, - 0x4e, 0x5e, 0xa5, 0x2f, 0x04, 0xfa, 0x82, 0x7f, 0xb2, 0x64, 0xc3, 0x20, 0x99, 0x91, 0x43, 0x68, - 0x0e, 0xc7, 0x6c, 0xf8, 0xcc, 0xe1, 0xf3, 0x8e, 0x89, 0x9a, 0xb7, 0xf3, 0x9a, 0x0f, 0x04, 0xf7, - 0xc9, 0xfc, 0x64, 0xc9, 0x6e, 0x0c, 0xe5, 0x90, 0xbc, 0x0f, 0x26, 0xf3, 0x5d, 0xb5, 0xdd, 0x0a, - 0x2a, 0x6d, 0x16, 0xbe, 0x8b, 0xef, 0xea, 0xcd, 0x9a, 0x4c, 0x8d, 0x49, 0x0f, 0xea, 0xc2, 0x51, - 0x3c, 0xde, 0x59, 0x45, 0x9d, 0x8d, 0xc2, 0x46, 0xc8, 0x3b, 0x59, 0xb2, 0x95, 0x94, 0x30, 0x9f, - 0xcb, 0x26, 0xde, 0x25, 0x8b, 0xc4, 0xe1, 0x6e, 0x95, 0x99, 0xef, 0xa1, 0xe4, 0xe3, 0xf1, 0x4c, - 0x57, 0x4f, 0xfa, 0x0d, 0x58, 0xbe, 0xa4, 0x93, 0x19, 0xb3, 0xde, 0x82, 0x95, 0x8c, 0xa7, 0x90, - 0x0e, 0x34, 0xa6, 0x2c, 0x8e, 0xe9, 0x88, 0x75, 0x8c, 0xbb, 0xc6, 0xae, 0x69, 0xeb, 0xa9, 0xd5, - 0x82, 0xd5, 0xac, 0x9f, 0x64, 0x14, 0x85, 0x2f, 0x08, 0xc5, 0x4b, 0x16, 0xc5, 0xc2, 0x01, 0x94, - 0xa2, 0x9a, 0x5a, 0x1f, 0xc0, 0x7a, 0xd1, 0x09, 0xc8, 0x3a, 0x54, 0x9f, 0xb1, 0x2b, 0x25, 0x29, - 0x86, 0x64, 0x43, 0x1d, 0x08, 0xbd, 0xd8, 0xb4, 0xd5, 0xe9, 0xbe, 0xa8, 0x24, 0xca, 0x89, 0x1f, - 0x90, 0x23, 0xa8, 0x89, 0x28, 0x44, 0xed, 0x95, 0xc3, 0x6e, 0x4f, 0x86, 0x68, 0x4f, 0x87, 0x68, - 0xef, 0x89, 0x0e, 0xd1, 0x7e, 0xf3, 0xcb, 0x17, 0x3b, 0x4b, 0x5f, 0xfc, 0x69, 0xc7, 0xb0, 0x51, - 0x83, 0xdc, 0x11, 0x9f, 0x92, 0x7a, 0xbe, 0xe3, 0xb9, 0x6a, 0x9f, 0x06, 0xce, 0x4f, 0x5d, 0x72, - 0x0c, 0xeb, 0xc3, 0xc0, 0x8f, 0x99, 0x1f, 0xcf, 0x62, 0x27, 0xa4, 0x11, 0x9d, 0xc6, 0x2a, 0x4a, - 0xf4, 0x87, 0x7b, 0xa0, 0xd9, 0x67, 0xc8, 0xb5, 0xdb, 0xc3, 0x3c, 0x81, 0x7c, 0x08, 0x70, 0x49, - 0x27, 0x9e, 0x4b, 0x79, 0x10, 0xc5, 0x9d, 0xda, 0xdd, 0x6a, 0x46, 0xf9, 0x5c, 0x33, 0x9e, 0x86, - 0x2e, 0xe5, 0xac, 0x5f, 0x13, 0x27, 0xb3, 0x33, 0xf2, 0xe4, 0x4d, 0x68, 0xd3, 0x30, 0x74, 0x62, - 0x4e, 0x39, 0x73, 0x06, 0x57, 0x9c, 0xc5, 0x18, 0x49, 0xab, 0xf6, 0x1a, 0x0d, 0xc3, 0xc7, 0x82, - 0xda, 0x17, 0x44, 0xcb, 0x4d, 0xbe, 0x03, 0x3a, 0x39, 0x21, 0x50, 0x73, 0x29, 0xa7, 0x68, 0x8d, - 0x55, 0x1b, 0xc7, 0x82, 0x16, 0x52, 0x3e, 0x56, 0x77, 0xc4, 0x31, 0xd9, 0x84, 0xfa, 0x98, 0x79, - 0xa3, 0x31, 0xc7, 0x6b, 0x55, 0x6d, 0x35, 0x13, 0x86, 0x0f, 0xa3, 0xe0, 0x92, 0x61, 0x9c, 0x37, - 0x6d, 0x39, 0xb1, 0xfe, 0x66, 0xc0, 0x6b, 0x37, 0x02, 0x43, 0xac, 0x3b, 0xa6, 0xf1, 0x58, 0xef, - 0x25, 0xc6, 0xe4, 0x6d, 0xb1, 0x2e, 0x75, 0x59, 0xa4, 0xf2, 0xcf, 0x9a, 0xba, 0xf1, 0x09, 0x12, - 0xd5, 0x45, 0x95, 0x08, 0x79, 0x04, 0xeb, 0x13, 0x1a, 0x73, 0x47, 0xfa, 0xaf, 0x83, 0xf9, 0xa5, - 0x9a, 0x8b, 0xa9, 0x4f, 0xa8, 0xf6, 0x73, 0xe1, 0x56, 0x4a, 0xbd, 0x35, 0xc9, 0x51, 0xc9, 0x09, - 0x6c, 0x0c, 0xae, 0x9e, 0x53, 0x9f, 0x7b, 0x3e, 0x73, 0x6e, 0xd8, 0xbc, 0xad, 0x96, 0x7a, 0x74, - 0xe9, 0xb9, 0xcc, 0x1f, 0x6a, 0x63, 0xdf, 0x4a, 0x54, 0x92, 0x8f, 0x11, 0x5b, 0x77, 0xa1, 0x95, - 0x8f, 0x62, 0xd2, 0x82, 0x0a, 0x9f, 0xab, 0x1b, 0x56, 0xf8, 0xdc, 0xb2, 0x12, 0x0f, 0x4c, 0x42, - 0xe9, 0x86, 0xcc, 0x1e, 0xb4, 0x0b, 0x61, 0x9d, 0x31, 0xb7, 0x91, 0x35, 0xb7, 0xd5, 0x86, 0xb5, - 0x5c, 0x34, 0x5b, 0x9f, 0x2f, 0x43, 0xd3, 0x66, 0x71, 0x28, 0x9c, 0x89, 0x1c, 0x81, 0xc9, 0xe6, - 0x43, 0x26, 0x13, 0xa9, 0x51, 0x48, 0x53, 0x52, 0xe6, 0x91, 0xe6, 0x8b, 0x80, 0x4e, 0x84, 0xc9, - 0x5e, 0x0e, 0x04, 0x6e, 0x15, 0x95, 0xb2, 0x28, 0xb0, 0x9f, 0x47, 0x81, 0x8d, 0x82, 0x6c, 0x01, - 0x06, 0xf6, 0x72, 0x30, 0x50, 0x5c, 0x38, 0x87, 0x03, 0xf7, 0x4a, 0x70, 0xa0, 0x78, 0xfc, 0x05, - 0x40, 0x70, 0xaf, 0x04, 0x08, 0x3a, 0x37, 0xf6, 0x2a, 0x45, 0x82, 0xfd, 0x3c, 0x12, 0x14, 0xaf, - 0x53, 0x80, 0x82, 0x0f, 0xcb, 0xa0, 0xe0, 0x4e, 0x41, 0x67, 0x21, 0x16, 0xbc, 0x77, 0x03, 0x0b, - 0x36, 0x0b, 0xaa, 0x25, 0x60, 0x70, 0x2f, 0x97, 0xa5, 0xa1, 0xf4, 0x6e, 0xe5, 0x69, 0x9a, 0x7c, - 0xef, 0x26, 0x8e, 0x6c, 0x15, 0x3f, 0x6d, 0x19, 0x90, 0x1c, 0x14, 0x80, 0xe4, 0x76, 0xf1, 0x94, - 0x05, 0x24, 0x49, 0xf1, 0x60, 0x4f, 0xc4, 0x7d, 0xc1, 0xd3, 0x44, 0x8e, 0x60, 0x51, 0x14, 0x44, - 0x2a, 0x61, 0xcb, 0x89, 0xb5, 0x2b, 0x32, 0x51, 0xea, 0x5f, 0x2f, 0xc1, 0x0e, 0x74, 0xfa, 0x8c, - 0x77, 0x59, 0xbf, 0x32, 0x52, 0x5d, 0x8c, 0xe8, 0x6c, 0x16, 0x33, 0x55, 0x16, 0xcb, 0x40, 0x4a, - 0x25, 0x07, 0x29, 0xe4, 0x3b, 0xf0, 0x1a, 0xa6, 0x11, 0xb4, 0x8b, 0x93, 0x4b, 0x6b, 0x6d, 0xc1, - 0x90, 0x06, 0x91, 0xf9, 0xed, 0x1d, 0xb8, 0x95, 0x91, 0x15, 0x29, 0x16, 0x53, 0x58, 0x0d, 0x83, - 0x77, 0x3d, 0x91, 0x3e, 0x0e, 0xc3, 0x13, 0x1a, 0x8f, 0xad, 0x1f, 0xa5, 0xf7, 0x4f, 0xe1, 0x8a, - 0x40, 0x6d, 0x18, 0xb8, 0xf2, 0x5a, 0x6b, 0x36, 0x8e, 0x05, 0x84, 0x4d, 0x82, 0x11, 0xee, 0x6a, - 0xda, 0x62, 0x28, 0xa4, 0x92, 0x48, 0x31, 0x65, 0x48, 0x58, 0xbf, 0x34, 0xd2, 0xf5, 0x52, 0x04, - 0x2b, 0x03, 0x1b, 0xe3, 0x7f, 0x01, 0x9b, 0xca, 0xab, 0x81, 0x8d, 0x75, 0x6d, 0xa4, 0x5f, 0x24, - 0x81, 0x91, 0xaf, 0x77, 0x45, 0xe1, 0x1c, 0x9e, 0xef, 0xb2, 0x39, 0x06, 0x7c, 0xd5, 0x96, 0x13, - 0x8d, 0xf0, 0x75, 0x34, 0x73, 0x1e, 0xe1, 0x1b, 0x48, 0x93, 0x13, 0xf2, 0x06, 0xc2, 0x4f, 0x70, - 0xa1, 0x22, 0x71, 0xad, 0xa7, 0xca, 0xdc, 0x33, 0x41, 0xb4, 0x25, 0x2f, 0x93, 0x4c, 0xcd, 0x1c, - 0x76, 0xbd, 0x0e, 0xa6, 0x38, 0x68, 0x1c, 0xd2, 0x21, 0xc3, 0xc0, 0x32, 0xed, 0x94, 0x60, 0x9d, - 0x01, 0xb9, 0x19, 0xd0, 0xe4, 0x03, 0xa8, 0x71, 0x3a, 0x12, 0xf6, 0x16, 0x26, 0x6b, 0xf5, 0x64, - 0x65, 0xde, 0xfb, 0xf8, 0xfc, 0x8c, 0x7a, 0x51, 0x7f, 0x53, 0x98, 0xea, 0x1f, 0x2f, 0x76, 0x5a, - 0x42, 0x66, 0x3f, 0x98, 0x7a, 0x9c, 0x4d, 0x43, 0x7e, 0x65, 0xa3, 0x8e, 0xf5, 0x4f, 0x43, 0x24, - 0xfa, 0x5c, 0xa0, 0x97, 0x1a, 0x4e, 0x7b, 0x73, 0x25, 0x83, 0xc9, 0x5f, 0xcd, 0x98, 0xdf, 0x04, - 0x18, 0xd1, 0xd8, 0xf9, 0x8c, 0xfa, 0x9c, 0xb9, 0xca, 0xa2, 0xe6, 0x88, 0xc6, 0x3f, 0x43, 0x82, - 0x28, 0x60, 0x04, 0x7b, 0x16, 0x33, 0x17, 0x4d, 0x5b, 0xb5, 0x1b, 0x23, 0x1a, 0x3f, 0x8d, 0x99, - 0x9b, 0xdc, 0xab, 0xf1, 0xea, 0xf7, 0xca, 0xdb, 0xb1, 0x59, 0xb4, 0xe3, 0xbf, 0x32, 0x3e, 0x9c, - 0x62, 0xe0, 0xff, 0xff, 0xbd, 0xff, 0x6e, 0x08, 0xe8, 0xcf, 0x67, 0x59, 0x72, 0x0a, 0xaf, 0x25, - 0x71, 0xe4, 0xcc, 0x30, 0xbe, 0xb4, 0x2f, 0xbd, 0x3c, 0xfc, 0xd6, 0x2f, 0xf3, 0xe4, 0x98, 0xfc, - 0x18, 0xb6, 0x0a, 0x59, 0x20, 0x59, 0xb0, 0xf2, 0xd2, 0x64, 0x70, 0x3b, 0x9f, 0x0c, 0xf4, 0x7a, - 0xda, 0x12, 0xd5, 0xaf, 0xe1, 0xd9, 0xdf, 0x12, 0x75, 0x50, 0x16, 0x1b, 0xca, 0xbe, 0xa5, 0xf5, - 0x0b, 0x03, 0xda, 0x85, 0xc3, 0x90, 0x03, 0x00, 0x99, 0x5a, 0x63, 0xef, 0xb9, 0xae, 0xc9, 0xd7, - 0xd5, 0xc1, 0xd1, 0x64, 0x8f, 0xbd, 0xe7, 0xcc, 0x36, 0x07, 0x7a, 0x48, 0x3e, 0x82, 0x36, 0x53, - 0x95, 0x99, 0xce, 0x7d, 0x95, 0x1c, 0x48, 0xe9, 0xba, 0x4d, 0xdd, 0xb6, 0xc5, 0x72, 0x73, 0xeb, - 0x18, 0xcc, 0x64, 0x5d, 0xf2, 0x0d, 0x30, 0xa7, 0x74, 0xae, 0xea, 0x65, 0x59, 0x69, 0x35, 0xa7, - 0x74, 0x8e, 0xa5, 0x32, 0xd9, 0x82, 0x86, 0x60, 0x8e, 0xa8, 0xdc, 0xa1, 0x6a, 0xd7, 0xa7, 0x74, - 0xfe, 0x43, 0x1a, 0x5b, 0x7b, 0xd0, 0xca, 0x6f, 0xa2, 0x45, 0x35, 0x76, 0x49, 0xd1, 0xe3, 0x11, - 0xb3, 0x1e, 0x43, 0x2b, 0x5f, 0x92, 0x8a, 0x3c, 0x16, 0x05, 0x33, 0xdf, 0x45, 0xc1, 0x65, 0x5b, - 0x4e, 0x44, 0x3f, 0x7a, 0x19, 0xc8, 0x4f, 0x97, 0xad, 0x41, 0xcf, 0x03, 0xce, 0x32, 0x85, 0xac, - 0x94, 0xb1, 0xfe, 0x50, 0x83, 0xba, 0xac, 0x8f, 0xc9, 0x9b, 0x99, 0x96, 0x04, 0xc1, 0xaf, 0xbf, - 0x72, 0xfd, 0x62, 0xa7, 0x81, 0x38, 0x71, 0xfa, 0x30, 0xed, 0x4f, 0xd2, 0x14, 0x58, 0xc9, 0xa5, - 0x40, 0xdd, 0x0c, 0x55, 0x5f, 0xb9, 0x19, 0xda, 0x82, 0x86, 0x3f, 0x9b, 0x3a, 0x7c, 0x1e, 0x63, - 0x24, 0x56, 0xed, 0xba, 0x3f, 0x9b, 0x3e, 0x99, 0xc7, 0xc2, 0xa6, 0x3c, 0xe0, 0x74, 0x82, 0x2c, - 0x19, 0x8a, 0x4d, 0x24, 0x08, 0xe6, 0x11, 0xac, 0x65, 0xe0, 0xd4, 0x73, 0x55, 0xad, 0xd6, 0xca, - 0x7e, 0xf1, 0xd3, 0x87, 0xea, 0xba, 0x2b, 0x09, 0xbc, 0x9e, 0xba, 0x64, 0x37, 0x5f, 0xfb, 0x23, - 0x0a, 0x4b, 0x28, 0xc8, 0x94, 0xf7, 0x02, 0x83, 0xc5, 0x01, 0x84, 0xbb, 0x49, 0x91, 0x26, 0x8a, - 0x34, 0x05, 0x01, 0x99, 0x6f, 0x41, 0x3b, 0x05, 0x32, 0x29, 0x62, 0xca, 0x55, 0x52, 0x32, 0x0a, - 0xbe, 0x0b, 0x1b, 0x3e, 0x9b, 0x73, 0xa7, 0x28, 0x0d, 0x28, 0x4d, 0x04, 0xef, 0x3c, 0xaf, 0xf1, - 0x6d, 0x68, 0xa5, 0x01, 0x89, 0xb2, 0x2b, 0xb2, 0x03, 0x4b, 0xa8, 0x28, 0x76, 0x07, 0x9a, 0x49, - 0x19, 0xb1, 0x8a, 0x02, 0x0d, 0x2a, 0xab, 0x87, 0xa4, 0x30, 0x89, 0x58, 0x3c, 0x9b, 0x70, 0xb5, - 0xc8, 0x1a, 0xca, 0x60, 0x61, 0x62, 0x4b, 0x3a, 0xca, 0xbe, 0x01, 0x6b, 0x49, 0x1c, 0xa0, 0x5c, - 0x0b, 0xe5, 0x56, 0x35, 0x11, 0x85, 0xf6, 0x60, 0x3d, 0x8c, 0x82, 0x30, 0x88, 0x59, 0xe4, 0x50, - 0xd7, 0x8d, 0x58, 0x1c, 0x77, 0xda, 0x72, 0x3d, 0x4d, 0x3f, 0x96, 0x64, 0xeb, 0xe7, 0xd0, 0x50, - 0xd6, 0x2f, 0xed, 0xd3, 0xbe, 0x0f, 0xab, 0x21, 0x8d, 0xc4, 0x99, 0xb2, 0xdd, 0x9a, 0xae, 0x96, - 0xcf, 0x68, 0x24, 0xda, 0xf3, 0x5c, 0xd3, 0xb6, 0x82, 0xf2, 0x92, 0x64, 0xdd, 0x83, 0xb5, 0x9c, - 0x8c, 0x08, 0x03, 0x74, 0x0a, 0x1d, 0x06, 0x38, 0x49, 0x76, 0xae, 0xa4, 0x3b, 0x5b, 0xf7, 0xc1, - 0x4c, 0x0c, 0x2d, 0x8a, 0x3a, 0x7d, 0x0f, 0x43, 0xd9, 0x4e, 0x4e, 0xb1, 0x11, 0x0d, 0x3e, 0x63, - 0x91, 0x2a, 0xe4, 0xe4, 0xc4, 0x7a, 0x0a, 0xed, 0x42, 0x3e, 0x25, 0xfb, 0xd0, 0x08, 0x67, 0x03, - 0x47, 0x3f, 0x20, 0xa4, 0x2d, 0xe7, 0xd9, 0x6c, 0xf0, 0x31, 0xbb, 0xd2, 0x2d, 0x67, 0x88, 0xb3, - 0x74, 0xd9, 0x4a, 0x76, 0xd9, 0x09, 0x34, 0x75, 0x68, 0x92, 0xef, 0x82, 0x99, 0xf8, 0x48, 0x21, - 0x81, 0x25, 0x5b, 0xab, 0x45, 0x53, 0x41, 0xf1, 0xa9, 0x63, 0x6f, 0xe4, 0x33, 0xd7, 0x49, 0xe3, - 0x01, 0xf7, 0x68, 0xda, 0x6d, 0xc9, 0xf8, 0x44, 0x3b, 0xbf, 0xf5, 0x2e, 0xd4, 0xe5, 0xd9, 0x84, - 0x7d, 0xc4, 0xca, 0xba, 0xce, 0x15, 0xe3, 0xd2, 0x4c, 0xfb, 0x47, 0x03, 0x9a, 0x3a, 0x45, 0x95, - 0x2a, 0xe5, 0x0e, 0x5d, 0xf9, 0xaa, 0x87, 0x5e, 0xf4, 0x08, 0xa0, 0xb3, 0x48, 0xed, 0x95, 0xb3, - 0xc8, 0x3e, 0x10, 0x99, 0x2c, 0x2e, 0x03, 0xee, 0xf9, 0x23, 0x47, 0xda, 0x5a, 0x66, 0x8d, 0x75, - 0xe4, 0x9c, 0x23, 0xe3, 0x4c, 0xd0, 0x0f, 0x3f, 0x5f, 0x86, 0xf6, 0x71, 0xff, 0xc1, 0xe9, 0x71, - 0x18, 0x4e, 0xbc, 0x21, 0xc5, 0xe2, 0xfa, 0x00, 0x6a, 0xd8, 0x3e, 0x94, 0x3c, 0x5c, 0x76, 0xcb, - 0xfa, 0x58, 0x72, 0x08, 0xcb, 0xd8, 0x45, 0x90, 0xb2, 0xf7, 0xcb, 0x6e, 0x69, 0x3b, 0x2b, 0x36, - 0x91, 0x7d, 0xc6, 0xcd, 0x67, 0xcc, 0x6e, 0x59, 0x4f, 0x4b, 0x3e, 0x02, 0x33, 0xad, 0xff, 0x17, - 0x3d, 0x66, 0x76, 0x17, 0x76, 0xb7, 0x42, 0x3f, 0xad, 0x95, 0x16, 0xbd, 0xc9, 0x75, 0x17, 0xb6, - 0x81, 0xe4, 0x08, 0x1a, 0xba, 0xc2, 0x2c, 0x7f, 0x6e, 0xec, 0x2e, 0xe8, 0x3c, 0x85, 0x79, 0x64, - 0x49, 0x5f, 0xf6, 0x26, 0xda, 0x2d, 0x6d, 0x8f, 0xc9, 0xfb, 0x50, 0x57, 0xb0, 0x5f, 0xfa, 0xe4, - 0xd8, 0x2d, 0xef, 0x1f, 0xc5, 0x25, 0xd3, 0xa6, 0x66, 0xd1, 0xbb, 0x6d, 0x77, 0x61, 0x1f, 0x4f, - 0x8e, 0x01, 0x32, 0x95, 0xf9, 0xc2, 0x07, 0xd9, 0xee, 0xe2, 0xfe, 0x9c, 0xdc, 0x87, 0x66, 0xfa, - 0xe6, 0x52, 0xfe, 0xc4, 0xda, 0x5d, 0xd4, 0x32, 0xf7, 0x5f, 0xff, 0xf7, 0x5f, 0xb6, 0x8d, 0x5f, - 0x5f, 0x6f, 0x1b, 0xbf, 0xb9, 0xde, 0x36, 0xbe, 0xbc, 0xde, 0x36, 0x7e, 0x7f, 0xbd, 0x6d, 0xfc, - 0xf9, 0x7a, 0xdb, 0xf8, 0xed, 0x5f, 0xb7, 0x8d, 0x41, 0x1d, 0xdd, 0xff, 0xbd, 0xff, 0x04, 0x00, - 0x00, 0xff, 0xff, 0x2c, 0x0a, 0x65, 0x88, 0x52, 0x18, 0x00, 0x00, +var fileDescriptor_types_484dc917594bf763 = []byte{ + // 2132 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x73, 0x23, 0x57, + 0x11, 0xf7, 0x48, 0xb2, 0xa4, 0x69, 0xdb, 0x92, 0xf7, 0xed, 0xae, 0xad, 0x15, 0xc1, 0xde, 0x9a, + 0x40, 0x62, 0x13, 0x47, 0x4e, 0x39, 0x84, 0xf2, 0x66, 0x43, 0xaa, 0xac, 0xdd, 0x05, 0x9b, 0x04, + 0x30, 0xb3, 0xbb, 0xe6, 0x42, 0xd5, 0xd4, 0x93, 0xe6, 0x59, 0x9a, 0x5a, 0x69, 0x66, 0x32, 0x33, + 0x72, 0xe4, 0x3d, 0x72, 0xce, 0x21, 0x07, 0xaa, 0xe0, 0x4f, 0xe0, 0x4f, 0xe0, 0xc8, 0x89, 0xca, + 0x91, 0xa2, 0x38, 0x2f, 0x60, 0x8a, 0x03, 0x5c, 0x29, 0xaa, 0x38, 0x52, 0xdd, 0xef, 0xcd, 0xa7, + 0x47, 0x4b, 0x36, 0xdc, 0xb8, 0x48, 0xef, 0xf5, 0xc7, 0xfb, 0xe8, 0xe9, 0xee, 0x5f, 0xf7, 0x83, + 0x0d, 0x3e, 0x18, 0x3a, 0xfb, 0xd1, 0xa5, 0x2f, 0x42, 0xf9, 0xdb, 0xf3, 0x03, 0x2f, 0xf2, 0xd8, + 0x32, 0x4d, 0xba, 0x6f, 0x8f, 0x9c, 0x68, 0x3c, 0x1b, 0xf4, 0x86, 0xde, 0x74, 0x7f, 0xe4, 0x8d, + 0xbc, 0x7d, 0xe2, 0x0e, 0x66, 0xe7, 0x34, 0xa3, 0x09, 0x8d, 0xa4, 0x56, 0x77, 0x7b, 0xe4, 0x79, + 0xa3, 0x89, 0x48, 0xa5, 0x22, 0x67, 0x2a, 0xc2, 0x88, 0x4f, 0x7d, 0x25, 0xb0, 0x55, 0x14, 0xb0, + 0x67, 0x01, 0x8f, 0x1c, 0xcf, 0x55, 0xfc, 0xc3, 0xcc, 0x7e, 0x91, 0x70, 0x6d, 0x11, 0x4c, 0x1d, + 0x37, 0xca, 0x0e, 0x27, 0xce, 0x20, 0xdc, 0x1f, 0x7a, 0xd3, 0xa9, 0xe7, 0x66, 0x0f, 0xdc, 0xbd, + 0xff, 0x5f, 0x35, 0x87, 0xc1, 0xa5, 0x1f, 0x79, 0xfb, 0x53, 0x11, 0x3c, 0x9b, 0x08, 0xf5, 0x27, + 0x95, 0x8d, 0xdf, 0xd5, 0xa0, 0x61, 0x8a, 0x4f, 0x66, 0x22, 0x8c, 0xd8, 0x0e, 0xd4, 0xc4, 0x70, + 0xec, 0x75, 0x2a, 0x77, 0xb5, 0x9d, 0x95, 0x03, 0xd6, 0x93, 0x9b, 0x28, 0xee, 0xa3, 0xe1, 0xd8, + 0x3b, 0x5e, 0x32, 0x49, 0x82, 0xbd, 0x05, 0xcb, 0xe7, 0x93, 0x59, 0x38, 0xee, 0x54, 0x49, 0xf4, + 0x66, 0x5e, 0xf4, 0x7b, 0xc8, 0x3a, 0x5e, 0x32, 0xa5, 0x0c, 0x2e, 0xeb, 0xb8, 0xe7, 0x5e, 0xa7, + 0x56, 0xb6, 0xec, 0x89, 0x7b, 0x4e, 0xcb, 0xa2, 0x04, 0x3b, 0x04, 0x08, 0x45, 0x64, 0x79, 0x3e, + 0xda, 0xa5, 0xb3, 0x4c, 0xf2, 0x9b, 0x79, 0xf9, 0xc7, 0x22, 0xfa, 0x31, 0xb1, 0x8f, 0x97, 0x4c, + 0x3d, 0x8c, 0x27, 0xa8, 0xe9, 0xb8, 0x4e, 0x64, 0x0d, 0xc7, 0xdc, 0x71, 0x3b, 0xf5, 0x32, 0xcd, + 0x13, 0xd7, 0x89, 0x1e, 0x20, 0x1b, 0x35, 0x9d, 0x78, 0x82, 0x57, 0xf9, 0x64, 0x26, 0x82, 0xcb, + 0x4e, 0xa3, 0xec, 0x2a, 0x3f, 0x41, 0x16, 0x5e, 0x85, 0x64, 0xd8, 0x7d, 0x58, 0x19, 0x88, 0x91, + 0xe3, 0x5a, 0x83, 0x89, 0x37, 0x7c, 0xd6, 0x69, 0x92, 0x4a, 0x27, 0xaf, 0xd2, 0x47, 0x81, 0x3e, + 0xf2, 0x8f, 0x97, 0x4c, 0x18, 0x24, 0x33, 0x76, 0x00, 0xcd, 0xe1, 0x58, 0x0c, 0x9f, 0x59, 0xd1, + 0xbc, 0xa3, 0x93, 0xe6, 0xed, 0xbc, 0xe6, 0x03, 0xe4, 0x3e, 0x99, 0x1f, 0x2f, 0x99, 0x8d, 0xa1, + 0x1c, 0xb2, 0xf7, 0x40, 0x17, 0xae, 0xad, 0xb6, 0x5b, 0x21, 0xa5, 0x8d, 0xc2, 0x77, 0x71, 0xed, + 0x78, 0xb3, 0xa6, 0x50, 0x63, 0xd6, 0x83, 0x3a, 0x3a, 0x8a, 0x13, 0x75, 0x56, 0x49, 0xe7, 0x56, + 0x61, 0x23, 0xe2, 0x1d, 0x2f, 0x99, 0x4a, 0x0a, 0xcd, 0x67, 0x8b, 0x89, 0x73, 0x21, 0x02, 0x3c, + 0xdc, 0xcd, 0x32, 0xf3, 0x3d, 0x94, 0x7c, 0x3a, 0x9e, 0x6e, 0xc7, 0x93, 0x7e, 0x03, 0x96, 0x2f, + 0xf8, 0x64, 0x26, 0x8c, 0x37, 0x61, 0x25, 0xe3, 0x29, 0xac, 0x03, 0x8d, 0xa9, 0x08, 0x43, 0x3e, + 0x12, 0x1d, 0xed, 0xae, 0xb6, 0xa3, 0x9b, 0xf1, 0xd4, 0x68, 0xc1, 0x6a, 0xd6, 0x4f, 0x32, 0x8a, + 0xe8, 0x0b, 0xa8, 0x78, 0x21, 0x82, 0x10, 0x1d, 0x40, 0x29, 0xaa, 0xa9, 0xf1, 0x3e, 0xac, 0x17, + 0x9d, 0x80, 0xad, 0x43, 0xf5, 0x99, 0xb8, 0x54, 0x92, 0x38, 0x64, 0xb7, 0xd4, 0x81, 0xc8, 0x8b, + 0x75, 0x53, 0x9d, 0xee, 0xf3, 0x4a, 0xa2, 0x9c, 0xf8, 0x01, 0x3b, 0x84, 0x1a, 0x46, 0x29, 0x69, + 0xaf, 0x1c, 0x74, 0x7b, 0x32, 0x42, 0x7b, 0x71, 0x84, 0xf6, 0x9e, 0xc4, 0x21, 0xdc, 0x6f, 0x7e, + 0xf1, 0x62, 0x7b, 0xe9, 0xf3, 0x3f, 0x6d, 0x6b, 0x26, 0x69, 0xb0, 0x3b, 0xf8, 0x29, 0xb9, 0xe3, + 0x5a, 0x8e, 0xad, 0xf6, 0x69, 0xd0, 0xfc, 0xc4, 0x66, 0x47, 0xb0, 0x3e, 0xf4, 0xdc, 0x50, 0xb8, + 0xe1, 0x2c, 0xb4, 0x7c, 0x1e, 0xf0, 0x69, 0xa8, 0xa2, 0x24, 0xfe, 0x70, 0x0f, 0x62, 0xf6, 0x29, + 0x71, 0xcd, 0xf6, 0x30, 0x4f, 0x60, 0x1f, 0x00, 0x5c, 0xf0, 0x89, 0x63, 0xf3, 0xc8, 0x0b, 0xc2, + 0x4e, 0xed, 0x6e, 0x35, 0xa3, 0x7c, 0x16, 0x33, 0x9e, 0xfa, 0x36, 0x8f, 0x44, 0xbf, 0x86, 0x27, + 0x33, 0x33, 0xf2, 0xec, 0x0d, 0x68, 0x73, 0xdf, 0xb7, 0xc2, 0x88, 0x47, 0xc2, 0x1a, 0x5c, 0x46, + 0x22, 0xa4, 0x48, 0x5a, 0x35, 0xd7, 0xb8, 0xef, 0x3f, 0x46, 0x6a, 0x1f, 0x89, 0x86, 0x9d, 0x7c, + 0x07, 0x72, 0x72, 0xc6, 0xa0, 0x66, 0xf3, 0x88, 0x93, 0x35, 0x56, 0x4d, 0x1a, 0x23, 0xcd, 0xe7, + 0xd1, 0x58, 0xdd, 0x91, 0xc6, 0x6c, 0x03, 0xea, 0x63, 0xe1, 0x8c, 0xc6, 0x11, 0x5d, 0xab, 0x6a, + 0xaa, 0x19, 0x1a, 0xde, 0x0f, 0xbc, 0x0b, 0x41, 0x71, 0xde, 0x34, 0xe5, 0xc4, 0xf8, 0x9b, 0x06, + 0x37, 0xae, 0x05, 0x06, 0xae, 0x3b, 0xe6, 0xe1, 0x38, 0xde, 0x0b, 0xc7, 0xec, 0x2d, 0x5c, 0x97, + 0xdb, 0x22, 0x50, 0xf9, 0x67, 0x4d, 0xdd, 0xf8, 0x98, 0x88, 0xea, 0xa2, 0x4a, 0x84, 0x3d, 0x82, + 0xf5, 0x09, 0x0f, 0x23, 0x4b, 0xfa, 0xaf, 0x45, 0xf9, 0xa5, 0x9a, 0x8b, 0xa9, 0x8f, 0x79, 0xec, + 0xe7, 0xe8, 0x56, 0x4a, 0xbd, 0x35, 0xc9, 0x51, 0xd9, 0x31, 0xdc, 0x1a, 0x5c, 0x3e, 0xe7, 0x6e, + 0xe4, 0xb8, 0xc2, 0xba, 0x66, 0xf3, 0xb6, 0x5a, 0xea, 0xd1, 0x85, 0x63, 0x0b, 0x77, 0x18, 0x1b, + 0xfb, 0x66, 0xa2, 0x92, 0x7c, 0x8c, 0xd0, 0xb8, 0x0b, 0xad, 0x7c, 0x14, 0xb3, 0x16, 0x54, 0xa2, + 0xb9, 0xba, 0x61, 0x25, 0x9a, 0x1b, 0x46, 0xe2, 0x81, 0x49, 0x28, 0x5d, 0x93, 0xd9, 0x85, 0x76, + 0x21, 0xac, 0x33, 0xe6, 0xd6, 0xb2, 0xe6, 0x36, 0xda, 0xb0, 0x96, 0x8b, 0x66, 0xe3, 0xb3, 0x65, + 0x68, 0x9a, 0x22, 0xf4, 0xd1, 0x99, 0xd8, 0x21, 0xe8, 0x62, 0x3e, 0x14, 0x32, 0x91, 0x6a, 0x85, + 0x34, 0x25, 0x65, 0x1e, 0xc5, 0x7c, 0x0c, 0xe8, 0x44, 0x98, 0xed, 0xe6, 0x40, 0xe0, 0x66, 0x51, + 0x29, 0x8b, 0x02, 0x7b, 0x79, 0x14, 0xb8, 0x55, 0x90, 0x2d, 0xc0, 0xc0, 0x6e, 0x0e, 0x06, 0x8a, + 0x0b, 0xe7, 0x70, 0xe0, 0x5e, 0x09, 0x0e, 0x14, 0x8f, 0xbf, 0x00, 0x08, 0xee, 0x95, 0x00, 0x41, + 0xe7, 0xda, 0x5e, 0xa5, 0x48, 0xb0, 0x97, 0x47, 0x82, 0xe2, 0x75, 0x0a, 0x50, 0xf0, 0x41, 0x19, + 0x14, 0xdc, 0x29, 0xe8, 0x2c, 0xc4, 0x82, 0x77, 0xaf, 0x61, 0xc1, 0x46, 0x41, 0xb5, 0x04, 0x0c, + 0xee, 0xe5, 0xb2, 0x34, 0x94, 0xde, 0xad, 0x3c, 0x4d, 0xb3, 0xef, 0x5c, 0xc7, 0x91, 0xcd, 0xe2, + 0xa7, 0x2d, 0x03, 0x92, 0xfd, 0x02, 0x90, 0xdc, 0x2e, 0x9e, 0xb2, 0x80, 0x24, 0x29, 0x1e, 0xec, + 0x62, 0xdc, 0x17, 0x3c, 0x0d, 0x73, 0x84, 0x08, 0x02, 0x2f, 0x50, 0x09, 0x5b, 0x4e, 0x8c, 0x1d, + 0xcc, 0x44, 0xa9, 0x7f, 0xbd, 0x04, 0x3b, 0xc8, 0xe9, 0x33, 0xde, 0x65, 0xfc, 0x52, 0x4b, 0x75, + 0x29, 0xa2, 0xb3, 0x59, 0x4c, 0x57, 0x59, 0x2c, 0x03, 0x29, 0x95, 0x1c, 0xa4, 0xb0, 0x6f, 0xc1, + 0x0d, 0x4a, 0x23, 0x64, 0x17, 0x2b, 0x97, 0xd6, 0xda, 0xc8, 0x90, 0x06, 0x91, 0xf9, 0xed, 0x6d, + 0xb8, 0x99, 0x91, 0xc5, 0x14, 0x4b, 0x29, 0xac, 0x46, 0xc1, 0xbb, 0x9e, 0x48, 0x1f, 0xf9, 0xfe, + 0x31, 0x0f, 0xc7, 0xc6, 0x0f, 0xd3, 0xfb, 0xa7, 0x70, 0xc5, 0xa0, 0x36, 0xf4, 0x6c, 0x79, 0xad, + 0x35, 0x93, 0xc6, 0x08, 0x61, 0x13, 0x6f, 0x44, 0xbb, 0xea, 0x26, 0x0e, 0x51, 0x2a, 0x89, 0x14, + 0x5d, 0x86, 0x84, 0xf1, 0x0b, 0x2d, 0x5d, 0x2f, 0x45, 0xb0, 0x32, 0xb0, 0xd1, 0xfe, 0x17, 0xb0, + 0xa9, 0xbc, 0x1a, 0xd8, 0x18, 0x57, 0x5a, 0xfa, 0x45, 0x12, 0x18, 0xf9, 0x6a, 0x57, 0x44, 0xe7, + 0x70, 0x5c, 0x5b, 0xcc, 0x29, 0xe0, 0xab, 0xa6, 0x9c, 0xc4, 0x08, 0x5f, 0x27, 0x33, 0xe7, 0x11, + 0xbe, 0x41, 0x34, 0x39, 0x61, 0xaf, 0x13, 0xfc, 0x78, 0xe7, 0x2a, 0x12, 0xd7, 0x7a, 0xaa, 0xcc, + 0x3d, 0x45, 0xa2, 0x29, 0x79, 0x99, 0x64, 0xaa, 0xe7, 0xb0, 0xeb, 0x35, 0xd0, 0xf1, 0xa0, 0xa1, + 0xcf, 0x87, 0x82, 0x02, 0x4b, 0x37, 0x53, 0x82, 0x71, 0x0a, 0xec, 0x7a, 0x40, 0xb3, 0xf7, 0xa1, + 0x16, 0xf1, 0x11, 0xda, 0x1b, 0x4d, 0xd6, 0xea, 0xc9, 0xca, 0xbc, 0xf7, 0xd1, 0xd9, 0x29, 0x77, + 0x82, 0xfe, 0x06, 0x9a, 0xea, 0x1f, 0x2f, 0xb6, 0x5b, 0x28, 0xb3, 0xe7, 0x4d, 0x9d, 0x48, 0x4c, + 0xfd, 0xe8, 0xd2, 0x24, 0x1d, 0xe3, 0x9f, 0x1a, 0x26, 0xfa, 0x5c, 0xa0, 0x97, 0x1a, 0x2e, 0xf6, + 0xe6, 0x4a, 0x06, 0x93, 0xbf, 0x9c, 0x31, 0xbf, 0x0e, 0x30, 0xe2, 0xa1, 0xf5, 0x29, 0x77, 0x23, + 0x61, 0x2b, 0x8b, 0xea, 0x23, 0x1e, 0xfe, 0x94, 0x08, 0x58, 0xc0, 0x20, 0x7b, 0x16, 0x0a, 0x9b, + 0x4c, 0x5b, 0x35, 0x1b, 0x23, 0x1e, 0x3e, 0x0d, 0x85, 0x9d, 0xdc, 0xab, 0xf1, 0xea, 0xf7, 0xca, + 0xdb, 0xb1, 0x59, 0xb4, 0xe3, 0xbf, 0x32, 0x3e, 0x9c, 0x62, 0xe0, 0xff, 0xff, 0xbd, 0xff, 0xae, + 0x21, 0xf4, 0xe7, 0xb3, 0x2c, 0x3b, 0x81, 0x1b, 0x49, 0x1c, 0x59, 0x33, 0x8a, 0xaf, 0xd8, 0x97, + 0x5e, 0x1e, 0x7e, 0xeb, 0x17, 0x79, 0x72, 0xc8, 0x7e, 0x04, 0x9b, 0x85, 0x2c, 0x90, 0x2c, 0x58, + 0x79, 0x69, 0x32, 0xb8, 0x9d, 0x4f, 0x06, 0xf1, 0x7a, 0xb1, 0x25, 0xaa, 0x5f, 0xc1, 0xb3, 0xbf, + 0x81, 0x75, 0x50, 0x16, 0x1b, 0xca, 0xbe, 0xa5, 0xf1, 0x73, 0x0d, 0xda, 0x85, 0xc3, 0xb0, 0x7d, + 0x00, 0x99, 0x5a, 0x43, 0xe7, 0x79, 0x5c, 0x93, 0xaf, 0xab, 0x83, 0x93, 0xc9, 0x1e, 0x3b, 0xcf, + 0x85, 0xa9, 0x0f, 0xe2, 0x21, 0xfb, 0x10, 0xda, 0x42, 0x55, 0x66, 0x71, 0xee, 0xab, 0xe4, 0x40, + 0x2a, 0xae, 0xdb, 0xd4, 0x6d, 0x5b, 0x22, 0x37, 0x37, 0x8e, 0x40, 0x4f, 0xd6, 0x65, 0x5f, 0x03, + 0x7d, 0xca, 0xe7, 0xaa, 0x5e, 0x96, 0x95, 0x56, 0x73, 0xca, 0xe7, 0x54, 0x2a, 0xb3, 0x4d, 0x68, + 0x20, 0x73, 0xc4, 0xe5, 0x0e, 0x55, 0xb3, 0x3e, 0xe5, 0xf3, 0xef, 0xf3, 0xd0, 0xf8, 0x01, 0xb4, + 0xf2, 0x9b, 0xb0, 0x43, 0x29, 0x1a, 0x63, 0x17, 0x96, 0x04, 0xc5, 0xb6, 0xe2, 0xa1, 0x6a, 0xfc, + 0xfb, 0xb5, 0x5f, 0x61, 0x47, 0x81, 0x6b, 0x1d, 0x8d, 0x84, 0xf1, 0x18, 0x5a, 0xf9, 0x9a, 0x15, + 0x13, 0x5d, 0xe0, 0xcd, 0x5c, 0x9b, 0x56, 0x5a, 0x36, 0xe5, 0x04, 0x1b, 0xd6, 0x0b, 0x4f, 0x7e, + 0xdb, 0x6c, 0x91, 0x7a, 0xe6, 0x45, 0x22, 0x53, 0xe9, 0x4a, 0x19, 0xe3, 0x0f, 0x35, 0xa8, 0xcb, + 0x02, 0x9a, 0xbd, 0x91, 0xe9, 0x59, 0x08, 0x1d, 0xfb, 0x2b, 0x57, 0x2f, 0xb6, 0x1b, 0x04, 0x24, + 0x27, 0x0f, 0xd3, 0x06, 0x26, 0xcd, 0x91, 0x95, 0x5c, 0x8e, 0x8c, 0xbb, 0xa5, 0xea, 0x2b, 0x77, + 0x4b, 0x9b, 0xd0, 0x70, 0x67, 0x53, 0x2b, 0x9a, 0x87, 0x14, 0xaa, 0x55, 0xb3, 0xee, 0xce, 0xa6, + 0x4f, 0xe6, 0x21, 0x1a, 0x3d, 0xf2, 0x22, 0x3e, 0x21, 0x96, 0x8c, 0xd5, 0x26, 0x11, 0x90, 0x79, + 0x08, 0x6b, 0x19, 0xbc, 0x75, 0x6c, 0x55, 0xcc, 0xb5, 0xb2, 0x2e, 0x71, 0xf2, 0x50, 0x5d, 0x77, + 0x25, 0xc1, 0xdf, 0x13, 0x9b, 0xed, 0xe4, 0x9b, 0x03, 0x82, 0x69, 0x89, 0x15, 0x99, 0xfa, 0x1f, + 0x41, 0x1a, 0x0f, 0x80, 0xfe, 0x28, 0x45, 0x9a, 0x24, 0xd2, 0x44, 0x02, 0x31, 0xdf, 0x84, 0x76, + 0x8a, 0x74, 0x52, 0x44, 0x97, 0xab, 0xa4, 0x64, 0x12, 0x7c, 0x07, 0x6e, 0xb9, 0x62, 0x1e, 0x59, + 0x45, 0x69, 0x20, 0x69, 0x86, 0xbc, 0xb3, 0xbc, 0xc6, 0x37, 0xa1, 0x95, 0x46, 0x2c, 0xc9, 0xae, + 0xc8, 0x16, 0x2d, 0xa1, 0x92, 0xd8, 0x1d, 0x68, 0x26, 0x75, 0xc6, 0x2a, 0x09, 0x34, 0xb8, 0x2c, + 0x2f, 0x92, 0xca, 0x25, 0x10, 0xe1, 0x6c, 0x12, 0xa9, 0x45, 0xd6, 0x48, 0x86, 0x2a, 0x17, 0x53, + 0xd2, 0x49, 0xf6, 0x75, 0x58, 0x4b, 0x02, 0x85, 0xe4, 0x5a, 0x24, 0xb7, 0x1a, 0x13, 0x49, 0x68, + 0x17, 0xd6, 0xfd, 0xc0, 0xf3, 0xbd, 0x50, 0x04, 0x16, 0xb7, 0xed, 0x40, 0x84, 0x61, 0xa7, 0x2d, + 0xd7, 0x8b, 0xe9, 0x47, 0x92, 0x6c, 0xfc, 0x0c, 0x1a, 0xca, 0xfa, 0xa5, 0x8d, 0xdc, 0x77, 0x61, + 0xd5, 0xe7, 0x01, 0x9e, 0x29, 0xdb, 0xce, 0xc5, 0xe5, 0xf4, 0x29, 0x0f, 0xb0, 0x7f, 0xcf, 0x75, + 0x75, 0x2b, 0x24, 0x2f, 0x49, 0xc6, 0x3d, 0x58, 0xcb, 0xc9, 0x60, 0x18, 0x90, 0x53, 0xc4, 0x61, + 0x40, 0x93, 0x64, 0xe7, 0x4a, 0xba, 0xb3, 0x71, 0x1f, 0xf4, 0xc4, 0xd0, 0x58, 0xf5, 0xc5, 0xf7, + 0xd0, 0x94, 0xed, 0xe4, 0x94, 0x3a, 0x55, 0xef, 0x53, 0x11, 0xa8, 0x4a, 0x4f, 0x4e, 0x8c, 0xa7, + 0xd0, 0x2e, 0x24, 0x5c, 0xb6, 0x07, 0x0d, 0x7f, 0x36, 0xb0, 0xe2, 0x17, 0x86, 0xb4, 0x27, 0x3d, + 0x9d, 0x0d, 0x3e, 0x12, 0x97, 0x71, 0x4f, 0xea, 0xd3, 0x2c, 0x5d, 0xb6, 0x92, 0x5d, 0x76, 0x02, + 0xcd, 0x38, 0x34, 0xd9, 0xb7, 0x41, 0x4f, 0x7c, 0xa4, 0x90, 0xe1, 0x92, 0xad, 0xd5, 0xa2, 0xa9, + 0x20, 0x7e, 0xea, 0xd0, 0x19, 0xb9, 0xc2, 0xb6, 0xd2, 0x78, 0xa0, 0x3d, 0x9a, 0x66, 0x5b, 0x32, + 0x3e, 0x8e, 0x9d, 0xdf, 0x78, 0x07, 0xea, 0xf2, 0x6c, 0x68, 0x1f, 0x5c, 0x39, 0x2e, 0x84, 0x71, + 0x5c, 0x9a, 0x8a, 0xff, 0xa8, 0x41, 0x33, 0xce, 0x61, 0xa5, 0x4a, 0xb9, 0x43, 0x57, 0xbe, 0xec, + 0xa1, 0x17, 0xbd, 0x12, 0xc4, 0x59, 0xa4, 0xf6, 0xca, 0x59, 0x64, 0x0f, 0x98, 0x4c, 0x16, 0x17, + 0x5e, 0xe4, 0xb8, 0x23, 0x4b, 0xda, 0x5a, 0x66, 0x8d, 0x75, 0xe2, 0x9c, 0x11, 0xe3, 0x14, 0xe9, + 0x07, 0x9f, 0x2d, 0x43, 0xfb, 0xa8, 0xff, 0xe0, 0xe4, 0xc8, 0xf7, 0x27, 0xce, 0x90, 0xf2, 0x2d, + 0xdb, 0x87, 0x1a, 0xf5, 0x17, 0x25, 0x2f, 0x9b, 0xdd, 0xb2, 0x46, 0x97, 0x1d, 0xc0, 0x32, 0xb5, + 0x19, 0xac, 0xec, 0x81, 0xb3, 0x5b, 0xda, 0xef, 0xe2, 0x26, 0xb2, 0x11, 0xb9, 0xfe, 0xce, 0xd9, + 0x2d, 0x6b, 0x7a, 0xd9, 0x87, 0xa0, 0xa7, 0x0d, 0xc2, 0xa2, 0xd7, 0xce, 0xee, 0xc2, 0xf6, 0x17, + 0xf5, 0xd3, 0x62, 0x6a, 0xd1, 0xa3, 0x5d, 0x77, 0x61, 0x9f, 0x88, 0x88, 0x15, 0x97, 0xa0, 0xe5, + 0xef, 0x91, 0xdd, 0x05, 0xad, 0x29, 0x9a, 0x47, 0xd6, 0xfc, 0x65, 0x8f, 0xa6, 0xdd, 0xd2, 0xfe, + 0x99, 0xbd, 0x07, 0x75, 0x55, 0x17, 0x94, 0xbe, 0x49, 0x76, 0xcb, 0x1b, 0x4c, 0xbc, 0x64, 0xda, + 0xf5, 0x2c, 0x7a, 0xd8, 0xed, 0x2e, 0x6c, 0xf4, 0xd9, 0x11, 0x40, 0xa6, 0x74, 0x5f, 0xf8, 0x62, + 0xdb, 0x5d, 0xdc, 0xc0, 0xb3, 0xfb, 0xd0, 0x4c, 0x1f, 0x65, 0xca, 0xdf, 0x60, 0xbb, 0x8b, 0x7a, + 0xea, 0xfe, 0x6b, 0xff, 0xfe, 0xcb, 0x96, 0xf6, 0xeb, 0xab, 0x2d, 0xed, 0x37, 0x57, 0x5b, 0xda, + 0x17, 0x57, 0x5b, 0xda, 0xef, 0xaf, 0xb6, 0xb4, 0x3f, 0x5f, 0x6d, 0x69, 0xbf, 0xfd, 0xeb, 0x96, + 0x36, 0xa8, 0x93, 0xfb, 0xbf, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe2, 0x85, 0x51, 0xe7, + 0x93, 0x18, 0x00, 0x00, } diff --git a/abci/types/types.proto b/abci/types/types.proto index 39c96e0e3..bf3257ff1 100644 --- a/abci/types/types.proto +++ b/abci/types/types.proto @@ -5,6 +5,7 @@ package types; // https://github.com/gogo/protobuf/blob/master/extensions.md import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/duration.proto"; import "github.com/tendermint/tendermint/libs/common/types.proto"; import "github.com/tendermint/tendermint/crypto/merkle/merkle.proto"; @@ -217,8 +218,8 @@ message BlockSize { // EvidenceParams contains limits on the evidence. message EvidenceParams { - // Note: must be greater than 0 - int64 max_age = 1; + // Note: must be greater than 0 if provided + google.protobuf.Duration max_age = 1 [(gogoproto.stdduration)=true]; } message LastCommitInfo { diff --git a/abci/types/typespb_test.go b/abci/types/typespb_test.go index 0ae0fea0d..215c3b7d9 100644 --- a/abci/types/typespb_test.go +++ b/abci/types/typespb_test.go @@ -13,6 +13,7 @@ import golang_proto "github.com/golang/protobuf/proto" import fmt "fmt" import math "math" import _ "github.com/gogo/protobuf/gogoproto" +import _ "github.com/golang/protobuf/ptypes/duration" import _ "github.com/golang/protobuf/ptypes/timestamp" import _ "github.com/tendermint/tendermint/crypto/merkle" import _ "github.com/tendermint/tendermint/libs/common" diff --git a/consensus/reactor.go b/consensus/reactor.go index bcf77fb3a..a1d7f025e 100644 --- a/consensus/reactor.go +++ b/consensus/reactor.go @@ -8,8 +8,7 @@ import ( "github.com/pkg/errors" - "github.com/tendermint/go-amino" - + amino "github.com/tendermint/go-amino" cstypes "github.com/tendermint/tendermint/consensus/types" cmn "github.com/tendermint/tendermint/libs/common" tmevents "github.com/tendermint/tendermint/libs/events" @@ -438,6 +437,7 @@ func makeRoundStepMessages(rs *cstypes.RoundState) (nrsMsg *NewRoundStepMessage, if rs.Step == cstypes.RoundStepCommit { csMsg = &CommitStepMessage{ Height: rs.Height, + Time: rs.CommitTime, BlockPartsHeader: rs.ProposalBlockParts.Header(), BlockParts: rs.ProposalBlockParts.BitArray(), } @@ -948,14 +948,22 @@ func (ps *PeerState) ToJSON() ([]byte, error) { return cdc.MarshalJSON(ps) } -// GetHeight returns an atomic snapshot of the PeerRoundState's height -// used by the mempool to ensure peers are caught up before broadcasting new txs +// GetHeight returns an atomic snapshot of the PeerRoundState's height used by +// the mempool to ensure peers are caught up before broadcasting new txs. func (ps *PeerState) GetHeight() int64 { ps.mtx.Lock() defer ps.mtx.Unlock() return ps.PRS.Height } +// GetLastBlockTime returns an atomic snapshot of the PeerRoundState's last +// block time used by the evidence reactor when sending evidence. +func (ps *PeerState) GetLastBlockTime() time.Time { + ps.mtx.Lock() + defer ps.mtx.Unlock() + return ps.PRS.LastBlockTime +} + // SetHasProposal sets the given proposal as known for the peer. func (ps *PeerState) SetHasProposal(proposal *types.Proposal) { ps.mtx.Lock() @@ -1263,6 +1271,7 @@ func (ps *PeerState) ApplyCommitStepMessage(msg *CommitStepMessage) { ps.PRS.ProposalBlockPartsHeader = msg.BlockPartsHeader ps.PRS.ProposalBlockParts = msg.BlockParts + ps.PRS.LastBlockTime = msg.Time } // ApplyProposalPOLMessage updates the peer state for the new proposal POL. @@ -1386,13 +1395,14 @@ func (m *NewRoundStepMessage) String() string { // CommitStepMessage is sent when a block is committed. type CommitStepMessage struct { Height int64 + Time time.Time BlockPartsHeader types.PartSetHeader BlockParts *cmn.BitArray } // String returns a string representation. func (m *CommitStepMessage) String() string { - return fmt.Sprintf("[CommitStep H:%v BP:%v BA:%v]", m.Height, m.BlockPartsHeader, m.BlockParts) + return fmt.Sprintf("[CommitStep H:%v T:%v BP:%v BA:%v]", m.Height, m.Time, m.BlockPartsHeader, m.BlockParts) } //------------------------------------- diff --git a/consensus/types/peer_round_state.go b/consensus/types/peer_round_state.go index e42395bc3..991f27ca4 100644 --- a/consensus/types/peer_round_state.go +++ b/consensus/types/peer_round_state.go @@ -14,6 +14,7 @@ import ( // NOTE: Read-only when returned by PeerState.GetRoundState(). type PeerRoundState struct { Height int64 `json:"height"` // Height peer is at + LastBlockTime time.Time `json:"last_block_time"` // Time the last block was created at. Round int `json:"round"` // Round peer is at, -1 if unknown. Step RoundStepType `json:"step"` // Step peer is at StartTime time.Time `json:"start_time"` // Estimated start of round 0 at this height @@ -38,7 +39,7 @@ func (prs PeerRoundState) String() string { // StringIndented returns a string representation of the PeerRoundState func (prs PeerRoundState) StringIndented(indent string) string { return fmt.Sprintf(`PeerRoundState{ -%s %v/%v/%v @%v +%s %v/%v/%v @%v (last block time @%v) %s Proposal %v -> %v %s POL %v (round %v) %s Prevotes %v @@ -46,7 +47,7 @@ func (prs PeerRoundState) StringIndented(indent string) string { %s LastCommit %v (round %v) %s Catchup %v (round %v) %s}`, - indent, prs.Height, prs.Round, prs.Step, prs.StartTime, + indent, prs.Height, prs.Round, prs.Step, prs.StartTime, prs.LastBlockTime, indent, prs.ProposalBlockPartsHeader, prs.ProposalBlockParts, indent, prs.ProposalPOL, prs.ProposalPOLRound, indent, prs.Prevotes, diff --git a/evidence/pool.go b/evidence/pool.go index 0f3d482af..5de90ad50 100644 --- a/evidence/pool.go +++ b/evidence/pool.go @@ -3,6 +3,7 @@ package evidence import ( "fmt" "sync" + "time" clist "github.com/tendermint/tendermint/libs/clist" dbm "github.com/tendermint/tendermint/libs/db" @@ -128,19 +129,27 @@ func (evpool *EvidencePool) MarkEvidenceAsCommitted(height int64, evidence []typ // remove committed evidence from the clist maxAge := evpool.State().ConsensusParams.EvidenceParams.MaxAge - evpool.removeEvidence(height, maxAge, blockEvidenceMap) - + evpool.removeEvidence( + height, + evpool.State().LastBlockTime, + maxAge, + blockEvidenceMap, + ) } -func (evpool *EvidencePool) removeEvidence(height, maxAge int64, blockEvidenceMap map[string]struct{}) { +func (evpool *EvidencePool) removeEvidence( + height int64, + lastBlockTime time.Time, + maxAge time.Duration, + blockEvidenceMap map[string]struct{}, +) { for e := evpool.evidenceList.Front(); e != nil; e = e.Next() { ev := e.Value.(types.Evidence) + evAge := lastBlockTime.Sub(ev.Time()) // Remove the evidence if it's already in a block // or if it's now too old. - if _, ok := blockEvidenceMap[evMapKey(ev)]; ok || - ev.Height() < height-maxAge { - + if _, ok := blockEvidenceMap[evMapKey(ev)]; ok || evAge > maxAge { // remove from clist evpool.evidenceList.Remove(e) e.DetachPrev() diff --git a/evidence/reactor.go b/evidence/reactor.go index cfe47364c..5384fe40f 100644 --- a/evidence/reactor.go +++ b/evidence/reactor.go @@ -91,7 +91,7 @@ func (evR *EvidenceReactor) Receive(chID byte, src p2p.Peer, msgBytes []byte) { } } -// SetEventSwitch implements events.Eventable. +// SetEventBus implements events.Eventable. func (evR *EvidenceReactor) SetEventBus(b *types.EventBus) { evR.eventBus = b } @@ -166,10 +166,11 @@ func (evR EvidenceReactor) checkSendEvidenceMessage(peer p2p.Peer, ev types.Evid // peerHeight - maxAge < evidenceHeight < peerHeight maxAge := evR.evpool.State().ConsensusParams.EvidenceParams.MaxAge peerHeight := peerState.GetHeight() + peerLastBlockTime := peerState.GetLastBlockTime() if peerHeight < evHeight { // peer is behind. sleep while he catches up return nil, true - } else if peerHeight > evHeight+maxAge { + } else if peerLastBlockTime.Sub(ev.Time()) > maxAge { // evidence is too old, skip // NOTE: if evidence is too old for an honest peer, // then we're behind and either it already got committed or it never will! @@ -185,6 +186,7 @@ func (evR EvidenceReactor) checkSendEvidenceMessage(peer p2p.Peer, ev types.Evid // PeerState describes the state of a peer. type PeerState interface { GetHeight() int64 + GetLastBlockTime() time.Time } //----------------------------------------------------------------------------- diff --git a/evidence/reactor_test.go b/evidence/reactor_test.go index ea9657d23..677897e03 100644 --- a/evidence/reactor_test.go +++ b/evidence/reactor_test.go @@ -14,6 +14,7 @@ import ( "github.com/tendermint/tendermint/libs/log" "github.com/tendermint/tendermint/p2p" "github.com/tendermint/tendermint/types" + tmtime "github.com/tendermint/tendermint/types/time" ) // evidenceLogger is a TestingLogger which uses a different @@ -132,7 +133,7 @@ func TestReactorBroadcastEvidence(t *testing.T) { // set the peer height on each reactor for _, r := range reactors { for _, peer := range r.Switch.Peers().List() { - ps := peerState{height} + ps := testPeerState{height, tmtime.Now()} peer.Set(types.PeerStateKey, ps) } } @@ -143,14 +144,21 @@ func TestReactorBroadcastEvidence(t *testing.T) { waitForEvidence(t, evList, reactors) } -type peerState struct { +type testPeerState struct { height int64 + time time.Time } -func (ps peerState) GetHeight() int64 { +var _ PeerState = (*testPeerState)(nil) + +func (ps testPeerState) GetHeight() int64 { return ps.height } +func (ps testPeerState) GetLastBlockTime() time.Time { + return ps.time +} + func TestReactorSelectiveBroadcast(t *testing.T) { config := cfg.TestConfig() @@ -165,7 +173,7 @@ func TestReactorSelectiveBroadcast(t *testing.T) { // make reactors from statedb reactors := makeAndConnectEvidenceReactors(config, []dbm.DB{stateDB1, stateDB2}) peer := reactors[0].Switch.Peers().List()[0] - ps := peerState{height2} + ps := testPeerState{height2, tmtime.Now()} peer.Set(types.PeerStateKey, ps) // send a bunch of valid evidence to the first reactor's evpool diff --git a/state/state_test.go b/state/state_test.go index 2c777307a..a0ead58c4 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -386,7 +387,7 @@ func TestConsensusParamsChangesSaveLoad(t *testing.T) { } } -func makeParams(blockBytes, blockGas, evidenceAge int64) types.ConsensusParams { +func makeParams(blockBytes, blockGas int64, evidenceAge time.Duration) types.ConsensusParams { return types.ConsensusParams{ BlockSize: types.BlockSize{ MaxBytes: blockBytes, @@ -403,7 +404,8 @@ func pk() []byte { } func TestApplyUpdates(t *testing.T) { - initParams := makeParams(1, 2, 3) + initParams := makeParams(1, 2, 3*time.Second) + newMaxAge := 66 * time.Second cases := [...]struct { init types.ConsensusParams @@ -419,14 +421,14 @@ func TestApplyUpdates(t *testing.T) { MaxGas: 55, }, }, - makeParams(44, 55, 3)}, + makeParams(44, 55, 3*time.Second)}, 3: {initParams, abci.ConsensusParams{ EvidenceParams: &abci.EvidenceParams{ - MaxAge: 66, + MaxAge: &newMaxAge, }, }, - makeParams(1, 2, 66)}, + makeParams(1, 2, 66*time.Second)}, } for i, tc := range cases { diff --git a/state/validation.go b/state/validation.go index a308870e5..14e4ff9da 100644 --- a/state/validation.go +++ b/state/validation.go @@ -168,13 +168,11 @@ func validateBlock(stateDB dbm.DB, state State, block *types.Block) error { // - it is internally consistent // - it was properly signed by the alleged equivocator func VerifyEvidence(stateDB dbm.DB, state State, evidence types.Evidence) error { - height := state.LastBlockHeight - - evidenceAge := height - evidence.Height() + evidenceAge := state.LastBlockTime.Sub(evidence.Time()) maxAge := state.ConsensusParams.EvidenceParams.MaxAge if evidenceAge > maxAge { - return fmt.Errorf("Evidence from height %d is too old. Min height is %d", - evidence.Height(), height-maxAge) + return fmt.Errorf("Evidence from %v is too old. Expecting evidence no older than %v", + evidence.Time(), state.LastBlockTime.Add(-maxAge)) } valset, err := LoadValidators(stateDB, evidence.Height()) diff --git a/types/evidence.go b/types/evidence.go index 57523ab1e..87beb9ddf 100644 --- a/types/evidence.go +++ b/types/evidence.go @@ -3,8 +3,10 @@ package types import ( "bytes" "fmt" + "time" "github.com/tendermint/tendermint/crypto/tmhash" + tmtime "github.com/tendermint/tendermint/types/time" amino "github.com/tendermint/go-amino" @@ -54,6 +56,7 @@ func (err *ErrEvidenceOverflow) Error() string { // Evidence represents any provable malicious activity by a validator type Evidence interface { Height() int64 // height of the equivocation + Time() time.Time // when the evidence was created Address() []byte // address of the equivocating validator Bytes() []byte // bytes which compromise the evidence Hash() []byte // hash of the evidence @@ -102,6 +105,11 @@ func (dve *DuplicateVoteEvidence) Height() int64 { return dve.VoteA.Height } +// Time returns the time when the evidence was created. +func (dve *DuplicateVoteEvidence) Time() time.Time { + return dve.VoteA.Timestamp +} + // Address returns the address of the validator. func (dve *DuplicateVoteEvidence) Address() []byte { return dve.PubKey.Address() @@ -188,6 +196,7 @@ func NewMockGoodEvidence(height int64, idx int, address []byte) MockGoodEvidence } func (e MockGoodEvidence) Height() int64 { return e.Height_ } +func (e MockGoodEvidence) Time() time.Time { return tmtime.Now() } func (e MockGoodEvidence) Address() []byte { return e.Address_ } func (e MockGoodEvidence) Hash() []byte { return []byte(fmt.Sprintf("%d-%x", e.Height_, e.Address_)) diff --git a/types/params.go b/types/params.go index ed1e7963b..cf64a43b7 100644 --- a/types/params.go +++ b/types/params.go @@ -1,6 +1,8 @@ package types import ( + "time" + abci "github.com/tendermint/tendermint/abci/types" "github.com/tendermint/tendermint/crypto/tmhash" cmn "github.com/tendermint/tendermint/libs/common" @@ -29,7 +31,7 @@ type BlockSize struct { // EvidenceParams determine how we handle evidence of malfeasance type EvidenceParams struct { - MaxAge int64 `json:"max_age"` // only accept new evidence more recent than this + MaxAge time.Duration `json:"max_age"` // only accept new evidence more recent than this } // DefaultConsensusParams returns a default ConsensusParams. @@ -51,7 +53,7 @@ func DefaultBlockSize() BlockSize { // DefaultEvidenceParams Params returns a default EvidenceParams. func DefaultEvidenceParams() EvidenceParams { return EvidenceParams{ - MaxAge: 100000, // 27.8 hrs at 1block/s + MaxAge: 48 * time.Hour, } } @@ -109,7 +111,9 @@ func (params ConsensusParams) Update(params2 *abci.ConsensusParams) ConsensusPar res.BlockSize.MaxGas = params2.BlockSize.MaxGas } if params2.EvidenceParams != nil { - res.EvidenceParams.MaxAge = params2.EvidenceParams.MaxAge + if params2.EvidenceParams.MaxAge != nil { + res.EvidenceParams.MaxAge = *params2.EvidenceParams.MaxAge + } } return res } diff --git a/types/params_test.go b/types/params_test.go index 2936e5a4e..be4ed7da4 100644 --- a/types/params_test.go +++ b/types/params_test.go @@ -4,6 +4,7 @@ import ( "bytes" "sort" "testing" + "time" "github.com/stretchr/testify/assert" abci "github.com/tendermint/tendermint/abci/types" @@ -15,17 +16,17 @@ func TestConsensusParamsValidation(t *testing.T) { valid bool }{ // test block size - 0: {makeParams(1, 0, 1), true}, - 1: {makeParams(0, 0, 1), false}, - 2: {makeParams(47*1024*1024, 0, 1), true}, - 3: {makeParams(10, 0, 1), true}, - 4: {makeParams(100*1024*1024, 0, 1), true}, - 5: {makeParams(101*1024*1024, 0, 1), false}, - 6: {makeParams(1024*1024*1024, 0, 1), false}, - 7: {makeParams(1024*1024*1024, 0, -1), false}, + 0: {makeParams(1, 0, 10*time.Second), true}, + 1: {makeParams(0, 0, 10*time.Second), false}, + 2: {makeParams(47*1024*1024, 0, 10*time.Second), true}, + 3: {makeParams(10, 0, 10*time.Second), true}, + 4: {makeParams(100*1024*1024, 0, 10*time.Second), true}, + 5: {makeParams(101*1024*1024, 0, 10*time.Second), false}, + 6: {makeParams(1024*1024*1024, 0, 10*time.Second), false}, + 7: {makeParams(1024*1024*1024, 0, -10*time.Second), false}, // test evidence age 8: {makeParams(1, 0, 0), false}, - 9: {makeParams(1, 0, -1), false}, + 9: {makeParams(1, 0, -1*time.Millisecond), false}, } for i, tc := range testCases { if tc.valid { @@ -36,7 +37,7 @@ func TestConsensusParamsValidation(t *testing.T) { } } -func makeParams(blockBytes, blockGas, evidenceAge int64) ConsensusParams { +func makeParams(blockBytes, blockGas int64, evidenceAge time.Duration) ConsensusParams { return ConsensusParams{ BlockSize: BlockSize{ MaxBytes: blockBytes, @@ -50,14 +51,9 @@ func makeParams(blockBytes, blockGas, evidenceAge int64) ConsensusParams { func TestConsensusParamsHash(t *testing.T) { params := []ConsensusParams{ - makeParams(4, 2, 3), - makeParams(1, 4, 3), - makeParams(1, 2, 4), - makeParams(2, 5, 7), - makeParams(1, 7, 6), - makeParams(9, 5, 4), - makeParams(7, 8, 9), - makeParams(4, 6, 5), + makeParams(4, 2, 3*time.Second), + makeParams(1, 4, 3*time.Second), + makeParams(1, 2, 4*time.Second), } hashes := make([][]byte, len(params)) @@ -76,6 +72,7 @@ func TestConsensusParamsHash(t *testing.T) { } func TestConsensusParamsUpdate(t *testing.T) { + newMaxAge := 300 * time.Second testCases := []struct { params ConsensusParams updates *abci.ConsensusParams @@ -83,23 +80,23 @@ func TestConsensusParamsUpdate(t *testing.T) { }{ // empty updates { - makeParams(1, 2, 3), + makeParams(1, 2, 3*time.Second), &abci.ConsensusParams{}, - makeParams(1, 2, 3), + makeParams(1, 2, 3*time.Second), }, // fine updates { - makeParams(1, 2, 3), + makeParams(1, 2, 3*time.Second), &abci.ConsensusParams{ BlockSize: &abci.BlockSize{ MaxBytes: 100, MaxGas: 200, }, EvidenceParams: &abci.EvidenceParams{ - MaxAge: 300, + MaxAge: &newMaxAge, }, }, - makeParams(100, 200, 300), + makeParams(100, 200, 300*time.Second), }, } for _, tc := range testCases { diff --git a/types/protobuf.go b/types/protobuf.go index c9c429c80..827d5e5a6 100644 --- a/types/protobuf.go +++ b/types/protobuf.go @@ -119,7 +119,7 @@ func (tm2pb) ConsensusParams(params *ConsensusParams) *abci.ConsensusParams { MaxGas: params.BlockSize.MaxGas, }, EvidenceParams: &abci.EvidenceParams{ - MaxAge: params.EvidenceParams.MaxAge, + MaxAge: ¶ms.EvidenceParams.MaxAge, }, } } @@ -209,13 +209,14 @@ func (pb2tm) ValidatorUpdates(vals []abci.ValidatorUpdate) ([]*Validator, error) } func (pb2tm) ConsensusParams(csp *abci.ConsensusParams) ConsensusParams { - return ConsensusParams{ + params := ConsensusParams{ BlockSize: BlockSize{ MaxBytes: csp.BlockSize.MaxBytes, MaxGas: csp.BlockSize.MaxGas, }, - EvidenceParams: EvidenceParams{ - MaxAge: csp.EvidenceParams.MaxAge, - }, } + if csp.EvidenceParams.MaxAge != nil { + params.EvidenceParams.MaxAge = *csp.EvidenceParams.MaxAge + } + return params }