From ad9f59727557c3ff33926c18eed81654d57f5078 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 13 Jan 2025 15:24:14 +0100
Subject: [PATCH 01/65] feat(light): verify trusted light block hash
---
internal/statesync/reactor.go | 12 ++++++------
internal/statesync/reactor_test.go | 2 +-
internal/statesync/stateprovider.go | 6 ++++--
internal/statesync/syncer_test.go | 4 ++--
light/client.go | 13 ++++++++++---
light/client_test.go | 11 +++++++++++
light/light_test.go | 2 ++
7 files changed, 36 insertions(+), 14 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index e31088ff4e..d0219746d6 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -122,7 +122,7 @@ type Reactor struct {
initSyncer func() *syncer
requestSnaphot func() error
syncer *syncer // syncer is nil when sync is not in progress
- initStateProvider func(ctx context.Context, chainID string, initialHeight int64) error
+ initStateProvider func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error
stateProvider StateProvider
eventBus *eventbus.EventBus
@@ -234,7 +234,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
}
r.sendBlockError = blockCh.SendError
- r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
+ r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error {
spLogger := r.logger.With("module", "stateprovider")
spLogger.Info("initializing state provider",
"trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
@@ -250,8 +250,8 @@ func (r *Reactor) OnStart(ctx context.Context) error {
providers[idx] = NewBlockProvider(p, chainID, r.dispatcher)
}
- stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, providers,
- paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
+ stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
+ providers, paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize P2P state provider: %w", err)
}
@@ -259,7 +259,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
return nil
}
- stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight,
+ stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
spLogger, r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize RPC state provider: %w", err)
@@ -386,7 +386,7 @@ func (r *Reactor) startStateProvider(ctx context.Context) error {
var err error
for retry := 0; retry < initStateProviderRetries; retry++ {
initCtx, cancel := context.WithTimeout(ctx, initStateProviderTimeout)
- err = r.initStateProvider(initCtx, r.chainID, r.initialHeight)
+ err = r.initStateProvider(initCtx, r.chainID, r.initialHeight, r.cfg.TrustHashBytes())
cancel()
if err == nil { // success
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index eff91961c4..c115dd5db9 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -625,7 +625,7 @@ func TestReactor_StateProviderP2P(t *testing.T) {
ictx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
- err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1)
+ err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1, nil)
require.NoError(t, err)
rts.reactor.getSyncer().stateProvider = rts.reactor.stateProvider
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index b10324acc5..a76c6d546e 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -57,6 +57,7 @@ func NewRPCStateProvider(
initialHeight int64,
servers []string,
trustHeight int64,
+ trustBlockHash []byte,
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
@@ -78,7 +79,7 @@ func NewRPCStateProvider(
providerRemotes[provider] = server
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, chainID, providers[0], providers[1:],
+ lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
@@ -209,6 +210,7 @@ func NewP2PStateProvider(
chainID string,
initialHeight int64,
trustHeight int64,
+ trustBlockHash []byte,
providers []lightprovider.Provider,
paramsSendCh p2p.Channel,
logger log.Logger,
@@ -218,7 +220,7 @@ func NewP2PStateProvider(
return nil, fmt.Errorf("at least 2 peers are required, got %d", len(providers))
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, chainID, providers[0], providers[1:],
+ lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 00da83c9ed..0854c65122 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -616,8 +616,8 @@ func (suite *SyncerTestSuite) TestApplyChunksResults() {
fetchStartTime := time.Now()
- c := &chunk{Height: 1, Version: 1, ID: []byte{0}, Chunk: body}
- chunks.Enqueue(c.ID)
+ chunkID := []byte{0}
+ chunks.Enqueue(chunkID)
for _, resp := range tc.resps {
suite.conn.
diff --git a/light/client.go b/light/client.go
index e2e10487ec..3b7366bb8e 100644
--- a/light/client.go
+++ b/light/client.go
@@ -154,12 +154,13 @@ func NewClient(
dashCoreRPCClient dashcore.QuorumVerifier,
options ...Option) (*Client, error) {
- return NewClientAtHeight(ctx, 0, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
+ return NewClientAtHeight(ctx, 0, nil, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
}
func NewClientAtHeight(
ctx context.Context,
height int64,
+ trustedBlockHash []byte,
chainID string,
primary provider.Provider,
witnesses []provider.Provider,
@@ -179,7 +180,7 @@ func NewClientAtHeight(
if c.latestTrustedBlock == nil && height > 0 {
c.logger.Info("Downloading trusted light block")
- if err := c.initializeAtHeight(ctx, height); err != nil {
+ if err := c.initializeAtHeight(ctx, height, trustedBlockHash); err != nil {
return nil, fmt.Errorf("initialize at height: %w", err)
}
}
@@ -260,7 +261,8 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
-func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
+// If blockHash is not nil, it will be used to verify the block.
+func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash []byte) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
if err != nil {
@@ -274,6 +276,11 @@ func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
return fmt.Errorf("validate light block: %w", err)
}
+ // 1.5) Verify that block hash matches the expected hash
+ if len(blockHash) > 0 && !bytes.Equal(l.Hash(), blockHash) {
+ return fmt.Errorf("block hash %x does not match expected hash %x", l.Hash(), blockHash)
+ }
+
// 2) Ensure the commit height is correct
if l.Height != l.Commit.Height {
return fmt.Errorf("invalid commit: height %d does not match commit height %d", l.Height, l.Commit.Height)
diff --git a/light/client_test.go b/light/client_test.go
index 8dbecbe852..c60d0b226c 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -138,6 +138,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -168,6 +169,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -209,6 +211,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockNode,
nil,
@@ -242,6 +245,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockNode,
nil,
@@ -285,6 +289,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockWitnessNode},
@@ -316,6 +321,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
nil,
@@ -370,6 +376,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockDeadNode,
[]provider.Provider{mockFullNode},
@@ -412,6 +419,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockDeadNode1,
[]provider.Provider{mockFullNode, mockDeadNode2},
@@ -505,6 +513,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockBadValSetNode, mockGoodWitness},
@@ -552,6 +561,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockFullNode,
[]provider.Provider{mockGoodWitness},
@@ -646,6 +656,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
mockBadNode,
nil,
diff --git a/light/light_test.go b/light/light_test.go
index 2403670bfd..82cbe6c18b 100644
--- a/light/light_test.go
+++ b/light/light_test.go
@@ -70,6 +70,7 @@ func TestClientIntegration_Update(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
+ nil,
chainID,
primary,
nil,
@@ -215,6 +216,7 @@ func TestClientStatusRPC(t *testing.T) {
c, err := light.NewClientAtHeight(ctx,
2,
+ nil,
chainID,
primary,
witnesses,
From 566545f6e25934d9e427c95c940f1f9eb368d591 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 13 Jan 2025 16:49:12 +0100
Subject: [PATCH 02/65] fix(light): light block fails with invalid sig format
---
go.mod | 8 ++++----
go.sum | 15 ++++++++-------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/go.mod b/go.mod
index dffe80c756..472ec381c0 100644
--- a/go.mod
+++ b/go.mod
@@ -9,8 +9,8 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.25.0
- github.com/dashpay/dashd-go/btcec/v2 v2.1.0 // indirect
+ github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e
+ github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
github.com/go-chi/chi v4.1.2+incompatible // indirect
@@ -80,7 +80,7 @@ require (
github.com/alexkohler/nakedret/v2 v2.0.5 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/bombsimon/wsl/v4 v4.4.1 // indirect
- github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect
+ github.com/btcsuite/btclog v1.0.0 // indirect
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect
github.com/bufbuild/protocompile v0.14.1 // indirect
@@ -108,7 +108,7 @@ require (
github.com/containerd/ttrpc v1.2.6 // indirect
github.com/containerd/typeurl/v2 v2.2.3 // indirect
github.com/curioswitch/go-reassign v0.2.0 // indirect
- github.com/dashpay/dashd-go/btcutil v1.2.0 // indirect
+ github.com/dashpay/dashd-go/btcutil v1.3.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/dgraph-io/badger/v4 v4.3.1 // indirect
github.com/didip/tollbooth/v6 v6.0.1 // indirect
diff --git a/go.sum b/go.sum
index 9f7ab30f1b..d136be00f1 100644
--- a/go.sum
+++ b/go.sum
@@ -104,8 +104,9 @@ github.com/btcsuite/btcd v0.22.1 h1:CnwP9LM/M9xuRrGSCGeMVs9iv09uMqwsVX7EeIpgV2c=
github.com/btcsuite/btcd v0.22.1/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ=
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
-github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo=
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
+github.com/btcsuite/btclog v1.0.0 h1:sEkpKJMmfGiyZjADwEIgB1NSwMyfdD1FB8v6+w1T0Ns=
+github.com/btcsuite/btclog v1.0.0/go.mod h1:w7xnGOhwT3lmrS4H3b/D1XAXxvh+tbhUm8xeHN2y3TQ=
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce/go.mod h1:0DVlHczLPewLcPGEIeUEzfOJhqGPQ0mJJRDBtD307+o=
@@ -217,12 +218,12 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.25.0 h1:tswVRmM2fLHC/JhpuAZ5Oa0TpOO6L+tqiE+QLTCvIQc=
-github.com/dashpay/dashd-go v0.25.0/go.mod h1:4yuk/laGME2RnQRTdqTbw87PhT+42hE1anLCnpkgls8=
-github.com/dashpay/dashd-go/btcec/v2 v2.1.0 h1:fXwlLf5H+TtgHxjGMU74NesKzk6NisjKMPF04pBcygk=
-github.com/dashpay/dashd-go/btcec/v2 v2.1.0/go.mod h1:1i8XtxdOmvK6mYEUCneVXTzFbrCUw3wq1u91j8gvsns=
-github.com/dashpay/dashd-go/btcutil v1.2.0 h1:YMq7L0V0au5bbphIhpsBBc+nfOZqU+gJ4pkgRZB7Eiw=
-github.com/dashpay/dashd-go/btcutil v1.2.0/go.mod h1:7UHoqUh3LY3OI4mEcogx0CnL3rtzDQyoqvsOCZZtvzE=
+github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e h1:VAyUrB9BWe05tSuEx5xW0LsxBtm4TPltetB0BwFHVEs=
+github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
+github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
+github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
+github.com/dashpay/dashd-go/btcutil v1.3.0/go.mod h1:sMWZ0iR8a/wmIA6b5+ccjOGUfq+iZvi5t6ECaLCW+kw=
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
From 6c3fa223035f5b669991b570782384b54876a113 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 14 Jan 2025 10:02:11 +0100
Subject: [PATCH 03/65] chore: fix mock core server for new quorum verify
---
test/e2e/pkg/mockcoreserver/core_server.go | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/test/e2e/pkg/mockcoreserver/core_server.go b/test/e2e/pkg/mockcoreserver/core_server.go
index 4b6025e125..fbe9d149ed 100644
--- a/test/e2e/pkg/mockcoreserver/core_server.go
+++ b/test/e2e/pkg/mockcoreserver/core_server.go
@@ -146,9 +146,8 @@ func (c *MockCoreServer) QuorumVerify(ctx context.Context, cmd btcjson.QuorumCmd
signatureVerified := thresholdPublicKey.VerifySignatureDigest(signID, signature)
- res := btcjson.QuorumVerifyResult{
- Result: signatureVerified,
- }
+ res := btcjson.QuorumVerifyResult(signatureVerified)
+
return res
}
From 2780a4abdc670b826b0d7d3b4dd3c51a2b25e621 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 14 Jan 2025 11:09:04 +0100
Subject: [PATCH 04/65] fix(statesync): allow empty chunks
---
internal/statesync/chunks.go | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index bd9d23e880..57edbf5eed 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -133,9 +133,16 @@ func (q *chunkQueue) dequeue() (bytes.HexBytes, error) {
// Add adds a chunk to the queue. It ignores chunks that already exist, returning false.
func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
- if chunk == nil || chunk.Chunk == nil {
+ if chunk == nil {
return false, errChunkNil
}
+
+ // empty chunk content is allowed, but we ensure it's not nil
+ data := chunk.Chunk
+ if data == nil {
+ data = []byte{}
+ }
+
q.mtx.Lock()
defer q.mtx.Unlock()
if q.snapshot == nil {
@@ -154,7 +161,7 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
return false, err
}
item.file = filepath.Join(q.dir, chunkIDKey)
- err = item.write(chunk.Chunk)
+ err = item.write(data)
if err != nil {
return false, err
}
From 77cde71284ba2bb51f1a493c3b606c0fe41636cd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:11:03 +0100
Subject: [PATCH 05/65] feat(proto):RequestFinalizeSnapshotSync
---
abci/types/types.pb.go | 1200 +++++++++++++++++++++--------
light/example_test.go | 91 +++
proto/tendermint/abci/types.proto | 78 +-
spec/abci++/api.md | 32 +
4 files changed, 1038 insertions(+), 363 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index f60329ec91..8f7432f1af 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -124,7 +124,7 @@ func (x ResponseOfferSnapshot_Result) String() string {
}
func (ResponseOfferSnapshot_Result) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{25, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{26, 0}
}
type ResponseApplySnapshotChunk_Result int32
@@ -164,7 +164,7 @@ func (x ResponseApplySnapshotChunk_Result) String() string {
}
func (ResponseApplySnapshotChunk_Result) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{27, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{28, 0}
}
type ResponseProcessProposal_ProposalStatus int32
@@ -192,7 +192,7 @@ func (x ResponseProcessProposal_ProposalStatus) String() string {
}
func (ResponseProcessProposal_ProposalStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{29, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{31, 0}
}
type ResponseVerifyVoteExtension_VerifyStatus int32
@@ -220,7 +220,7 @@ func (x ResponseVerifyVoteExtension_VerifyStatus) String() string {
}
func (ResponseVerifyVoteExtension_VerifyStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{32, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{34, 0}
}
// TxAction contains App-provided information on what to do with a transaction that is part of a raw proposal
@@ -255,7 +255,7 @@ func (x TxRecord_TxAction) String() string {
}
func (TxRecord_TxAction) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{39, 0}
+ return fileDescriptor_252557cfdd89a31a, []int{41, 0}
}
// Request types
@@ -271,6 +271,7 @@ type Request struct {
// *Request_OfferSnapshot
// *Request_LoadSnapshotChunk
// *Request_ApplySnapshotChunk
+ // *Request_FinalizeSnapshotSync
// *Request_PrepareProposal
// *Request_ProcessProposal
// *Request_ExtendVote
@@ -348,6 +349,9 @@ type Request_LoadSnapshotChunk struct {
type Request_ApplySnapshotChunk struct {
ApplySnapshotChunk *RequestApplySnapshotChunk `protobuf:"bytes,14,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
+type Request_FinalizeSnapshotSync struct {
+ FinalizeSnapshotSync *RequestFinalizeSnapshotSync `protobuf:"bytes,20,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+}
type Request_PrepareProposal struct {
PrepareProposal *RequestPrepareProposal `protobuf:"bytes,15,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
}
@@ -364,21 +368,22 @@ type Request_FinalizeBlock struct {
FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,19,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Request_Echo) isRequest_Value() {}
-func (*Request_Flush) isRequest_Value() {}
-func (*Request_Info) isRequest_Value() {}
-func (*Request_InitChain) isRequest_Value() {}
-func (*Request_Query) isRequest_Value() {}
-func (*Request_CheckTx) isRequest_Value() {}
-func (*Request_ListSnapshots) isRequest_Value() {}
-func (*Request_OfferSnapshot) isRequest_Value() {}
-func (*Request_LoadSnapshotChunk) isRequest_Value() {}
-func (*Request_ApplySnapshotChunk) isRequest_Value() {}
-func (*Request_PrepareProposal) isRequest_Value() {}
-func (*Request_ProcessProposal) isRequest_Value() {}
-func (*Request_ExtendVote) isRequest_Value() {}
-func (*Request_VerifyVoteExtension) isRequest_Value() {}
-func (*Request_FinalizeBlock) isRequest_Value() {}
+func (*Request_Echo) isRequest_Value() {}
+func (*Request_Flush) isRequest_Value() {}
+func (*Request_Info) isRequest_Value() {}
+func (*Request_InitChain) isRequest_Value() {}
+func (*Request_Query) isRequest_Value() {}
+func (*Request_CheckTx) isRequest_Value() {}
+func (*Request_ListSnapshots) isRequest_Value() {}
+func (*Request_OfferSnapshot) isRequest_Value() {}
+func (*Request_LoadSnapshotChunk) isRequest_Value() {}
+func (*Request_ApplySnapshotChunk) isRequest_Value() {}
+func (*Request_FinalizeSnapshotSync) isRequest_Value() {}
+func (*Request_PrepareProposal) isRequest_Value() {}
+func (*Request_ProcessProposal) isRequest_Value() {}
+func (*Request_ExtendVote) isRequest_Value() {}
+func (*Request_VerifyVoteExtension) isRequest_Value() {}
+func (*Request_FinalizeBlock) isRequest_Value() {}
func (m *Request) GetValue() isRequest_Value {
if m != nil {
@@ -457,6 +462,13 @@ func (m *Request) GetApplySnapshotChunk() *RequestApplySnapshotChunk {
return nil
}
+func (m *Request) GetFinalizeSnapshotSync() *RequestFinalizeSnapshotSync {
+ if x, ok := m.GetValue().(*Request_FinalizeSnapshotSync); ok {
+ return x.FinalizeSnapshotSync
+ }
+ return nil
+}
+
func (m *Request) GetPrepareProposal() *RequestPrepareProposal {
if x, ok := m.GetValue().(*Request_PrepareProposal); ok {
return x.PrepareProposal
@@ -505,6 +517,7 @@ func (*Request) XXX_OneofWrappers() []interface{} {
(*Request_OfferSnapshot)(nil),
(*Request_LoadSnapshotChunk)(nil),
(*Request_ApplySnapshotChunk)(nil),
+ (*Request_FinalizeSnapshotSync)(nil),
(*Request_PrepareProposal)(nil),
(*Request_ProcessProposal)(nil),
(*Request_ExtendVote)(nil),
@@ -1161,6 +1174,63 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
+// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+// It includes the light block committed at the synced height, which Tenderdash uses
+// to reconstruct its own state.
+type RequestFinalizeSnapshotSync struct {
+ // light block committed at the synced height
+ LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
+ // commit fot the `light_block`
+ Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
+}
+
+func (m *RequestFinalizeSnapshotSync) Reset() { *m = RequestFinalizeSnapshotSync{} }
+func (m *RequestFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
+func (*RequestFinalizeSnapshotSync) ProtoMessage() {}
+func (*RequestFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_252557cfdd89a31a, []int{11}
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_RequestFinalizeSnapshotSync.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 *RequestFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_RequestFinalizeSnapshotSync.Merge(m, src)
+}
+func (m *RequestFinalizeSnapshotSync) XXX_Size() int {
+ return m.Size()
+}
+func (m *RequestFinalizeSnapshotSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_RequestFinalizeSnapshotSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RequestFinalizeSnapshotSync proto.InternalMessageInfo
+
+func (m *RequestFinalizeSnapshotSync) GetLightBlock() *types1.LightBlock {
+ if m != nil {
+ return m.LightBlock
+ }
+ return nil
+}
+
+func (m *RequestFinalizeSnapshotSync) GetCommit() *types1.Commit {
+ if m != nil {
+ return m.Commit
+ }
+ return nil
+}
+
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -1280,7 +1350,7 @@ func (m *RequestPrepareProposal) Reset() { *m = RequestPrepareProposal{}
func (m *RequestPrepareProposal) String() string { return proto.CompactTextString(m) }
func (*RequestPrepareProposal) ProtoMessage() {}
func (*RequestPrepareProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{11}
+ return fileDescriptor_252557cfdd89a31a, []int{12}
}
func (m *RequestPrepareProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1480,7 +1550,7 @@ func (m *RequestProcessProposal) Reset() { *m = RequestProcessProposal{}
func (m *RequestProcessProposal) String() string { return proto.CompactTextString(m) }
func (*RequestProcessProposal) ProtoMessage() {}
func (*RequestProcessProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{12}
+ return fileDescriptor_252557cfdd89a31a, []int{13}
}
func (m *RequestProcessProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1652,7 +1722,7 @@ func (m *RequestExtendVote) Reset() { *m = RequestExtendVote{} }
func (m *RequestExtendVote) String() string { return proto.CompactTextString(m) }
func (*RequestExtendVote) ProtoMessage() {}
func (*RequestExtendVote) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{13}
+ return fileDescriptor_252557cfdd89a31a, []int{14}
}
func (m *RequestExtendVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1747,7 +1817,7 @@ func (m *RequestVerifyVoteExtension) Reset() { *m = RequestVerifyVoteExt
func (m *RequestVerifyVoteExtension) String() string { return proto.CompactTextString(m) }
func (*RequestVerifyVoteExtension) ProtoMessage() {}
func (*RequestVerifyVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{14}
+ return fileDescriptor_252557cfdd89a31a, []int{15}
}
func (m *RequestVerifyVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1858,7 +1928,7 @@ func (m *RequestFinalizeBlock) Reset() { *m = RequestFinalizeBlock{} }
func (m *RequestFinalizeBlock) String() string { return proto.CompactTextString(m) }
func (*RequestFinalizeBlock) ProtoMessage() {}
func (*RequestFinalizeBlock) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{15}
+ return fileDescriptor_252557cfdd89a31a, []int{16}
}
func (m *RequestFinalizeBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1950,6 +2020,7 @@ type Response struct {
// *Response_OfferSnapshot
// *Response_LoadSnapshotChunk
// *Response_ApplySnapshotChunk
+ // *Response_FinalizeSnapshotSync
// *Response_PrepareProposal
// *Response_ProcessProposal
// *Response_ExtendVote
@@ -1962,7 +2033,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_252557cfdd89a31a, []int{16}
+ return fileDescriptor_252557cfdd89a31a, []int{17}
}
func (m *Response) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2030,6 +2101,9 @@ type Response_LoadSnapshotChunk struct {
type Response_ApplySnapshotChunk struct {
ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,11,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
+type Response_FinalizeSnapshotSync struct {
+ FinalizeSnapshotSync *ResponseFinalizeSnapshotSync `protobuf:"bytes,17,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+}
type Response_PrepareProposal struct {
PrepareProposal *ResponsePrepareProposal `protobuf:"bytes,12,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
}
@@ -2046,22 +2120,23 @@ type Response_FinalizeBlock struct {
FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,16,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Response_Exception) isResponse_Value() {}
-func (*Response_Echo) isResponse_Value() {}
-func (*Response_Flush) isResponse_Value() {}
-func (*Response_Info) isResponse_Value() {}
-func (*Response_InitChain) isResponse_Value() {}
-func (*Response_Query) isResponse_Value() {}
-func (*Response_CheckTx) isResponse_Value() {}
-func (*Response_ListSnapshots) isResponse_Value() {}
-func (*Response_OfferSnapshot) isResponse_Value() {}
-func (*Response_LoadSnapshotChunk) isResponse_Value() {}
-func (*Response_ApplySnapshotChunk) isResponse_Value() {}
-func (*Response_PrepareProposal) isResponse_Value() {}
-func (*Response_ProcessProposal) isResponse_Value() {}
-func (*Response_ExtendVote) isResponse_Value() {}
-func (*Response_VerifyVoteExtension) isResponse_Value() {}
-func (*Response_FinalizeBlock) isResponse_Value() {}
+func (*Response_Exception) isResponse_Value() {}
+func (*Response_Echo) isResponse_Value() {}
+func (*Response_Flush) isResponse_Value() {}
+func (*Response_Info) isResponse_Value() {}
+func (*Response_InitChain) isResponse_Value() {}
+func (*Response_Query) isResponse_Value() {}
+func (*Response_CheckTx) isResponse_Value() {}
+func (*Response_ListSnapshots) isResponse_Value() {}
+func (*Response_OfferSnapshot) isResponse_Value() {}
+func (*Response_LoadSnapshotChunk) isResponse_Value() {}
+func (*Response_ApplySnapshotChunk) isResponse_Value() {}
+func (*Response_FinalizeSnapshotSync) isResponse_Value() {}
+func (*Response_PrepareProposal) isResponse_Value() {}
+func (*Response_ProcessProposal) isResponse_Value() {}
+func (*Response_ExtendVote) isResponse_Value() {}
+func (*Response_VerifyVoteExtension) isResponse_Value() {}
+func (*Response_FinalizeBlock) isResponse_Value() {}
func (m *Response) GetValue() isResponse_Value {
if m != nil {
@@ -2147,6 +2222,13 @@ func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk {
return nil
}
+func (m *Response) GetFinalizeSnapshotSync() *ResponseFinalizeSnapshotSync {
+ if x, ok := m.GetValue().(*Response_FinalizeSnapshotSync); ok {
+ return x.FinalizeSnapshotSync
+ }
+ return nil
+}
+
func (m *Response) GetPrepareProposal() *ResponsePrepareProposal {
if x, ok := m.GetValue().(*Response_PrepareProposal); ok {
return x.PrepareProposal
@@ -2196,6 +2278,7 @@ func (*Response) XXX_OneofWrappers() []interface{} {
(*Response_OfferSnapshot)(nil),
(*Response_LoadSnapshotChunk)(nil),
(*Response_ApplySnapshotChunk)(nil),
+ (*Response_FinalizeSnapshotSync)(nil),
(*Response_PrepareProposal)(nil),
(*Response_ProcessProposal)(nil),
(*Response_ExtendVote)(nil),
@@ -2213,7 +2296,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_252557cfdd89a31a, []int{17}
+ return fileDescriptor_252557cfdd89a31a, []int{18}
}
func (m *ResponseException) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2257,7 +2340,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_252557cfdd89a31a, []int{18}
+ return fileDescriptor_252557cfdd89a31a, []int{19}
}
func (m *ResponseEcho) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2300,7 +2383,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_252557cfdd89a31a, []int{19}
+ return fileDescriptor_252557cfdd89a31a, []int{20}
}
func (m *ResponseFlush) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2341,7 +2424,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_252557cfdd89a31a, []int{20}
+ return fileDescriptor_252557cfdd89a31a, []int{21}
}
func (m *ResponseInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2426,7 +2509,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_252557cfdd89a31a, []int{21}
+ return fileDescriptor_252557cfdd89a31a, []int{22}
}
func (m *ResponseInitChain) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2543,7 +2626,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_252557cfdd89a31a, []int{22}
+ return fileDescriptor_252557cfdd89a31a, []int{23}
}
func (m *ResponseQuery) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2649,7 +2732,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_252557cfdd89a31a, []int{23}
+ return fileDescriptor_252557cfdd89a31a, []int{24}
}
func (m *ResponseCheckTx) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2735,7 +2818,7 @@ func (m *ResponseListSnapshots) Reset() { *m = ResponseListSnapshots{} }
func (m *ResponseListSnapshots) String() string { return proto.CompactTextString(m) }
func (*ResponseListSnapshots) ProtoMessage() {}
func (*ResponseListSnapshots) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{24}
+ return fileDescriptor_252557cfdd89a31a, []int{25}
}
func (m *ResponseListSnapshots) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2779,7 +2862,7 @@ func (m *ResponseOfferSnapshot) Reset() { *m = ResponseOfferSnapshot{} }
func (m *ResponseOfferSnapshot) String() string { return proto.CompactTextString(m) }
func (*ResponseOfferSnapshot) ProtoMessage() {}
func (*ResponseOfferSnapshot) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{25}
+ return fileDescriptor_252557cfdd89a31a, []int{26}
}
func (m *ResponseOfferSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2825,7 +2908,7 @@ func (m *ResponseLoadSnapshotChunk) Reset() { *m = ResponseLoadSnapshotC
func (m *ResponseLoadSnapshotChunk) String() string { return proto.CompactTextString(m) }
func (*ResponseLoadSnapshotChunk) ProtoMessage() {}
func (*ResponseLoadSnapshotChunk) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{26}
+ return fileDescriptor_252557cfdd89a31a, []int{27}
}
func (m *ResponseLoadSnapshotChunk) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2878,7 +2961,7 @@ func (m *ResponseApplySnapshotChunk) Reset() { *m = ResponseApplySnapsho
func (m *ResponseApplySnapshotChunk) String() string { return proto.CompactTextString(m) }
func (*ResponseApplySnapshotChunk) ProtoMessage() {}
func (*ResponseApplySnapshotChunk) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{27}
+ return fileDescriptor_252557cfdd89a31a, []int{28}
}
func (m *ResponseApplySnapshotChunk) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2935,6 +3018,43 @@ func (m *ResponseApplySnapshotChunk) GetNextChunks() [][]byte {
return nil
}
+// The response to a `RequestPrepareSnapshot` message.
+type ResponseFinalizeSnapshotSync struct {
+}
+
+func (m *ResponseFinalizeSnapshotSync) Reset() { *m = ResponseFinalizeSnapshotSync{} }
+func (m *ResponseFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
+func (*ResponseFinalizeSnapshotSync) ProtoMessage() {}
+func (*ResponseFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+ return fileDescriptor_252557cfdd89a31a, []int{29}
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ if deterministic {
+ return xxx_messageInfo_ResponseFinalizeSnapshotSync.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 *ResponseFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ResponseFinalizeSnapshotSync.Merge(m, src)
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_Size() int {
+ return m.Size()
+}
+func (m *ResponseFinalizeSnapshotSync) XXX_DiscardUnknown() {
+ xxx_messageInfo_ResponseFinalizeSnapshotSync.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResponseFinalizeSnapshotSync proto.InternalMessageInfo
+
type ResponsePrepareProposal struct {
// Possibly modified list of transactions that have been picked as part of the proposed block.
TxRecords []*TxRecord `protobuf:"bytes,1,rep,name=tx_records,json=txRecords,proto3" json:"tx_records,omitempty"`
@@ -2956,7 +3076,7 @@ func (m *ResponsePrepareProposal) Reset() { *m = ResponsePrepareProposal
func (m *ResponsePrepareProposal) String() string { return proto.CompactTextString(m) }
func (*ResponsePrepareProposal) ProtoMessage() {}
func (*ResponsePrepareProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{28}
+ return fileDescriptor_252557cfdd89a31a, []int{30}
}
func (m *ResponsePrepareProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3053,7 +3173,7 @@ func (m *ResponseProcessProposal) Reset() { *m = ResponseProcessProposal
func (m *ResponseProcessProposal) String() string { return proto.CompactTextString(m) }
func (*ResponseProcessProposal) ProtoMessage() {}
func (*ResponseProcessProposal) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{29}
+ return fileDescriptor_252557cfdd89a31a, []int{31}
}
func (m *ResponseProcessProposal) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3143,7 +3263,7 @@ func (m *ExtendVoteExtension) Reset() { *m = ExtendVoteExtension{} }
func (m *ExtendVoteExtension) String() string { return proto.CompactTextString(m) }
func (*ExtendVoteExtension) ProtoMessage() {}
func (*ExtendVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{30}
+ return fileDescriptor_252557cfdd89a31a, []int{32}
}
func (m *ExtendVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3227,7 +3347,7 @@ func (m *ResponseExtendVote) Reset() { *m = ResponseExtendVote{} }
func (m *ResponseExtendVote) String() string { return proto.CompactTextString(m) }
func (*ResponseExtendVote) ProtoMessage() {}
func (*ResponseExtendVote) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{31}
+ return fileDescriptor_252557cfdd89a31a, []int{33}
}
func (m *ResponseExtendVote) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3271,7 +3391,7 @@ func (m *ResponseVerifyVoteExtension) Reset() { *m = ResponseVerifyVoteE
func (m *ResponseVerifyVoteExtension) String() string { return proto.CompactTextString(m) }
func (*ResponseVerifyVoteExtension) ProtoMessage() {}
func (*ResponseVerifyVoteExtension) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{32}
+ return fileDescriptor_252557cfdd89a31a, []int{34}
}
func (m *ResponseVerifyVoteExtension) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3316,7 +3436,7 @@ func (m *ResponseFinalizeBlock) Reset() { *m = ResponseFinalizeBlock{} }
func (m *ResponseFinalizeBlock) String() string { return proto.CompactTextString(m) }
func (*ResponseFinalizeBlock) ProtoMessage() {}
func (*ResponseFinalizeBlock) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{33}
+ return fileDescriptor_252557cfdd89a31a, []int{35}
}
func (m *ResponseFinalizeBlock) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3363,7 +3483,7 @@ func (m *CommitInfo) Reset() { *m = CommitInfo{} }
func (m *CommitInfo) String() string { return proto.CompactTextString(m) }
func (*CommitInfo) ProtoMessage() {}
func (*CommitInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{34}
+ return fileDescriptor_252557cfdd89a31a, []int{36}
}
func (m *CommitInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3434,7 +3554,7 @@ func (m *Event) Reset() { *m = Event{} }
func (m *Event) String() string { return proto.CompactTextString(m) }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{35}
+ return fileDescriptor_252557cfdd89a31a, []int{37}
}
func (m *Event) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3488,7 +3608,7 @@ func (m *EventAttribute) Reset() { *m = EventAttribute{} }
func (m *EventAttribute) String() string { return proto.CompactTextString(m) }
func (*EventAttribute) ProtoMessage() {}
func (*EventAttribute) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{36}
+ return fileDescriptor_252557cfdd89a31a, []int{38}
}
func (m *EventAttribute) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3554,7 +3674,7 @@ func (m *ExecTxResult) Reset() { *m = ExecTxResult{} }
func (m *ExecTxResult) String() string { return proto.CompactTextString(m) }
func (*ExecTxResult) ProtoMessage() {}
func (*ExecTxResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{37}
+ return fileDescriptor_252557cfdd89a31a, []int{39}
}
func (m *ExecTxResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3646,7 +3766,7 @@ func (m *TxResult) Reset() { *m = TxResult{} }
func (m *TxResult) String() string { return proto.CompactTextString(m) }
func (*TxResult) ProtoMessage() {}
func (*TxResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{38}
+ return fileDescriptor_252557cfdd89a31a, []int{40}
}
func (m *TxResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3712,7 +3832,7 @@ func (m *TxRecord) Reset() { *m = TxRecord{} }
func (m *TxRecord) String() string { return proto.CompactTextString(m) }
func (*TxRecord) ProtoMessage() {}
func (*TxRecord) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{39}
+ return fileDescriptor_252557cfdd89a31a, []int{41}
}
func (m *TxRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3765,7 +3885,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_252557cfdd89a31a, []int{40}
+ return fileDescriptor_252557cfdd89a31a, []int{42}
}
func (m *Validator) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3823,7 +3943,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_252557cfdd89a31a, []int{41}
+ return fileDescriptor_252557cfdd89a31a, []int{43}
}
func (m *ValidatorUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3905,7 +4025,7 @@ func (m *ValidatorSetUpdate) Reset() { *m = ValidatorSetUpdate{} }
func (m *ValidatorSetUpdate) String() string { return proto.CompactTextString(m) }
func (*ValidatorSetUpdate) ProtoMessage() {}
func (*ValidatorSetUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{42}
+ return fileDescriptor_252557cfdd89a31a, []int{44}
}
func (m *ValidatorSetUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3963,7 +4083,7 @@ func (m *ThresholdPublicKeyUpdate) Reset() { *m = ThresholdPublicKeyUpda
func (m *ThresholdPublicKeyUpdate) String() string { return proto.CompactTextString(m) }
func (*ThresholdPublicKeyUpdate) ProtoMessage() {}
func (*ThresholdPublicKeyUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{43}
+ return fileDescriptor_252557cfdd89a31a, []int{45}
}
func (m *ThresholdPublicKeyUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4007,7 +4127,7 @@ func (m *QuorumHashUpdate) Reset() { *m = QuorumHashUpdate{} }
func (m *QuorumHashUpdate) String() string { return proto.CompactTextString(m) }
func (*QuorumHashUpdate) ProtoMessage() {}
func (*QuorumHashUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{44}
+ return fileDescriptor_252557cfdd89a31a, []int{46}
}
func (m *QuorumHashUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4053,7 +4173,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_252557cfdd89a31a, []int{45}
+ return fileDescriptor_252557cfdd89a31a, []int{47}
}
func (m *VoteInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4110,7 +4230,7 @@ func (m *ExtendedVoteInfo) Reset() { *m = ExtendedVoteInfo{} }
func (m *ExtendedVoteInfo) String() string { return proto.CompactTextString(m) }
func (*ExtendedVoteInfo) ProtoMessage() {}
func (*ExtendedVoteInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{46}
+ return fileDescriptor_252557cfdd89a31a, []int{48}
}
func (m *ExtendedVoteInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4178,7 +4298,7 @@ func (m *Misbehavior) Reset() { *m = Misbehavior{} }
func (m *Misbehavior) String() string { return proto.CompactTextString(m) }
func (*Misbehavior) ProtoMessage() {}
func (*Misbehavior) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{47}
+ return fileDescriptor_252557cfdd89a31a, []int{49}
}
func (m *Misbehavior) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4253,7 +4373,7 @@ func (m *Snapshot) Reset() { *m = Snapshot{} }
func (m *Snapshot) String() string { return proto.CompactTextString(m) }
func (*Snapshot) ProtoMessage() {}
func (*Snapshot) Descriptor() ([]byte, []int) {
- return fileDescriptor_252557cfdd89a31a, []int{48}
+ return fileDescriptor_252557cfdd89a31a, []int{50}
}
func (m *Snapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4329,6 +4449,7 @@ func init() {
proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot")
proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk")
proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk")
+ proto.RegisterType((*RequestFinalizeSnapshotSync)(nil), "tendermint.abci.RequestFinalizeSnapshotSync")
proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal")
proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal")
proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote")
@@ -4346,6 +4467,7 @@ func init() {
proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot")
proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk")
proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk")
+ proto.RegisterType((*ResponseFinalizeSnapshotSync)(nil), "tendermint.abci.ResponseFinalizeSnapshotSync")
proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal")
proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal")
proto.RegisterType((*ExtendVoteExtension)(nil), "tendermint.abci.ExtendVoteExtension")
@@ -4372,239 +4494,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3712 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x73, 0x1b, 0x47,
- 0x73, 0xc7, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0x7a, 0x15, 0x5b, 0xb2,
- 0x6c, 0x93, 0xb6, 0x14, 0x5b, 0x76, 0xec, 0xa4, 0x0a, 0x04, 0xa1, 0x80, 0x14, 0x45, 0xd2, 0x4b,
- 0x90, 0x2e, 0xc7, 0xb1, 0xb7, 0x96, 0xc0, 0x90, 0x58, 0x0b, 0xc0, 0xae, 0x77, 0x17, 0x14, 0xe8,
- 0x6b, 0xe2, 0xaa, 0x94, 0x4f, 0xfe, 0x07, 0x7c, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x54, 0x4e, 0x71,
- 0x2a, 0x17, 0x1f, 0x53, 0x95, 0x8a, 0xe2, 0x92, 0x6f, 0xb9, 0xf9, 0xf4, 0x5d, 0xbe, 0xc3, 0x57,
- 0xf3, 0xd8, 0x27, 0xb0, 0x78, 0x58, 0xae, 0xfa, 0xea, 0xbb, 0x61, 0x7a, 0xba, 0x7b, 0xe7, 0xd1,
- 0xd3, 0xdd, 0xf3, 0xeb, 0x01, 0xdc, 0xb0, 0xf1, 0xa0, 0x83, 0xcd, 0xbe, 0x36, 0xb0, 0x37, 0xd5,
- 0xd3, 0xb6, 0xb6, 0x69, 0x5f, 0x1a, 0xd8, 0xda, 0x30, 0x4c, 0xdd, 0xd6, 0x51, 0xd9, 0xeb, 0xdc,
- 0x20, 0x9d, 0xd5, 0x5b, 0x3e, 0xee, 0xb6, 0x79, 0x69, 0xd8, 0xfa, 0xa6, 0x61, 0xea, 0xfa, 0x19,
- 0xe3, 0xaf, 0xfa, 0x95, 0x51, 0x3d, 0x9b, 0x1d, 0xd5, 0xea, 0xf2, 0xce, 0x9b, 0x63, 0x9d, 0xa7,
- 0x3d, 0xbd, 0xfd, 0x34, 0xb2, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x53, 0x7c, 0xe9, 0xf4,
- 0xde, 0x1a, 0x93, 0x35, 0x54, 0x53, 0xed, 0x3b, 0xdd, 0xab, 0xbe, 0xee, 0x0b, 0x6c, 0x5a, 0x9a,
- 0x3e, 0x08, 0x28, 0x5f, 0x3b, 0xd7, 0xf5, 0xf3, 0x1e, 0xde, 0xa4, 0xad, 0xd3, 0xe1, 0xd9, 0xa6,
- 0xad, 0xf5, 0xb1, 0x65, 0xab, 0x7d, 0x83, 0x33, 0xac, 0x9c, 0xeb, 0xe7, 0x3a, 0xfd, 0xb9, 0x49,
- 0x7e, 0x31, 0xaa, 0xf4, 0x4d, 0x0e, 0x32, 0x32, 0xfe, 0x6a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24,
- 0x6e, 0x77, 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce,
- 0xd7, 0x68, 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7,
- 0x12, 0xa7, 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda,
- 0xe0, 0x4c, 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80,
- 0x36, 0xd0, 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x5f, 0x89, 0x96, 0xd4, 0xec,
- 0x3a, 0x61, 0x6c, 0xc6, 0xe4, 0x9c, 0xe6, 0x34, 0xc8, 0x70, 0xbf, 0x1a, 0x62, 0xf3, 0xb2, 0x92,
- 0x9a, 0x3e, 0xdc, 0x8f, 0x09, 0x13, 0x19, 0x2e, 0xe5, 0x46, 0x1f, 0x41, 0xb6, 0xdd, 0xc5, 0xed,
- 0xa7, 0x8a, 0x3d, 0xaa, 0x64, 0xa8, 0xe4, 0x5a, 0x94, 0x64, 0x9d, 0xf0, 0xb5, 0x46, 0xcd, 0x98,
- 0x9c, 0x69, 0xb3, 0x9f, 0x68, 0x1f, 0x4a, 0x3d, 0xcd, 0xb2, 0x15, 0x6b, 0xa0, 0x1a, 0x56, 0x57,
- 0xb7, 0xad, 0x4a, 0x9e, 0xea, 0x78, 0x35, 0x4a, 0xc7, 0x9e, 0x66, 0xd9, 0x47, 0x0e, 0x73, 0x33,
- 0x26, 0x17, 0x7b, 0x7e, 0x02, 0xd1, 0xa7, 0x9f, 0x9d, 0x61, 0xd3, 0x55, 0x58, 0x29, 0x4c, 0xd7,
- 0x77, 0x40, 0xb8, 0x1d, 0x79, 0xa2, 0x4f, 0xf7, 0x13, 0xd0, 0x67, 0xb0, 0xdc, 0xd3, 0xd5, 0x8e,
- 0xab, 0x4e, 0x69, 0x77, 0x87, 0x83, 0xa7, 0x95, 0x22, 0x55, 0xfa, 0x7a, 0xe4, 0x20, 0x75, 0xb5,
- 0xe3, 0xa8, 0xa8, 0x13, 0x81, 0x66, 0x4c, 0x5e, 0xea, 0x85, 0x89, 0xe8, 0x0b, 0x58, 0x51, 0x0d,
- 0xa3, 0x77, 0x19, 0xd6, 0x5e, 0xa2, 0xda, 0xef, 0x45, 0x69, 0xaf, 0x11, 0x99, 0xb0, 0x7a, 0xa4,
- 0x8e, 0x51, 0x51, 0x0b, 0x44, 0xc3, 0xc4, 0x86, 0x6a, 0x62, 0xc5, 0x30, 0x75, 0x43, 0xb7, 0xd4,
- 0x5e, 0xa5, 0x4c, 0x75, 0xdf, 0x89, 0xd2, 0x7d, 0xc8, 0xf8, 0x0f, 0x39, 0x7b, 0x33, 0x26, 0x97,
- 0x8d, 0x20, 0x89, 0x69, 0xd5, 0xdb, 0xd8, 0xb2, 0x3c, 0xad, 0xe2, 0x2c, 0xad, 0x94, 0x3f, 0xa8,
- 0x35, 0x40, 0x42, 0x0d, 0xc8, 0xe3, 0x11, 0x11, 0x57, 0x2e, 0x74, 0x1b, 0x57, 0x96, 0xa8, 0x42,
- 0x29, 0xf2, 0x9c, 0x51, 0xd6, 0x13, 0xdd, 0xc6, 0xcd, 0x98, 0x0c, 0xd8, 0x6d, 0x21, 0x15, 0xae,
- 0x5c, 0x60, 0x53, 0x3b, 0xbb, 0xa4, 0x6a, 0x14, 0xda, 0x43, 0xfc, 0x41, 0x05, 0x51, 0x85, 0x6f,
- 0x44, 0x29, 0x3c, 0xa1, 0x42, 0x44, 0x45, 0xc3, 0x11, 0x69, 0xc6, 0xe4, 0xe5, 0x8b, 0x71, 0x32,
- 0x31, 0xb1, 0x33, 0x6d, 0xa0, 0xf6, 0xb4, 0xaf, 0xb1, 0x42, 0x1d, 0x5c, 0x65, 0x79, 0xba, 0x89,
- 0x3d, 0xe2, 0xdc, 0x5b, 0x84, 0x99, 0x98, 0xd8, 0x99, 0x9f, 0xb0, 0x95, 0x81, 0xd4, 0x85, 0xda,
- 0x1b, 0xe2, 0xdd, 0x64, 0x36, 0x2d, 0x66, 0x76, 0x93, 0xd9, 0xac, 0x98, 0xdb, 0x4d, 0x66, 0x73,
- 0x22, 0xec, 0x26, 0xb3, 0x20, 0xe6, 0xa5, 0x3b, 0x90, 0xf7, 0xb9, 0x17, 0x54, 0x81, 0x4c, 0x1f,
- 0x5b, 0x96, 0x7a, 0x8e, 0xa9, 0x37, 0xca, 0xc9, 0x4e, 0x53, 0x2a, 0x41, 0xc1, 0xef, 0x52, 0xa4,
- 0xef, 0x04, 0x57, 0x92, 0x78, 0x0b, 0x22, 0xc9, 0xdd, 0xa3, 0x23, 0xc9, 0x9b, 0xe8, 0x36, 0x14,
- 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xb8, 0xac, 0xa4, 0x5c, 0xa0, 0xc4, 0x13, 0xce, 0xb4, 0x06, 0x79,
- 0xe3, 0xbe, 0xe1, 0xb2, 0x24, 0x28, 0x0b, 0x18, 0xf7, 0x0d, 0x87, 0xe1, 0x15, 0x28, 0x90, 0x79,
- 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xef, 0x13, 0x20, 0x86, 0xdd, 0x10,
- 0x7a, 0x1f, 0x92, 0xc4, 0x23, 0x73, 0xe7, 0x5a, 0xdd, 0x60, 0xee, 0x7a, 0xc3, 0x71, 0xd7, 0x1b,
- 0x2d, 0xc7, 0x5d, 0x6f, 0x65, 0x7f, 0x78, 0xbe, 0x16, 0xfb, 0xee, 0xff, 0xd6, 0x04, 0x99, 0x4a,
- 0xa0, 0xeb, 0xc4, 0xf9, 0xa8, 0xda, 0x40, 0xd1, 0x3a, 0x74, 0xc8, 0x39, 0xe2, 0x59, 0x54, 0x6d,
- 0xb0, 0xd3, 0x41, 0x7b, 0x20, 0xb6, 0xf5, 0x81, 0x85, 0x07, 0xd6, 0xd0, 0x52, 0x58, 0xb8, 0xe0,
- 0x2e, 0x35, 0xe0, 0x18, 0x59, 0x9c, 0xa8, 0x3b, 0x9c, 0x87, 0x94, 0x51, 0x2e, 0xb7, 0x83, 0x04,
- 0xb4, 0x0f, 0xc5, 0x0b, 0xb5, 0xa7, 0x75, 0x54, 0x5b, 0x37, 0x15, 0x0b, 0xdb, 0xdc, 0xc7, 0xde,
- 0x1e, 0xdb, 0xf3, 0x13, 0x87, 0xeb, 0x08, 0xdb, 0xc7, 0x46, 0x47, 0xb5, 0xf1, 0x56, 0xf2, 0x87,
- 0xe7, 0x6b, 0x82, 0x5c, 0xb8, 0xf0, 0xf5, 0xa0, 0xd7, 0xa0, 0xac, 0x1a, 0x86, 0x62, 0xd9, 0xaa,
- 0x8d, 0x95, 0xd3, 0x4b, 0x1b, 0x5b, 0xd4, 0xed, 0x16, 0xe4, 0xa2, 0x6a, 0x18, 0x47, 0x84, 0xba,
- 0x45, 0x88, 0xe8, 0x55, 0x28, 0x11, 0x0f, 0xad, 0xa9, 0x3d, 0xa5, 0x8b, 0xb5, 0xf3, 0xae, 0x5d,
- 0x49, 0xaf, 0x0b, 0x77, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88, 0x36, 0x60, 0xd9, 0x61, 0x6b,
- 0xeb, 0x26, 0x76, 0x78, 0x89, 0x3f, 0x2e, 0xca, 0x4b, 0xbc, 0xab, 0xae, 0x9b, 0x98, 0xf1, 0x4b,
- 0x1d, 0xd7, 0x52, 0xa8, 0x37, 0x47, 0x08, 0x92, 0x1d, 0xd5, 0x56, 0xe9, 0x0e, 0x14, 0x64, 0xfa,
- 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf2, 0x75, 0xa5, 0xbf, 0xd1, 0x55, 0x48, 0x73, 0xd5, 0x09, 0x3a,
- 0x0c, 0xde, 0x42, 0x2b, 0x90, 0x32, 0x4c, 0xfd, 0x02, 0xd3, 0x65, 0xc9, 0xca, 0xac, 0x21, 0xc9,
- 0x50, 0x0a, 0x7a, 0x7e, 0x54, 0x82, 0xb8, 0x3d, 0xe2, 0x5f, 0x89, 0xdb, 0x23, 0xf4, 0x36, 0x24,
- 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0x26, 0xc4, 0x3a, 0x2e, 0xd7, 0xba, 0x34, 0xb0, 0x4c, 0x39, 0xa5,
- 0xab, 0xb0, 0x32, 0x29, 0x12, 0x48, 0x5d, 0x97, 0x1e, 0xf0, 0xe8, 0xe8, 0x5d, 0xc8, 0xba, 0xa1,
- 0x80, 0xd9, 0xd7, 0xf5, 0xb1, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0xec, 0x4f, 0x57,
- 0xe5, 0xe1, 0xbb, 0x20, 0x67, 0x54, 0xc3, 0x68, 0xaa, 0x56, 0x57, 0x3a, 0x87, 0x4a, 0x94, 0x9b,
- 0xf7, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17, 0xa7, 0x7b, 0xe2, 0x9e, 0x3c,
- 0x6a, 0xc1, 0xc3, 0xc1, 0x53, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8,
- 0x1e, 0xe9, 0xf1, 0x03, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x8b, 0x23, 0x6c, 0xe0, 0xac, 0x41,
- 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e, 0x49, 0xc2, 0xd5, 0xc9, 0xce,
- 0x1f, 0xad, 0x43, 0xa1, 0xaf, 0x8e, 0x14, 0x7b, 0xc4, 0x2d, 0x54, 0xa0, 0x7b, 0x0e, 0x7d, 0x75,
- 0xd4, 0x1a, 0x31, 0xf3, 0x14, 0x21, 0x61, 0x8f, 0xac, 0x4a, 0x7c, 0x3d, 0x71, 0xb7, 0x20, 0x93,
- 0x9f, 0xe8, 0x09, 0x2c, 0xf5, 0xf4, 0xb6, 0xda, 0x53, 0x7a, 0xaa, 0x65, 0x2b, 0x6d, 0xbd, 0xdf,
- 0xd7, 0x6c, 0x7e, 0xee, 0x6e, 0x8c, 0x6f, 0x2f, 0xed, 0x26, 0xbe, 0x89, 0x1e, 0x92, 0x98, 0x5c,
- 0xa6, 0xb2, 0x7b, 0xaa, 0x65, 0xb3, 0x2e, 0xb4, 0x0d, 0xf9, 0xbe, 0x66, 0x9d, 0xe2, 0xae, 0x7a,
- 0xa1, 0xe9, 0x66, 0x25, 0xb9, 0x9e, 0x98, 0x98, 0x13, 0x3d, 0xf1, 0x78, 0xb8, 0x26, 0xbf, 0x98,
- 0x6f, 0x5b, 0x52, 0x01, 0xb3, 0x75, 0x1c, 0x4f, 0x7a, 0x61, 0xc7, 0xf3, 0x36, 0xac, 0x0c, 0xf0,
- 0xc8, 0x56, 0xdc, 0x43, 0x6d, 0x31, 0x5b, 0xc9, 0xd0, 0x25, 0x47, 0xa4, 0xcf, 0xf5, 0x04, 0x16,
- 0x31, 0x1b, 0xb2, 0x2b, 0xa6, 0x3e, 0x1c, 0x74, 0x2a, 0xd9, 0x75, 0xe1, 0x6e, 0x4a, 0x66, 0x0d,
- 0xf4, 0x10, 0x2a, 0xf4, 0xc0, 0x32, 0x2f, 0x46, 0xbc, 0x2d, 0xee, 0x38, 0xa7, 0x37, 0x47, 0x2d,
- 0xe5, 0x0a, 0xe9, 0xa7, 0x7e, 0x72, 0x8f, 0xf6, 0xf2, 0x13, 0xbf, 0x09, 0x2b, 0x2c, 0xfa, 0x62,
- 0x93, 0x84, 0x61, 0xb2, 0x49, 0x74, 0x00, 0x40, 0x07, 0xb0, 0xe4, 0xf4, 0x1d, 0x9a, 0x7a, 0x6b,
- 0x44, 0xbf, 0xff, 0xb6, 0x2b, 0xd0, 0x51, 0x88, 0x69, 0x3b, 0xf6, 0x98, 0xa7, 0x86, 0x8a, 0x9c,
- 0xbe, 0x9a, 0xe1, 0xba, 0xf3, 0x87, 0x9e, 0xd1, 0x16, 0xc6, 0x53, 0x42, 0xde, 0xe5, 0xb9, 0x4e,
- 0xcf, 0xa6, 0xd7, 0x20, 0xff, 0xd5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
- 0x12, 0x3d, 0x42, 0xff, 0x96, 0xf2, 0xd9, 0x5c, 0x30, 0x0f, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
- 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
- 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0xb7, 0x49, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
- 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
- 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0x68, 0xa3, 0xd6, 0x16, 0x4a, 0xf8, 0x9d, 0x80, 0xea, 0x53,
- 0x24, 0x2f, 0x07, 0xf4, 0xb2, 0xb0, 0x18, 0x69, 0xc1, 0xf9, 0x45, 0x2d, 0xb8, 0x30, 0x8f, 0x05,
- 0x17, 0x5f, 0xc6, 0x82, 0x4b, 0x63, 0x16, 0x7c, 0x0c, 0x4b, 0x63, 0xa9, 0xa8, 0x6b, 0x0e, 0xc2,
- 0x44, 0x73, 0x88, 0x4f, 0x36, 0x87, 0x84, 0xcf, 0x1c, 0xa4, 0x9f, 0x04, 0xa8, 0x46, 0x67, 0xa4,
- 0x13, 0x3f, 0xf0, 0x0e, 0x5c, 0xf1, 0x32, 0x13, 0xff, 0x3a, 0x32, 0xef, 0x8f, 0xdc, 0x4e, 0x6f,
- 0x21, 0xa7, 0x44, 0x71, 0x36, 0xa6, 0xa4, 0xdf, 0x44, 0x9f, 0x40, 0x39, 0x98, 0x4b, 0x93, 0x54,
- 0x85, 0x1c, 0x97, 0x3f, 0x1b, 0x3b, 0x2e, 0xde, 0x5a, 0xb8, 0x63, 0x96, 0x4b, 0x17, 0xfe, 0xa6,
- 0x25, 0xfd, 0x57, 0xdc, 0x8d, 0xd4, 0x81, 0xc4, 0x18, 0x7d, 0x00, 0x69, 0x7e, 0xb2, 0x85, 0x79,
- 0x4f, 0x36, 0x17, 0x08, 0x9f, 0xe6, 0xf8, 0xcb, 0x9d, 0xe6, 0xc4, 0xc4, 0xed, 0x4b, 0x4e, 0x5e,
- 0xaa, 0x94, 0x7f, 0xa9, 0xde, 0x82, 0x14, 0xbb, 0x11, 0xb0, 0x80, 0x72, 0x6d, 0xfc, 0x5c, 0xd0,
- 0xa9, 0xca, 0x8c, 0x0b, 0xd5, 0x20, 0xcb, 0xb2, 0x6e, 0xad, 0xc3, 0x1d, 0xc0, 0xf5, 0x08, 0x89,
- 0x9d, 0xed, 0xad, 0xfc, 0x8b, 0xe7, 0x6b, 0x19, 0xde, 0x90, 0x33, 0x54, 0x6e, 0xa7, 0x23, 0xfd,
- 0x7b, 0x0e, 0xb2, 0x32, 0xb6, 0x0c, 0x62, 0xc2, 0x68, 0x0b, 0x72, 0x78, 0xd4, 0xc6, 0x86, 0xed,
- 0x64, 0xf8, 0x93, 0x6f, 0x50, 0x8c, 0xbb, 0xe1, 0x70, 0x36, 0x63, 0xb2, 0x27, 0x86, 0x1e, 0x70,
- 0xa0, 0x23, 0x1a, 0xb3, 0xe0, 0xe2, 0x7e, 0xa4, 0xe3, 0x3d, 0x07, 0xe9, 0x60, 0x81, 0x7e, 0x35,
- 0x52, 0x2a, 0x04, 0x75, 0x3c, 0xe0, 0x50, 0x47, 0x72, 0xc6, 0xc7, 0x02, 0x58, 0x47, 0x3d, 0x80,
- 0x75, 0xa4, 0x66, 0x4c, 0x33, 0x02, 0xec, 0x78, 0xcf, 0x01, 0x3b, 0xd2, 0x33, 0x46, 0x1c, 0x42,
- 0x3b, 0xfe, 0x72, 0x0c, 0xed, 0x58, 0x8f, 0x14, 0x9d, 0x00, 0x77, 0x1c, 0x8c, 0xc1, 0x1d, 0x59,
- 0xaa, 0xe4, 0xb5, 0x48, 0x25, 0x33, 0xf0, 0x8e, 0x83, 0x31, 0xbc, 0x23, 0x37, 0x43, 0xe1, 0x0c,
- 0xc0, 0xe3, 0x6f, 0x27, 0x03, 0x1e, 0x10, 0x09, 0x49, 0xf0, 0x61, 0xce, 0x87, 0x78, 0x28, 0x11,
- 0x88, 0x47, 0x3e, 0xf2, 0x76, 0xce, 0xd4, 0xcf, 0x0d, 0x79, 0x1c, 0x4f, 0x80, 0x3c, 0x58, 0xf2,
- 0x72, 0x37, 0x52, 0xf9, 0x1c, 0x98, 0xc7, 0xf1, 0x04, 0xcc, 0xa3, 0x38, 0x53, 0xed, 0x4c, 0xd0,
- 0xe3, 0x51, 0x10, 0xf4, 0x28, 0x45, 0xdc, 0x29, 0xbd, 0x23, 0x1b, 0x81, 0x7a, 0x9c, 0x46, 0xa1,
- 0x1e, 0x0c, 0xed, 0x79, 0x33, 0x52, 0xe3, 0x02, 0xb0, 0xc7, 0xc1, 0x18, 0xec, 0x21, 0xce, 0xb0,
- 0xb4, 0x39, 0x71, 0x0f, 0xe9, 0x75, 0x12, 0x4b, 0x43, 0x4e, 0x89, 0x38, 0x58, 0x6c, 0x9a, 0xba,
- 0xc9, 0x91, 0x0a, 0xd6, 0x90, 0xee, 0x92, 0x7b, 0xab, 0xe7, 0x80, 0xa6, 0x60, 0x21, 0x65, 0x28,
- 0x06, 0x9c, 0x8e, 0xf4, 0x2f, 0x82, 0x27, 0x4b, 0xd1, 0x10, 0xff, 0x9d, 0x37, 0xc7, 0xef, 0xbc,
- 0xa1, 0x7b, 0x5a, 0x2e, 0x90, 0x11, 0xf8, 0x73, 0x0e, 0x0e, 0x7e, 0xa8, 0x5e, 0xae, 0x71, 0x0f,
- 0x96, 0x68, 0x76, 0xca, 0x3c, 0x7a, 0x20, 0x68, 0x94, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x3d, 0xde,
- 0x82, 0x65, 0x1f, 0xaf, 0x7b, 0xd1, 0x64, 0x08, 0x80, 0xe8, 0x72, 0xd7, 0xf8, 0x8d, 0xf3, 0x3f,
- 0x12, 0xde, 0x0a, 0x79, 0xa8, 0xc9, 0x24, 0x80, 0x43, 0xf8, 0xd5, 0x00, 0x47, 0xf4, 0x85, 0x17,
- 0x7d, 0x06, 0x2b, 0x01, 0xec, 0xc3, 0x49, 0xfe, 0x12, 0x8b, 0x41, 0x20, 0x31, 0x5f, 0x2e, 0xe2,
- 0xf6, 0xa0, 0xcf, 0xe1, 0x06, 0x4d, 0x63, 0x23, 0x12, 0xcc, 0xe4, 0x7c, 0x09, 0xe6, 0x35, 0xa2,
- 0xa3, 0x3e, 0x21, 0xc9, 0x8c, 0x00, 0x46, 0x52, 0x11, 0xc0, 0x08, 0xda, 0x83, 0xc2, 0x39, 0x1e,
- 0x60, 0x4b, 0xb3, 0x94, 0x05, 0x6e, 0x86, 0x02, 0xc9, 0xcb, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49,
- 0xef, 0x3f, 0x08, 0xc2, 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3b, 0xc1, 0x33, 0x4b, 0x17,
- 0x79, 0x69, 0xeb, 0x1d, 0x66, 0xbe, 0x45, 0x99, 0xfe, 0x26, 0x77, 0xa0, 0x9e, 0x7e, 0xce, 0x2d,
- 0x90, 0xfc, 0x24, 0x5c, 0x6e, 0x4d, 0x20, 0xc7, 0xe3, 0xe0, 0x0a, 0xa4, 0xb4, 0x41, 0x07, 0x8f,
- 0xb8, 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x8a, 0x2f, 0xb9, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33,
- 0x3a, 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0xc2, 0x8e, 0xa2, 0x1b, 0x16, 0x8f, 0x64,
- 0x81, 0x84, 0x8b, 0x15, 0x61, 0x36, 0x0e, 0x09, 0xcf, 0x81, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2,
- 0xa5, 0x44, 0xd9, 0x40, 0x4a, 0x74, 0x13, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x42,
- 0x39, 0xd9, 0x23, 0x48, 0xff, 0x2a, 0x40, 0x39, 0x14, 0x18, 0x27, 0xce, 0xdd, 0x39, 0x95, 0xf1,
- 0x20, 0x12, 0x35, 0x36, 0xfb, 0x5b, 0x00, 0xe7, 0xaa, 0xa5, 0x3c, 0x53, 0x07, 0x36, 0xee, 0xf0,
- 0x25, 0xc8, 0x9d, 0xab, 0xd6, 0x27, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x16, 0x92,
- 0xf6, 0x63, 0x21, 0xa8, 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64,
- 0xb7, 0x2d, 0x1d, 0xc2, 0x95, 0x89, 0x31, 0x19, 0x3d, 0x84, 0x9c, 0x17, 0xce, 0x05, 0x9a, 0x7a,
- 0x4e, 0x81, 0x98, 0x3c, 0x5e, 0xb2, 0x24, 0x57, 0x26, 0x46, 0x65, 0xd4, 0x80, 0xb4, 0x89, 0xad,
- 0x61, 0x8f, 0xa5, 0xc2, 0xa5, 0xfb, 0x6f, 0xcd, 0x17, 0xcd, 0x09, 0x75, 0xd8, 0xb3, 0x65, 0x2e,
- 0x2c, 0x7d, 0x01, 0x69, 0x46, 0x41, 0x79, 0xc8, 0x1c, 0xef, 0x3f, 0xde, 0x3f, 0xf8, 0x64, 0x5f,
- 0x8c, 0x21, 0x80, 0x74, 0xad, 0x5e, 0x6f, 0x1c, 0xb6, 0x44, 0x01, 0xe5, 0x20, 0x55, 0xdb, 0x3a,
- 0x90, 0x5b, 0x62, 0x9c, 0x90, 0xe5, 0xc6, 0x6e, 0xa3, 0xde, 0x12, 0x13, 0x68, 0x09, 0x8a, 0xec,
- 0xb7, 0xf2, 0xe8, 0x40, 0x7e, 0x52, 0x6b, 0x89, 0x49, 0x1f, 0xe9, 0xa8, 0xb1, 0xbf, 0xdd, 0x90,
- 0xc5, 0x94, 0xf4, 0x0e, 0x5c, 0x8f, 0x8c, 0xff, 0x1e, 0x0a, 0x25, 0xf8, 0x50, 0x28, 0xe9, 0xc7,
- 0x38, 0xb9, 0xe0, 0x44, 0x05, 0x75, 0xb4, 0x1b, 0x9a, 0xf8, 0xfd, 0x05, 0x32, 0x82, 0xd0, 0xec,
- 0xd1, 0xab, 0x50, 0x32, 0xf1, 0x19, 0xb6, 0xdb, 0x5d, 0x96, 0x64, 0x38, 0x30, 0x55, 0x91, 0x53,
- 0xa9, 0x90, 0xc5, 0xd8, 0xbe, 0xc4, 0x6d, 0x5b, 0x61, 0x46, 0x60, 0x51, 0x30, 0x20, 0x47, 0xd8,
- 0x08, 0xf5, 0x88, 0x11, 0x89, 0xff, 0x67, 0x7e, 0x8a, 0xa9, 0x4a, 0x52, 0x55, 0x40, 0xdd, 0x0e,
- 0xa5, 0x48, 0xcf, 0x16, 0x5a, 0xec, 0x1c, 0xa4, 0xe4, 0x46, 0x4b, 0xfe, 0x54, 0x4c, 0x20, 0x04,
- 0x25, 0xfa, 0x53, 0x39, 0xda, 0xaf, 0x1d, 0x1e, 0x35, 0x0f, 0xc8, 0x62, 0x2f, 0x43, 0xd9, 0x59,
- 0x6c, 0x87, 0x98, 0x42, 0x57, 0x60, 0xa9, 0x7e, 0xf0, 0xe4, 0x70, 0xaf, 0xd1, 0x6a, 0x78, 0xe4,
- 0xb4, 0xf4, 0x3f, 0x09, 0xb8, 0x16, 0x91, 0xca, 0xa0, 0xf7, 0x01, 0xec, 0x91, 0x62, 0xe2, 0xb6,
- 0x6e, 0x76, 0xa2, 0x8d, 0xb3, 0x35, 0x92, 0x29, 0x87, 0x9c, 0xb3, 0xf9, 0xaf, 0xa9, 0xf1, 0xe0,
- 0x23, 0xae, 0x94, 0x4c, 0xd6, 0xe2, 0xd0, 0xc9, 0xad, 0x09, 0x77, 0x41, 0xdc, 0x26, 0x8a, 0xe9,
- 0x9e, 0x50, 0xc5, 0x94, 0x1f, 0x7d, 0x0a, 0xd7, 0x42, 0x61, 0x8b, 0xfb, 0x7a, 0x6b, 0x52, 0xdd,
- 0x72, 0x72, 0xf4, 0xba, 0x12, 0x8c, 0x5e, 0xcc, 0xd7, 0x5b, 0x53, 0x70, 0x8a, 0xd4, 0x4b, 0xe0,
- 0x14, 0x51, 0xe1, 0x2f, 0xbd, 0x68, 0x05, 0x60, 0x52, 0xf8, 0x0b, 0xa5, 0x15, 0x99, 0x70, 0x5a,
- 0x21, 0xfd, 0x3e, 0xb0, 0xbb, 0xc1, 0xf4, 0xf1, 0x00, 0xd2, 0x96, 0xad, 0xda, 0x43, 0x8b, 0x9f,
- 0x96, 0x87, 0xf3, 0xe6, 0xa2, 0x1b, 0xce, 0x8f, 0x23, 0x2a, 0x2e, 0x73, 0x35, 0x7f, 0x92, 0x9b,
- 0x1e, 0xb5, 0x3d, 0xa9, 0xdf, 0x62, 0x7b, 0x9a, 0x90, 0xc6, 0x17, 0x78, 0x60, 0x5b, 0x95, 0x34,
- 0x9d, 0xf1, 0xd5, 0xf1, 0x19, 0x93, 0xee, 0xad, 0x0a, 0xc9, 0x6f, 0xfe, 0xff, 0xf9, 0x9a, 0xc8,
- 0xb8, 0xdf, 0xd4, 0xfb, 0x9a, 0x8d, 0xfb, 0x86, 0x7d, 0x29, 0x73, 0x79, 0xe9, 0x5d, 0x28, 0x05,
- 0x17, 0x3d, 0xda, 0x4d, 0x78, 0x8e, 0x38, 0x2e, 0xfd, 0xb3, 0x00, 0xcb, 0x13, 0x50, 0x15, 0xf4,
- 0x90, 0x17, 0x4e, 0xd8, 0xc6, 0xdf, 0x1e, 0x5f, 0xbd, 0x00, 0xbb, 0x57, 0x3f, 0x21, 0x81, 0xd1,
- 0xbb, 0x1e, 0xb0, 0x3d, 0xf6, 0x08, 0xe8, 0x0d, 0x28, 0x5b, 0xda, 0xf9, 0x40, 0x31, 0x19, 0x40,
- 0xe3, 0x16, 0x25, 0x48, 0xf6, 0x4e, 0x3a, 0x9c, 0xd2, 0x5d, 0x87, 0x64, 0x37, 0x08, 0x44, 0x25,
- 0xc4, 0x2d, 0xb5, 0x01, 0x8d, 0xdf, 0x56, 0x26, 0x41, 0x48, 0xc2, 0x4b, 0x40, 0x48, 0xff, 0x24,
- 0xc0, 0x8d, 0x29, 0x37, 0x18, 0xf4, 0x71, 0xe8, 0x5c, 0x7c, 0xb0, 0xc8, 0xfd, 0x67, 0x83, 0xd1,
- 0x82, 0x27, 0x43, 0x7a, 0x00, 0x05, 0x3f, 0x7d, 0xbe, 0xcd, 0xdb, 0xf5, 0xe2, 0x7b, 0x10, 0xea,
- 0xba, 0x0d, 0x45, 0x13, 0xdb, 0xc4, 0x49, 0x05, 0xb0, 0xc1, 0x02, 0x23, 0xb2, 0x54, 0x74, 0x37,
- 0x99, 0x15, 0xc4, 0xb8, 0x6b, 0x3f, 0xff, 0x29, 0x00, 0x78, 0xf8, 0x97, 0x87, 0x3f, 0x09, 0x7e,
- 0xfc, 0x29, 0x04, 0x5b, 0xc6, 0xc3, 0xb0, 0x25, 0xba, 0x03, 0x65, 0x76, 0xe7, 0x20, 0xfb, 0xa6,
- 0xda, 0x43, 0x13, 0x73, 0xb4, 0xab, 0x44, 0xc9, 0x47, 0x0e, 0x15, 0x7d, 0x06, 0xd7, 0xed, 0xae,
- 0x89, 0xad, 0xae, 0xde, 0xeb, 0x28, 0xe1, 0xbd, 0x63, 0x55, 0x98, 0xb5, 0x19, 0x46, 0x27, 0x5f,
- 0x73, 0x35, 0x9c, 0x04, 0xf7, 0xef, 0x6b, 0x48, 0xd1, 0x63, 0x43, 0x12, 0x3b, 0xd7, 0x8a, 0x73,
- 0xdc, 0x40, 0x3f, 0x07, 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0xc7, 0x3f, 0xe5,
- 0x1d, 0xbb, 0x9a, 0xc3, 0xb7, 0x75, 0x93, 0x9f, 0xbf, 0x15, 0x4f, 0xd4, 0x77, 0x06, 0x7d, 0x0a,
- 0xa5, 0x7d, 0x28, 0x05, 0x65, 0x9d, 0x8c, 0x99, 0x8d, 0x21, 0x98, 0x31, 0xb3, 0x0c, 0x9c, 0x67,
- 0xcc, 0x6e, 0xbe, 0x9d, 0x60, 0x35, 0x4e, 0xda, 0x90, 0x7e, 0x11, 0xa0, 0xe0, 0xf7, 0x7a, 0x73,
- 0x27, 0xb5, 0x3c, 0xc9, 0x4f, 0x8c, 0x27, 0xf9, 0x49, 0x5f, 0x9a, 0x7b, 0x1d, 0xb2, 0x24, 0xcd,
- 0x1d, 0x5a, 0xb8, 0xc3, 0x2b, 0xbf, 0x99, 0x73, 0xd5, 0x3a, 0xb6, 0x70, 0xc7, 0xe7, 0x9b, 0x32,
- 0x2f, 0xe7, 0x9b, 0x82, 0xc9, 0x72, 0x36, 0x94, 0x2c, 0xef, 0x26, 0xb3, 0x29, 0x31, 0x2d, 0xfb,
- 0xb2, 0x6d, 0xe9, 0x1b, 0x01, 0xb2, 0xee, 0x7c, 0x83, 0x25, 0xcf, 0x00, 0x42, 0xca, 0x96, 0x8b,
- 0x15, 0x3c, 0xf9, 0xf5, 0x84, 0x15, 0x80, 0x13, 0x6e, 0x01, 0xf8, 0x43, 0x37, 0xe1, 0x8b, 0xc2,
- 0x00, 0xfd, 0x8b, 0xeb, 0xc0, 0xbe, 0x3c, 0xbf, 0xfd, 0x47, 0x3e, 0x0e, 0x92, 0xb1, 0xa0, 0xbf,
- 0x80, 0xb4, 0xda, 0x76, 0x91, 0xcf, 0xd2, 0x04, 0x48, 0xd0, 0x61, 0xdd, 0x68, 0x8d, 0x6a, 0x94,
- 0x53, 0xe6, 0x12, 0x7c, 0x54, 0x71, 0x67, 0x54, 0xd2, 0x1e, 0xd1, 0xcb, 0x78, 0x82, 0x27, 0xbd,
- 0x04, 0x70, 0xbc, 0xff, 0xe4, 0x60, 0x7b, 0xe7, 0xd1, 0x4e, 0x63, 0x9b, 0x67, 0x74, 0xdb, 0xdb,
- 0x8d, 0x6d, 0x31, 0x4e, 0xf8, 0xe4, 0xc6, 0x93, 0x83, 0x93, 0xc6, 0xb6, 0x98, 0x20, 0x8d, 0xed,
- 0xc6, 0x5e, 0xed, 0xd3, 0xc6, 0xb6, 0x98, 0x94, 0x6a, 0x90, 0x73, 0x83, 0x0e, 0xad, 0x94, 0xeb,
- 0xcf, 0xb0, 0xc9, 0x57, 0x8b, 0x35, 0xd0, 0x2a, 0xe4, 0xc7, 0xa1, 0x7b, 0x72, 0x41, 0x63, 0x88,
- 0x3d, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed,
- 0x86, 0x00, 0x6f, 0xe7, 0xfe, 0x36, 0x3c, 0xed, 0x69, 0xed, 0xc7, 0xf8, 0x92, 0x07, 0xb9, 0xb4,
- 0x31, 0x3c, 0x7d, 0xcc, 0x4c, 0x9c, 0x0d, 0x23, 0x3e, 0x65, 0x18, 0x89, 0xd0, 0x30, 0xd0, 0x1d,
- 0x28, 0x0c, 0xf4, 0x0e, 0x56, 0xd4, 0x4e, 0xc7, 0xc4, 0x16, 0x8b, 0xdd, 0x39, 0xae, 0x39, 0x4f,
- 0x7a, 0x6a, 0xac, 0x43, 0xfa, 0x49, 0x00, 0x34, 0x1e, 0x68, 0xd1, 0x11, 0x2c, 0x79, 0xb1, 0xda,
- 0x49, 0x00, 0x58, 0x24, 0x58, 0x8f, 0x0e, 0xd4, 0x01, 0x0c, 0x41, 0xbc, 0x08, 0x92, 0x49, 0xd6,
- 0xb7, 0xe2, 0xb9, 0x2a, 0x83, 0xce, 0x97, 0x2e, 0x4a, 0x7c, 0xce, 0x45, 0x89, 0xc9, 0xc8, 0x95,
- 0x77, 0x7b, 0xc2, 0xae, 0x34, 0x31, 0x56, 0x01, 0x32, 0xa0, 0xd2, 0x1a, 0x13, 0xe3, 0xf3, 0x8c,
- 0x1a, 0x92, 0xf0, 0x32, 0x43, 0x92, 0x1e, 0x80, 0xf8, 0xb1, 0xfb, 0x7d, 0x2f, 0x7f, 0xf4, 0x0f,
- 0x53, 0x18, 0x1b, 0xe6, 0x05, 0x64, 0x89, 0xf7, 0xa5, 0x41, 0xe3, 0xaf, 0x20, 0xe7, 0xae, 0x9e,
- 0xfb, 0xd8, 0x26, 0x72, 0xd9, 0xf9, 0x48, 0x3c, 0x11, 0x74, 0x0f, 0x96, 0x48, 0xdc, 0x70, 0xea,
- 0xb0, 0x0c, 0x05, 0x8c, 0x53, 0x6f, 0x58, 0x66, 0x1d, 0x7b, 0x0e, 0x74, 0x45, 0x62, 0xb4, 0xc8,
- 0x62, 0x39, 0xee, 0xfc, 0x31, 0x06, 0x40, 0xee, 0x75, 0x21, 0x30, 0x94, 0xed, 0x61, 0x31, 0x90,
- 0x4c, 0x48, 0x7f, 0x17, 0x87, 0xbc, 0xaf, 0x2e, 0x84, 0xfe, 0x3c, 0x90, 0x58, 0xad, 0x4f, 0xab,
- 0x21, 0xf9, 0xb2, 0xaa, 0xc0, 0xc4, 0xe2, 0x8b, 0x4f, 0x2c, 0xaa, 0x22, 0xe7, 0x94, 0x87, 0x93,
- 0x0b, 0x97, 0x87, 0xdf, 0x04, 0x64, 0xeb, 0xb6, 0xda, 0x23, 0xc1, 0x5b, 0x1b, 0x9c, 0x2b, 0xec,
- 0xb4, 0xb3, 0x92, 0xb4, 0x48, 0x7b, 0x4e, 0x68, 0xc7, 0x21, 0xa1, 0x4b, 0x3d, 0xc8, 0xba, 0xe0,
- 0xc3, 0xe2, 0x6f, 0x58, 0x26, 0x95, 0xc1, 0xab, 0x90, 0xed, 0x63, 0x5b, 0xa5, 0x61, 0x8f, 0x81,
- 0x51, 0x6e, 0xfb, 0xde, 0x07, 0x90, 0xf7, 0x3d, 0xec, 0x21, 0x91, 0x70, 0xbf, 0xf1, 0x89, 0x18,
- 0xab, 0x66, 0xbe, 0xfd, 0x7e, 0x3d, 0xb1, 0x8f, 0x9f, 0x91, 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51,
- 0x7f, 0x2c, 0x0a, 0xd5, 0xfc, 0xb7, 0xdf, 0xaf, 0x67, 0x64, 0x4c, 0x4b, 0x28, 0xf7, 0x1e, 0x43,
- 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7d, 0x7c, 0xb8, 0xb7, 0x53, 0xaf, 0xb5, 0x1a,
- 0xca, 0xc9, 0x41, 0xab, 0x21, 0x0a, 0xe8, 0x1a, 0x2c, 0xef, 0xed, 0xfc, 0x75, 0xb3, 0xa5, 0xd4,
- 0xf7, 0x76, 0x1a, 0xfb, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea, 0x8f, 0xc5, 0xf8, 0xfd, 0xff, 0x05,
- 0x28, 0xd7, 0xb6, 0xea, 0x3b, 0x35, 0xc3, 0xe8, 0x69, 0x6d, 0x95, 0xba, 0xfb, 0x3a, 0x24, 0x29,
- 0xb2, 0x3c, 0xf5, 0x89, 0x6f, 0x75, 0x7a, 0x5d, 0x0c, 0x3d, 0x82, 0x14, 0x05, 0x9d, 0xd1, 0xf4,
- 0x37, 0xbf, 0xd5, 0x19, 0x85, 0x32, 0x32, 0x18, 0x7a, 0x6e, 0xa6, 0x3e, 0x02, 0xae, 0x4e, 0xaf,
- 0x9b, 0xa1, 0x3d, 0xc8, 0x38, 0x80, 0xdb, 0xac, 0x97, 0xb9, 0xd5, 0x99, 0xc5, 0x2c, 0x32, 0x35,
- 0x06, 0x5c, 0x4e, 0x7f, 0x1f, 0x5c, 0x9d, 0x51, 0x51, 0x43, 0x32, 0xe4, 0x3c, 0x28, 0x7b, 0xf6,
- 0x53, 0xe5, 0xea, 0x1c, 0x15, 0x3e, 0xf4, 0x05, 0x14, 0x83, 0xd0, 0xdc, 0x7c, 0xaf, 0x88, 0xab,
- 0x73, 0x56, 0xdf, 0x88, 0xfe, 0x20, 0x4e, 0x37, 0xdf, 0xab, 0xe2, 0xea, 0x9c, 0xc5, 0x38, 0xf4,
- 0x25, 0x2c, 0x8d, 0xe3, 0x68, 0xf3, 0x3f, 0x32, 0xae, 0x2e, 0x50, 0x9e, 0x43, 0x7d, 0x40, 0x13,
- 0xf0, 0xb7, 0x05, 0xde, 0x1c, 0x57, 0x17, 0xa9, 0xd6, 0xa1, 0x0e, 0x94, 0xc3, 0xd8, 0xd4, 0xbc,
- 0x6f, 0x90, 0xab, 0x73, 0x57, 0xee, 0xd8, 0x57, 0x82, 0x18, 0xc9, 0xbc, 0x6f, 0x92, 0xab, 0x73,
- 0x17, 0xf2, 0xd0, 0x31, 0x80, 0xef, 0x6e, 0x3b, 0xc7, 0x1b, 0xe5, 0xea, 0x3c, 0x25, 0x3d, 0x64,
- 0xc0, 0xf2, 0xa4, 0xcb, 0xec, 0x22, 0x4f, 0x96, 0xab, 0x0b, 0x55, 0xfa, 0x88, 0x3d, 0x07, 0xef,
- 0xa5, 0xf3, 0x3d, 0x61, 0xae, 0xce, 0x59, 0xf2, 0xdb, 0xda, 0xfa, 0xe1, 0xc5, 0xaa, 0xf0, 0xe3,
- 0x8b, 0x55, 0xe1, 0xa7, 0x17, 0xab, 0xc2, 0x77, 0x3f, 0xaf, 0xc6, 0x7e, 0xfc, 0x79, 0x35, 0xf6,
- 0xdf, 0x3f, 0xaf, 0xc6, 0xfe, 0xe6, 0xee, 0xb9, 0x66, 0x77, 0x87, 0xa7, 0x1b, 0x6d, 0xbd, 0x4f,
- 0xff, 0x41, 0x62, 0xa8, 0x97, 0x9b, 0x4c, 0x27, 0x69, 0xf9, 0xfe, 0xa7, 0x72, 0x9a, 0xa6, 0xb1,
- 0xee, 0xc1, 0x1f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x71, 0x2a, 0xdd, 0xc7, 0x32, 0x00, 0x00,
+ // 3807 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x6f, 0x1b, 0x57,
+ 0x77, 0xe7, 0xf0, 0xcd, 0xc3, 0xd7, 0xe8, 0x4a, 0xb6, 0x69, 0xda, 0x96, 0xf4, 0x8d, 0x9b, 0xd8,
+ 0x71, 0x12, 0xc9, 0xb1, 0x9b, 0x38, 0x69, 0x92, 0x02, 0x14, 0x45, 0x97, 0x92, 0x65, 0x49, 0x19,
+ 0x51, 0x0a, 0xd2, 0x34, 0x19, 0x8c, 0xc8, 0x2b, 0x71, 0x62, 0x92, 0x33, 0x99, 0x19, 0xca, 0x54,
+ 0xb6, 0x6d, 0x81, 0x22, 0x8b, 0x22, 0xff, 0x40, 0x76, 0x2d, 0xd0, 0x4d, 0xf7, 0x5d, 0xb5, 0xcb,
+ 0xa6, 0xe8, 0x26, 0xcb, 0x02, 0x45, 0xdd, 0xc0, 0xd9, 0xb5, 0xab, 0xac, 0xba, 0xe9, 0xa2, 0xb8,
+ 0x8f, 0x79, 0x91, 0x33, 0x7c, 0xc4, 0x01, 0x8a, 0x6f, 0xc7, 0x7b, 0xee, 0x39, 0xe7, 0xbe, 0xce,
+ 0x3d, 0xe7, 0xdc, 0xdf, 0x19, 0xc2, 0x0d, 0x1b, 0x0f, 0x3a, 0xd8, 0xec, 0x6b, 0x03, 0x7b, 0x53,
+ 0x3d, 0x6d, 0x6b, 0x9b, 0xf6, 0xa5, 0x81, 0xad, 0x0d, 0xc3, 0xd4, 0x6d, 0x1d, 0x95, 0xbd, 0xce,
+ 0x0d, 0xd2, 0x59, 0xbd, 0xe5, 0xe3, 0x6e, 0x9b, 0x97, 0x86, 0xad, 0x6f, 0x1a, 0xa6, 0xae, 0x9f,
+ 0x31, 0xfe, 0xaa, 0x5f, 0x19, 0xd5, 0xb3, 0xd9, 0x51, 0xad, 0x2e, 0xef, 0xbc, 0x39, 0xd1, 0x79,
+ 0xda, 0xd3, 0xdb, 0xcf, 0x22, 0x7b, 0x7d, 0x13, 0x09, 0xf4, 0xf2, 0x71, 0x9f, 0xe1, 0x4b, 0xa7,
+ 0xf7, 0xd6, 0x84, 0xac, 0xa1, 0x9a, 0x6a, 0xdf, 0xe9, 0x5e, 0xf5, 0x75, 0x5f, 0x60, 0xd3, 0xd2,
+ 0xf4, 0x41, 0x40, 0xf9, 0xda, 0xb9, 0xae, 0x9f, 0xf7, 0xf0, 0x26, 0x6d, 0x9d, 0x0e, 0xcf, 0x36,
+ 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xe5, 0x5c, 0x3f, 0xd7, 0xe9, 0xcf, 0x4d,
+ 0xf2, 0x8b, 0x51, 0xa5, 0xff, 0xce, 0x41, 0x46, 0xc6, 0x5f, 0x0f, 0xb1, 0x65, 0xa3, 0x07, 0x90,
+ 0xc4, 0xed, 0xae, 0x5e, 0x11, 0xd6, 0x85, 0xbb, 0xf9, 0x07, 0x37, 0x37, 0xc6, 0xf6, 0x6d, 0x83,
+ 0xf3, 0x35, 0xda, 0x5d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x17, 0x52, 0x67, 0xbd, 0xa1, 0xd5,
+ 0xad, 0xc4, 0xa9, 0xd0, 0xad, 0x28, 0xa1, 0xc7, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0x19, 0x4a,
+ 0x1b, 0x9c, 0xe9, 0x95, 0xc4, 0xf4, 0xa1, 0x76, 0x06, 0x67, 0x74, 0x28, 0xc2, 0x8b, 0xb6, 0x00,
+ 0xb4, 0x81, 0x66, 0x2b, 0xed, 0xae, 0xaa, 0x0d, 0x2a, 0x49, 0x2a, 0xf9, 0xbb, 0x68, 0x49, 0xcd,
+ 0xae, 0x13, 0xc6, 0x66, 0x4c, 0xce, 0x69, 0x4e, 0x83, 0x4c, 0xf7, 0xeb, 0x21, 0x36, 0x2f, 0x2b,
+ 0xa9, 0xe9, 0xd3, 0xfd, 0x84, 0x30, 0x91, 0xe9, 0x52, 0x6e, 0xf4, 0x11, 0x64, 0xdb, 0x5d, 0xdc,
+ 0x7e, 0xa6, 0xd8, 0xa3, 0x4a, 0x86, 0x4a, 0xae, 0x45, 0x49, 0xd6, 0x09, 0x5f, 0x6b, 0xd4, 0x8c,
+ 0xc9, 0x99, 0x36, 0xfb, 0x89, 0xf6, 0xa1, 0xd4, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75,
+ 0x75, 0xdb, 0xaa, 0xe4, 0xa9, 0x8e, 0xd7, 0xa2, 0x74, 0xec, 0x69, 0x96, 0x7d, 0xe4, 0x30, 0x37,
+ 0x63, 0x72, 0xb1, 0xe7, 0x27, 0x10, 0x7d, 0xfa, 0xd9, 0x19, 0x36, 0x5d, 0x85, 0x95, 0xc2, 0x74,
+ 0x7d, 0x07, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0x7d, 0x0e, 0xcb, 0x3d, 0x5d, 0xed,
+ 0xb8, 0xea, 0x94, 0x76, 0x77, 0x38, 0x78, 0x56, 0x29, 0x52, 0xa5, 0x6f, 0x44, 0x4e, 0x52, 0x57,
+ 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0xa5, 0xde, 0x38, 0x11, 0x7d, 0x09, 0x2b, 0xaa,
+ 0x61, 0xf4, 0x2e, 0xc7, 0xb5, 0x97, 0xa8, 0xf6, 0x7b, 0x51, 0xda, 0x6b, 0x44, 0x66, 0x5c, 0x3d,
+ 0x52, 0x27, 0xa8, 0xa8, 0x03, 0x57, 0xcf, 0xb4, 0x81, 0xda, 0xd3, 0xbe, 0xc1, 0xde, 0x10, 0xd6,
+ 0xe5, 0xa0, 0x5d, 0x59, 0xa1, 0x23, 0xbc, 0x15, 0x69, 0x91, 0x5c, 0xca, 0x51, 0x77, 0x74, 0x39,
+ 0x68, 0x37, 0x63, 0xf2, 0xca, 0x59, 0x08, 0x1d, 0xb5, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56,
+ 0x0c, 0x53, 0x37, 0x74, 0x4b, 0xed, 0x55, 0xca, 0x54, 0xff, 0x9d, 0x28, 0xfd, 0x87, 0x8c, 0xff,
+ 0x90, 0xb3, 0x37, 0x63, 0x72, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x8d, 0x2d, 0xcb, 0xd3, 0x2a,
+ 0xce, 0xd2, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, 0xd4, 0x80, 0x3c, 0x1e, 0x11, 0x71, 0xe5, 0x42,
+ 0xb7, 0x71, 0x65, 0x89, 0x2a, 0x94, 0x22, 0x6f, 0x33, 0x65, 0x3d, 0xd1, 0x6d, 0xdc, 0x8c, 0xc9,
+ 0x80, 0xdd, 0x16, 0x52, 0xe1, 0xca, 0x05, 0x36, 0xb5, 0xb3, 0x4b, 0xaa, 0x46, 0xa1, 0x3d, 0xc4,
+ 0xeb, 0x54, 0x10, 0x55, 0xf8, 0x66, 0x94, 0xc2, 0x13, 0x2a, 0x44, 0x54, 0x34, 0x1c, 0x91, 0x66,
+ 0x4c, 0x5e, 0xbe, 0x98, 0x24, 0x13, 0x43, 0x76, 0xcf, 0x8e, 0xba, 0xd1, 0xca, 0xf2, 0x74, 0x43,
+ 0x76, 0xce, 0x6c, 0x8b, 0x30, 0x13, 0x43, 0x3e, 0xf3, 0x13, 0xb6, 0x32, 0x90, 0xba, 0x50, 0x7b,
+ 0x43, 0xbc, 0x9b, 0xcc, 0xa6, 0xc5, 0xcc, 0x6e, 0x32, 0x9b, 0x15, 0x73, 0xbb, 0xc9, 0x6c, 0x4e,
+ 0x84, 0xdd, 0x64, 0x16, 0xc4, 0xbc, 0x74, 0x07, 0xf2, 0x3e, 0x27, 0x86, 0x2a, 0x90, 0xe9, 0x63,
+ 0xcb, 0x52, 0xcf, 0x31, 0xf5, 0x79, 0x39, 0xd9, 0x69, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x97, 0xf4,
+ 0x9d, 0xe0, 0x4a, 0x12, 0x9f, 0x44, 0x24, 0xb9, 0x13, 0x76, 0x24, 0x79, 0x13, 0xdd, 0x86, 0x22,
+ 0x5d, 0x8a, 0xe2, 0xf4, 0x13, 0xc7, 0x98, 0x94, 0x0b, 0x94, 0x78, 0xc2, 0x99, 0xd6, 0x20, 0x6f,
+ 0x3c, 0x30, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0x81, 0xe1, 0x30, 0xfc, 0x0e, 0x0a, 0x64, 0xdd,
+ 0x2e, 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x45, 0x02, 0xc4, 0x71, 0x67, 0x87,
+ 0xde, 0x87, 0x24, 0xf1, 0xfb, 0xdc, 0x85, 0x57, 0x37, 0x58, 0x50, 0xd8, 0x70, 0x82, 0xc2, 0x46,
+ 0xcb, 0x09, 0x0a, 0x5b, 0xd9, 0x1f, 0x5e, 0xac, 0xc5, 0xbe, 0xfb, 0xcf, 0x35, 0x41, 0xa6, 0x12,
+ 0xe8, 0x3a, 0x71, 0x71, 0xaa, 0x36, 0x50, 0xb4, 0x0e, 0x9d, 0x72, 0x8e, 0xf8, 0x2f, 0x55, 0x1b,
+ 0xec, 0x74, 0xd0, 0x1e, 0x88, 0x6d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0x94, 0xb8,
+ 0xe3, 0x0e, 0xb8, 0x5f, 0x16, 0x8d, 0xea, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0xcb, 0xed, 0x20, 0x01,
+ 0xed, 0x43, 0xf1, 0x42, 0xed, 0x69, 0x1d, 0xd5, 0xd6, 0x4d, 0xc5, 0xc2, 0x36, 0xf7, 0xe4, 0xb7,
+ 0x27, 0xce, 0xfc, 0xc4, 0xe1, 0x3a, 0xc2, 0xf6, 0xb1, 0xd1, 0x51, 0x6d, 0xbc, 0x95, 0xfc, 0xe1,
+ 0xc5, 0x9a, 0x20, 0x17, 0x2e, 0x7c, 0x3d, 0xe8, 0x75, 0x28, 0xab, 0x86, 0xa1, 0x58, 0xb6, 0x6a,
+ 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0x75, 0xee, 0x05, 0xb9, 0xa8, 0x1a, 0xc6, 0x11, 0xa1, 0x6e,
+ 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0x24, 0x0e, 0x68, 0x6a, 0x4f, 0xe9, 0x62, 0xed, 0xbc, 0x6b, 0x57,
+ 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58, 0x76, 0xd8, 0xda,
+ 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xf5, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26, 0x66, 0xfc, 0x52,
+ 0xc7, 0xb5, 0x14, 0x1a, 0x33, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0x7a, 0x02, 0x05, 0x99, 0xfe,
+ 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5f, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c, 0x75, 0x82, 0x4e,
+ 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x5b, 0xb2, 0x32, 0x6b, 0x48, 0x32,
+ 0x94, 0x82, 0xf1, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x28, 0x71, 0x7b, 0x84, 0xee, 0x43, 0x92,
+ 0x1c, 0x00, 0x1d, 0xa3, 0x14, 0x12, 0x51, 0xb9, 0x5c, 0xeb, 0xd2, 0xc0, 0x32, 0xe5, 0x94, 0xae,
+ 0xc2, 0x4a, 0x58, 0xbc, 0x91, 0xba, 0x2e, 0x3d, 0x10, 0x37, 0xd0, 0xbb, 0x90, 0x75, 0x03, 0x0e,
+ 0xb3, 0xaf, 0xeb, 0x13, 0xa3, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0x9c, 0x4f, 0x57, 0xe5,
+ 0x49, 0x42, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0xae, 0x74, 0x0e, 0x95, 0xa8, 0x60, 0xe2,
+ 0xdb, 0x1f, 0x81, 0xde, 0x0e, 0x67, 0x7f, 0x7c, 0x37, 0x2f, 0x4e, 0xcf, 0xc4, 0xbd, 0x79, 0xd4,
+ 0x82, 0x87, 0x83, 0x67, 0xc4, 0x82, 0x13, 0x6c, 0x20, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8, 0x1e,
+ 0x19, 0x57, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x1c, 0x06, 0x8b, 0x56, 0x6c, 0xe2, 0xac, 0x41, 0xa6,
+ 0x66, 0xd1, 0x75, 0xd3, 0x61, 0x72, 0x32, 0x6f, 0x49, 0x7f, 0x2d, 0xc0, 0x8d, 0x29, 0xc1, 0x05,
+ 0x7d, 0x0c, 0xf9, 0x1e, 0x59, 0x03, 0xf7, 0x75, 0x21, 0x69, 0x16, 0xbb, 0x42, 0x7b, 0x84, 0x89,
+ 0x7a, 0x34, 0x19, 0x7a, 0xee, 0x6f, 0x74, 0x1f, 0xd2, 0x6d, 0xbd, 0xdf, 0xd7, 0x6c, 0x9e, 0x6b,
+ 0x55, 0xc2, 0x2e, 0x1f, 0xe9, 0x97, 0x39, 0x9f, 0xf4, 0x4b, 0x12, 0xae, 0x86, 0x47, 0x23, 0xb4,
+ 0x0e, 0x85, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0xbf, 0x32, 0x02, 0x35, 0x42, 0xe8, 0xab, 0xa3, 0xd6,
+ 0x88, 0xdd, 0x17, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9, 0x89,
+ 0x9e, 0xc2, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xc2, 0xe7, 0xc2, 0x1c, 0xc1,
+ 0x8d, 0x49, 0x7b, 0xa3, 0xdd, 0xc4, 0x59, 0xd2, 0x5b, 0x1b, 0x93, 0xcb, 0x54, 0x76, 0x4f, 0xb5,
+ 0x6c, 0xd6, 0x85, 0xb6, 0x21, 0xdf, 0xd7, 0xac, 0x53, 0xdc, 0x55, 0x2f, 0x34, 0xdd, 0xac, 0x24,
+ 0xd7, 0x13, 0xa1, 0xa9, 0xe0, 0x53, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9, 0xec, 0x24, 0x15, 0xb8,
+ 0x47, 0x8e, 0x27, 0x4c, 0x2f, 0xec, 0x09, 0xef, 0xc3, 0xca, 0x00, 0x8f, 0x6c, 0xc5, 0xf5, 0x32,
+ 0x16, 0x33, 0xde, 0x0c, 0xb5, 0x01, 0x44, 0xfa, 0x5c, 0xd7, 0x64, 0x11, 0x3b, 0x26, 0x66, 0x62,
+ 0xea, 0xc3, 0x41, 0xa7, 0x92, 0x5d, 0x17, 0xee, 0xa6, 0x64, 0xd6, 0x40, 0x8f, 0xa0, 0x42, 0x3d,
+ 0x08, 0x73, 0xab, 0xe4, 0x08, 0x71, 0xc7, 0x71, 0x27, 0x39, 0x6a, 0xba, 0x57, 0x48, 0x3f, 0x75,
+ 0xdc, 0x7b, 0xb4, 0x97, 0xbb, 0xa0, 0x4d, 0x58, 0x61, 0xe9, 0x00, 0x36, 0x49, 0x5e, 0x40, 0x0e,
+ 0x89, 0x4e, 0x00, 0xe8, 0x04, 0x96, 0x9c, 0xbe, 0x43, 0x53, 0x6f, 0x8d, 0xe8, 0xf8, 0xf7, 0x5d,
+ 0x81, 0x8e, 0x42, 0xee, 0x9a, 0x73, 0x41, 0xf2, 0xf4, 0xe6, 0x20, 0xa7, 0xaf, 0x66, 0xb8, 0xf1,
+ 0xe5, 0x91, 0x77, 0x8b, 0x0a, 0x93, 0x99, 0x30, 0xef, 0xf2, 0x7c, 0xb9, 0x77, 0xc9, 0xd6, 0x20,
+ 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa5, 0x22, 0x9d, 0x12, 0x30, 0x12, 0xbd, 0xd3, 0xff,
+ 0x94, 0xf2, 0xd9, 0x5c, 0x30, 0x31, 0xe1, 0x16, 0x25, 0x78, 0x16, 0x75, 0xe4, 0x9b, 0xb8, 0xdf,
+ 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0xbb, 0xb6, 0x68, 0xbb, 0x4a, 0xfc, 0x3a, 0xbb, 0x42, 0x90, 0xa4,
+ 0x2b, 0x4c, 0x32, 0x3f, 0x4e, 0x7e, 0x47, 0xda, 0x9a, 0x7b, 0xfe, 0x69, 0xff, 0xf9, 0x3b, 0x16,
+ 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a, 0x70, 0x75, 0x4c, 0x50,
+ 0x19, 0xd2, 0x58, 0x4b, 0xad, 0x6d, 0xec, 0x9d, 0xe3, 0x38, 0x19, 0x9f, 0x22, 0x79, 0x39, 0xa0,
+ 0x97, 0xc5, 0xe9, 0x48, 0x0b, 0xce, 0x2f, 0x6a, 0xc1, 0x85, 0x79, 0x2c, 0xb8, 0xf8, 0x2a, 0x16,
+ 0x5c, 0x9a, 0xb0, 0xe0, 0x63, 0x58, 0x9a, 0xc8, 0x8d, 0x5d, 0x73, 0x10, 0x42, 0xcd, 0x21, 0x1e,
+ 0x6e, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0x4e, 0x91, 0x43, 0x07, 0x78, 0x07,
+ 0xae, 0x78, 0xa9, 0x92, 0x7f, 0x1f, 0x59, 0x38, 0x42, 0x6e, 0xa7, 0xb7, 0x91, 0x53, 0xd2, 0x0a,
+ 0x36, 0xa7, 0xa4, 0xdf, 0x44, 0x9f, 0x42, 0x39, 0x98, 0xdc, 0x93, 0xdc, 0x89, 0x5c, 0x97, 0x3f,
+ 0x98, 0xb8, 0x2e, 0xde, 0x5e, 0xb8, 0x73, 0x96, 0x4b, 0x17, 0xfe, 0xa6, 0x25, 0xfd, 0x6b, 0xdc,
+ 0x4d, 0x1d, 0x02, 0x99, 0x3a, 0xfa, 0xc0, 0x0d, 0x5d, 0xc2, 0xbc, 0x37, 0x9b, 0x0b, 0x8c, 0xdf,
+ 0xe6, 0xf8, 0xab, 0xdd, 0xe6, 0x44, 0xe8, 0xf1, 0x25, 0xc3, 0xb7, 0x2a, 0xe5, 0xdf, 0xaa, 0xb7,
+ 0x21, 0xc5, 0xc2, 0x36, 0x0b, 0x28, 0xd7, 0x26, 0xef, 0x05, 0x8b, 0xd8, 0x8c, 0x0b, 0xd5, 0x20,
+ 0xcb, 0x9e, 0x01, 0x5a, 0x87, 0x3b, 0x80, 0xeb, 0x11, 0x12, 0x3b, 0xdb, 0x5b, 0xf9, 0x97, 0x2f,
+ 0xd6, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x4e, 0x47, 0xfa, 0x3b, 0x80, 0xac, 0x8c, 0x2d, 0x83,
+ 0x98, 0x30, 0xda, 0x82, 0x1c, 0x1e, 0xb5, 0xb1, 0x61, 0x3b, 0x4f, 0x8e, 0xf0, 0x27, 0x1d, 0xe3,
+ 0x6e, 0x38, 0x9c, 0xcd, 0x98, 0xec, 0x89, 0xa1, 0x87, 0x1c, 0xdf, 0x89, 0x86, 0x6a, 0xb8, 0xb8,
+ 0x1f, 0xe0, 0x79, 0xcf, 0x01, 0x78, 0x58, 0xa0, 0x5f, 0x8d, 0x94, 0x1a, 0x43, 0x78, 0x1e, 0x72,
+ 0x84, 0x27, 0x39, 0x63, 0xb0, 0x00, 0xc4, 0x53, 0x0f, 0x40, 0x3c, 0xa9, 0x19, 0xcb, 0x8c, 0xc0,
+ 0x78, 0xde, 0x73, 0x30, 0x9e, 0xf4, 0x8c, 0x19, 0x8f, 0x81, 0x3c, 0x1f, 0x4f, 0x80, 0x3c, 0xeb,
+ 0x91, 0xa2, 0x21, 0x28, 0xcf, 0xc1, 0x04, 0xca, 0x93, 0xa5, 0x4a, 0x5e, 0x8f, 0x54, 0x32, 0x03,
+ 0xe6, 0x39, 0x98, 0x80, 0x79, 0x72, 0x33, 0x14, 0xce, 0xc0, 0x79, 0xfe, 0x2c, 0x1c, 0xe7, 0x81,
+ 0x48, 0x24, 0x86, 0x4f, 0x73, 0x3e, 0xa0, 0x47, 0x89, 0x00, 0x7a, 0xf2, 0x91, 0x70, 0x01, 0x53,
+ 0x3f, 0x37, 0xd2, 0x83, 0x23, 0x91, 0x1e, 0x06, 0x71, 0xbc, 0x1d, 0x6d, 0x9a, 0x8b, 0x40, 0x3d,
+ 0xc7, 0x21, 0x50, 0x0f, 0xcb, 0x91, 0xee, 0x46, 0x0e, 0x30, 0x07, 0xd6, 0x73, 0x1c, 0x82, 0xf5,
+ 0x14, 0x67, 0xaa, 0x9d, 0x09, 0xf6, 0x3c, 0x0e, 0x82, 0x3d, 0xa5, 0x88, 0xb7, 0xb4, 0xe7, 0x19,
+ 0x22, 0xd0, 0x9e, 0xd3, 0x28, 0xb4, 0xa7, 0x1c, 0x89, 0xa2, 0x31, 0x8d, 0x0b, 0xc0, 0x3d, 0x07,
+ 0x13, 0x70, 0x8f, 0x38, 0xc3, 0xa0, 0xe7, 0xc4, 0x7b, 0xa4, 0x37, 0x48, 0xc8, 0x1e, 0xf3, 0x7d,
+ 0xc4, 0x8f, 0x63, 0xd3, 0xd4, 0x4d, 0x8e, 0xd0, 0xb0, 0x86, 0x74, 0x97, 0xbc, 0xd7, 0x3d, 0x3f,
+ 0x37, 0x05, 0x03, 0x2a, 0x43, 0x31, 0xe0, 0xdb, 0xa4, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0x02, 0xf9,
+ 0xdf, 0xfa, 0x39, 0xfe, 0xd6, 0x1f, 0x7b, 0x9f, 0xe6, 0x02, 0x89, 0x87, 0x3f, 0xb5, 0xe1, 0xa0,
+ 0x8f, 0xea, 0xa5, 0x34, 0xf7, 0x60, 0x89, 0x26, 0xc1, 0x2c, 0x70, 0x04, 0x62, 0x53, 0x99, 0x74,
+ 0xb0, 0x5d, 0x60, 0x41, 0xea, 0x6d, 0x58, 0xf6, 0xf1, 0xba, 0x0f, 0x6c, 0x86, 0x7c, 0x88, 0x2e,
+ 0x77, 0x8d, 0xbf, 0xb4, 0xff, 0x39, 0xe1, 0xed, 0x90, 0x87, 0x16, 0x85, 0x01, 0x3b, 0xc2, 0xaf,
+ 0x06, 0x76, 0xa2, 0x1f, 0xfa, 0xe8, 0x73, 0x58, 0x09, 0x60, 0x3e, 0x4e, 0x8e, 0x99, 0x58, 0x0c,
+ 0xfa, 0x89, 0xf9, 0x52, 0x1e, 0xb7, 0x07, 0x7d, 0x01, 0x37, 0x68, 0xb6, 0x1c, 0x91, 0xc7, 0x26,
+ 0xe7, 0xcb, 0x63, 0xaf, 0x11, 0x1d, 0xf5, 0x90, 0x5c, 0x36, 0x02, 0x10, 0x4a, 0x45, 0x00, 0x42,
+ 0x68, 0x0f, 0x0a, 0xe7, 0x78, 0x80, 0x2d, 0xcd, 0x52, 0x16, 0x78, 0x80, 0x0a, 0x24, 0xfd, 0x6f,
+ 0xc6, 0xe4, 0x3c, 0x97, 0x25, 0xbd, 0x7f, 0x25, 0x08, 0x5b, 0x65, 0x28, 0x2a, 0x7e, 0x75, 0xd2,
+ 0xff, 0x08, 0x9e, 0x59, 0xba, 0x88, 0x53, 0x5b, 0xef, 0x30, 0xf3, 0x2d, 0xca, 0xf4, 0x37, 0x79,
+ 0x6a, 0xf5, 0xf4, 0x73, 0x6e, 0x81, 0xe4, 0x27, 0xe1, 0x72, 0x2b, 0x2e, 0x39, 0x1e, 0x6e, 0x57,
+ 0x20, 0xa5, 0x0d, 0x3a, 0x78, 0xc4, 0x8d, 0x8c, 0x35, 0x88, 0xec, 0x33, 0x7c, 0xc9, 0x4d, 0x89,
+ 0xfc, 0x24, 0x7c, 0xf4, 0x9e, 0xd1, 0xb5, 0x14, 0x64, 0xd6, 0x40, 0xef, 0x43, 0x8e, 0x96, 0xcd,
+ 0x14, 0xdd, 0xb0, 0x78, 0xc0, 0x0c, 0xe4, 0x75, 0xac, 0xc4, 0xb5, 0x71, 0x48, 0x78, 0x0e, 0x0c,
+ 0x4b, 0xce, 0x1a, 0xfc, 0x97, 0x2f, 0xf3, 0xca, 0x06, 0x32, 0xaf, 0x9b, 0x90, 0x23, 0xb3, 0xb7,
+ 0x0c, 0xb5, 0x8d, 0x69, 0xb0, 0xcb, 0xc9, 0x1e, 0x41, 0xfa, 0x47, 0x01, 0xca, 0x63, 0xf1, 0x37,
+ 0x74, 0xed, 0xce, 0xad, 0x8c, 0x07, 0x11, 0xb8, 0x89, 0xd5, 0xdf, 0x02, 0x38, 0x57, 0x2d, 0xe5,
+ 0xb9, 0x3a, 0xb0, 0x71, 0x87, 0x6f, 0x41, 0xee, 0x5c, 0xb5, 0x3e, 0xa5, 0x84, 0xe0, 0x64, 0x52,
+ 0x63, 0x93, 0xf1, 0x61, 0x40, 0x69, 0x3f, 0x06, 0x84, 0xaa, 0x90, 0x35, 0x4c, 0x4d, 0x37, 0x35,
+ 0xfb, 0x92, 0xee, 0x49, 0x42, 0x76, 0xdb, 0xd2, 0x21, 0x5c, 0x09, 0x0d, 0xfd, 0xe8, 0x11, 0xe4,
+ 0xbc, 0xac, 0x41, 0xa0, 0x19, 0xee, 0x14, 0x68, 0xcd, 0xe3, 0x25, 0x5b, 0x72, 0x25, 0x34, 0xf8,
+ 0xa3, 0x06, 0xa4, 0x4d, 0x6c, 0x0d, 0x7b, 0x2c, 0xe3, 0x2e, 0x4d, 0x09, 0x8e, 0x01, 0x39, 0x42,
+ 0x1d, 0xf6, 0x6c, 0x99, 0x0b, 0x4b, 0x5f, 0x42, 0x9a, 0x51, 0x50, 0x1e, 0x32, 0xc7, 0xfb, 0x4f,
+ 0xf6, 0x0f, 0x3e, 0xdd, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0x87, 0x2d, 0x51, 0x40,
+ 0x39, 0x48, 0xd5, 0xb6, 0x0e, 0xe4, 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdb, 0xa8, 0xb7, 0xc4,
+ 0x04, 0x5a, 0x82, 0x22, 0xfb, 0xad, 0x3c, 0x3e, 0x90, 0x9f, 0xd6, 0x5a, 0x62, 0xd2, 0x47, 0x3a,
+ 0x6a, 0xec, 0x6f, 0x37, 0x64, 0x31, 0x25, 0xbd, 0x03, 0xd7, 0x23, 0xd3, 0x0c, 0x0f, 0x7d, 0x13,
+ 0x7c, 0xe8, 0x9b, 0xf4, 0x63, 0x9c, 0xbc, 0xa3, 0xa2, 0x72, 0x07, 0xb4, 0x3b, 0xb6, 0xf0, 0x07,
+ 0x0b, 0x24, 0x1e, 0x63, 0xab, 0x47, 0xaf, 0x41, 0xc9, 0xc4, 0x67, 0xd8, 0x6e, 0x77, 0x59, 0x2e,
+ 0xe3, 0xa0, 0x61, 0x45, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x0a, 0xb7, 0x6d, 0x85, 0x19, 0x81,
+ 0x45, 0x31, 0x87, 0x1c, 0x61, 0x23, 0xd4, 0x23, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a,
+ 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94, 0x22, 0x3d, 0x5f, 0x68, 0xb3, 0x73, 0x90, 0x92, 0x1b, 0x2d,
+ 0xf9, 0x33, 0x31, 0x81, 0x10, 0x94, 0xe8, 0x4f, 0xe5, 0x68, 0xbf, 0x76, 0x78, 0xd4, 0x3c, 0x20,
+ 0x9b, 0xbd, 0x0c, 0x65, 0x67, 0xb3, 0x1d, 0x62, 0x0a, 0x5d, 0x81, 0xa5, 0xfa, 0xc1, 0xd3, 0xc3,
+ 0xbd, 0x46, 0xab, 0xe1, 0x91, 0xd3, 0xd2, 0x2a, 0xdc, 0x9c, 0x96, 0x2a, 0x49, 0xff, 0x9e, 0x80,
+ 0x6b, 0x11, 0xa9, 0x0e, 0x7a, 0x1f, 0xc0, 0x1e, 0x29, 0x26, 0x6e, 0xeb, 0x66, 0x27, 0xda, 0x78,
+ 0x5b, 0x23, 0x99, 0x72, 0xc8, 0x39, 0x9b, 0xff, 0x9a, 0x1a, 0x2f, 0x3e, 0xe2, 0x4a, 0xc9, 0x66,
+ 0x58, 0x1c, 0xc1, 0xb9, 0x15, 0xf2, 0x24, 0xc5, 0x6d, 0xa2, 0x98, 0x9e, 0x19, 0x55, 0x4c, 0xf9,
+ 0xd1, 0x67, 0x70, 0x6d, 0x2c, 0xac, 0xf1, 0x58, 0x60, 0x85, 0x55, 0x8d, 0xc3, 0xa3, 0xdb, 0x95,
+ 0x60, 0x74, 0x63, 0xb1, 0xc0, 0x9a, 0x02, 0x97, 0xa4, 0x5e, 0x01, 0x2e, 0x89, 0x0a, 0x8f, 0xe9,
+ 0x45, 0x2b, 0x23, 0x61, 0xe1, 0x71, 0x2c, 0xed, 0xc8, 0x8c, 0xa7, 0x1d, 0xd2, 0xff, 0x06, 0x4e,
+ 0x37, 0x98, 0x5e, 0x1e, 0x40, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0xf1, 0xdb, 0xf4, 0x68, 0xde, 0x5c,
+ 0x75, 0xc3, 0xf9, 0x71, 0x44, 0xc5, 0x65, 0xae, 0xe6, 0xf7, 0xf2, 0xd0, 0xa3, 0x8e, 0x27, 0xf5,
+ 0x5b, 0x1c, 0x4f, 0x13, 0xd2, 0xf8, 0x02, 0x0f, 0x6c, 0xab, 0x92, 0xa6, 0x2b, 0xbe, 0x3a, 0xb9,
+ 0x62, 0xd2, 0xbd, 0x55, 0x21, 0xf9, 0xcf, 0x7f, 0xbd, 0x58, 0x13, 0x19, 0xf7, 0x5b, 0x7a, 0x5f,
+ 0xb3, 0x71, 0xdf, 0xb0, 0x2f, 0x65, 0x2e, 0x2f, 0xbd, 0x0b, 0xa5, 0xe0, 0xa6, 0x47, 0xbb, 0x11,
+ 0xcf, 0x51, 0xc7, 0xa5, 0xbf, 0x17, 0x60, 0x39, 0x04, 0xdc, 0x41, 0x8f, 0x78, 0x41, 0x89, 0x1d,
+ 0xfc, 0xed, 0xc9, 0xdd, 0x0b, 0xb0, 0x7b, 0x75, 0x25, 0x12, 0x38, 0xbd, 0xe7, 0x03, 0x3b, 0x63,
+ 0x8f, 0x80, 0xde, 0x84, 0xb2, 0xa5, 0x9d, 0x0f, 0x14, 0x93, 0xe1, 0x44, 0x6e, 0xb1, 0x86, 0x64,
+ 0xf7, 0xa4, 0xc3, 0x29, 0x69, 0x76, 0x48, 0xf6, 0x83, 0x40, 0x54, 0xc6, 0xb8, 0xa5, 0x36, 0xa0,
+ 0xc9, 0xd7, 0x4c, 0x18, 0x92, 0x25, 0xbc, 0x02, 0x92, 0xf5, 0xb7, 0xb4, 0x94, 0x13, 0xf9, 0xc2,
+ 0x41, 0x9f, 0x8c, 0xdd, 0x8b, 0x0f, 0x16, 0x79, 0x1f, 0x6d, 0x30, 0x5a, 0xf0, 0x66, 0x48, 0x0f,
+ 0xa1, 0xe0, 0xa7, 0xcf, 0x77, 0x78, 0xbb, 0x5e, 0xfc, 0x0f, 0x22, 0x6e, 0xb7, 0xa1, 0x68, 0x62,
+ 0x9b, 0x38, 0xa9, 0x00, 0x44, 0x59, 0x60, 0x44, 0x96, 0xaa, 0xee, 0x26, 0xb3, 0x82, 0x18, 0x77,
+ 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x86, 0xf3, 0x60, 0x30, 0xc1, 0x0f, 0x83, 0x8d, 0xa1, 0xa7,
+ 0xf1, 0x71, 0xf4, 0x14, 0xdd, 0x81, 0x32, 0x7b, 0x93, 0x90, 0x73, 0x53, 0xed, 0xa1, 0x89, 0x39,
+ 0xe8, 0x56, 0xa2, 0xe4, 0x23, 0x87, 0x8a, 0x3e, 0x87, 0xeb, 0x76, 0xd7, 0xc4, 0x56, 0x57, 0xef,
+ 0x75, 0x94, 0xf1, 0xb3, 0x63, 0xc5, 0xa0, 0xb5, 0x19, 0x46, 0x27, 0x5f, 0x73, 0x35, 0x9c, 0x04,
+ 0xcf, 0xef, 0x1b, 0x48, 0xd1, 0x6b, 0x43, 0x12, 0x3f, 0xd7, 0x8a, 0x73, 0xdc, 0x40, 0xbf, 0x00,
+ 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0x27, 0x87, 0xf2, 0xae, 0x5d, 0xcd, 0xe1,
+ 0xdb, 0xba, 0xc9, 0xef, 0xdf, 0x8a, 0x27, 0xea, 0xbb, 0x83, 0x3e, 0x85, 0xd2, 0x3e, 0x94, 0x82,
+ 0xb2, 0x4e, 0x46, 0xcd, 0xe6, 0x10, 0xcc, 0xa8, 0x59, 0x86, 0xce, 0x33, 0x6a, 0x37, 0x1f, 0x4f,
+ 0xb0, 0xda, 0x2f, 0x6d, 0x48, 0xbf, 0x08, 0x50, 0xf0, 0x7b, 0xbd, 0xb9, 0x93, 0x5e, 0xfe, 0x08,
+ 0x48, 0x4c, 0x3e, 0x02, 0x92, 0xbe, 0x34, 0xf8, 0x3a, 0x64, 0x49, 0x1a, 0x3c, 0xb4, 0x70, 0x87,
+ 0x57, 0xc4, 0x33, 0xe7, 0xaa, 0x75, 0x6c, 0xe1, 0x8e, 0xcf, 0x37, 0x65, 0x5e, 0xcd, 0x37, 0x05,
+ 0x93, 0xe9, 0xec, 0x58, 0x32, 0xbd, 0x9b, 0xcc, 0xa6, 0xc4, 0xb4, 0xec, 0xcb, 0xc6, 0xa5, 0xbf,
+ 0x14, 0x20, 0xeb, 0xae, 0x37, 0x58, 0x0a, 0x0e, 0x00, 0xb5, 0x6c, 0xbb, 0x58, 0x21, 0x98, 0x3f,
+ 0x5f, 0x58, 0x61, 0x3c, 0xe1, 0x16, 0xc6, 0x3f, 0x74, 0x13, 0xc2, 0x28, 0x28, 0xd2, 0xbf, 0xb9,
+ 0x0e, 0xfa, 0xcc, 0xf3, 0xdf, 0xbf, 0xe1, 0xf3, 0x20, 0x19, 0x0b, 0xfa, 0x23, 0x48, 0xab, 0x6d,
+ 0x17, 0x80, 0x2d, 0x85, 0x20, 0x93, 0x0e, 0xeb, 0x46, 0x6b, 0x54, 0xa3, 0x9c, 0x32, 0x97, 0xe0,
+ 0xb3, 0x8a, 0x3b, 0xb3, 0x92, 0xf6, 0x88, 0x5e, 0xc6, 0x13, 0xbc, 0xe9, 0x25, 0x80, 0xe3, 0xfd,
+ 0xa7, 0x07, 0xdb, 0x3b, 0x8f, 0x77, 0x1a, 0xdb, 0x3c, 0xe3, 0xdb, 0xde, 0x6e, 0x6c, 0x8b, 0x71,
+ 0xc2, 0x27, 0x37, 0x9e, 0x1e, 0x9c, 0x34, 0xb6, 0xc5, 0x04, 0x69, 0x6c, 0x37, 0xf6, 0x6a, 0x9f,
+ 0x35, 0xb6, 0xc5, 0xa4, 0x54, 0x83, 0x9c, 0x1b, 0x74, 0xe8, 0x17, 0x04, 0xfa, 0x73, 0x6c, 0xf2,
+ 0xdd, 0x62, 0x0d, 0xb4, 0x0a, 0xf9, 0xc9, 0x0a, 0x02, 0x79, 0xc0, 0xb1, 0xc2, 0x01, 0x09, 0x03,
+ 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed, 0x8e, 0xe1, 0xee,
+ 0xce, 0xfb, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x4f, 0xf0, 0x25, 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa,
+ 0x84, 0x99, 0x38, 0x9b, 0x46, 0x7c, 0xca, 0x34, 0x12, 0x63, 0xd3, 0x40, 0x77, 0xa0, 0x30, 0xd0,
+ 0x3b, 0x58, 0x51, 0x3b, 0x1d, 0x13, 0x5b, 0x2c, 0x76, 0xe7, 0xb8, 0xe6, 0x3c, 0xe9, 0xa9, 0xb1,
+ 0x0e, 0xe9, 0x27, 0x01, 0xd0, 0x64, 0xa0, 0x45, 0x47, 0xb0, 0xe4, 0xc5, 0x6a, 0x27, 0x01, 0x60,
+ 0x91, 0x60, 0x3d, 0x3a, 0x50, 0x07, 0x30, 0x06, 0xf1, 0x22, 0x48, 0x26, 0x59, 0xdf, 0x8a, 0xe7,
+ 0xaa, 0x0c, 0xba, 0x5e, 0xba, 0x29, 0xf1, 0x39, 0x37, 0x25, 0x26, 0x23, 0x57, 0xde, 0xed, 0x19,
+ 0x77, 0xa5, 0x89, 0x89, 0x42, 0x94, 0x01, 0x95, 0xd6, 0x84, 0x18, 0x5f, 0x67, 0xd4, 0x94, 0x84,
+ 0x57, 0x99, 0x92, 0xf4, 0x10, 0xc4, 0x4f, 0xdc, 0xf1, 0xbd, 0xfc, 0xd1, 0x3f, 0x4d, 0x61, 0x62,
+ 0x9a, 0x17, 0x90, 0x25, 0xde, 0x97, 0x06, 0x8d, 0x3f, 0x86, 0x9c, 0xbb, 0x7b, 0xee, 0x47, 0x48,
+ 0x91, 0xdb, 0xce, 0x67, 0xe2, 0x89, 0xa0, 0x7b, 0xb0, 0x44, 0xe2, 0x86, 0x53, 0x0e, 0x66, 0x28,
+ 0x61, 0x9c, 0x7a, 0xc3, 0x32, 0xeb, 0xd8, 0x73, 0xa0, 0x2d, 0x12, 0xa3, 0x45, 0x16, 0xcb, 0x71,
+ 0xe7, 0xff, 0x63, 0x02, 0xe4, 0xdd, 0x37, 0x06, 0x96, 0xb2, 0x33, 0x2c, 0x06, 0x92, 0x09, 0xe9,
+ 0xcf, 0xe3, 0x90, 0xf7, 0x95, 0xa7, 0xd0, 0x1f, 0x06, 0x12, 0xab, 0xf5, 0x69, 0xa5, 0x2c, 0x5f,
+ 0x56, 0x15, 0x58, 0x58, 0x7c, 0xf1, 0x85, 0x45, 0x15, 0x06, 0x9d, 0x2a, 0x75, 0x72, 0xe1, 0x2a,
+ 0xf5, 0x5b, 0x80, 0x6c, 0xdd, 0x56, 0x7b, 0x24, 0x78, 0x6b, 0x83, 0x73, 0x85, 0xdd, 0x76, 0x56,
+ 0x19, 0x17, 0x69, 0xcf, 0x09, 0xed, 0x38, 0x24, 0x74, 0xa9, 0x07, 0x59, 0x17, 0x9c, 0x58, 0xfc,
+ 0xdb, 0x9e, 0xb0, 0x6a, 0x7c, 0x15, 0xb2, 0x7d, 0x6c, 0xab, 0x34, 0xec, 0x31, 0xb0, 0xca, 0x6d,
+ 0xdf, 0xfb, 0x00, 0xf2, 0xbe, 0x0f, 0x9e, 0x48, 0x24, 0xdc, 0x6f, 0x7c, 0x2a, 0xc6, 0xaa, 0x99,
+ 0x6f, 0xbf, 0x5f, 0x4f, 0xec, 0xe3, 0xe7, 0x64, 0x28, 0xb9, 0x51, 0x6f, 0x36, 0xea, 0x4f, 0x44,
+ 0xa1, 0x9a, 0xff, 0xf6, 0xfb, 0xf5, 0x8c, 0x8c, 0x69, 0x25, 0xe7, 0xde, 0x13, 0x28, 0x8f, 0x9d,
+ 0x40, 0xd0, 0x41, 0x23, 0x28, 0x6d, 0x1f, 0x1f, 0xee, 0xed, 0xd4, 0x6b, 0xad, 0x86, 0x72, 0x72,
+ 0xd0, 0x6a, 0x88, 0x02, 0xba, 0x06, 0xcb, 0x7b, 0x3b, 0x7f, 0xd2, 0x6c, 0x29, 0xf5, 0xbd, 0x9d,
+ 0xc6, 0x7e, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x13, 0x31, 0xfe, 0xe0, 0x3f, 0x00, 0xca, 0xb5,
+ 0xad, 0xfa, 0x4e, 0xcd, 0x30, 0x7a, 0x5a, 0x5b, 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3c, 0x4f,
+ 0xfd, 0xc0, 0xba, 0x3a, 0xbd, 0x3c, 0x87, 0x1e, 0x43, 0x8a, 0x82, 0xd2, 0x68, 0xfa, 0x17, 0xd7,
+ 0xd5, 0x19, 0xf5, 0x3a, 0x32, 0x19, 0x7a, 0x6f, 0xa6, 0x7e, 0x82, 0x5d, 0x9d, 0x5e, 0xbe, 0x43,
+ 0x7b, 0x90, 0x71, 0x00, 0xb9, 0x59, 0xdf, 0x45, 0x57, 0x67, 0xd6, 0xd4, 0xc8, 0xd2, 0x18, 0xb0,
+ 0x39, 0xfd, 0xeb, 0xec, 0xea, 0x8c, 0xc2, 0x1e, 0x92, 0x21, 0xe7, 0x41, 0xdd, 0xb3, 0x3f, 0x14,
+ 0xaf, 0xce, 0x51, 0x68, 0x44, 0x5f, 0x42, 0x31, 0x08, 0xdd, 0xcd, 0xf7, 0x0d, 0x77, 0x75, 0xce,
+ 0x22, 0x20, 0xd1, 0x1f, 0xc4, 0xf1, 0xe6, 0xfb, 0xa6, 0xbb, 0x3a, 0x67, 0x4d, 0x10, 0x7d, 0x05,
+ 0x4b, 0x93, 0x38, 0xdb, 0xfc, 0x9f, 0x78, 0x57, 0x17, 0xa8, 0x12, 0xa2, 0x3e, 0xa0, 0x10, 0x7c,
+ 0x6e, 0x81, 0x2f, 0xbe, 0xab, 0x8b, 0x14, 0x0d, 0x51, 0x07, 0xca, 0xe3, 0xd8, 0xd4, 0xbc, 0xdf,
+ 0x66, 0x57, 0xe7, 0xae, 0xec, 0xb1, 0x51, 0x82, 0x18, 0xc9, 0xbc, 0xdf, 0x6a, 0x57, 0xe7, 0x2e,
+ 0xf4, 0xa1, 0x63, 0x00, 0xdf, 0xdb, 0x76, 0x8e, 0x6f, 0xb7, 0xab, 0xf3, 0x94, 0xfc, 0x90, 0x01,
+ 0xcb, 0x61, 0x8f, 0xd9, 0x45, 0x3e, 0xe5, 0xae, 0x2e, 0x54, 0x09, 0x24, 0xf6, 0x1c, 0x7c, 0x97,
+ 0xce, 0xf7, 0x69, 0x77, 0x75, 0xce, 0x92, 0xe0, 0xd6, 0xd6, 0x0f, 0x2f, 0x57, 0x85, 0x1f, 0x5f,
+ 0xae, 0x0a, 0x3f, 0xbd, 0x5c, 0x15, 0xbe, 0xfb, 0x79, 0x35, 0xf6, 0xe3, 0xcf, 0xab, 0xb1, 0x7f,
+ 0xfb, 0x79, 0x35, 0xf6, 0xa7, 0x77, 0xcf, 0x35, 0xbb, 0x3b, 0x3c, 0xdd, 0x68, 0xeb, 0x7d, 0xfa,
+ 0xff, 0x1d, 0x43, 0xbd, 0xdc, 0x64, 0x3a, 0x49, 0xcb, 0xf7, 0x2f, 0xa1, 0xd3, 0x34, 0x8d, 0x75,
+ 0x0f, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x24, 0x0e, 0x7f, 0x45, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -5548,6 +5676,29 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) {
}
return len(dAtA) - i, nil
}
+func (m *Request_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Request_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ if m.FinalizeSnapshotSync != nil {
+ {
+ size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1
+ i--
+ dAtA[i] = 0xa2
+ }
+ return len(dAtA) - i, nil
+}
func (m *RequestEcho) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -5716,12 +5867,12 @@ func (m *RequestInitChain) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x12
}
- n18, err18 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err18 != nil {
- return 0, err18
+ n19, err19 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err19 != nil {
+ return 0, err19
}
- i -= n18
- i = encodeVarintTypes(dAtA, i, uint64(n18))
+ i -= n19
+ i = encodeVarintTypes(dAtA, i, uint64(n19))
i--
dAtA[i] = 0xa
return len(dAtA) - i, nil
@@ -5963,6 +6114,53 @@ func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, erro
return len(dAtA) - i, nil
}
+func (m *RequestFinalizeSnapshotSync) 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 *RequestFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *RequestFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.Commit != nil {
+ {
+ size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.LightBlock != nil {
+ {
+ size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *RequestPrepareProposal) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -6031,12 +6229,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n21, err21 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err21 != nil {
- return 0, err21
+ n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err24 != nil {
+ return 0, err24
}
- i -= n21
- i = encodeVarintTypes(dAtA, i, uint64(n21))
+ i -= n24
+ i = encodeVarintTypes(dAtA, i, uint64(n24))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6160,12 +6358,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n25, err25 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err25 != nil {
- return 0, err25
+ n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err28 != nil {
+ return 0, err28
}
- i -= n25
- i = encodeVarintTypes(dAtA, i, uint64(n25))
+ i -= n28
+ i = encodeVarintTypes(dAtA, i, uint64(n28))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -6780,6 +6978,29 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error)
}
return len(dAtA) - i, nil
}
+func (m *Response_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *Response_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ if m.FinalizeSnapshotSync != nil {
+ {
+ size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1
+ i--
+ dAtA[i] = 0x8a
+ }
+ return len(dAtA) - i, nil
+}
func (m *ResponseException) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -7003,12 +7224,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n49, err49 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err49 != nil {
- return 0, err49
+ n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err53 != nil {
+ return 0, err53
}
- i -= n49
- i = encodeVarintTypes(dAtA, i, uint64(n49))
+ i -= n53
+ i = encodeVarintTypes(dAtA, i, uint64(n53))
i--
dAtA[i] = 0x32
}
@@ -7315,6 +7536,29 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
+func (m *ResponseFinalizeSnapshotSync) 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 *ResponseFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *ResponseFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ return len(dAtA) - i, nil
+}
+
func (m *ResponsePrepareProposal) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -8285,12 +8529,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n62, err62 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err62 != nil {
- return 0, err62
+ n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err66 != nil {
+ return 0, err66
}
- i -= n62
- i = encodeVarintTypes(dAtA, i, uint64(n62))
+ i -= n66
+ i = encodeVarintTypes(dAtA, i, uint64(n66))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -8566,6 +8810,18 @@ func (m *Request_FinalizeBlock) Size() (n int) {
}
return n
}
+func (m *Request_FinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.FinalizeSnapshotSync != nil {
+ l = m.FinalizeSnapshotSync.Size()
+ n += 2 + l + sovTypes(uint64(l))
+ }
+ return n
+}
func (m *RequestEcho) Size() (n int) {
if m == nil {
return 0
@@ -8749,6 +9005,23 @@ func (m *RequestApplySnapshotChunk) Size() (n int) {
return n
}
+func (m *RequestFinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.LightBlock != nil {
+ l = m.LightBlock.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.Commit != nil {
+ l = m.Commit.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ return n
+}
+
func (m *RequestPrepareProposal) Size() (n int) {
if m == nil {
return 0
@@ -9153,6 +9426,18 @@ func (m *Response_FinalizeBlock) Size() (n int) {
}
return n
}
+func (m *Response_FinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if m.FinalizeSnapshotSync != nil {
+ l = m.FinalizeSnapshotSync.Size()
+ n += 2 + l + sovTypes(uint64(l))
+ }
+ return n
+}
func (m *ResponseException) Size() (n int) {
if m == nil {
return 0
@@ -9402,6 +9687,15 @@ func (m *ResponseApplySnapshotChunk) Size() (n int) {
return n
}
+func (m *ResponseFinalizeSnapshotSync) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ return n
+}
+
func (m *ResponsePrepareProposal) Size() (n int) {
if m == nil {
return 0
@@ -10409,6 +10703,41 @@ func (m *Request) Unmarshal(dAtA []byte) error {
}
m.Value = &Request_FinalizeBlock{v}
iNdEx = postIndex
+ case 20:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ v := &RequestFinalizeSnapshotSync{}
+ if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ m.Value = &Request_FinalizeSnapshotSync{v}
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -11673,6 +12002,128 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *RequestFinalizeSnapshotSync) 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 ErrIntOverflowTypes
+ }
+ 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: RequestFinalizeSnapshotSync: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: RequestFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field LightBlock", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.LightBlock == nil {
+ m.LightBlock = &types1.LightBlock{}
+ }
+ if err := m.LightBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.Commit == nil {
+ m.Commit = &types1.Commit{}
+ }
+ if err := m.Commit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *RequestPrepareProposal) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
@@ -13716,6 +14167,41 @@ func (m *Response) Unmarshal(dAtA []byte) error {
}
m.Value = &Response_FinalizeBlock{v}
iNdEx = postIndex
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ v := &ResponseFinalizeSnapshotSync{}
+ if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ m.Value = &Response_FinalizeSnapshotSync{v}
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
@@ -15326,6 +15812,56 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *ResponseFinalizeSnapshotSync) 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 ErrIntOverflowTypes
+ }
+ 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: ResponseFinalizeSnapshotSync: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTypes(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *ResponsePrepareProposal) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
diff --git a/light/example_test.go b/light/example_test.go
index 55b93fedae..74fcf6b41c 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -2,6 +2,7 @@ package light_test
import (
"context"
+ "encoding/hex"
"testing"
"time"
@@ -113,3 +114,93 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
+
+// Manually getting light blocks and verifying them.
+func TestClientLocalDevnet(t *testing.T) {
+ const CHAINID = "dashmate_local_12"
+
+ if testing.Short() {
+ t.Skip("skipping test in short mode")
+ }
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Start a test application
+ // app, err := kvstore.NewMemoryApp()
+ // require.NoError(t, err)
+
+ primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // give Tendermint time to generate some blocks
+ time.Sleep(5 * time.Second)
+
+ _, err = primary.LightBlock(ctx, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ db := dbm.NewMemDB()
+
+ // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
+ require.NoError(t, err)
+ coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
+ "tenderdash", "IAzIcGlDfuow",
+ logger)
+ require.NoError(t, err)
+
+ trusted, err := hex.DecodeString("5EA22033B1855219F7579554EE75CBB48C25CDF7DF2AD6C1FD5428C1BA74CFE4")
+ require.NoError(t, err)
+
+ c, err := light.NewClientAtHeight(
+ ctx,
+ 1,
+ trusted,
+ CHAINID,
+ primary,
+ nil,
+ dbs.New(db),
+ coreClient,
+ light.Logger(logger),
+ )
+
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ if err := c.Cleanup(); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ // wait for a few more blocks to be produced
+ time.Sleep(2 * time.Second)
+
+ // verify the block at height 3
+ _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // retrieve light block at height 3
+ _, err = c.TrustedLightBlock(3)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // update to the latest height
+ lb, err := c.Update(ctx, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ logger.Info("verified light block", "light-block", lb)
+}
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 3453c1ce4a..70b2755b85 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -22,21 +22,22 @@ import "gogoproto/gogo.proto";
// Request types
message Request {
oneof value {
- RequestEcho echo = 1;
- RequestFlush flush = 2;
- RequestInfo info = 3;
- RequestInitChain init_chain = 4;
- RequestQuery query = 5;
- RequestCheckTx check_tx = 7;
- RequestListSnapshots list_snapshots = 11;
- RequestOfferSnapshot offer_snapshot = 12;
- RequestLoadSnapshotChunk load_snapshot_chunk = 13;
- RequestApplySnapshotChunk apply_snapshot_chunk = 14;
- RequestPrepareProposal prepare_proposal = 15;
- RequestProcessProposal process_proposal = 16;
- RequestExtendVote extend_vote = 17;
- RequestVerifyVoteExtension verify_vote_extension = 18;
- RequestFinalizeBlock finalize_block = 19;
+ RequestEcho echo = 1;
+ RequestFlush flush = 2;
+ RequestInfo info = 3;
+ RequestInitChain init_chain = 4;
+ RequestQuery query = 5;
+ RequestCheckTx check_tx = 7;
+ RequestListSnapshots list_snapshots = 11;
+ RequestOfferSnapshot offer_snapshot = 12;
+ RequestLoadSnapshotChunk load_snapshot_chunk = 13;
+ RequestApplySnapshotChunk apply_snapshot_chunk = 14;
+ RequestFinalizeSnapshotSync finalize_snapshot_sync = 20;
+ RequestPrepareProposal prepare_proposal = 15;
+ RequestProcessProposal process_proposal = 16;
+ RequestExtendVote extend_vote = 17;
+ RequestVerifyVoteExtension verify_vote_extension = 18;
+ RequestFinalizeBlock finalize_block = 19;
}
reserved 6, 8, 9, 10; // RequestBeginBlock, RequestDeliverTx, RequestEndBlock, RequestCommit
}
@@ -183,6 +184,16 @@ message RequestApplySnapshotChunk {
string sender = 3; // The P2P ID of the node who sent this chunk.
}
+// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+// It includes the light block committed at the synced height, which Tenderdash uses
+// to reconstruct its own state.
+message RequestFinalizeSnapshotSync {
+ // light block committed at the synced height
+ tendermint.types.LightBlock light_block = 1;
+ // commit fot the `light_block`
+ tendermint.types.Commit commit = 2;
+}
+
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -503,22 +514,23 @@ message RequestFinalizeBlock {
message Response {
oneof value {
- ResponseException exception = 1;
- ResponseEcho echo = 2;
- ResponseFlush flush = 3;
- ResponseInfo info = 4;
- ResponseInitChain init_chain = 5;
- ResponseQuery query = 6;
- ResponseCheckTx check_tx = 7;
- ResponseListSnapshots list_snapshots = 8;
- ResponseOfferSnapshot offer_snapshot = 9;
- ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
- ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
- ResponsePrepareProposal prepare_proposal = 12;
- ResponseProcessProposal process_proposal = 13;
- ResponseExtendVote extend_vote = 14;
- ResponseVerifyVoteExtension verify_vote_extension = 15;
- ResponseFinalizeBlock finalize_block = 16;
+ ResponseException exception = 1;
+ ResponseEcho echo = 2;
+ ResponseFlush flush = 3;
+ ResponseInfo info = 4;
+ ResponseInitChain init_chain = 5;
+ ResponseQuery query = 6;
+ ResponseCheckTx check_tx = 7;
+ ResponseListSnapshots list_snapshots = 8;
+ ResponseOfferSnapshot offer_snapshot = 9;
+ ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
+ ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
+ ResponseFinalizeSnapshotSync finalize_snapshot_sync = 17;
+ ResponsePrepareProposal prepare_proposal = 12;
+ ResponseProcessProposal process_proposal = 13;
+ ResponseExtendVote extend_vote = 14;
+ ResponseVerifyVoteExtension verify_vote_extension = 15;
+ ResponseFinalizeBlock finalize_block = 16;
}
}
@@ -629,6 +641,10 @@ message ResponseApplySnapshotChunk {
}
}
+// The response to a `RequestPrepareSnapshot` message.
+message ResponseFinalizeSnapshotSync {
+}
+
message ResponsePrepareProposal {
// Possibly modified list of transactions that have been picked as part of the proposed block.
repeated TxRecord tx_records = 1;
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 6162aaf3b2..9945f1071b 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -18,6 +18,7 @@
- [RequestEcho](#tendermint-abci-RequestEcho)
- [RequestExtendVote](#tendermint-abci-RequestExtendVote)
- [RequestFinalizeBlock](#tendermint-abci-RequestFinalizeBlock)
+ - [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync)
- [RequestFlush](#tendermint-abci-RequestFlush)
- [RequestInfo](#tendermint-abci-RequestInfo)
- [RequestInitChain](#tendermint-abci-RequestInitChain)
@@ -35,6 +36,7 @@
- [ResponseException](#tendermint-abci-ResponseException)
- [ResponseExtendVote](#tendermint-abci-ResponseExtendVote)
- [ResponseFinalizeBlock](#tendermint-abci-ResponseFinalizeBlock)
+ - [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync)
- [ResponseFlush](#tendermint-abci-ResponseFlush)
- [ResponseInfo](#tendermint-abci-ResponseInfo)
- [ResponseInitChain](#tendermint-abci-ResponseInitChain)
@@ -247,6 +249,7 @@ Request types
| offer_snapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | | |
| load_snapshot_chunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | | |
+| finalize_snapshot_sync | [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync) | | |
| prepare_proposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | | |
| process_proposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | | |
| extend_vote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | | |
@@ -423,6 +426,24 @@ Finalize newly decided block.
+
+
+### RequestFinalizeSnapshotSync
+After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
+It includes the light block committed at the synced height, which Tenderdash uses
+to reconstruct its own state.
+
+
+| Field | Type | Label | Description |
+| ----- | ---- | ----- | ----------- |
+| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
+| commit | [tendermint.types.Commit](#tendermint-types-Commit) | | commit fot the `light_block` |
+
+
+
+
+
+
### RequestFlush
@@ -809,6 +830,7 @@ from this condition, but not sure), and _p_ receives a Precommit message for rou
| offer_snapshot | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | | |
| load_snapshot_chunk | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | | |
+| finalize_snapshot_sync | [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync) | | |
| prepare_proposal | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | | |
| process_proposal | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | | |
| extend_vote | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | | |
@@ -919,6 +941,16 @@ nondeterministic
+
+
+### ResponseFinalizeSnapshotSync
+The response to a `RequestPrepareSnapshot` message.
+
+
+
+
+
+
### ResponseFlush
From c1edaf6b9898a21f17541794d14d91bf9b699c06 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:18:34 +0100
Subject: [PATCH 06/65] build: bump abci version minor
---
version/version.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/version/version.go b/version/version.go
index e2db669794..df7d4822e8 100644
--- a/version/version.go
+++ b/version/version.go
@@ -11,7 +11,7 @@ const (
// when not using git describe. It is formatted with semantic versioning.
TMVersionDefault = "1.4.0"
// ABCISemVer is the semantic version of the ABCI library
- ABCISemVer = "1.2.0"
+ ABCISemVer = "1.3.0"
ABCIVersion = ABCISemVer
)
From f89ed874f295784f3c10759d0612b64ab8ae82cb Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:24:05 +0100
Subject: [PATCH 07/65] chore: rename finalize snapshot request
---
abci/types/types.pb.go | 704 +++++++++++++++---------------
proto/tendermint/abci/types.proto | 70 +--
spec/abci++/api.md | 16 +-
3 files changed, 395 insertions(+), 395 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 8f7432f1af..73c13f07fd 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -271,7 +271,7 @@ type Request struct {
// *Request_OfferSnapshot
// *Request_LoadSnapshotChunk
// *Request_ApplySnapshotChunk
- // *Request_FinalizeSnapshotSync
+ // *Request_FinalizeSnapshot
// *Request_PrepareProposal
// *Request_ProcessProposal
// *Request_ExtendVote
@@ -349,8 +349,8 @@ type Request_LoadSnapshotChunk struct {
type Request_ApplySnapshotChunk struct {
ApplySnapshotChunk *RequestApplySnapshotChunk `protobuf:"bytes,14,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
-type Request_FinalizeSnapshotSync struct {
- FinalizeSnapshotSync *RequestFinalizeSnapshotSync `protobuf:"bytes,20,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+type Request_FinalizeSnapshot struct {
+ FinalizeSnapshot *RequestFinalizeSnapshot `protobuf:"bytes,20,opt,name=finalize_snapshot,json=finalizeSnapshot,proto3,oneof" json:"finalize_snapshot,omitempty"`
}
type Request_PrepareProposal struct {
PrepareProposal *RequestPrepareProposal `protobuf:"bytes,15,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
@@ -368,22 +368,22 @@ type Request_FinalizeBlock struct {
FinalizeBlock *RequestFinalizeBlock `protobuf:"bytes,19,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Request_Echo) isRequest_Value() {}
-func (*Request_Flush) isRequest_Value() {}
-func (*Request_Info) isRequest_Value() {}
-func (*Request_InitChain) isRequest_Value() {}
-func (*Request_Query) isRequest_Value() {}
-func (*Request_CheckTx) isRequest_Value() {}
-func (*Request_ListSnapshots) isRequest_Value() {}
-func (*Request_OfferSnapshot) isRequest_Value() {}
-func (*Request_LoadSnapshotChunk) isRequest_Value() {}
-func (*Request_ApplySnapshotChunk) isRequest_Value() {}
-func (*Request_FinalizeSnapshotSync) isRequest_Value() {}
-func (*Request_PrepareProposal) isRequest_Value() {}
-func (*Request_ProcessProposal) isRequest_Value() {}
-func (*Request_ExtendVote) isRequest_Value() {}
-func (*Request_VerifyVoteExtension) isRequest_Value() {}
-func (*Request_FinalizeBlock) isRequest_Value() {}
+func (*Request_Echo) isRequest_Value() {}
+func (*Request_Flush) isRequest_Value() {}
+func (*Request_Info) isRequest_Value() {}
+func (*Request_InitChain) isRequest_Value() {}
+func (*Request_Query) isRequest_Value() {}
+func (*Request_CheckTx) isRequest_Value() {}
+func (*Request_ListSnapshots) isRequest_Value() {}
+func (*Request_OfferSnapshot) isRequest_Value() {}
+func (*Request_LoadSnapshotChunk) isRequest_Value() {}
+func (*Request_ApplySnapshotChunk) isRequest_Value() {}
+func (*Request_FinalizeSnapshot) isRequest_Value() {}
+func (*Request_PrepareProposal) isRequest_Value() {}
+func (*Request_ProcessProposal) isRequest_Value() {}
+func (*Request_ExtendVote) isRequest_Value() {}
+func (*Request_VerifyVoteExtension) isRequest_Value() {}
+func (*Request_FinalizeBlock) isRequest_Value() {}
func (m *Request) GetValue() isRequest_Value {
if m != nil {
@@ -462,9 +462,9 @@ func (m *Request) GetApplySnapshotChunk() *RequestApplySnapshotChunk {
return nil
}
-func (m *Request) GetFinalizeSnapshotSync() *RequestFinalizeSnapshotSync {
- if x, ok := m.GetValue().(*Request_FinalizeSnapshotSync); ok {
- return x.FinalizeSnapshotSync
+func (m *Request) GetFinalizeSnapshot() *RequestFinalizeSnapshot {
+ if x, ok := m.GetValue().(*Request_FinalizeSnapshot); ok {
+ return x.FinalizeSnapshot
}
return nil
}
@@ -517,7 +517,7 @@ func (*Request) XXX_OneofWrappers() []interface{} {
(*Request_OfferSnapshot)(nil),
(*Request_LoadSnapshotChunk)(nil),
(*Request_ApplySnapshotChunk)(nil),
- (*Request_FinalizeSnapshotSync)(nil),
+ (*Request_FinalizeSnapshot)(nil),
(*Request_PrepareProposal)(nil),
(*Request_ProcessProposal)(nil),
(*Request_ExtendVote)(nil),
@@ -1177,25 +1177,25 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
// It includes the light block committed at the synced height, which Tenderdash uses
// to reconstruct its own state.
-type RequestFinalizeSnapshotSync struct {
+type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
// commit fot the `light_block`
Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
}
-func (m *RequestFinalizeSnapshotSync) Reset() { *m = RequestFinalizeSnapshotSync{} }
-func (m *RequestFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
-func (*RequestFinalizeSnapshotSync) ProtoMessage() {}
-func (*RequestFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
+func (m *RequestFinalizeSnapshot) String() string { return proto.CompactTextString(m) }
+func (*RequestFinalizeSnapshot) ProtoMessage() {}
+func (*RequestFinalizeSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_252557cfdd89a31a, []int{11}
}
-func (m *RequestFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+func (m *RequestFinalizeSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
-func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+func (m *RequestFinalizeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
- return xxx_messageInfo_RequestFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ return xxx_messageInfo_RequestFinalizeSnapshot.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -1205,26 +1205,26 @@ func (m *RequestFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool)
return b[:n], nil
}
}
-func (m *RequestFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
- xxx_messageInfo_RequestFinalizeSnapshotSync.Merge(m, src)
+func (m *RequestFinalizeSnapshot) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_RequestFinalizeSnapshot.Merge(m, src)
}
-func (m *RequestFinalizeSnapshotSync) XXX_Size() int {
+func (m *RequestFinalizeSnapshot) XXX_Size() int {
return m.Size()
}
-func (m *RequestFinalizeSnapshotSync) XXX_DiscardUnknown() {
- xxx_messageInfo_RequestFinalizeSnapshotSync.DiscardUnknown(m)
+func (m *RequestFinalizeSnapshot) XXX_DiscardUnknown() {
+ xxx_messageInfo_RequestFinalizeSnapshot.DiscardUnknown(m)
}
-var xxx_messageInfo_RequestFinalizeSnapshotSync proto.InternalMessageInfo
+var xxx_messageInfo_RequestFinalizeSnapshot proto.InternalMessageInfo
-func (m *RequestFinalizeSnapshotSync) GetLightBlock() *types1.LightBlock {
+func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
if m != nil {
return m.LightBlock
}
return nil
}
-func (m *RequestFinalizeSnapshotSync) GetCommit() *types1.Commit {
+func (m *RequestFinalizeSnapshot) GetCommit() *types1.Commit {
if m != nil {
return m.Commit
}
@@ -2020,7 +2020,7 @@ type Response struct {
// *Response_OfferSnapshot
// *Response_LoadSnapshotChunk
// *Response_ApplySnapshotChunk
- // *Response_FinalizeSnapshotSync
+ // *Response_FinalizeSnapshot
// *Response_PrepareProposal
// *Response_ProcessProposal
// *Response_ExtendVote
@@ -2101,8 +2101,8 @@ type Response_LoadSnapshotChunk struct {
type Response_ApplySnapshotChunk struct {
ApplySnapshotChunk *ResponseApplySnapshotChunk `protobuf:"bytes,11,opt,name=apply_snapshot_chunk,json=applySnapshotChunk,proto3,oneof" json:"apply_snapshot_chunk,omitempty"`
}
-type Response_FinalizeSnapshotSync struct {
- FinalizeSnapshotSync *ResponseFinalizeSnapshotSync `protobuf:"bytes,17,opt,name=finalize_snapshot_sync,json=finalizeSnapshotSync,proto3,oneof" json:"finalize_snapshot_sync,omitempty"`
+type Response_FinalizeSnapshot struct {
+ FinalizeSnapshot *ResponseFinalizeSnapshot `protobuf:"bytes,17,opt,name=finalize_snapshot,json=finalizeSnapshot,proto3,oneof" json:"finalize_snapshot,omitempty"`
}
type Response_PrepareProposal struct {
PrepareProposal *ResponsePrepareProposal `protobuf:"bytes,12,opt,name=prepare_proposal,json=prepareProposal,proto3,oneof" json:"prepare_proposal,omitempty"`
@@ -2120,23 +2120,23 @@ type Response_FinalizeBlock struct {
FinalizeBlock *ResponseFinalizeBlock `protobuf:"bytes,16,opt,name=finalize_block,json=finalizeBlock,proto3,oneof" json:"finalize_block,omitempty"`
}
-func (*Response_Exception) isResponse_Value() {}
-func (*Response_Echo) isResponse_Value() {}
-func (*Response_Flush) isResponse_Value() {}
-func (*Response_Info) isResponse_Value() {}
-func (*Response_InitChain) isResponse_Value() {}
-func (*Response_Query) isResponse_Value() {}
-func (*Response_CheckTx) isResponse_Value() {}
-func (*Response_ListSnapshots) isResponse_Value() {}
-func (*Response_OfferSnapshot) isResponse_Value() {}
-func (*Response_LoadSnapshotChunk) isResponse_Value() {}
-func (*Response_ApplySnapshotChunk) isResponse_Value() {}
-func (*Response_FinalizeSnapshotSync) isResponse_Value() {}
-func (*Response_PrepareProposal) isResponse_Value() {}
-func (*Response_ProcessProposal) isResponse_Value() {}
-func (*Response_ExtendVote) isResponse_Value() {}
-func (*Response_VerifyVoteExtension) isResponse_Value() {}
-func (*Response_FinalizeBlock) isResponse_Value() {}
+func (*Response_Exception) isResponse_Value() {}
+func (*Response_Echo) isResponse_Value() {}
+func (*Response_Flush) isResponse_Value() {}
+func (*Response_Info) isResponse_Value() {}
+func (*Response_InitChain) isResponse_Value() {}
+func (*Response_Query) isResponse_Value() {}
+func (*Response_CheckTx) isResponse_Value() {}
+func (*Response_ListSnapshots) isResponse_Value() {}
+func (*Response_OfferSnapshot) isResponse_Value() {}
+func (*Response_LoadSnapshotChunk) isResponse_Value() {}
+func (*Response_ApplySnapshotChunk) isResponse_Value() {}
+func (*Response_FinalizeSnapshot) isResponse_Value() {}
+func (*Response_PrepareProposal) isResponse_Value() {}
+func (*Response_ProcessProposal) isResponse_Value() {}
+func (*Response_ExtendVote) isResponse_Value() {}
+func (*Response_VerifyVoteExtension) isResponse_Value() {}
+func (*Response_FinalizeBlock) isResponse_Value() {}
func (m *Response) GetValue() isResponse_Value {
if m != nil {
@@ -2222,9 +2222,9 @@ func (m *Response) GetApplySnapshotChunk() *ResponseApplySnapshotChunk {
return nil
}
-func (m *Response) GetFinalizeSnapshotSync() *ResponseFinalizeSnapshotSync {
- if x, ok := m.GetValue().(*Response_FinalizeSnapshotSync); ok {
- return x.FinalizeSnapshotSync
+func (m *Response) GetFinalizeSnapshot() *ResponseFinalizeSnapshot {
+ if x, ok := m.GetValue().(*Response_FinalizeSnapshot); ok {
+ return x.FinalizeSnapshot
}
return nil
}
@@ -2278,7 +2278,7 @@ func (*Response) XXX_OneofWrappers() []interface{} {
(*Response_OfferSnapshot)(nil),
(*Response_LoadSnapshotChunk)(nil),
(*Response_ApplySnapshotChunk)(nil),
- (*Response_FinalizeSnapshotSync)(nil),
+ (*Response_FinalizeSnapshot)(nil),
(*Response_PrepareProposal)(nil),
(*Response_ProcessProposal)(nil),
(*Response_ExtendVote)(nil),
@@ -3019,21 +3019,21 @@ func (m *ResponseApplySnapshotChunk) GetNextChunks() [][]byte {
}
// The response to a `RequestPrepareSnapshot` message.
-type ResponseFinalizeSnapshotSync struct {
+type ResponseFinalizeSnapshot struct {
}
-func (m *ResponseFinalizeSnapshotSync) Reset() { *m = ResponseFinalizeSnapshotSync{} }
-func (m *ResponseFinalizeSnapshotSync) String() string { return proto.CompactTextString(m) }
-func (*ResponseFinalizeSnapshotSync) ProtoMessage() {}
-func (*ResponseFinalizeSnapshotSync) Descriptor() ([]byte, []int) {
+func (m *ResponseFinalizeSnapshot) Reset() { *m = ResponseFinalizeSnapshot{} }
+func (m *ResponseFinalizeSnapshot) String() string { return proto.CompactTextString(m) }
+func (*ResponseFinalizeSnapshot) ProtoMessage() {}
+func (*ResponseFinalizeSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_252557cfdd89a31a, []int{29}
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Unmarshal(b []byte) error {
+func (m *ResponseFinalizeSnapshot) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+func (m *ResponseFinalizeSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
if deterministic {
- return xxx_messageInfo_ResponseFinalizeSnapshotSync.Marshal(b, m, deterministic)
+ return xxx_messageInfo_ResponseFinalizeSnapshot.Marshal(b, m, deterministic)
} else {
b = b[:cap(b)]
n, err := m.MarshalToSizedBuffer(b)
@@ -3043,17 +3043,17 @@ func (m *ResponseFinalizeSnapshotSync) XXX_Marshal(b []byte, deterministic bool)
return b[:n], nil
}
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Merge(src proto.Message) {
- xxx_messageInfo_ResponseFinalizeSnapshotSync.Merge(m, src)
+func (m *ResponseFinalizeSnapshot) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ResponseFinalizeSnapshot.Merge(m, src)
}
-func (m *ResponseFinalizeSnapshotSync) XXX_Size() int {
+func (m *ResponseFinalizeSnapshot) XXX_Size() int {
return m.Size()
}
-func (m *ResponseFinalizeSnapshotSync) XXX_DiscardUnknown() {
- xxx_messageInfo_ResponseFinalizeSnapshotSync.DiscardUnknown(m)
+func (m *ResponseFinalizeSnapshot) XXX_DiscardUnknown() {
+ xxx_messageInfo_ResponseFinalizeSnapshot.DiscardUnknown(m)
}
-var xxx_messageInfo_ResponseFinalizeSnapshotSync proto.InternalMessageInfo
+var xxx_messageInfo_ResponseFinalizeSnapshot proto.InternalMessageInfo
type ResponsePrepareProposal struct {
// Possibly modified list of transactions that have been picked as part of the proposed block.
@@ -4449,7 +4449,7 @@ func init() {
proto.RegisterType((*RequestOfferSnapshot)(nil), "tendermint.abci.RequestOfferSnapshot")
proto.RegisterType((*RequestLoadSnapshotChunk)(nil), "tendermint.abci.RequestLoadSnapshotChunk")
proto.RegisterType((*RequestApplySnapshotChunk)(nil), "tendermint.abci.RequestApplySnapshotChunk")
- proto.RegisterType((*RequestFinalizeSnapshotSync)(nil), "tendermint.abci.RequestFinalizeSnapshotSync")
+ proto.RegisterType((*RequestFinalizeSnapshot)(nil), "tendermint.abci.RequestFinalizeSnapshot")
proto.RegisterType((*RequestPrepareProposal)(nil), "tendermint.abci.RequestPrepareProposal")
proto.RegisterType((*RequestProcessProposal)(nil), "tendermint.abci.RequestProcessProposal")
proto.RegisterType((*RequestExtendVote)(nil), "tendermint.abci.RequestExtendVote")
@@ -4467,7 +4467,7 @@ func init() {
proto.RegisterType((*ResponseOfferSnapshot)(nil), "tendermint.abci.ResponseOfferSnapshot")
proto.RegisterType((*ResponseLoadSnapshotChunk)(nil), "tendermint.abci.ResponseLoadSnapshotChunk")
proto.RegisterType((*ResponseApplySnapshotChunk)(nil), "tendermint.abci.ResponseApplySnapshotChunk")
- proto.RegisterType((*ResponseFinalizeSnapshotSync)(nil), "tendermint.abci.ResponseFinalizeSnapshotSync")
+ proto.RegisterType((*ResponseFinalizeSnapshot)(nil), "tendermint.abci.ResponseFinalizeSnapshot")
proto.RegisterType((*ResponsePrepareProposal)(nil), "tendermint.abci.ResponsePrepareProposal")
proto.RegisterType((*ResponseProcessProposal)(nil), "tendermint.abci.ResponseProcessProposal")
proto.RegisterType((*ExtendVoteExtension)(nil), "tendermint.abci.ExtendVoteExtension")
@@ -4494,245 +4494,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3807 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0xcb, 0x6f, 0x1b, 0x57,
- 0x77, 0xe7, 0xf0, 0xcd, 0xc3, 0xd7, 0xe8, 0x4a, 0xb6, 0x69, 0xda, 0x96, 0xf4, 0x8d, 0x9b, 0xd8,
- 0x71, 0x12, 0xc9, 0xb1, 0x9b, 0x38, 0x69, 0x92, 0x02, 0x14, 0x45, 0x97, 0x92, 0x65, 0x49, 0x19,
- 0x51, 0x0a, 0xd2, 0x34, 0x19, 0x8c, 0xc8, 0x2b, 0x71, 0x62, 0x92, 0x33, 0x99, 0x19, 0xca, 0x54,
- 0xb6, 0x6d, 0x81, 0x22, 0x8b, 0x22, 0xff, 0x40, 0x76, 0x2d, 0xd0, 0x4d, 0xf7, 0x5d, 0xb5, 0xcb,
- 0xa6, 0xe8, 0x26, 0xcb, 0x02, 0x45, 0xdd, 0xc0, 0xd9, 0xb5, 0xab, 0xac, 0xba, 0xe9, 0xa2, 0xb8,
- 0x8f, 0x79, 0x91, 0x33, 0x7c, 0xc4, 0x01, 0x8a, 0x6f, 0xc7, 0x7b, 0xee, 0x39, 0xe7, 0xbe, 0xce,
- 0x3d, 0xe7, 0xdc, 0xdf, 0x19, 0xc2, 0x0d, 0x1b, 0x0f, 0x3a, 0xd8, 0xec, 0x6b, 0x03, 0x7b, 0x53,
- 0x3d, 0x6d, 0x6b, 0x9b, 0xf6, 0xa5, 0x81, 0xad, 0x0d, 0xc3, 0xd4, 0x6d, 0x1d, 0x95, 0xbd, 0xce,
- 0x0d, 0xd2, 0x59, 0xbd, 0xe5, 0xe3, 0x6e, 0x9b, 0x97, 0x86, 0xad, 0x6f, 0x1a, 0xa6, 0xae, 0x9f,
- 0x31, 0xfe, 0xaa, 0x5f, 0x19, 0xd5, 0xb3, 0xd9, 0x51, 0xad, 0x2e, 0xef, 0xbc, 0x39, 0xd1, 0x79,
- 0xda, 0xd3, 0xdb, 0xcf, 0x22, 0x7b, 0x7d, 0x13, 0x09, 0xf4, 0xf2, 0x71, 0x9f, 0xe1, 0x4b, 0xa7,
- 0xf7, 0xd6, 0x84, 0xac, 0xa1, 0x9a, 0x6a, 0xdf, 0xe9, 0x5e, 0xf5, 0x75, 0x5f, 0x60, 0xd3, 0xd2,
- 0xf4, 0x41, 0x40, 0xf9, 0xda, 0xb9, 0xae, 0x9f, 0xf7, 0xf0, 0x26, 0x6d, 0x9d, 0x0e, 0xcf, 0x36,
- 0x6d, 0xad, 0x8f, 0x2d, 0x5b, 0xed, 0x1b, 0x9c, 0x61, 0xe5, 0x5c, 0x3f, 0xd7, 0xe9, 0xcf, 0x4d,
- 0xf2, 0x8b, 0x51, 0xa5, 0xff, 0xce, 0x41, 0x46, 0xc6, 0x5f, 0x0f, 0xb1, 0x65, 0xa3, 0x07, 0x90,
- 0xc4, 0xed, 0xae, 0x5e, 0x11, 0xd6, 0x85, 0xbb, 0xf9, 0x07, 0x37, 0x37, 0xc6, 0xf6, 0x6d, 0x83,
- 0xf3, 0x35, 0xda, 0x5d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x17, 0x52, 0x67, 0xbd, 0xa1, 0xd5,
- 0xad, 0xc4, 0xa9, 0xd0, 0xad, 0x28, 0xa1, 0xc7, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0x19, 0x4a,
- 0x1b, 0x9c, 0xe9, 0x95, 0xc4, 0xf4, 0xa1, 0x76, 0x06, 0x67, 0x74, 0x28, 0xc2, 0x8b, 0xb6, 0x00,
- 0xb4, 0x81, 0x66, 0x2b, 0xed, 0xae, 0xaa, 0x0d, 0x2a, 0x49, 0x2a, 0xf9, 0xbb, 0x68, 0x49, 0xcd,
- 0xae, 0x13, 0xc6, 0x66, 0x4c, 0xce, 0x69, 0x4e, 0x83, 0x4c, 0xf7, 0xeb, 0x21, 0x36, 0x2f, 0x2b,
- 0xa9, 0xe9, 0xd3, 0xfd, 0x84, 0x30, 0x91, 0xe9, 0x52, 0x6e, 0xf4, 0x11, 0x64, 0xdb, 0x5d, 0xdc,
- 0x7e, 0xa6, 0xd8, 0xa3, 0x4a, 0x86, 0x4a, 0xae, 0x45, 0x49, 0xd6, 0x09, 0x5f, 0x6b, 0xd4, 0x8c,
- 0xc9, 0x99, 0x36, 0xfb, 0x89, 0xf6, 0xa1, 0xd4, 0xd3, 0x2c, 0x5b, 0xb1, 0x06, 0xaa, 0x61, 0x75,
- 0x75, 0xdb, 0xaa, 0xe4, 0xa9, 0x8e, 0xd7, 0xa2, 0x74, 0xec, 0x69, 0x96, 0x7d, 0xe4, 0x30, 0x37,
- 0x63, 0x72, 0xb1, 0xe7, 0x27, 0x10, 0x7d, 0xfa, 0xd9, 0x19, 0x36, 0x5d, 0x85, 0x95, 0xc2, 0x74,
- 0x7d, 0x07, 0x84, 0xdb, 0x91, 0x27, 0xfa, 0x74, 0x3f, 0x01, 0x7d, 0x0e, 0xcb, 0x3d, 0x5d, 0xed,
- 0xb8, 0xea, 0x94, 0x76, 0x77, 0x38, 0x78, 0x56, 0x29, 0x52, 0xa5, 0x6f, 0x44, 0x4e, 0x52, 0x57,
- 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0xa5, 0xde, 0x38, 0x11, 0x7d, 0x09, 0x2b, 0xaa,
- 0x61, 0xf4, 0x2e, 0xc7, 0xb5, 0x97, 0xa8, 0xf6, 0x7b, 0x51, 0xda, 0x6b, 0x44, 0x66, 0x5c, 0x3d,
- 0x52, 0x27, 0xa8, 0xa8, 0x03, 0x57, 0xcf, 0xb4, 0x81, 0xda, 0xd3, 0xbe, 0xc1, 0xde, 0x10, 0xd6,
- 0xe5, 0xa0, 0x5d, 0x59, 0xa1, 0x23, 0xbc, 0x15, 0x69, 0x91, 0x5c, 0xca, 0x51, 0x77, 0x74, 0x39,
- 0x68, 0x37, 0x63, 0xf2, 0xca, 0x59, 0x08, 0x1d, 0xb5, 0x40, 0x34, 0x4c, 0x6c, 0xa8, 0x26, 0x56,
- 0x0c, 0x53, 0x37, 0x74, 0x4b, 0xed, 0x55, 0xca, 0x54, 0xff, 0x9d, 0x28, 0xfd, 0x87, 0x8c, 0xff,
- 0x90, 0xb3, 0x37, 0x63, 0x72, 0xd9, 0x08, 0x92, 0x98, 0x56, 0xbd, 0x8d, 0x2d, 0xcb, 0xd3, 0x2a,
- 0xce, 0xd2, 0x4a, 0xf9, 0x83, 0x5a, 0x03, 0x24, 0xd4, 0x80, 0x3c, 0x1e, 0x11, 0x71, 0xe5, 0x42,
- 0xb7, 0x71, 0x65, 0x89, 0x2a, 0x94, 0x22, 0x6f, 0x33, 0x65, 0x3d, 0xd1, 0x6d, 0xdc, 0x8c, 0xc9,
- 0x80, 0xdd, 0x16, 0x52, 0xe1, 0xca, 0x05, 0x36, 0xb5, 0xb3, 0x4b, 0xaa, 0x46, 0xa1, 0x3d, 0xc4,
- 0xeb, 0x54, 0x10, 0x55, 0xf8, 0x66, 0x94, 0xc2, 0x13, 0x2a, 0x44, 0x54, 0x34, 0x1c, 0x91, 0x66,
- 0x4c, 0x5e, 0xbe, 0x98, 0x24, 0x13, 0x43, 0x76, 0xcf, 0x8e, 0xba, 0xd1, 0xca, 0xf2, 0x74, 0x43,
- 0x76, 0xce, 0x6c, 0x8b, 0x30, 0x13, 0x43, 0x3e, 0xf3, 0x13, 0xb6, 0x32, 0x90, 0xba, 0x50, 0x7b,
- 0x43, 0xbc, 0x9b, 0xcc, 0xa6, 0xc5, 0xcc, 0x6e, 0x32, 0x9b, 0x15, 0x73, 0xbb, 0xc9, 0x6c, 0x4e,
- 0x84, 0xdd, 0x64, 0x16, 0xc4, 0xbc, 0x74, 0x07, 0xf2, 0x3e, 0x27, 0x86, 0x2a, 0x90, 0xe9, 0x63,
- 0xcb, 0x52, 0xcf, 0x31, 0xf5, 0x79, 0x39, 0xd9, 0x69, 0x4a, 0x25, 0x28, 0xf8, 0x1d, 0x97, 0xf4,
- 0x9d, 0xe0, 0x4a, 0x12, 0x9f, 0x44, 0x24, 0xb9, 0x13, 0x76, 0x24, 0x79, 0x13, 0xdd, 0x86, 0x22,
- 0x5d, 0x8a, 0xe2, 0xf4, 0x13, 0xc7, 0x98, 0x94, 0x0b, 0x94, 0x78, 0xc2, 0x99, 0xd6, 0x20, 0x6f,
- 0x3c, 0x30, 0x5c, 0x96, 0x04, 0x65, 0x01, 0xe3, 0x81, 0xe1, 0x30, 0xfc, 0x0e, 0x0a, 0x64, 0xdd,
- 0x2e, 0x47, 0x92, 0x0e, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x45, 0x02, 0xc4, 0x71, 0x67, 0x87,
- 0xde, 0x87, 0x24, 0xf1, 0xfb, 0xdc, 0x85, 0x57, 0x37, 0x58, 0x50, 0xd8, 0x70, 0x82, 0xc2, 0x46,
- 0xcb, 0x09, 0x0a, 0x5b, 0xd9, 0x1f, 0x5e, 0xac, 0xc5, 0xbe, 0xfb, 0xcf, 0x35, 0x41, 0xa6, 0x12,
- 0xe8, 0x3a, 0x71, 0x71, 0xaa, 0x36, 0x50, 0xb4, 0x0e, 0x9d, 0x72, 0x8e, 0xf8, 0x2f, 0x55, 0x1b,
- 0xec, 0x74, 0xd0, 0x1e, 0x88, 0x6d, 0x7d, 0x60, 0xe1, 0x81, 0x35, 0xb4, 0x14, 0x16, 0x94, 0xb8,
- 0xe3, 0x0e, 0xb8, 0x5f, 0x16, 0x8d, 0xea, 0x0e, 0xe7, 0x21, 0x65, 0x94, 0xcb, 0xed, 0x20, 0x01,
- 0xed, 0x43, 0xf1, 0x42, 0xed, 0x69, 0x1d, 0xd5, 0xd6, 0x4d, 0xc5, 0xc2, 0x36, 0xf7, 0xe4, 0xb7,
- 0x27, 0xce, 0xfc, 0xc4, 0xe1, 0x3a, 0xc2, 0xf6, 0xb1, 0xd1, 0x51, 0x6d, 0xbc, 0x95, 0xfc, 0xe1,
- 0xc5, 0x9a, 0x20, 0x17, 0x2e, 0x7c, 0x3d, 0xe8, 0x75, 0x28, 0xab, 0x86, 0xa1, 0x58, 0xb6, 0x6a,
- 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0x75, 0xee, 0x05, 0xb9, 0xa8, 0x1a, 0xc6, 0x11, 0xa1, 0x6e,
- 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0x24, 0x0e, 0x68, 0x6a, 0x4f, 0xe9, 0x62, 0xed, 0xbc, 0x6b, 0x57,
- 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58, 0x76, 0xd8, 0xda,
- 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xf5, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26, 0x66, 0xfc, 0x52,
- 0xc7, 0xb5, 0x14, 0x1a, 0x33, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0x7a, 0x02, 0x05, 0x99, 0xfe,
- 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5f, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c, 0x75, 0x82, 0x4e,
- 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x5b, 0xb2, 0x32, 0x6b, 0x48, 0x32,
- 0x94, 0x82, 0xf1, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x28, 0x71, 0x7b, 0x84, 0xee, 0x43, 0x92,
- 0x1c, 0x00, 0x1d, 0xa3, 0x14, 0x12, 0x51, 0xb9, 0x5c, 0xeb, 0xd2, 0xc0, 0x32, 0xe5, 0x94, 0xae,
- 0xc2, 0x4a, 0x58, 0xbc, 0x91, 0xba, 0x2e, 0x3d, 0x10, 0x37, 0xd0, 0xbb, 0x90, 0x75, 0x03, 0x0e,
- 0xb3, 0xaf, 0xeb, 0x13, 0xa3, 0x38, 0xcc, 0xb2, 0xcb, 0x4a, 0x0c, 0x8b, 0x9c, 0x4f, 0x57, 0xe5,
- 0x49, 0x42, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0xae, 0x74, 0x0e, 0x95, 0xa8, 0x60, 0xe2,
- 0xdb, 0x1f, 0x81, 0xde, 0x0e, 0x67, 0x7f, 0x7c, 0x37, 0x2f, 0x4e, 0xcf, 0xc4, 0xbd, 0x79, 0xd4,
- 0x82, 0x87, 0x83, 0x67, 0xc4, 0x82, 0x13, 0x6c, 0x20, 0xda, 0xde, 0xe9, 0x48, 0x1d, 0xb8, 0x1e,
- 0x19, 0x57, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x1c, 0x06, 0x8b, 0x56, 0x6c, 0xe2, 0xac, 0x41, 0xa6,
- 0x66, 0xd1, 0x75, 0xd3, 0x61, 0x72, 0x32, 0x6f, 0x49, 0x7f, 0x2d, 0xc0, 0x8d, 0x29, 0xc1, 0x05,
- 0x7d, 0x0c, 0xf9, 0x1e, 0x59, 0x03, 0xf7, 0x75, 0x21, 0x69, 0x16, 0xbb, 0x42, 0x7b, 0x84, 0x89,
- 0x7a, 0x34, 0x19, 0x7a, 0xee, 0x6f, 0x74, 0x1f, 0xd2, 0x6d, 0xbd, 0xdf, 0xd7, 0x6c, 0x9e, 0x6b,
- 0x55, 0xc2, 0x2e, 0x1f, 0xe9, 0x97, 0x39, 0x9f, 0xf4, 0x4b, 0x12, 0xae, 0x86, 0x47, 0x23, 0xb4,
- 0x0e, 0x85, 0xbe, 0x3a, 0x52, 0xec, 0x11, 0xbf, 0x32, 0x02, 0x35, 0x42, 0xe8, 0xab, 0xa3, 0xd6,
- 0x88, 0xdd, 0x17, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9, 0x89,
- 0x9e, 0xc2, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xc2, 0xe7, 0xc2, 0x1c, 0xc1,
- 0x8d, 0x49, 0x7b, 0xa3, 0xdd, 0xc4, 0x59, 0xd2, 0x5b, 0x1b, 0x93, 0xcb, 0x54, 0x76, 0x4f, 0xb5,
- 0x6c, 0xd6, 0x85, 0xb6, 0x21, 0xdf, 0xd7, 0xac, 0x53, 0xdc, 0x55, 0x2f, 0x34, 0xdd, 0xac, 0x24,
- 0xd7, 0x13, 0xa1, 0xa9, 0xe0, 0x53, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9, 0xec, 0x24, 0x15, 0xb8,
- 0x47, 0x8e, 0x27, 0x4c, 0x2f, 0xec, 0x09, 0xef, 0xc3, 0xca, 0x00, 0x8f, 0x6c, 0xc5, 0xf5, 0x32,
- 0x16, 0x33, 0xde, 0x0c, 0xb5, 0x01, 0x44, 0xfa, 0x5c, 0xd7, 0x64, 0x11, 0x3b, 0x26, 0x66, 0x62,
- 0xea, 0xc3, 0x41, 0xa7, 0x92, 0x5d, 0x17, 0xee, 0xa6, 0x64, 0xd6, 0x40, 0x8f, 0xa0, 0x42, 0x3d,
- 0x08, 0x73, 0xab, 0xe4, 0x08, 0x71, 0xc7, 0x71, 0x27, 0x39, 0x6a, 0xba, 0x57, 0x48, 0x3f, 0x75,
- 0xdc, 0x7b, 0xb4, 0x97, 0xbb, 0xa0, 0x4d, 0x58, 0x61, 0xe9, 0x00, 0x36, 0x49, 0x5e, 0x40, 0x0e,
- 0x89, 0x4e, 0x00, 0xe8, 0x04, 0x96, 0x9c, 0xbe, 0x43, 0x53, 0x6f, 0x8d, 0xe8, 0xf8, 0xf7, 0x5d,
- 0x81, 0x8e, 0x42, 0xee, 0x9a, 0x73, 0x41, 0xf2, 0xf4, 0xe6, 0x20, 0xa7, 0xaf, 0x66, 0xb8, 0xf1,
- 0xe5, 0x91, 0x77, 0x8b, 0x0a, 0x93, 0x99, 0x30, 0xef, 0xf2, 0x7c, 0xb9, 0x77, 0xc9, 0xd6, 0x20,
- 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa5, 0x22, 0x9d, 0x12, 0x30, 0x12, 0xbd, 0xd3, 0xff,
- 0x94, 0xf2, 0xd9, 0x5c, 0x30, 0x31, 0xe1, 0x16, 0x25, 0x78, 0x16, 0x75, 0xe4, 0x9b, 0xb8, 0xdf,
- 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0xbb, 0xb6, 0x68, 0xbb, 0x4a, 0xfc, 0x3a, 0xbb, 0x42, 0x90, 0xa4,
- 0x2b, 0x4c, 0x32, 0x3f, 0x4e, 0x7e, 0x47, 0xda, 0x9a, 0x7b, 0xfe, 0x69, 0xff, 0xf9, 0x3b, 0x16,
- 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a, 0x70, 0x75, 0x4c, 0x50,
- 0x19, 0xd2, 0x58, 0x4b, 0xad, 0x6d, 0xec, 0x9d, 0xe3, 0x38, 0x19, 0x9f, 0x22, 0x79, 0x39, 0xa0,
- 0x97, 0xc5, 0xe9, 0x48, 0x0b, 0xce, 0x2f, 0x6a, 0xc1, 0x85, 0x79, 0x2c, 0xb8, 0xf8, 0x2a, 0x16,
- 0x5c, 0x9a, 0xb0, 0xe0, 0x63, 0x58, 0x9a, 0xc8, 0x8d, 0x5d, 0x73, 0x10, 0x42, 0xcd, 0x21, 0x1e,
- 0x6e, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0x4e, 0x91, 0x43, 0x07, 0x78, 0x07,
- 0xae, 0x78, 0xa9, 0x92, 0x7f, 0x1f, 0x59, 0x38, 0x42, 0x6e, 0xa7, 0xb7, 0x91, 0x53, 0xd2, 0x0a,
- 0x36, 0xa7, 0xa4, 0xdf, 0x44, 0x9f, 0x42, 0x39, 0x98, 0xdc, 0x93, 0xdc, 0x89, 0x5c, 0x97, 0x3f,
- 0x98, 0xb8, 0x2e, 0xde, 0x5e, 0xb8, 0x73, 0x96, 0x4b, 0x17, 0xfe, 0xa6, 0x25, 0xfd, 0x6b, 0xdc,
- 0x4d, 0x1d, 0x02, 0x99, 0x3a, 0xfa, 0xc0, 0x0d, 0x5d, 0xc2, 0xbc, 0x37, 0x9b, 0x0b, 0x8c, 0xdf,
- 0xe6, 0xf8, 0xab, 0xdd, 0xe6, 0x44, 0xe8, 0xf1, 0x25, 0xc3, 0xb7, 0x2a, 0xe5, 0xdf, 0xaa, 0xb7,
- 0x21, 0xc5, 0xc2, 0x36, 0x0b, 0x28, 0xd7, 0x26, 0xef, 0x05, 0x8b, 0xd8, 0x8c, 0x0b, 0xd5, 0x20,
- 0xcb, 0x9e, 0x01, 0x5a, 0x87, 0x3b, 0x80, 0xeb, 0x11, 0x12, 0x3b, 0xdb, 0x5b, 0xf9, 0x97, 0x2f,
- 0xd6, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x4e, 0x47, 0xfa, 0x3b, 0x80, 0xac, 0x8c, 0x2d, 0x83,
- 0x98, 0x30, 0xda, 0x82, 0x1c, 0x1e, 0xb5, 0xb1, 0x61, 0x3b, 0x4f, 0x8e, 0xf0, 0x27, 0x1d, 0xe3,
- 0x6e, 0x38, 0x9c, 0xcd, 0x98, 0xec, 0x89, 0xa1, 0x87, 0x1c, 0xdf, 0x89, 0x86, 0x6a, 0xb8, 0xb8,
- 0x1f, 0xe0, 0x79, 0xcf, 0x01, 0x78, 0x58, 0xa0, 0x5f, 0x8d, 0x94, 0x1a, 0x43, 0x78, 0x1e, 0x72,
- 0x84, 0x27, 0x39, 0x63, 0xb0, 0x00, 0xc4, 0x53, 0x0f, 0x40, 0x3c, 0xa9, 0x19, 0xcb, 0x8c, 0xc0,
- 0x78, 0xde, 0x73, 0x30, 0x9e, 0xf4, 0x8c, 0x19, 0x8f, 0x81, 0x3c, 0x1f, 0x4f, 0x80, 0x3c, 0xeb,
- 0x91, 0xa2, 0x21, 0x28, 0xcf, 0xc1, 0x04, 0xca, 0x93, 0xa5, 0x4a, 0x5e, 0x8f, 0x54, 0x32, 0x03,
- 0xe6, 0x39, 0x98, 0x80, 0x79, 0x72, 0x33, 0x14, 0xce, 0xc0, 0x79, 0xfe, 0x2c, 0x1c, 0xe7, 0x81,
- 0x48, 0x24, 0x86, 0x4f, 0x73, 0x3e, 0xa0, 0x47, 0x89, 0x00, 0x7a, 0xf2, 0x91, 0x70, 0x01, 0x53,
- 0x3f, 0x37, 0xd2, 0x83, 0x23, 0x91, 0x1e, 0x06, 0x71, 0xbc, 0x1d, 0x6d, 0x9a, 0x8b, 0x40, 0x3d,
- 0xc7, 0x21, 0x50, 0x0f, 0xcb, 0x91, 0xee, 0x46, 0x0e, 0x30, 0x07, 0xd6, 0x73, 0x1c, 0x82, 0xf5,
- 0x14, 0x67, 0xaa, 0x9d, 0x09, 0xf6, 0x3c, 0x0e, 0x82, 0x3d, 0xa5, 0x88, 0xb7, 0xb4, 0xe7, 0x19,
- 0x22, 0xd0, 0x9e, 0xd3, 0x28, 0xb4, 0xa7, 0x1c, 0x89, 0xa2, 0x31, 0x8d, 0x0b, 0xc0, 0x3d, 0x07,
- 0x13, 0x70, 0x8f, 0x38, 0xc3, 0xa0, 0xe7, 0xc4, 0x7b, 0xa4, 0x37, 0x48, 0xc8, 0x1e, 0xf3, 0x7d,
- 0xc4, 0x8f, 0x63, 0xd3, 0xd4, 0x4d, 0x8e, 0xd0, 0xb0, 0x86, 0x74, 0x97, 0xbc, 0xd7, 0x3d, 0x3f,
- 0x37, 0x05, 0x03, 0x2a, 0x43, 0x31, 0xe0, 0xdb, 0xa4, 0x7f, 0x10, 0x3c, 0x59, 0x8a, 0x02, 0xf9,
- 0xdf, 0xfa, 0x39, 0xfe, 0xd6, 0x1f, 0x7b, 0x9f, 0xe6, 0x02, 0x89, 0x87, 0x3f, 0xb5, 0xe1, 0xa0,
- 0x8f, 0xea, 0xa5, 0x34, 0xf7, 0x60, 0x89, 0x26, 0xc1, 0x2c, 0x70, 0x04, 0x62, 0x53, 0x99, 0x74,
- 0xb0, 0x5d, 0x60, 0x41, 0xea, 0x6d, 0x58, 0xf6, 0xf1, 0xba, 0x0f, 0x6c, 0x86, 0x7c, 0x88, 0x2e,
- 0x77, 0x8d, 0xbf, 0xb4, 0xff, 0x39, 0xe1, 0xed, 0x90, 0x87, 0x16, 0x85, 0x01, 0x3b, 0xc2, 0xaf,
- 0x06, 0x76, 0xa2, 0x1f, 0xfa, 0xe8, 0x73, 0x58, 0x09, 0x60, 0x3e, 0x4e, 0x8e, 0x99, 0x58, 0x0c,
- 0xfa, 0x89, 0xf9, 0x52, 0x1e, 0xb7, 0x07, 0x7d, 0x01, 0x37, 0x68, 0xb6, 0x1c, 0x91, 0xc7, 0x26,
- 0xe7, 0xcb, 0x63, 0xaf, 0x11, 0x1d, 0xf5, 0x90, 0x5c, 0x36, 0x02, 0x10, 0x4a, 0x45, 0x00, 0x42,
- 0x68, 0x0f, 0x0a, 0xe7, 0x78, 0x80, 0x2d, 0xcd, 0x52, 0x16, 0x78, 0x80, 0x0a, 0x24, 0xfd, 0x6f,
- 0xc6, 0xe4, 0x3c, 0x97, 0x25, 0xbd, 0x7f, 0x25, 0x08, 0x5b, 0x65, 0x28, 0x2a, 0x7e, 0x75, 0xd2,
- 0xff, 0x08, 0x9e, 0x59, 0xba, 0x88, 0x53, 0x5b, 0xef, 0x30, 0xf3, 0x2d, 0xca, 0xf4, 0x37, 0x79,
- 0x6a, 0xf5, 0xf4, 0x73, 0x6e, 0x81, 0xe4, 0x27, 0xe1, 0x72, 0x2b, 0x2e, 0x39, 0x1e, 0x6e, 0x57,
- 0x20, 0xa5, 0x0d, 0x3a, 0x78, 0xc4, 0x8d, 0x8c, 0x35, 0x88, 0xec, 0x33, 0x7c, 0xc9, 0x4d, 0x89,
- 0xfc, 0x24, 0x7c, 0xf4, 0x9e, 0xd1, 0xb5, 0x14, 0x64, 0xd6, 0x40, 0xef, 0x43, 0x8e, 0x96, 0xcd,
- 0x14, 0xdd, 0xb0, 0x78, 0xc0, 0x0c, 0xe4, 0x75, 0xac, 0xc4, 0xb5, 0x71, 0x48, 0x78, 0x0e, 0x0c,
- 0x4b, 0xce, 0x1a, 0xfc, 0x97, 0x2f, 0xf3, 0xca, 0x06, 0x32, 0xaf, 0x9b, 0x90, 0x23, 0xb3, 0xb7,
- 0x0c, 0xb5, 0x8d, 0x69, 0xb0, 0xcb, 0xc9, 0x1e, 0x41, 0xfa, 0x47, 0x01, 0xca, 0x63, 0xf1, 0x37,
- 0x74, 0xed, 0xce, 0xad, 0x8c, 0x07, 0x11, 0xb8, 0x89, 0xd5, 0xdf, 0x02, 0x38, 0x57, 0x2d, 0xe5,
- 0xb9, 0x3a, 0xb0, 0x71, 0x87, 0x6f, 0x41, 0xee, 0x5c, 0xb5, 0x3e, 0xa5, 0x84, 0xe0, 0x64, 0x52,
- 0x63, 0x93, 0xf1, 0x61, 0x40, 0x69, 0x3f, 0x06, 0x84, 0xaa, 0x90, 0x35, 0x4c, 0x4d, 0x37, 0x35,
- 0xfb, 0x92, 0xee, 0x49, 0x42, 0x76, 0xdb, 0xd2, 0x21, 0x5c, 0x09, 0x0d, 0xfd, 0xe8, 0x11, 0xe4,
- 0xbc, 0xac, 0x41, 0xa0, 0x19, 0xee, 0x14, 0x68, 0xcd, 0xe3, 0x25, 0x5b, 0x72, 0x25, 0x34, 0xf8,
- 0xa3, 0x06, 0xa4, 0x4d, 0x6c, 0x0d, 0x7b, 0x2c, 0xe3, 0x2e, 0x4d, 0x09, 0x8e, 0x01, 0x39, 0x42,
- 0x1d, 0xf6, 0x6c, 0x99, 0x0b, 0x4b, 0x5f, 0x42, 0x9a, 0x51, 0x50, 0x1e, 0x32, 0xc7, 0xfb, 0x4f,
- 0xf6, 0x0f, 0x3e, 0xdd, 0x17, 0x63, 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0x87, 0x2d, 0x51, 0x40,
- 0x39, 0x48, 0xd5, 0xb6, 0x0e, 0xe4, 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdb, 0xa8, 0xb7, 0xc4,
- 0x04, 0x5a, 0x82, 0x22, 0xfb, 0xad, 0x3c, 0x3e, 0x90, 0x9f, 0xd6, 0x5a, 0x62, 0xd2, 0x47, 0x3a,
- 0x6a, 0xec, 0x6f, 0x37, 0x64, 0x31, 0x25, 0xbd, 0x03, 0xd7, 0x23, 0xd3, 0x0c, 0x0f, 0x7d, 0x13,
- 0x7c, 0xe8, 0x9b, 0xf4, 0x63, 0x9c, 0xbc, 0xa3, 0xa2, 0x72, 0x07, 0xb4, 0x3b, 0xb6, 0xf0, 0x07,
- 0x0b, 0x24, 0x1e, 0x63, 0xab, 0x47, 0xaf, 0x41, 0xc9, 0xc4, 0x67, 0xd8, 0x6e, 0x77, 0x59, 0x2e,
- 0xe3, 0xa0, 0x61, 0x45, 0x4e, 0xa5, 0x42, 0x16, 0x63, 0xfb, 0x0a, 0xb7, 0x6d, 0x85, 0x19, 0x81,
- 0x45, 0x31, 0x87, 0x1c, 0x61, 0x23, 0xd4, 0x23, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a,
- 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94, 0x22, 0x3d, 0x5f, 0x68, 0xb3, 0x73, 0x90, 0x92, 0x1b, 0x2d,
- 0xf9, 0x33, 0x31, 0x81, 0x10, 0x94, 0xe8, 0x4f, 0xe5, 0x68, 0xbf, 0x76, 0x78, 0xd4, 0x3c, 0x20,
- 0x9b, 0xbd, 0x0c, 0x65, 0x67, 0xb3, 0x1d, 0x62, 0x0a, 0x5d, 0x81, 0xa5, 0xfa, 0xc1, 0xd3, 0xc3,
- 0xbd, 0x46, 0xab, 0xe1, 0x91, 0xd3, 0xd2, 0x2a, 0xdc, 0x9c, 0x96, 0x2a, 0x49, 0xff, 0x9e, 0x80,
- 0x6b, 0x11, 0xa9, 0x0e, 0x7a, 0x1f, 0xc0, 0x1e, 0x29, 0x26, 0x6e, 0xeb, 0x66, 0x27, 0xda, 0x78,
- 0x5b, 0x23, 0x99, 0x72, 0xc8, 0x39, 0x9b, 0xff, 0x9a, 0x1a, 0x2f, 0x3e, 0xe2, 0x4a, 0xc9, 0x66,
- 0x58, 0x1c, 0xc1, 0xb9, 0x15, 0xf2, 0x24, 0xc5, 0x6d, 0xa2, 0x98, 0x9e, 0x19, 0x55, 0x4c, 0xf9,
- 0xd1, 0x67, 0x70, 0x6d, 0x2c, 0xac, 0xf1, 0x58, 0x60, 0x85, 0x55, 0x8d, 0xc3, 0xa3, 0xdb, 0x95,
- 0x60, 0x74, 0x63, 0xb1, 0xc0, 0x9a, 0x02, 0x97, 0xa4, 0x5e, 0x01, 0x2e, 0x89, 0x0a, 0x8f, 0xe9,
- 0x45, 0x2b, 0x23, 0x61, 0xe1, 0x71, 0x2c, 0xed, 0xc8, 0x8c, 0xa7, 0x1d, 0xd2, 0xff, 0x06, 0x4e,
- 0x37, 0x98, 0x5e, 0x1e, 0x40, 0xda, 0xb2, 0x55, 0x7b, 0x68, 0xf1, 0xdb, 0xf4, 0x68, 0xde, 0x5c,
- 0x75, 0xc3, 0xf9, 0x71, 0x44, 0xc5, 0x65, 0xae, 0xe6, 0xf7, 0xf2, 0xd0, 0xa3, 0x8e, 0x27, 0xf5,
- 0x5b, 0x1c, 0x4f, 0x13, 0xd2, 0xf8, 0x02, 0x0f, 0x6c, 0xab, 0x92, 0xa6, 0x2b, 0xbe, 0x3a, 0xb9,
- 0x62, 0xd2, 0xbd, 0x55, 0x21, 0xf9, 0xcf, 0x7f, 0xbd, 0x58, 0x13, 0x19, 0xf7, 0x5b, 0x7a, 0x5f,
- 0xb3, 0x71, 0xdf, 0xb0, 0x2f, 0x65, 0x2e, 0x2f, 0xbd, 0x0b, 0xa5, 0xe0, 0xa6, 0x47, 0xbb, 0x11,
- 0xcf, 0x51, 0xc7, 0xa5, 0xbf, 0x17, 0x60, 0x39, 0x04, 0xdc, 0x41, 0x8f, 0x78, 0x41, 0x89, 0x1d,
- 0xfc, 0xed, 0xc9, 0xdd, 0x0b, 0xb0, 0x7b, 0x75, 0x25, 0x12, 0x38, 0xbd, 0xe7, 0x03, 0x3b, 0x63,
- 0x8f, 0x80, 0xde, 0x84, 0xb2, 0xa5, 0x9d, 0x0f, 0x14, 0x93, 0xe1, 0x44, 0x6e, 0xb1, 0x86, 0x64,
- 0xf7, 0xa4, 0xc3, 0x29, 0x69, 0x76, 0x48, 0xf6, 0x83, 0x40, 0x54, 0xc6, 0xb8, 0xa5, 0x36, 0xa0,
- 0xc9, 0xd7, 0x4c, 0x18, 0x92, 0x25, 0xbc, 0x02, 0x92, 0xf5, 0xb7, 0xb4, 0x94, 0x13, 0xf9, 0xc2,
- 0x41, 0x9f, 0x8c, 0xdd, 0x8b, 0x0f, 0x16, 0x79, 0x1f, 0x6d, 0x30, 0x5a, 0xf0, 0x66, 0x48, 0x0f,
- 0xa1, 0xe0, 0xa7, 0xcf, 0x77, 0x78, 0xbb, 0x5e, 0xfc, 0x0f, 0x22, 0x6e, 0xb7, 0xa1, 0x68, 0x62,
- 0x9b, 0x38, 0xa9, 0x00, 0x44, 0x59, 0x60, 0x44, 0x96, 0xaa, 0xee, 0x26, 0xb3, 0x82, 0x18, 0x77,
- 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x86, 0xf3, 0x60, 0x30, 0xc1, 0x0f, 0x83, 0x8d, 0xa1, 0xa7,
- 0xf1, 0x71, 0xf4, 0x14, 0xdd, 0x81, 0x32, 0x7b, 0x93, 0x90, 0x73, 0x53, 0xed, 0xa1, 0x89, 0x39,
- 0xe8, 0x56, 0xa2, 0xe4, 0x23, 0x87, 0x8a, 0x3e, 0x87, 0xeb, 0x76, 0xd7, 0xc4, 0x56, 0x57, 0xef,
- 0x75, 0x94, 0xf1, 0xb3, 0x63, 0xc5, 0xa0, 0xb5, 0x19, 0x46, 0x27, 0x5f, 0x73, 0x35, 0x9c, 0x04,
- 0xcf, 0xef, 0x1b, 0x48, 0xd1, 0x6b, 0x43, 0x12, 0x3f, 0xd7, 0x8a, 0x73, 0xdc, 0x40, 0xbf, 0x00,
- 0x50, 0x6d, 0xdb, 0xd4, 0x4e, 0x87, 0xc4, 0x3b, 0xc4, 0x27, 0x87, 0xf2, 0xae, 0x5d, 0xcd, 0xe1,
- 0xdb, 0xba, 0xc9, 0xef, 0xdf, 0x8a, 0x27, 0xea, 0xbb, 0x83, 0x3e, 0x85, 0xd2, 0x3e, 0x94, 0x82,
- 0xb2, 0x4e, 0x46, 0xcd, 0xe6, 0x10, 0xcc, 0xa8, 0x59, 0x86, 0xce, 0x33, 0x6a, 0x37, 0x1f, 0x4f,
- 0xb0, 0xda, 0x2f, 0x6d, 0x48, 0xbf, 0x08, 0x50, 0xf0, 0x7b, 0xbd, 0xb9, 0x93, 0x5e, 0xfe, 0x08,
- 0x48, 0x4c, 0x3e, 0x02, 0x92, 0xbe, 0x34, 0xf8, 0x3a, 0x64, 0x49, 0x1a, 0x3c, 0xb4, 0x70, 0x87,
- 0x57, 0xc4, 0x33, 0xe7, 0xaa, 0x75, 0x6c, 0xe1, 0x8e, 0xcf, 0x37, 0x65, 0x5e, 0xcd, 0x37, 0x05,
- 0x93, 0xe9, 0xec, 0x58, 0x32, 0xbd, 0x9b, 0xcc, 0xa6, 0xc4, 0xb4, 0xec, 0xcb, 0xc6, 0xa5, 0xbf,
- 0x14, 0x20, 0xeb, 0xae, 0x37, 0x58, 0x0a, 0x0e, 0x00, 0xb5, 0x6c, 0xbb, 0x58, 0x21, 0x98, 0x3f,
- 0x5f, 0x58, 0x61, 0x3c, 0xe1, 0x16, 0xc6, 0x3f, 0x74, 0x13, 0xc2, 0x28, 0x28, 0xd2, 0xbf, 0xb9,
- 0x0e, 0xfa, 0xcc, 0xf3, 0xdf, 0xbf, 0xe1, 0xf3, 0x20, 0x19, 0x0b, 0xfa, 0x23, 0x48, 0xab, 0x6d,
- 0x17, 0x80, 0x2d, 0x85, 0x20, 0x93, 0x0e, 0xeb, 0x46, 0x6b, 0x54, 0xa3, 0x9c, 0x32, 0x97, 0xe0,
- 0xb3, 0x8a, 0x3b, 0xb3, 0x92, 0xf6, 0x88, 0x5e, 0xc6, 0x13, 0xbc, 0xe9, 0x25, 0x80, 0xe3, 0xfd,
- 0xa7, 0x07, 0xdb, 0x3b, 0x8f, 0x77, 0x1a, 0xdb, 0x3c, 0xe3, 0xdb, 0xde, 0x6e, 0x6c, 0x8b, 0x71,
- 0xc2, 0x27, 0x37, 0x9e, 0x1e, 0x9c, 0x34, 0xb6, 0xc5, 0x04, 0x69, 0x6c, 0x37, 0xf6, 0x6a, 0x9f,
- 0x35, 0xb6, 0xc5, 0xa4, 0x54, 0x83, 0x9c, 0x1b, 0x74, 0xe8, 0x17, 0x04, 0xfa, 0x73, 0x6c, 0xf2,
- 0xdd, 0x62, 0x0d, 0xb4, 0x0a, 0xf9, 0xc9, 0x0a, 0x02, 0x79, 0xc0, 0xb1, 0xc2, 0x01, 0x09, 0x03,
- 0x65, 0x57, 0x07, 0x8f, 0x4d, 0x1f, 0x42, 0xc6, 0x18, 0x9e, 0x2a, 0x8e, 0xed, 0x8e, 0xe1, 0xee,
- 0xce, 0xfb, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x4f, 0xf0, 0x25, 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa,
- 0x84, 0x99, 0x38, 0x9b, 0x46, 0x7c, 0xca, 0x34, 0x12, 0x63, 0xd3, 0x40, 0x77, 0xa0, 0x30, 0xd0,
- 0x3b, 0x58, 0x51, 0x3b, 0x1d, 0x13, 0x5b, 0x2c, 0x76, 0xe7, 0xb8, 0xe6, 0x3c, 0xe9, 0xa9, 0xb1,
- 0x0e, 0xe9, 0x27, 0x01, 0xd0, 0x64, 0xa0, 0x45, 0x47, 0xb0, 0xe4, 0xc5, 0x6a, 0x27, 0x01, 0x60,
- 0x91, 0x60, 0x3d, 0x3a, 0x50, 0x07, 0x30, 0x06, 0xf1, 0x22, 0x48, 0x26, 0x59, 0xdf, 0x8a, 0xe7,
- 0xaa, 0x0c, 0xba, 0x5e, 0xba, 0x29, 0xf1, 0x39, 0x37, 0x25, 0x26, 0x23, 0x57, 0xde, 0xed, 0x19,
- 0x77, 0xa5, 0x89, 0x89, 0x42, 0x94, 0x01, 0x95, 0xd6, 0x84, 0x18, 0x5f, 0x67, 0xd4, 0x94, 0x84,
- 0x57, 0x99, 0x92, 0xf4, 0x10, 0xc4, 0x4f, 0xdc, 0xf1, 0xbd, 0xfc, 0xd1, 0x3f, 0x4d, 0x61, 0x62,
- 0x9a, 0x17, 0x90, 0x25, 0xde, 0x97, 0x06, 0x8d, 0x3f, 0x86, 0x9c, 0xbb, 0x7b, 0xee, 0x47, 0x48,
- 0x91, 0xdb, 0xce, 0x67, 0xe2, 0x89, 0xa0, 0x7b, 0xb0, 0x44, 0xe2, 0x86, 0x53, 0x0e, 0x66, 0x28,
- 0x61, 0x9c, 0x7a, 0xc3, 0x32, 0xeb, 0xd8, 0x73, 0xa0, 0x2d, 0x12, 0xa3, 0x45, 0x16, 0xcb, 0x71,
- 0xe7, 0xff, 0x63, 0x02, 0xe4, 0xdd, 0x37, 0x06, 0x96, 0xb2, 0x33, 0x2c, 0x06, 0x92, 0x09, 0xe9,
- 0xcf, 0xe3, 0x90, 0xf7, 0x95, 0xa7, 0xd0, 0x1f, 0x06, 0x12, 0xab, 0xf5, 0x69, 0xa5, 0x2c, 0x5f,
- 0x56, 0x15, 0x58, 0x58, 0x7c, 0xf1, 0x85, 0x45, 0x15, 0x06, 0x9d, 0x2a, 0x75, 0x72, 0xe1, 0x2a,
- 0xf5, 0x5b, 0x80, 0x6c, 0xdd, 0x56, 0x7b, 0x24, 0x78, 0x6b, 0x83, 0x73, 0x85, 0xdd, 0x76, 0x56,
- 0x19, 0x17, 0x69, 0xcf, 0x09, 0xed, 0x38, 0x24, 0x74, 0xa9, 0x07, 0x59, 0x17, 0x9c, 0x58, 0xfc,
- 0xdb, 0x9e, 0xb0, 0x6a, 0x7c, 0x15, 0xb2, 0x7d, 0x6c, 0xab, 0x34, 0xec, 0x31, 0xb0, 0xca, 0x6d,
- 0xdf, 0xfb, 0x00, 0xf2, 0xbe, 0x0f, 0x9e, 0x48, 0x24, 0xdc, 0x6f, 0x7c, 0x2a, 0xc6, 0xaa, 0x99,
- 0x6f, 0xbf, 0x5f, 0x4f, 0xec, 0xe3, 0xe7, 0x64, 0x28, 0xb9, 0x51, 0x6f, 0x36, 0xea, 0x4f, 0x44,
- 0xa1, 0x9a, 0xff, 0xf6, 0xfb, 0xf5, 0x8c, 0x8c, 0x69, 0x25, 0xe7, 0xde, 0x13, 0x28, 0x8f, 0x9d,
- 0x40, 0xd0, 0x41, 0x23, 0x28, 0x6d, 0x1f, 0x1f, 0xee, 0xed, 0xd4, 0x6b, 0xad, 0x86, 0x72, 0x72,
- 0xd0, 0x6a, 0x88, 0x02, 0xba, 0x06, 0xcb, 0x7b, 0x3b, 0x7f, 0xd2, 0x6c, 0x29, 0xf5, 0xbd, 0x9d,
- 0xc6, 0x7e, 0x4b, 0xa9, 0xb5, 0x5a, 0xb5, 0xfa, 0x13, 0x31, 0xfe, 0xe0, 0x3f, 0x00, 0xca, 0xb5,
- 0xad, 0xfa, 0x4e, 0xcd, 0x30, 0x7a, 0x5a, 0x5b, 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3c, 0x4f,
- 0xfd, 0xc0, 0xba, 0x3a, 0xbd, 0x3c, 0x87, 0x1e, 0x43, 0x8a, 0x82, 0xd2, 0x68, 0xfa, 0x17, 0xd7,
- 0xd5, 0x19, 0xf5, 0x3a, 0x32, 0x19, 0x7a, 0x6f, 0xa6, 0x7e, 0x82, 0x5d, 0x9d, 0x5e, 0xbe, 0x43,
- 0x7b, 0x90, 0x71, 0x00, 0xb9, 0x59, 0xdf, 0x45, 0x57, 0x67, 0xd6, 0xd4, 0xc8, 0xd2, 0x18, 0xb0,
- 0x39, 0xfd, 0xeb, 0xec, 0xea, 0x8c, 0xc2, 0x1e, 0x92, 0x21, 0xe7, 0x41, 0xdd, 0xb3, 0x3f, 0x14,
- 0xaf, 0xce, 0x51, 0x68, 0x44, 0x5f, 0x42, 0x31, 0x08, 0xdd, 0xcd, 0xf7, 0x0d, 0x77, 0x75, 0xce,
- 0x22, 0x20, 0xd1, 0x1f, 0xc4, 0xf1, 0xe6, 0xfb, 0xa6, 0xbb, 0x3a, 0x67, 0x4d, 0x10, 0x7d, 0x05,
- 0x4b, 0x93, 0x38, 0xdb, 0xfc, 0x9f, 0x78, 0x57, 0x17, 0xa8, 0x12, 0xa2, 0x3e, 0xa0, 0x10, 0x7c,
- 0x6e, 0x81, 0x2f, 0xbe, 0xab, 0x8b, 0x14, 0x0d, 0x51, 0x07, 0xca, 0xe3, 0xd8, 0xd4, 0xbc, 0xdf,
- 0x66, 0x57, 0xe7, 0xae, 0xec, 0xb1, 0x51, 0x82, 0x18, 0xc9, 0xbc, 0xdf, 0x6a, 0x57, 0xe7, 0x2e,
- 0xf4, 0xa1, 0x63, 0x00, 0xdf, 0xdb, 0x76, 0x8e, 0x6f, 0xb7, 0xab, 0xf3, 0x94, 0xfc, 0x90, 0x01,
- 0xcb, 0x61, 0x8f, 0xd9, 0x45, 0x3e, 0xe5, 0xae, 0x2e, 0x54, 0x09, 0x24, 0xf6, 0x1c, 0x7c, 0x97,
- 0xce, 0xf7, 0x69, 0x77, 0x75, 0xce, 0x92, 0xe0, 0xd6, 0xd6, 0x0f, 0x2f, 0x57, 0x85, 0x1f, 0x5f,
- 0xae, 0x0a, 0x3f, 0xbd, 0x5c, 0x15, 0xbe, 0xfb, 0x79, 0x35, 0xf6, 0xe3, 0xcf, 0xab, 0xb1, 0x7f,
- 0xfb, 0x79, 0x35, 0xf6, 0xa7, 0x77, 0xcf, 0x35, 0xbb, 0x3b, 0x3c, 0xdd, 0x68, 0xeb, 0x7d, 0xfa,
- 0xff, 0x1d, 0x43, 0xbd, 0xdc, 0x64, 0x3a, 0x49, 0xcb, 0xf7, 0x2f, 0xa1, 0xd3, 0x34, 0x8d, 0x75,
- 0x0f, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x8b, 0x24, 0x0e, 0x7f, 0x45, 0x34, 0x00, 0x00,
+ // 3797 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
+ 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0xb0, 0x45, 0x72, 0x47, 0xf1, 0x4a,
+ 0xab, 0xb5, 0x49, 0xad, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
+ 0x3d, 0x04, 0xa9, 0x38, 0xce, 0x7a, 0x6a, 0x08, 0x3c, 0x12, 0xb3, 0x02, 0x30, 0xe3, 0x99, 0x01,
+ 0x05, 0xee, 0x35, 0x49, 0x55, 0xca, 0x27, 0xdf, 0x53, 0x7b, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x1c,
+ 0xe3, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x15, 0xc5, 0x25, 0xdf, 0x72, 0xdb, 0x53, 0x2e, 0x39, 0xa4,
+ 0xde, 0xcf, 0xfc, 0x62, 0x06, 0x3f, 0x96, 0xab, 0x52, 0xb9, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
+ 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xef, 0xd8, 0x78, 0xd4, 0xc3, 0xe6, 0x50, 0x1b, 0xd9, 0xdb,
+ 0xea, 0x79, 0x57, 0xdb, 0xb6, 0xaf, 0x0d, 0x6c, 0x6d, 0x19, 0xa6, 0x6e, 0xeb, 0xa8, 0xea, 0x75,
+ 0x6e, 0x91, 0xce, 0xfa, 0x1d, 0x1f, 0x77, 0xd7, 0xbc, 0x36, 0x6c, 0x7d, 0xdb, 0x30, 0x75, 0xfd,
+ 0x82, 0xf1, 0xd7, 0xfd, 0xca, 0xa8, 0x9e, 0xed, 0x9e, 0x6a, 0xf5, 0x79, 0xe7, 0xbb, 0x53, 0x9d,
+ 0xe7, 0x03, 0xbd, 0xfb, 0x32, 0xb6, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x4b, 0x7c, 0xed,
+ 0xf4, 0xde, 0x99, 0x92, 0x35, 0x54, 0x53, 0x1d, 0x3a, 0xdd, 0xeb, 0xbe, 0xee, 0x2b, 0x6c, 0x5a,
+ 0x9a, 0x3e, 0x0a, 0x28, 0xdf, 0xb8, 0xd4, 0xf5, 0xcb, 0x01, 0xde, 0xa6, 0xad, 0xf3, 0xf1, 0xc5,
+ 0xb6, 0xad, 0x0d, 0xb1, 0x65, 0xab, 0x43, 0x83, 0x33, 0xac, 0x5d, 0xea, 0x97, 0x3a, 0xfd, 0xb9,
+ 0x4d, 0x7e, 0x31, 0xaa, 0xf4, 0xba, 0x00, 0x39, 0x19, 0x7f, 0x31, 0xc6, 0x96, 0x8d, 0x1e, 0x41,
+ 0x1a, 0x77, 0xfb, 0x7a, 0x4d, 0xd8, 0x14, 0xee, 0x17, 0x1f, 0xbd, 0xbb, 0x15, 0x5a, 0xb7, 0x2d,
+ 0xce, 0xd7, 0xea, 0xf6, 0xf5, 0x76, 0x42, 0xa6, 0xbc, 0xe8, 0x43, 0xc8, 0x5c, 0x0c, 0xc6, 0x56,
+ 0xbf, 0x96, 0xa4, 0x42, 0x77, 0xe2, 0x84, 0x9e, 0x12, 0xa6, 0x76, 0x42, 0x66, 0xdc, 0xe4, 0x53,
+ 0xda, 0xe8, 0x42, 0xaf, 0xa5, 0x66, 0x7f, 0x6a, 0x6f, 0x74, 0x41, 0x3f, 0x45, 0x78, 0xd1, 0x0e,
+ 0x80, 0x36, 0xd2, 0x6c, 0xa5, 0xdb, 0x57, 0xb5, 0x51, 0x2d, 0x4d, 0x25, 0x7f, 0x14, 0x2f, 0xa9,
+ 0xd9, 0x4d, 0xc2, 0xd8, 0x4e, 0xc8, 0x05, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x31, 0xc6, 0xe6, 0x75,
+ 0x2d, 0x33, 0x7b, 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x7e, 0x09, 0xf9, 0x6e, 0x1f,
+ 0x77, 0x5f, 0x2a, 0xf6, 0xa4, 0x96, 0xa3, 0x92, 0x1b, 0x71, 0x92, 0x4d, 0xc2, 0xd7, 0x99, 0xb4,
+ 0x13, 0x72, 0xae, 0xcb, 0x7e, 0xa2, 0x43, 0xa8, 0x0c, 0x34, 0xcb, 0x56, 0xac, 0x91, 0x6a, 0x58,
+ 0x7d, 0xdd, 0xb6, 0x6a, 0x45, 0xaa, 0xe3, 0xbd, 0x38, 0x1d, 0x07, 0x9a, 0x65, 0x9f, 0x38, 0xcc,
+ 0xed, 0x84, 0x5c, 0x1e, 0xf8, 0x09, 0x44, 0x9f, 0x7e, 0x71, 0x81, 0x4d, 0x57, 0x61, 0xad, 0x34,
+ 0x5b, 0xdf, 0x11, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x9f, 0xc1, 0xea, 0x40, 0x57,
+ 0x7b, 0xae, 0x3a, 0xa5, 0xdb, 0x1f, 0x8f, 0x5e, 0xd6, 0xca, 0x54, 0xe9, 0x4f, 0x62, 0x07, 0xa9,
+ 0xab, 0x3d, 0x47, 0x45, 0x93, 0x08, 0xb4, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0x9f, 0xc3, 0x9a,
+ 0x6a, 0x18, 0x83, 0xeb, 0xb0, 0xf6, 0x0a, 0xd5, 0xfe, 0x20, 0x4e, 0x7b, 0x83, 0xc8, 0x84, 0xd5,
+ 0x23, 0x75, 0x8a, 0x8a, 0x5e, 0xc0, 0xca, 0x85, 0x36, 0x52, 0x07, 0xda, 0x6f, 0xb1, 0xb7, 0x1e,
+ 0x6b, 0x54, 0xf9, 0xfd, 0x58, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x01,
+ 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0x75, 0x50, 0xab, 0x52, 0xbd,
+ 0xf7, 0xe2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x4e, 0xc8, 0x55, 0x23, 0x48, 0x62, 0x5a,
+ 0xf5, 0x2e, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0b,
+ 0x8a, 0x78, 0x42, 0xc4, 0x95, 0x2b, 0xdd, 0xc6, 0xb5, 0x15, 0xaa, 0x50, 0x8a, 0x3d, 0xc0, 0x94,
+ 0xf5, 0x4c, 0xb7, 0x71, 0x3b, 0x21, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x1b, 0x57, 0xd8, 0xd4, 0x2e,
+ 0xae, 0xa9, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x43, 0x54, 0xe1, 0x4f, 0xe3, 0x14, 0x9e, 0x51,
+ 0x21, 0xa2, 0xa2, 0xe5, 0x88, 0xb4, 0x13, 0xf2, 0xea, 0xd5, 0x34, 0x99, 0xd8, 0xae, 0xbb, 0x5d,
+ 0xd4, 0x73, 0xd6, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f,
+ 0xb0, 0x93, 0x83, 0xcc, 0x95, 0x3a, 0x18, 0xe3, 0xfd, 0x74, 0x3e, 0x2b, 0xe6, 0xf6, 0xd3, 0xf9,
+ 0xbc, 0x58, 0xd8, 0x4f, 0xe7, 0x0b, 0x22, 0xec, 0xa7, 0xf3, 0x20, 0x16, 0xa5, 0x7b, 0x50, 0xf4,
+ 0xf9, 0x2d, 0x54, 0x83, 0xdc, 0x10, 0x5b, 0x96, 0x7a, 0x89, 0xa9, 0x9b, 0x2b, 0xc8, 0x4e, 0x53,
+ 0xaa, 0x40, 0xc9, 0xef, 0xab, 0xa4, 0xaf, 0x04, 0x57, 0x92, 0xb8, 0x21, 0x22, 0xc9, 0xfd, 0xae,
+ 0x23, 0xc9, 0x9b, 0xe8, 0x2e, 0x94, 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xf8, 0xc2, 0xb4, 0x5c, 0xa2,
+ 0xc4, 0x33, 0xce, 0xb4, 0x01, 0x45, 0xe3, 0x91, 0xe1, 0xb2, 0xa4, 0x28, 0x0b, 0x18, 0x8f, 0x0c,
+ 0x87, 0xe1, 0x47, 0x50, 0x22, 0xf3, 0x76, 0x39, 0xd2, 0xf4, 0x23, 0x45, 0x42, 0xe3, 0x2c, 0xd2,
+ 0x5f, 0xa6, 0x40, 0x0c, 0xfb, 0x37, 0xf4, 0x11, 0xa4, 0x89, 0xab, 0xe7, 0x5e, 0xbb, 0xbe, 0xc5,
+ 0xe2, 0xc0, 0x96, 0x13, 0x07, 0xb6, 0x3a, 0x4e, 0x1c, 0xd8, 0xc9, 0x7f, 0xfd, 0x7a, 0x23, 0xf1,
+ 0xd5, 0x7f, 0x6e, 0x08, 0x32, 0x95, 0x40, 0xb7, 0x89, 0x57, 0x53, 0xb5, 0x91, 0xa2, 0xf5, 0xe8,
+ 0x90, 0x0b, 0xc4, 0x65, 0xa9, 0xda, 0x68, 0xaf, 0x87, 0x0e, 0x40, 0xec, 0xea, 0x23, 0x0b, 0x8f,
+ 0xac, 0xb1, 0xa5, 0xb0, 0x38, 0xc4, 0x7d, 0x75, 0xc0, 0xe3, 0xb2, 0x00, 0xd4, 0x74, 0x38, 0x8f,
+ 0x29, 0xa3, 0x5c, 0xed, 0x06, 0x09, 0xe8, 0x10, 0xca, 0x57, 0xea, 0x40, 0xeb, 0xa9, 0xb6, 0x6e,
+ 0x2a, 0x16, 0xb6, 0xb9, 0xf3, 0xbe, 0x3b, 0xb5, 0xe7, 0x67, 0x0e, 0xd7, 0x09, 0xb6, 0x4f, 0x8d,
+ 0x9e, 0x6a, 0xe3, 0x9d, 0xf4, 0xd7, 0xaf, 0x37, 0x04, 0xb9, 0x74, 0xe5, 0xeb, 0x41, 0x3f, 0x86,
+ 0xaa, 0x6a, 0x18, 0x8a, 0x65, 0xab, 0x36, 0x56, 0xce, 0xaf, 0x6d, 0x6c, 0x51, 0x7f, 0x5e, 0x92,
+ 0xcb, 0xaa, 0x61, 0x9c, 0x10, 0xea, 0x0e, 0x21, 0xa2, 0xf7, 0xa0, 0x42, 0x5c, 0xbf, 0xa6, 0x0e,
+ 0x94, 0x3e, 0xd6, 0x2e, 0xfb, 0x76, 0x2d, 0xbb, 0x29, 0xdc, 0x4f, 0xc9, 0x65, 0x4e, 0x6d, 0x53,
+ 0x22, 0xda, 0x82, 0x55, 0x87, 0xad, 0xab, 0x9b, 0xd8, 0xe1, 0x25, 0x8e, 0xbe, 0x2c, 0xaf, 0xf0,
+ 0xae, 0xa6, 0x6e, 0x62, 0xc6, 0x2f, 0xf5, 0x5c, 0x4b, 0xa1, 0x61, 0x02, 0x21, 0x48, 0xf7, 0x54,
+ 0x5b, 0xa5, 0x3b, 0x50, 0x92, 0xe9, 0x6f, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xd7, 0x95, 0xfe, 0x46,
+ 0x37, 0x21, 0xcb, 0x55, 0xa7, 0xe8, 0x30, 0x78, 0x0b, 0xad, 0x41, 0xc6, 0x30, 0xf5, 0x2b, 0x4c,
+ 0x97, 0x25, 0x2f, 0xb3, 0x86, 0x24, 0x43, 0x25, 0x18, 0x52, 0x50, 0x05, 0x92, 0xf6, 0x84, 0x7f,
+ 0x25, 0x69, 0x4f, 0xd0, 0x43, 0x48, 0x93, 0x0d, 0xa0, 0xdf, 0xa8, 0x44, 0x04, 0x51, 0x2e, 0xd7,
+ 0xb9, 0x36, 0xb0, 0x4c, 0x39, 0xa5, 0x9b, 0xb0, 0x16, 0x15, 0x62, 0xa4, 0xbe, 0x4b, 0x0f, 0x84,
+ 0x0a, 0xf4, 0x21, 0xe4, 0x5d, 0x9f, 0xca, 0xec, 0xeb, 0xf6, 0xd4, 0x57, 0x1c, 0x66, 0xd9, 0x65,
+ 0x25, 0x86, 0x45, 0xf6, 0xa7, 0xaf, 0xf2, 0xbc, 0xa0, 0x24, 0xe7, 0x54, 0xc3, 0x68, 0xab, 0x56,
+ 0x5f, 0xba, 0x84, 0x5a, 0x5c, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93,
+ 0x97, 0xa4, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xe3, 0xd1, 0x4b, 0x62, 0xc1, 0x29, 0xf6, 0x21,
+ 0xda, 0xde, 0xeb, 0x49, 0x3d, 0xb8, 0x1d, 0x1b, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06,
+ 0x0b, 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0x14, 0x64, 0xde, 0x92,
+ 0xbe, 0x14, 0xe0, 0x56, 0x4c, 0x50, 0x41, 0xbf, 0x82, 0xe2, 0x80, 0x8c, 0x9f, 0xfb, 0xb9, 0x88,
+ 0xac, 0x8a, 0x1d, 0x9f, 0x03, 0xc2, 0x44, 0xbd, 0x99, 0x0c, 0x03, 0xf7, 0x37, 0x7a, 0x08, 0xd9,
+ 0xae, 0x3e, 0x1c, 0x6a, 0x36, 0x4f, 0xad, 0x6a, 0x51, 0x07, 0x8f, 0xf4, 0xcb, 0x9c, 0x4f, 0xfa,
+ 0x7d, 0x1a, 0x6e, 0x46, 0x47, 0x22, 0xb4, 0x09, 0xa5, 0xa1, 0x3a, 0x51, 0xec, 0x09, 0x3f, 0x2e,
+ 0x02, 0x35, 0x40, 0x18, 0xaa, 0x93, 0xce, 0x84, 0x9d, 0x15, 0x11, 0x52, 0xf6, 0xc4, 0xaa, 0x25,
+ 0x37, 0x53, 0xf7, 0x4b, 0x32, 0xf9, 0x89, 0x9e, 0xc3, 0xca, 0x40, 0xef, 0xaa, 0x03, 0x65, 0xa0,
+ 0x5a, 0xb6, 0xc2, 0xc7, 0xc2, 0x9c, 0xc0, 0x3b, 0xd3, 0xb6, 0x46, 0xbb, 0x89, 0xa3, 0xa4, 0x27,
+ 0x36, 0x21, 0x57, 0xa9, 0xec, 0x81, 0x6a, 0xd9, 0xac, 0x0b, 0xed, 0x42, 0x71, 0xa8, 0x59, 0xe7,
+ 0xb8, 0xaf, 0x5e, 0x69, 0xba, 0x59, 0x4b, 0x6f, 0xa6, 0x22, 0x33, 0xbf, 0xe7, 0x1e, 0x0f, 0xd7,
+ 0xe4, 0x17, 0xf3, 0xd9, 0x48, 0x26, 0x70, 0x86, 0x1c, 0x2f, 0x98, 0x5d, 0xda, 0x0b, 0x3e, 0x84,
+ 0xb5, 0x11, 0x9e, 0xd8, 0x8a, 0xeb, 0x61, 0x2c, 0x66, 0xb8, 0x39, 0xba, 0xff, 0x88, 0xf4, 0xb9,
+ 0x6e, 0xc9, 0x22, 0x36, 0x4c, 0x4c, 0xc4, 0xd4, 0xc7, 0xa3, 0x5e, 0x2d, 0xbf, 0x29, 0xdc, 0xcf,
+ 0xc8, 0xac, 0x81, 0x9e, 0x40, 0x8d, 0x7a, 0x0f, 0xe6, 0x52, 0xc9, 0x16, 0xe2, 0x9e, 0xe3, 0x4a,
+ 0x0a, 0xd4, 0x6c, 0x6f, 0x90, 0x7e, 0xea, 0xb4, 0x0f, 0x68, 0x2f, 0x77, 0x3f, 0xdb, 0xb0, 0xc6,
+ 0x52, 0x01, 0x6c, 0x92, 0x9c, 0x80, 0x6c, 0x12, 0x1d, 0x00, 0xd0, 0x01, 0xac, 0x38, 0x7d, 0xc7,
+ 0xa6, 0xde, 0x99, 0xd0, 0xef, 0x3f, 0x74, 0x05, 0x7a, 0x0a, 0x39, 0x67, 0xce, 0xe1, 0x28, 0xd2,
+ 0x53, 0x83, 0x9c, 0xbe, 0x86, 0xe1, 0xc6, 0x96, 0x27, 0xde, 0x09, 0x2a, 0x4d, 0x27, 0xbe, 0xbc,
+ 0xcb, 0xf3, 0xe3, 0xde, 0x01, 0xdb, 0x80, 0xe2, 0x17, 0x63, 0xdd, 0x1c, 0x0f, 0xd9, 0x90, 0xca,
+ 0x74, 0x48, 0xc0, 0x48, 0xf4, 0x3c, 0xff, 0x53, 0xc6, 0x67, 0x73, 0xc1, 0xa4, 0x84, 0x5b, 0x94,
+ 0xe0, 0x59, 0xd4, 0x89, 0x6f, 0xe0, 0x7e, 0xa3, 0x4a, 0x2e, 0x6a, 0x54, 0xee, 0xdc, 0xe2, 0xed,
+ 0x2a, 0xf5, 0xfd, 0xec, 0x0a, 0x41, 0x9a, 0xce, 0x30, 0xcd, 0x7c, 0x38, 0xf9, 0x1d, 0x6b, 0x6b,
+ 0xee, 0xfe, 0x67, 0xfd, 0xfb, 0xef, 0x58, 0x60, 0xee, 0x07, 0xb3, 0xc0, 0x7c, 0xac, 0x05, 0x7e,
+ 0x6f, 0x5b, 0xeb, 0xc0, 0xcd, 0x90, 0xa0, 0x32, 0xa6, 0x71, 0x96, 0x5a, 0x5b, 0xe8, 0x5a, 0xe3,
+ 0x38, 0x19, 0x9f, 0x22, 0x79, 0x35, 0xa0, 0x97, 0xc5, 0xe8, 0x58, 0x0b, 0x2e, 0x2e, 0x6b, 0xc1,
+ 0xa5, 0x45, 0x2c, 0xb8, 0xfc, 0x36, 0x16, 0x5c, 0x99, 0xb2, 0xe0, 0x53, 0x58, 0x99, 0xca, 0x8b,
+ 0x5d, 0x73, 0x10, 0x22, 0xcd, 0x21, 0x19, 0x6d, 0x0e, 0x29, 0x9f, 0x39, 0x48, 0xdf, 0x0a, 0x50,
+ 0x8f, 0x4f, 0x8f, 0x23, 0x3f, 0xf0, 0x33, 0xb8, 0xe1, 0xa5, 0x49, 0xfe, 0x75, 0x64, 0xa1, 0x08,
+ 0xb9, 0x9d, 0xde, 0x42, 0xce, 0x48, 0x29, 0xd8, 0x98, 0xd2, 0x7e, 0x13, 0x7d, 0x0e, 0xd5, 0x60,
+ 0x62, 0x4f, 0xf2, 0x26, 0x72, 0x5c, 0xfe, 0x60, 0xea, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0xae,
+ 0x5c, 0xf9, 0x9b, 0x96, 0xf4, 0xaf, 0x49, 0x37, 0x6d, 0x08, 0x64, 0xe9, 0xe8, 0x63, 0x37, 0x74,
+ 0x09, 0x8b, 0x9e, 0x6c, 0x2e, 0x10, 0x3e, 0xcd, 0xc9, 0xb7, 0x3b, 0xcd, 0xa9, 0xc8, 0xed, 0x4b,
+ 0x47, 0x2f, 0x55, 0xc6, 0xbf, 0x54, 0x1f, 0x40, 0x86, 0x85, 0x6d, 0x16, 0x50, 0x6e, 0x4d, 0x9f,
+ 0x0b, 0x16, 0xb1, 0x19, 0x17, 0x6a, 0x40, 0x9e, 0x5d, 0x01, 0xb4, 0x1e, 0x77, 0x00, 0xb7, 0x63,
+ 0x24, 0xf6, 0x76, 0x77, 0x8a, 0x6f, 0x5e, 0x6f, 0xe4, 0x78, 0x43, 0xce, 0x51, 0xb9, 0xbd, 0x9e,
+ 0xf4, 0x37, 0x00, 0x79, 0x19, 0x5b, 0x06, 0x31, 0x61, 0xb4, 0x03, 0x05, 0x3c, 0xe9, 0x62, 0xc3,
+ 0x76, 0xae, 0x1b, 0xd1, 0xd7, 0x39, 0xc6, 0xdd, 0x72, 0x38, 0xdb, 0x09, 0xd9, 0x13, 0x43, 0x8f,
+ 0x39, 0x9c, 0x13, 0x8f, 0xcc, 0x70, 0x71, 0x3f, 0x9e, 0xf3, 0x73, 0x07, 0xcf, 0x61, 0x81, 0x7e,
+ 0x3d, 0x56, 0x2a, 0x04, 0xe8, 0x3c, 0xe6, 0x80, 0x4e, 0x7a, 0xce, 0xc7, 0x02, 0x88, 0x4e, 0x33,
+ 0x80, 0xe8, 0x64, 0xe6, 0x4c, 0x33, 0x06, 0xd2, 0xf9, 0xb9, 0x03, 0xe9, 0x64, 0xe7, 0x8c, 0x38,
+ 0x84, 0xe9, 0xfc, 0x6a, 0x0a, 0xd3, 0xd9, 0x8c, 0x15, 0x8d, 0x00, 0x75, 0x8e, 0xa6, 0x40, 0x9d,
+ 0x3c, 0x55, 0xf2, 0xe3, 0x58, 0x25, 0x73, 0x50, 0x9d, 0xa3, 0x29, 0x54, 0xa7, 0x30, 0x47, 0xe1,
+ 0x1c, 0x58, 0xe7, 0xcf, 0xa3, 0x61, 0x1d, 0x88, 0x05, 0x5e, 0xf8, 0x30, 0x17, 0xc3, 0x75, 0x94,
+ 0x18, 0x5c, 0xa7, 0x18, 0x0b, 0x15, 0x30, 0xf5, 0x0b, 0x03, 0x3b, 0x7f, 0x1a, 0x05, 0xec, 0xac,
+ 0xc4, 0x62, 0x52, 0xdc, 0x2a, 0x17, 0x41, 0x76, 0x4e, 0x23, 0x90, 0x9d, 0x52, 0x2c, 0x62, 0xc4,
+ 0x14, 0x2f, 0x00, 0xed, 0x9c, 0x46, 0x40, 0x3b, 0xe5, 0xb9, 0x6a, 0xe7, 0x62, 0x3b, 0x4f, 0x83,
+ 0xd8, 0x4e, 0x25, 0xe6, 0xea, 0xec, 0x39, 0x83, 0x18, 0x70, 0xe7, 0x3c, 0x0e, 0xdc, 0x61, 0xa0,
+ 0xd6, 0xfb, 0xb1, 0x1a, 0x97, 0x40, 0x77, 0x8e, 0xa6, 0xd0, 0x1d, 0x71, 0x8e, 0x0d, 0x2f, 0x08,
+ 0xef, 0x48, 0x3f, 0x21, 0x51, 0x3a, 0xe4, 0xee, 0x88, 0xeb, 0xc6, 0xa6, 0xa9, 0x9b, 0x1c, 0x90,
+ 0x61, 0x0d, 0xe9, 0x3e, 0xb9, 0x9e, 0x7b, 0xae, 0x6d, 0x06, 0xe4, 0x53, 0x85, 0x72, 0xc0, 0x9d,
+ 0x49, 0xff, 0x20, 0x78, 0xb2, 0x14, 0xf4, 0xf1, 0x5f, 0xed, 0x0b, 0xfc, 0x6a, 0x1f, 0xba, 0x8e,
+ 0x16, 0x02, 0xb9, 0x86, 0x3f, 0x9b, 0xe1, 0x18, 0x8f, 0xea, 0x65, 0x31, 0x0f, 0x60, 0x85, 0xe6,
+ 0xbd, 0x2c, 0x56, 0x04, 0xc2, 0x51, 0x95, 0x74, 0xb0, 0x55, 0x60, 0x71, 0xe9, 0x03, 0x58, 0xf5,
+ 0xf1, 0xba, 0xf7, 0x69, 0x06, 0x74, 0x88, 0x2e, 0x77, 0x83, 0x5f, 0xac, 0xff, 0x39, 0xe5, 0xad,
+ 0x90, 0x07, 0x0e, 0x45, 0xe1, 0x38, 0xc2, 0xf7, 0xc6, 0x71, 0xe2, 0xef, 0xf5, 0xe8, 0x33, 0x58,
+ 0x0b, 0x40, 0x3c, 0x4e, 0x5a, 0x99, 0x5a, 0x0e, 0xe9, 0x49, 0xf8, 0xb2, 0x1c, 0xb7, 0x07, 0xfd,
+ 0x1a, 0xde, 0xa1, 0x09, 0x72, 0x4c, 0xea, 0x9a, 0x5e, 0x2c, 0x75, 0xbd, 0x45, 0x74, 0x34, 0x23,
+ 0xd2, 0xd7, 0x18, 0xfc, 0x27, 0x13, 0x83, 0xff, 0xa0, 0x03, 0x28, 0x5d, 0xe2, 0x11, 0xb6, 0x34,
+ 0x4b, 0x59, 0xe2, 0xce, 0x29, 0x90, 0x8c, 0xbf, 0x9d, 0x90, 0x8b, 0x5c, 0x96, 0xf4, 0xfe, 0xb5,
+ 0x20, 0xec, 0x54, 0xa1, 0xac, 0xf8, 0xd5, 0x49, 0xff, 0x2d, 0x78, 0x66, 0xe9, 0x02, 0x4c, 0x5d,
+ 0xbd, 0xc7, 0xcc, 0xb7, 0x2c, 0xd3, 0xdf, 0xe4, 0x76, 0x35, 0xd0, 0x2f, 0xb9, 0x05, 0x92, 0x9f,
+ 0x84, 0xcb, 0xad, 0xa9, 0x14, 0x78, 0x84, 0x5d, 0x83, 0x8c, 0x36, 0xea, 0xe1, 0x09, 0x37, 0x32,
+ 0xd6, 0x20, 0xb2, 0x2f, 0xf1, 0x35, 0x37, 0x25, 0xf2, 0x93, 0xf0, 0xd1, 0x73, 0x46, 0xe7, 0x52,
+ 0x92, 0x59, 0x03, 0x7d, 0x04, 0x05, 0x5a, 0x18, 0x53, 0x74, 0xc3, 0xe2, 0x31, 0x32, 0x90, 0xca,
+ 0xb1, 0x22, 0xd6, 0xd6, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x6f, 0xf0, 0x5f, 0xbe, 0x64, 0x2b,
+ 0x1f, 0x48, 0xb6, 0xde, 0x85, 0x02, 0x19, 0xbd, 0x65, 0xa8, 0x5d, 0x4c, 0xe3, 0x5b, 0x41, 0xf6,
+ 0x08, 0xd2, 0x3f, 0x0a, 0x50, 0x0d, 0x85, 0xdc, 0xc8, 0xb9, 0x3b, 0xa7, 0x32, 0x19, 0x04, 0xdc,
+ 0xa6, 0x66, 0x7f, 0x07, 0xe0, 0x52, 0xb5, 0x94, 0x57, 0xea, 0xc8, 0xc6, 0x3d, 0xbe, 0x04, 0x85,
+ 0x4b, 0xd5, 0x7a, 0x41, 0x09, 0xc1, 0xc1, 0x64, 0x42, 0x83, 0xf1, 0x41, 0x3e, 0x59, 0x3f, 0xe4,
+ 0x83, 0xea, 0x90, 0x37, 0x4c, 0x4d, 0x37, 0x35, 0xfb, 0x9a, 0xae, 0x49, 0x4a, 0x76, 0xdb, 0xd2,
+ 0x31, 0xdc, 0x88, 0x8c, 0xf6, 0xe8, 0x09, 0x14, 0xbc, 0x44, 0x41, 0xa0, 0x49, 0xed, 0x0c, 0x24,
+ 0xcd, 0xe3, 0x25, 0x4b, 0x72, 0x23, 0x32, 0xde, 0xa3, 0x16, 0x64, 0x4d, 0x6c, 0x8d, 0x07, 0x2c,
+ 0xc9, 0xae, 0x3c, 0xfa, 0x60, 0xb1, 0x3c, 0x81, 0x50, 0xc7, 0x03, 0x5b, 0xe6, 0xc2, 0xd2, 0xe7,
+ 0x90, 0x65, 0x14, 0x54, 0x84, 0xdc, 0xe9, 0xe1, 0xb3, 0xc3, 0xa3, 0x17, 0x87, 0x62, 0x02, 0x01,
+ 0x64, 0x1b, 0xcd, 0x66, 0xeb, 0xb8, 0x23, 0x0a, 0xa8, 0x00, 0x99, 0xc6, 0xce, 0x91, 0xdc, 0x11,
+ 0x93, 0x84, 0x2c, 0xb7, 0xf6, 0x5b, 0xcd, 0x8e, 0x98, 0x42, 0x2b, 0x50, 0x66, 0xbf, 0x95, 0xa7,
+ 0x47, 0xf2, 0xf3, 0x46, 0x47, 0x4c, 0xfb, 0x48, 0x27, 0xad, 0xc3, 0xdd, 0x96, 0x2c, 0x66, 0xa4,
+ 0x9f, 0xc1, 0xed, 0xd8, 0xcc, 0xc2, 0x03, 0xdb, 0x04, 0x1f, 0xd8, 0x26, 0x7d, 0x93, 0x24, 0x57,
+ 0xa7, 0xb8, 0x74, 0x01, 0xed, 0x87, 0x26, 0xfe, 0x68, 0x89, 0x5c, 0x23, 0x34, 0x7b, 0xf4, 0x1e,
+ 0x54, 0x4c, 0x7c, 0x81, 0xed, 0x6e, 0x9f, 0xa5, 0x2f, 0x0e, 0x00, 0x56, 0xe6, 0x54, 0x2a, 0x64,
+ 0x31, 0xb6, 0xdf, 0xe0, 0xae, 0xad, 0x30, 0x23, 0xb0, 0x28, 0xcc, 0x50, 0x20, 0x6c, 0x84, 0x7a,
+ 0xc2, 0x88, 0xc4, 0xff, 0x33, 0x3f, 0xc5, 0x54, 0xa5, 0xa9, 0x2a, 0xa0, 0x6e, 0x87, 0x52, 0xa4,
+ 0x57, 0x4b, 0x2d, 0x76, 0x01, 0x32, 0x72, 0xab, 0x23, 0x7f, 0x2a, 0xa6, 0x10, 0x82, 0x0a, 0xfd,
+ 0xa9, 0x9c, 0x1c, 0x36, 0x8e, 0x4f, 0xda, 0x47, 0x64, 0xb1, 0x57, 0xa1, 0xea, 0x2c, 0xb6, 0x43,
+ 0xcc, 0xa0, 0x1b, 0xb0, 0xd2, 0x3c, 0x7a, 0x7e, 0x7c, 0xd0, 0xea, 0xb4, 0x3c, 0x72, 0x56, 0xaa,
+ 0x43, 0x2d, 0x2e, 0x45, 0x92, 0xfe, 0x3d, 0x05, 0xb7, 0x62, 0xd2, 0x1c, 0xf4, 0x11, 0x80, 0x3d,
+ 0x51, 0x4c, 0xdc, 0xd5, 0xcd, 0x5e, 0xbc, 0xe1, 0x76, 0x26, 0x32, 0xe5, 0x90, 0x0b, 0x36, 0xff,
+ 0x35, 0x33, 0x56, 0xfc, 0x92, 0x2b, 0x25, 0x0b, 0x61, 0x71, 0xc0, 0xe6, 0x4e, 0xc4, 0x0d, 0x14,
+ 0x77, 0x89, 0x62, 0xba, 0x5f, 0x54, 0x31, 0xe5, 0x47, 0x9f, 0xc2, 0xad, 0x50, 0x48, 0xe3, 0x71,
+ 0xc0, 0x8a, 0xaa, 0x09, 0x47, 0x47, 0xb6, 0x1b, 0xc1, 0xc8, 0xc6, 0xe2, 0x80, 0x35, 0x03, 0x1d,
+ 0xc9, 0xbc, 0x05, 0x3a, 0x12, 0x17, 0x1a, 0xb3, 0xcb, 0x16, 0x41, 0xa2, 0x42, 0x63, 0x28, 0xe5,
+ 0xc8, 0x85, 0x53, 0x0e, 0xe9, 0x7f, 0x02, 0xbb, 0x1b, 0x4c, 0x2d, 0x8f, 0x20, 0x6b, 0xd9, 0xaa,
+ 0x3d, 0xb6, 0xf8, 0x49, 0x7a, 0xb2, 0x68, 0x9e, 0xba, 0xe5, 0xfc, 0x38, 0xa1, 0xe2, 0x32, 0x57,
+ 0xf3, 0xff, 0x72, 0xd3, 0xe3, 0xb6, 0x27, 0xf3, 0x43, 0x6c, 0x4f, 0x1b, 0xb2, 0xf8, 0x0a, 0x8f,
+ 0x6c, 0xab, 0x96, 0xa5, 0x33, 0xbe, 0x39, 0x3d, 0x63, 0xd2, 0xbd, 0x53, 0x23, 0xb9, 0xcf, 0x7f,
+ 0xbd, 0xde, 0x10, 0x19, 0xf7, 0xfb, 0xfa, 0x50, 0xb3, 0xf1, 0xd0, 0xb0, 0xaf, 0x65, 0x2e, 0x2f,
+ 0x7d, 0x08, 0x95, 0xe0, 0xa2, 0xc7, 0xbb, 0x10, 0xcf, 0x49, 0x27, 0xa5, 0xbf, 0x17, 0x60, 0x35,
+ 0x02, 0xcb, 0x41, 0x4f, 0x78, 0xed, 0x88, 0x6d, 0xfc, 0xdd, 0xe9, 0xd5, 0x0b, 0xb0, 0x7b, 0x25,
+ 0x24, 0x12, 0x34, 0xbd, 0xab, 0x03, 0xdb, 0x63, 0x8f, 0x80, 0x7e, 0x0a, 0x55, 0x4b, 0xbb, 0x1c,
+ 0x29, 0x26, 0x83, 0x85, 0xdc, 0xba, 0x0c, 0xc9, 0xec, 0x49, 0x87, 0x53, 0xbd, 0xec, 0x91, 0xcc,
+ 0x07, 0x81, 0xa8, 0x84, 0xb8, 0xa5, 0x2e, 0xa0, 0xe9, 0x9b, 0x4c, 0x14, 0x70, 0x25, 0xbc, 0x05,
+ 0x70, 0xf5, 0x77, 0x02, 0xbc, 0x33, 0xe3, 0x76, 0x83, 0x3e, 0x09, 0x9d, 0x8b, 0x8f, 0x97, 0xb9,
+ 0x1b, 0x6d, 0x31, 0x5a, 0xf0, 0x64, 0x48, 0x8f, 0xa1, 0xe4, 0xa7, 0x2f, 0xb6, 0x79, 0xfb, 0x5e,
+ 0xec, 0x0f, 0x02, 0x6c, 0x77, 0xa1, 0x6c, 0x62, 0x9b, 0x38, 0xa9, 0x00, 0x22, 0x59, 0x62, 0x44,
+ 0x96, 0xa6, 0xee, 0xa7, 0xf3, 0x82, 0x98, 0x74, 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x75, 0xf3,
+ 0x50, 0x2f, 0xc1, 0x8f, 0x7a, 0x85, 0xc0, 0xd2, 0x64, 0x18, 0x2c, 0x45, 0xf7, 0xa0, 0xca, 0xee,
+ 0x23, 0x64, 0xdf, 0x54, 0x7b, 0x6c, 0x62, 0x8e, 0xb1, 0x55, 0x28, 0xf9, 0xc4, 0xa1, 0xa2, 0xcf,
+ 0xe0, 0xb6, 0xdd, 0x37, 0xb1, 0xd5, 0xd7, 0x07, 0x3d, 0x25, 0xbc, 0x77, 0xac, 0xf6, 0xb3, 0x31,
+ 0xc7, 0xe8, 0xe4, 0x5b, 0xae, 0x86, 0xb3, 0xe0, 0xfe, 0xfd, 0x16, 0x32, 0xf4, 0xd8, 0x90, 0xa4,
+ 0xcf, 0xb5, 0xe2, 0x02, 0x37, 0xd0, 0x5f, 0x03, 0xa8, 0xb6, 0x6d, 0x6a, 0xe7, 0x63, 0xe2, 0x1d,
+ 0x92, 0xd3, 0x9f, 0xf2, 0x8e, 0x5d, 0xc3, 0xe1, 0xdb, 0x79, 0x97, 0x9f, 0xbf, 0x35, 0x4f, 0xd4,
+ 0x77, 0x06, 0x7d, 0x0a, 0xa5, 0x43, 0xa8, 0x04, 0x65, 0x9d, 0x6c, 0x9a, 0x8d, 0x21, 0x98, 0x4d,
+ 0xb3, 0xec, 0x9c, 0x67, 0xd3, 0x6e, 0x2e, 0x9e, 0x62, 0x65, 0x5e, 0xda, 0x90, 0x7e, 0x2f, 0x40,
+ 0xc9, 0xef, 0xf5, 0x16, 0x4e, 0x78, 0xf9, 0x05, 0x20, 0x35, 0x7d, 0x01, 0x48, 0xfb, 0x52, 0xe0,
+ 0xdb, 0x90, 0x27, 0x29, 0xf0, 0xd8, 0xc2, 0x3d, 0x5e, 0xfc, 0xce, 0x5d, 0xaa, 0xd6, 0xa9, 0x85,
+ 0x7b, 0x3e, 0xdf, 0x94, 0x7b, 0x3b, 0xdf, 0x14, 0x4c, 0xa4, 0xf3, 0xa1, 0x44, 0x7a, 0x3f, 0x9d,
+ 0xcf, 0x88, 0x59, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x25, 0x40, 0xde, 0x9d, 0x6f, 0xb0, 0xea, 0x1b,
+ 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x9a, 0x2f, 0xbf, 0xba, 0xb0, 0x1a, 0x78, 0xca, 0xad, 0x81, 0xff,
+ 0xc2, 0x4d, 0x06, 0xe3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x96, 0x8f,
+ 0x83, 0x64, 0x2c, 0xe8, 0x8f, 0x20, 0xab, 0x76, 0x5d, 0xbc, 0xb5, 0x12, 0x01, 0x44, 0x3a, 0xac,
+ 0x5b, 0x9d, 0x49, 0x83, 0x72, 0xca, 0x5c, 0x82, 0x8f, 0x2a, 0xe9, 0x8c, 0x4a, 0x3a, 0x20, 0x7a,
+ 0x19, 0x4f, 0xf0, 0xa4, 0x57, 0x00, 0x4e, 0x0f, 0x9f, 0x1f, 0xed, 0xee, 0x3d, 0xdd, 0x6b, 0xed,
+ 0xf2, 0x6c, 0x6f, 0x77, 0xb7, 0xb5, 0x2b, 0x26, 0x09, 0x9f, 0xdc, 0x7a, 0x7e, 0x74, 0xd6, 0xda,
+ 0x15, 0x53, 0xa4, 0xb1, 0xdb, 0x3a, 0x68, 0x7c, 0xda, 0xda, 0x15, 0xd3, 0x52, 0x03, 0x0a, 0x6e,
+ 0xd0, 0xa1, 0x8f, 0x05, 0xf4, 0x57, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x1d, 0x8a, 0xd3, 0x05,
+ 0x03, 0x72, 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xaa, 0xae, 0x0e, 0x1e, 0x9b, 0x7e, 0x01, 0x39,
+ 0x63, 0x7c, 0xae, 0x38, 0xb6, 0x1b, 0x82, 0xd9, 0x9d, 0xbb, 0xdd, 0xf8, 0x7c, 0xa0, 0x75, 0x9f,
+ 0xe1, 0x6b, 0x1e, 0xe4, 0xb2, 0xc6, 0xf8, 0xfc, 0x19, 0x33, 0x71, 0x36, 0x8c, 0xe4, 0x8c, 0x61,
+ 0xa4, 0x42, 0xc3, 0x40, 0xf7, 0xa0, 0x34, 0xd2, 0x7b, 0x58, 0x51, 0x7b, 0x3d, 0x13, 0x5b, 0x2c,
+ 0x76, 0x17, 0xb8, 0xe6, 0x22, 0xe9, 0x69, 0xb0, 0x0e, 0xe9, 0x5b, 0x01, 0xd0, 0x74, 0xa0, 0x45,
+ 0x27, 0xb0, 0xe2, 0xc5, 0x6a, 0x27, 0x01, 0x60, 0x91, 0x60, 0x33, 0x3e, 0x50, 0x07, 0xf0, 0x05,
+ 0xf1, 0x2a, 0x48, 0x26, 0x59, 0xdf, 0x9a, 0xe7, 0xaa, 0x0c, 0x3a, 0x5f, 0xba, 0x28, 0xc9, 0x05,
+ 0x17, 0x25, 0x21, 0x23, 0x57, 0xde, 0xed, 0x09, 0xbb, 0xd2, 0xd4, 0x54, 0xdd, 0xc9, 0x80, 0x5a,
+ 0x67, 0x4a, 0x8c, 0xcf, 0x33, 0x6e, 0x48, 0xc2, 0xdb, 0x0c, 0x49, 0x7a, 0x0c, 0xe2, 0x27, 0xee,
+ 0xf7, 0xbd, 0xfc, 0xd1, 0x3f, 0x4c, 0x61, 0x6a, 0x98, 0x57, 0x90, 0x27, 0xde, 0x97, 0x06, 0x8d,
+ 0x3f, 0x86, 0x82, 0xbb, 0x7a, 0xee, 0x7b, 0xa3, 0xd8, 0x65, 0xe7, 0x23, 0xf1, 0x44, 0xd0, 0x03,
+ 0x58, 0x21, 0x71, 0xc3, 0xa9, 0xfe, 0x32, 0x84, 0x30, 0x49, 0xbd, 0x61, 0x95, 0x75, 0x1c, 0x38,
+ 0xb0, 0x16, 0x89, 0xd1, 0x22, 0x8b, 0xe5, 0xb8, 0xf7, 0x7f, 0x31, 0x00, 0x72, 0xe7, 0x0b, 0x01,
+ 0xa5, 0x6c, 0x0f, 0xcb, 0x81, 0x64, 0x42, 0xfa, 0x8b, 0x24, 0x14, 0x7d, 0xd5, 0x28, 0xf4, 0x87,
+ 0x81, 0xc4, 0x6a, 0x73, 0x56, 0xe5, 0xca, 0x97, 0x55, 0x05, 0x26, 0x96, 0x5c, 0x7e, 0x62, 0x71,
+ 0x75, 0x40, 0xa7, 0x28, 0x9d, 0x5e, 0xba, 0x28, 0xfd, 0x3e, 0x20, 0x5b, 0xb7, 0xd5, 0x01, 0x09,
+ 0xde, 0xda, 0xe8, 0x52, 0x61, 0xa7, 0x9d, 0x15, 0xc2, 0x45, 0xda, 0x73, 0x46, 0x3b, 0x8e, 0x09,
+ 0x5d, 0x1a, 0x40, 0xde, 0x05, 0x26, 0x96, 0x7f, 0xc6, 0x13, 0x55, 0x7c, 0xaf, 0x43, 0x7e, 0x88,
+ 0x6d, 0x95, 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x07, 0x1f, 0x43, 0xd1, 0xf7, 0xb6, 0x89, 0x44,
+ 0xc2, 0xc3, 0xd6, 0x0b, 0x31, 0x51, 0xcf, 0x7d, 0xf9, 0xbb, 0xcd, 0xd4, 0x21, 0x7e, 0x45, 0x3e,
+ 0x25, 0xb7, 0x9a, 0xed, 0x56, 0xf3, 0x99, 0x28, 0xd4, 0x8b, 0x5f, 0xfe, 0x6e, 0x33, 0x27, 0x63,
+ 0x5a, 0xb8, 0x79, 0xf0, 0x0c, 0xaa, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0x95, 0xdd, 0xd3, 0xe3,
+ 0x83, 0xbd, 0x66, 0xa3, 0xd3, 0x52, 0xce, 0x8e, 0x3a, 0x2d, 0x51, 0x40, 0xb7, 0x60, 0xf5, 0x60,
+ 0xef, 0x4f, 0xda, 0x1d, 0xa5, 0x79, 0xb0, 0xd7, 0x3a, 0xec, 0x28, 0x8d, 0x4e, 0xa7, 0xd1, 0x7c,
+ 0x26, 0x26, 0x1f, 0xfd, 0x07, 0x40, 0xb5, 0xb1, 0xd3, 0xdc, 0x6b, 0x18, 0xc6, 0x40, 0xeb, 0xaa,
+ 0xd4, 0xdd, 0x37, 0x21, 0x4d, 0x51, 0xe7, 0x99, 0xcf, 0xa7, 0xeb, 0xb3, 0xab, 0x71, 0xe8, 0x29,
+ 0x64, 0x28, 0x20, 0x8d, 0x66, 0xbf, 0xa7, 0xae, 0xcf, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73, 0x33,
+ 0xf3, 0x81, 0x75, 0x7d, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xce, 0x01, 0xe3, 0xe6, 0xbd, 0x7a, 0xae,
+ 0xcf, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0xdb, 0xeb, 0xfa, 0x9c, 0x3a, 0x1e, 0x92,
+ 0xa1, 0xe0, 0xc1, 0xdc, 0xf3, 0x9f, 0x81, 0xd7, 0x17, 0xa8, 0x2b, 0xa2, 0xcf, 0xa1, 0x1c, 0x84,
+ 0xed, 0x16, 0x7b, 0xa1, 0x5d, 0x5f, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x5e, 0x6c,
+ 0xd7, 0x17, 0x2c, 0x01, 0xa2, 0xdf, 0xc0, 0xca, 0x34, 0xc6, 0xb6, 0xf8, 0x03, 0xee, 0xfa, 0x12,
+ 0x45, 0x41, 0x34, 0x04, 0x14, 0x81, 0xcd, 0x2d, 0xf1, 0x9e, 0xbb, 0xbe, 0x4c, 0x8d, 0x10, 0xf5,
+ 0xa0, 0x1a, 0xc6, 0xa6, 0x16, 0x7d, 0x86, 0x5d, 0x5f, 0xb8, 0xaa, 0xc7, 0xbe, 0x12, 0xc4, 0x48,
+ 0x16, 0x7d, 0x96, 0x5d, 0x5f, 0xb8, 0xc8, 0x87, 0x4e, 0x01, 0x7c, 0x77, 0xdb, 0x05, 0x9e, 0x69,
+ 0xd7, 0x17, 0x29, 0xf7, 0x21, 0x03, 0x56, 0xa3, 0x2e, 0xb3, 0xcb, 0xbc, 0xda, 0xae, 0x2f, 0x55,
+ 0x05, 0x24, 0xf6, 0x1c, 0xbc, 0x97, 0x2e, 0xf6, 0x8a, 0xbb, 0xbe, 0x60, 0x39, 0x70, 0x67, 0xe7,
+ 0xeb, 0x37, 0xeb, 0xc2, 0x37, 0x6f, 0xd6, 0x85, 0x6f, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, 0xb7, 0x9e,
+ 0xf8, 0xe6, 0xbb, 0xf5, 0xc4, 0xbf, 0x7d, 0xb7, 0x9e, 0xf8, 0xb3, 0xfb, 0x97, 0x9a, 0xdd, 0x1f,
+ 0x9f, 0x6f, 0x75, 0xf5, 0x21, 0xfd, 0x77, 0x8e, 0xa1, 0x5e, 0x6f, 0x33, 0x9d, 0xa4, 0xe5, 0xfb,
+ 0x0f, 0xd0, 0x79, 0x96, 0xc6, 0xba, 0xc7, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x86, 0x26, 0x20,
+ 0x26, 0x23, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -5676,16 +5676,16 @@ func (m *Request_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error) {
}
return len(dAtA) - i, nil
}
-func (m *Request_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *Request_FinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *Request_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *Request_FinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
- if m.FinalizeSnapshotSync != nil {
+ if m.FinalizeSnapshot != nil {
{
- size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.FinalizeSnapshot.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -6114,7 +6114,7 @@ func (m *RequestApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, erro
return len(dAtA) - i, nil
}
-func (m *RequestFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+func (m *RequestFinalizeSnapshot) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -6124,12 +6124,12 @@ func (m *RequestFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
-func (m *RequestFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *RequestFinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *RequestFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -6978,16 +6978,16 @@ func (m *Response_FinalizeBlock) MarshalToSizedBuffer(dAtA []byte) (int, error)
}
return len(dAtA) - i, nil
}
-func (m *Response_FinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *Response_FinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *Response_FinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *Response_FinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
- if m.FinalizeSnapshotSync != nil {
+ if m.FinalizeSnapshot != nil {
{
- size, err := m.FinalizeSnapshotSync.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.FinalizeSnapshot.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -7536,7 +7536,7 @@ func (m *ResponseApplySnapshotChunk) MarshalToSizedBuffer(dAtA []byte) (int, err
return len(dAtA) - i, nil
}
-func (m *ResponseFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
+func (m *ResponseFinalizeSnapshot) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
n, err := m.MarshalToSizedBuffer(dAtA[:size])
@@ -7546,12 +7546,12 @@ func (m *ResponseFinalizeSnapshotSync) Marshal() (dAtA []byte, err error) {
return dAtA[:n], nil
}
-func (m *ResponseFinalizeSnapshotSync) MarshalTo(dAtA []byte) (int, error) {
+func (m *ResponseFinalizeSnapshot) MarshalTo(dAtA []byte) (int, error) {
size := m.Size()
return m.MarshalToSizedBuffer(dAtA[:size])
}
-func (m *ResponseFinalizeSnapshotSync) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+func (m *ResponseFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
_ = i
var l int
@@ -8810,14 +8810,14 @@ func (m *Request_FinalizeBlock) Size() (n int) {
}
return n
}
-func (m *Request_FinalizeSnapshotSync) Size() (n int) {
+func (m *Request_FinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
- if m.FinalizeSnapshotSync != nil {
- l = m.FinalizeSnapshotSync.Size()
+ if m.FinalizeSnapshot != nil {
+ l = m.FinalizeSnapshot.Size()
n += 2 + l + sovTypes(uint64(l))
}
return n
@@ -9005,7 +9005,7 @@ func (m *RequestApplySnapshotChunk) Size() (n int) {
return n
}
-func (m *RequestFinalizeSnapshotSync) Size() (n int) {
+func (m *RequestFinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
@@ -9426,14 +9426,14 @@ func (m *Response_FinalizeBlock) Size() (n int) {
}
return n
}
-func (m *Response_FinalizeSnapshotSync) Size() (n int) {
+func (m *Response_FinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
var l int
_ = l
- if m.FinalizeSnapshotSync != nil {
- l = m.FinalizeSnapshotSync.Size()
+ if m.FinalizeSnapshot != nil {
+ l = m.FinalizeSnapshot.Size()
n += 2 + l + sovTypes(uint64(l))
}
return n
@@ -9687,7 +9687,7 @@ func (m *ResponseApplySnapshotChunk) Size() (n int) {
return n
}
-func (m *ResponseFinalizeSnapshotSync) Size() (n int) {
+func (m *ResponseFinalizeSnapshot) Size() (n int) {
if m == nil {
return 0
}
@@ -10705,7 +10705,7 @@ func (m *Request) Unmarshal(dAtA []byte) error {
iNdEx = postIndex
case 20:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshot", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -10732,11 +10732,11 @@ func (m *Request) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- v := &RequestFinalizeSnapshotSync{}
+ v := &RequestFinalizeSnapshot{}
if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
- m.Value = &Request_FinalizeSnapshotSync{v}
+ m.Value = &Request_FinalizeSnapshot{v}
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -12002,7 +12002,7 @@ func (m *RequestApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *RequestFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -12025,10 +12025,10 @@ func (m *RequestFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: RequestFinalizeSnapshotSync: wiretype end group for non-group")
+ return fmt.Errorf("proto: RequestFinalizeSnapshot: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: RequestFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: RequestFinalizeSnapshot: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
@@ -14169,7 +14169,7 @@ func (m *Response) Unmarshal(dAtA []byte) error {
iNdEx = postIndex
case 17:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshotSync", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field FinalizeSnapshot", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -14196,11 +14196,11 @@ func (m *Response) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- v := &ResponseFinalizeSnapshotSync{}
+ v := &ResponseFinalizeSnapshot{}
if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
- m.Value = &Response_FinalizeSnapshotSync{v}
+ m.Value = &Response_FinalizeSnapshot{v}
iNdEx = postIndex
default:
iNdEx = preIndex
@@ -15812,7 +15812,7 @@ func (m *ResponseApplySnapshotChunk) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *ResponseFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
+func (m *ResponseFinalizeSnapshot) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -15835,10 +15835,10 @@ func (m *ResponseFinalizeSnapshotSync) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: wiretype end group for non-group")
+ return fmt.Errorf("proto: ResponseFinalizeSnapshot: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: ResponseFinalizeSnapshotSync: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: ResponseFinalizeSnapshot: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
default:
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 70b2755b85..943dbac4aa 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -22,22 +22,22 @@ import "gogoproto/gogo.proto";
// Request types
message Request {
oneof value {
- RequestEcho echo = 1;
- RequestFlush flush = 2;
- RequestInfo info = 3;
- RequestInitChain init_chain = 4;
- RequestQuery query = 5;
- RequestCheckTx check_tx = 7;
- RequestListSnapshots list_snapshots = 11;
- RequestOfferSnapshot offer_snapshot = 12;
- RequestLoadSnapshotChunk load_snapshot_chunk = 13;
- RequestApplySnapshotChunk apply_snapshot_chunk = 14;
- RequestFinalizeSnapshotSync finalize_snapshot_sync = 20;
- RequestPrepareProposal prepare_proposal = 15;
- RequestProcessProposal process_proposal = 16;
- RequestExtendVote extend_vote = 17;
- RequestVerifyVoteExtension verify_vote_extension = 18;
- RequestFinalizeBlock finalize_block = 19;
+ RequestEcho echo = 1;
+ RequestFlush flush = 2;
+ RequestInfo info = 3;
+ RequestInitChain init_chain = 4;
+ RequestQuery query = 5;
+ RequestCheckTx check_tx = 7;
+ RequestListSnapshots list_snapshots = 11;
+ RequestOfferSnapshot offer_snapshot = 12;
+ RequestLoadSnapshotChunk load_snapshot_chunk = 13;
+ RequestApplySnapshotChunk apply_snapshot_chunk = 14;
+ RequestFinalizeSnapshot finalize_snapshot = 20;
+ RequestPrepareProposal prepare_proposal = 15;
+ RequestProcessProposal process_proposal = 16;
+ RequestExtendVote extend_vote = 17;
+ RequestVerifyVoteExtension verify_vote_extension = 18;
+ RequestFinalizeBlock finalize_block = 19;
}
reserved 6, 8, 9, 10; // RequestBeginBlock, RequestDeliverTx, RequestEndBlock, RequestCommit
}
@@ -187,7 +187,7 @@ message RequestApplySnapshotChunk {
// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
// It includes the light block committed at the synced height, which Tenderdash uses
// to reconstruct its own state.
-message RequestFinalizeSnapshotSync {
+message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
// commit fot the `light_block`
@@ -514,23 +514,23 @@ message RequestFinalizeBlock {
message Response {
oneof value {
- ResponseException exception = 1;
- ResponseEcho echo = 2;
- ResponseFlush flush = 3;
- ResponseInfo info = 4;
- ResponseInitChain init_chain = 5;
- ResponseQuery query = 6;
- ResponseCheckTx check_tx = 7;
- ResponseListSnapshots list_snapshots = 8;
- ResponseOfferSnapshot offer_snapshot = 9;
- ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
- ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
- ResponseFinalizeSnapshotSync finalize_snapshot_sync = 17;
- ResponsePrepareProposal prepare_proposal = 12;
- ResponseProcessProposal process_proposal = 13;
- ResponseExtendVote extend_vote = 14;
- ResponseVerifyVoteExtension verify_vote_extension = 15;
- ResponseFinalizeBlock finalize_block = 16;
+ ResponseException exception = 1;
+ ResponseEcho echo = 2;
+ ResponseFlush flush = 3;
+ ResponseInfo info = 4;
+ ResponseInitChain init_chain = 5;
+ ResponseQuery query = 6;
+ ResponseCheckTx check_tx = 7;
+ ResponseListSnapshots list_snapshots = 8;
+ ResponseOfferSnapshot offer_snapshot = 9;
+ ResponseLoadSnapshotChunk load_snapshot_chunk = 10;
+ ResponseApplySnapshotChunk apply_snapshot_chunk = 11;
+ ResponseFinalizeSnapshot finalize_snapshot = 17;
+ ResponsePrepareProposal prepare_proposal = 12;
+ ResponseProcessProposal process_proposal = 13;
+ ResponseExtendVote extend_vote = 14;
+ ResponseVerifyVoteExtension verify_vote_extension = 15;
+ ResponseFinalizeBlock finalize_block = 16;
}
}
@@ -642,7 +642,7 @@ message ResponseApplySnapshotChunk {
}
// The response to a `RequestPrepareSnapshot` message.
-message ResponseFinalizeSnapshotSync {
+message ResponseFinalizeSnapshot {
}
message ResponsePrepareProposal {
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 9945f1071b..69ff32169d 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -18,7 +18,7 @@
- [RequestEcho](#tendermint-abci-RequestEcho)
- [RequestExtendVote](#tendermint-abci-RequestExtendVote)
- [RequestFinalizeBlock](#tendermint-abci-RequestFinalizeBlock)
- - [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync)
+ - [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot)
- [RequestFlush](#tendermint-abci-RequestFlush)
- [RequestInfo](#tendermint-abci-RequestInfo)
- [RequestInitChain](#tendermint-abci-RequestInitChain)
@@ -36,7 +36,7 @@
- [ResponseException](#tendermint-abci-ResponseException)
- [ResponseExtendVote](#tendermint-abci-ResponseExtendVote)
- [ResponseFinalizeBlock](#tendermint-abci-ResponseFinalizeBlock)
- - [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync)
+ - [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot)
- [ResponseFlush](#tendermint-abci-ResponseFlush)
- [ResponseInfo](#tendermint-abci-ResponseInfo)
- [ResponseInitChain](#tendermint-abci-ResponseInitChain)
@@ -249,7 +249,7 @@ Request types
| offer_snapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | | |
| load_snapshot_chunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | | |
-| finalize_snapshot_sync | [RequestFinalizeSnapshotSync](#tendermint-abci-RequestFinalizeSnapshotSync) | | |
+| finalize_snapshot | [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot) | | |
| prepare_proposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | | |
| process_proposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | | |
| extend_vote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | | |
@@ -426,9 +426,9 @@ Finalize newly decided block.
-
+
-### RequestFinalizeSnapshotSync
+### RequestFinalizeSnapshot
After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
It includes the light block committed at the synced height, which Tenderdash uses
to reconstruct its own state.
@@ -830,7 +830,7 @@ from this condition, but not sure), and _p_ receives a Precommit message for rou
| offer_snapshot | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | | |
| load_snapshot_chunk | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | | |
| apply_snapshot_chunk | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | | |
-| finalize_snapshot_sync | [ResponseFinalizeSnapshotSync](#tendermint-abci-ResponseFinalizeSnapshotSync) | | |
+| finalize_snapshot | [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot) | | |
| prepare_proposal | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | | |
| process_proposal | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | | |
| extend_vote | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | | |
@@ -941,9 +941,9 @@ nondeterministic
-
+
-### ResponseFinalizeSnapshotSync
+### ResponseFinalizeSnapshot
The response to a `RequestPrepareSnapshot` message.
From 8f33ac1c773f760a08f14a4dd9986f60449ea916 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 15:46:32 +0100
Subject: [PATCH 08/65] chore(proto): Updated RequestFinalizeSnapshot
---
abci/types/types.pb.go | 578 +++++++++++++-----------------
proto/tendermint/abci/types.proto | 2 -
spec/abci++/api.md | 1 -
3 files changed, 258 insertions(+), 323 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 73c13f07fd..f157a7c808 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1180,8 +1180,6 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
- // commit fot the `light_block`
- Commit *types1.Commit `protobuf:"bytes,2,opt,name=commit,proto3" json:"commit,omitempty"`
}
func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
@@ -1224,13 +1222,6 @@ func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
return nil
}
-func (m *RequestFinalizeSnapshot) GetCommit() *types1.Commit {
- if m != nil {
- return m.Commit
- }
- return nil
-}
-
// Prepare new block proposal, potentially altering list of transactions.
//
// #### Usage
@@ -4494,245 +4485,244 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3797 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
- 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0xb0, 0x45, 0x72, 0x47, 0xf1, 0x4a,
- 0xab, 0xb5, 0x49, 0xad, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
- 0x3d, 0x04, 0xa9, 0x38, 0xce, 0x7a, 0x6a, 0x08, 0x3c, 0x12, 0xb3, 0x02, 0x30, 0xe3, 0x99, 0x01,
- 0x05, 0xee, 0x35, 0x49, 0x55, 0xca, 0x27, 0xdf, 0x53, 0x7b, 0x4b, 0x8e, 0xb9, 0xe7, 0x94, 0x1c,
- 0xe3, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x15, 0xc5, 0x25, 0xdf, 0x72, 0xdb, 0x53, 0x2e, 0x39, 0xa4,
- 0xde, 0xcf, 0xfc, 0x62, 0x06, 0x3f, 0x96, 0xab, 0x52, 0xb9, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
- 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xef, 0xd8, 0x78, 0xd4, 0xc3, 0xe6, 0x50, 0x1b, 0xd9, 0xdb,
- 0xea, 0x79, 0x57, 0xdb, 0xb6, 0xaf, 0x0d, 0x6c, 0x6d, 0x19, 0xa6, 0x6e, 0xeb, 0xa8, 0xea, 0x75,
- 0x6e, 0x91, 0xce, 0xfa, 0x1d, 0x1f, 0x77, 0xd7, 0xbc, 0x36, 0x6c, 0x7d, 0xdb, 0x30, 0x75, 0xfd,
- 0x82, 0xf1, 0xd7, 0xfd, 0xca, 0xa8, 0x9e, 0xed, 0x9e, 0x6a, 0xf5, 0x79, 0xe7, 0xbb, 0x53, 0x9d,
- 0xe7, 0x03, 0xbd, 0xfb, 0x32, 0xb6, 0xd7, 0x37, 0x90, 0x40, 0x2f, 0xff, 0xee, 0x4b, 0x7c, 0xed,
- 0xf4, 0xde, 0x99, 0x92, 0x35, 0x54, 0x53, 0x1d, 0x3a, 0xdd, 0xeb, 0xbe, 0xee, 0x2b, 0x6c, 0x5a,
- 0x9a, 0x3e, 0x0a, 0x28, 0xdf, 0xb8, 0xd4, 0xf5, 0xcb, 0x01, 0xde, 0xa6, 0xad, 0xf3, 0xf1, 0xc5,
- 0xb6, 0xad, 0x0d, 0xb1, 0x65, 0xab, 0x43, 0x83, 0x33, 0xac, 0x5d, 0xea, 0x97, 0x3a, 0xfd, 0xb9,
- 0x4d, 0x7e, 0x31, 0xaa, 0xf4, 0xba, 0x00, 0x39, 0x19, 0x7f, 0x31, 0xc6, 0x96, 0x8d, 0x1e, 0x41,
- 0x1a, 0x77, 0xfb, 0x7a, 0x4d, 0xd8, 0x14, 0xee, 0x17, 0x1f, 0xbd, 0xbb, 0x15, 0x5a, 0xb7, 0x2d,
- 0xce, 0xd7, 0xea, 0xf6, 0xf5, 0x76, 0x42, 0xa6, 0xbc, 0xe8, 0x43, 0xc8, 0x5c, 0x0c, 0xc6, 0x56,
- 0xbf, 0x96, 0xa4, 0x42, 0x77, 0xe2, 0x84, 0x9e, 0x12, 0xa6, 0x76, 0x42, 0x66, 0xdc, 0xe4, 0x53,
- 0xda, 0xe8, 0x42, 0xaf, 0xa5, 0x66, 0x7f, 0x6a, 0x6f, 0x74, 0x41, 0x3f, 0x45, 0x78, 0xd1, 0x0e,
- 0x80, 0x36, 0xd2, 0x6c, 0xa5, 0xdb, 0x57, 0xb5, 0x51, 0x2d, 0x4d, 0x25, 0x7f, 0x14, 0x2f, 0xa9,
- 0xd9, 0x4d, 0xc2, 0xd8, 0x4e, 0xc8, 0x05, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x31, 0xc6, 0xe6, 0x75,
- 0x2d, 0x33, 0x7b, 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x7e, 0x09, 0xf9, 0x6e, 0x1f,
- 0x77, 0x5f, 0x2a, 0xf6, 0xa4, 0x96, 0xa3, 0x92, 0x1b, 0x71, 0x92, 0x4d, 0xc2, 0xd7, 0x99, 0xb4,
- 0x13, 0x72, 0xae, 0xcb, 0x7e, 0xa2, 0x43, 0xa8, 0x0c, 0x34, 0xcb, 0x56, 0xac, 0x91, 0x6a, 0x58,
- 0x7d, 0xdd, 0xb6, 0x6a, 0x45, 0xaa, 0xe3, 0xbd, 0x38, 0x1d, 0x07, 0x9a, 0x65, 0x9f, 0x38, 0xcc,
- 0xed, 0x84, 0x5c, 0x1e, 0xf8, 0x09, 0x44, 0x9f, 0x7e, 0x71, 0x81, 0x4d, 0x57, 0x61, 0xad, 0x34,
- 0x5b, 0xdf, 0x11, 0xe1, 0x76, 0xe4, 0x89, 0x3e, 0xdd, 0x4f, 0x40, 0x9f, 0xc1, 0xea, 0x40, 0x57,
- 0x7b, 0xae, 0x3a, 0xa5, 0xdb, 0x1f, 0x8f, 0x5e, 0xd6, 0xca, 0x54, 0xe9, 0x4f, 0x62, 0x07, 0xa9,
- 0xab, 0x3d, 0x47, 0x45, 0x93, 0x08, 0xb4, 0x13, 0xf2, 0xca, 0x20, 0x4c, 0x44, 0x9f, 0xc3, 0x9a,
- 0x6a, 0x18, 0x83, 0xeb, 0xb0, 0xf6, 0x0a, 0xd5, 0xfe, 0x20, 0x4e, 0x7b, 0x83, 0xc8, 0x84, 0xd5,
- 0x23, 0x75, 0x8a, 0x8a, 0x5e, 0xc0, 0xca, 0x85, 0x36, 0x52, 0x07, 0xda, 0x6f, 0xb1, 0xb7, 0x1e,
- 0x6b, 0x54, 0xf9, 0xfd, 0x58, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x01,
- 0xd1, 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0x75, 0x50, 0xab, 0x52, 0xbd,
- 0xf7, 0xe2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x4e, 0xc8, 0x55, 0x23, 0x48, 0x62, 0x5a,
- 0xf5, 0x2e, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x0b,
- 0x8a, 0x78, 0x42, 0xc4, 0x95, 0x2b, 0xdd, 0xc6, 0xb5, 0x15, 0xaa, 0x50, 0x8a, 0x3d, 0xc0, 0x94,
- 0xf5, 0x4c, 0xb7, 0x71, 0x3b, 0x21, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x1b, 0x57, 0xd8, 0xd4, 0x2e,
- 0xae, 0xa9, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x43, 0x54, 0xe1, 0x4f, 0xe3, 0x14, 0x9e, 0x51,
- 0x21, 0xa2, 0xa2, 0xe5, 0x88, 0xb4, 0x13, 0xf2, 0xea, 0xd5, 0x34, 0x99, 0xd8, 0xae, 0xbb, 0x5d,
- 0xd4, 0x73, 0xd6, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f,
- 0xb0, 0x93, 0x83, 0xcc, 0x95, 0x3a, 0x18, 0xe3, 0xfd, 0x74, 0x3e, 0x2b, 0xe6, 0xf6, 0xd3, 0xf9,
- 0xbc, 0x58, 0xd8, 0x4f, 0xe7, 0x0b, 0x22, 0xec, 0xa7, 0xf3, 0x20, 0x16, 0xa5, 0x7b, 0x50, 0xf4,
- 0xf9, 0x2d, 0x54, 0x83, 0xdc, 0x10, 0x5b, 0x96, 0x7a, 0x89, 0xa9, 0x9b, 0x2b, 0xc8, 0x4e, 0x53,
- 0xaa, 0x40, 0xc9, 0xef, 0xab, 0xa4, 0xaf, 0x04, 0x57, 0x92, 0xb8, 0x21, 0x22, 0xc9, 0xfd, 0xae,
- 0x23, 0xc9, 0x9b, 0xe8, 0x2e, 0x94, 0xe9, 0x54, 0x14, 0xa7, 0x9f, 0xf8, 0xc2, 0xb4, 0x5c, 0xa2,
- 0xc4, 0x33, 0xce, 0xb4, 0x01, 0x45, 0xe3, 0x91, 0xe1, 0xb2, 0xa4, 0x28, 0x0b, 0x18, 0x8f, 0x0c,
- 0x87, 0xe1, 0x47, 0x50, 0x22, 0xf3, 0x76, 0x39, 0xd2, 0xf4, 0x23, 0x45, 0x42, 0xe3, 0x2c, 0xd2,
- 0x5f, 0xa6, 0x40, 0x0c, 0xfb, 0x37, 0xf4, 0x11, 0xa4, 0x89, 0xab, 0xe7, 0x5e, 0xbb, 0xbe, 0xc5,
- 0xe2, 0xc0, 0x96, 0x13, 0x07, 0xb6, 0x3a, 0x4e, 0x1c, 0xd8, 0xc9, 0x7f, 0xfd, 0x7a, 0x23, 0xf1,
- 0xd5, 0x7f, 0x6e, 0x08, 0x32, 0x95, 0x40, 0xb7, 0x89, 0x57, 0x53, 0xb5, 0x91, 0xa2, 0xf5, 0xe8,
- 0x90, 0x0b, 0xc4, 0x65, 0xa9, 0xda, 0x68, 0xaf, 0x87, 0x0e, 0x40, 0xec, 0xea, 0x23, 0x0b, 0x8f,
- 0xac, 0xb1, 0xa5, 0xb0, 0x38, 0xc4, 0x7d, 0x75, 0xc0, 0xe3, 0xb2, 0x00, 0xd4, 0x74, 0x38, 0x8f,
- 0x29, 0xa3, 0x5c, 0xed, 0x06, 0x09, 0xe8, 0x10, 0xca, 0x57, 0xea, 0x40, 0xeb, 0xa9, 0xb6, 0x6e,
- 0x2a, 0x16, 0xb6, 0xb9, 0xf3, 0xbe, 0x3b, 0xb5, 0xe7, 0x67, 0x0e, 0xd7, 0x09, 0xb6, 0x4f, 0x8d,
- 0x9e, 0x6a, 0xe3, 0x9d, 0xf4, 0xd7, 0xaf, 0x37, 0x04, 0xb9, 0x74, 0xe5, 0xeb, 0x41, 0x3f, 0x86,
- 0xaa, 0x6a, 0x18, 0x8a, 0x65, 0xab, 0x36, 0x56, 0xce, 0xaf, 0x6d, 0x6c, 0x51, 0x7f, 0x5e, 0x92,
- 0xcb, 0xaa, 0x61, 0x9c, 0x10, 0xea, 0x0e, 0x21, 0xa2, 0xf7, 0xa0, 0x42, 0x5c, 0xbf, 0xa6, 0x0e,
- 0x94, 0x3e, 0xd6, 0x2e, 0xfb, 0x76, 0x2d, 0xbb, 0x29, 0xdc, 0x4f, 0xc9, 0x65, 0x4e, 0x6d, 0x53,
- 0x22, 0xda, 0x82, 0x55, 0x87, 0xad, 0xab, 0x9b, 0xd8, 0xe1, 0x25, 0x8e, 0xbe, 0x2c, 0xaf, 0xf0,
- 0xae, 0xa6, 0x6e, 0x62, 0xc6, 0x2f, 0xf5, 0x5c, 0x4b, 0xa1, 0x61, 0x02, 0x21, 0x48, 0xf7, 0x54,
- 0x5b, 0xa5, 0x3b, 0x50, 0x92, 0xe9, 0x6f, 0x42, 0x33, 0x54, 0xbb, 0xcf, 0xd7, 0x95, 0xfe, 0x46,
- 0x37, 0x21, 0xcb, 0x55, 0xa7, 0xe8, 0x30, 0x78, 0x0b, 0xad, 0x41, 0xc6, 0x30, 0xf5, 0x2b, 0x4c,
- 0x97, 0x25, 0x2f, 0xb3, 0x86, 0x24, 0x43, 0x25, 0x18, 0x52, 0x50, 0x05, 0x92, 0xf6, 0x84, 0x7f,
- 0x25, 0x69, 0x4f, 0xd0, 0x43, 0x48, 0x93, 0x0d, 0xa0, 0xdf, 0xa8, 0x44, 0x04, 0x51, 0x2e, 0xd7,
- 0xb9, 0x36, 0xb0, 0x4c, 0x39, 0xa5, 0x9b, 0xb0, 0x16, 0x15, 0x62, 0xa4, 0xbe, 0x4b, 0x0f, 0x84,
- 0x0a, 0xf4, 0x21, 0xe4, 0x5d, 0x9f, 0xca, 0xec, 0xeb, 0xf6, 0xd4, 0x57, 0x1c, 0x66, 0xd9, 0x65,
- 0x25, 0x86, 0x45, 0xf6, 0xa7, 0xaf, 0xf2, 0xbc, 0xa0, 0x24, 0xe7, 0x54, 0xc3, 0x68, 0xab, 0x56,
- 0x5f, 0xba, 0x84, 0x5a, 0x5c, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93,
- 0x97, 0xa4, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xe3, 0xd1, 0x4b, 0x62, 0xc1, 0x29, 0xf6, 0x21,
- 0xda, 0xde, 0xeb, 0x49, 0x3d, 0xb8, 0x1d, 0x1b, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06,
- 0x0b, 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0x14, 0x64, 0xde, 0x92,
- 0xbe, 0x14, 0xe0, 0x56, 0x4c, 0x50, 0x41, 0xbf, 0x82, 0xe2, 0x80, 0x8c, 0x9f, 0xfb, 0xb9, 0x88,
- 0xac, 0x8a, 0x1d, 0x9f, 0x03, 0xc2, 0x44, 0xbd, 0x99, 0x0c, 0x03, 0xf7, 0x37, 0x7a, 0x08, 0xd9,
- 0xae, 0x3e, 0x1c, 0x6a, 0x36, 0x4f, 0xad, 0x6a, 0x51, 0x07, 0x8f, 0xf4, 0xcb, 0x9c, 0x4f, 0xfa,
- 0x7d, 0x1a, 0x6e, 0x46, 0x47, 0x22, 0xb4, 0x09, 0xa5, 0xa1, 0x3a, 0x51, 0xec, 0x09, 0x3f, 0x2e,
- 0x02, 0x35, 0x40, 0x18, 0xaa, 0x93, 0xce, 0x84, 0x9d, 0x15, 0x11, 0x52, 0xf6, 0xc4, 0xaa, 0x25,
- 0x37, 0x53, 0xf7, 0x4b, 0x32, 0xf9, 0x89, 0x9e, 0xc3, 0xca, 0x40, 0xef, 0xaa, 0x03, 0x65, 0xa0,
- 0x5a, 0xb6, 0xc2, 0xc7, 0xc2, 0x9c, 0xc0, 0x3b, 0xd3, 0xb6, 0x46, 0xbb, 0x89, 0xa3, 0xa4, 0x27,
- 0x36, 0x21, 0x57, 0xa9, 0xec, 0x81, 0x6a, 0xd9, 0xac, 0x0b, 0xed, 0x42, 0x71, 0xa8, 0x59, 0xe7,
- 0xb8, 0xaf, 0x5e, 0x69, 0xba, 0x59, 0x4b, 0x6f, 0xa6, 0x22, 0x33, 0xbf, 0xe7, 0x1e, 0x0f, 0xd7,
- 0xe4, 0x17, 0xf3, 0xd9, 0x48, 0x26, 0x70, 0x86, 0x1c, 0x2f, 0x98, 0x5d, 0xda, 0x0b, 0x3e, 0x84,
- 0xb5, 0x11, 0x9e, 0xd8, 0x8a, 0xeb, 0x61, 0x2c, 0x66, 0xb8, 0x39, 0xba, 0xff, 0x88, 0xf4, 0xb9,
- 0x6e, 0xc9, 0x22, 0x36, 0x4c, 0x4c, 0xc4, 0xd4, 0xc7, 0xa3, 0x5e, 0x2d, 0xbf, 0x29, 0xdc, 0xcf,
- 0xc8, 0xac, 0x81, 0x9e, 0x40, 0x8d, 0x7a, 0x0f, 0xe6, 0x52, 0xc9, 0x16, 0xe2, 0x9e, 0xe3, 0x4a,
- 0x0a, 0xd4, 0x6c, 0x6f, 0x90, 0x7e, 0xea, 0xb4, 0x0f, 0x68, 0x2f, 0x77, 0x3f, 0xdb, 0xb0, 0xc6,
- 0x52, 0x01, 0x6c, 0x92, 0x9c, 0x80, 0x6c, 0x12, 0x1d, 0x00, 0xd0, 0x01, 0xac, 0x38, 0x7d, 0xc7,
- 0xa6, 0xde, 0x99, 0xd0, 0xef, 0x3f, 0x74, 0x05, 0x7a, 0x0a, 0x39, 0x67, 0xce, 0xe1, 0x28, 0xd2,
- 0x53, 0x83, 0x9c, 0xbe, 0x86, 0xe1, 0xc6, 0x96, 0x27, 0xde, 0x09, 0x2a, 0x4d, 0x27, 0xbe, 0xbc,
- 0xcb, 0xf3, 0xe3, 0xde, 0x01, 0xdb, 0x80, 0xe2, 0x17, 0x63, 0xdd, 0x1c, 0x0f, 0xd9, 0x90, 0xca,
- 0x74, 0x48, 0xc0, 0x48, 0xf4, 0x3c, 0xff, 0x53, 0xc6, 0x67, 0x73, 0xc1, 0xa4, 0x84, 0x5b, 0x94,
- 0xe0, 0x59, 0xd4, 0x89, 0x6f, 0xe0, 0x7e, 0xa3, 0x4a, 0x2e, 0x6a, 0x54, 0xee, 0xdc, 0xe2, 0xed,
- 0x2a, 0xf5, 0xfd, 0xec, 0x0a, 0x41, 0x9a, 0xce, 0x30, 0xcd, 0x7c, 0x38, 0xf9, 0x1d, 0x6b, 0x6b,
- 0xee, 0xfe, 0x67, 0xfd, 0xfb, 0xef, 0x58, 0x60, 0xee, 0x07, 0xb3, 0xc0, 0x7c, 0xac, 0x05, 0x7e,
- 0x6f, 0x5b, 0xeb, 0xc0, 0xcd, 0x90, 0xa0, 0x32, 0xa6, 0x71, 0x96, 0x5a, 0x5b, 0xe8, 0x5a, 0xe3,
- 0x38, 0x19, 0x9f, 0x22, 0x79, 0x35, 0xa0, 0x97, 0xc5, 0xe8, 0x58, 0x0b, 0x2e, 0x2e, 0x6b, 0xc1,
- 0xa5, 0x45, 0x2c, 0xb8, 0xfc, 0x36, 0x16, 0x5c, 0x99, 0xb2, 0xe0, 0x53, 0x58, 0x99, 0xca, 0x8b,
- 0x5d, 0x73, 0x10, 0x22, 0xcd, 0x21, 0x19, 0x6d, 0x0e, 0x29, 0x9f, 0x39, 0x48, 0xdf, 0x0a, 0x50,
- 0x8f, 0x4f, 0x8f, 0x23, 0x3f, 0xf0, 0x33, 0xb8, 0xe1, 0xa5, 0x49, 0xfe, 0x75, 0x64, 0xa1, 0x08,
- 0xb9, 0x9d, 0xde, 0x42, 0xce, 0x48, 0x29, 0xd8, 0x98, 0xd2, 0x7e, 0x13, 0x7d, 0x0e, 0xd5, 0x60,
- 0x62, 0x4f, 0xf2, 0x26, 0x72, 0x5c, 0xfe, 0x60, 0xea, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0xae,
- 0x5c, 0xf9, 0x9b, 0x96, 0xf4, 0xaf, 0x49, 0x37, 0x6d, 0x08, 0x64, 0xe9, 0xe8, 0x63, 0x37, 0x74,
- 0x09, 0x8b, 0x9e, 0x6c, 0x2e, 0x10, 0x3e, 0xcd, 0xc9, 0xb7, 0x3b, 0xcd, 0xa9, 0xc8, 0xed, 0x4b,
- 0x47, 0x2f, 0x55, 0xc6, 0xbf, 0x54, 0x1f, 0x40, 0x86, 0x85, 0x6d, 0x16, 0x50, 0x6e, 0x4d, 0x9f,
- 0x0b, 0x16, 0xb1, 0x19, 0x17, 0x6a, 0x40, 0x9e, 0x5d, 0x01, 0xb4, 0x1e, 0x77, 0x00, 0xb7, 0x63,
- 0x24, 0xf6, 0x76, 0x77, 0x8a, 0x6f, 0x5e, 0x6f, 0xe4, 0x78, 0x43, 0xce, 0x51, 0xb9, 0xbd, 0x9e,
- 0xf4, 0x37, 0x00, 0x79, 0x19, 0x5b, 0x06, 0x31, 0x61, 0xb4, 0x03, 0x05, 0x3c, 0xe9, 0x62, 0xc3,
- 0x76, 0xae, 0x1b, 0xd1, 0xd7, 0x39, 0xc6, 0xdd, 0x72, 0x38, 0xdb, 0x09, 0xd9, 0x13, 0x43, 0x8f,
- 0x39, 0x9c, 0x13, 0x8f, 0xcc, 0x70, 0x71, 0x3f, 0x9e, 0xf3, 0x73, 0x07, 0xcf, 0x61, 0x81, 0x7e,
- 0x3d, 0x56, 0x2a, 0x04, 0xe8, 0x3c, 0xe6, 0x80, 0x4e, 0x7a, 0xce, 0xc7, 0x02, 0x88, 0x4e, 0x33,
- 0x80, 0xe8, 0x64, 0xe6, 0x4c, 0x33, 0x06, 0xd2, 0xf9, 0xb9, 0x03, 0xe9, 0x64, 0xe7, 0x8c, 0x38,
- 0x84, 0xe9, 0xfc, 0x6a, 0x0a, 0xd3, 0xd9, 0x8c, 0x15, 0x8d, 0x00, 0x75, 0x8e, 0xa6, 0x40, 0x9d,
- 0x3c, 0x55, 0xf2, 0xe3, 0x58, 0x25, 0x73, 0x50, 0x9d, 0xa3, 0x29, 0x54, 0xa7, 0x30, 0x47, 0xe1,
- 0x1c, 0x58, 0xe7, 0xcf, 0xa3, 0x61, 0x1d, 0x88, 0x05, 0x5e, 0xf8, 0x30, 0x17, 0xc3, 0x75, 0x94,
- 0x18, 0x5c, 0xa7, 0x18, 0x0b, 0x15, 0x30, 0xf5, 0x0b, 0x03, 0x3b, 0x7f, 0x1a, 0x05, 0xec, 0xac,
- 0xc4, 0x62, 0x52, 0xdc, 0x2a, 0x17, 0x41, 0x76, 0x4e, 0x23, 0x90, 0x9d, 0x52, 0x2c, 0x62, 0xc4,
- 0x14, 0x2f, 0x00, 0xed, 0x9c, 0x46, 0x40, 0x3b, 0xe5, 0xb9, 0x6a, 0xe7, 0x62, 0x3b, 0x4f, 0x83,
- 0xd8, 0x4e, 0x25, 0xe6, 0xea, 0xec, 0x39, 0x83, 0x18, 0x70, 0xe7, 0x3c, 0x0e, 0xdc, 0x61, 0xa0,
- 0xd6, 0xfb, 0xb1, 0x1a, 0x97, 0x40, 0x77, 0x8e, 0xa6, 0xd0, 0x1d, 0x71, 0x8e, 0x0d, 0x2f, 0x08,
- 0xef, 0x48, 0x3f, 0x21, 0x51, 0x3a, 0xe4, 0xee, 0x88, 0xeb, 0xc6, 0xa6, 0xa9, 0x9b, 0x1c, 0x90,
- 0x61, 0x0d, 0xe9, 0x3e, 0xb9, 0x9e, 0x7b, 0xae, 0x6d, 0x06, 0xe4, 0x53, 0x85, 0x72, 0xc0, 0x9d,
- 0x49, 0xff, 0x20, 0x78, 0xb2, 0x14, 0xf4, 0xf1, 0x5f, 0xed, 0x0b, 0xfc, 0x6a, 0x1f, 0xba, 0x8e,
- 0x16, 0x02, 0xb9, 0x86, 0x3f, 0x9b, 0xe1, 0x18, 0x8f, 0xea, 0x65, 0x31, 0x0f, 0x60, 0x85, 0xe6,
- 0xbd, 0x2c, 0x56, 0x04, 0xc2, 0x51, 0x95, 0x74, 0xb0, 0x55, 0x60, 0x71, 0xe9, 0x03, 0x58, 0xf5,
- 0xf1, 0xba, 0xf7, 0x69, 0x06, 0x74, 0x88, 0x2e, 0x77, 0x83, 0x5f, 0xac, 0xff, 0x39, 0xe5, 0xad,
- 0x90, 0x07, 0x0e, 0x45, 0xe1, 0x38, 0xc2, 0xf7, 0xc6, 0x71, 0xe2, 0xef, 0xf5, 0xe8, 0x33, 0x58,
- 0x0b, 0x40, 0x3c, 0x4e, 0x5a, 0x99, 0x5a, 0x0e, 0xe9, 0x49, 0xf8, 0xb2, 0x1c, 0xb7, 0x07, 0xfd,
- 0x1a, 0xde, 0xa1, 0x09, 0x72, 0x4c, 0xea, 0x9a, 0x5e, 0x2c, 0x75, 0xbd, 0x45, 0x74, 0x34, 0x23,
- 0xd2, 0xd7, 0x18, 0xfc, 0x27, 0x13, 0x83, 0xff, 0xa0, 0x03, 0x28, 0x5d, 0xe2, 0x11, 0xb6, 0x34,
- 0x4b, 0x59, 0xe2, 0xce, 0x29, 0x90, 0x8c, 0xbf, 0x9d, 0x90, 0x8b, 0x5c, 0x96, 0xf4, 0xfe, 0xb5,
- 0x20, 0xec, 0x54, 0xa1, 0xac, 0xf8, 0xd5, 0x49, 0xff, 0x2d, 0x78, 0x66, 0xe9, 0x02, 0x4c, 0x5d,
- 0xbd, 0xc7, 0xcc, 0xb7, 0x2c, 0xd3, 0xdf, 0xe4, 0x76, 0x35, 0xd0, 0x2f, 0xb9, 0x05, 0x92, 0x9f,
- 0x84, 0xcb, 0xad, 0xa9, 0x14, 0x78, 0x84, 0x5d, 0x83, 0x8c, 0x36, 0xea, 0xe1, 0x09, 0x37, 0x32,
- 0xd6, 0x20, 0xb2, 0x2f, 0xf1, 0x35, 0x37, 0x25, 0xf2, 0x93, 0xf0, 0xd1, 0x73, 0x46, 0xe7, 0x52,
- 0x92, 0x59, 0x03, 0x7d, 0x04, 0x05, 0x5a, 0x18, 0x53, 0x74, 0xc3, 0xe2, 0x31, 0x32, 0x90, 0xca,
- 0xb1, 0x22, 0xd6, 0xd6, 0x31, 0xe1, 0x39, 0x32, 0x2c, 0x39, 0x6f, 0xf0, 0x5f, 0xbe, 0x64, 0x2b,
- 0x1f, 0x48, 0xb6, 0xde, 0x85, 0x02, 0x19, 0xbd, 0x65, 0xa8, 0x5d, 0x4c, 0xe3, 0x5b, 0x41, 0xf6,
- 0x08, 0xd2, 0x3f, 0x0a, 0x50, 0x0d, 0x85, 0xdc, 0xc8, 0xb9, 0x3b, 0xa7, 0x32, 0x19, 0x04, 0xdc,
- 0xa6, 0x66, 0x7f, 0x07, 0xe0, 0x52, 0xb5, 0x94, 0x57, 0xea, 0xc8, 0xc6, 0x3d, 0xbe, 0x04, 0x85,
- 0x4b, 0xd5, 0x7a, 0x41, 0x09, 0xc1, 0xc1, 0x64, 0x42, 0x83, 0xf1, 0x41, 0x3e, 0x59, 0x3f, 0xe4,
- 0x83, 0xea, 0x90, 0x37, 0x4c, 0x4d, 0x37, 0x35, 0xfb, 0x9a, 0xae, 0x49, 0x4a, 0x76, 0xdb, 0xd2,
- 0x31, 0xdc, 0x88, 0x8c, 0xf6, 0xe8, 0x09, 0x14, 0xbc, 0x44, 0x41, 0xa0, 0x49, 0xed, 0x0c, 0x24,
- 0xcd, 0xe3, 0x25, 0x4b, 0x72, 0x23, 0x32, 0xde, 0xa3, 0x16, 0x64, 0x4d, 0x6c, 0x8d, 0x07, 0x2c,
- 0xc9, 0xae, 0x3c, 0xfa, 0x60, 0xb1, 0x3c, 0x81, 0x50, 0xc7, 0x03, 0x5b, 0xe6, 0xc2, 0xd2, 0xe7,
- 0x90, 0x65, 0x14, 0x54, 0x84, 0xdc, 0xe9, 0xe1, 0xb3, 0xc3, 0xa3, 0x17, 0x87, 0x62, 0x02, 0x01,
- 0x64, 0x1b, 0xcd, 0x66, 0xeb, 0xb8, 0x23, 0x0a, 0xa8, 0x00, 0x99, 0xc6, 0xce, 0x91, 0xdc, 0x11,
- 0x93, 0x84, 0x2c, 0xb7, 0xf6, 0x5b, 0xcd, 0x8e, 0x98, 0x42, 0x2b, 0x50, 0x66, 0xbf, 0x95, 0xa7,
- 0x47, 0xf2, 0xf3, 0x46, 0x47, 0x4c, 0xfb, 0x48, 0x27, 0xad, 0xc3, 0xdd, 0x96, 0x2c, 0x66, 0xa4,
- 0x9f, 0xc1, 0xed, 0xd8, 0xcc, 0xc2, 0x03, 0xdb, 0x04, 0x1f, 0xd8, 0x26, 0x7d, 0x93, 0x24, 0x57,
- 0xa7, 0xb8, 0x74, 0x01, 0xed, 0x87, 0x26, 0xfe, 0x68, 0x89, 0x5c, 0x23, 0x34, 0x7b, 0xf4, 0x1e,
- 0x54, 0x4c, 0x7c, 0x81, 0xed, 0x6e, 0x9f, 0xa5, 0x2f, 0x0e, 0x00, 0x56, 0xe6, 0x54, 0x2a, 0x64,
- 0x31, 0xb6, 0xdf, 0xe0, 0xae, 0xad, 0x30, 0x23, 0xb0, 0x28, 0xcc, 0x50, 0x20, 0x6c, 0x84, 0x7a,
- 0xc2, 0x88, 0xc4, 0xff, 0x33, 0x3f, 0xc5, 0x54, 0xa5, 0xa9, 0x2a, 0xa0, 0x6e, 0x87, 0x52, 0xa4,
- 0x57, 0x4b, 0x2d, 0x76, 0x01, 0x32, 0x72, 0xab, 0x23, 0x7f, 0x2a, 0xa6, 0x10, 0x82, 0x0a, 0xfd,
- 0xa9, 0x9c, 0x1c, 0x36, 0x8e, 0x4f, 0xda, 0x47, 0x64, 0xb1, 0x57, 0xa1, 0xea, 0x2c, 0xb6, 0x43,
- 0xcc, 0xa0, 0x1b, 0xb0, 0xd2, 0x3c, 0x7a, 0x7e, 0x7c, 0xd0, 0xea, 0xb4, 0x3c, 0x72, 0x56, 0xaa,
- 0x43, 0x2d, 0x2e, 0x45, 0x92, 0xfe, 0x3d, 0x05, 0xb7, 0x62, 0xd2, 0x1c, 0xf4, 0x11, 0x80, 0x3d,
- 0x51, 0x4c, 0xdc, 0xd5, 0xcd, 0x5e, 0xbc, 0xe1, 0x76, 0x26, 0x32, 0xe5, 0x90, 0x0b, 0x36, 0xff,
- 0x35, 0x33, 0x56, 0xfc, 0x92, 0x2b, 0x25, 0x0b, 0x61, 0x71, 0xc0, 0xe6, 0x4e, 0xc4, 0x0d, 0x14,
- 0x77, 0x89, 0x62, 0xba, 0x5f, 0x54, 0x31, 0xe5, 0x47, 0x9f, 0xc2, 0xad, 0x50, 0x48, 0xe3, 0x71,
- 0xc0, 0x8a, 0xaa, 0x09, 0x47, 0x47, 0xb6, 0x1b, 0xc1, 0xc8, 0xc6, 0xe2, 0x80, 0x35, 0x03, 0x1d,
- 0xc9, 0xbc, 0x05, 0x3a, 0x12, 0x17, 0x1a, 0xb3, 0xcb, 0x16, 0x41, 0xa2, 0x42, 0x63, 0x28, 0xe5,
- 0xc8, 0x85, 0x53, 0x0e, 0xe9, 0x7f, 0x02, 0xbb, 0x1b, 0x4c, 0x2d, 0x8f, 0x20, 0x6b, 0xd9, 0xaa,
- 0x3d, 0xb6, 0xf8, 0x49, 0x7a, 0xb2, 0x68, 0x9e, 0xba, 0xe5, 0xfc, 0x38, 0xa1, 0xe2, 0x32, 0x57,
- 0xf3, 0xff, 0x72, 0xd3, 0xe3, 0xb6, 0x27, 0xf3, 0x43, 0x6c, 0x4f, 0x1b, 0xb2, 0xf8, 0x0a, 0x8f,
- 0x6c, 0xab, 0x96, 0xa5, 0x33, 0xbe, 0x39, 0x3d, 0x63, 0xd2, 0xbd, 0x53, 0x23, 0xb9, 0xcf, 0x7f,
- 0xbd, 0xde, 0x10, 0x19, 0xf7, 0xfb, 0xfa, 0x50, 0xb3, 0xf1, 0xd0, 0xb0, 0xaf, 0x65, 0x2e, 0x2f,
- 0x7d, 0x08, 0x95, 0xe0, 0xa2, 0xc7, 0xbb, 0x10, 0xcf, 0x49, 0x27, 0xa5, 0xbf, 0x17, 0x60, 0x35,
- 0x02, 0xcb, 0x41, 0x4f, 0x78, 0xed, 0x88, 0x6d, 0xfc, 0xdd, 0xe9, 0xd5, 0x0b, 0xb0, 0x7b, 0x25,
- 0x24, 0x12, 0x34, 0xbd, 0xab, 0x03, 0xdb, 0x63, 0x8f, 0x80, 0x7e, 0x0a, 0x55, 0x4b, 0xbb, 0x1c,
- 0x29, 0x26, 0x83, 0x85, 0xdc, 0xba, 0x0c, 0xc9, 0xec, 0x49, 0x87, 0x53, 0xbd, 0xec, 0x91, 0xcc,
- 0x07, 0x81, 0xa8, 0x84, 0xb8, 0xa5, 0x2e, 0xa0, 0xe9, 0x9b, 0x4c, 0x14, 0x70, 0x25, 0xbc, 0x05,
- 0x70, 0xf5, 0x77, 0x02, 0xbc, 0x33, 0xe3, 0x76, 0x83, 0x3e, 0x09, 0x9d, 0x8b, 0x8f, 0x97, 0xb9,
- 0x1b, 0x6d, 0x31, 0x5a, 0xf0, 0x64, 0x48, 0x8f, 0xa1, 0xe4, 0xa7, 0x2f, 0xb6, 0x79, 0xfb, 0x5e,
- 0xec, 0x0f, 0x02, 0x6c, 0x77, 0xa1, 0x6c, 0x62, 0x9b, 0x38, 0xa9, 0x00, 0x22, 0x59, 0x62, 0x44,
- 0x96, 0xa6, 0xee, 0xa7, 0xf3, 0x82, 0x98, 0x74, 0xed, 0xe7, 0x5f, 0x04, 0x00, 0x0f, 0x75, 0xf3,
- 0x50, 0x2f, 0xc1, 0x8f, 0x7a, 0x85, 0xc0, 0xd2, 0x64, 0x18, 0x2c, 0x45, 0xf7, 0xa0, 0xca, 0xee,
- 0x23, 0x64, 0xdf, 0x54, 0x7b, 0x6c, 0x62, 0x8e, 0xb1, 0x55, 0x28, 0xf9, 0xc4, 0xa1, 0xa2, 0xcf,
- 0xe0, 0xb6, 0xdd, 0x37, 0xb1, 0xd5, 0xd7, 0x07, 0x3d, 0x25, 0xbc, 0x77, 0xac, 0xf6, 0xb3, 0x31,
- 0xc7, 0xe8, 0xe4, 0x5b, 0xae, 0x86, 0xb3, 0xe0, 0xfe, 0xfd, 0x16, 0x32, 0xf4, 0xd8, 0x90, 0xa4,
- 0xcf, 0xb5, 0xe2, 0x02, 0x37, 0xd0, 0x5f, 0x03, 0xa8, 0xb6, 0x6d, 0x6a, 0xe7, 0x63, 0xe2, 0x1d,
- 0x92, 0xd3, 0x9f, 0xf2, 0x8e, 0x5d, 0xc3, 0xe1, 0xdb, 0x79, 0x97, 0x9f, 0xbf, 0x35, 0x4f, 0xd4,
- 0x77, 0x06, 0x7d, 0x0a, 0xa5, 0x43, 0xa8, 0x04, 0x65, 0x9d, 0x6c, 0x9a, 0x8d, 0x21, 0x98, 0x4d,
- 0xb3, 0xec, 0x9c, 0x67, 0xd3, 0x6e, 0x2e, 0x9e, 0x62, 0x65, 0x5e, 0xda, 0x90, 0x7e, 0x2f, 0x40,
- 0xc9, 0xef, 0xf5, 0x16, 0x4e, 0x78, 0xf9, 0x05, 0x20, 0x35, 0x7d, 0x01, 0x48, 0xfb, 0x52, 0xe0,
- 0xdb, 0x90, 0x27, 0x29, 0xf0, 0xd8, 0xc2, 0x3d, 0x5e, 0xfc, 0xce, 0x5d, 0xaa, 0xd6, 0xa9, 0x85,
- 0x7b, 0x3e, 0xdf, 0x94, 0x7b, 0x3b, 0xdf, 0x14, 0x4c, 0xa4, 0xf3, 0xa1, 0x44, 0x7a, 0x3f, 0x9d,
- 0xcf, 0x88, 0x59, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x25, 0x40, 0xde, 0x9d, 0x6f, 0xb0, 0xea, 0x1b,
- 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x9a, 0x2f, 0xbf, 0xba, 0xb0, 0x1a, 0x78, 0xca, 0xad, 0x81, 0xff,
- 0xc2, 0x4d, 0x06, 0xe3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x96, 0x8f,
- 0x83, 0x64, 0x2c, 0xe8, 0x8f, 0x20, 0xab, 0x76, 0x5d, 0xbc, 0xb5, 0x12, 0x01, 0x44, 0x3a, 0xac,
- 0x5b, 0x9d, 0x49, 0x83, 0x72, 0xca, 0x5c, 0x82, 0x8f, 0x2a, 0xe9, 0x8c, 0x4a, 0x3a, 0x20, 0x7a,
- 0x19, 0x4f, 0xf0, 0xa4, 0x57, 0x00, 0x4e, 0x0f, 0x9f, 0x1f, 0xed, 0xee, 0x3d, 0xdd, 0x6b, 0xed,
- 0xf2, 0x6c, 0x6f, 0x77, 0xb7, 0xb5, 0x2b, 0x26, 0x09, 0x9f, 0xdc, 0x7a, 0x7e, 0x74, 0xd6, 0xda,
- 0x15, 0x53, 0xa4, 0xb1, 0xdb, 0x3a, 0x68, 0x7c, 0xda, 0xda, 0x15, 0xd3, 0x52, 0x03, 0x0a, 0x6e,
- 0xd0, 0xa1, 0x8f, 0x05, 0xf4, 0x57, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x1d, 0x8a, 0xd3, 0x05,
- 0x03, 0x72, 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xaa, 0xae, 0x0e, 0x1e, 0x9b, 0x7e, 0x01, 0x39,
- 0x63, 0x7c, 0xae, 0x38, 0xb6, 0x1b, 0x82, 0xd9, 0x9d, 0xbb, 0xdd, 0xf8, 0x7c, 0xa0, 0x75, 0x9f,
- 0xe1, 0x6b, 0x1e, 0xe4, 0xb2, 0xc6, 0xf8, 0xfc, 0x19, 0x33, 0x71, 0x36, 0x8c, 0xe4, 0x8c, 0x61,
- 0xa4, 0x42, 0xc3, 0x40, 0xf7, 0xa0, 0x34, 0xd2, 0x7b, 0x58, 0x51, 0x7b, 0x3d, 0x13, 0x5b, 0x2c,
- 0x76, 0x17, 0xb8, 0xe6, 0x22, 0xe9, 0x69, 0xb0, 0x0e, 0xe9, 0x5b, 0x01, 0xd0, 0x74, 0xa0, 0x45,
- 0x27, 0xb0, 0xe2, 0xc5, 0x6a, 0x27, 0x01, 0x60, 0x91, 0x60, 0x33, 0x3e, 0x50, 0x07, 0xf0, 0x05,
- 0xf1, 0x2a, 0x48, 0x26, 0x59, 0xdf, 0x9a, 0xe7, 0xaa, 0x0c, 0x3a, 0x5f, 0xba, 0x28, 0xc9, 0x05,
- 0x17, 0x25, 0x21, 0x23, 0x57, 0xde, 0xed, 0x09, 0xbb, 0xd2, 0xd4, 0x54, 0xdd, 0xc9, 0x80, 0x5a,
- 0x67, 0x4a, 0x8c, 0xcf, 0x33, 0x6e, 0x48, 0xc2, 0xdb, 0x0c, 0x49, 0x7a, 0x0c, 0xe2, 0x27, 0xee,
- 0xf7, 0xbd, 0xfc, 0xd1, 0x3f, 0x4c, 0x61, 0x6a, 0x98, 0x57, 0x90, 0x27, 0xde, 0x97, 0x06, 0x8d,
- 0x3f, 0x86, 0x82, 0xbb, 0x7a, 0xee, 0x7b, 0xa3, 0xd8, 0x65, 0xe7, 0x23, 0xf1, 0x44, 0xd0, 0x03,
- 0x58, 0x21, 0x71, 0xc3, 0xa9, 0xfe, 0x32, 0x84, 0x30, 0x49, 0xbd, 0x61, 0x95, 0x75, 0x1c, 0x38,
- 0xb0, 0x16, 0x89, 0xd1, 0x22, 0x8b, 0xe5, 0xb8, 0xf7, 0x7f, 0x31, 0x00, 0x72, 0xe7, 0x0b, 0x01,
- 0xa5, 0x6c, 0x0f, 0xcb, 0x81, 0x64, 0x42, 0xfa, 0x8b, 0x24, 0x14, 0x7d, 0xd5, 0x28, 0xf4, 0x87,
- 0x81, 0xc4, 0x6a, 0x73, 0x56, 0xe5, 0xca, 0x97, 0x55, 0x05, 0x26, 0x96, 0x5c, 0x7e, 0x62, 0x71,
- 0x75, 0x40, 0xa7, 0x28, 0x9d, 0x5e, 0xba, 0x28, 0xfd, 0x3e, 0x20, 0x5b, 0xb7, 0xd5, 0x01, 0x09,
- 0xde, 0xda, 0xe8, 0x52, 0x61, 0xa7, 0x9d, 0x15, 0xc2, 0x45, 0xda, 0x73, 0x46, 0x3b, 0x8e, 0x09,
- 0x5d, 0x1a, 0x40, 0xde, 0x05, 0x26, 0x96, 0x7f, 0xc6, 0x13, 0x55, 0x7c, 0xaf, 0x43, 0x7e, 0x88,
- 0x6d, 0x95, 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x07, 0x1f, 0x43, 0xd1, 0xf7, 0xb6, 0x89, 0x44,
- 0xc2, 0xc3, 0xd6, 0x0b, 0x31, 0x51, 0xcf, 0x7d, 0xf9, 0xbb, 0xcd, 0xd4, 0x21, 0x7e, 0x45, 0x3e,
- 0x25, 0xb7, 0x9a, 0xed, 0x56, 0xf3, 0x99, 0x28, 0xd4, 0x8b, 0x5f, 0xfe, 0x6e, 0x33, 0x27, 0x63,
- 0x5a, 0xb8, 0x79, 0xf0, 0x0c, 0xaa, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0x95, 0xdd, 0xd3, 0xe3,
- 0x83, 0xbd, 0x66, 0xa3, 0xd3, 0x52, 0xce, 0x8e, 0x3a, 0x2d, 0x51, 0x40, 0xb7, 0x60, 0xf5, 0x60,
- 0xef, 0x4f, 0xda, 0x1d, 0xa5, 0x79, 0xb0, 0xd7, 0x3a, 0xec, 0x28, 0x8d, 0x4e, 0xa7, 0xd1, 0x7c,
- 0x26, 0x26, 0x1f, 0xfd, 0x07, 0x40, 0xb5, 0xb1, 0xd3, 0xdc, 0x6b, 0x18, 0xc6, 0x40, 0xeb, 0xaa,
- 0xd4, 0xdd, 0x37, 0x21, 0x4d, 0x51, 0xe7, 0x99, 0xcf, 0xa7, 0xeb, 0xb3, 0xab, 0x71, 0xe8, 0x29,
- 0x64, 0x28, 0x20, 0x8d, 0x66, 0xbf, 0xa7, 0xae, 0xcf, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73, 0x33,
- 0xf3, 0x81, 0x75, 0x7d, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xce, 0x01, 0xe3, 0xe6, 0xbd, 0x7a, 0xae,
- 0xcf, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0xdb, 0xeb, 0xfa, 0x9c, 0x3a, 0x1e, 0x92,
- 0xa1, 0xe0, 0xc1, 0xdc, 0xf3, 0x9f, 0x81, 0xd7, 0x17, 0xa8, 0x2b, 0xa2, 0xcf, 0xa1, 0x1c, 0x84,
- 0xed, 0x16, 0x7b, 0xa1, 0x5d, 0x5f, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x5e, 0x6c,
- 0xd7, 0x17, 0x2c, 0x01, 0xa2, 0xdf, 0xc0, 0xca, 0x34, 0xc6, 0xb6, 0xf8, 0x03, 0xee, 0xfa, 0x12,
- 0x45, 0x41, 0x34, 0x04, 0x14, 0x81, 0xcd, 0x2d, 0xf1, 0x9e, 0xbb, 0xbe, 0x4c, 0x8d, 0x10, 0xf5,
- 0xa0, 0x1a, 0xc6, 0xa6, 0x16, 0x7d, 0x86, 0x5d, 0x5f, 0xb8, 0xaa, 0xc7, 0xbe, 0x12, 0xc4, 0x48,
- 0x16, 0x7d, 0x96, 0x5d, 0x5f, 0xb8, 0xc8, 0x87, 0x4e, 0x01, 0x7c, 0x77, 0xdb, 0x05, 0x9e, 0x69,
- 0xd7, 0x17, 0x29, 0xf7, 0x21, 0x03, 0x56, 0xa3, 0x2e, 0xb3, 0xcb, 0xbc, 0xda, 0xae, 0x2f, 0x55,
- 0x05, 0x24, 0xf6, 0x1c, 0xbc, 0x97, 0x2e, 0xf6, 0x8a, 0xbb, 0xbe, 0x60, 0x39, 0x70, 0x67, 0xe7,
- 0xeb, 0x37, 0xeb, 0xc2, 0x37, 0x6f, 0xd6, 0x85, 0x6f, 0xdf, 0xac, 0x0b, 0x5f, 0x7d, 0xb7, 0x9e,
- 0xf8, 0xe6, 0xbb, 0xf5, 0xc4, 0xbf, 0x7d, 0xb7, 0x9e, 0xf8, 0xb3, 0xfb, 0x97, 0x9a, 0xdd, 0x1f,
- 0x9f, 0x6f, 0x75, 0xf5, 0x21, 0xfd, 0x77, 0x8e, 0xa1, 0x5e, 0x6f, 0x33, 0x9d, 0xa4, 0xe5, 0xfb,
- 0x0f, 0xd0, 0x79, 0x96, 0xc6, 0xba, 0xc7, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x86, 0x26, 0x20,
- 0x26, 0x23, 0x34, 0x00, 0x00,
+ // 3779 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4b, 0x70, 0x1b, 0x47,
+ 0x73, 0xc6, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0xfe, 0xab, 0xf8, 0x97,
+ 0x2c, 0xdb, 0xa4, 0x2d, 0xc5, 0x96, 0x1d, 0xdb, 0xa9, 0x02, 0x41, 0x28, 0x20, 0x45, 0x91, 0xf4,
+ 0x12, 0xa4, 0xec, 0x38, 0xf6, 0xd6, 0x12, 0x18, 0x12, 0x6b, 0x01, 0xd8, 0xf5, 0xee, 0x82, 0x02,
+ 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x63, 0x9c,
+ 0xca, 0xc5, 0xc7, 0x54, 0xa5, 0xa2, 0xb8, 0xe4, 0x5b, 0x6e, 0x3e, 0xe5, 0x92, 0x43, 0x6a, 0x1e,
+ 0xfb, 0x04, 0x16, 0x0f, 0xcb, 0x55, 0xa9, 0xff, 0x86, 0xe9, 0xe9, 0xee, 0x9d, 0x47, 0x4f, 0x77,
+ 0xcf, 0xd7, 0x03, 0xb8, 0x61, 0xe3, 0x41, 0x07, 0x9b, 0x7d, 0x6d, 0x60, 0x6f, 0xaa, 0xa7, 0x6d,
+ 0x6d, 0xd3, 0xbe, 0x34, 0xb0, 0xb5, 0x61, 0x98, 0xba, 0xad, 0xa3, 0xb2, 0xd7, 0xb9, 0x41, 0x3a,
+ 0xab, 0xb7, 0x7c, 0xdc, 0x6d, 0xf3, 0xd2, 0xb0, 0xf5, 0x4d, 0xc3, 0xd4, 0xf5, 0x33, 0xc6, 0x5f,
+ 0xf5, 0x2b, 0xa3, 0x7a, 0x36, 0x3b, 0xaa, 0xd5, 0xe5, 0x9d, 0x37, 0xc7, 0x3a, 0x4f, 0x7b, 0x7a,
+ 0xfb, 0x59, 0x64, 0xaf, 0x6f, 0x20, 0x81, 0x5e, 0xfe, 0xdd, 0x67, 0xf8, 0xd2, 0xe9, 0xbd, 0x35,
+ 0x26, 0x6b, 0xa8, 0xa6, 0xda, 0x77, 0xba, 0x57, 0x7d, 0xdd, 0x17, 0xd8, 0xb4, 0x34, 0x7d, 0x10,
+ 0x50, 0xbe, 0x76, 0xae, 0xeb, 0xe7, 0x3d, 0xbc, 0x49, 0x5b, 0xa7, 0xc3, 0xb3, 0x4d, 0x5b, 0xeb,
+ 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0x39, 0xd7, 0xcf, 0x75, 0xfa, 0x73, 0x93, 0xfc, 0x62,
+ 0x54, 0xe9, 0x45, 0x0e, 0x32, 0x32, 0xfe, 0x7a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24, 0x6e, 0x77,
+ 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce, 0xd7, 0x68,
+ 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7, 0x12, 0xa7,
+ 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda, 0xe0, 0x4c,
+ 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80, 0x36, 0xd0,
+ 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x7f, 0x17, 0x2d, 0xa9, 0xd9, 0x75, 0xc2,
+ 0xd8, 0x8c, 0xc9, 0x39, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x3d, 0xc4, 0xe6, 0x65, 0x25, 0x35, 0x7d,
+ 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x3e, 0x82, 0x6c, 0xbb, 0x8b, 0xdb, 0xcf, 0x14,
+ 0x7b, 0x54, 0xc9, 0x50, 0xc9, 0xb5, 0x28, 0xc9, 0x3a, 0xe1, 0x6b, 0x8d, 0x9a, 0x31, 0x39, 0xd3,
+ 0x66, 0x3f, 0xd1, 0x3e, 0x94, 0x7a, 0x9a, 0x65, 0x2b, 0xd6, 0x40, 0x35, 0xac, 0xae, 0x6e, 0x5b,
+ 0x95, 0x3c, 0xd5, 0xf1, 0x5a, 0x94, 0x8e, 0x3d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x66, 0x4c, 0x2e,
+ 0xf6, 0xfc, 0x04, 0xa2, 0x4f, 0x3f, 0x3b, 0xc3, 0xa6, 0xab, 0xb0, 0x52, 0x98, 0xae, 0xef, 0x80,
+ 0x70, 0x3b, 0xf2, 0x44, 0x9f, 0xee, 0x27, 0xa0, 0xcf, 0x61, 0xb9, 0xa7, 0xab, 0x1d, 0x57, 0x9d,
+ 0xd2, 0xee, 0x0e, 0x07, 0xcf, 0x2a, 0x45, 0xaa, 0xf4, 0xf5, 0xc8, 0x41, 0xea, 0x6a, 0xc7, 0x51,
+ 0x51, 0x27, 0x02, 0xcd, 0x98, 0xbc, 0xd4, 0x0b, 0x13, 0xd1, 0x97, 0xb0, 0xa2, 0x1a, 0x46, 0xef,
+ 0x32, 0xac, 0xbd, 0x44, 0xb5, 0xdf, 0x8b, 0xd2, 0x5e, 0x23, 0x32, 0x61, 0xf5, 0x48, 0x1d, 0xa3,
+ 0xa2, 0xa7, 0xb0, 0x74, 0xa6, 0x0d, 0xd4, 0x9e, 0xf6, 0x0d, 0xf6, 0xd6, 0x63, 0x85, 0x2a, 0xbf,
+ 0x1b, 0x69, 0x8c, 0x5c, 0xc0, 0xb7, 0x24, 0xe2, 0x59, 0x88, 0x86, 0x5a, 0x20, 0x1a, 0x26, 0x36,
+ 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, 0xf6, 0x2a, 0x65, 0xaa, 0xf7, 0x4e, 0x94, 0xde,
+ 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0x9b, 0x31, 0xb9, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc6, 0x96,
+ 0xe5, 0x69, 0x15, 0x67, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, 0x6a, 0x40, 0x1e, 0x8f, 0x88,
+ 0xb8, 0x72, 0xa1, 0xdb, 0xb8, 0xb2, 0x44, 0x15, 0x4a, 0x91, 0x07, 0x98, 0xb2, 0x9e, 0xe8, 0x36,
+ 0x6e, 0xc6, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, 0x70, 0xe5, 0x02, 0x9b, 0xda, 0xd9, 0x25, 0x55, 0xa3,
+ 0xd0, 0x1e, 0xe2, 0x68, 0x2a, 0x88, 0x2a, 0x7c, 0x23, 0x4a, 0xe1, 0x09, 0x15, 0x22, 0x2a, 0x1a,
+ 0x8e, 0x48, 0x33, 0x26, 0x2f, 0x5f, 0x8c, 0x93, 0x89, 0xed, 0xba, 0xdb, 0x45, 0x3d, 0x67, 0x65,
+ 0x79, 0xba, 0xed, 0x3a, 0x7b, 0xb5, 0x45, 0x98, 0x89, 0xed, 0x9e, 0xf9, 0x09, 0x5b, 0x19, 0x48,
+ 0x5d, 0xa8, 0xbd, 0x21, 0xde, 0x4d, 0x66, 0xd3, 0x62, 0x66, 0x37, 0x99, 0xcd, 0x8a, 0xb9, 0xdd,
+ 0x64, 0x36, 0x27, 0xc2, 0x6e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x03, 0x79, 0x9f, 0xdf, 0x42, 0x15,
+ 0xc8, 0xf4, 0xb1, 0x65, 0xa9, 0xe7, 0x98, 0xba, 0xb9, 0x9c, 0xec, 0x34, 0xa5, 0x12, 0x14, 0xfc,
+ 0xbe, 0x4a, 0xfa, 0x4e, 0x70, 0x25, 0x89, 0x1b, 0x22, 0x92, 0xdc, 0xef, 0x3a, 0x92, 0xbc, 0x89,
+ 0x6e, 0x43, 0x91, 0x4e, 0x45, 0x71, 0xfa, 0x89, 0x2f, 0x4c, 0xca, 0x05, 0x4a, 0x3c, 0xe1, 0x4c,
+ 0x6b, 0x90, 0x37, 0xee, 0x1b, 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdf, 0x70, 0x18, 0x7e, 0x07,
+ 0x05, 0x32, 0x6f, 0x97, 0x23, 0x49, 0x3f, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x55, 0x02, 0xc4,
+ 0xb0, 0x7f, 0x43, 0xef, 0x43, 0x92, 0xb8, 0x7a, 0xee, 0xb5, 0xab, 0x1b, 0x2c, 0x0e, 0x6c, 0x38,
+ 0x71, 0x60, 0xa3, 0xe5, 0xc4, 0x81, 0xad, 0xec, 0x0f, 0x2f, 0xd6, 0x62, 0xdf, 0xfd, 0xd7, 0x9a,
+ 0x20, 0x53, 0x09, 0x74, 0x9d, 0x78, 0x35, 0x55, 0x1b, 0x28, 0x5a, 0x87, 0x0e, 0x39, 0x47, 0x5c,
+ 0x96, 0xaa, 0x0d, 0x76, 0x3a, 0x68, 0x0f, 0xc4, 0xb6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a,
+ 0x8b, 0x43, 0xdc, 0x57, 0x07, 0x3c, 0x2e, 0x0b, 0x40, 0x75, 0x87, 0xf3, 0x90, 0x32, 0xca, 0xe5,
+ 0x76, 0x90, 0x80, 0xf6, 0xa1, 0x78, 0xa1, 0xf6, 0xb4, 0x8e, 0x6a, 0xeb, 0xa6, 0x62, 0x61, 0x9b,
+ 0x3b, 0xef, 0xdb, 0x63, 0x7b, 0x7e, 0xe2, 0x70, 0x1d, 0x61, 0xfb, 0xd8, 0xe8, 0xa8, 0x36, 0xde,
+ 0x4a, 0xfe, 0xf0, 0x62, 0x4d, 0x90, 0x0b, 0x17, 0xbe, 0x1e, 0xf4, 0x7b, 0x28, 0xab, 0x86, 0xa1,
+ 0x58, 0xb6, 0x6a, 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0xf5, 0xe7, 0x05, 0xb9, 0xa8, 0x1a, 0xc6,
+ 0x11, 0xa1, 0x6e, 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0xc4, 0xf5, 0x6b, 0x6a, 0x4f, 0xe9, 0x62, 0xed,
+ 0xbc, 0x6b, 0x57, 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58,
+ 0x76, 0xd8, 0xda, 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xe8, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26,
+ 0x66, 0xfc, 0x52, 0xc7, 0xb5, 0x14, 0x1a, 0x26, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0xba, 0x03,
+ 0x05, 0x99, 0xfe, 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5d, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c,
+ 0x75, 0x82, 0x0e, 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x59, 0xb2, 0x32,
+ 0x6b, 0x48, 0x32, 0x94, 0x82, 0x21, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x57, 0xe2, 0xf6, 0x08,
+ 0xbd, 0x0d, 0x49, 0xb2, 0x01, 0xf4, 0x1b, 0xa5, 0x09, 0x41, 0x94, 0xcb, 0xb5, 0x2e, 0x0d, 0x2c,
+ 0x53, 0x4e, 0xe9, 0x2a, 0xac, 0x4c, 0x0a, 0x31, 0x52, 0xd7, 0xa5, 0x07, 0x42, 0x05, 0x7a, 0x17,
+ 0xb2, 0xae, 0x4f, 0x65, 0xf6, 0x75, 0x7d, 0xec, 0x2b, 0x0e, 0xb3, 0xec, 0xb2, 0x12, 0xc3, 0x22,
+ 0xfb, 0xd3, 0x55, 0x79, 0x5e, 0x50, 0x90, 0x33, 0xaa, 0x61, 0x34, 0x55, 0xab, 0x2b, 0x9d, 0x43,
+ 0x25, 0x2a, 0x7e, 0xf8, 0xd6, 0x47, 0xa0, 0xa7, 0xc3, 0x59, 0x1f, 0xdf, 0xc9, 0x8b, 0xd3, 0x3d,
+ 0x71, 0x4f, 0x1e, 0xb5, 0xe0, 0xe1, 0xe0, 0x19, 0xb1, 0xe0, 0x04, 0xfb, 0x10, 0x6d, 0xef, 0x74,
+ 0xa4, 0x0e, 0x5c, 0x8f, 0x0c, 0x25, 0x01, 0x39, 0x21, 0x20, 0x47, 0x36, 0x83, 0x05, 0x28, 0x36,
+ 0x70, 0xd6, 0x20, 0x43, 0xb3, 0xe8, 0xbc, 0xe9, 0x67, 0x72, 0x32, 0x6f, 0x49, 0x9f, 0xc2, 0xb5,
+ 0x88, 0x98, 0x82, 0x3e, 0x86, 0x7c, 0x8f, 0x0c, 0x9f, 0xbb, 0xb9, 0x09, 0x49, 0x15, 0x3b, 0x3d,
+ 0x7b, 0x84, 0x89, 0x3a, 0x33, 0x19, 0x7a, 0xee, 0x6f, 0xe9, 0x97, 0x24, 0x5c, 0x9d, 0x1c, 0x56,
+ 0xd0, 0x3a, 0x14, 0xfa, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xf6, 0x05, 0x6a, 0x4d, 0xd0, 0x57, 0x47,
+ 0xad, 0x11, 0x33, 0x7c, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9,
+ 0x89, 0x9e, 0xc0, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xd2, 0xd6, 0xfb, 0x7d,
+ 0xcd, 0xe6, 0x27, 0xfa, 0xc6, 0xb8, 0xe1, 0xd0, 0x6e, 0xe2, 0xf5, 0xe8, 0xf1, 0x8b, 0xc9, 0x65,
+ 0x2a, 0xbb, 0xa7, 0x5a, 0x36, 0xeb, 0x42, 0xdb, 0x90, 0xef, 0x6b, 0xd6, 0x29, 0xee, 0xaa, 0x17,
+ 0x9a, 0x6e, 0x56, 0x92, 0xeb, 0x89, 0x89, 0x69, 0xdc, 0x13, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9,
+ 0x36, 0x3c, 0x15, 0x38, 0x10, 0x8e, 0x4b, 0x4b, 0x2f, 0xec, 0xd2, 0xde, 0x86, 0x95, 0x01, 0x1e,
+ 0xd9, 0x8a, 0xeb, 0x2e, 0x2c, 0x66, 0x85, 0x19, 0xba, 0x99, 0x88, 0xf4, 0xb9, 0x3e, 0xc6, 0x22,
+ 0x06, 0x49, 0xf6, 0xdb, 0xd4, 0x87, 0x83, 0x4e, 0x25, 0xbb, 0x2e, 0xdc, 0x4d, 0xc9, 0xac, 0x81,
+ 0x1e, 0x42, 0x85, 0xba, 0x02, 0xe6, 0x1f, 0xc9, 0x86, 0xe0, 0x8e, 0xe3, 0x17, 0x72, 0xd4, 0x06,
+ 0xaf, 0x90, 0x7e, 0xea, 0x81, 0xf7, 0x68, 0x2f, 0xf7, 0x25, 0x9b, 0xb0, 0xc2, 0xe2, 0x3a, 0x36,
+ 0x49, 0x80, 0x27, 0x9b, 0x44, 0x07, 0x00, 0x74, 0x00, 0x4b, 0x4e, 0xdf, 0xa1, 0xa9, 0xb7, 0x46,
+ 0xf4, 0xfb, 0x6f, 0xbb, 0x02, 0x1d, 0x85, 0x1c, 0x1a, 0xc7, 0xd2, 0xf3, 0xf4, 0x08, 0x20, 0xa7,
+ 0xaf, 0x66, 0xb8, 0x81, 0xe2, 0xa1, 0x77, 0x1c, 0x0a, 0xe3, 0x59, 0x2c, 0xef, 0xf2, 0x9c, 0xb2,
+ 0x77, 0x5a, 0xd6, 0x20, 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
+ 0x12, 0x3d, 0x9c, 0xff, 0x9c, 0xf2, 0xd9, 0x5c, 0x30, 0xc3, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
+ 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
+ 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0x87, 0x4c, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
+ 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
+ 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0xd0, 0xa4, 0xd6, 0x16, 0xba, 0xa3, 0x38, 0xa1, 0xda, 0xa7,
+ 0x48, 0x5e, 0x0e, 0xe8, 0x65, 0x01, 0x37, 0xd2, 0x82, 0xf3, 0x8b, 0x5a, 0x70, 0x61, 0x1e, 0x0b,
+ 0x2e, 0xbe, 0x8a, 0x05, 0x97, 0xc6, 0x2c, 0xf8, 0x18, 0x96, 0xc6, 0x92, 0x5c, 0xd7, 0x1c, 0x84,
+ 0x89, 0xe6, 0x10, 0x9f, 0x6c, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0xce, 0x75,
+ 0x27, 0x7e, 0xe0, 0x1d, 0xb8, 0xe2, 0xe5, 0x3c, 0xfe, 0x75, 0x64, 0x71, 0x05, 0xb9, 0x9d, 0xde,
+ 0x42, 0x4e, 0xc9, 0x0f, 0xd8, 0x98, 0x92, 0x7e, 0x13, 0x7d, 0x02, 0xe5, 0x60, 0x96, 0x4e, 0x92,
+ 0x20, 0x72, 0x5c, 0xfe, 0x68, 0xec, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0x2e, 0x5d, 0xf8, 0x9b,
+ 0x96, 0xf4, 0x6f, 0x71, 0x37, 0x07, 0x08, 0xa4, 0xdc, 0xe8, 0x03, 0x48, 0xf3, 0x93, 0x2d, 0xcc,
+ 0x7b, 0xb2, 0xb9, 0x40, 0xf8, 0x34, 0xc7, 0x5f, 0xed, 0x34, 0x27, 0x26, 0x6e, 0x5f, 0x72, 0xf2,
+ 0x52, 0xa5, 0xfc, 0x4b, 0xf5, 0x16, 0xa4, 0x58, 0x10, 0x66, 0x01, 0xe5, 0xda, 0xf8, 0xb9, 0x60,
+ 0xf1, 0x97, 0x71, 0xa1, 0x1a, 0x64, 0x59, 0x3e, 0xaf, 0x75, 0xb8, 0x03, 0xb8, 0x1e, 0x21, 0xb1,
+ 0xb3, 0xbd, 0x95, 0x7f, 0xf9, 0x62, 0x2d, 0xc3, 0x1b, 0x72, 0x86, 0xca, 0xed, 0x74, 0xa4, 0xbf,
+ 0x05, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x2d, 0xc8, 0xe1, 0x51, 0x1b, 0x1b, 0xb6, 0x73,
+ 0x77, 0x98, 0x7c, 0x37, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19, 0x93, 0x3d, 0x31, 0xf4, 0x80, 0x63,
+ 0x33, 0xd1, 0x30, 0x0b, 0x17, 0xf7, 0x83, 0x33, 0xef, 0x39, 0xe0, 0x0c, 0x0b, 0xf4, 0xab, 0x91,
+ 0x52, 0x21, 0x74, 0xe6, 0x01, 0x47, 0x67, 0x92, 0x33, 0x3e, 0x16, 0x80, 0x67, 0xea, 0x01, 0x78,
+ 0x26, 0x35, 0x63, 0x9a, 0x11, 0xf8, 0xcc, 0x7b, 0x0e, 0x3e, 0x93, 0x9e, 0x31, 0xe2, 0x10, 0x40,
+ 0xf3, 0xf1, 0x18, 0x40, 0xb3, 0x1e, 0x29, 0x3a, 0x01, 0xa1, 0x39, 0x18, 0x43, 0x68, 0xb2, 0x54,
+ 0xc9, 0xef, 0x23, 0x95, 0xcc, 0x80, 0x68, 0x0e, 0xc6, 0x20, 0x9a, 0xdc, 0x0c, 0x85, 0x33, 0x30,
+ 0x9a, 0xbf, 0x98, 0x8c, 0xd1, 0x40, 0x24, 0x8a, 0xc2, 0x87, 0x39, 0x1f, 0x48, 0xa3, 0x44, 0x80,
+ 0x34, 0xf9, 0xc8, 0x7b, 0x3f, 0x53, 0x3f, 0x37, 0x4a, 0xf3, 0xe9, 0x24, 0x94, 0x66, 0x29, 0x12,
+ 0x60, 0xe2, 0x56, 0x39, 0x0f, 0x4c, 0x73, 0x3c, 0x01, 0xa6, 0x29, 0x44, 0xc2, 0x3f, 0x4c, 0xf1,
+ 0x1c, 0x38, 0xcd, 0xf1, 0x04, 0x9c, 0xa6, 0x38, 0x53, 0xed, 0x4c, 0xa0, 0xe6, 0x51, 0x10, 0xa8,
+ 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x46, 0x21, 0x35, 0x0c, 0xa1, 0x7a,
+ 0x33, 0x52, 0xe3, 0x02, 0x50, 0xcd, 0xc1, 0x18, 0x54, 0x23, 0xce, 0xb0, 0xe1, 0x39, 0xb1, 0x1a,
+ 0xe9, 0x75, 0x12, 0xa5, 0x43, 0xee, 0x8e, 0xb8, 0x6e, 0x6c, 0x9a, 0xba, 0xc9, 0xd1, 0x15, 0xd6,
+ 0x90, 0xee, 0x92, 0xbb, 0xb6, 0xe7, 0xda, 0xa6, 0xe0, 0x37, 0x65, 0x28, 0x06, 0xdc, 0x99, 0xf4,
+ 0x8f, 0x82, 0x27, 0x4b, 0x11, 0x1c, 0xff, 0x3d, 0x3d, 0xc7, 0xef, 0xe9, 0xa1, 0xbb, 0x65, 0x2e,
+ 0x90, 0x6b, 0xf8, 0xb3, 0x19, 0x0e, 0xd8, 0xa8, 0x5e, 0x16, 0x73, 0x0f, 0x96, 0x68, 0xde, 0xcb,
+ 0x62, 0x45, 0x20, 0x1c, 0x95, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x97, 0xde, 0x82, 0x65, 0x1f, 0xaf,
+ 0x7b, 0x39, 0x66, 0xa8, 0x85, 0xe8, 0x72, 0xd7, 0xf8, 0x2d, 0xf9, 0x5f, 0x12, 0xde, 0x0a, 0x79,
+ 0x48, 0xcf, 0x24, 0x50, 0x46, 0xf8, 0xd5, 0xa0, 0x4c, 0xf4, 0x25, 0x1d, 0x7d, 0x0e, 0x2b, 0x01,
+ 0xbc, 0xc6, 0x49, 0x2b, 0x13, 0x8b, 0xc1, 0x36, 0x31, 0x5f, 0x96, 0xe3, 0xf6, 0xa0, 0x2f, 0xe0,
+ 0x06, 0x4d, 0x90, 0x23, 0x52, 0xd7, 0xe4, 0x7c, 0xa9, 0xeb, 0x35, 0xa2, 0xa3, 0x3e, 0x21, 0x7d,
+ 0x8d, 0x00, 0x73, 0x52, 0x11, 0x60, 0x0e, 0xda, 0x83, 0xc2, 0x39, 0x1e, 0x60, 0x4b, 0xb3, 0x94,
+ 0x05, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef, 0xdf, 0x08, 0xc2,
+ 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a, 0xd4, 0xd6, 0x3b,
+ 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x3d, 0xfd, 0x9c, 0x5b, 0x20, 0xf9, 0x49, 0xb8,
+ 0xdc, 0x02, 0x49, 0x8e, 0x47, 0xd8, 0x15, 0x48, 0x69, 0x83, 0x0e, 0x1e, 0x71, 0x23, 0x63, 0x0d,
+ 0x22, 0xfb, 0x0c, 0x5f, 0x72, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74, 0x2e, 0x05, 0x99,
+ 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0x55, 0x2e, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03, 0xa9, 0x1c, 0xab,
+ 0x48, 0x6d, 0x1c, 0x12, 0x9e, 0x03, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b, 0xb6, 0xb2, 0x81,
+ 0x64, 0xeb, 0x26, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72, 0xb2, 0x47, 0x90,
+ 0xfe, 0x49, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9c, 0xbb, 0x73, 0x2a, 0xe3, 0x41, 0xf4, 0x6c, 0x6c,
+ 0xf6, 0xb7, 0x00, 0xce, 0x55, 0x4b, 0x79, 0xae, 0x0e, 0x6c, 0xdc, 0xe1, 0x4b, 0x90, 0x3b, 0x57,
+ 0xad, 0xa7, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x7e, 0x93, 0xf6, 0xe3, 0x37, 0xa8,
+ 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64, 0xb7, 0x2d, 0x1d, 0xc2,
+ 0x95, 0x89, 0xd1, 0x1e, 0x3d, 0x84, 0x9c, 0x97, 0x28, 0x08, 0x34, 0xa9, 0x9d, 0x02, 0x8b, 0x79,
+ 0xbc, 0x64, 0x49, 0xae, 0x4c, 0x8c, 0xf7, 0xa8, 0x01, 0x69, 0x13, 0x5b, 0xc3, 0x1e, 0x4b, 0xb2,
+ 0x4b, 0xf7, 0xdf, 0x9a, 0x2f, 0x4f, 0x20, 0xd4, 0x61, 0xcf, 0x96, 0xb9, 0xb0, 0xf4, 0x25, 0xa4,
+ 0x19, 0x05, 0xe5, 0x21, 0x73, 0xbc, 0xff, 0x78, 0xff, 0xe0, 0xe9, 0xbe, 0x18, 0x43, 0x00, 0xe9,
+ 0x5a, 0xbd, 0xde, 0x38, 0x6c, 0x89, 0x02, 0xca, 0x41, 0xaa, 0xb6, 0x75, 0x20, 0xb7, 0xc4, 0x38,
+ 0x21, 0xcb, 0x8d, 0xdd, 0x46, 0xbd, 0x25, 0x26, 0xd0, 0x12, 0x14, 0xd9, 0x6f, 0xe5, 0xd1, 0x81,
+ 0xfc, 0xa4, 0xd6, 0x12, 0x93, 0x3e, 0xd2, 0x51, 0x63, 0x7f, 0xbb, 0x21, 0x8b, 0x29, 0xe9, 0x1d,
+ 0xb8, 0x1e, 0x99, 0x59, 0x78, 0xc8, 0x99, 0xe0, 0x43, 0xce, 0xa4, 0x1f, 0xe3, 0xe4, 0xea, 0x14,
+ 0x95, 0x2e, 0xa0, 0xdd, 0xd0, 0xc4, 0xef, 0x2f, 0x90, 0x6b, 0x84, 0x66, 0x8f, 0x5e, 0x83, 0x92,
+ 0x89, 0xcf, 0xb0, 0xdd, 0xee, 0xb2, 0xf4, 0xc5, 0x01, 0xc0, 0x8a, 0x9c, 0x4a, 0x85, 0x2c, 0xc6,
+ 0xf6, 0x15, 0x6e, 0xdb, 0x0a, 0x33, 0x02, 0x8b, 0xc2, 0x0c, 0x39, 0xc2, 0x46, 0xa8, 0x47, 0x8c,
+ 0x48, 0xfc, 0x3f, 0xf3, 0x53, 0x4c, 0x55, 0x92, 0xaa, 0x02, 0xea, 0x76, 0x28, 0x45, 0x7a, 0xbe,
+ 0xd0, 0x62, 0xe7, 0x20, 0x25, 0x37, 0x5a, 0xf2, 0x67, 0x62, 0x02, 0x21, 0x28, 0xd1, 0x9f, 0xca,
+ 0xd1, 0x7e, 0xed, 0xf0, 0xa8, 0x79, 0x40, 0x16, 0x7b, 0x19, 0xca, 0xce, 0x62, 0x3b, 0xc4, 0x14,
+ 0xba, 0x02, 0x4b, 0xf5, 0x83, 0x27, 0x87, 0x7b, 0x8d, 0x56, 0xc3, 0x23, 0xa7, 0xa5, 0x2a, 0x54,
+ 0xa2, 0x52, 0x24, 0xe9, 0x3f, 0x12, 0x70, 0x2d, 0x22, 0xcd, 0x41, 0xef, 0x03, 0xd8, 0x23, 0xc5,
+ 0xc4, 0x6d, 0xdd, 0xec, 0x44, 0x1b, 0x6e, 0x6b, 0x24, 0x53, 0x0e, 0x39, 0x67, 0xf3, 0x5f, 0x53,
+ 0x63, 0xc5, 0x47, 0x5c, 0x29, 0x59, 0x08, 0x8b, 0x03, 0x36, 0xb7, 0x26, 0xdc, 0x40, 0x71, 0x9b,
+ 0x28, 0xa6, 0xfb, 0x45, 0x15, 0x53, 0x7e, 0xf4, 0x19, 0x5c, 0x0b, 0x85, 0x34, 0x1e, 0x07, 0xac,
+ 0x49, 0x05, 0xde, 0xc9, 0x91, 0xed, 0x4a, 0x30, 0xb2, 0xb1, 0x38, 0x60, 0x4d, 0x41, 0x47, 0x52,
+ 0xaf, 0x80, 0x8e, 0x44, 0x85, 0xc6, 0xf4, 0xa2, 0x15, 0x8d, 0x49, 0xa1, 0x31, 0x94, 0x72, 0x64,
+ 0xc2, 0x29, 0x87, 0xf4, 0xbf, 0x81, 0xdd, 0x0d, 0xa6, 0x96, 0x07, 0x90, 0xb6, 0x6c, 0xd5, 0x1e,
+ 0x5a, 0xfc, 0x24, 0x3d, 0x9c, 0x37, 0x4f, 0xdd, 0x70, 0x7e, 0x1c, 0x51, 0x71, 0x99, 0xab, 0xf9,
+ 0x83, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x16, 0xdb, 0xd3, 0x84, 0x34, 0xbe, 0xc0, 0x03, 0xdb,
+ 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x8e, 0xcf, 0x98, 0x74, 0x6f, 0x55, 0x48, 0xee, 0xf3, 0xdf, 0x2f,
+ 0xd6, 0x44, 0xc6, 0xfd, 0xa6, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, 0x4b, 0x99, 0xcb, 0x4b, 0xef,
+ 0x42, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0x1f, 0x04, 0x58, 0x9e, 0x80,
+ 0xe5, 0xa0, 0x87, 0xbc, 0x10, 0xc4, 0x36, 0xfe, 0xf6, 0xf8, 0xea, 0x05, 0xd8, 0xbd, 0x7a, 0x10,
+ 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0x6f, 0x40, 0xd9, 0xd2, 0xce, 0x07, 0x8a,
+ 0xc9, 0x60, 0x21, 0xb7, 0xc8, 0x42, 0x32, 0x7b, 0xd2, 0xe1, 0x94, 0x22, 0x3b, 0x24, 0xf3, 0x41,
+ 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xfc, 0x26, 0x33, 0x09, 0xb8, 0x12, 0x5e, 0x01, 0xb8,
+ 0xfa, 0x7b, 0x01, 0x6e, 0x4c, 0xb9, 0xdd, 0xa0, 0x4f, 0x42, 0xe7, 0xe2, 0x83, 0x45, 0xee, 0x46,
+ 0x1b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x03, 0x28, 0xf8, 0xe9, 0xf3, 0x6d, 0xde, 0xae, 0x17, 0xfb,
+ 0x83, 0x00, 0xdb, 0x6d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16, 0x18, 0x91, 0xa5,
+ 0xa9, 0xbb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43, 0xdd, 0x3c, 0xd4,
+ 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x1d, 0x28, 0xb3, 0xfb, 0x08,
+ 0xd9, 0x37, 0xd5, 0x1e, 0x9a, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x72, 0xa8, 0xe8, 0x73, 0xb8,
+ 0x6e, 0x77, 0x4d, 0x6c, 0x75, 0xf5, 0x5e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd, 0xac, 0xcd, 0x30,
+ 0x3a, 0xf9, 0x9a, 0xab, 0xe1, 0x24, 0xb8, 0x7f, 0xdf, 0x40, 0x8a, 0x1e, 0x1b, 0x92, 0xf4, 0xb9,
+ 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x05, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3a, 0x24, 0xde, 0x21, 0x3e,
+ 0xfe, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0xad, 0x9b, 0xfc, 0xfc, 0xad, 0x78, 0xa2, 0xbe, 0x33,
+ 0xe8, 0x53, 0x28, 0xed, 0x43, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1, 0x6c, 0x9a, 0x65,
+ 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xd9, 0xd2, 0x86, 0xf4, 0x8b, 0x00, 0x05, 0xbf,
+ 0xd7, 0x9b, 0x3b, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xf8, 0x05, 0x20, 0xe9, 0x4b, 0x81, 0xaf, 0x43,
+ 0x96, 0xa4, 0xc0, 0x43, 0x0b, 0x77, 0x78, 0x25, 0x3b, 0x73, 0xae, 0x5a, 0xc7, 0x16, 0xee, 0xf8,
+ 0x7c, 0x53, 0xe6, 0xd5, 0x7c, 0x53, 0x30, 0x91, 0xce, 0x86, 0x12, 0xe9, 0xdd, 0x64, 0x36, 0x25,
+ 0xa6, 0x65, 0x5f, 0x26, 0x2e, 0xfd, 0xb5, 0x00, 0x59, 0x77, 0xbe, 0xc1, 0x12, 0x6e, 0x00, 0x97,
+ 0x65, 0xcb, 0xc5, 0x0a, 0xb8, 0xfc, 0xea, 0xc2, 0x0a, 0xda, 0x09, 0xb7, 0xa0, 0xfd, 0xa1, 0x9b,
+ 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x1d, 0x1f, 0x07, 0xc9,
+ 0x58, 0xd0, 0x9f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x02, 0x10, 0xe9, 0xb0, 0x6e, 0xb4,
+ 0x46, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0x69, 0x8f, 0xe8, 0x65, 0x3c,
+ 0xc1, 0x93, 0x5e, 0x02, 0x38, 0xde, 0x7f, 0x72, 0xb0, 0xbd, 0xf3, 0x68, 0xa7, 0xb1, 0xcd, 0xb3,
+ 0xbd, 0xed, 0xed, 0xc6, 0xb6, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xc9, 0xc1, 0x49, 0x63, 0x5b, 0x4c,
+ 0x90, 0xc6, 0x76, 0x63, 0xaf, 0xf6, 0x59, 0x63, 0x5b, 0x4c, 0x4a, 0x35, 0xc8, 0xb9, 0x41, 0x87,
+ 0x56, 0xfe, 0xf5, 0xe7, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x15, 0xf2, 0xe3, 0x05, 0x03, 0x72,
+ 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xca, 0xae, 0x0e, 0x1e, 0x9b, 0x3e, 0x84, 0x8c, 0x31, 0x3c,
+ 0x55, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x8f, 0xf1, 0x25,
+ 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa, 0x98, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xca, 0x30, 0x12, 0xa1,
+ 0x61, 0xa0, 0x3b, 0x50, 0x18, 0xe8, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d, 0x16, 0xbb, 0x73,
+ 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x93, 0x00, 0x68, 0x3c, 0xd0, 0xa2, 0x23, 0x58,
+ 0xf2, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x1e, 0x1d, 0xa8, 0x03, 0xf8, 0x82, 0x78, 0x11,
+ 0x24, 0x93, 0xac, 0x6f, 0xc5, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8, 0x9c, 0x8b, 0x12,
+ 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xac, 0xee, 0x64, 0x40, 0xa5, 0x35, 0x26,
+ 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x55, 0x86, 0x24, 0x3d, 0x00, 0xf1, 0x13, 0xf7, 0xfb, 0x5e,
+ 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x36, 0xcc, 0x0b, 0xc8, 0x12, 0xef, 0x4b, 0x83, 0xc6, 0x9f, 0x42,
+ 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8, 0x1e, 0x2c, 0x91,
+ 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0xf6, 0x1c, 0x58, 0x8b,
+ 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85, 0x80, 0x52, 0xb6,
+ 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa, 0xe3, 0x40, 0x62,
+ 0xb5, 0x3e, 0xad, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3e, 0xb1, 0xa8, 0x3a, 0xa0,
+ 0x53, 0x94, 0x4e, 0x2e, 0x5c, 0x94, 0x7e, 0x13, 0x90, 0xad, 0xdb, 0x6a, 0x8f, 0x04, 0x6f, 0x6d,
+ 0x70, 0xae, 0xb0, 0xd3, 0xce, 0x0a, 0xe1, 0x22, 0xed, 0x39, 0xa1, 0x1d, 0x87, 0x84, 0x2e, 0xf5,
+ 0x20, 0xeb, 0x02, 0x13, 0x8b, 0xbf, 0xc9, 0x99, 0x54, 0x7c, 0xaf, 0x42, 0xb6, 0x8f, 0x6d, 0x95,
+ 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x7b, 0x1f, 0x40, 0xde, 0xf7, 0x50, 0x89, 0x44, 0xc2, 0xfd,
+ 0xc6, 0x53, 0x31, 0x56, 0xcd, 0x7c, 0xfb, 0xfd, 0x7a, 0x62, 0x1f, 0x3f, 0x27, 0x9f, 0x92, 0x1b,
+ 0xf5, 0x66, 0xa3, 0xfe, 0x58, 0x14, 0xaa, 0xf9, 0x6f, 0xbf, 0x5f, 0xcf, 0xc8, 0x98, 0x16, 0x6e,
+ 0xee, 0x3d, 0x86, 0x72, 0x68, 0x07, 0x82, 0x0e, 0x1a, 0x41, 0x69, 0xfb, 0xf8, 0x70, 0x6f, 0xa7,
+ 0x5e, 0x6b, 0x35, 0x94, 0x93, 0x83, 0x56, 0x43, 0x14, 0xd0, 0x35, 0x58, 0xde, 0xdb, 0xf9, 0xb3,
+ 0x66, 0x4b, 0xa9, 0xef, 0xed, 0x34, 0xf6, 0x5b, 0x4a, 0xad, 0xd5, 0xaa, 0xd5, 0x1f, 0x8b, 0xf1,
+ 0xfb, 0xff, 0x09, 0x50, 0xae, 0x6d, 0xd5, 0x77, 0x6a, 0x86, 0xd1, 0xd3, 0xda, 0x2a, 0x75, 0xf7,
+ 0x75, 0x48, 0x52, 0xd4, 0x79, 0xea, 0x5b, 0xe8, 0xea, 0xf4, 0x6a, 0x1c, 0x7a, 0x04, 0x29, 0x0a,
+ 0x48, 0xa3, 0xe9, 0x8f, 0xa3, 0xab, 0x33, 0xca, 0x73, 0x64, 0x30, 0xf4, 0xdc, 0x4c, 0x7d, 0x2d,
+ 0x5d, 0x9d, 0x5e, 0xad, 0x43, 0x7b, 0x90, 0x71, 0xc0, 0xb8, 0x59, 0x4f, 0x98, 0xab, 0x33, 0x4b,
+ 0x68, 0x64, 0x6a, 0x0c, 0xd4, 0x9c, 0xfe, 0x90, 0xba, 0x3a, 0xa3, 0x8e, 0x87, 0x64, 0xc8, 0x79,
+ 0x30, 0xf7, 0xec, 0x37, 0xdd, 0xd5, 0x39, 0xea, 0x8a, 0xe8, 0x4b, 0x28, 0x06, 0x61, 0xbb, 0xf9,
+ 0x9e, 0x5b, 0x57, 0xe7, 0xac, 0xf9, 0x11, 0xfd, 0x41, 0x0c, 0x6f, 0xbe, 0xe7, 0xd7, 0xd5, 0x39,
+ 0x4b, 0x80, 0xe8, 0x2b, 0x58, 0x1a, 0xc7, 0xd8, 0xe6, 0x7f, 0x8d, 0x5d, 0x5d, 0xa0, 0x28, 0x88,
+ 0xfa, 0x80, 0x26, 0x60, 0x73, 0x0b, 0x3c, 0xce, 0xae, 0x2e, 0x52, 0x23, 0x44, 0x1d, 0x28, 0x87,
+ 0xb1, 0xa9, 0x79, 0xdf, 0x54, 0x57, 0xe7, 0xae, 0xea, 0xb1, 0xaf, 0x04, 0x31, 0x92, 0x79, 0xdf,
+ 0x58, 0x57, 0xe7, 0x2e, 0xf2, 0xa1, 0x63, 0x00, 0xdf, 0xdd, 0x76, 0x8e, 0x37, 0xd7, 0xd5, 0x79,
+ 0xca, 0x7d, 0xc8, 0x80, 0xe5, 0x49, 0x97, 0xd9, 0x45, 0x9e, 0x60, 0x57, 0x17, 0xaa, 0x02, 0x12,
+ 0x7b, 0x0e, 0xde, 0x4b, 0xe7, 0x7b, 0x92, 0x5d, 0x9d, 0xb3, 0x1c, 0xb8, 0xb5, 0xf5, 0xc3, 0xcb,
+ 0x55, 0xe1, 0xc7, 0x97, 0xab, 0xc2, 0x4f, 0x2f, 0x57, 0x85, 0xef, 0x7e, 0x5e, 0x8d, 0xfd, 0xf8,
+ 0xf3, 0x6a, 0xec, 0xdf, 0x7f, 0x5e, 0x8d, 0xfd, 0xf9, 0xdd, 0x73, 0xcd, 0xee, 0x0e, 0x4f, 0x37,
+ 0xda, 0x7a, 0x9f, 0xfe, 0xd5, 0xc6, 0x50, 0x2f, 0x37, 0x99, 0x4e, 0xd2, 0xf2, 0xfd, 0xa1, 0xe7,
+ 0x34, 0x4d, 0x63, 0xdd, 0x83, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x98, 0x78, 0x79, 0x4b, 0xf0,
+ 0x33, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -6134,18 +6124,6 @@ func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error)
_ = i
var l int
_ = l
- if m.Commit != nil {
- {
- size, err := m.Commit.MarshalToSizedBuffer(dAtA[:i])
- if err != nil {
- return 0, err
- }
- i -= size
- i = encodeVarintTypes(dAtA, i, uint64(size))
- }
- i--
- dAtA[i] = 0x12
- }
if m.LightBlock != nil {
{
size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
@@ -6229,12 +6207,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err24 != nil {
- return 0, err24
+ n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err23 != nil {
+ return 0, err23
}
- i -= n24
- i = encodeVarintTypes(dAtA, i, uint64(n24))
+ i -= n23
+ i = encodeVarintTypes(dAtA, i, uint64(n23))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6358,12 +6336,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err28 != nil {
- return 0, err28
+ n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err27 != nil {
+ return 0, err27
}
- i -= n28
- i = encodeVarintTypes(dAtA, i, uint64(n28))
+ i -= n27
+ i = encodeVarintTypes(dAtA, i, uint64(n27))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -7224,12 +7202,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err53 != nil {
- return 0, err53
+ n52, err52 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err52 != nil {
+ return 0, err52
}
- i -= n53
- i = encodeVarintTypes(dAtA, i, uint64(n53))
+ i -= n52
+ i = encodeVarintTypes(dAtA, i, uint64(n52))
i--
dAtA[i] = 0x32
}
@@ -8529,12 +8507,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err66 != nil {
- return 0, err66
+ n65, err65 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err65 != nil {
+ return 0, err65
}
- i -= n66
- i = encodeVarintTypes(dAtA, i, uint64(n66))
+ i -= n65
+ i = encodeVarintTypes(dAtA, i, uint64(n65))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -9015,10 +8993,6 @@ func (m *RequestFinalizeSnapshot) Size() (n int) {
l = m.LightBlock.Size()
n += 1 + l + sovTypes(uint64(l))
}
- if m.Commit != nil {
- l = m.Commit.Size()
- n += 1 + l + sovTypes(uint64(l))
- }
return n
}
@@ -12067,42 +12041,6 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
- case 2:
- if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Commit", wireType)
- }
- var msglen int
- for shift := uint(0); ; shift += 7 {
- if shift >= 64 {
- return ErrIntOverflowTypes
- }
- if iNdEx >= l {
- return io.ErrUnexpectedEOF
- }
- b := dAtA[iNdEx]
- iNdEx++
- msglen |= int(b&0x7F) << shift
- if b < 0x80 {
- break
- }
- }
- if msglen < 0 {
- return ErrInvalidLengthTypes
- }
- postIndex := iNdEx + msglen
- if postIndex < 0 {
- return ErrInvalidLengthTypes
- }
- if postIndex > l {
- return io.ErrUnexpectedEOF
- }
- if m.Commit == nil {
- m.Commit = &types1.Commit{}
- }
- if err := m.Commit.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
- return err
- }
- iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipTypes(dAtA[iNdEx:])
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 943dbac4aa..143fd5cc92 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -190,8 +190,6 @@ message RequestApplySnapshotChunk {
message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
- // commit fot the `light_block`
- tendermint.types.Commit commit = 2;
}
// Prepare new block proposal, potentially altering list of transactions.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 69ff32169d..abc33a6eb7 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -437,7 +437,6 @@ to reconstruct its own state.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
-| commit | [tendermint.types.Commit](#tendermint-types-Commit) | | commit fot the `light_block` |
From 6027abefe3fe54181ad6eb389419303a22e6b8f6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 15 Jan 2025 16:35:53 +0100
Subject: [PATCH 09/65] chore: FinalizeSnapshot implemented, not tested
---
abci/client/grpc_client.go | 4 +
abci/client/mocks/client.go | 59 +++
abci/client/routed_client.go | 5 +
abci/client/socket_client.go | 8 +
abci/types/application.go | 6 +
abci/types/messages.go | 6 +
abci/types/mocks/application.go | 59 +++
abci/types/types.pb.go | 513 ++++++++++++----------
internal/statesync/mocks/stateprovider.go | 59 +++
internal/statesync/stateprovider.go | 16 +
internal/statesync/syncer.go | 34 +-
proto/tendermint/abci/types.proto | 1 +
spec/abci++/api.md | 1 +
13 files changed, 529 insertions(+), 242 deletions(-)
diff --git a/abci/client/grpc_client.go b/abci/client/grpc_client.go
index 0ffed9b399..d8e57bd45e 100644
--- a/abci/client/grpc_client.go
+++ b/abci/client/grpc_client.go
@@ -255,6 +255,10 @@ func (cli *grpcClient) ApplySnapshotChunk(ctx context.Context, params *types.Req
return cli.client.ApplySnapshotChunk(ctx, types.ToRequestApplySnapshotChunk(params).GetApplySnapshotChunk(), grpc.WaitForReady(true))
}
+func (cli *grpcClient) FinalizeSnapshot(ctx context.Context, params *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ return cli.client.FinalizeSnapshot(ctx, types.ToRequestFinalizeSnapshot(params).GetFinalizeSnapshot(), grpc.WaitForReady(true))
+}
+
func (cli *grpcClient) PrepareProposal(ctx context.Context, params *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
return cli.client.PrepareProposal(ctx, types.ToRequestPrepareProposal(params).GetPrepareProposal(), grpc.WaitForReady(true))
}
diff --git a/abci/client/mocks/client.go b/abci/client/mocks/client.go
index 7c2d062858..9994b266df 100644
--- a/abci/client/mocks/client.go
+++ b/abci/client/mocks/client.go
@@ -362,6 +362,65 @@ func (_c *Client_FinalizeBlock_Call) RunAndReturn(run func(context.Context, *typ
return _c
}
+// FinalizeSnapshot provides a mock function with given fields: _a0, _a1
+func (_m *Client) FinalizeSnapshot(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ ret := _m.Called(_a0, _a1)
+
+ if len(ret) == 0 {
+ panic("no return value specified for FinalizeSnapshot")
+ }
+
+ var r0 *types.ResponseFinalizeSnapshot
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)); ok {
+ return rf(_a0, _a1)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) *types.ResponseFinalizeSnapshot); ok {
+ r0 = rf(_a0, _a1)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.ResponseFinalizeSnapshot)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeSnapshot) error); ok {
+ r1 = rf(_a0, _a1)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// Client_FinalizeSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FinalizeSnapshot'
+type Client_FinalizeSnapshot_Call struct {
+ *mock.Call
+}
+
+// FinalizeSnapshot is a helper method to define mock.On call
+// - _a0 context.Context
+// - _a1 *types.RequestFinalizeSnapshot
+func (_e *Client_Expecter) FinalizeSnapshot(_a0 interface{}, _a1 interface{}) *Client_FinalizeSnapshot_Call {
+ return &Client_FinalizeSnapshot_Call{Call: _e.mock.On("FinalizeSnapshot", _a0, _a1)}
+}
+
+func (_c *Client_FinalizeSnapshot_Call) Run(run func(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot)) *Client_FinalizeSnapshot_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*types.RequestFinalizeSnapshot))
+ })
+ return _c
+}
+
+func (_c *Client_FinalizeSnapshot_Call) Return(_a0 *types.ResponseFinalizeSnapshot, _a1 error) *Client_FinalizeSnapshot_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *Client_FinalizeSnapshot_Call) RunAndReturn(run func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)) *Client_FinalizeSnapshot_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// Flush provides a mock function with given fields: _a0
func (_m *Client) Flush(_a0 context.Context) error {
ret := _m.Called(_a0)
diff --git a/abci/client/routed_client.go b/abci/client/routed_client.go
index fa1afc1bc3..2bc4a8aac1 100644
--- a/abci/client/routed_client.go
+++ b/abci/client/routed_client.go
@@ -351,6 +351,11 @@ func (cli *routedClient) ApplySnapshotChunk(ctx context.Context, req *types.Requ
return result.(*types.ResponseApplySnapshotChunk), err
}
+func (cli *routedClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ result, err := cli.delegate(ctx, req)
+ return result.(*types.ResponseFinalizeSnapshot), err
+}
+
func (cli *routedClient) PrepareProposal(ctx context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
result, err := cli.delegate(ctx, req)
return result.(*types.ResponsePrepareProposal), err
diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go
index fb046187d8..e80fe9d998 100644
--- a/abci/client/socket_client.go
+++ b/abci/client/socket_client.go
@@ -357,6 +357,14 @@ func (cli *socketClient) ApplySnapshotChunk(ctx context.Context, req *types.Requ
return res.GetApplySnapshotChunk(), nil
}
+func (cli *socketClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ res, err := cli.doRequest(ctx, types.ToRequestFinalizeSnapshot(req))
+ if err != nil {
+ return nil, err
+ }
+ return res.GetFinalizeSnapshot(), nil
+}
+
func (cli *socketClient) PrepareProposal(ctx context.Context, req *types.RequestPrepareProposal) (*types.ResponsePrepareProposal, error) {
res, err := cli.doRequest(ctx, types.ToRequestPrepareProposal(req))
if err != nil {
diff --git a/abci/types/application.go b/abci/types/application.go
index fe7b60bca4..9000d8a884 100644
--- a/abci/types/application.go
+++ b/abci/types/application.go
@@ -16,6 +16,8 @@ type StateSyncer interface {
LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error)
// ApplySnapshotChunk applies a chunk of snapshot
ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error)
+ // FinalizeSnapshot sends light block to ABCI app after successful state sync
+ FinalizeSnapshot(context.Context, *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error)
}
// Application is an interface that enables any finite, deterministic state machine
@@ -97,6 +99,10 @@ func (BaseApplication) ApplySnapshotChunk(_ context.Context, _req *RequestApplyS
return &ResponseApplySnapshotChunk{}, nil
}
+func (BaseApplication) FinalizeSnapshot(_ context.Context, _req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
+ return &ResponseFinalizeSnapshot{}, nil
+}
+
func (BaseApplication) PrepareProposal(_ context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) {
trs := make([]*TxRecord, 0, len(req.Txs))
var totalBytes int64
diff --git a/abci/types/messages.go b/abci/types/messages.go
index 4a749fc83a..5c058a791e 100644
--- a/abci/types/messages.go
+++ b/abci/types/messages.go
@@ -87,6 +87,12 @@ func ToRequestApplySnapshotChunk(req *RequestApplySnapshotChunk) *Request {
}
}
+func ToRequestFinalizeSnapshot(req *RequestFinalizeSnapshot) *Request {
+ return &Request{
+ Value: &Request_FinalizeSnapshot{req},
+ }
+}
+
func ToRequestExtendVote(req *RequestExtendVote) *Request {
return &Request{
Value: &Request_ExtendVote{req},
diff --git a/abci/types/mocks/application.go b/abci/types/mocks/application.go
index 1a706370d6..5e0404ee5a 100644
--- a/abci/types/mocks/application.go
+++ b/abci/types/mocks/application.go
@@ -258,6 +258,65 @@ func (_c *Application_FinalizeBlock_Call) RunAndReturn(run func(context.Context,
return _c
}
+// FinalizeSnapshot provides a mock function with given fields: _a0, _a1
+func (_m *Application) FinalizeSnapshot(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error) {
+ ret := _m.Called(_a0, _a1)
+
+ if len(ret) == 0 {
+ panic("no return value specified for FinalizeSnapshot")
+ }
+
+ var r0 *types.ResponseFinalizeSnapshot
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)); ok {
+ return rf(_a0, _a1)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, *types.RequestFinalizeSnapshot) *types.ResponseFinalizeSnapshot); ok {
+ r0 = rf(_a0, _a1)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.ResponseFinalizeSnapshot)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, *types.RequestFinalizeSnapshot) error); ok {
+ r1 = rf(_a0, _a1)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// Application_FinalizeSnapshot_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FinalizeSnapshot'
+type Application_FinalizeSnapshot_Call struct {
+ *mock.Call
+}
+
+// FinalizeSnapshot is a helper method to define mock.On call
+// - _a0 context.Context
+// - _a1 *types.RequestFinalizeSnapshot
+func (_e *Application_Expecter) FinalizeSnapshot(_a0 interface{}, _a1 interface{}) *Application_FinalizeSnapshot_Call {
+ return &Application_FinalizeSnapshot_Call{Call: _e.mock.On("FinalizeSnapshot", _a0, _a1)}
+}
+
+func (_c *Application_FinalizeSnapshot_Call) Run(run func(_a0 context.Context, _a1 *types.RequestFinalizeSnapshot)) *Application_FinalizeSnapshot_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(*types.RequestFinalizeSnapshot))
+ })
+ return _c
+}
+
+func (_c *Application_FinalizeSnapshot_Call) Return(_a0 *types.ResponseFinalizeSnapshot, _a1 error) *Application_FinalizeSnapshot_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *Application_FinalizeSnapshot_Call) RunAndReturn(run func(context.Context, *types.RequestFinalizeSnapshot) (*types.ResponseFinalizeSnapshot, error)) *Application_FinalizeSnapshot_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// Info provides a mock function with given fields: _a0, _a1
func (_m *Application) Info(_a0 context.Context, _a1 *types.RequestInfo) (*types.ResponseInfo, error) {
ret := _m.Called(_a0, _a1)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index f157a7c808..9855779aef 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -4485,244 +4485,245 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3779 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4b, 0x70, 0x1b, 0x47,
- 0x73, 0xc6, 0xe2, 0x8d, 0xc6, 0x6b, 0x39, 0xa4, 0x24, 0x08, 0x92, 0x48, 0xfe, 0xab, 0xf8, 0x97,
- 0x2c, 0xdb, 0xa4, 0x2d, 0xc5, 0x96, 0x1d, 0xdb, 0xa9, 0x02, 0x41, 0x28, 0x20, 0x45, 0x91, 0xf4,
- 0x12, 0xa4, 0xec, 0x38, 0xf6, 0xd6, 0x12, 0x18, 0x12, 0x6b, 0x01, 0xd8, 0xf5, 0xee, 0x82, 0x02,
- 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x63, 0x9c,
- 0xca, 0xc5, 0xc7, 0x54, 0xa5, 0xa2, 0xb8, 0xe4, 0x5b, 0x6e, 0x3e, 0xe5, 0x92, 0x43, 0x6a, 0x1e,
- 0xfb, 0x04, 0x16, 0x0f, 0xcb, 0x55, 0xa9, 0xff, 0x86, 0xe9, 0xe9, 0xee, 0x9d, 0x47, 0x4f, 0x77,
- 0xcf, 0xd7, 0x03, 0xb8, 0x61, 0xe3, 0x41, 0x07, 0x9b, 0x7d, 0x6d, 0x60, 0x6f, 0xaa, 0xa7, 0x6d,
- 0x6d, 0xd3, 0xbe, 0x34, 0xb0, 0xb5, 0x61, 0x98, 0xba, 0xad, 0xa3, 0xb2, 0xd7, 0xb9, 0x41, 0x3a,
- 0xab, 0xb7, 0x7c, 0xdc, 0x6d, 0xf3, 0xd2, 0xb0, 0xf5, 0x4d, 0xc3, 0xd4, 0xf5, 0x33, 0xc6, 0x5f,
- 0xf5, 0x2b, 0xa3, 0x7a, 0x36, 0x3b, 0xaa, 0xd5, 0xe5, 0x9d, 0x37, 0xc7, 0x3a, 0x4f, 0x7b, 0x7a,
- 0xfb, 0x59, 0x64, 0xaf, 0x6f, 0x20, 0x81, 0x5e, 0xfe, 0xdd, 0x67, 0xf8, 0xd2, 0xe9, 0xbd, 0x35,
- 0x26, 0x6b, 0xa8, 0xa6, 0xda, 0x77, 0xba, 0x57, 0x7d, 0xdd, 0x17, 0xd8, 0xb4, 0x34, 0x7d, 0x10,
- 0x50, 0xbe, 0x76, 0xae, 0xeb, 0xe7, 0x3d, 0xbc, 0x49, 0x5b, 0xa7, 0xc3, 0xb3, 0x4d, 0x5b, 0xeb,
- 0x63, 0xcb, 0x56, 0xfb, 0x06, 0x67, 0x58, 0x39, 0xd7, 0xcf, 0x75, 0xfa, 0x73, 0x93, 0xfc, 0x62,
- 0x54, 0xe9, 0x45, 0x0e, 0x32, 0x32, 0xfe, 0x7a, 0x88, 0x2d, 0x1b, 0xdd, 0x87, 0x24, 0x6e, 0x77,
- 0xf5, 0x8a, 0xb0, 0x2e, 0xdc, 0xcd, 0xdf, 0xbf, 0xb9, 0x11, 0x5a, 0xb7, 0x0d, 0xce, 0xd7, 0x68,
- 0x77, 0xf5, 0x66, 0x4c, 0xa6, 0xbc, 0xe8, 0x5d, 0x48, 0x9d, 0xf5, 0x86, 0x56, 0xb7, 0x12, 0xa7,
- 0x42, 0xb7, 0xa2, 0x84, 0x1e, 0x11, 0xa6, 0x66, 0x4c, 0x66, 0xdc, 0xe4, 0x53, 0xda, 0xe0, 0x4c,
- 0xaf, 0x24, 0xa6, 0x7f, 0x6a, 0x67, 0x70, 0x46, 0x3f, 0x45, 0x78, 0xd1, 0x16, 0x80, 0x36, 0xd0,
- 0x6c, 0xa5, 0xdd, 0x55, 0xb5, 0x41, 0x25, 0x49, 0x25, 0x7f, 0x17, 0x2d, 0xa9, 0xd9, 0x75, 0xc2,
- 0xd8, 0x8c, 0xc9, 0x39, 0xcd, 0x69, 0x90, 0xe1, 0x7e, 0x3d, 0xc4, 0xe6, 0x65, 0x25, 0x35, 0x7d,
- 0xb8, 0x9f, 0x10, 0x26, 0x32, 0x5c, 0xca, 0x8d, 0x3e, 0x82, 0x6c, 0xbb, 0x8b, 0xdb, 0xcf, 0x14,
- 0x7b, 0x54, 0xc9, 0x50, 0xc9, 0xb5, 0x28, 0xc9, 0x3a, 0xe1, 0x6b, 0x8d, 0x9a, 0x31, 0x39, 0xd3,
- 0x66, 0x3f, 0xd1, 0x3e, 0x94, 0x7a, 0x9a, 0x65, 0x2b, 0xd6, 0x40, 0x35, 0xac, 0xae, 0x6e, 0x5b,
- 0x95, 0x3c, 0xd5, 0xf1, 0x5a, 0x94, 0x8e, 0x3d, 0xcd, 0xb2, 0x8f, 0x1c, 0xe6, 0x66, 0x4c, 0x2e,
- 0xf6, 0xfc, 0x04, 0xa2, 0x4f, 0x3f, 0x3b, 0xc3, 0xa6, 0xab, 0xb0, 0x52, 0x98, 0xae, 0xef, 0x80,
- 0x70, 0x3b, 0xf2, 0x44, 0x9f, 0xee, 0x27, 0xa0, 0xcf, 0x61, 0xb9, 0xa7, 0xab, 0x1d, 0x57, 0x9d,
- 0xd2, 0xee, 0x0e, 0x07, 0xcf, 0x2a, 0x45, 0xaa, 0xf4, 0xf5, 0xc8, 0x41, 0xea, 0x6a, 0xc7, 0x51,
- 0x51, 0x27, 0x02, 0xcd, 0x98, 0xbc, 0xd4, 0x0b, 0x13, 0xd1, 0x97, 0xb0, 0xa2, 0x1a, 0x46, 0xef,
- 0x32, 0xac, 0xbd, 0x44, 0xb5, 0xdf, 0x8b, 0xd2, 0x5e, 0x23, 0x32, 0x61, 0xf5, 0x48, 0x1d, 0xa3,
- 0xa2, 0xa7, 0xb0, 0x74, 0xa6, 0x0d, 0xd4, 0x9e, 0xf6, 0x0d, 0xf6, 0xd6, 0x63, 0x85, 0x2a, 0xbf,
- 0x1b, 0x69, 0x8c, 0x5c, 0xc0, 0xb7, 0x24, 0xe2, 0x59, 0x88, 0x86, 0x5a, 0x20, 0x1a, 0x26, 0x36,
- 0x54, 0x13, 0x2b, 0x86, 0xa9, 0x1b, 0xba, 0xa5, 0xf6, 0x2a, 0x65, 0xaa, 0xf7, 0x4e, 0x94, 0xde,
- 0x43, 0xc6, 0x7f, 0xc8, 0xd9, 0x9b, 0x31, 0xb9, 0x6c, 0x04, 0x49, 0x4c, 0xab, 0xde, 0xc6, 0x96,
- 0xe5, 0x69, 0x15, 0x67, 0x69, 0xa5, 0xfc, 0x41, 0xad, 0x01, 0x12, 0x6a, 0x40, 0x1e, 0x8f, 0x88,
- 0xb8, 0x72, 0xa1, 0xdb, 0xb8, 0xb2, 0x44, 0x15, 0x4a, 0x91, 0x07, 0x98, 0xb2, 0x9e, 0xe8, 0x36,
- 0x6e, 0xc6, 0x64, 0xc0, 0x6e, 0x0b, 0xa9, 0x70, 0xe5, 0x02, 0x9b, 0xda, 0xd9, 0x25, 0x55, 0xa3,
- 0xd0, 0x1e, 0xe2, 0x68, 0x2a, 0x88, 0x2a, 0x7c, 0x23, 0x4a, 0xe1, 0x09, 0x15, 0x22, 0x2a, 0x1a,
- 0x8e, 0x48, 0x33, 0x26, 0x2f, 0x5f, 0x8c, 0x93, 0x89, 0xed, 0xba, 0xdb, 0x45, 0x3d, 0x67, 0x65,
- 0x79, 0xba, 0xed, 0x3a, 0x7b, 0xb5, 0x45, 0x98, 0x89, 0xed, 0x9e, 0xf9, 0x09, 0x5b, 0x19, 0x48,
- 0x5d, 0xa8, 0xbd, 0x21, 0xde, 0x4d, 0x66, 0xd3, 0x62, 0x66, 0x37, 0x99, 0xcd, 0x8a, 0xb9, 0xdd,
- 0x64, 0x36, 0x27, 0xc2, 0x6e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x03, 0x79, 0x9f, 0xdf, 0x42, 0x15,
- 0xc8, 0xf4, 0xb1, 0x65, 0xa9, 0xe7, 0x98, 0xba, 0xb9, 0x9c, 0xec, 0x34, 0xa5, 0x12, 0x14, 0xfc,
- 0xbe, 0x4a, 0xfa, 0x4e, 0x70, 0x25, 0x89, 0x1b, 0x22, 0x92, 0xdc, 0xef, 0x3a, 0x92, 0xbc, 0x89,
- 0x6e, 0x43, 0x91, 0x4e, 0x45, 0x71, 0xfa, 0x89, 0x2f, 0x4c, 0xca, 0x05, 0x4a, 0x3c, 0xe1, 0x4c,
- 0x6b, 0x90, 0x37, 0xee, 0x1b, 0x2e, 0x4b, 0x82, 0xb2, 0x80, 0x71, 0xdf, 0x70, 0x18, 0x7e, 0x07,
- 0x05, 0x32, 0x6f, 0x97, 0x23, 0x49, 0x3f, 0x92, 0x27, 0x34, 0xce, 0x22, 0xfd, 0x55, 0x02, 0xc4,
- 0xb0, 0x7f, 0x43, 0xef, 0x43, 0x92, 0xb8, 0x7a, 0xee, 0xb5, 0xab, 0x1b, 0x2c, 0x0e, 0x6c, 0x38,
- 0x71, 0x60, 0xa3, 0xe5, 0xc4, 0x81, 0xad, 0xec, 0x0f, 0x2f, 0xd6, 0x62, 0xdf, 0xfd, 0xd7, 0x9a,
- 0x20, 0x53, 0x09, 0x74, 0x9d, 0x78, 0x35, 0x55, 0x1b, 0x28, 0x5a, 0x87, 0x0e, 0x39, 0x47, 0x5c,
- 0x96, 0xaa, 0x0d, 0x76, 0x3a, 0x68, 0x0f, 0xc4, 0xb6, 0x3e, 0xb0, 0xf0, 0xc0, 0x1a, 0x5a, 0x0a,
- 0x8b, 0x43, 0xdc, 0x57, 0x07, 0x3c, 0x2e, 0x0b, 0x40, 0x75, 0x87, 0xf3, 0x90, 0x32, 0xca, 0xe5,
- 0x76, 0x90, 0x80, 0xf6, 0xa1, 0x78, 0xa1, 0xf6, 0xb4, 0x8e, 0x6a, 0xeb, 0xa6, 0x62, 0x61, 0x9b,
- 0x3b, 0xef, 0xdb, 0x63, 0x7b, 0x7e, 0xe2, 0x70, 0x1d, 0x61, 0xfb, 0xd8, 0xe8, 0xa8, 0x36, 0xde,
- 0x4a, 0xfe, 0xf0, 0x62, 0x4d, 0x90, 0x0b, 0x17, 0xbe, 0x1e, 0xf4, 0x7b, 0x28, 0xab, 0x86, 0xa1,
- 0x58, 0xb6, 0x6a, 0x63, 0xe5, 0xf4, 0xd2, 0xc6, 0x16, 0xf5, 0xe7, 0x05, 0xb9, 0xa8, 0x1a, 0xc6,
- 0x11, 0xa1, 0x6e, 0x11, 0x22, 0x7a, 0x0d, 0x4a, 0xc4, 0xf5, 0x6b, 0x6a, 0x4f, 0xe9, 0x62, 0xed,
- 0xbc, 0x6b, 0x57, 0xd2, 0xeb, 0xc2, 0xdd, 0x84, 0x5c, 0xe4, 0xd4, 0x26, 0x25, 0xa2, 0x0d, 0x58,
- 0x76, 0xd8, 0xda, 0xba, 0x89, 0x1d, 0x5e, 0xe2, 0xe8, 0x8b, 0xf2, 0x12, 0xef, 0xaa, 0xeb, 0x26,
- 0x66, 0xfc, 0x52, 0xc7, 0xb5, 0x14, 0x1a, 0x26, 0x10, 0x82, 0x64, 0x47, 0xb5, 0x55, 0xba, 0x03,
- 0x05, 0x99, 0xfe, 0x26, 0x34, 0x43, 0xb5, 0xbb, 0x7c, 0x5d, 0xe9, 0x6f, 0x74, 0x15, 0xd2, 0x5c,
- 0x75, 0x82, 0x0e, 0x83, 0xb7, 0xd0, 0x0a, 0xa4, 0x0c, 0x53, 0xbf, 0xc0, 0x74, 0x59, 0xb2, 0x32,
- 0x6b, 0x48, 0x32, 0x94, 0x82, 0x21, 0x05, 0x95, 0x20, 0x6e, 0x8f, 0xf8, 0x57, 0xe2, 0xf6, 0x08,
- 0xbd, 0x0d, 0x49, 0xb2, 0x01, 0xf4, 0x1b, 0xa5, 0x09, 0x41, 0x94, 0xcb, 0xb5, 0x2e, 0x0d, 0x2c,
- 0x53, 0x4e, 0xe9, 0x2a, 0xac, 0x4c, 0x0a, 0x31, 0x52, 0xd7, 0xa5, 0x07, 0x42, 0x05, 0x7a, 0x17,
- 0xb2, 0xae, 0x4f, 0x65, 0xf6, 0x75, 0x7d, 0xec, 0x2b, 0x0e, 0xb3, 0xec, 0xb2, 0x12, 0xc3, 0x22,
- 0xfb, 0xd3, 0x55, 0x79, 0x5e, 0x50, 0x90, 0x33, 0xaa, 0x61, 0x34, 0x55, 0xab, 0x2b, 0x9d, 0x43,
- 0x25, 0x2a, 0x7e, 0xf8, 0xd6, 0x47, 0xa0, 0xa7, 0xc3, 0x59, 0x1f, 0xdf, 0xc9, 0x8b, 0xd3, 0x3d,
- 0x71, 0x4f, 0x1e, 0xb5, 0xe0, 0xe1, 0xe0, 0x19, 0xb1, 0xe0, 0x04, 0xfb, 0x10, 0x6d, 0xef, 0x74,
- 0xa4, 0x0e, 0x5c, 0x8f, 0x0c, 0x25, 0x01, 0x39, 0x21, 0x20, 0x47, 0x36, 0x83, 0x05, 0x28, 0x36,
- 0x70, 0xd6, 0x20, 0x43, 0xb3, 0xe8, 0xbc, 0xe9, 0x67, 0x72, 0x32, 0x6f, 0x49, 0x9f, 0xc2, 0xb5,
- 0x88, 0x98, 0x82, 0x3e, 0x86, 0x7c, 0x8f, 0x0c, 0x9f, 0xbb, 0xb9, 0x09, 0x49, 0x15, 0x3b, 0x3d,
- 0x7b, 0x84, 0x89, 0x3a, 0x33, 0x19, 0x7a, 0xee, 0x6f, 0xe9, 0x97, 0x24, 0x5c, 0x9d, 0x1c, 0x56,
- 0xd0, 0x3a, 0x14, 0xfa, 0xea, 0x48, 0xb1, 0x47, 0xdc, 0xf6, 0x05, 0x6a, 0x4d, 0xd0, 0x57, 0x47,
- 0xad, 0x11, 0x33, 0x7c, 0x11, 0x12, 0xf6, 0xc8, 0xaa, 0xc4, 0xd7, 0x13, 0x77, 0x0b, 0x32, 0xf9,
- 0x89, 0x9e, 0xc0, 0x52, 0x4f, 0x6f, 0xab, 0x3d, 0xa5, 0xa7, 0x5a, 0xb6, 0xd2, 0xd6, 0xfb, 0x7d,
- 0xcd, 0xe6, 0x27, 0xfa, 0xc6, 0xb8, 0xe1, 0xd0, 0x6e, 0xe2, 0xf5, 0xe8, 0xf1, 0x8b, 0xc9, 0x65,
- 0x2a, 0xbb, 0xa7, 0x5a, 0x36, 0xeb, 0x42, 0xdb, 0x90, 0xef, 0x6b, 0xd6, 0x29, 0xee, 0xaa, 0x17,
- 0x9a, 0x6e, 0x56, 0x92, 0xeb, 0x89, 0x89, 0x69, 0xdc, 0x13, 0x8f, 0x87, 0x6b, 0xf2, 0x8b, 0xf9,
- 0x36, 0x3c, 0x15, 0x38, 0x10, 0x8e, 0x4b, 0x4b, 0x2f, 0xec, 0xd2, 0xde, 0x86, 0x95, 0x01, 0x1e,
- 0xd9, 0x8a, 0xeb, 0x2e, 0x2c, 0x66, 0x85, 0x19, 0xba, 0x99, 0x88, 0xf4, 0xb9, 0x3e, 0xc6, 0x22,
- 0x06, 0x49, 0xf6, 0xdb, 0xd4, 0x87, 0x83, 0x4e, 0x25, 0xbb, 0x2e, 0xdc, 0x4d, 0xc9, 0xac, 0x81,
- 0x1e, 0x42, 0x85, 0xba, 0x02, 0xe6, 0x1f, 0xc9, 0x86, 0xe0, 0x8e, 0xe3, 0x17, 0x72, 0xd4, 0x06,
- 0xaf, 0x90, 0x7e, 0xea, 0x81, 0xf7, 0x68, 0x2f, 0xf7, 0x25, 0x9b, 0xb0, 0xc2, 0xe2, 0x3a, 0x36,
- 0x49, 0x80, 0x27, 0x9b, 0x44, 0x07, 0x00, 0x74, 0x00, 0x4b, 0x4e, 0xdf, 0xa1, 0xa9, 0xb7, 0x46,
- 0xf4, 0xfb, 0x6f, 0xbb, 0x02, 0x1d, 0x85, 0x1c, 0x1a, 0xc7, 0xd2, 0xf3, 0xf4, 0x08, 0x20, 0xa7,
- 0xaf, 0x66, 0xb8, 0x81, 0xe2, 0xa1, 0x77, 0x1c, 0x0a, 0xe3, 0x59, 0x2c, 0xef, 0xf2, 0x9c, 0xb2,
- 0x77, 0x5a, 0xd6, 0x20, 0xff, 0xf5, 0x50, 0x37, 0x87, 0x7d, 0x36, 0xa4, 0x22, 0x1d, 0x12, 0x30,
- 0x12, 0x3d, 0x9c, 0xff, 0x9c, 0xf2, 0xd9, 0x5c, 0x30, 0xc3, 0xe0, 0x16, 0x25, 0x78, 0x16, 0x75,
- 0xe4, 0x1b, 0xb8, 0xdf, 0xa8, 0xe2, 0xf3, 0x1a, 0x95, 0x3b, 0xb7, 0x68, 0xbb, 0x4a, 0xfc, 0x3a,
- 0xbb, 0x42, 0x90, 0xa4, 0x33, 0x4c, 0x32, 0x87, 0x4c, 0x7e, 0x47, 0xda, 0x9a, 0xbb, 0xff, 0x69,
- 0xff, 0xfe, 0x3b, 0x16, 0x98, 0xf9, 0xcd, 0x2c, 0x30, 0x1b, 0x69, 0x81, 0xbf, 0xda, 0xd6, 0x5a,
- 0x70, 0x35, 0x24, 0xa8, 0x0c, 0x69, 0xd0, 0xa4, 0xd6, 0x16, 0xba, 0xa3, 0x38, 0xa1, 0xda, 0xa7,
- 0x48, 0x5e, 0x0e, 0xe8, 0x65, 0x01, 0x37, 0xd2, 0x82, 0xf3, 0x8b, 0x5a, 0x70, 0x61, 0x1e, 0x0b,
- 0x2e, 0xbe, 0x8a, 0x05, 0x97, 0xc6, 0x2c, 0xf8, 0x18, 0x96, 0xc6, 0x92, 0x5c, 0xd7, 0x1c, 0x84,
- 0x89, 0xe6, 0x10, 0x9f, 0x6c, 0x0e, 0x09, 0x9f, 0x39, 0x48, 0x3f, 0x09, 0x50, 0x8d, 0xce, 0x75,
- 0x27, 0x7e, 0xe0, 0x1d, 0xb8, 0xe2, 0xe5, 0x3c, 0xfe, 0x75, 0x64, 0x71, 0x05, 0xb9, 0x9d, 0xde,
- 0x42, 0x4e, 0xc9, 0x0f, 0xd8, 0x98, 0x92, 0x7e, 0x13, 0x7d, 0x02, 0xe5, 0x60, 0x96, 0x4e, 0x92,
- 0x20, 0x72, 0x5c, 0xfe, 0x68, 0xec, 0xb8, 0x78, 0x6b, 0xe1, 0x8e, 0x59, 0x2e, 0x5d, 0xf8, 0x9b,
- 0x96, 0xf4, 0x6f, 0x71, 0x37, 0x07, 0x08, 0xa4, 0xdc, 0xe8, 0x03, 0x48, 0xf3, 0x93, 0x2d, 0xcc,
- 0x7b, 0xb2, 0xb9, 0x40, 0xf8, 0x34, 0xc7, 0x5f, 0xed, 0x34, 0x27, 0x26, 0x6e, 0x5f, 0x72, 0xf2,
- 0x52, 0xa5, 0xfc, 0x4b, 0xf5, 0x16, 0xa4, 0x58, 0x10, 0x66, 0x01, 0xe5, 0xda, 0xf8, 0xb9, 0x60,
- 0xf1, 0x97, 0x71, 0xa1, 0x1a, 0x64, 0x59, 0x3e, 0xaf, 0x75, 0xb8, 0x03, 0xb8, 0x1e, 0x21, 0xb1,
- 0xb3, 0xbd, 0x95, 0x7f, 0xf9, 0x62, 0x2d, 0xc3, 0x1b, 0x72, 0x86, 0xca, 0xed, 0x74, 0xa4, 0xbf,
- 0x05, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x2d, 0xc8, 0xe1, 0x51, 0x1b, 0x1b, 0xb6, 0x73,
- 0x77, 0x98, 0x7c, 0x37, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19, 0x93, 0x3d, 0x31, 0xf4, 0x80, 0x63,
- 0x33, 0xd1, 0x30, 0x0b, 0x17, 0xf7, 0x83, 0x33, 0xef, 0x39, 0xe0, 0x0c, 0x0b, 0xf4, 0xab, 0x91,
- 0x52, 0x21, 0x74, 0xe6, 0x01, 0x47, 0x67, 0x92, 0x33, 0x3e, 0x16, 0x80, 0x67, 0xea, 0x01, 0x78,
- 0x26, 0x35, 0x63, 0x9a, 0x11, 0xf8, 0xcc, 0x7b, 0x0e, 0x3e, 0x93, 0x9e, 0x31, 0xe2, 0x10, 0x40,
- 0xf3, 0xf1, 0x18, 0x40, 0xb3, 0x1e, 0x29, 0x3a, 0x01, 0xa1, 0x39, 0x18, 0x43, 0x68, 0xb2, 0x54,
- 0xc9, 0xef, 0x23, 0x95, 0xcc, 0x80, 0x68, 0x0e, 0xc6, 0x20, 0x9a, 0xdc, 0x0c, 0x85, 0x33, 0x30,
- 0x9a, 0xbf, 0x98, 0x8c, 0xd1, 0x40, 0x24, 0x8a, 0xc2, 0x87, 0x39, 0x1f, 0x48, 0xa3, 0x44, 0x80,
- 0x34, 0xf9, 0xc8, 0x7b, 0x3f, 0x53, 0x3f, 0x37, 0x4a, 0xf3, 0xe9, 0x24, 0x94, 0x66, 0x29, 0x12,
- 0x60, 0xe2, 0x56, 0x39, 0x0f, 0x4c, 0x73, 0x3c, 0x01, 0xa6, 0x29, 0x44, 0xc2, 0x3f, 0x4c, 0xf1,
- 0x1c, 0x38, 0xcd, 0xf1, 0x04, 0x9c, 0xa6, 0x38, 0x53, 0xed, 0x4c, 0xa0, 0xe6, 0x51, 0x10, 0xa8,
- 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x46, 0x21, 0x35, 0x0c, 0xa1, 0x7a,
- 0x33, 0x52, 0xe3, 0x02, 0x50, 0xcd, 0xc1, 0x18, 0x54, 0x23, 0xce, 0xb0, 0xe1, 0x39, 0xb1, 0x1a,
- 0xe9, 0x75, 0x12, 0xa5, 0x43, 0xee, 0x8e, 0xb8, 0x6e, 0x6c, 0x9a, 0xba, 0xc9, 0xd1, 0x15, 0xd6,
- 0x90, 0xee, 0x92, 0xbb, 0xb6, 0xe7, 0xda, 0xa6, 0xe0, 0x37, 0x65, 0x28, 0x06, 0xdc, 0x99, 0xf4,
- 0x8f, 0x82, 0x27, 0x4b, 0x11, 0x1c, 0xff, 0x3d, 0x3d, 0xc7, 0xef, 0xe9, 0xa1, 0xbb, 0x65, 0x2e,
- 0x90, 0x6b, 0xf8, 0xb3, 0x19, 0x0e, 0xd8, 0xa8, 0x5e, 0x16, 0x73, 0x0f, 0x96, 0x68, 0xde, 0xcb,
- 0x62, 0x45, 0x20, 0x1c, 0x95, 0x49, 0x07, 0x5b, 0x05, 0x16, 0x97, 0xde, 0x82, 0x65, 0x1f, 0xaf,
- 0x7b, 0x39, 0x66, 0xa8, 0x85, 0xe8, 0x72, 0xd7, 0xf8, 0x2d, 0xf9, 0x5f, 0x12, 0xde, 0x0a, 0x79,
- 0x48, 0xcf, 0x24, 0x50, 0x46, 0xf8, 0xd5, 0xa0, 0x4c, 0xf4, 0x25, 0x1d, 0x7d, 0x0e, 0x2b, 0x01,
- 0xbc, 0xc6, 0x49, 0x2b, 0x13, 0x8b, 0xc1, 0x36, 0x31, 0x5f, 0x96, 0xe3, 0xf6, 0xa0, 0x2f, 0xe0,
- 0x06, 0x4d, 0x90, 0x23, 0x52, 0xd7, 0xe4, 0x7c, 0xa9, 0xeb, 0x35, 0xa2, 0xa3, 0x3e, 0x21, 0x7d,
- 0x8d, 0x00, 0x73, 0x52, 0x11, 0x60, 0x0e, 0xda, 0x83, 0xc2, 0x39, 0x1e, 0x60, 0x4b, 0xb3, 0x94,
- 0x05, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef, 0xdf, 0x08, 0xc2,
- 0x56, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a, 0xd4, 0xd6, 0x3b,
- 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x3d, 0xfd, 0x9c, 0x5b, 0x20, 0xf9, 0x49, 0xb8,
- 0xdc, 0x02, 0x49, 0x8e, 0x47, 0xd8, 0x15, 0x48, 0x69, 0x83, 0x0e, 0x1e, 0x71, 0x23, 0x63, 0x0d,
- 0x22, 0xfb, 0x0c, 0x5f, 0x72, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74, 0x2e, 0x05, 0x99,
- 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0x55, 0x2e, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03, 0xa9, 0x1c, 0xab,
- 0x48, 0x6d, 0x1c, 0x12, 0x9e, 0x03, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b, 0xb6, 0xb2, 0x81,
- 0x64, 0xeb, 0x26, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72, 0xb2, 0x47, 0x90,
- 0xfe, 0x49, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9c, 0xbb, 0x73, 0x2a, 0xe3, 0x41, 0xf4, 0x6c, 0x6c,
- 0xf6, 0xb7, 0x00, 0xce, 0x55, 0x4b, 0x79, 0xae, 0x0e, 0x6c, 0xdc, 0xe1, 0x4b, 0x90, 0x3b, 0x57,
- 0xad, 0xa7, 0x94, 0x10, 0x1c, 0x4c, 0x2a, 0x34, 0x18, 0x1f, 0x7e, 0x93, 0xf6, 0xe3, 0x37, 0xa8,
- 0x0a, 0x59, 0xc3, 0xd4, 0x74, 0x53, 0xb3, 0x2f, 0xe9, 0x9a, 0x24, 0x64, 0xb7, 0x2d, 0x1d, 0xc2,
- 0x95, 0x89, 0xd1, 0x1e, 0x3d, 0x84, 0x9c, 0x97, 0x28, 0x08, 0x34, 0xa9, 0x9d, 0x02, 0x8b, 0x79,
- 0xbc, 0x64, 0x49, 0xae, 0x4c, 0x8c, 0xf7, 0xa8, 0x01, 0x69, 0x13, 0x5b, 0xc3, 0x1e, 0x4b, 0xb2,
- 0x4b, 0xf7, 0xdf, 0x9a, 0x2f, 0x4f, 0x20, 0xd4, 0x61, 0xcf, 0x96, 0xb9, 0xb0, 0xf4, 0x25, 0xa4,
- 0x19, 0x05, 0xe5, 0x21, 0x73, 0xbc, 0xff, 0x78, 0xff, 0xe0, 0xe9, 0xbe, 0x18, 0x43, 0x00, 0xe9,
- 0x5a, 0xbd, 0xde, 0x38, 0x6c, 0x89, 0x02, 0xca, 0x41, 0xaa, 0xb6, 0x75, 0x20, 0xb7, 0xc4, 0x38,
- 0x21, 0xcb, 0x8d, 0xdd, 0x46, 0xbd, 0x25, 0x26, 0xd0, 0x12, 0x14, 0xd9, 0x6f, 0xe5, 0xd1, 0x81,
- 0xfc, 0xa4, 0xd6, 0x12, 0x93, 0x3e, 0xd2, 0x51, 0x63, 0x7f, 0xbb, 0x21, 0x8b, 0x29, 0xe9, 0x1d,
- 0xb8, 0x1e, 0x99, 0x59, 0x78, 0xc8, 0x99, 0xe0, 0x43, 0xce, 0xa4, 0x1f, 0xe3, 0xe4, 0xea, 0x14,
- 0x95, 0x2e, 0xa0, 0xdd, 0xd0, 0xc4, 0xef, 0x2f, 0x90, 0x6b, 0x84, 0x66, 0x8f, 0x5e, 0x83, 0x92,
- 0x89, 0xcf, 0xb0, 0xdd, 0xee, 0xb2, 0xf4, 0xc5, 0x01, 0xc0, 0x8a, 0x9c, 0x4a, 0x85, 0x2c, 0xc6,
- 0xf6, 0x15, 0x6e, 0xdb, 0x0a, 0x33, 0x02, 0x8b, 0xc2, 0x0c, 0x39, 0xc2, 0x46, 0xa8, 0x47, 0x8c,
- 0x48, 0xfc, 0x3f, 0xf3, 0x53, 0x4c, 0x55, 0x92, 0xaa, 0x02, 0xea, 0x76, 0x28, 0x45, 0x7a, 0xbe,
- 0xd0, 0x62, 0xe7, 0x20, 0x25, 0x37, 0x5a, 0xf2, 0x67, 0x62, 0x02, 0x21, 0x28, 0xd1, 0x9f, 0xca,
- 0xd1, 0x7e, 0xed, 0xf0, 0xa8, 0x79, 0x40, 0x16, 0x7b, 0x19, 0xca, 0xce, 0x62, 0x3b, 0xc4, 0x14,
- 0xba, 0x02, 0x4b, 0xf5, 0x83, 0x27, 0x87, 0x7b, 0x8d, 0x56, 0xc3, 0x23, 0xa7, 0xa5, 0x2a, 0x54,
- 0xa2, 0x52, 0x24, 0xe9, 0x3f, 0x12, 0x70, 0x2d, 0x22, 0xcd, 0x41, 0xef, 0x03, 0xd8, 0x23, 0xc5,
- 0xc4, 0x6d, 0xdd, 0xec, 0x44, 0x1b, 0x6e, 0x6b, 0x24, 0x53, 0x0e, 0x39, 0x67, 0xf3, 0x5f, 0x53,
- 0x63, 0xc5, 0x47, 0x5c, 0x29, 0x59, 0x08, 0x8b, 0x03, 0x36, 0xb7, 0x26, 0xdc, 0x40, 0x71, 0x9b,
- 0x28, 0xa6, 0xfb, 0x45, 0x15, 0x53, 0x7e, 0xf4, 0x19, 0x5c, 0x0b, 0x85, 0x34, 0x1e, 0x07, 0xac,
- 0x49, 0x05, 0xde, 0xc9, 0x91, 0xed, 0x4a, 0x30, 0xb2, 0xb1, 0x38, 0x60, 0x4d, 0x41, 0x47, 0x52,
- 0xaf, 0x80, 0x8e, 0x44, 0x85, 0xc6, 0xf4, 0xa2, 0x15, 0x8d, 0x49, 0xa1, 0x31, 0x94, 0x72, 0x64,
- 0xc2, 0x29, 0x87, 0xf4, 0xbf, 0x81, 0xdd, 0x0d, 0xa6, 0x96, 0x07, 0x90, 0xb6, 0x6c, 0xd5, 0x1e,
- 0x5a, 0xfc, 0x24, 0x3d, 0x9c, 0x37, 0x4f, 0xdd, 0x70, 0x7e, 0x1c, 0x51, 0x71, 0x99, 0xab, 0xf9,
- 0x83, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x16, 0xdb, 0xd3, 0x84, 0x34, 0xbe, 0xc0, 0x03, 0xdb,
- 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x8e, 0xcf, 0x98, 0x74, 0x6f, 0x55, 0x48, 0xee, 0xf3, 0xdf, 0x2f,
- 0xd6, 0x44, 0xc6, 0xfd, 0xa6, 0xde, 0xd7, 0x6c, 0xdc, 0x37, 0xec, 0x4b, 0x99, 0xcb, 0x4b, 0xef,
- 0x42, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0x1f, 0x04, 0x58, 0x9e, 0x80,
- 0xe5, 0xa0, 0x87, 0xbc, 0x10, 0xc4, 0x36, 0xfe, 0xf6, 0xf8, 0xea, 0x05, 0xd8, 0xbd, 0x7a, 0x10,
- 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0x6f, 0x40, 0xd9, 0xd2, 0xce, 0x07, 0x8a,
- 0xc9, 0x60, 0x21, 0xb7, 0xc8, 0x42, 0x32, 0x7b, 0xd2, 0xe1, 0x94, 0x22, 0x3b, 0x24, 0xf3, 0x41,
- 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xfc, 0x26, 0x33, 0x09, 0xb8, 0x12, 0x5e, 0x01, 0xb8,
- 0xfa, 0x7b, 0x01, 0x6e, 0x4c, 0xb9, 0xdd, 0xa0, 0x4f, 0x42, 0xe7, 0xe2, 0x83, 0x45, 0xee, 0x46,
- 0x1b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x03, 0x28, 0xf8, 0xe9, 0xf3, 0x6d, 0xde, 0xae, 0x17, 0xfb,
- 0x83, 0x00, 0xdb, 0x6d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16, 0x18, 0x91, 0xa5,
- 0xa9, 0xbb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43, 0xdd, 0x3c, 0xd4,
- 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x1d, 0x28, 0xb3, 0xfb, 0x08,
- 0xd9, 0x37, 0xd5, 0x1e, 0x9a, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x72, 0xa8, 0xe8, 0x73, 0xb8,
- 0x6e, 0x77, 0x4d, 0x6c, 0x75, 0xf5, 0x5e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd, 0xac, 0xcd, 0x30,
- 0x3a, 0xf9, 0x9a, 0xab, 0xe1, 0x24, 0xb8, 0x7f, 0xdf, 0x40, 0x8a, 0x1e, 0x1b, 0x92, 0xf4, 0xb9,
- 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x05, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3a, 0x24, 0xde, 0x21, 0x3e,
- 0xfe, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0xad, 0x9b, 0xfc, 0xfc, 0xad, 0x78, 0xa2, 0xbe, 0x33,
- 0xe8, 0x53, 0x28, 0xed, 0x43, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1, 0x6c, 0x9a, 0x65,
- 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xd9, 0xd2, 0x86, 0xf4, 0x8b, 0x00, 0x05, 0xbf,
- 0xd7, 0x9b, 0x3b, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xf8, 0x05, 0x20, 0xe9, 0x4b, 0x81, 0xaf, 0x43,
- 0x96, 0xa4, 0xc0, 0x43, 0x0b, 0x77, 0x78, 0x25, 0x3b, 0x73, 0xae, 0x5a, 0xc7, 0x16, 0xee, 0xf8,
- 0x7c, 0x53, 0xe6, 0xd5, 0x7c, 0x53, 0x30, 0x91, 0xce, 0x86, 0x12, 0xe9, 0xdd, 0x64, 0x36, 0x25,
- 0xa6, 0x65, 0x5f, 0x26, 0x2e, 0xfd, 0xb5, 0x00, 0x59, 0x77, 0xbe, 0xc1, 0x12, 0x6e, 0x00, 0x97,
- 0x65, 0xcb, 0xc5, 0x0a, 0xb8, 0xfc, 0xea, 0xc2, 0x0a, 0xda, 0x09, 0xb7, 0xa0, 0xfd, 0xa1, 0x9b,
- 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x1d, 0x1f, 0x07, 0xc9,
- 0x58, 0xd0, 0x9f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x02, 0x10, 0xe9, 0xb0, 0x6e, 0xb4,
- 0x46, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0x69, 0x8f, 0xe8, 0x65, 0x3c,
- 0xc1, 0x93, 0x5e, 0x02, 0x38, 0xde, 0x7f, 0x72, 0xb0, 0xbd, 0xf3, 0x68, 0xa7, 0xb1, 0xcd, 0xb3,
- 0xbd, 0xed, 0xed, 0xc6, 0xb6, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xc9, 0xc1, 0x49, 0x63, 0x5b, 0x4c,
- 0x90, 0xc6, 0x76, 0x63, 0xaf, 0xf6, 0x59, 0x63, 0x5b, 0x4c, 0x4a, 0x35, 0xc8, 0xb9, 0x41, 0x87,
- 0x56, 0xfe, 0xf5, 0xe7, 0xd8, 0xe4, 0xab, 0xc5, 0x1a, 0x68, 0x15, 0xf2, 0xe3, 0x05, 0x03, 0x72,
- 0x79, 0x63, 0x75, 0x02, 0x12, 0x06, 0xca, 0xae, 0x0e, 0x1e, 0x9b, 0x3e, 0x84, 0x8c, 0x31, 0x3c,
- 0x55, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x78, 0xda, 0xd3, 0xda, 0x8f, 0xf1, 0x25,
- 0x0f, 0x72, 0x69, 0x63, 0x78, 0xfa, 0x98, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xca, 0x30, 0x12, 0xa1,
- 0x61, 0xa0, 0x3b, 0x50, 0x18, 0xe8, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d, 0x16, 0xbb, 0x73,
- 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x93, 0x00, 0x68, 0x3c, 0xd0, 0xa2, 0x23, 0x58,
- 0xf2, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x1e, 0x1d, 0xa8, 0x03, 0xf8, 0x82, 0x78, 0x11,
- 0x24, 0x93, 0xac, 0x6f, 0xc5, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8, 0x9c, 0x8b, 0x12,
- 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xac, 0xee, 0x64, 0x40, 0xa5, 0x35, 0x26,
- 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x55, 0x86, 0x24, 0x3d, 0x00, 0xf1, 0x13, 0xf7, 0xfb, 0x5e,
- 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x36, 0xcc, 0x0b, 0xc8, 0x12, 0xef, 0x4b, 0x83, 0xc6, 0x9f, 0x42,
- 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8, 0x1e, 0x2c, 0x91,
- 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0xf6, 0x1c, 0x58, 0x8b,
- 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85, 0x80, 0x52, 0xb6,
- 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa, 0xe3, 0x40, 0x62,
- 0xb5, 0x3e, 0xad, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3e, 0xb1, 0xa8, 0x3a, 0xa0,
- 0x53, 0x94, 0x4e, 0x2e, 0x5c, 0x94, 0x7e, 0x13, 0x90, 0xad, 0xdb, 0x6a, 0x8f, 0x04, 0x6f, 0x6d,
- 0x70, 0xae, 0xb0, 0xd3, 0xce, 0x0a, 0xe1, 0x22, 0xed, 0x39, 0xa1, 0x1d, 0x87, 0x84, 0x2e, 0xf5,
- 0x20, 0xeb, 0x02, 0x13, 0x8b, 0xbf, 0xc9, 0x99, 0x54, 0x7c, 0xaf, 0x42, 0xb6, 0x8f, 0x6d, 0x95,
- 0x86, 0x3d, 0x06, 0x54, 0xb9, 0xed, 0x7b, 0x1f, 0x40, 0xde, 0xf7, 0x50, 0x89, 0x44, 0xc2, 0xfd,
- 0xc6, 0x53, 0x31, 0x56, 0xcd, 0x7c, 0xfb, 0xfd, 0x7a, 0x62, 0x1f, 0x3f, 0x27, 0x9f, 0x92, 0x1b,
- 0xf5, 0x66, 0xa3, 0xfe, 0x58, 0x14, 0xaa, 0xf9, 0x6f, 0xbf, 0x5f, 0xcf, 0xc8, 0x98, 0x16, 0x6e,
- 0xee, 0x3d, 0x86, 0x72, 0x68, 0x07, 0x82, 0x0e, 0x1a, 0x41, 0x69, 0xfb, 0xf8, 0x70, 0x6f, 0xa7,
- 0x5e, 0x6b, 0x35, 0x94, 0x93, 0x83, 0x56, 0x43, 0x14, 0xd0, 0x35, 0x58, 0xde, 0xdb, 0xf9, 0xb3,
- 0x66, 0x4b, 0xa9, 0xef, 0xed, 0x34, 0xf6, 0x5b, 0x4a, 0xad, 0xd5, 0xaa, 0xd5, 0x1f, 0x8b, 0xf1,
- 0xfb, 0xff, 0x09, 0x50, 0xae, 0x6d, 0xd5, 0x77, 0x6a, 0x86, 0xd1, 0xd3, 0xda, 0x2a, 0x75, 0xf7,
- 0x75, 0x48, 0x52, 0xd4, 0x79, 0xea, 0x5b, 0xe8, 0xea, 0xf4, 0x6a, 0x1c, 0x7a, 0x04, 0x29, 0x0a,
- 0x48, 0xa3, 0xe9, 0x8f, 0xa3, 0xab, 0x33, 0xca, 0x73, 0x64, 0x30, 0xf4, 0xdc, 0x4c, 0x7d, 0x2d,
- 0x5d, 0x9d, 0x5e, 0xad, 0x43, 0x7b, 0x90, 0x71, 0xc0, 0xb8, 0x59, 0x4f, 0x98, 0xab, 0x33, 0x4b,
- 0x68, 0x64, 0x6a, 0x0c, 0xd4, 0x9c, 0xfe, 0x90, 0xba, 0x3a, 0xa3, 0x8e, 0x87, 0x64, 0xc8, 0x79,
- 0x30, 0xf7, 0xec, 0x37, 0xdd, 0xd5, 0x39, 0xea, 0x8a, 0xe8, 0x4b, 0x28, 0x06, 0x61, 0xbb, 0xf9,
- 0x9e, 0x5b, 0x57, 0xe7, 0xac, 0xf9, 0x11, 0xfd, 0x41, 0x0c, 0x6f, 0xbe, 0xe7, 0xd7, 0xd5, 0x39,
- 0x4b, 0x80, 0xe8, 0x2b, 0x58, 0x1a, 0xc7, 0xd8, 0xe6, 0x7f, 0x8d, 0x5d, 0x5d, 0xa0, 0x28, 0x88,
- 0xfa, 0x80, 0x26, 0x60, 0x73, 0x0b, 0x3c, 0xce, 0xae, 0x2e, 0x52, 0x23, 0x44, 0x1d, 0x28, 0x87,
- 0xb1, 0xa9, 0x79, 0xdf, 0x54, 0x57, 0xe7, 0xae, 0xea, 0xb1, 0xaf, 0x04, 0x31, 0x92, 0x79, 0xdf,
- 0x58, 0x57, 0xe7, 0x2e, 0xf2, 0xa1, 0x63, 0x00, 0xdf, 0xdd, 0x76, 0x8e, 0x37, 0xd7, 0xd5, 0x79,
- 0xca, 0x7d, 0xc8, 0x80, 0xe5, 0x49, 0x97, 0xd9, 0x45, 0x9e, 0x60, 0x57, 0x17, 0xaa, 0x02, 0x12,
- 0x7b, 0x0e, 0xde, 0x4b, 0xe7, 0x7b, 0x92, 0x5d, 0x9d, 0xb3, 0x1c, 0xb8, 0xb5, 0xf5, 0xc3, 0xcb,
- 0x55, 0xe1, 0xc7, 0x97, 0xab, 0xc2, 0x4f, 0x2f, 0x57, 0x85, 0xef, 0x7e, 0x5e, 0x8d, 0xfd, 0xf8,
- 0xf3, 0x6a, 0xec, 0xdf, 0x7f, 0x5e, 0x8d, 0xfd, 0xf9, 0xdd, 0x73, 0xcd, 0xee, 0x0e, 0x4f, 0x37,
- 0xda, 0x7a, 0x9f, 0xfe, 0xd5, 0xc6, 0x50, 0x2f, 0x37, 0x99, 0x4e, 0xd2, 0xf2, 0xfd, 0xa1, 0xe7,
- 0x34, 0x4d, 0x63, 0xdd, 0x83, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x98, 0x78, 0x79, 0x4b, 0xf0,
- 0x33, 0x00, 0x00,
+ // 3796 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
+ 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0x90, 0x44, 0x72, 0x47, 0xf1, 0x4a,
+ 0xab, 0xb5, 0x49, 0xaf, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
+ 0x3d, 0x04, 0xa9, 0x75, 0x1c, 0x7b, 0x6a, 0x08, 0x3c, 0x02, 0x63, 0x01, 0x98, 0xf1, 0xcc, 0x80,
+ 0x02, 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x5b,
+ 0xe2, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x55, 0x8a, 0x4b, 0xbe, 0xe5, 0xe6, 0x53, 0x2e, 0x39, 0xa4,
+ 0xde, 0xcf, 0xfc, 0x02, 0x83, 0x1f, 0xcb, 0x55, 0xa9, 0xbd, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
+ 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xb7, 0x6c, 0x3c, 0xec, 0x60, 0x73, 0xa0, 0x0d, 0xed, 0x6d,
+ 0xf5, 0xbc, 0xad, 0x6d, 0xdb, 0x57, 0x06, 0xb6, 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0x54, 0xf6, 0x3a,
+ 0xb7, 0x48, 0x67, 0xf5, 0x8e, 0x8f, 0xbb, 0x6d, 0x5e, 0x19, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0x7e,
+ 0xc1, 0xf8, 0xab, 0x7e, 0x65, 0x54, 0xcf, 0x76, 0x47, 0xb5, 0x7a, 0xbc, 0xf3, 0xf6, 0x44, 0xe7,
+ 0x79, 0x5f, 0x6f, 0xbf, 0x88, 0xec, 0xf5, 0x0d, 0x24, 0xd0, 0xcb, 0xbf, 0xfb, 0x02, 0x5f, 0x39,
+ 0xbd, 0x77, 0x26, 0x64, 0x0d, 0xd5, 0x54, 0x07, 0x4e, 0xf7, 0xba, 0xaf, 0xfb, 0x12, 0x9b, 0x96,
+ 0xa6, 0x0f, 0x03, 0xca, 0x37, 0xba, 0xba, 0xde, 0xed, 0xe3, 0x6d, 0xda, 0x3a, 0x1f, 0x5d, 0x6c,
+ 0xdb, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x5a, 0x57, 0xef, 0xea, 0xf4, 0xe7, 0x36,
+ 0xf9, 0xc5, 0xa8, 0xd2, 0xab, 0x1c, 0x64, 0x64, 0xfc, 0xf9, 0x08, 0x5b, 0x36, 0x7a, 0x08, 0x49,
+ 0xdc, 0xee, 0xe9, 0x15, 0x61, 0x53, 0xb8, 0x9f, 0x7f, 0x78, 0x7b, 0x2b, 0xb4, 0x6e, 0x5b, 0x9c,
+ 0xaf, 0xd1, 0xee, 0xe9, 0xcd, 0x98, 0x4c, 0x79, 0xd1, 0x7b, 0x90, 0xba, 0xe8, 0x8f, 0xac, 0x5e,
+ 0x25, 0x4e, 0x85, 0xee, 0x44, 0x09, 0x3d, 0x21, 0x4c, 0xcd, 0x98, 0xcc, 0xb8, 0xc9, 0xa7, 0xb4,
+ 0xe1, 0x85, 0x5e, 0x49, 0xcc, 0xfe, 0xd4, 0xde, 0xf0, 0x82, 0x7e, 0x8a, 0xf0, 0xa2, 0x1d, 0x00,
+ 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, 0x4a, 0x92, 0x4a, 0xfe, 0x2c, 0x5a, 0x52, 0xb3,
+ 0xeb, 0x84, 0xb1, 0x19, 0x93, 0x73, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x7c, 0x84, 0xcd, 0xab, 0x4a,
+ 0x6a, 0xf6, 0x70, 0x3f, 0x24, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xfd, 0x16, 0xb2, 0xed, 0x1e, 0x6e,
+ 0xbf, 0x50, 0xec, 0x71, 0x25, 0x43, 0x25, 0x37, 0xa2, 0x24, 0xeb, 0x84, 0xaf, 0x35, 0x6e, 0xc6,
+ 0xe4, 0x4c, 0x9b, 0xfd, 0x44, 0x87, 0x50, 0xea, 0x6b, 0x96, 0xad, 0x58, 0x43, 0xd5, 0xb0, 0x7a,
+ 0xba, 0x6d, 0x55, 0xf2, 0x54, 0xc7, 0x5b, 0x51, 0x3a, 0x0e, 0x34, 0xcb, 0x3e, 0x71, 0x98, 0x9b,
+ 0x31, 0xb9, 0xd8, 0xf7, 0x13, 0x88, 0x3e, 0xfd, 0xe2, 0x02, 0x9b, 0xae, 0xc2, 0x4a, 0x61, 0xb6,
+ 0xbe, 0x23, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x3e, 0x86, 0xd5, 0xbe, 0xae, 0x76,
+ 0x5c, 0x75, 0x4a, 0xbb, 0x37, 0x1a, 0xbe, 0xa8, 0x14, 0xa9, 0xd2, 0x5f, 0x44, 0x0e, 0x52, 0x57,
+ 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0x95, 0x7e, 0x98, 0x88, 0x3e, 0x85, 0x35, 0xd5,
+ 0x30, 0xfa, 0x57, 0x61, 0xed, 0x25, 0xaa, 0xfd, 0x41, 0x94, 0xf6, 0x1a, 0x91, 0x09, 0xab, 0x47,
+ 0xea, 0x04, 0x15, 0x3d, 0x87, 0x95, 0x0b, 0x6d, 0xa8, 0xf6, 0xb5, 0x2f, 0xb0, 0xb7, 0x1e, 0x6b,
+ 0x54, 0xf9, 0xfd, 0x48, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x02, 0xd1,
+ 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x5f, 0x29, 0x53, 0xbd, 0xf7,
+ 0xa2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x8c, 0xc9, 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5,
+ 0x36, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x03, 0xf2,
+ 0x78, 0x4c, 0xc4, 0x95, 0x4b, 0xdd, 0xc6, 0x95, 0x15, 0xaa, 0x50, 0x8a, 0x3c, 0xc0, 0x94, 0xf5,
+ 0x4c, 0xb7, 0x71, 0x33, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x6b, 0x97, 0xd8, 0xd4, 0x2e, 0xae,
+ 0xa8, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x41, 0x54, 0xe1, 0x2f, 0xa3, 0x14, 0x9e, 0x51, 0x21,
+ 0xa2, 0xa2, 0xe1, 0x88, 0x34, 0x63, 0xf2, 0xea, 0xe5, 0x24, 0x99, 0xd8, 0xae, 0xbb, 0x5d, 0xd4,
+ 0x73, 0x56, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f, 0xb0,
+ 0x93, 0x81, 0xd4, 0xa5, 0xda, 0x1f, 0xe1, 0xfd, 0x64, 0x36, 0x2d, 0x66, 0xf6, 0x93, 0xd9, 0xac,
+ 0x98, 0xdb, 0x4f, 0x66, 0x73, 0x22, 0xec, 0x27, 0xb3, 0x20, 0xe6, 0xa5, 0x7b, 0x90, 0xf7, 0xf9,
+ 0x2d, 0x54, 0x81, 0xcc, 0x00, 0x5b, 0x96, 0xda, 0xc5, 0xd4, 0xcd, 0xe5, 0x64, 0xa7, 0x29, 0x95,
+ 0xa0, 0xe0, 0xf7, 0x55, 0xd2, 0x57, 0x82, 0x2b, 0x49, 0xdc, 0x10, 0x91, 0xe4, 0x7e, 0xd7, 0x91,
+ 0xe4, 0x4d, 0x74, 0x17, 0x8a, 0x74, 0x2a, 0x8a, 0xd3, 0x4f, 0x7c, 0x61, 0x52, 0x2e, 0x50, 0xe2,
+ 0x19, 0x67, 0xda, 0x80, 0xbc, 0xf1, 0xd0, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x87, 0x86, 0xc3,
+ 0xf0, 0x33, 0x28, 0x90, 0x79, 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xaf,
+ 0x12, 0x20, 0x86, 0xfd, 0x1b, 0x7a, 0x1f, 0x92, 0xc4, 0xd5, 0x73, 0xaf, 0x5d, 0xdd, 0x62, 0x71,
+ 0x60, 0xcb, 0x89, 0x03, 0x5b, 0x2d, 0x27, 0x0e, 0xec, 0x64, 0xbf, 0x79, 0xb5, 0x11, 0xfb, 0xea,
+ 0xbf, 0x36, 0x04, 0x99, 0x4a, 0xa0, 0x9b, 0xc4, 0xab, 0xa9, 0xda, 0x50, 0xd1, 0x3a, 0x74, 0xc8,
+ 0x39, 0xe2, 0xb2, 0x54, 0x6d, 0xb8, 0xd7, 0x41, 0x07, 0x20, 0xb6, 0xf5, 0xa1, 0x85, 0x87, 0xd6,
+ 0xc8, 0x52, 0x58, 0x1c, 0xe2, 0xbe, 0x3a, 0xe0, 0x71, 0x59, 0x00, 0xaa, 0x3b, 0x9c, 0xc7, 0x94,
+ 0x51, 0x2e, 0xb7, 0x83, 0x04, 0x74, 0x08, 0xc5, 0x4b, 0xb5, 0xaf, 0x75, 0x54, 0x5b, 0x37, 0x15,
+ 0x0b, 0xdb, 0xdc, 0x79, 0xdf, 0x9d, 0xd8, 0xf3, 0x33, 0x87, 0xeb, 0x04, 0xdb, 0xa7, 0x46, 0x47,
+ 0xb5, 0xf1, 0x4e, 0xf2, 0x9b, 0x57, 0x1b, 0x82, 0x5c, 0xb8, 0xf4, 0xf5, 0xa0, 0x9f, 0x43, 0x59,
+ 0x35, 0x0c, 0xc5, 0xb2, 0x55, 0x1b, 0x2b, 0xe7, 0x57, 0x36, 0xb6, 0xa8, 0x3f, 0x2f, 0xc8, 0x45,
+ 0xd5, 0x30, 0x4e, 0x08, 0x75, 0x87, 0x10, 0xd1, 0x5b, 0x50, 0x22, 0xae, 0x5f, 0x53, 0xfb, 0x4a,
+ 0x0f, 0x6b, 0xdd, 0x9e, 0x5d, 0x49, 0x6f, 0x0a, 0xf7, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88,
+ 0xb6, 0x60, 0xd5, 0x61, 0x6b, 0xeb, 0x26, 0x76, 0x78, 0x89, 0xa3, 0x2f, 0xca, 0x2b, 0xbc, 0xab,
+ 0xae, 0x9b, 0x98, 0xf1, 0x4b, 0x1d, 0xd7, 0x52, 0x68, 0x98, 0x40, 0x08, 0x92, 0x1d, 0xd5, 0x56,
+ 0xe9, 0x0e, 0x14, 0x64, 0xfa, 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf1, 0x75, 0xa5, 0xbf, 0xd1, 0x75,
+ 0x48, 0x73, 0xd5, 0x09, 0x3a, 0x0c, 0xde, 0x42, 0x6b, 0x90, 0x32, 0x4c, 0xfd, 0x12, 0xd3, 0x65,
+ 0xc9, 0xca, 0xac, 0x21, 0xc9, 0x50, 0x0a, 0x86, 0x14, 0x54, 0x82, 0xb8, 0x3d, 0xe6, 0x5f, 0x89,
+ 0xdb, 0x63, 0xf4, 0x2e, 0x24, 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0xa6, 0x04, 0x51, 0x2e, 0xd7, 0xba,
+ 0x32, 0xb0, 0x4c, 0x39, 0xa5, 0xeb, 0xb0, 0x36, 0x2d, 0xc4, 0x48, 0x3d, 0x97, 0x1e, 0x08, 0x15,
+ 0xe8, 0x3d, 0xc8, 0xba, 0x3e, 0x95, 0xd9, 0xd7, 0xcd, 0x89, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a,
+ 0x0c, 0x8b, 0xec, 0x4f, 0x4f, 0xe5, 0x79, 0x41, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0x9e,
+ 0xd4, 0x85, 0x4a, 0x54, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17,
+ 0xa7, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xa3, 0xe1, 0x0b, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda,
+ 0xde, 0xeb, 0x48, 0x1d, 0xb8, 0x19, 0x19, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x0b,
+ 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e,
+ 0x0f, 0x37, 0x22, 0x62, 0x0a, 0xfa, 0x1d, 0xe4, 0xfb, 0x64, 0xf8, 0xdc, 0xcd, 0x4d, 0x49, 0xaa,
+ 0xd8, 0xe9, 0x39, 0x20, 0x4c, 0xd4, 0x99, 0xc9, 0xd0, 0x77, 0x7f, 0x4b, 0x3f, 0x24, 0xe1, 0xfa,
+ 0xf4, 0xb0, 0x82, 0x36, 0xa1, 0x30, 0x50, 0xc7, 0x8a, 0x3d, 0xe6, 0xb6, 0x2f, 0x50, 0x6b, 0x82,
+ 0x81, 0x3a, 0x6e, 0x8d, 0x99, 0xe1, 0x8b, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe, 0x99, 0xb8, 0x5f,
+ 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5, 0xb2, 0x95, 0xb6,
+ 0x3e, 0x18, 0x68, 0x36, 0x3f, 0xd1, 0xb7, 0x26, 0x0d, 0x87, 0x76, 0x13, 0xaf, 0x47, 0x8f, 0x5f,
+ 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40, 0xb3, 0xce, 0x71,
+ 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0xe3, 0x9e, 0x79, 0x3c, 0x5c, 0x93,
+ 0x5f, 0xcc, 0xb7, 0xe1, 0xa9, 0xc0, 0x81, 0x70, 0x5c, 0x5a, 0x7a, 0x69, 0x97, 0xf6, 0x2e, 0xac,
+ 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0x77, 0x61, 0x31, 0x2b, 0xcc, 0xd0, 0xcd, 0x44, 0xa4, 0xcf, 0xf5,
+ 0x31, 0x16, 0x31, 0x48, 0xb2, 0xdf, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d, 0xe1, 0x7e, 0x4a,
+ 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0x15, 0x30, 0xff, 0x48, 0x36, 0x04, 0x77, 0x1c, 0xbf, 0x90,
+ 0xa3, 0x36, 0x78, 0x8d, 0xf4, 0x53, 0x0f, 0x7c, 0x40, 0x7b, 0xb9, 0x2f, 0xd9, 0x86, 0x35, 0x16,
+ 0xd7, 0xb1, 0x49, 0x02, 0x3c, 0xd9, 0x24, 0x3a, 0x00, 0xa0, 0x03, 0x58, 0x71, 0xfa, 0x8e, 0x4d,
+ 0xbd, 0x35, 0xa6, 0xdf, 0x7f, 0xd7, 0x15, 0xe8, 0x28, 0xe4, 0xd0, 0x38, 0x96, 0x9e, 0xa7, 0x47,
+ 0x00, 0x39, 0x7d, 0x35, 0xc3, 0x0d, 0x14, 0x8f, 0xbd, 0xe3, 0x50, 0x98, 0xcc, 0x62, 0x79, 0x97,
+ 0xe7, 0x94, 0xbd, 0xd3, 0xb2, 0x01, 0xf9, 0xcf, 0x47, 0xba, 0x39, 0x1a, 0xb0, 0x21, 0x15, 0xe9,
+ 0x90, 0x80, 0x91, 0xe8, 0xe1, 0xfc, 0xe7, 0x94, 0xcf, 0xe6, 0x82, 0x19, 0x06, 0xb7, 0x28, 0xc1,
+ 0xb3, 0xa8, 0x13, 0xdf, 0xc0, 0xfd, 0x46, 0x15, 0x5f, 0xd4, 0xa8, 0xdc, 0xb9, 0x45, 0xdb, 0x55,
+ 0xe2, 0xc7, 0xd9, 0x15, 0x82, 0x24, 0x9d, 0x61, 0x92, 0x39, 0x64, 0xf2, 0x3b, 0xd2, 0xd6, 0xdc,
+ 0xfd, 0x4f, 0xfb, 0xf7, 0xdf, 0xb1, 0xc0, 0xcc, 0x4f, 0x66, 0x81, 0xd9, 0x48, 0x0b, 0xfc, 0xd1,
+ 0xb6, 0xd6, 0x82, 0xeb, 0x21, 0x41, 0x65, 0x44, 0x83, 0x26, 0xb5, 0xb6, 0xd0, 0x1d, 0xc5, 0x09,
+ 0xd5, 0x3e, 0x45, 0xf2, 0x6a, 0x40, 0x2f, 0x0b, 0xb8, 0x91, 0x16, 0x9c, 0x5f, 0xd6, 0x82, 0x0b,
+ 0x8b, 0x58, 0x70, 0xf1, 0x4d, 0x2c, 0xb8, 0x34, 0x61, 0xc1, 0xa7, 0xb0, 0x32, 0x91, 0xe4, 0xba,
+ 0xe6, 0x20, 0x4c, 0x35, 0x87, 0xf8, 0x74, 0x73, 0x48, 0xf8, 0xcc, 0x41, 0xfa, 0x4e, 0x80, 0x6a,
+ 0x74, 0xae, 0x3b, 0xf5, 0x03, 0xbf, 0x82, 0x6b, 0x5e, 0xce, 0xe3, 0x5f, 0x47, 0x16, 0x57, 0x90,
+ 0xdb, 0xe9, 0x2d, 0xe4, 0x8c, 0xfc, 0x80, 0x8d, 0x29, 0xe9, 0x37, 0xd1, 0x67, 0x50, 0x0e, 0x66,
+ 0xe9, 0x24, 0x09, 0x22, 0xc7, 0xe5, 0x8f, 0x26, 0x8e, 0x8b, 0xb7, 0x16, 0xee, 0x98, 0xe5, 0xd2,
+ 0xa5, 0xbf, 0x69, 0x49, 0xff, 0x1e, 0x77, 0x73, 0x80, 0x40, 0xca, 0x8d, 0x3e, 0x80, 0x34, 0x3f,
+ 0xd9, 0xc2, 0xa2, 0x27, 0x9b, 0x0b, 0x84, 0x4f, 0x73, 0xfc, 0xcd, 0x4e, 0x73, 0x62, 0xea, 0xf6,
+ 0x25, 0xa7, 0x2f, 0x55, 0xca, 0xbf, 0x54, 0xef, 0x40, 0x8a, 0x05, 0x61, 0x16, 0x50, 0x6e, 0x4c,
+ 0x9e, 0x0b, 0x16, 0x7f, 0x19, 0x17, 0xaa, 0x41, 0x96, 0xe5, 0xf3, 0x5a, 0x87, 0x3b, 0x80, 0x9b,
+ 0x11, 0x12, 0x7b, 0xbb, 0x3b, 0xf9, 0xd7, 0xaf, 0x36, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x5e,
+ 0x47, 0xfa, 0x5b, 0x80, 0xac, 0x8c, 0x2d, 0x83, 0x98, 0x30, 0xda, 0x81, 0x1c, 0x1e, 0xb7, 0xb1,
+ 0x61, 0x3b, 0x77, 0x87, 0xe9, 0x77, 0x33, 0xc6, 0xdd, 0x70, 0x38, 0x9b, 0x31, 0xd9, 0x13, 0x43,
+ 0x8f, 0x38, 0x36, 0x13, 0x0d, 0xb3, 0x70, 0x71, 0x3f, 0x38, 0xf3, 0x6b, 0x07, 0x9c, 0x61, 0x81,
+ 0x7e, 0x3d, 0x52, 0x2a, 0x84, 0xce, 0x3c, 0xe2, 0xe8, 0x4c, 0x72, 0xce, 0xc7, 0x02, 0xf0, 0x4c,
+ 0x3d, 0x00, 0xcf, 0xa4, 0xe6, 0x4c, 0x33, 0x02, 0x9f, 0xf9, 0xb5, 0x83, 0xcf, 0xa4, 0xe7, 0x8c,
+ 0x38, 0x04, 0xd0, 0xfc, 0x6e, 0x02, 0xa0, 0xd9, 0x8c, 0x14, 0x9d, 0x82, 0xd0, 0x1c, 0x4d, 0x20,
+ 0x34, 0x59, 0xaa, 0xe4, 0xe7, 0x91, 0x4a, 0xe6, 0x40, 0x34, 0x47, 0x13, 0x10, 0x4d, 0x6e, 0x8e,
+ 0xc2, 0x39, 0x18, 0xcd, 0x5f, 0x4c, 0xc7, 0x68, 0x20, 0x12, 0x45, 0xe1, 0xc3, 0x5c, 0x0c, 0xa4,
+ 0x51, 0x22, 0x40, 0x9a, 0x7c, 0xe4, 0xbd, 0x9f, 0xa9, 0x5f, 0x18, 0xa5, 0xf9, 0xfd, 0x34, 0x94,
+ 0x66, 0x25, 0x12, 0x60, 0xe2, 0x56, 0xb9, 0x08, 0x4c, 0x73, 0x3a, 0x05, 0xa6, 0x29, 0x44, 0xc2,
+ 0x3f, 0x4c, 0xf1, 0x02, 0x38, 0xcd, 0xe9, 0x14, 0x9c, 0xa6, 0x38, 0x57, 0xed, 0x5c, 0xa0, 0xe6,
+ 0x49, 0x10, 0xa8, 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x47, 0x21, 0x35,
+ 0x0c, 0xa1, 0x7a, 0x3b, 0x52, 0xe3, 0x12, 0x50, 0xcd, 0xd1, 0x04, 0x54, 0x23, 0xce, 0xb1, 0xe1,
+ 0x05, 0xb1, 0x1a, 0xe9, 0x17, 0x24, 0x4a, 0x87, 0xdc, 0x1d, 0x71, 0xdd, 0xd8, 0x34, 0x75, 0x93,
+ 0xa3, 0x2b, 0xac, 0x21, 0xdd, 0x27, 0x77, 0x6d, 0xcf, 0xb5, 0xcd, 0xc0, 0x6f, 0xca, 0x50, 0x0c,
+ 0xb8, 0x33, 0xe9, 0x1f, 0x05, 0x4f, 0x96, 0x22, 0x38, 0xfe, 0x7b, 0x7a, 0x8e, 0xdf, 0xd3, 0x43,
+ 0x77, 0xcb, 0x5c, 0x20, 0xd7, 0xf0, 0x67, 0x33, 0x1c, 0xb0, 0x51, 0xbd, 0x2c, 0xe6, 0x01, 0xac,
+ 0xd0, 0xbc, 0x97, 0xc5, 0x8a, 0x40, 0x38, 0x2a, 0x93, 0x0e, 0xb6, 0x0a, 0x2c, 0x2e, 0xbd, 0x03,
+ 0xab, 0x3e, 0x5e, 0xf7, 0x72, 0xcc, 0x50, 0x0b, 0xd1, 0xe5, 0xae, 0xf1, 0x5b, 0xf2, 0xbf, 0x26,
+ 0xbc, 0x15, 0xf2, 0x90, 0x9e, 0x69, 0xa0, 0x8c, 0xf0, 0xa3, 0x41, 0x99, 0xe8, 0x4b, 0x3a, 0xfa,
+ 0x18, 0xd6, 0x02, 0x78, 0x8d, 0x93, 0x56, 0x26, 0x96, 0x83, 0x6d, 0x62, 0xbe, 0x2c, 0xc7, 0xed,
+ 0x41, 0x9f, 0xc0, 0x2d, 0x9a, 0x20, 0x47, 0xa4, 0xae, 0xc9, 0xc5, 0x52, 0xd7, 0x1b, 0x44, 0x47,
+ 0x7d, 0x4a, 0xfa, 0x1a, 0x01, 0xe6, 0xa4, 0x22, 0xc0, 0x1c, 0x74, 0x00, 0x85, 0x2e, 0x1e, 0x62,
+ 0x4b, 0xb3, 0x94, 0x25, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef,
+ 0xdf, 0x08, 0xc2, 0x4e, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a,
+ 0xd4, 0xd6, 0x3b, 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x7d, 0xbd, 0xcb, 0x2d, 0x90,
+ 0xfc, 0x24, 0x5c, 0x6e, 0x81, 0x24, 0xc7, 0x23, 0xec, 0x1a, 0xa4, 0xb4, 0x61, 0x07, 0x8f, 0xb9,
+ 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x81, 0xaf, 0xb8, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33, 0x3a,
+ 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0x2a, 0x97, 0xa2, 0x1b, 0x16, 0x8f, 0x91, 0x81,
+ 0x54, 0x8e, 0x55, 0xa4, 0xb6, 0x8e, 0x09, 0xcf, 0x91, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2, 0x25,
+ 0x5b, 0xd9, 0x40, 0xb2, 0x75, 0x1b, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x6f, 0x39,
+ 0xd9, 0x23, 0x48, 0xff, 0x24, 0x40, 0x39, 0x14, 0x72, 0xa7, 0xce, 0xdd, 0x39, 0x95, 0xf1, 0x20,
+ 0x7a, 0x36, 0x31, 0xfb, 0x3b, 0x00, 0x5d, 0xd5, 0x52, 0x5e, 0xaa, 0x43, 0x1b, 0x77, 0xf8, 0x12,
+ 0xe4, 0xba, 0xaa, 0xf5, 0x9c, 0x12, 0x82, 0x83, 0x49, 0x85, 0x06, 0xe3, 0xc3, 0x6f, 0xd2, 0x7e,
+ 0xfc, 0x06, 0x55, 0x21, 0x6b, 0x98, 0x9a, 0x6e, 0x6a, 0xf6, 0x15, 0x5d, 0x93, 0x84, 0xec, 0xb6,
+ 0xa5, 0x63, 0xb8, 0x36, 0x35, 0xda, 0xa3, 0xc7, 0x90, 0xf3, 0x12, 0x05, 0x81, 0x26, 0xb5, 0x33,
+ 0x60, 0x31, 0x8f, 0x97, 0x2c, 0xc9, 0xb5, 0xa9, 0xf1, 0x1e, 0x35, 0x20, 0x6d, 0x62, 0x6b, 0xd4,
+ 0x67, 0x49, 0x76, 0xe9, 0xe1, 0x3b, 0x8b, 0xe5, 0x09, 0x84, 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96,
+ 0x3e, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0x9f, 0x1e, 0x1e, 0x3d, 0x3f, 0x14, 0x63,
+ 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0xc7, 0x2d, 0x51, 0x40, 0x39, 0x48, 0xd5, 0x76, 0x8e, 0xe4,
+ 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdf, 0xa8, 0xb7, 0xc4, 0x04, 0x5a, 0x81, 0x22, 0xfb, 0xad,
+ 0x3c, 0x39, 0x92, 0x9f, 0xd5, 0x5a, 0x62, 0xd2, 0x47, 0x3a, 0x69, 0x1c, 0xee, 0x36, 0x64, 0x31,
+ 0x25, 0xfd, 0x0a, 0x6e, 0x46, 0x66, 0x16, 0x1e, 0x72, 0x26, 0xf8, 0x90, 0x33, 0xe9, 0xdb, 0x38,
+ 0xb9, 0x3a, 0x45, 0xa5, 0x0b, 0x68, 0x3f, 0x34, 0xf1, 0x87, 0x4b, 0xe4, 0x1a, 0xa1, 0xd9, 0xa3,
+ 0xb7, 0xa0, 0x64, 0xe2, 0x0b, 0x6c, 0xb7, 0x7b, 0x2c, 0x7d, 0x71, 0x00, 0xb0, 0x22, 0xa7, 0x52,
+ 0x21, 0x8b, 0xb1, 0x7d, 0x86, 0xdb, 0xb6, 0xc2, 0x8c, 0xc0, 0xa2, 0x30, 0x43, 0x8e, 0xb0, 0x11,
+ 0xea, 0x09, 0x23, 0x12, 0xff, 0xcf, 0xfc, 0x14, 0x53, 0x95, 0xa4, 0xaa, 0x80, 0xba, 0x1d, 0x4a,
+ 0x91, 0x5e, 0x2e, 0xb5, 0xd8, 0x39, 0x48, 0xc9, 0x8d, 0x96, 0xfc, 0x91, 0x98, 0x40, 0x08, 0x4a,
+ 0xf4, 0xa7, 0x72, 0x72, 0x58, 0x3b, 0x3e, 0x69, 0x1e, 0x91, 0xc5, 0x5e, 0x85, 0xb2, 0xb3, 0xd8,
+ 0x0e, 0x31, 0x85, 0xae, 0xc1, 0x4a, 0xfd, 0xe8, 0xd9, 0xf1, 0x41, 0xa3, 0xd5, 0xf0, 0xc8, 0x69,
+ 0xa9, 0x0a, 0x95, 0xa8, 0x14, 0x49, 0xfa, 0xcf, 0x04, 0xdc, 0x88, 0x48, 0x73, 0xd0, 0xfb, 0x00,
+ 0xf6, 0x58, 0x31, 0x71, 0x5b, 0x37, 0x3b, 0xd1, 0x86, 0xdb, 0x1a, 0xcb, 0x94, 0x43, 0xce, 0xd9,
+ 0xfc, 0xd7, 0xcc, 0x58, 0xf1, 0x5b, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
+ 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x08, 0x6e, 0x84, 0x42, 0x1a,
+ 0x8f, 0x03, 0xd6, 0xb4, 0x02, 0xef, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
+ 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0x8a, 0xc6, 0xb4, 0xd0, 0x18,
+ 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0xdf, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
+ 0xb6, 0x6a, 0x8f, 0x2c, 0x7e, 0x92, 0x1e, 0x2f, 0x9a, 0xa7, 0x6e, 0x39, 0x3f, 0x4e, 0xa8, 0xb8,
+ 0xcc, 0xd5, 0xfc, 0x41, 0x6e, 0x7a, 0xd4, 0xf6, 0xa4, 0x7e, 0x8a, 0xed, 0x69, 0x42, 0x1a, 0x5f,
+ 0xe2, 0xa1, 0x6d, 0x55, 0xd2, 0x74, 0xc6, 0xd7, 0x27, 0x67, 0x4c, 0xba, 0x77, 0x2a, 0x24, 0xf7,
+ 0xf9, 0xef, 0x57, 0x1b, 0x22, 0xe3, 0x7e, 0x5b, 0x1f, 0x68, 0x36, 0x1e, 0x18, 0xf6, 0x95, 0xcc,
+ 0xe5, 0xa5, 0xf7, 0xa0, 0x14, 0x5c, 0xf4, 0x68, 0x17, 0xe2, 0x39, 0xe9, 0xb8, 0xf4, 0x0f, 0x02,
+ 0xac, 0x4e, 0xc1, 0x72, 0xd0, 0x63, 0x5e, 0x08, 0x62, 0x1b, 0x7f, 0x77, 0x72, 0xf5, 0x02, 0xec,
+ 0x5e, 0x3d, 0x88, 0x04, 0x4d, 0xef, 0xea, 0xc0, 0xf6, 0xd8, 0x23, 0xa0, 0x5f, 0x42, 0xd9, 0xd2,
+ 0xba, 0x43, 0xc5, 0x64, 0xb0, 0x90, 0x5b, 0x64, 0x21, 0x99, 0x3d, 0xe9, 0x70, 0x4a, 0x91, 0x1d,
+ 0x92, 0xf9, 0x20, 0x10, 0x95, 0x10, 0xb7, 0xd4, 0x06, 0x34, 0x79, 0x93, 0x99, 0x06, 0x5c, 0x09,
+ 0x6f, 0x00, 0x5c, 0xfd, 0xbd, 0x00, 0xb7, 0x66, 0xdc, 0x6e, 0xd0, 0x87, 0xa1, 0x73, 0xf1, 0xc1,
+ 0x32, 0x77, 0xa3, 0x2d, 0x46, 0x0b, 0x9e, 0x0c, 0xe9, 0x11, 0x14, 0xfc, 0xf4, 0xc5, 0x36, 0x6f,
+ 0xdf, 0x8b, 0xfd, 0x41, 0x80, 0xed, 0x2e, 0x14, 0x4d, 0x6c, 0x13, 0x27, 0x15, 0x40, 0x24, 0x0b,
+ 0x8c, 0xc8, 0xd2, 0xd4, 0xfd, 0x64, 0x56, 0x10, 0xe3, 0xae, 0xfd, 0xfc, 0x9b, 0x00, 0xe0, 0xa1,
+ 0x6e, 0x1e, 0xea, 0x25, 0xf8, 0x51, 0xaf, 0x10, 0x58, 0x1a, 0x0f, 0x83, 0xa5, 0xe8, 0x1e, 0x94,
+ 0xd9, 0x7d, 0x84, 0xec, 0x9b, 0x6a, 0x8f, 0x4c, 0xcc, 0x31, 0xb6, 0x12, 0x25, 0x9f, 0x38, 0x54,
+ 0xf4, 0x31, 0xdc, 0xb4, 0x7b, 0x26, 0xb6, 0x7a, 0x7a, 0xbf, 0xa3, 0x84, 0xf7, 0x8e, 0xd5, 0x7e,
+ 0x36, 0xe6, 0x18, 0x9d, 0x7c, 0xc3, 0xd5, 0x70, 0x16, 0xdc, 0xbf, 0x2f, 0x20, 0x45, 0x8f, 0x0d,
+ 0x49, 0xfa, 0x5c, 0x2b, 0xce, 0x71, 0x03, 0xfd, 0x04, 0x40, 0xb5, 0x6d, 0x53, 0x3b, 0x1f, 0x11,
+ 0xef, 0x10, 0x9f, 0xfc, 0x94, 0x77, 0xec, 0x6a, 0x0e, 0xdf, 0xce, 0x6d, 0x7e, 0xfe, 0xd6, 0x3c,
+ 0x51, 0xdf, 0x19, 0xf4, 0x29, 0x94, 0x0e, 0xa1, 0x14, 0x94, 0x75, 0xb2, 0x69, 0x36, 0x86, 0x60,
+ 0x36, 0xcd, 0xb2, 0x73, 0x9e, 0x4d, 0xbb, 0xb9, 0x78, 0x82, 0xd5, 0x6c, 0x69, 0x43, 0xfa, 0x41,
+ 0x80, 0x82, 0xdf, 0xeb, 0x2d, 0x9c, 0xf0, 0xf2, 0x0b, 0x40, 0x62, 0xf2, 0x02, 0x90, 0xf4, 0xa5,
+ 0xc0, 0x37, 0x21, 0x4b, 0x52, 0xe0, 0x91, 0x85, 0x3b, 0xbc, 0x92, 0x9d, 0xe9, 0xaa, 0xd6, 0xa9,
+ 0x85, 0x3b, 0x3e, 0xdf, 0x94, 0x79, 0x33, 0xdf, 0x14, 0x4c, 0xa4, 0xb3, 0xa1, 0x44, 0x7a, 0x3f,
+ 0x99, 0x4d, 0x89, 0x69, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x2d, 0x40, 0xd6, 0x9d, 0x6f, 0xb0, 0x84,
+ 0x1b, 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x02, 0x2e, 0xbf, 0xba, 0xb0, 0x82, 0x76, 0xc2, 0x2d, 0x68,
+ 0xff, 0xc6, 0x4d, 0x06, 0xa3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x8e,
+ 0x8f, 0x83, 0x64, 0x2c, 0xe8, 0x4f, 0x20, 0xad, 0xb6, 0x5d, 0xbc, 0xb5, 0x34, 0x05, 0x88, 0x74,
+ 0x58, 0xb7, 0x5a, 0xe3, 0x1a, 0xe5, 0x94, 0xb9, 0x04, 0x1f, 0x55, 0xdc, 0x19, 0x95, 0x74, 0x40,
+ 0xf4, 0x32, 0x9e, 0xe0, 0x49, 0x2f, 0x01, 0x9c, 0x1e, 0x3e, 0x3b, 0xda, 0xdd, 0x7b, 0xb2, 0xd7,
+ 0xd8, 0xe5, 0xd9, 0xde, 0xee, 0x6e, 0x63, 0x57, 0x8c, 0x13, 0x3e, 0xb9, 0xf1, 0xec, 0xe8, 0xac,
+ 0xb1, 0x2b, 0x26, 0x48, 0x63, 0xb7, 0x71, 0x50, 0xfb, 0xa8, 0xb1, 0x2b, 0x26, 0xa5, 0x1a, 0xe4,
+ 0xdc, 0xa0, 0x43, 0x2b, 0xff, 0xfa, 0x4b, 0x6c, 0xf2, 0xd5, 0x62, 0x0d, 0xb4, 0x0e, 0xf9, 0xc9,
+ 0x82, 0x01, 0xb9, 0xbc, 0xb1, 0x3a, 0x01, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0xbf, 0x81,
+ 0x8c, 0x31, 0x3a, 0x57, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x74, 0xde, 0xd7, 0xda,
+ 0x4f, 0xf1, 0x15, 0x0f, 0x72, 0x69, 0x63, 0x74, 0xfe, 0x94, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xc6,
+ 0x30, 0x12, 0xa1, 0x61, 0xa0, 0x7b, 0x50, 0x18, 0xea, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d,
+ 0x16, 0xbb, 0x73, 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x9d, 0x00, 0x68, 0x32, 0xd0,
+ 0xa2, 0x13, 0x58, 0xf1, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x19, 0x1d, 0xa8, 0x03, 0xf8,
+ 0x82, 0x78, 0x19, 0x24, 0x93, 0xac, 0x6f, 0xcd, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8,
+ 0x82, 0x8b, 0x12, 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xa2, 0xee, 0x64, 0x40,
+ 0xa5, 0x35, 0x21, 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x4d, 0x86, 0x24, 0x3d, 0x02, 0xf1, 0x43,
+ 0xf7, 0xfb, 0x5e, 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x31, 0xcc, 0x4b, 0xc8, 0x12, 0xef, 0x4b, 0x83,
+ 0xc6, 0x9f, 0x42, 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8,
+ 0x01, 0xac, 0x90, 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0x0e,
+ 0x1c, 0x58, 0x8b, 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85,
+ 0x80, 0x52, 0xb6, 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa,
+ 0xe3, 0x40, 0x62, 0xb5, 0x39, 0xab, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3f, 0xb1,
+ 0xa8, 0x3a, 0xa0, 0x53, 0x94, 0x4e, 0x2e, 0x5d, 0x94, 0x7e, 0x1b, 0x90, 0xad, 0xdb, 0x6a, 0x9f,
+ 0x04, 0x6f, 0x6d, 0xd8, 0x55, 0xd8, 0x69, 0x67, 0x85, 0x70, 0x91, 0xf6, 0x9c, 0xd1, 0x8e, 0x63,
+ 0x42, 0x97, 0xfa, 0x90, 0x75, 0x81, 0x89, 0xe5, 0xdf, 0xe4, 0x4c, 0x2b, 0xbe, 0x57, 0x21, 0x3b,
+ 0xc0, 0xb6, 0x4a, 0xc3, 0x1e, 0x03, 0xaa, 0xdc, 0xf6, 0x83, 0x0f, 0x20, 0xef, 0x7b, 0xa8, 0x44,
+ 0x22, 0xe1, 0x61, 0xe3, 0xb9, 0x18, 0xab, 0x66, 0xbe, 0xfc, 0x7a, 0x33, 0x71, 0x88, 0x5f, 0x92,
+ 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51, 0x7f, 0x2a, 0x0a, 0xd5, 0xfc, 0x97, 0x5f, 0x6f, 0x66, 0x64,
+ 0x4c, 0x0b, 0x37, 0x0f, 0x9e, 0x42, 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7b, 0x7a,
+ 0x7c, 0xb0, 0x57, 0xaf, 0xb5, 0x1a, 0xca, 0xd9, 0x51, 0xab, 0x21, 0x0a, 0xe8, 0x06, 0xac, 0x1e,
+ 0xec, 0xfd, 0x59, 0xb3, 0xa5, 0xd4, 0x0f, 0xf6, 0x1a, 0x87, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea,
+ 0x4f, 0xc5, 0xf8, 0xc3, 0x7f, 0xc9, 0x43, 0xb9, 0xb6, 0x53, 0xdf, 0xab, 0x19, 0x46, 0x5f, 0x6b,
+ 0xab, 0xd4, 0xdd, 0xd7, 0x21, 0x49, 0x51, 0xe7, 0x99, 0x6f, 0xa1, 0xab, 0xb3, 0xab, 0x71, 0xe8,
+ 0x09, 0xa4, 0x28, 0x20, 0x8d, 0x66, 0x3f, 0x8e, 0xae, 0xce, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73,
+ 0x33, 0xf3, 0xb5, 0x74, 0x75, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xc6, 0x01, 0xe3, 0xe6, 0x3d, 0x61,
+ 0xae, 0xce, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0x43, 0xea, 0xea, 0x9c, 0x3a, 0x1e,
+ 0x92, 0x21, 0xe7, 0xc1, 0xdc, 0xf3, 0xdf, 0x74, 0x57, 0x17, 0xa8, 0x2b, 0xa2, 0x4f, 0xa1, 0x18,
+ 0x84, 0xed, 0x16, 0x7b, 0x6e, 0x5d, 0x5d, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x9e,
+ 0x5f, 0x57, 0x17, 0x2c, 0x01, 0xa2, 0xcf, 0x60, 0x65, 0x12, 0x63, 0x5b, 0xfc, 0x35, 0x76, 0x75,
+ 0x89, 0xa2, 0x20, 0x1a, 0x00, 0x9a, 0x82, 0xcd, 0x2d, 0xf1, 0x38, 0xbb, 0xba, 0x4c, 0x8d, 0x10,
+ 0x75, 0x41, 0x9c, 0x78, 0x2e, 0xb7, 0xf0, 0x63, 0xed, 0xea, 0xe2, 0x05, 0x43, 0xd4, 0x81, 0x72,
+ 0x18, 0x04, 0x5b, 0xf4, 0xf1, 0x76, 0x75, 0xe1, 0xf2, 0x21, 0xfb, 0x4a, 0x10, 0x8c, 0x59, 0xf4,
+ 0x31, 0x77, 0x75, 0xe1, 0x6a, 0x22, 0x3a, 0x05, 0xf0, 0x5d, 0xa2, 0x17, 0x78, 0xdc, 0x5d, 0x5d,
+ 0xa4, 0xae, 0x88, 0x0c, 0x58, 0x9d, 0x76, 0x6b, 0x5e, 0xe6, 0xad, 0x77, 0x75, 0xa9, 0x72, 0x23,
+ 0x39, 0x38, 0xc1, 0x0b, 0xf0, 0x62, 0x6f, 0xbf, 0xab, 0x0b, 0xd6, 0x1d, 0x77, 0x76, 0xbe, 0x79,
+ 0xbd, 0x2e, 0x7c, 0xfb, 0x7a, 0x5d, 0xf8, 0xee, 0xf5, 0xba, 0xf0, 0xd5, 0xf7, 0xeb, 0xb1, 0x6f,
+ 0xbf, 0x5f, 0x8f, 0xfd, 0xc7, 0xf7, 0xeb, 0xb1, 0x3f, 0xbf, 0xdf, 0xd5, 0xec, 0xde, 0xe8, 0x7c,
+ 0xab, 0xad, 0x0f, 0xe8, 0x7f, 0x7a, 0x0c, 0xf5, 0x6a, 0x9b, 0xe9, 0x24, 0x2d, 0xdf, 0x3f, 0x87,
+ 0xce, 0xd3, 0x34, 0xa8, 0x3e, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x9b, 0xee, 0x1d,
+ 0x59, 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -4748,6 +4749,7 @@ type ABCIApplicationClient interface {
OfferSnapshot(ctx context.Context, in *RequestOfferSnapshot, opts ...grpc.CallOption) (*ResponseOfferSnapshot, error)
LoadSnapshotChunk(ctx context.Context, in *RequestLoadSnapshotChunk, opts ...grpc.CallOption) (*ResponseLoadSnapshotChunk, error)
ApplySnapshotChunk(ctx context.Context, in *RequestApplySnapshotChunk, opts ...grpc.CallOption) (*ResponseApplySnapshotChunk, error)
+ FinalizeSnapshot(ctx context.Context, in *RequestFinalizeSnapshot, opts ...grpc.CallOption) (*ResponseFinalizeSnapshot, error)
PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error)
ProcessProposal(ctx context.Context, in *RequestProcessProposal, opts ...grpc.CallOption) (*ResponseProcessProposal, error)
ExtendVote(ctx context.Context, in *RequestExtendVote, opts ...grpc.CallOption) (*ResponseExtendVote, error)
@@ -4853,6 +4855,15 @@ func (c *aBCIApplicationClient) ApplySnapshotChunk(ctx context.Context, in *Requ
return out, nil
}
+func (c *aBCIApplicationClient) FinalizeSnapshot(ctx context.Context, in *RequestFinalizeSnapshot, opts ...grpc.CallOption) (*ResponseFinalizeSnapshot, error) {
+ out := new(ResponseFinalizeSnapshot)
+ err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/FinalizeSnapshot", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *aBCIApplicationClient) PrepareProposal(ctx context.Context, in *RequestPrepareProposal, opts ...grpc.CallOption) (*ResponsePrepareProposal, error) {
out := new(ResponsePrepareProposal)
err := c.cc.Invoke(ctx, "/tendermint.abci.ABCIApplication/PrepareProposal", in, out, opts...)
@@ -4911,6 +4922,7 @@ type ABCIApplicationServer interface {
OfferSnapshot(context.Context, *RequestOfferSnapshot) (*ResponseOfferSnapshot, error)
LoadSnapshotChunk(context.Context, *RequestLoadSnapshotChunk) (*ResponseLoadSnapshotChunk, error)
ApplySnapshotChunk(context.Context, *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error)
+ FinalizeSnapshot(context.Context, *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error)
PrepareProposal(context.Context, *RequestPrepareProposal) (*ResponsePrepareProposal, error)
ProcessProposal(context.Context, *RequestProcessProposal) (*ResponseProcessProposal, error)
ExtendVote(context.Context, *RequestExtendVote) (*ResponseExtendVote, error)
@@ -4952,6 +4964,9 @@ func (*UnimplementedABCIApplicationServer) LoadSnapshotChunk(ctx context.Context
func (*UnimplementedABCIApplicationServer) ApplySnapshotChunk(ctx context.Context, req *RequestApplySnapshotChunk) (*ResponseApplySnapshotChunk, error) {
return nil, status.Errorf(codes.Unimplemented, "method ApplySnapshotChunk not implemented")
}
+func (*UnimplementedABCIApplicationServer) FinalizeSnapshot(ctx context.Context, req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method FinalizeSnapshot not implemented")
+}
func (*UnimplementedABCIApplicationServer) PrepareProposal(ctx context.Context, req *RequestPrepareProposal) (*ResponsePrepareProposal, error) {
return nil, status.Errorf(codes.Unimplemented, "method PrepareProposal not implemented")
}
@@ -5152,6 +5167,24 @@ func _ABCIApplication_ApplySnapshotChunk_Handler(srv interface{}, ctx context.Co
return interceptor(ctx, in, info, handler)
}
+func _ABCIApplication_FinalizeSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(RequestFinalizeSnapshot)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(ABCIApplicationServer).FinalizeSnapshot(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/tendermint.abci.ABCIApplication/FinalizeSnapshot",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(ABCIApplicationServer).FinalizeSnapshot(ctx, req.(*RequestFinalizeSnapshot))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _ABCIApplication_PrepareProposal_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RequestPrepareProposal)
if err := dec(in); err != nil {
@@ -5286,6 +5319,10 @@ var _ABCIApplication_serviceDesc = grpc.ServiceDesc{
MethodName: "ApplySnapshotChunk",
Handler: _ABCIApplication_ApplySnapshotChunk_Handler,
},
+ {
+ MethodName: "FinalizeSnapshot",
+ Handler: _ABCIApplication_FinalizeSnapshot_Handler,
+ },
{
MethodName: "PrepareProposal",
Handler: _ABCIApplication_PrepareProposal_Handler,
diff --git a/internal/statesync/mocks/stateprovider.go b/internal/statesync/mocks/stateprovider.go
index 8ac2b1544c..a4189eb08e 100644
--- a/internal/statesync/mocks/stateprovider.go
+++ b/internal/statesync/mocks/stateprovider.go
@@ -145,6 +145,65 @@ func (_c *StateProvider_Commit_Call) RunAndReturn(run func(context.Context, uint
return _c
}
+// LightBlock provides a mock function with given fields: ctx, height
+func (_m *StateProvider) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ ret := _m.Called(ctx, height)
+
+ if len(ret) == 0 {
+ panic("no return value specified for LightBlock")
+ }
+
+ var r0 *types.LightBlock
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, uint64) (*types.LightBlock, error)); ok {
+ return rf(ctx, height)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, uint64) *types.LightBlock); ok {
+ r0 = rf(ctx, height)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*types.LightBlock)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, uint64) error); ok {
+ r1 = rf(ctx, height)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// StateProvider_LightBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LightBlock'
+type StateProvider_LightBlock_Call struct {
+ *mock.Call
+}
+
+// LightBlock is a helper method to define mock.On call
+// - ctx context.Context
+// - height uint64
+func (_e *StateProvider_Expecter) LightBlock(ctx interface{}, height interface{}) *StateProvider_LightBlock_Call {
+ return &StateProvider_LightBlock_Call{Call: _e.mock.On("LightBlock", ctx, height)}
+}
+
+func (_c *StateProvider_LightBlock_Call) Run(run func(ctx context.Context, height uint64)) *StateProvider_LightBlock_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(uint64))
+ })
+ return _c
+}
+
+func (_c *StateProvider_LightBlock_Call) Return(_a0 *types.LightBlock, _a1 error) *StateProvider_LightBlock_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *StateProvider_LightBlock_Call) RunAndReturn(run func(context.Context, uint64) (*types.LightBlock, error)) *StateProvider_LightBlock_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// State provides a mock function with given fields: ctx, height
func (_m *StateProvider) State(ctx context.Context, height uint64) (state.State, error) {
ret := _m.Called(ctx, height)
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index a76c6d546e..cd6104df52 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -40,6 +40,8 @@ type StateProvider interface {
Commit(ctx context.Context, height uint64) (*types.Commit, error)
// State returns a state object at the given height.
State(ctx context.Context, height uint64) (sm.State, error)
+ // LightBlock returns light block at the given height.
+ LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error)
}
type stateProviderRPC struct {
@@ -124,6 +126,13 @@ func (s *stateProviderRPC) Commit(ctx context.Context, height uint64) (*types.Co
return header.Commit, nil
}
+// LightBlock implements StateProvider.
+func (s *stateProviderRPC) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ s.Lock()
+ defer s.Unlock()
+ return s.verifyLightBlockAtHeight(ctx, height, time.Now())
+}
+
// State implements StateProvider.
func (s *stateProviderRPC) State(ctx context.Context, height uint64) (sm.State, error) {
s.Lock()
@@ -264,6 +273,13 @@ func (s *stateProviderP2P) Commit(ctx context.Context, height uint64) (*types.Co
return header.Commit, nil
}
+// LightBlock implements StateProvider.
+func (s *stateProviderP2P) LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error) {
+ s.Lock()
+ defer s.Unlock()
+ return s.verifyLightBlockAtHeight(ctx, height, time.Now())
+}
+
// State implements StateProvider.
func (s *stateProviderP2P) State(ctx context.Context, height uint64) (sm.State, error) {
s.Lock()
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 24ce2eb0a6..aff823cc2b 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -350,7 +350,8 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
- commit, err := s.getStateProvider().Commit(pctx, snapshot.Height)
+ block, err := s.getStateProvider().LightBlock(pctx, snapshot.Height)
+
if err != nil {
// check if the provider context exceeded the 10 second deadline
if ctx.Err() != nil {
@@ -358,9 +359,9 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
}
if err == light.ErrNoWitnesses {
return sm.State{}, nil,
- fmt.Errorf("failed to get commit at height %d. No witnesses remaining", snapshot.Height)
+ fmt.Errorf("failed to get light block at height %d. No witnesses remaining", snapshot.Height)
}
- s.logger.Info("failed to get and verify commit. Dropping snapshot and trying again",
+ s.logger.Info("failed to get and verify light block. Dropping snapshot and trying again",
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
@@ -371,6 +372,11 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil, err
}
+ // Finalize
+ if err := s.finalizeSnapshot(ctx, snapshot, block); err != nil {
+ return sm.State{}, nil, fmt.Errorf("failed to finalize snapshot: %w", err)
+ }
+
// Verify app and app version
if err := s.verifyApp(ctx, snapshot, state.Version.Consensus.App); err != nil {
return sm.State{}, nil, err
@@ -382,7 +388,7 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
"version", snapshot.Version,
"hash", snapshot.Hash)
- return state, commit, nil
+ return state, block.Commit, nil
}
// offerSnapshot offers a snapshot to the app. It returns various errors depending on the app's
@@ -572,6 +578,26 @@ func (s *syncer) requestChunk(ctx context.Context, snapshot *snapshot, chunkID t
return s.chunkCh.Send(ctx, msg)
}
+// / finalizeSnapshot sends light block to ABCI app after state sync is done
+func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, block *types.LightBlock) error {
+ s.logger.Info("Finalizing snapshot restoration",
+ "snapshot", snapshot.Hash.String(),
+ "height", snapshot.Height,
+ "version", snapshot.Version,
+ "app_hash", snapshot.trustedAppHash,
+ )
+ lightBlock, err := block.ToProto()
+ if err != nil {
+ return fmt.Errorf("failed to convert light block %s to proto: %w", lightBlock.String(), err)
+ }
+
+ _, err = s.conn.FinalizeSnapshot(ctx, &abci.RequestFinalizeSnapshot{
+ LightBlock: lightBlock,
+ })
+
+ return err
+}
+
// verifyApp verifies the sync, checking the app hash, last block height and app version
func (s *syncer) verifyApp(ctx context.Context, snapshot *snapshot, appVersion uint64) error {
resp, err := s.conn.Info(ctx, &proxy.RequestInfo)
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 143fd5cc92..4a10c16abb 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -905,6 +905,7 @@ service ABCIApplication {
rpc OfferSnapshot(RequestOfferSnapshot) returns (ResponseOfferSnapshot);
rpc LoadSnapshotChunk(RequestLoadSnapshotChunk) returns (ResponseLoadSnapshotChunk);
rpc ApplySnapshotChunk(RequestApplySnapshotChunk) returns (ResponseApplySnapshotChunk);
+ rpc FinalizeSnapshot(RequestFinalizeSnapshot) returns (ResponseFinalizeSnapshot);
rpc PrepareProposal(RequestPrepareProposal) returns (ResponsePrepareProposal);
rpc ProcessProposal(RequestProcessProposal) returns (ResponseProcessProposal);
rpc ExtendVote(RequestExtendVote) returns (ResponseExtendVote);
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index abc33a6eb7..8d10026a8c 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -1395,6 +1395,7 @@ TxAction contains App-provided information on what to do with a transaction that
| OfferSnapshot | [RequestOfferSnapshot](#tendermint-abci-RequestOfferSnapshot) | [ResponseOfferSnapshot](#tendermint-abci-ResponseOfferSnapshot) | |
| LoadSnapshotChunk | [RequestLoadSnapshotChunk](#tendermint-abci-RequestLoadSnapshotChunk) | [ResponseLoadSnapshotChunk](#tendermint-abci-ResponseLoadSnapshotChunk) | |
| ApplySnapshotChunk | [RequestApplySnapshotChunk](#tendermint-abci-RequestApplySnapshotChunk) | [ResponseApplySnapshotChunk](#tendermint-abci-ResponseApplySnapshotChunk) | |
+| FinalizeSnapshot | [RequestFinalizeSnapshot](#tendermint-abci-RequestFinalizeSnapshot) | [ResponseFinalizeSnapshot](#tendermint-abci-ResponseFinalizeSnapshot) | |
| PrepareProposal | [RequestPrepareProposal](#tendermint-abci-RequestPrepareProposal) | [ResponsePrepareProposal](#tendermint-abci-ResponsePrepareProposal) | |
| ProcessProposal | [RequestProcessProposal](#tendermint-abci-RequestProcessProposal) | [ResponseProcessProposal](#tendermint-abci-ResponseProcessProposal) | |
| ExtendVote | [RequestExtendVote](#tendermint-abci-RequestExtendVote) | [ResponseExtendVote](#tendermint-abci-ResponseExtendVote) | |
From 012586748e6ddab4d975de675ac954eee455d024 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Thu, 16 Jan 2025 14:35:40 +0100
Subject: [PATCH 10/65] chore: fix build
---
internal/proxy/client.go | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/internal/proxy/client.go b/internal/proxy/client.go
index 9421d6b8ea..a4fa986cf4 100644
--- a/internal/proxy/client.go
+++ b/internal/proxy/client.go
@@ -212,6 +212,11 @@ func (app *proxyClient) ApplySnapshotChunk(ctx context.Context, req *types.Reque
return app.client.ApplySnapshotChunk(ctx, req)
}
+func (app *proxyClient) FinalizeSnapshot(ctx context.Context, req *types.RequestFinalizeSnapshot) (r *types.ResponseFinalizeSnapshot, err error) {
+ defer addTimeSample(app.metrics.MethodTiming.With("method", "finalize_snapshot", "type", "sync"))(&err)
+ return app.client.FinalizeSnapshot(ctx, req)
+}
+
// addTimeSample returns a function that, when called, adds an observation to m.
// The observation added to m is the number of seconds ellapsed since addTimeSample
// was initially called. addTimeSample is meant to be called in a defer to calculate
From 1afb8be4dc53346ce9b50b92f25482f37702d5ac Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:06:10 +0100
Subject: [PATCH 11/65] test(e2e): test finalize snapshot in e2e tests
---
abci/example/kvstore/kvstore.go | 17 +++++++++++++++++
test/e2e/networks/rotate.toml | 4 ++--
test/e2e/pkg/mockcoreserver/methods.go | 2 +-
test/e2e/runner/setup.go | 6 +++++-
types/quorum_sign_data.go | 2 +-
5 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index bf952d5ab4..66b01ab1e4 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -579,6 +579,23 @@ func (app *Application) ApplySnapshotChunk(_ context.Context, req *abci.RequestA
app.logger.Debug("ApplySnapshotChunk", "resp", resp)
return resp, nil
}
+
+func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
+ app.mu.Lock()
+ defer app.mu.Unlock()
+
+ // we only verify the snapshot
+ if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
+ }
+
+ if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
+ }
+
+ app.logger.Info("FinalizeSnapshot finished successfully", "req", req)
+ return &abci.ResponseFinalizeSnapshot{}, nil
+}
func (app *Application) appVersionForHeight(height int64) uint64 {
if app.appVersion == 0 {
return uint64(height)
diff --git a/test/e2e/networks/rotate.toml b/test/e2e/networks/rotate.toml
index 2e725ec190..30f6943097 100644
--- a/test/e2e/networks/rotate.toml
+++ b/test/e2e/networks/rotate.toml
@@ -152,7 +152,7 @@ start_at = 1005 # Becomes part of the validator set at 1030 to ensure ther
seeds = ["seed01"]
snapshot_interval = 5
block_sync = "v0"
-#state_sync = "p2p"
+state_sync = "p2p"
#persistent_peers = ["validator01", "validator02", "validator03", "validator04", "validator05", "validator07", "validator08"]
perturb = ["pause", "disconnect", "restart"]
privval_protocol = "dashcore"
@@ -192,7 +192,7 @@ privval_protocol = "dashcore"
start_at = 1030
mode = "full"
block_sync = "v0"
-#state_sync = "rpc"
+state_sync = "p2p"
persistent_peers = [
"validator01",
"validator02",
diff --git a/test/e2e/pkg/mockcoreserver/methods.go b/test/e2e/pkg/mockcoreserver/methods.go
index 5894dfa867..b38f17982b 100644
--- a/test/e2e/pkg/mockcoreserver/methods.go
+++ b/test/e2e/pkg/mockcoreserver/methods.go
@@ -64,8 +64,8 @@ func WithQuorumVerifyMethod(cs CoreServer, times int) MethodFunc {
&cmd.LLMQType,
&cmd.RequestID,
&cmd.MessageHash,
- &cmd.QuorumHash,
&cmd.Signature,
+ &cmd.QuorumHash,
)
if err != nil {
return nil, err
diff --git a/test/e2e/runner/setup.go b/test/e2e/runner/setup.go
index b15302408a..77665e932e 100644
--- a/test/e2e/runner/setup.go
+++ b/test/e2e/runner/setup.go
@@ -455,6 +455,10 @@ func MakeAppConfig(node *e2e.Node) ([]byte, error) {
}
// UpdateConfigStateSync updates the state sync config for a node.
+// Arguments:
+// - node: the node to update
+// - height: the height to trust
+// - hash: the hash of the block at `height` to trust
func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
cfgPath := filepath.Join(node.Testnet.Dir, node.Name, "config", "config.toml")
@@ -464,7 +468,7 @@ func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
if err != nil {
return err
}
- bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height-1)))
+ bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height)))
bz = regexp.MustCompile(`(?m)^trust-hash =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-hash = "%X"`, hash)))
//nolint: gosec
// G306: Expect WriteFile permissions to be 0600 or less
diff --git a/types/quorum_sign_data.go b/types/quorum_sign_data.go
index 1bd51c6224..ee73d4b46b 100644
--- a/types/quorum_sign_data.go
+++ b/types/quorum_sign_data.go
@@ -161,7 +161,7 @@ func (i *SignItem) Validate() error {
if len(i.MsgHash) != crypto.DefaultHashSize {
return fmt.Errorf("invalid hash size %d: %X", len(i.MsgHash), i.MsgHash)
}
- if len(i.QuorumHash) != crypto.DefaultHashSize {
+ if len(i.QuorumHash) != crypto.QuorumHashSize {
return fmt.Errorf("invalid quorum hash size %d: %X", len(i.QuorumHash), i.QuorumHash)
}
// Msg is optional
From 4e999db4953de7b7ca25f636b1930d54b47457d6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:47:06 +0100
Subject: [PATCH 12/65] refactor: remove trust-height and
---
abci/example/kvstore/kvstore.go | 6 +++---
internal/statesync/reactor.go | 6 +++---
internal/statesync/reactor_test.go | 2 +-
3 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 66b01ab1e4..af33b3cffb 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -580,11 +580,11 @@ func (app *Application) ApplySnapshotChunk(_ context.Context, req *abci.RequestA
return resp, nil
}
-func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
+func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.RequestFinalizeSnapshot) (*abci.ResponseFinalizeSnapshot, error) {
app.mu.Lock()
defer app.mu.Unlock()
- // we only verify the snapshot
+ // we verify snapshot height and app hash, as there is no additional logic to be called here
if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
}
@@ -593,7 +593,7 @@ func (app *Application) FinalizeSnapshot(ctx context.Context, req *abci.RequestF
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
}
- app.logger.Info("FinalizeSnapshot finished successfully", "req", req)
+ app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
return &abci.ResponseFinalizeSnapshot{}, nil
}
func (app *Application) appVersionForHeight(height int64) uint64 {
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index d0219746d6..15446881b8 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -122,7 +122,7 @@ type Reactor struct {
initSyncer func() *syncer
requestSnaphot func() error
syncer *syncer // syncer is nil when sync is not in progress
- initStateProvider func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error
+ initStateProvider func(ctx context.Context, chainID string, initialHeight int64) error
stateProvider StateProvider
eventBus *eventbus.EventBus
@@ -234,7 +234,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
}
r.sendBlockError = blockCh.SendError
- r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64, initialBlockHash []byte) error {
+ r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
spLogger := r.logger.With("module", "stateprovider")
spLogger.Info("initializing state provider",
"trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
@@ -386,7 +386,7 @@ func (r *Reactor) startStateProvider(ctx context.Context) error {
var err error
for retry := 0; retry < initStateProviderRetries; retry++ {
initCtx, cancel := context.WithTimeout(ctx, initStateProviderTimeout)
- err = r.initStateProvider(initCtx, r.chainID, r.initialHeight, r.cfg.TrustHashBytes())
+ err = r.initStateProvider(initCtx, r.chainID, r.initialHeight)
cancel()
if err == nil { // success
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index c115dd5db9..eff91961c4 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -625,7 +625,7 @@ func TestReactor_StateProviderP2P(t *testing.T) {
ictx, cancel := context.WithTimeout(ctx, time.Second)
defer cancel()
- err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1, nil)
+ err := rts.reactor.initStateProvider(ictx, factory.DefaultTestChainID, 1)
require.NoError(t, err)
rts.reactor.getSyncer().stateProvider = rts.reactor.stateProvider
From 63fb155a8d179284af47eeea6e4ec68bd92622ec Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 17 Jan 2025 11:57:38 +0100
Subject: [PATCH 13/65] chore(config)!: remove unused
trust-height,trust-hash,trust-period
---
config/config.go | 37 -----------------------------
config/toml.go | 9 -------
internal/statesync/reactor.go | 8 +++----
internal/statesync/reactor_test.go | 4 ----
internal/statesync/stateprovider.go | 9 ++-----
light/client.go | 12 +++-------
light/client_test.go | 14 +----------
light/example_test.go | 5 ----
light/light_test.go | 2 --
test/e2e/runner/setup.go | 22 -----------------
test/e2e/runner/start.go | 16 +------------
11 files changed, 10 insertions(+), 128 deletions(-)
diff --git a/config/config.go b/config/config.go
index ac43d04413..97ee0f79b0 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1,7 +1,6 @@
package config
import (
- "encoding/hex"
"encoding/json"
"errors"
"fmt"
@@ -1001,15 +1000,6 @@ type StateSyncConfig struct {
// with net.Dial, for example: "host.example.com:2125".
RPCServers []string `mapstructure:"rpc-servers"`
- // The hash and height of a trusted block. Must be within the trust-period.
- TrustHeight int64 `mapstructure:"trust-height"`
- TrustHash string `mapstructure:"trust-hash"`
-
- // The trust period should be set so that Tendermint can detect and gossip
- // misbehavior before it is considered expired. For chains based on the Cosmos SDK,
- // one day less than the unbonding period should suffice.
- TrustPeriod time.Duration `mapstructure:"trust-period"`
-
// Time to spend discovering snapshots before initiating a restore.
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
@@ -1026,19 +1016,9 @@ type StateSyncConfig struct {
Fetchers int `mapstructure:"fetchers"`
}
-func (cfg *StateSyncConfig) TrustHashBytes() []byte {
- // validated in ValidateBasic, so we can safely panic here
- bytes, err := hex.DecodeString(cfg.TrustHash)
- if err != nil {
- panic(err)
- }
- return bytes
-}
-
// DefaultStateSyncConfig returns a default configuration for the state sync service
func DefaultStateSyncConfig() *StateSyncConfig {
return &StateSyncConfig{
- TrustPeriod: 168 * time.Hour,
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
@@ -1074,23 +1054,6 @@ func (cfg *StateSyncConfig) ValidateBasic() error {
return errors.New("discovery time must be 0s or greater than five seconds")
}
- if cfg.TrustPeriod <= 0 {
- return errors.New("trusted-period is required")
- }
-
- if cfg.TrustHeight <= 0 {
- return errors.New("trusted-height is required")
- }
-
- if len(cfg.TrustHash) == 0 {
- return errors.New("trusted-hash is required")
- }
-
- _, err := hex.DecodeString(cfg.TrustHash)
- if err != nil {
- return fmt.Errorf("invalid trusted-hash: %w", err)
- }
-
if cfg.ChunkRequestTimeout < 5*time.Second {
return errors.New("chunk-request-timeout must be at least 5 seconds")
}
diff --git a/config/toml.go b/config/toml.go
index b6be127b28..0f67745bf1 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -495,15 +495,6 @@ use-p2p = {{ .StateSync.UseP2P }}
# for example: "host.example.com:2125"
rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
-# The hash and height of a trusted block. Must be within the trust-period.
-trust-height = {{ .StateSync.TrustHeight }}
-trust-hash = "{{ .StateSync.TrustHash }}"
-
-# The trust period should be set so that Tendermint can detect and gossip misbehavior before
-# it is considered expired. For chains based on the Cosmos SDK, one day less than the unbonding
-# period should suffice.
-trust-period = "{{ .StateSync.TrustPeriod }}"
-
# Time to spend discovering snapshots before initiating a restore.
discovery-time = "{{ .StateSync.DiscoveryTime }}"
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 15446881b8..4ed4a89f07 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -236,8 +236,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
spLogger := r.logger.With("module", "stateprovider")
- spLogger.Info("initializing state provider",
- "trustHeight", r.cfg.TrustHeight, "useP2P", r.cfg.UseP2P)
+ spLogger.Info("initializing state provider", "useP2P", r.cfg.UseP2P)
if r.cfg.UseP2P {
if err := r.waitForEnoughPeers(ctx, 2); err != nil {
@@ -250,7 +249,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
providers[idx] = NewBlockProvider(p, chainID, r.dispatcher)
}
- stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
+ stateProvider, err := NewP2PStateProvider(ctx, chainID, initialHeight,
providers, paramsCh, r.logger.With("module", "stateprovider"), r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize P2P state provider: %w", err)
@@ -259,8 +258,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
return nil
}
- stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, r.cfg.TrustHeight, r.cfg.TrustHashBytes(),
- spLogger, r.dashCoreClient)
+ stateProvider, err := NewRPCStateProvider(ctx, chainID, initialHeight, r.cfg.RPCServers, spLogger, r.dashCoreClient)
if err != nil {
return fmt.Errorf("failed to initialize RPC state provider: %w", err)
}
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index eff91961c4..951e49239f 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -277,8 +277,6 @@ func TestReactor_Sync(t *testing.T) {
// update the config to use the p2p provider
rts.reactor.cfg.UseP2P = true
- rts.reactor.cfg.TrustHeight = 1
- rts.reactor.cfg.TrustHash = fmt.Sprintf("%X", chain[1].Hash())
rts.reactor.cfg.DiscoveryTime = 1 * time.Second
// Run state sync
@@ -612,8 +610,6 @@ func TestReactor_StateProviderP2P(t *testing.T) {
go handleConsensusParamsRequest(ctx, t, rts.paramsOutCh, rts.paramsInCh, closeCh)
rts.reactor.cfg.UseP2P = true
- rts.reactor.cfg.TrustHeight = 1
- rts.reactor.cfg.TrustHash = fmt.Sprintf("%X", chain[1].Hash())
for _, p := range []types.NodeID{peerA, peerB} {
if !rts.reactor.peers.Contains(p) {
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index cd6104df52..742d3be934 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -58,8 +58,6 @@ func NewRPCStateProvider(
chainID string,
initialHeight int64,
servers []string,
- trustHeight int64,
- trustBlockHash []byte,
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
@@ -80,8 +78,7 @@ func NewRPCStateProvider(
// provider used by the light client and use it to fetch consensus parameters.
providerRemotes[provider] = server
}
-
- lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
+ lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
@@ -218,8 +215,6 @@ func NewP2PStateProvider(
ctx context.Context,
chainID string,
initialHeight int64,
- trustHeight int64,
- trustBlockHash []byte,
providers []lightprovider.Provider,
paramsSendCh p2p.Channel,
logger log.Logger,
@@ -229,7 +224,7 @@ func NewP2PStateProvider(
return nil, fmt.Errorf("at least 2 peers are required, got %d", len(providers))
}
- lc, err := light.NewClientAtHeight(ctx, trustHeight, trustBlockHash, chainID, providers[0], providers[1:],
+ lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
lightdb.New(dbm.NewMemDB()), dashCoreClient, light.Logger(logger))
if err != nil {
return nil, err
diff --git a/light/client.go b/light/client.go
index 3b7366bb8e..e12e5e80ea 100644
--- a/light/client.go
+++ b/light/client.go
@@ -154,13 +154,12 @@ func NewClient(
dashCoreRPCClient dashcore.QuorumVerifier,
options ...Option) (*Client, error) {
- return NewClientAtHeight(ctx, 0, nil, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
+ return NewClientAtHeight(ctx, 0, chainID, primary, witnesses, trustedStore, dashCoreRPCClient, options...)
}
func NewClientAtHeight(
ctx context.Context,
height int64,
- trustedBlockHash []byte,
chainID string,
primary provider.Provider,
witnesses []provider.Provider,
@@ -180,7 +179,7 @@ func NewClientAtHeight(
if c.latestTrustedBlock == nil && height > 0 {
c.logger.Info("Downloading trusted light block")
- if err := c.initializeAtHeight(ctx, height, trustedBlockHash); err != nil {
+ if err := c.initializeAtHeight(ctx, height); err != nil {
return nil, fmt.Errorf("initialize at height: %w", err)
}
}
@@ -262,7 +261,7 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
// If blockHash is not nil, it will be used to verify the block.
-func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash []byte) error {
+func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
if err != nil {
@@ -276,11 +275,6 @@ func (c *Client) initializeAtHeight(ctx context.Context, height int64, blockHash
return fmt.Errorf("validate light block: %w", err)
}
- // 1.5) Verify that block hash matches the expected hash
- if len(blockHash) > 0 && !bytes.Equal(l.Hash(), blockHash) {
- return fmt.Errorf("block hash %x does not match expected hash %x", l.Hash(), blockHash)
- }
-
// 2) Ensure the commit height is correct
if l.Height != l.Commit.Height {
return fmt.Errorf("invalid commit: height %d does not match commit height %d", l.Height, l.Commit.Height)
diff --git a/light/client_test.go b/light/client_test.go
index c60d0b226c..8bdd022b5f 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -138,7 +138,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -169,7 +168,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -211,7 +209,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockNode,
nil,
@@ -245,7 +242,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockNode,
nil,
@@ -289,7 +285,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockWitnessNode},
@@ -321,7 +316,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
nil,
@@ -376,7 +370,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockDeadNode,
[]provider.Provider{mockFullNode},
@@ -419,7 +412,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockDeadNode1,
[]provider.Provider{mockFullNode, mockDeadNode2},
@@ -513,7 +505,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockBadValSetNode, mockGoodWitness},
@@ -561,7 +552,6 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
mockFullNode,
[]provider.Provider{mockGoodWitness},
@@ -655,9 +645,7 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
- 1,
- nil,
- chainID,
+ 1, chainID,
mockBadNode,
nil,
dbs.New(dbm.NewMemDB()),
diff --git a/light/example_test.go b/light/example_test.go
index 74fcf6b41c..f58a1206be 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -2,7 +2,6 @@ package light_test
import (
"context"
- "encoding/hex"
"testing"
"time"
@@ -157,13 +156,9 @@ func TestClientLocalDevnet(t *testing.T) {
logger)
require.NoError(t, err)
- trusted, err := hex.DecodeString("5EA22033B1855219F7579554EE75CBB48C25CDF7DF2AD6C1FD5428C1BA74CFE4")
- require.NoError(t, err)
-
c, err := light.NewClientAtHeight(
ctx,
1,
- trusted,
CHAINID,
primary,
nil,
diff --git a/light/light_test.go b/light/light_test.go
index 82cbe6c18b..2403670bfd 100644
--- a/light/light_test.go
+++ b/light/light_test.go
@@ -70,7 +70,6 @@ func TestClientIntegration_Update(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
1,
- nil,
chainID,
primary,
nil,
@@ -216,7 +215,6 @@ func TestClientStatusRPC(t *testing.T) {
c, err := light.NewClientAtHeight(ctx,
2,
- nil,
chainID,
primary,
witnesses,
diff --git a/test/e2e/runner/setup.go b/test/e2e/runner/setup.go
index 77665e932e..0ca57c2284 100644
--- a/test/e2e/runner/setup.go
+++ b/test/e2e/runner/setup.go
@@ -9,7 +9,6 @@ import (
"fmt"
"os"
"path/filepath"
- "regexp"
"sort"
"strconv"
"strings"
@@ -454,27 +453,6 @@ func MakeAppConfig(node *e2e.Node) ([]byte, error) {
return buf.Bytes(), nil
}
-// UpdateConfigStateSync updates the state sync config for a node.
-// Arguments:
-// - node: the node to update
-// - height: the height to trust
-// - hash: the hash of the block at `height` to trust
-func UpdateConfigStateSync(node *e2e.Node, height int64, hash []byte) error {
- cfgPath := filepath.Join(node.Testnet.Dir, node.Name, "config", "config.toml")
-
- // FIXME Apparently there's no function to simply load a config file without
- // involving the entire Viper apparatus, so we'll just resort to regexps.
- bz, err := os.ReadFile(cfgPath)
- if err != nil {
- return err
- }
- bz = regexp.MustCompile(`(?m)^trust-height =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-height = %v`, height)))
- bz = regexp.MustCompile(`(?m)^trust-hash =.*`).ReplaceAll(bz, []byte(fmt.Sprintf(`trust-hash = "%X"`, hash)))
- //nolint: gosec
- // G306: Expect WriteFile permissions to be 0600 or less
- return os.WriteFile(cfgPath, bz, 0644)
-}
-
func newDefaultFilePV(node *e2e.Node, nodeDir string) (*privval.FilePV, error) {
return privval.NewFilePVWithOptions(
privval.WithPrivateKeysMap(node.PrivvalKeys),
diff --git a/test/e2e/runner/start.go b/test/e2e/runner/start.go
index 3b45597fb9..64c5b0ce8f 100644
--- a/test/e2e/runner/start.go
+++ b/test/e2e/runner/start.go
@@ -70,11 +70,6 @@ func Start(ctx context.Context, logger log.Logger, testnet *e2e.Testnet, ti infr
"nodes", len(testnet.Nodes)-len(nodeQueue),
"pending", len(nodeQueue))
- block, blockID, err := waitForHeight(ctx, testnet, networkHeight)
- if err != nil {
- return err
- }
-
for _, node := range nodeQueue {
if node.StartAt > networkHeight {
// if we're starting a node that's ahead of
@@ -93,16 +88,7 @@ func Start(ctx context.Context, logger log.Logger, testnet *e2e.Testnet, ti infr
networkHeight = node.StartAt
- block, blockID, err = waitForHeight(ctx, testnet, networkHeight)
- if err != nil {
- return err
- }
- }
-
- // Update any state sync nodes with a trusted height and hash
- if node.StateSync != e2e.StateSyncDisabled || node.Mode == e2e.ModeLight {
- err = UpdateConfigStateSync(node, block.Height, blockID.Hash.Bytes())
- if err != nil {
+ if _, _, err := waitForHeight(ctx, testnet, networkHeight); err != nil {
return err
}
}
From c1827ee1e1aac347fddc1d6646bf7367bd566e1e Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 08:31:40 +0100
Subject: [PATCH 14/65] test(light): remove temporarily added code
---
light/example_test.go | 86 -------------------------------------------
1 file changed, 86 deletions(-)
diff --git a/light/example_test.go b/light/example_test.go
index f58a1206be..55b93fedae 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,89 +113,3 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
-
-// Manually getting light blocks and verifying them.
-func TestClientLocalDevnet(t *testing.T) {
- const CHAINID = "dashmate_local_12"
-
- if testing.Short() {
- t.Skip("skipping test in short mode")
- }
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
- if err != nil {
- t.Fatal(err)
- }
-
- // Start a test application
- // app, err := kvstore.NewMemoryApp()
- // require.NoError(t, err)
-
- primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
- if err != nil {
- t.Fatal(err)
- }
-
- // give Tendermint time to generate some blocks
- time.Sleep(5 * time.Second)
-
- _, err = primary.LightBlock(ctx, 1)
- if err != nil {
- t.Fatal(err)
- }
-
- db := dbm.NewMemDB()
-
- // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
- require.NoError(t, err)
- coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
- "tenderdash", "IAzIcGlDfuow",
- logger)
- require.NoError(t, err)
-
- c, err := light.NewClientAtHeight(
- ctx,
- 1,
- CHAINID,
- primary,
- nil,
- dbs.New(db),
- coreClient,
- light.Logger(logger),
- )
-
- if err != nil {
- t.Fatal(err)
- }
- defer func() {
- if err := c.Cleanup(); err != nil {
- t.Fatal(err)
- }
- }()
-
- // wait for a few more blocks to be produced
- time.Sleep(2 * time.Second)
-
- // verify the block at height 3
- _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- // retrieve light block at height 3
- _, err = c.TrustedLightBlock(3)
- if err != nil {
- t.Fatal(err)
- }
-
- // update to the latest height
- lb, err := c.Update(ctx, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- logger.Info("verified light block", "light-block", lb)
-}
From e84e0bed2b198e7c474f48b05728753156f569b4 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 09:09:10 +0100
Subject: [PATCH 15/65] test(statesync): fix state sync tests
---
internal/statesync/reactor_test.go | 2 ++
internal/statesync/syncer_test.go | 22 ++++++++++++++++++----
2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index 951e49239f..799f017b9a 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -236,6 +236,8 @@ func TestReactor_Sync(t *testing.T) {
Once().
Return(&abci.ResponseApplySnapshotChunk{Result: abci.ResponseApplySnapshotChunk_COMPLETE_SNAPSHOT}, nil)
+ rts.conn.On("FinalizeSnapshot", ctx, mock.Anything).Return(&abci.ResponseFinalizeSnapshot{}, nil).Once()
+
// app query returns valid state app hash
rts.conn.
On("Info", mock.Anything, &proxy.RequestInfo).
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 0854c65122..4c116b1617 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -100,7 +100,19 @@ func (suite *SyncerTestSuite) TestSyncAny() {
ConsensusParams: *types.DefaultConsensusParams(),
LastHeightConsensusParamsChanged: 1,
}
- commit := &types.Commit{BlockID: types.BlockID{Hash: []byte("blockhash")}}
+ commit := &types.Commit{
+ Height: 1,
+ BlockID: types.BlockID{Hash: []byte("blockhash")},
+ }
+
+ lightBlock := types.LightBlock{
+ SignedHeader: &types.SignedHeader{
+ Commit: commit,
+ Header: &types.Header{
+ Height: 1,
+ },
+ },
+ }
s := &snapshot{Height: 1, Version: 1, Hash: []byte{0}}
chunks := []*chunk{
@@ -116,9 +128,8 @@ func (suite *SyncerTestSuite) TestSyncAny() {
suite.stateProvider.
On("AppHash", mock.Anything, uint64(2)).
Return(tmbytes.HexBytes("app_hash_2"), nil)
- suite.stateProvider.
- On("Commit", mock.Anything, uint64(1)).
- Return(commit, nil)
+ suite.stateProvider.On("LightBlock", mock.Anything, uint64(commit.Height)).
+ Return(&lightBlock, nil)
suite.stateProvider.
On("State", mock.Anything, uint64(1)).
Return(state, nil)
@@ -254,6 +265,9 @@ func (suite *SyncerTestSuite) TestSyncAny() {
Once().
Return(asc.resp, nil)
}
+ suite.conn.On("FinalizeSnapshot", mock.Anything, mock.Anything).
+ Once().
+ Return(&abci.ResponseFinalizeSnapshot{}, nil)
suite.conn.
On("Info", mock.Anything, &proxy.RequestInfo).
Once().
From af796974380b93f18a4d783f346fb34a81aafdce Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 09:37:19 +0100
Subject: [PATCH 16/65] chore: apply code rabbit comments
---
abci/example/kvstore/kvstore.go | 6 ++++--
abci/types/application.go | 1 +
abci/types/types.pb.go | 10 +++++++---
proto/tendermint/abci/types.proto | 11 +++++++----
spec/abci++/api.md | 10 +++++++---
5 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index af33b3cffb..7fffaa810e 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -586,11 +586,13 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
// we verify snapshot height and app hash, as there is no additional logic to be called here
if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch")
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
+ app.LastCommittedState.GetHeight(), req.LightBlock.SignedHeader.Header.Height)
}
if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch")
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
+ app.LastCommittedState.GetAppHash(), req.LightBlock.SignedHeader.Header.AppHash)
}
app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
diff --git a/abci/types/application.go b/abci/types/application.go
index 9000d8a884..3a19116bdc 100644
--- a/abci/types/application.go
+++ b/abci/types/application.go
@@ -99,6 +99,7 @@ func (BaseApplication) ApplySnapshotChunk(_ context.Context, _req *RequestApplyS
return &ResponseApplySnapshotChunk{}, nil
}
+// FinalizeSnapshot provides a no-op implementation for the StateSyncer interface
func (BaseApplication) FinalizeSnapshot(_ context.Context, _req *RequestFinalizeSnapshot) (*ResponseFinalizeSnapshot, error) {
return &ResponseFinalizeSnapshot{}, nil
}
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 9855779aef..246d965d1e 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1174,9 +1174,13 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
-// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-// It includes the light block committed at the synced height, which Tenderdash uses
-// to reconstruct its own state.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+// The application should validate the light block against its restored state.
+//
+// If the application fails to validate the light block, it should return error in the response.
+// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
type RequestFinalizeSnapshot struct {
// light block committed at the synced height
LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 4a10c16abb..7cdcc3ea98 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -183,10 +183,13 @@ message RequestApplySnapshotChunk {
bytes chunk = 2; // The binary chunk contents, as returned by LoadSnapshotChunk.
string sender = 3; // The P2P ID of the node who sent this chunk.
}
-
-// After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-// It includes the light block committed at the synced height, which Tenderdash uses
-// to reconstruct its own state.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+// The application should validate the light block against its restored state.
+//
+// If the application fails to validate the light block, it should return error in the response.
+// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
message RequestFinalizeSnapshot {
// light block committed at the synced height
tendermint.types.LightBlock light_block = 1;
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 8d10026a8c..7be7254bea 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -429,9 +429,13 @@ Finalize newly decided block.
### RequestFinalizeSnapshot
-After snapshot sync, Tenderdash calls this to finalize the snapshot sync.
-It includes the light block committed at the synced height, which Tenderdash uses
-to reconstruct its own state.
+RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
+It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
+The application should validate the light block against its restored state.
+
+If the application fails to validate the light block, it should return error in the response.
+This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
| Field | Type | Label | Description |
From a9cf16f985e336cf7744a7e7b49f411c47cb900d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 10:53:54 +0100
Subject: [PATCH 17/65] chore: self review
---
abci/types/types.pb.go | 2 +-
light/client.go | 1 -
light/client_test.go | 3 ++-
proto/tendermint/abci/types.proto | 2 +-
spec/abci++/api.md | 2 +-
5 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 246d965d1e..00cbfc9108 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1174,7 +1174,7 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
return ""
}
-// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
// The application should validate the light block against its restored state.
diff --git a/light/client.go b/light/client.go
index e12e5e80ea..e2e10487ec 100644
--- a/light/client.go
+++ b/light/client.go
@@ -260,7 +260,6 @@ func (c *Client) initialize(ctx context.Context) error {
// initializeAtHeight fetches a light block at given height from
// primary provider.
-// If blockHash is not nil, it will be used to verify the block.
func (c *Client) initializeAtHeight(ctx context.Context, height int64) error {
// 1) Fetch and verify the light block.
l, err := c.lightBlockFromPrimaryAtHeight(ctx, height)
diff --git a/light/client_test.go b/light/client_test.go
index 8bdd022b5f..8dbecbe852 100644
--- a/light/client_test.go
+++ b/light/client_test.go
@@ -645,7 +645,8 @@ func TestClient(t *testing.T) {
c, err := light.NewClientAtHeight(
ctx,
- 1, chainID,
+ 1,
+ chainID,
mockBadNode,
nil,
dbs.New(dbm.NewMemDB()),
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 7cdcc3ea98..4b67f05b38 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -183,7 +183,7 @@ message RequestApplySnapshotChunk {
bytes chunk = 2; // The binary chunk contents, as returned by LoadSnapshotChunk.
string sender = 3; // The P2P ID of the node who sent this chunk.
}
-// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+// RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
// when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
// It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
// The application should validate the light block against its restored state.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index 7be7254bea..c1310169fc 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -429,7 +429,7 @@ Finalize newly decided block.
### RequestFinalizeSnapshot
-RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, eg.
+RequestFinalizeSnapshot is called by Tenderdash after successfully applying all snapshot chunks, e.g.
when the ABCI application returned `ResponseApplySnapshotChunk` with `Result = ACCEPT`.
It includes the light block committed at the synced height, which Tenderdash uses to reconstruct its own state.
The application should validate the light block against its restored state.
From bc399c86d5c2da08164397513c2d572a0889a2ea Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 12:37:21 +0100
Subject: [PATCH 18/65] deps: update dashd-go
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 472ec381c0..da7cf2579b 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e
+ github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index d136be00f1..9384673449 100644
--- a/go.sum
+++ b/go.sum
@@ -218,8 +218,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e h1:VAyUrB9BWe05tSuEx5xW0LsxBtm4TPltetB0BwFHVEs=
-github.com/dashpay/dashd-go v0.26.1-0.20250113154619-015ef93ad36e/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191 h1:+3tjhUhU3pDxp7Wn6IefE+K744UckDVdUywro2l1FW8=
+github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From 34936f9debd8992fa1c836172d46fcbb880100be Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 12:52:13 +0100
Subject: [PATCH 19/65] deps: update dashd-go
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index da7cf2579b..569b362258 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191
+ github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index 9384673449..e896391b6b 100644
--- a/go.sum
+++ b/go.sum
@@ -218,8 +218,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191 h1:+3tjhUhU3pDxp7Wn6IefE+K744UckDVdUywro2l1FW8=
-github.com/dashpay/dashd-go v0.26.1-0.20250120111006-f2e635c9e191/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7 h1:Er4zUGcd9UKXBPCbLBaclSxsMNUsK3fW2elJGTYSnJs=
+github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From 8726abb8b5147b88ae69c58cb76d74978f194d99 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:28:30 +0100
Subject: [PATCH 20/65] chore: add genesis block to finalizesnapshot
---
abci/types/types.pb.go | 602 ++++++++++++++++--------------
internal/statesync/syncer.go | 25 +-
light/example_test.go | 86 +++++
proto/tendermint/abci/types.proto | 6 +-
spec/abci++/api.md | 3 +-
5 files changed, 444 insertions(+), 278 deletions(-)
diff --git a/abci/types/types.pb.go b/abci/types/types.pb.go
index 00cbfc9108..4d650aed85 100644
--- a/abci/types/types.pb.go
+++ b/abci/types/types.pb.go
@@ -1182,8 +1182,10 @@ func (m *RequestApplySnapshotChunk) GetSender() string {
// If the application fails to validate the light block, it should return error in the response.
// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
type RequestFinalizeSnapshot struct {
- // light block committed at the synced height
- LightBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=light_block,json=lightBlock,proto3" json:"light_block,omitempty"`
+ // Snapshot block is a block at which the snapshot was taken.
+ SnapshotBlock *types1.LightBlock `protobuf:"bytes,1,opt,name=snapshot_block,json=snapshotBlock,proto3" json:"snapshot_block,omitempty"`
+ // Genesis block is the first block of the chain
+ GenesisBlock *types1.LightBlock `protobuf:"bytes,2,opt,name=genesis_block,json=genesisBlock,proto3" json:"genesis_block,omitempty"`
}
func (m *RequestFinalizeSnapshot) Reset() { *m = RequestFinalizeSnapshot{} }
@@ -1219,9 +1221,16 @@ func (m *RequestFinalizeSnapshot) XXX_DiscardUnknown() {
var xxx_messageInfo_RequestFinalizeSnapshot proto.InternalMessageInfo
-func (m *RequestFinalizeSnapshot) GetLightBlock() *types1.LightBlock {
+func (m *RequestFinalizeSnapshot) GetSnapshotBlock() *types1.LightBlock {
if m != nil {
- return m.LightBlock
+ return m.SnapshotBlock
+ }
+ return nil
+}
+
+func (m *RequestFinalizeSnapshot) GetGenesisBlock() *types1.LightBlock {
+ if m != nil {
+ return m.GenesisBlock
}
return nil
}
@@ -4489,245 +4498,246 @@ func init() {
func init() { proto.RegisterFile("tendermint/abci/types.proto", fileDescriptor_252557cfdd89a31a) }
var fileDescriptor_252557cfdd89a31a = []byte{
- // 3796 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x70, 0x1b, 0x57,
- 0x72, 0xc6, 0xe0, 0x1f, 0x8d, 0xbf, 0xe1, 0x23, 0x25, 0x41, 0x90, 0x44, 0x72, 0x47, 0xf1, 0x4a,
- 0xab, 0xb5, 0x49, 0xaf, 0x14, 0xaf, 0xec, 0xec, 0x6e, 0xaa, 0x40, 0x10, 0x0a, 0x48, 0x51, 0x24,
- 0x3d, 0x04, 0xa9, 0x75, 0x1c, 0x7b, 0x6a, 0x08, 0x3c, 0x02, 0x63, 0x01, 0x98, 0xf1, 0xcc, 0x80,
- 0x02, 0x7d, 0x4d, 0x52, 0x95, 0xf2, 0xc9, 0xf7, 0x94, 0x6f, 0xc9, 0x31, 0xf7, 0x9c, 0x92, 0x5b,
- 0xe2, 0x54, 0x2e, 0x3e, 0xa6, 0x2a, 0x55, 0x8a, 0x4b, 0xbe, 0xe5, 0xe6, 0x53, 0x2e, 0x39, 0xa4,
- 0xde, 0xcf, 0xfc, 0x02, 0x83, 0x1f, 0xcb, 0x55, 0xa9, 0xbd, 0xe1, 0xf5, 0xeb, 0xee, 0x79, 0x3f,
- 0xfd, 0xba, 0xfb, 0x7d, 0xfd, 0x00, 0xb7, 0x6c, 0x3c, 0xec, 0x60, 0x73, 0xa0, 0x0d, 0xed, 0x6d,
- 0xf5, 0xbc, 0xad, 0x6d, 0xdb, 0x57, 0x06, 0xb6, 0xb6, 0x0c, 0x53, 0xb7, 0x75, 0x54, 0xf6, 0x3a,
- 0xb7, 0x48, 0x67, 0xf5, 0x8e, 0x8f, 0xbb, 0x6d, 0x5e, 0x19, 0xb6, 0xbe, 0x6d, 0x98, 0xba, 0x7e,
- 0xc1, 0xf8, 0xab, 0x7e, 0x65, 0x54, 0xcf, 0x76, 0x47, 0xb5, 0x7a, 0xbc, 0xf3, 0xf6, 0x44, 0xe7,
- 0x79, 0x5f, 0x6f, 0xbf, 0x88, 0xec, 0xf5, 0x0d, 0x24, 0xd0, 0xcb, 0xbf, 0xfb, 0x02, 0x5f, 0x39,
- 0xbd, 0x77, 0x26, 0x64, 0x0d, 0xd5, 0x54, 0x07, 0x4e, 0xf7, 0xba, 0xaf, 0xfb, 0x12, 0x9b, 0x96,
- 0xa6, 0x0f, 0x03, 0xca, 0x37, 0xba, 0xba, 0xde, 0xed, 0xe3, 0x6d, 0xda, 0x3a, 0x1f, 0x5d, 0x6c,
- 0xdb, 0xda, 0x00, 0x5b, 0xb6, 0x3a, 0x30, 0x38, 0xc3, 0x5a, 0x57, 0xef, 0xea, 0xf4, 0xe7, 0x36,
- 0xf9, 0xc5, 0xa8, 0xd2, 0xab, 0x1c, 0x64, 0x64, 0xfc, 0xf9, 0x08, 0x5b, 0x36, 0x7a, 0x08, 0x49,
- 0xdc, 0xee, 0xe9, 0x15, 0x61, 0x53, 0xb8, 0x9f, 0x7f, 0x78, 0x7b, 0x2b, 0xb4, 0x6e, 0x5b, 0x9c,
- 0xaf, 0xd1, 0xee, 0xe9, 0xcd, 0x98, 0x4c, 0x79, 0xd1, 0x7b, 0x90, 0xba, 0xe8, 0x8f, 0xac, 0x5e,
- 0x25, 0x4e, 0x85, 0xee, 0x44, 0x09, 0x3d, 0x21, 0x4c, 0xcd, 0x98, 0xcc, 0xb8, 0xc9, 0xa7, 0xb4,
- 0xe1, 0x85, 0x5e, 0x49, 0xcc, 0xfe, 0xd4, 0xde, 0xf0, 0x82, 0x7e, 0x8a, 0xf0, 0xa2, 0x1d, 0x00,
- 0x6d, 0xa8, 0xd9, 0x4a, 0xbb, 0xa7, 0x6a, 0xc3, 0x4a, 0x92, 0x4a, 0xfe, 0x2c, 0x5a, 0x52, 0xb3,
- 0xeb, 0x84, 0xb1, 0x19, 0x93, 0x73, 0x9a, 0xd3, 0x20, 0xc3, 0xfd, 0x7c, 0x84, 0xcd, 0xab, 0x4a,
- 0x6a, 0xf6, 0x70, 0x3f, 0x24, 0x4c, 0x64, 0xb8, 0x94, 0x1b, 0xfd, 0x16, 0xb2, 0xed, 0x1e, 0x6e,
- 0xbf, 0x50, 0xec, 0x71, 0x25, 0x43, 0x25, 0x37, 0xa2, 0x24, 0xeb, 0x84, 0xaf, 0x35, 0x6e, 0xc6,
- 0xe4, 0x4c, 0x9b, 0xfd, 0x44, 0x87, 0x50, 0xea, 0x6b, 0x96, 0xad, 0x58, 0x43, 0xd5, 0xb0, 0x7a,
- 0xba, 0x6d, 0x55, 0xf2, 0x54, 0xc7, 0x5b, 0x51, 0x3a, 0x0e, 0x34, 0xcb, 0x3e, 0x71, 0x98, 0x9b,
- 0x31, 0xb9, 0xd8, 0xf7, 0x13, 0x88, 0x3e, 0xfd, 0xe2, 0x02, 0x9b, 0xae, 0xc2, 0x4a, 0x61, 0xb6,
- 0xbe, 0x23, 0xc2, 0xed, 0xc8, 0x13, 0x7d, 0xba, 0x9f, 0x80, 0x3e, 0x86, 0xd5, 0xbe, 0xae, 0x76,
- 0x5c, 0x75, 0x4a, 0xbb, 0x37, 0x1a, 0xbe, 0xa8, 0x14, 0xa9, 0xd2, 0x5f, 0x44, 0x0e, 0x52, 0x57,
- 0x3b, 0x8e, 0x8a, 0x3a, 0x11, 0x68, 0xc6, 0xe4, 0x95, 0x7e, 0x98, 0x88, 0x3e, 0x85, 0x35, 0xd5,
- 0x30, 0xfa, 0x57, 0x61, 0xed, 0x25, 0xaa, 0xfd, 0x41, 0x94, 0xf6, 0x1a, 0x91, 0x09, 0xab, 0x47,
- 0xea, 0x04, 0x15, 0x3d, 0x87, 0x95, 0x0b, 0x6d, 0xa8, 0xf6, 0xb5, 0x2f, 0xb0, 0xb7, 0x1e, 0x6b,
- 0x54, 0xf9, 0xfd, 0x48, 0x63, 0xe4, 0x02, 0xbe, 0x25, 0x11, 0x2f, 0x42, 0x34, 0xd4, 0x02, 0xd1,
- 0x30, 0xb1, 0xa1, 0x9a, 0x58, 0x31, 0x4c, 0xdd, 0xd0, 0x2d, 0xb5, 0x5f, 0x29, 0x53, 0xbd, 0xf7,
- 0xa2, 0xf4, 0x1e, 0x33, 0xfe, 0x63, 0xce, 0xde, 0x8c, 0xc9, 0x65, 0x23, 0x48, 0x62, 0x5a, 0xf5,
- 0x36, 0xb6, 0x2c, 0x4f, 0xab, 0x38, 0x4f, 0x2b, 0xe5, 0x0f, 0x6a, 0x0d, 0x90, 0x50, 0x03, 0xf2,
- 0x78, 0x4c, 0xc4, 0x95, 0x4b, 0xdd, 0xc6, 0x95, 0x15, 0xaa, 0x50, 0x8a, 0x3c, 0xc0, 0x94, 0xf5,
- 0x4c, 0xb7, 0x71, 0x33, 0x26, 0x03, 0x76, 0x5b, 0x48, 0x85, 0x6b, 0x97, 0xd8, 0xd4, 0x2e, 0xae,
- 0xa8, 0x1a, 0x85, 0xf6, 0x10, 0x47, 0x53, 0x41, 0x54, 0xe1, 0x2f, 0xa3, 0x14, 0x9e, 0x51, 0x21,
- 0xa2, 0xa2, 0xe1, 0x88, 0x34, 0x63, 0xf2, 0xea, 0xe5, 0x24, 0x99, 0xd8, 0xae, 0xbb, 0x5d, 0xd4,
- 0x73, 0x56, 0x56, 0x67, 0xdb, 0xae, 0xb3, 0x57, 0x3b, 0x84, 0x99, 0xd8, 0xee, 0x85, 0x9f, 0xb0,
- 0x93, 0x81, 0xd4, 0xa5, 0xda, 0x1f, 0xe1, 0xfd, 0x64, 0x36, 0x2d, 0x66, 0xf6, 0x93, 0xd9, 0xac,
- 0x98, 0xdb, 0x4f, 0x66, 0x73, 0x22, 0xec, 0x27, 0xb3, 0x20, 0xe6, 0xa5, 0x7b, 0x90, 0xf7, 0xf9,
- 0x2d, 0x54, 0x81, 0xcc, 0x00, 0x5b, 0x96, 0xda, 0xc5, 0xd4, 0xcd, 0xe5, 0x64, 0xa7, 0x29, 0x95,
- 0xa0, 0xe0, 0xf7, 0x55, 0xd2, 0x57, 0x82, 0x2b, 0x49, 0xdc, 0x10, 0x91, 0xe4, 0x7e, 0xd7, 0x91,
- 0xe4, 0x4d, 0x74, 0x17, 0x8a, 0x74, 0x2a, 0x8a, 0xd3, 0x4f, 0x7c, 0x61, 0x52, 0x2e, 0x50, 0xe2,
- 0x19, 0x67, 0xda, 0x80, 0xbc, 0xf1, 0xd0, 0x70, 0x59, 0x12, 0x94, 0x05, 0x8c, 0x87, 0x86, 0xc3,
- 0xf0, 0x33, 0x28, 0x90, 0x79, 0xbb, 0x1c, 0x49, 0xfa, 0x91, 0x3c, 0xa1, 0x71, 0x16, 0xe9, 0xaf,
- 0x12, 0x20, 0x86, 0xfd, 0x1b, 0x7a, 0x1f, 0x92, 0xc4, 0xd5, 0x73, 0xaf, 0x5d, 0xdd, 0x62, 0x71,
- 0x60, 0xcb, 0x89, 0x03, 0x5b, 0x2d, 0x27, 0x0e, 0xec, 0x64, 0xbf, 0x79, 0xb5, 0x11, 0xfb, 0xea,
- 0xbf, 0x36, 0x04, 0x99, 0x4a, 0xa0, 0x9b, 0xc4, 0xab, 0xa9, 0xda, 0x50, 0xd1, 0x3a, 0x74, 0xc8,
- 0x39, 0xe2, 0xb2, 0x54, 0x6d, 0xb8, 0xd7, 0x41, 0x07, 0x20, 0xb6, 0xf5, 0xa1, 0x85, 0x87, 0xd6,
- 0xc8, 0x52, 0x58, 0x1c, 0xe2, 0xbe, 0x3a, 0xe0, 0x71, 0x59, 0x00, 0xaa, 0x3b, 0x9c, 0xc7, 0x94,
- 0x51, 0x2e, 0xb7, 0x83, 0x04, 0x74, 0x08, 0xc5, 0x4b, 0xb5, 0xaf, 0x75, 0x54, 0x5b, 0x37, 0x15,
- 0x0b, 0xdb, 0xdc, 0x79, 0xdf, 0x9d, 0xd8, 0xf3, 0x33, 0x87, 0xeb, 0x04, 0xdb, 0xa7, 0x46, 0x47,
- 0xb5, 0xf1, 0x4e, 0xf2, 0x9b, 0x57, 0x1b, 0x82, 0x5c, 0xb8, 0xf4, 0xf5, 0xa0, 0x9f, 0x43, 0x59,
- 0x35, 0x0c, 0xc5, 0xb2, 0x55, 0x1b, 0x2b, 0xe7, 0x57, 0x36, 0xb6, 0xa8, 0x3f, 0x2f, 0xc8, 0x45,
- 0xd5, 0x30, 0x4e, 0x08, 0x75, 0x87, 0x10, 0xd1, 0x5b, 0x50, 0x22, 0xae, 0x5f, 0x53, 0xfb, 0x4a,
- 0x0f, 0x6b, 0xdd, 0x9e, 0x5d, 0x49, 0x6f, 0x0a, 0xf7, 0x13, 0x72, 0x91, 0x53, 0x9b, 0x94, 0x88,
- 0xb6, 0x60, 0xd5, 0x61, 0x6b, 0xeb, 0x26, 0x76, 0x78, 0x89, 0xa3, 0x2f, 0xca, 0x2b, 0xbc, 0xab,
- 0xae, 0x9b, 0x98, 0xf1, 0x4b, 0x1d, 0xd7, 0x52, 0x68, 0x98, 0x40, 0x08, 0x92, 0x1d, 0xd5, 0x56,
- 0xe9, 0x0e, 0x14, 0x64, 0xfa, 0x9b, 0xd0, 0x0c, 0xd5, 0xee, 0xf1, 0x75, 0xa5, 0xbf, 0xd1, 0x75,
- 0x48, 0x73, 0xd5, 0x09, 0x3a, 0x0c, 0xde, 0x42, 0x6b, 0x90, 0x32, 0x4c, 0xfd, 0x12, 0xd3, 0x65,
- 0xc9, 0xca, 0xac, 0x21, 0xc9, 0x50, 0x0a, 0x86, 0x14, 0x54, 0x82, 0xb8, 0x3d, 0xe6, 0x5f, 0x89,
- 0xdb, 0x63, 0xf4, 0x2e, 0x24, 0xc9, 0x06, 0xd0, 0x6f, 0x94, 0xa6, 0x04, 0x51, 0x2e, 0xd7, 0xba,
- 0x32, 0xb0, 0x4c, 0x39, 0xa5, 0xeb, 0xb0, 0x36, 0x2d, 0xc4, 0x48, 0x3d, 0x97, 0x1e, 0x08, 0x15,
- 0xe8, 0x3d, 0xc8, 0xba, 0x3e, 0x95, 0xd9, 0xd7, 0xcd, 0x89, 0xaf, 0x38, 0xcc, 0xb2, 0xcb, 0x4a,
- 0x0c, 0x8b, 0xec, 0x4f, 0x4f, 0xe5, 0x79, 0x41, 0x41, 0xce, 0xa8, 0x86, 0xd1, 0x54, 0xad, 0x9e,
- 0xd4, 0x85, 0x4a, 0x54, 0xfc, 0xf0, 0xad, 0x8f, 0x40, 0x4f, 0x87, 0xb3, 0x3e, 0xbe, 0x93, 0x17,
- 0xa7, 0x7b, 0xe2, 0x9e, 0x3c, 0x6a, 0xc1, 0xa3, 0xe1, 0x0b, 0x62, 0xc1, 0x09, 0xf6, 0x21, 0xda,
- 0xde, 0xeb, 0x48, 0x1d, 0xb8, 0x19, 0x19, 0x4a, 0x02, 0x72, 0x42, 0x40, 0x8e, 0x6c, 0x06, 0x0b,
- 0x50, 0x6c, 0xe0, 0xac, 0x41, 0x86, 0x66, 0xd1, 0x79, 0xd3, 0xcf, 0xe4, 0x64, 0xde, 0x92, 0x7e,
- 0x0f, 0x37, 0x22, 0x62, 0x0a, 0xfa, 0x1d, 0xe4, 0xfb, 0x64, 0xf8, 0xdc, 0xcd, 0x4d, 0x49, 0xaa,
- 0xd8, 0xe9, 0x39, 0x20, 0x4c, 0xd4, 0x99, 0xc9, 0xd0, 0x77, 0x7f, 0x4b, 0x3f, 0x24, 0xe1, 0xfa,
- 0xf4, 0xb0, 0x82, 0x36, 0xa1, 0x30, 0x50, 0xc7, 0x8a, 0x3d, 0xe6, 0xb6, 0x2f, 0x50, 0x6b, 0x82,
- 0x81, 0x3a, 0x6e, 0x8d, 0x99, 0xe1, 0x8b, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe, 0x99, 0xb8, 0x5f,
- 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5, 0xb2, 0x95, 0xb6,
- 0x3e, 0x18, 0x68, 0x36, 0x3f, 0xd1, 0xb7, 0x26, 0x0d, 0x87, 0x76, 0x13, 0xaf, 0x47, 0x8f, 0x5f,
- 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40, 0xb3, 0xce, 0x71,
- 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0xe3, 0x9e, 0x79, 0x3c, 0x5c, 0x93,
- 0x5f, 0xcc, 0xb7, 0xe1, 0xa9, 0xc0, 0x81, 0x70, 0x5c, 0x5a, 0x7a, 0x69, 0x97, 0xf6, 0x2e, 0xac,
- 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0x77, 0x61, 0x31, 0x2b, 0xcc, 0xd0, 0xcd, 0x44, 0xa4, 0xcf, 0xf5,
- 0x31, 0x16, 0x31, 0x48, 0xb2, 0xdf, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d, 0xe1, 0x7e, 0x4a,
- 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0x15, 0x30, 0xff, 0x48, 0x36, 0x04, 0x77, 0x1c, 0xbf, 0x90,
- 0xa3, 0x36, 0x78, 0x8d, 0xf4, 0x53, 0x0f, 0x7c, 0x40, 0x7b, 0xb9, 0x2f, 0xd9, 0x86, 0x35, 0x16,
- 0xd7, 0xb1, 0x49, 0x02, 0x3c, 0xd9, 0x24, 0x3a, 0x00, 0xa0, 0x03, 0x58, 0x71, 0xfa, 0x8e, 0x4d,
- 0xbd, 0x35, 0xa6, 0xdf, 0x7f, 0xd7, 0x15, 0xe8, 0x28, 0xe4, 0xd0, 0x38, 0x96, 0x9e, 0xa7, 0x47,
- 0x00, 0x39, 0x7d, 0x35, 0xc3, 0x0d, 0x14, 0x8f, 0xbd, 0xe3, 0x50, 0x98, 0xcc, 0x62, 0x79, 0x97,
- 0xe7, 0x94, 0xbd, 0xd3, 0xb2, 0x01, 0xf9, 0xcf, 0x47, 0xba, 0x39, 0x1a, 0xb0, 0x21, 0x15, 0xe9,
- 0x90, 0x80, 0x91, 0xe8, 0xe1, 0xfc, 0xe7, 0x94, 0xcf, 0xe6, 0x82, 0x19, 0x06, 0xb7, 0x28, 0xc1,
- 0xb3, 0xa8, 0x13, 0xdf, 0xc0, 0xfd, 0x46, 0x15, 0x5f, 0xd4, 0xa8, 0xdc, 0xb9, 0x45, 0xdb, 0x55,
- 0xe2, 0xc7, 0xd9, 0x15, 0x82, 0x24, 0x9d, 0x61, 0x92, 0x39, 0x64, 0xf2, 0x3b, 0xd2, 0xd6, 0xdc,
- 0xfd, 0x4f, 0xfb, 0xf7, 0xdf, 0xb1, 0xc0, 0xcc, 0x4f, 0x66, 0x81, 0xd9, 0x48, 0x0b, 0xfc, 0xd1,
- 0xb6, 0xd6, 0x82, 0xeb, 0x21, 0x41, 0x65, 0x44, 0x83, 0x26, 0xb5, 0xb6, 0xd0, 0x1d, 0xc5, 0x09,
- 0xd5, 0x3e, 0x45, 0xf2, 0x6a, 0x40, 0x2f, 0x0b, 0xb8, 0x91, 0x16, 0x9c, 0x5f, 0xd6, 0x82, 0x0b,
- 0x8b, 0x58, 0x70, 0xf1, 0x4d, 0x2c, 0xb8, 0x34, 0x61, 0xc1, 0xa7, 0xb0, 0x32, 0x91, 0xe4, 0xba,
- 0xe6, 0x20, 0x4c, 0x35, 0x87, 0xf8, 0x74, 0x73, 0x48, 0xf8, 0xcc, 0x41, 0xfa, 0x4e, 0x80, 0x6a,
- 0x74, 0xae, 0x3b, 0xf5, 0x03, 0xbf, 0x82, 0x6b, 0x5e, 0xce, 0xe3, 0x5f, 0x47, 0x16, 0x57, 0x90,
- 0xdb, 0xe9, 0x2d, 0xe4, 0x8c, 0xfc, 0x80, 0x8d, 0x29, 0xe9, 0x37, 0xd1, 0x67, 0x50, 0x0e, 0x66,
- 0xe9, 0x24, 0x09, 0x22, 0xc7, 0xe5, 0x8f, 0x26, 0x8e, 0x8b, 0xb7, 0x16, 0xee, 0x98, 0xe5, 0xd2,
- 0xa5, 0xbf, 0x69, 0x49, 0xff, 0x1e, 0x77, 0x73, 0x80, 0x40, 0xca, 0x8d, 0x3e, 0x80, 0x34, 0x3f,
- 0xd9, 0xc2, 0xa2, 0x27, 0x9b, 0x0b, 0x84, 0x4f, 0x73, 0xfc, 0xcd, 0x4e, 0x73, 0x62, 0xea, 0xf6,
- 0x25, 0xa7, 0x2f, 0x55, 0xca, 0xbf, 0x54, 0xef, 0x40, 0x8a, 0x05, 0x61, 0x16, 0x50, 0x6e, 0x4c,
- 0x9e, 0x0b, 0x16, 0x7f, 0x19, 0x17, 0xaa, 0x41, 0x96, 0xe5, 0xf3, 0x5a, 0x87, 0x3b, 0x80, 0x9b,
- 0x11, 0x12, 0x7b, 0xbb, 0x3b, 0xf9, 0xd7, 0xaf, 0x36, 0x32, 0xbc, 0x21, 0x67, 0xa8, 0xdc, 0x5e,
- 0x47, 0xfa, 0x5b, 0x80, 0xac, 0x8c, 0x2d, 0x83, 0x98, 0x30, 0xda, 0x81, 0x1c, 0x1e, 0xb7, 0xb1,
- 0x61, 0x3b, 0x77, 0x87, 0xe9, 0x77, 0x33, 0xc6, 0xdd, 0x70, 0x38, 0x9b, 0x31, 0xd9, 0x13, 0x43,
- 0x8f, 0x38, 0x36, 0x13, 0x0d, 0xb3, 0x70, 0x71, 0x3f, 0x38, 0xf3, 0x6b, 0x07, 0x9c, 0x61, 0x81,
- 0x7e, 0x3d, 0x52, 0x2a, 0x84, 0xce, 0x3c, 0xe2, 0xe8, 0x4c, 0x72, 0xce, 0xc7, 0x02, 0xf0, 0x4c,
- 0x3d, 0x00, 0xcf, 0xa4, 0xe6, 0x4c, 0x33, 0x02, 0x9f, 0xf9, 0xb5, 0x83, 0xcf, 0xa4, 0xe7, 0x8c,
- 0x38, 0x04, 0xd0, 0xfc, 0x6e, 0x02, 0xa0, 0xd9, 0x8c, 0x14, 0x9d, 0x82, 0xd0, 0x1c, 0x4d, 0x20,
- 0x34, 0x59, 0xaa, 0xe4, 0xe7, 0x91, 0x4a, 0xe6, 0x40, 0x34, 0x47, 0x13, 0x10, 0x4d, 0x6e, 0x8e,
- 0xc2, 0x39, 0x18, 0xcd, 0x5f, 0x4c, 0xc7, 0x68, 0x20, 0x12, 0x45, 0xe1, 0xc3, 0x5c, 0x0c, 0xa4,
- 0x51, 0x22, 0x40, 0x9a, 0x7c, 0xe4, 0xbd, 0x9f, 0xa9, 0x5f, 0x18, 0xa5, 0xf9, 0xfd, 0x34, 0x94,
- 0x66, 0x25, 0x12, 0x60, 0xe2, 0x56, 0xb9, 0x08, 0x4c, 0x73, 0x3a, 0x05, 0xa6, 0x29, 0x44, 0xc2,
- 0x3f, 0x4c, 0xf1, 0x02, 0x38, 0xcd, 0xe9, 0x14, 0x9c, 0xa6, 0x38, 0x57, 0xed, 0x5c, 0xa0, 0xe6,
- 0x49, 0x10, 0xa8, 0x29, 0x45, 0xdc, 0x83, 0x3d, 0x67, 0x10, 0x81, 0xd4, 0x9c, 0x47, 0x21, 0x35,
- 0x0c, 0xa1, 0x7a, 0x3b, 0x52, 0xe3, 0x12, 0x50, 0xcd, 0xd1, 0x04, 0x54, 0x23, 0xce, 0xb1, 0xe1,
- 0x05, 0xb1, 0x1a, 0xe9, 0x17, 0x24, 0x4a, 0x87, 0xdc, 0x1d, 0x71, 0xdd, 0xd8, 0x34, 0x75, 0x93,
- 0xa3, 0x2b, 0xac, 0x21, 0xdd, 0x27, 0x77, 0x6d, 0xcf, 0xb5, 0xcd, 0xc0, 0x6f, 0xca, 0x50, 0x0c,
- 0xb8, 0x33, 0xe9, 0x1f, 0x05, 0x4f, 0x96, 0x22, 0x38, 0xfe, 0x7b, 0x7a, 0x8e, 0xdf, 0xd3, 0x43,
- 0x77, 0xcb, 0x5c, 0x20, 0xd7, 0xf0, 0x67, 0x33, 0x1c, 0xb0, 0x51, 0xbd, 0x2c, 0xe6, 0x01, 0xac,
- 0xd0, 0xbc, 0x97, 0xc5, 0x8a, 0x40, 0x38, 0x2a, 0x93, 0x0e, 0xb6, 0x0a, 0x2c, 0x2e, 0xbd, 0x03,
- 0xab, 0x3e, 0x5e, 0xf7, 0x72, 0xcc, 0x50, 0x0b, 0xd1, 0xe5, 0xae, 0xf1, 0x5b, 0xf2, 0xbf, 0x26,
- 0xbc, 0x15, 0xf2, 0x90, 0x9e, 0x69, 0xa0, 0x8c, 0xf0, 0xa3, 0x41, 0x99, 0xe8, 0x4b, 0x3a, 0xfa,
- 0x18, 0xd6, 0x02, 0x78, 0x8d, 0x93, 0x56, 0x26, 0x96, 0x83, 0x6d, 0x62, 0xbe, 0x2c, 0xc7, 0xed,
- 0x41, 0x9f, 0xc0, 0x2d, 0x9a, 0x20, 0x47, 0xa4, 0xae, 0xc9, 0xc5, 0x52, 0xd7, 0x1b, 0x44, 0x47,
- 0x7d, 0x4a, 0xfa, 0x1a, 0x01, 0xe6, 0xa4, 0x22, 0xc0, 0x1c, 0x74, 0x00, 0x85, 0x2e, 0x1e, 0x62,
- 0x4b, 0xb3, 0x94, 0x25, 0xee, 0x9c, 0x02, 0xc9, 0xf8, 0x9b, 0x31, 0x39, 0xcf, 0x65, 0x49, 0xef,
- 0xdf, 0x08, 0xc2, 0x4e, 0x19, 0x8a, 0x8a, 0x5f, 0x9d, 0xf4, 0x3f, 0x82, 0x67, 0x96, 0x2e, 0x5a,
- 0xd4, 0xd6, 0x3b, 0xcc, 0x7c, 0x8b, 0x32, 0xfd, 0x4d, 0x6e, 0x57, 0x7d, 0xbd, 0xcb, 0x2d, 0x90,
- 0xfc, 0x24, 0x5c, 0x6e, 0x81, 0x24, 0xc7, 0x23, 0xec, 0x1a, 0xa4, 0xb4, 0x61, 0x07, 0x8f, 0xb9,
- 0x91, 0xb1, 0x06, 0x91, 0x7d, 0x81, 0xaf, 0xb8, 0x29, 0x91, 0x9f, 0x84, 0x8f, 0x9e, 0x33, 0x3a,
- 0x97, 0x82, 0xcc, 0x1a, 0xe8, 0x7d, 0xc8, 0xd1, 0x2a, 0x97, 0xa2, 0x1b, 0x16, 0x8f, 0x91, 0x81,
- 0x54, 0x8e, 0x55, 0xa4, 0xb6, 0x8e, 0x09, 0xcf, 0x91, 0x61, 0xc9, 0x59, 0x83, 0xff, 0xf2, 0x25,
- 0x5b, 0xd9, 0x40, 0xb2, 0x75, 0x1b, 0x72, 0x64, 0xf4, 0x96, 0xa1, 0xb6, 0x31, 0x8d, 0x6f, 0x39,
- 0xd9, 0x23, 0x48, 0xff, 0x24, 0x40, 0x39, 0x14, 0x72, 0xa7, 0xce, 0xdd, 0x39, 0x95, 0xf1, 0x20,
- 0x7a, 0x36, 0x31, 0xfb, 0x3b, 0x00, 0x5d, 0xd5, 0x52, 0x5e, 0xaa, 0x43, 0x1b, 0x77, 0xf8, 0x12,
- 0xe4, 0xba, 0xaa, 0xf5, 0x9c, 0x12, 0x82, 0x83, 0x49, 0x85, 0x06, 0xe3, 0xc3, 0x6f, 0xd2, 0x7e,
- 0xfc, 0x06, 0x55, 0x21, 0x6b, 0x98, 0x9a, 0x6e, 0x6a, 0xf6, 0x15, 0x5d, 0x93, 0x84, 0xec, 0xb6,
- 0xa5, 0x63, 0xb8, 0x36, 0x35, 0xda, 0xa3, 0xc7, 0x90, 0xf3, 0x12, 0x05, 0x81, 0x26, 0xb5, 0x33,
- 0x60, 0x31, 0x8f, 0x97, 0x2c, 0xc9, 0xb5, 0xa9, 0xf1, 0x1e, 0x35, 0x20, 0x6d, 0x62, 0x6b, 0xd4,
- 0x67, 0x49, 0x76, 0xe9, 0xe1, 0x3b, 0x8b, 0xe5, 0x09, 0x84, 0x3a, 0xea, 0xdb, 0x32, 0x17, 0x96,
- 0x3e, 0x85, 0x34, 0xa3, 0xa0, 0x3c, 0x64, 0x4e, 0x0f, 0x9f, 0x1e, 0x1e, 0x3d, 0x3f, 0x14, 0x63,
- 0x08, 0x20, 0x5d, 0xab, 0xd7, 0x1b, 0xc7, 0x2d, 0x51, 0x40, 0x39, 0x48, 0xd5, 0x76, 0x8e, 0xe4,
- 0x96, 0x18, 0x27, 0x64, 0xb9, 0xb1, 0xdf, 0xa8, 0xb7, 0xc4, 0x04, 0x5a, 0x81, 0x22, 0xfb, 0xad,
- 0x3c, 0x39, 0x92, 0x9f, 0xd5, 0x5a, 0x62, 0xd2, 0x47, 0x3a, 0x69, 0x1c, 0xee, 0x36, 0x64, 0x31,
- 0x25, 0xfd, 0x0a, 0x6e, 0x46, 0x66, 0x16, 0x1e, 0x72, 0x26, 0xf8, 0x90, 0x33, 0xe9, 0xdb, 0x38,
- 0xb9, 0x3a, 0x45, 0xa5, 0x0b, 0x68, 0x3f, 0x34, 0xf1, 0x87, 0x4b, 0xe4, 0x1a, 0xa1, 0xd9, 0xa3,
- 0xb7, 0xa0, 0x64, 0xe2, 0x0b, 0x6c, 0xb7, 0x7b, 0x2c, 0x7d, 0x71, 0x00, 0xb0, 0x22, 0xa7, 0x52,
- 0x21, 0x8b, 0xb1, 0x7d, 0x86, 0xdb, 0xb6, 0xc2, 0x8c, 0xc0, 0xa2, 0x30, 0x43, 0x8e, 0xb0, 0x11,
- 0xea, 0x09, 0x23, 0x12, 0xff, 0xcf, 0xfc, 0x14, 0x53, 0x95, 0xa4, 0xaa, 0x80, 0xba, 0x1d, 0x4a,
- 0x91, 0x5e, 0x2e, 0xb5, 0xd8, 0x39, 0x48, 0xc9, 0x8d, 0x96, 0xfc, 0x91, 0x98, 0x40, 0x08, 0x4a,
- 0xf4, 0xa7, 0x72, 0x72, 0x58, 0x3b, 0x3e, 0x69, 0x1e, 0x91, 0xc5, 0x5e, 0x85, 0xb2, 0xb3, 0xd8,
- 0x0e, 0x31, 0x85, 0xae, 0xc1, 0x4a, 0xfd, 0xe8, 0xd9, 0xf1, 0x41, 0xa3, 0xd5, 0xf0, 0xc8, 0x69,
- 0xa9, 0x0a, 0x95, 0xa8, 0x14, 0x49, 0xfa, 0xcf, 0x04, 0xdc, 0x88, 0x48, 0x73, 0xd0, 0xfb, 0x00,
- 0xf6, 0x58, 0x31, 0x71, 0x5b, 0x37, 0x3b, 0xd1, 0x86, 0xdb, 0x1a, 0xcb, 0x94, 0x43, 0xce, 0xd9,
- 0xfc, 0xd7, 0xcc, 0x58, 0xf1, 0x5b, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
- 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x08, 0x6e, 0x84, 0x42, 0x1a,
- 0x8f, 0x03, 0xd6, 0xb4, 0x02, 0xef, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
- 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0x8a, 0xc6, 0xb4, 0xd0, 0x18,
- 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0xdf, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
+ // 3811 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x5b, 0x4d, 0x6c, 0x1b, 0xd7,
+ 0x76, 0xe6, 0xf0, 0x9f, 0x87, 0x7f, 0xa3, 0x2b, 0xd9, 0xa6, 0x69, 0x5b, 0xd2, 0x1b, 0x37, 0xcf,
+ 0x7e, 0x7e, 0x89, 0x94, 0x67, 0x37, 0xcf, 0x49, 0x5f, 0x5a, 0x80, 0xa2, 0xe8, 0x52, 0xb2, 0x2c,
+ 0x29, 0x23, 0x4a, 0x6e, 0x9a, 0x26, 0x83, 0x11, 0x79, 0x45, 0x4e, 0x4c, 0x72, 0x26, 0x33, 0x43,
+ 0x99, 0xca, 0xb6, 0x2d, 0x50, 0x64, 0x95, 0x7d, 0x91, 0x45, 0x81, 0x76, 0xd9, 0x7d, 0x57, 0xed,
+ 0xae, 0x4d, 0xd1, 0x4d, 0x96, 0x05, 0x0a, 0xb8, 0x81, 0xb3, 0xeb, 0x2e, 0xab, 0x6e, 0xba, 0x28,
+ 0xee, 0xcf, 0xfc, 0x92, 0xc3, 0x9f, 0x38, 0x40, 0xd1, 0x1d, 0xef, 0xb9, 0xe7, 0x9c, 0xb9, 0x3f,
+ 0xe7, 0x9e, 0x73, 0xee, 0x77, 0x2e, 0xe1, 0x96, 0x8d, 0x87, 0x1d, 0x6c, 0x0e, 0xb4, 0xa1, 0xbd,
+ 0xad, 0x9e, 0xb7, 0xb5, 0x6d, 0xfb, 0xca, 0xc0, 0xd6, 0x96, 0x61, 0xea, 0xb6, 0x8e, 0xca, 0x5e,
+ 0xe7, 0x16, 0xe9, 0xac, 0xde, 0xf1, 0x71, 0xb7, 0xcd, 0x2b, 0xc3, 0xd6, 0xb7, 0x0d, 0x53, 0xd7,
+ 0x2f, 0x18, 0x7f, 0xd5, 0xaf, 0x8c, 0xea, 0xd9, 0xee, 0xa8, 0x56, 0x8f, 0x77, 0xde, 0x9e, 0xe8,
+ 0x3c, 0xef, 0xeb, 0xed, 0x17, 0x91, 0xbd, 0xbe, 0x81, 0x04, 0x7a, 0xf9, 0x77, 0x5f, 0xe0, 0x2b,
+ 0xa7, 0xf7, 0xce, 0x84, 0xac, 0xa1, 0x9a, 0xea, 0xc0, 0xe9, 0x5e, 0xf7, 0x75, 0x5f, 0x62, 0xd3,
+ 0xd2, 0xf4, 0x61, 0x40, 0xf9, 0x46, 0x57, 0xd7, 0xbb, 0x7d, 0xbc, 0x4d, 0x5b, 0xe7, 0xa3, 0x8b,
+ 0x6d, 0x5b, 0x1b, 0x60, 0xcb, 0x56, 0x07, 0x06, 0x67, 0x58, 0xeb, 0xea, 0x5d, 0x9d, 0xfe, 0xdc,
+ 0x26, 0xbf, 0x18, 0x55, 0x7a, 0x95, 0x83, 0x8c, 0x8c, 0xbf, 0x18, 0x61, 0xcb, 0x46, 0x0f, 0x21,
+ 0x89, 0xdb, 0x3d, 0xbd, 0x22, 0x6c, 0x0a, 0xf7, 0xf3, 0x0f, 0x6f, 0x6f, 0x85, 0xd6, 0x6d, 0x8b,
+ 0xf3, 0x35, 0xda, 0x3d, 0xbd, 0x19, 0x93, 0x29, 0x2f, 0x7a, 0x0f, 0x52, 0x17, 0xfd, 0x91, 0xd5,
+ 0xab, 0xc4, 0xa9, 0xd0, 0x9d, 0x28, 0xa1, 0x27, 0x84, 0xa9, 0x19, 0x93, 0x19, 0x37, 0xf9, 0x94,
+ 0x36, 0xbc, 0xd0, 0x2b, 0x89, 0xd9, 0x9f, 0xda, 0x1b, 0x5e, 0xd0, 0x4f, 0x11, 0x5e, 0xb4, 0x03,
+ 0xa0, 0x0d, 0x35, 0x5b, 0x69, 0xf7, 0x54, 0x6d, 0x58, 0x49, 0x52, 0xc9, 0x5f, 0x44, 0x4b, 0x6a,
+ 0x76, 0x9d, 0x30, 0x36, 0x63, 0x72, 0x4e, 0x73, 0x1a, 0x64, 0xb8, 0x5f, 0x8c, 0xb0, 0x79, 0x55,
+ 0x49, 0xcd, 0x1e, 0xee, 0x47, 0x84, 0x89, 0x0c, 0x97, 0x72, 0xa3, 0x0f, 0x21, 0xdb, 0xee, 0xe1,
+ 0xf6, 0x0b, 0xc5, 0x1e, 0x57, 0x32, 0x54, 0x72, 0x23, 0x4a, 0xb2, 0x4e, 0xf8, 0x5a, 0xe3, 0x66,
+ 0x4c, 0xce, 0xb4, 0xd9, 0x4f, 0x74, 0x08, 0xa5, 0xbe, 0x66, 0xd9, 0x8a, 0x35, 0x54, 0x0d, 0xab,
+ 0xa7, 0xdb, 0x56, 0x25, 0x4f, 0x75, 0xbc, 0x15, 0xa5, 0xe3, 0x40, 0xb3, 0xec, 0x13, 0x87, 0xb9,
+ 0x19, 0x93, 0x8b, 0x7d, 0x3f, 0x81, 0xe8, 0xd3, 0x2f, 0x2e, 0xb0, 0xe9, 0x2a, 0xac, 0x14, 0x66,
+ 0xeb, 0x3b, 0x22, 0xdc, 0x8e, 0x3c, 0xd1, 0xa7, 0xfb, 0x09, 0xe8, 0x13, 0x58, 0xed, 0xeb, 0x6a,
+ 0xc7, 0x55, 0xa7, 0xb4, 0x7b, 0xa3, 0xe1, 0x8b, 0x4a, 0x91, 0x2a, 0xfd, 0x55, 0xe4, 0x20, 0x75,
+ 0xb5, 0xe3, 0xa8, 0xa8, 0x13, 0x81, 0x66, 0x4c, 0x5e, 0xe9, 0x87, 0x89, 0xe8, 0x33, 0x58, 0x53,
+ 0x0d, 0xa3, 0x7f, 0x15, 0xd6, 0x5e, 0xa2, 0xda, 0x1f, 0x44, 0x69, 0xaf, 0x11, 0x99, 0xb0, 0x7a,
+ 0xa4, 0x4e, 0x50, 0xd1, 0x73, 0x58, 0xb9, 0xd0, 0x86, 0x6a, 0x5f, 0xfb, 0x12, 0x7b, 0xeb, 0xb1,
+ 0x46, 0x95, 0xdf, 0x8f, 0x34, 0x46, 0x2e, 0xe0, 0x5b, 0x12, 0xf1, 0x22, 0x44, 0x43, 0x2d, 0x10,
+ 0x0d, 0x13, 0x1b, 0xaa, 0x89, 0x15, 0xc3, 0xd4, 0x0d, 0xdd, 0x52, 0xfb, 0x95, 0x32, 0xd5, 0x7b,
+ 0x2f, 0x4a, 0xef, 0x31, 0xe3, 0x3f, 0xe6, 0xec, 0xcd, 0x98, 0x5c, 0x36, 0x82, 0x24, 0xa6, 0x55,
+ 0x6f, 0x63, 0xcb, 0xf2, 0xb4, 0x8a, 0xf3, 0xb4, 0x52, 0xfe, 0xa0, 0xd6, 0x00, 0x09, 0x35, 0x20,
+ 0x8f, 0xc7, 0x44, 0x5c, 0xb9, 0xd4, 0x6d, 0x5c, 0x59, 0xa1, 0x0a, 0xa5, 0xc8, 0x03, 0x4c, 0x59,
+ 0xcf, 0x74, 0x1b, 0x37, 0x63, 0x32, 0x60, 0xb7, 0x85, 0x54, 0xb8, 0x76, 0x89, 0x4d, 0xed, 0xe2,
+ 0x8a, 0xaa, 0x51, 0x68, 0x0f, 0x71, 0x34, 0x15, 0x44, 0x15, 0xfe, 0x3a, 0x4a, 0xe1, 0x19, 0x15,
+ 0x22, 0x2a, 0x1a, 0x8e, 0x48, 0x33, 0x26, 0xaf, 0x5e, 0x4e, 0x92, 0x89, 0xed, 0xba, 0xdb, 0x45,
+ 0x3d, 0x67, 0x65, 0x75, 0xb6, 0xed, 0x3a, 0x7b, 0xb5, 0x43, 0x98, 0x89, 0xed, 0x5e, 0xf8, 0x09,
+ 0x3b, 0x19, 0x48, 0x5d, 0xaa, 0xfd, 0x11, 0xde, 0x4f, 0x66, 0xd3, 0x62, 0x66, 0x3f, 0x99, 0xcd,
+ 0x8a, 0xb9, 0xfd, 0x64, 0x36, 0x27, 0xc2, 0x7e, 0x32, 0x0b, 0x62, 0x5e, 0xba, 0x07, 0x79, 0x9f,
+ 0xdf, 0x42, 0x15, 0xc8, 0x0c, 0xb0, 0x65, 0xa9, 0x5d, 0x4c, 0xdd, 0x5c, 0x4e, 0x76, 0x9a, 0x52,
+ 0x09, 0x0a, 0x7e, 0x5f, 0x25, 0x7d, 0x2d, 0xb8, 0x92, 0xc4, 0x0d, 0x11, 0x49, 0xee, 0x77, 0x1d,
+ 0x49, 0xde, 0x44, 0x77, 0xa1, 0x48, 0xa7, 0xa2, 0x38, 0xfd, 0xc4, 0x17, 0x26, 0xe5, 0x02, 0x25,
+ 0x9e, 0x71, 0xa6, 0x0d, 0xc8, 0x1b, 0x0f, 0x0d, 0x97, 0x25, 0x41, 0x59, 0xc0, 0x78, 0x68, 0x38,
+ 0x0c, 0xbf, 0x80, 0x02, 0x99, 0xb7, 0xcb, 0x91, 0xa4, 0x1f, 0xc9, 0x13, 0x1a, 0x67, 0x91, 0xfe,
+ 0x22, 0x01, 0x62, 0xd8, 0xbf, 0xa1, 0xf7, 0x21, 0x49, 0x5c, 0x3d, 0xf7, 0xda, 0xd5, 0x2d, 0x16,
+ 0x07, 0xb6, 0x9c, 0x38, 0xb0, 0xd5, 0x72, 0xe2, 0xc0, 0x4e, 0xf6, 0xdb, 0x57, 0x1b, 0xb1, 0xaf,
+ 0xff, 0x73, 0x43, 0x90, 0xa9, 0x04, 0xba, 0x49, 0xbc, 0x9a, 0xaa, 0x0d, 0x15, 0xad, 0x43, 0x87,
+ 0x9c, 0x23, 0x2e, 0x4b, 0xd5, 0x86, 0x7b, 0x1d, 0x74, 0x00, 0x62, 0x5b, 0x1f, 0x5a, 0x78, 0x68,
+ 0x8d, 0x2c, 0x85, 0xc5, 0x21, 0xee, 0xab, 0x03, 0x1e, 0x97, 0x05, 0xa0, 0xba, 0xc3, 0x79, 0x4c,
+ 0x19, 0xe5, 0x72, 0x3b, 0x48, 0x40, 0x87, 0x50, 0xbc, 0x54, 0xfb, 0x5a, 0x47, 0xb5, 0x75, 0x53,
+ 0xb1, 0xb0, 0xcd, 0x9d, 0xf7, 0xdd, 0x89, 0x3d, 0x3f, 0x73, 0xb8, 0x4e, 0xb0, 0x7d, 0x6a, 0x74,
+ 0x54, 0x1b, 0xef, 0x24, 0xbf, 0x7d, 0xb5, 0x21, 0xc8, 0x85, 0x4b, 0x5f, 0x0f, 0xfa, 0x25, 0x94,
+ 0x55, 0xc3, 0x50, 0x2c, 0x5b, 0xb5, 0xb1, 0x72, 0x7e, 0x65, 0x63, 0x8b, 0xfa, 0xf3, 0x82, 0x5c,
+ 0x54, 0x0d, 0xe3, 0x84, 0x50, 0x77, 0x08, 0x11, 0xbd, 0x05, 0x25, 0xe2, 0xfa, 0x35, 0xb5, 0xaf,
+ 0xf4, 0xb0, 0xd6, 0xed, 0xd9, 0x95, 0xf4, 0xa6, 0x70, 0x3f, 0x21, 0x17, 0x39, 0xb5, 0x49, 0x89,
+ 0x68, 0x0b, 0x56, 0x1d, 0xb6, 0xb6, 0x6e, 0x62, 0x87, 0x97, 0x38, 0xfa, 0xa2, 0xbc, 0xc2, 0xbb,
+ 0xea, 0xba, 0x89, 0x19, 0xbf, 0xd4, 0x71, 0x2d, 0x85, 0x86, 0x09, 0x84, 0x20, 0xd9, 0x51, 0x6d,
+ 0x95, 0xee, 0x40, 0x41, 0xa6, 0xbf, 0x09, 0xcd, 0x50, 0xed, 0x1e, 0x5f, 0x57, 0xfa, 0x1b, 0x5d,
+ 0x87, 0x34, 0x57, 0x9d, 0xa0, 0xc3, 0xe0, 0x2d, 0xb4, 0x06, 0x29, 0xc3, 0xd4, 0x2f, 0x31, 0x5d,
+ 0x96, 0xac, 0xcc, 0x1a, 0x92, 0x0c, 0xa5, 0x60, 0x48, 0x41, 0x25, 0x88, 0xdb, 0x63, 0xfe, 0x95,
+ 0xb8, 0x3d, 0x46, 0xef, 0x42, 0x92, 0x6c, 0x00, 0xfd, 0x46, 0x69, 0x4a, 0x10, 0xe5, 0x72, 0xad,
+ 0x2b, 0x03, 0xcb, 0x94, 0x53, 0xba, 0x0e, 0x6b, 0xd3, 0x42, 0x8c, 0xd4, 0x73, 0xe9, 0x81, 0x50,
+ 0x81, 0xde, 0x83, 0xac, 0xeb, 0x53, 0x99, 0x7d, 0xdd, 0x9c, 0xf8, 0x8a, 0xc3, 0x2c, 0xbb, 0xac,
+ 0xc4, 0xb0, 0xc8, 0xfe, 0xf4, 0x54, 0x9e, 0x17, 0x14, 0xe4, 0x8c, 0x6a, 0x18, 0x4d, 0xd5, 0xea,
+ 0x49, 0x5d, 0xa8, 0x44, 0xc5, 0x0f, 0xdf, 0xfa, 0x08, 0xf4, 0x74, 0x38, 0xeb, 0xe3, 0x3b, 0x79,
+ 0x71, 0xba, 0x27, 0xee, 0xc9, 0xa3, 0x16, 0x3c, 0x1a, 0xbe, 0x20, 0x16, 0x9c, 0x60, 0x1f, 0xa2,
+ 0xed, 0xbd, 0x8e, 0xd4, 0x81, 0x9b, 0x91, 0xa1, 0x24, 0x20, 0x27, 0x04, 0xe4, 0xc8, 0x66, 0xb0,
+ 0x00, 0xc5, 0x06, 0xce, 0x1a, 0x64, 0x68, 0x16, 0x9d, 0x37, 0xfd, 0x4c, 0x4e, 0xe6, 0x2d, 0xe9,
+ 0x6f, 0x04, 0xb8, 0x11, 0x11, 0x54, 0x50, 0x1d, 0x4a, 0x6e, 0xcc, 0x63, 0xae, 0x6e, 0x4a, 0x62,
+ 0xc5, 0x4e, 0xd0, 0x01, 0x99, 0x27, 0x75, 0x68, 0x72, 0xd1, 0x91, 0xa1, 0x4d, 0x54, 0x83, 0x62,
+ 0x17, 0x0f, 0xb1, 0xa5, 0x59, 0x5c, 0x47, 0x7c, 0x01, 0x1d, 0x05, 0x2e, 0x42, 0x5b, 0xd2, 0x8f,
+ 0x49, 0xb8, 0x3e, 0x3d, 0x40, 0xa1, 0x4d, 0x28, 0x0c, 0xd4, 0xb1, 0x62, 0x8f, 0xf9, 0x29, 0x12,
+ 0xa8, 0x5d, 0xc2, 0x40, 0x1d, 0xb7, 0xc6, 0xec, 0x08, 0x89, 0x90, 0xb0, 0xc7, 0x56, 0x25, 0xbe,
+ 0x99, 0xb8, 0x5f, 0x90, 0xc9, 0x4f, 0xf4, 0x0c, 0x56, 0xfa, 0x7a, 0x5b, 0xed, 0x2b, 0x7d, 0xd5,
+ 0xb2, 0x95, 0xb6, 0x3e, 0x18, 0x68, 0x36, 0xf7, 0x0d, 0xb7, 0x26, 0x4d, 0x90, 0x76, 0x13, 0xff,
+ 0x49, 0x0f, 0x72, 0x4c, 0x2e, 0x53, 0xd9, 0x03, 0xd5, 0xb2, 0x59, 0x17, 0xda, 0x85, 0xfc, 0x40,
+ 0xb3, 0xce, 0x71, 0x4f, 0xbd, 0xd4, 0x74, 0xb3, 0x92, 0xdc, 0x4c, 0x4c, 0x4d, 0x08, 0x9f, 0x79,
+ 0x3c, 0x5c, 0x93, 0x5f, 0xcc, 0x67, 0x3a, 0xa9, 0xc0, 0xd1, 0x72, 0x9c, 0x63, 0x7a, 0x69, 0xe7,
+ 0xf8, 0x2e, 0xac, 0x0d, 0xf1, 0xd8, 0x56, 0x5c, 0xc7, 0x63, 0x31, 0x7b, 0xce, 0x50, 0xb3, 0x40,
+ 0xa4, 0xcf, 0xf5, 0x56, 0x16, 0x31, 0x6d, 0x62, 0x39, 0xa6, 0x3e, 0x1a, 0x76, 0x2a, 0xd9, 0x4d,
+ 0xe1, 0x7e, 0x4a, 0x66, 0x0d, 0xf4, 0x18, 0x2a, 0xd4, 0xa9, 0x30, 0x4f, 0x4b, 0x36, 0x04, 0x77,
+ 0x1c, 0x0f, 0x93, 0xa3, 0xd6, 0x7c, 0x8d, 0xf4, 0x53, 0x5f, 0x7e, 0x40, 0x7b, 0xb9, 0x57, 0xda,
+ 0x86, 0x35, 0x96, 0x21, 0x60, 0x93, 0xa4, 0x0a, 0x64, 0x93, 0xe8, 0x00, 0x80, 0x0e, 0x60, 0xc5,
+ 0xe9, 0x3b, 0x36, 0xf5, 0xd6, 0x98, 0x7e, 0xff, 0x5d, 0x57, 0xa0, 0xa3, 0x90, 0xe3, 0xe7, 0x9c,
+ 0x99, 0x3c, 0x3d, 0x4c, 0xc8, 0xe9, 0xab, 0x19, 0x6e, 0xc8, 0x79, 0xec, 0x1d, 0xac, 0xc2, 0x64,
+ 0x3e, 0xcc, 0xbb, 0x3c, 0xf7, 0xee, 0x9d, 0xbb, 0x0d, 0xc8, 0x7f, 0x31, 0xd2, 0xcd, 0xd1, 0x80,
+ 0x0d, 0xa9, 0x48, 0x87, 0x04, 0x8c, 0x44, 0x8f, 0xf9, 0x3f, 0xa5, 0x7c, 0x36, 0x17, 0xcc, 0x55,
+ 0xb8, 0x45, 0x09, 0x9e, 0x45, 0x9d, 0xf8, 0x06, 0xee, 0x37, 0xaa, 0xf8, 0xa2, 0x46, 0xe5, 0xce,
+ 0x2d, 0xda, 0xae, 0x12, 0x3f, 0xcd, 0xae, 0x10, 0x24, 0xe9, 0x0c, 0x93, 0xcc, 0xb5, 0x93, 0xdf,
+ 0x91, 0xb6, 0xe6, 0xee, 0x7f, 0xda, 0xbf, 0xff, 0x8e, 0x05, 0x66, 0x7e, 0x36, 0x0b, 0xcc, 0x46,
+ 0x5a, 0xe0, 0x4f, 0xb6, 0xb5, 0x16, 0x5c, 0x0f, 0x09, 0x2a, 0x23, 0x1a, 0x7e, 0xa9, 0xb5, 0x85,
+ 0x6e, 0x3b, 0x4e, 0xd0, 0xf7, 0x29, 0x92, 0x57, 0x03, 0x7a, 0x59, 0xe8, 0x8e, 0xb4, 0xe0, 0xfc,
+ 0xb2, 0x16, 0x5c, 0x58, 0xc4, 0x82, 0x8b, 0x6f, 0x62, 0xc1, 0xa5, 0x09, 0x0b, 0x3e, 0x85, 0x95,
+ 0x89, 0x74, 0xd9, 0x35, 0x07, 0x61, 0xaa, 0x39, 0xc4, 0xa7, 0x9b, 0x43, 0xc2, 0x67, 0x0e, 0xd2,
+ 0xf7, 0x02, 0x54, 0xa3, 0xb3, 0xe6, 0xa9, 0x1f, 0xf8, 0x0d, 0x5c, 0xf3, 0xb2, 0x27, 0xff, 0x3a,
+ 0xb2, 0x08, 0x85, 0xdc, 0x4e, 0x6f, 0x21, 0x67, 0x64, 0x1a, 0x6c, 0x4c, 0x49, 0xbf, 0x89, 0x3e,
+ 0x83, 0x72, 0x30, 0xdf, 0x27, 0xe9, 0x14, 0x39, 0x2e, 0xbf, 0x37, 0x71, 0x5c, 0xbc, 0xb5, 0x70,
+ 0xc7, 0x2c, 0x97, 0x2e, 0xfd, 0x4d, 0x4b, 0xfa, 0xb7, 0xb8, 0x9b, 0x4d, 0x04, 0x92, 0x77, 0xf4,
+ 0x01, 0xa4, 0xf9, 0xc9, 0x16, 0x16, 0x3d, 0xd9, 0x5c, 0x20, 0x7c, 0x9a, 0xe3, 0x6f, 0x76, 0x9a,
+ 0x13, 0x53, 0xb7, 0x2f, 0x39, 0x7d, 0xa9, 0x52, 0xfe, 0xa5, 0x7a, 0x07, 0x52, 0x2c, 0x0c, 0xb3,
+ 0x80, 0x72, 0x63, 0xf2, 0x5c, 0xb0, 0x08, 0xcc, 0xb8, 0x50, 0x0d, 0xb2, 0xec, 0x66, 0xa0, 0x75,
+ 0xb8, 0x03, 0xb8, 0x19, 0x21, 0xb1, 0xb7, 0xbb, 0x93, 0x7f, 0xfd, 0x6a, 0x23, 0xc3, 0x1b, 0x72,
+ 0x86, 0xca, 0xed, 0x75, 0xa4, 0xbf, 0x06, 0xc8, 0xca, 0xd8, 0x32, 0x88, 0x09, 0xa3, 0x1d, 0xc8,
+ 0xe1, 0x71, 0x1b, 0x1b, 0xb6, 0x73, 0x0b, 0x99, 0x7e, 0xcb, 0x63, 0xdc, 0x0d, 0x87, 0xb3, 0x19,
+ 0x93, 0x3d, 0x31, 0xf4, 0x88, 0xa3, 0x3c, 0xd1, 0x80, 0x0d, 0x17, 0xf7, 0xc3, 0x3c, 0xbf, 0x75,
+ 0x60, 0x1e, 0x16, 0xe8, 0xd7, 0x23, 0xa5, 0x42, 0x38, 0xcf, 0x23, 0x8e, 0xf3, 0x24, 0xe7, 0x7c,
+ 0x2c, 0x00, 0xf4, 0xd4, 0x03, 0x40, 0x4f, 0x6a, 0xce, 0x34, 0x23, 0x90, 0x9e, 0xdf, 0x3a, 0x48,
+ 0x4f, 0x7a, 0xce, 0x88, 0x43, 0x50, 0xcf, 0x1f, 0x4e, 0x40, 0x3d, 0x9b, 0x91, 0xa2, 0x53, 0xb0,
+ 0x9e, 0xa3, 0x09, 0xac, 0x27, 0x4b, 0x95, 0xfc, 0x32, 0x52, 0xc9, 0x1c, 0xb0, 0xe7, 0x68, 0x02,
+ 0xec, 0xc9, 0xcd, 0x51, 0x38, 0x07, 0xed, 0xf9, 0xb3, 0xe9, 0x68, 0x0f, 0x44, 0xe2, 0x31, 0x7c,
+ 0x98, 0x8b, 0xc1, 0x3d, 0x4a, 0x04, 0xdc, 0x93, 0x8f, 0x44, 0x10, 0x98, 0xfa, 0x85, 0xf1, 0x9e,
+ 0x3f, 0x99, 0x86, 0xf7, 0xac, 0x44, 0x42, 0x55, 0xdc, 0x2a, 0x17, 0x01, 0x7c, 0x4e, 0xa7, 0x00,
+ 0x3e, 0x85, 0x48, 0x20, 0x89, 0x29, 0x5e, 0x00, 0xf1, 0x39, 0x9d, 0x82, 0xf8, 0x14, 0xe7, 0xaa,
+ 0x9d, 0x0b, 0xf9, 0x3c, 0x09, 0x42, 0x3e, 0xa5, 0x88, 0x1b, 0xb5, 0xe7, 0x0c, 0x22, 0x30, 0x9f,
+ 0xf3, 0x28, 0xcc, 0x87, 0x61, 0x5d, 0x6f, 0x47, 0x6a, 0x5c, 0x02, 0xf4, 0x39, 0x9a, 0x00, 0x7d,
+ 0xc4, 0x39, 0x36, 0xbc, 0x20, 0xea, 0x23, 0xfd, 0x8a, 0x44, 0xe9, 0x90, 0xbb, 0x23, 0xae, 0x1b,
+ 0x9b, 0xa6, 0x6e, 0x72, 0x9c, 0x86, 0x35, 0xa4, 0xfb, 0xe4, 0xd6, 0xee, 0xb9, 0xb6, 0x19, 0x48,
+ 0x50, 0x19, 0x8a, 0x01, 0x77, 0x26, 0xfd, 0x83, 0xe0, 0xc9, 0x52, 0x2c, 0xc8, 0x7f, 0xe3, 0xcf,
+ 0xf1, 0x1b, 0x7f, 0xe8, 0x96, 0x9a, 0x0b, 0xe4, 0x1a, 0xfe, 0x6c, 0x86, 0x43, 0x3f, 0xaa, 0x97,
+ 0xc5, 0x3c, 0x80, 0x15, 0x9a, 0xf7, 0xb2, 0x58, 0x11, 0x08, 0x47, 0x65, 0xd2, 0xc1, 0x56, 0x81,
+ 0xc5, 0xa5, 0x77, 0x60, 0xd5, 0xc7, 0xeb, 0x5e, 0xb3, 0x19, 0xfe, 0x21, 0xba, 0xdc, 0x35, 0x7e,
+ 0xdf, 0xfe, 0x97, 0x84, 0xb7, 0x42, 0x1e, 0x66, 0x34, 0x0d, 0xde, 0x11, 0x7e, 0x32, 0xbc, 0x13,
+ 0x7d, 0xdd, 0x47, 0x9f, 0xc0, 0x5a, 0x00, 0xf9, 0x71, 0xd2, 0xca, 0xc4, 0x72, 0x00, 0x50, 0xcc,
+ 0x97, 0xe5, 0xb8, 0x3d, 0xe8, 0x53, 0xb8, 0x45, 0x13, 0xe4, 0x88, 0xd4, 0x35, 0xb9, 0x58, 0xea,
+ 0x7a, 0x83, 0xe8, 0xa8, 0x4f, 0x49, 0x5f, 0x23, 0x60, 0xa1, 0x54, 0x04, 0x2c, 0x84, 0x0e, 0xc0,
+ 0xb9, 0x77, 0x2b, 0x4b, 0xdc, 0x39, 0x05, 0x92, 0xf1, 0x37, 0x63, 0x72, 0x9e, 0xcb, 0x92, 0xde,
+ 0xbf, 0x12, 0x84, 0x9d, 0x32, 0x14, 0x15, 0xbf, 0x3a, 0xe9, 0xbf, 0x05, 0xcf, 0x2c, 0x5d, 0xdc,
+ 0xa9, 0xad, 0x77, 0x98, 0xf9, 0x16, 0x65, 0xfa, 0x9b, 0xdc, 0xae, 0xfa, 0x7a, 0x97, 0x5b, 0x20,
+ 0xf9, 0x49, 0xb8, 0xdc, 0x52, 0x4b, 0x8e, 0x47, 0xd8, 0x35, 0x48, 0x69, 0xc3, 0x0e, 0x1e, 0x73,
+ 0x23, 0x63, 0x0d, 0x22, 0xfb, 0x02, 0x5f, 0x71, 0x53, 0x22, 0x3f, 0x09, 0x1f, 0x3d, 0x67, 0x74,
+ 0x2e, 0x05, 0x99, 0x35, 0xd0, 0xfb, 0x90, 0xa3, 0xf5, 0x32, 0x45, 0x37, 0x2c, 0x1e, 0x23, 0x03,
+ 0xa9, 0x1c, 0xab, 0x6d, 0x6d, 0x1d, 0x13, 0x9e, 0x23, 0xc3, 0x92, 0xb3, 0x06, 0xff, 0xe5, 0x4b,
+ 0xb6, 0xb2, 0x81, 0x64, 0xeb, 0x36, 0xe4, 0xc8, 0xe8, 0x2d, 0x43, 0x6d, 0x63, 0x1a, 0xdf, 0x72,
+ 0xb2, 0x47, 0x90, 0xfe, 0x51, 0x80, 0x72, 0x28, 0xe4, 0x4e, 0x9d, 0xbb, 0x73, 0x2a, 0xe3, 0x41,
+ 0x1c, 0x6e, 0x62, 0xf6, 0x77, 0x00, 0xba, 0xaa, 0xa5, 0xbc, 0x54, 0x87, 0x36, 0xee, 0xf0, 0x25,
+ 0xc8, 0x75, 0x55, 0xeb, 0x39, 0x25, 0x04, 0x07, 0x93, 0x0a, 0x0d, 0xc6, 0x87, 0x04, 0xa5, 0xfd,
+ 0x48, 0x10, 0xaa, 0x42, 0xd6, 0x30, 0x35, 0xdd, 0xd4, 0xec, 0x2b, 0xba, 0x26, 0x09, 0xd9, 0x6d,
+ 0x4b, 0xc7, 0x70, 0x6d, 0x6a, 0xb4, 0x47, 0x8f, 0x21, 0xe7, 0x25, 0x0a, 0x02, 0x4d, 0x6a, 0x67,
+ 0x00, 0x6c, 0x1e, 0x2f, 0x59, 0x92, 0x6b, 0x53, 0xe3, 0x3d, 0x6a, 0x40, 0xda, 0xc4, 0xd6, 0xa8,
+ 0xcf, 0x92, 0xec, 0xd2, 0xc3, 0x77, 0x16, 0xcb, 0x13, 0x08, 0x75, 0xd4, 0xb7, 0x65, 0x2e, 0x2c,
+ 0x7d, 0x06, 0x69, 0x46, 0x41, 0x79, 0xc8, 0x9c, 0x1e, 0x3e, 0x3d, 0x3c, 0x7a, 0x7e, 0x28, 0xc6,
+ 0x10, 0x40, 0xba, 0x56, 0xaf, 0x37, 0x8e, 0x5b, 0xa2, 0x80, 0x72, 0x90, 0xaa, 0xed, 0x1c, 0xc9,
+ 0x2d, 0x31, 0x4e, 0xc8, 0x72, 0x63, 0xbf, 0x51, 0x6f, 0x89, 0x09, 0xb4, 0x02, 0x45, 0xf6, 0x5b,
+ 0x79, 0x72, 0x24, 0x3f, 0xab, 0xb5, 0xc4, 0xa4, 0x8f, 0x74, 0xd2, 0x38, 0xdc, 0x6d, 0xc8, 0x62,
+ 0x4a, 0xfa, 0x0d, 0xdc, 0x8c, 0xcc, 0x2c, 0x3c, 0x0c, 0x4e, 0xf0, 0x61, 0x70, 0xd2, 0x77, 0x71,
+ 0x72, 0x75, 0x8a, 0x4a, 0x17, 0xd0, 0x7e, 0x68, 0xe2, 0x0f, 0x97, 0xc8, 0x35, 0x42, 0xb3, 0x47,
+ 0x6f, 0x41, 0xc9, 0xc4, 0x17, 0xd8, 0x6e, 0xf7, 0x58, 0xfa, 0xe2, 0x00, 0x60, 0x45, 0x4e, 0xa5,
+ 0x42, 0x16, 0x63, 0xfb, 0x1c, 0xb7, 0x6d, 0x85, 0x19, 0x81, 0x45, 0x61, 0x86, 0x1c, 0x61, 0x23,
+ 0xd4, 0x13, 0x46, 0x24, 0xfe, 0x9f, 0xf9, 0x29, 0xa6, 0x2a, 0x49, 0x55, 0x01, 0x75, 0x3b, 0x94,
+ 0x22, 0xbd, 0x5c, 0x6a, 0xb1, 0x73, 0x90, 0x92, 0x1b, 0x2d, 0xf9, 0x63, 0x31, 0x81, 0x10, 0x94,
+ 0xe8, 0x4f, 0xe5, 0xe4, 0xb0, 0x76, 0x7c, 0xd2, 0x3c, 0x22, 0x8b, 0xbd, 0x0a, 0x65, 0x67, 0xb1,
+ 0x1d, 0x62, 0x0a, 0x5d, 0x83, 0x95, 0xfa, 0xd1, 0xb3, 0xe3, 0x83, 0x46, 0xab, 0xe1, 0x91, 0xd3,
+ 0x52, 0x15, 0x2a, 0x51, 0x29, 0x92, 0xf4, 0x1f, 0x09, 0xb8, 0x11, 0x91, 0xe6, 0xa0, 0xf7, 0x01,
+ 0xec, 0xb1, 0x62, 0xe2, 0xb6, 0x6e, 0x76, 0xa2, 0x0d, 0xb7, 0x35, 0x96, 0x29, 0x87, 0x9c, 0xb3,
+ 0xf9, 0xaf, 0x99, 0xb1, 0xe2, 0x43, 0xae, 0x94, 0x2c, 0x84, 0xc5, 0x01, 0x9b, 0x3b, 0x53, 0x6e,
+ 0xa0, 0xb8, 0x4d, 0x14, 0xd3, 0xfd, 0xa2, 0x8a, 0x29, 0x3f, 0xfa, 0x18, 0x6e, 0x84, 0x42, 0x1a,
+ 0x8f, 0x03, 0xd6, 0xb4, 0x52, 0xf1, 0xf4, 0xc8, 0x76, 0x2d, 0x18, 0xd9, 0x58, 0x1c, 0xb0, 0x66,
+ 0xa0, 0x23, 0xa9, 0x37, 0x40, 0x47, 0xa2, 0x42, 0x63, 0x7a, 0xd9, 0xda, 0xc8, 0xb4, 0xd0, 0x18,
+ 0x4a, 0x39, 0x32, 0xe1, 0x94, 0x43, 0xfa, 0x9f, 0xc0, 0xee, 0x06, 0x53, 0xcb, 0x23, 0x48, 0x5b,
0xb6, 0x6a, 0x8f, 0x2c, 0x7e, 0x92, 0x1e, 0x2f, 0x9a, 0xa7, 0x6e, 0x39, 0x3f, 0x4e, 0xa8, 0xb8,
- 0xcc, 0xd5, 0xfc, 0x41, 0x6e, 0x7a, 0xd4, 0xf6, 0xa4, 0x7e, 0x8a, 0xed, 0x69, 0x42, 0x1a, 0x5f,
- 0xe2, 0xa1, 0x6d, 0x55, 0xd2, 0x74, 0xc6, 0xd7, 0x27, 0x67, 0x4c, 0xba, 0x77, 0x2a, 0x24, 0xf7,
- 0xf9, 0xef, 0x57, 0x1b, 0x22, 0xe3, 0x7e, 0x5b, 0x1f, 0x68, 0x36, 0x1e, 0x18, 0xf6, 0x95, 0xcc,
- 0xe5, 0xa5, 0xf7, 0xa0, 0x14, 0x5c, 0xf4, 0x68, 0x17, 0xe2, 0x39, 0xe9, 0xb8, 0xf4, 0x0f, 0x02,
- 0xac, 0x4e, 0xc1, 0x72, 0xd0, 0x63, 0x5e, 0x08, 0x62, 0x1b, 0x7f, 0x77, 0x72, 0xf5, 0x02, 0xec,
- 0x5e, 0x3d, 0x88, 0x04, 0x4d, 0xef, 0xea, 0xc0, 0xf6, 0xd8, 0x23, 0xa0, 0x5f, 0x42, 0xd9, 0xd2,
- 0xba, 0x43, 0xc5, 0x64, 0xb0, 0x90, 0x5b, 0x64, 0x21, 0x99, 0x3d, 0xe9, 0x70, 0x4a, 0x91, 0x1d,
- 0x92, 0xf9, 0x20, 0x10, 0x95, 0x10, 0xb7, 0xd4, 0x06, 0x34, 0x79, 0x93, 0x99, 0x06, 0x5c, 0x09,
- 0x6f, 0x00, 0x5c, 0xfd, 0xbd, 0x00, 0xb7, 0x66, 0xdc, 0x6e, 0xd0, 0x87, 0xa1, 0x73, 0xf1, 0xc1,
- 0x32, 0x77, 0xa3, 0x2d, 0x46, 0x0b, 0x9e, 0x0c, 0xe9, 0x11, 0x14, 0xfc, 0xf4, 0xc5, 0x36, 0x6f,
- 0xdf, 0x8b, 0xfd, 0x41, 0x80, 0xed, 0x2e, 0x14, 0x4d, 0x6c, 0x13, 0x27, 0x15, 0x40, 0x24, 0x0b,
- 0x8c, 0xc8, 0xd2, 0xd4, 0xfd, 0x64, 0x56, 0x10, 0xe3, 0xae, 0xfd, 0xfc, 0x9b, 0x00, 0xe0, 0xa1,
- 0x6e, 0x1e, 0xea, 0x25, 0xf8, 0x51, 0xaf, 0x10, 0x58, 0x1a, 0x0f, 0x83, 0xa5, 0xe8, 0x1e, 0x94,
- 0xd9, 0x7d, 0x84, 0xec, 0x9b, 0x6a, 0x8f, 0x4c, 0xcc, 0x31, 0xb6, 0x12, 0x25, 0x9f, 0x38, 0x54,
- 0xf4, 0x31, 0xdc, 0xb4, 0x7b, 0x26, 0xb6, 0x7a, 0x7a, 0xbf, 0xa3, 0x84, 0xf7, 0x8e, 0xd5, 0x7e,
- 0x36, 0xe6, 0x18, 0x9d, 0x7c, 0xc3, 0xd5, 0x70, 0x16, 0xdc, 0xbf, 0x2f, 0x20, 0x45, 0x8f, 0x0d,
- 0x49, 0xfa, 0x5c, 0x2b, 0xce, 0x71, 0x03, 0xfd, 0x04, 0x40, 0xb5, 0x6d, 0x53, 0x3b, 0x1f, 0x11,
- 0xef, 0x10, 0x9f, 0xfc, 0x94, 0x77, 0xec, 0x6a, 0x0e, 0xdf, 0xce, 0x6d, 0x7e, 0xfe, 0xd6, 0x3c,
- 0x51, 0xdf, 0x19, 0xf4, 0x29, 0x94, 0x0e, 0xa1, 0x14, 0x94, 0x75, 0xb2, 0x69, 0x36, 0x86, 0x60,
- 0x36, 0xcd, 0xb2, 0x73, 0x9e, 0x4d, 0xbb, 0xb9, 0x78, 0x82, 0xd5, 0x6c, 0x69, 0x43, 0xfa, 0x41,
- 0x80, 0x82, 0xdf, 0xeb, 0x2d, 0x9c, 0xf0, 0xf2, 0x0b, 0x40, 0x62, 0xf2, 0x02, 0x90, 0xf4, 0xa5,
- 0xc0, 0x37, 0x21, 0x4b, 0x52, 0xe0, 0x91, 0x85, 0x3b, 0xbc, 0x92, 0x9d, 0xe9, 0xaa, 0xd6, 0xa9,
- 0x85, 0x3b, 0x3e, 0xdf, 0x94, 0x79, 0x33, 0xdf, 0x14, 0x4c, 0xa4, 0xb3, 0xa1, 0x44, 0x7a, 0x3f,
- 0x99, 0x4d, 0x89, 0x69, 0xd9, 0x97, 0x89, 0x4b, 0x7f, 0x2d, 0x40, 0xd6, 0x9d, 0x6f, 0xb0, 0x84,
- 0x1b, 0xc0, 0x65, 0xd9, 0x72, 0xb1, 0x02, 0x2e, 0xbf, 0xba, 0xb0, 0x82, 0x76, 0xc2, 0x2d, 0x68,
- 0xff, 0xc6, 0x4d, 0x06, 0xa3, 0x90, 0x47, 0xff, 0xe2, 0x3a, 0x60, 0x33, 0xcf, 0x7d, 0xff, 0x8e,
- 0x8f, 0x83, 0x64, 0x2c, 0xe8, 0x4f, 0x20, 0xad, 0xb6, 0x5d, 0xbc, 0xb5, 0x34, 0x05, 0x88, 0x74,
- 0x58, 0xb7, 0x5a, 0xe3, 0x1a, 0xe5, 0x94, 0xb9, 0x04, 0x1f, 0x55, 0xdc, 0x19, 0x95, 0x74, 0x40,
- 0xf4, 0x32, 0x9e, 0xe0, 0x49, 0x2f, 0x01, 0x9c, 0x1e, 0x3e, 0x3b, 0xda, 0xdd, 0x7b, 0xb2, 0xd7,
- 0xd8, 0xe5, 0xd9, 0xde, 0xee, 0x6e, 0x63, 0x57, 0x8c, 0x13, 0x3e, 0xb9, 0xf1, 0xec, 0xe8, 0xac,
- 0xb1, 0x2b, 0x26, 0x48, 0x63, 0xb7, 0x71, 0x50, 0xfb, 0xa8, 0xb1, 0x2b, 0x26, 0xa5, 0x1a, 0xe4,
- 0xdc, 0xa0, 0x43, 0x2b, 0xff, 0xfa, 0x4b, 0x6c, 0xf2, 0xd5, 0x62, 0x0d, 0xb4, 0x0e, 0xf9, 0xc9,
- 0x82, 0x01, 0xb9, 0xbc, 0xb1, 0x3a, 0x01, 0x09, 0x03, 0x65, 0x57, 0x07, 0x8f, 0x4d, 0xbf, 0x81,
- 0x8c, 0x31, 0x3a, 0x57, 0x1c, 0xdb, 0x0d, 0xc1, 0xec, 0xce, 0xdd, 0x6e, 0x74, 0xde, 0xd7, 0xda,
- 0x4f, 0xf1, 0x15, 0x0f, 0x72, 0x69, 0x63, 0x74, 0xfe, 0x94, 0x99, 0x38, 0x1b, 0x46, 0x7c, 0xc6,
- 0x30, 0x12, 0xa1, 0x61, 0xa0, 0x7b, 0x50, 0x18, 0xea, 0x1d, 0xac, 0xa8, 0x9d, 0x8e, 0x89, 0x2d,
- 0x16, 0xbb, 0x73, 0x5c, 0x73, 0x9e, 0xf4, 0xd4, 0x58, 0x87, 0xf4, 0x9d, 0x00, 0x68, 0x32, 0xd0,
- 0xa2, 0x13, 0x58, 0xf1, 0x62, 0xb5, 0x93, 0x00, 0xb0, 0x48, 0xb0, 0x19, 0x1d, 0xa8, 0x03, 0xf8,
- 0x82, 0x78, 0x19, 0x24, 0x93, 0xac, 0x6f, 0xcd, 0x73, 0x55, 0x06, 0x9d, 0x2f, 0x5d, 0x94, 0xf8,
- 0x82, 0x8b, 0x12, 0x93, 0x91, 0x2b, 0xef, 0xf6, 0x84, 0x5d, 0x69, 0x62, 0xa2, 0xee, 0x64, 0x40,
- 0xa5, 0x35, 0x21, 0xc6, 0xe7, 0x19, 0x35, 0x24, 0xe1, 0x4d, 0x86, 0x24, 0x3d, 0x02, 0xf1, 0x43,
- 0xf7, 0xfb, 0x5e, 0xfe, 0xe8, 0x1f, 0xa6, 0x30, 0x31, 0xcc, 0x4b, 0xc8, 0x12, 0xef, 0x4b, 0x83,
- 0xc6, 0x9f, 0x42, 0xce, 0x5d, 0x3d, 0xf7, 0xf1, 0x50, 0xe4, 0xb2, 0xf3, 0x91, 0x78, 0x22, 0xe8,
- 0x01, 0xac, 0x90, 0xb8, 0xe1, 0x54, 0x7f, 0x19, 0x42, 0x18, 0xa7, 0xde, 0xb0, 0xcc, 0x3a, 0x0e,
- 0x1c, 0x58, 0x8b, 0xc4, 0x68, 0x91, 0xc5, 0x72, 0xdc, 0xf9, 0xff, 0x18, 0x00, 0xb9, 0xf3, 0x85,
- 0x80, 0x52, 0xb6, 0x87, 0xc5, 0x40, 0x32, 0x21, 0xfd, 0x65, 0x1c, 0xf2, 0xbe, 0x6a, 0x14, 0xfa,
- 0xe3, 0x40, 0x62, 0xb5, 0x39, 0xab, 0x72, 0xe5, 0xcb, 0xaa, 0x02, 0x13, 0x8b, 0x2f, 0x3f, 0xb1,
- 0xa8, 0x3a, 0xa0, 0x53, 0x94, 0x4e, 0x2e, 0x5d, 0x94, 0x7e, 0x1b, 0x90, 0xad, 0xdb, 0x6a, 0x9f,
- 0x04, 0x6f, 0x6d, 0xd8, 0x55, 0xd8, 0x69, 0x67, 0x85, 0x70, 0x91, 0xf6, 0x9c, 0xd1, 0x8e, 0x63,
- 0x42, 0x97, 0xfa, 0x90, 0x75, 0x81, 0x89, 0xe5, 0xdf, 0xe4, 0x4c, 0x2b, 0xbe, 0x57, 0x21, 0x3b,
- 0xc0, 0xb6, 0x4a, 0xc3, 0x1e, 0x03, 0xaa, 0xdc, 0xf6, 0x83, 0x0f, 0x20, 0xef, 0x7b, 0xa8, 0x44,
- 0x22, 0xe1, 0x61, 0xe3, 0xb9, 0x18, 0xab, 0x66, 0xbe, 0xfc, 0x7a, 0x33, 0x71, 0x88, 0x5f, 0x92,
- 0x4f, 0xc9, 0x8d, 0x7a, 0xb3, 0x51, 0x7f, 0x2a, 0x0a, 0xd5, 0xfc, 0x97, 0x5f, 0x6f, 0x66, 0x64,
- 0x4c, 0x0b, 0x37, 0x0f, 0x9e, 0x42, 0x39, 0xb4, 0x03, 0x41, 0x07, 0x8d, 0xa0, 0xb4, 0x7b, 0x7a,
- 0x7c, 0xb0, 0x57, 0xaf, 0xb5, 0x1a, 0xca, 0xd9, 0x51, 0xab, 0x21, 0x0a, 0xe8, 0x06, 0xac, 0x1e,
- 0xec, 0xfd, 0x59, 0xb3, 0xa5, 0xd4, 0x0f, 0xf6, 0x1a, 0x87, 0x2d, 0xa5, 0xd6, 0x6a, 0xd5, 0xea,
- 0x4f, 0xc5, 0xf8, 0xc3, 0x7f, 0xc9, 0x43, 0xb9, 0xb6, 0x53, 0xdf, 0xab, 0x19, 0x46, 0x5f, 0x6b,
- 0xab, 0xd4, 0xdd, 0xd7, 0x21, 0x49, 0x51, 0xe7, 0x99, 0x6f, 0xa1, 0xab, 0xb3, 0xab, 0x71, 0xe8,
- 0x09, 0xa4, 0x28, 0x20, 0x8d, 0x66, 0x3f, 0x8e, 0xae, 0xce, 0x29, 0xcf, 0x91, 0xc1, 0xd0, 0x73,
- 0x33, 0xf3, 0xb5, 0x74, 0x75, 0x76, 0xb5, 0x0e, 0x1d, 0x40, 0xc6, 0x01, 0xe3, 0xe6, 0x3d, 0x61,
- 0xae, 0xce, 0x2d, 0xa1, 0x91, 0xa9, 0x31, 0x50, 0x73, 0xf6, 0x43, 0xea, 0xea, 0x9c, 0x3a, 0x1e,
- 0x92, 0x21, 0xe7, 0xc1, 0xdc, 0xf3, 0xdf, 0x74, 0x57, 0x17, 0xa8, 0x2b, 0xa2, 0x4f, 0xa1, 0x18,
- 0x84, 0xed, 0x16, 0x7b, 0x6e, 0x5d, 0x5d, 0xb0, 0xe6, 0x47, 0xf4, 0x07, 0x31, 0xbc, 0xc5, 0x9e,
- 0x5f, 0x57, 0x17, 0x2c, 0x01, 0xa2, 0xcf, 0x60, 0x65, 0x12, 0x63, 0x5b, 0xfc, 0x35, 0x76, 0x75,
- 0x89, 0xa2, 0x20, 0x1a, 0x00, 0x9a, 0x82, 0xcd, 0x2d, 0xf1, 0x38, 0xbb, 0xba, 0x4c, 0x8d, 0x10,
- 0x75, 0x41, 0x9c, 0x78, 0x2e, 0xb7, 0xf0, 0x63, 0xed, 0xea, 0xe2, 0x05, 0x43, 0xd4, 0x81, 0x72,
- 0x18, 0x04, 0x5b, 0xf4, 0xf1, 0x76, 0x75, 0xe1, 0xf2, 0x21, 0xfb, 0x4a, 0x10, 0x8c, 0x59, 0xf4,
- 0x31, 0x77, 0x75, 0xe1, 0x6a, 0x22, 0x3a, 0x05, 0xf0, 0x5d, 0xa2, 0x17, 0x78, 0xdc, 0x5d, 0x5d,
- 0xa4, 0xae, 0x88, 0x0c, 0x58, 0x9d, 0x76, 0x6b, 0x5e, 0xe6, 0xad, 0x77, 0x75, 0xa9, 0x72, 0x23,
- 0x39, 0x38, 0xc1, 0x0b, 0xf0, 0x62, 0x6f, 0xbf, 0xab, 0x0b, 0xd6, 0x1d, 0x77, 0x76, 0xbe, 0x79,
- 0xbd, 0x2e, 0x7c, 0xfb, 0x7a, 0x5d, 0xf8, 0xee, 0xf5, 0xba, 0xf0, 0xd5, 0xf7, 0xeb, 0xb1, 0x6f,
- 0xbf, 0x5f, 0x8f, 0xfd, 0xc7, 0xf7, 0xeb, 0xb1, 0x3f, 0xbf, 0xdf, 0xd5, 0xec, 0xde, 0xe8, 0x7c,
- 0xab, 0xad, 0x0f, 0xe8, 0x7f, 0x7a, 0x0c, 0xf5, 0x6a, 0x9b, 0xe9, 0x24, 0x2d, 0xdf, 0x3f, 0x87,
- 0xce, 0xd3, 0x34, 0xa8, 0x3e, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0c, 0x9b, 0xee, 0x1d,
- 0x59, 0x34, 0x00, 0x00,
+ 0xcc, 0xd5, 0xfc, 0xbf, 0xdc, 0xf4, 0xa8, 0xed, 0x49, 0xfd, 0x1c, 0xdb, 0xd3, 0x84, 0x34, 0xbe,
+ 0xc4, 0x43, 0xdb, 0xaa, 0xa4, 0xe9, 0x8c, 0xaf, 0x4f, 0xce, 0x98, 0x74, 0xef, 0x54, 0x48, 0xee,
+ 0xf3, 0x5f, 0xaf, 0x36, 0x44, 0xc6, 0xfd, 0xb6, 0x3e, 0xd0, 0x6c, 0x3c, 0x30, 0xec, 0x2b, 0x99,
+ 0xcb, 0x4b, 0xef, 0x41, 0x29, 0xb8, 0xe8, 0xd1, 0x2e, 0xc4, 0x73, 0xd2, 0x71, 0xe9, 0xef, 0x05,
+ 0x58, 0x9d, 0x82, 0xe5, 0xa0, 0xc7, 0xbc, 0xa4, 0xc4, 0x36, 0xfe, 0xee, 0xe4, 0xea, 0x05, 0xd8,
+ 0xbd, 0xca, 0x12, 0x09, 0x9a, 0xde, 0xd5, 0x81, 0xed, 0xb1, 0x47, 0x40, 0xbf, 0x86, 0xb2, 0xa5,
+ 0x75, 0x87, 0x8a, 0xc9, 0x60, 0x21, 0xb7, 0x5c, 0x43, 0x32, 0x7b, 0xd2, 0xe1, 0x14, 0x35, 0x3b,
+ 0x24, 0xf3, 0x41, 0x20, 0x2a, 0x21, 0x6e, 0xa9, 0x0d, 0x68, 0xf2, 0x26, 0x33, 0x0d, 0xb8, 0x12,
+ 0xde, 0x00, 0xb8, 0xfa, 0x3b, 0x01, 0x6e, 0xcd, 0xb8, 0xdd, 0xa0, 0x8f, 0x42, 0xe7, 0xe2, 0x83,
+ 0x65, 0xee, 0x46, 0x5b, 0x8c, 0x16, 0x3c, 0x19, 0xd2, 0x23, 0x28, 0xf8, 0xe9, 0x8b, 0x6d, 0xde,
+ 0xbe, 0x17, 0xfb, 0x83, 0x00, 0xdb, 0x5d, 0x28, 0x9a, 0xd8, 0x26, 0x4e, 0x2a, 0x80, 0x48, 0x16,
+ 0x18, 0x91, 0xa5, 0xa9, 0xfb, 0xc9, 0xac, 0x20, 0xc6, 0x5d, 0xfb, 0xf9, 0x57, 0x01, 0xc0, 0x43,
+ 0xdd, 0x3c, 0xd4, 0x4b, 0xf0, 0xa3, 0x5e, 0x21, 0xb0, 0x34, 0x1e, 0x06, 0x4b, 0xd1, 0x3d, 0x28,
+ 0xb3, 0xfb, 0x08, 0xd9, 0x37, 0xd5, 0x1e, 0x99, 0x98, 0x63, 0x6c, 0x25, 0x4a, 0x3e, 0x71, 0xa8,
+ 0xe8, 0x13, 0xb8, 0x69, 0xf7, 0x4c, 0x6c, 0xf5, 0xf4, 0x7e, 0x47, 0x09, 0xef, 0x1d, 0xab, 0xfd,
+ 0x6c, 0xcc, 0x31, 0x3a, 0xf9, 0x86, 0xab, 0xe1, 0x2c, 0xb8, 0x7f, 0x5f, 0x42, 0x8a, 0x1e, 0x1b,
+ 0x92, 0xf4, 0xb9, 0x56, 0x9c, 0xe3, 0x06, 0xfa, 0x29, 0x80, 0x6a, 0xdb, 0xa6, 0x76, 0x3e, 0x22,
+ 0xde, 0x21, 0x3e, 0xf9, 0x29, 0xef, 0xd8, 0xd5, 0x1c, 0xbe, 0x9d, 0xdb, 0xfc, 0xfc, 0xad, 0x79,
+ 0xa2, 0xbe, 0x33, 0xe8, 0x53, 0x28, 0x1d, 0x42, 0x29, 0x28, 0xeb, 0x64, 0xd3, 0x6c, 0x0c, 0xc1,
+ 0x6c, 0x9a, 0x65, 0xe7, 0x3c, 0x9b, 0x76, 0x73, 0xf1, 0x04, 0xab, 0xfe, 0xd2, 0x86, 0xf4, 0xa3,
+ 0x00, 0x05, 0xbf, 0xd7, 0x5b, 0x38, 0xe1, 0xe5, 0x17, 0x80, 0xc4, 0xe4, 0x05, 0x20, 0xe9, 0x4b,
+ 0x81, 0x6f, 0x42, 0x96, 0xa4, 0xc0, 0x23, 0x0b, 0x77, 0x78, 0x4d, 0x3c, 0xd3, 0x55, 0xad, 0x53,
+ 0x0b, 0x77, 0x7c, 0xbe, 0x29, 0xf3, 0x66, 0xbe, 0x29, 0x98, 0x48, 0x67, 0x43, 0x89, 0xf4, 0x7e,
+ 0x32, 0x9b, 0x12, 0xd3, 0xb2, 0x2f, 0x13, 0x97, 0xfe, 0x52, 0x80, 0xac, 0x3b, 0xdf, 0x60, 0x31,
+ 0x38, 0x80, 0xcb, 0xb2, 0xe5, 0x62, 0xa5, 0x60, 0x7e, 0x75, 0x61, 0xa5, 0xf1, 0x84, 0x5b, 0x1a,
+ 0xff, 0x9d, 0x9b, 0x0c, 0x46, 0x21, 0x8f, 0xfe, 0xc5, 0x75, 0xc0, 0x66, 0x9e, 0xfb, 0xfe, 0x2d,
+ 0x1f, 0x07, 0xc9, 0x58, 0xd0, 0x1f, 0x40, 0x5a, 0x6d, 0xbb, 0x78, 0x6b, 0x69, 0x0a, 0x10, 0xe9,
+ 0xb0, 0x6e, 0xb5, 0xc6, 0x35, 0xca, 0x29, 0x73, 0x09, 0x3e, 0xaa, 0xb8, 0x33, 0x2a, 0xe9, 0x80,
+ 0xe8, 0x65, 0x3c, 0xc1, 0x93, 0x5e, 0x02, 0x38, 0x3d, 0x7c, 0x76, 0xb4, 0xbb, 0xf7, 0x64, 0xaf,
+ 0xb1, 0xcb, 0xb3, 0xbd, 0xdd, 0xdd, 0xc6, 0xae, 0x18, 0x27, 0x7c, 0x72, 0xe3, 0xd9, 0xd1, 0x59,
+ 0x63, 0x57, 0x4c, 0x90, 0xc6, 0x6e, 0xe3, 0xa0, 0xf6, 0x71, 0x63, 0x57, 0x4c, 0x4a, 0x35, 0xc8,
+ 0xb9, 0x41, 0x87, 0xbe, 0x21, 0xd0, 0x5f, 0x62, 0x93, 0xaf, 0x16, 0x6b, 0xa0, 0x75, 0xc8, 0x4f,
+ 0x16, 0x0c, 0xc8, 0xe5, 0x8d, 0xd5, 0x09, 0x48, 0x18, 0x28, 0xbb, 0x3a, 0x78, 0x6c, 0xfa, 0x1d,
+ 0x64, 0x8c, 0xd1, 0xb9, 0xe2, 0xd8, 0x6e, 0x08, 0x66, 0x77, 0xee, 0x76, 0xa3, 0xf3, 0xbe, 0xd6,
+ 0x7e, 0x8a, 0xaf, 0x78, 0x90, 0x4b, 0x1b, 0xa3, 0xf3, 0xa7, 0xcc, 0xc4, 0xd9, 0x30, 0xe2, 0x33,
+ 0x86, 0x91, 0x08, 0x0d, 0x03, 0xdd, 0x83, 0xc2, 0x50, 0xef, 0x60, 0x45, 0xed, 0x74, 0x4c, 0x6c,
+ 0xb1, 0xd8, 0x9d, 0xe3, 0x9a, 0xf3, 0xa4, 0xa7, 0xc6, 0x3a, 0xa4, 0xef, 0x05, 0x40, 0x93, 0x81,
+ 0x16, 0x9d, 0xc0, 0x8a, 0x17, 0xab, 0x9d, 0x04, 0x80, 0x45, 0x82, 0xcd, 0xe8, 0x40, 0x1d, 0xc0,
+ 0x17, 0xc4, 0xcb, 0x20, 0x99, 0x64, 0x7d, 0x6b, 0x9e, 0xab, 0x32, 0xe8, 0x7c, 0xe9, 0xa2, 0xc4,
+ 0x17, 0x5c, 0x94, 0x98, 0x8c, 0x5c, 0x79, 0xb7, 0x27, 0xec, 0x4a, 0x13, 0x13, 0x75, 0x27, 0x03,
+ 0x2a, 0xad, 0x09, 0x31, 0x3e, 0xcf, 0xa8, 0x21, 0x09, 0x6f, 0x32, 0x24, 0xe9, 0x11, 0x88, 0x1f,
+ 0xb9, 0xdf, 0xf7, 0xf2, 0x47, 0xff, 0x30, 0x85, 0x89, 0x61, 0x5e, 0x42, 0x96, 0x78, 0x5f, 0x1a,
+ 0x34, 0xfe, 0x08, 0x72, 0xee, 0xea, 0xb9, 0xcf, 0x90, 0x22, 0x97, 0x9d, 0x8f, 0xc4, 0x13, 0x41,
+ 0x0f, 0x60, 0x85, 0xc4, 0x0d, 0xa7, 0xfa, 0xeb, 0xbd, 0x73, 0xc8, 0xca, 0x65, 0xd6, 0x71, 0xe0,
+ 0xc0, 0x5a, 0x24, 0x46, 0x8b, 0x2c, 0x96, 0xe3, 0xce, 0xff, 0xc5, 0x00, 0xc8, 0x9d, 0x2f, 0x04,
+ 0x94, 0xb2, 0x3d, 0x2c, 0x06, 0x92, 0x09, 0xe9, 0xcf, 0xe3, 0x90, 0xf7, 0x55, 0xa3, 0xd0, 0xef,
+ 0x07, 0x12, 0xab, 0xcd, 0x59, 0x95, 0x2b, 0x5f, 0x56, 0x15, 0x98, 0x58, 0x7c, 0xf9, 0x89, 0x45,
+ 0xd5, 0x01, 0x9d, 0xa2, 0x74, 0x72, 0xe9, 0xa2, 0xf4, 0xdb, 0x80, 0x6c, 0xdd, 0x56, 0xfb, 0x24,
+ 0x78, 0x6b, 0xc3, 0xae, 0xc2, 0x4e, 0x3b, 0x2b, 0x84, 0x8b, 0xb4, 0xe7, 0x8c, 0x76, 0x1c, 0x13,
+ 0xba, 0xd4, 0x87, 0xac, 0x0b, 0x4c, 0x2c, 0xff, 0xba, 0x67, 0x5a, 0xf1, 0xbd, 0x0a, 0xd9, 0x01,
+ 0xb6, 0x55, 0x1a, 0xf6, 0x18, 0x50, 0xe5, 0xb6, 0x1f, 0x7c, 0x00, 0x79, 0xdf, 0x93, 0x27, 0x12,
+ 0x09, 0x0f, 0x1b, 0xcf, 0xc5, 0x58, 0x35, 0xf3, 0xd5, 0x37, 0x9b, 0x89, 0x43, 0xfc, 0x92, 0x7c,
+ 0x4a, 0x6e, 0xd4, 0x9b, 0x8d, 0xfa, 0x53, 0x51, 0xa8, 0xe6, 0xbf, 0xfa, 0x66, 0x33, 0x23, 0x63,
+ 0x5a, 0xb8, 0x79, 0xf0, 0x14, 0xca, 0xa1, 0x1d, 0x08, 0x3a, 0x68, 0x04, 0xa5, 0xdd, 0xd3, 0xe3,
+ 0x83, 0xbd, 0x7a, 0xad, 0xd5, 0x50, 0xce, 0x8e, 0x5a, 0x0d, 0x51, 0x40, 0x37, 0x60, 0xf5, 0x60,
+ 0xef, 0x8f, 0x9b, 0x2d, 0xa5, 0x7e, 0xb0, 0xd7, 0x38, 0x6c, 0x29, 0xb5, 0x56, 0xab, 0x56, 0x7f,
+ 0x2a, 0xc6, 0x1f, 0xfe, 0x73, 0x1e, 0xca, 0xb5, 0x9d, 0xfa, 0x5e, 0xcd, 0x30, 0xfa, 0x5a, 0x5b,
+ 0xa5, 0xee, 0xbe, 0x0e, 0x49, 0x8a, 0x3a, 0xcf, 0x7c, 0x55, 0x5d, 0x9d, 0x5d, 0x8d, 0x43, 0x4f,
+ 0x20, 0x45, 0x01, 0x69, 0x34, 0xfb, 0x99, 0x75, 0x75, 0x4e, 0x79, 0x8e, 0x0c, 0x86, 0x9e, 0x9b,
+ 0x99, 0xef, 0xae, 0xab, 0xb3, 0xab, 0x75, 0xe8, 0x00, 0x32, 0x0e, 0x18, 0x37, 0xef, 0x31, 0x74,
+ 0x75, 0x6e, 0x09, 0x8d, 0x4c, 0x8d, 0x81, 0x9a, 0xb3, 0x9f, 0x64, 0x57, 0xe7, 0xd4, 0xf1, 0x90,
+ 0x0c, 0x39, 0x0f, 0xe6, 0x9e, 0xff, 0x3a, 0xbc, 0xba, 0x40, 0x5d, 0x11, 0x7d, 0x06, 0xc5, 0x20,
+ 0x6c, 0xb7, 0xd8, 0xc3, 0xed, 0xea, 0x82, 0x35, 0x3f, 0xa2, 0x3f, 0x88, 0xe1, 0x2d, 0xf6, 0x90,
+ 0xbb, 0xba, 0x60, 0x09, 0x10, 0x7d, 0x0e, 0x2b, 0x93, 0x18, 0xdb, 0xe2, 0xef, 0xba, 0xab, 0x4b,
+ 0x14, 0x05, 0xd1, 0x00, 0xd0, 0x14, 0x6c, 0x6e, 0x89, 0x67, 0xde, 0xd5, 0x65, 0x6a, 0x84, 0xa8,
+ 0x0b, 0xe2, 0xc4, 0xbb, 0xbb, 0x85, 0x9f, 0x7d, 0x57, 0x17, 0x2f, 0x18, 0xa2, 0x0e, 0x94, 0xc3,
+ 0x20, 0xd8, 0xa2, 0xcf, 0xc0, 0xab, 0x0b, 0x97, 0x0f, 0xd9, 0x57, 0x82, 0x60, 0xcc, 0xa2, 0xcf,
+ 0xc2, 0xab, 0x0b, 0x57, 0x13, 0xd1, 0x29, 0x80, 0xef, 0x12, 0xbd, 0xc0, 0x33, 0xf1, 0xea, 0x22,
+ 0x75, 0x45, 0x64, 0xc0, 0xea, 0xb4, 0x5b, 0xf3, 0x32, 0xaf, 0xc6, 0xab, 0x4b, 0x95, 0x1b, 0xc9,
+ 0xc1, 0x09, 0x5e, 0x80, 0x17, 0x7b, 0x45, 0x5e, 0x5d, 0xb0, 0xee, 0xb8, 0xb3, 0xf3, 0xed, 0xeb,
+ 0x75, 0xe1, 0xbb, 0xd7, 0xeb, 0xc2, 0xf7, 0xaf, 0xd7, 0x85, 0xaf, 0x7f, 0x58, 0x8f, 0x7d, 0xf7,
+ 0xc3, 0x7a, 0xec, 0xdf, 0x7f, 0x58, 0x8f, 0xfd, 0xe9, 0xfd, 0xae, 0x66, 0xf7, 0x46, 0xe7, 0x5b,
+ 0x6d, 0x7d, 0x40, 0xff, 0x1d, 0x64, 0xa8, 0x57, 0xdb, 0x4c, 0x27, 0x69, 0xf9, 0xfe, 0x83, 0x74,
+ 0x9e, 0xa6, 0x41, 0xf5, 0xd1, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x18, 0x19, 0x24, 0x60, 0xa3,
+ 0x34, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -6165,9 +6175,21 @@ func (m *RequestFinalizeSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error)
_ = i
var l int
_ = l
- if m.LightBlock != nil {
+ if m.GenesisBlock != nil {
{
- size, err := m.LightBlock.MarshalToSizedBuffer(dAtA[:i])
+ size, err := m.GenesisBlock.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintTypes(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ if m.SnapshotBlock != nil {
+ {
+ size, err := m.SnapshotBlock.MarshalToSizedBuffer(dAtA[:i])
if err != nil {
return 0, err
}
@@ -6248,12 +6270,12 @@ func (m *RequestPrepareProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x3a
}
- n23, err23 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err23 != nil {
- return 0, err23
+ n24, err24 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err24 != nil {
+ return 0, err24
}
- i -= n23
- i = encodeVarintTypes(dAtA, i, uint64(n23))
+ i -= n24
+ i = encodeVarintTypes(dAtA, i, uint64(n24))
i--
dAtA[i] = 0x32
if m.Height != 0 {
@@ -6377,12 +6399,12 @@ func (m *RequestProcessProposal) MarshalToSizedBuffer(dAtA []byte) (int, error)
i--
dAtA[i] = 0x42
}
- n27, err27 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err27 != nil {
- return 0, err27
+ n28, err28 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err28 != nil {
+ return 0, err28
}
- i -= n27
- i = encodeVarintTypes(dAtA, i, uint64(n27))
+ i -= n28
+ i = encodeVarintTypes(dAtA, i, uint64(n28))
i--
dAtA[i] = 0x3a
if m.Round != 0 {
@@ -7243,12 +7265,12 @@ func (m *ResponseInitChain_GenesisTime) MarshalTo(dAtA []byte) (int, error) {
func (m *ResponseInitChain_GenesisTime) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i := len(dAtA)
if m.GenesisTime != nil {
- n52, err52 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
- if err52 != nil {
- return 0, err52
+ n53, err53 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.GenesisTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.GenesisTime):])
+ if err53 != nil {
+ return 0, err53
}
- i -= n52
- i = encodeVarintTypes(dAtA, i, uint64(n52))
+ i -= n53
+ i = encodeVarintTypes(dAtA, i, uint64(n53))
i--
dAtA[i] = 0x32
}
@@ -8548,12 +8570,12 @@ func (m *Misbehavior) MarshalToSizedBuffer(dAtA []byte) (int, error) {
i--
dAtA[i] = 0x28
}
- n65, err65 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
- if err65 != nil {
- return 0, err65
+ n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):])
+ if err66 != nil {
+ return 0, err66
}
- i -= n65
- i = encodeVarintTypes(dAtA, i, uint64(n65))
+ i -= n66
+ i = encodeVarintTypes(dAtA, i, uint64(n66))
i--
dAtA[i] = 0x22
if m.Height != 0 {
@@ -9030,8 +9052,12 @@ func (m *RequestFinalizeSnapshot) Size() (n int) {
}
var l int
_ = l
- if m.LightBlock != nil {
- l = m.LightBlock.Size()
+ if m.SnapshotBlock != nil {
+ l = m.SnapshotBlock.Size()
+ n += 1 + l + sovTypes(uint64(l))
+ }
+ if m.GenesisBlock != nil {
+ l = m.GenesisBlock.Size()
n += 1 + l + sovTypes(uint64(l))
}
return n
@@ -12048,7 +12074,43 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field LightBlock", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field SnapshotBlock", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTypes
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthTypes
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthTypes
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.SnapshotBlock == nil {
+ m.SnapshotBlock = &types1.LightBlock{}
+ }
+ if err := m.SnapshotBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field GenesisBlock", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -12075,10 +12137,10 @@ func (m *RequestFinalizeSnapshot) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if m.LightBlock == nil {
- m.LightBlock = &types1.LightBlock{}
+ if m.GenesisBlock == nil {
+ m.GenesisBlock = &types1.LightBlock{}
}
- if err := m.LightBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ if err := m.GenesisBlock.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index aff823cc2b..aeeae5d41b 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -372,8 +372,17 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil, err
}
+ if state.InitialHeight < 1 {
+ return sm.State{}, nil, fmt.Errorf("initial genesis height %d is invalid", state.InitialHeight)
+ }
+ genesisHeight := uint64(state.InitialHeight)
+ genesisBlock, err := s.getStateProvider().LightBlock(ctx, genesisHeight)
+ if err != nil {
+ return sm.State{}, nil, fmt.Errorf("failed to get genesis block at height %d: %w", genesisHeight, err)
+ }
+
// Finalize
- if err := s.finalizeSnapshot(ctx, snapshot, block); err != nil {
+ if err := s.finalizeSnapshot(ctx, snapshot, genesisBlock, block); err != nil {
return sm.State{}, nil, fmt.Errorf("failed to finalize snapshot: %w", err)
}
@@ -579,20 +588,26 @@ func (s *syncer) requestChunk(ctx context.Context, snapshot *snapshot, chunkID t
}
// / finalizeSnapshot sends light block to ABCI app after state sync is done
-func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, block *types.LightBlock) error {
+func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, genesisBlock *types.LightBlock, snapshotBlock *types.LightBlock) error {
s.logger.Info("Finalizing snapshot restoration",
"snapshot", snapshot.Hash.String(),
"height", snapshot.Height,
"version", snapshot.Version,
"app_hash", snapshot.trustedAppHash,
)
- lightBlock, err := block.ToProto()
+
+ snapshotBlockProto, err := snapshotBlock.ToProto()
+ if err != nil {
+ return fmt.Errorf("failed to convert snapshot block %s to proto: %w", snapshotBlock.String(), err)
+ }
+ genesisBlockProto, err := genesisBlock.ToProto()
if err != nil {
- return fmt.Errorf("failed to convert light block %s to proto: %w", lightBlock.String(), err)
+ return fmt.Errorf("failed to convert genesis block %s to proto: %w", genesisBlock.String(), err)
}
_, err = s.conn.FinalizeSnapshot(ctx, &abci.RequestFinalizeSnapshot{
- LightBlock: lightBlock,
+ SnapshotBlock: snapshotBlockProto,
+ GenesisBlock: genesisBlockProto,
})
return err
diff --git a/light/example_test.go b/light/example_test.go
index 55b93fedae..0c899f2d74 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,3 +113,89 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
+
+// Manually getting light blocks and verifying them.
+func TestClientLocalDevnet(t *testing.T) {
+ const CHAINID = "dashmate_local_37"
+
+ if testing.Short() {
+ t.Skip("skipping test in short mode")
+ }
+
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Start a test application
+ // app, err := kvstore.NewMemoryApp()
+ // require.NoError(t, err)
+
+ primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // give Tendermint time to generate some blocks
+ time.Sleep(5 * time.Second)
+
+ _, err = primary.LightBlock(ctx, 1)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ db := dbm.NewMemDB()
+
+ // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
+ require.NoError(t, err)
+ coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
+ "tenderdash", "I3MFP6SmzDG0",
+ logger)
+ require.NoError(t, err)
+
+ c, err := light.NewClientAtHeight(
+ ctx,
+ 1,
+ CHAINID,
+ primary,
+ nil,
+ dbs.New(db),
+ coreClient,
+ light.Logger(logger),
+ )
+
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer func() {
+ if err := c.Cleanup(); err != nil {
+ t.Fatal(err)
+ }
+ }()
+
+ // wait for a few more blocks to be produced
+ time.Sleep(2 * time.Second)
+
+ // verify the block at height 3
+ _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // retrieve light block at height 3
+ _, err = c.TrustedLightBlock(3)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // update to the latest height
+ lb, err := c.Update(ctx, time.Now())
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ logger.Info("verified light block", "light-block", lb)
+}
diff --git a/proto/tendermint/abci/types.proto b/proto/tendermint/abci/types.proto
index 4b67f05b38..6963cd792e 100644
--- a/proto/tendermint/abci/types.proto
+++ b/proto/tendermint/abci/types.proto
@@ -191,8 +191,10 @@ message RequestApplySnapshotChunk {
// If the application fails to validate the light block, it should return error in the response.
// This is considered fatal, non-recoverable consensus failure and will cause Tenderdash to restart.
message RequestFinalizeSnapshot {
- // light block committed at the synced height
- tendermint.types.LightBlock light_block = 1;
+ // Snapshot block is a block at which the snapshot was taken.
+ tendermint.types.LightBlock snapshot_block = 1;
+ // Genesis block is the first block of the chain
+ tendermint.types.LightBlock genesis_block = 2;
}
// Prepare new block proposal, potentially altering list of transactions.
diff --git a/spec/abci++/api.md b/spec/abci++/api.md
index c1310169fc..aff911a8b5 100644
--- a/spec/abci++/api.md
+++ b/spec/abci++/api.md
@@ -440,7 +440,8 @@ This is considered fatal, non-recoverable consensus failure and will cause Tende
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
-| light_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | light block committed at the synced height |
+| snapshot_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | Snapshot block is a block at which the snapshot was taken. |
+| genesis_block | [tendermint.types.LightBlock](#tendermint-types-LightBlock) | | Genesis block is the first block of the chain |
From 9d3dae43c3803d5372e2b45a087fd1c0f46192fe Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:28:41 +0100
Subject: [PATCH 21/65] chore: fix lint warning
---
test/e2e/pkg/mockcoreserver/core_server.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/e2e/pkg/mockcoreserver/core_server.go b/test/e2e/pkg/mockcoreserver/core_server.go
index fbe9d149ed..5aa2b7b0c2 100644
--- a/test/e2e/pkg/mockcoreserver/core_server.go
+++ b/test/e2e/pkg/mockcoreserver/core_server.go
@@ -146,7 +146,7 @@ func (c *MockCoreServer) QuorumVerify(ctx context.Context, cmd btcjson.QuorumCmd
signatureVerified := thresholdPublicKey.VerifySignatureDigest(signID, signature)
- res := btcjson.QuorumVerifyResult(signatureVerified)
+ res := btcjson.QuorumVerifyResult{Result: signatureVerified}
return res
}
From 4a75455dc1205e063b267acd98a9ed2ff2a696af Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:37:29 +0100
Subject: [PATCH 22/65] chore: update kvstore for changed
requestfinalizesnapshot
---
abci/example/kvstore/kvstore.go | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 7fffaa810e..93da95fce3 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -584,15 +584,21 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
app.mu.Lock()
defer app.mu.Unlock()
- // we verify snapshot height and app hash, as there is no additional logic to be called here
- if app.LastCommittedState.GetHeight() != req.LightBlock.SignedHeader.Header.Height {
+ // we only run some verifications here
+
+ if app.LastCommittedState.GetHeight() != req.SnapshotBlock.SignedHeader.Header.Height {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
- app.LastCommittedState.GetHeight(), req.LightBlock.SignedHeader.Header.Height)
+ app.LastCommittedState.GetHeight(), req.SnapshotBlock.SignedHeader.Header.Height)
}
- if !app.LastCommittedState.GetAppHash().Equal(req.LightBlock.SignedHeader.Header.AppHash) {
+ if !app.LastCommittedState.GetAppHash().Equal(req.SnapshotBlock.SignedHeader.Header.AppHash) {
return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
- app.LastCommittedState.GetAppHash(), req.LightBlock.SignedHeader.Header.AppHash)
+ app.LastCommittedState.GetAppHash(), req.SnapshotBlock.SignedHeader.Header.AppHash)
+ }
+
+ if app.initialHeight != req.GenesisBlock.SignedHeader.Header.Height {
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch: expected %d, got %d",
+ app.initialHeight, req.GenesisBlock.SignedHeader.Header.Height)
}
app.logger.Debug("FinalizeSnapshot finished successfully", "req", req)
From ef394e8941b492491977c004529c4917c3faa387 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:41:48 +0100
Subject: [PATCH 23/65] test: fix failing test
---
internal/statesync/syncer_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index 4c116b1617..c811f71590 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -83,7 +83,7 @@ func (suite *SyncerTestSuite) TestSyncAny() {
},
Software: version.TMCoreSemVer,
},
-
+ InitialHeight: 1,
LastBlockHeight: 1,
LastBlockID: types.BlockID{Hash: []byte("blockhash")},
LastBlockTime: time.Now(),
From 94c5f697293b917698f3800c2a989c604c8f5333 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:44:40 +0100
Subject: [PATCH 24/65] chore: remove tmp code
---
light/example_test.go | 86 -------------------------------------------
1 file changed, 86 deletions(-)
diff --git a/light/example_test.go b/light/example_test.go
index 0c899f2d74..55b93fedae 100644
--- a/light/example_test.go
+++ b/light/example_test.go
@@ -113,89 +113,3 @@ func TestExampleClient(t *testing.T) {
logger.Info("verified light block", "light-block", lb)
}
-
-// Manually getting light blocks and verifying them.
-func TestClientLocalDevnet(t *testing.T) {
- const CHAINID = "dashmate_local_37"
-
- if testing.Short() {
- t.Skip("skipping test in short mode")
- }
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- logger, err := log.NewDefaultLogger(log.LogFormatPlain, log.LogLevelTrace)
- if err != nil {
- t.Fatal(err)
- }
-
- // Start a test application
- // app, err := kvstore.NewMemoryApp()
- // require.NoError(t, err)
-
- primary, err := httpp.New(CHAINID, "10.56.229.104:34657")
- if err != nil {
- t.Fatal(err)
- }
-
- // give Tendermint time to generate some blocks
- time.Sleep(5 * time.Second)
-
- _, err = primary.LightBlock(ctx, 1)
- if err != nil {
- t.Fatal(err)
- }
-
- db := dbm.NewMemDB()
-
- // pv, err := privval.LoadOrGenFilePV(conf.PrivValidator.KeyFile(), conf.PrivValidator.StateFile())
- require.NoError(t, err)
- coreClient, err := dashcore.NewRPCClient("10.56.229.104:30002",
- "tenderdash", "I3MFP6SmzDG0",
- logger)
- require.NoError(t, err)
-
- c, err := light.NewClientAtHeight(
- ctx,
- 1,
- CHAINID,
- primary,
- nil,
- dbs.New(db),
- coreClient,
- light.Logger(logger),
- )
-
- if err != nil {
- t.Fatal(err)
- }
- defer func() {
- if err := c.Cleanup(); err != nil {
- t.Fatal(err)
- }
- }()
-
- // wait for a few more blocks to be produced
- time.Sleep(2 * time.Second)
-
- // verify the block at height 3
- _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- // retrieve light block at height 3
- _, err = c.TrustedLightBlock(3)
- if err != nil {
- t.Fatal(err)
- }
-
- // update to the latest height
- lb, err := c.Update(ctx, time.Now())
- if err != nil {
- t.Fatal(err)
- }
-
- logger.Info("verified light block", "light-block", lb)
-}
From a3262262798ed50f626d0624426992218c34b8bb Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:55:28 +0100
Subject: [PATCH 25/65] chore: improve safemath lib
---
libs/math/safemath.go | 147 +++++++++++++++++++++++++++++++++++++
libs/math/safemath_test.go | 105 ++++++++++++++++++++++++++
2 files changed, 252 insertions(+)
diff --git a/libs/math/safemath.go b/libs/math/safemath.go
index 9afb409b21..54f0b7a4f7 100644
--- a/libs/math/safemath.go
+++ b/libs/math/safemath.go
@@ -8,9 +8,11 @@ import (
var ErrOverflowInt64 = errors.New("int64 overflow")
var ErrOverflowInt32 = errors.New("int32 overflow")
+var ErrOverflowUint64 = errors.New("uint64 overflow")
var ErrOverflowUint32 = errors.New("uint32 overflow")
var ErrOverflowUint8 = errors.New("uint8 overflow")
var ErrOverflowInt8 = errors.New("int8 overflow")
+var ErrOverflow = errors.New("integer overflow")
// SafeAddClipInt64 adds two int64 integers and clips the result to the int64 range.
func SafeAddClipInt64(a, b int64) int64 {
@@ -94,10 +96,106 @@ func SafeConvertUint32[T Integer](a T) (uint32, error) {
return uint32(a), nil
}
+// SafeConvertUint64 takes a int and checks if it overflows.
+func SafeConvertUint64[T Integer](a T) (uint64, error) {
+ return SafeConvert[T, uint64](a)
+}
+
+// SafeConvertInt64 takes a int and checks if it overflows.
+func SafeConvertInt64[T Integer](a T) (int64, error) {
+ return SafeConvert[T, int64](a)
+}
+
+// SafeConvertInt16 takes a int and checks if it overflows.
+func SafeConvertInt16[T Integer](a T) (int16, error) {
+ return SafeConvert[T, int16](a)
+}
+
+// SafeConvertUint16 takes a int and checks if it overflows.
+func SafeConvertUint16[T Integer](a T) (uint16, error) {
+ return SafeConvert[T, uint16](a)
+}
+
type Integer interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64
}
+// SafeConvert converts a value of type T to a value of type U.
+// It returns an error if the conversion would cause an overflow.
+func SafeConvert[T Integer, U Integer](from T) (U, error) {
+ const uintIsSmall = math.MaxUint < math.MaxUint64
+ const intIsSmall = math.MaxInt < math.MaxInt64 && math.MinInt > math.MinInt64
+
+ // special case for int64 and uint64 inputs; all other types are safe to convert to int64
+ switch any(from).(type) {
+ case int64:
+ // conversion from int64 to uint64 - we need to check for negative values
+ if _, ok := any(U(0)).(uint64); ok && from < 0 {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+ case uint64:
+ // conversion from uint64 to int64 - we need to check for overflow
+ if _, ok := any(U(0)).(int64); ok && uint64(from) > math.MaxInt64 {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+ case int:
+ if !intIsSmall {
+ return SafeConvert[int64, U](int64(from))
+ }
+ // no return here - it's safe to use normal logic
+ case uint:
+ if !uintIsSmall {
+ return SafeConvert[uint64, U](uint64(from))
+ }
+ // no return here - it's safe to use normal logic
+ }
+ if uint64(from) > Max[U]() {
+ return 0, ErrOverflow
+ }
+ if int64(from) < Min[U]() {
+ return 0, ErrOverflow
+ }
+ return U(from), nil
+}
+
+func MustConvert[FROM Integer, TO Integer](a FROM) TO {
+ i, err := SafeConvert[FROM, TO](a)
+ if err != nil {
+ panic(fmt.Errorf("cannot convert %d to %T: %w", a, any(i), err))
+ }
+ return i
+}
+
+func MustConvertUint64[T Integer](a T) uint64 {
+ return MustConvert[T, uint64](a)
+}
+
+func MustConvertInt64[T Integer](a T) int64 {
+ return MustConvert[T, int64](a)
+}
+
+func MustConvertUint16[T Integer](a T) uint16 {
+ return MustConvert[T, uint16](a)
+}
+
+func MustConvertInt16[T Integer](a T) int16 {
+ return MustConvert[T, int16](a)
+}
+
+func MustConvertUint8[T Integer](a T) uint8 {
+ return MustConvert[T, uint8](a)
+}
+
+func MustConvertUint[T Integer](a T) uint {
+ return MustConvert[T, uint](a)
+}
+
+func MustConvertInt[T Integer](a T) int {
+ return MustConvert[T, int](a)
+}
+
// MustConvertInt32 takes an Integer and converts it to int32.
// Panics if the conversion overflows.
func MustConvertInt32[T Integer](a T) int32 {
@@ -159,3 +257,52 @@ func SafeMulInt64(a, b int64) (int64, bool) {
return a * b, false
}
+
+// Max returns the maximum value for a type T.
+func Max[T Integer]() uint64 {
+ var max T
+ switch any(max).(type) {
+ case int:
+ return uint64(math.MaxInt)
+ case int8:
+ return uint64(math.MaxInt8)
+ case int16:
+ return uint64(math.MaxInt16)
+ case int32:
+ return uint64(math.MaxInt32)
+ case int64:
+ return uint64(math.MaxInt64)
+ case uint:
+ return uint64(math.MaxUint)
+ case uint8:
+ return uint64(math.MaxUint8)
+ case uint16:
+ return uint64(math.MaxUint16)
+ case uint32:
+ return uint64(math.MaxUint32)
+ case uint64:
+ return uint64(math.MaxUint64)
+ default:
+ panic("unsupported type")
+ }
+}
+
+// Min returns the minimum value for a type T.
+func Min[T Integer]() int64 {
+ switch any(T(0)).(type) {
+ case int:
+ return int64(math.MinInt)
+ case int8:
+ return int64(math.MinInt8)
+ case int16:
+ return int64(math.MinInt16)
+ case int32:
+ return int64(math.MinInt32)
+ case int64:
+ return math.MinInt64
+ case uint, uint8, uint16, uint32, uint64:
+ return 0
+ default:
+ panic("unsupported type")
+ }
+}
diff --git a/libs/math/safemath_test.go b/libs/math/safemath_test.go
index 92a8f32110..98a57e1163 100644
--- a/libs/math/safemath_test.go
+++ b/libs/math/safemath_test.go
@@ -84,3 +84,108 @@ func TestSafeMul(t *testing.T) {
assert.Equal(t, tc.overflow, overflow, "#%d", i)
}
}
+
+func TestSafeConvert(t *testing.T) {
+ testCases := []struct {
+ from interface{}
+ want interface{}
+ err bool
+ }{
+ {int(0), int64(0), false},
+ {int(math.MaxInt), int64(math.MaxInt), false},
+ {int(math.MinInt), int64(math.MinInt), false},
+ {uint(0), uint64(0), false},
+ {uint(math.MaxUint), uint64(math.MaxUint), false},
+ {int64(0), uint64(0), false},
+ {int64(math.MaxInt64), uint64(math.MaxInt64), false},
+ {int64(math.MinInt64), uint64(0), true},
+ {uint64(math.MaxUint64), int64(0), true},
+ {uint64(math.MaxInt64), int64(math.MaxInt64), false},
+ {int32(-1), uint32(0), true},
+ {int32(0), uint32(0), false},
+ {int32(math.MaxInt32), uint32(math.MaxInt32), false},
+ {int32(math.MaxInt32), int16(0), true},
+ {int32(math.MinInt32), int16(0), true},
+ {int32(0), int16(0), false},
+ {uint32(math.MaxUint32), int32(0), true},
+ {uint32(math.MaxInt32), int32(math.MaxInt32), false},
+ {uint32(0), int32(0), false},
+ {int16(0), uint32(0), false},
+ {int16(-1), uint32(0), true},
+ {int16(math.MaxInt16), uint32(math.MaxInt16), false},
+ }
+
+ for i, tc := range testCases {
+ var result interface{}
+ var err error
+
+ switch from := tc.from.(type) {
+ case int:
+ switch tc.want.(type) {
+ case int64:
+ result, err = SafeConvert[int, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint:
+ switch tc.want.(type) {
+ case uint64:
+ result, err = SafeConvert[uint, uint64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int64:
+ switch tc.want.(type) {
+ case uint64:
+ result, err = SafeConvert[int64, uint64](from)
+ case int64:
+ result, err = SafeConvert[int64, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint64:
+ switch tc.want.(type) {
+ case int64:
+ result, err = SafeConvert[uint64, int64](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int32:
+ switch tc.want.(type) {
+ case int16:
+ result, err = SafeConvert[int32, int16](from)
+ case uint32:
+ result, err = SafeConvert[int32, uint32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case uint32:
+ switch tc.want.(type) {
+ case int16:
+ result, err = SafeConvert[uint32, int16](from)
+ case int32:
+ result, err = SafeConvert[uint32, int32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ case int16:
+ switch tc.want.(type) {
+ case int32:
+ result, err = SafeConvert[int16, int32](from)
+ case uint32:
+ result, err = SafeConvert[int16, uint32](from)
+ default:
+ t.Fatalf("test case %d: unsupported target type %T", i, tc.want)
+ }
+ default:
+ t.Fatalf("test case %d: unsupported source type %T", i, tc.from)
+ }
+
+ if (err != nil) != tc.err {
+ t.Errorf("test case %d: expected error %v, got %v", i, tc.err, err)
+ }
+ if err == nil && result != tc.want {
+ t.Errorf("test case %d: expected result %v, got %v", i, tc.want, result)
+ }
+ }
+}
From 81367dabec2146fee0e1c12ebb7775fcd9c5693d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 13:59:08 +0100
Subject: [PATCH 26/65] chore: fix linter
---
internal/statesync/syncer.go | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index aeeae5d41b..396c5181f9 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -16,6 +16,7 @@ import (
sm "github.com/dashpay/tenderdash/internal/state"
tmbytes "github.com/dashpay/tenderdash/libs/bytes"
"github.com/dashpay/tenderdash/libs/log"
+ tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
@@ -215,7 +216,7 @@ func (s *syncer) SyncAny(
switch {
case err == nil:
s.metrics.SnapshotHeight.Set(float64(snapshot.Height))
- s.lastSyncedSnapshotHeight = int64(snapshot.Height)
+ s.lastSyncedSnapshotHeight = tmmath.MustConvertInt64(snapshot.Height)
return newState, commit, nil
case errors.Is(err, errAbort):
@@ -375,7 +376,8 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if state.InitialHeight < 1 {
return sm.State{}, nil, fmt.Errorf("initial genesis height %d is invalid", state.InitialHeight)
}
- genesisHeight := uint64(state.InitialHeight)
+
+ genesisHeight := tmmath.MustConvertUint64(state.InitialHeight)
genesisBlock, err := s.getStateProvider().LightBlock(ctx, genesisHeight)
if err != nil {
return sm.State{}, nil, fmt.Errorf("failed to get genesis block at height %d: %w", genesisHeight, err)
From fcfa0718b2482cf84273a300f267d0244a88dd6a Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 20 Jan 2025 14:39:10 +0100
Subject: [PATCH 27/65] chore: code rabbit fixes
---
abci/example/kvstore/kvstore.go | 6 +++---
internal/statesync/syncer.go | 5 ++++-
libs/math/safemath.go | 3 ++-
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/abci/example/kvstore/kvstore.go b/abci/example/kvstore/kvstore.go
index 93da95fce3..6b8c91939a 100644
--- a/abci/example/kvstore/kvstore.go
+++ b/abci/example/kvstore/kvstore.go
@@ -587,17 +587,17 @@ func (app *Application) FinalizeSnapshot(_ctx context.Context, req *abci.Request
// we only run some verifications here
if app.LastCommittedState.GetHeight() != req.SnapshotBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch: expected %d, got %d",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot height mismatch during state sync finalization: expected %d, got %d",
app.LastCommittedState.GetHeight(), req.SnapshotBlock.SignedHeader.Header.Height)
}
if !app.LastCommittedState.GetAppHash().Equal(req.SnapshotBlock.SignedHeader.Header.AppHash) {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch: expected %x, got %x",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("snapshot apphash mismatch during state sync finalization: expected %x, got %x",
app.LastCommittedState.GetAppHash(), req.SnapshotBlock.SignedHeader.Header.AppHash)
}
if app.initialHeight != req.GenesisBlock.SignedHeader.Header.Height {
- return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch: expected %d, got %d",
+ return &abci.ResponseFinalizeSnapshot{}, fmt.Errorf("genesis height mismatch during state sync finalization: expected %d, got %d",
app.initialHeight, req.GenesisBlock.SignedHeader.Header.Height)
}
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 396c5181f9..74e004d9b2 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -362,7 +362,7 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
return sm.State{}, nil,
fmt.Errorf("failed to get light block at height %d. No witnesses remaining", snapshot.Height)
}
- s.logger.Info("failed to get and verify light block. Dropping snapshot and trying again",
+ s.logger.Error("failed to get and verify light block. Dropping snapshot and trying again",
"err", err, "height", snapshot.Height)
return sm.State{}, nil, errRejectSnapshot
}
@@ -597,6 +597,9 @@ func (s *syncer) finalizeSnapshot(ctx context.Context, snapshot *snapshot, genes
"version", snapshot.Version,
"app_hash", snapshot.trustedAppHash,
)
+ if genesisBlock == nil || snapshotBlock == nil {
+ return fmt.Errorf("nil block provided: genesis=%v snapshot=%v", genesisBlock == nil, snapshotBlock == nil)
+ }
snapshotBlockProto, err := snapshotBlock.ToProto()
if err != nil {
diff --git a/libs/math/safemath.go b/libs/math/safemath.go
index 54f0b7a4f7..d9cd31df45 100644
--- a/libs/math/safemath.go
+++ b/libs/math/safemath.go
@@ -163,7 +163,8 @@ func SafeConvert[T Integer, U Integer](from T) (U, error) {
func MustConvert[FROM Integer, TO Integer](a FROM) TO {
i, err := SafeConvert[FROM, TO](a)
if err != nil {
- panic(fmt.Errorf("cannot convert %d to %T: %w", a, any(i), err))
+ var zero TO
+ panic(fmt.Errorf("cannot convert %d to %T: %w", a, zero, err))
}
return i
}
From 37f8b5f88e809bb207901a14e9781922ffe4373c Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 21 Jan 2025 10:32:35 +0100
Subject: [PATCH 28/65] build(deps): update dashd-go to 0.26.1
---
go.mod | 2 +-
go.sum | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/go.mod b/go.mod
index 206c9179cd..a5e786e8a3 100644
--- a/go.mod
+++ b/go.mod
@@ -9,7 +9,7 @@ require (
github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce
github.com/containerd/continuity v0.4.4 // indirect
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8
- github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7
+ github.com/dashpay/dashd-go v0.26.1
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 // indirect
github.com/fortytw2/leaktest v1.3.0
github.com/fxamacker/cbor/v2 v2.4.0
diff --git a/go.sum b/go.sum
index 003b6b49cb..cb2ead02f3 100644
--- a/go.sum
+++ b/go.sum
@@ -220,8 +220,8 @@ github.com/daixiang0/gci v0.13.5 h1:kThgmH1yBmZSBCh1EJVxQ7JsHpm5Oms0AMed/0LaH4c=
github.com/daixiang0/gci v0.13.5/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8 h1:v4K3CiDoFY1gjcWL/scRcwzyjBwh8TVG3ek8cWolK1g=
github.com/dashpay/bls-signatures/go-bindings v0.0.0-20230207105415-06df92693ac8/go.mod h1:auvGS60NBZ+a21aCCQh366PdsjDvHinsCvl28VrYPu4=
-github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7 h1:Er4zUGcd9UKXBPCbLBaclSxsMNUsK3fW2elJGTYSnJs=
-github.com/dashpay/dashd-go v0.26.1-0.20250120114940-580cb9149de7/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
+github.com/dashpay/dashd-go v0.26.1 h1:/ZFgtPw1fPHpvoJgKfXo/v63ZXddjJm8KrHRpxcSpy0=
+github.com/dashpay/dashd-go v0.26.1/go.mod h1:7KKS2jSPkC1pTz9WLXpiXZ96wT5bUqKTRuk35AyRQ74=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0 h1:tk54BC++OvOUu0vcPoG8+45dGoJXKsmupYAawBO/1Vk=
github.com/dashpay/dashd-go/btcec/v2 v2.2.0/go.mod h1:uOmCM/hVoJ1x6w+3SX+zQv+2LdrK3aO59RV41jNvTF4=
github.com/dashpay/dashd-go/btcutil v1.3.0 h1:yDX8tz7C/KhFHbGlRXBpNN+zlkmAgwkICD9DlAv/Vsc=
From d595b00db8b7a32fb2204dccc4f55c59a40e65dd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 24 Jan 2025 11:15:52 +0100
Subject: [PATCH 29/65] fix(client): missing response to finalize snapshot in
switch
---
abci/client/socket_client.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/abci/client/socket_client.go b/abci/client/socket_client.go
index e80fe9d998..4ca9e0739b 100644
--- a/abci/client/socket_client.go
+++ b/abci/client/socket_client.go
@@ -437,6 +437,8 @@ func resMatchesReq(req *types.Request, res *types.Response) (ok bool) {
_, ok = res.Value.(*types.Response_ListSnapshots)
case *types.Request_OfferSnapshot:
_, ok = res.Value.(*types.Response_OfferSnapshot)
+ case *types.Request_FinalizeSnapshot:
+ _, ok = res.Value.(*types.Response_FinalizeSnapshot)
case *types.Request_FinalizeBlock:
_, ok = res.Value.(*types.Response_FinalizeBlock)
}
From a9ac3080263ece355baa662b6c3e9d61986de9c6 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 12:13:06 +0100
Subject: [PATCH 30/65] fix(statesync): repeat image discovery when needed
---
internal/statesync/syncer.go | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 74e004d9b2..baa53f559d 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -157,19 +157,6 @@ func (s *syncer) SyncAny(
timer := time.NewTimer(discoveryTime)
defer timer.Stop()
- if discoveryTime > 0 {
- if err := requestSnapshots(); err != nil {
- return sm.State{}, nil, err
- }
- s.logger.Info("discovering snapshots",
- "interval", discoveryTime)
- select {
- case <-ctx.Done():
- return sm.State{}, nil, ctx.Err()
- case <-timer.C:
- }
- }
-
// The app may ask us to retry a snapshot restoration, in which case we need to reuse
// the snapshot and chunk queue from the previous loop iteration.
var (
@@ -190,6 +177,10 @@ func (s *syncer) SyncAny(
if discoveryTime == 0 {
return sm.State{}, nil, errNoSnapshots
}
+ // we re-request snapshots
+ if err := requestSnapshots(); err != nil {
+ return sm.State{}, nil, err
+ }
s.logger.Info("discovering snapshots",
"iterations", iters,
"interval", discoveryTime)
From 3867717cac4baed41fdceca8d72f58596baa6aa1 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 13:03:31 +0100
Subject: [PATCH 31/65] chore(statesync): retry snapshot when light block is
not returned correctly
---
internal/statesync/syncer.go | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index baa53f559d..627cc38059 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -18,6 +18,7 @@ import (
"github.com/dashpay/tenderdash/libs/log"
tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
+ "github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
)
@@ -121,6 +122,8 @@ func (s *syncer) AddSnapshot(peerID types.NodeID, snapshot *snapshot) (bool, err
"height", snapshot.Height,
"version", snapshot.Version,
"hash", snapshot.Hash.ShortString())
+ } else {
+ s.logger.Debug("snapshot not added", "height", snapshot.Height, "hash", snapshot.Hash)
}
return added, nil
}
@@ -334,7 +337,12 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if ctx.Err() != nil {
return sm.State{}, nil, ctx.Err()
}
- if err == light.ErrNoWitnesses {
+ // light block might not be found because it needs commit which is generated at `height+1`, so we
+ if errors.Is(err, provider.ErrLightBlockNotFound) {
+ s.logger.Debug("light block not found at height %d, retrying", "height", snapshot.Height)
+ return sm.State{}, nil, errRetrySnapshot
+ }
+ if errors.Is(err, light.ErrNoWitnesses) {
return sm.State{}, nil,
fmt.Errorf("failed to get tendermint state at height %d. No witnesses remaining", snapshot.Height)
}
From 1973905b6dddcc0974e5f80bdfdbfa668134ae7d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 16:07:42 +0100
Subject: [PATCH 32/65] fix(statesync): don't offer snapshots when light block
is not available
---
internal/statesync/reactor.go | 7 +++++++
internal/statesync/syncer.go | 6 ------
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 4ed4a89f07..6070e3a14f 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -1061,6 +1061,13 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
break
}
+ // we only accept snapshots where next block is already finalized, that is we are voting
+ // for `height + 2` or higher, because we need to be able to fetch light block containing
+ // commit for `height` from block store (which is stored in block `height+1`)
+ if s.Height <= uint64(r.csState.GetRoundState().Height)-2 {
+ continue
+ }
+
snapshots = append(snapshots, &snapshot{
Height: s.Height,
Version: s.Version,
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 627cc38059..665ad5c3e5 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -18,7 +18,6 @@ import (
"github.com/dashpay/tenderdash/libs/log"
tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/light"
- "github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
"github.com/dashpay/tenderdash/types"
)
@@ -337,11 +336,6 @@ func (s *syncer) Sync(ctx context.Context, snapshot *snapshot, queue *chunkQueue
if ctx.Err() != nil {
return sm.State{}, nil, ctx.Err()
}
- // light block might not be found because it needs commit which is generated at `height+1`, so we
- if errors.Is(err, provider.ErrLightBlockNotFound) {
- s.logger.Debug("light block not found at height %d, retrying", "height", snapshot.Height)
- return sm.State{}, nil, errRetrySnapshot
- }
if errors.Is(err, light.ErrNoWitnesses) {
return sm.State{}, nil,
fmt.Errorf("failed to get tendermint state at height %d. No witnesses remaining", snapshot.Height)
From aece08c74f6e3e96de9b17080bdec99dbc21e866 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 16:42:45 +0100
Subject: [PATCH 33/65] chore: fix invalid condition
---
internal/statesync/reactor.go | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 6070e3a14f..f72d40682b 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -1061,10 +1061,15 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
break
}
+ if r.csState == nil {
+ continue
+ }
+ currentHeight := r.csState.GetRoundState().Height
// we only accept snapshots where next block is already finalized, that is we are voting
// for `height + 2` or higher, because we need to be able to fetch light block containing
// commit for `height` from block store (which is stored in block `height+1`)
- if s.Height <= uint64(r.csState.GetRoundState().Height)-2 {
+ if int64(s.Height) >= currentHeight-2 {
+ r.logger.Debug("snapshot too new, skipping", "height", s.Height, "state_height", currentHeight)
continue
}
From c22edb60208d54759731b5d6ab3be485c7dfe63d Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 18:46:41 +0100
Subject: [PATCH 34/65] feat(statesync): add state sync retries limit
---
config/config.go | 9 +++++++++
config/toml.go | 4 ++++
internal/statesync/reactor.go | 2 +-
internal/statesync/syncer.go | 5 +++++
internal/statesync/syncer_test.go | 14 +++++++-------
5 files changed, 26 insertions(+), 8 deletions(-)
diff --git a/config/config.go b/config/config.go
index 97ee0f79b0..9cb431b358 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1003,6 +1003,10 @@ type StateSyncConfig struct {
// Time to spend discovering snapshots before initiating a restore.
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
+ // Number of times to retry state sync. When retries are exhausted, the node will
+ // fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+ Retries int `mapstructure:"retries"`
+
// Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
// The synchronizer will create a new, randomly named directory within this directory
// and remove it when the sync is complete.
@@ -1022,6 +1026,7 @@ func DefaultStateSyncConfig() *StateSyncConfig {
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
+ Retries: 1,
}
}
@@ -1054,6 +1059,10 @@ func (cfg *StateSyncConfig) ValidateBasic() error {
return errors.New("discovery time must be 0s or greater than five seconds")
}
+ if cfg.Retries < 0 {
+ return errors.New("retries must be greater than or equal to zero")
+ }
+
if cfg.ChunkRequestTimeout < 5*time.Second {
return errors.New("chunk-request-timeout must be at least 5 seconds")
}
diff --git a/config/toml.go b/config/toml.go
index 0f67745bf1..3ba0ed0689 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -498,6 +498,10 @@ rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
# Time to spend discovering snapshots before initiating a restore.
discovery-time = "{{ .StateSync.DiscoveryTime }}"
+# Number of times to retry state sync. When retries are exhausted, the node will
+# fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+retries = {{ .StateSync.Retries }}
+
# Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
# The synchronizer will create a new, randomly named directory within this directory
# and remove it when the sync is complete.
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index f72d40682b..bfd325ce73 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -327,7 +327,7 @@ func (r *Reactor) Sync(ctx context.Context) (sm.State, error) {
}
r.getSyncer().SetStateProvider(r.stateProvider)
- state, commit, err := r.syncer.SyncAny(ctx, r.cfg.DiscoveryTime, r.requestSnaphot)
+ state, commit, err := r.syncer.SyncAny(ctx, r.cfg.DiscoveryTime, r.cfg.Retries, r.requestSnaphot)
if err != nil {
return sm.State{}, fmt.Errorf("sync any: %w", err)
}
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 665ad5c3e5..0901fd03eb 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -150,6 +150,7 @@ func (s *syncer) RemovePeer(peerID types.NodeID) {
func (s *syncer) SyncAny(
ctx context.Context,
discoveryTime time.Duration,
+ retries int,
requestSnapshots func() error,
) (sm.State, *types.Commit, error) {
if discoveryTime != 0 && discoveryTime < minimumDiscoveryTime {
@@ -170,6 +171,10 @@ func (s *syncer) SyncAny(
for {
iters++
+
+ if retries > 0 && iters > retries {
+ return sm.State{}, nil, errNoSnapshots
+ }
// If not nil, we're going to retry restoration of the same snapshot.
if snapshot == nil {
snapshot = s.snapshots.Best()
diff --git a/internal/statesync/syncer_test.go b/internal/statesync/syncer_test.go
index c811f71590..bd7de2caa3 100644
--- a/internal/statesync/syncer_test.go
+++ b/internal/statesync/syncer_test.go
@@ -277,7 +277,7 @@ func (suite *SyncerTestSuite) TestSyncAny() {
LastBlockAppHash: []byte("app_hash"),
}, nil)
- newState, lastCommit, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ newState, lastCommit, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().NoError(err)
suite.Require().Equal([]int{0: 2, 1: 1, 2: 1, 3: 1}, chunkRequests)
@@ -294,7 +294,7 @@ func (suite *SyncerTestSuite) TestSyncAnyNoSnapshots() {
ctx, cancel := context.WithCancel(suite.ctx)
defer cancel()
- _, _, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -320,7 +320,7 @@ func (suite *SyncerTestSuite) TestSyncAnyAbort() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errAbort, err)
}
@@ -370,7 +370,7 @@ func (suite *SyncerTestSuite) TestSyncAnyReject() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_REJECT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -413,7 +413,7 @@ func (suite *SyncerTestSuite) TestSyncAnyRejectFormat() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_ABORT}, nil)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errAbort, err)
}
@@ -467,7 +467,7 @@ func (suite *SyncerTestSuite) TestSyncAnyRejectSender() {
Once().
Return(&abci.ResponseOfferSnapshot{Result: abci.ResponseOfferSnapshot_REJECT}, nil)
- _, _, err := suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err := suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().Equal(errNoSnapshots, err)
}
@@ -495,7 +495,7 @@ func (suite *SyncerTestSuite) TestSyncAnyAbciError() {
Once().
Return(nil, errBoom)
- _, _, err = suite.syncer.SyncAny(ctx, 0, func() error { return nil })
+ _, _, err = suite.syncer.SyncAny(ctx, 0, 0, func() error { return nil })
suite.Require().True(errors.Is(err, errBoom))
}
From 29fe1333f49bc4ae9383cebdb0808ecb038c7a56 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 27 Jan 2025 19:00:17 +0100
Subject: [PATCH 35/65] chore(statesync): handle no snapshots error
---
internal/statesync/reactor.go | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index bfd325ce73..4cd254305c 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -277,7 +277,11 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if r.needsStateSync {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
- r.logger.Error("state sync failed; shutting down this node", "error", err)
+ if errors.Is(err, errNoSnapshots) {
+ r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
+ return nil
+ }
+ r.logger.Error("state sync failed; shutting down this node", "err", err)
return err
}
}
From 9c7f3a00f5c431233c566859ed4b8e387294d1fd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 09:52:33 +0100
Subject: [PATCH 36/65] chore: run blocksync on statesync retry failure
---
internal/consensus/state_data.go | 2 +-
internal/statesync/reactor.go | 11 +++++++++--
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/internal/consensus/state_data.go b/internal/consensus/state_data.go
index 0686b0f32d..66b0405711 100644
--- a/internal/consensus/state_data.go
+++ b/internal/consensus/state_data.go
@@ -119,7 +119,7 @@ func (s *StateDataStore) Subscribe(evsw *eventemitter.EventEmitter) {
})
}
-// StateData is a copy of the current RoundState nad state.State stored in the store
+// StateData is a copy of the current RoundState and state.State stored in the store
// Along with data, StateData provides some methods to check or update data inside
type StateData struct {
config *config.ConsensusConfig
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 4cd254305c..0510af7611 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -277,9 +277,16 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if r.needsStateSync {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
- if errors.Is(err, errNoSnapshots) {
+ if errors.Is(err, errNoSnapshots) && r.postSyncHook != nil {
+ state, err := r.stateStore.Load()
+ if err != nil {
+ return fmt.Errorf("failed to load state: %w", err)
+ }
+
r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
- return nil
+ if err := r.postSyncHook(ctx, state); err != nil {
+ return fmt.Errorf("post sync failed: %w", err)
+ }
}
r.logger.Error("state sync failed; shutting down this node", "err", err)
return err
From 589769d90a0eb12283991327ca5c4b9b8cfe4706 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 10:21:38 +0100
Subject: [PATCH 37/65] chore: fix minor condition
---
internal/statesync/reactor.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 0510af7611..26a4d23cee 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -287,9 +287,10 @@ func (r *Reactor) OnStart(ctx context.Context) error {
if err := r.postSyncHook(ctx, state); err != nil {
return fmt.Errorf("post sync failed: %w", err)
}
+ } else {
+ r.logger.Error("state sync failed; shutting down this node", "err", err)
+ return err
}
- r.logger.Error("state sync failed; shutting down this node", "err", err)
- return err
}
}
From 3370545898414889a8368a05581e1252e54a1ce1 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 10:57:42 +0100
Subject: [PATCH 38/65] chore: fix logging
---
internal/statesync/reactor.go | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 26a4d23cee..d526d6bac6 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -278,12 +278,13 @@ func (r *Reactor) OnStart(ctx context.Context) error {
r.logger.Info("starting state sync")
if _, err := r.Sync(ctx); err != nil {
if errors.Is(err, errNoSnapshots) && r.postSyncHook != nil {
+ r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
+
state, err := r.stateStore.Load()
if err != nil {
return fmt.Errorf("failed to load state: %w", err)
}
- r.logger.Warn("no snapshots available; falling back to block sync", "err", err)
if err := r.postSyncHook(ctx, state); err != nil {
return fmt.Errorf("post sync failed: %w", err)
}
From 76f6c00aef0fa40755c2e31a6463983b98166053 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 28 Jan 2025 11:22:12 +0100
Subject: [PATCH 39/65] fix: invalid condition
---
internal/statesync/syncer.go | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 0901fd03eb..ec0c4185b1 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -170,11 +170,11 @@ func (s *syncer) SyncAny(
)
for {
- iters++
-
- if retries > 0 && iters > retries {
+ if retries > 0 && snapshot == nil && iters > retries {
return sm.State{}, nil, errNoSnapshots
}
+
+ iters++
// If not nil, we're going to retry restoration of the same snapshot.
if snapshot == nil {
snapshot = s.snapshots.Best()
From 244c246520fd5e335b4443dfdd94b4f737ac3d2f Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:02:30 +0100
Subject: [PATCH 40/65] chore(statesync): fix type conversion
---
internal/statesync/reactor.go | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index d526d6bac6..e69c18d5dc 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -22,6 +22,7 @@ import (
sm "github.com/dashpay/tenderdash/internal/state"
"github.com/dashpay/tenderdash/internal/store"
"github.com/dashpay/tenderdash/libs/log"
+ tmmath "github.com/dashpay/tenderdash/libs/math"
"github.com/dashpay/tenderdash/libs/service"
"github.com/dashpay/tenderdash/light/provider"
ssproto "github.com/dashpay/tenderdash/proto/tendermint/statesync"
@@ -1081,7 +1082,7 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
// we only accept snapshots where next block is already finalized, that is we are voting
// for `height + 2` or higher, because we need to be able to fetch light block containing
// commit for `height` from block store (which is stored in block `height+1`)
- if int64(s.Height) >= currentHeight-2 {
+ if tmmath.MustConvertInt64(s.Height) >= currentHeight-2 {
r.logger.Debug("snapshot too new, skipping", "height", s.Height, "state_height", currentHeight)
continue
}
@@ -1100,7 +1101,7 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
// fetchLightBlock works out whether the node has a light block at a particular
// height and if so returns it so it can be gossiped to peers
func (r *Reactor) fetchLightBlock(height uint64) (*types.LightBlock, error) {
- h := int64(height)
+ h := tmmath.MustConvertInt64(height)
blockMeta := r.blockStore.LoadBlockMeta(h)
if blockMeta == nil {
From 45df3f86d7f6a8d62f474412861743572c1f34fa Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:03:16 +0100
Subject: [PATCH 41/65] test(types): validator set hash test vectors
---
types/validator_test.go | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/types/validator_test.go b/types/validator_test.go
index 72d9051100..dffadeb12a 100644
--- a/types/validator_test.go
+++ b/types/validator_test.go
@@ -2,12 +2,16 @@ package types
import (
"context"
+ "encoding/base64"
+ "encoding/hex"
+ "fmt"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/dashpay/tenderdash/crypto"
+ "github.com/dashpay/tenderdash/crypto/bls12381"
)
func TestValidatorProtoBuf(t *testing.T) {
@@ -111,3 +115,23 @@ func TestValidatorValidateBasic(t *testing.T) {
})
}
}
+
+func TestValdiatorSetHash(t *testing.T) {
+ thresholdPublicKey, err := base64.RawStdEncoding.DecodeString("gw5F5F5kFNnWFUc8woFOaxccUI+cd+ixaSS3RZT2HJlWpvoWM16YRn6sjYvbdtGH")
+ require.NoError(t, err)
+ fmt.Printf("thresholdPublicKey: %s\n", hex.EncodeToString(thresholdPublicKey))
+
+ quorumHash, err := hex.DecodeString("703ee5bfc78765cc9e151d8dd84e30e196ababa83ac6cbdee31a88a46bba81b9")
+ require.NoError(t, err)
+
+ expected := "81742F95E99EAE96ABC727FE792CECB4996205DE6BFC88AFEE1F60B96BC648B2"
+ // require.NoError(t, err)
+
+ valset := ValidatorSet{
+ ThresholdPublicKey: bls12381.PubKey(thresholdPublicKey),
+ QuorumHash: quorumHash,
+ }
+
+ hash := valset.Hash()
+ assert.Equal(t, expected, hash.String())
+}
From 9d5a5f64764ad43d5a49310b4b91f46ea8b86d38 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 29 Jan 2025 11:55:11 +0100
Subject: [PATCH 42/65] chore(statesync): 3 retries by default
---
config/config.go | 7 +++++--
config/toml.go | 4 +++-
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/config/config.go b/config/config.go
index 9cb431b358..a6e4903fa9 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1004,7 +1004,10 @@ type StateSyncConfig struct {
DiscoveryTime time.Duration `mapstructure:"discovery-time"`
// Number of times to retry state sync. When retries are exhausted, the node will
- // fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+ // fall back to the regular block sync. Set to 0 to disable retries. Default is 3.
+ //
+ // Note that in pessimistic case, it will take at least `discovery-time * retries` before
+ // falling back to block sync.
Retries int `mapstructure:"retries"`
// Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
@@ -1026,7 +1029,7 @@ func DefaultStateSyncConfig() *StateSyncConfig {
DiscoveryTime: 15 * time.Second,
ChunkRequestTimeout: 15 * time.Second,
Fetchers: 4,
- Retries: 1,
+ Retries: 3,
}
}
diff --git a/config/toml.go b/config/toml.go
index 3ba0ed0689..dddf0ac43f 100644
--- a/config/toml.go
+++ b/config/toml.go
@@ -499,7 +499,9 @@ rpc-servers = "{{ StringsJoin .StateSync.RPCServers "," }}"
discovery-time = "{{ .StateSync.DiscoveryTime }}"
# Number of times to retry state sync. When retries are exhausted, the node will
-# fall back to the regular block sync. Set to 0 to disable retries. Default is 1.
+# fall back to the regular block sync. Set to 0 to disable retries. Default is 3.
+# Note that in pessimistic case, it will take at least (discovery-time * retries) before
+# falling back to block sync.
retries = {{ .StateSync.Retries }}
# Temporary directory for state sync snapshot chunks, defaults to os.TempDir().
From 9a76ede21e52014ed5dc2c7ff9941d7b83c6939a Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Thu, 30 Jan 2025 17:15:47 +0100
Subject: [PATCH 43/65] chore: set minimum number of peers to 1
---
internal/statesync/reactor.go | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index e69c18d5dc..392467f8cc 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -69,6 +69,8 @@ const (
// backfillSleepTime uses to sleep if no connected peers to fetch light blocks
backfillSleepTime = 1 * time.Second
+
+ MinPeers = 1
)
func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor {
@@ -240,7 +242,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
spLogger.Info("initializing state provider", "useP2P", r.cfg.UseP2P)
if r.cfg.UseP2P {
- if err := r.waitForEnoughPeers(ctx, 2); err != nil {
+ if err := r.waitForEnoughPeers(ctx, MinPeers); err != nil {
return err
}
@@ -323,7 +325,7 @@ func (r *Reactor) Sync(ctx context.Context) (sm.State, error) {
// We need at least two peers (for cross-referencing of light blocks) before we can
// begin state sync
- if err := r.waitForEnoughPeers(ctx, 2); err != nil {
+ if err := r.waitForEnoughPeers(ctx, MinPeers); err != nil {
return sm.State{}, fmt.Errorf("wait for peers: %w", err)
}
From 0f8f80a003c6414e4ec09247e12d9185e4a03968 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 31 Jan 2025 13:28:57 +0100
Subject: [PATCH 44/65] chore: decrease peer update log verbosity
---
internal/blocksync/reactor.go | 2 +-
internal/evidence/reactor.go | 2 +-
internal/mempool/reactor.go | 2 +-
internal/statesync/peer.go | 4 ++--
internal/statesync/reactor.go | 4 ++--
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/internal/blocksync/reactor.go b/internal/blocksync/reactor.go
index 822550f165..b182229133 100644
--- a/internal/blocksync/reactor.go
+++ b/internal/blocksync/reactor.go
@@ -159,7 +159,7 @@ func (r *Reactor) OnStop() {
// processPeerUpdate processes a PeerUpdate.
func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpdate, client *client.Client) {
- r.logger.Debug("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ r.logger.Trace("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
// XXX: Pool#RedoRequest can sometimes give us an empty peer.
if len(peerUpdate.NodeID) == 0 {
diff --git a/internal/evidence/reactor.go b/internal/evidence/reactor.go
index d0ba641310..75689553e5 100644
--- a/internal/evidence/reactor.go
+++ b/internal/evidence/reactor.go
@@ -201,7 +201,7 @@ func (r *Reactor) processEvidenceCh(ctx context.Context) {
//
// REF: https://github.com/tendermint/tendermint/issues/4727
func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpdate) {
- r.logger.Debug("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ r.logger.Trace("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
r.mtx.Lock()
defer r.mtx.Unlock()
diff --git a/internal/mempool/reactor.go b/internal/mempool/reactor.go
index 415fef8bec..c00c364359 100644
--- a/internal/mempool/reactor.go
+++ b/internal/mempool/reactor.go
@@ -94,7 +94,7 @@ func (r *Reactor) OnStop() {}
// removed peers, we remove the peer from the mempool peer ID set and signal to
// stop the tx broadcasting goroutine.
func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpdate) {
- r.logger.Debug("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ r.logger.Trace("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
r.mtx.Lock()
defer r.mtx.Unlock()
diff --git a/internal/statesync/peer.go b/internal/statesync/peer.go
index 589acecacc..3e1e49d3d7 100644
--- a/internal/statesync/peer.go
+++ b/internal/statesync/peer.go
@@ -96,7 +96,7 @@ func (p *PeerSubscriber) Stop(ctx context.Context) {
// processPeerUpdate processes a PeerUpdate, returning an error upon failing to
// handle the PeerUpdate or if a panic is recovered.
func (p *PeerSubscriber) execute(ctx context.Context, peerUpdate p2p.PeerUpdate) error {
- p.logger.Info("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ p.logger.Trace("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
handler, ok := p.handles[peerUpdate.Status]
if !ok {
// TODO: return error or write a log
@@ -106,7 +106,7 @@ func (p *PeerSubscriber) execute(ctx context.Context, peerUpdate p2p.PeerUpdate)
if err != nil {
return err
}
- p.logger.Info("processed peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ p.logger.Trace("processed peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
return nil
}
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 392467f8cc..92104ad395 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -985,7 +985,7 @@ func (r *Reactor) processChannels(ctx context.Context, chanTable map[p2p.Channel
// processPeerUpdate processes a PeerUpdate, returning an error upon failing to
// handle the PeerUpdate or if a panic is recovered.
func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpdate) {
- r.logger.Info("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ r.logger.Trace("received peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
switch peerUpdate.Status {
case p2p.PeerStatusUp:
@@ -994,7 +994,7 @@ func (r *Reactor) processPeerUpdate(ctx context.Context, peerUpdate p2p.PeerUpda
r.processPeerDown(ctx, peerUpdate)
}
- r.logger.Info("processed peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
+ r.logger.Trace("processed peer update", "peer", peerUpdate.NodeID, "status", peerUpdate.Status)
}
func (r *Reactor) processPeerUp(ctx context.Context, peerUpdate p2p.PeerUpdate) {
From 9084ade1e6f9409d02ccb4704bc9accfe41ac8fa Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 31 Jan 2025 15:33:45 +0100
Subject: [PATCH 45/65] chore(statesync): MinPeers 1
---
internal/statesync/reactor.go | 1 +
internal/statesync/stateprovider.go | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 92104ad395..0dcd0d1674 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -70,6 +70,7 @@ const (
// backfillSleepTime uses to sleep if no connected peers to fetch light blocks
backfillSleepTime = 1 * time.Second
+ // MinPeers is the minimum number of peers required to start a state sync; TODO: change to >= 2, or make configurable
MinPeers = 1
)
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index 742d3be934..801e79e451 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -220,8 +220,8 @@ func NewP2PStateProvider(
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
- if len(providers) < 2 {
- return nil, fmt.Errorf("at least 2 peers are required, got %d", len(providers))
+ if len(providers) < MinPeers {
+ return nil, fmt.Errorf("at least %d peers are required, got %d", MinPeers, len(providers))
}
lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
From eb95466c9837c898eeca0c341edd16fc4ce1e6c5 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Fri, 31 Jan 2025 16:50:57 +0100
Subject: [PATCH 46/65] fix(p2p): mconn port defaults to 26656
---
internal/p2p/transport_mconn.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/p2p/transport_mconn.go b/internal/p2p/transport_mconn.go
index 3757f8f7d4..920382b134 100644
--- a/internal/p2p/transport_mconn.go
+++ b/internal/p2p/transport_mconn.go
@@ -184,7 +184,7 @@ func (m *MConnTransport) Dial(ctx context.Context, endpoint *Endpoint) (Connecti
return nil, err
}
if endpoint.Port == 0 {
- endpoint.Port = 26657
+ endpoint.Port = 26656
}
dialer := net.Dialer{}
From 52597b006662be828b8ef7acd673aec6c1e5e586 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 13:03:51 +0100
Subject: [PATCH 47/65] chore: better error message on timeout
---
internal/statesync/chunks.go | 23 ++++++++++++++++++++++-
internal/statesync/chunks_test.go | 5 +++--
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 57edbf5eed..446474081a 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -291,8 +291,29 @@ func (q *chunkQueue) Next() (*chunk, error) {
q.doneCount++
return loadedChunk, nil
case <-time.After(chunkTimeout):
- return nil, errTimeout
+ pendingChunks := ""
+ // Locking is done inside q.Pending
+ pending := q.Pending()
+ for _, item := range pending {
+ pendingChunks = pendingChunks + " " + item.String()
+ }
+ return nil, fmt.Errorf("timed out waiting for chunks %s: %w", pendingChunks, errTimeout)
+ }
+}
+
+// Pending returns a list of all chunks that have been requested but not yet received.
+func (q *chunkQueue) Pending() []bytes.HexBytes {
+ q.mtx.Lock()
+ defer q.mtx.Unlock()
+
+ // get all keys from the map that don't have a status of received
+ waiting := make([]bytes.HexBytes, 0, len(q.items))
+ for _, item := range q.items {
+ if item.status == initStatus || item.status == inProgressStatus {
+ waiting = append(waiting, item.chunkID)
+ }
}
+ return waiting
}
// Retry schedules a chunk to be retried, without refetching it.
diff --git a/internal/statesync/chunks_test.go b/internal/statesync/chunks_test.go
index 0ecb01946e..a997188b13 100644
--- a/internal/statesync/chunks_test.go
+++ b/internal/statesync/chunks_test.go
@@ -1,6 +1,7 @@
package statesync
import (
+ "errors"
"os"
"testing"
@@ -244,7 +245,7 @@ func (suite *ChunkQueueTestSuite) TestNext() {
go func() {
for {
c, err := suite.queue.Next()
- if err == errDone {
+ if errors.Is(err, errDone) {
close(chNext)
break
}
@@ -284,7 +285,7 @@ func (suite *ChunkQueueTestSuite) TestNextClosed() {
require.NoError(err)
_, err = suite.queue.Next()
- require.Equal(errDone, err)
+ require.ErrorIs(err, errDone)
}
func (suite *ChunkQueueTestSuite) TestRetry() {
From ac6d385a8662a00be3fb51cd101ed43f0849aeee Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 13:04:57 +0100
Subject: [PATCH 48/65] chore(statesync): min peers 1
---
internal/statesync/reactor.go | 8 ++++----
internal/statesync/stateprovider.go | 4 ++--
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 0dcd0d1674..85efc47342 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -70,8 +70,8 @@ const (
// backfillSleepTime uses to sleep if no connected peers to fetch light blocks
backfillSleepTime = 1 * time.Second
- // MinPeers is the minimum number of peers required to start a state sync; TODO: change to >= 2, or make configurable
- MinPeers = 1
+ // minPeers is the minimum number of peers required to start a state sync; TODO: change to >= 2, or make configurable
+ minPeers = 2
)
func getChannelDescriptors() map[p2p.ChannelID]*p2p.ChannelDescriptor {
@@ -243,7 +243,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
spLogger.Info("initializing state provider", "useP2P", r.cfg.UseP2P)
if r.cfg.UseP2P {
- if err := r.waitForEnoughPeers(ctx, MinPeers); err != nil {
+ if err := r.waitForEnoughPeers(ctx, minPeers); err != nil {
return err
}
@@ -326,7 +326,7 @@ func (r *Reactor) Sync(ctx context.Context) (sm.State, error) {
// We need at least two peers (for cross-referencing of light blocks) before we can
// begin state sync
- if err := r.waitForEnoughPeers(ctx, MinPeers); err != nil {
+ if err := r.waitForEnoughPeers(ctx, minPeers); err != nil {
return sm.State{}, fmt.Errorf("wait for peers: %w", err)
}
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index 801e79e451..27b19d370c 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -220,8 +220,8 @@ func NewP2PStateProvider(
logger log.Logger,
dashCoreClient dashcore.Client,
) (StateProvider, error) {
- if len(providers) < MinPeers {
- return nil, fmt.Errorf("at least %d peers are required, got %d", MinPeers, len(providers))
+ if len(providers) < minPeers {
+ return nil, fmt.Errorf("at least %d peers are required, got %d", minPeers, len(providers))
}
lc, err := light.NewClient(ctx, chainID, providers[0], providers[1:],
From 2e896245a2bd890af15e31cd147f51ffcbf3eb80 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 14:02:43 +0100
Subject: [PATCH 49/65] chore: put list of pending chunks to
/tmp/td_pending_chunks.txt
---
internal/statesync/syncer.go | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index ec0c4185b1..ce79f913be 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -5,6 +5,7 @@ import (
"context"
"errors"
"fmt"
+ "os"
"time"
sync "github.com/sasha-s/go-deadlock"
@@ -486,6 +487,23 @@ func (s *syncer) applyChunks(ctx context.Context, queue *chunkQueue, start time.
"result", resp.Result.String(),
"chunkID", chunk.ID.String())
+ // TODO: this is for debugging only, remove when not needed
+ pending := queue.Pending()
+ if len(pending) > 0 {
+ // write list of pending chunks, in hex, to /tmp/td_pending_chunks.txt
+ if file, err := os.Create(fmt.Sprintf("/tmp/td_pending_chunks.%d.txt", time.Now().Unix())); err == nil {
+ defer file.Close()
+ for _, p := range pending {
+ _, err := file.WriteString(p.String() + "\n")
+ if err != nil {
+ s.logger.Error("failed to write pending chunks to /tmp/td_pending_chunks.txt", "err", err)
+ }
+ }
+ } else {
+ s.logger.Error("failed to create /tmp/td_pending_chunks.txt", "err", err)
+ }
+ }
+
switch resp.Result {
case abci.ResponseApplySnapshotChunk_ACCEPT:
queue.Enqueue(resp.NextChunks...)
From 68e2f54611e63fd003ca991b438cfb902749e582 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 14:38:51 +0100
Subject: [PATCH 50/65] chore: no date in pending chunks file
---
internal/statesync/syncer.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index ce79f913be..901e7c4a82 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -491,7 +491,7 @@ func (s *syncer) applyChunks(ctx context.Context, queue *chunkQueue, start time.
pending := queue.Pending()
if len(pending) > 0 {
// write list of pending chunks, in hex, to /tmp/td_pending_chunks.txt
- if file, err := os.Create(fmt.Sprintf("/tmp/td_pending_chunks.%d.txt", time.Now().Unix())); err == nil {
+ if file, err := os.Create("/tmp/td_pending_chunks.txt"); err == nil {
defer file.Close()
for _, p := range pending {
_, err := file.WriteString(p.String() + "\n")
From 10fdbb20a87caceced3c8016dd5730090224a995 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 14:59:09 +0100
Subject: [PATCH 51/65] chore: improve logging
---
internal/statesync/syncer.go | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 901e7c4a82..beeabbb3e4 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -91,7 +91,7 @@ func (s *syncer) AddChunk(chunk *chunk) (bool, error) {
keyVals := []any{
"height", chunk.Height,
"version", chunk.Version,
- "chunk", chunk.ID,
+ "chunkID", chunk.ID,
}
added, err := s.chunkQueue.Add(chunk)
if err != nil {
@@ -544,6 +544,7 @@ func (s *syncer) fetchChunks(ctx context.Context, snapshot *snapshot, queue *chu
if queue.IsRequestQueueEmpty() {
select {
case <-ctx.Done():
+ s.logger.Debug("fetchChunks context done on empty queue")
return
case <-time.After(dequeueChunkIDTimeout):
continue
@@ -556,17 +557,21 @@ func (s *syncer) fetchChunks(ctx context.Context, snapshot *snapshot, queue *chu
s.logger.Info("Fetching snapshot chunk",
"height", snapshot.Height,
"version", snapshot.Version,
- "chunk", ID)
+ "chunkID", ID)
ticker.Reset(s.retryTimeout)
if err := s.requestChunk(ctx, snapshot, ID); err != nil {
+ s.logger.Error("failed to request snapshot chunk", "err", err, "chunkID", ID)
return
}
select {
case <-queue.WaitFor(ID):
// do nothing
case <-ticker.C:
+ s.logger.Debug("chunk not received on time, retrying",
+ "chunkID", ID, "timeout", s.retryTimeout)
s.chunkQueue.Enqueue(ID)
case <-ctx.Done():
+ s.logger.Debug("fetchChunks context done while waiting for chunk")
return
}
}
From 44f8f19ea97b6bb1067e988d1652916fba2e6fbd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 15:07:24 +0100
Subject: [PATCH 52/65] chore: improve timeout error
---
internal/statesync/chunks.go | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 446474081a..938c3935af 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -291,13 +291,9 @@ func (q *chunkQueue) Next() (*chunk, error) {
q.doneCount++
return loadedChunk, nil
case <-time.After(chunkTimeout):
- pendingChunks := ""
// Locking is done inside q.Pending
- pending := q.Pending()
- for _, item := range pending {
- pendingChunks = pendingChunks + " " + item.String()
- }
- return nil, fmt.Errorf("timed out waiting for chunks %s: %w", pendingChunks, errTimeout)
+ pendingChunks := len(q.Pending())
+ return nil, fmt.Errorf("timed out waiting for %d chunks: %w", pendingChunks, errTimeout)
}
}
From 3d39ee00f3d1ee98b38d0e665414f07a97f9e12a Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 15:47:56 +0100
Subject: [PATCH 53/65] fix: chunk retry not working
---
internal/statesync/chunks.go | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 938c3935af..2083b64c8d 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -104,8 +104,10 @@ func (q *chunkQueue) Enqueue(chunkIDs ...[]byte) {
func (q *chunkQueue) enqueue(chunkID bytes.HexBytes) {
q.requestQueue = append(q.requestQueue, chunkID)
- _, ok := q.items[chunkID.String()]
+ chunk, ok := q.items[chunkID.String()]
if ok {
+ // If the chunk is already in the queue, reset its status to initStatus to retry fetching it.
+ chunk.status = initStatus
return
}
q.items[chunkID.String()] = &chunkItem{
From 18ab2491c17bf6b50400345d6088c0666254496e Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 17:41:19 +0100
Subject: [PATCH 54/65] chore(statesync): chunk request send timeout + retry
---
internal/statesync/chunks.go | 4 +---
internal/statesync/syncer.go | 10 +++++++++-
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 2083b64c8d..938c3935af 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -104,10 +104,8 @@ func (q *chunkQueue) Enqueue(chunkIDs ...[]byte) {
func (q *chunkQueue) enqueue(chunkID bytes.HexBytes) {
q.requestQueue = append(q.requestQueue, chunkID)
- chunk, ok := q.items[chunkID.String()]
+ _, ok := q.items[chunkID.String()]
if ok {
- // If the chunk is already in the queue, reset its status to initStatus to retry fetching it.
- chunk.status = initStatus
return
}
q.items[chunkID.String()] = &chunkItem{
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index beeabbb3e4..c0a161bfd4 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -24,12 +24,15 @@ import (
)
const (
+
// chunkTimeout is the timeout while waiting for the next chunk from the chunk queue.
chunkTimeout = 2 * time.Minute
// minimumDiscoveryTime is the lowest allowable time for a
// SyncAny discovery time.
minimumDiscoveryTime = 5 * time.Second
+ // chunkRequestSendTimeout is the timeout sending chunk requests to peers.
+ chunkRequestSendTimeout = 5 * time.Second
dequeueChunkIDTimeoutDefault = 2 * time.Second
)
@@ -552,6 +555,7 @@ func (s *syncer) fetchChunks(ctx context.Context, snapshot *snapshot, queue *chu
}
ID, err := queue.Dequeue()
if errors.Is(err, errQueueEmpty) {
+ s.logger.Debug("fetchChunks queue empty, waiting for chunk", "timeout", dequeueChunkIDTimeout, "err", err)
continue
}
s.logger.Info("Fetching snapshot chunk",
@@ -561,6 +565,8 @@ func (s *syncer) fetchChunks(ctx context.Context, snapshot *snapshot, queue *chu
ticker.Reset(s.retryTimeout)
if err := s.requestChunk(ctx, snapshot, ID); err != nil {
s.logger.Error("failed to request snapshot chunk", "err", err, "chunkID", ID)
+ // retry the chunk
+ s.chunkQueue.Enqueue(ID)
return
}
select {
@@ -606,8 +612,10 @@ func (s *syncer) requestChunk(ctx context.Context, snapshot *snapshot, chunkID t
ChunkId: chunkID,
},
}
+ sCtx, cancel := context.WithTimeout(ctx, chunkRequestSendTimeout)
+ defer cancel()
- return s.chunkCh.Send(ctx, msg)
+ return s.chunkCh.Send(sCtx, msg)
}
// / finalizeSnapshot sends light block to ABCI app after state sync is done
From 0abe1651aedcc4ceaf528b3dae2c6e8b01b1b006 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 19:47:09 +0100
Subject: [PATCH 55/65] chore: add some logging
---
internal/p2p/router.go | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/internal/p2p/router.go b/internal/p2p/router.go
index 4ac248e1d6..7fdf269cfb 100644
--- a/internal/p2p/router.go
+++ b/internal/p2p/router.go
@@ -357,13 +357,25 @@ func (r *Router) routeChannel(
for _, q := range queues {
start := time.Now().UTC()
+ qCtx, qcancel := context.WithTimeout(ctx, time.Minute)
+ defer qcancel()
+
+ if chID == ChunkChannel {
+ r.logger.Debug("sending chunk message", "peer", envelope.To, "chunk", envelope.Message, "channel", chID)
+ }
select {
case q.enqueue() <- envelope:
+ if chID == ChunkChannel {
+ r.logger.Debug("sent chunk message", "peer", envelope.To, "chunk", envelope.Message, "channel", chID)
+ }
r.metrics.RouterPeerQueueSend.Observe(time.Since(start).Seconds())
case <-q.closed():
r.logger.Debug("dropping message on closed channel", "peer", envelope.To, "channel", chID)
+ case <-qCtx.Done():
+ r.logger.Debug("dropping message on queue timeout", "peer", envelope.To, "channel", chID, "err", qCtx.Err())
+
case <-ctx.Done():
return
}
From a0fc19f681b79a471736b2aac537de30847b02ef Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Mon, 3 Feb 2025 20:34:24 +0100
Subject: [PATCH 56/65] chore: add more logs
---
internal/statesync/syncer.go | 2 ++
1 file changed, 2 insertions(+)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index c0a161bfd4..2fbff54150 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -545,11 +545,13 @@ func (s *syncer) fetchChunks(ctx context.Context, snapshot *snapshot, queue *chu
}
for {
if queue.IsRequestQueueEmpty() {
+ s.logger.Debug("fetchChunks queue empty, waiting for chunk", "timeout", dequeueChunkIDTimeout)
select {
case <-ctx.Done():
s.logger.Debug("fetchChunks context done on empty queue")
return
case <-time.After(dequeueChunkIDTimeout):
+ s.logger.Debug("fetchChunks queue empty, timed out", "timeout", dequeueChunkIDTimeout)
continue
}
}
From 7398fa4e5a03135c5a73cf51a447b737c77b5d13 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 4 Feb 2025 11:09:00 +0100
Subject: [PATCH 57/65] fix: deadlock between chunkQueue.Add and
applyChunks->Pending
---
internal/statesync/chunks.go | 65 +++++++++++++++++++++++++++---------
1 file changed, 49 insertions(+), 16 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 938c3935af..b8b122c6b3 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -15,11 +15,12 @@ import (
// errDone is returned by chunkQueue.Next() when all chunks have been returned.
var (
- errDone = errors.New("chunk queue has completed")
- errQueueEmpty = errors.New("requestQueue is empty")
- errChunkNil = errors.New("cannot add nil chunk")
- errNoChunkItem = errors.New("no chunk item found")
- errNilSnapshot = errors.New("snapshot is nil")
+ errDone = errors.New("chunk queue has completed")
+ errQueueEmpty = errors.New("requestQueue is empty")
+ errChunkNil = errors.New("cannot add nil chunk")
+ errNoChunkItem = errors.New("no chunk item found")
+ errNilSnapshot = errors.New("snapshot is nil")
+ errInvalidChunkSatus = errors.New("unexpected chunk status")
)
const (
@@ -144,32 +145,47 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
}
q.mtx.Lock()
- defer q.mtx.Unlock()
- if q.snapshot == nil {
- return false, errNilSnapshot
+ // we need to manage lock manually to securely unlock before sending to applyCh
+ locked := true
+ unlockFn := func() {
+ if locked {
+ q.mtx.Unlock()
+ locked = false
+ }
}
- chunkIDKey := chunk.ID.String()
- item, ok := q.items[chunkIDKey]
- if !ok {
- return false, fmt.Errorf("failed to add the chunk %x, it was never requested", chunk.ID)
+ defer unlockFn()
+
+ item, err := q.getItem(chunk.ID)
+ if err != nil {
+ return false, fmt.Errorf("get chunk %x: %w", chunk.ID, err)
}
+
if item.status != inProgressStatus && item.status != discardedStatus {
- return false, nil
+ return false, fmt.Errorf("invalid chunk %x status %d: %w", chunk.ID, item.status, errInvalidChunkSatus)
}
- err := q.validateChunk(chunk)
+
+ err = q.validateChunk(chunk)
if err != nil {
- return false, err
+ return false, fmt.Errorf("validate chunk %x: %w", chunk.ID, err)
}
- item.file = filepath.Join(q.dir, chunkIDKey)
+
+ item.file = filepath.Join(q.dir, chunk.ID.String())
err = item.write(data)
if err != nil {
return false, err
}
item.sender = chunk.Sender
item.status = receivedStatus
+
+ // unlock before sending to applyCh to avoid blocking/deadlock on the applyCh
+ unlockFn()
+
q.applyCh <- chunk.ID
// Signal any waiters that the chunk has arrived.
+ q.mtx.Lock()
item.closeWaitChs(true)
+ q.mtx.Unlock()
+
return true, nil
}
@@ -369,6 +385,23 @@ func (q *chunkQueue) DoneChunksCount() int {
return q.doneCount
}
+// getItem fetches chunk item from the items map. If the item is not found, it returns an error.
+// The caller must hold the mutex lock.
+func (q *chunkQueue) getItem(chunkID bytes.HexBytes) (*chunkItem, error) {
+ if q.snapshot == nil {
+ return nil, errNilSnapshot
+ }
+ chunkIDKey := chunkID.String()
+ item, ok := q.items[chunkIDKey]
+ if !ok {
+ return nil, fmt.Errorf("chunk %x not found", chunkID)
+ }
+
+ return item, nil
+}
+
+// validateChunk checks if the chunk is expected and valid for the current snapshot
+// The caller must hold the mutex lock.
func (q *chunkQueue) validateChunk(chunk *chunk) error {
if chunk.Height != q.snapshot.Height {
return fmt.Errorf("invalid chunk height %v, expected %v",
From 80390e3c9b6406caad7ae4aae19618cab48e30fd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 4 Feb 2025 12:39:00 +0100
Subject: [PATCH 58/65] refactor: use MutexGuard design pattern
---
internal/libs/sync/mutexguard.go | 54 +++++++++++++++++++++++++++++++
internal/statesync/chunks.go | 26 ++++++---------
internal/statesync/chunks_test.go | 6 ++--
3 files changed, 67 insertions(+), 19 deletions(-)
create mode 100644 internal/libs/sync/mutexguard.go
diff --git a/internal/libs/sync/mutexguard.go b/internal/libs/sync/mutexguard.go
new file mode 100644
index 0000000000..5c1c1be18e
--- /dev/null
+++ b/internal/libs/sync/mutexguard.go
@@ -0,0 +1,54 @@
+package sync
+
+// UnlockFn is a function that unlocks a mutex.
+// It returns true if the mutex was unlocked, false if it was already unlocked.
+type UnlockFn func() bool
+
+// Mtx is a mutex interface.
+// Implemented by sync.Mutex and deadlock.Mutex.
+type Mtx interface {
+ Lock()
+ Unlock()
+}
+
+// RMtx is a mutex that can be locked for read.
+//
+// Implemented by sync.RwMutex and deadlock.RwMutex.
+type RMtx interface {
+ RLock()
+ RUnlock()
+}
+
+// LockGuard locks the mutex and returns a function that unlocks it.
+// The returned function must be called to release the lock.
+// The returned function may be called multiple times - only the first call will unlock the mutex, others will be no-ops.
+func LockGuard(mtx Mtx) UnlockFn {
+ mtx.Lock()
+ locked := true
+
+ return func() bool {
+ if locked {
+ locked = false
+ mtx.Unlock()
+ return true
+ }
+ return false
+ }
+}
+
+// RLockGuard locks the read-write mutex for reading and returns a function that unlocks it.
+// The returned function must be called to release the lock.
+// The returned function may be called multiple times - only the first call will unlock the mutex, others will be no-ops.
+func RLockGuard(mtx RMtx) UnlockFn {
+ mtx.RLock()
+ locked := true
+
+ return func() bool {
+ if locked {
+ locked = false
+ mtx.RUnlock()
+ return true
+ }
+ return false
+ }
+}
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index b8b122c6b3..525a7a1500 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -9,18 +9,19 @@ import (
sync "github.com/sasha-s/go-deadlock"
+ tmsync "github.com/dashpay/tenderdash/internal/libs/sync"
+
"github.com/dashpay/tenderdash/libs/bytes"
"github.com/dashpay/tenderdash/types"
)
// errDone is returned by chunkQueue.Next() when all chunks have been returned.
var (
- errDone = errors.New("chunk queue has completed")
- errQueueEmpty = errors.New("requestQueue is empty")
- errChunkNil = errors.New("cannot add nil chunk")
- errNoChunkItem = errors.New("no chunk item found")
- errNilSnapshot = errors.New("snapshot is nil")
- errInvalidChunkSatus = errors.New("unexpected chunk status")
+ errDone = errors.New("chunk queue has completed")
+ errQueueEmpty = errors.New("requestQueue is empty")
+ errChunkNil = errors.New("cannot add nil chunk")
+ errNoChunkItem = errors.New("no chunk item found")
+ errNilSnapshot = errors.New("snapshot is nil")
)
const (
@@ -144,15 +145,7 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
data = []byte{}
}
- q.mtx.Lock()
- // we need to manage lock manually to securely unlock before sending to applyCh
- locked := true
- unlockFn := func() {
- if locked {
- q.mtx.Unlock()
- locked = false
- }
- }
+ unlockFn := tmsync.LockGuard(&q.mtx)
defer unlockFn()
item, err := q.getItem(chunk.ID)
@@ -161,7 +154,8 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
}
if item.status != inProgressStatus && item.status != discardedStatus {
- return false, fmt.Errorf("invalid chunk %x status %d: %w", chunk.ID, item.status, errInvalidChunkSatus)
+ // chunk either already exists, or we didn't request it yet, so we ignore it
+ return false, nil
}
err = q.validateChunk(chunk)
diff --git a/internal/statesync/chunks_test.go b/internal/statesync/chunks_test.go
index a997188b13..e3be49683a 100644
--- a/internal/statesync/chunks_test.go
+++ b/internal/statesync/chunks_test.go
@@ -101,10 +101,10 @@ func (suite *ChunkQueueTestSuite) TestChunkQueue() {
{chunk: suite.chunks[1], want: true},
}
require := suite.Require()
- for _, tc := range testCases {
+ for i, tc := range testCases {
added, err := suite.queue.Add(tc.chunk)
- require.NoError(err)
- require.Equal(tc.want, added)
+ require.NoError(err, "test case %d", i)
+ require.Equal(tc.want, added, "test case %d", i)
}
// At this point, we should be able to retrieve them all via Next
From e875f9a164438eb1280eae54c6e982860bfe9107 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Tue, 4 Feb 2025 15:36:32 +0100
Subject: [PATCH 59/65] test(statesync): allow injecting height to statesync
tests
---
.mockery.yaml | 1 +
internal/consensus/state.go | 4 +
.../statesync/mocks/consensusstateprovider.go | 127 ++++++++++++++++++
internal/statesync/reactor.go | 34 +++--
internal/statesync/reactor_test.go | 42 +++---
5 files changed, 181 insertions(+), 27 deletions(-)
create mode 100644 internal/statesync/mocks/consensusstateprovider.go
diff --git a/.mockery.yaml b/.mockery.yaml
index d44c09dfc8..ceed741a1c 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -53,6 +53,7 @@ packages:
github.com/dashpay/tenderdash/internal/statesync:
interfaces:
StateProvider:
+ ConsensusStateProvider:
github.com/dashpay/tenderdash/libs/store:
interfaces:
Store:
diff --git a/internal/consensus/state.go b/internal/consensus/state.go
index 02180c3305..69a6dcc6c4 100644
--- a/internal/consensus/state.go
+++ b/internal/consensus/state.go
@@ -307,6 +307,10 @@ func (cs *State) SetProposedAppVersion(ver uint64) {
cs.emitter.Emit(setProposedAppVersionEventName, ver)
}
+func (cs *State) GetCurrentHeight() int64 {
+ return cs.stateDataStore.Get().Height
+}
+
func (cs *State) updateStateFromStore() error {
state, err := cs.stateStore.Load()
if err != nil {
diff --git a/internal/statesync/mocks/consensusstateprovider.go b/internal/statesync/mocks/consensusstateprovider.go
new file mode 100644
index 0000000000..4f12038ac5
--- /dev/null
+++ b/internal/statesync/mocks/consensusstateprovider.go
@@ -0,0 +1,127 @@
+// Code generated by mockery. DO NOT EDIT.
+
+package mocks
+
+import (
+ mock "github.com/stretchr/testify/mock"
+
+ types "github.com/dashpay/tenderdash/types"
+)
+
+// ConsensusStateProvider is an autogenerated mock type for the ConsensusStateProvider type
+type ConsensusStateProvider struct {
+ mock.Mock
+}
+
+type ConsensusStateProvider_Expecter struct {
+ mock *mock.Mock
+}
+
+func (_m *ConsensusStateProvider) EXPECT() *ConsensusStateProvider_Expecter {
+ return &ConsensusStateProvider_Expecter{mock: &_m.Mock}
+}
+
+// GetCurrentHeight provides a mock function with no fields
+func (_m *ConsensusStateProvider) GetCurrentHeight() int64 {
+ ret := _m.Called()
+
+ if len(ret) == 0 {
+ panic("no return value specified for GetCurrentHeight")
+ }
+
+ var r0 int64
+ if rf, ok := ret.Get(0).(func() int64); ok {
+ r0 = rf()
+ } else {
+ r0 = ret.Get(0).(int64)
+ }
+
+ return r0
+}
+
+// ConsensusStateProvider_GetCurrentHeight_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetCurrentHeight'
+type ConsensusStateProvider_GetCurrentHeight_Call struct {
+ *mock.Call
+}
+
+// GetCurrentHeight is a helper method to define mock.On call
+func (_e *ConsensusStateProvider_Expecter) GetCurrentHeight() *ConsensusStateProvider_GetCurrentHeight_Call {
+ return &ConsensusStateProvider_GetCurrentHeight_Call{Call: _e.mock.On("GetCurrentHeight")}
+}
+
+func (_c *ConsensusStateProvider_GetCurrentHeight_Call) Run(run func()) *ConsensusStateProvider_GetCurrentHeight_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run()
+ })
+ return _c
+}
+
+func (_c *ConsensusStateProvider_GetCurrentHeight_Call) Return(_a0 int64) *ConsensusStateProvider_GetCurrentHeight_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *ConsensusStateProvider_GetCurrentHeight_Call) RunAndReturn(run func() int64) *ConsensusStateProvider_GetCurrentHeight_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// PublishCommitEvent provides a mock function with given fields: commit
+func (_m *ConsensusStateProvider) PublishCommitEvent(commit *types.Commit) error {
+ ret := _m.Called(commit)
+
+ if len(ret) == 0 {
+ panic("no return value specified for PublishCommitEvent")
+ }
+
+ var r0 error
+ if rf, ok := ret.Get(0).(func(*types.Commit) error); ok {
+ r0 = rf(commit)
+ } else {
+ r0 = ret.Error(0)
+ }
+
+ return r0
+}
+
+// ConsensusStateProvider_PublishCommitEvent_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PublishCommitEvent'
+type ConsensusStateProvider_PublishCommitEvent_Call struct {
+ *mock.Call
+}
+
+// PublishCommitEvent is a helper method to define mock.On call
+// - commit *types.Commit
+func (_e *ConsensusStateProvider_Expecter) PublishCommitEvent(commit interface{}) *ConsensusStateProvider_PublishCommitEvent_Call {
+ return &ConsensusStateProvider_PublishCommitEvent_Call{Call: _e.mock.On("PublishCommitEvent", commit)}
+}
+
+func (_c *ConsensusStateProvider_PublishCommitEvent_Call) Run(run func(commit *types.Commit)) *ConsensusStateProvider_PublishCommitEvent_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*types.Commit))
+ })
+ return _c
+}
+
+func (_c *ConsensusStateProvider_PublishCommitEvent_Call) Return(_a0 error) *ConsensusStateProvider_PublishCommitEvent_Call {
+ _c.Call.Return(_a0)
+ return _c
+}
+
+func (_c *ConsensusStateProvider_PublishCommitEvent_Call) RunAndReturn(run func(*types.Commit) error) *ConsensusStateProvider_PublishCommitEvent_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// NewConsensusStateProvider creates a new instance of ConsensusStateProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewConsensusStateProvider(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *ConsensusStateProvider {
+ mock := &ConsensusStateProvider{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index 85efc47342..cc47ba2297 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -16,7 +16,6 @@ import (
abci "github.com/dashpay/tenderdash/abci/types"
"github.com/dashpay/tenderdash/config"
dashcore "github.com/dashpay/tenderdash/dash/core"
- "github.com/dashpay/tenderdash/internal/consensus"
"github.com/dashpay/tenderdash/internal/eventbus"
"github.com/dashpay/tenderdash/internal/p2p"
sm "github.com/dashpay/tenderdash/internal/state"
@@ -136,7 +135,16 @@ type Reactor struct {
dashCoreClient dashcore.Client
- csState *consensus.State
+ csState ConsensusStateProvider
+}
+
+// ConsensusStateProvider is an interface that allows the state sync reactor to
+// ineract with the consensus state.
+//
+// Implemented by consensus.State
+type ConsensusStateProvider interface {
+ PublishCommitEvent(commit *types.Commit) error
+ GetCurrentHeight() int64
}
// NewReactor returns a reference to a new state sync reactor, which implements
@@ -159,7 +167,7 @@ func NewReactor(
postSyncHook func(context.Context, sm.State) error,
needsStateSync bool,
client dashcore.Client,
- csState *consensus.State,
+ csState ConsensusStateProvider,
) *Reactor {
r := &Reactor{
logger: logger,
@@ -711,7 +719,7 @@ func (r *Reactor) handleSnapshotMessage(ctx context.Context, envelope *p2p.Envel
"version", msg.Version)
default:
- return fmt.Errorf("received unknown message: %T", msg)
+ return fmt.Errorf("handleSnapshotMessage received unknown message: %T", msg)
}
return nil
@@ -792,7 +800,7 @@ func (r *Reactor) handleChunkMessage(ctx context.Context, envelope *p2p.Envelope
}
default:
- return fmt.Errorf("received unknown message: %T", msg)
+ return fmt.Errorf("handleChunkMessage received unknown message: %T", msg)
}
return nil
@@ -853,7 +861,7 @@ func (r *Reactor) handleLightBlockMessage(ctx context.Context, envelope *p2p.Env
}
default:
- return fmt.Errorf("received unknown message: %T", msg)
+ return fmt.Errorf("handleLightBlockMessage received unknown message: %T", msg)
}
return nil
@@ -863,7 +871,7 @@ func (r *Reactor) handleParamsMessage(ctx context.Context, envelope *p2p.Envelop
switch msg := envelope.Message.(type) {
case *ssproto.ParamsRequest:
r.logger.Debug("received consensus params request", "height", msg.Height)
- cp, err := r.stateStore.LoadConsensusParams(int64(msg.Height))
+ cp, err := r.stateStore.LoadConsensusParams(tmmath.MustConvertInt64(msg.Height))
if err != nil {
r.logger.Error("failed to fetch requested consensus params",
"height", msg.Height,
@@ -901,7 +909,7 @@ func (r *Reactor) handleParamsMessage(ctx context.Context, envelope *p2p.Envelop
}
default:
- return fmt.Errorf("received unknown message: %T", msg)
+ return fmt.Errorf("handleParamsMessage received unknown message: %T", msg)
}
return nil
@@ -1053,6 +1061,12 @@ func (r *Reactor) processPeerUpdates(ctx context.Context, peerUpdates *p2p.PeerU
// recentSnapshots fetches the n most recent snapshots from the app
func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, error) {
+ // if we don't have current state, we don't return any snapshots
+ if r.csState == nil {
+ return []*snapshot{}, nil
+ }
+ currentHeight := r.csState.GetCurrentHeight()
+
resp, err := r.conn.ListSnapshots(ctx, &abci.RequestListSnapshots{})
if err != nil {
return nil, err
@@ -1078,10 +1092,6 @@ func (r *Reactor) recentSnapshots(ctx context.Context, n uint32) ([]*snapshot, e
break
}
- if r.csState == nil {
- continue
- }
- currentHeight := r.csState.GetRoundState().Height
// we only accept snapshots where next block is already finalized, that is we are voting
// for `height + 2` or higher, because we need to be able to fetch light block containing
// commit for `height` from block store (which is stored in block `height+1`)
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index 799f017b9a..2bfa14e109 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -21,6 +21,7 @@ import (
"github.com/dashpay/tenderdash/config"
"github.com/dashpay/tenderdash/crypto"
dashcore "github.com/dashpay/tenderdash/dash/core"
+
"github.com/dashpay/tenderdash/internal/p2p"
"github.com/dashpay/tenderdash/internal/proxy"
smmocks "github.com/dashpay/tenderdash/internal/state/mocks"
@@ -86,6 +87,7 @@ func setup(
t *testing.T,
conn *clientmocks.Client,
stateProvider *mocks.StateProvider,
+ csState ConsensusStateProvider,
chBuf uint,
) *reactorTestSuite {
t.Helper()
@@ -187,7 +189,7 @@ func setup(
nil, // post-sync-hook
false, // run Sync during Start()
rts.dashcoreClient,
- nil,
+ csState,
)
rts.syncer = &syncer{
@@ -224,7 +226,7 @@ func TestReactor_Sync(t *testing.T) {
defer cancel()
const snapshotHeight = 7
- rts := setup(ctx, t, nil, nil, 100)
+ rts := setup(ctx, t, nil, nil, nil, 100)
chain := buildLightBlockChain(ctx, t, 1, 10, time.Now(), rts.privVal)
// app accepts any snapshot
rts.conn.
@@ -290,7 +292,7 @@ func TestReactor_ChunkRequest_InvalidRequest(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- rts := setup(ctx, t, nil, nil, 2)
+ rts := setup(ctx, t, nil, nil, nil, 2)
rts.chunkInCh <- p2p.Envelope{
From: types.NodeID("aa"),
@@ -350,7 +352,7 @@ func TestReactor_ChunkRequest(t *testing.T) {
ChunkId: tc.request.ChunkId,
}).Return(&abci.ResponseLoadSnapshotChunk{Chunk: tc.chunk}, nil)
- rts := setup(ctx, t, conn, nil, 2)
+ rts := setup(ctx, t, conn, nil, nil, 2)
rts.chunkInCh <- p2p.Envelope{
From: types.NodeID("aa"),
@@ -371,7 +373,7 @@ func TestReactor_SnapshotsRequest_InvalidRequest(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- rts := setup(ctx, t, nil, nil, 2)
+ rts := setup(ctx, t, nil, nil, nil, 2)
rts.snapshotInCh <- p2p.Envelope{
From: types.NodeID("aa"),
@@ -390,8 +392,9 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
testcases := map[string]struct {
snapshots []*abci.Snapshot
expectResponses []*ssproto.SnapshotsResponse
+ currentHeight int64
}{
- "no snapshots": {nil, []*ssproto.SnapshotsResponse{}},
+ "no snapshots": {nil, []*ssproto.SnapshotsResponse{}, 1},
">10 unordered snapshots": {
[]*abci.Snapshot{
{Height: 1, Version: 2, Hash: []byte{1, 2}, Metadata: []byte{1}},
@@ -419,6 +422,7 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
{Height: 1, Version: 4, Hash: []byte{1, 4}, Metadata: []byte{7}},
{Height: 1, Version: 3, Hash: []byte{1, 3}, Metadata: []byte{10}},
},
+ 6,
},
}
ctx, cancel := context.WithCancel(context.Background())
@@ -426,18 +430,21 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
for name, tc := range testcases {
tc := tc
-
t.Run(name, func(t *testing.T) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
// mock ABCI connection to return local snapshots
- conn := &clientmocks.Client{}
+ conn := clientmocks.NewClient(t)
conn.On("ListSnapshots", mock.Anything, &abci.RequestListSnapshots{}).Return(&abci.ResponseListSnapshots{
Snapshots: tc.snapshots,
- }, nil)
+ }, nil).
+ Maybe()
- rts := setup(ctx, t, conn, nil, 100)
+ cp := mocks.NewConsensusStateProvider(t)
+ cp.On("GetCurrentHeight").Return(tc.currentHeight).Maybe()
+
+ rts := setup(ctx, t, conn, nil, cp, 100)
rts.snapshotInCh <- p2p.Envelope{
From: types.NodeID("aa"),
@@ -446,7 +453,10 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
}
if len(tc.expectResponses) > 0 {
- retryUntil(ctx, t, func() bool { return len(rts.snapshotOutCh) == len(tc.expectResponses) }, time.Second)
+ retryUntil(ctx, t,
+ func() bool { return len(rts.snapshotOutCh) == len(tc.expectResponses) },
+ time.Second,
+ )
}
responses := make([]*ssproto.SnapshotsResponse, len(tc.expectResponses))
@@ -465,7 +475,7 @@ func TestReactor_LightBlockResponse(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- rts := setup(ctx, t, nil, nil, 2)
+ rts := setup(ctx, t, nil, nil, nil, 2)
var height int64 = 10
// generates a random header
@@ -523,7 +533,7 @@ func TestReactor_BlockProviders(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- rts := setup(ctx, t, nil, nil, 2)
+ rts := setup(ctx, t, nil, nil, nil, 2)
rts.peerUpdateCh <- p2p.PeerUpdate{
NodeID: "aa",
Status: p2p.PeerStatusUp,
@@ -590,7 +600,7 @@ func TestReactor_StateProviderP2P(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
- rts := setup(ctx, t, nil, nil, 2)
+ rts := setup(ctx, t, nil, nil, nil, 2)
// make syncer non nil else test won't think we are state syncing
rts.reactor.syncer = rts.syncer
peerA := types.NodeID(strings.Repeat("a", 2*types.NodeIDByteLength))
@@ -691,7 +701,7 @@ func TestReactor_Backfill(t *testing.T) {
defer cancel()
t.Cleanup(leaktest.CheckTimeout(t, 1*time.Minute))
- rts := setup(ctx, t, nil, nil, 21)
+ rts := setup(ctx, t, nil, nil, nil, 21)
peers := genPeerIDs(tc.numPeers)
for _, peer := range peers {
@@ -762,6 +772,8 @@ func TestReactor_Backfill(t *testing.T) {
// retryUntil will continue to evaluate fn and will return successfully when true
// or fail when the timeout is reached.
func retryUntil(ctx context.Context, t *testing.T, fn func() bool, timeout time.Duration) {
+ t.Helper()
+
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
From b39e9c2f3d9f3e32214f13677abe7f48f140e503 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 5 Feb 2025 11:00:05 +0100
Subject: [PATCH 60/65] chore: remove debug code
---
internal/statesync/syncer.go | 18 ------------------
1 file changed, 18 deletions(-)
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 2fbff54150..91cc3c824a 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -5,7 +5,6 @@ import (
"context"
"errors"
"fmt"
- "os"
"time"
sync "github.com/sasha-s/go-deadlock"
@@ -490,23 +489,6 @@ func (s *syncer) applyChunks(ctx context.Context, queue *chunkQueue, start time.
"result", resp.Result.String(),
"chunkID", chunk.ID.String())
- // TODO: this is for debugging only, remove when not needed
- pending := queue.Pending()
- if len(pending) > 0 {
- // write list of pending chunks, in hex, to /tmp/td_pending_chunks.txt
- if file, err := os.Create("/tmp/td_pending_chunks.txt"); err == nil {
- defer file.Close()
- for _, p := range pending {
- _, err := file.WriteString(p.String() + "\n")
- if err != nil {
- s.logger.Error("failed to write pending chunks to /tmp/td_pending_chunks.txt", "err", err)
- }
- }
- } else {
- s.logger.Error("failed to create /tmp/td_pending_chunks.txt", "err", err)
- }
- }
-
switch resp.Result {
case abci.ResponseApplySnapshotChunk_ACCEPT:
queue.Enqueue(resp.NextChunks...)
From c18052b0494b139e58ec6ba58aa7afc0c5b7a09f Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 5 Feb 2025 11:30:28 +0100
Subject: [PATCH 61/65] chore: remove chunk after loading
---
internal/statesync/chunks.go | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 525a7a1500..0967f9271f 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -1,6 +1,8 @@
package statesync
import (
+ "crypto/sha256"
+ "encoding/hex"
"errors"
"fmt"
"os"
@@ -65,6 +67,21 @@ type (
}
)
+// Filename updates `chunkItem.file` with an absolute path to file containing the the chunk and returns it.
+// If the filename is already set, it isn't changed.
+//
+// Returns error if the filename cannot be created.
+//
+// Caller must ensure only one goroutine calls this method at a time, eg. by holding the mutex lock.
+func (c *chunkItem) Filename(parentDir string) (string, error) {
+ var err error
+ if c.file == "" {
+ filename := hex.EncodeToString(sha256.New().Sum(c.chunkID))
+ c.file, err = filepath.Abs(filepath.Join(parentDir, filename))
+ }
+ return c.file, err
+}
+
// newChunkQueue creates a new chunk requestQueue for a snapshot, using a temp dir for storage.
// Callers must call Close() when done.
func newChunkQueue(snapshot *snapshot, tempDir string, bufLen int) (*chunkQueue, error) {
@@ -163,7 +180,12 @@ func (q *chunkQueue) Add(chunk *chunk) (bool, error) {
return false, fmt.Errorf("validate chunk %x: %w", chunk.ID, err)
}
- item.file = filepath.Join(q.dir, chunk.ID.String())
+ // ensure filename is set on the item
+ _, err = item.Filename(q.dir)
+ if err != nil {
+ return false, fmt.Errorf("failed to get filename for chunk %x: %w", chunk.ID, err)
+ }
+
err = item.write(data)
if err != nil {
return false, err
@@ -330,12 +352,13 @@ func (q *chunkQueue) Retry(chunkID bytes.HexBytes) {
}
func (q *chunkQueue) retry(chunkID bytes.HexBytes) {
- item, ok := q.items[chunkID.String()]
+ chunkKey := chunkID.String()
+ item, ok := q.items[chunkKey]
if !ok || (item.status != receivedStatus && item.status != doneStatus) {
return
}
q.requestQueue = append(q.requestQueue, chunkID)
- q.items[chunkID.String()].status = initStatus
+ q.items[chunkKey].status = initStatus
}
// RetryAll schedules all chunks to be retried, without refetching them.
From ae0b84306ae239e886286395cf1f0d1c7802a1a2 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 5 Feb 2025 11:50:25 +0100
Subject: [PATCH 62/65] chore: fix sha256 computation
---
internal/statesync/chunks.go | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/internal/statesync/chunks.go b/internal/statesync/chunks.go
index 0967f9271f..8a11275a39 100644
--- a/internal/statesync/chunks.go
+++ b/internal/statesync/chunks.go
@@ -76,7 +76,8 @@ type (
func (c *chunkItem) Filename(parentDir string) (string, error) {
var err error
if c.file == "" {
- filename := hex.EncodeToString(sha256.New().Sum(c.chunkID))
+ hash := sha256.Sum256(c.chunkID)
+ filename := hex.EncodeToString(hash[:])
c.file, err = filepath.Abs(filepath.Join(parentDir, filename))
}
return c.file, err
From a4de86a0008ad817e087cbea99cafd4b51089cdd Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Wed, 5 Feb 2025 17:06:33 +0100
Subject: [PATCH 63/65] chore: remove test code
---
internal/p2p/router.go | 12 ------------
libs/math/safemath.go | 2 ++
2 files changed, 2 insertions(+), 12 deletions(-)
diff --git a/internal/p2p/router.go b/internal/p2p/router.go
index 7fdf269cfb..4ac248e1d6 100644
--- a/internal/p2p/router.go
+++ b/internal/p2p/router.go
@@ -357,25 +357,13 @@ func (r *Router) routeChannel(
for _, q := range queues {
start := time.Now().UTC()
- qCtx, qcancel := context.WithTimeout(ctx, time.Minute)
- defer qcancel()
-
- if chID == ChunkChannel {
- r.logger.Debug("sending chunk message", "peer", envelope.To, "chunk", envelope.Message, "channel", chID)
- }
select {
case q.enqueue() <- envelope:
- if chID == ChunkChannel {
- r.logger.Debug("sent chunk message", "peer", envelope.To, "chunk", envelope.Message, "channel", chID)
- }
r.metrics.RouterPeerQueueSend.Observe(time.Since(start).Seconds())
case <-q.closed():
r.logger.Debug("dropping message on closed channel", "peer", envelope.To, "channel", chID)
- case <-qCtx.Done():
- r.logger.Debug("dropping message on queue timeout", "peer", envelope.To, "channel", chID, "err", qCtx.Err())
-
case <-ctx.Done():
return
}
diff --git a/libs/math/safemath.go b/libs/math/safemath.go
index d9cd31df45..56aa71f9d0 100644
--- a/libs/math/safemath.go
+++ b/libs/math/safemath.go
@@ -260,6 +260,8 @@ func SafeMulInt64(a, b int64) (int64, bool) {
}
// Max returns the maximum value for a type T.
+//
+// The function panics if the type is not supported.
func Max[T Integer]() uint64 {
var max T
switch any(max).(type) {
From 4a5cce92ed3a736214302054f3fca228dfb137b5 Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Thu, 6 Feb 2025 15:01:06 +0100
Subject: [PATCH 64/65] test(sync): test LockGuard and RLockGuard
---
internal/libs/sync/mutexguard_test.go | 141 ++++++++++++++++++++++++++
1 file changed, 141 insertions(+)
create mode 100644 internal/libs/sync/mutexguard_test.go
diff --git a/internal/libs/sync/mutexguard_test.go b/internal/libs/sync/mutexguard_test.go
new file mode 100644
index 0000000000..a205a67f0d
--- /dev/null
+++ b/internal/libs/sync/mutexguard_test.go
@@ -0,0 +1,141 @@
+package sync_test
+
+import (
+ "sync"
+ "testing"
+ "time"
+
+ deadlock "github.com/sasha-s/go-deadlock"
+ "github.com/stretchr/testify/assert"
+
+ tmsync "github.com/dashpay/tenderdash/internal/libs/sync"
+)
+
+// TestLockGuardMultipleUnlocks checks that the LockGuard function correctly handles multiple unlock calls.
+func TestLockGuardMultipleUnlocks(t *testing.T) {
+ // Disable deadlock detection logic for this test
+ deadlockDisabled := deadlock.Opts.Disable
+ deadlock.Opts.Disable = true
+ defer func() {
+ deadlock.Opts.Disable = deadlockDisabled
+ }()
+ var mtx deadlock.Mutex
+
+ unlock := tmsync.LockGuard(&mtx)
+ // deferred unlock() will do nothing because we unlock inside the test, but we still want to check this
+ defer func() { assert.False(t, unlock()) }()
+ // locking should not be possible
+ assert.False(t, mtx.TryLock())
+
+ assert.True(t, unlock())
+ // here we can lock
+ mtx.Lock()
+ // unlock should do nothing
+ assert.False(t, unlock())
+ // locking again should not be possible
+ assert.False(t, mtx.TryLock())
+ // unlock should do nothing
+ assert.False(t, unlock())
+ // but this unlock should work
+ mtx.Unlock()
+ assert.True(t, mtx.TryLock())
+}
+
+// TestLockGuard checks that the LockGuard function correctly increments a counter using multiple goroutines.
+func TestLockGuard(t *testing.T) {
+ var mtx deadlock.Mutex
+ var counter int
+ var wg sync.WaitGroup
+
+ increment := func() {
+ defer wg.Done()
+ unlock := tmsync.LockGuard(&mtx)
+ defer unlock()
+ counter++
+ }
+
+ // Start multiple goroutines to increment the counter
+ for i := 0; i < 100; i++ {
+ wg.Add(1)
+ go increment()
+ }
+
+ wg.Wait()
+ assert.Equal(t, 100, counter, "Counter should be incremented to 100")
+}
+
+// TestRLockGuard checks that the RLockGuard function allows multiple read locks
+// and correctly increments a counter using write locks.
+func TestRLockGuard(t *testing.T) {
+ var mtx deadlock.RWMutex
+ var counter int
+ var wg sync.WaitGroup
+
+ read := func() {
+ defer wg.Done()
+ unlock := tmsync.RLockGuard(&mtx)
+ defer unlock()
+ _ = counter // Just read the counter
+ }
+
+ write := func() {
+ defer wg.Done()
+ unlock := tmsync.LockGuard(&mtx)
+ defer unlock()
+ counter++
+ }
+
+ // Start multiple goroutines to read the counter
+ for i := 0; i < 100; i++ {
+ wg.Add(1)
+ go read()
+ }
+
+ // Start multiple goroutines to write to the counter
+ for i := 0; i < 10; i++ {
+ wg.Add(1)
+ go write()
+ }
+
+ wg.Wait()
+ assert.Equal(t, 10, counter, "Counter should be incremented to 10")
+}
+
+// TestMixedLocks checks the behavior of mixed read and write locks,
+// ensuring that the counter is correctly incremented while allowing concurrent reads.
+func TestMixedLocks(t *testing.T) {
+ var mtx deadlock.RWMutex
+ var counter int
+ var wg sync.WaitGroup
+
+ read := func() {
+ defer wg.Done()
+ unlock := tmsync.RLockGuard(&mtx)
+ defer unlock()
+ time.Sleep(10 * time.Millisecond) // Simulate read delay
+ _ = counter // Just read the counter
+ }
+
+ write := func() {
+ defer wg.Done()
+ unlock := tmsync.LockGuard(&mtx)
+ defer unlock()
+ counter++
+ time.Sleep(10 * time.Millisecond) // Simulate write delay
+ }
+
+ // Start multiple goroutines to read the counter
+ for i := 0; i < 50; i++ {
+ wg.Add(1)
+ go read()
+ }
+
+ // Start multiple goroutines to write to the counter
+ for i := 0; i < 5; i++ {
+ wg.Add(1)
+ go write()
+ }
+
+ wg.Wait()
+ assert.Equal(t, 5, counter, "Counter should be incremented to 5")
+}
From c46ebe103aa61a136976e3c7c4944b1b345a7cca Mon Sep 17 00:00:00 2001
From: Lukasz Klimek <842586+lklimek@users.noreply.github.com>
Date: Thu, 6 Feb 2025 15:28:03 +0100
Subject: [PATCH 65/65] chore: self-review
---
internal/statesync/reactor.go | 6 +++---
internal/statesync/reactor_test.go | 10 ++++------
internal/statesync/stateprovider.go | 3 +++
internal/statesync/syncer.go | 6 ++++--
types/validator_test.go | 6 ++----
5 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/internal/statesync/reactor.go b/internal/statesync/reactor.go
index cc47ba2297..6888e5a9e7 100644
--- a/internal/statesync/reactor.go
+++ b/internal/statesync/reactor.go
@@ -69,7 +69,7 @@ const (
// backfillSleepTime uses to sleep if no connected peers to fetch light blocks
backfillSleepTime = 1 * time.Second
- // minPeers is the minimum number of peers required to start a state sync; TODO: change to >= 2, or make configurable
+ // minPeers is the minimum number of peers required to start a state sync
minPeers = 2
)
@@ -139,7 +139,7 @@ type Reactor struct {
}
// ConsensusStateProvider is an interface that allows the state sync reactor to
-// ineract with the consensus state.
+// ineract with the consensus state. It is defined to improve testability.
//
// Implemented by consensus.State
type ConsensusStateProvider interface {
@@ -248,7 +248,7 @@ func (r *Reactor) OnStart(ctx context.Context) error {
r.initStateProvider = func(ctx context.Context, chainID string, initialHeight int64) error {
spLogger := r.logger.With("module", "stateprovider")
- spLogger.Info("initializing state provider", "useP2P", r.cfg.UseP2P)
+ spLogger.Debug("initializing state sync state provider", "useP2P", r.cfg.UseP2P)
if r.cfg.UseP2P {
if err := r.waitForEnoughPeers(ctx, minPeers); err != nil {
diff --git a/internal/statesync/reactor_test.go b/internal/statesync/reactor_test.go
index 2bfa14e109..0e13fde975 100644
--- a/internal/statesync/reactor_test.go
+++ b/internal/statesync/reactor_test.go
@@ -429,7 +429,6 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
defer cancel()
for name, tc := range testcases {
- tc := tc
t.Run(name, func(t *testing.T) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
@@ -438,13 +437,12 @@ func TestReactor_SnapshotsRequest(t *testing.T) {
conn := clientmocks.NewClient(t)
conn.On("ListSnapshots", mock.Anything, &abci.RequestListSnapshots{}).Return(&abci.ResponseListSnapshots{
Snapshots: tc.snapshots,
- }, nil).
- Maybe()
+ }, nil).Maybe()
- cp := mocks.NewConsensusStateProvider(t)
- cp.On("GetCurrentHeight").Return(tc.currentHeight).Maybe()
+ consensusStateProvider := mocks.NewConsensusStateProvider(t)
+ consensusStateProvider.On("GetCurrentHeight").Return(tc.currentHeight).Maybe()
- rts := setup(ctx, t, conn, nil, cp, 100)
+ rts := setup(ctx, t, conn, nil, consensusStateProvider, 100)
rts.snapshotInCh <- p2p.Envelope{
From: types.NodeID("aa"),
diff --git a/internal/statesync/stateprovider.go b/internal/statesync/stateprovider.go
index 27b19d370c..1a0adece92 100644
--- a/internal/statesync/stateprovider.go
+++ b/internal/statesync/stateprovider.go
@@ -44,6 +44,8 @@ type StateProvider interface {
LightBlock(ctx context.Context, height uint64) (*types.LightBlock, error)
}
+// stateProviderRPC is a state provider using RPC to communicate with light clients.
+// Deprecated, will be removed in future.
type stateProviderRPC struct {
sync.Mutex // light.Client is not concurrency-safe
lc *light.Client
@@ -53,6 +55,7 @@ type stateProviderRPC struct {
}
// NewRPCStateProvider creates a new StateProvider using a light client and RPC clients.
+// Deprecated, will be removed in future.
func NewRPCStateProvider(
ctx context.Context,
chainID string,
diff --git a/internal/statesync/syncer.go b/internal/statesync/syncer.go
index 91cc3c824a..3f6654e544 100644
--- a/internal/statesync/syncer.go
+++ b/internal/statesync/syncer.go
@@ -125,7 +125,8 @@ func (s *syncer) AddSnapshot(peerID types.NodeID, snapshot *snapshot) (bool, err
"version", snapshot.Version,
"hash", snapshot.Hash.ShortString())
} else {
- s.logger.Debug("snapshot not added", "height", snapshot.Height, "hash", snapshot.Hash)
+ s.logger.Debug("snapshot not added, possibly duplicate or invalid",
+ "height", snapshot.Height, "hash", snapshot.Hash)
}
return added, nil
}
@@ -173,6 +174,7 @@ func (s *syncer) SyncAny(
)
for {
+ // we loop one more time than `retries` to check if snapshots requested in previous iterations are available
if retries > 0 && snapshot == nil && iters > retries {
return sm.State{}, nil, errNoSnapshots
}
@@ -654,7 +656,7 @@ func (s *syncer) verifyApp(ctx context.Context, snapshot *snapshot, appVersion u
return errVerifyFailed
}
- if uint64(resp.LastBlockHeight) != snapshot.Height {
+ if tmmath.MustConvertUint64(resp.LastBlockHeight) != snapshot.Height {
s.logger.Error(
"ABCI app reported unexpected last block height",
"expected", snapshot.Height,
diff --git a/types/validator_test.go b/types/validator_test.go
index dffadeb12a..c96369d1af 100644
--- a/types/validator_test.go
+++ b/types/validator_test.go
@@ -4,7 +4,6 @@ import (
"context"
"encoding/base64"
"encoding/hex"
- "fmt"
"testing"
"github.com/stretchr/testify/assert"
@@ -116,16 +115,15 @@ func TestValidatorValidateBasic(t *testing.T) {
}
}
-func TestValdiatorSetHash(t *testing.T) {
+// TestValdiatorSetHashVectors checks if provided validator threshold pubkey and quorum hash returns expected hash
+func TestValdiatorSetHashVectors(t *testing.T) {
thresholdPublicKey, err := base64.RawStdEncoding.DecodeString("gw5F5F5kFNnWFUc8woFOaxccUI+cd+ixaSS3RZT2HJlWpvoWM16YRn6sjYvbdtGH")
require.NoError(t, err)
- fmt.Printf("thresholdPublicKey: %s\n", hex.EncodeToString(thresholdPublicKey))
quorumHash, err := hex.DecodeString("703ee5bfc78765cc9e151d8dd84e30e196ababa83ac6cbdee31a88a46bba81b9")
require.NoError(t, err)
expected := "81742F95E99EAE96ABC727FE792CECB4996205DE6BFC88AFEE1F60B96BC648B2"
- // require.NoError(t, err)
valset := ValidatorSet{
ThresholdPublicKey: bls12381.PubKey(thresholdPublicKey),