From 2a586148e997daedd336cdd4ba198d26fb8eddc7 Mon Sep 17 00:00:00 2001 From: DevOps Service Date: Wed, 23 Mar 2022 17:22:44 +0000 Subject: [PATCH 01/34] Bump Version, Remove buildnumber.dat and genesistimestamp.dat files. --- buildnumber.dat | 1 - config/version.go | 2 +- genesistimestamp.dat | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) delete mode 100644 buildnumber.dat delete mode 100644 genesistimestamp.dat diff --git a/buildnumber.dat b/buildnumber.dat deleted file mode 100644 index d00491fd7e..0000000000 --- a/buildnumber.dat +++ /dev/null @@ -1 +0,0 @@ -1 diff --git a/config/version.go b/config/version.go index edfb7d5a38..c8dc1b4fe4 100644 --- a/config/version.go +++ b/config/version.go @@ -33,7 +33,7 @@ const VersionMajor = 3 // VersionMinor is the Minor semantic version number (x.#.z) - changed when backwards-compatible features are introduced. // Not enforced until after initial public release (x > 0). -const VersionMinor = 5 +const VersionMinor = 6 // Version is the type holding our full version information. type Version struct { diff --git a/genesistimestamp.dat b/genesistimestamp.dat deleted file mode 100644 index c72c6a7795..0000000000 --- a/genesistimestamp.dat +++ /dev/null @@ -1 +0,0 @@ -1558657885 From cd4015a00c47e3a583ee239ce2ca1145dd73f213 Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Mon, 2 May 2022 21:41:03 -0700 Subject: [PATCH 02/34] Add lock around catchpointsMu to avoid race condition (#3944) While upgrading to golang 1.17.9 a couple of race conditions have been detected during E2E tests. This fixes catchpoint label assignment. --- ledger/catchpointtracker.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/ledger/catchpointtracker.go b/ledger/catchpointtracker.go index a2a5aa6889..f4c3e9ea55 100644 --- a/ledger/catchpointtracker.go +++ b/ledger/catchpointtracker.go @@ -413,20 +413,18 @@ func (ct *catchpointTracker) postCommit(ctx context.Context, dcc *deferredCommit } } + ct.catchpointsMu.Lock() + ct.roundDigest = ct.roundDigest[dcc.offset:] if dcc.isCatchpointRound && dcc.catchpointLabel != "" { ct.lastCatchpointLabel = dcc.catchpointLabel } + ct.catchpointsMu.Unlock() + dcc.updatingBalancesDuration = time.Since(dcc.flushTime) if dcc.updateStats { dcc.stats.MemoryUpdatesDuration = time.Duration(time.Now().UnixNano()) } - - ct.catchpointsMu.Lock() - - ct.roundDigest = ct.roundDigest[dcc.offset:] - - ct.catchpointsMu.Unlock() } func (ct *catchpointTracker) postCommitUnlocked(ctx context.Context, dcc *deferredCommitContext) { From f83e312ee1581030946b28f207d71971910d5bd4 Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Mon, 2 May 2022 21:44:53 -0700 Subject: [PATCH 03/34] Add install_buildtools.sh to check_deps.sh error message (#3921) --- scripts/check_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check_deps.sh b/scripts/check_deps.sh index ea178fbb54..4752108a29 100755 --- a/scripts/check_deps.sh +++ b/scripts/check_deps.sh @@ -70,7 +70,7 @@ if [ $MISSING -eq 0 ] then echo "$GREEN_FG[$0]$END_FG_COLOR Required dependencies installed." else - echo -e "$RED_FG[$0]$END_FG_COLOR Required dependencies missing. Run \`${TEAL_FG}./scripts/configure_dev.sh$END_FG_COLOR\` to install." + echo -e "$RED_FG[$0]$END_FG_COLOR Required dependencies missing. Run \`${TEAL_FG}./scripts/configure_dev.sh$END_FG_COLOR\` and/or \`${TEAL_FG}./scripts/buildtools/install_buildtools.sh$END_FG_COLOR\` to install." exit 1 fi From 7a0cd7f15f025236907090f358b20edef45d329a Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Tue, 3 May 2022 21:52:14 -0700 Subject: [PATCH 04/34] Fixes for e2e test runs (#3948) In e2e.sh when we fail to set the E2E_PLATFORM variable, the shell will complain that we are using a binary operator (==) on a single argument. Setting the left side of the test statement to a string with variable interpolation fixes this. The e2e python client runner does not initialize the stdout and stderr variables which causes an exception in reportcomms when the except block runs after an exception. --- test/scripts/e2e.sh | 2 +- test/scripts/e2e_client_runner.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/scripts/e2e.sh b/test/scripts/e2e.sh index 0d4a63d7ed..e9a6b251b6 100755 --- a/test/scripts/e2e.sh +++ b/test/scripts/e2e.sh @@ -165,7 +165,7 @@ if [ -z "$E2E_TEST_FILTER" ] || [ "$E2E_TEST_FILTER" == "SCRIPTS" ]; then # If the platform is arm64, we want to pass "--keep-temps" into e2e_client_runner.py # so that we can keep the temporary test artifact for use in the indexer e2e tests. # The file is located at ${TEMPDIR}/net_done.tar.bz2 - if [ $E2E_PLATFORM == "arm64" ]; then + if [ "$E2E_PLATFORM" == "arm64" ]; then KEEP_TEMPS_CMD_STR="--keep-temps" fi diff --git a/test/scripts/e2e_client_runner.py b/test/scripts/e2e_client_runner.py index 79b53a291b..0156bc7ae8 100755 --- a/test/scripts/e2e_client_runner.py +++ b/test/scripts/e2e_client_runner.py @@ -372,6 +372,7 @@ def xrun(cmd, *args, **kwargs): timeout = kwargs.pop('timeout', None) kwargs['stdout'] = subprocess.PIPE kwargs['stderr'] = subprocess.STDOUT + stdout = stderr = None try: p = subprocess.Popen(cmd, *args, **kwargs) except Exception as e: From 370d82891a940d70b8f9d0fa0392c87481d1fbaf Mon Sep 17 00:00:00 2001 From: Will Winder Date: Wed, 4 May 2022 00:53:11 -0400 Subject: [PATCH 05/34] Support e2e-go tests when repo is not installed in GOPATH. (#3949) Running e2e go tests fails when the repo is not cloned inside the GOPATH. This change looks up the current directory using runtime.Caller as an alternative to hard coding the GOPATH location. --- test/framework/fixtures/baseFixture.go | 13 ++++++++++++- test/framework/fixtures/expectFixture.go | 5 +---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/test/framework/fixtures/baseFixture.go b/test/framework/fixtures/baseFixture.go index c14203f159..37086e5365 100644 --- a/test/framework/fixtures/baseFixture.go +++ b/test/framework/fixtures/baseFixture.go @@ -20,6 +20,8 @@ import ( "fmt" "io/ioutil" "os" + "path" + "runtime" "testing" "github.com/algorand/go-algorand/config" @@ -35,6 +37,15 @@ type baseFixture struct { instance Fixture } +func getTestDir() string { + _, filename, _, ok := runtime.Caller(0) + if ok { + return path.Join(path.Dir(filename), "..", "..") + } + // fallback to the legacy GOPATH location. + return os.ExpandEnv("${GOPATH}/src/github.com/algorand/go-algorand/test/") +} + func (f *baseFixture) initialize(instance Fixture) { f.instance = instance f.Config = config.Protocol @@ -49,7 +60,7 @@ func (f *baseFixture) initialize(instance Fixture) { } f.testDataDir = os.Getenv("TESTDATADIR") if f.testDataDir == "" { - f.testDataDir = os.ExpandEnv("${GOPATH}/src/github.com/algorand/go-algorand/test/testdata") + f.testDataDir = path.Join(getTestDir(), "testdata") } } diff --git a/test/framework/fixtures/expectFixture.go b/test/framework/fixtures/expectFixture.go index 8d5bc9d5b1..f1134296af 100644 --- a/test/framework/fixtures/expectFixture.go +++ b/test/framework/fixtures/expectFixture.go @@ -25,7 +25,6 @@ import ( "path" "path/filepath" "regexp" - "runtime" "strings" "testing" @@ -58,9 +57,7 @@ func (ef *ExpectFixture) initialize(t *testing.T) (err error) { } ef.testDataDir = os.Getenv("TESTDATADIR") if ef.testDataDir == "" { - // Default to test/testdata in the source tree being tested - _, path, _, _ := runtime.Caller(0) - ef.testDataDir = filepath.Join(filepath.Dir(path), "../../testdata") + ef.testDataDir = filepath.Join(getTestDir(), "testdata") } ef.testFilter = os.Getenv("TESTFILTER") From 704e0b474168c6d0f73945fb9f2bf6849215e080 Mon Sep 17 00:00:00 2001 From: Jason Paulos Date: Thu, 5 May 2022 06:47:48 -0700 Subject: [PATCH 06/34] AVM: Unify inner transaction ID calculation (#3927) Unifies the inner transaction ID calculation with a new consensus parameter, UnifyInnerTxIDs. Co-authored-by: Ben Guidarelli --- config/consensus.go | 5 + data/transactions/logic/eval.go | 81 +- data/transactions/logic/evalAppTxn_test.go | 898 ++++++++++++++++++++- data/transactions/logic/eval_test.go | 2 + 4 files changed, 977 insertions(+), 9 deletions(-) diff --git a/config/consensus.go b/config/consensus.go index 7dbe2b7ab7..cb9e1c65e4 100644 --- a/config/consensus.go +++ b/config/consensus.go @@ -432,6 +432,9 @@ type ConsensusParams struct { // The hard-limit for number of StateProof keys is derived from the maximum depth allowed for the merkle signature scheme's tree - 2^16. // More keys => deeper merkle tree => longer proof required => infeasible for our SNARK. MaxKeyregValidPeriod uint64 + + // UnifyInnerTxIDs enables a consistent, unified way of computing inner transaction IDs + UnifyInnerTxIDs bool } // PaysetCommitType enumerates possible ways for the block header to commit to @@ -1139,6 +1142,8 @@ func initConsensusProtocols() { vFuture.LogicSigVersion = 7 vFuture.MinInnerApplVersion = 4 + vFuture.UnifyInnerTxIDs = true + Consensus[protocol.ConsensusFuture] = vFuture } diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go index 3a38c58876..e621ef38e8 100644 --- a/data/transactions/logic/eval.go +++ b/data/transactions/logic/eval.go @@ -271,7 +271,8 @@ type EvalParams struct { // Cache the txid hashing, but do *not* share this into inner EvalParams, as // the key is just the index in the txgroup. - txidCache map[int]transactions.Txid + txidCache map[int]transactions.Txid + innerTxidCache map[int]transactions.Txid // The calling context, if this is an inner app call caller *EvalContext @@ -2185,23 +2186,84 @@ func TxnFieldToTealValue(txn *transactions.Transaction, groupIndex int, field Tx return sv.toTealValue(), err } -func (cx *EvalContext) getTxID(txn *transactions.Transaction, groupIndex int) transactions.Txid { +// currentTxID is a convenience method to get the Txid for the txn being evaluated +func (cx *EvalContext) currentTxID() transactions.Txid { + if cx.Proto.UnifyInnerTxIDs { + // can't just return cx.txn.ID() because I might be an inner txn + return cx.getTxID(&cx.txn.Txn, cx.groupIndex, false) + } + + // original behavior, for backwards comatability + return cx.txn.ID() +} + +// getTxIDNotUnified is a backwards-compatible getTxID used when the consensus param UnifyInnerTxIDs +// is false. DO NOT call directly, and DO NOT change its behavior +func (cx *EvalContext) getTxIDNotUnified(txn *transactions.Transaction, groupIndex int) transactions.Txid { + if cx.EvalParams.txidCache == nil { + cx.EvalParams.txidCache = make(map[int]transactions.Txid, len(cx.TxnGroup)) + } + + txid, ok := cx.EvalParams.txidCache[groupIndex] + if !ok { + if cx.caller != nil { + innerOffset := len(cx.caller.txn.EvalDelta.InnerTxns) + txid = txn.InnerID(cx.caller.txn.ID(), innerOffset+groupIndex) + } else { + txid = txn.ID() + } + cx.EvalParams.txidCache[groupIndex] = txid + } + + return txid +} + +func (cx *EvalContext) getTxID(txn *transactions.Transaction, groupIndex int, inner bool) transactions.Txid { + // inner indicates that groupIndex is an index into the most recent inner txn group + if cx.EvalParams == nil { // Special case, called through TxnFieldToTealValue. No EvalParams, no caching. return txn.ID() } + if !cx.Proto.UnifyInnerTxIDs { + // original behavior, for backwards comatability + return cx.getTxIDNotUnified(txn, groupIndex) + } + + if inner { + // Initialize innerTxidCache if necessary + if cx.EvalParams.innerTxidCache == nil { + cx.EvalParams.innerTxidCache = make(map[int]transactions.Txid) + } + + txid, ok := cx.EvalParams.innerTxidCache[groupIndex] + if !ok { + // We're referencing an inner and the current txn is the parent + myTxid := cx.currentTxID() + lastGroupLen := len(cx.getLastInnerGroup()) + // innerIndex is the referenced inner txn's index in cx.txn.EvalDelta.InnerTxns + innerIndex := len(cx.txn.EvalDelta.InnerTxns) - lastGroupLen + groupIndex + txid = txn.InnerID(myTxid, innerIndex) + cx.EvalParams.innerTxidCache[groupIndex] = txid + } + + return txid + } + // Initialize txidCache if necessary if cx.EvalParams.txidCache == nil { cx.EvalParams.txidCache = make(map[int]transactions.Txid, len(cx.TxnGroup)) } - // Hashes are expensive, so we cache computed TxIDs txid, ok := cx.EvalParams.txidCache[groupIndex] if !ok { if cx.caller != nil { - innerOffset := len(cx.caller.txn.EvalDelta.InnerTxns) - txid = txn.InnerID(cx.caller.txn.ID(), innerOffset+groupIndex) + // We're referencing a peer txn, not my inner, but I am an inner + parentTxid := cx.caller.currentTxID() + innerIndex := len(cx.caller.txn.EvalDelta.InnerTxns) + groupIndex + txid = txn.InnerID(parentTxid, innerIndex) } else { + // We're referencing a peer txn and I am not an inner txid = txn.ID() } cx.EvalParams.txidCache[groupIndex] = txid @@ -2276,7 +2338,7 @@ func (cx *EvalContext) txnFieldToStack(stxn *transactions.SignedTxnWithAD, fs *t case GroupIndex: sv.Uint = uint64(groupIndex) case TxID: - txid := cx.getTxID(txn, groupIndex) + txid := cx.getTxID(txn, groupIndex, inner) sv.Bytes = txid[:] case Lease: sv.Bytes = txn.Lease[:] @@ -4495,7 +4557,7 @@ func opItxnSubmit(cx *EvalContext) error { var parent transactions.Txid isGroup := len(cx.subtxns) > 1 if isGroup { - parent = cx.txn.ID() + parent = cx.currentTxID() } for itx := range cx.subtxns { // The goal is to follow the same invariants used by the @@ -4579,6 +4641,9 @@ func opItxnSubmit(cx *EvalContext) error { if isGroup { innerOffset := len(cx.txn.EvalDelta.InnerTxns) + if cx.Proto.UnifyInnerTxIDs { + innerOffset += itx + } group.TxGroupHashes = append(group.TxGroupHashes, crypto.Digest(cx.subtxns[itx].Txn.InnerID(parent, innerOffset))) } @@ -4609,6 +4674,8 @@ func opItxnSubmit(cx *EvalContext) error { } cx.txn.EvalDelta.InnerTxns = append(cx.txn.EvalDelta.InnerTxns, ep.TxnGroup...) cx.subtxns = nil + // must clear the inner txid cache, otherwise prior inner txids will be returned for this group + cx.innerTxidCache = nil return nil } diff --git a/data/transactions/logic/evalAppTxn_test.go b/data/transactions/logic/evalAppTxn_test.go index 2ccd94e3e7..7815996e00 100644 --- a/data/transactions/logic/evalAppTxn_test.go +++ b/data/transactions/logic/evalAppTxn_test.go @@ -22,6 +22,7 @@ import ( "strings" "testing" + "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/transactions" . "github.com/algorand/go-algorand/data/transactions/logic" @@ -1276,16 +1277,81 @@ func TestInnerTxIDs(t *testing.T) { itxn_begin int appl; itxn_field TypeEnum int 222; itxn_field ApplicationID -itxn_submit; +itxn_submit + +itxn TxID +itxn Logs 0 +== + itxn Logs 0 itxn_begin int appl; itxn_field TypeEnum int 222; itxn_field ApplicationID -itxn_submit; +itxn_submit + itxn Logs 0 +!= +&& + +itxn TxID +itxn Logs 0 +== +&& +`, ep) + + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 Logs 0 +gitxn 1 Logs 0 +!= +gitxn 0 Logs 0 +gitxn 0 TxID +== +&& + +gitxn 1 Logs 0 +gitxn 1 TxID +== +&& + +gitxn 1 Logs 0 +gitxn 0 Logs 0 + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 Logs 0 +!= + +gitxn 1 Logs 0 +uncover 2 != +&& +&& + +gitxn 0 Logs 0 +gitxn 0 TxID +== +&& + +gitxn 1 Logs 0 +gitxn 1 TxID +== +&& `, ep) } @@ -1352,6 +1418,834 @@ itxn Logs 0 `, ep) } +// TestTxIDAndGroupIDCalculation tests that the TxIDs reported with `txn TxID` and group IDs +// reported with `global GroupID` are correct for top-level and inner transactions +func TestTxIDAndGroupIDCalculation(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + withoutGroupID := func(txn transactions.Transaction) transactions.Transaction { + txn.Group = crypto.Digest{} + return txn + } + + type actualInfo struct { + txn transactions.Transaction + claimedTxID []byte + claimedGroup []byte + } + + type expectedInfo struct { + expectedTxID transactions.Txid + expectedGroup crypto.Digest + } + + // this test performs a 3-level fanout of transactions: + // + // Parent + // ├─ Child A + // │ ├── atomic group + // │ ├─ Grandchild A-A + // │ ├─ Grandchild A-B + // │ ├── atomic group + // │ ├─ Grandchild A-C + // │ ├─ Grandchild A-D + // ├─ Child B + // │ ├── atomic group + // │ ├─ Grandchild B-A + // │ ├─ Grandchild B-B + // │ ├── atomic group + // │ ├─ Grandchild B-C + // │ ├─ Grandchild B-D + // + // When linearized, we use the following breadth-first search ordering: + // Parent, Child A, Child B, Grandchild A-A, Grandchild A-B, Grandchild A-C, Grandchild A-D, + // Grandchild B-A, Grandchild B-B, Grandchild B-C, Grandchild B-D + + // verifyTxIDs takes the linear ordering of transactions and their claimed TxIDs and GroupIDs in + // the txnInfo array and verifies that the claimed IDs are correct + verifyTxIDs := func(t *testing.T, unified bool, actual [11]actualInfo) { + parentIndex := 0 + childAIndex := 1 + childBIndex := 2 + grandchildAAIndex := 3 + grandchildABIndex := 4 + grandchildACIndex := 5 + grandchildADIndex := 6 + grandchildBAIndex := 7 + grandchildBBIndex := 8 + grandchildBCIndex := 9 + grandchildBDIndex := 10 + + var expected [11]expectedInfo + + parentTxID := actual[parentIndex].txn.ID() + require.Equal(t, transactions.Txid{0x7c, 0x68, 0xa2, 0xfd, 0xcc, 0xd4, 0x1b, 0x17, 0xc4, 0xc1, 0x8a, 0x2, 0xf6, 0x2f, 0x6a, 0x85, 0xce, 0x7a, 0x71, 0xe0, 0x60, 0x9a, 0xb9, 0x85, 0xa2, 0x39, 0xc7, 0x78, 0x83, 0x41, 0xf2, 0x2}, parentTxID) + expected[parentIndex].expectedTxID = parentTxID + + childAtxn := actual[childAIndex].txn + childAtxid := childAtxn.InnerID(parentTxID, 0) + require.Equal(t, transactions.Txid{0x6f, 0x8, 0xf1, 0x5f, 0xfc, 0xa5, 0x4a, 0x58, 0x6c, 0xc0, 0x80, 0x13, 0xb4, 0xb4, 0x4c, 0x19, 0x68, 0x5a, 0x66, 0xfc, 0xef, 0xe2, 0xed, 0x3c, 0xbd, 0xd5, 0x54, 0x8c, 0xb9, 0x28, 0xd0, 0x72}, childAtxid) + expected[childAIndex].expectedTxID = childAtxid + + childBtxn := actual[childBIndex].txn + childBtxid := childBtxn.InnerID(parentTxID, 1) + require.Equal(t, transactions.Txid{0xcc, 0x6f, 0x61, 0xbd, 0xd5, 0x76, 0x92, 0xa0, 0x56, 0x8d, 0x45, 0xbc, 0x2c, 0x95, 0x9d, 0xe4, 0x41, 0x29, 0x2d, 0x9c, 0xd1, 0x4, 0xbb, 0xa7, 0x52, 0x63, 0x9a, 0xe3, 0x22, 0xa9, 0xf0, 0xc5}, childBtxid) + expected[childBIndex].expectedTxID = childBtxid + + var gcAAtxid, gcABtxid, gcACtxid, gcADtxid, gcBAtxid, gcBBtxid, gcBCtxid, gcBDtxid transactions.Txid + var gcAABgroup, gcACDgroup, gcBABgroup, gcBCDgroup crypto.Digest + + if unified { + gcAAtxid = actual[grandchildAAIndex].txn.InnerID(childAtxid, 0) + require.Equal(t, transactions.Txid{0x6a, 0xef, 0x5f, 0x69, 0x2b, 0xce, 0xfc, 0x5b, 0x43, 0xa, 0x23, 0x79, 0x52, 0x49, 0xc7, 0x40, 0x66, 0x29, 0xf0, 0xbe, 0x4, 0x48, 0xe4, 0x55, 0x48, 0x8, 0x53, 0xdc, 0xb, 0x8c, 0x22, 0x48}, gcAAtxid) + gcABtxid = actual[grandchildABIndex].txn.InnerID(childAtxid, 1) + require.Equal(t, transactions.Txid{0xd4, 0x5d, 0xf0, 0xd8, 0x24, 0x15, 0x75, 0xfc, 0xea, 0x1d, 0x5f, 0x60, 0xd4, 0x77, 0x94, 0xe4, 0xb8, 0x48, 0xbd, 0x40, 0x2d, 0xf2, 0x82, 0x8d, 0x88, 0xd5, 0xaf, 0xd0, 0xa3, 0x29, 0x63, 0xd3}, gcABtxid) + gcAABgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildAAIndex].txn).InnerID(childAtxid, 0)), + crypto.Digest(withoutGroupID(actual[grandchildABIndex].txn).InnerID(childAtxid, 1)), + }, + }) + require.Equal(t, crypto.Digest{0xb4, 0x0, 0x71, 0x2a, 0xee, 0x7f, 0x4, 0x20, 0x55, 0xf8, 0xf9, 0x8f, 0xaf, 0x12, 0x82, 0x57, 0x2, 0x45, 0xe9, 0x16, 0x45, 0x22, 0xc3, 0x22, 0xfb, 0x1a, 0x23, 0x4d, 0x78, 0xfe, 0xa1, 0x42}, gcAABgroup) + + gcACtxid = actual[grandchildACIndex].txn.InnerID(childAtxid, 2) + require.Equal(t, transactions.Txid{0xb3, 0xb1, 0xac, 0xbe, 0x41, 0x5, 0x32, 0x9f, 0x8d, 0x22, 0x5, 0x5, 0xfe, 0x2d, 0x3, 0xb5, 0x7e, 0xcd, 0x8e, 0xbc, 0x8d, 0xf, 0x63, 0x89, 0xca, 0xa7, 0xe1, 0xdf, 0x82, 0x89, 0xd0, 0x71}, gcACtxid) + gcADtxid = actual[grandchildADIndex].txn.InnerID(childAtxid, 3) + require.Equal(t, transactions.Txid{0xc6, 0x8, 0x14, 0xd, 0x8f, 0xf0, 0xcf, 0xb1, 0xf4, 0x52, 0xb0, 0x3f, 0xd9, 0x15, 0x28, 0xba, 0x1c, 0xed, 0xb6, 0x8c, 0x62, 0x5e, 0x5e, 0x77, 0xde, 0xd, 0xdc, 0x26, 0xc7, 0x80, 0xbe, 0x82}, gcADtxid) + gcACDgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildACIndex].txn).InnerID(childAtxid, 2)), + crypto.Digest(withoutGroupID(actual[grandchildADIndex].txn).InnerID(childAtxid, 3)), + }, + }) + require.Equal(t, crypto.Digest{0x45, 0xce, 0x49, 0xe6, 0xa6, 0xbe, 0xa7, 0x4d, 0xb1, 0x66, 0x5d, 0xaa, 0xf6, 0xf0, 0xda, 0x78, 0x77, 0x3d, 0x6f, 0x97, 0x65, 0xd7, 0x27, 0x1, 0x82, 0x6a, 0x2c, 0xe0, 0x4c, 0xd8, 0x3b, 0x2}, gcACDgroup) + + gcBAtxid = actual[grandchildBAIndex].txn.InnerID(childBtxid, 0) + require.Equal(t, transactions.Txid{0x13, 0x3c, 0x92, 0xab, 0x12, 0xee, 0x1c, 0xf0, 0x24, 0xd1, 0x76, 0x2e, 0x7a, 0x56, 0xcb, 0xef, 0x45, 0x19, 0x42, 0xce, 0xe5, 0x6f, 0xbc, 0xaa, 0xb3, 0x17, 0x5e, 0x59, 0x18, 0x64, 0x9e, 0xe4}, gcBAtxid) + gcBBtxid = actual[grandchildBBIndex].txn.InnerID(childBtxid, 1) + require.Equal(t, transactions.Txid{0x6c, 0x44, 0x79, 0x59, 0x22, 0x51, 0x5a, 0x79, 0xfe, 0xd3, 0x7c, 0xbc, 0xc4, 0x68, 0xac, 0x32, 0x77, 0x61, 0x89, 0xd0, 0xbb, 0xbd, 0xaa, 0x8d, 0xeb, 0xd4, 0x2, 0xe8, 0xd6, 0x45, 0x50, 0xf6}, gcBBtxid) + gcBABgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildBAIndex].txn).InnerID(childBtxid, 0)), + crypto.Digest(withoutGroupID(actual[grandchildBBIndex].txn).InnerID(childBtxid, 1)), + }, + }) + require.Equal(t, crypto.Digest{0x48, 0x7c, 0x9, 0x76, 0xbc, 0x43, 0x65, 0x7a, 0x1d, 0xdc, 0xfb, 0x68, 0x47, 0x12, 0x8b, 0x80, 0xd2, 0xdd, 0xff, 0x22, 0x1b, 0xe1, 0x89, 0xcc, 0xb5, 0xb3, 0x94, 0xa4, 0x49, 0x63, 0xd8, 0x10}, gcBABgroup) + + gcBCtxid = actual[grandchildBCIndex].txn.InnerID(childBtxid, 2) + require.Equal(t, transactions.Txid{0x77, 0x48, 0x58, 0x4d, 0x94, 0x14, 0x7a, 0xf3, 0x75, 0x7f, 0x1e, 0x4d, 0xd5, 0x8, 0x21, 0x55, 0x47, 0x69, 0x67, 0x59, 0xd2, 0x48, 0xe6, 0x92, 0x1b, 0xf5, 0xae, 0x1, 0x10, 0xbe, 0x29, 0x5a}, gcBCtxid) + gcBDtxid = actual[grandchildBDIndex].txn.InnerID(childBtxid, 3) + require.Equal(t, transactions.Txid{0xcd, 0x15, 0x47, 0x3f, 0x42, 0xf5, 0x9c, 0x4a, 0x11, 0xa4, 0xe3, 0x92, 0x30, 0xf, 0x97, 0x1d, 0x3b, 0x1, 0x7, 0xbc, 0x1f, 0x3f, 0xcc, 0x9d, 0x43, 0x5b, 0xb2, 0xa4, 0x15, 0x8b, 0x89, 0x4e}, gcBDtxid) + gcBCDgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildBCIndex].txn).InnerID(childBtxid, 2)), + crypto.Digest(withoutGroupID(actual[grandchildBDIndex].txn).InnerID(childBtxid, 3)), + }, + }) + require.Equal(t, crypto.Digest{0x96, 0x90, 0x1, 0x64, 0x24, 0xa5, 0xda, 0x4, 0x3d, 0xd, 0x40, 0xc9, 0xf6, 0xfa, 0xc3, 0xa6, 0x26, 0x19, 0xd3, 0xf0, 0xb7, 0x28, 0x87, 0xf8, 0x5a, 0xd1, 0xa7, 0xbc, 0x1d, 0xad, 0x8b, 0xfc}, gcBCDgroup) + } else { + // these calculations are "wrong," but they're here to maintain backwards compatability with the original implementation + + gcAAtxid = actual[grandchildAAIndex].txn.InnerID(childAtxn.ID(), 0) + require.Equal(t, transactions.Txid{0xb5, 0xa, 0x16, 0x90, 0x78, 0x21, 0xf6, 0x96, 0x1b, 0x9c, 0x72, 0x5e, 0xf4, 0x8b, 0xe7, 0xb8, 0x2b, 0xd, 0x74, 0xd4, 0x71, 0xa2, 0x43, 0xb0, 0xfc, 0x19, 0xbc, 0x1c, 0xda, 0x95, 0x8f, 0xd0}, gcAAtxid) + gcABtxid = actual[grandchildABIndex].txn.InnerID(childAtxn.ID(), 1) + require.Equal(t, transactions.Txid{0xb3, 0x9, 0x9e, 0x95, 0x79, 0xe4, 0xe4, 0x58, 0xed, 0xee, 0x1b, 0xdb, 0x21, 0x7, 0x0, 0x7b, 0x35, 0xfc, 0x19, 0xef, 0xd6, 0x61, 0xde, 0x9b, 0xf3, 0x1b, 0x4a, 0x84, 0xa, 0xa, 0x7, 0x42}, gcABtxid) + gcAABgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildAAIndex].txn).InnerID(childAtxn.ID(), 0)), + crypto.Digest(withoutGroupID(actual[grandchildABIndex].txn).InnerID(childAtxn.ID(), 0)), + }, + }) + require.Equal(t, crypto.Digest{0xbc, 0xd8, 0xa1, 0xff, 0x96, 0xd4, 0x2b, 0x39, 0xc3, 0x1e, 0x9b, 0x26, 0xf3, 0xc, 0x78, 0x18, 0x83, 0x40, 0xe0, 0xf0, 0xa5, 0xeb, 0xc3, 0x63, 0xc8, 0xac, 0xec, 0xdb, 0x1, 0x36, 0xf9, 0xa}, gcAABgroup) + + gcACtxid = actual[grandchildACIndex].txn.InnerID(childAtxn.ID(), 2) + require.Equal(t, transactions.Txid{0xf5, 0x62, 0x52, 0xc, 0xe7, 0x4b, 0x49, 0x11, 0xd9, 0x96, 0xdb, 0x7b, 0xdc, 0x43, 0xf0, 0x89, 0x82, 0x65, 0xa9, 0x40, 0xc1, 0x1b, 0x6a, 0x5, 0x50, 0xd6, 0x96, 0x29, 0x6d, 0xe8, 0x23, 0x21}, gcACtxid) + gcADtxid = actual[grandchildADIndex].txn.InnerID(childAtxn.ID(), 3) + require.Equal(t, transactions.Txid{0xb2, 0x0, 0x9c, 0xae, 0x29, 0x18, 0x71, 0x19, 0xa1, 0xae, 0x82, 0x4a, 0x1d, 0xb2, 0x75, 0xaa, 0xe7, 0xbc, 0x1f, 0xcd, 0xd3, 0x9e, 0x48, 0xbb, 0x57, 0xc7, 0xbc, 0xf3, 0xab, 0xba, 0xf8, 0x3e}, gcADtxid) + gcACDgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildACIndex].txn).InnerID(childAtxn.ID(), 2)), + crypto.Digest(withoutGroupID(actual[grandchildADIndex].txn).InnerID(childAtxn.ID(), 2)), + }, + }) + require.Equal(t, crypto.Digest{0x72, 0x6d, 0xad, 0x41, 0x1c, 0x6b, 0x71, 0x1d, 0x4a, 0xe8, 0xf8, 0x82, 0x7, 0xf6, 0x37, 0xb9, 0x5d, 0x80, 0xc7, 0xf8, 0x86, 0x2d, 0xd5, 0xa1, 0x16, 0x29, 0x77, 0xc9, 0x44, 0xf7, 0x0, 0xb2}, gcACDgroup) + + gcBAtxid = actual[grandchildBAIndex].txn.InnerID(childBtxn.ID(), 0) + require.Equal(t, transactions.Txid{0xb5, 0xa, 0x16, 0x90, 0x78, 0x21, 0xf6, 0x96, 0x1b, 0x9c, 0x72, 0x5e, 0xf4, 0x8b, 0xe7, 0xb8, 0x2b, 0xd, 0x74, 0xd4, 0x71, 0xa2, 0x43, 0xb0, 0xfc, 0x19, 0xbc, 0x1c, 0xda, 0x95, 0x8f, 0xd0}, gcBAtxid) + gcBBtxid = actual[grandchildBBIndex].txn.InnerID(childBtxn.ID(), 1) + require.Equal(t, transactions.Txid{0xb3, 0x9, 0x9e, 0x95, 0x79, 0xe4, 0xe4, 0x58, 0xed, 0xee, 0x1b, 0xdb, 0x21, 0x7, 0x0, 0x7b, 0x35, 0xfc, 0x19, 0xef, 0xd6, 0x61, 0xde, 0x9b, 0xf3, 0x1b, 0x4a, 0x84, 0xa, 0xa, 0x7, 0x42}, gcBBtxid) + gcBABgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildBAIndex].txn).InnerID(childBtxn.ID(), 0)), + crypto.Digest(withoutGroupID(actual[grandchildBBIndex].txn).InnerID(childBtxn.ID(), 0)), + }, + }) + require.Equal(t, crypto.Digest{0xbc, 0xd8, 0xa1, 0xff, 0x96, 0xd4, 0x2b, 0x39, 0xc3, 0x1e, 0x9b, 0x26, 0xf3, 0xc, 0x78, 0x18, 0x83, 0x40, 0xe0, 0xf0, 0xa5, 0xeb, 0xc3, 0x63, 0xc8, 0xac, 0xec, 0xdb, 0x1, 0x36, 0xf9, 0xa}, gcBABgroup) + + gcBCtxid = actual[grandchildBCIndex].txn.InnerID(childBtxn.ID(), 2) + require.Equal(t, transactions.Txid{0xf5, 0x62, 0x52, 0xc, 0xe7, 0x4b, 0x49, 0x11, 0xd9, 0x96, 0xdb, 0x7b, 0xdc, 0x43, 0xf0, 0x89, 0x82, 0x65, 0xa9, 0x40, 0xc1, 0x1b, 0x6a, 0x5, 0x50, 0xd6, 0x96, 0x29, 0x6d, 0xe8, 0x23, 0x21}, gcBCtxid) + gcBDtxid = actual[grandchildBDIndex].txn.InnerID(childBtxn.ID(), 3) + require.Equal(t, transactions.Txid{0xb2, 0x0, 0x9c, 0xae, 0x29, 0x18, 0x71, 0x19, 0xa1, 0xae, 0x82, 0x4a, 0x1d, 0xb2, 0x75, 0xaa, 0xe7, 0xbc, 0x1f, 0xcd, 0xd3, 0x9e, 0x48, 0xbb, 0x57, 0xc7, 0xbc, 0xf3, 0xab, 0xba, 0xf8, 0x3e}, gcBDtxid) + gcBCDgroup = crypto.HashObj(transactions.TxGroup{ + TxGroupHashes: []crypto.Digest{ + crypto.Digest(withoutGroupID(actual[grandchildBCIndex].txn).InnerID(childBtxn.ID(), 2)), + crypto.Digest(withoutGroupID(actual[grandchildBDIndex].txn).InnerID(childBtxn.ID(), 2)), + }, + }) + require.Equal(t, crypto.Digest{0x72, 0x6d, 0xad, 0x41, 0x1c, 0x6b, 0x71, 0x1d, 0x4a, 0xe8, 0xf8, 0x82, 0x7, 0xf6, 0x37, 0xb9, 0x5d, 0x80, 0xc7, 0xf8, 0x86, 0x2d, 0xd5, 0xa1, 0x16, 0x29, 0x77, 0xc9, 0x44, 0xf7, 0x0, 0xb2}, gcBCDgroup) + } + + expected[grandchildAAIndex] = expectedInfo{ + expectedTxID: gcAAtxid, + expectedGroup: gcAABgroup, + } + expected[grandchildABIndex] = expectedInfo{ + expectedTxID: gcABtxid, + expectedGroup: gcAABgroup, + } + expected[grandchildACIndex] = expectedInfo{ + expectedTxID: gcACtxid, + expectedGroup: gcACDgroup, + } + expected[grandchildADIndex] = expectedInfo{ + expectedTxID: gcADtxid, + expectedGroup: gcACDgroup, + } + expected[grandchildBAIndex] = expectedInfo{ + expectedTxID: gcBAtxid, + expectedGroup: gcBABgroup, + } + expected[grandchildBBIndex] = expectedInfo{ + expectedTxID: gcBBtxid, + expectedGroup: gcBABgroup, + } + expected[grandchildBCIndex] = expectedInfo{ + expectedTxID: gcBCtxid, + expectedGroup: gcBCDgroup, + } + expected[grandchildBDIndex] = expectedInfo{ + expectedTxID: gcBDtxid, + expectedGroup: gcBCDgroup, + } + + for i := range actual { + require.Equal(t, expected[i].expectedTxID[:], actual[i].claimedTxID, fmt.Sprintf("index=%d", i)) + require.Equal(t, expected[i].expectedGroup[:], actual[i].claimedGroup, fmt.Sprintf("index=%d", i)) + require.Equal(t, expected[i].expectedGroup, actual[i].txn.Group, fmt.Sprintf("index=%d", i)) + } + } + + parentAppID := basics.AppIndex(888) + childAppID := basics.AppIndex(222) + grandchildAppID := basics.AppIndex(333) + + grandchildSource := ` +txn TxID +log + +global GroupID +log + +int 1 +` + + childSource := ` +txn TxID +log + +global GroupID +log + +itxn_begin +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit + +itxn_begin +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit + +int 1 +` + + parentSource := ` +txn TxID +log + +global GroupID +log + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 333; itxn_field Applications +itxn_submit + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 333; itxn_field Applications +itxn_submit + +int 1 +` + + for _, unified := range []bool{true, false} { + t.Run(fmt.Sprintf("unified=%t", unified), func(t *testing.T) { + t.Parallel() + + ep, parentTx, ledger := MakeSampleEnv() + ep.Proto.UnifyInnerTxIDs = unified + + parentTx.ApplicationID = parentAppID + parentTx.ForeignApps = []basics.AppIndex{ + childAppID, + grandchildAppID, + } + + grandchild := TestProg(t, grandchildSource, AssemblerMaxVersion) + ledger.NewApp(parentTx.Receiver, grandchildAppID, basics.AppParams{ + ApprovalProgram: grandchild.Program, + }) + + child := TestProg(t, childSource, AssemblerMaxVersion) + ledger.NewApp(parentTx.Receiver, childAppID, basics.AppParams{ + ApprovalProgram: child.Program, + }) + ledger.NewAccount(childAppID.Address(), 50_000) + + ledger.NewApp(parentTx.Receiver, parentAppID, basics.AppParams{}) + ledger.NewAccount(parentAppID.Address(), 50_000) + + parentEd := TestApp(t, parentSource, ep) + + require.Len(t, parentEd.Logs, 2) + require.Len(t, parentEd.InnerTxns, 2) + + childA := parentEd.InnerTxns[0] + require.Len(t, childA.EvalDelta.Logs, 2) + require.Len(t, childA.EvalDelta.InnerTxns, 4) + + childB := parentEd.InnerTxns[1] + require.Len(t, childB.EvalDelta.Logs, 2) + require.Len(t, childB.EvalDelta.InnerTxns, 4) + + gcAA := childA.EvalDelta.InnerTxns[0] + require.Len(t, gcAA.EvalDelta.Logs, 2) + require.Len(t, gcAA.EvalDelta.InnerTxns, 0) + + gcAB := childA.EvalDelta.InnerTxns[1] + require.Len(t, gcAB.EvalDelta.Logs, 2) + require.Len(t, gcAB.EvalDelta.InnerTxns, 0) + + gcAC := childA.EvalDelta.InnerTxns[2] + require.Len(t, gcAC.EvalDelta.Logs, 2) + require.Len(t, gcAC.EvalDelta.InnerTxns, 0) + + gcAD := childA.EvalDelta.InnerTxns[3] + require.Len(t, gcAD.EvalDelta.Logs, 2) + require.Len(t, gcAD.EvalDelta.InnerTxns, 0) + + gcBA := childB.EvalDelta.InnerTxns[0] + require.Len(t, gcBA.EvalDelta.Logs, 2) + require.Len(t, gcBA.EvalDelta.InnerTxns, 0) + + gcBB := childB.EvalDelta.InnerTxns[1] + require.Len(t, gcBB.EvalDelta.Logs, 2) + require.Len(t, gcBB.EvalDelta.InnerTxns, 0) + + gcBC := childB.EvalDelta.InnerTxns[2] + require.Len(t, gcBC.EvalDelta.Logs, 2) + require.Len(t, gcBC.EvalDelta.InnerTxns, 0) + + gcBD := childB.EvalDelta.InnerTxns[3] + require.Len(t, gcBD.EvalDelta.Logs, 2) + require.Len(t, gcBD.EvalDelta.InnerTxns, 0) + + toVerify := [...]actualInfo{ + { + txn: *parentTx, + claimedTxID: []byte(parentEd.Logs[0]), + claimedGroup: []byte(parentEd.Logs[1]), + }, + { + txn: childA.Txn, + claimedTxID: []byte(childA.EvalDelta.Logs[0]), + claimedGroup: []byte(childA.EvalDelta.Logs[1]), + }, + { + txn: childB.Txn, + claimedTxID: []byte(childB.EvalDelta.Logs[0]), + claimedGroup: []byte(childB.EvalDelta.Logs[1]), + }, + { + txn: gcAA.Txn, + claimedTxID: []byte(gcAA.EvalDelta.Logs[0]), + claimedGroup: []byte(gcAA.EvalDelta.Logs[1]), + }, + { + txn: gcAB.Txn, + claimedTxID: []byte(gcAB.EvalDelta.Logs[0]), + claimedGroup: []byte(gcAB.EvalDelta.Logs[1]), + }, + { + txn: gcAC.Txn, + claimedTxID: []byte(gcAC.EvalDelta.Logs[0]), + claimedGroup: []byte(gcAC.EvalDelta.Logs[1]), + }, + { + txn: gcAD.Txn, + claimedTxID: []byte(gcAD.EvalDelta.Logs[0]), + claimedGroup: []byte(gcAD.EvalDelta.Logs[1]), + }, + { + txn: gcBA.Txn, + claimedTxID: []byte(gcBA.EvalDelta.Logs[0]), + claimedGroup: []byte(gcBA.EvalDelta.Logs[1]), + }, + { + txn: gcBB.Txn, + claimedTxID: []byte(gcBB.EvalDelta.Logs[0]), + claimedGroup: []byte(gcBB.EvalDelta.Logs[1]), + }, + { + txn: gcBC.Txn, + claimedTxID: []byte(gcBC.EvalDelta.Logs[0]), + claimedGroup: []byte(gcBC.EvalDelta.Logs[1]), + }, + { + txn: gcBD.Txn, + claimedTxID: []byte(gcBD.EvalDelta.Logs[0]), + claimedGroup: []byte(gcBD.EvalDelta.Logs[1]), + }, + } + + verifyTxIDs(t, unified, toVerify) + }) + } +} + +// TestInnerTxIDCalculation tests that the TxIDs reported with `itxn TxID` and `gitxn X TxID` are +// correct for inner transactions +func TestInnerTxIDCalculation(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + type actualInfo struct { + txn transactions.Transaction + claimedTxID []byte + } + + // this test performs a 3-level fanout of transactions: + // + // Parent + // ├─ Child A + // │ ├── atomic group + // │ ├─ Grandchild A-A + // │ ├─ Grandchild A-B + // │ ├── atomic group + // │ ├─ Grandchild A-C + // │ ├─ Grandchild A-D + // ├─ Child B + // │ ├── atomic group + // │ ├─ Grandchild B-A + // │ ├─ Grandchild B-B + // │ ├── atomic group + // │ ├─ Grandchild B-C + // │ ├─ Grandchild B-D + // + // When linearized, we use the following breadth-first search ordering: + // Parent, Child A, Child B, Grandchild A-A, Grandchild A-B, Grandchild A-C, Grandchild A-D, + // Grandchild B-A, Grandchild B-B, Grandchild B-C, Grandchild B-D + + // verifyTxIDs takes the linear ordering of transactions and their claimed TxIDs in the txnInfo + // array and verifies that the claimed IDs are correct + verifyTxIDs := func(t *testing.T, unified bool, actual [11]actualInfo) { + parentIndex := 0 + childAIndex := 1 + childBIndex := 2 + grandchildAAIndex := 3 + grandchildABIndex := 4 + grandchildACIndex := 5 + grandchildADIndex := 6 + grandchildBAIndex := 7 + grandchildBBIndex := 8 + grandchildBCIndex := 9 + grandchildBDIndex := 10 + + var expected [11]transactions.Txid + + parentTxID := actual[parentIndex].txn.ID() + require.Equal(t, transactions.Txid{0x7c, 0x68, 0xa2, 0xfd, 0xcc, 0xd4, 0x1b, 0x17, 0xc4, 0xc1, 0x8a, 0x2, 0xf6, 0x2f, 0x6a, 0x85, 0xce, 0x7a, 0x71, 0xe0, 0x60, 0x9a, 0xb9, 0x85, 0xa2, 0x39, 0xc7, 0x78, 0x83, 0x41, 0xf2, 0x2}, parentTxID) + // leave expected[parentIndex] as the zero value since we don't want to test it + + childAtxn := actual[childAIndex].txn + childBtxn := actual[childBIndex].txn + + var childAtxid, childBtxid, gcAAtxid, gcABtxid, gcACtxid, gcADtxid, gcBAtxid, gcBBtxid, gcBCtxid, gcBDtxid transactions.Txid + + if unified { + childAtxid = childAtxn.InnerID(parentTxID, 0) + require.Equal(t, transactions.Txid{0x6f, 0x8, 0xf1, 0x5f, 0xfc, 0xa5, 0x4a, 0x58, 0x6c, 0xc0, 0x80, 0x13, 0xb4, 0xb4, 0x4c, 0x19, 0x68, 0x5a, 0x66, 0xfc, 0xef, 0xe2, 0xed, 0x3c, 0xbd, 0xd5, 0x54, 0x8c, 0xb9, 0x28, 0xd0, 0x72}, childAtxid) + childBtxid = childBtxn.InnerID(parentTxID, 1) + require.Equal(t, transactions.Txid{0xcc, 0x6f, 0x61, 0xbd, 0xd5, 0x76, 0x92, 0xa0, 0x56, 0x8d, 0x45, 0xbc, 0x2c, 0x95, 0x9d, 0xe4, 0x41, 0x29, 0x2d, 0x9c, 0xd1, 0x4, 0xbb, 0xa7, 0x52, 0x63, 0x9a, 0xe3, 0x22, 0xa9, 0xf0, 0xc5}, childBtxid) + + gcAAtxid = actual[grandchildAAIndex].txn.InnerID(childAtxid, 0) + require.Equal(t, transactions.Txid{0x6a, 0xef, 0x5f, 0x69, 0x2b, 0xce, 0xfc, 0x5b, 0x43, 0xa, 0x23, 0x79, 0x52, 0x49, 0xc7, 0x40, 0x66, 0x29, 0xf0, 0xbe, 0x4, 0x48, 0xe4, 0x55, 0x48, 0x8, 0x53, 0xdc, 0xb, 0x8c, 0x22, 0x48}, gcAAtxid) + gcABtxid = actual[grandchildABIndex].txn.InnerID(childAtxid, 1) + require.Equal(t, transactions.Txid{0xd4, 0x5d, 0xf0, 0xd8, 0x24, 0x15, 0x75, 0xfc, 0xea, 0x1d, 0x5f, 0x60, 0xd4, 0x77, 0x94, 0xe4, 0xb8, 0x48, 0xbd, 0x40, 0x2d, 0xf2, 0x82, 0x8d, 0x88, 0xd5, 0xaf, 0xd0, 0xa3, 0x29, 0x63, 0xd3}, gcABtxid) + + gcACtxid = actual[grandchildACIndex].txn.InnerID(childAtxid, 2) + require.Equal(t, transactions.Txid{0xb3, 0xb1, 0xac, 0xbe, 0x41, 0x5, 0x32, 0x9f, 0x8d, 0x22, 0x5, 0x5, 0xfe, 0x2d, 0x3, 0xb5, 0x7e, 0xcd, 0x8e, 0xbc, 0x8d, 0xf, 0x63, 0x89, 0xca, 0xa7, 0xe1, 0xdf, 0x82, 0x89, 0xd0, 0x71}, gcACtxid) + gcADtxid = actual[grandchildADIndex].txn.InnerID(childAtxid, 3) + require.Equal(t, transactions.Txid{0xc6, 0x8, 0x14, 0xd, 0x8f, 0xf0, 0xcf, 0xb1, 0xf4, 0x52, 0xb0, 0x3f, 0xd9, 0x15, 0x28, 0xba, 0x1c, 0xed, 0xb6, 0x8c, 0x62, 0x5e, 0x5e, 0x77, 0xde, 0xd, 0xdc, 0x26, 0xc7, 0x80, 0xbe, 0x82}, gcADtxid) + + gcBAtxid = actual[grandchildBAIndex].txn.InnerID(childBtxid, 0) + require.Equal(t, transactions.Txid{0x13, 0x3c, 0x92, 0xab, 0x12, 0xee, 0x1c, 0xf0, 0x24, 0xd1, 0x76, 0x2e, 0x7a, 0x56, 0xcb, 0xef, 0x45, 0x19, 0x42, 0xce, 0xe5, 0x6f, 0xbc, 0xaa, 0xb3, 0x17, 0x5e, 0x59, 0x18, 0x64, 0x9e, 0xe4}, gcBAtxid) + gcBBtxid = actual[grandchildBBIndex].txn.InnerID(childBtxid, 1) + require.Equal(t, transactions.Txid{0x6c, 0x44, 0x79, 0x59, 0x22, 0x51, 0x5a, 0x79, 0xfe, 0xd3, 0x7c, 0xbc, 0xc4, 0x68, 0xac, 0x32, 0x77, 0x61, 0x89, 0xd0, 0xbb, 0xbd, 0xaa, 0x8d, 0xeb, 0xd4, 0x2, 0xe8, 0xd6, 0x45, 0x50, 0xf6}, gcBBtxid) + + gcBCtxid = actual[grandchildBCIndex].txn.InnerID(childBtxid, 2) + require.Equal(t, transactions.Txid{0x77, 0x48, 0x58, 0x4d, 0x94, 0x14, 0x7a, 0xf3, 0x75, 0x7f, 0x1e, 0x4d, 0xd5, 0x8, 0x21, 0x55, 0x47, 0x69, 0x67, 0x59, 0xd2, 0x48, 0xe6, 0x92, 0x1b, 0xf5, 0xae, 0x1, 0x10, 0xbe, 0x29, 0x5a}, gcBCtxid) + gcBDtxid = actual[grandchildBDIndex].txn.InnerID(childBtxid, 3) + require.Equal(t, transactions.Txid{0xcd, 0x15, 0x47, 0x3f, 0x42, 0xf5, 0x9c, 0x4a, 0x11, 0xa4, 0xe3, 0x92, 0x30, 0xf, 0x97, 0x1d, 0x3b, 0x1, 0x7, 0xbc, 0x1f, 0x3f, 0xcc, 0x9d, 0x43, 0x5b, 0xb2, 0xa4, 0x15, 0x8b, 0x89, 0x4e}, gcBDtxid) + } else { + // these calculations are "wrong," but they're here to maintain backwards compatability with the original implementation + + childAtxid = childAtxn.ID() + require.Equal(t, transactions.Txid{0xc9, 0xa4, 0x41, 0xff, 0x9c, 0x62, 0x40, 0x6e, 0x63, 0xd9, 0x5, 0x19, 0x3b, 0x32, 0x43, 0x3d, 0xba, 0x80, 0x9f, 0xa3, 0xe4, 0xed, 0x2f, 0xa4, 0x19, 0x2b, 0x3f, 0x21, 0x96, 0xe2, 0xec, 0x21}, childAtxid) + childBtxid = childBtxn.ID() + require.Equal(t, transactions.Txid{0xc9, 0xa4, 0x41, 0xff, 0x9c, 0x62, 0x40, 0x6e, 0x63, 0xd9, 0x5, 0x19, 0x3b, 0x32, 0x43, 0x3d, 0xba, 0x80, 0x9f, 0xa3, 0xe4, 0xed, 0x2f, 0xa4, 0x19, 0x2b, 0x3f, 0x21, 0x96, 0xe2, 0xec, 0x21}, childBtxid) + + gcAAtxid = actual[grandchildAAIndex].txn.InnerID(parentTxID, 0) + require.Equal(t, transactions.Txid{0x9e, 0xfb, 0xb7, 0x5f, 0x2b, 0x9a, 0x59, 0x5f, 0xce, 0x3c, 0x90, 0x60, 0x66, 0x40, 0x4e, 0x80, 0x81, 0x90, 0x79, 0x51, 0xd2, 0x8f, 0xfe, 0xbf, 0x71, 0x76, 0x23, 0xc8, 0xd8, 0xb0, 0x28, 0x7d}, gcAAtxid) + gcABtxid = actual[grandchildABIndex].txn.InnerID(parentTxID, 1) + require.Equal(t, transactions.Txid{0x91, 0x9d, 0xdc, 0x8, 0xde, 0x4e, 0x86, 0xe8, 0xba, 0xa3, 0x2, 0xf6, 0x7, 0xe9, 0x1a, 0x6, 0x63, 0xe9, 0x46, 0xa8, 0xe4, 0xa1, 0x3e, 0xd3, 0x3e, 0xa4, 0x5c, 0xcb, 0xc0, 0xc5, 0x40, 0x55}, gcABtxid) + + // because of caching, these are the same :( + gcACtxid = gcAAtxid + gcADtxid = gcABtxid + + gcBAtxid = actual[grandchildBAIndex].txn.InnerID(parentTxID, 1) + require.Equal(t, transactions.Txid{0x91, 0x9d, 0xdc, 0x8, 0xde, 0x4e, 0x86, 0xe8, 0xba, 0xa3, 0x2, 0xf6, 0x7, 0xe9, 0x1a, 0x6, 0x63, 0xe9, 0x46, 0xa8, 0xe4, 0xa1, 0x3e, 0xd3, 0x3e, 0xa4, 0x5c, 0xcb, 0xc0, 0xc5, 0x40, 0x55}, gcBAtxid) + gcBBtxid = actual[grandchildBBIndex].txn.InnerID(parentTxID, 2) + require.Equal(t, transactions.Txid{0xa6, 0x90, 0x75, 0xf9, 0x20, 0x15, 0xd7, 0xf5, 0xa2, 0xca, 0xaa, 0x4b, 0x55, 0xdf, 0x8e, 0xa9, 0x97, 0xd8, 0x62, 0xc9, 0xb8, 0xdf, 0xc2, 0x8f, 0x9c, 0x60, 0x67, 0x2a, 0xdb, 0x27, 0xaa, 0x4d}, gcBBtxid) + + gcBCtxid = gcBAtxid + gcBDtxid = gcBBtxid + } + + expected[childBIndex] = childBtxid + expected[childAIndex] = childAtxid + expected[grandchildAAIndex] = gcAAtxid + expected[grandchildABIndex] = gcABtxid + expected[grandchildACIndex] = gcACtxid + expected[grandchildADIndex] = gcADtxid + expected[grandchildBAIndex] = gcBAtxid + expected[grandchildBBIndex] = gcBBtxid + expected[grandchildBCIndex] = gcBCtxid + expected[grandchildBDIndex] = gcBDtxid + + for i := range actual { + if i == 0 { + // don't test parent TxID + continue + } + require.Equal(t, expected[i][:], actual[i].claimedTxID, fmt.Sprintf("index=%d", i)) + } + } + + parentAppID := basics.AppIndex(888) + childAppID := basics.AppIndex(222) + grandchildAppID := basics.AppIndex(333) + + grandchildSource := "int 1" + childSource := ` +itxn_begin +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID +log +gitxn 1 TxID +log + +itxn_begin +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 333; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID +log +gitxn 1 TxID +log + +int 1 +` + parentSource := ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 333; itxn_field Applications +itxn_submit + +itxn TxID +log + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +int 333; itxn_field Applications +itxn_submit + +itxn TxID +log + +int 1 +` + + for _, unified := range []bool{true, false} { + t.Run(fmt.Sprintf("unified=%t", unified), func(t *testing.T) { + t.Parallel() + + ep, parentTx, ledger := MakeSampleEnv() + ep.Proto.UnifyInnerTxIDs = unified + + parentTx.ApplicationID = parentAppID + parentTx.ForeignApps = []basics.AppIndex{ + childAppID, + grandchildAppID, + } + + grandchild := TestProg(t, grandchildSource, AssemblerMaxVersion) + ledger.NewApp(parentTx.Receiver, grandchildAppID, basics.AppParams{ + ApprovalProgram: grandchild.Program, + }) + + child := TestProg(t, childSource, AssemblerMaxVersion) + ledger.NewApp(parentTx.Receiver, childAppID, basics.AppParams{ + ApprovalProgram: child.Program, + }) + ledger.NewAccount(childAppID.Address(), 50_000) + + ledger.NewApp(parentTx.Receiver, parentAppID, basics.AppParams{}) + ledger.NewAccount(parentAppID.Address(), 50_000) + + parentEd := TestApp(t, parentSource, ep) + + require.Len(t, parentEd.Logs, 2) + require.Len(t, parentEd.InnerTxns, 2) + + childA := parentEd.InnerTxns[0] + require.Len(t, childA.EvalDelta.Logs, 4) + require.Len(t, childA.EvalDelta.InnerTxns, 4) + + childB := parentEd.InnerTxns[1] + require.Len(t, childB.EvalDelta.Logs, 4) + require.Len(t, childB.EvalDelta.InnerTxns, 4) + + gcAA := childA.EvalDelta.InnerTxns[0] + require.Len(t, gcAA.EvalDelta.Logs, 0) + require.Len(t, gcAA.EvalDelta.InnerTxns, 0) + + gcAB := childA.EvalDelta.InnerTxns[1] + require.Len(t, gcAB.EvalDelta.Logs, 0) + require.Len(t, gcAB.EvalDelta.InnerTxns, 0) + + gcAC := childA.EvalDelta.InnerTxns[2] + require.Len(t, gcAC.EvalDelta.Logs, 0) + require.Len(t, gcAC.EvalDelta.InnerTxns, 0) + + gcAD := childA.EvalDelta.InnerTxns[3] + require.Len(t, gcAD.EvalDelta.Logs, 0) + require.Len(t, gcAD.EvalDelta.InnerTxns, 0) + + gcBA := childB.EvalDelta.InnerTxns[0] + require.Len(t, gcBA.EvalDelta.Logs, 0) + require.Len(t, gcBA.EvalDelta.InnerTxns, 0) + + gcBB := childB.EvalDelta.InnerTxns[1] + require.Len(t, gcBB.EvalDelta.Logs, 0) + require.Len(t, gcBB.EvalDelta.InnerTxns, 0) + + gcBC := childB.EvalDelta.InnerTxns[2] + require.Len(t, gcBC.EvalDelta.Logs, 0) + require.Len(t, gcBC.EvalDelta.InnerTxns, 0) + + gcBD := childB.EvalDelta.InnerTxns[3] + require.Len(t, gcBD.EvalDelta.Logs, 0) + require.Len(t, gcBD.EvalDelta.InnerTxns, 0) + + toVerify := [...]actualInfo{ + { + txn: *parentTx, + // leave claimedTxID as the zero value since we don't want to test it + }, + { + txn: childA.Txn, + claimedTxID: []byte(parentEd.Logs[0]), + }, + { + txn: childB.Txn, + claimedTxID: []byte(parentEd.Logs[1]), + }, + { + txn: gcAA.Txn, + claimedTxID: []byte(childA.EvalDelta.Logs[0]), + }, + { + txn: gcAB.Txn, + claimedTxID: []byte(childA.EvalDelta.Logs[1]), + }, + { + txn: gcAC.Txn, + claimedTxID: []byte(childA.EvalDelta.Logs[2]), + }, + { + txn: gcAD.Txn, + claimedTxID: []byte(childA.EvalDelta.Logs[3]), + }, + { + txn: gcBA.Txn, + claimedTxID: []byte(childB.EvalDelta.Logs[0]), + }, + { + txn: gcBB.Txn, + claimedTxID: []byte(childB.EvalDelta.Logs[1]), + }, + { + txn: gcBC.Txn, + claimedTxID: []byte(childB.EvalDelta.Logs[2]), + }, + { + txn: gcBD.Txn, + claimedTxID: []byte(childB.EvalDelta.Logs[3]), + }, + } + + verifyTxIDs(t, unified, toVerify) + }) + } +} + +func TestInnerTxIDCaching(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + parentAppID := basics.AppIndex(888) + childAppID := basics.AppIndex(222) + + for _, unified := range []bool{true, false} { + t.Run(fmt.Sprintf("unified=%t", unified), func(t *testing.T) { + t.Parallel() + + ep, parentTx, ledger := MakeSampleEnv() + ep.Proto.UnifyInnerTxIDs = unified + + shouldIDsBeEqual := byte(1) + if unified { + shouldIDsBeEqual = 0 + } + + parentTx.ApplicationID = parentAppID + parentTx.ForeignApps = []basics.AppIndex{childAppID} + parentTx.ApplicationArgs = [][]byte{{shouldIDsBeEqual}} + + child := TestProg(t, "int 1", AssemblerMaxVersion) + ledger.NewApp(parentTx.Receiver, childAppID, basics.AppParams{ + ApprovalProgram: child.Program, + }) + ledger.NewAccount(childAppID.Address(), 50_000) + + ledger.NewApp(parentTx.Receiver, parentAppID, basics.AppParams{}) + ledger.NewAccount(parentAppID.Address(), 50_000) + + // does `gitxn 0 TxID` hit the cache for `gtxn 0 TxID`? + TestApp(t, ` +gtxn 0 TxID +txn TxID +== +assert + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID +gtxn 0 TxID +== +txn ApplicationArgs 0 +btoi +== +`, ep) + + // does `gtxn 0 TxID` hit the cache for `gitxn 0 TxID`? + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID +gtxn 0 TxID +== +txn ApplicationArgs 0 +btoi +== +`, ep) + + // does the cache for `gitxn 0 TxID` reset after another inner executes? + TestApp(t, ` +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID + +itxn_begin +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_next +int appl; itxn_field TypeEnum +int 222; itxn_field ApplicationID +itxn_submit + +gitxn 0 TxID +== +txn ApplicationArgs 0 +btoi +== +`, ep) + }) + } +} + // TestGtixn confirms access to itxn groups func TestGtixn(t *testing.T) { partitiontest.PartitionTest(t) diff --git a/data/transactions/logic/eval_test.go b/data/transactions/logic/eval_test.go index df4f43856b..04b3741eb3 100644 --- a/data/transactions/logic/eval_test.go +++ b/data/transactions/logic/eval_test.go @@ -101,6 +101,8 @@ func makeTestProtoV(version uint64) *config.ConsensusParams { MinInnerApplVersion: 4, SupportBecomeNonParticipatingTransactions: true, + + UnifyInnerTxIDs: true, } } From 5925aff42ee4ba6ea8d23ac87e58a3d9ba97223e Mon Sep 17 00:00:00 2001 From: Eric Warehime Date: Mon, 9 May 2022 17:13:20 -0700 Subject: [PATCH 07/34] build: Bump golang to 1.17.9/Mac M1 Support (#3919) Bump go version to 1.17.9 Also includes //+build => //go:build generated via make sanity Fixed some data races discovered by 1.17 race detector --- .circleci/config.yml | 2 +- .github/workflows/build.yml | 2 +- .github/workflows/reviewdog.yml | 2 +- Makefile | 7 +++ agreement/msgp_gen_test.go | 1 + cmd/partitiontest_linter/go.mod | 2 +- compactcert/msgp_gen_test.go | 1 + crypto/compactcert/msgp_gen_test.go | 1 + crypto/merklearray/msgp_gen_test.go | 1 + crypto/merklesignature/msgp_gen_test.go | 1 + crypto/msgp_gen_test.go | 1 + crypto/secp256k1/dummy.go | 1 + .../secp256k1/libsecp256k1/contrib/dummy.go | 1 + crypto/secp256k1/libsecp256k1/dummy.go | 1 + .../secp256k1/libsecp256k1/include/dummy.go | 1 + crypto/secp256k1/libsecp256k1/src/dummy.go | 1 + .../libsecp256k1/src/modules/dummy.go | 1 + .../libsecp256k1/src/modules/ecdh/dummy.go | 1 + .../src/modules/recovery/dummy.go | 1 + crypto/secp256k1/panic_cb.go | 4 +- crypto/secp256k1/scalar_mult_cgo.go | 4 +- crypto/secp256k1/scalar_mult_nocgo.go | 1 + crypto/secp256k1/secp256.go | 4 +- daemon/algod/api/spec/v2/msgp_gen_test.go | 1 + data/account/msgp_gen_test.go | 1 + data/basics/msgp_gen_test.go | 1 + data/bookkeeping/msgp_gen_test.go | 1 + data/committee/msgp_gen_test.go | 1 + data/hashable/msgp_gen_test.go | 1 + data/transactions/msgp_gen_test.go | 1 + go.mod | 53 +++++++++++++------ go.sum | 15 +++--- ledger/ledgercore/msgp_gen_test.go | 1 + ledger/msgp_gen_test.go | 1 + libgoal/lockedFileLinux.go | 1 + libgoal/lockedFileUnix.go | 1 + libgoal/lockedFileWindows.go | 1 + network/messagetracer/graphtrace.go | 1 + node/msgp_gen_test.go | 1 + node/node.go | 18 +++---- nodecontrol/kmdControl_common.go | 1 + protocol/msgp_gen_test.go | 1 + protocol/test/msgp_gen_test.go | 1 + rpcs/msgp_gen_test.go | 1 + scripts/buildtools/go.mod | 2 +- scripts/get_golang_version.sh | 6 +-- tools/network/dnssec/config_unix.go | 1 + tools/network/dnssec/config_unix_test.go | 1 + tools/network/dnssec/config_windows.go | 1 + util/process_common.go | 1 + util/process_windows.go | 1 + util/util.go | 1 + 52 files changed, 112 insertions(+), 48 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 34828ef5e6..b911cafed1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -198,7 +198,7 @@ commands: shell: bash.exe command: | choco install -y msys2 pacman make wget --force - choco install -y golang --version=1.16.15 --force + choco install -y golang --version=1.17.9 --force choco install -y python3 --version=3.7.3 --force export msys2='cmd //C RefreshEnv.cmd ' export msys2+='& set MSYS=winsymlinks:nativestrict ' diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4cc8eaba40..825056b1e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -20,7 +20,7 @@ jobs: - name: Install golang uses: actions/setup-go@v2 with: - go-version: '1.16.15' + go-version: '1.17.9' - name: Build Test run: | export ALGORAND_DEADLOCK=enable diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 134685fc6e..6cc82a6e55 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -44,7 +44,7 @@ jobs: - name: Install specific golang uses: actions/setup-go@v2 with: - go-version: '1.16.15' + go-version: '1.17.9' - name: Create folders for golangci-lint run: mkdir -p cicdtmp/golangci-lint - name: Check if custom golangci-lint is already built diff --git a/Makefile b/Makefile index 90bcc70215..f55089890c 100644 --- a/Makefile +++ b/Makefile @@ -36,6 +36,13 @@ else export GOTESTCOMMAND=gotestsum --format pkgname --jsonfile testresults.json -- endif +# M1 Mac--homebrew install location in /opt/homebrew +ifeq ($(OS_TYPE), darwin) +ifeq ($(ARCH), arm64) +export CPATH=/opt/homebrew/include +export LIBRARY_PATH=/opt/homebrew/lib +endif +endif ifeq ($(UNAME), Linux) EXTLDFLAGS := -static-libstdc++ -static-libgcc ifeq ($(ARCH), amd64) diff --git a/agreement/msgp_gen_test.go b/agreement/msgp_gen_test.go index 4bfe9d0280..8d886e6562 100644 --- a/agreement/msgp_gen_test.go +++ b/agreement/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package agreement diff --git a/cmd/partitiontest_linter/go.mod b/cmd/partitiontest_linter/go.mod index 17a694f6de..3e9db30e99 100644 --- a/cmd/partitiontest_linter/go.mod +++ b/cmd/partitiontest_linter/go.mod @@ -1,6 +1,6 @@ module github.com/algorand/go-algorand/cmd/partitiontest_linter -go 1.16 +go 1.17 require golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 require golang.org/x/sys v0.0.0-20210510120138-977fb7262007 diff --git a/compactcert/msgp_gen_test.go b/compactcert/msgp_gen_test.go index 88c8395a37..52cbb5a3e4 100644 --- a/compactcert/msgp_gen_test.go +++ b/compactcert/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package compactcert diff --git a/crypto/compactcert/msgp_gen_test.go b/crypto/compactcert/msgp_gen_test.go index 23ebb5a3fd..f2a43f572d 100644 --- a/crypto/compactcert/msgp_gen_test.go +++ b/crypto/compactcert/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package compactcert diff --git a/crypto/merklearray/msgp_gen_test.go b/crypto/merklearray/msgp_gen_test.go index fbcc81970a..7715f75df3 100644 --- a/crypto/merklearray/msgp_gen_test.go +++ b/crypto/merklearray/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package merklearray diff --git a/crypto/merklesignature/msgp_gen_test.go b/crypto/merklesignature/msgp_gen_test.go index 9c73788c54..3ea42c77f0 100644 --- a/crypto/merklesignature/msgp_gen_test.go +++ b/crypto/merklesignature/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package merklesignature diff --git a/crypto/msgp_gen_test.go b/crypto/msgp_gen_test.go index 21be375fad..8a74a2852a 100644 --- a/crypto/msgp_gen_test.go +++ b/crypto/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package crypto diff --git a/crypto/secp256k1/dummy.go b/crypto/secp256k1/dummy.go index 7c86a7f42a..479e07dc8e 100644 --- a/crypto/secp256k1/dummy.go +++ b/crypto/secp256k1/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // This file is part of a workaround for `go mod vendor` which won't vendor diff --git a/crypto/secp256k1/libsecp256k1/contrib/dummy.go b/crypto/secp256k1/libsecp256k1/contrib/dummy.go index fda594be99..2c946210c5 100644 --- a/crypto/secp256k1/libsecp256k1/contrib/dummy.go +++ b/crypto/secp256k1/libsecp256k1/contrib/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/dummy.go b/crypto/secp256k1/libsecp256k1/dummy.go index 379b16992f..04bbe3d76e 100644 --- a/crypto/secp256k1/libsecp256k1/dummy.go +++ b/crypto/secp256k1/libsecp256k1/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/include/dummy.go b/crypto/secp256k1/libsecp256k1/include/dummy.go index 5af540c73c..64c71b8451 100644 --- a/crypto/secp256k1/libsecp256k1/include/dummy.go +++ b/crypto/secp256k1/libsecp256k1/include/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/src/dummy.go b/crypto/secp256k1/libsecp256k1/src/dummy.go index 65868f38a8..2df270adc3 100644 --- a/crypto/secp256k1/libsecp256k1/src/dummy.go +++ b/crypto/secp256k1/libsecp256k1/src/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/src/modules/dummy.go b/crypto/secp256k1/libsecp256k1/src/modules/dummy.go index 3c7a696439..99c538db51 100644 --- a/crypto/secp256k1/libsecp256k1/src/modules/dummy.go +++ b/crypto/secp256k1/libsecp256k1/src/modules/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/src/modules/ecdh/dummy.go b/crypto/secp256k1/libsecp256k1/src/modules/ecdh/dummy.go index b6fc38327e..48c2e0aa54 100644 --- a/crypto/secp256k1/libsecp256k1/src/modules/ecdh/dummy.go +++ b/crypto/secp256k1/libsecp256k1/src/modules/ecdh/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/libsecp256k1/src/modules/recovery/dummy.go b/crypto/secp256k1/libsecp256k1/src/modules/recovery/dummy.go index b9491f0cb9..8efbd7abe7 100644 --- a/crypto/secp256k1/libsecp256k1/src/modules/recovery/dummy.go +++ b/crypto/secp256k1/libsecp256k1/src/modules/recovery/dummy.go @@ -1,3 +1,4 @@ +//go:build dummy // +build dummy // Package c contains only a C file. diff --git a/crypto/secp256k1/panic_cb.go b/crypto/secp256k1/panic_cb.go index 5da2bea376..a30b04f51b 100644 --- a/crypto/secp256k1/panic_cb.go +++ b/crypto/secp256k1/panic_cb.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. -// +build !gofuzz -// +build cgo +//go:build !gofuzz && cgo +// +build !gofuzz,cgo package secp256k1 diff --git a/crypto/secp256k1/scalar_mult_cgo.go b/crypto/secp256k1/scalar_mult_cgo.go index 8e29d65b04..d1b4c8b20e 100644 --- a/crypto/secp256k1/scalar_mult_cgo.go +++ b/crypto/secp256k1/scalar_mult_cgo.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. -// +build !gofuzz -// +build cgo +//go:build !gofuzz && cgo +// +build !gofuzz,cgo package secp256k1 diff --git a/crypto/secp256k1/scalar_mult_nocgo.go b/crypto/secp256k1/scalar_mult_nocgo.go index 55756b5be8..22f53ac6ae 100644 --- a/crypto/secp256k1/scalar_mult_nocgo.go +++ b/crypto/secp256k1/scalar_mult_nocgo.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. +//go:build gofuzz || !cgo // +build gofuzz !cgo package secp256k1 diff --git a/crypto/secp256k1/secp256.go b/crypto/secp256k1/secp256.go index 067b5e6c50..7fbce862e1 100644 --- a/crypto/secp256k1/secp256.go +++ b/crypto/secp256k1/secp256.go @@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be found in // the LICENSE file. -// +build !gofuzz -// +build cgo +//go:build !gofuzz && cgo +// +build !gofuzz,cgo // Package secp256k1 wraps the bitcoin secp256k1 C library. package secp256k1 diff --git a/daemon/algod/api/spec/v2/msgp_gen_test.go b/daemon/algod/api/spec/v2/msgp_gen_test.go index 57bda723cf..2d3a842a22 100644 --- a/daemon/algod/api/spec/v2/msgp_gen_test.go +++ b/daemon/algod/api/spec/v2/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package v2 diff --git a/data/account/msgp_gen_test.go b/data/account/msgp_gen_test.go index 9bde0e5d83..ae68f3769f 100644 --- a/data/account/msgp_gen_test.go +++ b/data/account/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package account diff --git a/data/basics/msgp_gen_test.go b/data/basics/msgp_gen_test.go index 8756c3c4e1..90f62698a0 100644 --- a/data/basics/msgp_gen_test.go +++ b/data/basics/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package basics diff --git a/data/bookkeeping/msgp_gen_test.go b/data/bookkeeping/msgp_gen_test.go index 8bad965935..2315516af8 100644 --- a/data/bookkeeping/msgp_gen_test.go +++ b/data/bookkeeping/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package bookkeeping diff --git a/data/committee/msgp_gen_test.go b/data/committee/msgp_gen_test.go index 7a8946a6cb..084952c31c 100644 --- a/data/committee/msgp_gen_test.go +++ b/data/committee/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package committee diff --git a/data/hashable/msgp_gen_test.go b/data/hashable/msgp_gen_test.go index 131eaebe03..429712bd87 100644 --- a/data/hashable/msgp_gen_test.go +++ b/data/hashable/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package hashable diff --git a/data/transactions/msgp_gen_test.go b/data/transactions/msgp_gen_test.go index d92a29cf8f..0a916da82a 100644 --- a/data/transactions/msgp_gen_test.go +++ b/data/transactions/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package transactions diff --git a/go.mod b/go.mod index c917e62adf..b037dcf81a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/algorand/go-algorand -go 1.16 +go 1.17 require ( github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 @@ -8,46 +8,65 @@ require ( github.com/algorand/go-deadlock v0.2.2 github.com/algorand/go-sumhash v0.1.0 github.com/algorand/graphtrace v0.1.0 - github.com/algorand/msgp v1.1.50 + github.com/algorand/msgp v1.1.51 github.com/algorand/oapi-codegen v1.3.7 github.com/algorand/websocket v1.4.5 github.com/aws/aws-sdk-go v1.16.5 github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e - github.com/cpuguy83/go-md2man v1.0.8 // indirect github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 github.com/dchest/siphash v1.2.1 github.com/fatih/color v1.7.0 - github.com/fortytw2/leaktest v1.3.0 // indirect github.com/gen2brain/beeep v0.0.0-20180718162406-4e430518395f github.com/getkin/kin-openapi v0.22.0 - github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f // indirect github.com/gofrs/flock v0.7.0 github.com/google/go-querystring v1.0.0 - github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect - github.com/gopherjs/gopherwasm v1.0.1 // indirect - github.com/gorilla/context v1.1.1 // indirect github.com/gorilla/mux v1.6.2 - github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jmoiron/sqlx v1.2.0 github.com/karalabe/usb v0.0.2 github.com/labstack/echo/v4 v4.1.17 - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-sqlite3 v1.10.0 github.com/miekg/dns v1.1.27 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/olivere/elastic v6.2.14+incompatible - github.com/russross/blackfriday v1.5.2 // indirect github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v0.0.3 - github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.7.1 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 + golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e golang.org/x/text v0.3.7 + gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 +) + +require ( + github.com/cpuguy83/go-md2man v1.0.8 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/fortytw2/leaktest v1.3.0 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/godbus/dbus v0.0.0-20181101234600-2ff6f7ffd60f // indirect + github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e // indirect + github.com/gopherjs/gopherwasm v1.0.1 // indirect + github.com/gorilla/context v1.1.1 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/labstack/gommon v0.3.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.7 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect + github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/russross/blackfriday v1.5.2 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.1 // indirect + golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect - gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 gopkg.in/toast.v1 v1.0.0-20180812000517-0a84660828b2 // indirect - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect + gopkg.in/yaml.v2 v2.3.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/go.sum b/go.sum index 73e446a9f5..dad920e278 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123 h1:cnUjJ/iqUjJNbhUzgmxbfwHMVFnz+DLnNQx8uJcGaks= github.com/algorand/falcon v0.0.0-20220130164023-c9e1d466f123/go.mod h1:OkQyHlGvS0kLNcIWbC21/uQcnbfwSOQm+wiqWwBG9pQ= -github.com/algorand/go-codec v1.1.8 h1:XDSreeeZY8gMst6Edz4RBkl08/DGMJOeHYkoXL2B7wI= github.com/algorand/go-codec v1.1.8/go.mod h1:XhzVs6VVyWMLu6cApb9/192gBjGRVGm5cX5j203Heg4= github.com/algorand/go-codec/codec v1.1.8 h1:lsFuhcOH2LiEhpBH3BVUUkdevVmwCRyvb7FCAAPeY6U= github.com/algorand/go-codec/codec v1.1.8/go.mod h1:tQ3zAJ6ijTps6V+wp8KsGDnPC2uhHVC7ANyrtkIY0bA= @@ -10,8 +9,8 @@ github.com/algorand/go-sumhash v0.1.0 h1:b/QRhyLuF//vOcicBIxBXYW8bERNoeLxieht/dU github.com/algorand/go-sumhash v0.1.0/go.mod h1:OOe7jdDWUhLkuP1XytkK5gnLu9entAviN5DfDZh6XAc= github.com/algorand/graphtrace v0.1.0 h1:QemP1iT0W56SExD0NfiU6rsG34/v0Je6bg5UZnptEUM= github.com/algorand/graphtrace v0.1.0/go.mod h1:HscLQrzBdH1BH+5oehs3ICd8SYcXvnSL9BjfTu8WHCc= -github.com/algorand/msgp v1.1.50 h1:Mvsjs5LCE6HsXXbwJXD8ol1Y+c+QMoFNM4j0CY+mFGo= -github.com/algorand/msgp v1.1.50/go.mod h1:R5sJrW9krk4YwNo+rs82Kq6V55q/zNgACwWqt3sQBM4= +github.com/algorand/msgp v1.1.51 h1:0Z8qXlSPMPmODjpqzvIhBENrbLcrf1eJPRnKgLlrcxM= +github.com/algorand/msgp v1.1.51/go.mod h1:5K3d58/poT5fPmtiwuQft6GjgSrVEM46KoXdLrID8ZU= github.com/algorand/oapi-codegen v1.3.7 h1:TdXeGljgrnLXSCGPdeY6g6+i/G0Rr5CkjBgUJY6ht48= github.com/algorand/oapi-codegen v1.3.7/go.mod h1:UvOtAiP3hc0M2GUKBnZVTjLe3HKGDKh6y9rs3e3JyOg= github.com/algorand/websocket v1.4.5 h1:Cs6UTaCReAl02evYxmN8k57cNHmBILRcspfSxYg4AJE= @@ -75,8 +74,8 @@ github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo= github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= @@ -127,7 +126,6 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -175,8 +173,9 @@ golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -209,5 +208,5 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/ledger/ledgercore/msgp_gen_test.go b/ledger/ledgercore/msgp_gen_test.go index 99ad64e4de..dbb017a491 100644 --- a/ledger/ledgercore/msgp_gen_test.go +++ b/ledger/ledgercore/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package ledgercore diff --git a/ledger/msgp_gen_test.go b/ledger/msgp_gen_test.go index 92b54bc521..fb1dac5a29 100644 --- a/ledger/msgp_gen_test.go +++ b/ledger/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package ledger diff --git a/libgoal/lockedFileLinux.go b/libgoal/lockedFileLinux.go index 989972873c..9c60ca028d 100644 --- a/libgoal/lockedFileLinux.go +++ b/libgoal/lockedFileLinux.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build linux // +build linux package libgoal diff --git a/libgoal/lockedFileUnix.go b/libgoal/lockedFileUnix.go index 70262a15ca..b32af5def4 100644 --- a/libgoal/lockedFileUnix.go +++ b/libgoal/lockedFileUnix.go @@ -17,6 +17,7 @@ // Support all unix system except linux // in https://github.com/golang/sys/blob/master/unix/syscall_unix.go +//go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || solaris // +build aix darwin dragonfly freebsd netbsd openbsd solaris package libgoal diff --git a/libgoal/lockedFileWindows.go b/libgoal/lockedFileWindows.go index efc6de0ade..c89785d80a 100644 --- a/libgoal/lockedFileWindows.go +++ b/libgoal/lockedFileWindows.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build windows // +build windows package libgoal diff --git a/network/messagetracer/graphtrace.go b/network/messagetracer/graphtrace.go index 8a92698011..68c465914b 100644 --- a/network/messagetracer/graphtrace.go +++ b/network/messagetracer/graphtrace.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . // +//go:build msgtrace // +build msgtrace package messagetracer diff --git a/node/msgp_gen_test.go b/node/msgp_gen_test.go index e72b128ee6..bbfb4732a3 100644 --- a/node/msgp_gen_test.go +++ b/node/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package node diff --git a/node/node.go b/node/node.go index f173853d48..c8ff6aa3e2 100644 --- a/node/node.go +++ b/node/node.go @@ -407,11 +407,11 @@ func (node *AlgorandFullNode) startMonitoringRoutines() { // PKI TODO: Remove this with #2596 // Periodically check for new participation keys - go node.checkForParticipationKeys() + go node.checkForParticipationKeys(node.ctx.Done()) - go node.txPoolGaugeThread() + go node.txPoolGaugeThread(node.ctx.Done()) // Delete old participation keys - go node.oldKeyDeletionThread() + go node.oldKeyDeletionThread(node.ctx.Done()) // TODO re-enable with configuration flag post V1 //go logging.UsageLogThread(node.ctx, node.log, 100*time.Millisecond, nil) @@ -782,7 +782,7 @@ func ensureParticipationDB(genesisDir string, log logging.Logger) (account.Parti } // Reload participation keys from disk periodically -func (node *AlgorandFullNode) checkForParticipationKeys() { +func (node *AlgorandFullNode) checkForParticipationKeys(done <-chan struct{}) { defer node.monitoringRoutinesWaitGroup.Done() ticker := time.NewTicker(node.config.ParticipationKeysRefreshInterval) for { @@ -792,7 +792,7 @@ func (node *AlgorandFullNode) checkForParticipationKeys() { if err != nil { node.log.Errorf("Could not refresh participation keys: %v", err) } - case <-node.ctx.Done(): + case <-done: ticker.Stop() return } @@ -1032,7 +1032,7 @@ func insertStateProofToRegistry(part account.PersistedParticipation, node *Algor var txPoolGuage = metrics.MakeGauge(metrics.MetricName{Name: "algod_tx_pool_count", Description: "current number of available transactions in pool"}) -func (node *AlgorandFullNode) txPoolGaugeThread() { +func (node *AlgorandFullNode) txPoolGaugeThread(done <-chan struct{}) { defer node.monitoringRoutinesWaitGroup.Done() ticker := time.NewTicker(10 * time.Second) defer ticker.Stop() @@ -1040,7 +1040,7 @@ func (node *AlgorandFullNode) txPoolGaugeThread() { select { case <-ticker.C: txPoolGuage.Set(float64(node.transactionPool.PendingCount()), nil) - case <-node.ctx.Done(): + case <-done: return } } @@ -1071,11 +1071,11 @@ func (node *AlgorandFullNode) OnNewBlock(block bookkeeping.Block, delta ledgerco // oldKeyDeletionThread keeps deleting old participation keys. // It runs in a separate thread so that, during catchup, we // don't have to delete key for each block we received. -func (node *AlgorandFullNode) oldKeyDeletionThread() { +func (node *AlgorandFullNode) oldKeyDeletionThread(done <-chan struct{}) { defer node.monitoringRoutinesWaitGroup.Done() for { select { - case <-node.ctx.Done(): + case <-done: return case <-node.oldKeyDeletionNotify: } diff --git a/nodecontrol/kmdControl_common.go b/nodecontrol/kmdControl_common.go index a73c75746f..151ea79633 100644 --- a/nodecontrol/kmdControl_common.go +++ b/nodecontrol/kmdControl_common.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build !windows // +build !windows package nodecontrol diff --git a/protocol/msgp_gen_test.go b/protocol/msgp_gen_test.go index 4bdc805908..e9cbe36b16 100644 --- a/protocol/msgp_gen_test.go +++ b/protocol/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package protocol diff --git a/protocol/test/msgp_gen_test.go b/protocol/test/msgp_gen_test.go index d87b778e07..6704fc95bb 100644 --- a/protocol/test/msgp_gen_test.go +++ b/protocol/test/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package test diff --git a/rpcs/msgp_gen_test.go b/rpcs/msgp_gen_test.go index 46ec99aaf3..58d5d0de6c 100644 --- a/rpcs/msgp_gen_test.go +++ b/rpcs/msgp_gen_test.go @@ -1,3 +1,4 @@ +//go:build !skip_msgp_testing // +build !skip_msgp_testing package rpcs diff --git a/scripts/buildtools/go.mod b/scripts/buildtools/go.mod index cf29e9304c..96142dc63c 100644 --- a/scripts/buildtools/go.mod +++ b/scripts/buildtools/go.mod @@ -1,6 +1,6 @@ module github.com/algorand/go-algorand/scripts/buildtools -go 1.16 +go 1.17 require ( github.com/algorand/msgp v1.1.50 diff --git a/scripts/get_golang_version.sh b/scripts/get_golang_version.sh index 1dd22eda46..390847ed4d 100755 --- a/scripts/get_golang_version.sh +++ b/scripts/get_golang_version.sh @@ -11,9 +11,9 @@ # Our build task-runner `mule` will refer to this script and will automatically # build a new image whenever the version number has been changed. -BUILD=1.16.15 - MIN=1.16 - GO_MOD_SUPPORT=1.16 +BUILD=1.17.9 + MIN=1.17 + GO_MOD_SUPPORT=1.17 if [ "$1" = all ] then diff --git a/tools/network/dnssec/config_unix.go b/tools/network/dnssec/config_unix.go index bb328cde6a..4a8c574de1 100644 --- a/tools/network/dnssec/config_unix.go +++ b/tools/network/dnssec/config_unix.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build !windows // +build !windows package dnssec diff --git a/tools/network/dnssec/config_unix_test.go b/tools/network/dnssec/config_unix_test.go index c6699e67f8..c757b5369f 100644 --- a/tools/network/dnssec/config_unix_test.go +++ b/tools/network/dnssec/config_unix_test.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build !windows // +build !windows package dnssec diff --git a/tools/network/dnssec/config_windows.go b/tools/network/dnssec/config_windows.go index 357f1aa1f1..41d6950070 100644 --- a/tools/network/dnssec/config_windows.go +++ b/tools/network/dnssec/config_windows.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build windows // +build windows package dnssec diff --git a/util/process_common.go b/util/process_common.go index 5685b06a51..b2c1bc7081 100644 --- a/util/process_common.go +++ b/util/process_common.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build !windows // +build !windows package util diff --git a/util/process_windows.go b/util/process_windows.go index b7a5c6b65d..4cad60df7e 100644 --- a/util/process_windows.go +++ b/util/process_windows.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build windows // +build windows package util diff --git a/util/util.go b/util/util.go index c4c7a7385c..a19a5b0690 100644 --- a/util/util.go +++ b/util/util.go @@ -14,6 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with go-algorand. If not, see . +//go:build !windows // +build !windows package util From bd18d0497f4a89b28fdd54811f95444adde901a4 Mon Sep 17 00:00:00 2001 From: Or Aharonee Date: Tue, 10 May 2022 21:57:58 +0300 Subject: [PATCH 08/34] StateProofs: New block header field - SHA256 merkle root of the transactions (#3829) Currently, the TxnRoot block header contains the root of the merkle tree built from the transactions in the block, using the SHA512_256 hash function. Since the Ethereum VM (and others) does not support SHA512_256 natively, we have added a new header, which will be used by the Light Clients deployed on other networks in order to verify Algorand blocks. Co-authored-by: algoidan <79864820+algoidan@users.noreply.github.com> --- agreement/msgp_gen.go | 469 +-- catchup/fetcher_test.go | 4 +- config/consensus.go | 7 + crypto/compactcert/structs.go | 2 +- crypto/hashes.go | 10 +- crypto/hashes_test.go | 3 + crypto/merklearray/merkle_test.go | 221 +- daemon/algod/api/algod.oas2.json | 19 +- daemon/algod/api/algod.oas3.yml | 24 +- daemon/algod/api/client/restClient.go | 8 +- .../algod/api/server/lib/bundledSpecInject.go | 2831 +++++++++-------- .../algod/api/server/v1/handlers/handlers.go | 2 +- daemon/algod/api/server/v2/errors.go | 1 + .../api/server/v2/generated/private/routes.go | 202 +- .../api/server/v2/generated/private/types.go | 2 +- .../algod/api/server/v2/generated/routes.go | 409 +-- daemon/algod/api/server/v2/generated/types.go | 7 +- daemon/algod/api/server/v2/handlers.go | 59 +- .../algod/api/server/v2/test/handlers_test.go | 86 +- daemon/algod/api/spec/v1/model.go | 4 +- daemon/algod/api/swagger.json | 2 +- data/bookkeeping/block.go | 61 +- data/bookkeeping/block_test.go | 105 + data/bookkeeping/genesis.go | 14 +- data/bookkeeping/msgp_gen.go | 419 ++- data/bookkeeping/msgp_gen_test.go | 60 + data/bookkeeping/txn_merkle.go | 48 +- data/bookkeeping/txn_merkle_test.go | 52 + data/ledger_test.go | 4 +- data/pools/transactionPool_test.go | 2 +- data/transactions/signedtxn.go | 10 + data/transactions/transaction.go | 8 + ledger/applications_test.go | 6 +- ledger/internal/eval.go | 6 +- ledger/ledger_test.go | 16 +- ledger/perf_test.go | 2 +- ledger/testing/initState.go | 2 +- libgoal/libgoal.go | 4 +- netdeploy/remote/deployedNetwork.go | 2 +- rpcs/blockService_test.go | 2 +- .../features/transactions/proof_test.go | 108 +- .../nettemplates/TwoNodes50EachV32.json | 30 + 42 files changed, 3121 insertions(+), 2212 deletions(-) create mode 100644 test/testdata/nettemplates/TwoNodes50EachV32.json diff --git a/agreement/msgp_gen.go b/agreement/msgp_gen.go index 8df6c47a99..38783d13d4 100644 --- a/agreement/msgp_gen.go +++ b/agreement/msgp_gen.go @@ -1355,124 +1355,128 @@ func (z period) MsgIsZero() bool { func (z *proposal) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0004Len := uint32(28) - var zb0004Mask uint64 /* 35 bits */ + zb0004Len := uint32(29) + var zb0004Mask uint64 /* 37 bits */ if len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0 { zb0004Len-- - zb0004Mask |= 0x20 + zb0004Mask |= 0x40 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0 { zb0004Len-- - zb0004Mask |= 0x40 + zb0004Mask |= 0x80 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80 + zb0004Mask |= 0x100 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0 { zb0004Len-- - zb0004Mask |= 0x100 + zb0004Mask |= 0x200 } if (*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "" { zb0004Len-- - zb0004Mask |= 0x200 + zb0004Mask |= 0x400 } if (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400 + zb0004Mask |= 0x800 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800 + zb0004Mask |= 0x1000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000 + zb0004Mask |= 0x2000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000 + zb0004Mask |= 0x4000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0 { zb0004Len-- - zb0004Mask |= 0x4000 + zb0004Mask |= 0x8000 } if (*z).unauthenticatedProposal.OriginalPeriod == 0 { zb0004Len-- - zb0004Mask |= 0x8000 + zb0004Mask |= 0x10000 } if (*z).unauthenticatedProposal.OriginalProposer.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000 + zb0004Mask |= 0x20000 } if len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0 { zb0004Len-- - zb0004Mask |= 0x20000 + zb0004Mask |= 0x40000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000 + zb0004Mask |= 0x80000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000 + zb0004Mask |= 0x100000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0 { zb0004Len-- - zb0004Mask |= 0x100000 + zb0004Mask |= 0x200000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000 + zb0004Mask |= 0x400000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400000 + zb0004Mask |= 0x800000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800000 + zb0004Mask |= 0x1000000 } if (*z).unauthenticatedProposal.SeedProof.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000000 + zb0004Mask |= 0x2000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000000 + zb0004Mask |= 0x4000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0 { zb0004Len-- - zb0004Mask |= 0x4000000 + zb0004Mask |= 0x8000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0 { zb0004Len-- - zb0004Mask |= 0x8000000 + zb0004Mask |= 0x10000000 } - if (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MsgIsZero() { + if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000000 + zb0004Mask |= 0x20000000 + } + if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero() { + zb0004Len-- + zb0004Mask |= 0x40000000 } if (*z).unauthenticatedProposal.Block.Payset.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x20000000 + zb0004Mask |= 0x80000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000000 + zb0004Mask |= 0x100000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000000 + zb0004Mask |= 0x200000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false { zb0004Len-- - zb0004Mask |= 0x100000000 + zb0004Mask |= 0x400000000 } // variable map header, size zb0004Len o = msgp.AppendMapHeader(o, zb0004Len) if zb0004Len != 0 { - if (zb0004Mask & 0x20) == 0 { // if not empty + if (zb0004Mask & 0x40) == 0 { // if not empty // string "cc" o = append(o, 0xa2, 0x63, 0x63) if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert == nil { @@ -1492,62 +1496,62 @@ func (z *proposal) MarshalMsg(b []byte) (o []byte) { o = zb0002.MarshalMsg(o) } } - if (zb0004Mask & 0x40) == 0 { // if not empty + if (zb0004Mask & 0x80) == 0 { // if not empty // string "earn" o = append(o, 0xa4, 0x65, 0x61, 0x72, 0x6e) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel) } - if (zb0004Mask & 0x80) == 0 { // if not empty + if (zb0004Mask & 0x100) == 0 { // if not empty // string "fees" o = append(o, 0xa4, 0x66, 0x65, 0x65, 0x73) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MarshalMsg(o) } - if (zb0004Mask & 0x100) == 0 { // if not empty + if (zb0004Mask & 0x200) == 0 { // if not empty // string "frac" o = append(o, 0xa4, 0x66, 0x72, 0x61, 0x63) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue) } - if (zb0004Mask & 0x200) == 0 { // if not empty + if (zb0004Mask & 0x400) == 0 { // if not empty // string "gen" o = append(o, 0xa3, 0x67, 0x65, 0x6e) o = msgp.AppendString(o, (*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) } - if (zb0004Mask & 0x400) == 0 { // if not empty + if (zb0004Mask & 0x800) == 0 { // if not empty // string "gh" o = append(o, 0xa2, 0x67, 0x68) o = (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MarshalMsg(o) } - if (zb0004Mask & 0x800) == 0 { // if not empty + if (zb0004Mask & 0x1000) == 0 { // if not empty // string "nextbefore" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MarshalMsg(o) } - if (zb0004Mask & 0x1000) == 0 { // if not empty + if (zb0004Mask & 0x2000) == 0 { // if not empty // string "nextproto" o = append(o, 0xa9, 0x6e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x2000) == 0 { // if not empty + if (zb0004Mask & 0x4000) == 0 { // if not empty // string "nextswitch" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MarshalMsg(o) } - if (zb0004Mask & 0x4000) == 0 { // if not empty + if (zb0004Mask & 0x8000) == 0 { // if not empty // string "nextyes" o = append(o, 0xa7, 0x6e, 0x65, 0x78, 0x74, 0x79, 0x65, 0x73) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals) } - if (zb0004Mask & 0x8000) == 0 { // if not empty + if (zb0004Mask & 0x10000) == 0 { // if not empty // string "oper" o = append(o, 0xa4, 0x6f, 0x70, 0x65, 0x72) o = msgp.AppendUint64(o, uint64((*z).unauthenticatedProposal.OriginalPeriod)) } - if (zb0004Mask & 0x10000) == 0 { // if not empty + if (zb0004Mask & 0x20000) == 0 { // if not empty // string "oprop" o = append(o, 0xa5, 0x6f, 0x70, 0x72, 0x6f, 0x70) o = (*z).unauthenticatedProposal.OriginalProposer.MarshalMsg(o) } - if (zb0004Mask & 0x20000) == 0 { // if not empty + if (zb0004Mask & 0x40000) == 0 { // if not empty // string "partupdrmv" o = append(o, 0xaa, 0x70, 0x61, 0x72, 0x74, 0x75, 0x70, 0x64, 0x72, 0x6d, 0x76) if (*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts == nil { @@ -1559,77 +1563,82 @@ func (z *proposal) MarshalMsg(b []byte) (o []byte) { o = (*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts[zb0003].MarshalMsg(o) } } - if (zb0004Mask & 0x40000) == 0 { // if not empty + if (zb0004Mask & 0x80000) == 0 { // if not empty // string "prev" o = append(o, 0xa4, 0x70, 0x72, 0x65, 0x76) o = (*z).unauthenticatedProposal.Block.BlockHeader.Branch.MarshalMsg(o) } - if (zb0004Mask & 0x80000) == 0 { // if not empty + if (zb0004Mask & 0x100000) == 0 { // if not empty // string "proto" o = append(o, 0xa5, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x100000) == 0 { // if not empty + if (zb0004Mask & 0x200000) == 0 { // if not empty // string "rate" o = append(o, 0xa4, 0x72, 0x61, 0x74, 0x65) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate) } - if (zb0004Mask & 0x200000) == 0 { // if not empty + if (zb0004Mask & 0x400000) == 0 { // if not empty // string "rnd" o = append(o, 0xa3, 0x72, 0x6e, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.Round.MarshalMsg(o) } - if (zb0004Mask & 0x400000) == 0 { // if not empty + if (zb0004Mask & 0x800000) == 0 { // if not empty // string "rwcalr" o = append(o, 0xa6, 0x72, 0x77, 0x63, 0x61, 0x6c, 0x72) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MarshalMsg(o) } - if (zb0004Mask & 0x800000) == 0 { // if not empty + if (zb0004Mask & 0x1000000) == 0 { // if not empty // string "rwd" o = append(o, 0xa3, 0x72, 0x77, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MarshalMsg(o) } - if (zb0004Mask & 0x1000000) == 0 { // if not empty + if (zb0004Mask & 0x2000000) == 0 { // if not empty // string "sdpf" o = append(o, 0xa4, 0x73, 0x64, 0x70, 0x66) o = (*z).unauthenticatedProposal.SeedProof.MarshalMsg(o) } - if (zb0004Mask & 0x2000000) == 0 { // if not empty + if (zb0004Mask & 0x4000000) == 0 { // if not empty // string "seed" o = append(o, 0xa4, 0x73, 0x65, 0x65, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.Seed.MarshalMsg(o) } - if (zb0004Mask & 0x4000000) == 0 { // if not empty + if (zb0004Mask & 0x8000000) == 0 { // if not empty // string "tc" o = append(o, 0xa2, 0x74, 0x63) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter) } - if (zb0004Mask & 0x8000000) == 0 { // if not empty + if (zb0004Mask & 0x10000000) == 0 { // if not empty // string "ts" o = append(o, 0xa2, 0x74, 0x73) o = msgp.AppendInt64(o, (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp) } - if (zb0004Mask & 0x10000000) == 0 { // if not empty + if (zb0004Mask & 0x20000000) == 0 { // if not empty // string "txn" o = append(o, 0xa3, 0x74, 0x78, 0x6e) - o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MarshalMsg(o) + o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MarshalMsg(o) } - if (zb0004Mask & 0x20000000) == 0 { // if not empty + if (zb0004Mask & 0x40000000) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MarshalMsg(o) + } + if (zb0004Mask & 0x80000000) == 0 { // if not empty // string "txns" o = append(o, 0xa4, 0x74, 0x78, 0x6e, 0x73) o = (*z).unauthenticatedProposal.Block.Payset.MarshalMsg(o) } - if (zb0004Mask & 0x40000000) == 0 { // if not empty + if (zb0004Mask & 0x100000000) == 0 { // if not empty // string "upgradedelay" o = append(o, 0xac, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x65, 0x6c, 0x61, 0x79) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MarshalMsg(o) } - if (zb0004Mask & 0x80000000) == 0 { // if not empty + if (zb0004Mask & 0x200000000) == 0 { // if not empty // string "upgradeprop" o = append(o, 0xab, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x70) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MarshalMsg(o) } - if (zb0004Mask & 0x100000000) == 0 { // if not empty + if (zb0004Mask & 0x400000000) == 0 { // if not empty // string "upgradeyes" o = append(o, 0xaa, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x79, 0x65, 0x73) o = msgp.AppendBool(o, (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove) @@ -1682,9 +1691,17 @@ func (z *proposal) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0004 > 0 { + zb0004-- + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnRoot") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } @@ -1974,10 +1991,16 @@ func (z *proposal) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } + case "txn256": + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "txn": - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "TxnRoot") + err = msgp.WrapError(err, "NativeSha512_256Commitment") return } case "ts": @@ -2197,7 +2220,7 @@ func (_ *proposal) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *proposal) Msgsize() (s int) { - s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert { _ = zb0001 @@ -2215,7 +2238,7 @@ func (z *proposal) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *proposal) MsgIsZero() bool { - return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) + return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -3094,128 +3117,132 @@ func (z step) MsgIsZero() bool { func (z *transmittedPayload) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0004Len := uint32(29) - var zb0004Mask uint64 /* 35 bits */ + zb0004Len := uint32(30) + var zb0004Mask uint64 /* 37 bits */ if len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0 { zb0004Len-- - zb0004Mask |= 0x40 + zb0004Mask |= 0x80 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0 { zb0004Len-- - zb0004Mask |= 0x80 + zb0004Mask |= 0x100 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x100 + zb0004Mask |= 0x200 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0 { zb0004Len-- - zb0004Mask |= 0x200 + zb0004Mask |= 0x400 } if (*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "" { zb0004Len-- - zb0004Mask |= 0x400 + zb0004Mask |= 0x800 } if (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800 + zb0004Mask |= 0x1000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000 + zb0004Mask |= 0x2000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000 + zb0004Mask |= 0x4000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x4000 + zb0004Mask |= 0x8000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0 { zb0004Len-- - zb0004Mask |= 0x8000 + zb0004Mask |= 0x10000 } if (*z).unauthenticatedProposal.OriginalPeriod == 0 { zb0004Len-- - zb0004Mask |= 0x10000 + zb0004Mask |= 0x20000 } if (*z).unauthenticatedProposal.OriginalProposer.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x20000 + zb0004Mask |= 0x40000 } if len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0 { zb0004Len-- - zb0004Mask |= 0x40000 + zb0004Mask |= 0x80000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000 + zb0004Mask |= 0x100000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x100000 + zb0004Mask |= 0x200000 } if (*z).PriorVote.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000 + zb0004Mask |= 0x400000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0 { zb0004Len-- - zb0004Mask |= 0x400000 + zb0004Mask |= 0x800000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800000 + zb0004Mask |= 0x1000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000000 + zb0004Mask |= 0x2000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000000 + zb0004Mask |= 0x4000000 } if (*z).unauthenticatedProposal.SeedProof.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x4000000 + zb0004Mask |= 0x8000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x8000000 + zb0004Mask |= 0x10000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0 { zb0004Len-- - zb0004Mask |= 0x10000000 + zb0004Mask |= 0x20000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0 { zb0004Len-- - zb0004Mask |= 0x20000000 + zb0004Mask |= 0x40000000 } - if (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MsgIsZero() { + if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000000 + zb0004Mask |= 0x80000000 + } + if (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero() { + zb0004Len-- + zb0004Mask |= 0x100000000 } if (*z).unauthenticatedProposal.Block.Payset.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000000 + zb0004Mask |= 0x200000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x100000000 + zb0004Mask |= 0x400000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000000 + zb0004Mask |= 0x800000000 } if (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false { zb0004Len-- - zb0004Mask |= 0x400000000 + zb0004Mask |= 0x1000000000 } // variable map header, size zb0004Len o = msgp.AppendMapHeader(o, zb0004Len) if zb0004Len != 0 { - if (zb0004Mask & 0x40) == 0 { // if not empty + if (zb0004Mask & 0x80) == 0 { // if not empty // string "cc" o = append(o, 0xa2, 0x63, 0x63) if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert == nil { @@ -3235,62 +3262,62 @@ func (z *transmittedPayload) MarshalMsg(b []byte) (o []byte) { o = zb0002.MarshalMsg(o) } } - if (zb0004Mask & 0x80) == 0 { // if not empty + if (zb0004Mask & 0x100) == 0 { // if not empty // string "earn" o = append(o, 0xa4, 0x65, 0x61, 0x72, 0x6e) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel) } - if (zb0004Mask & 0x100) == 0 { // if not empty + if (zb0004Mask & 0x200) == 0 { // if not empty // string "fees" o = append(o, 0xa4, 0x66, 0x65, 0x65, 0x73) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MarshalMsg(o) } - if (zb0004Mask & 0x200) == 0 { // if not empty + if (zb0004Mask & 0x400) == 0 { // if not empty // string "frac" o = append(o, 0xa4, 0x66, 0x72, 0x61, 0x63) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue) } - if (zb0004Mask & 0x400) == 0 { // if not empty + if (zb0004Mask & 0x800) == 0 { // if not empty // string "gen" o = append(o, 0xa3, 0x67, 0x65, 0x6e) o = msgp.AppendString(o, (*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) } - if (zb0004Mask & 0x800) == 0 { // if not empty + if (zb0004Mask & 0x1000) == 0 { // if not empty // string "gh" o = append(o, 0xa2, 0x67, 0x68) o = (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MarshalMsg(o) } - if (zb0004Mask & 0x1000) == 0 { // if not empty + if (zb0004Mask & 0x2000) == 0 { // if not empty // string "nextbefore" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MarshalMsg(o) } - if (zb0004Mask & 0x2000) == 0 { // if not empty + if (zb0004Mask & 0x4000) == 0 { // if not empty // string "nextproto" o = append(o, 0xa9, 0x6e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x4000) == 0 { // if not empty + if (zb0004Mask & 0x8000) == 0 { // if not empty // string "nextswitch" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MarshalMsg(o) } - if (zb0004Mask & 0x8000) == 0 { // if not empty + if (zb0004Mask & 0x10000) == 0 { // if not empty // string "nextyes" o = append(o, 0xa7, 0x6e, 0x65, 0x78, 0x74, 0x79, 0x65, 0x73) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals) } - if (zb0004Mask & 0x10000) == 0 { // if not empty + if (zb0004Mask & 0x20000) == 0 { // if not empty // string "oper" o = append(o, 0xa4, 0x6f, 0x70, 0x65, 0x72) o = msgp.AppendUint64(o, uint64((*z).unauthenticatedProposal.OriginalPeriod)) } - if (zb0004Mask & 0x20000) == 0 { // if not empty + if (zb0004Mask & 0x40000) == 0 { // if not empty // string "oprop" o = append(o, 0xa5, 0x6f, 0x70, 0x72, 0x6f, 0x70) o = (*z).unauthenticatedProposal.OriginalProposer.MarshalMsg(o) } - if (zb0004Mask & 0x40000) == 0 { // if not empty + if (zb0004Mask & 0x80000) == 0 { // if not empty // string "partupdrmv" o = append(o, 0xaa, 0x70, 0x61, 0x72, 0x74, 0x75, 0x70, 0x64, 0x72, 0x6d, 0x76) if (*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts == nil { @@ -3302,82 +3329,87 @@ func (z *transmittedPayload) MarshalMsg(b []byte) (o []byte) { o = (*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts[zb0003].MarshalMsg(o) } } - if (zb0004Mask & 0x80000) == 0 { // if not empty + if (zb0004Mask & 0x100000) == 0 { // if not empty // string "prev" o = append(o, 0xa4, 0x70, 0x72, 0x65, 0x76) o = (*z).unauthenticatedProposal.Block.BlockHeader.Branch.MarshalMsg(o) } - if (zb0004Mask & 0x100000) == 0 { // if not empty + if (zb0004Mask & 0x200000) == 0 { // if not empty // string "proto" o = append(o, 0xa5, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x200000) == 0 { // if not empty + if (zb0004Mask & 0x400000) == 0 { // if not empty // string "pv" o = append(o, 0xa2, 0x70, 0x76) o = (*z).PriorVote.MarshalMsg(o) } - if (zb0004Mask & 0x400000) == 0 { // if not empty + if (zb0004Mask & 0x800000) == 0 { // if not empty // string "rate" o = append(o, 0xa4, 0x72, 0x61, 0x74, 0x65) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate) } - if (zb0004Mask & 0x800000) == 0 { // if not empty + if (zb0004Mask & 0x1000000) == 0 { // if not empty // string "rnd" o = append(o, 0xa3, 0x72, 0x6e, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.Round.MarshalMsg(o) } - if (zb0004Mask & 0x1000000) == 0 { // if not empty + if (zb0004Mask & 0x2000000) == 0 { // if not empty // string "rwcalr" o = append(o, 0xa6, 0x72, 0x77, 0x63, 0x61, 0x6c, 0x72) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MarshalMsg(o) } - if (zb0004Mask & 0x2000000) == 0 { // if not empty + if (zb0004Mask & 0x4000000) == 0 { // if not empty // string "rwd" o = append(o, 0xa3, 0x72, 0x77, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MarshalMsg(o) } - if (zb0004Mask & 0x4000000) == 0 { // if not empty + if (zb0004Mask & 0x8000000) == 0 { // if not empty // string "sdpf" o = append(o, 0xa4, 0x73, 0x64, 0x70, 0x66) o = (*z).unauthenticatedProposal.SeedProof.MarshalMsg(o) } - if (zb0004Mask & 0x8000000) == 0 { // if not empty + if (zb0004Mask & 0x10000000) == 0 { // if not empty // string "seed" o = append(o, 0xa4, 0x73, 0x65, 0x65, 0x64) o = (*z).unauthenticatedProposal.Block.BlockHeader.Seed.MarshalMsg(o) } - if (zb0004Mask & 0x10000000) == 0 { // if not empty + if (zb0004Mask & 0x20000000) == 0 { // if not empty // string "tc" o = append(o, 0xa2, 0x74, 0x63) o = msgp.AppendUint64(o, (*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter) } - if (zb0004Mask & 0x20000000) == 0 { // if not empty + if (zb0004Mask & 0x40000000) == 0 { // if not empty // string "ts" o = append(o, 0xa2, 0x74, 0x73) o = msgp.AppendInt64(o, (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp) } - if (zb0004Mask & 0x40000000) == 0 { // if not empty + if (zb0004Mask & 0x80000000) == 0 { // if not empty // string "txn" o = append(o, 0xa3, 0x74, 0x78, 0x6e) - o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MarshalMsg(o) + o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MarshalMsg(o) } - if (zb0004Mask & 0x80000000) == 0 { // if not empty + if (zb0004Mask & 0x100000000) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MarshalMsg(o) + } + if (zb0004Mask & 0x200000000) == 0 { // if not empty // string "txns" o = append(o, 0xa4, 0x74, 0x78, 0x6e, 0x73) o = (*z).unauthenticatedProposal.Block.Payset.MarshalMsg(o) } - if (zb0004Mask & 0x100000000) == 0 { // if not empty + if (zb0004Mask & 0x400000000) == 0 { // if not empty // string "upgradedelay" o = append(o, 0xac, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x65, 0x6c, 0x61, 0x79) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MarshalMsg(o) } - if (zb0004Mask & 0x200000000) == 0 { // if not empty + if (zb0004Mask & 0x800000000) == 0 { // if not empty // string "upgradeprop" o = append(o, 0xab, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x70) o = (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MarshalMsg(o) } - if (zb0004Mask & 0x400000000) == 0 { // if not empty + if (zb0004Mask & 0x1000000000) == 0 { // if not empty // string "upgradeyes" o = append(o, 0xaa, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x79, 0x65, 0x73) o = msgp.AppendBool(o, (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove) @@ -3430,9 +3462,17 @@ func (z *transmittedPayload) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0004 > 0 { + zb0004-- + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnRoot") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } @@ -3730,10 +3770,16 @@ func (z *transmittedPayload) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } + case "txn256": + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "txn": - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "TxnRoot") + err = msgp.WrapError(err, "NativeSha512_256Commitment") return } case "ts": @@ -3959,7 +4005,7 @@ func (_ *transmittedPayload) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *transmittedPayload) Msgsize() (s int) { - s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert { _ = zb0001 @@ -3977,7 +4023,7 @@ func (z *transmittedPayload) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *transmittedPayload) MsgIsZero() bool { - return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnRoot.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) && ((*z).PriorVote.MsgIsZero()) + return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) && ((*z).PriorVote.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -4647,124 +4693,128 @@ func (z *unauthenticatedEquivocationVote) MsgIsZero() bool { func (z *unauthenticatedProposal) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0004Len := uint32(28) - var zb0004Mask uint64 /* 33 bits */ + zb0004Len := uint32(29) + var zb0004Mask uint64 /* 35 bits */ if len((*z).Block.BlockHeader.CompactCert) == 0 { zb0004Len-- - zb0004Mask |= 0x20 + zb0004Mask |= 0x40 } if (*z).Block.BlockHeader.RewardsState.RewardsLevel == 0 { zb0004Len-- - zb0004Mask |= 0x40 + zb0004Mask |= 0x80 } if (*z).Block.BlockHeader.RewardsState.FeeSink.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80 + zb0004Mask |= 0x100 } if (*z).Block.BlockHeader.RewardsState.RewardsResidue == 0 { zb0004Len-- - zb0004Mask |= 0x100 + zb0004Mask |= 0x200 } if (*z).Block.BlockHeader.GenesisID == "" { zb0004Len-- - zb0004Mask |= 0x200 + zb0004Mask |= 0x400 } if (*z).Block.BlockHeader.GenesisHash.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400 + zb0004Mask |= 0x800 } if (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800 + zb0004Mask |= 0x1000 } if (*z).Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000 + zb0004Mask |= 0x2000 } if (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000 + zb0004Mask |= 0x4000 } if (*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0 { zb0004Len-- - zb0004Mask |= 0x4000 + zb0004Mask |= 0x8000 } if (*z).OriginalPeriod == 0 { zb0004Len-- - zb0004Mask |= 0x8000 + zb0004Mask |= 0x10000 } if (*z).OriginalProposer.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000 + zb0004Mask |= 0x20000 } if len((*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0 { zb0004Len-- - zb0004Mask |= 0x20000 + zb0004Mask |= 0x40000 } if (*z).Block.BlockHeader.Branch.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000 + zb0004Mask |= 0x80000 } if (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000 + zb0004Mask |= 0x100000 } if (*z).Block.BlockHeader.RewardsState.RewardsRate == 0 { zb0004Len-- - zb0004Mask |= 0x100000 + zb0004Mask |= 0x200000 } if (*z).Block.BlockHeader.Round.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000 + zb0004Mask |= 0x400000 } if (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400000 + zb0004Mask |= 0x800000 } if (*z).Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800000 + zb0004Mask |= 0x1000000 } if (*z).SeedProof.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000000 + zb0004Mask |= 0x2000000 } if (*z).Block.BlockHeader.Seed.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000000 + zb0004Mask |= 0x4000000 } if (*z).Block.BlockHeader.TxnCounter == 0 { zb0004Len-- - zb0004Mask |= 0x4000000 + zb0004Mask |= 0x8000000 } if (*z).Block.BlockHeader.TimeStamp == 0 { zb0004Len-- - zb0004Mask |= 0x8000000 + zb0004Mask |= 0x10000000 } - if (*z).Block.BlockHeader.TxnRoot.MsgIsZero() { + if (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000000 + zb0004Mask |= 0x20000000 + } + if (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero() { + zb0004Len-- + zb0004Mask |= 0x40000000 } if (*z).Block.Payset.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x20000000 + zb0004Mask |= 0x80000000 } if (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000000 + zb0004Mask |= 0x100000000 } if (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000000 + zb0004Mask |= 0x200000000 } if (*z).Block.BlockHeader.UpgradeVote.UpgradeApprove == false { zb0004Len-- - zb0004Mask |= 0x100000000 + zb0004Mask |= 0x400000000 } // variable map header, size zb0004Len o = msgp.AppendMapHeader(o, zb0004Len) if zb0004Len != 0 { - if (zb0004Mask & 0x20) == 0 { // if not empty + if (zb0004Mask & 0x40) == 0 { // if not empty // string "cc" o = append(o, 0xa2, 0x63, 0x63) if (*z).Block.BlockHeader.CompactCert == nil { @@ -4784,62 +4834,62 @@ func (z *unauthenticatedProposal) MarshalMsg(b []byte) (o []byte) { o = zb0002.MarshalMsg(o) } } - if (zb0004Mask & 0x40) == 0 { // if not empty + if (zb0004Mask & 0x80) == 0 { // if not empty // string "earn" o = append(o, 0xa4, 0x65, 0x61, 0x72, 0x6e) o = msgp.AppendUint64(o, (*z).Block.BlockHeader.RewardsState.RewardsLevel) } - if (zb0004Mask & 0x80) == 0 { // if not empty + if (zb0004Mask & 0x100) == 0 { // if not empty // string "fees" o = append(o, 0xa4, 0x66, 0x65, 0x65, 0x73) o = (*z).Block.BlockHeader.RewardsState.FeeSink.MarshalMsg(o) } - if (zb0004Mask & 0x100) == 0 { // if not empty + if (zb0004Mask & 0x200) == 0 { // if not empty // string "frac" o = append(o, 0xa4, 0x66, 0x72, 0x61, 0x63) o = msgp.AppendUint64(o, (*z).Block.BlockHeader.RewardsState.RewardsResidue) } - if (zb0004Mask & 0x200) == 0 { // if not empty + if (zb0004Mask & 0x400) == 0 { // if not empty // string "gen" o = append(o, 0xa3, 0x67, 0x65, 0x6e) o = msgp.AppendString(o, (*z).Block.BlockHeader.GenesisID) } - if (zb0004Mask & 0x400) == 0 { // if not empty + if (zb0004Mask & 0x800) == 0 { // if not empty // string "gh" o = append(o, 0xa2, 0x67, 0x68) o = (*z).Block.BlockHeader.GenesisHash.MarshalMsg(o) } - if (zb0004Mask & 0x800) == 0 { // if not empty + if (zb0004Mask & 0x1000) == 0 { // if not empty // string "nextbefore" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65) o = (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MarshalMsg(o) } - if (zb0004Mask & 0x1000) == 0 { // if not empty + if (zb0004Mask & 0x2000) == 0 { // if not empty // string "nextproto" o = append(o, 0xa9, 0x6e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).Block.BlockHeader.UpgradeState.NextProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x2000) == 0 { // if not empty + if (zb0004Mask & 0x4000) == 0 { // if not empty // string "nextswitch" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68) o = (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MarshalMsg(o) } - if (zb0004Mask & 0x4000) == 0 { // if not empty + if (zb0004Mask & 0x8000) == 0 { // if not empty // string "nextyes" o = append(o, 0xa7, 0x6e, 0x65, 0x78, 0x74, 0x79, 0x65, 0x73) o = msgp.AppendUint64(o, (*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals) } - if (zb0004Mask & 0x8000) == 0 { // if not empty + if (zb0004Mask & 0x10000) == 0 { // if not empty // string "oper" o = append(o, 0xa4, 0x6f, 0x70, 0x65, 0x72) o = msgp.AppendUint64(o, uint64((*z).OriginalPeriod)) } - if (zb0004Mask & 0x10000) == 0 { // if not empty + if (zb0004Mask & 0x20000) == 0 { // if not empty // string "oprop" o = append(o, 0xa5, 0x6f, 0x70, 0x72, 0x6f, 0x70) o = (*z).OriginalProposer.MarshalMsg(o) } - if (zb0004Mask & 0x20000) == 0 { // if not empty + if (zb0004Mask & 0x40000) == 0 { // if not empty // string "partupdrmv" o = append(o, 0xaa, 0x70, 0x61, 0x72, 0x74, 0x75, 0x70, 0x64, 0x72, 0x6d, 0x76) if (*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts == nil { @@ -4851,77 +4901,82 @@ func (z *unauthenticatedProposal) MarshalMsg(b []byte) (o []byte) { o = (*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts[zb0003].MarshalMsg(o) } } - if (zb0004Mask & 0x40000) == 0 { // if not empty + if (zb0004Mask & 0x80000) == 0 { // if not empty // string "prev" o = append(o, 0xa4, 0x70, 0x72, 0x65, 0x76) o = (*z).Block.BlockHeader.Branch.MarshalMsg(o) } - if (zb0004Mask & 0x80000) == 0 { // if not empty + if (zb0004Mask & 0x100000) == 0 { // if not empty // string "proto" o = append(o, 0xa5, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x100000) == 0 { // if not empty + if (zb0004Mask & 0x200000) == 0 { // if not empty // string "rate" o = append(o, 0xa4, 0x72, 0x61, 0x74, 0x65) o = msgp.AppendUint64(o, (*z).Block.BlockHeader.RewardsState.RewardsRate) } - if (zb0004Mask & 0x200000) == 0 { // if not empty + if (zb0004Mask & 0x400000) == 0 { // if not empty // string "rnd" o = append(o, 0xa3, 0x72, 0x6e, 0x64) o = (*z).Block.BlockHeader.Round.MarshalMsg(o) } - if (zb0004Mask & 0x400000) == 0 { // if not empty + if (zb0004Mask & 0x800000) == 0 { // if not empty // string "rwcalr" o = append(o, 0xa6, 0x72, 0x77, 0x63, 0x61, 0x6c, 0x72) o = (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MarshalMsg(o) } - if (zb0004Mask & 0x800000) == 0 { // if not empty + if (zb0004Mask & 0x1000000) == 0 { // if not empty // string "rwd" o = append(o, 0xa3, 0x72, 0x77, 0x64) o = (*z).Block.BlockHeader.RewardsState.RewardsPool.MarshalMsg(o) } - if (zb0004Mask & 0x1000000) == 0 { // if not empty + if (zb0004Mask & 0x2000000) == 0 { // if not empty // string "sdpf" o = append(o, 0xa4, 0x73, 0x64, 0x70, 0x66) o = (*z).SeedProof.MarshalMsg(o) } - if (zb0004Mask & 0x2000000) == 0 { // if not empty + if (zb0004Mask & 0x4000000) == 0 { // if not empty // string "seed" o = append(o, 0xa4, 0x73, 0x65, 0x65, 0x64) o = (*z).Block.BlockHeader.Seed.MarshalMsg(o) } - if (zb0004Mask & 0x4000000) == 0 { // if not empty + if (zb0004Mask & 0x8000000) == 0 { // if not empty // string "tc" o = append(o, 0xa2, 0x74, 0x63) o = msgp.AppendUint64(o, (*z).Block.BlockHeader.TxnCounter) } - if (zb0004Mask & 0x8000000) == 0 { // if not empty + if (zb0004Mask & 0x10000000) == 0 { // if not empty // string "ts" o = append(o, 0xa2, 0x74, 0x73) o = msgp.AppendInt64(o, (*z).Block.BlockHeader.TimeStamp) } - if (zb0004Mask & 0x10000000) == 0 { // if not empty + if (zb0004Mask & 0x20000000) == 0 { // if not empty // string "txn" o = append(o, 0xa3, 0x74, 0x78, 0x6e) - o = (*z).Block.BlockHeader.TxnRoot.MarshalMsg(o) + o = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MarshalMsg(o) } - if (zb0004Mask & 0x20000000) == 0 { // if not empty + if (zb0004Mask & 0x40000000) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.MarshalMsg(o) + } + if (zb0004Mask & 0x80000000) == 0 { // if not empty // string "txns" o = append(o, 0xa4, 0x74, 0x78, 0x6e, 0x73) o = (*z).Block.Payset.MarshalMsg(o) } - if (zb0004Mask & 0x40000000) == 0 { // if not empty + if (zb0004Mask & 0x100000000) == 0 { // if not empty // string "upgradedelay" o = append(o, 0xac, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x65, 0x6c, 0x61, 0x79) o = (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MarshalMsg(o) } - if (zb0004Mask & 0x80000000) == 0 { // if not empty + if (zb0004Mask & 0x200000000) == 0 { // if not empty // string "upgradeprop" o = append(o, 0xab, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x70) o = (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MarshalMsg(o) } - if (zb0004Mask & 0x100000000) == 0 { // if not empty + if (zb0004Mask & 0x400000000) == 0 { // if not empty // string "upgradeyes" o = append(o, 0xaa, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x79, 0x65, 0x73) o = msgp.AppendBool(o, (*z).Block.BlockHeader.UpgradeVote.UpgradeApprove) @@ -4974,9 +5029,17 @@ func (z *unauthenticatedProposal) UnmarshalMsg(bts []byte) (o []byte, err error) } if zb0004 > 0 { zb0004-- - bts, err = (*z).Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnRoot") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0004 > 0 { + zb0004-- + bts, err = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } @@ -5266,10 +5329,16 @@ func (z *unauthenticatedProposal) UnmarshalMsg(bts []byte) (o []byte, err error) err = msgp.WrapError(err, "Seed") return } + case "txn256": + bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "txn": - bts, err = (*z).Block.BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "TxnRoot") + err = msgp.WrapError(err, "NativeSha512_256Commitment") return } case "ts": @@ -5489,7 +5558,7 @@ func (_ *unauthenticatedProposal) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *unauthenticatedProposal) Msgsize() (s int) { - s = 3 + 4 + (*z).Block.BlockHeader.Round.Msgsize() + 5 + (*z).Block.BlockHeader.Branch.Msgsize() + 5 + (*z).Block.BlockHeader.Seed.Msgsize() + 4 + (*z).Block.BlockHeader.TxnRoot.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).Block.BlockHeader.GenesisID) + 3 + (*z).Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).Block.BlockHeader.Round.Msgsize() + 5 + (*z).Block.BlockHeader.Branch.Msgsize() + 5 + (*z).Block.BlockHeader.Seed.Msgsize() + 7 + (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).Block.BlockHeader.GenesisID) + 3 + (*z).Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).Block.BlockHeader.CompactCert { _ = zb0001 @@ -5507,7 +5576,7 @@ func (z *unauthenticatedProposal) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *unauthenticatedProposal) MsgIsZero() bool { - return ((*z).Block.BlockHeader.Round.MsgIsZero()) && ((*z).Block.BlockHeader.Branch.MsgIsZero()) && ((*z).Block.BlockHeader.Seed.MsgIsZero()) && ((*z).Block.BlockHeader.TxnRoot.MsgIsZero()) && ((*z).Block.BlockHeader.TimeStamp == 0) && ((*z).Block.BlockHeader.GenesisID == "") && ((*z).Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).Block.BlockHeader.TxnCounter == 0) && (len((*z).Block.BlockHeader.CompactCert) == 0) && (len((*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Block.Payset.MsgIsZero()) && ((*z).SeedProof.MsgIsZero()) && ((*z).OriginalPeriod == 0) && ((*z).OriginalProposer.MsgIsZero()) + return ((*z).Block.BlockHeader.Round.MsgIsZero()) && ((*z).Block.BlockHeader.Branch.MsgIsZero()) && ((*z).Block.BlockHeader.Seed.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TimeStamp == 0) && ((*z).Block.BlockHeader.GenesisID == "") && ((*z).Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).Block.BlockHeader.TxnCounter == 0) && (len((*z).Block.BlockHeader.CompactCert) == 0) && (len((*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Block.Payset.MsgIsZero()) && ((*z).SeedProof.MsgIsZero()) && ((*z).OriginalPeriod == 0) && ((*z).OriginalProposer.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/catchup/fetcher_test.go b/catchup/fetcher_test.go index 55ed33bbc6..44e9ab19fa 100644 --- a/catchup/fetcher_test.go +++ b/catchup/fetcher_test.go @@ -105,7 +105,7 @@ func buildTestLedger(t *testing.T, blk bookkeeping.Block) (ledger *data.Ledger, b.Payset = []transactions.SignedTxnInBlock{ txib, } - b.TxnRoot, err = b.PaysetCommit() + b.TxnCommitments, err = b.PaysetCommit() require.NoError(t, err) require.NoError(t, ledger.AddBlock(b, agreement.Certificate{Round: next})) return @@ -116,7 +116,7 @@ func addBlocks(t *testing.T, ledger *data.Ledger, blk bookkeeping.Block, numBloc for i := 0; i < numBlocks; i++ { blk.BlockHeader.Round++ blk.BlockHeader.TimeStamp += int64(crypto.RandUint64() % 100 * 1000) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) err := ledger.AddBlock(blk, agreement.Certificate{Round: blk.BlockHeader.Round}) diff --git a/config/consensus.go b/config/consensus.go index cb9e1c65e4..07aa9ba84f 100644 --- a/config/consensus.go +++ b/config/consensus.go @@ -435,6 +435,11 @@ type ConsensusParams struct { // UnifyInnerTxIDs enables a consistent, unified way of computing inner transaction IDs UnifyInnerTxIDs bool + + // EnableSHA256TxnCommitmentHeader enables the creation of a transaction vector commitment tree using SHA256 hash function. (vector commitment extends Merkle tree by having a position binding property). + // This new header is in addition to the existing SHA512_256 merkle root. + // It is useful for verifying transaction on different blockchains, as some may not support SHA512_256 OPCODE natively but SHA256 is common. + EnableSHA256TxnCommitmentHeader bool } // PaysetCommitType enumerates possible ways for the block header to commit to @@ -1144,6 +1149,8 @@ func initConsensusProtocols() { vFuture.UnifyInnerTxIDs = true + vFuture.EnableSHA256TxnCommitmentHeader = true + Consensus[protocol.ConsensusFuture] = vFuture } diff --git a/crypto/compactcert/structs.go b/crypto/compactcert/structs.go index dd1a4f3156..9d3aaca168 100644 --- a/crypto/compactcert/structs.go +++ b/crypto/compactcert/structs.go @@ -25,7 +25,7 @@ import ( // Params defines common parameters for the verifier and builder. type Params struct { - Msg crypto.Hashable // Message to be cerified + Msg crypto.Hashable // Message to be certified ProvenWeight uint64 // Weight threshold proven by the certificate SigRound basics.Round // The round for which the ephemeral key is committed to SecKQ uint64 // Security parameter (k+q) from analysis document diff --git a/crypto/hashes.go b/crypto/hashes.go index 51db955242..67ccdafc0c 100644 --- a/crypto/hashes.go +++ b/crypto/hashes.go @@ -17,6 +17,7 @@ package crypto import ( + "crypto/sha256" "crypto/sha512" "errors" "fmt" @@ -41,7 +42,7 @@ func (h HashType) Validate() error { const ( Sha512_256 HashType = iota Sumhash - + Sha256 MaxHashType ) @@ -53,6 +54,7 @@ const MaxHashDigestSize = SumhashDigestSize const ( Sha512_256Size = sha512.Size256 SumhashDigestSize = sumhash.Sumhash512DigestSize + Sha256Size = sha256.Size ) // HashFactory is responsible for generating new hashes accordingly to the type it stores. @@ -71,6 +73,8 @@ func (h HashType) String() string { return "sha512_256" case Sumhash: return "sumhash" + case Sha256: + return "sha256" default: return "" } @@ -83,6 +87,8 @@ func UnmarshalHashType(s string) (HashType, error) { return Sha512_256, nil case "sumhash": return Sumhash, nil + case "sha256": + return Sha256, nil default: return 0, fmt.Errorf("HashType not supported: %s", s) } @@ -96,6 +102,8 @@ func (z HashFactory) NewHash() hash.Hash { return sha512.New512_256() case Sumhash: return sumhash.New512(nil) + case Sha256: + return sha256.New() // This shouldn't be reached, when creating a new hash, one would know the type of hash they wanted, // in addition to that, unmarshalling of the hashFactory verifies the HashType of the factory. default: diff --git a/crypto/hashes_test.go b/crypto/hashes_test.go index 2ebff4239d..a3054d298a 100644 --- a/crypto/hashes_test.go +++ b/crypto/hashes_test.go @@ -37,6 +37,9 @@ func TestHashFactoryCreatingNewHashes(t *testing.T) { a.NotNil(h) a.Equal(SumhashDigestSize, h.Size()) + h = HashFactory{HashType: Sha256}.NewHash() + a.NotNil(h) + a.Equal(Sha256Size, h.Size()) } func TestHashSum(t *testing.T) { diff --git a/crypto/merklearray/merkle_test.go b/crypto/merklearray/merkle_test.go index 2fa9c4a409..0f87474e52 100644 --- a/crypto/merklearray/merkle_test.go +++ b/crypto/merklearray/merkle_test.go @@ -17,6 +17,7 @@ package merklearray import ( + "encoding/hex" "fmt" "hash" "runtime" @@ -29,9 +30,10 @@ import ( "github.com/algorand/go-algorand/test/partitiontest" ) +// Hex encoded strings representing the byte arrays type KATElement struct { - expectedRoot []byte - elements [][]byte + expectedRoot string + elements []string } type TestMessage string @@ -589,84 +591,174 @@ func testMerkelSizeLimits(t *testing.T, hashtype crypto.HashType, size uint64, p return tree, proof } -var KATs = []KATElement{ +var KATsSHA256 = []KATElement{ { - []byte{223, 165, 76, 43, 118, 131, 205, 83, 151, 176, 50, 187, 236, 17, 236, 27, 119, 185, 251, 236, 90, 86, 201, 233, 66, 15, 107, 153, 128, 120, 64, 52}, - [][]byte{{212, 60, 103, 72, 82, 10, 118, 248, 31, 184, 37, 10, 169, 225, 166, 86, 240, 115, 255, 241, 229, 81, 86, 47, 173, 67, 233, 255, 251, 26, 184, 139}}, + "5a7fb9d3fb8976d942feac36d762b8d0530476c022c297582123eca18ad8c7b8", + []string{ + "d43c6748520a76f81fb8250aa9e1a656f073fff1e551562fad43e9fffb1ab88b", + }, + }, + { + "c9bc24bd5fc8961a8721458fd93044871c9009fe4c66b9614744dd6e9216d93f", + []string{ + "27a9011335fc96dc095f348a6c9347d3c7cdd56c57c650297d87df95d13f770b", + "5878453e4d5bce024b4ee07f6c57186868f3410348f5a7d601c0d9ce1efed239", + }, + }, + { + "ad1828b8460ec541fdbeee2eb4f9d37cfad9da54c0c3a98b1eb20d24de9af6ce", + []string{ + "44b5606ae49d81bc7f3451c4ff803998a8fe0057e22d6367080e5a155b661008", + "70ce7df8bda42920f5e75ae788ee7b9809826a92701a4e0e490138380ea60f44", + "77b439e99f764a1f6749e669b1361fe3bb5ce41beac4b5cd55fe51aa9efe3c67", + }, + }, + { + "d78b0c411d1360bd6d49c755a60f9ada519942911411269637287bd0b5c19bab", + []string{ + "faae213dd72151728a24c36f9aa3e07efbe326c058f85f6822c1dc2175e09d99", + "29e90fcc4b1c9513bc155c018db796d07e97c7a5009bd7a5eed4281e93de9413", + "f93c340847344999651c1bd71949cb974c7cad7bd421ccc677670f686ae520cc", + "76a8ebfe26a3353c2702937191dd766215689e5a07bda60fffd48ecfc22084d4", + }, + }, + { + "f8744f4648d1974c38fca858873006126d93f1a150f0eb7da1072fef83e66341", + []string{ + "fc2d600b2e43457221e35fcf4275221f66d6ce250b8696879d7ce7a4974f975d", + "a3fa0c2e13151fd3c3d002a5450819ae7150a1172decad45e2aa93056ab245b6", + "eb0e437994a16b1c3b8dfee99b6e8630c7bbb12f88759eb774b4e3935c551106", + "3a44dce2fba3f26f0e0ae2c47483e8cb1d815f9d9981f030edc380d4efac4f57", + "52c4079055e96c3ef3114ca93188410e8a8a08aa7e53dfb2bb18c301756faf9e", + }, + }, +} + +var KATsSUMHASH = []KATElement{ + { + "a1951e9ec9d630a975fbbdf5fa290f66bf2c55fbf5ec5ad5de08d281a971d97a64a0475d6d93ddda4480b1dbaaf33f7d72f79f9076da029e148fca0ba354b58c", + []string{ + "d43c6748520a76f81fb8250aa9e1a656f073fff1e551562fad43e9fffb1ab88b", + }, + }, + { + "8b60182211195e366021236b8bd26b004f0773f41de837dff8c483357d26aff1c06c8692b96df11fe30b2c87e6400a005d7f6e71e9b3b1f39207fe4525719cd2", + []string{ + "27a9011335fc96dc095f348a6c9347d3c7cdd56c57c650297d87df95d13f770b", + "5878453e4d5bce024b4ee07f6c57186868f3410348f5a7d601c0d9ce1efed239", + }, + }, + { + "8c427bfa1723d733b20ac58e2ce6c9791a25e9bdd57e1dc252e98b6b909a089e1c9077cea3852df6495cacbe750f41a777c593e5ce5d132d49b354b2790ae9a8", + []string{ + "44b5606ae49d81bc7f3451c4ff803998a8fe0057e22d6367080e5a155b661008", + "70ce7df8bda42920f5e75ae788ee7b9809826a92701a4e0e490138380ea60f44", + "77b439e99f764a1f6749e669b1361fe3bb5ce41beac4b5cd55fe51aa9efe3c67", + }, }, { - []byte{117, 207, 58, 54, 89, 80, 47, 147, 38, 223, 250, 114, 218, 81, 102, 235, 222, 29, 19, 246, 82, 156, 146, 35, 36, 135, 70, 68, 244, 183, 97, 110}, - [][]byte{ - {39, 169, 1, 19, 53, 252, 150, 220, 9, 95, 52, 138, 108, 147, 71, 211, 199, 205, 213, 108, 87, 198, 80, 41, 125, 135, 223, 149, 209, 63, 119, 11}, - {88, 120, 69, 62, 77, 91, 206, 2, 75, 78, 224, 127, 108, 87, 24, 104, 104, 243, 65, 3, 72, 245, 167, 214, 1, 192, 217, 206, 30, 254, 210, 57}, + "09b34fb15d43b16a22e7830ede8df4f84f4b63f46af2f6843aaf36a08c5652bcdf033162e2002c658265f4395058af1b4cef13dee70ebef4ca2cd8e870bd50c6", + []string{ + "faae213dd72151728a24c36f9aa3e07efbe326c058f85f6822c1dc2175e09d99", + "29e90fcc4b1c9513bc155c018db796d07e97c7a5009bd7a5eed4281e93de9413", + "f93c340847344999651c1bd71949cb974c7cad7bd421ccc677670f686ae520cc", + "76a8ebfe26a3353c2702937191dd766215689e5a07bda60fffd48ecfc22084d4", }, }, { - []byte{7, 177, 51, 83, 39, 122, 156, 203, 107, 66, 79, 87, 58, 180, 252, 158, 38, 138, 1, 39, 206, 188, 73, 150, 82, 146, 64, 181, 226, 155, 109, 233}, - [][]byte{ - {68, 181, 96, 106, 228, 157, 129, 188, 127, 52, 81, 196, 255, 128, 57, 152, 168, 254, 0, 87, 226, 45, 99, 103, 8, 14, 90, 21, 91, 102, 16, 8}, - {112, 206, 125, 248, 189, 164, 41, 32, 245, 231, 90, 231, 136, 238, 123, 152, 9, 130, 106, 146, 112, 26, 78, 14, 73, 1, 56, 56, 14, 166, 15, 68}, - {119, 180, 57, 233, 159, 118, 74, 31, 103, 73, 230, 105, 177, 54, 31, 227, 187, 92, 228, 27, 234, 196, 181, 205, 85, 254, 81, 170, 158, 254, 60, 103}, + "6a55c0f451c211e1c961871cc0bb640c103768f0d25ddfa0b1c1d054e92adcd1480cdca21af805da887540d343fe78a3a515c761becc7e66371b740f6ff13b6b", + []string{ + "fc2d600b2e43457221e35fcf4275221f66d6ce250b8696879d7ce7a4974f975d", + "a3fa0c2e13151fd3c3d002a5450819ae7150a1172decad45e2aa93056ab245b6", + "eb0e437994a16b1c3b8dfee99b6e8630c7bbb12f88759eb774b4e3935c551106", + "3a44dce2fba3f26f0e0ae2c47483e8cb1d815f9d9981f030edc380d4efac4f57", + "52c4079055e96c3ef3114ca93188410e8a8a08aa7e53dfb2bb18c301756faf9e", + }, + }, +} + +var KATsSHA512_256 = []KATElement{ + { + "dfa54c2b7683cd5397b032bbec11ec1b77b9fbec5a56c9e9420f6b9980784034", + []string{ + "d43c6748520a76f81fb8250aa9e1a656f073fff1e551562fad43e9fffb1ab88b", }, }, { - []byte{50, 251, 85, 206, 75, 56, 190, 244, 154, 96, 138, 178, 226, 117, 12, 255, 22, 50, 26, 246, 34, 43, 225, 20, 151, 233, 26, 249, 252, 146, 165, 63}, - [][]byte{ - {250, 174, 33, 61, 215, 33, 81, 114, 138, 36, 195, 111, 154, 163, 224, 126, 251, 227, 38, 192, 88, 248, 95, 104, 34, 193, 220, 33, 117, 224, 157, 153}, - {41, 233, 15, 204, 75, 28, 149, 19, 188, 21, 92, 1, 141, 183, 150, 208, 126, 151, 199, 165, 0, 155, 215, 165, 238, 212, 40, 30, 147, 222, 148, 19}, - {249, 60, 52, 8, 71, 52, 73, 153, 101, 28, 27, 215, 25, 73, 203, 151, 76, 124, 173, 123, 212, 33, 204, 198, 119, 103, 15, 104, 106, 229, 32, 204}, - {118, 168, 235, 254, 38, 163, 53, 60, 39, 2, 147, 113, 145, 221, 118, 98, 21, 104, 158, 90, 7, 189, 166, 15, 255, 212, 142, 207, 194, 32, 132, 212}, + "75cf3a3659502f9326dffa72da5166ebde1d13f6529c922324874644f4b7616e", + []string{ + "27a9011335fc96dc095f348a6c9347d3c7cdd56c57c650297d87df95d13f770b", + "5878453e4d5bce024b4ee07f6c57186868f3410348f5a7d601c0d9ce1efed239", }, }, { - []byte{23, 88, 226, 198, 37, 223, 43, 60, 98, 133, 183, 139, 102, 123, 221, 123, 0, 86, 205, 53, 28, 245, 228, 182, 120, 52, 206, 148, 27, 1, 84, 194}, - [][]byte{ - {252, 45, 96, 11, 46, 67, 69, 114, 33, 227, 95, 207, 66, 117, 34, 31, 102, 214, 206, 37, 11, 134, 150, 135, 157, 124, 231, 164, 151, 79, 151, 93}, - {163, 250, 12, 46, 19, 21, 31, 211, 195, 208, 2, 165, 69, 8, 25, 174, 113, 80, 161, 23, 45, 236, 173, 69, 226, 170, 147, 5, 106, 178, 69, 182}, - {235, 14, 67, 121, 148, 161, 107, 28, 59, 141, 254, 233, 155, 110, 134, 48, 199, 187, 177, 47, 136, 117, 158, 183, 116, 180, 227, 147, 92, 85, 17, 6}, - {58, 68, 220, 226, 251, 163, 242, 111, 14, 10, 226, 196, 116, 131, 232, 203, 29, 129, 95, 157, 153, 129, 240, 48, 237, 195, 128, 212, 239, 172, 79, 87}, - {82, 196, 7, 144, 85, 233, 108, 62, 243, 17, 76, 169, 49, 136, 65, 14, 138, 138, 8, 170, 126, 83, 223, 178, 187, 24, 195, 1, 117, 111, 175, 158}, + "07b13353277a9ccb6b424f573ab4fc9e268a0127cebc4996529240b5e29b6de9", + []string{ + "44b5606ae49d81bc7f3451c4ff803998a8fe0057e22d6367080e5a155b661008", + "70ce7df8bda42920f5e75ae788ee7b9809826a92701a4e0e490138380ea60f44", + "77b439e99f764a1f6749e669b1361fe3bb5ce41beac4b5cd55fe51aa9efe3c67", + }, + }, + { + "32fb55ce4b38bef49a608ab2e2750cff16321af6222be11497e91af9fc92a53f", + []string{ + "faae213dd72151728a24c36f9aa3e07efbe326c058f85f6822c1dc2175e09d99", + "29e90fcc4b1c9513bc155c018db796d07e97c7a5009bd7a5eed4281e93de9413", + "f93c340847344999651c1bd71949cb974c7cad7bd421ccc677670f686ae520cc", + "76a8ebfe26a3353c2702937191dd766215689e5a07bda60fffd48ecfc22084d4", + }, + }, + { + "1758e2c625df2b3c6285b78b667bdd7b0056cd351cf5e4b67834ce941b0154c2", + []string{ + "fc2d600b2e43457221e35fcf4275221f66d6ce250b8696879d7ce7a4974f975d", + "a3fa0c2e13151fd3c3d002a5450819ae7150a1172decad45e2aa93056ab245b6", + "eb0e437994a16b1c3b8dfee99b6e8630c7bbb12f88759eb774b4e3935c551106", + "3a44dce2fba3f26f0e0ae2c47483e8cb1d815f9d9981f030edc380d4efac4f57", + "52c4079055e96c3ef3114ca93188410e8a8a08aa7e53dfb2bb18c301756faf9e", }, }, } var VCKATs = []KATElement{ { - []byte{223, 165, 76, 43, 118, 131, 205, 83, 151, 176, 50, 187, 236, 17, 236, 27, 119, 185, 251, 236, 90, 86, 201, 233, 66, 15, 107, 153, 128, 120, 64, 52}, - [][]byte{{212, 60, 103, 72, 82, 10, 118, 248, 31, 184, 37, 10, 169, 225, 166, 86, 240, 115, 255, 241, 229, 81, 86, 47, 173, 67, 233, 255, 251, 26, 184, 139}}, + "dfa54c2b7683cd5397b032bbec11ec1b77b9fbec5a56c9e9420f6b9980784034", + []string{ + "d43c6748520a76f81fb8250aa9e1a656f073fff1e551562fad43e9fffb1ab88b", + }, }, { - []byte{117, 207, 58, 54, 89, 80, 47, 147, 38, 223, 250, 114, 218, 81, 102, 235, 222, 29, 19, 246, 82, 156, 146, 35, 36, 135, 70, 68, 244, 183, 97, 110}, - [][]byte{ - {39, 169, 1, 19, 53, 252, 150, 220, 9, 95, 52, 138, 108, 147, 71, 211, 199, 205, 213, 108, 87, 198, 80, 41, 125, 135, 223, 149, 209, 63, 119, 11}, - {88, 120, 69, 62, 77, 91, 206, 2, 75, 78, 224, 127, 108, 87, 24, 104, 104, 243, 65, 3, 72, 245, 167, 214, 1, 192, 217, 206, 30, 254, 210, 57}, + "75cf3a3659502f9326dffa72da5166ebde1d13f6529c922324874644f4b7616e", + []string{ + "27a9011335fc96dc095f348a6c9347d3c7cdd56c57c650297d87df95d13f770b", + "5878453e4d5bce024b4ee07f6c57186868f3410348f5a7d601c0d9ce1efed239", }, }, { - []byte{56, 245, 10, 65, 222, 10, 236, 127, 224, 228, 244, 247, 143, 31, 84, 13, 93, 198, 17, 209, 144, 160, 206, 206, 111, 1, 40, 234, 42, 2, 127, 94}, - [][]byte{ - {68, 181, 96, 106, 228, 157, 129, 188, 127, 52, 81, 196, 255, 128, 57, 152, 168, 254, 0, 87, 226, 45, 99, 103, 8, 14, 90, 21, 91, 102, 16, 8}, - {112, 206, 125, 248, 189, 164, 41, 32, 245, 231, 90, 231, 136, 238, 123, 152, 9, 130, 106, 146, 112, 26, 78, 14, 73, 1, 56, 56, 14, 166, 15, 68}, - {119, 180, 57, 233, 159, 118, 74, 31, 103, 73, 230, 105, 177, 54, 31, 227, 187, 92, 228, 27, 234, 196, 181, 205, 85, 254, 81, 170, 158, 254, 60, 103}, + "38f50a41de0aec7fe0e4f4f78f1f540d5dc611d190a0cece6f0128ea2a027f5e", + []string{ + "44b5606ae49d81bc7f3451c4ff803998a8fe0057e22d6367080e5a155b661008", + "70ce7df8bda42920f5e75ae788ee7b9809826a92701a4e0e490138380ea60f44", + "77b439e99f764a1f6749e669b1361fe3bb5ce41beac4b5cd55fe51aa9efe3c67", }, }, { - []byte{149, 179, 79, 29, 252, 65, 254, 212, 129, 21, 202, 49, 189, 67, 34, 93, 255, 147, 245, 64, 56, 124, 35, 10, 207, 166, 67, 226, 103, 248, 141, 120}, - [][]byte{ - {250, 174, 33, 61, 215, 33, 81, 114, 138, 36, 195, 111, 154, 163, 224, 126, 251, 227, 38, 192, 88, 248, 95, 104, 34, 193, 220, 33, 117, 224, 157, 153}, - {41, 233, 15, 204, 75, 28, 149, 19, 188, 21, 92, 1, 141, 183, 150, 208, 126, 151, 199, 165, 0, 155, 215, 165, 238, 212, 40, 30, 147, 222, 148, 19}, - {249, 60, 52, 8, 71, 52, 73, 153, 101, 28, 27, 215, 25, 73, 203, 151, 76, 124, 173, 123, 212, 33, 204, 198, 119, 103, 15, 104, 106, 229, 32, 204}, - {118, 168, 235, 254, 38, 163, 53, 60, 39, 2, 147, 113, 145, 221, 118, 98, 21, 104, 158, 90, 7, 189, 166, 15, 255, 212, 142, 207, 194, 32, 132, 212}, + "95b34f1dfc41fed48115ca31bd43225dff93f540387c230acfa643e267f88d78", + []string{ + "faae213dd72151728a24c36f9aa3e07efbe326c058f85f6822c1dc2175e09d99", + "29e90fcc4b1c9513bc155c018db796d07e97c7a5009bd7a5eed4281e93de9413", + "f93c340847344999651c1bd71949cb974c7cad7bd421ccc677670f686ae520cc", + "76a8ebfe26a3353c2702937191dd766215689e5a07bda60fffd48ecfc22084d4", }, }, { - []byte{151, 119, 38, 117, 253, 236, 112, 179, 1, 14, 240, 139, 87, 243, 203, 241, 230, 247, 178, 63, 65, 17, 80, 118, 188, 195, 74, 221, 141, 140, 10, 27}, - [][]byte{ - {252, 45, 96, 11, 46, 67, 69, 114, 33, 227, 95, 207, 66, 117, 34, 31, 102, 214, 206, 37, 11, 134, 150, 135, 157, 124, 231, 164, 151, 79, 151, 93}, - {163, 250, 12, 46, 19, 21, 31, 211, 195, 208, 2, 165, 69, 8, 25, 174, 113, 80, 161, 23, 45, 236, 173, 69, 226, 170, 147, 5, 106, 178, 69, 182}, - {235, 14, 67, 121, 148, 161, 107, 28, 59, 141, 254, 233, 155, 110, 134, 48, 199, 187, 177, 47, 136, 117, 158, 183, 116, 180, 227, 147, 92, 85, 17, 6}, - {58, 68, 220, 226, 251, 163, 242, 111, 14, 10, 226, 196, 116, 131, 232, 203, 29, 129, 95, 157, 153, 129, 240, 48, 237, 195, 128, 212, 239, 172, 79, 87}, - {82, 196, 7, 144, 85, 233, 108, 62, 243, 17, 76, 169, 49, 136, 65, 14, 138, 138, 8, 170, 126, 83, 223, 178, 187, 24, 195, 1, 117, 111, 175, 158}, + "97772675fdec70b3010ef08b57f3cbf1e6f7b23f41115076bcc34add8d8c0a1b", + []string{ + "fc2d600b2e43457221e35fcf4275221f66d6ce250b8696879d7ce7a4974f975d", + "a3fa0c2e13151fd3c3d002a5450819ae7150a1172decad45e2aa93056ab245b6", + "eb0e437994a16b1c3b8dfee99b6e8630c7bbb12f88759eb774b4e3935c551106", + "3a44dce2fba3f26f0e0ae2c47483e8cb1d815f9d9981f030edc380d4efac4f57", + "52c4079055e96c3ef3114ca93188410e8a8a08aa7e53dfb2bb18c301756faf9e", }, }, } @@ -674,16 +766,24 @@ var VCKATs = []KATElement{ func TestMerkleTreeKATs(t *testing.T) { partitiontest.PartitionTest(t) + testMerkleTreeKATsAux(t, KATsSHA512_256, crypto.Sha512_256) + testMerkleTreeKATsAux(t, KATsSUMHASH, crypto.Sumhash) + testMerkleTreeKATsAux(t, KATsSHA256, crypto.Sha256) +} + +func testMerkleTreeKATsAux(t *testing.T, KATs []KATElement, hashType crypto.HashType) { for j := 0; j < len(KATs); j++ { a := make(TestArray, len(KATs[j].elements)) for i := 0; i < len(KATs[j].elements); i++ { - copy(a[i][:], KATs[j].elements[i]) + decodedBytes, err := hex.DecodeString(KATs[j].elements[i]) + require.NoError(t, err) + copy(a[i][:], decodedBytes) } root := KATs[j].expectedRoot - tree, err := Build(a, crypto.HashFactory{HashType: crypto.Sha512_256}) + tree, err := Build(a, crypto.HashFactory{HashType: hashType}) require.NoError(t, err) - root2 := tree.Root() - require.Equal(t, root, []byte(root2), "mismatched roots on KATs index %d", j) + root2 := hex.EncodeToString(tree.Root()) + require.Equal(t, root, root2, "mismatched roots on KATs %s index %d", hashType.String(), j) } } @@ -693,13 +793,15 @@ func TestVCKATs(t *testing.T) { for j := 0; j < len(VCKATs); j++ { a := make(TestArray, len(VCKATs[j].elements)) for i := 0; i < len(VCKATs[j].elements); i++ { - copy(a[i][:], VCKATs[j].elements[i]) + decodedBytes, err := hex.DecodeString(VCKATs[j].elements[i]) + require.NoError(t, err) + copy(a[i][:], decodedBytes) } root := VCKATs[j].expectedRoot tree, err := BuildVectorCommitmentTree(a, crypto.HashFactory{HashType: crypto.Sha512_256}) require.NoError(t, err) - root2 := tree.Root() - require.Equal(t, root, []byte(root2), "mismatched roots on KATs index %d", j) + root2 := hex.EncodeToString(tree.Root()) + require.Equal(t, root, root2, "mismatched roots on VCKATs index %d", j) } } @@ -1062,6 +1164,7 @@ func TestVCProveSingleLeaf(t *testing.T) { func BenchmarkMerkleCommit(b *testing.B) { b.Run("sha512_256", func(b *testing.B) { merkleCommitBench(b, crypto.Sha512_256) }) b.Run("sumhash", func(b *testing.B) { merkleCommitBench(b, crypto.Sumhash) }) + b.Run("sha256", func(b *testing.B) { merkleCommitBench(b, crypto.Sha256) }) } func merkleCommitBench(b *testing.B, hashType crypto.HashType) { @@ -1088,6 +1191,7 @@ func merkleCommitBench(b *testing.B, hashType crypto.HashType) { func BenchmarkMerkleProve1M(b *testing.B) { b.Run("sha512_256", func(b *testing.B) { benchmarkMerkleProve1M(b, crypto.Sha512_256) }) b.Run("sumhash", func(b *testing.B) { benchmarkMerkleProve1M(b, crypto.Sumhash) }) + b.Run("sha256", func(b *testing.B) { benchmarkMerkleProve1M(b, crypto.Sha256) }) } func benchmarkMerkleProve1M(b *testing.B, hashType crypto.HashType) { @@ -1113,6 +1217,7 @@ func benchmarkMerkleProve1M(b *testing.B, hashType crypto.HashType) { func BenchmarkMerkleVerify1M(b *testing.B) { b.Run("sha512_256", func(b *testing.B) { benchmarkMerkleVerify1M(b, crypto.Sha512_256) }) b.Run("sumhash", func(b *testing.B) { benchmarkMerkleVerify1M(b, crypto.Sumhash) }) + b.Run("sha256", func(b *testing.B) { benchmarkMerkleVerify1M(b, crypto.Sha256) }) } func benchmarkMerkleVerify1M(b *testing.B, hashType crypto.HashType) { diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 8202ce1caa..d63573897c 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -549,6 +549,17 @@ "in": "path", "required": true }, + { + "type": "string", + "enum": [ + "sha512_256", + "sha256" + ], + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", + "name": "hashtype", + "in": "query", + "required": false + }, { "$ref": "#/parameters/format" } @@ -2801,12 +2812,12 @@ "type": "integer" }, "hashtype": { + "type": "string", "enum": [ - "sumhash", - "sha512_256" + "sha512_256", + "sha256" ], - "type": "string", - "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256" + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256" } } } diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index bb8b76408c..4228e6c636 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -620,10 +620,10 @@ "schema": { "properties": { "hashtype": { - "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256", + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", "enum": [ - "sumhash", - "sha512_256" + "sha512_256", + "sha256" ], "type": "string" }, @@ -2606,6 +2606,18 @@ "type": "string" } }, + { + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", + "in": "query", + "name": "hashtype", + "schema": { + "enum": [ + "sha512_256", + "sha256" + ], + "type": "string" + } + }, { "description": "Configures whether the response object is JSON or MessagePack encoded.", "in": "query", @@ -2626,10 +2638,10 @@ "schema": { "properties": { "hashtype": { - "description": "The type of hash function used to create the proof, must be one of:\n* sumhash \n* sha512_256", + "description": "The type of hash function used to create the proof, must be one of: \n* sha512_256 \n* sha256", "enum": [ - "sumhash", - "sha512_256" + "sha512_256", + "sha256" ], "type": "string" }, diff --git a/daemon/algod/api/client/restClient.go b/daemon/algod/api/client/restClient.go index 596a8d4581..ecaafc6360 100644 --- a/daemon/algod/api/client/restClient.go +++ b/daemon/algod/api/client/restClient.go @@ -369,6 +369,10 @@ type rawFormat struct { Format string `url:"format"` } +type proofParams struct { + HashType string `url:"hashtype"` +} + type accountInformationParams struct { Format string `url:"format"` Exclude string `url:"exclude"` @@ -651,9 +655,9 @@ func (client RestClient) RawDryrun(data []byte) (response []byte, err error) { } // Proof gets a Merkle proof for a transaction in a block. -func (client RestClient) Proof(txid string, round uint64) (response generatedV2.ProofResponse, err error) { +func (client RestClient) Proof(txid string, round uint64, hashType crypto.HashType) (response generatedV2.ProofResponse, err error) { txid = stripTransaction(txid) - err = client.get(&response, fmt.Sprintf("/v2/blocks/%d/transactions/%s/proof", round, txid), nil) + err = client.get(&response, fmt.Sprintf("/v2/blocks/%d/transactions/%s/proof", round, txid), proofParams{HashType: hashType.String()}) return } diff --git a/daemon/algod/api/server/lib/bundledSpecInject.go b/daemon/algod/api/server/lib/bundledSpecInject.go index cd8f380d0f..fefff94163 100644 --- a/daemon/algod/api/server/lib/bundledSpecInject.go +++ b/daemon/algod/api/server/lib/bundledSpecInject.go @@ -2668,230 +2668,189 @@ func init() { 0x2E, 0x5C, 0x6E, 0x46, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6D, 0x70, 0x74, 0x79, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x2C, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x30, 0x2E, 0x5C, 0x6E, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, - 0x78, 0x6E, 0x52, 0x6F, 0x6F, 0x74, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, - 0x61, 0x75, 0x74, 0x68, 0x65, 0x6E, 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x69, 0x67, 0x6E, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x6F, 0x6E, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2C, - 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6D, 0x73, 0x65, 0x6C, 0x76, 0x65, - 0x73, 0x2E, 0x5C, 0x6E, 0x54, 0x77, 0x6F, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x73, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6D, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6E, - 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x6F, 0x72, 0x64, - 0x65, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x64, 0x69, 0x66, 0x66, - 0x65, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x61, 0x6D, 0x65, 0x20, 0x54, 0x78, 0x6E, 0x52, 0x6F, 0x6F, 0x74, 0x2E, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, - 0x6F, 0x6F, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x6E, 0x73, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, - 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, - 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, - 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, - 0x70, 0x70, 0x72, 0x6F, 0x76, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, - 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x70, 0x70, 0x72, - 0x6F, 0x76, 0x65, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, - 0x79, 0x65, 0x73, 0x20, 0x76, 0x6F, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x61, - 0x6C, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, - 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x41, 0x70, 0x70, 0x72, 0x6F, 0x76, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x50, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x73, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x64, 0x20, 0x75, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, - 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, - 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x50, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, - 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, - 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, - 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, - 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, - 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, - 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, - 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x20, 0x62, 0x75, 0x69, - 0x6C, 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x5F, 0x6E, - 0x75, 0x6D, 0x62, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x5F, 0x68, 0x61, 0x73, 0x68, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x72, 0x61, 0x6E, 0x63, 0x68, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6E, 0x6E, 0x65, - 0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x72, 0x61, 0x6E, 0x63, - 0x68, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, - 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x72, 0x61, 0x6E, 0x63, 0x68, + 0x78, 0x6E, 0x43, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x20, 0x64, 0x6F, + 0x65, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6E, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x20, 0x6F, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2C, 0x20, 0x6F, 0x6E, 0x6C, 0x79, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x6D, 0x73, 0x65, 0x6C, 0x76, 0x65, 0x73, 0x2E, 0x5C, 0x6E, 0x54, 0x77, 0x6F, 0x20, 0x62, + 0x6C, 0x6F, 0x63, 0x6B, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x61, 0x6D, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, + 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, + 0x65, 0x6E, 0x74, 0x20, 0x6F, 0x72, 0x64, 0x65, 0x72, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x77, 0x69, + 0x74, 0x68, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, + 0x6E, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6D, 0x65, 0x20, 0x54, 0x78, 0x6E, 0x43, 0x6F, + 0x6D, 0x6D, 0x69, 0x74, 0x6D, 0x65, 0x6E, 0x74, 0x73, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x6F, 0x6F, + 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, + 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x5F, 0x6E, 0x75, 0x6D, 0x62, - 0x65, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, - 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x4E, 0x75, - 0x6D, 0x62, 0x65, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6E, 0x6E, 0x65, - 0x6C, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x70, 0x70, + 0x72, 0x6F, 0x76, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, + 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x70, 0x70, 0x72, 0x6F, 0x76, + 0x65, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x20, 0x79, 0x65, + 0x73, 0x20, 0x76, 0x6F, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x70, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x61, 0x6C, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, + 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x70, + 0x70, 0x72, 0x6F, 0x76, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x50, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, + 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x70, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x64, 0x20, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, - 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, - 0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x5F, 0x68, 0x61, - 0x73, 0x68, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, - 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6D, 0x6D, 0x69, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, + 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x50, 0x72, 0x6F, 0x70, 0x6F, 0x73, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, + 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, + 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, + 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, + 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x20, 0x62, 0x75, 0x69, 0x6C, 0x64, + 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x5F, 0x6E, 0x75, 0x6D, + 0x62, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, + 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x5F, 0x68, 0x61, 0x73, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x72, 0x61, 0x6E, 0x63, 0x68, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x72, 0x61, 0x6E, 0x63, 0x68, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, + 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x72, 0x61, 0x6E, 0x63, 0x68, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6C, 0x64, 0x5F, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, - 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, - 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, - 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4D, 0x69, - 0x6E, 0x6F, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, - 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, - 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, - 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, - 0x73, 0x70, 0x65, 0x63, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, - 0x43, 0x65, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, - 0x6D, 0x70, 0x61, 0x63, 0x74, 0x43, 0x65, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, - 0x20, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6F, - 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6E, - 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x72, - 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x72, 0x74, 0x22, - 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x65, - 0x72, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x73, 0x67, 0x70, 0x61, 0x63, - 0x6B, 0x20, 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, - 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x43, 0x65, 0x72, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6E, 0x64, 0x22, - 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x65, - 0x72, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, - 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x77, 0x68, 0x6F, 0x73, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, - 0x72, 0x74, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6F, 0x2E, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, - 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x43, 0x65, 0x72, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, - 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, - 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, - 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4B, 0x65, - 0x79, 0x72, 0x65, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4B, 0x65, - 0x79, 0x72, 0x65, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, - 0x79, 0x70, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x66, 0x69, 0x65, 0x6C, - 0x64, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x6B, 0x65, 0x79, 0x72, 0x65, 0x67, 0x20, - 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, - 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x65, 0x6C, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x56, 0x52, 0x46, - 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x20, 0x69, 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x4E, 0x75, 0x6D, 0x62, + 0x65, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x22, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, + 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x66, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, - 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x69, - 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x5F, 0x68, 0x61, 0x73, 0x68, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, + 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x48, + 0x61, 0x73, 0x68, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4D, 0x61, 0x6A, 0x6F, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, - 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, - 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, - 0x6B, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, - 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x32, 0x2D, 0x6C, 0x65, 0x76, 0x65, 0x6C, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6B, - 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, - 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, - 0x65, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, - 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, + 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, + 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, + 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4D, 0x69, 0x6E, 0x6F, + 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, + 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, + 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, + 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, + 0x65, 0x63, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x43, 0x65, + 0x72, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6D, 0x70, + 0x61, 0x63, 0x74, 0x43, 0x65, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x66, + 0x69, 0x65, 0x6C, 0x64, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x63, 0x6F, 0x6D, 0x70, + 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, + 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6E, 0x64, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x72, 0x74, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x65, 0x72, 0x74, 0x22, 0x3A, 0x20, + 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x65, 0x72, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x73, 0x67, 0x70, 0x61, 0x63, 0x6B, 0x20, + 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, 0x2E, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, + 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x43, 0x65, 0x72, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6E, 0x64, 0x22, 0x3A, 0x20, + 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x65, 0x72, 0x74, + 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6F, 0x75, + 0x6E, 0x64, 0x20, 0x77, 0x68, 0x6F, 0x73, 0x65, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x20, 0x63, 0x65, 0x72, 0x74, + 0x20, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x20, 0x74, 0x6F, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, + 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x43, 0x65, 0x72, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, + 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, + 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, + 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, + 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4B, 0x65, 0x79, 0x72, + 0x65, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4B, 0x65, 0x79, 0x72, + 0x65, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x73, + 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x6B, 0x65, 0x79, 0x72, 0x65, 0x67, 0x20, 0x54, 0x72, + 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, + 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x73, 0x65, 0x6C, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, + 0x6E, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x56, 0x52, 0x46, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, @@ -2900,1311 +2859,1353 @@ func init() { 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, - 0x74, 0x65, 0x6C, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, - 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, - 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, - 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, - 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, - 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, - 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4E, 0x6F, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, - 0x3A, 0x20, 0x22, 0x4E, 0x6F, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x61, 0x20, 0x6E, - 0x6F, 0x64, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, - 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, - 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, - 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, - 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, - 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, - 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, - 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x63, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, 0x65, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6E, - 0x63, 0x65, 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x6F, 0x70, 0x70, - 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x52, - 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, - 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, - 0x69, 0x6D, 0x65, 0x20, 0x69, 0x6E, 0x20, 0x6E, 0x61, 0x6E, 0x6F, 0x73, 0x65, 0x63, 0x6F, 0x6E, - 0x64, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, - 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, - 0x6D, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6E, 0x63, 0x65, - 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x48, 0x61, 0x73, 0x53, - 0x79, 0x6E, 0x63, 0x65, 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, - 0x70, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, - 0x63, 0x6F, 0x6D, 0x70, 0x6C, 0x65, 0x74, 0x65, 0x64, 0x20, 0x73, 0x69, 0x6E, 0x63, 0x65, 0x20, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, - 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x48, - 0x61, 0x73, 0x53, 0x79, 0x6E, 0x63, 0x65, 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x75, 0x70, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x43, 0x6F, - 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, - 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x75, - 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, - 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, - 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, - 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, - 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x73, 0x65, 0x65, 0x6E, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, - 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, - 0x6E, 0x20, 0x6F, 0x66, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x70, - 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x20, 0x74, 0x6F, 0x20, 0x75, 0x73, 0x65, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, - 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, - 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, - 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x61, 0x74, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, 0x78, 0x74, 0x20, 0x63, 0x6F, - 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, - 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, - 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, - 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, - 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, - 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, - 0x74, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x70, - 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, 0x78, - 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, - 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, - 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, - 0x74, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, - 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, - 0x74, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, - 0x77, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x68, 0x61, 0x73, - 0x20, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6D, 0x61, 0x6B, 0x69, 0x6E, 0x67, 0x20, - 0x70, 0x72, 0x6F, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, - 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, - 0x53, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, - 0x72, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, - 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x54, 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, - 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x6E, 0x61, 0x6E, 0x6F, 0x73, 0x65, 0x63, 0x6F, 0x6E, 0x64, - 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, - 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, - 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, - 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, - 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, - 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, - 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, - 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x70, 0x61, 0x72, 0x74, 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x72, 0x66, 0x70, 0x6B, 0x62, 0x36, 0x34, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, - 0x66, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, - 0x6F, 0x74, 0x65, 0x6C, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x6B, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x70, 0x61, 0x72, 0x74, 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x6F, 0x6F, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, - 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x61, 0x6E, 0x79, 0x29, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, - 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, - 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x22, 0x0A, 0x20, + 0x20, 0x22, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x66, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, - 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, + 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x69, 0x73, 0x20, + 0x76, 0x61, 0x6C, 0x69, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, + 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x6B, 0x64, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, + 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, + 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x32, 0x2D, 0x6C, 0x65, 0x76, 0x65, 0x6C, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x6B, 0x65, 0x79, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, + 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, + 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x6B, + 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, + 0x22, 0x56, 0x6F, 0x74, 0x65, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x62, + 0x6C, 0x69, 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, + 0x6B, 0x65, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, + 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x56, 0x6F, 0x74, 0x65, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, + 0x6C, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, + 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x74, 0x68, 0x69, + 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, + 0x6B, 0x65, 0x79, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x76, 0x6F, 0x74, 0x65, 0x6B, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, - 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x75, 0x6D, - 0x62, 0x65, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6B, 0x65, 0x79, 0x73, 0x20, 0x69, - 0x6E, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x20, 0x6F, 0x66, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, - 0x6E, 0x20, 0x6B, 0x65, 0x79, 0x73, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, - 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, - 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x6C, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, - 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x69, 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, - 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, - 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, - 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x72, 0x66, - 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x22, 0x3A, 0x20, 0x22, 0x56, 0x52, 0x46, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, - 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6E, 0x79, 0x29, 0x20, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x6F, 0x75, - 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x52, 0x46, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x79, 0x6D, - 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, 0x79, - 0x6D, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, - 0x79, 0x70, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x66, 0x69, 0x65, 0x6C, - 0x64, 0x73, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x79, 0x6D, 0x65, 0x6E, 0x74, - 0x20, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, - 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, - 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x69, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x4D, - 0x69, 0x63, 0x72, 0x6F, 0x41, 0x6C, 0x67, 0x6F, 0x73, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x6E, 0x64, - 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, - 0x72, 0x72, 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, - 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, - 0x65, 0x6D, 0x61, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x54, 0x6F, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, - 0x6E, 0x64, 0x65, 0x72, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x4E, 0x6F, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, + 0x22, 0x4E, 0x6F, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x74, + 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x61, 0x20, 0x6E, 0x6F, 0x64, + 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, + 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, + 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, + 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, + 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, + 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, 0x74, + 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x63, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, 0x65, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6E, 0x63, 0x65, + 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, + 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x75, + 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x61, 0x74, 0x63, + 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, + 0x65, 0x20, 0x69, 0x6E, 0x20, 0x6E, 0x61, 0x6E, 0x6F, 0x73, 0x65, 0x63, 0x6F, 0x6E, 0x64, 0x73, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, 0x69, 0x6E, - 0x64, 0x65, 0x72, 0x54, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, - 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x61, 0x74, 0x63, 0x68, 0x75, 0x70, 0x54, 0x69, 0x6D, 0x65, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x73, 0x53, 0x79, 0x6E, 0x63, 0x65, 0x64, 0x53, + 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x48, 0x61, 0x73, 0x53, 0x79, 0x6E, + 0x63, 0x65, 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x20, + 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x61, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x63, 0x6F, + 0x6D, 0x70, 0x6C, 0x65, 0x74, 0x65, 0x64, 0x20, 0x73, 0x69, 0x6E, 0x63, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, 0x6C, 0x65, + 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x48, 0x61, 0x73, + 0x53, 0x79, 0x6E, 0x63, 0x65, 0x64, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x43, 0x6F, 0x6E, 0x73, + 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, + 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x75, 0x70, 0x70, + 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, + 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, + 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, + 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, - 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, - 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x73, - 0x65, 0x6E, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, - 0x69, 0x6E, 0x64, 0x65, 0x72, 0x54, 0x6F, 0x2C, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x63, 0x6F, 0x6D, - 0x6D, 0x69, 0x74, 0x74, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x41, 0x6D, 0x6F, - 0x75, 0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, + 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, + 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x73, 0x65, 0x65, 0x6E, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, + 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, - 0x66, 0x20, 0x70, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x54, - 0x6F, 0x5C, 0x6E, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, - 0x72, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, + 0x6F, 0x66, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x70, 0x72, 0x6F, + 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x20, 0x74, 0x6F, 0x20, 0x75, 0x73, 0x65, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, + 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x61, 0x74, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, 0x78, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, + 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x77, 0x69, + 0x6C, 0x6C, 0x20, 0x61, 0x70, 0x70, 0x6C, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, + 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, + 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x65, + 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6E, 0x65, 0x78, 0x74, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, + 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, + 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, + 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x70, 0x70, 0x6F, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x77, + 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, 0x78, 0x74, 0x20, + 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, + 0x6E, 0x20, 0x69, 0x73, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x20, 0x62, + 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x62, 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x4E, 0x65, 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x53, 0x75, + 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x74, 0x6F, + 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, + 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, + 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, + 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, + 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x65, 0x77, 0x20, + 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x68, 0x61, 0x73, 0x20, 0x73, + 0x74, 0x6F, 0x70, 0x70, 0x65, 0x64, 0x20, 0x6D, 0x61, 0x6B, 0x69, 0x6E, 0x67, 0x20, 0x70, 0x72, + 0x6F, 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x6F, 0x6F, 0x6C, + 0x65, 0x61, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x74, + 0x6F, 0x70, 0x70, 0x65, 0x64, 0x41, 0x74, 0x55, 0x6E, 0x73, 0x75, 0x70, 0x70, 0x6F, 0x72, 0x74, + 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6D, + 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x69, + 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, + 0x20, 0x69, 0x6E, 0x20, 0x6E, 0x61, 0x6E, 0x6F, 0x73, 0x65, 0x63, 0x6F, 0x6E, 0x64, 0x73, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, + 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x54, 0x69, 0x6D, 0x65, 0x53, 0x69, 0x6E, 0x63, 0x65, 0x4C, 0x61, 0x73, + 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, + 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, + 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, + 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, + 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x70, 0x61, 0x72, 0x74, 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x72, 0x66, 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, 0x65, 0x66, 0x73, + 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x6F, 0x74, + 0x65, 0x6C, 0x73, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x76, 0x6F, 0x74, 0x65, 0x6B, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x70, 0x61, 0x72, 0x74, 0x70, 0x6B, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x6F, 0x6F, 0x74, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, 0x6B, 0x65, 0x79, 0x20, 0x28, 0x69, 0x66, + 0x20, 0x61, 0x6E, 0x79, 0x29, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, + 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, + 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, + 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x76, 0x6F, 0x74, 0x65, 0x66, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x20, 0x72, 0x6F, + 0x75, 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, + 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x56, 0x6F, 0x74, 0x65, 0x46, 0x69, 0x72, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, + 0x6F, 0x74, 0x65, 0x6B, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, 0x65, 0x79, 0x44, 0x69, 0x6C, 0x75, 0x74, + 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, + 0x72, 0x20, 0x6F, 0x66, 0x20, 0x73, 0x75, 0x62, 0x6B, 0x65, 0x79, 0x73, 0x20, 0x69, 0x6E, 0x20, + 0x66, 0x6F, 0x72, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x62, 0x61, 0x74, 0x63, 0x68, 0x20, 0x6F, + 0x66, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, + 0x6B, 0x65, 0x79, 0x73, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, + 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, + 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4B, + 0x65, 0x79, 0x44, 0x69, 0x6C, 0x75, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x76, 0x6F, 0x74, 0x65, 0x6C, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, 0x65, 0x4C, 0x61, 0x73, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, + 0x20, 0x66, 0x6F, 0x72, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, + 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, - 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x6F, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x54, 0x6F, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, - 0x65, 0x72, 0x27, 0x73, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x6F, 0x74, + 0x65, 0x4C, 0x61, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x72, 0x66, 0x70, 0x6B, + 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, + 0x20, 0x22, 0x56, 0x52, 0x46, 0x50, 0x4B, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, + 0x65, 0x6C, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x75, 0x62, 0x6C, 0x69, 0x63, 0x20, + 0x6B, 0x65, 0x79, 0x20, 0x28, 0x69, 0x66, 0x20, 0x61, 0x6E, 0x79, 0x29, 0x20, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, + 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, + 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x56, 0x52, 0x46, 0x50, 0x4B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, + 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, + 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, + 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x61, 0x79, 0x6D, 0x65, 0x6E, + 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x61, 0x79, 0x6D, 0x65, + 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, + 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, + 0x64, 0x64, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x61, 0x6C, 0x20, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x73, + 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x79, 0x6D, 0x65, 0x6E, 0x74, 0x20, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, + 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x6F, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x4D, 0x69, 0x63, + 0x72, 0x6F, 0x41, 0x6C, 0x67, 0x6F, 0x73, 0x20, 0x69, 0x6E, 0x74, 0x65, 0x6E, 0x64, 0x65, 0x64, + 0x20, 0x74, 0x6F, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x72, + 0x65, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, + 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, + 0x61, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x54, 0x6F, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, + 0x65, 0x72, 0x20, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, 0x69, 0x6E, 0x64, 0x65, + 0x72, 0x54, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x61, 0x6D, + 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, - 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x69, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x70, 0x65, - 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x61, 0x70, - 0x70, 0x6C, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x6F, 0x20, - 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x5C, 0x6E, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, + 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x41, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x73, 0x65, 0x6E, + 0x74, 0x20, 0x74, 0x6F, 0x20, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, 0x69, 0x6E, + 0x64, 0x65, 0x72, 0x54, 0x6F, 0x2C, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x69, + 0x74, 0x74, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, + 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x41, 0x6D, 0x6F, 0x75, 0x6E, + 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6C, 0x6F, 0x73, 0x65, 0x72, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, + 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, + 0x70, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, + 0x61, 0x70, 0x70, 0x6C, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, + 0x6C, 0x6F, 0x73, 0x65, 0x52, 0x65, 0x6D, 0x61, 0x69, 0x6E, 0x64, 0x65, 0x72, 0x54, 0x6F, 0x5C, + 0x6E, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, - 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x52, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, + 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6C, 0x6F, 0x73, 0x65, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, + 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x72, + 0x27, 0x73, 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x54, 0x6F, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, + 0x22, 0x54, 0x6F, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x70, 0x65, 0x6E, 0x64, + 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x61, 0x70, 0x70, 0x6C, + 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x54, 0x6F, 0x20, 0x61, 0x63, + 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x5C, 0x6E, 0x61, 0x73, 0x20, 0x70, 0x61, 0x72, 0x74, 0x20, 0x6F, + 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, + 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, + 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x52, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, + 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, + 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, + 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, + 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, + 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x73, + 0x20, 0x61, 0x20, 0x70, 0x6F, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x74, + 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, + 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, + 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x70, 0x6F, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x54, 0x78, + 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, + 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, + 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x6E, 0x73, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x22, 0x3A, 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6E, - 0x74, 0x73, 0x20, 0x61, 0x20, 0x70, 0x6F, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x61, 0x6C, 0x6C, 0x79, - 0x20, 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, - 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, - 0x5C, 0x6E, 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x70, 0x6F, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, - 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x6E, 0x73, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, 0x6C, - 0x54, 0x78, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, - 0x74, 0x61, 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, - 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x54, 0x78, 0x6E, 0x73, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, 0x74, 0x65, 0x64, 0x54, 0x78, 0x6E, - 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, - 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, - 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, - 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, - 0x61, 0x67, 0x67, 0x65, 0x72, 0x3A, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x6C, 0x20, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x20, 0x72, - 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x73, 0x20, 0x61, 0x20, 0x4C, 0x6F, 0x63, 0x61, - 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x20, 0x6F, 0x72, 0x20, - 0x47, 0x6C, 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, - 0x61, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x5C, 0x6E, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, - 0x73, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6D, 0x69, 0x6E, 0x65, 0x20, 0x68, 0x6F, 0x77, 0x20, - 0x6D, 0x75, 0x63, 0x68, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6D, 0x61, 0x79, - 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x4C, 0x6F, - 0x63, 0x61, 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6F, 0x72, 0x5C, 0x6E, 0x47, 0x6C, 0x6F, - 0x62, 0x61, 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x20, - 0x61, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x6D, 0x6F, 0x72, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x2C, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x6D, 0x69, 0x6E, - 0x69, 0x6D, 0x75, 0x6D, 0x5C, 0x6E, 0x62, 0x61, 0x6C, 0x61, 0x6E, 0x63, 0x65, 0x20, 0x6D, 0x75, - 0x73, 0x74, 0x20, 0x62, 0x65, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x64, - 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, - 0x68, 0x6F, 0x6C, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, - 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x75, 0x69, 0x6E, 0x74, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x73, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x73, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, - 0x75, 0x6D, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6C, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, - 0x72, 0x20, 0x6F, 0x66, 0x20, 0x54, 0x45, 0x41, 0x4C, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, - 0x6C, 0x69, 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, - 0x65, 0x5C, 0x6E, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, + 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x77, 0x61, 0x67, + 0x67, 0x65, 0x72, 0x3A, 0x20, 0x6D, 0x6F, 0x64, 0x65, 0x6C, 0x20, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x20, 0x72, 0x65, 0x70, + 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, 0x73, 0x20, 0x61, 0x20, 0x4C, 0x6F, 0x63, 0x61, 0x6C, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x20, 0x6F, 0x72, 0x20, 0x47, 0x6C, + 0x6F, 0x62, 0x61, 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x2E, + 0x20, 0x54, 0x68, 0x65, 0x73, 0x65, 0x5C, 0x6E, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x73, 0x20, + 0x64, 0x65, 0x74, 0x65, 0x72, 0x6D, 0x69, 0x6E, 0x65, 0x20, 0x68, 0x6F, 0x77, 0x20, 0x6D, 0x75, + 0x63, 0x68, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x61, 0x20, 0x4C, 0x6F, 0x63, 0x61, + 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x6F, 0x72, 0x5C, 0x6E, 0x47, 0x6C, 0x6F, 0x62, 0x61, + 0x6C, 0x53, 0x74, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x70, + 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6D, + 0x6F, 0x72, 0x65, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2C, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x72, 0x67, 0x65, 0x72, 0x20, 0x6D, 0x69, 0x6E, 0x69, 0x6D, + 0x75, 0x6D, 0x5C, 0x6E, 0x62, 0x61, 0x6C, 0x61, 0x6E, 0x63, 0x65, 0x20, 0x6D, 0x75, 0x73, 0x74, + 0x20, 0x62, 0x65, 0x20, 0x6D, 0x61, 0x69, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x69, + 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x68, 0x6F, + 0x6C, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x2E, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, + 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x69, 0x6E, 0x74, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x73, 0x6C, 0x69, 0x63, 0x65, 0x73, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, + 0x42, 0x79, 0x74, 0x65, 0x53, 0x6C, 0x69, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, + 0x6F, 0x66, 0x20, 0x54, 0x45, 0x41, 0x4C, 0x20, 0x62, 0x79, 0x74, 0x65, 0x20, 0x73, 0x6C, 0x69, + 0x63, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, 0x65, 0x5C, + 0x6E, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6B, + 0x65, 0x79, 0x2F, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, + 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6C, 0x69, 0x63, 0x65, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x55, 0x69, 0x6E, + 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, + 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x54, 0x45, 0x41, 0x4C, 0x20, + 0x75, 0x69, 0x6E, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x62, + 0x65, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x5C, 0x6E, 0x74, 0x68, 0x65, 0x20, 0x6B, 0x65, 0x79, 0x2F, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, - 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x42, 0x79, 0x74, 0x65, 0x53, 0x6C, 0x69, - 0x63, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x73, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x55, - 0x69, 0x6E, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6D, 0x61, 0x78, 0x69, 0x6D, - 0x75, 0x6D, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x54, 0x45, 0x41, - 0x4C, 0x20, 0x75, 0x69, 0x6E, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6D, 0x61, 0x79, - 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, 0x6F, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x5C, 0x6E, 0x74, - 0x68, 0x65, 0x20, 0x6B, 0x65, 0x79, 0x2F, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x73, 0x74, 0x6F, - 0x72, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x55, 0x69, 0x6E, 0x74, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, - 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, - 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, - 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x22, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6E, 0x74, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, - 0x73, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x20, 0x6F, 0x66, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x41, - 0x6C, 0x67, 0x6F, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6D, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, 0x6C, - 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x6F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, - 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x75, 0x6D, 0x55, 0x69, 0x6E, 0x74, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, + 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, + 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, + 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, + 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, + 0x75, 0x70, 0x70, 0x6C, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x4F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, - 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x4F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, - 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, - 0x6C, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, - 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, - 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, - 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, - 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, - 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x6C, 0x6C, 0x20, - 0x66, 0x69, 0x65, 0x6C, 0x64, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, 0x74, 0x6F, - 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, - 0x61, 0x6E, 0x20, 0x65, 0x6E, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x61, - 0x6C, 0x6C, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x5C, - 0x6E, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, - 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2D, - 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x6C, 0x61, 0x73, 0x74, 0x2D, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x63, 0x65, 0x72, - 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, - 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, - 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, - 0x6E, 0x73, 0x2F, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x61, - 0x6C, 0x6C, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, - 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x63, 0x65, - 0x72, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, - 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x43, - 0x65, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x72, 0x63, 0x66, 0x67, 0x22, 0x3A, - 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, - 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x54, - 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x72, 0x66, 0x72, 0x7A, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, - 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x72, 0x65, 0x65, 0x7A, 0x65, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x63, 0x75, 0x72, 0x78, 0x66, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, - 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x65, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, - 0x22, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, - 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2D, - 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, - 0x22, 0x3A, 0x20, 0x22, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, - 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x66, - 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, - 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x6F, - 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F, 0x6D, - 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x27, 0x73, - 0x20, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, - 0x72, 0x6F, 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x72, 0x65, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, - 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F, 0x6D, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x69, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, - 0x70, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, - 0x61, 0x70, 0x70, 0x6C, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, - 0x72, 0x6F, 0x6D, 0x5C, 0x6E, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x61, 0x73, 0x20, - 0x70, 0x61, 0x72, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x20, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6E, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x73, 0x75, + 0x70, 0x70, 0x6C, 0x79, 0x20, 0x6F, 0x66, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x41, 0x6C, 0x67, + 0x6F, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6D, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x6F, + 0x6E, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6F, + 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6F, 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4F, 0x6E, + 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, - 0x72, 0x6F, 0x6D, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4F, + 0x6E, 0x6C, 0x69, 0x6E, 0x65, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, - 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, - 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, - 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x68, - 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, - 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, 0x68, 0x61, 0x73, - 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, 0x73, 0x68, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x72, 0x6F, 0x75, 0x70, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x72, 0x6F, 0x75, 0x70, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, - 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x47, 0x72, 0x6F, 0x75, 0x70, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6B, 0x65, 0x79, 0x72, - 0x65, 0x67, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, - 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x4B, 0x65, 0x79, 0x72, 0x65, 0x67, 0x54, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x2D, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, - 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, - 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, - 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x65, - 0x61, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x22, 0x4C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x66, 0x6F, 0x72, 0x63, 0x65, 0x73, - 0x20, 0x6D, 0x75, 0x74, 0x75, 0x61, 0x6C, 0x20, 0x65, 0x78, 0x63, 0x6C, 0x75, 0x73, 0x69, 0x6F, - 0x6E, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x2E, 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6C, - 0x64, 0x20, 0x69, 0x73, 0x5C, 0x6E, 0x6E, 0x6F, 0x6E, 0x7A, 0x65, 0x72, 0x6F, 0x2C, 0x20, 0x74, - 0x68, 0x65, 0x6E, 0x20, 0x6F, 0x6E, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x66, - 0x69, 0x72, 0x6D, 0x65, 0x64, 0x2C, 0x20, 0x69, 0x74, 0x20, 0x61, 0x63, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x64, - 0x65, 0x6E, 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x28, 0x53, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x2C, 0x20, 0x4C, 0x65, 0x61, 0x73, 0x65, 0x29, 0x20, - 0x70, 0x61, 0x69, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x75, 0x6E, 0x74, 0x69, 0x6C, 0x5C, 0x6E, 0x74, - 0x68, 0x65, 0x20, 0x4C, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, 0x6F, 0x75, - 0x6E, 0x64, 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x2E, 0x20, 0x20, 0x57, 0x68, 0x69, 0x6C, - 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x70, 0x6F, 0x73, 0x73, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, - 0x5C, 0x6E, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x2C, 0x20, 0x6E, 0x6F, 0x20, 0x6F, 0x74, 0x68, 0x65, - 0x72, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6C, 0x65, - 0x61, 0x73, 0x65, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, - 0x72, 0x6D, 0x65, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, - 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x65, 0x61, 0x73, 0x65, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x6E, 0x6F, 0x74, 0x65, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x69, 0x73, - 0x20, 0x61, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x6F, 0x74, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, - 0x79, 0x6D, 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, - 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x50, 0x61, 0x79, 0x6D, 0x65, - 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, - 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6F, 0x6F, 0x6C, 0x65, 0x72, 0x72, 0x6F, 0x72, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, - 0x6F, 0x6F, 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6F, 0x6E, 0x20, 0x77, 0x61, 0x73, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, - 0x72, 0x6F, 0x6D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, 0x20, - 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x5C, 0x6E, 0x70, 0x6F, 0x6F, - 0x6C, 0x20, 0x28, 0x69, 0x66, 0x20, 0x6E, 0x6F, 0x6E, 0x2D, 0x65, 0x6D, 0x70, 0x74, 0x79, 0x29, - 0x2E, 0x20, 0x20, 0x41, 0x20, 0x6E, 0x6F, 0x6E, 0x2D, 0x65, 0x6D, 0x70, 0x74, 0x79, 0x20, 0x50, - 0x6F, 0x6F, 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, - 0x74, 0x20, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x20, 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x6E, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, - 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x64, 0x3B, 0x20, 0x6F, 0x74, 0x68, 0x65, 0x72, - 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x73, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x68, - 0x61, 0x76, 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x5C, - 0x6E, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, - 0x20, 0x6D, 0x61, 0x79, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6D, 0x70, 0x74, 0x20, 0x74, 0x6F, 0x20, - 0x63, 0x6F, 0x6D, 0x6D, 0x69, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x66, 0x75, 0x74, 0x75, 0x72, 0x65, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, - 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, - 0x6F, 0x6F, 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6F, - 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, - 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x66, 0x69, 0x72, 0x6D, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, - 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x70, 0x70, - 0x65, 0x61, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, - 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, - 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, - 0x6E, 0x66, 0x69, 0x72, 0x6D, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x78, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x52, + 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x4D, + 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, - 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x49, 0x44, 0x22, 0x2C, 0x0A, + 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, - 0x72, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, - 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, - 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, - 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, - 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, - 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x22, - 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, - 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, - 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, + 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x6F, 0x6E, 0x65, 0x79, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, + 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, + 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, + 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, + 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x6C, 0x6C, 0x20, 0x66, 0x69, + 0x65, 0x6C, 0x64, 0x73, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, 0x6E, 0x20, 0x74, 0x6F, 0x20, 0x61, + 0x6C, 0x6C, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, + 0x61, 0x6E, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x6E, + 0x20, 0x65, 0x6E, 0x76, 0x65, 0x6C, 0x6F, 0x70, 0x65, 0x20, 0x74, 0x6F, 0x20, 0x61, 0x6C, 0x6C, + 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x5C, 0x6E, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, - 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x0A, + 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2D, 0x72, 0x6F, + 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, + 0x61, 0x73, 0x74, 0x2D, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x63, 0x65, 0x72, 0x74, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, + 0x69, 0x73, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, + 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, + 0x2F, 0x41, 0x70, 0x70, 0x6C, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x43, 0x61, 0x6C, 0x6C, + 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x63, 0x65, 0x72, 0x74, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, + 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x43, 0x6F, 0x6D, 0x70, 0x61, 0x63, 0x74, 0x43, 0x65, 0x72, + 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, 0x72, 0x63, 0x66, 0x67, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, + 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x66, 0x69, 0x67, 0x54, 0x72, 0x61, + 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x63, 0x75, 0x72, 0x66, 0x72, 0x7A, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, + 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x46, 0x72, 0x65, 0x65, 0x7A, 0x65, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x75, + 0x72, 0x78, 0x66, 0x65, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, + 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x54, 0x72, 0x61, 0x6E, 0x73, 0x66, 0x65, 0x72, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, + 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, + 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, + 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, + 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2D, 0x72, 0x6F, + 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, + 0x20, 0x22, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, + 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, + 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, + 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x69, 0x72, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, + 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, - 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, - 0x5C, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x75, 0x6E, 0x69, 0x74, - 0x73, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x41, 0x6C, 0x67, 0x6F, 0x73, - 0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x2E, 0x5C, 0x6E, 0x46, 0x65, 0x65, 0x20, - 0x6D, 0x61, 0x79, 0x20, 0x66, 0x61, 0x6C, 0x6C, 0x20, 0x74, 0x6F, 0x20, 0x7A, 0x65, 0x72, 0x6F, - 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x76, - 0x65, 0x20, 0x61, 0x20, 0x66, 0x65, 0x65, 0x20, 0x6F, 0x66, 0x5C, 0x6E, 0x61, 0x74, 0x20, 0x6C, - 0x65, 0x61, 0x73, 0x74, 0x20, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x66, - 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x6E, - 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x2E, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F, 0x6D, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x27, 0x73, 0x20, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F, + 0x6D, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x72, 0x6F, 0x6D, 0x72, 0x65, 0x77, 0x61, 0x72, + 0x64, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, + 0x22, 0x46, 0x72, 0x6F, 0x6D, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x69, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x6D, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x70, 0x65, + 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x20, 0x61, 0x70, + 0x70, 0x6C, 0x69, 0x65, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 0x72, 0x6F, + 0x6D, 0x5C, 0x6E, 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x61, 0x73, 0x20, 0x70, 0x61, + 0x72, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, + 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x72, 0x6F, + 0x6D, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, + 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, + 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x68, 0x61, 0x73, + 0x68, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, + 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, 0x68, 0x61, 0x73, 0x68, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, + 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x67, 0x72, 0x6F, 0x75, 0x70, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x72, 0x6F, 0x75, 0x70, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, + 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, + 0x72, 0x6F, 0x75, 0x70, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6B, 0x65, 0x79, 0x72, 0x65, 0x67, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, + 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x4B, 0x65, 0x79, 0x72, 0x65, 0x67, 0x54, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6C, 0x61, 0x73, 0x74, 0x2D, 0x72, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, + 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, 0x6F, 0x75, + 0x6E, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, + 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, + 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, + 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x65, 0x61, 0x73, + 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, + 0x4C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x65, 0x6E, 0x66, 0x6F, 0x72, 0x63, 0x65, 0x73, 0x20, 0x6D, + 0x75, 0x74, 0x75, 0x61, 0x6C, 0x20, 0x65, 0x78, 0x63, 0x6C, 0x75, 0x73, 0x69, 0x6F, 0x6E, 0x20, + 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2E, + 0x20, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x65, 0x6C, 0x64, 0x20, + 0x69, 0x73, 0x5C, 0x6E, 0x6E, 0x6F, 0x6E, 0x7A, 0x65, 0x72, 0x6F, 0x2C, 0x20, 0x74, 0x68, 0x65, + 0x6E, 0x20, 0x6F, 0x6E, 0x63, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x72, + 0x6D, 0x65, 0x64, 0x2C, 0x20, 0x69, 0x74, 0x20, 0x61, 0x63, 0x71, 0x75, 0x69, 0x72, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x6C, 0x65, 0x61, 0x73, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6E, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x28, 0x53, + 0x65, 0x6E, 0x64, 0x65, 0x72, 0x2C, 0x20, 0x4C, 0x65, 0x61, 0x73, 0x65, 0x29, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x75, 0x6E, 0x74, 0x69, 0x6C, 0x5C, 0x6E, 0x74, 0x68, 0x65, + 0x20, 0x4C, 0x61, 0x73, 0x74, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, + 0x20, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x2E, 0x20, 0x20, 0x57, 0x68, 0x69, 0x6C, 0x65, 0x20, + 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x70, 0x6F, 0x73, 0x73, 0x65, 0x73, 0x73, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, + 0x6C, 0x65, 0x61, 0x73, 0x65, 0x2C, 0x20, 0x6E, 0x6F, 0x20, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x20, + 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x79, 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6C, 0x65, 0x61, 0x73, + 0x65, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x66, 0x69, 0x72, 0x6D, + 0x65, 0x64, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, - 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, - 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, - 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, - 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, - 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, - 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x4C, 0x69, 0x73, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, - 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, - 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, + 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x65, 0x61, 0x73, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6E, 0x6F, 0x74, 0x65, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, + 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x6D, 0x20, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, + 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x4E, 0x6F, 0x74, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x79, 0x6D, + 0x65, 0x6E, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, + 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x50, 0x61, 0x79, 0x6D, 0x65, 0x6E, 0x74, + 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x54, 0x79, 0x70, 0x65, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6F, 0x6F, 0x6C, 0x65, 0x72, 0x72, 0x6F, 0x72, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, - 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, - 0x74, 0x65, 0x6D, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, - 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, - 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, - 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, - 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, - 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x3A, 0x20, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6F, 0x6F, + 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, + 0x20, 0x77, 0x61, 0x73, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, + 0x6D, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, 0x20, 0x74, 0x72, + 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x5C, 0x6E, 0x70, 0x6F, 0x6F, 0x6C, 0x20, + 0x28, 0x69, 0x66, 0x20, 0x6E, 0x6F, 0x6E, 0x2D, 0x65, 0x6D, 0x70, 0x74, 0x79, 0x29, 0x2E, 0x20, + 0x20, 0x41, 0x20, 0x6E, 0x6F, 0x6E, 0x2D, 0x65, 0x6D, 0x70, 0x74, 0x79, 0x20, 0x50, 0x6F, 0x6F, + 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x20, 0x64, 0x6F, 0x65, 0x73, 0x20, 0x6E, 0x6F, 0x74, 0x20, + 0x67, 0x75, 0x61, 0x72, 0x61, 0x6E, 0x74, 0x65, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x5C, 0x6E, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, + 0x77, 0x69, 0x6C, 0x6C, 0x20, 0x6E, 0x65, 0x76, 0x65, 0x72, 0x20, 0x62, 0x65, 0x20, 0x63, 0x6F, + 0x6D, 0x6D, 0x69, 0x74, 0x74, 0x65, 0x64, 0x3B, 0x20, 0x6F, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6E, + 0x6F, 0x64, 0x65, 0x73, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x6E, 0x6F, 0x74, 0x20, 0x68, 0x61, 0x76, + 0x65, 0x20, 0x65, 0x76, 0x69, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, + 0x61, 0x79, 0x20, 0x61, 0x74, 0x74, 0x65, 0x6D, 0x70, 0x74, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6F, + 0x6D, 0x6D, 0x69, 0x74, 0x20, 0x69, 0x74, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x75, 0x74, 0x75, 0x72, 0x65, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, + 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x6F, 0x6F, + 0x6C, 0x45, 0x72, 0x72, 0x6F, 0x72, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6F, 0x75, 0x6E, + 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, + 0x43, 0x6F, 0x6E, 0x66, 0x69, 0x72, 0x6D, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, + 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6C, 0x6F, + 0x63, 0x6B, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x70, 0x70, 0x65, 0x61, + 0x72, 0x65, 0x64, 0x20, 0x69, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, + 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, + 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, + 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x66, + 0x69, 0x72, 0x6D, 0x65, 0x64, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x78, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, + 0x22, 0x54, 0x78, 0x49, 0x44, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, + 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x54, 0x78, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x72, 0x65, + 0x73, 0x75, 0x6C, 0x74, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, + 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, + 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x79, 0x70, 0x65, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, + 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, + 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, + 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, + 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, + 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, - 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x6C, 0x70, 0x20, 0x61, 0x20, 0x63, 0x6C, - 0x69, 0x65, 0x6E, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5C, 0x6E, - 0x61, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x69, 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, 0x66, 0x65, + 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, 0x5C, 0x6E, + 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x75, 0x6E, 0x69, 0x74, 0x73, 0x20, + 0x6F, 0x66, 0x20, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x41, 0x6C, 0x67, 0x6F, 0x73, 0x20, 0x70, + 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x2E, 0x5C, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x6D, 0x61, + 0x79, 0x20, 0x66, 0x61, 0x6C, 0x6C, 0x20, 0x74, 0x6F, 0x20, 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x62, + 0x75, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, + 0x6D, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6C, 0x6C, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, + 0x61, 0x20, 0x66, 0x65, 0x65, 0x20, 0x6F, 0x66, 0x5C, 0x6E, 0x61, 0x74, 0x20, 0x6C, 0x65, 0x61, + 0x73, 0x74, 0x20, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x66, 0x6F, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x6E, 0x65, 0x74, + 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, + 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, + 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, + 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, + 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, + 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, + 0x73, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x6C, 0x69, + 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, + 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, - 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, - 0x6E, 0x65, 0x73, 0x69, 0x73, 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, - 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E, - 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, - 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, + 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, + 0x6D, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, + 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, + 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, + 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, + 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, + 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x70, - 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x5C, - 0x6E, 0x61, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, - 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, + 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x65, 0x6C, 0x70, 0x20, 0x61, 0x20, 0x63, 0x6C, 0x69, 0x65, + 0x6E, 0x74, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5C, 0x6E, 0x61, 0x20, + 0x6E, 0x65, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, + 0x73, 0x69, 0x73, 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E, 0x73, 0x65, + 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x20, 0x70, 0x72, 0x6F, + 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x5C, 0x6E, 0x61, + 0x73, 0x20, 0x6F, 0x66, 0x20, 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x2E, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, + 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, 0x73, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, 0x65, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, + 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, + 0x65, 0x65, 0x5C, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6E, 0x20, 0x75, 0x6E, + 0x69, 0x74, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x41, 0x6C, 0x67, + 0x6F, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x2E, 0x5C, 0x6E, 0x46, 0x65, + 0x65, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x66, 0x61, 0x6C, 0x6C, 0x20, 0x74, 0x6F, 0x20, 0x7A, 0x65, + 0x72, 0x6F, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x73, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6C, 0x6C, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x66, 0x65, 0x65, 0x20, 0x6F, 0x66, 0x5C, 0x6E, 0x61, 0x74, + 0x20, 0x6C, 0x65, 0x61, 0x73, 0x74, 0x20, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, 0x65, 0x65, + 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, + 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, + 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, - 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x6F, 0x6E, 0x73, 0x65, 0x6E, 0x73, 0x75, - 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x65, - 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x20, 0x66, 0x65, 0x65, 0x5C, 0x6E, 0x46, 0x65, 0x65, 0x20, 0x69, 0x73, 0x20, 0x69, 0x6E, 0x20, - 0x75, 0x6E, 0x69, 0x74, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x6D, 0x69, 0x63, 0x72, 0x6F, 0x2D, 0x41, - 0x6C, 0x67, 0x6F, 0x73, 0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x2E, 0x5C, 0x6E, - 0x46, 0x65, 0x65, 0x20, 0x6D, 0x61, 0x79, 0x20, 0x66, 0x61, 0x6C, 0x6C, 0x20, 0x74, 0x6F, 0x20, - 0x7A, 0x65, 0x72, 0x6F, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x6D, 0x75, 0x73, 0x74, 0x20, 0x73, 0x74, 0x69, 0x6C, 0x6C, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x66, 0x65, 0x65, 0x20, 0x6F, 0x66, 0x5C, 0x6E, - 0x61, 0x74, 0x20, 0x6C, 0x65, 0x61, 0x73, 0x74, 0x20, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, - 0x65, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6E, 0x74, 0x20, 0x6E, 0x65, 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, - 0x63, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, + 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, + 0x20, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, - 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, - 0x69, 0x73, 0x20, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, - 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, - 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, - 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, - 0x69, 0x73, 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, - 0x68, 0x61, 0x73, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, - 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, - 0x73, 0x68, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, - 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x4C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, - 0x6E, 0x64, 0x20, 0x73, 0x65, 0x65, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, - 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, - 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, - 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x46, - 0x65, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, - 0x22, 0x54, 0x68, 0x65, 0x20, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x74, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, 0x20, 0x28, 0x6E, 0x6F, - 0x74, 0x20, 0x70, 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x29, 0x20, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x74, 0x78, - 0x6E, 0x20, 0x74, 0x6F, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6F, - 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x6E, 0x65, - 0x74, 0x77, 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x2E, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, - 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, + 0x73, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, + 0x68, 0x61, 0x73, 0x68, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x20, 0x68, 0x61, + 0x73, 0x68, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, + 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, 0x65, 0x65, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, - 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, - 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, - 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, - 0x76, 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, - 0x74, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, 0x20, - 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, - 0x69, 0x64, 0x65, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x61, - 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, - 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, - 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x70, 0x70, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x70, 0x70, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x69, - 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, - 0x20, 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x70, 0x70, - 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, - 0x20, 0x74, 0x78, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, - 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, - 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, - 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x70, 0x70, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x69, 0x6E, 0x64, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, - 0x69, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, - 0x73, 0x20, 0x74, 0x78, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, 0x73, 0x68, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6C, 0x61, 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, + 0x73, 0x74, 0x52, 0x6F, 0x75, 0x6E, 0x64, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x61, 0x73, 0x74, 0x20, 0x72, 0x6F, 0x75, 0x6E, 0x64, + 0x20, 0x73, 0x65, 0x65, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, - 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x0A, 0x20, 0x20, + 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x4C, 0x61, 0x73, 0x74, 0x52, + 0x6F, 0x75, 0x6E, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6D, 0x69, 0x6E, 0x46, 0x65, 0x65, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, + 0x68, 0x65, 0x20, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x66, 0x65, 0x65, 0x20, 0x28, 0x6E, 0x6F, 0x74, 0x20, + 0x70, 0x65, 0x72, 0x20, 0x62, 0x79, 0x74, 0x65, 0x29, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, + 0x65, 0x64, 0x20, 0x66, 0x6F, 0x72, 0x20, 0x74, 0x68, 0x65, 0x5C, 0x6E, 0x74, 0x78, 0x6E, 0x20, + 0x74, 0x6F, 0x20, 0x76, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x65, 0x20, 0x66, 0x6F, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x6E, 0x65, 0x74, 0x77, + 0x6F, 0x72, 0x6B, 0x20, 0x70, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, + 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x4D, 0x69, 0x6E, 0x54, 0x78, 0x6E, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x4E, 0x6F, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6E, 0x6E, - 0x6F, 0x74, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, - 0x6D, 0x6F, 0x64, 0x65, 0x6C, 0x20, 0x73, 0x6F, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6C, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x20, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x73, 0x5C, 0x6E, 0x63, 0x61, - 0x6E, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6D, 0x70, 0x6F, 0x72, - 0x74, 0x20, 0x61, 0x20, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6E, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x6D, 0x6F, - 0x64, 0x65, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x6C, 0x67, 0x6F, - 0x64, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, - 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, - 0x6E, 0x65, 0x73, 0x69, 0x73, 0x5F, 0x69, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x5F, 0x68, 0x61, 0x73, 0x68, - 0x5F, 0x62, 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x62, 0x75, 0x69, 0x6C, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, - 0x75, 0x69, 0x6C, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, - 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, - 0x73, 0x69, 0x73, 0x5F, 0x68, 0x61, 0x73, 0x68, 0x5F, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, - 0x20, 0x22, 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, - 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0A, 0x20, 0x20, + 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, + 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, + 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x73, 0x20, 0x63, 0x6F, + 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x20, 0x61, 0x62, 0x6F, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x69, 0x64, + 0x65, 0x20, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x20, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, + 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x61, 0x70, 0x70, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x70, 0x70, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x69, 0x6E, 0x64, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x70, 0x70, 0x20, 0x69, + 0x6E, 0x64, 0x65, 0x78, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x70, 0x70, 0x20, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, + 0x78, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, + 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, + 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x70, 0x70, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x61, 0x73, 0x73, 0x65, 0x74, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x20, 0x69, 0x6E, 0x64, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6E, + 0x64, 0x65, 0x78, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x74, 0x78, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x69, 0x6E, 0x74, 0x65, 0x67, 0x65, 0x72, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, + 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, 0x75, 0x69, 0x6E, 0x74, 0x36, 0x34, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, + 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, + 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, + 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, + 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, + 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x4E, 0x6F, + 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x65, 0x20, 0x61, 0x6E, 0x6E, 0x6F, 0x74, + 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x6D, 0x6F, + 0x64, 0x65, 0x6C, 0x20, 0x73, 0x6F, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6C, 0x65, 0x67, 0x61, + 0x63, 0x79, 0x20, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x74, 0x73, 0x5C, 0x6E, 0x63, 0x61, 0x6E, 0x20, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6D, 0x70, 0x6F, 0x72, 0x74, 0x20, + 0x61, 0x20, 0x73, 0x77, 0x61, 0x67, 0x67, 0x65, 0x72, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x6D, 0x6F, 0x64, 0x65, + 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x74, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6F, 0x6E, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x20, 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x20, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, + 0x73, 0x69, 0x73, 0x5F, 0x69, 0x64, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x5F, 0x68, 0x61, 0x73, 0x68, 0x5F, 0x62, + 0x36, 0x34, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, + 0x69, 0x6C, 0x64, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, + 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x62, 0x75, 0x69, + 0x6C, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, + 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x42, 0x75, 0x69, 0x6C, 0x64, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, + 0x73, 0x5F, 0x68, 0x61, 0x73, 0x68, 0x5F, 0x62, 0x36, 0x34, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x22, 0x3A, 0x20, 0x22, + 0x62, 0x79, 0x74, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, + 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x48, 0x61, 0x73, 0x68, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, + 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x67, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x5F, 0x69, 0x64, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x73, 0x69, 0x73, 0x49, 0x44, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x74, 0x65, 0x6D, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, + 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, + 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, + 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, 0x67, 0x6F, + 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x63, 0x6F, 0x6D, 0x6D, 0x6F, + 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x49, 0x44, 0x20, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x49, 0x64, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x72, + 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x49, 0x64, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x64, 0x20, 0x69, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6E, 0x63, 0x6F, + 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x68, 0x61, 0x73, 0x68, 0x22, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, + 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, + 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, 0x61, 0x6C, - 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x63, 0x6F, 0x6D, - 0x6D, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x22, 0x3A, - 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x20, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x22, 0x3A, 0x20, 0x5B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x49, 0x64, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x70, 0x72, 0x6F, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x78, 0x49, 0x64, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x64, 0x20, - 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x20, 0x65, 0x6E, - 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x68, 0x61, 0x73, 0x68, 0x22, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x3A, 0x20, 0x22, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, - 0x65, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x78, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, - 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x22, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x67, 0x6F, 0x2D, 0x70, 0x61, - 0x63, 0x6B, 0x61, 0x67, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2E, - 0x63, 0x6F, 0x6D, 0x2F, 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x67, 0x6F, 0x2D, - 0x61, 0x6C, 0x67, 0x6F, 0x72, 0x61, 0x6E, 0x64, 0x2F, 0x64, 0x61, 0x65, 0x6D, 0x6F, 0x6E, 0x2F, - 0x61, 0x6C, 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, - 0x31, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x22, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x72, - 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, + 0x67, 0x6F, 0x64, 0x2F, 0x61, 0x70, 0x69, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x2F, 0x76, 0x31, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, + 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x49, 0x6E, + 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, + 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x6E, 0x20, 0x61, 0x63, + 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, + 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, + 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x72, 0x6D, + 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, + 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, 0x69, 0x6E, 0x66, + 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, + 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, + 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x2C, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, + 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, + 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, + 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x42, 0x6C, 0x6F, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, - 0x49, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, - 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x6E, 0x20, - 0x61, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, + 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x6C, 0x6F, 0x63, 0x6B, 0x52, 0x65, + 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, + 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, + 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x42, 0x6C, 0x6F, 0x63, 0x6B, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, + 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, + 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x28, 0x70, 0x6F, + 0x74, 0x65, 0x6E, 0x74, 0x69, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x74, 0x72, 0x75, 0x6E, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x29, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, + 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x5C, 0x6E, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x20, + 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x6F, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, + 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, + 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, + 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, + 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, 0x20, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, + 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, + 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, + 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x4E, 0x6F, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6F, + 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x75, + 0x70, 0x70, 0x6C, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, + 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x65, 0x64, 0x67, 0x65, 0x72, + 0x20, 0x73, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x63, 0x63, 0x6F, 0x75, 0x6E, 0x74, 0x22, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, - 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x6E, 0x66, 0x6F, - 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, - 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x20, 0x69, - 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, - 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, - 0x61, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, - 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, - 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, - 0x6F, 0x6E, 0x73, 0x2F, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, 0x20, + 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x42, 0x6C, 0x6F, 0x63, 0x6B, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, + 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x65, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x46, + 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, + 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x20, + 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, + 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, + 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x42, 0x6C, 0x6F, 0x63, 0x6B, - 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, - 0x73, 0x20, 0x62, 0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, + 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, + 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x42, 0x6C, 0x6F, 0x63, 0x6B, 0x22, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x50, 0x65, 0x6E, 0x64, 0x69, 0x6E, 0x67, 0x54, - 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, - 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x28, - 0x70, 0x6F, 0x74, 0x65, 0x6E, 0x74, 0x69, 0x61, 0x6C, 0x6C, 0x79, 0x20, 0x74, 0x72, 0x75, 0x6E, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, - 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x20, 0x61, 0x6E, 0x64, 0x5C, - 0x6E, 0x74, 0x68, 0x65, 0x20, 0x74, 0x6F, 0x74, 0x61, 0x6C, 0x20, 0x6E, 0x75, 0x6D, 0x62, 0x65, - 0x72, 0x20, 0x6F, 0x66, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x6F, 0x6F, 0x6C, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, - 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x50, 0x65, 0x6E, 0x64, - 0x69, 0x6E, 0x67, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, + 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6E, 0x6F, 0x64, 0x65, 0x27, 0x73, - 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, + 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, + 0x66, 0x6F, 0x72, 0x5C, 0x6E, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6E, + 0x67, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, + 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, + 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, + 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, + 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, + 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, 0x61, 0x6E, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, - 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x4E, 0x6F, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, - 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6C, 0x65, 0x64, 0x67, - 0x65, 0x72, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, - 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x53, 0x75, 0x70, 0x70, 0x6C, 0x79, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, - 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, - 0x6E, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, - 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x20, 0x66, 0x65, 0x65, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, - 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x46, 0x65, 0x65, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, - 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, - 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, - 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, - 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, - 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, - 0x6E, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x20, 0x66, 0x6F, 0x72, 0x5C, 0x6E, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6E, 0x67, 0x20, 0x61, 0x20, 0x6E, 0x65, 0x77, 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x2E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, - 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x50, 0x61, 0x72, 0x61, 0x6D, 0x73, 0x22, 0x0A, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, + 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, + 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, + 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, 0x20, 0x74, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, + 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, + 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x22, 0x0A, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, - 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, - 0x73, 0x65, 0x20, 0x63, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x74, 0x72, - 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x20, 0x69, 0x6E, 0x66, 0x6F, 0x72, 0x6D, - 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, - 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, - 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, - 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, 0x63, 0x6F, - 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x73, 0x20, 0x61, 0x20, 0x6C, 0x69, 0x73, 0x74, 0x20, 0x6F, 0x66, - 0x20, 0x74, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x2C, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, - 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, - 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, - 0x2F, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, - 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x2C, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, - 0x22, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, - 0x65, 0x20, 0x74, 0x6F, 0x20, 0x27, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6F, 0x6E, 0x73, 0x27, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, - 0x68, 0x65, 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, - 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, - 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, - 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, - 0x65, 0x66, 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x69, 0x5F, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, - 0x2E, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x6F, 0x6B, 0x65, 0x6E, 0x20, 0x63, 0x61, 0x6E, - 0x20, 0x62, 0x65, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73, - 0x69, 0x6E, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6F, 0x61, 0x6C, 0x20, 0x63, 0x6F, 0x6D, - 0x6D, 0x61, 0x6E, 0x64, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x74, 0x6F, 0x6F, 0x6C, 0x2E, 0x20, - 0x45, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x3D, 0x27, - 0x62, 0x37, 0x65, 0x33, 0x38, 0x34, 0x64, 0x30, 0x33, 0x31, 0x37, 0x62, 0x38, 0x30, 0x35, 0x30, - 0x63, 0x65, 0x34, 0x35, 0x39, 0x30, 0x30, 0x61, 0x39, 0x34, 0x61, 0x31, 0x39, 0x33, 0x31, 0x65, - 0x32, 0x38, 0x35, 0x34, 0x30, 0x65, 0x31, 0x66, 0x36, 0x39, 0x62, 0x32, 0x64, 0x32, 0x34, 0x32, - 0x62, 0x34, 0x32, 0x34, 0x36, 0x35, 0x39, 0x63, 0x33, 0x34, 0x31, 0x62, 0x34, 0x36, 0x39, 0x37, - 0x27, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x3A, 0x20, 0x22, 0x61, 0x70, 0x69, 0x4B, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x58, 0x2D, 0x41, 0x6C, 0x67, - 0x6F, 0x2D, 0x41, 0x50, 0x49, 0x2D, 0x54, 0x6F, 0x6B, 0x65, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x65, 0x78, 0x61, - 0x6D, 0x70, 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x37, 0x65, 0x33, 0x38, 0x34, 0x64, 0x30, - 0x33, 0x31, 0x37, 0x62, 0x38, 0x30, 0x35, 0x30, 0x63, 0x65, 0x34, 0x35, 0x39, 0x30, 0x30, 0x61, - 0x39, 0x34, 0x61, 0x31, 0x39, 0x33, 0x31, 0x65, 0x32, 0x38, 0x35, 0x34, 0x30, 0x65, 0x31, 0x66, - 0x36, 0x39, 0x62, 0x32, 0x64, 0x32, 0x34, 0x32, 0x62, 0x34, 0x32, 0x34, 0x36, 0x35, 0x39, 0x63, - 0x33, 0x34, 0x31, 0x62, 0x34, 0x36, 0x39, 0x37, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, - 0x20, 0x20, 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x22, 0x3A, 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x61, 0x70, 0x69, 0x5F, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x5B, 0x5D, 0x0A, 0x20, - 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x5D, 0x0A, 0x7D, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, + 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6F, 0x6E, 0x73, 0x65, 0x20, + 0x74, 0x6F, 0x20, 0x27, 0x47, 0x45, 0x54, 0x20, 0x2F, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, + 0x73, 0x27, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x63, 0x68, 0x65, + 0x6D, 0x61, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x24, 0x72, 0x65, 0x66, 0x22, 0x3A, 0x20, 0x22, 0x23, 0x2F, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x69, + 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x2F, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x22, 0x0A, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x7D, + 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x44, 0x65, 0x66, + 0x69, 0x6E, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x61, 0x70, 0x69, 0x5F, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x7B, 0x0A, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6F, 0x6E, + 0x22, 0x3A, 0x20, 0x22, 0x47, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6D, 0x65, 0x74, 0x65, 0x72, 0x2E, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x74, 0x6F, 0x6B, 0x65, 0x6E, 0x20, 0x63, 0x61, 0x6E, 0x20, 0x62, + 0x65, 0x20, 0x67, 0x65, 0x6E, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73, 0x69, 0x6E, + 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x6F, 0x61, 0x6C, 0x20, 0x63, 0x6F, 0x6D, 0x6D, 0x61, + 0x6E, 0x64, 0x20, 0x6C, 0x69, 0x6E, 0x65, 0x20, 0x74, 0x6F, 0x6F, 0x6C, 0x2E, 0x20, 0x45, 0x78, + 0x61, 0x6D, 0x70, 0x6C, 0x65, 0x20, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x20, 0x3D, 0x27, 0x62, 0x37, + 0x65, 0x33, 0x38, 0x34, 0x64, 0x30, 0x33, 0x31, 0x37, 0x62, 0x38, 0x30, 0x35, 0x30, 0x63, 0x65, + 0x34, 0x35, 0x39, 0x30, 0x30, 0x61, 0x39, 0x34, 0x61, 0x31, 0x39, 0x33, 0x31, 0x65, 0x32, 0x38, + 0x35, 0x34, 0x30, 0x65, 0x31, 0x66, 0x36, 0x39, 0x62, 0x32, 0x64, 0x32, 0x34, 0x32, 0x62, 0x34, + 0x32, 0x34, 0x36, 0x35, 0x39, 0x63, 0x33, 0x34, 0x31, 0x62, 0x34, 0x36, 0x39, 0x37, 0x27, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3A, 0x20, + 0x22, 0x61, 0x70, 0x69, 0x4B, 0x65, 0x79, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6E, 0x61, 0x6D, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x58, 0x2D, 0x41, 0x6C, 0x67, 0x6F, 0x2D, + 0x41, 0x50, 0x49, 0x2D, 0x54, 0x6F, 0x6B, 0x65, 0x6E, 0x22, 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x6E, 0x22, 0x3A, 0x20, 0x22, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, + 0x2C, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x78, 0x2D, 0x65, 0x78, 0x61, 0x6D, 0x70, + 0x6C, 0x65, 0x22, 0x3A, 0x20, 0x22, 0x62, 0x37, 0x65, 0x33, 0x38, 0x34, 0x64, 0x30, 0x33, 0x31, + 0x37, 0x62, 0x38, 0x30, 0x35, 0x30, 0x63, 0x65, 0x34, 0x35, 0x39, 0x30, 0x30, 0x61, 0x39, 0x34, + 0x61, 0x31, 0x39, 0x33, 0x31, 0x65, 0x32, 0x38, 0x35, 0x34, 0x30, 0x65, 0x31, 0x66, 0x36, 0x39, + 0x62, 0x32, 0x64, 0x32, 0x34, 0x32, 0x62, 0x34, 0x32, 0x34, 0x36, 0x35, 0x39, 0x63, 0x33, 0x34, + 0x31, 0x62, 0x34, 0x36, 0x39, 0x37, 0x22, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7D, 0x0A, 0x20, 0x20, + 0x7D, 0x2C, 0x0A, 0x20, 0x20, 0x22, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x22, 0x3A, + 0x20, 0x5B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x7B, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x61, 0x70, 0x69, 0x5F, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x5B, 0x5D, 0x0A, 0x20, 0x20, 0x20, + 0x20, 0x7D, 0x0A, 0x20, 0x20, 0x5D, 0x0A, 0x7D, }) } diff --git a/daemon/algod/api/server/v1/handlers/handlers.go b/daemon/algod/api/server/v1/handlers/handlers.go index abecbb5e91..c1f08ffd22 100644 --- a/daemon/algod/api/server/v1/handlers/handlers.go +++ b/daemon/algod/api/server/v1/handlers/handlers.go @@ -487,7 +487,7 @@ func blockEncode(b bookkeeping.Block, c agreement.Certificate) (v1.Block, error) Seed: crypto.Digest(b.Seed()).String(), Proposer: c.Proposal.OriginalProposer.String(), Round: uint64(b.Round()), - TransactionsRoot: b.TxnRoot.String(), + TransactionsRoot: b.TxnCommitments.NativeSha512_256Commitment.String(), // No need to support SHA256 in API V1 RewardsRate: b.RewardsRate, RewardsLevel: b.RewardsLevel, RewardsResidue: b.RewardsResidue, diff --git a/daemon/algod/api/server/v2/errors.go b/daemon/algod/api/server/v2/errors.go index 6223abad9a..1bdbb9a84c 100644 --- a/daemon/algod/api/server/v2/errors.go +++ b/daemon/algod/api/server/v2/errors.go @@ -34,6 +34,7 @@ var ( errFailedToEncodeResponse = "failed to encode response" errInternalFailure = "internal failure" errNoTxnSpecified = "no transaction ID was specified" + errInvalidHashType = "invalid hash type" errTransactionNotFound = "could not find the transaction in the transaction pool or in the last 1000 confirmed rounds" errServiceShuttingDown = "operation aborted as server is shutting down" errRequestedRoundInUnsupportedRound = "requested round would reach only after the protocol upgrade which isn't supported" diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index e37b754895..0ea7ae252c 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -357,107 +357,107 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index ff7643fdf7..b1695885ee 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -711,8 +711,8 @@ type PostTransactionsResponse struct { type ProofResponse struct { // The type of hash function used to create the proof, must be one of: - // * sumhash // * sha512_256 + // * sha256 Hashtype string `json:"hashtype"` // Index of the transaction in the block's payset. diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index b819ded7db..2c23f41c4d 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -395,8 +395,9 @@ func (w *ServerInterfaceWrapper) GetBlock(ctx echo.Context) error { func (w *ServerInterfaceWrapper) GetProof(ctx echo.Context) error { validQueryParams := map[string]bool{ - "pretty": true, - "format": true, + "pretty": true, + "hashtype": true, + "format": true, } // Check for unknown query parameters. @@ -427,6 +428,16 @@ func (w *ServerInterfaceWrapper) GetProof(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params GetProofParams + // ------------- Optional query parameter "hashtype" ------------- + if paramValue := ctx.QueryParam("hashtype"); paramValue != "" { + + } + + err = runtime.BindQueryParameter("form", true, false, "hashtype", ctx.QueryParams(), ¶ms.Hashtype) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter hashtype: %s", err)) + } + // ------------- Optional query parameter "format" ------------- if paramValue := ctx.QueryParam("format"); paramValue != "" { @@ -764,203 +775,203 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "rSpBuRYBAA==", + "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", + "lJKdY/rg95f/LwAA///1Bvg7gBcBAA==", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 50bb0a3edd..b6b189c91a 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -711,8 +711,8 @@ type PostTransactionsResponse struct { type ProofResponse struct { // The type of hash function used to create the proof, must be one of: - // * sumhash // * sha512_256 + // * sha256 Hashtype string `json:"hashtype"` // Index of the transaction in the block's payset. @@ -815,6 +815,11 @@ type GetBlockParams struct { // GetProofParams defines parameters for GetProof. type GetProofParams struct { + // The type of hash function used to create the proof, must be one of: + // * sha512_256 + // * sha256 + Hashtype *string `json:"hashtype,omitempty"` + // Configures whether the response object is JSON or MessagePack encoded. Format *string `json:"format,omitempty"` } diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index 4098bf0aa6..581176be30 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -32,6 +32,7 @@ import ( "github.com/algorand/go-algorand/agreement" "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated/private" model "github.com/algorand/go-algorand/daemon/algod/api/spec/v2" @@ -574,6 +575,10 @@ func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params return badRequest(ctx, err, errNoTxnSpecified, v2.Log) } + if params.Hashtype != nil && *params.Hashtype != "sha512_256" && *params.Hashtype != "sha256" { + return badRequest(ctx, nil, errInvalidHashType, v2.Log) + } + ledger := v2.Node.LedgerForAPI() block, _, err := ledger.BlockCert(basics.Round(round)) if err != nil { @@ -585,35 +590,57 @@ func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params return notFound(ctx, err, "protocol does not support Merkle proofs", v2.Log) } + hashtype := "sha512_256" // default hash type for proof + if params.Hashtype != nil { + hashtype = *params.Hashtype + } + if hashtype == "sha256" && !proto.EnableSHA256TxnCommitmentHeader { + return badRequest(ctx, err, "protocol does not support sha256 vector commitment proofs", v2.Log) + } + txns, err := block.DecodePaysetFlat() if err != nil { return internalError(ctx, err, "decoding transactions", v2.Log) } for idx := range txns { - if txns[idx].Txn.ID() == txID { - tree, err := block.TxnMerkleTree() + if txns[idx].ID() != txID { + continue // skip + } + + var tree *merklearray.Tree + var stibhash crypto.Digest + + switch hashtype { + case "sha256": + tree, err = block.TxnMerkleTreeSHA256() if err != nil { - return internalError(ctx, err, "building Merkle tree", v2.Log) + return internalError(ctx, err, "building Vector Commitment (SHA256)", v2.Log) } - - proof, err := tree.ProveSingleLeaf(uint64(idx)) + stibhash = block.Payset[idx].HashSHA256() + case "sha512_256": + tree, err = block.TxnMerkleTree() if err != nil { - return internalError(ctx, err, "generating proof", v2.Log) + return internalError(ctx, err, "building Merkle tree", v2.Log) } + stibhash = block.Payset[idx].Hash() + default: + return badRequest(ctx, err, "unsupported hash type", v2.Log) + } - stibhash := block.Payset[idx].Hash() - - response := generated.ProofResponse{ - Proof: proof.GetConcatenatedProof(), - Stibhash: stibhash[:], - Idx: uint64(idx), - Treedepth: uint64(proof.TreeDepth), - Hashtype: proof.HashFactory.HashType.String(), - } + proof, err := tree.ProveSingleLeaf(uint64(idx)) + if err != nil { + return internalError(ctx, err, "generating proof", v2.Log) + } - return ctx.JSON(http.StatusOK, response) + response := generated.ProofResponse{ + Proof: proof.GetConcatenatedProof(), + Stibhash: stibhash[:], + Idx: uint64(idx), + Treedepth: uint64(proof.TreeDepth), } + + return ctx.JSON(http.StatusOK, response) } err = errors.New(errTransactionNotFound) diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index e222a5f77e..c8a1e6fbc6 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -26,10 +26,12 @@ import ( "testing" "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/agreement" "github.com/algorand/go-algorand/crypto" + "github.com/algorand/go-algorand/crypto/merklearray" "github.com/algorand/go-algorand/crypto/merklesignature" v2 "github.com/algorand/go-algorand/daemon/algod/api/server/v2" "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" @@ -117,12 +119,8 @@ func TestGetBlock(t *testing.T) { getBlockTest(t, 0, "bad format", 400) } -func TestGetBlockJsonEncoding(t *testing.T) { - partitiontest.PartitionTest(t) - t.Parallel() - +func addBlockHelper(t *testing.T) (v2.Handlers, echo.Context, *httptest.ResponseRecorder, transactions.SignedTxn, func()) { handler, c, rec, _, _, releasefunc := setupTestForMethodGet(t) - defer releasefunc() l := handler.Node.LedgerForAPI() @@ -193,24 +191,34 @@ func TestGetBlockJsonEncoding(t *testing.T) { txib, err := blk.EncodeSignedTxn(stx, ad) blk.Payset = append(blk.Payset, txib) blk.BlockHeader.TxnCounter++ - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) err = l.(*data.Ledger).AddBlock(blk, agreement.Certificate{}) require.NoError(t, err) + return handler, c, rec, stx, releasefunc +} + +func TestGetBlockJsonEncoding(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + handler, c, rec, _, releasefunc := addBlockHelper(t) + defer releasefunc() + // fetch the block and ensure it can be properly decoded with the standard JSON decoder format := "json" - err = handler.GetBlock(c, 1, generatedV2.GetBlockParams{Format: &format}) + err := handler.GetBlock(c, 1, generatedV2.GetBlockParams{Format: &format}) require.NoError(t, err) require.Equal(t, 200, rec.Code) - data := rec.Body.Bytes() + body := rec.Body.Bytes() response := struct { Block bookkeeping.Block `codec:"block"` }{} - err = json.Unmarshal(data, &response) + err = json.Unmarshal(body, &response) require.NoError(t, err) } @@ -859,3 +867,63 @@ func TestAppendParticipationKeys(t *testing.T) { require.Contains(t, rec.Body.String(), expectedErr.Error()) }) } + +// TxnMerkleElemRaw this struct helps creates a hashable struct from the bytes +type TxnMerkleElemRaw struct { + Txn crypto.Digest // txn id + Stib crypto.Digest // hash value of transactions.SignedTxnInBlock +} + +func txnMerkleToRaw(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) (buf []byte) { + buf = make([]byte, 2*crypto.DigestSize) + copy(buf[:], txid[:]) + copy(buf[crypto.DigestSize:], stib[:]) + return +} + +// ToBeHashed implements the crypto.Hashable interface. +func (tme *TxnMerkleElemRaw) ToBeHashed() (protocol.HashID, []byte) { + return protocol.TxnMerkleLeaf, txnMerkleToRaw(tme.Txn, tme.Stib) +} + +func TestGetProofDefault(t *testing.T) { + partitiontest.PartitionTest(t) + a := assert.New(t) + + handler, c, rec, stx, releasefunc := addBlockHelper(t) + defer releasefunc() + + txid := stx.ID() + err := handler.GetProof(c, 1, txid.String(), generated.GetProofParams{}) + a.NoError(err) + + var resp generatedV2.ProofResponse + err = json.Unmarshal(rec.Body.Bytes(), &resp) + a.NoError(err) + + l := handler.Node.LedgerForAPI() + blkHdr, err := l.BlockHdr(1) + a.NoError(err) + + // Build merklearray.Proof from ProofResponse + var proof merklearray.Proof + proof.HashFactory = crypto.HashFactory{HashType: crypto.Sha512_256} + proof.TreeDepth = uint8(resp.Treedepth) + a.NotEqual(proof.TreeDepth, 0) + proofconcat := resp.Proof + for len(proofconcat) > 0 { + var d crypto.Digest + copy(d[:], proofconcat) + proof.Path = append(proof.Path, d[:]) + proofconcat = proofconcat[len(d):] + } + + element := TxnMerkleElemRaw{Txn: crypto.Digest(txid)} + copy(element.Stib[:], resp.Stibhash[:]) + elems := make(map[uint64]crypto.Hashable) + elems[0] = &element + + // Verifies that the default proof is using SHA512_256 + err = merklearray.Verify(blkHdr.TxnCommitments.NativeSha512_256Commitment.ToSlice(), elems, &proof) + a.NoError(err) +} diff --git a/daemon/algod/api/spec/v1/model.go b/daemon/algod/api/spec/v1/model.go index 96fc0ee05a..b01db103e4 100644 --- a/daemon/algod/api/spec/v1/model.go +++ b/daemon/algod/api/spec/v1/model.go @@ -913,8 +913,8 @@ type Block struct { // TransactionsRoot authenticates the set of transactions appearing in the block. // More specifically, it's the root of a merkle tree whose leaves are the block's Txids, in lexicographic order. // For the empty block, it's 0. - // Note that the TxnRoot does not authenticate the signatures on the transactions, only the transactions themselves. - // Two blocks with the same transactions but in a different order and with different signatures will have the same TxnRoot. + // Note that the TxnCommitments does not authenticate the signatures on the transactions, only the transactions themselves. + // Two blocks with the same transactions but in a different order and with different signatures will have the same TxnCommitments. // // required: true TransactionsRoot string `json:"txnRoot"` diff --git a/daemon/algod/api/swagger.json b/daemon/algod/api/swagger.json index 23ff8ec7a6..5a788df54d 100644 --- a/daemon/algod/api/swagger.json +++ b/daemon/algod/api/swagger.json @@ -1356,7 +1356,7 @@ "x-go-name": "Timestamp" }, "txnRoot": { - "description": "TransactionsRoot authenticates the set of transactions appearing in the block.\nMore specifically, it's the root of a merkle tree whose leaves are the block's Txids, in lexicographic order.\nFor the empty block, it's 0.\nNote that the TxnRoot does not authenticate the signatures on the transactions, only the transactions themselves.\nTwo blocks with the same transactions but in a different order and with different signatures will have the same TxnRoot.", + "description": "TransactionsRoot authenticates the set of transactions appearing in the block.\nMore specifically, it's the root of a merkle tree whose leaves are the block's Txids, in lexicographic order.\nFor the empty block, it's 0.\nNote that the TxnCommitments does not authenticate the signatures on the transactions, only the transactions themselves.\nTwo blocks with the same transactions but in a different order and with different signatures will have the same TxnCommitments.", "type": "string", "x-go-name": "TransactionsRoot" }, diff --git a/data/bookkeeping/block.go b/data/bookkeeping/block.go index 46f17c8ef5..584e0394df 100644 --- a/data/bookkeeping/block.go +++ b/data/bookkeeping/block.go @@ -46,10 +46,8 @@ type ( // Sortition seed Seed committee.Seed `codec:"seed"` - // TxnRoot authenticates the set of transactions appearing in the block. - // The commitment is computed based on the PaysetCommit type specified - // in the block's consensus protocol. - TxnRoot crypto.Digest `codec:"txn"` + // TxnCommitments authenticates the set of transactions appearing in the block. + TxnCommitments // TimeStamp in seconds since epoch TimeStamp int64 `codec:"ts"` @@ -131,6 +129,18 @@ type ( ParticipationUpdates } + // TxnCommitments represents the commitments computed from the transactions in the block. + // It contains multiple commitments based on different algorithms and hash functions, to support different use cases. + TxnCommitments struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + // Root of transaction merkle tree using SHA512_256 hash function. + // This commitment is computed based on the PaysetCommit type specified in the block's consensus protocol. + NativeSha512_256Commitment crypto.Digest `codec:"txn"` + + // Root of transaction vector commitment merkle tree using SHA256 hash function + Sha256Commitment crypto.Digest `codec:"txn256"` + } + // ParticipationUpdates represents participation account data that // needs to be checked/acted on by the network ParticipationUpdates struct { @@ -496,10 +506,11 @@ func MakeBlock(prev BlockHeader) Block { GenesisHash: prev.GenesisHash, }, } - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() if err != nil { - logging.Base().Warnf("MakeBlock: computing empty TxnRoot: %v", err) + logging.Base().Warnf("MakeBlock: computing empty TxnCommitments: %v", err) } + // We can't know the entire RewardsState yet, but we can carry over the special addresses. blk.BlockHeader.RewardsState.FeeSink = prev.RewardsState.FeeSink blk.BlockHeader.RewardsState.RewardsPool = prev.RewardsState.RewardsPool @@ -508,13 +519,29 @@ func MakeBlock(prev BlockHeader) Block { // PaysetCommit computes the commitment to the payset, using the appropriate // commitment plan based on the block's protocol. -func (block Block) PaysetCommit() (crypto.Digest, error) { +func (block Block) PaysetCommit() (TxnCommitments, error) { params, ok := config.Consensus[block.CurrentProtocol] if !ok { - return crypto.Digest{}, fmt.Errorf("unsupported protocol %v", block.CurrentProtocol) + return TxnCommitments{}, fmt.Errorf("unsupported protocol %v", block.CurrentProtocol) } - return block.paysetCommit(params.PaysetCommit) + digestSHA512_256, err := block.paysetCommit(params.PaysetCommit) + if err != nil { + return TxnCommitments{}, err + } + + var digestSHA256 crypto.Digest + if params.EnableSHA256TxnCommitmentHeader { + digestSHA256, err = block.paysetCommitSHA256() + if err != nil { + return TxnCommitments{}, err + } + } + + return TxnCommitments{ + Sha256Commitment: digestSHA256, + NativeSha512_256Commitment: digestSHA512_256, + }, nil } func (block Block) paysetCommit(t config.PaysetCommitType) (crypto.Digest, error) { @@ -539,6 +566,18 @@ func (block Block) paysetCommit(t config.PaysetCommitType) (crypto.Digest, error } } +func (block Block) paysetCommitSHA256() (crypto.Digest, error) { + tree, err := block.TxnMerkleTreeSHA256() + if err != nil { + return crypto.Digest{}, err + } + + rootSlice := tree.Root() + var rootAsByteArray crypto.Digest + copy(rootAsByteArray[:], rootSlice) + return rootAsByteArray, nil +} + // PreCheck checks if the block header bh is a valid successor to // the previous block's header, prev. func (bh BlockHeader) PreCheck(prev BlockHeader) error { @@ -605,7 +644,7 @@ func (bh BlockHeader) PreCheck(prev BlockHeader) error { return nil } -// ContentsMatchHeader checks that the TxnRoot matches what's in the header, +// ContentsMatchHeader checks that the TxnCommitments matches what's in the header, // as the header is what the block hash authenticates. // If we're given an untrusted block and a known-good hash, we can't trust the // block's transactions unless we validate this. @@ -616,7 +655,7 @@ func (block Block) ContentsMatchHeader() bool { return false } - return expected == block.TxnRoot + return expected == block.TxnCommitments } // DecodePaysetGroups decodes block.Payset using DecodeSignedTxn, and returns diff --git a/data/bookkeeping/block_test.go b/data/bookkeeping/block_test.go index 2956edb128..d57736701d 100644 --- a/data/bookkeeping/block_test.go +++ b/data/bookkeeping/block_test.go @@ -18,6 +18,7 @@ package bookkeeping import ( "bytes" + "encoding/hex" "math" "testing" "time" @@ -769,3 +770,107 @@ func TestNextRewardsRateWithFixNextRewardLevelOverflow(t *testing.T) { assert.Contains(t, string(buf.Bytes()), "could not compute next reward level") } + +func TestBlock_ContentsMatchHeader(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + // Create a block without SHA256 TxnCommitments + var block Block + block.CurrentProtocol = protocol.ConsensusV32 + crypto.RandBytes(block.BlockHeader.GenesisHash[:]) + + for i := 0; i < 1024; i++ { + txn := transactions.Transaction{ + Type: protocol.PaymentTx, + Header: transactions.Header{ + GenesisHash: block.BlockHeader.GenesisHash, + }, + PaymentTxnFields: transactions.PaymentTxnFields{ + Amount: basics.MicroAlgos{Raw: crypto.RandUint64()}, + }, + } + + crypto.RandBytes(txn.Sender[:]) + crypto.RandBytes(txn.PaymentTxnFields.Receiver[:]) + + sigtxn := transactions.SignedTxn{Txn: txn} + ad := transactions.ApplyData{} + + stib, err := block.BlockHeader.EncodeSignedTxn(sigtxn, ad) + a.NoError(err) + + block.Payset = append(block.Payset, stib) + } + + tree, err := block.TxnMerkleTree() + a.NoError(err) + rootSliceSHA512_256 := tree.Root() + + tree, err = block.TxnMerkleTreeSHA256() + a.NoError(err) + rootSliceSHA256 := tree.Root() + + badDigestSlice := []byte("(>^-^)>") + + /* Test V32 */ + a.False(block.ContentsMatchHeader()) + + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], rootSliceSHA512_256) + block.BlockHeader.TxnCommitments.Sha256Commitment = crypto.Digest{} + a.True(block.ContentsMatchHeader()) + + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], rootSliceSHA512_256) + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.False(block.ContentsMatchHeader()) + + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], badDigestSlice) + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.False(block.ContentsMatchHeader()) + + block.BlockHeader.TxnCommitments.NativeSha512_256Commitment = crypto.Digest{} + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.False(block.ContentsMatchHeader()) + + /* Test Consensus Future */ + // Create a block with SHA256 TxnCommitments + block.CurrentProtocol = protocol.ConsensusFuture + + block.BlockHeader.TxnCommitments.NativeSha512_256Commitment = crypto.Digest{} + block.BlockHeader.TxnCommitments.Sha256Commitment = crypto.Digest{} + a.False(block.ContentsMatchHeader()) + + // Now update the SHA256 header to its correct value + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], rootSliceSHA512_256) + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.True(block.ContentsMatchHeader()) + + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], badDigestSlice) + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.False(block.ContentsMatchHeader()) + + copy(block.BlockHeader.TxnCommitments.NativeSha512_256Commitment[:], rootSliceSHA512_256) + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], badDigestSlice) + a.False(block.ContentsMatchHeader()) + + block.BlockHeader.TxnCommitments.NativeSha512_256Commitment = crypto.Digest{} + copy(block.BlockHeader.TxnCommitments.Sha256Commitment[:], rootSliceSHA256) + a.False(block.ContentsMatchHeader()) +} + +func TestBlockHeader_Serialization(t *testing.T) { + partitiontest.PartitionTest(t) + a := require.New(t) + + // This serialized block header was generated from V32 e2e test, using the old BlockHeader struct which contains only TxnCommitments SHA512_256 value + serializedBlkHdr := "8fa26363810081a16ecd0200a466656573c42007dacb4b6d9ed141b17576bd459ae6421d486da3d4ef2247c409a396b82ea221a466726163ce1dcd64fea367656ea7746573742d7631a26768c42032cb340d569e1f9e4d9690c1ba04d77759bae6f353e13af1becf42dcd7d3bdeba470726576c420a2270bc90e3cc48d56081b3b85c15d6a10e14303a6d42ca2537954ce90beec40a570726f746fa6667574757265a472617465ce0ee6b27fa3726e6402a6727763616c72ce0007a120a3727764c420ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa473656564c420a19005a25abad1ad28ec2298baeda9a17693a9ef12127a5ff3e5fa9258c7e9eba2746306a27473ce625ed0eaa374786ec420508f9330176e6064767b0fb7eb0e8bf68ffbaf995a4c7b37ca0217c5a82b4a60" + bytesBlkHdr, err := hex.DecodeString(serializedBlkHdr) + a.NoError(err) + + var blkHdr BlockHeader + err = protocol.Decode(bytesBlkHdr, &blkHdr) + a.NoError(err) + + a.Equal(crypto.Digest{}, blkHdr.TxnCommitments.Sha256Commitment) + a.NotEqual(crypto.Digest{}, blkHdr.TxnCommitments.NativeSha512_256Commitment) +} diff --git a/data/bookkeeping/genesis.go b/data/bookkeeping/genesis.go index 3b15d91d0d..d763203fe8 100644 --- a/data/bookkeeping/genesis.go +++ b/data/bookkeeping/genesis.go @@ -164,13 +164,13 @@ func MakeGenesisBlock(proto protocol.ConsensusVersion, genesisBal GenesisBalance blk := Block{ BlockHeader: BlockHeader{ - Round: 0, - Branch: BlockHash{}, - Seed: committee.Seed(genesisHash), - TxnRoot: transactions.Payset{}.CommitGenesis(), - TimeStamp: genesisBal.Timestamp, - GenesisID: genesisID, - RewardsState: genesisRewardsState, + Round: 0, + Branch: BlockHash{}, + Seed: committee.Seed(genesisHash), + TxnCommitments: TxnCommitments{NativeSha512_256Commitment: transactions.Payset{}.CommitGenesis(), Sha256Commitment: crypto.Digest{}}, + TimeStamp: genesisBal.Timestamp, + GenesisID: genesisID, + RewardsState: genesisRewardsState, UpgradeState: UpgradeState{ CurrentProtocol: proto, }, diff --git a/data/bookkeeping/msgp_gen.go b/data/bookkeeping/msgp_gen.go index e7a810e3d5..fdc36e398c 100644 --- a/data/bookkeeping/msgp_gen.go +++ b/data/bookkeeping/msgp_gen.go @@ -77,6 +77,14 @@ import ( // |-----> (*) Msgsize // |-----> (*) MsgIsZero // +// TxnCommitments +// |-----> (*) MarshalMsg +// |-----> (*) CanMarshalMsg +// |-----> (*) UnmarshalMsg +// |-----> (*) CanUnmarshalMsg +// |-----> (*) Msgsize +// |-----> (*) MsgIsZero +// // UpgradeVote // |-----> (*) MarshalMsg // |-----> (*) CanMarshalMsg @@ -90,112 +98,116 @@ import ( func (z *Block) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0004Len := uint32(25) - var zb0004Mask uint32 /* 29 bits */ + zb0004Len := uint32(26) + var zb0004Mask uint32 /* 31 bits */ if len((*z).BlockHeader.CompactCert) == 0 { zb0004Len-- - zb0004Mask |= 0x10 + zb0004Mask |= 0x20 } if (*z).BlockHeader.RewardsState.RewardsLevel == 0 { zb0004Len-- - zb0004Mask |= 0x20 + zb0004Mask |= 0x40 } if (*z).BlockHeader.RewardsState.FeeSink.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40 + zb0004Mask |= 0x80 } if (*z).BlockHeader.RewardsState.RewardsResidue == 0 { zb0004Len-- - zb0004Mask |= 0x80 + zb0004Mask |= 0x100 } if (*z).BlockHeader.GenesisID == "" { zb0004Len-- - zb0004Mask |= 0x100 + zb0004Mask |= 0x200 } if (*z).BlockHeader.GenesisHash.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200 + zb0004Mask |= 0x400 } if (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400 + zb0004Mask |= 0x800 } if (*z).BlockHeader.UpgradeState.NextProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800 + zb0004Mask |= 0x1000 } if (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000 + zb0004Mask |= 0x2000 } if (*z).BlockHeader.UpgradeState.NextProtocolApprovals == 0 { zb0004Len-- - zb0004Mask |= 0x2000 + zb0004Mask |= 0x4000 } if len((*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0 { zb0004Len-- - zb0004Mask |= 0x4000 + zb0004Mask |= 0x8000 } if (*z).BlockHeader.Branch.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x8000 + zb0004Mask |= 0x10000 } if (*z).BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000 + zb0004Mask |= 0x20000 } if (*z).BlockHeader.RewardsState.RewardsRate == 0 { zb0004Len-- - zb0004Mask |= 0x20000 + zb0004Mask |= 0x40000 } if (*z).BlockHeader.Round.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000 + zb0004Mask |= 0x80000 } if (*z).BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000 + zb0004Mask |= 0x100000 } if (*z).BlockHeader.RewardsState.RewardsPool.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x100000 + zb0004Mask |= 0x200000 } if (*z).BlockHeader.Seed.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000 + zb0004Mask |= 0x400000 } if (*z).BlockHeader.TxnCounter == 0 { zb0004Len-- - zb0004Mask |= 0x400000 + zb0004Mask |= 0x800000 } if (*z).BlockHeader.TimeStamp == 0 { zb0004Len-- - zb0004Mask |= 0x800000 + zb0004Mask |= 0x1000000 } - if (*z).BlockHeader.TxnRoot.MsgIsZero() { + if (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000000 + zb0004Mask |= 0x2000000 + } + if (*z).BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero() { + zb0004Len-- + zb0004Mask |= 0x4000000 } if (*z).Payset.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000000 + zb0004Mask |= 0x8000000 } if (*z).BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x4000000 + zb0004Mask |= 0x10000000 } if (*z).BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x8000000 + zb0004Mask |= 0x20000000 } if (*z).BlockHeader.UpgradeVote.UpgradeApprove == false { zb0004Len-- - zb0004Mask |= 0x10000000 + zb0004Mask |= 0x40000000 } // variable map header, size zb0004Len o = msgp.AppendMapHeader(o, zb0004Len) if zb0004Len != 0 { - if (zb0004Mask & 0x10) == 0 { // if not empty + if (zb0004Mask & 0x20) == 0 { // if not empty // string "cc" o = append(o, 0xa2, 0x63, 0x63) if (*z).BlockHeader.CompactCert == nil { @@ -215,52 +227,52 @@ func (z *Block) MarshalMsg(b []byte) (o []byte) { o = zb0002.MarshalMsg(o) } } - if (zb0004Mask & 0x20) == 0 { // if not empty + if (zb0004Mask & 0x40) == 0 { // if not empty // string "earn" o = append(o, 0xa4, 0x65, 0x61, 0x72, 0x6e) o = msgp.AppendUint64(o, (*z).BlockHeader.RewardsState.RewardsLevel) } - if (zb0004Mask & 0x40) == 0 { // if not empty + if (zb0004Mask & 0x80) == 0 { // if not empty // string "fees" o = append(o, 0xa4, 0x66, 0x65, 0x65, 0x73) o = (*z).BlockHeader.RewardsState.FeeSink.MarshalMsg(o) } - if (zb0004Mask & 0x80) == 0 { // if not empty + if (zb0004Mask & 0x100) == 0 { // if not empty // string "frac" o = append(o, 0xa4, 0x66, 0x72, 0x61, 0x63) o = msgp.AppendUint64(o, (*z).BlockHeader.RewardsState.RewardsResidue) } - if (zb0004Mask & 0x100) == 0 { // if not empty + if (zb0004Mask & 0x200) == 0 { // if not empty // string "gen" o = append(o, 0xa3, 0x67, 0x65, 0x6e) o = msgp.AppendString(o, (*z).BlockHeader.GenesisID) } - if (zb0004Mask & 0x200) == 0 { // if not empty + if (zb0004Mask & 0x400) == 0 { // if not empty // string "gh" o = append(o, 0xa2, 0x67, 0x68) o = (*z).BlockHeader.GenesisHash.MarshalMsg(o) } - if (zb0004Mask & 0x400) == 0 { // if not empty + if (zb0004Mask & 0x800) == 0 { // if not empty // string "nextbefore" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65) o = (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MarshalMsg(o) } - if (zb0004Mask & 0x800) == 0 { // if not empty + if (zb0004Mask & 0x1000) == 0 { // if not empty // string "nextproto" o = append(o, 0xa9, 0x6e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).BlockHeader.UpgradeState.NextProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x1000) == 0 { // if not empty + if (zb0004Mask & 0x2000) == 0 { // if not empty // string "nextswitch" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68) o = (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MarshalMsg(o) } - if (zb0004Mask & 0x2000) == 0 { // if not empty + if (zb0004Mask & 0x4000) == 0 { // if not empty // string "nextyes" o = append(o, 0xa7, 0x6e, 0x65, 0x78, 0x74, 0x79, 0x65, 0x73) o = msgp.AppendUint64(o, (*z).BlockHeader.UpgradeState.NextProtocolApprovals) } - if (zb0004Mask & 0x4000) == 0 { // if not empty + if (zb0004Mask & 0x8000) == 0 { // if not empty // string "partupdrmv" o = append(o, 0xaa, 0x70, 0x61, 0x72, 0x74, 0x75, 0x70, 0x64, 0x72, 0x6d, 0x76) if (*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts == nil { @@ -272,72 +284,77 @@ func (z *Block) MarshalMsg(b []byte) (o []byte) { o = (*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts[zb0003].MarshalMsg(o) } } - if (zb0004Mask & 0x8000) == 0 { // if not empty + if (zb0004Mask & 0x10000) == 0 { // if not empty // string "prev" o = append(o, 0xa4, 0x70, 0x72, 0x65, 0x76) o = (*z).BlockHeader.Branch.MarshalMsg(o) } - if (zb0004Mask & 0x10000) == 0 { // if not empty + if (zb0004Mask & 0x20000) == 0 { // if not empty // string "proto" o = append(o, 0xa5, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).BlockHeader.UpgradeState.CurrentProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x20000) == 0 { // if not empty + if (zb0004Mask & 0x40000) == 0 { // if not empty // string "rate" o = append(o, 0xa4, 0x72, 0x61, 0x74, 0x65) o = msgp.AppendUint64(o, (*z).BlockHeader.RewardsState.RewardsRate) } - if (zb0004Mask & 0x40000) == 0 { // if not empty + if (zb0004Mask & 0x80000) == 0 { // if not empty // string "rnd" o = append(o, 0xa3, 0x72, 0x6e, 0x64) o = (*z).BlockHeader.Round.MarshalMsg(o) } - if (zb0004Mask & 0x80000) == 0 { // if not empty + if (zb0004Mask & 0x100000) == 0 { // if not empty // string "rwcalr" o = append(o, 0xa6, 0x72, 0x77, 0x63, 0x61, 0x6c, 0x72) o = (*z).BlockHeader.RewardsState.RewardsRecalculationRound.MarshalMsg(o) } - if (zb0004Mask & 0x100000) == 0 { // if not empty + if (zb0004Mask & 0x200000) == 0 { // if not empty // string "rwd" o = append(o, 0xa3, 0x72, 0x77, 0x64) o = (*z).BlockHeader.RewardsState.RewardsPool.MarshalMsg(o) } - if (zb0004Mask & 0x200000) == 0 { // if not empty + if (zb0004Mask & 0x400000) == 0 { // if not empty // string "seed" o = append(o, 0xa4, 0x73, 0x65, 0x65, 0x64) o = (*z).BlockHeader.Seed.MarshalMsg(o) } - if (zb0004Mask & 0x400000) == 0 { // if not empty + if (zb0004Mask & 0x800000) == 0 { // if not empty // string "tc" o = append(o, 0xa2, 0x74, 0x63) o = msgp.AppendUint64(o, (*z).BlockHeader.TxnCounter) } - if (zb0004Mask & 0x800000) == 0 { // if not empty + if (zb0004Mask & 0x1000000) == 0 { // if not empty // string "ts" o = append(o, 0xa2, 0x74, 0x73) o = msgp.AppendInt64(o, (*z).BlockHeader.TimeStamp) } - if (zb0004Mask & 0x1000000) == 0 { // if not empty + if (zb0004Mask & 0x2000000) == 0 { // if not empty // string "txn" o = append(o, 0xa3, 0x74, 0x78, 0x6e) - o = (*z).BlockHeader.TxnRoot.MarshalMsg(o) + o = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.MarshalMsg(o) } - if (zb0004Mask & 0x2000000) == 0 { // if not empty + if (zb0004Mask & 0x4000000) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).BlockHeader.TxnCommitments.Sha256Commitment.MarshalMsg(o) + } + if (zb0004Mask & 0x8000000) == 0 { // if not empty // string "txns" o = append(o, 0xa4, 0x74, 0x78, 0x6e, 0x73) o = (*z).Payset.MarshalMsg(o) } - if (zb0004Mask & 0x4000000) == 0 { // if not empty + if (zb0004Mask & 0x10000000) == 0 { // if not empty // string "upgradedelay" o = append(o, 0xac, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x65, 0x6c, 0x61, 0x79) o = (*z).BlockHeader.UpgradeVote.UpgradeDelay.MarshalMsg(o) } - if (zb0004Mask & 0x8000000) == 0 { // if not empty + if (zb0004Mask & 0x20000000) == 0 { // if not empty // string "upgradeprop" o = append(o, 0xab, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x70) o = (*z).BlockHeader.UpgradeVote.UpgradePropose.MarshalMsg(o) } - if (zb0004Mask & 0x10000000) == 0 { // if not empty + if (zb0004Mask & 0x40000000) == 0 { // if not empty // string "upgradeyes" o = append(o, 0xaa, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x79, 0x65, 0x73) o = msgp.AppendBool(o, (*z).BlockHeader.UpgradeVote.UpgradeApprove) @@ -390,9 +407,17 @@ func (z *Block) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0004 > 0 { + zb0004-- + bts, err = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnRoot") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } @@ -654,10 +679,16 @@ func (z *Block) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } + case "txn256": + bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "txn": - bts, err = (*z).BlockHeader.TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "TxnRoot") + err = msgp.WrapError(err, "NativeSha512_256Commitment") return } case "ts": @@ -855,7 +886,7 @@ func (_ *Block) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Block) Msgsize() (s int) { - s = 3 + 4 + (*z).BlockHeader.Round.Msgsize() + 5 + (*z).BlockHeader.Branch.Msgsize() + 5 + (*z).BlockHeader.Seed.Msgsize() + 4 + (*z).BlockHeader.TxnRoot.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).BlockHeader.GenesisID) + 3 + (*z).BlockHeader.GenesisHash.Msgsize() + 5 + (*z).BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).BlockHeader.Round.Msgsize() + 5 + (*z).BlockHeader.Branch.Msgsize() + 5 + (*z).BlockHeader.Seed.Msgsize() + 7 + (*z).BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).BlockHeader.GenesisID) + 3 + (*z).BlockHeader.GenesisHash.Msgsize() + 5 + (*z).BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).BlockHeader.CompactCert { _ = zb0001 @@ -873,7 +904,7 @@ func (z *Block) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *Block) MsgIsZero() bool { - return ((*z).BlockHeader.Round.MsgIsZero()) && ((*z).BlockHeader.Branch.MsgIsZero()) && ((*z).BlockHeader.Seed.MsgIsZero()) && ((*z).BlockHeader.TxnRoot.MsgIsZero()) && ((*z).BlockHeader.TimeStamp == 0) && ((*z).BlockHeader.GenesisID == "") && ((*z).BlockHeader.GenesisHash.MsgIsZero()) && ((*z).BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).BlockHeader.RewardsState.RewardsRate == 0) && ((*z).BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).BlockHeader.TxnCounter == 0) && (len((*z).BlockHeader.CompactCert) == 0) && (len((*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Payset.MsgIsZero()) + return ((*z).BlockHeader.Round.MsgIsZero()) && ((*z).BlockHeader.Branch.MsgIsZero()) && ((*z).BlockHeader.Seed.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).BlockHeader.TimeStamp == 0) && ((*z).BlockHeader.GenesisID == "") && ((*z).BlockHeader.GenesisHash.MsgIsZero()) && ((*z).BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).BlockHeader.RewardsState.RewardsRate == 0) && ((*z).BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).BlockHeader.TxnCounter == 0) && (len((*z).BlockHeader.CompactCert) == 0) && (len((*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Payset.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -908,108 +939,112 @@ func (z *BlockHash) MsgIsZero() bool { func (z *BlockHeader) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0004Len := uint32(24) - var zb0004Mask uint32 /* 28 bits */ + zb0004Len := uint32(25) + var zb0004Mask uint32 /* 30 bits */ if len((*z).CompactCert) == 0 { zb0004Len-- - zb0004Mask |= 0x10 + zb0004Mask |= 0x20 } if (*z).RewardsState.RewardsLevel == 0 { zb0004Len-- - zb0004Mask |= 0x20 + zb0004Mask |= 0x40 } if (*z).RewardsState.FeeSink.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40 + zb0004Mask |= 0x80 } if (*z).RewardsState.RewardsResidue == 0 { zb0004Len-- - zb0004Mask |= 0x80 + zb0004Mask |= 0x100 } if (*z).GenesisID == "" { zb0004Len-- - zb0004Mask |= 0x100 + zb0004Mask |= 0x200 } if (*z).GenesisHash.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200 + zb0004Mask |= 0x400 } if (*z).UpgradeState.NextProtocolVoteBefore.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x400 + zb0004Mask |= 0x800 } if (*z).UpgradeState.NextProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x800 + zb0004Mask |= 0x1000 } if (*z).UpgradeState.NextProtocolSwitchOn.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000 + zb0004Mask |= 0x2000 } if (*z).UpgradeState.NextProtocolApprovals == 0 { zb0004Len-- - zb0004Mask |= 0x2000 + zb0004Mask |= 0x4000 } if len((*z).ParticipationUpdates.ExpiredParticipationAccounts) == 0 { zb0004Len-- - zb0004Mask |= 0x4000 + zb0004Mask |= 0x8000 } if (*z).Branch.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x8000 + zb0004Mask |= 0x10000 } if (*z).UpgradeState.CurrentProtocol.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x10000 + zb0004Mask |= 0x20000 } if (*z).RewardsState.RewardsRate == 0 { zb0004Len-- - zb0004Mask |= 0x20000 + zb0004Mask |= 0x40000 } if (*z).Round.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x40000 + zb0004Mask |= 0x80000 } if (*z).RewardsState.RewardsRecalculationRound.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x80000 + zb0004Mask |= 0x100000 } if (*z).RewardsState.RewardsPool.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x100000 + zb0004Mask |= 0x200000 } if (*z).Seed.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x200000 + zb0004Mask |= 0x400000 } if (*z).TxnCounter == 0 { zb0004Len-- - zb0004Mask |= 0x400000 + zb0004Mask |= 0x800000 } if (*z).TimeStamp == 0 { zb0004Len-- - zb0004Mask |= 0x800000 + zb0004Mask |= 0x1000000 } - if (*z).TxnRoot.MsgIsZero() { + if (*z).TxnCommitments.NativeSha512_256Commitment.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x1000000 + zb0004Mask |= 0x2000000 + } + if (*z).TxnCommitments.Sha256Commitment.MsgIsZero() { + zb0004Len-- + zb0004Mask |= 0x4000000 } if (*z).UpgradeVote.UpgradeDelay.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x2000000 + zb0004Mask |= 0x8000000 } if (*z).UpgradeVote.UpgradePropose.MsgIsZero() { zb0004Len-- - zb0004Mask |= 0x4000000 + zb0004Mask |= 0x10000000 } if (*z).UpgradeVote.UpgradeApprove == false { zb0004Len-- - zb0004Mask |= 0x8000000 + zb0004Mask |= 0x20000000 } // variable map header, size zb0004Len o = msgp.AppendMapHeader(o, zb0004Len) if zb0004Len != 0 { - if (zb0004Mask & 0x10) == 0 { // if not empty + if (zb0004Mask & 0x20) == 0 { // if not empty // string "cc" o = append(o, 0xa2, 0x63, 0x63) if (*z).CompactCert == nil { @@ -1029,52 +1064,52 @@ func (z *BlockHeader) MarshalMsg(b []byte) (o []byte) { o = zb0002.MarshalMsg(o) } } - if (zb0004Mask & 0x20) == 0 { // if not empty + if (zb0004Mask & 0x40) == 0 { // if not empty // string "earn" o = append(o, 0xa4, 0x65, 0x61, 0x72, 0x6e) o = msgp.AppendUint64(o, (*z).RewardsState.RewardsLevel) } - if (zb0004Mask & 0x40) == 0 { // if not empty + if (zb0004Mask & 0x80) == 0 { // if not empty // string "fees" o = append(o, 0xa4, 0x66, 0x65, 0x65, 0x73) o = (*z).RewardsState.FeeSink.MarshalMsg(o) } - if (zb0004Mask & 0x80) == 0 { // if not empty + if (zb0004Mask & 0x100) == 0 { // if not empty // string "frac" o = append(o, 0xa4, 0x66, 0x72, 0x61, 0x63) o = msgp.AppendUint64(o, (*z).RewardsState.RewardsResidue) } - if (zb0004Mask & 0x100) == 0 { // if not empty + if (zb0004Mask & 0x200) == 0 { // if not empty // string "gen" o = append(o, 0xa3, 0x67, 0x65, 0x6e) o = msgp.AppendString(o, (*z).GenesisID) } - if (zb0004Mask & 0x200) == 0 { // if not empty + if (zb0004Mask & 0x400) == 0 { // if not empty // string "gh" o = append(o, 0xa2, 0x67, 0x68) o = (*z).GenesisHash.MarshalMsg(o) } - if (zb0004Mask & 0x400) == 0 { // if not empty + if (zb0004Mask & 0x800) == 0 { // if not empty // string "nextbefore" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65) o = (*z).UpgradeState.NextProtocolVoteBefore.MarshalMsg(o) } - if (zb0004Mask & 0x800) == 0 { // if not empty + if (zb0004Mask & 0x1000) == 0 { // if not empty // string "nextproto" o = append(o, 0xa9, 0x6e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).UpgradeState.NextProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x1000) == 0 { // if not empty + if (zb0004Mask & 0x2000) == 0 { // if not empty // string "nextswitch" o = append(o, 0xaa, 0x6e, 0x65, 0x78, 0x74, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68) o = (*z).UpgradeState.NextProtocolSwitchOn.MarshalMsg(o) } - if (zb0004Mask & 0x2000) == 0 { // if not empty + if (zb0004Mask & 0x4000) == 0 { // if not empty // string "nextyes" o = append(o, 0xa7, 0x6e, 0x65, 0x78, 0x74, 0x79, 0x65, 0x73) o = msgp.AppendUint64(o, (*z).UpgradeState.NextProtocolApprovals) } - if (zb0004Mask & 0x4000) == 0 { // if not empty + if (zb0004Mask & 0x8000) == 0 { // if not empty // string "partupdrmv" o = append(o, 0xaa, 0x70, 0x61, 0x72, 0x74, 0x75, 0x70, 0x64, 0x72, 0x6d, 0x76) if (*z).ParticipationUpdates.ExpiredParticipationAccounts == nil { @@ -1086,67 +1121,72 @@ func (z *BlockHeader) MarshalMsg(b []byte) (o []byte) { o = (*z).ParticipationUpdates.ExpiredParticipationAccounts[zb0003].MarshalMsg(o) } } - if (zb0004Mask & 0x8000) == 0 { // if not empty + if (zb0004Mask & 0x10000) == 0 { // if not empty // string "prev" o = append(o, 0xa4, 0x70, 0x72, 0x65, 0x76) o = (*z).Branch.MarshalMsg(o) } - if (zb0004Mask & 0x10000) == 0 { // if not empty + if (zb0004Mask & 0x20000) == 0 { // if not empty // string "proto" o = append(o, 0xa5, 0x70, 0x72, 0x6f, 0x74, 0x6f) o = (*z).UpgradeState.CurrentProtocol.MarshalMsg(o) } - if (zb0004Mask & 0x20000) == 0 { // if not empty + if (zb0004Mask & 0x40000) == 0 { // if not empty // string "rate" o = append(o, 0xa4, 0x72, 0x61, 0x74, 0x65) o = msgp.AppendUint64(o, (*z).RewardsState.RewardsRate) } - if (zb0004Mask & 0x40000) == 0 { // if not empty + if (zb0004Mask & 0x80000) == 0 { // if not empty // string "rnd" o = append(o, 0xa3, 0x72, 0x6e, 0x64) o = (*z).Round.MarshalMsg(o) } - if (zb0004Mask & 0x80000) == 0 { // if not empty + if (zb0004Mask & 0x100000) == 0 { // if not empty // string "rwcalr" o = append(o, 0xa6, 0x72, 0x77, 0x63, 0x61, 0x6c, 0x72) o = (*z).RewardsState.RewardsRecalculationRound.MarshalMsg(o) } - if (zb0004Mask & 0x100000) == 0 { // if not empty + if (zb0004Mask & 0x200000) == 0 { // if not empty // string "rwd" o = append(o, 0xa3, 0x72, 0x77, 0x64) o = (*z).RewardsState.RewardsPool.MarshalMsg(o) } - if (zb0004Mask & 0x200000) == 0 { // if not empty + if (zb0004Mask & 0x400000) == 0 { // if not empty // string "seed" o = append(o, 0xa4, 0x73, 0x65, 0x65, 0x64) o = (*z).Seed.MarshalMsg(o) } - if (zb0004Mask & 0x400000) == 0 { // if not empty + if (zb0004Mask & 0x800000) == 0 { // if not empty // string "tc" o = append(o, 0xa2, 0x74, 0x63) o = msgp.AppendUint64(o, (*z).TxnCounter) } - if (zb0004Mask & 0x800000) == 0 { // if not empty + if (zb0004Mask & 0x1000000) == 0 { // if not empty // string "ts" o = append(o, 0xa2, 0x74, 0x73) o = msgp.AppendInt64(o, (*z).TimeStamp) } - if (zb0004Mask & 0x1000000) == 0 { // if not empty + if (zb0004Mask & 0x2000000) == 0 { // if not empty // string "txn" o = append(o, 0xa3, 0x74, 0x78, 0x6e) - o = (*z).TxnRoot.MarshalMsg(o) + o = (*z).TxnCommitments.NativeSha512_256Commitment.MarshalMsg(o) } - if (zb0004Mask & 0x2000000) == 0 { // if not empty + if (zb0004Mask & 0x4000000) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).TxnCommitments.Sha256Commitment.MarshalMsg(o) + } + if (zb0004Mask & 0x8000000) == 0 { // if not empty // string "upgradedelay" o = append(o, 0xac, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x65, 0x6c, 0x61, 0x79) o = (*z).UpgradeVote.UpgradeDelay.MarshalMsg(o) } - if (zb0004Mask & 0x4000000) == 0 { // if not empty + if (zb0004Mask & 0x10000000) == 0 { // if not empty // string "upgradeprop" o = append(o, 0xab, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x70, 0x72, 0x6f, 0x70) o = (*z).UpgradeVote.UpgradePropose.MarshalMsg(o) } - if (zb0004Mask & 0x8000000) == 0 { // if not empty + if (zb0004Mask & 0x20000000) == 0 { // if not empty // string "upgradeyes" o = append(o, 0xaa, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x79, 0x65, 0x73) o = msgp.AppendBool(o, (*z).UpgradeVote.UpgradeApprove) @@ -1199,9 +1239,17 @@ func (z *BlockHeader) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0004 > 0 { + zb0004-- + bts, err = (*z).TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "TxnRoot") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } @@ -1455,10 +1503,16 @@ func (z *BlockHeader) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } + case "txn256": + bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "txn": - bts, err = (*z).TxnRoot.UnmarshalMsg(bts) + bts, err = (*z).TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "TxnRoot") + err = msgp.WrapError(err, "NativeSha512_256Commitment") return } case "ts": @@ -1650,7 +1704,7 @@ func (_ *BlockHeader) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *BlockHeader) Msgsize() (s int) { - s = 3 + 4 + (*z).Round.Msgsize() + 5 + (*z).Branch.Msgsize() + 5 + (*z).Seed.Msgsize() + 4 + (*z).TxnRoot.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 5 + (*z).RewardsState.FeeSink.Msgsize() + 4 + (*z).RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).Round.Msgsize() + 5 + (*z).Branch.Msgsize() + 5 + (*z).Seed.Msgsize() + 7 + (*z).TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 5 + (*z).RewardsState.FeeSink.Msgsize() + 4 + (*z).RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).CompactCert != nil { for zb0001, zb0002 := range (*z).CompactCert { _ = zb0001 @@ -1667,7 +1721,7 @@ func (z *BlockHeader) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *BlockHeader) MsgIsZero() bool { - return ((*z).Round.MsgIsZero()) && ((*z).Branch.MsgIsZero()) && ((*z).Seed.MsgIsZero()) && ((*z).TxnRoot.MsgIsZero()) && ((*z).TimeStamp == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).RewardsState.FeeSink.MsgIsZero()) && ((*z).RewardsState.RewardsPool.MsgIsZero()) && ((*z).RewardsState.RewardsLevel == 0) && ((*z).RewardsState.RewardsRate == 0) && ((*z).RewardsState.RewardsResidue == 0) && ((*z).RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocolApprovals == 0) && ((*z).UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).UpgradeVote.UpgradeApprove == false) && ((*z).TxnCounter == 0) && (len((*z).CompactCert) == 0) && (len((*z).ParticipationUpdates.ExpiredParticipationAccounts) == 0) + return ((*z).Round.MsgIsZero()) && ((*z).Branch.MsgIsZero()) && ((*z).Seed.MsgIsZero()) && ((*z).TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).TimeStamp == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).RewardsState.FeeSink.MsgIsZero()) && ((*z).RewardsState.RewardsPool.MsgIsZero()) && ((*z).RewardsState.RewardsLevel == 0) && ((*z).RewardsState.RewardsRate == 0) && ((*z).RewardsState.RewardsResidue == 0) && ((*z).RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocolApprovals == 0) && ((*z).UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).UpgradeVote.UpgradeApprove == false) && ((*z).TxnCounter == 0) && (len((*z).CompactCert) == 0) && (len((*z).ParticipationUpdates.ExpiredParticipationAccounts) == 0) } // MarshalMsg implements msgp.Marshaler @@ -2672,6 +2726,135 @@ func (z *RewardsState) MsgIsZero() bool { return ((*z).FeeSink.MsgIsZero()) && ((*z).RewardsPool.MsgIsZero()) && ((*z).RewardsLevel == 0) && ((*z).RewardsRate == 0) && ((*z).RewardsResidue == 0) && ((*z).RewardsRecalculationRound.MsgIsZero()) } +// MarshalMsg implements msgp.Marshaler +func (z *TxnCommitments) MarshalMsg(b []byte) (o []byte) { + o = msgp.Require(b, z.Msgsize()) + // omitempty: check for empty values + zb0001Len := uint32(2) + var zb0001Mask uint8 /* 3 bits */ + if (*z).NativeSha512_256Commitment.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x2 + } + if (*z).Sha256Commitment.MsgIsZero() { + zb0001Len-- + zb0001Mask |= 0x4 + } + // variable map header, size zb0001Len + o = append(o, 0x80|uint8(zb0001Len)) + if zb0001Len != 0 { + if (zb0001Mask & 0x2) == 0 { // if not empty + // string "txn" + o = append(o, 0xa3, 0x74, 0x78, 0x6e) + o = (*z).NativeSha512_256Commitment.MarshalMsg(o) + } + if (zb0001Mask & 0x4) == 0 { // if not empty + // string "txn256" + o = append(o, 0xa6, 0x74, 0x78, 0x6e, 0x32, 0x35, 0x36) + o = (*z).Sha256Commitment.MarshalMsg(o) + } + } + return +} + +func (_ *TxnCommitments) CanMarshalMsg(z interface{}) bool { + _, ok := (z).(*TxnCommitments) + return ok +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *TxnCommitments) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 int + var zb0002 bool + zb0001, zb0002, bts, err = msgp.ReadMapHeaderBytes(bts) + if _, ok := err.(msgp.TypeError); ok { + zb0001, zb0002, bts, err = msgp.ReadArrayHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + return + } + } + if zb0001 > 0 { + zb0001-- + bts, err = (*z).NativeSha512_256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + return + } + } + if zb0001 > 0 { + err = msgp.ErrTooManyArrayFields(zb0001) + if err != nil { + err = msgp.WrapError(err, "struct-from-array") + return + } + } + } else { + if err != nil { + err = msgp.WrapError(err) + return + } + if zb0002 { + (*z) = TxnCommitments{} + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch string(field) { + case "txn256": + bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } + case "txn": + bts, err = (*z).NativeSha512_256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "NativeSha512_256Commitment") + return + } + default: + err = msgp.ErrNoField(string(field)) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + } + o = bts + return +} + +func (_ *TxnCommitments) CanUnmarshalMsg(z interface{}) bool { + _, ok := (z).(*TxnCommitments) + return ok +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *TxnCommitments) Msgsize() (s int) { + s = 1 + 7 + (*z).Sha256Commitment.Msgsize() + 4 + (*z).NativeSha512_256Commitment.Msgsize() + return +} + +// MsgIsZero returns whether this is a zero value +func (z *TxnCommitments) MsgIsZero() bool { + return ((*z).Sha256Commitment.MsgIsZero()) && ((*z).NativeSha512_256Commitment.MsgIsZero()) +} + // MarshalMsg implements msgp.Marshaler func (z *UpgradeVote) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) diff --git a/data/bookkeeping/msgp_gen_test.go b/data/bookkeeping/msgp_gen_test.go index 2315516af8..da143fa56f 100644 --- a/data/bookkeeping/msgp_gen_test.go +++ b/data/bookkeeping/msgp_gen_test.go @@ -433,6 +433,66 @@ func BenchmarkUnmarshalRewardsState(b *testing.B) { } } +func TestMarshalUnmarshalTxnCommitments(t *testing.T) { + partitiontest.PartitionTest(t) + v := TxnCommitments{} + bts := v.MarshalMsg(nil) + left, err := v.UnmarshalMsg(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after UnmarshalMsg(): %q", len(left), left) + } + + left, err = msgp.Skip(bts) + if err != nil { + t.Fatal(err) + } + if len(left) > 0 { + t.Errorf("%d bytes left over after Skip(): %q", len(left), left) + } +} + +func TestRandomizedEncodingTxnCommitments(t *testing.T) { + protocol.RunEncodingTest(t, &TxnCommitments{}) +} + +func BenchmarkMarshalMsgTxnCommitments(b *testing.B) { + v := TxnCommitments{} + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + v.MarshalMsg(nil) + } +} + +func BenchmarkAppendMsgTxnCommitments(b *testing.B) { + v := TxnCommitments{} + bts := make([]byte, 0, v.Msgsize()) + bts = v.MarshalMsg(bts[0:0]) + b.SetBytes(int64(len(bts))) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + bts = v.MarshalMsg(bts[0:0]) + } +} + +func BenchmarkUnmarshalTxnCommitments(b *testing.B) { + v := TxnCommitments{} + bts := v.MarshalMsg(nil) + b.ReportAllocs() + b.SetBytes(int64(len(bts))) + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := v.UnmarshalMsg(bts) + if err != nil { + b.Fatal(err) + } + } +} + func TestMarshalUnmarshalUpgradeVote(t *testing.T) { partitiontest.PartitionTest(t) v := UpgradeVote{} diff --git a/data/bookkeeping/txn_merkle.go b/data/bookkeeping/txn_merkle.go index 9a806708e3..cfaf95ad8d 100644 --- a/data/bookkeeping/txn_merkle.go +++ b/data/bookkeeping/txn_merkle.go @@ -31,13 +31,23 @@ import ( // header), or to generate proofs of membership for transactions that are // in this block. func (block Block) TxnMerkleTree() (*merklearray.Tree, error) { - return merklearray.Build(&txnMerkleArray{block: block}, crypto.HashFactory{HashType: crypto.Sha512_256}) + return merklearray.Build(&txnMerkleArray{block: block, hashType: crypto.Sha512_256}, crypto.HashFactory{HashType: crypto.Sha512_256}) +} + +// TxnMerkleTreeSHA256 returns a cryptographic commitment to the transactions in the +// block, along with their ApplyData, as a Merkle tree vector commitment, using SHA256. This allows the +// caller to either extract the root hash (for inclusion in the block +// header), or to generate proofs of membership for transactions that are +// in this block. +func (block Block) TxnMerkleTreeSHA256() (*merklearray.Tree, error) { + return merklearray.BuildVectorCommitmentTree(&txnMerkleArray{block: block, hashType: crypto.Sha256}, crypto.HashFactory{HashType: crypto.Sha256}) } // txnMerkleArray is a representation of the transactions in this block, // along with their ApplyData, as an array for the merklearray package. type txnMerkleArray struct { - block Block + block Block + hashType crypto.HashType } // Length implements the merklearray.Array interface. @@ -52,6 +62,7 @@ func (tma *txnMerkleArray) Marshal(pos uint64) (crypto.Hashable, error) { } var elem txnMerkleElem + elem.hashType = tma.hashType elem.stib = tma.block.Payset[pos] stxn, _, err := tma.block.DecodeSignedTxn(elem.stib) @@ -63,13 +74,6 @@ func (tma *txnMerkleArray) Marshal(pos uint64) (crypto.Hashable, error) { return &elem, nil } -// txnMerkleElem represents a leaf in the Merkle tree of all transactions -// in a block. -type txnMerkleElem struct { - txn transactions.Transaction - stib transactions.SignedTxnInBlock -} - func txnMerkleToRaw(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) (buf []byte) { buf = make([]byte, 2*crypto.DigestSize) copy(buf[:], txid[:]) @@ -77,14 +81,27 @@ func txnMerkleToRaw(txid [crypto.DigestSize]byte, stib [crypto.DigestSize]byte) return } +// txnMerkleElem represents a leaf in the Merkle tree of all transactions +// in a block. +type txnMerkleElem struct { + txn transactions.Transaction + stib transactions.SignedTxnInBlock + hashType crypto.HashType +} + +func (tme *txnMerkleElem) RawLeaf() []byte { + if tme.hashType == crypto.Sha512_256 { + return txnMerkleToRaw(tme.txn.ID(), tme.stib.Hash()) + } + // else: hashType == crypto.Sha256 + return txnMerkleToRaw(tme.txn.IDSha256(), tme.stib.HashSHA256()) +} + // ToBeHashed implements the crypto.Hashable interface. func (tme *txnMerkleElem) ToBeHashed() (protocol.HashID, []byte) { // The leaf contains two hashes: the transaction ID (hash of the // transaction itself), and the hash of the entire SignedTxnInBlock. - txid := tme.txn.ID() - stib := tme.stib.Hash() - - return protocol.TxnMerkleLeaf, txnMerkleToRaw(txid, stib) + return protocol.TxnMerkleLeaf, tme.RawLeaf() } // Hash implements an optimized version of crypto.HashObj(tme). @@ -93,12 +110,9 @@ func (tme *txnMerkleElem) Hash() crypto.Digest { } func (tme *txnMerkleElem) HashRepresentation() []byte { - txid := tme.txn.ID() - stib := tme.stib.Hash() - var buf [len(protocol.TxnMerkleLeaf) + 2*crypto.DigestSize]byte s := buf[:0] s = append(s, protocol.TxnMerkleLeaf...) - s = append(s, txnMerkleToRaw(txid, stib)...) + s = append(s, tme.RawLeaf()...) return s } diff --git a/data/bookkeeping/txn_merkle_test.go b/data/bookkeeping/txn_merkle_test.go index 2dabd07bd0..977af620d5 100644 --- a/data/bookkeeping/txn_merkle_test.go +++ b/data/bookkeeping/txn_merkle_test.go @@ -68,6 +68,7 @@ func TestTxnMerkle(t *testing.T) { b.Payset = append(b.Payset, stib) var e txnMerkleElem + e.hashType = crypto.Sha512_256 e.txn = txn e.stib = stib elems = append(elems, e) @@ -88,6 +89,57 @@ func TestTxnMerkle(t *testing.T) { } } +func TestBlock_TxnMerkleTreeSHA256(t *testing.T) { + partitiontest.PartitionTest(t) + + for ntxn := uint64(0); ntxn < 128; ntxn++ { + var b Block + b.CurrentProtocol = protocol.ConsensusFuture + crypto.RandBytes(b.BlockHeader.GenesisHash[:]) + + var elems []txnMerkleElem + + for i := uint64(0); i < ntxn; i++ { + txn := transactions.Transaction{ + Type: protocol.PaymentTx, + Header: transactions.Header{ + GenesisHash: b.BlockHeader.GenesisHash, + }, + PaymentTxnFields: transactions.PaymentTxnFields{ + Amount: basics.MicroAlgos{Raw: i}, + }, + } + + sigtxn := transactions.SignedTxn{Txn: txn} + ad := transactions.ApplyData{} + + stib, err := b.BlockHeader.EncodeSignedTxn(sigtxn, ad) + require.NoError(t, err) + + b.Payset = append(b.Payset, stib) + + var e txnMerkleElem + e.hashType = crypto.Sha256 + e.txn = txn + e.stib = stib + elems = append(elems, e) + } + + tree, err := b.TxnMerkleTreeSHA256() + require.NoError(t, err) + + root := tree.Root() + for i := uint64(0); i < ntxn; i++ { + proof, err := tree.Prove([]uint64{i}) + require.NoError(t, err) + elemVerif := make(map[uint64]crypto.Hashable) + elemVerif[i] = &elems[i] + err = merklearray.VerifyVectorCommitment(root, elemVerif, proof) + require.NoError(t, err) + } + } +} + func BenchmarkTxnRoots(b *testing.B) { var blk Block blk.CurrentProtocol = protocol.ConsensusCurrentVersion diff --git a/data/ledger_test.go b/data/ledger_test.go index 6af896e976..934fb4b6da 100644 --- a/data/ledger_test.go +++ b/data/ledger_test.go @@ -103,7 +103,7 @@ func testGenerateInitState(tb testing.TB, proto protocol.ConsensusVersion) (gene }, } var err error - initBlock.TxnRoot, err = initBlock.PaysetCommit() + initBlock.TxnCommitments, err = initBlock.PaysetCommit() require.NoError(tb, err) if params.SupportGenesisHash { initBlock.BlockHeader.GenesisHash = crypto.Hash([]byte(tb.Name())) @@ -658,7 +658,7 @@ func getEmptyBlock(afterRound basics.Round, l *ledger.Ledger, genesisID string, blk.FeeSink = testSinkAddr blk.CurrentProtocol = lastBlock.CurrentProtocol - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() if err != nil { return } diff --git a/data/pools/transactionPool_test.go b/data/pools/transactionPool_test.go index a16a7d30fa..2f1bd75b6c 100644 --- a/data/pools/transactionPool_test.go +++ b/data/pools/transactionPool_test.go @@ -80,7 +80,7 @@ func mockLedger(t TestingT, initAccounts map[basics.Address]basics.AccountData, } var err error - initBlock.TxnRoot, err = initBlock.PaysetCommit() + initBlock.TxnCommitments, err = initBlock.PaysetCommit() require.NoError(t, err) fn := fmt.Sprintf("/tmp/%s.%d.sqlite3", t.Name(), crypto.RandUint64()) diff --git a/data/transactions/signedtxn.go b/data/transactions/signedtxn.go index 8f4f55ba46..08ce6fad95 100644 --- a/data/transactions/signedtxn.go +++ b/data/transactions/signedtxn.go @@ -17,6 +17,7 @@ package transactions import ( + "crypto/sha256" "errors" "github.com/algorand/go-algorand/crypto" @@ -117,9 +118,18 @@ func (s *SignedTxnInBlock) ToBeHashed() (protocol.HashID, []byte) { func (s *SignedTxnInBlock) Hash() crypto.Digest { enc := s.MarshalMsg(append(protocol.GetEncodingBuf(), []byte(protocol.SignedTxnInBlock)...)) defer protocol.PutEncodingBuf(enc) + return crypto.Hash(enc) } +// HashSHA256 implements an optimized version of crypto.HashObj(s) using SHA256 instead of the default SHA512_256. +func (s *SignedTxnInBlock) HashSHA256() crypto.Digest { + enc := s.MarshalMsg(append(protocol.GetEncodingBuf(), []byte(protocol.SignedTxnInBlock)...)) + defer protocol.PutEncodingBuf(enc) + + return sha256.Sum256(enc) +} + // WrapSignedTxnsWithAD takes an array SignedTxn and returns the same as SignedTxnWithAD // Each txn's ApplyData is the default empty state. func WrapSignedTxnsWithAD(txgroup []SignedTxn) []SignedTxnWithAD { diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index a2c1de3694..2adc6c3887 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -17,6 +17,7 @@ package transactions import ( + "crypto/sha256" "encoding/binary" "errors" "fmt" @@ -181,6 +182,13 @@ func (tx Transaction) ID() Txid { return Txid(crypto.Hash(enc)) } +// IDSha256 returns the digest (i.e., hash) of the transaction. +func (tx Transaction) IDSha256() crypto.Digest { + enc := tx.MarshalMsg(append(protocol.GetEncodingBuf(), []byte(protocol.Transaction)...)) + defer protocol.PutEncodingBuf(enc) + return sha256.Sum256(enc) +} + // InnerID returns something akin to Txid, but folds in the parent Txid and the // index of the inner call. func (tx Transaction) InnerID(parent Txid, index int) Txid { diff --git a/ledger/applications_test.go b/ledger/applications_test.go index 364d9a9d51..d96a9a659c 100644 --- a/ledger/applications_test.go +++ b/ledger/applications_test.go @@ -585,7 +585,7 @@ return` a.NoError(err) blk.TxnCounter = blk.TxnCounter + 2 blk.Payset = append(blk.Payset, txib1, txib2) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() a.NoError(err) err = l.appendUnvalidated(blk) a.NoError(err) @@ -730,7 +730,7 @@ return` a.NoError(err) blk.TxnCounter = blk.TxnCounter + 2 blk.Payset = append(blk.Payset, txib1, txib2) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() a.NoError(err) err = l.appendUnvalidated(blk) a.NoError(err) @@ -867,7 +867,7 @@ return` a.NoError(err) blk.TxnCounter = blk.TxnCounter + 2 blk.Payset = append(blk.Payset, txib1, txib2) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() a.NoError(err) err = l.appendUnvalidated(blk) a.NoError(err) diff --git a/ledger/internal/eval.go b/ledger/internal/eval.go index 20206239f5..c964ec46c6 100644 --- a/ledger/internal/eval.go +++ b/ledger/internal/eval.go @@ -1230,7 +1230,7 @@ func (eval *BlockEvaluator) TestingTxnCounter() uint64 { func (eval *BlockEvaluator) endOfBlock() error { if eval.generate { var err error - eval.block.TxnRoot, err = eval.block.PaysetCommit() + eval.block.TxnCommitments, err = eval.block.PaysetCommit() if err != nil { return err } @@ -1275,8 +1275,8 @@ func (eval *BlockEvaluator) endOfBlock() error { if err != nil { return err } - if txnRoot != eval.block.TxnRoot { - return fmt.Errorf("txn root wrong: %v != %v", txnRoot, eval.block.TxnRoot) + if txnRoot != eval.block.TxnCommitments { + return fmt.Errorf("txn root wrong: %v != %v", txnRoot, eval.block.TxnCommitments) } var expectedTxnCount uint64 diff --git a/ledger/ledger_test.go b/ledger/ledger_test.go index b48be3676f..53e475980c 100644 --- a/ledger/ledger_test.go +++ b/ledger/ledger_test.go @@ -129,7 +129,7 @@ func makeNewEmptyBlock(t *testing.T, l *Ledger, GenesisID string, initAccounts m // UpgradeVote: empty, } - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) if proto.SupportGenesisHash { @@ -155,7 +155,7 @@ func (l *Ledger) appendUnvalidatedSignedTx(t *testing.T, initAccounts map[basics blk.TxnCounter = blk.TxnCounter + 1 } blk.Payset = append(blk.Payset, txib) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) return l.appendUnvalidated(blk) } @@ -174,7 +174,7 @@ func (l *Ledger) addBlockTxns(t *testing.T, accounts map[basics.Address]basics.A blk.Payset = append(blk.Payset, txib) } var err error - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) return l.AddBlock(blk, agreement.Certificate{}) } @@ -231,7 +231,7 @@ func TestLedgerBlockHeaders(t *testing.T) { emptyBlock := bookkeeping.Block{ BlockHeader: correctHeader, } - correctHeader.TxnRoot, err = emptyBlock.PaysetCommit() + correctHeader.TxnCommitments, err = emptyBlock.PaysetCommit() require.NoError(t, err) correctHeader.RewardsPool = testPoolAddr @@ -324,11 +324,11 @@ func TestLedgerBlockHeaders(t *testing.T) { // TODO test rewards cases with changing poolAddr money, with changing round, and with changing total reward units badBlock = bookkeeping.Block{BlockHeader: correctHeader} - badBlock.BlockHeader.TxnRoot = crypto.Hash([]byte{0}) + badBlock.BlockHeader.TxnCommitments.NativeSha512_256Commitment = crypto.Hash([]byte{0}) a.Error(l.appendUnvalidated(badBlock), "added block header with empty transaction root") badBlock = bookkeeping.Block{BlockHeader: correctHeader} - badBlock.BlockHeader.TxnRoot[0]++ + badBlock.BlockHeader.TxnCommitments.NativeSha512_256Commitment[0]++ a.Error(l.appendUnvalidated(badBlock), "added block header with invalid transaction root") correctBlock := bookkeeping.Block{BlockHeader: correctHeader} @@ -996,7 +996,7 @@ int 1 // [1] a.NoError(err) blk.TxnCounter = blk.TxnCounter + 2 blk.Payset = append(blk.Payset, txib1, txib2) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() a.NoError(err) err = l.appendUnvalidated(blk) a.NoError(err) @@ -1245,7 +1245,7 @@ func testLedgerSingleTxApplyData(t *testing.T, version protocol.ConsensusVersion initNextBlockHeader(&correctHeader, lastBlock, proto) correctBlock := bookkeeping.Block{BlockHeader: correctHeader} - correctBlock.TxnRoot, err = correctBlock.PaysetCommit() + correctBlock.TxnCommitments, err = correctBlock.PaysetCommit() a.NoError(err) a.NoError(l.appendUnvalidated(correctBlock), "could not add block with correct header") diff --git a/ledger/perf_test.go b/ledger/perf_test.go index 53cc2cb494..50c407c676 100644 --- a/ledger/perf_test.go +++ b/ledger/perf_test.go @@ -141,7 +141,7 @@ func BenchmarkValidate(b *testing.B) { newblk.Payset = append(newblk.Payset, txib) } - newblk.BlockHeader.TxnRoot, err = newblk.PaysetCommit() + newblk.BlockHeader.TxnCommitments, err = newblk.PaysetCommit() require.NoError(b, err) b.StartTimer() diff --git a/ledger/testing/initState.go b/ledger/testing/initState.go index 29b9767dc5..883517a5e6 100644 --- a/ledger/testing/initState.go +++ b/ledger/testing/initState.go @@ -96,7 +96,7 @@ func GenerateInitState(tb testing.TB, proto protocol.ConsensusVersion, baseAlgoP } var err error - initBlock.TxnRoot, err = initBlock.PaysetCommit() + initBlock.TxnCommitments, err = initBlock.PaysetCommit() require.NoError(tb, err) if params.SupportGenesisHash { diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go index 2fa488ec98..f766363f2d 100644 --- a/libgoal/libgoal.go +++ b/libgoal/libgoal.go @@ -1185,10 +1185,10 @@ func (c *Client) Dryrun(data []byte) (resp generatedV2.DryrunResponse, err error } // TxnProof returns a Merkle proof for a transaction in a block. -func (c *Client) TxnProof(txid string, round uint64) (resp generatedV2.ProofResponse, err error) { +func (c *Client) TxnProof(txid string, round uint64, hashType crypto.HashType) (resp generatedV2.ProofResponse, err error) { algod, err := c.ensureAlgodClient() if err == nil { - return algod.Proof(txid, round) + return algod.Proof(txid, round, hashType) } return } diff --git a/netdeploy/remote/deployedNetwork.go b/netdeploy/remote/deployedNetwork.go index 65021cd2cd..dcad2d3902 100644 --- a/netdeploy/remote/deployedNetwork.go +++ b/netdeploy/remote/deployedNetwork.go @@ -555,7 +555,7 @@ func createBlock(src basics.Address, prev bookkeeping.Block, roundTxnCnt uint64, payset = append(payset, txibs...) bootstrappedNet.txnCount += uint64(len(payset)) block.Payset = payset - block.TxnRoot, err = block.PaysetCommit() + block.TxnCommitments, err = block.PaysetCommit() if err != nil { return bookkeeping.Block{}, err } diff --git a/rpcs/blockService_test.go b/rpcs/blockService_test.go index e9c8791ae5..f05c0f6efb 100644 --- a/rpcs/blockService_test.go +++ b/rpcs/blockService_test.go @@ -363,7 +363,7 @@ func addBlock(t *testing.T, ledger *data.Ledger) { require.NoError(t, err) blk.BlockHeader.Round++ blk.BlockHeader.TimeStamp += int64(crypto.RandUint64() % 100 * 1000) - blk.TxnRoot, err = blk.PaysetCommit() + blk.TxnCommitments, err = blk.PaysetCommit() require.NoError(t, err) var cert agreement.Certificate diff --git a/test/e2e-go/features/transactions/proof_test.go b/test/e2e-go/features/transactions/proof_test.go index 118e725f74..9cbc151078 100644 --- a/test/e2e-go/features/transactions/proof_test.go +++ b/test/e2e-go/features/transactions/proof_test.go @@ -20,8 +20,10 @@ import ( "path/filepath" "testing" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/crypto/merklearray" + "github.com/algorand/go-algorand/daemon/algod/api/server/v2/generated" "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/framework/fixtures" "github.com/algorand/go-algorand/test/partitiontest" @@ -90,29 +92,35 @@ func TestTxnMerkleProof(t *testing.T) { a.NoError(err) txid := tx.ID() + txidSHA256 := tx.IDSha256() // only used for verification confirmedTx, err := fixture.WaitForConfirmedTxn(status.LastRound+10, baseAcct, txid.String()) a.NoError(err) - proofresp, err := client.TxnProof(txid.String(), confirmedTx.ConfirmedRound) + blk, err := client.BookkeepingBlock(confirmedTx.ConfirmedRound) + a.NoError(err) + + proofresp, err := client.TxnProof(txid.String(), confirmedTx.ConfirmedRound, crypto.Sha512_256) a.NoError(err) - hashtype, err := crypto.UnmarshalHashType(proofresp.Hashtype) + proofrespSHA256, err := client.TxnProof(txid.String(), confirmedTx.ConfirmedRound, crypto.Sha256) a.NoError(err) - var proof merklearray.Proof - proof.HashFactory = crypto.HashFactory{HashType: hashtype} - proof.TreeDepth = uint8(proofresp.Treedepth) - a.NotEqual(proof.TreeDepth, 0) - proofconcat := []byte(proofresp.Proof) - for len(proofconcat) > 0 { - var d crypto.Digest - copy(d[:], proofconcat) - proof.Path = append(proof.Path, d[:]) - proofconcat = proofconcat[len(d):] + generateProof := func(h crypto.HashType, prfRsp generated.ProofResponse) (p merklearray.Proof) { + p.HashFactory = crypto.HashFactory{HashType: h} + p.TreeDepth = uint8(prfRsp.Treedepth) + a.NotEqual(p.TreeDepth, 0) + proofconcat := prfRsp.Proof + for len(proofconcat) > 0 { + var d crypto.Digest + copy(d[:], proofconcat) + p.Path = append(p.Path, d[:]) + proofconcat = proofconcat[len(d):] + } + return } - blk, err := client.BookkeepingBlock(confirmedTx.ConfirmedRound) - a.NoError(err) + proof := generateProof(crypto.Sha512_256, proofresp) + proofSHA256 := generateProof(crypto.Sha256, proofrespSHA256) element := TxnMerkleElemRaw{Txn: crypto.Digest(txid)} copy(element.Stib[:], proofresp.Stibhash[:]) @@ -120,10 +128,78 @@ func TestTxnMerkleProof(t *testing.T) { elems := make(map[uint64]crypto.Hashable) elems[proofresp.Idx] = &element - err = merklearray.Verify(blk.TxnRoot.ToSlice(), elems, &proof) + err = merklearray.Verify(blk.TxnCommitments.NativeSha512_256Commitment.ToSlice(), elems, &proof) if err != nil { - t.Logf("blk.TxnRoot : %v \nproof path %v \ndepth: %d \nStibhash %v\nIndex: %d", blk.TxnRoot.ToSlice(), proof.Path, proof.TreeDepth, proofresp.Stibhash, proofresp.Idx) + t.Logf("blk.TxnCommitments : %v \nproof path %v \ndepth: %d \nStibhash %v\nIndex: %d", blk.TxnCommitments.NativeSha512_256Commitment.ToSlice(), proof.Path, proof.TreeDepth, proofresp.Stibhash, proofresp.Idx) + a.NoError(err) + } + + element = TxnMerkleElemRaw{Txn: crypto.Digest(txidSHA256)} + copy(element.Stib[:], proofrespSHA256.Stibhash[:]) + + elems = make(map[uint64]crypto.Hashable) + + elems[proofrespSHA256.Idx] = &element + err = merklearray.VerifyVectorCommitment(blk.TxnCommitments.Sha256Commitment.ToSlice(), elems, &proofSHA256) + if err != nil { + t.Logf("blk.TxnCommitments : %v \nproof path %v \ndepth: %d \nStibhash %v\nIndex: %d", blk.TxnCommitments.Sha256Commitment.ToSlice(), proofSHA256.Path, proofSHA256.TreeDepth, proofrespSHA256.Stibhash, proofrespSHA256.Idx) + a.NoError(err) + } +} + +// make sure transaction proof SHA256 does not exist in current consensus version (until we upgrade) +func TestTxnMerkleProofSHA256(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + t.Parallel() + a := require.New(fixtures.SynchronizedTest(t)) + + var fixture fixtures.RestClientFixture + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachV32.json")) + defer fixture.Shutdown() + client := fixture.LibGoalClient + + // We will create three new accounts, transfer some amount of money into + // the first account, and then transfer a smaller amount to the second + // account while closing out the rest into the third. + + accountList, err := fixture.GetWalletsSortedByBalance() + a.NoError(err) + baseAcct := accountList[0].Address + + walletHandle, err := client.GetUnencryptedWalletHandle() + a.NoError(err) + + acct0, err := client.GenerateAddress(walletHandle) + a.NoError(err) + + status, err := client.Status() + a.NoError(err) + + // Transfer some money to acct0, as well as other random accounts to + // fill up the Merkle tree with more than one element. + // we do not want to have a full tree in order the catch an empty element edge case + for i := 0; i < 5; i++ { + accti, err := client.GenerateAddress(walletHandle) + a.NoError(err) + + _, err = client.SendPaymentFromUnencryptedWallet(baseAcct, accti, 1000, 10000000, nil) a.NoError(err) } + tx, err := client.SendPaymentFromUnencryptedWallet(baseAcct, acct0, 1000, 10000000, nil) + a.NoError(err) + + txid := tx.ID() + confirmedTx, err := fixture.WaitForConfirmedTxn(status.LastRound+10, baseAcct, txid.String()) + a.NoError(err) + + blk, err := client.BookkeepingBlock(confirmedTx.ConfirmedRound) + a.NoError(err) + proto := config.Consensus[blk.CurrentProtocol] + a.False(proto.EnableSHA256TxnCommitmentHeader) + + a.NotEqual(crypto.Digest{}, blk.TxnCommitments.NativeSha512_256Commitment) + a.Equal(crypto.Digest{}, blk.TxnCommitments.Sha256Commitment) // should be empty since not yet supported } diff --git a/test/testdata/nettemplates/TwoNodes50EachV32.json b/test/testdata/nettemplates/TwoNodes50EachV32.json new file mode 100644 index 0000000000..3de4536d31 --- /dev/null +++ b/test/testdata/nettemplates/TwoNodes50EachV32.json @@ -0,0 +1,30 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "ConsensusProtocol": "https://github.com/algorandfoundation/specs/tree/d5ac876d7ede07367dbaa26e149aa42589aac1f7", + "LastPartKeyRound": 3000, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 50, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 50, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "Primary", + "IsRelay": true, + "Wallets": [{ "Name": "Wallet1", "ParticipationOnly": false }] + }, + { + "Name": "Node", + "Wallets": [{ "Name": "Wallet2", "ParticipationOnly": false }] + } + ] + } From c39914dc1e7e1932109c4489e07f38cb7dbcda3d Mon Sep 17 00:00:00 2001 From: John Lee Date: Wed, 11 May 2022 12:51:19 -0400 Subject: [PATCH 09/34] Bump version --- config/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/version.go b/config/version.go index c8dc1b4fe4..fb07796ecc 100644 --- a/config/version.go +++ b/config/version.go @@ -33,7 +33,7 @@ const VersionMajor = 3 // VersionMinor is the Minor semantic version number (x.#.z) - changed when backwards-compatible features are introduced. // Not enforced until after initial public release (x > 0). -const VersionMinor = 6 +const VersionMinor = 7 // Version is the type holding our full version information. type Version struct { From 69f1ec19dddc2d4de2812e7514095a04a19af81f Mon Sep 17 00:00:00 2001 From: algochoi <86622919+algochoi@users.noreply.github.com> Date: Fri, 13 May 2022 10:43:51 -0400 Subject: [PATCH 10/34] algod: Add a sourcemap flag for compile endpoint (#3938) --- daemon/algod/api/algod.oas2.json | 10 + daemon/algod/api/algod.oas3.yml | 20 + daemon/algod/api/server/v2/errors.go | 1 + .../api/server/v2/generated/private/routes.go | 234 +++++----- .../api/server/v2/generated/private/types.go | 3 + .../algod/api/server/v2/generated/routes.go | 414 +++++++++--------- daemon/algod/api/server/v2/generated/types.go | 10 + daemon/algod/api/server/v2/handlers.go | 36 +- .../algod/api/server/v2/test/handlers_test.go | 54 ++- 9 files changed, 450 insertions(+), 332 deletions(-) diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index d63573897c..5c1154e35e 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -1396,6 +1396,12 @@ "type": "string", "format": "binary" } + }, + { + "name": "sourcemap", + "description": "When set to `true`, returns the source map of the program as a JSON. Defaults to `false`.", + "in": "query", + "type": "boolean" } ], "responses": { @@ -3105,6 +3111,10 @@ "result": { "description": "base64 encoded program bytes", "type": "string" + }, + "sourcemap": { + "description": "JSON of the source map", + "type": "object" } } } diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 4228e6c636..2b75bd13be 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -380,6 +380,11 @@ "result": { "description": "base64 encoded program bytes", "type": "string" + }, + "sourcemap": { + "description": "JSON of the source map", + "properties": {}, + "type": "object" } }, "required": [ @@ -3646,6 +3651,16 @@ "post": { "description": "Given TEAL source code in plain text, return base64 encoded program bytes and base32 SHA512_256 hash of program bytes (Address style). This endpoint is only enabled when a node's configuration file sets EnableDeveloperAPI to true.", "operationId": "TealCompile", + "parameters": [ + { + "description": "When set to `true`, returns the source map of the program as a JSON. Defaults to `false`.", + "in": "query", + "name": "sourcemap", + "schema": { + "type": "boolean" + } + } + ], "requestBody": { "content": { "text/plain": { @@ -3671,6 +3686,11 @@ "result": { "description": "base64 encoded program bytes", "type": "string" + }, + "sourcemap": { + "description": "JSON of the source map", + "properties": {}, + "type": "object" } }, "required": [ diff --git a/daemon/algod/api/server/v2/errors.go b/daemon/algod/api/server/v2/errors.go index 1bdbb9a84c..9966728dc8 100644 --- a/daemon/algod/api/server/v2/errors.go +++ b/daemon/algod/api/server/v2/errors.go @@ -31,6 +31,7 @@ var ( errFailedToParseTransaction = "failed to parse transaction" errFailedToParseBlock = "failed to parse block" errFailedToParseCert = "failed to parse cert" + errFailedToParseSourcemap = "failed to parse sourcemap" errFailedToEncodeResponse = "failed to encode response" errInternalFailure = "internal failure" errNoTxnSpecified = "no transaction ID was specified" diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index 0ea7ae252c..abb34906f8 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -341,123 +341,123 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index b1695885ee..2a0c193e00 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -610,6 +610,9 @@ type CompileResponse struct { // base64 encoded program bytes Result string `json:"result"` + + // JSON of the source map + Sourcemap *map[string]interface{} `json:"sourcemap,omitempty"` } // DisassembleResponse defines model for DisassembleResponse. diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 2c23f41c4d..02c2ed7d8b 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -52,7 +52,7 @@ type ServerInterface interface { WaitForBlock(ctx echo.Context, round uint64) error // Compile TEAL source code to binary, produce its hash // (POST /v2/teal/compile) - TealCompile(ctx echo.Context) error + TealCompile(ctx echo.Context, params TealCompileParams) error // Disassemble program bytes into the TEAL source code. // (POST /v2/teal/disassemble) TealDisassemble(ctx echo.Context) error @@ -533,7 +533,8 @@ func (w *ServerInterfaceWrapper) WaitForBlock(ctx echo.Context) error { func (w *ServerInterfaceWrapper) TealCompile(ctx echo.Context) error { validQueryParams := map[string]bool{ - "pretty": true, + "pretty": true, + "sourcemap": true, } // Check for unknown query parameters. @@ -547,8 +548,20 @@ func (w *ServerInterfaceWrapper) TealCompile(ctx echo.Context) error { ctx.Set("api_key.Scopes", []string{""}) + // Parameter object where we will unmarshal all parameters from the context + var params TealCompileParams + // ------------- Optional query parameter "sourcemap" ------------- + if paramValue := ctx.QueryParam("sourcemap"); paramValue != "" { + + } + + err = runtime.BindQueryParameter("form", true, false, "sourcemap", ctx.QueryParams(), ¶ms.Sourcemap) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter sourcemap: %s", err)) + } + // Invoke the callback with all the unmarshalled arguments - err = w.Handler.TealCompile(ctx) + err = w.Handler.TealCompile(ctx, params) return err } @@ -775,203 +788,204 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "lJKdY/rg95f/LwAA///1Bvg7gBcBAA==", + "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index b6b189c91a..9372cc5650 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -610,6 +610,9 @@ type CompileResponse struct { // base64 encoded program bytes Result string `json:"result"` + + // JSON of the source map + Sourcemap *map[string]interface{} `json:"sourcemap,omitempty"` } // DisassembleResponse defines model for DisassembleResponse. @@ -824,6 +827,13 @@ type GetProofParams struct { Format *string `json:"format,omitempty"` } +// TealCompileParams defines parameters for TealCompile. +type TealCompileParams struct { + + // When set to `true`, returns the source map of the program as a JSON. Defaults to `false`. + Sourcemap *bool `json:"sourcemap,omitempty"` +} + // TealDryrunJSONBody defines parameters for TealDryrun. type TealDryrunJSONBody DryrunRequest diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index 581176be30..4e7a41b0fc 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -1157,16 +1157,29 @@ func (v2 *Handlers) AbortCatchup(ctx echo.Context, catchpoint string) error { return v2.abortCatchup(ctx, catchpoint) } +// CompileResponseWithSourceMap overrides the sourcemap field in +// the CompileResponse for JSON marshalling. +type CompileResponseWithSourceMap struct { + generated.CompileResponse + Sourcemap *logic.SourceMap `json:"sourcemap,omitempty"` +} + // TealCompile compiles TEAL code to binary, return both binary and hash // (POST /v2/teal/compile) -func (v2 *Handlers) TealCompile(ctx echo.Context) error { - // return early if teal compile is not allowed in node config +func (v2 *Handlers) TealCompile(ctx echo.Context, params generated.TealCompileParams) (err error) { + // Return early if teal compile is not allowed in node config. if !v2.Node.Config().EnableDeveloperAPI { return ctx.String(http.StatusNotFound, "/teal/compile was not enabled in the configuration file by setting the EnableDeveloperAPI to true") } + if params.Sourcemap == nil { + // Backwards compatibility: set sourcemap flag to default false value. + defaultValue := false + params.Sourcemap = &defaultValue + } + buf := new(bytes.Buffer) ctx.Request().Body = http.MaxBytesReader(nil, ctx.Request().Body, maxTealSourceBytes) - _, err := buf.ReadFrom(ctx.Request().Body) + _, err = buf.ReadFrom(ctx.Request().Body) if err != nil { return badRequest(ctx, err, err.Error(), v2.Log) } @@ -1179,9 +1192,20 @@ func (v2 *Handlers) TealCompile(ctx echo.Context) error { } pd := logic.HashProgram(ops.Program) addr := basics.Address(pd) - response := generated.CompileResponse{ - Hash: addr.String(), - Result: base64.StdEncoding.EncodeToString(ops.Program), + + // If source map flag is enabled, then return the map. + var sourcemap *logic.SourceMap + if *params.Sourcemap { + rawmap := logic.GetSourceMap([]string{}, ops.OffsetToLine) + sourcemap = &rawmap + } + + response := CompileResponseWithSourceMap{ + generated.CompileResponse{ + Hash: addr.String(), + Result: base64.StdEncoding.EncodeToString(ops.Program), + }, + sourcemap, } return ctx.JSON(http.StatusOK, response) } diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index c8a1e6fbc6..f569c9a50a 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -20,6 +20,7 @@ import ( "bytes" "encoding/json" "errors" + "fmt" "io" "net/http" "net/http/httptest" @@ -522,7 +523,10 @@ func TestAbortCatchup(t *testing.T) { abortCatchupTest(t, badCatchPoint, 400) } -func tealCompileTest(t *testing.T, bytesToUse []byte, expectedCode int, enableDeveloperAPI bool) { +func tealCompileTest(t *testing.T, bytesToUse []byte, expectedCode int, + enableDeveloperAPI bool, params generated.TealCompileParams, + expectedSourcemap *logic.SourceMap, +) (response v2.CompileResponseWithSourceMap) { numAccounts := 1 numTransactions := 1 offlineAccounts := true @@ -540,23 +544,55 @@ func tealCompileTest(t *testing.T, bytesToUse []byte, expectedCode int, enableDe req := httptest.NewRequest(http.MethodPost, "/", bytes.NewReader(bytesToUse)) rec := httptest.NewRecorder() c := e.NewContext(req, rec) - err := handler.TealCompile(c) + err := handler.TealCompile(c, params) require.NoError(t, err) require.Equal(t, expectedCode, rec.Code) + + // Check compiled response. + if rec.Code == 200 { + data := rec.Body.Bytes() + err = protocol.DecodeJSON(data, &response) + require.NoError(t, err, string(data)) + if expectedSourcemap != nil { + require.Equal(t, *expectedSourcemap, *response.Sourcemap) + } else { + require.Nil(t, response.Sourcemap) + } + } + return } func TestTealCompile(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() - tealCompileTest(t, nil, 200, true) // nil program should work - goodProgram := `int 1` + params := generated.TealCompileParams{} + tealCompileTest(t, nil, 200, true, params, nil) // nil program should work + + goodProgram := fmt.Sprintf(`#pragma version %d +int 1 +assert +int 1`, logic.AssemblerMaxVersion) + ops, _ := logic.AssembleString(goodProgram) + expectedSourcemap := logic.GetSourceMap([]string{}, ops.OffsetToLine) goodProgramBytes := []byte(goodProgram) - tealCompileTest(t, goodProgramBytes, 200, true) - tealCompileTest(t, goodProgramBytes, 404, false) + + // Test good program with params + tealCompileTest(t, goodProgramBytes, 200, true, params, nil) + paramValue := true + params = generated.TealCompileParams{Sourcemap: ¶mValue} + tealCompileTest(t, goodProgramBytes, 200, true, params, &expectedSourcemap) + paramValue = false + params = generated.TealCompileParams{Sourcemap: ¶mValue} + tealCompileTest(t, goodProgramBytes, 200, true, params, nil) + + // Test a program without the developer API flag. + tealCompileTest(t, goodProgramBytes, 404, false, params, nil) + + // Test bad program. badProgram := "bad program" badProgramBytes := []byte(badProgram) - tealCompileTest(t, badProgramBytes, 400, true) + tealCompileTest(t, badProgramBytes, 400, true, params, nil) } func tealDisassembleTest(t *testing.T, program []byte, expectedCode int, @@ -607,7 +643,7 @@ func TestTealDisassemble(t *testing.T) { tealDisassembleTest(t, testProgram, 200, "// invalid version\n", true) // Test a valid program. - for ver := 1; ver < logic.AssemblerMaxVersion; ver++ { + for ver := 1; ver <= logic.AssemblerMaxVersion; ver++ { goodProgram := `int 1` ops, _ := logic.AssembleStringWithVersion(goodProgram, uint64(ver)) disassembledProgram, _ := logic.Disassemble(ops.Program) @@ -616,7 +652,7 @@ func TestTealDisassemble(t *testing.T) { // Test a nil program without the developer API flag. tealDisassembleTest(t, testProgram, 404, "", false) - // Test bad program + // Test bad program. badProgram := []byte{1, 99} tealDisassembleTest(t, badProgram, 400, "invalid opcode", true) } From aa82b9a6e78dd38c8115120ca90b817f6be73ef3 Mon Sep 17 00:00:00 2001 From: algochoi <86622919+algochoi@users.noreply.github.com> Date: Fri, 13 May 2022 10:46:14 -0400 Subject: [PATCH 11/34] Dryrun: Return EvalDeltas for failed executions in Dryrun (#3929) Return evaldeltas for failed execution and check global state --- daemon/algod/api/server/v2/dryrun.go | 3 + daemon/algod/api/server/v2/dryrun_test.go | 134 +++++++++++++++++++++- 2 files changed, 135 insertions(+), 2 deletions(-) diff --git a/daemon/algod/api/server/v2/dryrun.go b/daemon/algod/api/server/v2/dryrun.go index 38f902ed37..eea36a9755 100644 --- a/daemon/algod/api/server/v2/dryrun.go +++ b/daemon/algod/api/server/v2/dryrun.go @@ -507,6 +507,9 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { messages[0] = "ApprovalProgram" } pass, delta, err := ba.StatefulEval(ti, ep, appIdx, program) + if !pass { + delta = ep.TxnGroup[ti].EvalDelta + } result.Disassembly = debug.lines result.AppCallTrace = &debug.history result.GlobalDelta = StateDeltaToStateDelta(delta.GlobalDelta) diff --git a/daemon/algod/api/server/v2/dryrun_test.go b/daemon/algod/api/server/v2/dryrun_test.go index 287e47d19d..c2722627b6 100644 --- a/daemon/algod/api/server/v2/dryrun_test.go +++ b/daemon/algod/api/server/v2/dryrun_test.go @@ -20,6 +20,7 @@ import ( "bytes" "encoding/base64" "encoding/json" + "fmt" "strconv" "strings" "testing" @@ -374,7 +375,7 @@ func checkLogicSigPass(t *testing.T, response *generated.DryrunResponse) { } } -func checkAppCallPass(t *testing.T, response *generated.DryrunResponse) { +func checkAppCallResponse(t *testing.T, response *generated.DryrunResponse, msg string) { if len(response.Txns) < 1 { t.Error("no response txns") } else if len(response.Txns) == 0 { @@ -387,12 +388,20 @@ func checkAppCallPass(t *testing.T, response *generated.DryrunResponse) { if response.Txns[idx].AppCallMessages != nil { messages := *response.Txns[idx].AppCallMessages assert.GreaterOrEqual(t, len(messages), 1) - assert.Equal(t, "PASS", messages[len(messages)-1]) + assert.Equal(t, msg, messages[len(messages)-1]) } } } } +func checkAppCallPass(t *testing.T, response *generated.DryrunResponse) { + checkAppCallResponse(t, response, "PASS") +} + +func checkAppCallReject(t *testing.T, response *generated.DryrunResponse) { + checkAppCallResponse(t, response, "REJECT") +} + type expectedSlotType struct { slot int tt basics.TealType @@ -1634,3 +1643,124 @@ int 1`) logResponse(t, &response) } } + +func checkEvalDelta(t *testing.T, + response generated.DryrunResponse, + expectedGlobalDelta generated.StateDelta, + expectedLocalDelta generated.AccountStateDelta, +) { + for _, rt := range response.Txns { + if rt.GlobalDelta != nil && len(*rt.GlobalDelta) > 0 { + assert.Equal(t, expectedGlobalDelta, *rt.GlobalDelta) + } else { + assert.Nil(t, expectedGlobalDelta) + } + + if rt.LocalDeltas != nil { + for _, ld := range *rt.LocalDeltas { + assert.Equal(t, expectedLocalDelta.Address, ld.Address) + assert.Equal(t, expectedLocalDelta.Delta, ld.Delta) + } + } else { + assert.Nil(t, expectedLocalDelta) + } + } +} + +func TestDryrunCheckEvalDeltasReturned(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + var dr DryrunRequest + var response generated.DryrunResponse + + // Expected responses. + expectedByte := b64("val") + expectedUint := uint64(1) + expectedGlobalDelta := generated.StateDelta{ + { + Key: b64("key"), + Value: generated.EvalDelta{ + Action: uint64(basics.SetBytesAction), + Bytes: &expectedByte, + }, + }, + } + expectedLocalDelta := generated.AccountStateDelta{ + Address: basics.Address{}.String(), + Delta: generated.StateDelta{ + { + Key: b64("key"), + Value: generated.EvalDelta{ + Action: uint64(basics.SetUintAction), + Uint: &expectedUint, + }, + }, + }, + } + + // Test that a PASS and REJECT dryrun both return the dryrun evaldelta. + for i := range []int{0, 1} { + ops, _ := logic.AssembleString(fmt.Sprintf(` +#pragma version 6 +txna ApplicationArgs 0 +txna ApplicationArgs 1 +app_global_put +int 0 +txna ApplicationArgs 0 +int %d +app_local_put +int %d`, expectedUint, i)) + dr.ProtocolVersion = string(dryrunProtoVersion) + + dr.Txns = []transactions.SignedTxn{ + { + Txn: transactions.Transaction{ + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationID: 1, + ApplicationArgs: [][]byte{ + []byte("key"), + []byte("val"), + }, + }, + }, + }, + } + dr.Apps = []generated.Application{ + { + Id: 1, + Params: generated.ApplicationParams{ + ApprovalProgram: ops.Program, + GlobalStateSchema: &generated.ApplicationStateSchema{ + NumByteSlice: 1, + NumUint: 1, + }, + LocalStateSchema: &generated.ApplicationStateSchema{ + NumByteSlice: 1, + NumUint: 1, + }, + }, + }, + } + dr.Accounts = []generated.Account{ + { + Status: "Online", + Address: basics.Address{}.String(), + AppsLocalState: &[]generated.ApplicationLocalState{{Id: 1}}, + }, + } + + doDryrunRequest(&dr, &response) + if i == 0 { + checkAppCallReject(t, &response) + } else { + checkAppCallPass(t, &response) + } + checkEvalDelta(t, response, expectedGlobalDelta, expectedLocalDelta) + if t.Failed() { + logResponse(t, &response) + } + } + +} From dd703dadbebc521bed6a5ce95791cb97d5a8bc40 Mon Sep 17 00:00:00 2001 From: Michael Diamant Date: Fri, 13 May 2022 15:01:02 -0400 Subject: [PATCH 12/34] algod API: Remove errant base64 docs reference (#3982) --- daemon/algod/api/algod.oas2.json | 2 +- daemon/algod/api/algod.oas3.yml | 2 +- .../algod/api/server/v2/generated/routes.go | 40 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 5c1154e35e..736ce0a268 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -1438,7 +1438,7 @@ }, "/v2/teal/disassemble": { "post": { - "description": "Given the base64 encoded program bytes, return the TEAL source code in plain text. This endpoint is only enabled when a node's configuration file sets EnableDeveloperAPI to true.", + "description": "Given the program bytes, return the TEAL source code in plain text. This endpoint is only enabled when a node's configuration file sets EnableDeveloperAPI to true.", "consumes": [ "application/x-binary" ], diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index 2b75bd13be..d71a2dbd9e 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -3748,7 +3748,7 @@ }, "/v2/teal/disassemble": { "post": { - "description": "Given the base64 encoded program bytes, return the TEAL source code in plain text. This endpoint is only enabled when a node's configuration file sets EnableDeveloperAPI to true.", + "description": "Given the program bytes, return the TEAL source code in plain text. This endpoint is only enabled when a node's configuration file sets EnableDeveloperAPI to true.", "operationId": "TealDisassemble", "requestBody": { "content": { diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 02c2ed7d8b..065a90fffa 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -966,26 +966,26 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the Swagger specification corresponding to the generated code From 8e6cef14af066c797be096453dd0c223810cf5fa Mon Sep 17 00:00:00 2001 From: Brian Olson Date: Mon, 16 May 2022 10:23:45 -0400 Subject: [PATCH 13/34] transaction sync: Transition test (#3882) Test for a network in transition. Runs a 6 node network with the following topology: New Leaf 1 New Leaf 2 > New Relay - Old Relay < Old Leaf 1 Old Leaf 2 --- test/scripts/transition_mix_test.py | 626 ++++++++++++++++++ test/testdata/nettemplates/TransitionSix.json | 66 ++ 2 files changed, 692 insertions(+) create mode 100644 test/scripts/transition_mix_test.py create mode 100644 test/testdata/nettemplates/TransitionSix.json diff --git a/test/scripts/transition_mix_test.py b/test/scripts/transition_mix_test.py new file mode 100644 index 0000000000..5112eac5bc --- /dev/null +++ b/test/scripts/transition_mix_test.py @@ -0,0 +1,626 @@ +#!/usr/bin/env python3 +# +# Test for a network in transition. +# Runs a 6 node network with the following topology: +# +# New Leaf 1 New Leaf 2 +# > New Relay - Old Relay < +# Old Leaf 1 Old Leaf 2 +# +# "New" and "Old" can mean different algod/goal/kmd binary versions. +# It can also or separately mean config.json updates. (set --old-bin +# and --new-bin to the same dir, set --new-config or --old-config to +# overlay json onto the net temlplate generated config.json of new or +# old nodes. +# +# In the test each leaf submits a simple payment transaction from its +# unlocked wallet to a dummy account '\x00...\x0N'. A few rounds are +# waited then each leaf verifies that it can see all the expected +# account values. +# +# The test then waits 100 rounds and checks that the 4 leaves are each +# a block proposer a reasonable fraction of the 100 rounds. + +import argparse +import atexit +import glob +import json +import logging +import os +import re +import shutil +import statistics +import subprocess +import sys +import tempfile +import threading +import time + +# pip install py-algorand-sdk +import algosdk + +logger = logging.getLogger(__name__) + +scriptdir = os.path.dirname(os.path.realpath(__file__)) +repodir = os.path.join(scriptdir, "..", "..") + +_onbranch = 'On branch ' + +def getbranch(rd): + result = subprocess.run(['git', 'status', '-b'], cwd=rd, capture_output=True, timeout=3) + for line in result.stdout.decode().splitlines(): + if line.startswith(_onbranch): + return line[len(_onbranch):] + return None + +def get_go_env(): + out = {} + result = subprocess.run(['go', 'env'], capture_output=True) + for line in result.stdout.decode().splitlines(): + line = line.strip() + # TODO: is there a better way to parse sh-like k=v (possibly with quoting)? + k,v = line.split('=', 1) + if v.startswith('"') and v.endswith('"'): + v = v[1:-1] + out[k] = v + return out + +def openkmd(algodata): + kmdnetpath = sorted(glob.glob(os.path.join(algodata,'kmd-*','kmd.net')))[-1] + kmdnet = open(kmdnetpath, 'rt').read().strip() + kmdtokenpath = sorted(glob.glob(os.path.join(algodata,'kmd-*','kmd.token')))[-1] + kmdtoken = open(kmdtokenpath, 'rt').read().strip() + kmd = algosdk.kmd.KMDClient(kmdtoken, 'http://' + kmdnet) + return kmd + +def openalgod(algodata): + algodnetpath = os.path.join(algodata,'algod.net') + algodnet = open(algodnetpath, 'rt').read().strip() + algodtokenpath = os.path.join(algodata,'algod.token') + algodtoken = open(algodtokenpath, 'rt').read().strip() + algod = algosdk.v2client.algod.AlgodClient(algodtoken, 'http://' + algodnet) + return algod + + +def maybedecode(x): + if not x: + return x + if hasattr(x, 'decode'): + return x.decode() + return x + +def reportcomms(p, stdout, stderr): + cmdr = repr(p.args) + if not stdout and p.stdout: + stdout = p.stdout.read() + if not stderr and p.stderr: + stderr = p.stderr.read() + if stdout: + sys.stderr.write('output from {}:\n{}\n\n'.format(cmdr, maybedecode(stdout))) + if stderr: + sys.stderr.write('stderr from {}:\n{}\n\n'.format(cmdr, maybedecode(stderr))) + +def xrun(cmd, *args, **kwargs): + timeout = kwargs.pop('timeout', None) + kwargs['stdout'] = subprocess.PIPE + kwargs['stderr'] = subprocess.STDOUT + try: + logger.debug('xrun: %r', cmd) + p = subprocess.Popen(cmd, *args, **kwargs) + except Exception as e: + logger.error('subprocess failed {!r}'.format(cmd), exc_info=True) + raise + try: + if timeout: + stdout,stderr = p.communicate(timeout=timeout) + else: + stdout,stderr = p.communicate() + except subprocess.TimeoutExpired as te: + logger.error('subprocess timed out {!r}'.format(cmd), exc_info=True) + reportcomms(p, stdout, stderr) + raise + except Exception as e: + logger.error('subprocess exception {!r}'.format(cmd), exc_info=True) + reportcomms(p, stdout, stderr) + raise + if p.returncode != 0: + cmdr = repr(cmd) + logger.error('cmd failed {}'.format(cmdr)) + reportcomms(p, stdout, stderr) + raise Exception('error: cmd failed: {}'.format(cmdr)) + + +def startdaemon(cmd): + try: + logger.debug('start: %r', cmd) + p = subprocess.Popen(cmd) + return p + except Exception as e: + logger.error('subprocess failed {!r}'.format(cmd), exc_info=True) + raise + +def wait_for_transaction(algod, txid, round, timeout=15): + start = time.time() + ti = algod.pending_transaction_info(txid) + logger.debug('ti %s %r', txid, ti) + while True: + if ti and ti.get('confirmed-round'): + # txn was committed + return True + if timeout and ((time.time() - start) > timeout): + return False + time.sleep(1) + st = algod.status_after_block(round) + logger.debug('st %r', st) + round = st['last-round'] + ti = algod.pending_transaction_info(txid) + logger.debug('ti %r', ti) + +class NodeContext: + def __init__(self, bindir, env=None, algodata=None, proc=None): + self.proc = proc + self.bindir = bindir + self.algodata = algodata + self.env = env + if env and not algodata: + self.algodata = env['ALGORAND_DATA'] + self.kmd = None + self.algod = None + self.pubw = None + self.maxpubaddr = None + self.lock = threading.Lock() + return + + def _connect(self): + # should run from inside self.lock + if self.algod and self.kmd: + return + + goal = os.path.join(self.bindir, 'goal') + xrun([goal, 'kmd', 'start', '-t', '3600','-d', self.algodata], env=self.env, timeout=5) + self.kmd = openkmd(self.algodata) + self.algod = openalgod(self.algodata) + + def connect(self): + with self.lock: + self._connect() + return self.algod, self.kmd + + def get_pub_wallet(self): + with self.lock: + self._connect() + if not (self.pubw and self.maxpubaddr): + # find private test node public wallet and its richest account + wallets = self.kmd.list_wallets() + pubwid = None + for xw in wallets: + if xw['name'] == 'unencrypted-default-wallet': + pubwid = xw['id'] + pubw = self.kmd.init_wallet_handle(pubwid, '') + pubaddrs = self.kmd.list_keys(pubw) + pubbalances = [] + maxamount = 0 + maxpubaddr = None + for pa in pubaddrs: + pai = self.algod.account_info(pa) + if pai['amount'] > maxamount: + maxamount = pai['amount'] + maxpubaddr = pai['address'] + self.pubw = pubw + self.maxpubaddr = maxpubaddr + return self.pubw, self.maxpubaddr + + def terminate(self): + self.proc.terminate() + +def get_block_proposers(algod, lastRound, expected_proposers): + oprops = {} + for i in range(1,lastRound+1): + try: + b2b = algod.block_info(i, response_format='msgpack') + b2 = algosdk.encoding.msgpack.unpackb(b2b) + oprop = b2['cert']['prop']['oprop'] + oprops[oprop] = oprops.get(oprop, 0) + 1 + except Exception as e: + print(e) + break + logger.debug('oprops %r', oprops) + assert(len(oprops) == expected_proposers) + mean = statistics.mean(oprops.values()) + var_limit = mean / 2 + ok = [] + bad = [] + for op,count in oprops.items(): + line = '{}\t{}'.format(algosdk.encoding.encode_address(op), count) + if abs(count-mean) > var_limit: + bad.append(line) + else: + ok.append(line) + if bad: + for line in ok: + print(line) + print("ERROR:") + for line in bad: + print(line) + raise Exception("too much variance in block proposers, wanted [{} - {}]".format(mean-var_limit, mean+var_limit)) + return + +def start_algod(algodata, bindir, relay_addr=None): + algod_path = os.path.join(bindir, 'algod') + cmd = [algod_path, '-d', algodata] + if relay_addr: + cmd += ['-p', relay_addr] + proc = startdaemon(cmd) + #atexit.register(proc.terminate) + return NodeContext(bindir, algodata=algodata, proc=proc) + + +def bindir_missing(bindir): + out = [] + for p in ('algod', 'goal', 'kmd'): + path = os.path.join(bindir, p) + if not os.path.exists(path): + out.append(p) + if not out: + return None + return out + +def build(args, repodir, newbin, oldbin): + curbranch = getbranch(repodir) + goenv = get_go_env() + gopath = goenv['GOPATH'] + newalgod = os.path.join(newbin , 'algod') + oldalgod = os.path.join(oldbin, 'algod') + os.makedirs(newbin, exist_ok=True) + os.makedirs(oldbin, exist_ok=True) + changeBack = False + try: + newbin_missing = bindir_missing(newbin) + logger.debug('%s missing %r', newbin, newbin_missing) + if newbin_missing: + if args.no_build: + raise Exception('new bin dir {} missing {} but --no-build set'.format(newbin, newbin_missing)) + xrun(['git', 'checkout', args.new_branch], cwd=repodir) + changeBack = True + xrun(['make'], cwd=repodir) + for bn in ('algod', 'goal', 'kmd'): + shutil.copy(os.path.join(gopath, 'bin', bn), os.path.join(newbin, bn)) + oldbin_missing = bindir_missing(oldbin) + logger.debug('%s missing %r', oldbin, oldbin_missing) + if oldbin_missing: + if args.no_build: + raise Exception('old bin dir {} missing {} but --no-build set'.format(oldbin, oldbin_missing)) + xrun(['git', 'checkout', args.old_branch], cwd=repodir) + changeBack = True + xrun(['make'], cwd=repodir) + for bn in ('algod', 'goal', 'kmd'): + shutil.copy(os.path.join(gopath, 'bin', bn), os.path.join(oldbin, bn)) + finally: + if changeBack: + xrun(['git', 'checkout', curbranch]) + +# return algod relay host:port or raise Exception +def wait_relay_addr(algodata, timeout=10): + relay_addr_path = os.path.join(algodata, 'algod-listen.net') + timeout = time.time() + timeout + while True: + if os.path.exists(relay_addr_path): + with open(relay_addr_path) as fin: + relay_addr = fin.read().strip() + return relay_addr + if time.time() > timeout: + raise Exception('never found relay_addr at {}'.format(relay_addr_path)) + time.sleep(0.1) + +# accept literal or filename +def json_arg(arg): + if not arg: + return None + if arg[0] == '{': + return json.loads(arg) + if arg[0] == '@': + with open(arg[1:]) as fin: + return json.load(fin) + if os.path.exists(arg): + with open(arg) as fin: + return json.load(fin) + raise Exception("don't know how to get json from {!r}".format(arg)) + +def json_overlay(arg, netdir, subdirs): + if not arg: + return + nc = json_arg(arg) + if not nc: + return + for subdir in subdirs: + with open(os.path.join(netdir, subdir, 'config.json')) as fin: + config = json.load(fin) + config.update(nc) + with open(os.path.join(netdir, subdir, 'config.json'), 'w') as fout: + json.dump(config, fout) + +_logging_format = '%(asctime)s :%(lineno)d %(message)s' +_logging_datefmt = '%Y%m%d_%H%M%S' + +def main(): + start = time.time() + ap = argparse.ArgumentParser() + ap.add_argument('--new-branch', default=None, help='`git checkout {new-branch}` and build') + ap.add_argument('--old-branch', default=None, help='`git checkout {new-branch}` and build') + ap.add_argument('--new-config', help='json to overlay on config.json, json literal or filename') + ap.add_argument('--old-config', help='json to overlay on config.json, json literal or filename') + ap.add_argument('--new-bin', help='path to directory holding new version of algod,kmd,goal') + ap.add_argument('--old-bin', help='path to directory holding old version of algod,kmd,goal') + ap.add_argument('--no-build', default=False, action='store_true') + ap.add_argument('--work-dir') + ap.add_argument('--keep-temps', default=False, action='store_true', help='if set, keep all the test files') + ap.add_argument('--verbose', default=False, action='store_true') + args = ap.parse_args() + + if args.verbose: + logging.basicConfig(format=_logging_format, datefmt=_logging_datefmt, level=logging.DEBUG) + else: + logging.basicConfig(format=_logging_format, datefmt=_logging_datefmt, level=logging.INFO) + + # TODO: default old_branch to the highest git tag like 'v3.5.1-stable' + # TODO: default new_branch to whatever is currently checked out + + # start with a copy when making env for child processes + env = dict(os.environ) + + tempdir = args.work_dir + if not tempdir: + tempdir = os.getenv('TEMPDIR') + if not tempdir: + tempdir = tempfile.mkdtemp() + env['TEMPDIR'] = tempdir + logger.info('created TEMPDIR %r', tempdir) + if not args.keep_temps: + # If we created a tmpdir and we're not keeping it, clean it up. + # If an outer process specified $TEMPDIR, let them clean it up. + atexit.register(shutil.rmtree, tempdir, onerror=lambda efn, epath, excinfo: logger.error('rmtree error %r %r %s', efn, epath, excinfo)) + else: + atexit.register(print, 'keeping temps. to clean up:\nrm -rf {}'.format(tempdir)) + + newbin = args.new_bin or os.path.join(tempdir, 'newbin') + oldbin = args.old_bin or os.path.join(tempdir, 'oldbin') + build(args, repodir, newbin, oldbin) + + netdir = os.path.join(tempdir, 'net') + run_test6(args, netdir, oldbin, newbin) + # algod_bins = { + # 'Primary': oldbin, + # 'Node1': oldbin, + # 'Node2': newbin, + # } + # run_test(netdir, oldbin, newbin, algod_bins) + # algod_bins = { + # 'Primary': newbin, + # 'Node1': oldbin, + # 'Node2': newbin, + # } + # run_test(netdir, oldbin, newbin, algod_bins) + dt = time.time() - start + print('DONE OK {:.1f} seconds'.format(dt)) + # wait a moment for terminated algod to clean up their files + time.sleep(1) + return 0 + +def nop(*args, **kwargs): + pass + +def run_defers(defers, reraise=True, keep_going=False): + if defers is None: + return + for di in defers: + try: + di() + except Exception as ie: + if reraise: + raise + logger.error('exception in defer:', exc_info=True) + if not keep_going: + break + +def defer_wrap(fn): + def _wrapped(*args, **kwargs): + out = None + try: + defers = None + if '_defer' not in kwargs: + defers = [] + kwargs['_defer'] = lambda x: defers.append(x) + out = fn(*args, **kwargs) + except: + run_defers(defers, reraise=False) + raise + run_defers(defers, reraise=True) + return out + return _wrapped + +# Test topology: 1 relay, to leaf nodes. +# one leaf node each for oldbin, newbin +# relay as either oldbin or newbin +@defer_wrap +def run_test(netdir, oldbin, newbin, algod_bins, _defer=nop): + shutil.rmtree(netdir, ignore_errors=True) + xrun([os.path.join(oldbin, 'goal'), 'network', 'create', '-r', netdir, '-n', 'tbd', '-t', os.path.join(repodir, 'test/testdata/nettemplates/ThreeNodesEvenDist.json')], timeout=90) + + relay = start_algod(os.path.join(netdir, 'Primary'), algod_bins['Primary']) + _defer(relay.terminate) + relay_addr = wait_relay_addr(relay.algodata) + + n1 = start_algod(os.path.join(netdir, 'Node1'), algod_bins['Node1'], relay_addr=relay_addr) + _defer(n1.terminate) + + n2 = start_algod(os.path.join(netdir, 'Node2'), algod_bins['Node2'], relay_addr=relay_addr) + _defer(n2.terminate) + + n1algod, n1kmd = n1.connect() + n2algod, n2kmd = n2.connect() + time.sleep(5) + status = n1algod.status() + # TODO: timeout? + #print('status {!r}'.format(status)) + n1algod.status_after_block(status['last-round']) + + tryi = 0 + while True: + try: + pubw, maxpubaddr = n1.get_pub_wallet() + break + except: + if tryi >= 5: + raise + tryi += 1 + print('n1 get pub wallet retry sleep...') + time.sleep(1) + + a1i = n1algod.account_info(maxpubaddr) + pubw2, maxpubaddr2 = n2.get_pub_wallet() + a2i = n2algod.account_info(maxpubaddr2) + + # test txn on n1 account submitted through n1, seen at n2 + tx1amt = 999000 + params = n1algod.suggested_params() + round = params.first + max_init_wait_rounds = 5 + txn = algosdk.transaction.PaymentTxn(sender=maxpubaddr, fee=params.min_fee, first=round, last=round+max_init_wait_rounds, gh=params.gh, receiver=maxpubaddr2, amt=tx1amt, flat_fee=True) + stxn = n1kmd.sign_transaction(pubw, '', txn) + txid = n1algod.send_transaction(stxn) + wait_for_transaction(n1algod, txid, round) + + a2i2 = n2algod.account_info(maxpubaddr2) + logger.debug('a2i %r', a2i) + logger.debug('a2i2 %r', a2i2) + # check that recipient got it + assert(a2i2['amount'] - a2i['amount'] == tx1amt) + + # test txn on n2 account submitted through n2, seen at n1 + a1i = n1algod.account_info(maxpubaddr) + tx2amt = 3000000 + params = n2algod.suggested_params() + round = params.first + txn = algosdk.transaction.PaymentTxn(sender=maxpubaddr2, fee=params.min_fee, first=round, last=round+max_init_wait_rounds, gh=params.gh, receiver=maxpubaddr, amt=tx2amt, flat_fee=True) + stxn = n2kmd.sign_transaction(pubw2, '', txn) + txid = n2algod.send_transaction(stxn) + wait_for_transaction(n2algod, txid, round) + + a1i2 = n1algod.account_info(maxpubaddr) + # check that recipient got it + assert(a1i2['amount'] - a1i['amount'] == tx2amt) + + # run for a bunch of rounds and ensure that block proposers are well distributed + ralgod, _ = relay.connect() + st = ralgod.status() + while st['last-round'] < 100: + st = ralgod.status_after_block(st['last-round']) + print(st['last-round']) + get_block_proposers(ralgod, st['last-round'], 3) + + print("OK") + return 0 + +class testaddrs: + def __init__(self): + self.i = 1 + self.sent = {} + self.buf = [0] * 32 + def get(self): + self.buf[31] = self.i + addr = algosdk.encoding.encode_address(bytes(self.buf)) + amt = 1000000 + self.i + self.sent[addr] = amt + self.i += 1 + return addr,amt + + +def wait_round(algod, waitround, st=None, printround=False): + if st is None: + st = algod.status() + lr = st['last-round'] + if lr >= waitround: + return st + nrounds = waitround - lr + timeout = time.time() + (nrounds * 22) + while st['last-round'] < waitround: + if time.time() > timeout: + raise Exception("too long waiting for round {}, last-round={}".format(waitround, st['last-round'])) + st = algod.status_after_block(st['last-round']) + if printround: + print(st['last-round']) + return st + + +# test topology: 2 relays, 4 leafs +# (leaf old 1, leaf new 1) <-> (relay old) <-> (relay new) <-> (leaf old 2, leaf new 2) +@defer_wrap +def run_test6(args, netdir, oldbin, newbin, _defer=nop): + test_addr = testaddrs() + + shutil.rmtree(netdir, ignore_errors=True) + xrun([os.path.join(oldbin, 'goal'), 'network', 'create', '-r', netdir, '-n', 'tbd', '-t', os.path.join(repodir, 'test/testdata/nettemplates/TransitionSix.json')], timeout=90) + + json_overlay(args.new_config, netdir, ('RelayNew', 'New1', 'New2')) + json_overlay(args.old_config, netdir, ('RelayOld', 'Old1', 'Old2')) + + relay_old = start_algod(os.path.join(netdir, 'RelayOld'), oldbin) + _defer(relay_old.terminate) + relay_old_addr = wait_relay_addr(relay_old.algodata) + + relay_new = start_algod(os.path.join(netdir, 'RelayNew'), newbin, relay_addr=relay_old_addr) + _defer(relay_new.terminate) + relay_new_addr = wait_relay_addr(relay_new.algodata) + + new1 = start_algod(os.path.join(netdir, 'New1'), newbin, relay_addr=relay_old_addr) + _defer(new1.terminate) + old1 = start_algod(os.path.join(netdir, 'Old1'), oldbin, relay_addr=relay_old_addr) + _defer(old1.terminate) + + new2 = start_algod(os.path.join(netdir, 'New2'), newbin, relay_addr=relay_new_addr) + _defer(new2.terminate) + old2 = start_algod(os.path.join(netdir, 'Old2'), oldbin, relay_addr=relay_new_addr) + _defer(old2.terminate) + + time.sleep(1) + + leafs = [new1, old1, new2, old2] + + n1algod, n1kmd = new1.connect() + + status = n1algod.status() + logger.debug('waiting for round after %s', status['last-round']) + status = n1algod.status_after_block(status['last-round']) + logger.debug('status %r', status) + + sent_txid = [] + + # send a txn from each leaf + for leaf in leafs: + algod, kmd = leaf.connect() + pubw, maxpubaddr = leaf.get_pub_wallet() + params = algod.suggested_params() + receiver, amt = test_addr.get() + txn = algosdk.transaction.PaymentTxn(sender=maxpubaddr, fee=params.min_fee, first=params.first, last=params.first+10, gh=params.gh, receiver=receiver, amt=amt, flat_fee=True) + stxn = kmd.sign_transaction(pubw, '', txn) + txid = algod.send_transaction(stxn) + sent_txid.append(txid) + + ralgod, _ = relay_old.connect() + st = wait_round(ralgod, status['last-round'] + 12, st=status) + + for leaf in leafs: + for addr, amt in test_addr.sent.items(): + algod, _ = leaf.connect() + ast = algod.account_info(addr) + assert(ast['amount'] == amt) + + st = wait_round(ralgod, 100, printround=True, st=st) + get_block_proposers(ralgod, st['last-round'], 4) + + print("OK") + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/test/testdata/nettemplates/TransitionSix.json b/test/testdata/nettemplates/TransitionSix.json new file mode 100644 index 0000000000..a20e07f0b2 --- /dev/null +++ b/test/testdata/nettemplates/TransitionSix.json @@ -0,0 +1,66 @@ +{ + "Genesis": { + "NetworkName": "tbd", + "LastPartKeyRound": 3000, + "Wallets": [ + { + "Name": "Wallet1", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet2", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet3", + "Stake": 25, + "Online": true + }, + { + "Name": "Wallet4", + "Stake": 25, + "Online": true + } + ] + }, + "Nodes": [ + { + "Name": "RelayOld", + "IsRelay": true + }, + { + "Name": "RelayNew", + "IsRelay": true + }, + { + "Name": "Old1", + "Wallets": [ + { "Name": "Wallet1", + "ParticipationOnly": false } + ] + }, + { + "Name": "New1", + "Wallets": [ + { "Name": "Wallet2", + "ParticipationOnly": false } + ] + }, + { + "Name": "Old2", + "Wallets": [ + { "Name": "Wallet3", + "ParticipationOnly": false } + ] + }, + { + "Name": "New2", + "Wallets": [ + { "Name": "Wallet4", + "ParticipationOnly": false } + ] + } + ] +} From 91095fa6bdccb11ec133c38da68fdd92fa611b6c Mon Sep 17 00:00:00 2001 From: Brian Olson Date: Mon, 16 May 2022 13:08:43 -0400 Subject: [PATCH 14/34] cleanup: replace crypto.HashObj(Transaction) with Transaction.ID() (#3958) * replace crypto.HashObj(Transaction) with Transaction.ID() --- cmd/goal/clerk.go | 2 +- data/transactions/transaction.go | 1 + data/transactions/transaction_test.go | 18 ++++++++++++++++++ data/txntest/txn.go | 15 ++++++++------- ledger/internal/eval.go | 4 ++-- libgoal/transactions.go | 2 +- 6 files changed, 31 insertions(+), 11 deletions(-) diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go index 11275c875d..ac570ffb54 100644 --- a/cmd/goal/clerk.go +++ b/cmd/goal/clerk.go @@ -874,7 +874,7 @@ var groupCmd = &cobra.Command{ } stxns = append(stxns, stxn) - group.TxGroupHashes = append(group.TxGroupHashes, crypto.HashObj(stxn.Txn)) + group.TxGroupHashes = append(group.TxGroupHashes, crypto.Digest(stxn.ID())) transactionIdx++ } diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index 2adc6c3887..5c67f64dd2 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -162,6 +162,7 @@ type TxGroup struct { // together, sequentially, in a block in order for the group to be // valid. Each hash in the list is a hash of a transaction with // the `Group` field omitted. + // These are all `Txid` which is equivalent to `crypto.Digest` TxGroupHashes []crypto.Digest `codec:"txlist,allocbound=config.MaxTxGroupSize"` } diff --git a/data/transactions/transaction_test.go b/data/transactions/transaction_test.go index 5a7321c698..4536fb122c 100644 --- a/data/transactions/transaction_test.go +++ b/data/transactions/transaction_test.go @@ -552,6 +552,24 @@ func TestWellFormedErrors(t *testing.T) { } } +// TestTransactionHash checks that Transaction.ID() is equivalent to the old simpler crypto.HashObj() implementation. +func TestTransactionHash(t *testing.T) { + partitiontest.PartitionTest(t) + + var txn Transaction + txn.Sender[1] = 3 + txn.Fee.Raw = 1234 + txid := txn.ID() + txid2 := Txid(crypto.HashObj(txn)) + require.Equal(t, txid, txid2) + + txn.LastValid = 4321 + txid3 := txn.ID() + txid2 = Txid(crypto.HashObj(txn)) + require.NotEqual(t, txid, txid3) + require.Equal(t, txid3, txid2) +} + var generateFlag = flag.Bool("generate", false, "") // running test with -generate would generate the matrix used in the test ( without the "correct" errors ) diff --git a/data/txntest/txn.go b/data/txntest/txn.go index 6b72cb080e..c137b171ff 100644 --- a/data/txntest/txn.go +++ b/data/txntest/txn.go @@ -269,19 +269,20 @@ func SignedTxns(txns ...*Txn) []transactions.SignedTxn { txgroup := transactions.TxGroup{ TxGroupHashes: make([]crypto.Digest, len(txns)), } + stxns := make([]transactions.SignedTxn, len(txns)) for i, txn := range txns { - txn.Group = crypto.Digest{} - txgroup.TxGroupHashes[i] = crypto.HashObj(txn.Txn()) + stxns[i] = txn.SignedTxn() + } + for i, txn := range stxns { + txn.Txn.Group = crypto.Digest{} + txgroup.TxGroupHashes[i] = crypto.Digest(txn.ID()) } group := crypto.HashObj(txgroup) - for _, txn := range txns { + for i, txn := range txns { txn.Group = group + stxns[i].Txn.Group = group } - stxns := make([]transactions.SignedTxn, len(txns)) - for i, txn := range txns { - stxns[i] = txn.SignedTxn() - } return stxns } diff --git a/ledger/internal/eval.go b/ledger/internal/eval.go index c964ec46c6..20c6f5d5ab 100644 --- a/ledger/internal/eval.go +++ b/ledger/internal/eval.go @@ -871,7 +871,7 @@ func (eval *BlockEvaluator) TestTransactionGroup(txgroup []transactions.SignedTx txWithoutGroup := txn.Txn txWithoutGroup.Group = crypto.Digest{} - group.TxGroupHashes = append(group.TxGroupHashes, crypto.HashObj(txWithoutGroup)) + group.TxGroupHashes = append(group.TxGroupHashes, crypto.Digest(txWithoutGroup.ID())) } else if len(txgroup) > 1 { return fmt.Errorf("transactionGroup: [%d] had zero Group but was submitted in a group of %d", gi, len(txgroup)) } @@ -981,7 +981,7 @@ func (eval *BlockEvaluator) transactionGroup(txgroup []transactions.SignedTxnWit txWithoutGroup := txad.SignedTxn.Txn txWithoutGroup.Group = crypto.Digest{} - group.TxGroupHashes = append(group.TxGroupHashes, crypto.HashObj(txWithoutGroup)) + group.TxGroupHashes = append(group.TxGroupHashes, crypto.Digest(txWithoutGroup.ID())) } else if len(txgroup) > 1 { return fmt.Errorf("transactionGroup: [%d] had zero Group but was submitted in a group of %d", gi, len(txgroup)) } diff --git a/libgoal/transactions.go b/libgoal/transactions.go index c689d5c59e..bf704cc9ef 100644 --- a/libgoal/transactions.go +++ b/libgoal/transactions.go @@ -752,7 +752,7 @@ func (c *Client) GroupID(txgroup []transactions.Transaction) (gid crypto.Digest, return } - group.TxGroupHashes = append(group.TxGroupHashes, crypto.HashObj(tx)) + group.TxGroupHashes = append(group.TxGroupHashes, crypto.Digest(tx.ID())) } return crypto.HashObj(group), nil From 8bb8a4a1ea867318566aa1132e7961edacbc142c Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Tue, 17 May 2022 15:22:37 -0400 Subject: [PATCH 15/34] CI: ensure msgp generator has been run and is clean (#3978) This should ensure make msgp has been run for changes that impact msgp serialization on CI builds. It looks like #3829 was merged but missed changes to agreement/msgp_gen.go and gci updates from algorand/msgp#14 were not incorporated into #3919. --- agreement/msgp_gen.go | 75 +-- agreement/msgp_gen_test.go | 3 +- compactcert/msgp_gen_test.go | 3 +- crypto/compactcert/msgp_gen_test.go | 3 +- crypto/merklearray/msgp_gen.go | 3 +- crypto/merklearray/msgp_gen_test.go | 3 +- crypto/merklesignature/msgp_gen.go | 3 +- crypto/merklesignature/msgp_gen_test.go | 3 +- crypto/msgp_gen_test.go | 3 +- daemon/algod/api/spec/v2/msgp_gen.go | 3 +- daemon/algod/api/spec/v2/msgp_gen_test.go | 3 +- data/account/msgp_gen.go | 3 +- data/account/msgp_gen_test.go | 3 +- data/basics/msgp_gen.go | 3 +- data/basics/msgp_gen_test.go | 3 +- data/bookkeeping/msgp_gen.go | 75 +-- data/bookkeeping/msgp_gen_test.go | 3 +- data/committee/msgp_gen_test.go | 3 +- data/hashable/msgp_gen_test.go | 3 +- data/transactions/msgp_gen.go | 3 +- data/transactions/msgp_gen_test.go | 3 +- go.mod | 2 +- go.sum | 4 +- ledger/ledgercore/msgp_gen_test.go | 3 +- ledger/msgp_gen.go | 3 +- ledger/msgp_gen_test.go | 3 +- node/msgp_gen_test.go | 3 +- protocol/test/msgp_gen_test.go | 3 +- rpcs/msgp_gen_test.go | 3 +- scripts/buildtools/go.mod | 12 - scripts/buildtools/go.sum | 630 ---------------------- scripts/buildtools/install_buildtools.sh | 6 +- scripts/buildtools/versions | 6 + scripts/travis/codegen_verification.sh | 5 +- 34 files changed, 142 insertions(+), 748 deletions(-) delete mode 100644 scripts/buildtools/go.mod delete mode 100644 scripts/buildtools/go.sum create mode 100644 scripts/buildtools/versions diff --git a/agreement/msgp_gen.go b/agreement/msgp_gen.go index 38783d13d4..4f2252b875 100644 --- a/agreement/msgp_gen.go +++ b/agreement/msgp_gen.go @@ -5,11 +5,12 @@ package agreement import ( "sort" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/data/bookkeeping" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/msgp/msgp" ) // The following msgp objects are implemented in this file: @@ -1691,17 +1692,17 @@ func (z *proposal) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -1991,18 +1992,18 @@ func (z *proposal) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } - case "txn256": - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "ts": (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp, bts, err = msgp.ReadInt64Bytes(bts) if err != nil { @@ -2220,7 +2221,7 @@ func (_ *proposal) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *proposal) Msgsize() (s int) { - s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert { _ = zb0001 @@ -2238,7 +2239,7 @@ func (z *proposal) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *proposal) MsgIsZero() bool { - return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) + return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -3462,17 +3463,17 @@ func (z *transmittedPayload) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0004 > 0 { zb0004-- - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -3770,18 +3771,18 @@ func (z *transmittedPayload) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } - case "txn256": - bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "ts": (*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp, bts, err = msgp.ReadInt64Bytes(bts) if err != nil { @@ -4005,7 +4006,7 @@ func (_ *transmittedPayload) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *transmittedPayload) Msgsize() (s int) { - s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.Round.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Branch.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.Seed.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID) + 3 + (*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).unauthenticatedProposal.Block.BlockHeader.CompactCert { _ = zb0001 @@ -4023,7 +4024,7 @@ func (z *transmittedPayload) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *transmittedPayload) MsgIsZero() bool { - return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) && ((*z).PriorVote.MsgIsZero()) + return ((*z).unauthenticatedProposal.Block.BlockHeader.Round.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Branch.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.Seed.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.TimeStamp == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisID == "") && ((*z).unauthenticatedProposal.Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).unauthenticatedProposal.Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).unauthenticatedProposal.Block.BlockHeader.TxnCounter == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.CompactCert) == 0) && (len((*z).unauthenticatedProposal.Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).unauthenticatedProposal.Block.Payset.MsgIsZero()) && ((*z).unauthenticatedProposal.SeedProof.MsgIsZero()) && ((*z).unauthenticatedProposal.OriginalPeriod == 0) && ((*z).unauthenticatedProposal.OriginalProposer.MsgIsZero()) && ((*z).PriorVote.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -5029,17 +5030,17 @@ func (z *unauthenticatedProposal) UnmarshalMsg(bts []byte) (o []byte, err error) } if zb0004 > 0 { zb0004-- - bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0004 > 0 { zb0004-- - bts, err = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -5329,18 +5330,18 @@ func (z *unauthenticatedProposal) UnmarshalMsg(bts []byte) (o []byte, err error) err = msgp.WrapError(err, "Seed") return } - case "txn256": - bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "ts": (*z).Block.BlockHeader.TimeStamp, bts, err = msgp.ReadInt64Bytes(bts) if err != nil { @@ -5558,7 +5559,7 @@ func (_ *unauthenticatedProposal) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *unauthenticatedProposal) Msgsize() (s int) { - s = 3 + 4 + (*z).Block.BlockHeader.Round.Msgsize() + 5 + (*z).Block.BlockHeader.Branch.Msgsize() + 5 + (*z).Block.BlockHeader.Seed.Msgsize() + 7 + (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).Block.BlockHeader.GenesisID) + 3 + (*z).Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).Block.BlockHeader.Round.Msgsize() + 5 + (*z).Block.BlockHeader.Branch.Msgsize() + 5 + (*z).Block.BlockHeader.Seed.Msgsize() + 4 + (*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 7 + (*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).Block.BlockHeader.GenesisID) + 3 + (*z).Block.BlockHeader.GenesisHash.Msgsize() + 5 + (*z).Block.BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).Block.BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).Block.BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).Block.BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).Block.BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).Block.BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).Block.BlockHeader.CompactCert { _ = zb0001 @@ -5576,7 +5577,7 @@ func (z *unauthenticatedProposal) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *unauthenticatedProposal) MsgIsZero() bool { - return ((*z).Block.BlockHeader.Round.MsgIsZero()) && ((*z).Block.BlockHeader.Branch.MsgIsZero()) && ((*z).Block.BlockHeader.Seed.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TimeStamp == 0) && ((*z).Block.BlockHeader.GenesisID == "") && ((*z).Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).Block.BlockHeader.TxnCounter == 0) && (len((*z).Block.BlockHeader.CompactCert) == 0) && (len((*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Block.Payset.MsgIsZero()) && ((*z).SeedProof.MsgIsZero()) && ((*z).OriginalPeriod == 0) && ((*z).OriginalProposer.MsgIsZero()) + return ((*z).Block.BlockHeader.Round.MsgIsZero()) && ((*z).Block.BlockHeader.Branch.MsgIsZero()) && ((*z).Block.BlockHeader.Seed.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).Block.BlockHeader.TimeStamp == 0) && ((*z).Block.BlockHeader.GenesisID == "") && ((*z).Block.BlockHeader.GenesisHash.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).Block.BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRate == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).Block.BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).Block.BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).Block.BlockHeader.TxnCounter == 0) && (len((*z).Block.BlockHeader.CompactCert) == 0) && (len((*z).Block.BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Block.Payset.MsgIsZero()) && ((*z).SeedProof.MsgIsZero()) && ((*z).OriginalPeriod == 0) && ((*z).OriginalProposer.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/agreement/msgp_gen_test.go b/agreement/msgp_gen_test.go index 8d886e6562..0231cc28ad 100644 --- a/agreement/msgp_gen_test.go +++ b/agreement/msgp_gen_test.go @@ -8,9 +8,10 @@ package agreement import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalCertificate(t *testing.T) { diff --git a/compactcert/msgp_gen_test.go b/compactcert/msgp_gen_test.go index 52cbb5a3e4..0f206656e1 100644 --- a/compactcert/msgp_gen_test.go +++ b/compactcert/msgp_gen_test.go @@ -8,9 +8,10 @@ package compactcert import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalsigFromAddr(t *testing.T) { diff --git a/crypto/compactcert/msgp_gen_test.go b/crypto/compactcert/msgp_gen_test.go index f2a43f572d..1e682b46e5 100644 --- a/crypto/compactcert/msgp_gen_test.go +++ b/crypto/compactcert/msgp_gen_test.go @@ -8,9 +8,10 @@ package compactcert import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalCert(t *testing.T) { diff --git a/crypto/merklearray/msgp_gen.go b/crypto/merklearray/msgp_gen.go index 344e7b86d2..ba7e4a61c7 100644 --- a/crypto/merklearray/msgp_gen.go +++ b/crypto/merklearray/msgp_gen.go @@ -3,8 +3,9 @@ package merklearray // Code generated by github.com/algorand/msgp DO NOT EDIT. import ( - "github.com/algorand/go-algorand/crypto" "github.com/algorand/msgp/msgp" + + "github.com/algorand/go-algorand/crypto" ) // The following msgp objects are implemented in this file: diff --git a/crypto/merklearray/msgp_gen_test.go b/crypto/merklearray/msgp_gen_test.go index 7715f75df3..2b50c643b4 100644 --- a/crypto/merklearray/msgp_gen_test.go +++ b/crypto/merklearray/msgp_gen_test.go @@ -8,9 +8,10 @@ package merklearray import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalLayer(t *testing.T) { diff --git a/crypto/merklesignature/msgp_gen.go b/crypto/merklesignature/msgp_gen.go index c97e0df408..a40196d4a6 100644 --- a/crypto/merklesignature/msgp_gen.go +++ b/crypto/merklesignature/msgp_gen.go @@ -3,8 +3,9 @@ package merklesignature // Code generated by github.com/algorand/msgp DO NOT EDIT. import ( - "github.com/algorand/go-algorand/crypto" "github.com/algorand/msgp/msgp" + + "github.com/algorand/go-algorand/crypto" ) // The following msgp objects are implemented in this file: diff --git a/crypto/merklesignature/msgp_gen_test.go b/crypto/merklesignature/msgp_gen_test.go index 3ea42c77f0..56c8e2bdf3 100644 --- a/crypto/merklesignature/msgp_gen_test.go +++ b/crypto/merklesignature/msgp_gen_test.go @@ -8,9 +8,10 @@ package merklesignature import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalKeyRoundPair(t *testing.T) { diff --git a/crypto/msgp_gen_test.go b/crypto/msgp_gen_test.go index 8a74a2852a..b3fb95150b 100644 --- a/crypto/msgp_gen_test.go +++ b/crypto/msgp_gen_test.go @@ -8,9 +8,10 @@ package crypto import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalDigest(t *testing.T) { diff --git a/daemon/algod/api/spec/v2/msgp_gen.go b/daemon/algod/api/spec/v2/msgp_gen.go index 48590fd11d..b14d47b792 100644 --- a/daemon/algod/api/spec/v2/msgp_gen.go +++ b/daemon/algod/api/spec/v2/msgp_gen.go @@ -3,8 +3,9 @@ package v2 // Code generated by github.com/algorand/msgp DO NOT EDIT. import ( - "github.com/algorand/go-algorand/data/basics" "github.com/algorand/msgp/msgp" + + "github.com/algorand/go-algorand/data/basics" ) // The following msgp objects are implemented in this file: diff --git a/daemon/algod/api/spec/v2/msgp_gen_test.go b/daemon/algod/api/spec/v2/msgp_gen_test.go index 2d3a842a22..2fc11278d5 100644 --- a/daemon/algod/api/spec/v2/msgp_gen_test.go +++ b/daemon/algod/api/spec/v2/msgp_gen_test.go @@ -8,9 +8,10 @@ package v2 import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalAccountApplicationModel(t *testing.T) { diff --git a/data/account/msgp_gen.go b/data/account/msgp_gen.go index e9c3a521a4..5fa8daa6e5 100644 --- a/data/account/msgp_gen.go +++ b/data/account/msgp_gen.go @@ -3,8 +3,9 @@ package account // Code generated by github.com/algorand/msgp DO NOT EDIT. import ( - "github.com/algorand/go-algorand/crypto/merklesignature" "github.com/algorand/msgp/msgp" + + "github.com/algorand/go-algorand/crypto/merklesignature" ) // The following msgp objects are implemented in this file: diff --git a/data/account/msgp_gen_test.go b/data/account/msgp_gen_test.go index ae68f3769f..380e391fc3 100644 --- a/data/account/msgp_gen_test.go +++ b/data/account/msgp_gen_test.go @@ -8,9 +8,10 @@ package account import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalParticipationKeyIdentity(t *testing.T) { diff --git a/data/basics/msgp_gen.go b/data/basics/msgp_gen.go index f16d67caf6..53bcc659f1 100644 --- a/data/basics/msgp_gen.go +++ b/data/basics/msgp_gen.go @@ -5,9 +5,10 @@ package basics import ( "sort" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" - "github.com/algorand/msgp/msgp" ) // The following msgp objects are implemented in this file: diff --git a/data/basics/msgp_gen_test.go b/data/basics/msgp_gen_test.go index 90f62698a0..c5e0f3d4a5 100644 --- a/data/basics/msgp_gen_test.go +++ b/data/basics/msgp_gen_test.go @@ -8,9 +8,10 @@ package basics import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalAccountData(t *testing.T) { diff --git a/data/bookkeeping/msgp_gen.go b/data/bookkeeping/msgp_gen.go index fdc36e398c..0e994fcff4 100644 --- a/data/bookkeeping/msgp_gen.go +++ b/data/bookkeeping/msgp_gen.go @@ -5,11 +5,12 @@ package bookkeeping import ( "sort" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" "github.com/algorand/go-algorand/protocol" - "github.com/algorand/msgp/msgp" ) // The following msgp objects are implemented in this file: @@ -407,17 +408,17 @@ func (z *Block) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0004 > 0 { zb0004-- - bts, err = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -679,18 +680,18 @@ func (z *Block) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } - case "txn256": - bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).BlockHeader.TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "ts": (*z).BlockHeader.TimeStamp, bts, err = msgp.ReadInt64Bytes(bts) if err != nil { @@ -886,7 +887,7 @@ func (_ *Block) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *Block) Msgsize() (s int) { - s = 3 + 4 + (*z).BlockHeader.Round.Msgsize() + 5 + (*z).BlockHeader.Branch.Msgsize() + 5 + (*z).BlockHeader.Seed.Msgsize() + 7 + (*z).BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).BlockHeader.GenesisID) + 3 + (*z).BlockHeader.GenesisHash.Msgsize() + 5 + (*z).BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).BlockHeader.Round.Msgsize() + 5 + (*z).BlockHeader.Branch.Msgsize() + 5 + (*z).BlockHeader.Seed.Msgsize() + 4 + (*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.Msgsize() + 7 + (*z).BlockHeader.TxnCommitments.Sha256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).BlockHeader.GenesisID) + 3 + (*z).BlockHeader.GenesisHash.Msgsize() + 5 + (*z).BlockHeader.RewardsState.FeeSink.Msgsize() + 4 + (*z).BlockHeader.RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).BlockHeader.RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).BlockHeader.UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).BlockHeader.UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).BlockHeader.UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).BlockHeader.UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).BlockHeader.CompactCert != nil { for zb0001, zb0002 := range (*z).BlockHeader.CompactCert { _ = zb0001 @@ -904,7 +905,7 @@ func (z *Block) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *Block) MsgIsZero() bool { - return ((*z).BlockHeader.Round.MsgIsZero()) && ((*z).BlockHeader.Branch.MsgIsZero()) && ((*z).BlockHeader.Seed.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).BlockHeader.TimeStamp == 0) && ((*z).BlockHeader.GenesisID == "") && ((*z).BlockHeader.GenesisHash.MsgIsZero()) && ((*z).BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).BlockHeader.RewardsState.RewardsRate == 0) && ((*z).BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).BlockHeader.TxnCounter == 0) && (len((*z).BlockHeader.CompactCert) == 0) && (len((*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Payset.MsgIsZero()) + return ((*z).BlockHeader.Round.MsgIsZero()) && ((*z).BlockHeader.Branch.MsgIsZero()) && ((*z).BlockHeader.Seed.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).BlockHeader.TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).BlockHeader.TimeStamp == 0) && ((*z).BlockHeader.GenesisID == "") && ((*z).BlockHeader.GenesisHash.MsgIsZero()) && ((*z).BlockHeader.RewardsState.FeeSink.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsPool.MsgIsZero()) && ((*z).BlockHeader.RewardsState.RewardsLevel == 0) && ((*z).BlockHeader.RewardsState.RewardsRate == 0) && ((*z).BlockHeader.RewardsState.RewardsResidue == 0) && ((*z).BlockHeader.RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocol.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolApprovals == 0) && ((*z).BlockHeader.UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).BlockHeader.UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).BlockHeader.UpgradeVote.UpgradeApprove == false) && ((*z).BlockHeader.TxnCounter == 0) && (len((*z).BlockHeader.CompactCert) == 0) && (len((*z).BlockHeader.ParticipationUpdates.ExpiredParticipationAccounts) == 0) && ((*z).Payset.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler @@ -1239,17 +1240,17 @@ func (z *BlockHeader) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0004 > 0 { zb0004-- - bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0004 > 0 { zb0004-- - bts, err = (*z).TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -1503,18 +1504,18 @@ func (z *BlockHeader) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Seed") return } - case "txn256": - bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).TxnCommitments.NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).TxnCommitments.Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } case "ts": (*z).TimeStamp, bts, err = msgp.ReadInt64Bytes(bts) if err != nil { @@ -1704,7 +1705,7 @@ func (_ *BlockHeader) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *BlockHeader) Msgsize() (s int) { - s = 3 + 4 + (*z).Round.Msgsize() + 5 + (*z).Branch.Msgsize() + 5 + (*z).Seed.Msgsize() + 7 + (*z).TxnCommitments.Sha256Commitment.Msgsize() + 4 + (*z).TxnCommitments.NativeSha512_256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 5 + (*z).RewardsState.FeeSink.Msgsize() + 4 + (*z).RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize + s = 3 + 4 + (*z).Round.Msgsize() + 5 + (*z).Branch.Msgsize() + 5 + (*z).Seed.Msgsize() + 4 + (*z).TxnCommitments.NativeSha512_256Commitment.Msgsize() + 7 + (*z).TxnCommitments.Sha256Commitment.Msgsize() + 3 + msgp.Int64Size + 4 + msgp.StringPrefixSize + len((*z).GenesisID) + 3 + (*z).GenesisHash.Msgsize() + 5 + (*z).RewardsState.FeeSink.Msgsize() + 4 + (*z).RewardsState.RewardsPool.Msgsize() + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 5 + msgp.Uint64Size + 7 + (*z).RewardsState.RewardsRecalculationRound.Msgsize() + 6 + (*z).UpgradeState.CurrentProtocol.Msgsize() + 10 + (*z).UpgradeState.NextProtocol.Msgsize() + 8 + msgp.Uint64Size + 11 + (*z).UpgradeState.NextProtocolVoteBefore.Msgsize() + 11 + (*z).UpgradeState.NextProtocolSwitchOn.Msgsize() + 12 + (*z).UpgradeVote.UpgradePropose.Msgsize() + 13 + (*z).UpgradeVote.UpgradeDelay.Msgsize() + 11 + msgp.BoolSize + 3 + msgp.Uint64Size + 3 + msgp.MapHeaderSize if (*z).CompactCert != nil { for zb0001, zb0002 := range (*z).CompactCert { _ = zb0001 @@ -1721,7 +1722,7 @@ func (z *BlockHeader) Msgsize() (s int) { // MsgIsZero returns whether this is a zero value func (z *BlockHeader) MsgIsZero() bool { - return ((*z).Round.MsgIsZero()) && ((*z).Branch.MsgIsZero()) && ((*z).Seed.MsgIsZero()) && ((*z).TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).TimeStamp == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).RewardsState.FeeSink.MsgIsZero()) && ((*z).RewardsState.RewardsPool.MsgIsZero()) && ((*z).RewardsState.RewardsLevel == 0) && ((*z).RewardsState.RewardsRate == 0) && ((*z).RewardsState.RewardsResidue == 0) && ((*z).RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocolApprovals == 0) && ((*z).UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).UpgradeVote.UpgradeApprove == false) && ((*z).TxnCounter == 0) && (len((*z).CompactCert) == 0) && (len((*z).ParticipationUpdates.ExpiredParticipationAccounts) == 0) + return ((*z).Round.MsgIsZero()) && ((*z).Branch.MsgIsZero()) && ((*z).Seed.MsgIsZero()) && ((*z).TxnCommitments.NativeSha512_256Commitment.MsgIsZero()) && ((*z).TxnCommitments.Sha256Commitment.MsgIsZero()) && ((*z).TimeStamp == 0) && ((*z).GenesisID == "") && ((*z).GenesisHash.MsgIsZero()) && ((*z).RewardsState.FeeSink.MsgIsZero()) && ((*z).RewardsState.RewardsPool.MsgIsZero()) && ((*z).RewardsState.RewardsLevel == 0) && ((*z).RewardsState.RewardsRate == 0) && ((*z).RewardsState.RewardsResidue == 0) && ((*z).RewardsState.RewardsRecalculationRound.MsgIsZero()) && ((*z).UpgradeState.CurrentProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocol.MsgIsZero()) && ((*z).UpgradeState.NextProtocolApprovals == 0) && ((*z).UpgradeState.NextProtocolVoteBefore.MsgIsZero()) && ((*z).UpgradeState.NextProtocolSwitchOn.MsgIsZero()) && ((*z).UpgradeVote.UpgradePropose.MsgIsZero()) && ((*z).UpgradeVote.UpgradeDelay.MsgIsZero()) && ((*z).UpgradeVote.UpgradeApprove == false) && ((*z).TxnCounter == 0) && (len((*z).CompactCert) == 0) && (len((*z).ParticipationUpdates.ExpiredParticipationAccounts) == 0) } // MarshalMsg implements msgp.Marshaler @@ -2777,17 +2778,17 @@ func (z *TxnCommitments) UnmarshalMsg(bts []byte) (o []byte, err error) { } if zb0001 > 0 { zb0001-- - bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) + bts, err = (*z).NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") + err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") return } } if zb0001 > 0 { zb0001-- - bts, err = (*z).NativeSha512_256Commitment.UnmarshalMsg(bts) + bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) if err != nil { - err = msgp.WrapError(err, "struct-from-array", "NativeSha512_256Commitment") + err = msgp.WrapError(err, "struct-from-array", "Sha256Commitment") return } } @@ -2814,18 +2815,18 @@ func (z *TxnCommitments) UnmarshalMsg(bts []byte) (o []byte, err error) { return } switch string(field) { - case "txn256": - bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) - if err != nil { - err = msgp.WrapError(err, "Sha256Commitment") - return - } case "txn": bts, err = (*z).NativeSha512_256Commitment.UnmarshalMsg(bts) if err != nil { err = msgp.WrapError(err, "NativeSha512_256Commitment") return } + case "txn256": + bts, err = (*z).Sha256Commitment.UnmarshalMsg(bts) + if err != nil { + err = msgp.WrapError(err, "Sha256Commitment") + return + } default: err = msgp.ErrNoField(string(field)) if err != nil { @@ -2846,13 +2847,13 @@ func (_ *TxnCommitments) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *TxnCommitments) Msgsize() (s int) { - s = 1 + 7 + (*z).Sha256Commitment.Msgsize() + 4 + (*z).NativeSha512_256Commitment.Msgsize() + s = 1 + 4 + (*z).NativeSha512_256Commitment.Msgsize() + 7 + (*z).Sha256Commitment.Msgsize() return } // MsgIsZero returns whether this is a zero value func (z *TxnCommitments) MsgIsZero() bool { - return ((*z).Sha256Commitment.MsgIsZero()) && ((*z).NativeSha512_256Commitment.MsgIsZero()) + return ((*z).NativeSha512_256Commitment.MsgIsZero()) && ((*z).Sha256Commitment.MsgIsZero()) } // MarshalMsg implements msgp.Marshaler diff --git a/data/bookkeeping/msgp_gen_test.go b/data/bookkeeping/msgp_gen_test.go index da143fa56f..cdf62e5c7a 100644 --- a/data/bookkeeping/msgp_gen_test.go +++ b/data/bookkeeping/msgp_gen_test.go @@ -8,9 +8,10 @@ package bookkeeping import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalBlock(t *testing.T) { diff --git a/data/committee/msgp_gen_test.go b/data/committee/msgp_gen_test.go index 084952c31c..fc6b79ce76 100644 --- a/data/committee/msgp_gen_test.go +++ b/data/committee/msgp_gen_test.go @@ -8,9 +8,10 @@ package committee import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalCredential(t *testing.T) { diff --git a/data/hashable/msgp_gen_test.go b/data/hashable/msgp_gen_test.go index 429712bd87..50178fac0e 100644 --- a/data/hashable/msgp_gen_test.go +++ b/data/hashable/msgp_gen_test.go @@ -8,9 +8,10 @@ package hashable import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalMessage(t *testing.T) { diff --git a/data/transactions/msgp_gen.go b/data/transactions/msgp_gen.go index 381c032c27..299d4da243 100644 --- a/data/transactions/msgp_gen.go +++ b/data/transactions/msgp_gen.go @@ -5,10 +5,11 @@ package transactions import ( "sort" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/crypto" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/msgp/msgp" ) // The following msgp objects are implemented in this file: diff --git a/data/transactions/msgp_gen_test.go b/data/transactions/msgp_gen_test.go index 0a916da82a..daf552f982 100644 --- a/data/transactions/msgp_gen_test.go +++ b/data/transactions/msgp_gen_test.go @@ -8,9 +8,10 @@ package transactions import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalApplicationCallTxnFields(t *testing.T) { diff --git a/go.mod b/go.mod index b037dcf81a..d9a52951fc 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/algorand/go-deadlock v0.2.2 github.com/algorand/go-sumhash v0.1.0 github.com/algorand/graphtrace v0.1.0 - github.com/algorand/msgp v1.1.51 + github.com/algorand/msgp v1.1.52 github.com/algorand/oapi-codegen v1.3.7 github.com/algorand/websocket v1.4.5 github.com/aws/aws-sdk-go v1.16.5 diff --git a/go.sum b/go.sum index dad920e278..1c807fefb1 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/algorand/go-sumhash v0.1.0 h1:b/QRhyLuF//vOcicBIxBXYW8bERNoeLxieht/dU github.com/algorand/go-sumhash v0.1.0/go.mod h1:OOe7jdDWUhLkuP1XytkK5gnLu9entAviN5DfDZh6XAc= github.com/algorand/graphtrace v0.1.0 h1:QemP1iT0W56SExD0NfiU6rsG34/v0Je6bg5UZnptEUM= github.com/algorand/graphtrace v0.1.0/go.mod h1:HscLQrzBdH1BH+5oehs3ICd8SYcXvnSL9BjfTu8WHCc= -github.com/algorand/msgp v1.1.51 h1:0Z8qXlSPMPmODjpqzvIhBENrbLcrf1eJPRnKgLlrcxM= -github.com/algorand/msgp v1.1.51/go.mod h1:5K3d58/poT5fPmtiwuQft6GjgSrVEM46KoXdLrID8ZU= +github.com/algorand/msgp v1.1.52 h1:Tw2OCCikKy0jaTWEIHwIfvThYHlJf9moviyKw+7PVVM= +github.com/algorand/msgp v1.1.52/go.mod h1:5K3d58/poT5fPmtiwuQft6GjgSrVEM46KoXdLrID8ZU= github.com/algorand/oapi-codegen v1.3.7 h1:TdXeGljgrnLXSCGPdeY6g6+i/G0Rr5CkjBgUJY6ht48= github.com/algorand/oapi-codegen v1.3.7/go.mod h1:UvOtAiP3hc0M2GUKBnZVTjLe3HKGDKh6y9rs3e3JyOg= github.com/algorand/websocket v1.4.5 h1:Cs6UTaCReAl02evYxmN8k57cNHmBILRcspfSxYg4AJE= diff --git a/ledger/ledgercore/msgp_gen_test.go b/ledger/ledgercore/msgp_gen_test.go index dbb017a491..3dc6a7409e 100644 --- a/ledger/ledgercore/msgp_gen_test.go +++ b/ledger/ledgercore/msgp_gen_test.go @@ -8,9 +8,10 @@ package ledgercore import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalAccountTotals(t *testing.T) { diff --git a/ledger/msgp_gen.go b/ledger/msgp_gen.go index 5e0a025671..31c0c8224b 100644 --- a/ledger/msgp_gen.go +++ b/ledger/msgp_gen.go @@ -5,9 +5,10 @@ package ledger import ( "sort" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" - "github.com/algorand/msgp/msgp" ) // The following msgp objects are implemented in this file: diff --git a/ledger/msgp_gen_test.go b/ledger/msgp_gen_test.go index fb1dac5a29..140b1e8827 100644 --- a/ledger/msgp_gen_test.go +++ b/ledger/msgp_gen_test.go @@ -8,9 +8,10 @@ package ledger import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalCatchpointFileHeader(t *testing.T) { diff --git a/node/msgp_gen_test.go b/node/msgp_gen_test.go index bbfb4732a3..46590cb228 100644 --- a/node/msgp_gen_test.go +++ b/node/msgp_gen_test.go @@ -8,9 +8,10 @@ package node import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalnetPrioResponse(t *testing.T) { diff --git a/protocol/test/msgp_gen_test.go b/protocol/test/msgp_gen_test.go index 6704fc95bb..7ee90531d1 100644 --- a/protocol/test/msgp_gen_test.go +++ b/protocol/test/msgp_gen_test.go @@ -8,9 +8,10 @@ package test import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshaltestSlice(t *testing.T) { diff --git a/rpcs/msgp_gen_test.go b/rpcs/msgp_gen_test.go index 58d5d0de6c..d88b73039b 100644 --- a/rpcs/msgp_gen_test.go +++ b/rpcs/msgp_gen_test.go @@ -8,9 +8,10 @@ package rpcs import ( "testing" + "github.com/algorand/msgp/msgp" + "github.com/algorand/go-algorand/protocol" "github.com/algorand/go-algorand/test/partitiontest" - "github.com/algorand/msgp/msgp" ) func TestMarshalUnmarshalEncodedBlockCert(t *testing.T) { diff --git a/scripts/buildtools/go.mod b/scripts/buildtools/go.mod deleted file mode 100644 index 96142dc63c..0000000000 --- a/scripts/buildtools/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/algorand/go-algorand/scripts/buildtools - -go 1.17 - -require ( - github.com/algorand/msgp v1.1.50 - github.com/algorand/oapi-codegen v1.3.7 - github.com/go-swagger/go-swagger v0.25.0 - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/tools v0.1.1 // indirect - gotest.tools/gotestsum v1.6.4 -) diff --git a/scripts/buildtools/go.sum b/scripts/buildtools/go.sum deleted file mode 100644 index bf37828f37..0000000000 --- a/scripts/buildtools/go.sum +++ /dev/null @@ -1,630 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/algorand/msgp v1.1.50 h1:Mvsjs5LCE6HsXXbwJXD8ol1Y+c+QMoFNM4j0CY+mFGo= -github.com/algorand/msgp v1.1.50/go.mod h1:R5sJrW9krk4YwNo+rs82Kq6V55q/zNgACwWqt3sQBM4= -github.com/algorand/oapi-codegen v1.3.7 h1:TdXeGljgrnLXSCGPdeY6g6+i/G0Rr5CkjBgUJY6ht48= -github.com/algorand/oapi-codegen v1.3.7/go.mod h1:UvOtAiP3hc0M2GUKBnZVTjLe3HKGDKh6y9rs3e3JyOg= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY= -github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyberdelia/templates v0.0.0-20191230040416-20a325f050d4/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= -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= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= -github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= -github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/getkin/kin-openapi v0.3.1 h1:9mLtayAmieqUnNACL0HqHbxkTc+z1+15sxXpLoJOGEQ= -github.com/getkin/kin-openapi v0.3.1/go.mod h1:W8dhxZgpE84ciM+VIItFqkmZ4eHtuomrdIHtASQIqi0= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-chi/chi v4.1.1+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= -github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= -github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= -github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= -github.com/go-openapi/analysis v0.19.10 h1:5BHISBAXOc/aJK25irLZnx2D3s6WyYaY9D4gmuz9fdE= -github.com/go-openapi/analysis v0.19.10/go.mod h1:qmhS3VNFxBlquFJ0RGoDtylO9y4pgTAUNE9AEEMdlJQ= -github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= -github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= -github.com/go-openapi/errors v0.19.6 h1:xZMThgv5SQ7SMbWtKFkCf9bBdvR2iEyw9k3zGZONuys= -github.com/go-openapi/errors v0.19.6/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= -github.com/go-openapi/inflect v0.19.0 h1:9jCH9scKIbHeV9m12SmPilScz6krDxKRasNNSNPXu/4= -github.com/go-openapi/inflect v0.19.0/go.mod h1:lHpZVlpIQqLyKwJ4N+YSc9hchQy/i12fJykb83CRBH4= -github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.4 h1:3Vw+rh13uq2JFNxgnMTGE1rnoieU9FmyE1gvnyylsYg= -github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= -github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= -github.com/go-openapi/loads v0.19.3/go.mod h1:YVfqhUCdahYwR3f3iiwQLhicVRvLlU/WO5WPaZvcvSI= -github.com/go-openapi/loads v0.19.5 h1:jZVYWawIQiA1NBnHla28ktg6hrcfTHsCE+3QLVRBIls= -github.com/go-openapi/loads v0.19.5/go.mod h1:dswLCAdonkRufe/gSUC3gN8nTSaB9uaS2es0x5/IbjY= -github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= -github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= -github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= -github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= -github.com/go-openapi/runtime v0.19.20 h1:J/t+QIjbcoq8WJvjGxRKiFBhqUE8slS9SbmD0Oi/raQ= -github.com/go-openapi/runtime v0.19.20/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= -github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= -github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/spec v0.19.8 h1:qAdZLh1r6QF/hI/gTq+TJTvsQUodZsM7KLqkAJdiJNg= -github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= -github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= -github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= -github.com/go-openapi/strfmt v0.19.4/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/strfmt v0.19.5 h1:0utjKrw+BAh8s57XE9Xz8DUBsVvPmRUB6styvl9wWIM= -github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= -github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/swag v0.19.9 h1:1IxuqvBUU3S2Bi4YC7tlP9SJF1gVpCvqN0T2Qof4azE= -github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= -github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= -github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= -github.com/go-openapi/validate v0.19.10 h1:tG3SZ5DC5KF4cyt7nqLVcQXGj5A7mpaYkAcNPlDK+Yk= -github.com/go-openapi/validate v0.19.10/go.mod h1:RKEZTUWDkxKQxN2jDT7ZnZi2bhZlbNMAuKvKB+IaGx8= -github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-swagger/go-swagger v0.25.0 h1:FxhyrWWV8V/A9P6GtI5szWordAdbb6Y0nqdY/y9So2w= -github.com/go-swagger/go-swagger v0.25.0/go.mod h1:9639ioXrPX9E6BbnbaDklGXjNz7upAXoNBwL4Ok11Vk= -github.com/go-swagger/scan-repo-boundary v0.0.0-20180623220736-973b3573c013/go.mod h1:b65mBPzqzZWxOZGxSWrqs4GInLIn+u99Q9q7p+GKni0= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= -github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= -github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg= -github.com/gobuffalo/envy v1.6.15/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/flect v0.1.0/go.mod h1:d2ehjJqGOH/Kjqcoz+F7jHTBbmDb38yXA598Hb50EGs= -github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI= -github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk= -github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28= -github.com/gobuffalo/genny v0.1.0/go.mod h1:XidbUqzak3lHdS//TPu2OgiFB+51Ur5f7CSnXZ/JDvo= -github.com/gobuffalo/genny v0.1.1/go.mod h1:5TExbEyY48pfunL4QSXxlDOmdsD44RRq4mVZ0Ex28Xk= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211/go.mod h1:vEHJk/E9DmhejeLeNt7UVvlSGv3ziL+djtTr3yyzcOw= -github.com/gobuffalo/gogen v0.0.0-20190315121717-8f38393713f5/go.mod h1:V9QVDIxsgKNZs6L2IYiGR8datgMhB577vzTDqypH360= -github.com/gobuffalo/gogen v0.1.0/go.mod h1:8NTelM5qd8RZ15VjQTFkAW6qOMx5wBbW4dSCS3BY8gg= -github.com/gobuffalo/gogen v0.1.1/go.mod h1:y8iBtmHmGc4qa3urIyo1shvOD8JftTtfcKi+71xfDNE= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2/go.mod h1:QdxcLw541hSGtBnhUc4gaNIXRjiDppFGaDqzbrBd3v8= -github.com/gobuffalo/mapi v1.0.1/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/mapi v1.0.2/go.mod h1:4VAGh89y6rVOvm5A8fKFxYG+wIW6LO1FMTG9hnKStFc= -github.com/gobuffalo/packd v0.0.0-20190315124812-a385830c7fc0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWeG2RIxq4= -github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= -github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= -github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= -github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.1.16 h1:8swiwjE5Jkai3RPfZoahp8kjVCRNq+y7Q0hPji2Kz0o= -github.com/labstack/echo/v4 v4.1.16/go.mod h1:awO+5TzAjvL8XpibdsfXxPgHr+orhtXZJZIQCVjogKI= -github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= -github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matryer/moq v0.0.0-20200310130814-7721994d1b54/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.3.2 h1:mRS76wmkOn3KkKAyXDu42V+6ebnXWIztFSYGN7GeoRg= -github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.4.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= -github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.3.2 h1:GDarE4TJQI52kYSbSAmLiId1Elfj+xgSDqrUZxFhxlU= -github.com/spf13/afero v1.3.2/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/toqueteos/webbrowser v1.2.0 h1:tVP/gpK69Fx+qMJKsLE7TD8LuGWPnEV71wBN9rrstGQ= -github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31 h1:OXcKh35JaYsGMRzpvFkLv/MEyPuL49CThT1pZ8aSml4= -github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= -github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= -go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= -go.mongodb.org/mongo-driver v1.3.5 h1:S0ZOruh4YGHjD7JoN7mIsTrNjnQbOjrmgrx6l6pZN7I= -go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899 h1:DZhuSZLsGlFL4CmhA8BcRA0mnthyA/nZ00AqCUo7vHg= -golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200413165638-669c56c373c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190617190820-da514acc4774/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200423205358-59e73619c742/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/gotestsum v1.6.4 h1:HFkapG0hK/HWiOxWS78SbR/JK5EpbH8hFzUuCvvfbfQ= -gotest.tools/gotestsum v1.6.4/go.mod h1:fTR9ZhxC/TLAAx2/WMk/m3TkMB9eEI89gdEzhiRVJT8= -gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/scripts/buildtools/install_buildtools.sh b/scripts/buildtools/install_buildtools.sh index edd346b383..2e0db63537 100755 --- a/scripts/buildtools/install_buildtools.sh +++ b/scripts/buildtools/install_buildtools.sh @@ -53,7 +53,7 @@ cd ${SCRIPTPATH} function get_go_version { cd "${SCRIPTPATH}" - VERSION=$( grep "$1" 2>/dev/null < ./go.mod | awk -F " " '{print $2}') + VERSION=$( grep "$1" 2>/dev/null < ./versions | awk -F " " '{print $2}') echo "$VERSION" return } @@ -67,11 +67,11 @@ function install_go_module { MODULE=$1 fi - # Check for version to go.mod version + # Check for version VERSION=$(get_go_version "$1") if [ -z "$VERSION" ]; then - echo "Unable to install requested package '$1' (${MODULE}): no version listed in ${SCRIPTPATH}/go.mod" + echo "Unable to install requested package '$1' (${MODULE}): no version listed in ${SCRIPTPATH}/versions" exit 1 else OUTPUT=$(go install "${MODULE}@${VERSION}" 2>&1) diff --git a/scripts/buildtools/versions b/scripts/buildtools/versions new file mode 100644 index 0000000000..c5a247b036 --- /dev/null +++ b/scripts/buildtools/versions @@ -0,0 +1,6 @@ +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 +golang.org/x/tools v0.1.5 +github.com/algorand/msgp v1.1.52 +github.com/algorand/oapi-codegen v1.3.7 +github.com/go-swagger/go-swagger v0.25.0 +gotest.tools/gotestsum v1.6.4 diff --git a/scripts/travis/codegen_verification.sh b/scripts/travis/codegen_verification.sh index d8af12231f..53c3fee2fb 100755 --- a/scripts/travis/codegen_verification.sh +++ b/scripts/travis/codegen_verification.sh @@ -84,11 +84,14 @@ echo "Regenerate REST server" touch daemon/algod/api/algod.oas2.json make -C daemon/algod/api generate +echo "Regenerate msgp files" +make msgp + echo Checking Enlistment... if [[ -n $(git status --porcelain) ]]; then echo Enlistment is dirty - did you forget to run make? git status -s - git diff + git --no-pager diff exit 1 else echo Enlistment is clean From 84554035f983bd1409fa204db58ee3ef8421a203 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Wed, 18 May 2022 10:36:44 -0400 Subject: [PATCH 16/34] CI: add simple codecov config (#3997) * add simple codecov config * add patch to .codecov.yml --- .codecov.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 0000000000..def78dc007 --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,18 @@ +codecov: + require_ci_to_pass: yes + +ignore: + - "**/*_gen.go" + - "**/*_gen_test.go" + - "**/generated" + +coverage: + status: + project: + default: + target: auto + informational: true + patch: + default: + target: auto + informational: true From aae5ef280452c3f7ba8b3fea16463066aed784ce Mon Sep 17 00:00:00 2001 From: Ganesh Vanahalli Date: Wed, 18 May 2022 14:42:18 -0400 Subject: [PATCH 17/34] added -v flag to algokey (#4004) --- cmd/algokey/main.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmd/algokey/main.go b/cmd/algokey/main.go index 8182c35f8b..450253e566 100644 --- a/cmd/algokey/main.go +++ b/cmd/algokey/main.go @@ -22,13 +22,21 @@ import ( "github.com/spf13/cobra" "github.com/spf13/cobra/doc" + + "github.com/algorand/go-algorand/config" ) +var versionCheck bool + var rootCmd = &cobra.Command{ Use: "algokey", Short: "CLI for managing Algorand keys", Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { + if versionCheck { + fmt.Println(config.FormatVersionAndLicense()) + return + } // If no arguments passed, we should fallback to help cmd.HelpFunc()(cmd, args) }, @@ -41,6 +49,7 @@ func init() { rootCmd.AddCommand(signCmd) rootCmd.AddCommand(multisigCmd) rootCmd.AddCommand(partCmd) + rootCmd.Flags().BoolVarP(&versionCheck, "version", "v", false, "Display and write current build version and exit") } func main() { From 8bd8ab638214430c314c51a7869e0c874163360f Mon Sep 17 00:00:00 2001 From: algochoi <86622919+algochoi@users.noreply.github.com> Date: Thu, 19 May 2022 14:08:58 -0400 Subject: [PATCH 18/34] Tools: Add benchmark warnings for PRs and push graphs for commits into master (#3998) --- .github/workflows/README.md | 26 ++++++++++++++++ .github/workflows/benchmarks.yml | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/benchmarks.yml diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000000..e1c3fa8477 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,26 @@ +# Github Actions Workflows + +## Benchmarking Performance Tests +`benchmarks.yml` contains a workflow to check for any performance regressions or +improvements in benchmark tests. + +It uses +[github-action-benchmark](https://github.com/benchmark-action/github-action-benchmark) +to check performance diffs between a PR and the `master` branch, comments if it +there is a regression past a certain threshold (default: `200%`), and generates +a performance diff JSON between consecutive commits in the `master` branch in +the `gh-pages` branch (the JSON is visualized into a graph that can be seen at: +https://algorand.github.io/go-algorand/dev/bench/). + +### Adding benchmark tests +Add run steps or extend existing benchmark invocations in the `Run benchmark` +step. Additional benchmarks can be run using the `-bench` flag. Since there's +few benchmarks run by the workflow, there are _no_ formal groupings and/or +naming conventions. + +### CI Variance +There may be some variance between runs because github actions might spin up a +different machine each time (e.g. Intel Xeon 8370C vs 8171M; the latter might +run benchmarks slightly slower). Empirically, the variance seems to be 10~30% +for the most part. Due to this environment variance, the workflow is most +suitable for finding _large_ performance degradations. diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml new file mode 100644 index 0000000000..65c0e90bf2 --- /dev/null +++ b/.github/workflows/benchmarks.yml @@ -0,0 +1,51 @@ +name: "Benchmark workflow" +on: + # Push and update benchmarks when a commit is merged into master. + push: + branches: + - master + # Trigger benchmark test on this PR's commit against master. + pull_request: + branches: + - master +permissions: + # Push benchmark performance graph to gh-pages branch. + contents: write + deployments: write +jobs: + benchmark: + name: Performance regression check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version-file: 'go.mod' + - run: go version + - name: Build go-algorand + run: scripts/travis/build.sh + # BenchmarkUintMath - Serves as a proxy for AVM `eval` performance. + # Performance degradations suggest either or both: (1) op code + # degradation, (2) `eval` degradation. (2) suggests a broader performance + # issue. + - name: Run benchmark + run: go test ./data/transactions/logic -bench 'BenchmarkUintMath' | tee benchmark_output.txt + - name: Push benchmark result to gh-pages branch + if: github.event_name == 'push' + uses: benchmark-action/github-action-benchmark@v1 + with: + name: Go Benchmark + tool: 'go' + output-file-path: benchmark_output.txt + github-token: ${{ secrets.GITHUB_TOKEN }} + auto-push: true + - name: Evaluate benchmark on PR branch + if: github.event.pull_request + uses: benchmark-action/github-action-benchmark@v1 + with: + name: Go Benchmark + tool: 'go' + output-file-path: benchmark_output.txt + github-token: ${{ secrets.GITHUB_TOKEN }} + alert-threshold: '200%' + comment-on-alert: true From d06c9aa33d7cfdf55174dcc76b9465407fb05de9 Mon Sep 17 00:00:00 2001 From: Will Winder Date: Fri, 20 May 2022 17:38:20 -0400 Subject: [PATCH 19/34] use tag to determine channel if possible (#4017) --- scripts/compute_branch.sh | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scripts/compute_branch.sh b/scripts/compute_branch.sh index abfbf472e8..f0ff025d90 100755 --- a/scripts/compute_branch.sh +++ b/scripts/compute_branch.sh @@ -1,7 +1,16 @@ #!/usr/bin/env bash -if [ -z "${TRAVIS_BRANCH}" ]; then - BRANCH=$(git rev-parse --abbrev-ref HEAD) +if [[ -n $(git status --porcelain) ]]; then + # If the branch isn't clean, default to HEAD to match old behavior. + BRANCH="HEAD" +elif [ -z "${TRAVIS_BRANCH}" ]; then + # if there is no travis branch, set based on tag or branch + case "$(git describe --tags)" in + *"beta") BRANCH="rel/beta" ;; + *"stable") BRANCH="rel/stable" ;; + *"nightly") BRANCH="rel/nightly" ;; + *) BRANCH=$(git rev-parse --abbrev-ref HEAD) + esac else BRANCH="${TRAVIS_BRANCH}" fi From 4a922c405f6847854e569a2624c97b7549078091 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Sat, 21 May 2022 23:38:15 -0400 Subject: [PATCH 20/34] base64_decode can decode padded or unpadded encodings (#4015) --- data/transactions/logic/eval.go | 22 ++++++++++++++++++++-- data/transactions/logic/eval_test.go | 24 +++++++----------------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go index e621ef38e8..2a2614b948 100644 --- a/data/transactions/logic/eval.go +++ b/data/transactions/logic/eval.go @@ -4716,6 +4716,21 @@ func base64Decode(encoded []byte, encoding *base64.Encoding) ([]byte, error) { return decoded[:n], err } +// base64padded returns true iff `encoded` has padding chars at the end +func base64padded(encoded []byte) bool { + for i := len(encoded) - 1; i > 0; i-- { + switch encoded[i] { + case '=': + return true + case '\n', '\r': + /* nothing */ + default: + return false + } + } + return false +} + func opBase64Decode(cx *EvalContext) error { last := len(cx.stack) - 1 encodingField := Base64Encoding(cx.program[cx.pc+1]) @@ -4728,8 +4743,11 @@ func opBase64Decode(cx *EvalContext) error { if encodingField == StdEncoding { encoding = base64.StdEncoding } - encoding = encoding.Strict() - bytes, err := base64Decode(cx.stack[last].Bytes, encoding) + encoded := cx.stack[last].Bytes + if !base64padded(encoded) { + encoding = encoding.WithPadding(base64.NoPadding) + } + bytes, err := base64Decode(encoded, encoding.Strict()) if err != nil { return err } diff --git a/data/transactions/logic/eval_test.go b/data/transactions/logic/eval_test.go index 04b3741eb3..9e54e7b291 100644 --- a/data/transactions/logic/eval_test.go +++ b/data/transactions/logic/eval_test.go @@ -4649,12 +4649,12 @@ By Herman Melville`, "", {"cGFk=", "StdEncoding", "pad", "input byte 4"}, {"cGFk==", "StdEncoding", "pad", "input byte 4"}, {"cGFk===", "StdEncoding", "pad", "input byte 4"}, - // Ensures that even correct padding is illegal if not needed + // Ensures that extra padding, even if 0%4 {"cGFk====", "StdEncoding", "pad", "input byte 4"}, - // Test that padding must be present to make len = 0 mod 4. + // Test that padding must be correct or absent {"bm9wYWQ=", "StdEncoding", "nopad", ""}, - {"bm9wYWQ", "StdEncoding", "nopad", "illegal"}, + {"bm9wYWQ", "StdEncoding", "nopad", ""}, {"bm9wYWQ==", "StdEncoding", "nopad", "illegal"}, {"YWJjMTIzIT8kKiYoKSctPUB+", "StdEncoding", "abc123!?$*&()'-=@~", ""}, @@ -4690,15 +4690,15 @@ By Herman Melville`, "", {"\rS\r\nQ=\n=\r\r\n", "StdEncoding", "I", ""}, {"\rS\r\nQ=\n=\r\r\n", "URLEncoding", "I", ""}, - // Padding necessary? - Yes it is! And exactly the expected place and amount. + // If padding is there, it must be correct, but if absent, that's fine. {"SQ==", "StdEncoding", "I", ""}, {"SQ==", "URLEncoding", "I", ""}, {"S=Q=", "StdEncoding", "", "byte 1"}, {"S=Q=", "URLEncoding", "", "byte 1"}, {"=SQ=", "StdEncoding", "", "byte 0"}, {"=SQ=", "URLEncoding", "", "byte 0"}, - {"SQ", "StdEncoding", "", "byte 0"}, - {"SQ", "URLEncoding", "", "byte 0"}, + {"SQ", "StdEncoding", "I", ""}, + {"SQ", "URLEncoding", "I", ""}, {"SQ=", "StdEncoding", "", "byte 3"}, {"SQ=", "URLEncoding", "", "byte 3"}, {"SQ===", "StdEncoding", "", "byte 4"}, @@ -4721,17 +4721,6 @@ By Herman Melville`, "", if LogicVersion < fidoVersion { testProg(t, source, AssemblerMaxVersion, Expect{0, "unknown opcode..."}) } else { - // sanity check - test the helper function first: - encoding := base64.URLEncoding - if tc.alph == "StdEncoding" { - encoding = base64.StdEncoding - } - encoding = encoding.Strict() - decoded, err := base64Decode([]byte(tc.encoded), encoding) - require.NoError(t, err) - require.Equal(t, string(decoded), tc.decoded) - - // now check eval: testAccepts(t, source, fidoVersion) } } else { @@ -4739,6 +4728,7 @@ By Herman Melville`, "", testProg(t, source, AssemblerMaxVersion, Expect{0, "unknown opcode..."}) } else { err := testPanics(t, source, fidoVersion) + require.Error(t, err) require.Contains(t, err.Error(), tc.error) } } From b3e19e7c5f3bd1d25c624e18dd17f163ff7a8bc8 Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Mon, 23 May 2022 14:40:31 -0400 Subject: [PATCH 21/34] AVM: Allow immutable access to foreign app accounts (#3994) * allow foreign app accounts to be accessed (immutably) --- data/transactions/logic/README.md | 3 + data/transactions/logic/README_in.md | 3 + data/transactions/logic/eval.go | 22 ++- data/transactions/logic/evalAppTxn_test.go | 27 +++ data/transactions/logic/opcodes.go | 5 + ledger/internal/apptxn_test.go | 199 +++++++++++++++++++++ 6 files changed, 253 insertions(+), 6 deletions(-) diff --git a/data/transactions/logic/README.md b/data/transactions/logic/README.md index 96b771f7ca..1b6f228d8c 100644 --- a/data/transactions/logic/README.md +++ b/data/transactions/logic/README.md @@ -180,6 +180,9 @@ _available_. associated account of a contract that was created earlier in the group is _available_. + * Since v7, the account associated with any contract present in the + `txn.ForeignApplications` field is _available_. + ## Constants Constants can be pushed onto the stack in two different ways: diff --git a/data/transactions/logic/README_in.md b/data/transactions/logic/README_in.md index 87b7c15d7e..8464ec2dc7 100644 --- a/data/transactions/logic/README_in.md +++ b/data/transactions/logic/README_in.md @@ -180,6 +180,9 @@ _available_. associated account of a contract that was created earlier in the group is _available_. + * Since v7, the account associated with any contract present in the + `txn.ForeignApplications` field is _available_. + ## Constants Constants can be pushed onto the stack in two different ways: diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go index 2a2614b948..f55b61bc93 100644 --- a/data/transactions/logic/eval.go +++ b/data/transactions/logic/eval.go @@ -3524,12 +3524,12 @@ func opExtract64Bits(cx *EvalContext) error { } // accountReference yields the address and Accounts offset designated by a -// stackValue. If the stackValue is the app account or an account of an app in -// created.apps, and it is not be in the Accounts array, then len(Accounts) + 1 -// is returned as the index. This would let us catch the mistake if the index is -// used for set/del. If the txn somehow "psychically" predicted the address, and -// therefore it IS in txn.Accounts, then happy day, we can set/del it. Return -// the proper index. +// stackValue. If the stackValue is the app account, an account of an app in +// created.apps, or an account of an app in foreignApps, and it is not in the +// Accounts array, then len(Accounts) + 1 is returned as the index. This would +// let us catch the mistake if the index is used for set/del. If the txn somehow +// "psychically" predicted the address, and therefore it IS in txn.Accounts, +// then happy day, we can set/del it. Return the proper index. // If we ever want apps to be able to change local state on these accounts // (which includes this app's own account!), we will need a change to @@ -3558,6 +3558,16 @@ func (cx *EvalContext) accountReference(account stackValue) (basics.Address, uin } } + // Allow an address for an app that was provided in the foreign apps array. + if err != nil && cx.version >= appAddressAvailableVersion { + for _, appID := range cx.txn.Txn.ForeignApps { + foreignAddress := cx.getApplicationAddress(appID) + if addr == foreignAddress { + return addr, invalidIndex, nil + } + } + } + // this app's address is also allowed if err != nil { appAddr := cx.getApplicationAddress(cx.appID) diff --git a/data/transactions/logic/evalAppTxn_test.go b/data/transactions/logic/evalAppTxn_test.go index 7815996e00..f1ae3c40df 100644 --- a/data/transactions/logic/evalAppTxn_test.go +++ b/data/transactions/logic/evalAppTxn_test.go @@ -2907,3 +2907,30 @@ itxn_submit TestApp(t, source, ep, "appl depth (8) exceeded") } + +func TestForeignAppAccountAccess(t *testing.T) { + partitiontest.PartitionTest(t) + + ep, tx, ledger := MakeSampleEnv() + ledger.NewAccount(appAddr(888), 50_000) + tx.ForeignApps = []basics.AppIndex{basics.AppIndex(111)} + + ledger.NewApp(tx.Sender, 111, basics.AppParams{ + ApprovalProgram: TestProg(t, "int 1", AssemblerMaxVersion).Program, + ClearStateProgram: TestProg(t, "int 1", AssemblerMaxVersion).Program, + }) + + TestApp(t, ` +itxn_begin +int pay +itxn_field TypeEnum +int 100 +itxn_field Amount +txn Applications 1 +app_params_get AppAddress +assert +itxn_field Receiver +itxn_submit +int 1 +`, ep) +} diff --git a/data/transactions/logic/opcodes.go b/data/transactions/logic/opcodes.go index a486a8d3d1..2dbb277c54 100644 --- a/data/transactions/logic/opcodes.go +++ b/data/transactions/logic/opcodes.go @@ -57,6 +57,11 @@ const txnEffectsVersion = 6 // the Foreign arrays. const createdResourcesVersion = 6 +// appAddressAvailableVersion is the first version that allows access to the +// accounts of applications that were provided in the foreign apps transaction +// field. +const appAddressAvailableVersion = 7 + // experimental- const fidoVersion = 7 // base64, json, secp256r1 diff --git a/ledger/internal/apptxn_test.go b/ledger/internal/apptxn_test.go index a4d9da8e07..4e2b64c1a3 100644 --- a/ledger/internal/apptxn_test.go +++ b/ledger/internal/apptxn_test.go @@ -3058,3 +3058,202 @@ check: txns(t, l, eval, &fundA, &callA) endBlock(t, l, eval) } + +func TestForeignAppAccountsAccessible(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + testConsensusRange(t, 32, 0, func(t *testing.T, ver int) { + dl := NewDoubleLedger(t, genBalances, consensusByNumber[ver]) + defer dl.Close() + + appA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + } + + appB := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int pay; itxn_field TypeEnum + int 100; itxn_field Amount + txn Applications 1 + app_params_get AppAddress + assert + itxn_field Receiver +itxn_submit +`), + } + + vb := dl.fullBlock(&appA, &appB) + index0 := vb.Block().Payset[0].ApplicationID + index1 := vb.Block().Payset[1].ApplicationID + + fund1 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index1.Address(), + Amount: 1_000_000_000, + } + fund0 := fund1 + fund0.Receiver = index0.Address() + + callTx := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{index0}, + } + + dl.beginBlock() + if ver <= 32 { + dl.txgroup("invalid Account reference", &fund0, &fund1, &callTx) + dl.endBlock() + return + } + + dl.txgroup("", &fund0, &fund1, &callTx) + vb = dl.endBlock() + + require.Equal(t, index0.Address(), vb.Block().Payset[2].EvalDelta.InnerTxns[0].Txn.Receiver) + require.Equal(t, uint64(100), vb.Block().Payset[2].EvalDelta.InnerTxns[0].Txn.Amount.Raw) + }) +} + +// While accounts of foreign apps are available in most contexts, they still +// cannot be used as mutable references; ie the accounts cannot be used by +// opcodes that modify local storage. +func TestForeignAppAccountsImmutable(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + testConsensusRange(t, 32, 0, func(t *testing.T, ver int) { + dl := NewDoubleLedger(t, genBalances, consensusByNumber[ver]) + defer dl.Close() + + appA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + } + + appB := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +txn Applications 1 +app_params_get AppAddress +byte "X" +byte "ABC" +app_local_put +int 1 +`), + } + + vb := dl.fullBlock(&appA, &appB) + index0 := vb.Block().Payset[0].ApplicationID + index1 := vb.Block().Payset[1].ApplicationID + + fund1 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index1.Address(), + Amount: 1_000_000_000, + } + fund0 := fund1 + fund0.Receiver = index0.Address() + + callTx := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{index0}, + } + + dl.beginBlock() + dl.txgroup("invalid Account reference", &fund0, &fund1, &callTx) + dl.endBlock() + }) +} + +// In the case where the foreign app account is also provided in the +// transaction's account field, mutable references should be allowed. +func TestForeignAppAccountsMutable(t *testing.T) { + partitiontest.PartitionTest(t) + + genBalances, addrs, _ := ledgertesting.NewTestGenesis() + testConsensusRange(t, 32, 0, func(t *testing.T, ver int) { + dl := NewDoubleLedger(t, genBalances, consensusByNumber[ver]) + defer dl.Close() + + appA := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +itxn_begin + int appl + itxn_field TypeEnum + txn Applications 1 + itxn_field ApplicationID + int OptIn + itxn_field OnCompletion +itxn_submit +`), + } + + appB := txntest.Txn{ + Type: "appl", + Sender: addrs[0], + ApprovalProgram: main(` +txn OnCompletion +int OptIn +== +bnz done +txn Applications 1 +app_params_get AppAddress +assert +byte "X" +byte "Y" +app_local_put +done: +`), + LocalStateSchema: basics.StateSchema{ + NumByteSlice: 1, + }, + } + + vb := dl.fullBlock(&appA, &appB) + index0 := vb.Block().Payset[0].ApplicationID + index1 := vb.Block().Payset[1].ApplicationID + + fund1 := txntest.Txn{ + Type: "pay", + Sender: addrs[0], + Receiver: index1.Address(), + Amount: 1_000_000_000, + } + fund0 := fund1 + fund0.Receiver = index0.Address() + fund1.Receiver = index1.Address() + + callA := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index0, + ForeignApps: []basics.AppIndex{index1}, + } + + callB := txntest.Txn{ + Type: "appl", + Sender: addrs[2], + ApplicationID: index1, + ForeignApps: []basics.AppIndex{index0}, + Accounts: []basics.Address{index0.Address()}, + } + + vb = dl.fullBlock(&fund0, &fund1, &callA, &callB) + + require.Equal(t, "Y", vb.Block().Payset[3].EvalDelta.LocalDeltas[1]["X"].Bytes) + }) +} From 8088e04b523f44a1a304fd2c83afbf7ae875dcb6 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Tue, 24 May 2022 09:14:01 -0400 Subject: [PATCH 22/34] AVM: Add bn256 pairing opcodes experimentally (#4013) * add bn256 add, scalar multiply and pairing opcode * replace with gnark bn254 and bench * update opcost for bn256 according to benchmark Some doc tweaks, and moved implementation to pairing.go These opcodes should stay in vFuture until 1. We consider the serialization format 2. We have unit tests 3. We consider BLS 12-381 (and the opcodes of eip 2537) 4. Audit of gnark-crypto library Co-authored-by: Bo Yao Co-authored-by: Bo Yao Co-authored-by: bo-abstrlabs <96916614+bo-abstrlabs@users.noreply.github.com> Co-authored-by: chris erway --- data/transactions/logic/README.md | 3 + data/transactions/logic/TEAL_opcodes.md | 30 +++++ data/transactions/logic/assembler_test.go | 76 ++++++----- data/transactions/logic/doc.go | 8 +- data/transactions/logic/evalCrypto_test.go | 128 +++++++++++++++++++ data/transactions/logic/evalStateful_test.go | 4 + data/transactions/logic/langspec.json | 36 ++++++ data/transactions/logic/opcodes.go | 13 +- data/transactions/logic/pairing.go | 116 +++++++++++++++++ data/transactions/logic/teal.tmLanguage.json | 2 +- go.mod | 8 +- go.sum | 17 ++- 12 files changed, 396 insertions(+), 45 deletions(-) create mode 100644 data/transactions/logic/pairing.go diff --git a/data/transactions/logic/README.md b/data/transactions/logic/README.md index 1b6f228d8c..44d68bd1ee 100644 --- a/data/transactions/logic/README.md +++ b/data/transactions/logic/README.md @@ -276,6 +276,9 @@ return stack matches the name of the input value. | `ecdsa_verify v` | for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1} | | `ecdsa_pk_recover v` | for (data A, recovery id B, signature C, D) recover a public key | | `ecdsa_pk_decompress v` | decompress pubkey A into components X, Y | +| `bn256_add` | for (curve points A and B) return the curve point A + B | +| `bn256_scalar_mul` | for (curve point A, scalar K) return the curve point KA | +| `bn256_pairing` | for (points in G1 group G1s, points in G2 group G2s), return whether they are paired => {0 or 1} | | `+` | A plus B. Fail on overflow. | | `-` | A minus B. Fail if B > A. | | `/` | A divided by B (truncated division). Fail if B == 0. | diff --git a/data/transactions/logic/TEAL_opcodes.md b/data/transactions/logic/TEAL_opcodes.md index 5ac8198bcd..de7c8d8bdd 100644 --- a/data/transactions/logic/TEAL_opcodes.md +++ b/data/transactions/logic/TEAL_opcodes.md @@ -1097,6 +1097,36 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with - **Cost**: 130 - Availability: v7 +## bn256_add + +- Opcode: 0x99 +- Stack: ..., A: []byte, B: []byte → ..., []byte +- for (curve points A and B) return the curve point A + B +- **Cost**: 70 +- Availability: v7 + +A, B are curve points in G1 group. Each point consists of (X, Y) where X and Y are 256 bit integers, big-endian encoded. The encoded point is 64 bytes from concatenation of 32 byte X and 32 byte Y. + +## bn256_scalar_mul + +- Opcode: 0x9a +- Stack: ..., A: []byte, B: []byte → ..., []byte +- for (curve point A, scalar K) return the curve point KA +- **Cost**: 970 +- Availability: v7 + +A is a curve point in G1 Group and encoded as described in `bn256_add`. Scalar K is a big-endian encoded big integer that has no padding zeros. + +## bn256_pairing + +- Opcode: 0x9b +- Stack: ..., A: []byte, B: []byte → ..., uint64 +- for (points in G1 group G1s, points in G2 group G2s), return whether they are paired => {0 or 1} +- **Cost**: 8700 +- Availability: v7 + +G1s are encoded by the concatenation of encoded G1 points, as described in `bn256_add`. G2s are encoded by the concatenation of encoded G2 points. Each G2 is in form (XA0+i*XA1, YA0+i*YA1) and encoded by big-endian field element XA0, XA1, YA0 and YA1 in sequence. + ## b+ - Opcode: 0xa0 diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go index 609366ed2d..8c719bbfe0 100644 --- a/data/transactions/logic/assembler_test.go +++ b/data/transactions/logic/assembler_test.go @@ -376,11 +376,18 @@ pushbytes 0x012345 dup dup ed25519verify_bare +pushbytes 0x012345 +dup +bn256_add +dup +bn256_scalar_mul +dup +bn256_pairing ` const v6Compiled = "2004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f23102311231223132314181b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b53a03b6b7043cb8033a0c2349c42a9631007300810881088120978101c53a8101c6003a" -const v7Compiled = v6Compiled + "5c005d018120af060180070123456789abcd49490501988003012345494984" +const v7Compiled = v6Compiled + "5c005d018120af060180070123456789abcd4949050198800301234549498480030123454999499a499b" var nonsense = map[uint64]string{ 1: v1Nonsense, @@ -574,6 +581,7 @@ func testLine(t *testing.T, line string, ver uint64, expected string) { func TestAssembleTxna(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() testLine(t, "txna Accounts 256", AssemblerMaxVersion, "txna i beyond 255: 256") testLine(t, "txna ApplicationArgs 256", AssemblerMaxVersion, "txna i beyond 255: 256") @@ -606,6 +614,7 @@ func TestAssembleTxna(t *testing.T) { func TestAssembleGlobal(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() testLine(t, "global", AssemblerMaxVersion, "global expects 1 immediate argument") testLine(t, "global a", AssemblerMaxVersion, "global unknown field: \"a\"") @@ -619,6 +628,7 @@ func TestAssembleGlobal(t *testing.T) { func TestAssembleDefault(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() source := `byte 0x1122334455 int 1 @@ -635,6 +645,7 @@ func mutateProgVersion(version uint64, prog string) string { func TestOpUint(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { @@ -651,8 +662,8 @@ func TestOpUint(t *testing.T) { func TestOpUint64(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { t.Parallel() @@ -668,8 +679,8 @@ func TestOpUint64(t *testing.T) { func TestOpBytes(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { ops := newOpStream(v) @@ -684,7 +695,6 @@ func TestOpBytes(t *testing.T) { func TestAssembleInt(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() expectedDefaultConsts := "012001bef5fad70c22" @@ -717,8 +727,8 @@ base64.b16encode(raw.encode()) func TestAssembleBytes(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + variations := []string{ "byte b32 MFRGGZDFMY", "byte base32 MFRGGZDFMY", @@ -776,6 +786,7 @@ func TestAssembleBytes(t *testing.T) { func TestAssembleBytesString(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { @@ -787,7 +798,6 @@ func TestAssembleBytesString(t *testing.T) { func TestAssembleOptimizedConstants(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() t.Run("Bytes", func(t *testing.T) { @@ -996,7 +1006,6 @@ bytec_1 // 0x0103 func TestAssembleOptimizedUint(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() program := ` @@ -1020,6 +1029,7 @@ int ClearState func TestFieldsFromLine(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() line := "op arg" fields := fieldsFromLine(line) @@ -1228,8 +1238,8 @@ func TestFieldsFromLine(t *testing.T) { func TestAssembleRejectNegJump(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := `wat: int 1 bnz wat @@ -1248,8 +1258,8 @@ int 2` func TestAssembleBase64(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + text := `byte base64 //GWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz+0= byte base64 avGWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz//= // @@ -1283,8 +1293,8 @@ byte b64 avGWRM+yy3BCavBDXO/FYTNZ6o2Jai5edsMCBdDEz//= func TestAssembleRejectUnkLabel(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := `int 1 bnz nowhere int 2` @@ -1297,8 +1307,8 @@ int 2` func TestAssembleJumpToTheEnd(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := `intcblock 1 intc 0 intc 0 @@ -1313,8 +1323,8 @@ done:` func TestMultipleErrors(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := `int 1 bnz nowhere // comment @@ -1331,9 +1341,9 @@ int 2` func TestAssembleDisassemble(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() // Specifically constructed program text that should be recreated by Disassemble() - t.Parallel() text := fmt.Sprintf(`#pragma version %d intcblock 0 1 2 3 4 5 bytecblock 0xcafed00d 0x1337 0x68656c6c6f 0xdeadbeef 0x70077007 0x0102030405060708091011121314151617181920212223242526272829303132 @@ -1459,11 +1469,10 @@ itxn LastLog func TestAssembleDisassembleCycle(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() // Test that disassembly re-assembles to the same program bytes. // Disassembly won't necessarily perfectly recreate the source text, but assembling the result of Disassemble() should be the same program bytes. - t.Parallel() - // This confirms that each program compiles to the same bytes // (except the leading version indicator), when compiled under // original version, unspecified version (so it should pick up @@ -1489,7 +1498,6 @@ func TestAssembleDisassembleCycle(t *testing.T) { func TestConstantDisassembly(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() ops := testProg(t, "int 47", AssemblerMaxVersion) @@ -1522,6 +1530,7 @@ func TestConstantDisassembly(t *testing.T) { func TestConstantArgs(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() + for v := uint64(1); v <= AssemblerMaxVersion; v++ { testProg(t, "int", v, Expect{1, "int needs one argument"}) testProg(t, "intc", v, Expect{1, "intc operation needs one argument"}) @@ -1538,7 +1547,6 @@ func TestConstantArgs(t *testing.T) { func TestAssembleDisassembleErrors(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() source := `txn Sender` @@ -1656,8 +1664,8 @@ func TestAssembleDisassembleErrors(t *testing.T) { func TestAssembleVersions(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + testLine(t, "txna Accounts 0", AssemblerMaxVersion, "") testLine(t, "txna Accounts 0", 2, "") testLine(t, "txna Accounts 0", 1, "txna opcode was introduced in TEAL v2") @@ -1665,7 +1673,6 @@ func TestAssembleVersions(t *testing.T) { func TestAssembleBalance(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() source := `byte 0x00 @@ -1682,7 +1689,6 @@ int 1 func TestAssembleMinBalance(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() source := `byte 0x00 @@ -1699,8 +1705,8 @@ int 1 func TestAssembleAsset(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + for v := uint64(2); v <= AssemblerMaxVersion; v++ { testProg(t, "asset_holding_get ABC 1", v, Expect{1, "asset_holding_get ABC 1 expects 2 stack arguments..."}) @@ -1729,7 +1735,6 @@ func TestAssembleAsset(t *testing.T) { func TestDisassembleSingleOp(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() for v := uint64(1); v <= AssemblerMaxVersion; v++ { @@ -1746,8 +1751,8 @@ func TestDisassembleSingleOp(t *testing.T) { func TestDisassembleInt(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + txnSample := fmt.Sprintf("#pragma version %d\nint 17\nint 27\nint 37\nint 47\nint 5\nint 17\n", AssemblerMaxVersion) ops := testProg(t, txnSample, AssemblerMaxVersion) disassembled, err := Disassemble(ops.Program) @@ -1764,8 +1769,8 @@ func TestDisassembleInt(t *testing.T) { func TestDisassembleTxna(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + // txn was 1, but this tests both introduction := OpsByName[LogicVersion]["gtxna"].Version for v := introduction; v <= AssemblerMaxVersion; v++ { @@ -1793,8 +1798,8 @@ func TestDisassembleTxna(t *testing.T) { func TestDisassembleGtxna(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + // check gtxn and gtxna are properly disassembled introduction := OpsByName[LogicVersion]["gtxna"].Version @@ -1822,8 +1827,8 @@ func TestDisassembleGtxna(t *testing.T) { func TestDisassemblePushConst(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + // check pushint and pushbytes are properly disassembled intSample := fmt.Sprintf("#pragma version %d\npushint 1\n", AssemblerMaxVersion) expectedIntSample := intSample @@ -1852,7 +1857,6 @@ func TestDisassemblePushConst(t *testing.T) { func TestDisassembleLastLabel(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() // starting from TEAL v2 branching to the last line are legal @@ -1875,8 +1879,8 @@ label1: func TestAssembleOffsets(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := "err" ops := testProg(t, source, AssemblerMaxVersion) require.Equal(t, 2, len(ops.Program)) @@ -1975,8 +1979,8 @@ err func TestHasStatefulOps(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + source := "int 1" ops, err := AssembleStringWithVersion(source, AssemblerMaxVersion) require.NoError(t, err) @@ -1998,8 +2002,8 @@ err func TestStringLiteralParsing(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + s := `"test"` e := []byte(`test`) result, err := parseStringLiteral(s) @@ -2095,8 +2099,8 @@ func TestStringLiteralParsing(t *testing.T) { func TestPragmas(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + for v := uint64(1); v <= AssemblerMaxVersion; v++ { text := fmt.Sprintf("#pragma version %d", v) ops := testProg(t, text, v) @@ -2162,8 +2166,8 @@ func TestPragmas(t *testing.T) { func TestAssemblePragmaVersion(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + text := `#pragma version 1 int 1 ` @@ -2216,8 +2220,8 @@ len func TestAssembleConstants(t *testing.T) { partitiontest.PartitionTest(t) - t.Parallel() + for v := uint64(1); v <= AssemblerMaxVersion; v++ { t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) { testLine(t, "intc 1", v, "intc 1 is not defined") @@ -2231,6 +2235,7 @@ func TestAssembleConstants(t *testing.T) { func TestErrShortBytecblock(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() text := `intcblock 0x1234567812345678 0x1234567812345671 0x1234567812345672 0x1234567812345673 4 5 6 7 8` ops, err := AssembleStringWithVersion(text, 1) @@ -2246,6 +2251,7 @@ func TestErrShortBytecblock(t *testing.T) { func TestMethodWarning(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() tests := []struct { method string @@ -2292,6 +2298,7 @@ func TestMethodWarning(t *testing.T) { func TestBranchAssemblyTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) + t.Parallel() text := ` int 0 // current app id [0] @@ -2326,6 +2333,7 @@ flip: // [x] func TestSwapTypeCheck(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() + /* reconfirm that we detect this type error */ testProg(t, "int 1; byte 0x1234; +", AssemblerMaxVersion, Expect{3, "+ arg 1..."}) /* despite swap, we track types */ @@ -2424,6 +2432,8 @@ func TestTxTypes(t *testing.T) { } func TestBadInnerFields(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() testProg(t, "itxn_begin; int 1000; itxn_field FirstValid", 5, Expect{3, "...is not allowed."}) testProg(t, "itxn_begin; int 1000; itxn_field FirstValidTime", 5, Expect{3, "...is not allowed."}) testProg(t, "itxn_begin; int 1000; itxn_field LastValid", 5, Expect{3, "...is not allowed."}) diff --git a/data/transactions/logic/doc.go b/data/transactions/logic/doc.go index fdad625488..a8badee03f 100644 --- a/data/transactions/logic/doc.go +++ b/data/transactions/logic/doc.go @@ -32,6 +32,9 @@ var opDocByName = map[string]string{ "ecdsa_verify": "for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}", "ecdsa_pk_decompress": "decompress pubkey A into components X, Y", "ecdsa_pk_recover": "for (data A, recovery id B, signature C, D) recover a public key", + "bn256_add": "for (curve points A and B) return the curve point A + B", + "bn256_scalar_mul": "for (curve point A, scalar K) return the curve point KA", + "bn256_pairing": "for (points in G1 group G1s, points in G2 group G2s), return whether they are paired => {0 or 1}", "+": "A plus B. Fail on overflow.", "-": "A minus B. Fail if B > A.", @@ -262,6 +265,9 @@ var opDocExtras = map[string]string{ "ecdsa_verify": "The 32 byte Y-component of a public key is the last element on the stack, preceded by X-component of a pubkey, preceded by S and R components of a signature, preceded by the data that is fifth element on the stack. All values are big-endian encoded. The signed data must be 32 bytes long, and signatures in lower-S form are only accepted.", "ecdsa_pk_decompress": "The 33 byte public key in a compressed form to be decompressed into X and Y (top) components. All values are big-endian encoded.", "ecdsa_pk_recover": "S (top) and R elements of a signature, recovery id and data (bottom) are expected on the stack and used to deriver a public key. All values are big-endian encoded. The signed data must be 32 bytes long.", + "bn256_add": "A, B are curve points in G1 group. Each point consists of (X, Y) where X and Y are 256 bit integers, big-endian encoded. The encoded point is 64 bytes from concatenation of 32 byte X and 32 byte Y.", + "bn256_scalar_mul": "A is a curve point in G1 Group and encoded as described in `bn256_add`. Scalar K is a big-endian encoded big integer that has no padding zeros.", + "bn256_pairing": "G1s are encoded by the concatenation of encoded G1 points, as described in `bn256_add`. G2s are encoded by the concatenation of encoded G2 points. Each G2 is in form (XA0+i*XA1, YA0+i*YA1) and encoded by big-endian field element XA0, XA1, YA0 and YA1 in sequence.", "bnz": "The `bnz` instruction opcode 0x40 is followed by two immediate data bytes which are a high byte first and low byte second which together form a 16 bit offset which the instruction may branch to. For a bnz instruction at `pc`, if the last element of the stack is not zero then branch to instruction at `pc + 3 + N`, else proceed to next instruction at `pc + 3`. Branch targets must be aligned instructions. (e.g. Branching to the second byte of a 2 byte op will be rejected.) Starting at v4, the offset is treated as a signed 16 bit integer allowing for backward branches and looping. In prior version (v1 to v3), branch offsets are limited to forward branches only, 0-0x7fff.\n\nAt v2 it became allowed to branch to the end of the program exactly after the last instruction: bnz to byte N (with 0-indexing) was illegal for a TEAL program with N bytes before v2, and is legal after it. This change eliminates the need for a last instruction of no-op as a branch target at the end. (Branching beyond the end--in other words, to a byte larger than N--is still illegal and will cause the program to fail.)", "bz": "See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.", "b": "See `bnz` for details on how branches work. `b` always jumps to the offset.", @@ -319,7 +325,7 @@ func OpDocExtra(opName string) string { // here is the order args opcodes are presented, so place related // opcodes consecutively, even if their opcode values are not. var OpGroups = map[string][]string{ - "Arithmetic": {"sha256", "keccak256", "sha512_256", "sha3_256", "ed25519verify", "ed25519verify_bare", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "+", "-", "/", "*", "<", ">", "<=", ">=", "&&", "||", "shl", "shr", "sqrt", "bitlen", "exp", "==", "!=", "!", "len", "itob", "btoi", "%", "|", "&", "^", "~", "mulw", "addw", "divw", "divmodw", "expw", "getbit", "setbit", "getbyte", "setbyte", "concat"}, + "Arithmetic": {"sha256", "keccak256", "sha512_256", "sha3_256", "ed25519verify", "ed25519verify_bare", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "bn256_add", "bn256_scalar_mul", "bn256_pairing", "+", "-", "/", "*", "<", ">", "<=", ">=", "&&", "||", "shl", "shr", "sqrt", "bitlen", "exp", "==", "!=", "!", "len", "itob", "btoi", "%", "|", "&", "^", "~", "mulw", "addw", "divw", "divmodw", "expw", "getbit", "setbit", "getbyte", "setbyte", "concat"}, "Byte Array Manipulation": {"substring", "substring3", "extract", "extract3", "extract_uint16", "extract_uint32", "extract_uint64", "base64_decode", "json_ref"}, "Byte Array Arithmetic": {"b+", "b-", "b/", "b*", "b<", "b>", "b<=", "b>=", "b==", "b!=", "b%", "bsqrt"}, "Byte Array Logic": {"b|", "b&", "b^", "b~"}, diff --git a/data/transactions/logic/evalCrypto_test.go b/data/transactions/logic/evalCrypto_test.go index 6d7734897a..84a88f6e40 100644 --- a/data/transactions/logic/evalCrypto_test.go +++ b/data/transactions/logic/evalCrypto_test.go @@ -25,9 +25,11 @@ import ( "encoding/hex" "fmt" "math/big" + mrand "math/rand" "strconv" "testing" + "github.com/consensys/gnark-crypto/ecc/bn254" "github.com/stretchr/testify/require" "github.com/algorand/go-algorand/crypto" @@ -771,3 +773,129 @@ int 1` benchmarkEcdsa(b, source, Secp256k1) }) } + +type benchmarkBn256Data struct { + a []byte + k []byte + g1 []byte + g2 []byte + programs []byte +} + +func benchmarkBn256DataGenData(b *testing.B) (data []benchmarkBn256Data) { + data = make([]benchmarkBn256Data, b.N) + var g1Gen bn254.G1Jac + var g1GenAff bn254.G1Affine + g1Gen.X.SetString("1") + g1Gen.Y.SetString("2") + g1Gen.Z.SetString("1") + g1GenAff.FromJacobian(&g1Gen) + var a bn254.G1Affine + a.ScalarMultiplication(&g1GenAff, new(big.Int).SetUint64(mrand.Uint64())) + + for i := 0; i < b.N; i++ { + var a bn254.G1Affine + a.ScalarMultiplication(&g1GenAff, new(big.Int).SetUint64(mrand.Uint64())) + + data[i].a = bN254G1ToBytes(&a) + data[i].k = new(big.Int).SetUint64(mrand.Uint64()).Bytes() + + // Pair one g1 and one g2 + data[i].g1, _ = hex.DecodeString("0ebc9fc712b13340c800793386a88385e40912a21bacad2cc7db17d36e54c802238449426931975cced7200f08681ab9a86a2e5c2336cf625451cf2413318e32") + data[i].g2, _ = hex.DecodeString("217fbd9a9db5719cfbe3580e3d8750cada058fdfffe95c440a0528ffc608f36e05d6a67604658d40b3e4cac3c46150f2702d87739b7774d79a8147f7271773b420f9429ee13c1843404bfd70e75efa886c173e57dde32970274d8bc53dfd562403f6276318990d053785b4ca342ebc4581a23a39285804bb74e079aa2ef3ba66") + } + return data +} + +func benchmarkBn256(b *testing.B, source string) { + data := benchmarkBn256DataGenData(b) + ops, err := AssembleStringWithVersion(source, 7) + require.NoError(b, err) + for i := 0; i < b.N; i++ { + data[i].programs = ops.Program + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + var txn transactions.SignedTxn + txn.Lsig.Logic = data[i].programs + txn.Lsig.Args = [][]byte{data[i].a, data[i].k, data[i].g1, data[i].g2} + ep := defaultEvalParams(&txn) + pass, err := EvalSignature(0, ep) + if !pass { + b.Log(hex.EncodeToString(data[i].programs)) + b.Log(ep.Trace.String()) + } + if err != nil { + require.NoError(b, err) + } + if !pass { + require.True(b, pass) + } + } +} + +func BenchmarkBn256AddRaw(b *testing.B) { + data := benchmarkBn256DataGenData(b) + a1 := bytesToBN254G1(data[0].g1) + a2 := bytesToBN254G1(data[0].g1) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = new(bn254.G1Affine).Add(&a1, &a2) + } +} + +func BenchmarkBn256AddWithMarshal(b *testing.B) { + b.ResetTimer() + var v [][]byte + v = make([][]byte, b.N) + g1, _ := hex.DecodeString("0ebc9fc712b13340c800793386a88385e40912a21bacad2cc7db17d36e54c802238449426931975cced7200f08681ab9a86a2e5c2336cf625451cf2413318e32") + + for i := 0; i < b.N; i++ { + a1 := bytesToBN254G1(g1) + a2 := bytesToBN254G1(g1) + r := new(bn254.G1Affine).Add(&a1, &a2) + v[i] = r.Marshal() + } +} + +func BenchmarkBn256PairingRaw(b *testing.B) { + data := benchmarkBn256DataGenData(b) + g1s := bytesToBN254G1s(data[0].g1) + g2s := bytesToBN254G2s(data[0].g2) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + ok, _ := bn254.PairingCheck(g1s, g2s) + require.False(b, ok) + } +} + +func BenchmarkBn256(b *testing.B) { + b.Run("bn256 add", func(b *testing.B) { + benchmarkOperation(b, "byte 0x0ebc9fc712b13340c800793386a88385e40912a21bacad2cc7db17d36e54c802238449426931975cced7200f08681ab9a86a2e5c2336cf625451cf2413318e32", "dup; bn256_add", "pop; int 1") + }) + + b.Run("bn256 scalar mul", func(b *testing.B) { + source := `#pragma version 7 +arg 0 +arg 1 +bn256_scalar_mul +pop +int 1 +` + benchmarkBn256(b, source) + }) + + b.Run("bn256 pairing", func(b *testing.B) { + source := `#pragma version 7 +arg 2 +arg 3 +bn256_pairing +pop +int 1 +` + benchmarkBn256(b, source) + }) +} diff --git a/data/transactions/logic/evalStateful_test.go b/data/transactions/logic/evalStateful_test.go index 730978fd82..e861883a37 100644 --- a/data/transactions/logic/evalStateful_test.go +++ b/data/transactions/logic/evalStateful_test.go @@ -2388,6 +2388,10 @@ func TestReturnTypes(t *testing.T) { "ecdsa_verify": true, "ecdsa_pk_recover": true, "ecdsa_pk_decompress": true, + + "bn256_add": true, + "bn256_scalar_mul": true, + "bn256_pairing": true, } byName := OpsByName[LogicVersion] diff --git a/data/transactions/logic/langspec.json b/data/transactions/logic/langspec.json index 7a6cef2d9a..1d978db8ec 100644 --- a/data/transactions/logic/langspec.json +++ b/data/transactions/logic/langspec.json @@ -1637,6 +1637,42 @@ "Arithmetic" ] }, + { + "Opcode": 153, + "Name": "bn256_add", + "Args": "BB", + "Returns": "B", + "Size": 1, + "Doc": "for (curve points A and B) return the curve point A + B", + "DocExtra": "A, B are curve points in G1 group. Each point consists of (X, Y) where X and Y are 256 bit integers, big-endian encoded. The encoded point is 64 bytes from concatenation of 32 byte X and 32 byte Y.", + "Groups": [ + "Arithmetic" + ] + }, + { + "Opcode": 154, + "Name": "bn256_scalar_mul", + "Args": "BB", + "Returns": "B", + "Size": 1, + "Doc": "for (curve point A, scalar K) return the curve point KA", + "DocExtra": "A is a curve point in G1 Group and encoded as described in `bn256_add`. Scalar K is a big-endian encoded big integer that has no padding zeros.", + "Groups": [ + "Arithmetic" + ] + }, + { + "Opcode": 155, + "Name": "bn256_pairing", + "Args": "BB", + "Returns": "U", + "Size": 1, + "Doc": "for (points in G1 group G1s, points in G2 group G2s), return whether they are paired =\u003e {0 or 1}", + "DocExtra": "G1s are encoded by the concatenation of encoded G1 points, as described in `bn256_add`. G2s are encoded by the concatenation of encoded G2 points. Each G2 is in form (XA0+i*XA1, YA0+i*YA1) and encoded by big-endian field element XA0, XA1, YA0 and YA1 in sequence.", + "Groups": [ + "Arithmetic" + ] + }, { "Opcode": 160, "Name": "b+", diff --git a/data/transactions/logic/opcodes.go b/data/transactions/logic/opcodes.go index 2dbb277c54..1d26d437a0 100644 --- a/data/transactions/logic/opcodes.go +++ b/data/transactions/logic/opcodes.go @@ -62,8 +62,11 @@ const createdResourcesVersion = 6 // field. const appAddressAvailableVersion = 7 -// experimental- -const fidoVersion = 7 // base64, json, secp256r1 +// EXPERIMENTAL. These should be revisited whenever a new LogiSigVersion is +// moved from vFuture to a new consensus version. If they remain unready, bump +// their version. +const fidoVersion = 7 // base64, json, secp256r1 +const pairingVersion = 7 // bn256 opcodes. will add bls12-381, and unify the available opcodes.// experimental- type linearCost struct { baseCost int @@ -537,11 +540,15 @@ var OpSpecs = []OpSpec{ {0x96, "bsqrt", opBytesSqrt, proto("b:b"), 6, costly(40)}, {0x97, "divw", opDivw, proto("iii:i"), 6, opDefault()}, {0x98, "sha3_256", opSHA3_256, proto("b:b"), 7, costly(130)}, - /* Will end up following keccak256 - {0x98, "sha3_256", opSHA3_256, proto("b:b"), unlimitedStorage, costByLength(58, 4, 8)},}, */ + {0x99, "bn256_add", opBn256Add, proto("bb:b"), pairingVersion, costly(70)}, + {0x9a, "bn256_scalar_mul", opBn256ScalarMul, proto("bb:b"), pairingVersion, costly(970)}, + {0x9b, "bn256_pairing", opBn256Pairing, proto("bb:i"), pairingVersion, costly(8700)}, + // leave room here for eip-2537 style opcodes + // Byteslice math. {0xa0, "b+", opBytesPlus, proto("bb:b"), 4, costly(10)}, {0xa1, "b-", opBytesMinus, proto("bb:b"), 4, costly(10)}, diff --git a/data/transactions/logic/pairing.go b/data/transactions/logic/pairing.go new file mode 100644 index 0000000000..cb43efeb5e --- /dev/null +++ b/data/transactions/logic/pairing.go @@ -0,0 +1,116 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package logic + +import ( + "errors" + "math/big" + + "github.com/consensys/gnark-crypto/ecc/bn254" + "github.com/consensys/gnark-crypto/ecc/bn254/fp" +) + +func bytesToBN254Field(b []byte) (ret fp.Element) { + ret.SetBytes(b) + return +} + +func bytesToBN254G1(b []byte) (ret bn254.G1Affine) { + ret.X = bytesToBN254Field(b[:32]) + ret.Y = bytesToBN254Field(b[32:64]) + return +} + +func bytesToBN254G1s(b []byte) (ret []bn254.G1Affine) { + for i := 0; i < len(b)/64; i++ { + ret = append(ret, bytesToBN254G1(b[(i*64):(i*64+64)])) + } + return +} + +func bytesToBN254G2(b []byte) (ret bn254.G2Affine) { + ret.X.A0 = bytesToBN254Field(b[:32]) + ret.X.A1 = bytesToBN254Field(b[32:64]) + ret.Y.A0 = bytesToBN254Field(b[64:96]) + ret.Y.A1 = bytesToBN254Field(b[96:128]) + return +} + +func bytesToBN254G2s(b []byte) (ret []bn254.G2Affine) { + for i := 0; i < len(b)/128; i++ { + ret = append(ret, bytesToBN254G2(b[(i*128):(i*128+128)])) + } + return +} + +func bN254G1ToBytes(g1 *bn254.G1Affine) (ret []byte) { + retX := g1.X.Bytes() + retY := g1.Y.Bytes() + ret = append(retX[:], retY[:]...) + return +} + +func opBn256Add(cx *EvalContext) error { + last := len(cx.stack) - 1 + prev := last - 1 + aBytes := cx.stack[prev].Bytes + bBytes := cx.stack[last].Bytes + if len(aBytes) != 64 || len(bBytes) != 64 { + return errors.New("expect G1 in 64 bytes") + } + a := bytesToBN254G1(aBytes) + b := bytesToBN254G1(bBytes) + res := new(bn254.G1Affine).Add(&a, &b) + resBytes := bN254G1ToBytes(res) + cx.stack = cx.stack[:last] + cx.stack[prev].Bytes = resBytes + return nil +} + +func opBn256ScalarMul(cx *EvalContext) error { + last := len(cx.stack) - 1 + prev := last - 1 + aBytes := cx.stack[prev].Bytes + if len(aBytes) != 64 { + return errors.New("expect G1 in 64 bytes") + } + a := bytesToBN254G1(aBytes) + kBytes := cx.stack[last].Bytes + k := new(big.Int).SetBytes(kBytes[:]) + res := new(bn254.G1Affine).ScalarMultiplication(&a, k) + resBytes := bN254G1ToBytes(res) + cx.stack = cx.stack[:last] + cx.stack[prev].Bytes = resBytes + return nil +} + +func opBn256Pairing(cx *EvalContext) error { + last := len(cx.stack) - 1 + prev := last - 1 + g1Bytes := cx.stack[prev].Bytes + g2Bytes := cx.stack[last].Bytes + g1 := bytesToBN254G1s(g1Bytes) + g2 := bytesToBN254G2s(g2Bytes) + ok, err := bn254.PairingCheck(g1, g2) + if err != nil { + return errors.New("pairing failed") + } + cx.stack = cx.stack[:last] + cx.stack[prev].Uint = boolToUint(ok) + cx.stack[prev].Bytes = nil + return nil +} diff --git a/data/transactions/logic/teal.tmLanguage.json b/data/transactions/logic/teal.tmLanguage.json index efc093602d..5219dbcd45 100644 --- a/data/transactions/logic/teal.tmLanguage.json +++ b/data/transactions/logic/teal.tmLanguage.json @@ -76,7 +76,7 @@ }, { "name": "keyword.operator.teal", - "match": "^(\\!|\\!\\=|%|\u0026|\u0026\u0026|\\*|\\+|\\-|/|\\\u003c|\\\u003c\\=|\\=\\=|\\\u003e|\\\u003e\\=|\\^|addw|bitlen|btoi|concat|divmodw|divw|ecdsa_pk_decompress|ecdsa_pk_recover|ecdsa_verify|ed25519verify|ed25519verify_bare|exp|expw|getbit|getbyte|itob|keccak256|len|mulw|setbit|setbyte|sha256|sha3_256|sha512_256|shl|shr|sqrt|\\||\\|\\||\\~|b\\!\\=|b%|b\\*|b\\+|b\\-|b/|b\\\u003c|b\\\u003c\\=|b\\=\\=|b\\\u003e|b\\\u003e\\=|bsqrt|b\u0026|b\\^|b\\||b\\~|base64_decode|extract|extract3|extract_uint16|extract_uint32|extract_uint64|json_ref|substring|substring3|gitxn|gitxna|gitxnas|itxn|itxn_begin|itxn_field|itxn_next|itxn_submit|itxna|itxnas)\\b" + "match": "^(\\!|\\!\\=|%|\u0026|\u0026\u0026|\\*|\\+|\\-|/|\\\u003c|\\\u003c\\=|\\=\\=|\\\u003e|\\\u003e\\=|\\^|addw|bitlen|bn256_add|bn256_pairing|bn256_scalar_mul|btoi|concat|divmodw|divw|ecdsa_pk_decompress|ecdsa_pk_recover|ecdsa_verify|ed25519verify|ed25519verify_bare|exp|expw|getbit|getbyte|itob|keccak256|len|mulw|setbit|setbyte|sha256|sha3_256|sha512_256|shl|shr|sqrt|\\||\\|\\||\\~|b\\!\\=|b%|b\\*|b\\+|b\\-|b/|b\\\u003c|b\\\u003c\\=|b\\=\\=|b\\\u003e|b\\\u003e\\=|bsqrt|b\u0026|b\\^|b\\||b\\~|base64_decode|extract|extract3|extract_uint16|extract_uint32|extract_uint64|json_ref|substring|substring3|gitxn|gitxna|gitxnas|itxn|itxn_begin|itxn_field|itxn_next|itxn_submit|itxna|itxnas)\\b" } ] }, diff --git a/go.mod b/go.mod index d9a52951fc..5ab3759566 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/algorand/websocket v1.4.5 github.com/aws/aws-sdk-go v1.16.5 github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e + github.com/consensys/gnark-crypto v0.7.0 github.com/davidlazar/go-crypto v0.0.0-20170701192655-dcfb0a7ac018 github.com/dchest/siphash v1.2.1 github.com/fatih/color v1.7.0 @@ -30,8 +31,8 @@ require ( github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v0.0.3 github.com/stretchr/testify v1.7.1 - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 - golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e + golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 golang.org/x/text v0.3.7 gopkg.in/sohlich/elogrus.v3 v3.0.0-20180410122755-1fa29e2f2009 ) @@ -53,6 +54,7 @@ require ( github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.7 // indirect github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 // indirect @@ -62,7 +64,7 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.1 // indirect - golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect diff --git a/go.sum b/go.sum index 1c807fefb1..93b075f404 100644 --- a/go.sum +++ b/go.sum @@ -19,6 +19,8 @@ github.com/aws/aws-sdk-go v1.16.5 h1:NVxzZXIuwX828VcJrpNxxWjur1tlOBISdMdDdHIKHcc github.com/aws/aws-sdk-go v1.16.5/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e h1:CHPYEbz71w8DqJ7DRIq+MXyCQsdibK08vdcQTY4ufas= github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e/go.mod h1:6Xhs0ZlsRjXLIiSMLKafbZxML/j30pg9Z1priLuha5s= +github.com/consensys/gnark-crypto v0.7.0 h1:rwdy8+ssmLYRqKp+ryRRgQJl/rCq2uv+n83cOydm5UE= +github.com/consensys/gnark-crypto v0.7.0/go.mod h1:KPSuJzyxkJA8xZ/+CV47tyqkr9MmpZA3PXivK4VPrVg= github.com/cpuguy83/go-md2man v1.0.8 h1:DwoNytLphI8hzS2Af4D0dfaEaiSq2bN05mEm4R6vf8M= github.com/cpuguy83/go-md2man v1.0.8/go.mod h1:N6JayAiVKtlHSnuTCeuLSQVs75hb8q+dYQLjr7cDsKY= github.com/cyberdelia/templates v0.0.0-20191230040416-20a325f050d4/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= @@ -53,6 +55,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -81,6 +84,7 @@ github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3 github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ= github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= @@ -99,6 +103,9 @@ github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK86 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/miekg/dns v1.1.27 h1:aEH/kqUzUxGJ/UHcEKdJY+ugH6WEzsEBBSPa8zuy1aM= github.com/miekg/dns v1.1.27/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= @@ -140,8 +147,9 @@ golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= @@ -153,8 +161,9 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= @@ -174,8 +183,8 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 280102c72ec9e6c106724dabdd6a57eeec1072f0 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Tue, 24 May 2022 17:05:00 -0400 Subject: [PATCH 23/34] metrics: make metrics easier to use with prometheus (#4020) * make TagCounter metrics easier to use with prometheus * ensure 0 counters are logged * allow for pre-declaring TagCounter tags for use with prometheus * fix expected in TestTagCounterWriteMetric * deregister counter used in test * fix lint warning * CR comment * Log incorrect metrics for debugging test failures * deregister more counters and tagcounters used by tests * remove unused Segment --- agreement/gossip/network.go | 6 +- agreement/pseudonode.go | 4 +- network/wsPeer.go | 8 +-- util/metrics/counter.go | 14 +++- util/metrics/counter_test.go | 33 ++++++++- util/metrics/gauge_test.go | 2 +- util/metrics/registry_test.go | 2 +- util/metrics/segment.go | 90 ------------------------ util/metrics/segment_test.go | 119 -------------------------------- util/metrics/tagcounter.go | 42 ++++++----- util/metrics/tagcounter_test.go | 34 +++++++++ 11 files changed, 111 insertions(+), 243 deletions(-) delete mode 100644 util/metrics/segment.go delete mode 100644 util/metrics/segment_test.go diff --git a/agreement/gossip/network.go b/agreement/gossip/network.go index e6b7d77aad..43eefd2db5 100644 --- a/agreement/gossip/network.go +++ b/agreement/gossip/network.go @@ -32,9 +32,11 @@ import ( ) var messagesHandledTotal = metrics.MakeCounter(metrics.AgreementMessagesHandled) -var messagesHandledByType = metrics.NewTagCounter("algod_agreement_handled_{TAG}", "Number of agreement messages handled per type") +var messagesHandledByType = metrics.NewTagCounter("algod_agreement_handled_{TAG}", "Number of agreement {TAG} messages handled", + agreementVoteMessageType, agreementProposalMessageType, agreementBundleMessageType) var messagesDroppedTotal = metrics.MakeCounter(metrics.AgreementMessagesDropped) -var messagesDroppedByType = metrics.NewTagCounter("algod_agreement_dropped_{TAG}", "Number of agreement messages handled per type") +var messagesDroppedByType = metrics.NewTagCounter("algod_agreement_dropped_{TAG}", "Number of agreement {TAG} messages dropped", + agreementVoteMessageType, agreementProposalMessageType, agreementBundleMessageType) const ( agreementVoteMessageType = "vote" diff --git a/agreement/pseudonode.go b/agreement/pseudonode.go index bdaa2f359d..06a91b210e 100644 --- a/agreement/pseudonode.go +++ b/agreement/pseudonode.go @@ -44,8 +44,8 @@ var errPseudonodeVerifierClosedChannel = errors.New("crypto verifier closed the var errPseudonodeNoVotes = errors.New("no valid participation keys to generate votes for given round") var errPseudonodeNoProposals = errors.New("no valid participation keys to generate proposals for given round") -var pseudonodeBacklogFullByType = metrics.NewTagCounter("algod_agreement_pseudonode_tasks_dropped_{TAG}", "Number of pseudonode tasks dropped per type") -var pseudonodeResultTimeoutsByType = metrics.NewTagCounter("algod_agreement_pseudonode_tasks_timeouts_{TAG}", "Number of pseudonode task result timeouts per type") +var pseudonodeBacklogFullByType = metrics.NewTagCounter("algod_agreement_pseudonode_tasks_dropped_{TAG}", "Number of pseudonode {TAG} tasks dropped", "proposal", "vote") +var pseudonodeResultTimeoutsByType = metrics.NewTagCounter("algod_agreement_pseudonode_tasks_timeouts_{TAG}", "Number of pseudonode {TAG} task result timeouts", "vote", "pvote", "ppayload") // A pseudonode creates proposals and votes with a KeyManager which holds participation keys. // diff --git a/network/wsPeer.go b/network/wsPeer.go index 337dae07b3..272e39c294 100644 --- a/network/wsPeer.go +++ b/network/wsPeer.go @@ -48,14 +48,14 @@ const averageMessageLength = 2 * 1024 // Most of the messages are smaller tha const msgsInReadBufferPerPeer = 10 var networkSentBytesTotal = metrics.MakeCounter(metrics.NetworkSentBytesTotal) -var networkSentBytesByTag = metrics.NewTagCounter("algod_network_sent_bytes_{TAG}", "Number of bytes that were sent over the network per message tag") +var networkSentBytesByTag = metrics.NewTagCounter("algod_network_sent_bytes_{TAG}", "Number of bytes that were sent over the network for {TAG} messages") var networkReceivedBytesTotal = metrics.MakeCounter(metrics.NetworkReceivedBytesTotal) -var networkReceivedBytesByTag = metrics.NewTagCounter("algod_network_received_bytes_{TAG}", "Number of bytes that were received from the network per message tag") +var networkReceivedBytesByTag = metrics.NewTagCounter("algod_network_received_bytes_{TAG}", "Number of bytes that were received from the network for {TAG} messages") var networkMessageReceivedTotal = metrics.MakeCounter(metrics.NetworkMessageReceivedTotal) -var networkMessageReceivedByTag = metrics.NewTagCounter("algod_network_message_received_{TAG}", "Number of complete messages that were received from the network per message tag") +var networkMessageReceivedByTag = metrics.NewTagCounter("algod_network_message_received_{TAG}", "Number of complete messages that were received from the network for {TAG} messages") var networkMessageSentTotal = metrics.MakeCounter(metrics.NetworkMessageSentTotal) -var networkMessageSentByTag = metrics.NewTagCounter("algod_network_message_sent_{TAG}", "Number of complete messages that were sent to the network per message tag") +var networkMessageSentByTag = metrics.NewTagCounter("algod_network_message_sent_{TAG}", "Number of complete messages that were sent to the network for {TAG} messages") var networkConnectionsDroppedTotal = metrics.MakeCounter(metrics.NetworkConnectionsDroppedTotal) var networkMessageQueueMicrosTotal = metrics.MakeCounter(metrics.MetricName{Name: "algod_network_message_sent_queue_micros_total", Description: "Total microseconds message spent waiting in queue to be sent"}) diff --git a/util/metrics/counter.go b/util/metrics/counter.go index 73debb3e91..06ea4b0c44 100644 --- a/util/metrics/counter.go +++ b/util/metrics/counter.go @@ -155,9 +155,6 @@ func (counter *Counter) WriteMetric(buf *strings.Builder, parentLabels string) { counter.Lock() defer counter.Unlock() - if len(counter.values) < 1 { - return - } buf.WriteString("# HELP ") buf.WriteString(counter.name) buf.WriteString(" ") @@ -165,6 +162,17 @@ func (counter *Counter) WriteMetric(buf *strings.Builder, parentLabels string) { buf.WriteString("\n# TYPE ") buf.WriteString(counter.name) buf.WriteString(" counter\n") + // if counter is zero, report 0 using parentLabels and no tags + if len(counter.values) == 0 { + buf.WriteString(counter.name) + if len(parentLabels) > 0 { + buf.WriteString("{" + parentLabels + "}") + } + buf.WriteString(" 0") + buf.WriteString("\n") + return + } + // otherwise iterate through values and write one line per label for _, l := range counter.values { buf.WriteString(counter.name) buf.WriteString("{") diff --git a/util/metrics/counter_test.go b/util/metrics/counter_test.go index 43ef0c27aa..75512b80e0 100644 --- a/util/metrics/counter_test.go +++ b/util/metrics/counter_test.go @@ -19,6 +19,7 @@ package metrics import ( "context" "fmt" + "strings" "testing" "time" @@ -67,7 +68,7 @@ func TestMetricCounter(t *testing.T) { defer test.Unlock() // the the loop above we've created a single metric name with five different labels set ( host0, host1 .. host 4) // let's see if we received all the 5 different labels. - require.Equal(t, 5, len(test.metrics), "Missing metric counts were reported.") + require.Equal(t, 5, len(test.metrics), "Missing metric counts were reported: %+v", test.metrics) for k, v := range test.metrics { // we have increased each one of the labels exactly 4 times. See that the counter was counting correctly. @@ -114,7 +115,7 @@ func TestMetricCounterFastInts(t *testing.T) { defer test.Unlock() // the the loop above we've created a single metric name with five different labels set ( host0, host1 .. host 4) // let's see if we received all the 5 different labels. - require.Equal(t, 1, len(test.metrics), "Missing metric counts were reported.") + require.Equal(t, 1, len(test.metrics), "Missing metric counts were reported: %+v", test.metrics) for k, v := range test.metrics { // we have increased each one of the labels exactly 4 times. See that the counter was counting correctly. @@ -163,7 +164,7 @@ func TestMetricCounterMixed(t *testing.T) { defer test.Unlock() // the the loop above we've created a single metric name with five different labels set ( host0, host1 .. host 4) // let's see if we received all the 5 different labels. - require.Equal(t, 1, len(test.metrics), "Missing metric counts were reported.") + require.Equal(t, 1, len(test.metrics), "Missing metric counts were reported: %+v", test.metrics) for k, v := range test.metrics { // we have increased each one of the labels exactly 4 times. See that the counter was counting correctly. @@ -171,3 +172,29 @@ func TestMetricCounterMixed(t *testing.T) { require.Equal(t, "35.5", v, fmt.Sprintf("The metric '%s' reached value '%s'", k, v)) } } + +func TestCounterWriteMetric(t *testing.T) { + partitiontest.PartitionTest(t) + + c := MakeCounter(MetricName{Name: "testname", Description: "testhelp"}) + c.Deregister(nil) + + // ensure 0 counters are still logged + sbOut := strings.Builder{} + c.WriteMetric(&sbOut, `host="myhost"`) + expected := `# HELP testname testhelp +# TYPE testname counter +testname{host="myhost"} 0 +` + require.Equal(t, expected, sbOut.String()) + + c.Add(2.3, nil) + // ensure non-zero counters are logged + sbOut = strings.Builder{} + c.WriteMetric(&sbOut, `host="myhost"`) + expected = `# HELP testname testhelp +# TYPE testname counter +testname{host="myhost"} 2.3 +` + require.Equal(t, expected, sbOut.String()) +} diff --git a/util/metrics/gauge_test.go b/util/metrics/gauge_test.go index 301ae22a74..9a228c0670 100644 --- a/util/metrics/gauge_test.go +++ b/util/metrics/gauge_test.go @@ -68,7 +68,7 @@ func TestMetricGauge(t *testing.T) { // the the loop above we've created a single metric name with five different labels set ( host0, host1 .. host 4) // let's see if we received all the 5 different labels. - require.Equal(t, 5, len(test.metrics), "Missing metric counts were reported.") + require.Equal(t, 5, len(test.metrics), "Missing metric counts were reported: %+v", test.metrics) // iterate through the metrics and check the each of the metrics reached it's correct count. for k, v := range test.metrics { diff --git a/util/metrics/registry_test.go b/util/metrics/registry_test.go index aa48516309..2256993f20 100644 --- a/util/metrics/registry_test.go +++ b/util/metrics/registry_test.go @@ -37,7 +37,7 @@ func TestWriteAdd(t *testing.T) { results := make(map[string]float64) DefaultRegistry().AddMetrics(results) - require.Equal(t, 2, len(results)) + require.Equal(t, 2, len(results), "results", results) require.Contains(t, results, "gauge-name") require.InDelta(t, 12.34, results["gauge-name"], 0.01) require.Contains(t, results, "label-counter_label__a_label_value_") diff --git a/util/metrics/segment.go b/util/metrics/segment.go deleted file mode 100644 index 21db004f3a..0000000000 --- a/util/metrics/segment.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (C) 2019-2022 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package metrics - -import ( - "sync/atomic" - "time" -) - -// Segment represent a single segment variable. -type Segment struct { - duration *Gauge - totalDuration *Counter - counter *Counter - concurrentInstances *Gauge - concurrentCounter uint32 -} - -// SegmentInstance is generated once a segments starts. -type SegmentInstance struct { - segment *Segment - start time.Time - labels map[string]string -} - -// MakeSegment create a new segment with the provided name and description. -func MakeSegment(metric *MetricName) *Segment { - c := &Segment{ - duration: MakeGauge(MetricName{Name: metric.Name + "_sec", Description: metric.Description + "(duration)"}), - totalDuration: MakeCounter(MetricName{Name: metric.Name + "_sec_total", Description: metric.Description + "(total duration)"}), - counter: MakeCounter(MetricName{Name: metric.Name + "_total", Description: metric.Description + "(total count)"}), - concurrentInstances: MakeGauge(MetricName{Name: metric.Name + "_concurrent", Description: metric.Description + "(concurrent instances)"}), - } - return c -} - -// EnterSegment is called when a segment is entered. -func (segment *Segment) EnterSegment(labels map[string]string) (*SegmentInstance, error) { - segment.counter.Inc(labels) - concurrentCounter := atomic.AddUint32(&segment.concurrentCounter, uint32(1)) - segment.concurrentInstances.Set(float64(concurrentCounter), labels) - return &SegmentInstance{ - segment: segment, - start: time.Now(), - labels: labels, - }, nil -} - -// Register registers the counter with the default/specific registry -func (segment *Segment) Register(reg *Registry) { - segment.duration.Register(reg) - segment.totalDuration.Register(reg) - segment.counter.Register(reg) - segment.concurrentInstances.Register(reg) -} - -// Deregister deregisters the counter with the default/specific registry -func (segment *Segment) Deregister(reg *Registry) { - segment.duration.Deregister(reg) - segment.totalDuration.Deregister(reg) - segment.counter.Deregister(reg) - segment.concurrentInstances.Deregister(reg) -} - -// LeaveSegment is expected to be called via a "defer" statement. -func (segInstance *SegmentInstance) LeaveSegment() error { - if segInstance == nil { - return nil - } - concurrentCounter := atomic.AddUint32(&segInstance.segment.concurrentCounter, ^uint32(0)) - seconds := time.Since(segInstance.start).Seconds() - segInstance.segment.duration.Set(seconds, segInstance.labels) - segInstance.segment.totalDuration.Add(seconds, segInstance.labels) - segInstance.segment.concurrentInstances.Set(float64(concurrentCounter), segInstance.labels) - return nil -} diff --git a/util/metrics/segment_test.go b/util/metrics/segment_test.go deleted file mode 100644 index c5cae321d9..0000000000 --- a/util/metrics/segment_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright (C) 2019-2022 Algorand, Inc. -// This file is part of go-algorand -// -// go-algorand is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// go-algorand is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with go-algorand. If not, see . - -package metrics - -import ( - "context" - "fmt" - "strconv" - "strings" - "testing" - "time" - - "github.com/algorand/go-algorand/test/partitiontest" - "github.com/stretchr/testify/require" -) - -type SegmentTest struct { - MetricTest -} - -func TestMetricSegment(t *testing.T) { - partitiontest.PartitionTest(t) - - const initialSleepDuration = 10 * time.Millisecond - const maxSleepDuration = 4 * time.Second - done := false - for sleepDuration := initialSleepDuration; sleepDuration <= maxSleepDuration; sleepDuration *= 2 { - done = testMetricSegmentHelper(t, sleepDuration) - if done { - break - } - } - if !done { - require.Fail(t, "test failed") - } -} - -func testMetricSegmentHelper(t *testing.T, functionTime time.Duration) bool { - - test := &SegmentTest{ - MetricTest: NewMetricTest(), - } - // create a http listener. - port := test.createListener(":0") - - metricService := MakeMetricService(&ServiceConfig{ - NodeExporterListenAddress: fmt.Sprintf("localhost:%d", port), - Labels: map[string]string{ - "host_name": "host_one", - "session_id": "AFX-229"}, - }) - metricService.Start(context.Background()) - - acceptedFunctionThreshold := 1.1 // 10 percent. - segment := MakeSegment(&MetricName{Name: "test_segment_name1", Description: "this is the metric test for segment object"}) - segmentTest := func() { - inst, _ := segment.EnterSegment(map[string]string{"pid": "123"}) - defer inst.LeaveSegment() - time.Sleep(functionTime) - } - segmentTest() - segmentTest() - // wait two reporting cycles to ensure we received all the messages. - time.Sleep(test.sampleRate * 2) - - metricService.Shutdown() - - segment.Deregister(nil) - - test.Lock() - defer test.Unlock() - - // test the metrics values. see if we received all the 4 metrics back correctly. - // we expect the get 4 metrics : test_segment_name1_sec, test_segment_name1_sec_total, test_segment_name1_total and test_segment_name1_concurrent - // ( we don't know in which order they would appear, but the total count should be 4 ) - require.Equal(t, 4, len(test.metrics), "Missing metric counts were reported.") - - for k, v := range test.metrics { - if strings.Contains(k, "test_segment_name1_sec{") { - // should be around 400 milliseconds. - if elapsedTime, err := strconv.ParseFloat(v, 64); err != nil { - t.Fatalf("The metric '%s' has unexpected value of '%s'", k, v) - } else { - if elapsedTime < functionTime.Seconds() || elapsedTime > functionTime.Seconds()*acceptedFunctionThreshold { - return false - } - } - } - if strings.Contains(k, "test_segment_name1_sec_total{") { - // should be around 800 milliseconds. - if elapsedTime, err := strconv.ParseFloat(v, 64); err != nil { - t.Fatalf("The metric '%s' has unexpected value of '%s'", k, v) - } else { - if elapsedTime < 2*functionTime.Seconds() || elapsedTime > 2*functionTime.Seconds()*acceptedFunctionThreshold { - return false - } - } - } - if strings.Contains(k, "test_segment_name1_total{") { - // should be 2, since we had 2 calls. - require.Equal(t, "2", v, "The metric '%s' has unexpected value of '%s'", k, v) - } - } - return true -} diff --git a/util/metrics/tagcounter.go b/util/metrics/tagcounter.go index 53cce7ba69..d110b8d4f0 100644 --- a/util/metrics/tagcounter.go +++ b/util/metrics/tagcounter.go @@ -26,8 +26,12 @@ import ( // NewTagCounter makes a set of metrics under rootName for tagged counting. // "{TAG}" in rootName is replaced by the tag, otherwise "_{TAG}" is appended. -func NewTagCounter(rootName, desc string) *TagCounter { +// Optionally provided declaredTags counters for these names up front (making them easier to discover). +func NewTagCounter(rootName, desc string, declaredTags ...string) *TagCounter { tc := &TagCounter{Name: rootName, Description: desc} + for _, tag := range declaredTags { + tc.Add(tag, 0) + } DefaultRegistry().Register(tc) return tc } @@ -98,32 +102,34 @@ func (tc *TagCounter) WriteMetric(buf *strings.Builder, parentLabels string) { // no values, nothing to say. return } - // TODO: what to do with "parentLabels"? obsolete part of interface? - buf.WriteString("# ") - buf.WriteString(tc.Name) - buf.WriteString(" ") - buf.WriteString(tc.Description) - buf.WriteString("\n") isTemplate := strings.Contains(tc.Name, "{TAG}") tags := tagptr.(map[string]*uint64) for tag, tagcount := range tags { if tagcount == nil { continue } + var name string if isTemplate { - name := strings.ReplaceAll(tc.Name, "{TAG}", tag) - buf.WriteString(name) - buf.WriteRune(' ') - buf.WriteString(strconv.FormatUint(*tagcount, 10)) - buf.WriteRune('\n') + name = strings.ReplaceAll(tc.Name, "{TAG}", tag) } else { - buf.WriteString(tc.Name) - buf.WriteRune('_') - buf.WriteString(tag) - buf.WriteRune(' ') - buf.WriteString(strconv.FormatUint(*tagcount, 10)) - buf.WriteRune('\n') + name = tc.Name + "_" + tag + } + buf.WriteString("# HELP ") + buf.WriteString(name) + buf.WriteRune(' ') + buf.WriteString(strings.ReplaceAll(tc.Description, "{TAG}", tag)) + buf.WriteString("\n# TYPE ") + buf.WriteString(name) + buf.WriteString(" counter\n") + buf.WriteString(name) + if len(parentLabels) > 0 { + buf.WriteRune('{') + buf.WriteString(parentLabels) + buf.WriteRune('}') } + buf.WriteRune(' ') + buf.WriteString(strconv.FormatUint(*tagcount, 10)) + buf.WriteRune('\n') } } diff --git a/util/metrics/tagcounter_test.go b/util/metrics/tagcounter_test.go index b76202c537..feb464a35c 100644 --- a/util/metrics/tagcounter_test.go +++ b/util/metrics/tagcounter_test.go @@ -40,6 +40,7 @@ func TestTagCounter(t *testing.T) { } tc := NewTagCounter("tc", "wat") + DefaultRegistry().Deregister(tc) // check that empty TagCounter cleanly returns no results var sb strings.Builder @@ -80,6 +81,39 @@ func TestTagCounter(t *testing.T) { } } +func TestTagCounterWriteMetric(t *testing.T) { + partitiontest.PartitionTest(t) + + tc := NewTagCounter("count_msgs_{TAG}", "number of {TAG} messages") + DefaultRegistry().Deregister(tc) + + tc.Add("TX", 100) + tc.Add("TX", 1) + tc.Add("RX", 0) + + var sbOut strings.Builder + tc.WriteMetric(&sbOut, `host="myhost"`) + txExpected := `# HELP count_msgs_TX number of TX messages +# TYPE count_msgs_TX counter +count_msgs_TX{host="myhost"} 101 +` + rxExpected := `# HELP count_msgs_RX number of RX messages +# TYPE count_msgs_RX counter +count_msgs_RX{host="myhost"} 0 +` + expfmt := sbOut.String() + require.True(t, expfmt == txExpected+rxExpected || expfmt == rxExpected+txExpected, "bad fmt: %s", expfmt) + + tc2 := NewTagCounter("declared", "number of {TAG}s", "A", "B") + DefaultRegistry().Deregister(tc2) + aExpected := "# HELP declared_A number of As\n# TYPE declared_A counter\ndeclared_A{host=\"h\"} 0\n" + bExpected := "# HELP declared_B number of Bs\n# TYPE declared_B counter\ndeclared_B{host=\"h\"} 0\n" + sbOut = strings.Builder{} + tc2.WriteMetric(&sbOut, `host="h"`) + expfmt = sbOut.String() + require.True(t, expfmt == aExpected+bExpected || expfmt == bExpected+aExpected, "bad fmt: %s", expfmt) +} + func BenchmarkTagCounter(b *testing.B) { b.Logf("b.N = %d", b.N) t := b From 3c4c8fb0bd7a0632453ded8130156f58026e287c Mon Sep 17 00:00:00 2001 From: Brian Olson Date: Tue, 24 May 2022 21:49:18 -0400 Subject: [PATCH 24/34] network: non-participating nodes request TX gossip only if ForceFetchTransactions: true (#3918) Save bandwidth by having non-participating non-relay nodes opt-out of TX transaction gossip traffic using message-of-interest. To enable set localConfig.ForceFetchTransactions = true Manual testing has started local private networks to ensure that the new message-of-interest propagated. Cluster tests were run to check bandwidth usage. Co-authored-by: cce <51567+cce@users.noreply.github.com> --- components/mocks/mockParticipationRegistry.go | 5 + data/account/participationRegistry.go | 15 + data/accountManager.go | 7 +- network/wsNetwork.go | 127 ++++- network/wsNetwork_test.go | 438 +++++++++++++++++- network/wsPeer.go | 12 + network/wsPeer_test.go | 4 + node/node.go | 19 +- 8 files changed, 599 insertions(+), 28 deletions(-) diff --git a/components/mocks/mockParticipationRegistry.go b/components/mocks/mockParticipationRegistry.go index 2ccce5ff17..d2aa53f269 100644 --- a/components/mocks/mockParticipationRegistry.go +++ b/components/mocks/mockParticipationRegistry.go @@ -69,6 +69,11 @@ func (m *MockParticipationRegistry) GetStateProofForRound(id account.Participati return account.StateProofRecordForRound{}, nil } +// HasLiveKeys quickly tests to see if there is a valid participation key over some range of rounds +func (m *MockParticipationRegistry) HasLiveKeys(from, to basics.Round) bool { + return false +} + // Register updates the EffectiveFirst and EffectiveLast fields. If there are multiple records for the account // then it is possible for multiple records to be updated. func (m *MockParticipationRegistry) Register(id account.ParticipationID, on basics.Round) error { diff --git a/data/account/participationRegistry.go b/data/account/participationRegistry.go index 41b4e64a1b..d1c35c2ce3 100644 --- a/data/account/participationRegistry.go +++ b/data/account/participationRegistry.go @@ -250,6 +250,9 @@ type ParticipationRegistry interface { // GetStateProofForRound fetches a record with stateproof secrets for a particular round. GetStateProofForRound(id ParticipationID, round basics.Round) (StateProofRecordForRound, error) + // HasLiveKeys quickly tests to see if there is a valid participation key over some range of rounds + HasLiveKeys(from, to basics.Round) bool + // Register updates the EffectiveFirst and EffectiveLast fields. If there are multiple records for the account // then it is possible for multiple records to be updated. Register(id ParticipationID, on basics.Round) error @@ -726,6 +729,18 @@ func (db *participationDB) GetAll() []ParticipationRecord { return results } +func (db *participationDB) HasLiveKeys(from, to basics.Round) bool { + db.mutex.RLock() + defer db.mutex.RUnlock() + + for _, record := range db.cache { + if record.OverlapsInterval(from, to) { + return true + } + } + return false +} + // GetStateProofForRound returns the state proof data required to sign the compact certificate for this round func (db *participationDB) GetStateProofForRound(id ParticipationID, round basics.Round) (StateProofRecordForRound, error) { partRecord, err := db.GetForRound(id, round) diff --git a/data/accountManager.go b/data/accountManager.go index 2d8efb4095..7cadd071d6 100644 --- a/data/accountManager.go +++ b/data/accountManager.go @@ -92,12 +92,7 @@ func (manager *AccountManager) HasLiveKeys(from, to basics.Round) bool { manager.mu.Lock() defer manager.mu.Unlock() - for _, part := range manager.registry.GetAll() { - if part.OverlapsInterval(from, to) { - return true - } - } - return false + return manager.registry.HasLiveKeys(from, to) } // AddParticipation adds a new account.Participation to be managed. diff --git a/network/wsNetwork.go b/network/wsNetwork.go index 59de32eefb..68394a924c 100644 --- a/network/wsNetwork.go +++ b/network/wsNetwork.go @@ -301,6 +301,19 @@ func Propagate(msg IncomingMessage) OutgoingMessage { // Contains {genesisID} param to be handled by gorilla/mux const GossipNetworkPath = "/v1/{genesisID}/gossip" +// NodeInfo helps the network get information about the node it is running on +type NodeInfo interface { + // IsParticipating returns true if this node has stake and may vote on blocks or propose blocks. + IsParticipating() bool +} + +type nopeNodeInfo struct { +} + +func (nnni *nopeNodeInfo) IsParticipating() bool { + return false +} + // WebsocketNetwork implements GossipNode type WebsocketNetwork struct { listener net.Listener @@ -397,21 +410,34 @@ type WebsocketNetwork struct { // to be sent to new peers. This is filled in at network start, // at which point messagesOfInterestEncoded is set to prevent // further changes. - messagesOfInterestEnc []byte - messagesOfInterestEncoded bool + messagesOfInterestEnc []byte + messagesOfInterestEncoded bool + messagesOfInterestGeneration uint32 // messagesOfInterestMu protects messagesOfInterest and ensures // that messagesOfInterestEnc does not change once it is set during // network start. - messagesOfInterestMu deadlock.Mutex + messagesOfInterestMu deadlock.Mutex + messagesOfInterestCond *sync.Cond // peersConnectivityCheckTicker is the timer for testing that all the connected peers // are still transmitting or receiving information. The channel produced by this ticker // is consumed by any of the messageHandlerThread(s). The ticker itself is created during // Start(), and being shut down when Stop() is called. peersConnectivityCheckTicker *time.Ticker + + nodeInfo NodeInfo + + // atomic {0:unknown, 1:yes, 2:no} + wantTXGossip uint32 } +const ( + wantTXGossipUnk = 0 + wantTXGossipYes = 1 + wantTXGossipNo = 2 +) + type broadcastRequest struct { tags []Tag data [][]byte @@ -661,6 +687,9 @@ func (wn *WebsocketNetwork) setup() { if wn.config.DNSSecurityRelayAddrEnforced() { preferredResolver = dnssec.MakeDefaultDnssecResolver(wn.config.FallbackDNSResolverAddress, wn.log) } + if wn.nodeInfo == nil { + wn.nodeInfo = &nopeNodeInfo{} + } maxIdleConnsPerHost := int(wn.config.ConnectionsRateLimitingCount) wn.dialer = makeRateLimitingDialer(wn.phonebook, preferredResolver) wn.transport = makeRateLimitingTransport(wn.phonebook, 10*time.Second, &wn.dialer, maxIdleConnsPerHost) @@ -684,6 +713,9 @@ func (wn *WebsocketNetwork) setup() { wn.server.MaxHeaderBytes = httpServerMaxHeaderBytes wn.ctx, wn.ctxCancel = context.WithCancel(context.Background()) wn.relayMessages = wn.config.NetAddress != "" || wn.config.ForceRelayMessages + if wn.relayMessages || wn.config.ForceFetchTransactions { + wn.wantTXGossip = wantTXGossipYes + } // roughly estimate the number of messages that could be seen at any given moment. // For the late/redo/down committee, which happen in parallel, we need to allocate // extra space there. @@ -732,6 +764,8 @@ func (wn *WebsocketNetwork) setup() { SupportedProtocolVersions = []string{wn.config.NetworkProtocolVersion} } + wn.messagesOfInterestCond = sync.NewCond(&wn.messagesOfInterestMu) + wn.messagesOfInterestGeneration = 1 // something nonzero so that any new wsPeer needs updating if wn.relayMessages { wn.RegisterMessageInterest(protocol.CompactCertSigTag) } @@ -798,6 +832,9 @@ func (wn *WebsocketNetwork) Start() { wn.wg.Add(1) go wn.prioWeightRefresh() } + + go wn.postMessagesOfInterestThread() + wn.log.Infof("serving genesisID=%s on %#v with RandomID=%s", wn.GenesisID, wn.PublicAddress(), wn.RandomID) } @@ -1123,18 +1160,29 @@ func (wn *WebsocketNetwork) ServeHTTP(response http.ResponseWriter, request *htt InstanceName: trackedRequest.otherInstanceName, }) - // We are careful to encode this prior to starting the server to avoid needing 'messagesOfInterestMu' here. - if wn.messagesOfInterestEnc != nil { - err = peer.Unicast(wn.ctx, wn.messagesOfInterestEnc, protocol.MsgOfInterestTag) - if err != nil { - wn.log.Infof("ws send msgOfInterest: %v", err) - } - } + wn.maybeSendMessagesOfInterest(peer, nil) peers.Set(float64(wn.NumPeers()), nil) incomingPeers.Set(float64(wn.numIncomingPeers()), nil) } +func (wn *WebsocketNetwork) maybeSendMessagesOfInterest(peer *wsPeer, messagesOfInterestEnc []byte) { + messagesOfInterestGeneration := atomic.LoadUint32(&wn.messagesOfInterestGeneration) + peerMessagesOfInterestGeneration := atomic.LoadUint32(&peer.messagesOfInterestGeneration) + if peerMessagesOfInterestGeneration != messagesOfInterestGeneration { + if messagesOfInterestEnc == nil { + wn.messagesOfInterestMu.Lock() + messagesOfInterestEnc = wn.messagesOfInterestEnc + wn.messagesOfInterestMu.Unlock() + } + if messagesOfInterestEnc != nil { + peer.sendMessagesOfInterest(messagesOfInterestGeneration, messagesOfInterestEnc) + } else { + wn.log.Infof("msgOfInterest Enc=nil") + } + } +} + func (wn *WebsocketNetwork) messageHandlerThread(peersConnectivityCheckCh <-chan time.Time) { defer wn.wg.Done() @@ -1677,6 +1725,17 @@ func (wn *WebsocketNetwork) OnNetworkAdvance() { wn.lastNetworkAdvanceMu.Lock() defer wn.lastNetworkAdvanceMu.Unlock() wn.lastNetworkAdvance = time.Now().UTC() + if wn.nodeInfo != nil && !wn.relayMessages && !wn.config.ForceFetchTransactions { + // if we're not a relay, and not participating, we don't need txn pool + wantTXGossip := wn.nodeInfo.IsParticipating() + if wantTXGossip && (wn.wantTXGossip != wantTXGossipYes) { + wn.RegisterMessageInterest(protocol.TxnTag) + wn.wantTXGossip = wantTXGossipYes + } else if !wantTXGossip && (wn.wantTXGossip != wantTXGossipNo) { + wn.DeregisterMessageInterest(protocol.TxnTag) + wn.wantTXGossip = wantTXGossipNo + } + } } // sendPeerConnectionsTelemetryStatus sends a snapshot of the currently connected peers @@ -2046,6 +2105,8 @@ func (wn *WebsocketNetwork) tryConnect(addr, gossipAddr string) { Endpoint: peer.GetAddress(), }) + wn.maybeSendMessagesOfInterest(peer, nil) + peers.Set(float64(wn.NumPeers()), nil) outgoingPeers.Set(float64(wn.numOutgoingPeers()), nil) @@ -2085,7 +2146,7 @@ func (wn *WebsocketNetwork) SetPeerData(peer Peer, key string, value interface{} } // NewWebsocketNetwork constructor for websockets based gossip network -func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebookAddresses []string, genesisID string, networkID protocol.NetworkID) (wn *WebsocketNetwork, err error) { +func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebookAddresses []string, genesisID string, networkID protocol.NetworkID, nodeInfo NodeInfo) (wn *WebsocketNetwork, err error) { phonebook := MakePhonebook(config.ConnectionsRateLimitingCount, time.Duration(config.ConnectionsRateLimitingWindowSeconds)*time.Second) phonebook.ReplacePeerList(phonebookAddresses, config.DNSBootstrapID, PhoneBookEntryRelayRole) @@ -2095,6 +2156,7 @@ func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebookAddre phonebook: phonebook, GenesisID: genesisID, NetworkID: networkID, + nodeInfo: nodeInfo, } wn.setup() @@ -2103,7 +2165,7 @@ func NewWebsocketNetwork(log logging.Logger, config config.Local, phonebookAddre // NewWebsocketGossipNode constructs a websocket network node and returns it as a GossipNode interface implementation func NewWebsocketGossipNode(log logging.Logger, config config.Local, phonebookAddresses []string, genesisID string, networkID protocol.NetworkID) (gn GossipNode, err error) { - return NewWebsocketNetwork(log, config, phonebookAddresses, genesisID, networkID) + return NewWebsocketNetwork(log, config, phonebookAddresses, genesisID, networkID, nil) } // SetPrioScheme specifies the network priority scheme for a network node @@ -2254,10 +2316,23 @@ func (wn *WebsocketNetwork) RegisterMessageInterest(t protocol.Tag) error { wn.messagesOfInterestMu.Lock() defer wn.messagesOfInterestMu.Unlock() - if wn.messagesOfInterestEncoded { - return fmt.Errorf("network already started") + if wn.messagesOfInterest == nil { + wn.messagesOfInterest = make(map[protocol.Tag]bool) + for tag, flag := range defaultSendMessageTags { + wn.messagesOfInterest[tag] = flag + } } + wn.messagesOfInterest[t] = true + wn.updateMessagesOfInterestEnc() + return nil +} + +// DeregisterMessageInterest will tell peers to no longer send us traffic with a protocol Tag +func (wn *WebsocketNetwork) DeregisterMessageInterest(t protocol.Tag) error { + wn.messagesOfInterestMu.Lock() + defer wn.messagesOfInterestMu.Unlock() + if wn.messagesOfInterest == nil { wn.messagesOfInterest = make(map[protocol.Tag]bool) for tag, flag := range defaultSendMessageTags { @@ -2265,10 +2340,32 @@ func (wn *WebsocketNetwork) RegisterMessageInterest(t protocol.Tag) error { } } - wn.messagesOfInterest[t] = true + delete(wn.messagesOfInterest, t) + wn.updateMessagesOfInterestEnc() return nil } +func (wn *WebsocketNetwork) updateMessagesOfInterestEnc() { + // must run inside wn.messagesOfInterestMu.Lock + wn.messagesOfInterestEnc = MarshallMessageOfInterestMap(wn.messagesOfInterest) + wn.messagesOfInterestEncoded = true + atomic.AddUint32(&wn.messagesOfInterestGeneration, 1) + wn.messagesOfInterestCond.Broadcast() +} + +func (wn *WebsocketNetwork) postMessagesOfInterestThread() { + var peers []*wsPeer + wn.messagesOfInterestMu.Lock() + defer wn.messagesOfInterestMu.Unlock() + for { + wn.messagesOfInterestCond.Wait() + peers, _ = wn.peerSnapshot(peers) + for _, peer := range peers { + wn.maybeSendMessagesOfInterest(peer, wn.messagesOfInterestEnc) + } + } +} + // SubstituteGenesisID substitutes the "{genesisID}" with their network-specific genesisID. func (wn *WebsocketNetwork) SubstituteGenesisID(rawURL string) string { return strings.Replace(rawURL, "{genesisID}", wn.GenesisID, -1) diff --git a/network/wsNetwork_test.go b/network/wsNetwork_test.go index f7e5db2da3..02294f0c01 100644 --- a/network/wsNetwork_test.go +++ b/network/wsNetwork_test.go @@ -1456,11 +1456,24 @@ func TestSlowPeerDisconnection(t *testing.T) { peers, _ = netA.peerSnapshot(peers) require.Equalf(t, len(peers), 1, "Expected number of peers should be 1") peer := peers[0] + // On connection may send a MOI message, wait for it to go out + now := time.Now() + expire := now.Add(5 * time.Second) + for { + time.Sleep(time.Millisecond) + if len(peer.sendBufferHighPrio)+len(peer.sendBufferBulk) == 0 { + break + } + now = time.Now() + if now.After(expire) { + t.Errorf("wait for empty peer outbound queue expired") + } + } // modify the peer on netA and beforeLoopTime := time.Now() atomic.StoreInt64(&peer.intermittentOutgoingMessageEnqueueTime, beforeLoopTime.Add(-maxMessageQueueDuration).Add(time.Second).UnixNano()) // wait up to 10 seconds for the monitor to figure out it needs to disconnect. - expire := beforeLoopTime.Add(2 * slowWritingPeerMonitorInterval) + expire = beforeLoopTime.Add(2 * slowWritingPeerMonitorInterval) for { peers, _ = netA.peerSnapshot(peers) if len(peers) == 0 || peers[0] != peer { @@ -1707,6 +1720,15 @@ func TestWebsocketNetworkTopicRoundtrip(t *testing.T) { assert.Equal(t, 5, int(sum[0])) } +var ( + ft1 = protocol.Tag("F1") + ft2 = protocol.Tag("F2") + ft3 = protocol.Tag("F3") + ft4 = protocol.Tag("F4") + + testTags = []protocol.Tag{ft1, ft2, ft3, ft4} +) + // Set up two nodes, have one of them request a certain message tag mask, and verify the other follow that. func TestWebsocketNetworkMessageOfInterest(t *testing.T) { partitiontest.PartitionTest(t) @@ -1727,6 +1749,143 @@ func TestWebsocketNetworkMessageOfInterest(t *testing.T) { netB.Start() defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + incomingMsgSync := deadlock.Mutex{} + msgCounters := make(map[protocol.Tag]int) + expectedCounts := make(map[protocol.Tag]int) + expectedCounts[ft1] = 5 + expectedCounts[ft2] = 5 + var failed uint32 + messageArriveWg := sync.WaitGroup{} + msgHandler := func(msg IncomingMessage) (out OutgoingMessage) { + t.Logf("A->B %s", msg.Tag) + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + expected := expectedCounts[msg.Tag] + if expected < 1 { + atomic.StoreUint32(&failed, 1) + t.Logf("UNEXPECTED A->B %s", msg.Tag) + return + } + msgCounters[msg.Tag] = msgCounters[msg.Tag] + 1 + messageArriveWg.Done() + return + } + messageFilterArriveWg := sync.WaitGroup{} + messageFilterArriveWg.Add(1) + waitMessageArriveHandler := func(msg IncomingMessage) (out OutgoingMessage) { + messageFilterArriveWg.Done() + return + } + + // register all the handlers. + taggedHandlers := []TaggedMessageHandler{} + for _, tag := range testTags { + taggedHandlers = append(taggedHandlers, TaggedMessageHandler{ + Tag: tag, + MessageHandler: HandlerFunc(msgHandler), + }) + } + netB.RegisterHandlers(taggedHandlers) + netA.RegisterHandlers([]TaggedMessageHandler{ + { + Tag: protocol.VoteBundleTag, + MessageHandler: HandlerFunc(waitMessageArriveHandler), + }}) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + waitReady(t, netB, readyTimeout.C) + + // have netB asking netA to send it only AgreementVoteTag and ProposalPayloadTag + require.NoError(t, netB.RegisterMessageInterest(ft1)) + require.NoError(t, netB.RegisterMessageInterest(ft2)) + // send another message which we can track, so that we'll know that the first message was delivered. + netB.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) + messageFilterArriveWg.Wait() + // okay, but now we need to wait for asynchronous thread within netA to _apply_ the MOI to its peer for netB... + timeout := time.Now().Add(100 * time.Millisecond) + waiting := true + for waiting { + time.Sleep(1 * time.Millisecond) + peers := netA.GetPeers(PeersConnectedIn) + for _, pg := range peers { + wp := pg.(*wsPeer) + if len(wp.sendBufferHighPrio)+len(wp.sendBufferBulk) == 0 { + waiting = false + break + } + } + if time.Now().After(timeout) { + for _, pg := range peers { + wp := pg.(*wsPeer) + if len(wp.sendBufferHighPrio)+len(wp.sendBufferBulk) == 0 { + t.Fatalf("netA peer buff empty timeout len(high)=%d, len(bulk)=%d", len(wp.sendBufferHighPrio), len(wp.sendBufferBulk)) + } + } + } + } + + messageArriveWg.Add(5 * 2) // we're expecting exactly 10 messages. + // send 5 messages of few types. + for i := 0; i < 5; i++ { + if atomic.LoadUint32(&failed) != 0 { + t.Errorf("failed") + break + } + netA.Broadcast(context.Background(), ft1, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), ft3, []byte{0, 1, 2, 3, 4}, true, nil) // NOT in MOI + netA.Broadcast(context.Background(), ft2, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), ft4, []byte{0, 1, 2, 3, 4}, true, nil) // NOT in MOI + } + if atomic.LoadUint32(&failed) != 0 { + t.Errorf("failed") + } + // wait until all the expected messages arrive. + messageArriveWg.Wait() + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + require.Equal(t, 2, len(msgCounters)) + for tag, count := range msgCounters { + if atomic.LoadUint32(&failed) != 0 { + t.Errorf("failed") + break + } + if tag == ft1 || tag == ft2 { + require.Equal(t, 5, count) + } else { + require.Equal(t, 0, count) + } + } +} + +// Set up two nodes, have one of them work through TX gossip message-of-interest logic +// test: +// * wn.config.ForceFetchTransactions +// * wn.config.ForceRelayMessages +// * NodeInfo.IsParticipating() + WebsocketNetwork.OnNetworkAdvance() +func TestWebsocketNetworkTXMessageOfInterestRelay(t *testing.T) { + // Tests that A->B follows MOI + partitiontest.PartitionTest(t) + + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.config.EnablePingHandler = false + + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + bConfig := defaultConfig + bConfig.NetAddress = "" + bConfig.ForceRelayMessages = true + netB := makeTestWebsocketNodeWithConfig(t, bConfig) + netB.config.GossipFanout = 1 + netB.config.EnablePingHandler = false + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + incomingMsgSync := deadlock.Mutex{} msgCounters := make(map[protocol.Tag]int) messageArriveWg := sync.WaitGroup{} @@ -1763,13 +1922,94 @@ func TestWebsocketNetworkMessageOfInterest(t *testing.T) { waitReady(t, netA, readyTimeout.C) waitReady(t, netB, readyTimeout.C) - // have netB asking netA to send it only AgreementVoteTag and ProposalPayloadTag - netB.Broadcast(context.Background(), protocol.MsgOfInterestTag, MarshallMessageOfInterest([]protocol.Tag{protocol.AgreementVoteTag, protocol.ProposalPayloadTag}), true, nil) + netB.OnNetworkAdvance() // send another message which we can track, so that we'll know that the first message was delivered. netB.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) messageFilterArriveWg.Wait() - messageArriveWg.Add(5 * 2) // we're expecting exactly 10 messages. + messageArriveWg.Add(5 * 4) // we're expecting exactly 20 messages. + // send 5 messages of few types. + for i := 0; i < 5; i++ { + netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.ProposalPayloadTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) + } + // wait until all the expected messages arrive. + messageArriveWg.Wait() + incomingMsgSync.Lock() + require.Equal(t, 4, len(msgCounters)) + for _, count := range msgCounters { + require.Equal(t, 5, count) + } + incomingMsgSync.Unlock() +} + +func TestWebsocketNetworkTXMessageOfInterestForceTx(t *testing.T) { + // Tests that A->B follows MOI + partitiontest.PartitionTest(t) + + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.config.EnablePingHandler = false + + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + bConfig := defaultConfig + bConfig.NetAddress = "" + bConfig.ForceFetchTransactions = true + netB := makeTestWebsocketNodeWithConfig(t, bConfig) + netB.config.GossipFanout = 1 + netB.config.EnablePingHandler = false + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + + incomingMsgSync := deadlock.Mutex{} + msgCounters := make(map[protocol.Tag]int) + messageArriveWg := sync.WaitGroup{} + msgHandler := func(msg IncomingMessage) (out OutgoingMessage) { + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + msgCounters[msg.Tag] = msgCounters[msg.Tag] + 1 + messageArriveWg.Done() + return + } + messageFilterArriveWg := sync.WaitGroup{} + messageFilterArriveWg.Add(1) + waitMessageArriveHandler := func(msg IncomingMessage) (out OutgoingMessage) { + messageFilterArriveWg.Done() + return + } + + // register all the handlers. + taggedHandlers := []TaggedMessageHandler{} + for tag := range defaultSendMessageTags { + taggedHandlers = append(taggedHandlers, TaggedMessageHandler{ + Tag: tag, + MessageHandler: HandlerFunc(msgHandler), + }) + } + netB.RegisterHandlers(taggedHandlers) + netA.RegisterHandlers([]TaggedMessageHandler{ + { + Tag: protocol.AgreementVoteTag, + MessageHandler: HandlerFunc(waitMessageArriveHandler), + }}) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + waitReady(t, netB, readyTimeout.C) + + netB.OnNetworkAdvance() + // send another message which we can track, so that we'll know that the first message was delivered. + netB.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + messageFilterArriveWg.Wait() + + messageArriveWg.Add(5 * 4) // we're expecting exactly 20 messages. // send 5 messages of few types. for i := 0; i < 5; i++ { netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) @@ -1779,13 +2019,199 @@ func TestWebsocketNetworkMessageOfInterest(t *testing.T) { } // wait until all the expected messages arrive. messageArriveWg.Wait() + incomingMsgSync.Lock() + require.Equal(t, 4, len(msgCounters)) + for _, count := range msgCounters { + require.Equal(t, 5, count) + } + incomingMsgSync.Unlock() +} +func TestWebsocketNetworkTXMessageOfInterestNPN(t *testing.T) { + // Tests that A->B follows MOI + partitiontest.PartitionTest(t) + + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.config.EnablePingHandler = false + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + + bConfig := defaultConfig + bConfig.NetAddress = "" + netB := makeTestWebsocketNodeWithConfig(t, bConfig) + netB.config.GossipFanout = 1 + netB.config.EnablePingHandler = false + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + require.False(t, netB.relayMessages) + require.Equal(t, uint32(wantTXGossipUnk), netB.wantTXGossip) + + incomingMsgSync := deadlock.Mutex{} + msgCounters := make(map[protocol.Tag]int) + messageArriveWg := sync.WaitGroup{} + msgHandler := func(msg IncomingMessage) (out OutgoingMessage) { + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + msgCounters[msg.Tag] = msgCounters[msg.Tag] + 1 + messageArriveWg.Done() + return + } + messageFilterArriveWg := sync.WaitGroup{} + messageFilterArriveWg.Add(1) + waitMessageArriveHandler := func(msg IncomingMessage) (out OutgoingMessage) { + messageFilterArriveWg.Done() + return + } + + // register all the handlers. + taggedHandlers := []TaggedMessageHandler{} + for tag := range defaultSendMessageTags { + taggedHandlers = append(taggedHandlers, TaggedMessageHandler{ + Tag: tag, + MessageHandler: HandlerFunc(msgHandler), + }) + } + netB.RegisterHandlers(taggedHandlers) + netA.RegisterHandlers([]TaggedMessageHandler{ + { + Tag: protocol.AgreementVoteTag, + MessageHandler: HandlerFunc(waitMessageArriveHandler), + }}) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + waitReady(t, netB, readyTimeout.C) + + netB.OnNetworkAdvance() + // TODO: better event driven thing for netB sending new MOI + time.Sleep(10 * time.Millisecond) + require.Equal(t, uint32(wantTXGossipNo), netB.wantTXGossip) + // send another message which we can track, so that we'll know that the first message was delivered. + netB.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + messageFilterArriveWg.Wait() + + messageArriveWg.Add(5 * 3) // we're expecting exactly 15 messages. + // send 5 messages of few types. + for i := 0; i < 5; i++ { + netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte{0, 1, 2, 3, 4}, true, nil) // THESE WILL BE DROPPED + netA.Broadcast(context.Background(), protocol.ProposalPayloadTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) + } + // wait until all the expected messages arrive. + messageArriveWg.Wait() + incomingMsgSync.Lock() + require.Equal(t, 3, len(msgCounters)) for tag, count := range msgCounters { - if tag == protocol.AgreementVoteTag || tag == protocol.ProposalPayloadTag { + if tag == protocol.TxnTag { + require.Equal(t, 0, count) + } else { + require.Equal(t, 5, count) + } + } + incomingMsgSync.Unlock() +} + +type participatingNodeInfo struct { +} + +func (nnni *participatingNodeInfo) IsParticipating() bool { + return true +} + +func TestWebsocketNetworkTXMessageOfInterestPN(t *testing.T) { + // Tests that A->B follows MOI + partitiontest.PartitionTest(t) + + netA := makeTestWebsocketNode(t) + netA.config.GossipFanout = 1 + netA.config.EnablePingHandler = false + netA.Start() + defer func() { t.Log("stopping A"); netA.Stop(); t.Log("A done") }() + + bConfig := defaultConfig + bConfig.NetAddress = "" + netB := makeTestWebsocketNodeWithConfig(t, bConfig) + netB.nodeInfo = &participatingNodeInfo{} + netB.config.GossipFanout = 1 + netB.config.EnablePingHandler = false + addrA, postListen := netA.Address() + require.True(t, postListen) + t.Log(addrA) + netB.phonebook.ReplacePeerList([]string{addrA}, "default", PhoneBookEntryRelayRole) + netB.Start() + defer func() { t.Log("stopping B"); netB.Stop(); t.Log("B done") }() + require.False(t, netB.relayMessages) + require.Equal(t, uint32(wantTXGossipUnk), netB.wantTXGossip) + + incomingMsgSync := deadlock.Mutex{} + msgCounters := make(map[protocol.Tag]int) + messageArriveWg := sync.WaitGroup{} + msgHandler := func(msg IncomingMessage) (out OutgoingMessage) { + incomingMsgSync.Lock() + defer incomingMsgSync.Unlock() + msgCounters[msg.Tag] = msgCounters[msg.Tag] + 1 + messageArriveWg.Done() + return + } + messageFilterArriveWg := sync.WaitGroup{} + messageFilterArriveWg.Add(1) + waitMessageArriveHandler := func(msg IncomingMessage) (out OutgoingMessage) { + messageFilterArriveWg.Done() + return + } + + // register all the handlers. + taggedHandlers := []TaggedMessageHandler{} + for tag := range defaultSendMessageTags { + taggedHandlers = append(taggedHandlers, TaggedMessageHandler{ + Tag: tag, + MessageHandler: HandlerFunc(msgHandler), + }) + } + netB.RegisterHandlers(taggedHandlers) + netA.RegisterHandlers([]TaggedMessageHandler{ + { + Tag: protocol.AgreementVoteTag, + MessageHandler: HandlerFunc(waitMessageArriveHandler), + }}) + + readyTimeout := time.NewTimer(2 * time.Second) + waitReady(t, netA, readyTimeout.C) + waitReady(t, netB, readyTimeout.C) + + netB.OnNetworkAdvance() + // TODO: better event driven thing for netB sending new MOI + time.Sleep(10 * time.Millisecond) + require.Equal(t, uint32(wantTXGossipYes), netB.wantTXGossip) + // send another message which we can track, so that we'll know that the first message was delivered. + netB.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + messageFilterArriveWg.Wait() + + messageArriveWg.Add(5 * 4) // we're expecting exactly 20 messages. + // send 5 messages of few types. + for i := 0; i < 5; i++ { + netA.Broadcast(context.Background(), protocol.AgreementVoteTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.TxnTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.ProposalPayloadTag, []byte{0, 1, 2, 3, 4}, true, nil) + netA.Broadcast(context.Background(), protocol.VoteBundleTag, []byte{0, 1, 2, 3, 4}, true, nil) + } + // wait until all the expected messages arrive. + messageArriveWg.Wait() + incomingMsgSync.Lock() + require.Equal(t, 4, len(msgCounters)) + for tag, count := range msgCounters { + if tag == protocol.TxnTag { require.Equal(t, 5, count) } else { - require.Equal(t, 0, count) + require.Equal(t, 5, count) } } + incomingMsgSync.Unlock() } // Set up two nodes, have one of them disconnect from the other, and monitor disconnection error on the side that did not issue the disconnection. diff --git a/network/wsPeer.go b/network/wsPeer.go index 272e39c294..2b451478e8 100644 --- a/network/wsPeer.go +++ b/network/wsPeer.go @@ -206,6 +206,9 @@ type wsPeer struct { // only gurentee is that it's being accessed only during startup and/or by the sending loop go routine. sendMessageTag map[protocol.Tag]bool + // messagesOfInterestGeneration is this node's messagesOfInterest version that we have seent to this peer. + messagesOfInterestGeneration uint32 + // connMonitor used to measure the relative performance of the connection // compared to the other outgoing connections. Incoming connections would have this // field set to nil. @@ -877,3 +880,12 @@ func (wp *wsPeer) setPeerData(key string, value interface{}) { wp.clientDataStore[key] = value } } + +func (wp *wsPeer) sendMessagesOfInterest(messagesOfInterestGeneration uint32, messagesOfInterestEnc []byte) { + err := wp.Unicast(wp.net.ctx, messagesOfInterestEnc, protocol.MsgOfInterestTag) + if err != nil { + wp.net.log.Errorf("ws send msgOfInterest: %v", err) + } else { + atomic.StoreUint32(&wp.messagesOfInterestGeneration, messagesOfInterestGeneration) + } +} diff --git a/network/wsPeer_test.go b/network/wsPeer_test.go index 60a0e3a799..550eb5fbda 100644 --- a/network/wsPeer_test.go +++ b/network/wsPeer_test.go @@ -22,6 +22,7 @@ import ( "time" "unsafe" + "github.com/algorand/go-algorand/logging" "github.com/algorand/go-algorand/test/partitiontest" "github.com/stretchr/testify/require" ) @@ -32,6 +33,9 @@ func TestCheckSlowWritingPeer(t *testing.T) { now := time.Now() peer := wsPeer{ intermittentOutgoingMessageEnqueueTime: 0, + wsPeerCore: wsPeerCore{net: &WebsocketNetwork{ + log: logging.TestingLog(t), + }}, } require.Equal(t, peer.CheckSlowWritingPeer(now), false) diff --git a/node/node.go b/node/node.go index c8ff6aa3e2..156f8fe336 100644 --- a/node/node.go +++ b/node/node.go @@ -175,7 +175,7 @@ func MakeFull(log logging.Logger, rootDir string, cfg config.Local, phonebookAdd node.config = cfg // tie network, block fetcher, and agreement services together - p2pNode, err := network.NewWebsocketNetwork(node.log, node.config, phonebookAddresses, genesis.ID(), genesis.Network) + p2pNode, err := network.NewWebsocketNetwork(node.log, node.config, phonebookAddresses, genesis.ID(), genesis.Network, node) if err != nil { log.Errorf("could not create websocket node: %v", err) return nil, err @@ -1379,3 +1379,20 @@ func (node *AlgorandFullNode) VotingKeys(votingRound, keysRound basics.Round) [] func (node *AlgorandFullNode) Record(account basics.Address, round basics.Round, participationType account.ParticipationAction) { node.accountManager.Record(account, round, participationType) } + +// IsParticipating implements network.NodeInfo +// +// This function is not fully precise. node.ledger and +// node.accountManager might move relative to each other and there is +// no synchronization. This is good-enough for current uses of +// IsParticipating() which is used in networking code to determine if +// the node should ask for transaction gossip (or skip it to save +// bandwidth). The current transaction pool size is about 3 +// rounds. Starting to receive transaction gossip 10 rounds in the +// future when we might propose or vote on blocks in that future is a +// little extra buffer but seems reasonable at this time. -- bolson +// 2022-05-18 +func (node *AlgorandFullNode) IsParticipating() bool { + round := node.ledger.Latest() + 1 + return node.accountManager.HasLiveKeys(round, round+10) +} From c9f4151785d0328155dc793465544b8f13166a64 Mon Sep 17 00:00:00 2001 From: algolucky Date: Wed, 25 May 2022 08:47:34 -0500 Subject: [PATCH 25/34] fix: place updater in same directory as update.sh and add verify option (#3983) --- cmd/updater/update.sh | 123 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 106 insertions(+), 17 deletions(-) diff --git a/cmd/updater/update.sh b/cmd/updater/update.sh index 60fbe05617..3ed4622bad 100755 --- a/cmd/updater/update.sh +++ b/cmd/updater/update.sh @@ -22,6 +22,7 @@ GENESIS_NETWORK_DIR_SPEC="" SKIP_UPDATE=0 TOOLS_OUTPUT_DIR="" DRYRUN=false +VERIFY_UPDATER_ARCHIVE="0" IS_ROOT=false if [ $EUID -eq 0 ]; then IS_ROOT=true @@ -100,6 +101,10 @@ while [ "$1" != "" ]; do shift TOOLS_OUTPUT_DIR=$1 ;; + -verify) + shift + VERIFY_UPDATER_ARCHIVE="1" + ;; -z) DRYRUN=true ;; @@ -190,50 +195,134 @@ function get_updater_url() { echo "This operation system ${UNAME} is not supported by updater." exit 1 fi - UPDATER_FILENAME="install_master_${OS}-${ARCH}.tar.gz" - UPDATER_URL="https://github.com/algorand/go-algorand-doc/raw/master/downloads/installers/${OS}_${ARCH}/${UPDATER_FILENAME}" + + # the updater will auto-update itself to the latest version, this means that the version of updater that is downloaded + # can be arbitrary as long as the self-updating functionality is working, hence the hard-coded version + UPDATER_URL="http://algorand-dev-deb-repo.s3-website-us-east-1.amazonaws.com/releases/stable/f9d842778_3.6.2/install_stable_${OS}-${ARCH}_3.6.2.tar.gz" + UPDATER_FILENAME="install_stable_${OS}-${ARCH}_3.6.2.tar.gz" + + # if on linux, also set variables for signature and checksum validation + if [ "$OS" = "linux" ] && [ "$VERIFY_UPDATER_ARCHIVE" = "1" ]; then + UPDATER_PUBKEYURL="https://releases.algorand.com/key.pub" + UPDATER_SIGURL="http://algorand-dev-deb-repo.s3-website-us-east-1.amazonaws.com/releases/stable/f9d842778_3.6.2/install_stable_${OS}-${ARCH}_3.6.2.tar.gz.sig" + UPDATER_CHECKSUMURL="https://algorand-releases.s3.amazonaws.com/channel/stable/hashes_stable_${OS}_${ARCH}_3.6.2" + fi } # check to see if the binary updater exists. if not, it will automatically the correct updater binary for the current platform function check_for_updater() { + local UNAME + UNAME="$(uname)" + # check if the updater binary exist and is not empty. if [[ -s "${SCRIPTPATH}/updater" && -f "${SCRIPTPATH}/updater" ]]; then return 0 fi + + # set UPDATER_URL and UPDATER_ARCHIVE as a global that can be referenced here + # if linux, UPDATER_PUBKEYURL, UPDATER_SIGURL, UPDATER_CHECKSUMURL will be set to try verification get_updater_url - # check the curl is available. - CURL_VER=$(curl -V 2>/dev/null || true) - if [ "${CURL_VER}" = "" ]; then + # check if curl is available + if ! type curl &>/dev/null; then # no curl is installed. echo "updater binary is missing and cannot be downloaded since curl is missing." - if [[ "$(uname)" = "Linux" ]]; then + if [ "$UNAME" = "Linux" ]; then echo "To install curl, run the following command:" echo "apt-get update; apt-get install -y curl" fi exit 1 fi - CURL_OUT=$(curl -LJO --silent ${UPDATER_URL}) - if [ "$?" != "0" ]; then - echo "failed to download updater binary from ${UPDATER_URL} using curl." - echo "${CURL_OUT}" + # create temporary directory for updater archive + local UPDATER_TEMPDIR="" UPDATER_ARCHIVE="" + UPDATER_TEMPDIR="$(mktemp -d 2>/dev/null || mktemp -d -t "tmp")" + UPDATER_ARCHIVE="${UPDATER_TEMPDIR}/${UPDATER_FILENAME}" + + # download updater archive + if ! curl -sSL "$UPDATER_URL" -o "$UPDATER_ARCHIVE"; then + echo "failed to download updater archive from ${UPDATER_URL} using curl." exit 1 fi - if [ ! -f "${SCRIPTPATH}/${UPDATER_FILENAME}" ]; then - echo "downloaded file ${SCRIPTPATH}/${UPDATER_FILENAME} is missing." + if [ ! -f "$UPDATER_ARCHIVE" ]; then + echo "downloaded file ${UPDATER_ARCHIVE} is missing." exit fi - tar -zxvf "${SCRIPTPATH}/${UPDATER_FILENAME}" updater - if [ "$?" != "0" ]; then - echo "failed to extract updater binary from ${SCRIPTPATH}/${UPDATER_FILENAME}" + # if -verify command line flag is set, try verifying updater archive + if [ "$VERIFY_UPDATER_ARCHIVE" = "1" ]; then + # if linux, check for checksum and signature validation dependencies + local GPG_VERIFY="0" CHECKSUM_VERIFY="0" + if [ "$UNAME" = "Linux" ]; then + if type gpg >&/dev/null; then + GPG_VERIFY="1" + else + echo "gpg is not available to perform signature validation." + fi + + if type sha256sum &>/dev/null; then + CHECKSUM_VERIFY="1" + else + echo "sha256sum is not available to perform checksum validation." + fi + fi + + # try signature validation + if [ "$GPG_VERIFY" = "1" ]; then + local UPDATER_SIGFILE="$UPDATER_TEMPDIR/updater.sig" UPDATER_PUBKEYFILE="key.pub" + # try downloading public key + if curl -sSL "$UPDATER_PUBKEYURL" -o "$UPDATER_PUBKEYFILE"; then + GNUPGHOME="$(mktemp -d)"; export GNUPGHOME + if gpg --import "$UPDATER_PUBKEYFILE"; then + if curl -sSL "$UPDATER_SIGURL" -o "$UPDATER_SIGFILE"; then + if ! gpg --verify "$UPDATER_SIGFILE" "$UPDATER_ARCHIVE"; then + echo "failed to verify signature of updater archive." + exit 1 + fi + else + echo "failed download signature file, cannot perform signature validation." + fi + else + echo "failed importing GPG public key, cannot perform signature validation." + fi + # clean up temporary directory used for signature validation + rm -rf "$GNUPGHOME"; unset GNUPGHOME + else + echo "failed downloading GPG public key, cannot perform signature validation." + fi + fi + + # try checksum validation + if [ "$CHECKSUM_VERIFY" = "1" ]; then + local UPDATER_CHECKSUMFILE="$UPDATER_TEMPDIR/updater.checksum" + # try downloading checksum file + if curl -sSL "$UPDATER_CHECKSUMURL" -o "$UPDATER_CHECKSUMFILE"; then + # have to be in same directory as archive + pushd "$UPDATER_TEMPDIR" + if ! sha256sum --quiet --ignore-missing -c "$UPDATER_CHECKSUMFILE"; then + echo "failed to verify checksum of updater archive." + popd + exit 1 + fi + popd + else + echo "failed downloading checksum file, cannot perform checksum validation." + fi + fi + fi + + # extract and install updater + if ! tar -zxf "$UPDATER_ARCHIVE" -C "$UPDATER_TEMPDIR" updater; then + echo "failed to extract updater binary from ${UPDATER_ARCHIVE}" exit 1 + else + mv "${UPDATER_TEMPDIR}/updater" "$SCRIPTPATH" fi - rm -f "${SCRIPTPATH}/${UPDATER_FILENAME}" - echo "updater binary was downloaded" + # clean up temp directory + rm -rf "$UPDATER_TEMPDIR" + echo "updater binary was installed at ${SCRIPTPATH}/updater" } function check_for_update() { From 2df7468fa4ef71fefceff4ab1688c8badb3d1464 Mon Sep 17 00:00:00 2001 From: nullun Date: Wed, 25 May 2022 15:43:23 +0100 Subject: [PATCH 26/34] Added generate-docs command to tealdbg (#3830) When generating the CLI documentation for the Developer Portal it was noticed that tealdbg was missing. Much like goal, kmd, and algokey, added the "generate-docs" command option to generate the markdown output. --- cmd/tealdbg/main.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmd/tealdbg/main.go b/cmd/tealdbg/main.go index 97701b9791..9ab3d3dec0 100644 --- a/cmd/tealdbg/main.go +++ b/cmd/tealdbg/main.go @@ -23,11 +23,23 @@ import ( "github.com/gorilla/mux" "github.com/spf13/cobra" + "github.com/spf13/cobra/doc" cmdutil "github.com/algorand/go-algorand/cmd/util" ) func main() { + // Hidden command to generate docs in a given directory + // tealdbg generate-docs [path] + if len(os.Args) == 3 && os.Args[1] == "generate-docs" { + err := doc.GenMarkdownTree(rootCmd, os.Args[2]) + if err != nil { + log.Println(err) + os.Exit(1) + } + os.Exit(0) + } + if err := rootCmd.Execute(); err != nil { log.Println(err) os.Exit(1) From a3003ec5668d20e81c9b1d24b09dfaf8eff524fc Mon Sep 17 00:00:00 2001 From: Or Aharonee Date: Thu, 26 May 2022 16:21:32 +0300 Subject: [PATCH 27/34] Add missing HashType to GetProof endpoint (#3985) --- daemon/algod/api/server/v2/handlers.go | 1 + daemon/algod/api/server/v2/test/handlers_test.go | 1 + 2 files changed, 2 insertions(+) diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go index 4e7a41b0fc..9e18ca7d25 100644 --- a/daemon/algod/api/server/v2/handlers.go +++ b/daemon/algod/api/server/v2/handlers.go @@ -638,6 +638,7 @@ func (v2 *Handlers) GetProof(ctx echo.Context, round uint64, txid string, params Stibhash: stibhash[:], Idx: uint64(idx), Treedepth: uint64(proof.TreeDepth), + Hashtype: hashtype, } return ctx.JSON(http.StatusOK, response) diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go index f569c9a50a..af970f4b14 100644 --- a/daemon/algod/api/server/v2/test/handlers_test.go +++ b/daemon/algod/api/server/v2/test/handlers_test.go @@ -936,6 +936,7 @@ func TestGetProofDefault(t *testing.T) { var resp generatedV2.ProofResponse err = json.Unmarshal(rec.Body.Bytes(), &resp) a.NoError(err) + a.Equal("sha512_256", resp.Hashtype) l := handler.Node.LedgerForAPI() blkHdr, err := l.BlockHdr(1) From 7147d015abf8ffb3b1039a859699771a7c275ddd Mon Sep 17 00:00:00 2001 From: algoidurovic <91566643+algoidurovic@users.noreply.github.com> Date: Thu, 26 May 2022 10:25:37 -0400 Subject: [PATCH 28/34] Dryrun: Split dryrun cost field into BudgetConsumed and BudgetAdded (#3957) --- cmd/goal/clerk.go | 6 + daemon/algod/api/algod.oas2.json | 10 +- daemon/algod/api/algod.oas3.yml | 10 +- daemon/algod/api/server/v2/dryrun.go | 23 +- daemon/algod/api/server/v2/dryrun_test.go | 65 ++- .../api/server/v2/generated/private/routes.go | 296 ++++++------- .../api/server/v2/generated/private/types.go | 8 +- .../algod/api/server/v2/generated/routes.go | 398 +++++++++--------- daemon/algod/api/server/v2/generated/types.go | 8 +- .../cli/goal/expect/goalDryrunRestTest.exp | 2 +- 10 files changed, 462 insertions(+), 364 deletions(-) diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go index ac570ffb54..000304fa3e 100644 --- a/cmd/goal/clerk.go +++ b/cmd/goal/clerk.go @@ -1214,6 +1214,12 @@ var dryrunRemoteCmd = &cobra.Command{ if txnResult.Cost != nil { fmt.Fprintf(os.Stdout, "tx[%d] cost: %d\n", i, *txnResult.Cost) } + if txnResult.BudgetConsumed != nil { + fmt.Fprintf(os.Stdout, "tx[%d] budget consumed: %d\n", i, *txnResult.BudgetConsumed) + } + if txnResult.BudgetAdded != nil { + fmt.Fprintf(os.Stdout, "tx[%d] budget added: %d\n", i, *txnResult.BudgetAdded) + } fmt.Fprintf(os.Stdout, "tx[%d] messages:\n", i) for _, msg := range msgs { diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 736ce0a268..8e2c69e54c 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -2295,8 +2295,16 @@ "format": "byte" } }, + "budget-added": { + "description": "Budget added during execution of app call transaction.", + "type": "integer" + }, + "budget-consumed": { + "description": "Budget consumed during execution of app call transaction.", + "type": "integer" + }, "cost": { - "description": "Execution cost of app call transaction", + "description": "Net cost of app execution. Field is DEPRECATED and is subject for removal. Instead, use `budget-added` and `budget-consumed.", "type": "integer" } } diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index d71a2dbd9e..0fa09dd559 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -1328,8 +1328,16 @@ }, "type": "array" }, + "budget-added": { + "description": "Budget added during execution of app call transaction.", + "type": "integer" + }, + "budget-consumed": { + "description": "Budget consumed during execution of app call transaction.", + "type": "integer" + }, "cost": { - "description": "Execution cost of app call transaction", + "description": "Net cost of app execution. Field is DEPRECATED and is subject for removal. Instead, use `budget-added` and `budget-consumed.", "type": "integer" }, "disassembly": { diff --git a/daemon/algod/api/server/v2/dryrun.go b/daemon/algod/api/server/v2/dryrun.go index eea36a9755..d3b85de39a 100644 --- a/daemon/algod/api/server/v2/dryrun.go +++ b/daemon/algod/api/server/v2/dryrun.go @@ -541,8 +541,17 @@ func doDryrunRequest(dr *DryrunRequest, response *generated.DryrunResponse) { err = fmt.Errorf("cost budget exceeded: budget is %d but program cost was %d", allowedBudget-cumulativeCost, cost) } } - cost64 := uint64(cost) - result.Cost = &cost64 + // The cost is broken up into two fields: budgetAdded and budgetConsumed. + // This is necessary because the fields can only be represented as unsigned + // integers, so a negative cost would underflow. The two fields also provide + // more information, which can be useful for testing purposes. + // cost = budgetConsumed - budgetAdded + netCost := uint64(cost) + budgetAdded := uint64(proto.MaxAppProgramCost * numInnerTxns(delta)) + budgetConsumed := uint64(cost) + budgetAdded + result.Cost = &netCost + result.BudgetAdded = &budgetAdded + result.BudgetConsumed = &budgetConsumed maxCurrentBudget = pooledAppBudget cumulativeCost += cost @@ -624,3 +633,13 @@ func MergeAppParams(base *basics.AppParams, update *basics.AppParams) { base.GlobalStateSchema = update.GlobalStateSchema } } + +// count all inner transactions contained within the eval delta +func numInnerTxns(delta transactions.EvalDelta) (cnt int) { + cnt = len(delta.InnerTxns) + for _, itxn := range delta.InnerTxns { + cnt += numInnerTxns(itxn.EvalDelta) + } + + return +} diff --git a/daemon/algod/api/server/v2/dryrun_test.go b/daemon/algod/api/server/v2/dryrun_test.go index c2722627b6..cfa87cb986 100644 --- a/daemon/algod/api/server/v2/dryrun_test.go +++ b/daemon/algod/api/server/v2/dryrun_test.go @@ -1260,18 +1260,20 @@ func TestDryrunCost(t *testing.T) { msg string numHashes int }{ - {"REJECT", 12}, - {"PASS", 5}, + {"REJECT", 22}, + {"PASS", 16}, } for _, test := range tests { t.Run(test.msg, func(t *testing.T) { - costs := make([]uint64, 2) + expectedCosts := make([]int64, 3) + expectedBudgetAdded := make([]uint64, 3) ops, err := logic.AssembleString("#pragma version 5\nbyte 0x41\n" + strings.Repeat("keccak256\n", test.numHashes) + "pop\nint 1\n") require.NoError(t, err) - approval := ops.Program - costs[0] = 3 + uint64(test.numHashes)*130 + app1 := ops.Program + expectedCosts[0] = 3 + int64(test.numHashes)*130 + expectedBudgetAdded[0] = 0 ops, err = logic.AssembleString("int 1") require.NoError(t, err) @@ -1279,8 +1281,26 @@ func TestDryrunCost(t *testing.T) { ops, err = logic.AssembleString("#pragma version 5 \nint 1 \nint 2 \npop") require.NoError(t, err) - approv := ops.Program - costs[1] = 3 + app2 := ops.Program + expectedCosts[1] = 3 + expectedBudgetAdded[1] = 0 + + ops, err = logic.AssembleString(`#pragma version 6 +itxn_begin +int appl +itxn_field TypeEnum +int DeleteApplication +itxn_field OnCompletion +byte 0x068101 // #pragma version 6; int 1; +itxn_field ApprovalProgram +byte 0x068101 // #pragma version 6; int 1; +itxn_field ClearStateProgram +itxn_submit +int 1`) + require.NoError(t, err) + app3 := ops.Program + expectedCosts[2] = -687 + expectedBudgetAdded[2] = 700 var appIdx basics.AppIndex = 1 creator := randomAddress() @@ -1307,13 +1327,23 @@ func TestDryrunCost(t *testing.T) { }, }, }, + { + Txn: transactions.Transaction{ + Header: transactions.Header{Sender: sender}, + Type: protocol.ApplicationCallTx, + ApplicationCallTxnFields: transactions.ApplicationCallTxnFields{ + ApplicationID: appIdx + 2, + OnCompletion: transactions.OptInOC, + }, + }, + }, }, Apps: []generated.Application{ { Id: uint64(appIdx), Params: generated.ApplicationParams{ Creator: creator.String(), - ApprovalProgram: approval, + ApprovalProgram: app1, ClearStateProgram: clst, LocalStateSchema: &generated.ApplicationStateSchema{NumByteSlice: 1}, }, @@ -1322,7 +1352,16 @@ func TestDryrunCost(t *testing.T) { Id: uint64(appIdx + 1), Params: generated.ApplicationParams{ Creator: creator.String(), - ApprovalProgram: approv, + ApprovalProgram: app2, + ClearStateProgram: clst, + LocalStateSchema: &generated.ApplicationStateSchema{NumByteSlice: 1}, + }, + }, + { + Id: uint64(appIdx + 2), + Params: generated.ApplicationParams{ + Creator: creator.String(), + ApprovalProgram: app3, ClearStateProgram: clst, LocalStateSchema: &generated.ApplicationStateSchema{NumByteSlice: 1}, }, @@ -1340,13 +1379,15 @@ func TestDryrunCost(t *testing.T) { var response generated.DryrunResponse doDryrunRequest(&dr, &response) require.Empty(t, response.Error) - require.Equal(t, 2, len(response.Txns)) + require.Equal(t, 3, len(response.Txns)) for i, txn := range response.Txns { messages := *txn.AppCallMessages require.GreaterOrEqual(t, len(messages), 1) - require.NotNil(t, *txn.Cost) - require.Equal(t, costs[i], *txn.Cost) + cost := int64(*txn.BudgetConsumed) - int64(*txn.BudgetAdded) + require.NotNil(t, cost) + require.Equal(t, expectedCosts[i], cost) + require.Equal(t, expectedBudgetAdded[i], *txn.BudgetAdded) statusMatches := false costExceedFound := false for _, msg := range messages { diff --git a/daemon/algod/api/server/v2/generated/private/routes.go b/daemon/algod/api/server/v2/generated/private/routes.go index abb34906f8..72eb4a7b19 100644 --- a/daemon/algod/api/server/v2/generated/private/routes.go +++ b/daemon/algod/api/server/v2/generated/private/routes.go @@ -311,153 +311,155 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/private/types.go b/daemon/algod/api/server/v2/generated/private/types.go index 2a0c193e00..17485641d5 100644 --- a/daemon/algod/api/server/v2/generated/private/types.go +++ b/daemon/algod/api/server/v2/generated/private/types.go @@ -316,7 +316,13 @@ type DryrunTxnResult struct { AppCallMessages *[]string `json:"app-call-messages,omitempty"` AppCallTrace *[]DryrunState `json:"app-call-trace,omitempty"` - // Execution cost of app call transaction + // Budget added during execution of app call transaction. + BudgetAdded *uint64 `json:"budget-added,omitempty"` + + // Budget consumed during execution of app call transaction. + BudgetConsumed *uint64 `json:"budget-consumed,omitempty"` + + // Net cost of app execution. Field is DEPRECATED and is subject for removal. Instead, use `budget-added` and `budget-consumed. Cost *uint64 `json:"cost,omitempty"` // Disassembled program line by line. diff --git a/daemon/algod/api/server/v2/generated/routes.go b/daemon/algod/api/server/v2/generated/routes.go index 065a90fffa..fa62e543f5 100644 --- a/daemon/algod/api/server/v2/generated/routes.go +++ b/daemon/algod/api/server/v2/generated/routes.go @@ -788,204 +788,206 @@ func RegisterHandlers(router interface { // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the Swagger specification corresponding to the generated code diff --git a/daemon/algod/api/server/v2/generated/types.go b/daemon/algod/api/server/v2/generated/types.go index 9372cc5650..53983915d6 100644 --- a/daemon/algod/api/server/v2/generated/types.go +++ b/daemon/algod/api/server/v2/generated/types.go @@ -316,7 +316,13 @@ type DryrunTxnResult struct { AppCallMessages *[]string `json:"app-call-messages,omitempty"` AppCallTrace *[]DryrunState `json:"app-call-trace,omitempty"` - // Execution cost of app call transaction + // Budget added during execution of app call transaction. + BudgetAdded *uint64 `json:"budget-added,omitempty"` + + // Budget consumed during execution of app call transaction. + BudgetConsumed *uint64 `json:"budget-consumed,omitempty"` + + // Net cost of app execution. Field is DEPRECATED and is subject for removal. Instead, use `budget-added` and `budget-consumed. Cost *uint64 `json:"cost,omitempty"` // Disassembled program line by line. diff --git a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp index 75d81faeba..26a2b24e11 100644 --- a/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp +++ b/test/e2e-go/cli/goal/expect/goalDryrunRestTest.exp @@ -9,7 +9,7 @@ proc TestGoalDryrun { DRREQ_FILE TEST_PRIMARY_NODE_DIR } { spawn goal clerk dryrun-remote -d $TEST_PRIMARY_NODE_DIR -D $DRREQ_FILE -v expect { timeout { ::AlgorandGoal::Abort "goal clerk dryrun-remote timeout" } - "cost:" {set COST 1; exp_continue} + "budget consumed:" {set COST 1; exp_continue} -re {(ApprovalProgram)} {set PROGRAM_TYPE $expect_out(1,string); exp_continue} "PASS" {set PASSED 1; close} } From 8a893dd5f996e3ea5e495ec928300a0ec90b36af Mon Sep 17 00:00:00 2001 From: Ikko Ashimine Date: Fri, 27 May 2022 02:25:11 +0900 Subject: [PATCH 29/34] Fix typo in bandwidthFilter_test.go (#4028) reseting -> resetting --- agreement/fuzzer/bandwidthFilter_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/agreement/fuzzer/bandwidthFilter_test.go b/agreement/fuzzer/bandwidthFilter_test.go index e06ff72602..e5a31bf2e0 100644 --- a/agreement/fuzzer/bandwidthFilter_test.go +++ b/agreement/fuzzer/bandwidthFilter_test.go @@ -167,7 +167,7 @@ func (n *BandwidthFilter) Tick(newClockTime int) bool { n.downstreamMutex.Lock() if n.downstreamDataSize < 0 && n.downstreamQueue.Len() == 0 { if n.debugMessageLevel >= 1 { - fmt.Printf("node: %d, tick: %d, reseting queued downstream capacity %d -> 0\n", n.nodeID, n.currentTick, n.upstreamDataSize) + fmt.Printf("node: %d, tick: %d, resetting queued downstream capacity %d -> 0\n", n.nodeID, n.currentTick, n.upstreamDataSize) } n.downstreamDataSize = 0 } @@ -179,7 +179,7 @@ func (n *BandwidthFilter) Tick(newClockTime int) bool { // adjust the upstream size. if n.upstreamDataSize < 0 && n.upstreamQueue.Len() == 0 { if n.debugMessageLevel >= 1 { - fmt.Printf("node: %d, tick: %d, reseting queued upstream capacity %d -> 0\n", n.nodeID, n.currentTick, n.upstreamDataSize) + fmt.Printf("node: %d, tick: %d, resetting queued upstream capacity %d -> 0\n", n.nodeID, n.currentTick, n.upstreamDataSize) } n.upstreamDataSize = 0 } From c516ac37ef1e27090c36a22e434479ccd24196af Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Thu, 26 May 2022 15:10:16 -0400 Subject: [PATCH 30/34] metrics: collect and report Go runtime.metrics (#4041) * add metrics.RuntimeMetrics * hook up EnableRuntimeMetrics as new config variable * set EnableRuntimeMetrics: true in netgoal-generated configs * add EnableRuntimeMetrics to bootstrappedScenario and custom recipes * check that all defaultRuntimeMetrics are supported by current version of go * add TestSanitizePrometheusName * add partitiontest to new tests * use algod_go_ prefix for prometheus runtime metrics --- config/localTemplate.go | 5 +- config/local_defaults.go | 3 +- daemon/algod/server.go | 4 + installer/config.json.example | 3 +- netdeploy/networkTemplate.go | 1 + test/testdata/configs/config-v22.json | 105 +++++++++ .../recipes/bootstrappedScenario/net.json | 216 +++++++++--------- .../recipes/bootstrappedScenario/node.json | 4 +- .../recipes/bootstrappedScenario/relay.json | 2 +- .../recipes/custom/configs/node.json | 4 +- .../recipes/custom/example/configs/node.json | 4 +- util/metrics/metrics_test.go | 29 +++ util/metrics/registryCommon.go | 8 + util/metrics/runtime.go | 137 +++++++++++ util/metrics/runtime_test.go | 59 +++++ 15 files changed, 466 insertions(+), 118 deletions(-) create mode 100644 test/testdata/configs/config-v22.json create mode 100644 util/metrics/runtime.go create mode 100644 util/metrics/runtime_test.go diff --git a/config/localTemplate.go b/config/localTemplate.go index 1e95d5f999..74c69c0cf4 100644 --- a/config/localTemplate.go +++ b/config/localTemplate.go @@ -41,7 +41,7 @@ type Local struct { // Version tracks the current version of the defaults so we can migrate old -> new // This is specifically important whenever we decide to change the default value // for an existing parameter. This field tag must be updated any time we add a new version. - Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19" version[20]:"20" version[21]:"21"` + Version uint32 `version[0]:"0" version[1]:"1" version[2]:"2" version[3]:"3" version[4]:"4" version[5]:"5" version[6]:"6" version[7]:"7" version[8]:"8" version[9]:"9" version[10]:"10" version[11]:"11" version[12]:"12" version[13]:"13" version[14]:"14" version[15]:"15" version[16]:"16" version[17]:"17" version[18]:"18" version[19]:"19" version[20]:"20" version[21]:"21" version[22]:"22"` // environmental (may be overridden) // When enabled, stores blocks indefinitally, otherwise, only the most recents blocks @@ -251,6 +251,9 @@ type Local struct { // the algod api will be exposed to untrusted individuals EnableProfiler bool `version[0]:"false"` + // EnableRuntimeMetrics exposes Go runtime metrics in /metrics and via node_exporter. + EnableRuntimeMetrics bool `version[22]:"false"` + // TelemetryToLog records messages to node.log that are normally sent to remote event monitoring TelemetryToLog bool `version[5]:"true"` diff --git a/config/local_defaults.go b/config/local_defaults.go index 55eba24d14..b8354926b4 100644 --- a/config/local_defaults.go +++ b/config/local_defaults.go @@ -20,7 +20,7 @@ package config var defaultLocal = Local{ - Version: 21, + Version: 22, AccountUpdatesStatsInterval: 5000000000, AccountsRebuildSynchronousMode: 1, AgreementIncomingBundlesQueueLength: 7, @@ -68,6 +68,7 @@ var defaultLocal = Local{ EnableProcessBlockStats: false, EnableProfiler: false, EnableRequestLogger: false, + EnableRuntimeMetrics: false, EnableTopAccountsReporting: false, EnableVerbosedTransactionSyncLogging: false, EndpointAddress: "127.0.0.1:0", diff --git a/daemon/algod/server.go b/daemon/algod/server.go index d3b9ff2f57..07e206a816 100644 --- a/daemon/algod/server.go +++ b/daemon/algod/server.go @@ -203,6 +203,10 @@ func (s *Server) Start() { cfg := s.node.Config() + if cfg.EnableRuntimeMetrics { + metrics.DefaultRegistry().Register(metrics.NewRuntimeMetrics()) + } + if cfg.EnableMetricReporting { if err := s.metricCollector.Start(context.Background()); err != nil { // log this error diff --git a/installer/config.json.example b/installer/config.json.example index b7369acfa8..c569e4c93d 100644 --- a/installer/config.json.example +++ b/installer/config.json.example @@ -1,5 +1,5 @@ { - "Version": 21, + "Version": 22, "AccountUpdatesStatsInterval": 5000000000, "AccountsRebuildSynchronousMode": 1, "AgreementIncomingBundlesQueueLength": 7, @@ -47,6 +47,7 @@ "EnableProcessBlockStats": false, "EnableProfiler": false, "EnableRequestLogger": false, + "EnableRuntimeMetrics": false, "EnableTopAccountsReporting": false, "EnableVerbosedTransactionSyncLogging": false, "EndpointAddress": "127.0.0.1:0", diff --git a/netdeploy/networkTemplate.go b/netdeploy/networkTemplate.go index dc485879e4..293fbaa865 100644 --- a/netdeploy/networkTemplate.go +++ b/netdeploy/networkTemplate.go @@ -246,6 +246,7 @@ func createConfigFile(node remote.NodeConfigGoal, configFile string, numNodes in cfg.EndpointAddress = "127.0.0.1:0" cfg.DNSBootstrapID = "" cfg.EnableProfiler = true + cfg.EnableRuntimeMetrics = true if relaysCount == 0 { cfg.DisableNetworking = true } diff --git a/test/testdata/configs/config-v22.json b/test/testdata/configs/config-v22.json new file mode 100644 index 0000000000..c569e4c93d --- /dev/null +++ b/test/testdata/configs/config-v22.json @@ -0,0 +1,105 @@ +{ + "Version": 22, + "AccountUpdatesStatsInterval": 5000000000, + "AccountsRebuildSynchronousMode": 1, + "AgreementIncomingBundlesQueueLength": 7, + "AgreementIncomingProposalsQueueLength": 25, + "AgreementIncomingVotesQueueLength": 10000, + "AnnounceParticipationKey": true, + "Archival": false, + "BaseLoggerDebugLevel": 4, + "BlockServiceCustomFallbackEndpoints": "", + "BroadcastConnectionsLimit": -1, + "CadaverSizeTarget": 1073741824, + "CatchpointFileHistoryLength": 365, + "CatchpointInterval": 10000, + "CatchpointTracking": 0, + "CatchupBlockDownloadRetryAttempts": 1000, + "CatchupBlockValidateMode": 0, + "CatchupFailurePeerRefreshRate": 10, + "CatchupGossipBlockFetchTimeoutSec": 4, + "CatchupHTTPBlockFetchTimeoutSec": 4, + "CatchupLedgerDownloadRetryAttempts": 50, + "CatchupParallelBlocks": 16, + "ConnectionsRateLimitingCount": 60, + "ConnectionsRateLimitingWindowSeconds": 1, + "DNSBootstrapID": ".algorand.network", + "DNSSecurityFlags": 1, + "DeadlockDetection": 0, + "DeadlockDetectionThreshold": 30, + "DisableLocalhostConnectionRateLimit": true, + "DisableNetworking": false, + "DisableOutgoingConnectionThrottling": false, + "EnableAccountUpdatesStats": false, + "EnableAgreementReporting": false, + "EnableAgreementTimeMetrics": false, + "EnableAssembleStats": false, + "EnableBlockService": false, + "EnableBlockServiceFallbackToArchiver": true, + "EnableCatchupFromArchiveServers": false, + "EnableDeveloperAPI": false, + "EnableGossipBlockService": true, + "EnableIncomingMessageFilter": false, + "EnableLedgerService": false, + "EnableMetricReporting": false, + "EnableOutgoingNetworkMessageFiltering": true, + "EnablePingHandler": true, + "EnableProcessBlockStats": false, + "EnableProfiler": false, + "EnableRequestLogger": false, + "EnableRuntimeMetrics": false, + "EnableTopAccountsReporting": false, + "EnableVerbosedTransactionSyncLogging": false, + "EndpointAddress": "127.0.0.1:0", + "FallbackDNSResolverAddress": "", + "ForceFetchTransactions": false, + "ForceRelayMessages": false, + "GossipFanout": 4, + "IncomingConnectionsLimit": 800, + "IncomingMessageFilterBucketCount": 5, + "IncomingMessageFilterBucketSize": 512, + "IsIndexerActive": false, + "LedgerSynchronousMode": 2, + "LogArchiveMaxAge": "", + "LogArchiveName": "node.archive.log", + "LogSizeLimit": 1073741824, + "MaxAPIResourcesPerAccount": 100000, + "MaxCatchpointDownloadDuration": 7200000000000, + "MaxConnectionsPerIP": 30, + "MinCatchpointFileDownloadBytesPerSecond": 20480, + "NetAddress": "", + "NetworkMessageTraceServer": "", + "NetworkProtocolVersion": "", + "NodeExporterListenAddress": ":9100", + "NodeExporterPath": "./node_exporter", + "OptimizeAccountsDatabaseOnStartup": false, + "OutgoingMessageFilterBucketCount": 3, + "OutgoingMessageFilterBucketSize": 128, + "ParticipationKeysRefreshInterval": 60000000000, + "PeerConnectionsUpdateInterval": 3600, + "PeerPingPeriodSeconds": 0, + "PriorityPeers": {}, + "ProposalAssemblyTime": 250000000, + "PublicAddress": "", + "ReconnectTime": 60000000000, + "ReservedFDs": 256, + "RestConnectionsHardLimit": 2048, + "RestConnectionsSoftLimit": 1024, + "RestReadTimeoutSeconds": 15, + "RestWriteTimeoutSeconds": 120, + "RunHosted": false, + "SuggestedFeeBlockHistory": 3, + "SuggestedFeeSlidingWindowSize": 50, + "TLSCertFile": "", + "TLSKeyFile": "", + "TelemetryToLog": true, + "TransactionSyncDataExchangeRate": 0, + "TransactionSyncSignificantMessageThreshold": 0, + "TxPoolExponentialIncreaseFactor": 2, + "TxPoolSize": 15000, + "TxSyncIntervalSeconds": 60, + "TxSyncServeResponseSize": 1000000, + "TxSyncTimeoutSeconds": 30, + "UseXForwardedForAddressField": "", + "VerifiedTranscationsCacheSize": 30000 +} diff --git a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/net.json b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/net.json index b971cdce54..0afb4418ae 100644 --- a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/net.json +++ b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/net.json @@ -16,7 +16,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -36,7 +36,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -56,7 +56,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -76,7 +76,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -96,7 +96,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -116,7 +116,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -136,7 +136,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -156,7 +156,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -179,7 +179,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node21", @@ -196,7 +196,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node41", @@ -213,7 +213,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node61", @@ -230,7 +230,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node81", @@ -247,7 +247,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -270,7 +270,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node22", @@ -287,7 +287,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node42", @@ -304,7 +304,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node62", @@ -321,7 +321,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node82", @@ -338,7 +338,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -361,7 +361,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node23", @@ -378,7 +378,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node43", @@ -395,7 +395,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node63", @@ -412,7 +412,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node83", @@ -429,7 +429,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" } ] }, @@ -452,7 +452,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node24", @@ -469,7 +469,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node44", @@ -486,7 +486,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node64", @@ -503,7 +503,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node84", @@ -520,7 +520,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -543,7 +543,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node25", @@ -560,7 +560,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node45", @@ -577,7 +577,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node65", @@ -594,7 +594,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node85", @@ -611,7 +611,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -634,7 +634,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node26", @@ -651,7 +651,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node46", @@ -668,7 +668,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node66", @@ -685,7 +685,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node86", @@ -702,7 +702,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -725,7 +725,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node27", @@ -742,7 +742,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node47", @@ -759,7 +759,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node67", @@ -776,7 +776,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node87", @@ -793,7 +793,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -816,7 +816,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node28", @@ -833,7 +833,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node48", @@ -850,7 +850,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node68", @@ -867,7 +867,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node88", @@ -884,7 +884,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -907,7 +907,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node29", @@ -924,7 +924,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node49", @@ -941,7 +941,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node69", @@ -958,7 +958,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node89", @@ -975,7 +975,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" } ] }, @@ -998,7 +998,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node30", @@ -1015,7 +1015,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node50", @@ -1032,7 +1032,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node70", @@ -1049,7 +1049,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node90", @@ -1066,7 +1066,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1089,7 +1089,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node31", @@ -1106,7 +1106,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node51", @@ -1123,7 +1123,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node71", @@ -1140,7 +1140,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node91", @@ -1157,7 +1157,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1180,7 +1180,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node32", @@ -1197,7 +1197,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node52", @@ -1214,7 +1214,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node72", @@ -1231,7 +1231,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node92", @@ -1248,7 +1248,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1271,7 +1271,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node33", @@ -1288,7 +1288,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node53", @@ -1305,7 +1305,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node73", @@ -1322,7 +1322,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node93", @@ -1339,7 +1339,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1362,7 +1362,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node34", @@ -1379,7 +1379,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node54", @@ -1396,7 +1396,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node74", @@ -1413,7 +1413,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node94", @@ -1430,7 +1430,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1453,7 +1453,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node35", @@ -1470,7 +1470,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node55", @@ -1487,7 +1487,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node75", @@ -1504,7 +1504,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node95", @@ -1521,7 +1521,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" } ] }, @@ -1544,7 +1544,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node36", @@ -1561,7 +1561,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node56", @@ -1578,7 +1578,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node76", @@ -1595,7 +1595,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node96", @@ -1612,7 +1612,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1635,7 +1635,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node37", @@ -1652,7 +1652,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node57", @@ -1669,7 +1669,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node77", @@ -1686,7 +1686,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node97", @@ -1703,7 +1703,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1726,7 +1726,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node38", @@ -1743,7 +1743,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" }, { "Name": "node58", @@ -1760,7 +1760,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node78", @@ -1777,7 +1777,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node98", @@ -1794,7 +1794,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": true, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }" } ] }, @@ -1817,7 +1817,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node39", @@ -1834,7 +1834,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node59", @@ -1851,7 +1851,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node79", @@ -1868,7 +1868,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node99", @@ -1885,7 +1885,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, @@ -1908,7 +1908,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node40", @@ -1925,7 +1925,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node60", @@ -1942,7 +1942,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node80", @@ -1959,7 +1959,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" }, { "Name": "node100", @@ -1976,7 +1976,7 @@ "MetricsURI": "{{MetricsURI}}", "EnableService": false, "EnableBlockStats": false, - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}" } ] }, diff --git a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/node.json b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/node.json index 412f2937a0..10e25e767f 100644 --- a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/node.json +++ b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/node.json @@ -5,7 +5,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": false, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0, \"EnableAccountUpdatesStats\": true}", "AltConfigs": [ { "APIToken": "{{APIToken}}", @@ -14,7 +14,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0,\"EnableAccountUpdatesStats\": true }", "FractionApply": 0.2 } ] diff --git a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/relay.json b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/relay.json index db8fb939d8..563543a7bf 100644 --- a/test/testdata/deployednettemplates/recipes/bootstrappedScenario/relay.json +++ b/test/testdata/deployednettemplates/recipes/bootstrappedScenario/relay.json @@ -7,5 +7,5 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableAccountUpdatesStats\": true}" + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"EnableIncomingMessageFilter\": true, \"CadaverSizeTarget\": 0, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"EnableAccountUpdatesStats\": true}" } diff --git a/test/testdata/deployednettemplates/recipes/custom/configs/node.json b/test/testdata/deployednettemplates/recipes/custom/configs/node.json index 4cfd52b5c8..0b310ce098 100644 --- a/test/testdata/deployednettemplates/recipes/custom/configs/node.json +++ b/test/testdata/deployednettemplates/recipes/custom/configs/node.json @@ -6,7 +6,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": false, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0 }", "AltConfigs": [ { "APIEndpoint": "{{APIEndpoint}}", @@ -16,7 +16,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0 }", "FractionApply": 1.0 } ] diff --git a/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json b/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json index a61c7506d5..85238047cc 100644 --- a/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json +++ b/test/testdata/deployednettemplates/recipes/custom/example/configs/node.json @@ -5,7 +5,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": false, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0 }", "AltConfigs": [ { "APIToken": "{{APIToken}}", @@ -14,7 +14,7 @@ "TelemetryURI": "{{TelemetryURI}}", "EnableMetrics": true, "MetricsURI": "{{MetricsURI}}", - "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"CadaverSizeTarget\": 0 }", + "ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \".algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0 }", "FractionApply": 1.0 } ] diff --git a/util/metrics/metrics_test.go b/util/metrics/metrics_test.go index 03369c7a1b..fddb9eda60 100644 --- a/util/metrics/metrics_test.go +++ b/util/metrics/metrics_test.go @@ -25,6 +25,7 @@ import ( "testing" "time" + "github.com/algorand/go-algorand/test/partitiontest" "github.com/algorand/go-deadlock" "github.com/stretchr/testify/require" ) @@ -95,6 +96,8 @@ func (p *MetricTest) testMetricsHandler(w http.ResponseWriter, r *http.Request) } func TestSanitizeTelemetryName(t *testing.T) { + partitiontest.PartitionTest(t) + for _, tc := range []struct{ in, out string }{ {in: "algod_counter_x", out: "algod_counter_x"}, {in: "algod_counter_x{a=b}", out: "algod_counter_x_a_b_"}, @@ -112,3 +115,29 @@ func TestSanitizeTelemetryName(t *testing.T) { }) } } + +func TestSanitizePrometheusName(t *testing.T) { + partitiontest.PartitionTest(t) + + for _, tc := range []struct{ in, out string }{ + {in: "algod_counter_x", out: "algod_counter_x"}, + {in: "algod_counter_x{a=b}", out: "algod_counter_x_a_b_"}, + {in: "this_is1-a-name0", out: "this_is1_a_name0"}, + {in: "myMetricName1:a=yes", out: "myMetricName1_a_yes"}, + {in: "myMetricName1:a=yes,b=no", out: "myMetricName1_a_yes_b_no"}, + {in: "0myMetricName1", out: "_myMetricName1"}, + {in: "myMetricName1{hello=x}", out: "myMetricName1_hello_x_"}, + {in: "myMetricName1.moreNames-n.3", out: "myMetricName1_moreNames_n_3"}, + {in: "-my-metric-name", out: "_my_metric_name"}, + {in: `label-counter:label="a label value"`, out: "label_counter_label__a_label_value_"}, + {in: "go/gc/cycles/total:gc-cycles", out: "go_gc_cycles_total_gc_cycles"}, + {in: "go/gc/heap/allocs:bytes", out: "go_gc_heap_allocs_bytes"}, + {in: "go/gc/heap/allocs:objects", out: "go_gc_heap_allocs_objects"}, + {in: "go/memory/classes/os-stacks:bytes", out: "go_memory_classes_os_stacks_bytes"}, + {in: "go/memory/classes/heap/free:bytes", out: "go_memory_classes_heap_free_bytes"}, + } { + t.Run(tc.in, func(t *testing.T) { + require.Equal(t, tc.out, sanitizePrometheusName(tc.in)) + }) + } +} diff --git a/util/metrics/registryCommon.go b/util/metrics/registryCommon.go index 2eb8d6c532..8a0f53464f 100644 --- a/util/metrics/registryCommon.go +++ b/util/metrics/registryCommon.go @@ -25,7 +25,9 @@ import ( // Metric represent any collectable metric type Metric interface { + // WriteMetric adds metrics in Prometheus exposition format to buf, including parentLabels tags if provided. WriteMetric(buf *strings.Builder, parentLabels string) + // AddMetric adds metrics to a map, used for reporting in telemetry heartbeat messages. AddMetric(values map[string]float64) } @@ -42,3 +44,9 @@ var sanitizeTelemetryCharactersRegexp = regexp.MustCompile("(^[^a-zA-Z_]|[^a-zA- func sanitizeTelemetryName(name string) string { return sanitizeTelemetryCharactersRegexp.ReplaceAllString(name, "_") } + +// sanitizePrometheusName ensures a metric name reported to telemetry doesn't contain any +// non-alphanumeric characters (apart from _) and doesn't start with a number. +func sanitizePrometheusName(name string) string { + return strings.ReplaceAll(sanitizeTelemetryName(name), "-", "_") +} diff --git a/util/metrics/runtime.go b/util/metrics/runtime.go new file mode 100644 index 0000000000..3f89ea761e --- /dev/null +++ b/util/metrics/runtime.go @@ -0,0 +1,137 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package metrics + +import ( + "runtime/metrics" + "strconv" + "strings" + + "github.com/algorand/go-deadlock" +) + +// defaultRuntimeMetrics contains all the Go runtime metrics, except histograms. +var defaultRuntimeMetrics = []string{ + "/gc/cycles/automatic:gc-cycles", + "/gc/cycles/forced:gc-cycles", + "/gc/cycles/total:gc-cycles", + "/gc/heap/allocs:bytes", + "/gc/heap/allocs:objects", + "/gc/heap/frees:bytes", + "/gc/heap/frees:objects", + "/gc/heap/goal:bytes", + "/gc/heap/objects:objects", + "/gc/heap/tiny/allocs:objects", + "/memory/classes/heap/free:bytes", + "/memory/classes/heap/objects:bytes", + "/memory/classes/heap/released:bytes", + "/memory/classes/heap/stacks:bytes", + "/memory/classes/heap/unused:bytes", + "/memory/classes/metadata/mcache/free:bytes", + "/memory/classes/metadata/mcache/inuse:bytes", + "/memory/classes/metadata/mspan/free:bytes", + "/memory/classes/metadata/mspan/inuse:bytes", + "/memory/classes/metadata/other:bytes", + "/memory/classes/os-stacks:bytes", + "/memory/classes/other:bytes", + "/memory/classes/profiling/buckets:bytes", + "/memory/classes/total:bytes", + "/sched/goroutines:goroutines", +} + +// RuntimeMetrics gathers selected metrics from Go's builtin runtime.metrics package +// and makes them available as Prometheus metrics. +type RuntimeMetrics struct { + descriptions []metrics.Description + samples []metrics.Sample + deadlock.Mutex +} + +// NewRuntimeMetrics creates a RuntimeMetrics object, provided a list of metric names matching +// names in Go's metrics.All(). Otherwise, a default list of runtime metrics will be used. +func NewRuntimeMetrics(enabledMetrics ...string) *RuntimeMetrics { + enabled := make(map[string]bool) + if len(enabledMetrics) == 0 { + enabledMetrics = defaultRuntimeMetrics + } + for _, name := range enabledMetrics { + enabled[name] = true + } + + // create []metrics.Sample and get metric descriptions + rm := &RuntimeMetrics{} + descs := metrics.All() + for _, desc := range descs { + if enabled[desc.Name] { + rm.descriptions = append(rm.descriptions, desc) + rm.samples = append(rm.samples, metrics.Sample{Name: desc.Name}) + } + } + + return rm +} + +// WriteMetric writes runtime metrics to the output stream in prometheus exposition format. +func (rm *RuntimeMetrics) WriteMetric(buf *strings.Builder, parentLabels string) { + rm.Lock() + defer rm.Unlock() + + metrics.Read(rm.samples) + for i, s := range rm.samples { + name := "algod_go" + sanitizePrometheusName(s.Name) + desc := rm.descriptions[i] + + buf.WriteString("# HELP " + name + " " + desc.Description + "\n") + if desc.Cumulative { + buf.WriteString("# TYPE " + name + " counter\n") + } else { + buf.WriteString("# TYPE " + name + " gauge\n") + } + buf.WriteString(name) + if len(parentLabels) > 0 { + buf.WriteString("{" + parentLabels + "}") + } + buf.WriteRune(' ') + switch s.Value.Kind() { + case metrics.KindUint64: + buf.WriteString(strconv.FormatUint(s.Value.Uint64(), 10)) + case metrics.KindFloat64: + buf.WriteString(strconv.FormatFloat(s.Value.Float64(), 'f', -1, 64)) + default: + } + buf.WriteRune('\n') + } +} + +// AddMetric adds runtime metrics to the map used for heartbeat metrics. +func (rm *RuntimeMetrics) AddMetric(m map[string]float64) { + rm.Lock() + defer rm.Unlock() + + metrics.Read(rm.samples) + for _, s := range rm.samples { + name := "go" + sanitizeTelemetryName(s.Name) + + switch s.Value.Kind() { + case metrics.KindUint64: + m[name] = float64(s.Value.Uint64()) + case metrics.KindFloat64: + m[name] = s.Value.Float64() + default: + } + } +} diff --git a/util/metrics/runtime_test.go b/util/metrics/runtime_test.go new file mode 100644 index 0000000000..1032484466 --- /dev/null +++ b/util/metrics/runtime_test.go @@ -0,0 +1,59 @@ +// Copyright (C) 2019-2022 Algorand, Inc. +// This file is part of go-algorand +// +// go-algorand is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// go-algorand is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with go-algorand. If not, see . + +package metrics + +import ( + "bufio" + "strings" + "testing" + + "github.com/algorand/go-algorand/test/partitiontest" + "github.com/stretchr/testify/require" +) + +func TestRuntimeMetrics(t *testing.T) { + partitiontest.PartitionTest(t) + + rm := NewRuntimeMetrics() + var sb strings.Builder + rm.WriteMetric(&sb, `host="x"`) + scanner := bufio.NewScanner(strings.NewReader(sb.String())) + + // assert default metrics correctly created + cur := 0 + for scanner.Scan() { + curName := "algod_go" + defaultRuntimeMetrics[cur] + curName = strings.ReplaceAll(curName, ":", "_") + curName = strings.ReplaceAll(curName, "-", "_") + curName = strings.ReplaceAll(curName, "/", "_") + require.Regexp(t, `^# HELP `+curName, scanner.Text()) + require.True(t, scanner.Scan()) + require.Regexp(t, `^# TYPE `+curName, scanner.Text()) + require.True(t, scanner.Scan()) + require.Regexp(t, `^`+curName+`{host="x"}`, scanner.Text()) + cur++ + } + require.NoError(t, scanner.Err()) + require.Len(t, defaultRuntimeMetrics, cur) + + m := make(map[string]float64) + rm.AddMetric(m) + for _, name := range defaultRuntimeMetrics { + tname := strings.ReplaceAll(strings.ReplaceAll("go"+name, ":", "_"), "/", "_") + require.Contains(t, m, tname) + } +} From 26465a692a21691cdedb3a28ab1617ed3c171363 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Thu, 26 May 2022 18:11:19 -0400 Subject: [PATCH 31/34] update node_exporter to include https://github.com/algorand/node_exporter/pull/1 (#4047) --- .../node_exporter-stable-darwin-x86_64.tar.gz | Bin 5359650 -> 6901398 bytes .../node_exporter-stable-linux-x86_64.tar.gz | Bin 4982242 -> 7142051 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/installer/external/node_exporter-stable-darwin-x86_64.tar.gz b/installer/external/node_exporter-stable-darwin-x86_64.tar.gz index 26faf2d5146b227b909690be7150228b9235c941..2b25a6e30142f23423f3952868c48c295f898c16 100644 GIT binary patch literal 6901398 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%0DR+vuF-@#Df}2p~Kd< zXqcAX+&_bawny~>kR^D&@mzMux`rS>0iy!?U&GEWyqxKj;)qZ_@DD}jaC4i)Lkh8* z9O_Hc+>xG?Ic<9d?TsDgZyR`lk~V%5_Lp@L~5n_%cPPn=_2+pkhNa zJaam%PS5Mf7BmMuVzuDfGx$4geS$lM>4%L@TdS~cA!;jfga76r)^D;`A939SD>9K* z1XmynNo0zQBi!}Fa~4oEjfN@=C)%MFKPRFwcd zvOD@}E3F>x?{WFK@5yf9y&f%f&5mGG7zCMC$^Z-B09ci01E3aPhed2M;7`(N1v$H2 zZ~6a@sv^GO2>R%Gq;FZ@1U03wXA+fY!|{I-`nr1(GpFBweKes#{+|-VKj?Ub{B9i- zZJ*Z6(Ay`1B7zJ2s;;P^>*Fpi&1R{0Wp60~j)#>aHStMmn?ANN3UnrzgYdxf_Vf4hi<59l-Bz!v-0BG3c*EU(Q7ZO-UT# zw6zGU^UPuNrA1hq#u;uVs{-pOOU6xT=r2)_$Poz00%MXQFiCzs1Dy3W&RIn+=p$#< z#Hydd!p^Xgp(6AuRfXCC=;RG7ahQ9#6;Fd5%^s%C>@$0Wby#)TKc0Cz2z(!uhHnNNx84DV^pTs9U@y)P5EAN%$&4FLXGILWRdz|D)p!G6l zOM?wPfcvUhZL%YB166NF`#nk-T{Iqkj>eWBJ$y5q*6Hg^s z=^QGHLIsuWWa+|EcfewIEx9VcHhy&AkI;%M1+^#?cNqP8{hx=8p5x3*!|w=EK-MJ^M8ujFN<*gg*g90US5R65tI*QzVE3F^Qsdj_^}cHh=R0J(|miL zAn#r@RTNaQk|!cBCWHbBEI|cIAJ`5^H0N_$pYgt3Vr4mSuPxC0kA?NGapIH%`0J1l zI0UIjwDq~JmzaZMB`ekptA89_5Byv|6PZG%b&wkBK%y+eO#ZO-2&*x7mm{MGxSFH4 z6HC82#`iePeXM@o_N9xmx&uF^@{SU#^D+l3v!fgi@IN4-J`Zv<7q@e??R^&U$H0#a zE|P_?W<`zFaexddRF`mUer-xJTF`8VD%HTFp=YSw7OD@GOQI}pio)Ch(f;Mp1EKw> z*m^!&|EH<`%@<|3{-wD76p&M)GiI5|3DrQ)yvzgOB|Ni7E2?iFmUCR5D9SCkMf@}4 zXwj-hN~~6B3yQGK{u_wI!Xqd!T+N8BlJKuTlXRett~{)j(Bh{?sE;6pVC)|-2i3>= zz?sY&69H8UfGYDgqNxltA=?MS`e#g}G$xLnp(Ht`d*<)5O!p-1LJN46!`39MeTu}^ zW+}txux$k-+Uk@Wom#EGPKUYPX=`wayfO%=Uv$b!yuCx+z@6z!_|ddBO!Bfd3=>f+ z6NLo(bR~Wa$Y1k=cz)Bg`25MWi6%#|9tPkSNd#`pst5Yn{TkcfG@V8~iGSv5b|QcC zHF!uf2Us8`lINnDB*S*wl?OY-qZR$)=uZ~+%=}s@ZGz;PY(em+OP>pjXU7bO8l*&Q6OMY!QVQTWQNoRTAS^0S{R{4bg&2N~TYb0|UM@5sl3%&`Dj|s#$pF!1E zeuKkME8ISx6`AJ>#G7Y;$U*L_$G(B2X_QA@ZxqEikwh$s-`t?9hoR4v}o%SA}Y?efV|6rsHx2w@c*nJi|Av=D24+So6nWCz`N)= zruF-bT7Q#d-W;Lz+d&A63&bNOB_ld-#!EZqsvKVN@ThuG&VV#h88Hxz+!1|5!|-P! zlfR?ur=iM4^}JrWFWaQfSbCV30#g$H?6uMP#7%1s@QQkJp~ao+nZmvFXv1cD1H;Ir z4}Ph4p$m)bMcEBLQZ0C{JbwyzgP=|RDhhOg5u!q0Cp{tjKPIAl-6GZm zg>^3=^&wxQ1}3Ico5!$Cr`*BM44vZ}9Oi>gTUX^zb^CTE_t*ri>_90lV_Q$Ky55zl zd-|j@Xn62>vW#P;+rZfa-cOc1E0YNbUWCPTCFOKS#&OBEMObYIjPu_`$6yQ4{s&Tl zZL6TXOnZ8nS+pG!R!=qa^GnekGz+UQ{nBaMC#=E978K%3z9S&t)aGE^-oj(8dL1WoG)H$*H4^d-TzbJ^u<0v12c&`wTk=rF) z;o_jvwtLA;JS-gz3$qCroKq=Y3TPw@YHSUbOcp*+*YTe=yj1m(yn-wx?dM6(Gg>rP*N{QaydRaR+++ zj|^--WBac*MtqUP4%yiujr!G#%o(->6%UJOYpNWCUQO(1qLJ-U@58W1pIyw0@u5hD ztPzc}0jonPGb3R^xofwC5(Y?&k}^4n`jg`00%$U?0EovlXnsTgsi%AS`HrnaSi952 ztT+@Ul1k^V+XXjSW_5Q?q`mXAEK`+l?b@wH`K}LmZ zj#Q0DC&8)md=qvL?|war&Pb=qNhavy#Y=Dv50S5B=)|H&J@Yb(##3ip7DLUrIx(96 zPL7CAeV^%9_NYqopydK_aTVY;bPcCs?{qP%J+M%y8^S87%}=v{RAW`kHunT0YN$~> zjutMi?tdPJ60A1_kdxexkr~KfLMDVJypbuIdvLf#d{Oh6{-3IrUWKFW3%Zh+?~b{T zNlG@~;ulc-p%OiMryH~S;W*s>bb3F>S^G|e;xl^UqWMccljuqjKDQ!#$`cVH%Iu*3 z5q#Ws+;!FhFW|azV=(JT;5KnfeK3q-5Z*W8-u%aAqPU4HDuLgPe!MgE12}vzf8q8A z%qDb4Od4^$l08C_8^oIS_T1VGzckg+e{wzK?il5Nk@3X=P9 zw6G0!>U83mXl`JB_Gk_1+JviHei4l>G!2{qVp?YSG}8QYY1zp{JODEEkpq}X?Y^W} z;}h0PbP}IHUpo=GHeR9&U;EL83Y3PL_R3)}PmCYU*;@W(;52bd12g-#8oP*b`1|E) z{p^-^`e74n|D>2>(iiBT<&9f(7pFHMSgbmVRJ8o`tY-2rt3fLv$V{E^)NtiKQ))1{ z>R9j`t7+*);;q0n^3&4P8~=(t!-r_h>{t461K{>CbN}{dt_J8-{2bAJ+)_0aE7%rlrEE*^OIEvoIE60^VT-bnxS6v>%{jrw z%8iVn!E07W&BU#lskN@r<)A%quBNLPRg(0OsTsGrt)r@#T+oHOZ0o8M1mMA_#stnn zvFFG$M?$`f{6%@Q1JRxY2%w_JP<;%W2 zbigv@b?nO@GUt^-)RuXCfN0xQ1$!lXsD0&$m5a8(Pb}42D2#ypiQh`_n_alK7huG+ zMIR!{xqv8Ud1w9S2|``FXU>L9;m-#bf5efXUpPi@IIp@azMmZzXW&ofxc=>fm?7XE zT>e`^M#A~bfK|;; zkqP9~b2x-!DI>d%I{Q+xnh5Kbb1j}`sw56(PCIz8@GiGzryA^wPFs`U#&cIR zE>d(3sLRu2X^>@_GI0<&14!l%-MNcx+|wB3t{L)0g95`zy@T~RzZb;#w?xpo+;{{K z_=#@YOlS3^Nt7W4(YAGQ4i>HTeH0IqNJfvPWOr_|jl2I&Oh#|_4aN zo$96OFagt z(BgO;G478)JIvksP)dZ&HAYm1ZI}o$J({j zinblX+5@C2w2)s)NM79`DQQ=OcqF(t6Dqw$u|6R&{)($;iKokHrho->M77{Nz#1TL z-oPTK@?${#E&g93F|eJex@OT#G2;Z*Xz%?%^qqj#dqwjxXngS{tW`;Cb3Bv zNeKwSg_wSqdhC3X3efWY;stmXR4>^!SIJ8-1R^O;pXz5U0~5Y;K;3*kml?X$*V*gp z;tN|Hi;6hrVnLt4JsytJiBol2 zE#1V-?jaY|H50gtYP+~)GX*vW^IlCQ!v_$8KnC&%YJ~aBplue-U92&Od{9EB0Rqx4 z<{W_ONRYs+KW<_HLS=DGtSupj1H=Vu9%uK!jf%~I(YXCe|ID}%_LN87H4@9FF(#kf zmV+JD^+I(Or#1j!K%c*MJh1*TGfPtr8ge7*T{INOg&hXY2fTMZoI|!)yr8bV9c#`n zHq-0eA5p|GI!TVVFjpmcj>Y2WZT0$x1et%5$QtHt`VZ1sIP0B^GEPDA@ki)k_MF$> ze1bI3%ITn|m>ss(#aF^;K7A<1Bxzm&Ala&iZ^IGIHgmvocPP;SUD5YhyhF~mf$nUx zpjGD>1<>kHRT5sV<;PE5>gHS7*_-GUYnrRZka;qW$pWS5{()~~bz^wkR`eYp{8+UK z(WcSi_E~`?IX!t6r)Pv$vNbF!blMu0+F==xu##JFKGN2S$^5j)Ilf`K55a*Z~u;pnp+4Lw;)l zA%DGzAwLU-eNOiWWO2)HP?~A6rrUJ|w|^ZsgE|9RB^oG%7Z0LMI#2Xq(lLw3+?Ai2}|FhB$UY6CiV53 z4;%b<@IcVkBFfuEL2AJU=}lXwYpfQys{Z9d=1`?M(K_s z2h9RX*~oE&l;~5Y1SH8`bh^RcXxBg8>$Gik4f9_zC3hWUrs5 zS<%#`>eRj2o%iYtd#pl9H|uB441Fok^P8000}XNxaGpkv@$+*%IrHc9?e%`RbX zTx{9rAnAI`=;<`{vugE8g!K0%krJ8=Q^XUedEaivblNI&J zR_netS`X=(54%3K&>rYrJYLI;HDL{GoLhdXIj*CC&Upl5Ynp3O{OJ@?Ge50Nbxrs- z6Jn?qY+$mz?Vzv@o!$JOd_!T?>S{_L@y83Mn7nHD$A|FRJM5YQ*VHC<$;U3;gO~o! zF1^4mEyYWJf=dIO1i5>oNUh-{=!s*T=o<1ryv68i%=`~BPv@^6BtA+Tgb3eb+85^3 z2^y!K{9p66epII&73c-EzIG5lRs_v(l%}qV%01@5I6Y5?n)k?&AO^J}Hl))qLM-?=^Pj+S4bO<3JP^m(h8(Sf!Hen^7W z>NnW9mH2Zok(&2DzyahZXXFE5^XdJ38;B~Wqu%18i-BL(G%p{@-LwM5UiZ-zD^6o} zMCYob!P878_!);kugzChnbL#7yj6X8dFc@CrSsvrAU%in@4#sMX~mzIB@Jy&^jIE> zms`CO_cU|XG$Vyz=;ySx!KUd#qN}jmNPOv22~jvA3Ch%XOuVq}w}TjmDMa$jXu{*% z5Bd{l#(PfNw#s45m~3nDzii^cy2y@xuH~FV*Sfb?Bhlzq&%cRrrI$EYDhcOGPcyDm zKGNt9flUW4L{y_h1aWE1G1Yh*F+q!|EJ42Y66Zptl9oY3^E5_|Kr5n6Sy=rN3T#Gz zB`)wHsD}Ah#xWvFAmWh$Qcb3Gc0<38UNCh?_7{3obi! zf>MO&S|)K%*=a~n_+C)YJC6~RiVzLKV{}=|M6rR}f*7@d+2q%B!xAWrv8ZV;GO@LY z$)rmBRXTFpe8TF#poWKM0^5ye0vbA}BFaeLDte!Dktx#p4;k>Mo9 z9p2fI}Zx70?s zj`v?blWx7jZY{@KPk%tn;E(K5FuQN+q65uVN?+21MycOAdi!8s3pKOjIZvq7m;;lBl@OoA z&jnuc_#8=X(RR@+Y^)ly#P_?tY2_AYhEK9J3+sPlVscI<(4eH5%&}ETa8~Jw6aO@q zk)Ve;{m2X_L5NXwe%a|tB4;r5zH^v?r-E6Wa$@L+anpHi$3Uv_zx0LZrvbe-s6ZG)3rXhP^Kl_UcVLl=zW6 z|Jk=}nG}DMetv}fS9!tAeeFKK4geD8Xgg}~Uv3ueeb&TeM7C;PP1+*=4kj7%{5Q51 z;CugNX2PNo(X=OYgix|a=yIYF?m!m=cM_fD%+bAIn7Vaf8La~1)&(~(*^$mDN;urn z$=TlpM8J{Jq>mMk*H@d(hEd~)M``2n;*ihqzio;hvIZ!Jl5JuBZ+xg4ZwQaiEG3^U z&G1~XjBEu9yy~(!Oi?P8$ZJU-Y9WP-;VglT#g9Oh-J4=ilC-5P>}M&pjqoUcG6GXT zf2bhx^!hj;Pe;0tJhfmafssVdK3+<9e~))NyNI5(u}i{t#dC^e#dynv&25+Dp-q_CLN0o$x2{5J7ucAZBs@sL?w@ge% zE77_mkG(QI#?gyMQDwBGnu4i?I%$M+Yt;%e&7t5nn~_}Le|HnnRLf=_4wJYFjT94= zaE(@$s<)42w6c_Eo7JKwIPx$&CQ_*KZ=~3Q<-O$xDW1>+W4UWKyCk{ zYt#BiO)M3qr9ct?khk*an5FS~?)neCByFJ}2Nbr=HPnBfiK!K35|>IGz_ullNIcvV z61K~Iqz0lJ`xMOYQo(6!vsyTli2#PtlfF0yVO$4~JLE3h>$-9e)A8H+X>*0<2^tj) zs3i2d2svL$2ILIv3`0(}+aG59T^C^u`;XvX9^qec4E$T32Kc8Q`0vHPhnFz?>zRJa z`1i?~|5Nz)rjCE9KM4LkQm*4)>-7H+{w-ZZ_?I~v@b4GzgyY{$pACqA?EDG?boz-O zNzV$Z4g6MGPrV)$Q{){#csp{JWa)h!A(4yY}$S5Wvlf> zv0cnU&KOlXW&@zZK)j|@m_^&sMOKP_J#GvXX+aMSC9yZCiit6V;KiTDrvKwkp+3ga z$hk}G0FMBW3IO;G!KW`+J{SXO0u#7*9P#I-rI(Q=))MZWWf##0xQCqm(E;KC?j*pb zqvpq&!;7Cp3-YIw|Lutw>j(P_GrEMl!|Xr_#_-r3i8&6YV``To-Nm3Vwu`|?6p0>? znFB|m!LPtG1}E4O>=5c;r{^@4|50}=;Hwro!;hIUfu)>z_2cNJt0M=rQ(HehKX6$7 zY>?Klc`Y7-yyJFbIx94ZvoM{5*bU`lp#Zj;?y5Y|wtJD29DdbRh_EzN=2bN`*v8Fl zbKqJ=n@|S=Voq!M^W1HLXSfbcSxb4{rS2TkPr4ni`uaz)Cm)vocxep(p!v*+K}3sH z`K*;WD;GO~6i97XnbfC>4uH%w%tWVk7A_59j@7rv@RY19>#AjeHnR0|V&jXpO@ z!XIW{X;O=+F)7Uoe87fZQt1mrA%H+uci=p^H{>qTBp+ptb$K0o^M^>USSi8%K5jdb3u4V+r8)7pb^5$+$LvAdBFU zVk>%F^{8Walhcjxdvab(hDK8xDHG-Ry+?wS%=`5L@EcQckd0*dnbl^wpN-7% zzZL%6Cfx6X^^41D?x(a4dp{y8_*52QU(>u~q)<21)+B7G4`q7Js#m`l9G>o+=J(Tx z`LS?XDJ=)}`)*f)SQEtLF52w$ln?35^GLl4?c$#KEHVz&6t(6U+alTvFS3-0~JqeLb5_M?l@cz6}Y-h|&kkeAD?kq4scE3J$QR$pUg4fL5b`&p$$ zvej1(q9lJY4&1qgP!3rNdkka292yx%C3N2=)4aKvjyryxz(nlQ(4qUI{LuY9M@F|3 z18N@T0Lj71IyY-ppuoaxlRA0Qw>)&e;`DwF-O0y9((MKnj1L)sg=#qfb6Gx1bx6I${z&oWbtFrvFwXndNIeJS^}SjSJy7>>gG4%-2AwjhsJ^roN#a3vw(XZ%>}s3h-Dud?gT7I)wY zA$cw}VyH2*IX=oy{^PHaWWVaLd>cdxKl?vJhm@_sh4DrHT5io9_~@U3Q#<`HigEfc zxKB`~RZ2;oaQ=d9t$xRKY%4Qzs2$uD`dh!o2sF0-Uz_;)hgkYn$=pq6iOfBt85h9^ zi||haEz*a_jm@RT97P=dXb`aRU@rn0SK^g~)weUN$i{0Ab8vD6KO)CoiNup80Y+Mo zcQljtJ6VJu)!|qYF|CkazH z{Kjn}`)d-r{x)1!E%XZTu`aYf<9n!_cd0$-{RK^x(xpxgf7b3hH#2)MzTeb1kY__E zr7g4n?i|3+!I0Lrqi=xx0K*3G{|+S5fl?1S^X;P42eLVIeo+$?s_*96*GQlgg*q!b z=bni&2RfZ`H&pkhW>EP9(?a?-%P)CXFHfTZJZJ4Pa}=f7%6y;Adq|1F2IUjTQ7c)x zhII161d(P)-pZpZ7mpT$I~?*cEjGyg8FacMFb{Amg$sKvWvs(YZl8c&ztQk}hp|`6 zjVMa@yFry=n#Xl@h&R2@x%yST)n@*nGtl9U%J9W808{$F9F zK)u1S+qMTJlzPz6K=fiq%TIZGLN4@;>Z><}8n!jLp0Kr61_FNwYXh*d{TRc}7Wj-U zkY~QrkHq_r{#_VRKI;pU&)DYUMR*ndshulwHx0t7GCDQF_}%JD5G`!Sg=#-ijdj~h zOq6@t_=?^HSxR#~gDXvyi{Sm^_NpwQE(m+D|%S@Uwf5~?3J zu|!L&GcY-ba*Nq%+a|0X5y$cvh!Xl0X=;Hq{v(u4-lQc(aQvP#8nj=o94Tg1hF8j5|H+@Sqx^^qe%`1GpB4 zNjF_=rToY6)hX{IbaTXM{*Qoi)g0vtLn!yMNxKhdH{XbM`5f)+VQA+V|K3z3B{dxH zs6Lc87V7Ee?}UF(aQw3a{tZ4k{#_Ebz!wq!WyK6M{CiNtKTLmWje&o6gyG-p{_rm+ zgnxhgHN(G;Pl|uBhsW`+P{%*z=OY}xZ?1FrzRaDW+;Iks?U#6Akkj_QpxnTbFxY|$ zKJyWFjDJTme;A8$KBUB=oZNr7zVfVrak4)={-IE{>ky%;I`fc@se=#cnEE<>ZB{Qo zq~oc2us;qt{Ox`?tDv}rl(R_ za)rv0uZ(YI}l#xUBkE z)->|}+G+$@;NDp9xi+$Y=xkJZ3ahO;+rsLrPP1a&n-29aYy0m|{bhJ>e`M{KhMx^- z@UPT!{Ma#{(nRc+0?R#RqA0u^Fd*r544dt*SbueY>#cTuoh2{(D@C^+`-V34r1JDGT=`yT%aGR z2l1dH8U7Bt^W({;1;YL&xSp7%&iiR^`0j@>C5g(go88o7{Hh>4Xhq!4#mqK>`w%s0 zor6slx5FbTs}2eCI}Zu-It~d%4REnpxTJ~MFNHN@FdYnPc7dUWm_C*oZiMK`v#`=q ze5&<0zNhw1HsKWE`x%ey!?9k{S{}Eo1;!hnrVhC|V!ZHJ!YljmmHD(zr`E|NLnl|V zP8x)oHXxkKHv3!PgTX7*+-o>{)$?zSxbXadO&mY`BVvVcv-STw)8E4Kr(orb1YXQK z#`=r0ueYL+<^8%arele<%-AtvySUc9;93 z6{rv5@h>2C5_usqWbk*GIbNhA_?JqdB56>y>jaKgtBh+~GZCINB6t7ZMfoF00*6O^|6s~FP8r+L+Jk=RMg zV$t#YLG4lXz)xa5NeExHmk^%TdiNe$cR*7sa6!1*bxaMpm9KSeHlO+0F6ixq; z1S`3}`Rf$W3y+nL78NlarJ%QmBLW!-f4bUh!g&h{g)0&WxA$|7w&k=neriw$FBCGnI zp$*voi*OEgO7l;Rnt$WBn*WcY+V^T5K>NbRp6enzxLxbuRN5ET>@h{2pN8~=P1I7NUYYzhC)peS`Q>DjTJ&PL zOO)6UcGz}wpb8=kKJBK+^Gyvt2p&{H06G91VoT|C{7SHSRR>G&AplB}0Vpu?q*a)g zWMyv`3LJ3U@e2S+ z!3!El2qIVdI7A2_mWcCbVa=0K^EXa3n)%8;aP~^zSMMAU8&iBR~<*hU2&#*5STykEsOaTLY6>{Ks?Q$hY-P zBl0o*Ok+7(GBK|tFIJRIrgj)$_AybO*g$lI7{q+akB{C3X-orF=9yVO z4)UOA{6-T|Y)y;)hG{Un3`y0V_$W+;R^R<+7|EHe&xDP?aX|XJPD^f2Hq2j8BpU{c>Xwfs*!tTzs@ciWM%TL$u z&$ZwKx^WQkf7P*{qN&m?n4WBcYL#TT>JT;_ye>dt{Q$um zLsC_$UJ@~xXF$ct;`uq6u6@v{TDE&I}Ba{NZcZsX7(? z!sJ%^f%?^l{TQnv>toK^cxnfU7lw%ggrD;x<pzlDzDeCYwlBzMI1>hSnW$6& z%&rz|f`|;8*%~E?V*qWq z>fMO4U60@!p%e#ex?Q6Y@^Gt(oqwLyM}e%swl^NR4!5qs3$KqY>Cz951lhM=exR+U z`lnYly5Bc|fX3kS>9>T>lVg5h`208$KG&Wqe8#0{@QDQ)uX@w_8f<31uft}|KQ#T} zlk++g3<8@OIGyf--s1w>;J_Ed6`|}0>gUoNSpK}8eBtGhc>rrnC^bDIYda;> z<~3twD(A%NV~y?$8uJ>Iu}~Qg_kv-;rd0c9mLBcdQ3gpZ9= zZo45t6!H&>Tk5}H^(zv@V7hS z55V_Xy2H0ONy^#*LlCp}fb8|nY2|34p)P>K{&-lh67DuCw}>7|Gthdw7(8 zxRsr|CWG8*kQ=P5ekk54vf!dl==}}Ph4<-5@^%oR(I|@pDokU_QOsu z)7yui>TB3O3yCj-N1vfbNAd!qWdQwz9dA~c0%NiAI$c%Q;u}itt8iHz*N$(4A_dLa zc9thrpJq&v+XG`BQ=S8A!mvf%SDMr>`+9<2b<0afg8l|We$I!Y?F-xn>X~N2v#_7* z`dlWJ3_7IV>h3}Rz3O_`bWZ*!!5hWNJe}n9WG(;8WNZ0F>J@HsFgcI&w3#H8W|Dq4 zI~5aCJJNHer3)K;ES^GV4c@T$kC(z&SzeIGe+X+{h#`OQ(mrBVdmu@|IxglmNlt8a zj%gNy4UXO}47j?(3oxr%fG*STVRjlIX|@kUq!d81GFlw+LDBc=AeIR9plEJ&W;9@x z0%<&uzND*||7wG4j6_7(_t79aoa<1Z0x1fG*<{HWnH2Wpl-%#g|L?_96PphWRG;UR z;FHlJ$w~h$@LBu*4+o#)&wnrYh{8YHc&b} z9MdkkPuQJf+9_vf7iB|h7CSza#$#$e^ds&FU|ypkm?+lK@riT%yN-^Jo#WpL48b?# zZTJXACH0BDd(od}L<{YvMn~_*j*Pd&F@T|;J2O5JYnmNG!Mjv#qNZ6C3ijYvhwU9v zn7jvvAdWc#>a~=y&tdx-t{rpqc1r--j{TU76NQlD8p{#g6;_jL)XE%_%fj6h8maz5 zV^+O>eoz&O8=>f&J?P(31F(^fGkQ>j=6|flp^jf};*QmFF|5+mWOweD`<79;5qXk@ znTBhcvE0Z#7S;7O3tz-b!lQBF=Hk#6zxX-hYNG$zDd_)8Zi$84Wce!NquoQX6|L$o zE2GA2qcIQ0F{7^ojJ0Xok>KVyQ-5QWpA92J_Y62dw*Rh<;!mOY=T4z|gxRD8ep3qe z!elbNc&-O!f0{+IHB=@5eg#(OdFSj7cb~Z&6SBNV*I9QZ7 z=h1qT08A;~16Mf|F`nDh5|&-e+@L$GvEHR(qIhP2FFI^ZPPsu6X80uAcGuNBd*B?l zF>@Tg4+l|^maUkE;_)s9Bp%#~Z4$R*=>+9M0Dd6=|BVkh@XHAJ6&Ceb0KQOndaWf^ zrgwGNUn242k%9Fuh6Wnawnj-}gg>`MNIA&KQE+Xh{5e%aVdPu;kP>_$+IB3u7(*dN zxdMj&%^p7dB5nBFwgT=jijcS~&jjRfs~NmZ!qD?@927!GHRH4E|qd7~nr+ z*tduO>lqCGqhh}Mo#FrSyQc*IuiuM=f1pX*zsPyKRTiPn;yz$Txvrl*ZF@3oL4F-& z{}a~y$s99&K&Ts4J11>M&WQ4xai2?`5&(E9Om-QxwHUr%pDa-s*_rTtUNRLX^&=Y? zyws#cZD?%ZviBm{fNwL-L`s|CAIjIalohn}To299#~u8*Y-*xVKe8l0SH+Q(~UPBdXUF|6H*3Bc8#-4ivu2f8DNcdj

EeDNtQbZ_U{qMn>B57g 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