Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@dashevo/dashcore-lib

Package Overview
Dependencies
Maintainers
8
Versions
117
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@dashevo/dashcore-lib - npm Package Compare versions

Comparing version 0.18.4 to 0.18.5

lib/deterministicmnlist/QuorumEntry.js

14

lib/constants/index.js

@@ -42,2 +42,16 @@ module.exports = {

INSTANTSEND_FEE_PER_INPUT: 10000,
LLMQ_TYPES: {
LLMQ_TYPE_50_60: 1,
// 50 members, 30 (60%) threshold, one per hour (24 blocks)
LLMQ_TYPE_400_60: 2,
// 400 members, 240 (60%) threshold, one every 12 hours (288 blocks)
LLMQ_TYPE_400_85: 3,
// 400 members, 340 (85%) threshold, one every 24 hours (576 blocks)
LLMQ_TYPE_LLMQ_TEST: 100,
// 3 members, 2 (66%) threshold, one per hour (24 blocks)
// Params might differ when -llmqtestparams is used
LLMQ_TYPE_LLMQ_DEVNET: 101,
// 10 members, 6 (60%) threshold, one per hour (24 blocks)
// Params might differ when -llmqdevnetparams is used
},
};

158

lib/deterministicmnlist/SimplifiedMNList.js

@@ -6,2 +6,3 @@ /* eslint-disable */

var constants = require('../constants');
var Networks = require('../networks');
var Transaction = require('../transaction');

@@ -23,2 +24,8 @@

/**
* This property contains all active quorums
* ordered by llmqType and creation time ascending.
* @type {QuorumEntry[]}
*/
this.quorumList = [];
/**
* This property contains only valid, not PoSe-banned nodes.

@@ -30,2 +37,4 @@ * @type {SimplifiedMNListEntry[]}

this.lastDiffMerkleRootMNList = constants.NULL_HASH;
this.lastDiffMerkleRootQuorums = constants.NULL_HASH;
this.quorumsActive = false;
this.cbTx = null;

@@ -46,2 +55,4 @@ this.cbTxMerkleTree = null;

this.network = diff.network;
if (this.baseBlockHash === constants.NULL_HASH) {

@@ -61,5 +72,6 @@ /* If the base block hash is a null hash, then this is the first time we apply any diff.

this.lastDiffMerkleRootMNList = diff.merkleRootMNList || constants.NULL_HASH;
this.merkleRootMNList = this.calculateMerkleRoot();
if (!this.verify()) {
if (this.lastDiffMerkleRootMNList !== this.merkleRootMNList) {
throw new Error("Merkle root from the diff doesn't match calculated merkle root after diff is applied");

@@ -71,2 +83,15 @@ }

this.quorumsActive = this.cbTx.version >= 2;
if (this.quorumsActive) {
this.deleteQuorums(diff.deletedQuorums);
this.addAndMaybeRemoveQuorums(diff.newQuorums);
this.lastDiffMerkleRootQuorums = diff.merkleRootQuorums || constants.NULL_HASH;
this.merkleRootQuorums = this.calculateMerkleRootQuorums();
if (this.lastDiffMerkleRootQuorums !== this.merkleRootQuorums) {
throw new Error("Quorum merkle root from the diff doesn't match calculated merkle root after diff is applied");
}
}
this.validMNs = this.mnList.filter(function (smlEntry) {

@@ -100,2 +125,42 @@ return smlEntry.isValid;

* @private
* Adds quorums to the quorum list
* and maybe removes the oldest ones
* if list has reached maximum entries for llmqType
* @param {QuorumEntry[]} quorumEntries
*/
SimplifiedMNList.prototype.addAndMaybeRemoveQuorums = function addOrUpdateQuorums(quorumEntries) {
var llmqTypeArray = [...this.getLLMQTypes()];
var newQuorumsByType = llmqTypeArray.map((type) => {
var hits = quorumEntries.filter(quorum => quorum.llmqType === type);
return { llmqType: type, quorums: hits }
});
var quorumListByType = llmqTypeArray.map((type) => {
var hits = this.quorumList.filter(quorum => quorum.llmqType === type);
return { llmqType: type, quorums: hits };
});
i = 0;
newQuorumsByType.forEach(function (quorumsByType) {
quorumsByType.quorums.forEach(function (quorum) {
if (quorumListByType[i].quorums.length === quorum.getParams().activeCount) {
quorumListByType[i].quorums.shift();
}
quorumListByType[i].quorums.push(quorum);
});
i += 1;
});
if (quorumListByType[0].quorums.length > 0) {
this.quorumList = [];
quorumListByType.forEach((quorumsByType) => {
if (quorumsByType.quorums.length > 0) {
this.quorumList = this.quorumList.concat(quorumsByType.quorums)
}
});
}
};
/**
* @privat
* Deletes MNs from the MN list

@@ -116,2 +181,18 @@ * @param {string[]} proRegTxHashes - list of proRegTxHashes to delete from MNList

/**
* @private
* Deletes quorums from the quorum list
* @param {Array<obj>} deletedQuorums - deleted quorum objects
*/
SimplifiedMNList.prototype.deleteQuorums = function deleteQuorums(deletedQuorums) {
deletedQuorums.forEach(function (deletedQuorum) {
var quorumIndex = this.quorumList.findIndex(function (quorum) {
return (quorum.llmqType === deletedQuorum.llmqType && quorum.quorumHash === deletedQuorums.quorumHash);
});
if (quorumIndex > -1) {
this.quorumList.splice(quorumIndex, 1);
}
}, this);
};
/**
* Compares merkle root from the most recent diff applied matches the merkle root of the list

@@ -125,2 +206,10 @@ * @returns {boolean}

/**
* Compares merkle root of the quorums from the most recent diff applied matches the merkle root of the list
* @returns {boolean}
*/
SimplifiedMNList.prototype.verifyQuorums = function verify() {
return this.calculateMerkleRootQuorums() === this.lastDiffMerkleRootQuorums;
};
/**
* @private

@@ -136,2 +225,14 @@ * Sorts MN List in deterministic order

/**
* @private
* @param {QuorumEntry[]} quorumList - sort array of quorum entries
* Sorts the quorums deterministically
*/
SimplifiedMNList.prototype.sortQuorums = function sortQuorumsEntries(quorumList) {
quorumList.sort(function (a, b) {
return Buffer.compare(Buffer.from(a.calculateHash()).reverse(), Buffer.from(b.calculateHash()).reverse());
});
return quorumList;
};
/**
* Calculates merkle root of the MN list

@@ -154,2 +255,15 @@ * @returns {string}

/**
* Calculates merkle root of the quorum list
* @returns {string}
*/
SimplifiedMNList.prototype.calculateMerkleRootQuorums = function calculateMerkleRootQuorums() {
if (this.quorumList.length < 1) {
return constants.NULL_HASH;
}
var sortedQuorums = this.sortQuorums(this.quorumList.slice());
var sortedHashes = sortedQuorums.map((quorum) => quorum.calculateHash().reverse());
return getMerkleRoot(getMerkleTree(sortedHashes)).reverse().toString('hex');
};
/**
* Returns a list of valid masternodes

@@ -163,2 +277,39 @@ * @returns {SimplifiedMNListEntry[]}

/**
* @return {number}
*/
SimplifiedMNList.prototype.getLLMQTypes = function getLLMQTypes() {
var llmqTypes = [];
switch (this.network) {
case Networks.livenet:
llmqTypes = [constants.LLMQ_TYPES.LLMQ_TYPE_50_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_85];
return llmqTypes;
case Networks.testnet:
// TODO: add proper devnet identifier to networks.js
// maybe through existing 'customnet' functionality
if (this.mnList.length > 100) {
llmqTypes = [constants.LLMQ_TYPES.LLMQ_TYPE_50_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_85];
return llmqTypes;
}
// regtest
if (Networks.testnet.regtestEnabled === true) {
llmqTypes = [constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_TEST,
constants.LLMQ_TYPES.LLMQ_TYPE_50_60];
return llmqTypes;
}
// devnet
llmqTypes = [constants.LLMQ_TYPES.LLMQ_TYPE_LLMQ_DEVNET,
constants.LLMQ_TYPES.LLMQ_TYPE_50_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_60,
constants.LLMQ_TYPES.LLMQ_TYPE_400_85];
return llmqTypes;
default:
throw new Error('Unknown network');
}
};
/**
* Converts simplified MN list to simplified MN list diff that can be used to serialize data

@@ -180,3 +331,6 @@ * to json, buffer, or a hex string

mnList: this.mnList,
merkleRootMNList: this.merkleRootMNList
deletedQuorums: [],
newQuorums: this.quorumList,
merkleRootMNList: this.merkleRootMNList,
merkleRootQuorums: this.merkleRootQuorums
}, network);

@@ -183,0 +337,0 @@ };

@@ -12,2 +12,3 @@ /* eslint-disable */

var SimplifiedMNListEntry = require('./SimplifiedMNListEntry');
var QuorumEntry = require('./QuorumEntry');
var PartialMerkleTree = require('../block/PartialMerkleTree');

@@ -27,3 +28,6 @@ var Transaction = require('../transaction');

* @property {Array<SimplifiedMNListEntry>} mnList
* @property {Array<obj>} deletedQuorums - deleted quorum objects
* @property {Array<QuorumEntry>} newQuorums
* @property {string} merkleRootMNList - merkle root of the whole mn list
* @property {string} merkleRootQuorums - merkle root of the quorum list
*/

@@ -74,3 +78,24 @@ function SimplifiedMNListDiff(arg, network) {

var deletedQuorumsCount = bufferReader.readVarintNum();
data.deletedQuorums = [];
for (var i = 0; i < deletedQuorumsCount; i++) {
var deletedQuorum = {};
deletedQuorum.llmqType = bufferReader.readUInt8();
deletedQuorum.quorumHash = bufferReader.read(constants.SHA256_HASH_SIZE).reverse().toString('hex');
data.deletedQuorums.push(deletedQuorum);
}
var newQuorumsSize = bufferReader.readVarintNum();
data.newQuorums = [];
for (var i = 0; i < newQuorumsSize; i++) {
var quorumEntrySize = bufferReader.readVarintNum();
var entry = bufferReader.read(quorumEntrySize);
data.newQuorums.push(QuorumEntry.fromBuffer(entry));
}
data.merkleRootMNList = data.cbTx.extraPayload.merkleRootMNList;
if (data.cbTx.extraPayload.version >= 2) {
data.merkleRootQuorums = data.cbTx.extraPayload.merkleRootQuorums;
}
return this.fromObject(data, network);

@@ -111,2 +136,14 @@ };

bufferWriter.writeVarintNum(this.deletedQuorums.length);
this.deletedQuorums.forEach(function (deletedQuorum) {
bufferWriter.writeUInt8(deletedQuorum.llmqType);
bufferWriter.write(Buffer.from(deletedQuorum.quorumHash, 'hex').reverse());
});
bufferWriter.writeVarintNum(this.newQuorums.length);
this.newQuorums.forEach(function (quorumEntry) {
bufferWriter.writeVarintNum(quorumEntry.toBuffer().length);
bufferWriter.write(quorumEntry.toBuffer());
});
return bufferWriter.toBuffer();

@@ -137,6 +174,14 @@ };

});
simplifiedMNListDiff.deletedQuorums = obj.deletedQuorums.slice();
simplifiedMNListDiff.newQuorums = obj.newQuorums.map(function (quorumEntry) {
return new QuorumEntry(quorumEntry);
});
simplifiedMNListDiff.merkleRootMNList = obj.merkleRootMNList;
if (obj.merkleRootQuorums) {
simplifiedMNListDiff.merkleRootQuorums = obj.merkleRootQuorums;
}
if (simplifiedMNListDiff.mnList.length >= 1) {
simplifiedMNListDiff.network = simplifiedMNListDiff.mnList[0].network;
}
simplifiedMNListDiff.network = network;
return simplifiedMNListDiff;

@@ -160,3 +205,10 @@ };

});
obj.deletedQuorums = this.deletedQuorums.slice();
obj.newQuorums = this.newQuorums.map(function (SMLEntry) {
return SMLEntry.toObject();
});
obj.merkleRootMNList = this.merkleRootMNList;
if (this.merkleRootQuorums) {
obj.merkleRootQuorums = this.merkleRootQuorums;
}

@@ -163,0 +215,0 @@ return obj;

3

package.json
{
"name": "@dashevo/dashcore-lib",
"version": "0.18.4",
"version": "0.18.5",
"description": "A pure and powerful JavaScript Dash library.",

@@ -110,2 +110,3 @@ "author": "Dash Core Group, Inc. <dev@dash.org>",

"@types/node": "^12.12.47",
"bitset": "^5.1.1",
"bloom-filter": "^0.2.0",

@@ -112,0 +113,0 @@ "bn.js": "=4.11.8",

@@ -6,2 +6,3 @@ /* eslint-disable */

var SimplifiedMNList = require('../../lib/deterministicmnlist/SimplifiedMNList');
var QuorumEntry = require('../../lib/deterministicmnlist/QuorumEntry');
var constants = require('../../lib/constants');

@@ -56,3 +57,3 @@ var Networks = require('../../lib/networks');

// Check that there are masternodes to be deleted
expect(mnsDeleted).to.be.equal(1);
expect(mnsDeleted).to.be.equal(76);
// Check that there are masternodes to be updated - resulting list should be shorter than two diff - deleted count

@@ -105,7 +106,7 @@ expect(mnsCountInTheFirstDiff + mnsCountInTheSecondDiff - mnsDeleted).to.be.above(mnList.mnList.length);

expect(validMNs).to.be.an('Array');
expect(mnList.mnList.length).to.be.equal(100);
expect(validMNs.length).to.be.equal(95);
expect(mnList.mnList.length).to.be.equal(371);
expect(validMNs.length).to.be.equal(273);
expect(mnList.mnList.filter(function (entry) {
return !entry.isValid
}).length).to.be.equal(5);
}).length).to.be.equal(98);
validMNs.forEach(function (mnListEntry) {

@@ -126,3 +127,3 @@ expect(mnListEntry.isValid).to.be.true;

originalMNList.applyDiff(SMNListFixture.getSecondDiff());
expect(originalMNList.mnList.length).to.be.equal(122);
expect(originalMNList.mnList.length).to.be.equal(350);

@@ -153,2 +154,19 @@ var diff = originalMNList.toSimplifiedMNListDiff(Networks.testnet);

});
describe('Quorums', function () {
it('Should be able to correctly sort quorums', function () {
var MNList = new SimplifiedMNList(SMNListFixture.getFirstDiff());
var unsortedQuorumList = MNList.quorumList;
var sortedQuorumList = MNList.sortQuorums(unsortedQuorumList);
var sortedQuorumListFixture = SMNListFixture.getSortedHashes();
var reversedSortedHashes = sortedQuorumList.map(function(quorum) {
return new QuorumEntry(quorum).calculateHash().toString('hex');
});
expect(reversedSortedHashes).to.be.deep.equal(sortedQuorumListFixture);
});
it('Should verify quorum', function () {
var MNList = new SimplifiedMNList(SMNListFixture.getFirstDiff());
var result = MNList.verifyQuorums();
expect(result).to.be.true;
});
});
});

@@ -5,2 +5,3 @@ /* eslint-disable */

var SimplifiedMNListDiff = require('../../lib/deterministicmnlist/SimplifiedMNListDiff');
var SMNListFixture = require('../fixtures/mnList');
var expect = require('chai').expect;

@@ -10,50 +11,5 @@ var sinon = require('sinon');

var mnListDiffHexString = 'd6c47184a6d7a08b9360a84c377e2320a7ec969a2fc7f80a7ef9b305000000007abac1d3fa5c8957bff0e9e1880c9d59ffefcc1b04b9b364c14f1604000000000100000001720668fc7eb874724c9fb50479009b8747d64f7c36bccb8f7b3fe247f346d6ce010103000500010000000000000000000000000000000000000000000000000000000000000000ffffffff4b02bb520427f3355c08fabe6d6d01ac1912a0a88021110ad2364eade497dd1da0edd7857757c10f62dd720956ac0100000000000000100000175a0000000d2f6e6f64655374726174756d2f000000000200e12237010000001976a914cb594917ad4e5849688ec63f29a0f7f3badb5da688ac00e12237010000001976a914a3c5284d3cd896815ac815f2dd76a3a71cb3d8e688ac00000000260100bb5200009e8ecb69a1493e3d573cc9ce8460b9a0d7b05e77ca17878c9faf73959392cef3019f5c63c41c148ef09e4c82471db0500b6c2246d77a93c0387330201e6124d91404419aa9fed4f35fcb986c50fbaa0c7555c68f8a9876968c63c6f92064ff06f1fe7b34629e1f9f156e4e3720ed76745a9966adb50fb513f1285263d5050000000000000000000000000000ffff2d30b1de4e1f842476e8d82327adfb9b617a7ac3f62868946c0c4b6b0e365747cfb8825b8b79ba0eb1fa62e8583ae7102f59bf70c7c7ce2342a602ce6bd150809591377ecf31971558ca01685ce50d7f351dae246ab6d23033b1fb7ad8368467fb348086822fe6ce77d8a4398f99dae01aee02f174c49075e3e92422227fd6a57d4a44d7419c060000000000000000000000000000ffff5350e5d54e1f16415af54406658be9ea44d82b6b502bb90d93e32997484533a8a71a4ed98d12cea3709d84a5835b6ad8ed48d3101633d0669e929f06ac80c05365d9558ad79cbb78f2c000f1b186e58c0e1247221f1ce97cd273f917e034ff4b66baee366ede691e0590a66348fc52b6a63a7013cde16f282347e5949d88a8f9989a46411409190000000000000000000000000000ffff95f8374d4e1f8b165f653a3970a17f432f6c3abb8b681c71a3775f998fff322341d2994767c167c8a43b1b4661b9c01ef637763d4d814d31414b558eff2b3b489b6128ac6852e0fdb85c009f90d73441206a915ec0e889bba5d0d1e3fddf9ccb5ef37f51ede61ea0c1466afa7a17bc1dadb4a69815103b85f849eb9dc0db670bd01c7c033529090000000000000000000000000000ffff332670634e1f88ee437bc0ba444b71a6b8a525146e9c748a8430fc85ad47beda04bb2e5b698bca9f3d5a5d5dfdd5990cd08daa07371f8cbb11679781ce75b0f15db8eae0464672c34ae401';
var mnListDiffHexString = '920ceffaac043193137e9cd06b92e49ae8118120bebde6b6a1d86507000000004941e515883f9de4b8f4bb6931c6c9de77ba69534aaa5fbbcc75340300000000020000000260638ccac78d1cbe6552a95f76bb2a24b9720e3552714d4c650a09d8d9f8a945875a914f9dfaf9979bf11c835c4bac716d162a613848929a49deb75872f3d25f010303000500010000000000000000000000000000000000000000000000000000000000000000ffffffff2603fa4703194d696e656420627920416e74506f6f6c20e4000b20f62548c70000004021010000ffffffff02e9fe433e000000001976a9142fd0e16c05bbbcdc388d4807b5cbe5f45389eb2d88acecfe433e000000001976a91488a060bc2dfe05780ae4dcb6c98b12436c35a93988ac00000000460200fa47030050eecd09d7493605ff411d17a6a2a1fbc703977bd9d9fec91e7d1f6c8a7632bf2d02ef3109842ec37564c67949f820b235bec82b10fae8f5cd537aaba6c8d1834c4074cb435f95bde98603185b3c46b4fdfbfd5fc9b50c3ca42988e2e31c796f3f20b505a31ff88c31a17a709a9d4263007138539db77009c42386418688b9d41480d5db962de4d1947671e8c4a2695f2ed6aba19912f1f61c205b913264d1e5ab00872648d4b3ea1aeb6949c6ac483fc23baa6b45b24132ff97ead454656d78836136b707720265a2f9545c9f40c1ceaa784ac4e8d239b87ab1ab9c1708e70b2b02b0140755817c6d71787ea5004a1342bcf6f1ea8626eee46ab8affd15a5fe6902fcb71c6e65dc9c152f071a7f6b3fc093673e76ad920e9d58196a3baa5bbe280245fbe8f08fb305b00ee5c74f6dcbb842368bf30138c6942426d6010f1429d322da8935c6fb45302e0bb8bf0e5e65b946345af32b23fd6df7949bb144691e25633cead4f0c3cd4b4894a05153e60c843d5c8179add51fd3c65bd365cdfc6fca23cfd922f1991606944a5e178e75e3cca63c3fb7e94720b4e4649403d9116c0ca3cd666872cc93db04e738466f325f48e64d4e69fa4a743760a6321585e06b59858da0f627d3051340e5059113c91a8d3b4645aa628f1eb2d5be6dc4848abad68539b2332d63624baa875415ed9fac25ca80c2ab625dd9f58595c5adfe4448a08687a74d07ec7ac88b0c33086840a14b5699cba97608958ae325e57ae5c45252a778516e8ac5fe61acf0d1cc6c17f7dab199db5cf546c88336aed2b4ceb6ee43a74197f1228c5b35982787d11a2705978126ab116e10234425f253525ca4ba7aa7cf2f47645e62ce386e4548a1dc3099ea55a6a9f1ae20dc44ab2fe0000447f0a8d43ef1c4a854e3de5876e012807bf277e4647ae7256acd51558b189e59e416285ac3e43c9ac93b3a5671dcef0858336ad324e3f59eff75235d093f8c7929746940fe497daa1843ce1e5ab05a8a6d6d29896b31a8631b02201e30bc5f676c414a75cb5a36c7aeb5f55db3ccb631f1cd780a2aedfe7e5cf078abb9b4b60b87188a4b33dd45ed5fd6a31e66bd492fca011526d0f7ae25730fb436fbdc84ea962daadf1010f9fa8bc148d25bc878f4efb28026aa20420379cc333b0b7978cce125eb0238b78c2616ffa54de2356cd901f41625372ba9e189e59e1c7fbb6ab01e8fcba39456575e98db070d408313dda1fad6a16af765eb729506dec902134e7538eb77e4dd2be37df3889e117b2323dde1394ff22a74ed412d2bfd8113b8ace9620df094c0b0712dc67af3cbe7cfee942075244583af6d7188f500a91492cc76872dc05ce65703dfaada9b7a15a918bb418958656174956953a1e1fa7241081e640da7750e72b4c0a9e0517856c69d1de911ebb6172c2e659cfab1ee448bbf24c84d0dfea6cbbb6f2e5f46475c43aaadebb54d4d92221516407f8fa678f1902dfa2ebe04294887f94f37d78e693c4d73b10efa5845d49d3c412e68cff8b6302c4f8eba51930c9970eb51decff858e737fbebcfcb95ffcf90e8c41bf433007a4670ceae11c6d30bc7e01ba3418a90a4f613641e54c73ee4feb95de277332e1919e74fc486fd42900f36d570a07a9a25f17855748c494441a6479219501b05166cadcf920ba2f68e97c3dda14b47d33aef97e010f7b808d9666c938f62fdf82bb94d6f6f17722be4f073f726cfcdc4940f6d1ea6c60e8bebf3793dc71546085221d85063e0a9a06436d7fa15db340f639125eff19270fad0c8246c77e533b4990d0f52e0e249980e822f620a22b9badd0bd714b9738eaf7f5d9acb722305948c05e2b22c3c071e4e3e927a1aa50d9c233207db81dbb27c4b80538c82dbe1f4ac908392a75bf2b88a8a77778e7435e8ac0bf9365f0f6c5d9948e3db32c1e6179bd7a2f21bff5f229c24a18950081cfeb15a3d78dcb63880aa383cc1fecd120af9512a5374690a32a2c95fe2dcaeedd73f2456488b7f8fbcc9ccfe4384a9bfa2ddedc0747f07b3052d92c1f0a79509bd1c88600006d0741ddb1b4c75ebe8501b9b3abe34300cd4cdab744761871e0619d325df02beaf9ecda22500796f4b967137b64154183688ae257267f861ccc6b10e0f28d9e78ca3a701594535d385e2fd364f4c159588e828fc3216bf67a1977ca6f97def7478a74c75b1f48bc7830570c26b95f592d892b27d10896c76bd13221870d9013e7c7a8b13c72e33a393c9c4e857dbb607b7d015fa271ccae5740685b3fea4be2b856da2e4f06838ed23038638873ad60fd950db58d257e81ff71116454b3142855bc80788bbfd3a32025af4df0f8dd69bacc085375a98adcfe66b54758424d13343ae7ae213ca19738340aa38b22df60f1c3c77f658e9c7bc7bafd8cee90c63397bcca07f459a36be515727a369d4f6970cf4b60383101babb74ca93cde2878d9ba785a41c47b7fe1e2d2f8ede00af7bcb1d36af2c5b00a93f97ba4321318b8e70a6bfa00becbfa54b4012fb4046557c16295f60a24174f3c25652f893a95ebfeea9bdee759b970c9ab053ff72c7df72179ffc8cf42dba3aa9d4fa96425beba36181063667b7c83f72b7f6bfc6bd6d7d11dc3875912e4c172010d9fc4aff6c74ae68c6b4b7017e827a1a3355a7957394bbcace813a6be1770e340ef3359abc3ad7d9f169c32017fe8852792616070fa9169cdf78b20b51fd8abd35c57beb26433f6879c9d657197e00963d51449e57aadde812e19003c0e01b79c2d17ae27b7083eab1ec9425078bc7263636926425bc63bedf2780de4944351b0c2dd66326394ddb864fd2c1e0794b01fe02753afdb37c720ea983e0321eb1aed0409d4a05f86da98201cdcfefb5e3222c2ab2f397b8439217e6def3d35ca7f6fc76e292a59f48dd95e1252af818130ff3e3612169c7f07593588c453d7d872d7542f93ae21d1465714974908643dbbda4519ef8cbca126ea88fa34bd9ba813f5c91b499bc71798d859729b7acc3fb396267ce2fcbcbd245add801bc077c54eb6882cac973148f9ff797a5184b037266f82c4917e5df1115ebf3513fe1649c09d22e9f8907b3c020663f80aab2600d091826be79d7d1ae31c1be20466c400285a293f88badafaad90fa8bc5b77d8da36631cf4e719d96716baa1b0414fd541d8764a3792cf2d233e9a41aafca3fe1cbfb449a551afd7b9c1ba3cda774455a994012575ddf2ec84d6c1d3767e09605de2af302ba3d9e1dcc4b60b36e3b184d6819eaa7f8ea76d6275487c61125321d4dda5150e9493edacaf033791be5ad6bc9466e36472936c0505ae4fa933d671fd250a3701a5f1fd86d2bb7a06c36196805171eac49e48ac637a8294af165606aeb3bd0084602ff60f0a30725862ab33f0357583192d753bd5f1193a78af5b0f1f756acdf6ea3bffe3503d953a3407a8f4b9cc82b49ad08a7cdf037c1e7bac0c1c769c84170cc1f21e71597ffa891c91c1f24c4aa7925cef68f86ae9603c13b2b018e05651fae6fa018bc40ee20e2d5f80be412d81e25890e38ddb4e9d2b15d01e2e786852e4185c5caa6fd8dce5f123e00bd92c553c58a961d86751a02d1a02e7e1d050000000000000000000000000000ffffa747dfd44e1e80b7defb6341399f9e9b4ed7c2d627fc828d0eff9c168165b75b24e5fc6c3f5bc8a9eeaee2bc655fdaa58c0d2f3b1b944b682e8847992b8e9a2531cef5a3169ea5b80c580000d3ffe586b02cbc8ba82f8280c6719fa0f90a8bd3b7a5b5d4dad42f4a4d2e9bdb26d0347aeed2dfa722f4f535ddef23397516c77c6aabdf682d96000000000000000000000000000000ffff03d5a8f04e1f1301934c2416b61edcf2c37a4b09fe6916aa77b79d2d41e532e9e02dbfde8ce492110de4e762c0a78f70194a435d199c8e7077137c35ea1b06aaf47702f2098005a1695200e0bfd2143c23084bed5b1481dd4e02141e2b64b52df136a5465ab122c3cdb048b6c72e30d2d0a42b2965e77cfd0ef263b927a8cadd474374682b60020000000000000000000000000000ffff03e11a3d4e1f81fd72aeb898f6d16e746f9ffd34662c70ac425d1cc7994709bd8e9137c1901d21683abd31e75ec59aca47d4bf6f06eb5eb23b947c14b4f1bdf028ed16bcabcf54889d900041e5e9c68f8c61bd44136b148f8a196ec435045b41b55058f8dd5f1a8bce69053664815c5b2f45be780c5caeb2e7d3c840283097e4fdd1d499364801000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005a3086c1c6e57c19d3613870421059d308d5b16f00812269339ace97eb8839f491bdd5be89fb9f5f1d455f545a1bc6113cd4f8e29fa5059b5cf433f5b3399486d9b5794d84bd2678e2e1678a762707f2010000000000000000000000000000ffff4e2ea1164e1f80174252e0f66a71b7e53f8b32dea5f97a6b39dfc1479c6e355daa415b1ff7733a4bea6bbe3fdf412fed0fb60e5b71d77ec334a85c5cf331176646c2c357732ec06eba390081b39cfc075fe97a75d23fc6fc8b0bf9be906392b04b228148a5145403a229f17f41682e1c0331bb55c8df2555ca522850d657f8b5de650f08e31b030000000000000000000000000000ffffa747dfd44e1f84657bff1dbf81b2aa50e385d01549f9c3683994ab0b16d5b7e3ede8efe95992bb621ec221c5003d2f9f26fa190ffb2ae21d3baa7509a95b0a9d741549047c2e90ed8aa700c1a555222b83dd986987ffb354f541e7696d0dd6d9f28fa9ea4cab5dad785fc92928c180cef0f3ab90e609c93db391cc46e909fb4772d36243465d100000000000000000000000000000ffff2d2056e74e1f128e20333b8b51fb8c72c2d5acafa049758b53279bf78f10a1f32995bd05d4f6313b2bd67fbc48379455d89ef869fa6e65b4b2bd9e302d32234a9bb205db6e51c08767ed0041d72a6a7c2ea07deb4c70e47dbe2842850b0298fbb6c69cba57373cb74abab4c058d2a5ffc21a38eec0bdc42158792a2b85fda96535619f28cab109000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003db6e109e8d2e2f052216a47568b8881f7df245b0022aa9381fd5632124c682f1b498ab52bb1509d7d307e9c53b35daf1dbf9ffff54364b2b68b5020a930796eaa75567538ecd934cb5d371fa8ab9dc301000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005bd941a8832f305921d4f2bdf7946d8ac1b6b37900421684ace5bf21173abee1a68c966880bf93d60f17683e2b94c1ed515d5ae23ff3bfb0d7a45eee0eac355f2c8b58052591d53d96f193c0af1bc3380a0000000000000000000000000000ffff86d15a704e1f91386d3acee0bf9044cce40a07515289589b68fc9b8c8e5d184471ed7982106b1e11587af4c9e983883baec00b67e473d71dc86bda7e222f78c9e45f22deae94370286500122ff95f3392f9ca21be3601f0cc61989aff67ab0f08d1f8d09ebe4f1b984c1baaa2b5033568b70cec7062265924ed182cb5606dde746099e31a2b7020000000000000000000000000000ffff03dd1d174e1f8bf25d66d63197e3144f6fa17ad92ae38cc11b143027fb91dcf5c20fde6e52bde7f46f2789e6fa84573197d8085389dd5519b11029baf89428cad6fd4e70e3bb09f356f100821b492fdb5e25efbaf7dbaa82cd8aa9b5227495b3eed3e323cf92c633058dbe365d7a9de501086dbd238c8476092ad180186b88aa6616ea530bf5070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091b4363730ea1c02de53aaade78508ee41c38f9c008384b2330fc26f5ba5ff492e15006e42521cbe351ed42fbc45e4d17320d537b03fb1af5817b316a19cd3aafe04e5c0c499c45eeb613b75ff8865a40b0000000000000000000000000000000000000000000009a5e37e3b9e556a7d7fe7cda1b54682351d4d1f6ecd331d98816db0696a5389c4a09bfc57f66f0a27120302ceadb078bf9ef9d3fee586e471698a3f70eaff9dcc96ba8400234524f1ecf913cc326592cd1416f67ce1b4c36f58f30a6984e11d8f01e16708de8d01abe32760d948069962e3d81b37acd5933f8bf716a4411169000000000000000000000000000000ffffa516d5954e1f881cec3eab18eaeb916d3f234fae24363b68faa705f51a6efb06f83adef70f73fe28ee70bf4c8300ec4f77f017dbf7f06de6137f220482eab495340caf21f19261b1e84101e31d716e9009884c5063f5e7c751cd3f03304cb37ee37f43f67382f3d943141f70f83517c7f6c3bdaf58572091885cc2673605cf36b247ef4db70608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d532ed2827d7bea5c49ac0e1cf57d6dabe11e0600a3d13727467aaa93c4426c11e6b5f9ab8f97e5e6850c28c8cc904f6b7db3241183cb87ccd6436da48e7a85cbe05afcd4e2a0beb7171081567fb0030c0000000000000000000000000000ffff03de5ed24e1f0b27835d169ae7e229770b0eed8115b23c0aec942443c97bfd4fd56fd445fc6ef0eed60e694990bebb59a2adf4fa537b4d78ff0ad60af3e41a289a65c3fead778e5ae8b90083e740da19f306466e6fcdc77c235455681d0c0c09326d7ff9133f313c3080cd5a65a1f3d279a60acf90d0dfa0d9ad41076247e4ac7db61585731b0e0000000000000000000000000000ffff03de180b4e1f8993918fac072b57bdfa000722d82e654a56abf5e888c3789aa20203112c8d06d95af32519f0ec8a96f000d17c2d2607d61c09bc3c88519f84263e7c4e7033aa958f43f8004431d5c73ecb095daa699363d0a19e5b6e549414e6608cecd1188dbf551a777f87642a37e81f3d63e25a4426e06087954c872fde1894ea3c937517060000000000000000000000000000ffff2f4b449a4e1f842b8e5b5cc0841de193f440d5fa3e0b4a34df7fffa798fb8c3df46fa31187162cc3b3ecf929689ae35e04cbac6e069ff0a5dd8f973cec456a2423da87b5f1aa97f282e000e5644d115172b5b59c92b110d3aa9c816455b157fbe4edb5c04f133cdf3e6c760dfa4668c81ef4087103d204ae406f37d7a8e591c894bb06ba126f10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008fce46d5cc1aec576dbf5ba0ada049a2c2c64fb300c5192f9396c9cdd34005cf129d71833f1b56e857b9d578c2b7afef862c1de0722514d561f31f9b08319ff74ebe1f38307764a84a1f1d1d3f5bcfe6040000000000000000000000000000ffff8c523b3327138e21a1a12d5638afbe0cc50b2d61e0deb6553dcd12b84dfd0606a61b2475031f814207f613debe5791798d77f1ea47087ac95522eff7ec28cecab0b6ec79ede11da1416b012507422a27822ce0fafa7847828eced46309ff30968980ab12d74d8c751507306645fce7c379f7dc790472e00b2e4c9595c0a8932ec0102ac2e63fd00000000000000000000000000000ffffad3d1ee74a498bb67827af87431673e737c49312c5a16fd284daf1c4050e530b604ec4f85f217080503f978a6bec89d1ad4bca089c322583b4b7628ef1186853ff1166818d69d3aeaa4200e6f0f87be3456dac022e662e98593bff81f97f0000a0d5b06d582a0513c965a57760f33a17bac779a5397b8b706c4ef23aecfa0aae9e1272884044000000000000000000000000000000ffff91efeb104e1f01e584b5723fec78495744b68b971fd654f16b016d676ffdbac01b2c64f319675eda577f5eaa5cf5379e95418c61ab10d2a33a64d0e54ed860973f6c22ad36aebba1dc9e00e6d1e3df0e10e3d7c5ff5cf98dc65b52f13e144240e1c846d1fd6c746de6172b1f66dd6b5860cb98d6af64eb08991ebd39b5118fdce4691e113b010b0000000000000000000000000000ffff5fb7351127160dee44e338280a8e534c9e8bea9cb9d73163070d90d511e5c83859c384790e12da189e791404126eb2fe080593ad9a73ef664b6f476a958bcc490d4f170eb0ba926bfbdb01e692e11ee79d81547e27f3d7e51ebf4e1c4e19c7f0b40fa526de744c5f2efea5ef43432103d1f8f8c6c5db731f7eedd018f65fbdfc79f79c3013880b0000000000000000000000000000ffff03dec5094e1f18a43fa16110ed4585829a431ffcd1658ffc218b513bac160962362dacb948ad65181c302cd8560db49d51474018f6016327af06df72f3a94a266a765bf809b7871a81f200c68fbd639a7b8780e250d9208295c7d7b84b3dc66a92bbd7ec79fe3b86c3c2088599cb3a73c8263b39190620759bbfc917a510195cf303eda5b17f040000000000000000000000000000ffffb9d525024e1f868ad323ed59996a80a6bc8365d2a0939c40f29688d619edb7fd4ab63e4788dea07b31bb3e04a848ea75ad3c827e6209b80018523ca775bdcf9f5b35b31aec7974cf3b150147f962f47fc21cba4c4256bb383cf366089eedafe639cf909831042679a7be0fc011aefb025f52be8a8cf9c9db5e521fb8164cf7df2755d628da850400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ddba67c250a9c4121d546702cc9d29f65007c8550007a61deef4c6336a378b05c9af5db085afaf8daffcf97fadd141f1e6d77fabdff8ade1d5f841bd4e0ba3e48bc82ce6bdfe6e68396c8922be00ef7e000000000000000000000000000000ffff91efeb124e1f0b4282cdfe1cd639e60b6c58b2f210bfe6b57f8f247cc5b55673d188ef458270c7314f7128b286a3326b9ab6109bd2ff4c90d0d2b49179ba1311496241623928b4e9bfc6006733eab01d3d72b41603c7286c1a2f4f0a8180323837f11f46e62a75be76f805e98c399f7a453d185639bd5eaa1855f2cbc0028a60fd68cbe0af8f0d0000000000000000000000000000ffffad3d1ee74a5002bc82de6e1c7ba14576b504d412b2bd06f7e3cec15da7a94fc8df136c13d581e0e9973ca62106e67fe7a22ca816ac55404e7c7d61d784c76c0130e13804ff18a98ad1a300c86353dd241e72ff1703cd03eb947b00ed5b8794db235ae4bd0ed1005fb3eeb938c2d11cbf2bcf39df66686e6bcc7ab47e71d722e593457896ae63010000000000000000000000000000ffff9de628664e1c8f420a082c56b30c9bd8492394d83066a8d03628a7c8e3eac27486377e2648bdb3cebcc4fdd16cb4cab1341e480fa439da5ea047322750daebfc463a87ec042108d63ce900e87345b55f8ad790c23a786cc73b1682d43a40b984b37cf333552d48988b21e60d808451b4d4d136ddea0bdcff3d00a95b14c3b3782eb9648bfc4c1a0000000000000000000000000000ffffad3d1ee74a4c8a0ede82d78a0a8f4c2332d431c7be496c3aa09349ed3b2db30f7eb7dcc7b6e580a9d71f7d76bdaca1b3670e0cf4cd3c404e7c7d61d784c76c0130e13804ff18a98ad1a30049106aa9cb4165261f6af3c21680cc16effd3449f9f73ac5e765c2e2380587eef9841b27bda0e868229f0bf8e285036dc967d5a8f83e7ca9b432a70c0000000000000000000000000000ffff2be54d2e4e1f8de69524dd60930aacf252a19e34e5928dbb20144d1f336a45dd4248acdcbcafa929619913980156defa1113d148113959be053dd3345010e52748f8e5c8fa0a00fb80e800494518f9dc4badd3b5615b35236830653f746fb17dd00c266a9014d4d80f963fb11b2330d1a9e7dad84b3e962c0992323ad4b6a2f7a3ee3175fe6c06000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001db884e38658de13612ec46d636c67f26d3c43ab00695dbbea77cd2a5391bdd59b4b328a240c30b5dcc2ff06fea2c78d7d51956344db1ba09da6ccacb1a7d4f4b14f697fdbfd43188f58a14f7736a77b01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006af70254b26589b80f06011b3de26f7fbf715b8e0049e7c0077dc7f325ae9402913e681d3a3433e407e8e3f7670d1e0e1f56b8e37f9fc11712d2dc9bbc1086769db77a550a8315ff64ac5e20dfbfdabe070000000000000000000000000000ffff0567885a4e2582c635ec296af1d424586d4a77d10159fae30591e6f0d7e64060ea613dd8ee5392f9e0f2c14156147ee849b320e76b68c74055edbaadc7948fae10912f87eed3652a6f5c01c9ab494d5c6fa05c87f689f9de3ef0da18b397a07361e436e5a2f2d4697056f0f87168d853c9859f79e28b08e7339456b5ea19a053c3a1edb0ddbe111500000000000000000000000000ffff5fb735112719865d6f26ed3f5309e4aed19583cf179bc779e21c967485f355b214ffb6ba461a01b575a9c62b3a02d08a37d01817af832e54ec3e1b5bb6fb8de073c9451760b2127c09a601ca485207dc1a501f9a694d7cd0f007846c40e7af8d148116c647923cdf7b9d996645fce7c379f7dc790472e00b2e4c9595c0a8932ec0102ac2e63fd00000000000000000000000000000ffffad3d1ee74a48101d302d6c69d9ecb9e13e755947f3af22f63ed4ecbf466ff64bd35c3d86bf2e4d8455ab736715d8f064c8c8e4d3c585b6a6ecf5eefa2ac295cc6103d1e42c7276e72172004acaabcb7ee31149510138a0b11b087cc5a2ff0a24225bd52b52e1c2c58a113d5a4a633d79445e9acfbc878f263e03b0a3c930091f7383b5467eba7b4c00000000000000000000000000ffff90ca66834e1f97e409f5889b8c033c412a939d2419824a2b0321e29c357a43bcc74644d1945c6a5fe7f8977edeb6210cb038039bc30f84a5d378f42cbf6b07b826f192cf691480e7070f00ea721d7420a9b58025894d08f9fecc73b7b87ed09277fa99dad5aa028ea357e176f5ce05c6c2a6de5d8a69c23a56f19dfc8f5f357c9457adf560f0f60b00000000000000000000000000ffffad3d1ee74a46983ca9ab507b3eb4e7b0d31ccef3f4553493ee5334116a3f79689f9b808a201ead332a26f7052fd17123cf142f96d85fc59f2dfb9d43f7570319c048b73a3b2e33f6077800abf84695101d7649a8be1488b7173bcd83a050c4d4735974b6f08c997f1fffa29ccc9444f8c2d55e1c427895f791a0061e2eea32474494843a60ed030000000000000000000000000000ffff03dcb0234e1f86b437535c51f06dc3064937acb7d49cbf79fa5c628ff7cbc784717de1fb3fd121fab0e2c0b2888053bb0a6b764448055d0e5e10729fef8cc17c641213cdc8918a778864000b4ba30ecdaff42079340cfd0be8baa00a30ee8b2d38b1ed12e7875d541beb4849fb66acec91c9305bc81c8eac64a560ac8882ef5b2d2783e5ff09080000000000000000000000000000ffff03d5e3654e1f051b1a638ba22cba300ba0836304586ba5572a525622c4dd49e7178214985277eebad66a371253163e35e93d3b44081b27ab63981bb3d5f5b0375ebd3c709b95174ec67a018b3ba1e49dd244741546eb6f2a68c82d4990c55999bf385a070d27cc7534c4784e275f599b8886b49daa3285f5d4780d103b0475ce0123a2ae3dcb232f00000000000000000000000000ffffad3d1ee74a401828028671209b5196d2204d5bc3ce3ecd554dee9ff231883f04e67bea856fcae19d7a6154039140e9e3a6c6cf3fad4d3ee3c4a4a092ba275cdff0c03b912eb1d83c5e8c002c8411bae19c2926f8a4759da7584b66154a83ea95e78db457109dfacaa46797201ea53c7caf89e4d28761e9b41e0cfce68008ad447f77caa7b36f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000025df60b3535787ed34aa614aeeea9f99236ea994000ccb06a1735874a9bc1bd9042547aa981b7130c5b8b4090b420b7e5b337585edc6134cd3088e1f7bb40531da5e8710173121224ab3ca5d94a439de060000000000000000000000000000ffff8b3b51aa4e1f8dd3b8d006c8ea260bc6158daf0680c5cc7cf4936458024b51ea2036a800ec6563d75135004055d94743b8341b7013589f9695e95af100e56314bd08680812a0f6256e11002cca3ea5891fa34136d4c53122d1a4f843ddd8bf062f95e1aea9e169e8e104d3b2919552febeb84511bc568cc875f5d3b4832597ebb7e2dd285059010000000000000000000000000000ffff904c42144e1f09591bf26ea6f179457440d73ebc70c44310ea56dad7539a93be903e28788cac013b646e3ed4198ca74a8325d8a721c26f39ee8ed58b56b0fdecdbf64cc71b75041ac771012c5eadbf6056ba14fa85c440881afcc228de1be6f07f90ca0cbefa4c68744871c74d05e7036dd4f8d239c94fac4556d412e7c8fb18f2fd020ea91f010000000000000000000000000000ffffb6327d554e1f11b8a3cdbf872f868b08b211878ef11a0f6f7a7ebd55533864aa98e53e194faa159ae2d13a7625384a3fd1572f68deb43f309e73b02fc83f88a0bf28f87d715a48678ea6004d6c9b4114b070ff139d44ee9928cc5f659e4e7384effa9866b8177373dbcdcf721e858b5e357f7e3f50a4bf24dd8d18275aa2e70f7f4ea4efcee5040000000000000000000000000000ffff3415087c4e1f009a876325699d6979757ac10d6b37eb7f6690a40447f6473779eb9130975998d3a9fd6e9ada19559730bc017843ce128b7f823b0acb2fce829b7434a720075572ce6dd6004dea1da648b4453ad1529f5fa2df35e99244302b0222503b2f3dbf2e1ec631062f662979b702a945d971fed1d3dae66930ca071b53ae4ce85b9c61010000000000000000000000000000ffff74cbc5074e1f186053ffd90c84db8fb369e1178492b3a0a3941d33c43cd84b839d92668203b6501c786486083eff2b229cec3e0a190d383f1034f0693df2fc8b166d242b00917b7fec0700cd576c882db7da6ec00e3f04dec63d60ed858f3b30c35cea5cdbfae973a0c02c2b599dc346b4d3f95b54cf0ddddf3f9535ad01076549d40130e72a020000000000000000000000000000ffff5fd8ae984e1f8dd3ff4dfb358ca5c5c58f5c163d73482caf44427b62751b18255a456b8edb175f887db87b3b214753045f631db58475c5871227ddeef90af4d9e891170c4407a5957ca0004d35ab4dd32e0b2c60354bbc491f13abe6bbbd853994609f802a52462fa8c587de8bf74b378ce943d87ca86bdf897223fa1698fad3732eed2eb6a6070000000000000000000000000000ffff9de628664e1d84fb8f4119d367a2336982fecdcf326c56b7c09c0911994720ebe2a657d5d95252be1871889b13f81cdd16d49e15a7d33305078857e34417e861260119603fc23c67d221006eb9d0ec4f9d170dc2885de8770dba4384992de5b326e78f3b0fea38abe64a27f73a62d8e9baf81d17a0de9f753493fe7962078b3d25b3b1ab49a7aecc01000000000000000000000000ffff86d1e74f4e1f0db6da5d8ee9fb8925f0818df7553062bf35ec9d62114144bc395980c29fcd06b738beca63faf265d7480106fc6cceea7f0dddb29235681f498bb64f7bdcee4bee1f4c9801ee6e6ce3ad98d6ac037243dcc9e6802c4cd029dab65f9ba9842ba47450ed0268af51ca8170f9e36531d5432a0aa367e2e3a2b6e19951c45f7db17d000000000000000000000000000000ffff22e098644e1f8d6bea256f36d8b92071b66fa64f4023737cbd1b5dac7c1c9bf514cae400c332a1091df0ba8cd007d641a92507d9cbbf0c5f490d930fd36cd578b0f71c053b488b42c4ed008f248bfe318e4c9a889569491d58aa249a66a25716f09a1395e77229d1c14a94f56f0efbeaf436e98631e20bc7649afaa481cd62daee03f3af120daf2b00000000000000000000000000ffff8c523b3327159685ef9d056c2497dbdbe95e605f09e6b7fb0475051cdca625b53e3f761f20ce7353949e6e433f5cdb9cfca7ea0805699409bbb382053d51256b9622b11bf08e9919088a002f6dd2089625cd550f968418db3aa3aa7ec2c82b9936ea1b64ae3e49a9448ac45bda13c71a8effac4181b4f818da0cee9311c1e93a15787dfef825772300000000000000000000000000ffffad3d1ee74a458700add55a28ef22ec042a2f28e25fb4ef04b3024a7c56ad7eed4aebc736f312d18f355370dfb6a5fec9258f464b227e4d1eaa54b66e968265bdc5c88ce521e5608cb2fd00cff3af92c3f658dea50eeb7c6c3e8ede1e8362b9e4f66eb289cc064e4d5e3b1a92e3345de70b5d3005cc247f65da68ca83eccf393221bc1fcd53e60b0000000000000000000000000000ffffad3d1ee74a4e0d7a51dc63be4cc12a7307e8505b6a737d2bca66af51faec6c448d2588aa347e90ac4deb3a4af294614093ece40a5fc7404e7c7d61d784c76c0130e13804ff18a98ad1a300afbbb769dc2c57794ce684821642ada3253eba9dd86db233fc1a700fa728f474f5a34aa25efb245ea50e885e479abd9c71d32abc11a4e73882221b3f3700000000000000000000000000ffffad3d1ee74a41925d20af1a6d0ccd3890f0aead4a05a59be22e005b6d732f855311915b351a9153b2c83d84611b2c9958f806c93f7b5fa7ad30eadd503811c7f7dac3397e2544669e43d5003076cb339b759d09a3a9e0104ca702843c38d25a652b5cd0bde69c0f074c04945957dfa835f8ddbd004e663f5628cf242d66c624facaf56046df21010000000000000000000000000000ffff6c3dbd904e1f996f5888a81b9668c16a12c87134536e3616c929a7b67b37aa06d3eb7d7e405e3d3148ce7a072128c9063e1a8042eccd4915c7d1e335096ed8afa549bd4b52c6491d0df90190756048c6e7cd1c39b8e6bd88e7ce0b896ddc258c90acc24636da018517b40b7c11d44fbd23d92e7cefa2a5f2dbdd43ae11b3545b75a05c44a4bd000000000000000000000000000000ffff74ca448e4e1f8ef072018a444bc1f30885a199087d2e2200ea31acc4659eb0c05cca30f83e4bd940ed27873458fb605c92556883933b408fea2918afc5688ce5093b789cf08823a57ae1001192bb8a7f71b435686736d079f9c4bb5bbf321fbea8e69efa1b7643c59bd27a7c95722ae41d412c12b2c902075ccb8731e0b2e53de312bb2220b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000224cc410b74ac6206018520cac60988122bb337a00f19071a1fa482d2e511a78634a35fb63b29dd7895ffc76f9183d40fd9886f18b88b7d3b68eb85c3c4f1e621dba7b9372eb0876720287b28a1e694a0a0000000000000000000000000000ffff17f0e8c34e1f8041404bfd1cd4b71416116af92b7a17f42c47bf3dbc2294369fe1691eccb9ba851183a0e85a4fd728c946a582d006a704dbf4531a1c3aa937a63bb4d5a67f13a335d5c300f15834be4b99fad17cf5857e8689241deb9f01ae1319d4e30f26fbc2a5a2a67218133ea3f6c6aa4a4c9ffb1927e68b99d93231412190deb9059a72662600000000000000000000000000ffff5fb733924e1f987d8b49e8aca918aead0d50b28fd0f61ed166f28b6365acef6a9aaee144a692f5b3cce00a40719917a042d16d1849b810c42881c057bf486a77dbb2926437523da4adb6013193e57ee81ccf3c25937a5b585afa86c64d86b79f2b881b88c7302731f51292bed604587f137c806a8a21f6e1c593861deebb6283097b75d228710c0000000000000000000000000000ffff6418ef404e1f1931bdfa94f15b64ed9d09d210db9998dfa068332fee19d8e1ba4872c0acc3efc723e2fd04a64ef2da473caa4471c69e95dc83d7059a8aeca9996d6c5436db3f8c9924ff00b287610a92abd2251682e838175d2a742694dd64db25c22e794a3e0642dca689b90fe5000497348c6edb4c1c607ffb22b9ced8d6cf6551dca7c5380f3800000000000000000000000000ffffad3d1ee74a4307ffa44583c9908f4aaca8dd97990c56043e475723f90940ef5fd7d493152540f25f58fb8c965ee5e1be4f850a661476c1ad3af209f75deaeb9216fc8339fd48d376f9b00053f0c4708822c49befd55035b66d379c8c7fff44b614e1913d26e7658fe6405d94e291aac54ed1cb7e337a8c7cc4f883e89e6a95c55c607310d07b070000000000000000000000000000ffffad3d1ee74a3a98b26368c5f73198500cae0d7e1108833489e7f8bc5d7fa507014fdd0ad2b6a082012883a8acdbcf688423419bff7e24c8ba5bca416a7f4be90a534d11677811684d7e3e0093f882118caffcec59e7305e5141ced538880a37dbd68e075102f9dc0f51c22bc722194540a1b092c3554f6ebd9faf2dbd04acc8be221f9e3596311b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b017f68e82b1206e7e04c38bd976667ab36223f00b3e0465ebddca1a65cf496596bf6bb8a0a2a29c78b77ba31b59a724bb26b98e6bb10864c45de3978777969626b5f1384f6d4da542c4c1a89045899040000000000000000000000000000ffffad3d1ee74a4d88afefbabbc35d16594697bdde87717229aa8946dc781baec59e9ece3855ee31ddad469386b23a7e61805785ec827f50404e7c7d61d784c76c0130e13804ff18a98ad1a300732a3af01eda255d6ebbeb575b273c554d6aa375d096be755a42813d388f18823e9080bd678e91eda4ce3f855410830feb1643f64dfb968eb16e68100000000000000000000000000000ffffd93ddd094e1f97d330e64458b15b8c89b9469309fa3392389ea7914d6ece7ed2db3a1244c020f544e18a00f66f636272bdde847f91fde214131460d26a3080c859c2dedb23d4182f99c200d3aba1cf7fc23882b84eff807db13920b387ce209463e48689073795d3479cb0eddfaab70cfdd909ecc0c0ab6b9f7ef49c2e188da5cdeb4733df6c090000000000000000000000000000ffff23a971884e1f1848a0024f4a1b85e18552105a7d397714bb9d16a392a29b5d6d18bba91fc880a6b20be09f1400dfe58de3ea87f919badc7ad6d9a56d9e5370352a41c4b9b55601009064007511221bb4a5bc3b4d984739add15f40991b6378e9b408f533af011ef2de73f74c6ed20b7bffece331c67765007c96709bf598d6ea358f2ac50797070e00000000000000000000000000ffff23b9cadb4e1f04f1a3407bf953809815243d539d316d2b055a57ff6c5412f31d98f0d5ea84f54511fa9f02ddd6d7f8751505c560eaec8a108538dca5b073f24fb8db78f06ab6a0aec27e01d509859a3a70d4f6c9c6430ba5a5c6ecd6f375d05dd1dd02cbbe22350d3b3bfab90fe5000497348c6edb4c1c607ffb22b9ced8d6cf6551dca7c5380f3800000000000000000000000000ffffad3d1ee74a4289e308c9d2d8a3cb35f9d7bb7220b1eca82c952b82111119670dacae18a509628c775287e4e796128cd6379b80dffd7d8d3433cb6b9a1a29fdf07613172bbfdab744889600357753d3be9becc9a5aa08651fce50042d7e11a3569f54a837936c9d989c09234ad1d6309b97672fd755aba4efddc7e2a65825743f90e51143203d0b0000000000000000000000000000ffff5fb3f0b24e1f10646c2a457c03d5ca00d314591e7105c38935c3616bfcd33c24baf28e86d6c7a38161018b538b8160ff0a019cdd5f0e0fe95a2c3c7521e18b7ea842337ccf15f1af15bc0096b19030565fc88f841184c2c8ac418c8e44e36a4420bea538b1d9b918d1db462f50e5fe5bd461c956c07a8a6280549b6decb2965f787c4e2a70c0070000000000000000000000000000ffffa516e93b4e1f97adf3867ae5155b18345e44e277ab26b9a497c7d0cf9b53bdc42362dff3642c922d1d10e277ce6bd407f48bfabac68be3bbcadcc1f89ed98a2ada3473bde7dc618cf3a701d6373ec9005b1c601b7c593318c109ee53eca8588543a7b277eccfa4749ac936524b13bac303ddf4f82ef48e21a8a3e59d0ae5a459d2fe9a9a21b5130000000000000000000000000000ffff34cce13c4e1f8f2caf4cf1e01130aa6bcf27784bb36a2b4daea4ada3be553c9b709afcc752d0f34a0c35e3301e8f6a2fb3ca44656be27509e1003c6e1b4f64a954ba6297e4554f3e73590056a400ed0b0ef5c34858db07d9e47173b375e4ce4b461da1aded7923e7eed171c351109755e91b6ee895bac465676004fc8e5abcf8fba6acd3e6f7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000059b1ebf04d63af3ef87391a0a4a7b47f5f5e79110096d443c4f55c6f02d67fbb8c918f22571f83bd547f654bd490618c182fffa62794e291aac54ed1cb7e337a8c7cc4f883e89e6a95c55c607310d07b070000000000000000000000000000ffffad3d1ee74a3b110bdff9037c3e3926082ff9e9e9de9cd0a0dd416ac6d60a61781f1b3832a4bd068e92343be400fc31db6eb4404d0701fe4f653429e4b1a0aaefa221b9191f4deb20355d00f73ef9e0aabeec97e243d2e09c256e52c9956edab8ced63c18681aa755dd4c4faf19c041026b06b21610a7068b0ab4bc484ebc0822fca4583e0bce0e0000000000000000000000000000ffffb23e5de24e1f93a5eb4a6fb84c13bba4d597a6f9d37f565048a384c94d3b81630c6965a023eb3748b6fed0ebc224f051eb23f50d9ff3e0cabfbceeb716b5b558739f218f9516c16918d201f78fa11b3c1abace87b38e3a07095b1f6f990c0c384016c904de654e24ff04755614266b33c018e9b66f0f7c25652bc97c50483f5bdc1a9ae17117060000000000000000000000000000ffffad3d1ee74a3c1249d9527e8ccf8d237e828500cf7f8946963d45264460586ffd8fb1b76e16a541c54695089fbcf4b1b8e1ec79e93a708677bcd0255c7660249af2fd710a73d2e961ab9900d79c543b826e0254c6c8aab06dd8b1445677df23d93f228798535d3030ea4ac2bbaf9ff7a4ffcf3931de9233fa8e151f187bf30235000e3b5fb102b01200000000000000000000000000ffff5fb735112711845e9bf2879d98ece4aa8b78ca074e32f968bd93bac973a1abafd61f900b70e7178b6352d830d0fecc2653d0f04a915189842a43e2868f4e5451c2051466a8d6b1bfc2bb01d8fdcb15669878b5acccb5eca394ff513908ed5fc3cf44bb1648552cb0b287f424a70b898084eb8f9a1b6f4b0e93f4736f6866f1c4e5c2b8bf861f040000000000000000000000000000ffffad3d1ee74a3f07f818e5c2330ac4e7f0ef820f337addf8ab28b07c9d451304d807feda1d764c7074bccbbd941284b0d0276a96cf5e7f4410220b95991383f29942bb02510c07de9c58c00018732fe66305e3ddaa0f40c3547f1e0a37f5c2621fc716b43ffd1a2eca81d18435972e9a83060119098c4fd59848996682de342c230b52864f8fe2080000000000000000000000000000ffff8e5d284f4e1f05b69b964d581a7659f5fcf2cf4a50a75e9cacccebc4e18d27364225eb3f9886de5472cfffbf9cf029f81b49037e27a2a4e27301bbacc1c42b5e2268bc2b4400599edcf100381fef4ab9f067b9782bdf19fe0a7d316a9a0ba26ce2b2761b41a1970ec549b1d8b78d6381579c07fdf1c9ed1782262d0a11c2ad1edb94c4c00c2b100000000000000000000000000000ffff342353514e1f8f60f80538f335ba0f9f5452f02d7f5527652671da80c3d1c10e31e040f9b901a53b476a9ce02b507958bc8a65acd7b02adba90fd804d6d89438ea6729608d5276687fbc0199ccd9983f3433ae1fe5d5cec96721dff60b527d0f1ee41f4e1f9867bb85fb4143c7372049ecabb23d1ced9b706f49623748f322f31b28b0cef58e000000000000000000000000000000ffff019f8feb4e1f8e53b8ab39fcc259aa22b93d1ab4e333353e6d56b9bd4d194985a59e0de5060c1225588a256569848ea421725223711b07ee5dd8d1e99e4bc8e015d94346580d7cfb1c44003987a05e9b1fb72cd13eb1ff70a20ea8fe5835e6f9ecacab48e0538c77b0a75a8eebc867becf636c1871a8935b2a1a5e58f11c65dfcb36af325c30d41f00000000000000000000000000ffff5fb735112713940c2271fbfbe83cd9dadaf03da32e840466cd4eb0e358749d5f22da2ca22610c6cdcb664b1c082b84cd4516d73ce5d56be7a3a831cac698f630a281ad80e7e343aced960159c38b8d6a0664411f92a6326e8ef0707ecf185405252854ddb477d89127a32d3554b945bbff333cff1a0d4d95c848b52e558060fd7b2f2e37dadbfd1a00000000000000000000000000ffffad3d1ee74a4b932f6fc90c9dcaacdf9d836a2a7e60d090fe5e55b0b02f5a4f608a4b8235ba5aa7abc4e05f9387d1d942adc57c87f5b7c9fe0e7daab67759c331e39d4b9c05174e852f070079db996f952e018739bebbdd0a643257835125cc49094f417dd56e67c65549556a37ce09bb8a91791f7ad1e407d7a1380c88c284eca4d8cab974890400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b671e3853e648bd893b1afd21519616360237691007941e0458946e0dc791875aa660f454f898ec81e10c20d9229a63d4200679b86fc07fb8b877bdbdaf7019b035a32cde8c20d8c06c4122f8baab4540200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011b1a772ead943d16af20c36c7255e18ea51027007af1fbb3e35ff80135d870d1434096943a35813e67eb9b7158d81697ae4127f02edf4e20da547c811499cb9fb6b0e9bcc5e50e186a88b8339533770600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000aa46b558201bc87638f324a2860f500f053ea3c800da1d374e0b9fd68c854cce14192924406f6f71e3259ea25b4eb6bfdb53ec32be5927ff3fdc20834ceab0f7fdc81d48ad340ca539617c4a25967271150000000000000000000000000000ffffad3d1ee74a5186ce02e551a46f1ca9a734104b4e387984d733ba99930eb677aae126fa142f201049842422ab2f105e3c9805f1bd54e8404e7c7d61d784c76c0130e13804ff18a98ad1a3007a0ffbd06f4d0fd6c118d084498132e551513870740f801af2354c5c616d0f480a7d2665fdbb1825a1f1af4dc4a8c0d924eba1198078f731c4a8370f0000000000000000000000000000ffff8c523b33271411ffd9151f27ae5aa8f396270af2365903951a74b7b16a9e404b4c69e0ba84e1d5ba2a3259c4e7069d9bbf0bcfde73a6b3701491e9550750948da59bd08e8b95c2f7c937007b7a542b1e15fcc693f58ffc4e46a4aa29220d7c1688373f4247d8b143068681d7d38bb9cc64b5c858ab60005ef33d969b1589e18a6487c8fe1e8c030000000000000000000000000000ffff8c523b33271d931bc23f9612c3d4ac779464a70fdfb84c115427e91cd6a9402fe6481af12b84ddc67cc76365277d4b4efe8fc3c943cef423ffc0afa8294451b9352ebc5a4ae45c6291bb007bc7a2be984b24d7405b3b1cee1aed3e2dd2bda92c2530e9ea34c3d683fe673605d602cc97294b000cdcd55680eace9570cb846d0f05ba55feca82080000000000000000000000000000ffffad3d1ee74a3e8b6159beec3c3c1ba223fa988b5806a02edebcd16869a2e053b41b7db3e28f12136636974f5333317fc67a22d2b9b3db888f308cd9a0e463e61c1a53659dac28885b523e009bdc261b20c6697097a0693ccc5d8e08342196ceee3c67b2f3f703af03638cc98eebc867becf636c1871a8935b2a1a5e58f11c65dfcb36af325c30d41f00000000000000000000000000ffff5fb7351127158a209b5083c2b601ea18a04f0e92ee5befecf765486deb9643dc3b3fd193080c2659bba166f3873364964d5e8f7e4b9344ba46c120c527424de6a08ce3ce2b7c9dc81083011bde434d4f68064d3108a09443ea45b4a6c6ac1f537a533efc36878cef2eb10fcf49bf87be88ff1ce988d3473ba4b44bfc9325d12efa58bab80e900f0000000000000000000000000000ffff22f15da065ab0e0368ea6892840c8bcf62ace9288e02b35b0e274bb63b18b4f0b1fc7af037cd5c83f2b90b499564c0a0d9fa53216c2e72a10e13797fe9fa995ded281ade5a79d4d8a871003b124c4b7680f39d584f24243ee298d4d89cc4873a5166b92922195ac30416a9cb7bd4df32ac5c136bda4fbbf98aafa4b3ace0883c5576fb9949db0b0000000000000000000000000000ffff36d21b714e1f89a136c58549f2661331bdf99345b17f1627efde27e9d88872e94922394371c2206530c70b04dc8e530aa92290d7f23b753fde47782fda31449e468beba58271295ce692001cac95e0a27f4a3de7ec2d4d9b1494e48c6750ea21360e5adbd236ddac7f5d995bcb2758b4ced09c16c0e5d31e27c4b688615f5c121b6595ae5e940a0000000000000000000000000000ffffcff661694e1f8c26812d38faf159f811a09c1462e07e40d6b44881114358cb5390b65778ee437018c5879fbf935fd78955899b67633e373eabed3a46c91e10415d8a7e0b36c2867b92f900fc24e51446787e48ea9356b09a14ee2b62eb36ea44763ce7431c1b6e6b1ce441fce726f1ae14c80c13fd5e6c275564ef99df407304e144e4cbf012050000000000000000000000000000ffff95f8331e4e1f99567cfb20c6bed5d20638c31e7e512aedda02649e82f2b955ecd3e34f73c2229b350069f6e74a4304acedddd87997fe7efda5f8279fc8c7490aa37ed57903870a1f4ee100dc95274d4fcedf945668aa389119b47644ac7e2be352ef42a64d28e1d0f83d98cf49bf87be88ff1ce988d3473ba4b44bfc9325d12efa58bab80e900f0000000000000000000000000000ffff22f15da065a097c81c1dc3d3664633a3e7163469e9d91a51b1cf0e1a75450a2ff6d4f8234180a62539ff926fd5fd0f0d34aa227af26979977ad414fb83ce4a2ca284577be7bedbcc524700fcce921d26193f25430e2ef86d42becdde00a8459017d2000baf7b07624940907c1b4749bec4f71a6579ad100d795ff2bc5981221d36b87d8ad2ab060000000000000000000000000000ffff90d9562f4e1f85724b1fc76643c3e8329b3a02ea60a32a1ebb0e5557f5ee29fb0f9ccc98730084e5a19498d2464e53b57b6287aeeca47d24a11d8132dab10919cc7a9bf8e1c51a08980a019c2c3394fb96bcacc80d596968520098d63797fe0ddf067036d09de0c648e09505d602cc97294b000cdcd55680eace9570cb846d0f05ba55feca82080000000000000000000000000000ffffad3d1ee74a3d182ece65d7aef6b0d0a92c0e3451609607717f9cdb6d11cc6e31a2d625c7f40a8cace522b036481daf4e4425c41880a545a9bc3e418bf0be93c4f1ce2cc001253601cbbf009cdc6f9e9f546ee85d7b9c6acd9cacc30a4517aba28c92be3b90ed9f821474f5aed34fd3fe088b35c77317d0f9791a7a42d824083cec1f07f12a61050000000000000000000000000000ffffb9d525014e1f90e39ea01f37a796795ca51a0d583defe2db3c8d7b1ce97b73776caaf31d8546232a831ce458b4ff9599f05da49a87243cf7caa378e0cd194293ad5efd22538bc931d341011d044d90e90fd27861d7340ad564c41deab4311339aee5c394c4e24140eded303a82c9ab3f0d8dd27bfbcfe9d074f221e207e33a77242a538d4e4d070000000000000000000000000000ffffa747dfd407cf0d731903ca090050801af45465c96d1248532819959a5a97eacb1ce518dcd5c5a21f20676d7c893f81ba672fcfb0f805ac1a700d32a6ab3f00aebf68573e26613e62a825007db41143e8d6e3ca290a69a44797ee967e02f4297186fec08a8a0272f864369d3554b945bbff333cff1a0d4d95c848b52e558060fd7b2f2e37dadbfd1a00000000000000000000000000ffffad3d1ee74a4a862599b105fae8d252fef9707d02988e9f302ce6ffa7d1566908979816af6752e1470dab2f6bbed45ca65e64e4b74a3fec4308c6a9bb3109cf662b0f427cb183bc70f93e00bd45d61cf59378df157917ec8a19d62ea3234d7be8624800b91149036edc232515784d2f4129fd29916fd727094482c69714921bec4df0a0458af70a0000000000000000000000000000ffff8c523b3327168ce516fa5d72f29e08d842812ef5cf72de3672c23d6dc88f4b13f0a50c2b8050d0cee348b6d542ceb569a45504e734997d1203d2452d273b2f4545a105eb7f2f2bc6cad1007ee1805542010fa5c03fb69f73c1b574c242444b5ea176693a8dce3470dd0b6f92e3345de70b5d3005cc247f65da68ca83eccf393221bc1fcd53e60b0000000000000000000000000000ffffad3d1ee74a4f963692dfe42c25fc6ba4f3ec7f11181d1d8e97910eb6349b20dc9f79cc3cfa6adbd402a1a808898c4086690fc029d27e404e7c7d61d784c76c0130e13804ff18a98ad1a3001e6a0a8a0f3dcebed9a4d91265517bd9aea459ebea468eb0c7734b3e3d470530afe8232cb86ba16eaa78cbb6092250af0424b76a3abaddd1ecd2df020000000000000000000000000000ffff0567885a4e2414f2a5efab36b3b205fa374f96692964cb114df9bb45dec65232ea352ad61158f56d09ad508ecca27e88d75553a00ec3f3fa8bab192527e21a828c3aa96c794e58ae38b6015e5a691968c9c9f61d6eef65d644a1b61149c614e9e898c112d42acfed28d4a0202bd45ce1142f06c8d4c210289e4658ef01d8b3f442a17d4c118d060000000000000000000000000000ffff3344af4f4e1f0cc42aef3e07ab43ddc4fc7b3bd86a3e1da0c270223b91718d39c3f906aef90a0086dad9510be861bd6ef3dd1b45b0f58cc4e88b51f75f9f1eeaed29523e234d9e47b513019efe6782f18c780d3691c0d9b5abf48e0b75635e9c8c3a38af9580dbaa334b0b0e2d142b4778d1ddab063a39ad555dccf6324784847247f6016a3b000000000000000000000000000000ffff91efeb114e1f11d05fff5f406fd207bc8984188894b6bbd32098e58244136519a51c183c70db3d713a33c9a55f8d6993f644fb34ff2d9e1a38143b4dffb85126ea5a1d78f957327ddde6005e43a6770a39e1b23842a18166efc352bc9c0d07dcc6be4444cfddf2f6dc846e5b8892fd835ba3a45b214442d83cd99c892a206573c67914eb357b150000000000000000000000000000ffff175b61d34e1f0064583f3f5dbb756708aa405572d2eaf3349ec2d9048c93f21a2d1e5a0da7ae1675d27d626035ce0754de1898d5cc308d83de554dcaf4e9c01608497bf4b6bc6321014200ffa884120266337ed03f5fa9b027a34f7900edd40285762c931842677533c2876e7557de965a623c094d402cc39b2c243b225c02f9aca6f8ac1fe2080000000000000000000000000000ffff0353f0dc07ce8074793934715bde7630f4f267a9647955ac45400792369bd3e5f88e2b9d6c809251b79428e3a8ec07bdbb7364e3c299f2b29900381739339a74d57fdbc677a6ef249f1c00dfc98b1ef83c86d8fb556476721104fbc2dbc68ad4f5238c93462dcddfbbb5929cd63f26854111de1c8298f8e0e429c38249ee431b1ffc19354eb40b0000000000000000000000000000ffff6a0c494a4e1f07cff9e4c50da82722bf41fa5da01ca4bdb238d8d53fef085a56c34a432f6994c79e5bf754898499ec4dbe91eec0d00abb9bd2501e88903aa50a1eb8f36a5eb1fd0a29e2011f0aade9021f071deead3039640d9d357370352f415951669df1c5ea48d2c0b5b64f81113ee8e6e7e704617506dbefbe925f2925693ee86096346e0d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008923f5540c3cde8ff5f57178422303c469510c48005fb6b5cb76ac928fdd8334ec5af40c467734fd4970d51f796274ce5f650cb92af3bfb0d7a45eee0eac355f2c8b58052591d53d96f193c0af1bc3380a0000000000000000000000000000ffff9fcb15144e1f06b2e598c2a16e7394cff63bb9939e8bec49849f2520f97d8de70ed9336625ea0582889be68007e93663685d03d6996b9406f3c3f3e20632e58e419a5107a5db669cb420001801028fe7184ee59ee91bab6c8fbe021b725e47281ce9ef7aeac2ccc517000000000103f8a519dd2016c1355609a223e1d168ef8d7d263f4680ab6c03060900000000010e4e74f9e2a97c4230b0e95632f8f2e942264fbd29cbd1438e3eb30b0000000001131a601eb78dfd95eeeed8052cc9590cbfdfed15043236c5e6168e000000000001254315652b53b86943ea7ef2a740f350ce178fab729bf018732b3a08000000000134579c656021637f2af5495c5f7a0aa85ff15f12603358f2f85eb602000000000150e743f5d807df19badfdc5fe12dc47df86f3fc67761d3da14b8df1000000000015d46e91b3da7d291c5b8eca9fa79a4327707b484faaa14e1fc813e070000000001638f4e9127f6a492753a96f13b8b57f4e21f102dc9bac42a6795030200000000016f7cdd3165e716fc9877c45beaec84c4997b656c52f3cd797afb740200000000017319c2944bf5c92a279b4f216bb3479454dc7ab377092640bb417b04000000000185128673e2c025dadbad72c243ce5836f1bc88a6f5390609eab4ad05000000000195db9738f46fd65e9992cf377785f00e391fa129950dbf1b933a080c00000000019bb53c3dfafebc7ee0a0c510fd5f24acab8fb983a504b2e6af6891090000000001a298884d3d8904a6dcb0d807fac92d1f50093552fcfa71eb71364a090000000001b640c292102eef338be452936e3e9a05bbd5b2a902abbf7f88d179080000000001cf71aaf2c05337c6ae86dfb42560eb406217f4795268a129353dcb000000000001d20731acd598ef5b5d2f374a791ee97baffdd3ddf0e55694e53f8b060000000001dae0c2af54381c0dfc0a8e829b2bdac6e300cf798bca07aa28595f070000000001e48179f6ba85ad33b77c6f6ad0c4ce1ea1abe7700d57dfaf9b5ae70a0000000001ebdde4c70314a7cea98e691c8cec7b47dd7eb3fd6ed5ef0d8867e1070000000001edcce3d13963e94f7fef2198607477dced049ce95ec2ba561acacc060000000001f4809ce88c49c235d138c3323964b15ed9e378bf506c3e6ed42cd70d0000000001fb67e66d1f33b7adfec25a1e71759fdd570b95520807232301350a0c0000000018fd4301010001025947b51b3365803a501e03a5bdd184f332349f3254455ce88ae4010000000032ffffffffffff0332ffffffffffff030e448ce49a3b1a89dae293d9566862e6815438ffd2d03e54bec4167e8db7770b8da8bbbf0dbd256206c35bca4bd0d5243130a149fb7516db0d0ce1c6d032834cbf4f390aa245bd610130c867033f6ace81b212eb1107c9a8685a8d20c80b110e8e43333382838b17bda474d81d0028dee64974d9faf8ba5f2260b286ec9e0cef047e2e0cf1a52f6359d6ddc2237818ecfcda84de389aeaa3da232cd396bc65c5d1c8c25d8df4364a60ee0587b03f3f5a0509f9bae9ab601a4436db306aaeb57a70ae14b1ec18e0a80f4c3434295a7045b1f50f5b8a315ee068f182d3f728097911472087ccfcfb5d2f6154f6c6860e6d2d2e06bb4b7eb8239c1d17b0462df2a19132feed479286a9971b29c57809a78efd430101000107a2188c1db99039e55f075edb3220fe55c62a7de852d09d0f78c8010000000032ffffffffffff0332ffffffffffff030f1f7421360139ee1d84639e9207bd2659bb9cdcae30d7ca5ba0a1643dff63776397e08ed790065084c3e816d16523e89f20e750bde8b60bfbf8860a4b74cefe336b5909e86f9bf5341864934a9cdf018ea9f868cc3f66a8dca5281dc0b89f5842dd139c047183e68a0ef6a57164dabcf02aab7132d746eb45e03f96df48787214a03e5a64e7677564bd0ee9de5506916a00577abe427e4e200c7aee4a0836c0164e9867533fba808a2b2d904d61a9710c51114f9a1894a4ff3e9d87c0f5a2ac58f1bf3a38a2c4ca92ea560f0cef95e7d908daa33223219ed38bf654936cb2ba0d471cbb9d60e1b605dc2a663d8a31c6b2485c268d289bd5ff573aec662ed54e4cb763c6c6316271d7bf26843c1da015fd4301010001096ff7bfbe17df20d3a2ee4c4c16e94fb9ef350a7969213ab9cc27010000000032ffffffffffff0332ffffffffffff0302aecf8ac321adab202a27a5f5eeba5a2e0374c710d56ce3ceeda7ef24e1b217e5bb9dddfd926c117eee90c2e513195abeccff2d3946588224e5ed74b9b20dc58a94a51585edbb5cf2ad2191ec71e0ef126b93f98ca66f4f58ada51b99af3608cd57c93b7fb77380f07f583af26357d61c258a140d845bb5f719955cd2c76b5c07b64a421084e584f5fe7c76549b2abd37ba89c7df23275d6bda7e72dba34ffd080a4bfab1e1d4e05843c5f0012ccec112a8526a1ceef3664ff7d54c8f1acfebb15f3e400657786ce4e87c09c42fffd0c39d37cf946b5af3b8530a2cc91153fe0dd7014771fb6a68dc988bb21a6715e24f88f52c988f7151bd39abe683992d81131a9091b1d2eaf06b3f4c5dd441de1dfd4301010001392443af11b79beb23407b9d0092cb0bddd16878e8f33b7ef32b4e010000000032ffffffffffff0332ffffffffffff0308e1c5d4f5b3059b111799bc4ff98ebb26333c564c2f6a778426dd097511b4c4d64273086e36efb98408181900b07cd1ce0f05595c334e562dbfade22a1ee98cd0af5be520cf29f831d7342f160d01fe9035c2e8782967f06fa06f0c91f2700252daa94d0b45d3f1ad99efce3e351c0dfbba04e1535c49d66715de887547b75e0baa475791f129224765b261d4a99f02140869740e34143e53491bfcb1190507988e09bf97697ec48f5607f09906e4d198f2f54884dba2b471ae17e98e79219075cab5ec9706085390d594053544f44c19aded571b59111159cfa847626d6e1718e49b6cc3124a1d5578db5b175a613a434a09e27f1977c7c4b0ba1296bc6c74cb9f4a7a7d5550fad773d21fd3895436fd43010100013bbd8442e868b798d49b7cb054e658eee7e0de2dcd15235150a17e000000000032ffffffffffff0332ffffffffffff031212b2e88b5a9131a0ee8e1e59042621bce595c55040e6fc4ed7faf2fde1a3192dc756a47772ba37759c5df17582f54ccc57c098f2a88ab06358f4ae92f0ec7e1bf2ae337d4bb6a37928ae00389b89cd0750c0e05bdc0e97862d3bb20adab7bc5a5a1724665dc84360949eb11f826ee4d4e1760a81f60f2905752b73d43facb7093568b7463879a72805ccd6f10765d9cb07d71e4719070fd378d0d2600aac9ea077509708f910e46a98e92ac7f6d2b099b1fa0880d67624a726d22eb134f3b142edba48af70e581bb64bf8a2a4f3964ffcf8883955e0f337d0a02710d1e744b0453594609d930a3a56f2a579e40de98494743c7225d7de338228f358ce03877cc61c2facd036e01eeea7db6db8fcc70fd43010100013d52dd7b9fc8b3a7a2de62fccfc80115dceda618dcae139481a07c000000000032ffffffffffff0332ffffffffffff038495024da25218007284d41e237e9267d3c99b6d98988acf00d9465b4d7efdced80664418f0476a321367cb977329d6c0f8e7d1b44a708fe8a8ca7f1d7a8baa28c3ae75f84f4fb12cbc2a152d68932088f02f603b3518353cb1210e2acbffe11c9a7afc0f35ac5501deea83cac77929ce5e5705b04ad354229feb523513ee3fb09d7970d5475bff573b3870e8487a7cc32cc46d2939a0a81c67734a5badfa1588d2b7fdea249a1416393146b631a67ce0b911217719c3d9329eb3507a7cf4f89f8b7dd32099522994627d8762b27baf701dc2b67c8a4a647a032a1e7948e11050ec50a82b6dbe4fd595814d2077e10d32139c722b0dc3429b4b99830900c03d9996fb4ffb6d4e1e0615aa3e916857c17fd43010100014a2818f9ad2ef22cd4c3a6490cb268c62e4c94810c2422e1342477030000000032ffffffffffff0332ffffffffffff038baea8626102047f7b77017949424e3a3c0fee0f1c3bdd7ef386129112b00a17bd09241e37d2dd09c169a8e9b56d65ed4a84f1ce8edfd9377c7c8f7da689ef0f7865411f8386f1793a161e9f9df958351343dfd1d9b6578af443fab107f648ff82fcb09952145c30759e81d5b6f5e855ec40d6a4aa4dbe13b3918db6e7d8099e0a1f073619bad017d46bca3c5d8093a95899ecfb336892532f6a0f82a1b15c2d1f8ed3ec3851eb6c1fd80ab3033b542d0e86a2da132da69365d5150b56c15db613dec31e1410c7ee8c17f67044dbea8498a2bc44b225937ccc10148d1ca8420b04b2cad32cec602308240697ed93c76f5ec43cdd83f200a6aacdddffb7ed705403c715a27d63718ff9a59937542d82acfd430101000153233d15d49fdaaf38c688aca8df9321aa6b2d61673340d5d050ca000000000032ffffffffffff0332ffffffffffff0308c85b29c8a97064115420068382cdfce099283ecb997fe166f7a67ae09bf97bd822c9033759c6bc39ad248a67dfc8616ff546a4d371eaa40e1b87794537da96047523967f0ee46f17949a992ea848b5007b89c0bf6ac05d93fd05694a0c6b79fb606b9fbd595752472647033ee82f2dc2dfb0688f6a8b00ba83086417816ccc02a61a41827eb81c60b71345003e9c34f3f65459dcc6123b9a512962965fed43fd6a733d4f7e8360835d1057bcb1f1e48f2e4fc65bcaaff09f4d23564052dd364cfb59daf64478f989e64b658447a0209d343187ebe075819706e2b04e9a259d09a1e372d22b50d51867cef7ad5a339f4ffcf2c8dd94aa4d1aa86e001780423131d53e19819fbb46333d4f4fe1d23437fd43010100016e9be2b8a34c8b1b520fcecc4e3439b938d726cfaa94067c7b5618010000000031fffffbffffff0331fffffbffffff030b48de5707acb3f6e5536daa16f54cd31047a22ea81450ea021364b22c3f60fabde51873a7eef595254e2e9e4ea654272d20f12ff56081c7117118195366263991557d6834154eabb2b28dbf23aeb49807e14170f04c3296a4ee4398c9e67701357e6d4bf397ef785839623d93b99d76b91a9fcd952b9dcca8e4a0b95e10d385122a85b53ff061899d19403ab04f07471567b58c907233ab9457e00038b4686cad7f64201e854489a47ac4a4aadb84a3842ec892233e43c4c85cb4c1b47aa07ab7bbb9da5c3afb23c2b6d0157a74dc1f92d99c523736705be798b763282fe2a40802a7472977daa2c24c1ee4aa3f36753d1befef21078b41e0fbb4fe680fe0a6dc6649bdafaed84533b3771cacdef433fd430101000174b8e4d19b7535c40c50aa7b0a00abeac0150c1ac0e4c7334966d2000000000032ffffffffffff0332ffffffffffff03946e67e558a5777ab9e6e19aa4ef6e6613cb7307ed3e5629b9d4f85e3e82409bc806afbc0a8d1c07316c47e01f63777bc8213e70f957bf6d290212206bf80f379faa72641b837e4822adc4b279eaed4a933d2a3b387c865ba1b59fcdd2236bb943478325ae2192fc54854a7213c433138baa53f1bb894ca3b6763fc39b43d5990e5d55231637511beedd24f4d30c7244d77254638066f170b7d11c82ce4db3a99dd9e6f09bfd4a8cbef63f53051fbb009570ab1141ff5010c4dca319171864b5b62065933b804e9208f53f978bf2101b3ea1ea728d17a759ec40273d01297ab6167462298eb03e887752f892cc6d15dc0e4f66f5de9088b8b06750d7396113b8255fa12116bc7d840479288f95780be6fd43010100017c3a3b6bbf21d4140caddbf28401067fb1c4c1b55caea11bcf2433020000000032ffffffffffff0332ffffffffffff03887f143232d33481a4b44cf436ac314768e4471524fd17804a44ca5297c5b978a73f122e50c8158c1740d3f1f2f705254db843780ef7789fc67451c6095db277483ed2c435086f547af8d57cd620d8120e17976c0cc9a92a186882ab4eed355103a021e1dce01b61719da7ce1837a3fbd64866565ea830dd73f6894d871720d0114342a20ded58167cb673fb09c41b16a1eef86c17f32d243c46933bfbb5f30c1eb21e248d12e67436cfee0ae0ef0c2f8b2104d4341135f07d9bbcd36e8612ed8df46529020ac99acee88758b25ea9e00e1bc4903cf8c1a7dc3f1008208f776b0b88ce1d8b6a8dc6bb4af337b2add869328e63212fe50285571f4bdc71da5c7beffbf69ccd16af4388a9753dd2bbf4f0fd4301010001942e4a0195d59dbcd0d8cf16ea5e5693ae4906f7287c5016039244010000000032ffffffffffff0332ffffffffffff03811be275443ae9bb2298d36b99c356d904f60a824d6abf60aafa688c4b67d4c4c18f67887699e2105b7fe5cf54130b5b6324a6b943535db57456085b937a2c78f17464a7c0d3fe45b0c701138b84117f97d963bbf20919a486dded511df57c73c3349d49a3352212f75139fba38c64b64e0e041ec4c3d33e984c204086c1b7c81175b1405b3ccf4d52519ec4015ddfd6b382e0a8fc8e35340162f16d3d51e9df13b634cfaab97236818e5369d94ec6b39684333295e42bdb6f500ad28c1e96da57f996d28ed99a35adf2c06a21a483d88cc8a04a9845135513d5b9b35b09d107129e2aab8a067445c9a466982f327233b27b29c18002b8c80d6c176883b608b746cda4fcd601bc759557a86df531b171fd430101000194d77c03f14e1e9caa05257145da30e73a13219e5cf96c024bb514010000000032ffffffffffff0332ffffffffffff030978b3e89b21091f4c2ebd35f46fe1f22761b42fe99ca9fd5e620d4d2a9bb720d9e1dc3af786066a5a61775539fccbb8e4e27df693e24283f1aea580f181a511d07701b193ac57ae0468b0e18f53483a815b75fe49f7f011f9303657d103c220ce13fa1a0675fac634217e350fec17240b03183648e3bba46929eb5a6c0b3909119164fc1ff3957bd275a6f6e3296d72cf0e9ffb0d7d9336cdf01ec32241c8d9225f913a98abcb6609f7c98be4258c77015c50a92945bd297a585d58776008468904f9a6ac17d9002015763f6ede86df66b14aee6f48d91ace8bd4e75aef39dd0a7a5ec170ec198d91c2dab2a2ff49af2391a92cab1e06294aa81c3303fabc87ebdddefa545c6f7700264238a382cb3ffd43010100019d8b9a98fffd89b12bf14d9790f789b5db08c10f49b0e48b984da1010000000032ffffffffffff0332ffffffffffff03048e558f1875a385076ab44a51a7530a1dce73ad621546d78b0eca1a8f9ebecbd1ddd92680c7abc3fbebe30af84829e6db5f4b60ccde2e9e868fd33f3a058b30ddb548de032d79511789ea5da34e1b47968466d3aead2b33078e89bf449ce6fd2145b442ad8c25067d06c3258deb1e82fb6c677144a84bfd1dd12ac016255b5e0b3b825fccf68958ec53ad39e8990da221ebd746d388602ea397410e102748fddb184f4cc78a5a919fa65aa7a19e49d48f5378b60ee6c6deba5c2ddf76a6c7141b986ef66faf898fac9e49a6d060c72cd90e20eaa396c8134aa19e2b12092c040d83bcda7d8a109e43bb41dc157642dddbe137ac53f3f187ae2261233cfc8c348ab12c4773fc4930501efa6a31931576fd4301010001b172c4292942e4fe0d25e5989327278c54b913f0dc8a2f1bb46c97000000000032ffffffffffff0332ffffffffffff0307f6bfc4d1dd3147fafa18131daa541e1f7327b3df5ca6ee980512673aae19a88900c4f0a692e17f92da61de0b36ef633eecc794a53142175e231ec6a465a28f5707946add1b5c630f329de18737db9505376174d91ec3d6a67058ff2ce8f9a0d62c8665b77f5e1591d2b7381c3e11cc713163759983abf8bb6e8b65699520790688991864e9721cedcb9e65bfcc5d4cffafc021f2bfcd6d5998efbe16dcbb15970b4e7cfbd6ff7b27643796d958d55305d799ce7d4882d210653c11068486459fa1618155aae2ebb0cfe1a85482741485b5f4fc800aaa0508ea987c7d8f8be4087845f122074f7bf5e448ded10541d74672f62a94f3080a3d9acac33a1829cce74d20b383ef84a2d7e7a4e17c1d5ed4fd4301010001b8eabc0eadcba31104d6dd1ac04fa576244bca9e7ade1333f3f6af010000000032ffffffffffff0332ffffffffffff038648c4cac98ba77fb87b00338f60404608b6cd7687c08760e017c6d74d39f0ca087bcb5fd9516fa95ea97eea66f785e247966b4658b7ad8f46cc17256693520941daad9f543680980293704fe5aaa3f707be8e07219724c970849c9706a6dc5dd66a2ce2dd76eb0fb8bfadb379d590921f32c6d5fc666e9b35ec0bab57e6562703b3a72c1514c0ece7d46ae22653ccf1d417df9dd6084b791b18a4cf47ad024134bc0ed7abb53c32f44e8dabf650641915172ad97542783fe706019c7ef86945c49d545ed22a77759aa2ddb25101061e46b389f6d94d05625c2208cc66fca2611154da022f722238d64ace29f28c90bc6513e20bc68b6b17a6255629b7bfc42b3823b2c09bf3de5e1c6dfddf705a11b6fd4301010001bbff538bcb405356ad99214ed34a6910dc84b0f3b9e76534e60c92010000000032ffffffffffff0332ffffffffffff0385d881d79f148a9bb0f115c0369a4a1b8061d32feb90922b612bc47b22f0f94c481e4f451a69a49d571fdbdbc7b2447a989e8fe2de3acd89cbd09335b659bbbc7c7ca474e9ae1aa8609e2f60061402600d9023dc9e7b13e0ec17a6ab9737c5188d7b0cdb9921aa5a1eb3e0b572f5d2794401ab5dec0f2e1a099e37514ab844180e797201488afef0a656ab895f2df8a677252f2456470218c57ae68f281cedf659cd7ecd68260558d917faf8558c703f89447d31346d214c536f2f300e5ddc301e8a9917224023f3fbd8e7cc54191c7b115b10d43483b4f9502c673387854345073fb57f787bebbe97872afc39f0123daf3de25d5d5415421e62b85dde677efbc46d4f55e70be88d32d0f1862c936065fd4301010001bda7404b3ab7bdea825c17a78c02f0686aac5bba911a2ab63b0c0d000000000032ffffffffffff0332ffffffffffff03131a7ed7a5c61429b8c7c91fbb6ccbbb7bbe83545ece26543d81d4b4a9b1ae0c8041e2244ce0d796d0f007b6ad50df10306033ec0c75b0289a7625d6b39c085a6c3bbb848da476e3fed455dc5f02feb606a9c429d34fd4eecb08eb0d7b0d0d87a19cf6e5e01f8efc4f6d8e933fd7aefd3e6f3b40dc0f8a5ad644564d8794db911780bb91918371dcfabf131a0e5baa3bd37ace8d4dd104712666df3ee2828046cc8cfdd8d40539c7b88f8d2968ac2500850f64e1d6f567f30c4afd2ff1ae2815582199f74272934566628e0f8b2999a5abc4170989c2aefec3ca2a2d25664c1515475c2393750f61ed092d0c1094a2c79b6104adf22217498c18c946ed8edb598c414a552f314ab6442aa9750c7ba43dfd4301010001c1011fa24c766361ce1abbdc3a4a59d958a753b5a53068300d3779010000000031feffffffffff0331feffffffffff0312dac6930808c4b4482e97a39589445795b9f8feb19dbbeea245583937d9d454bf6711303ee6497aed4cae28e03e119bd95c88115b07c425413d09bc15a0836f800fc782179cc10e66d779da44f66fc7889db11ecb35cdd7b204088a9166ed2790b47fc0faaa996c933cbd28fd1f3b553f400f60c16e2c3ea70a9af7636100a210b23b2cebff38a3e18a63515259d18baee2ef342a61cd85e92979490d3cbb157f8bc771ddf31241aa8e860adf715411836160dcd20bb7dda3b3fdfd86ca2d3269fdcc78742683cd04b66a35f9490a7f6aa8e67338290e747ccd296b4795324f040959ef5d638aa05ad556ff0db3ab08c9007d369c33f044810b9ae2edb2a6d2a4b796a16fe64b38988a1154154bec59fd4301010001c7f8f497314960eea4cc4e23969c2d1c65a9a3bb01b055b862dcbb000000000032ffffffffffff0332ffffffffffff0311bffd32d48f8e102f65ffce09198598aa9bb538e33bdade16950e9ccec51d5938d17f2f54e6ac59ee48e10a43a2b6c1d9b32cc756335fa9a1673b82a59ed4a9795d515428c5abe15568db14d264c93c9161f7bbc3b669039af1e7a2b04ba1d321da5d452b4bd92efc1d480fa05ad3d8b6eda4f1e2000b8f2009351b2b8518c103c7c06d6a142f6f9349af537e672695ab90c873dfdfc25ee08f6bf51f5043e12e48826a580dd81219b4dd3bc1b04430158933343dd6c6799ca74c68212ab6c35105da28c4bde1690963d22b7e18ff7bfed9b0b17d073ca419131953c2c8fb390ca5bf7582d7c7f7a5bf40583863facebae66502b0b4e07c5a9619c6210f29379cbb1ee41b94fd784540ba91014f6115fd4301010001e6f55ee481086a12ced2d853450bdff03deade96083e86b1e4fc12010000000032ffffffffffff0332ffffffffffff030c3c3ab80d4178efe0cd926d44997220e4c9662dba9a8620d23c0accb84ebae0c60881c7c479e25f388cf6004c7a708f1a71299379013f6725c477a6fed290c53735051fc2720c6431fd8c0f1d1016b40c10b57f06035ea998b3f83ac2a5dc05dd79288ee91149a5969f5011b074386ea15fd3f761cf8fae0daefe6ae83662690544ccf27f6c2f6f87b9374afd9984d0ec571e7a72621e44e82552d58511be7de98d7da540b7f6f29039c1266e15e3c905ce790311caf24aa510f0f82589c7a6e58c5e9745436b05c27255ebcab10c553ec7b462615f1d6ecce9e6cb19ed259e1007cdaffd258c25a66913cbc82255cd68756cdc8008fd2fdefe10761db78564ea22b053db5bd53f82a65544cee26bc0fd4301010001ef94c44565cd77960f2ebd530cedc0720ba7db4c49a9f838bc4e57000000000032ffffffffffff0332ffffffffffff0310552c9faea64bb0b98b67713948eeac5ecb1e91cc5e0b2514dbbf1efd52cc918b5bc0225780fbd9a5c48616be934fef05a9db3cbfb7cd61195bd35158f0196c403bcd43a8e88c0b129bbe9a4bd3d13f1798ba301c20df5e12830387e769db07e60c373dfa89a3ebc2d9d6d56046e468eb55f5e358ce9451bb631e3d91bf80f01257ccebe5cc61a1f2d4d277a206f422b85a18a8732c99e1c8b5df2d302d31329d64020182a10c29d7b775cc495ac6420edefae1a10da2672b7bc3b27005945d87f2a45571964bac06686d5217830e6856902027c6bcc2abb7fb4a3d2006665f1851bb9450fed0439d447e6d634a1c68c8e3575042aa3094078bcdabf6392d8d4f4013476d6c948504a88dcd65ed41b0fd4301010001f95664d4013cc397954d5b544398dab5f13d3698ab233e8b27cf57010000000032ffffffffffff0332ffffffffffff0386f023d0b540426577c6bec144b617c6e191cbad64c3ce983e34d10e14e8974a1da72a997fb8c7a5956e4ac9bc2964ed61333eb2a3c4bb819a694377bd23acf7e983e821e1ba85927355f7c1a298d59e81a556da0dcfafa2d457a20afa47297d9136735399f9cc8632c43998e6d8455a16b3a88d4e71056b63e2f79e963bd7591630840a10905f90cfd80a46a147e9c0b43564b0a368ffb4da799e1f2eb1c4542c52406068785b79c8394a6c36140d8a9411d908f63089e80bc55065e456b8e532c4d56c92443c7b3f3a02f91d4642b5bdd743d797b7f6e228b2e3b98bc6941c0a336a448bad616892031227481824ef13e15ad6b3257b4db54fa9e7e55ab59feb3bc8e8890c01a031f14a6beed4b6c2fd4301010001fa6dd018a89e5f042afe109ecfa79899c42a6c45d0e0a96b6eddff000000000032ffffffffffff0332ffffffffffff030ea9131b806eaff1427088b9c788fcd96c23c0014915101d2286a87dccc23bc7ee779b24c6c4b7b4442a85aecdfd0ee47e72ee40ce4fa50f4da2c197ef1f37bd58acb74e543679c776b99bfd7317292f174b5c107b105c8df62e140fe32c504a791d49d83c46c2f0b9da6b5e6ee298b1d0f06c05dd8f393a65c8db24ce85cc1d13b9fcc2b6325c7128372d982ff83acfe04945f556866e4433680354de119ba46a995f3ad991375832a644c14a575c2a073410e9e61868aa6a252b4ac8913ef9f8e05a993a70ffae784e3bc5b2631b2ba6a6695aac95e0e548fdfc8ca948a34513161eeac903bfeb612808262bfed7a20cf4f808367110cefea699a5aff5ab5b78adaa76619773ce97ee95ea4fafd33b';
var mnListDiffJSON = SMNListFixture.getSecondDiff();
var mnListDiffJSON = {
"baseBlockHash": "0000000005b3f97e0af8c72f9a96eca720237e374ca860938ba0d7a68471c4d6",
"blockHash": "0000000004164fc164b3b9041bccefff599d0c88e1e9f0bf57895cfad3c1ba7a",
"cbTxMerkleTree": "0100000001720668fc7eb874724c9fb50479009b8747d64f7c36bccb8f7b3fe247f346d6ce0101",
"cbTx": "03000500010000000000000000000000000000000000000000000000000000000000000000ffffffff4b02bb520427f3355c08fabe6d6d01ac1912a0a88021110ad2364eade497dd1da0edd7857757c10f62dd720956ac0100000000000000100000175a0000000d2f6e6f64655374726174756d2f000000000200e12237010000001976a914cb594917ad4e5849688ec63f29a0f7f3badb5da688ac00e12237010000001976a914a3c5284d3cd896815ac815f2dd76a3a71cb3d8e688ac00000000260100bb5200009e8ecb69a1493e3d573cc9ce8460b9a0d7b05e77ca17878c9faf73959392cef3",
"deletedMNs": [
"14d924611e20307338c0937ad746226c0b50b01d47824c9ef08e141cc4635c9f"
],
"mnList": [
{
"proRegTxHash": "fef106ff6420f9c6638c9676988a8fc655750caafb506c98cb5ff3d4fea99a41",
"confirmedHash": "0000000005d5635228f113b50fb5ad66995a7476ed20374e6e159f1f9e62347b",
"service": "45.48.177.222:19999",
"pubKeyOperator": "842476e8d82327adfb9b617a7ac3f62868946c0c4b6b0e365747cfb8825b8b79ba0eb1fa62e8583ae7102f59bf70c7c7",
"votingAddress": "yf7QHemCfbmKEncwZxroTj8JtShXsC28V6",
"isValid": true
},
{
"proRegTxHash": "a4d877cee62f82868034fb678436d87afbb13330d2b66a24ae1d357f0de55c68",
"confirmedHash": "00000000069c41d7444a7da5d67f222224e9e37590c474f102ee1ae0da998f39",
"service": "83.80.229.213:19999",
"pubKeyOperator": "16415af54406658be9ea44d82b6b502bb90d93e32997484533a8a71a4ed98d12cea3709d84a5835b6ad8ed48d3101633",
"votingAddress": "yfKNLE5v4QTnMvj7y3JVoWEfQanD4qHWGk",
"isValid": false
},
{
"proRegTxHash": "a690051e69de6e36eeba664bff34e017f973d27ce91c1f2247120e8ce586b1f1",
"confirmedHash": "0000000019091441469a98f9a8889d94e54723286fe1cd13703aa6b652fc4863",
"service": "149.248.55.77:19999",
"pubKeyOperator": "8b165f653a3970a17f432f6c3abb8b681c71a3775f998fff322341d2994767c167c8a43b1b4661b9c01ef637763d4d81",
"votingAddress": "yTMbtGvG722zFbkpAnBrQvJ8WXH2g2kosL",
"isValid": false
},
{
"proRegTxHash": "6a46c1a01ee6ed517ff35ecb9cdffde3d1d0a5bb89e8c05e916a204134d7909f",
"confirmedHash": "00000000092935037c1cd00b67dbc09deb49f8853b101598a6b4ad1dbc177afa",
"service": "51.38.112.99:19999",
"pubKeyOperator": "88ee437bc0ba444b71a6b8a525146e9c748a8430fc85ad47beda04bb2e5b698bca9f3d5a5d5dfdd5990cd08daa07371f",
"votingAddress": "yZ9ZYmfby7fcLpJm9hPosEVmkY6eQ4PXA4",
"isValid": true
}
],
"merkleRootMNList": "f3ce92939573af9f8c8717ca775eb0d7a0b96084cec93c573d3e49a169cb8e9e"
};
describe('SimplifiedMNListDiff', function () {

@@ -60,0 +16,0 @@ describe('constructor', function () {

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc