1 | ;
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const client_common_1 = require("@neo-one/client-common");
|
5 | const node_core_1 = require("@neo-one/node-core");
|
6 | const utils_1 = require("@neo-one/utils");
|
7 | const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
|
8 | const lodash_1 = tslib_1.__importDefault(require("lodash"));
|
9 | const common_1 = require("./common");
|
10 | const context_1 = require("./context");
|
11 | const createMinerTransaction = async ({ node, feeAddress, transactions, nonce, }) => {
|
12 | const networkFee = await node_core_1.Block.calculateNetworkFee(node.blockchain.feeContext, transactions);
|
13 | const outputs = networkFee.isZero()
|
14 | ? []
|
15 | : [
|
16 | new node_core_1.Output({
|
17 | asset: node.blockchain.settings.utilityToken.hash,
|
18 | value: networkFee,
|
19 | address: feeAddress,
|
20 | }),
|
21 | ];
|
22 | return new node_core_1.MinerTransaction({
|
23 | nonce: nonce.mod(node_core_1.utils.UINT_MAX.addn(1)).toNumber(),
|
24 | outputs,
|
25 | });
|
26 | };
|
27 | const requestChangeView = ({ context: contextIn, node, privateKey, consensusContext, }) => {
|
28 | let context = contextIn;
|
29 | context = context.cloneExpectedView({
|
30 | expectedView: common_1.incrementExpectedView(context),
|
31 | });
|
32 | common_1.signAndRelayChangeView({ context, node, privateKey });
|
33 | const viewNumber = context.expectedView[context.myIndex];
|
34 | if (common_1.checkExpectedView({ context, viewNumber })) {
|
35 | return common_1.initializeConsensusInitial({
|
36 | blockchain: node.blockchain,
|
37 | context,
|
38 | viewNumber,
|
39 | consensusContext,
|
40 | });
|
41 | }
|
42 | const { secondsPerBlock } = node.blockchain.settings;
|
43 | return {
|
44 | context,
|
45 | timerSeconds: secondsPerBlock << (viewNumber + 1),
|
46 | };
|
47 | };
|
48 | exports.runConsensus = async ({ context, node, options: { privateKey, feeAddress, privateNet }, consensusContext, }) => {
|
49 | if (context.type === 'primary' && !(context instanceof context_1.RequestSentContext)) {
|
50 | let requestSentContext;
|
51 | if (context instanceof context_1.SignatureSentContext) {
|
52 | requestSentContext = context.cloneRequestSent();
|
53 | }
|
54 | else {
|
55 | const nonce = node_core_1.utils.randomUInt64();
|
56 | let mutableTransactions = Object.values(node.memPool);
|
57 | const minerTransaction = await createMinerTransaction({
|
58 | node,
|
59 | feeAddress,
|
60 | transactions: mutableTransactions,
|
61 | nonce,
|
62 | });
|
63 | if (mutableTransactions.length >= node.blockchain.settings.maxTransactionsPerBlock) {
|
64 | const mutableNetworkFees = await Promise.all(mutableTransactions.map(async (transaction) => {
|
65 | const networkFee = await transaction.getNetworkFee(node.blockchain.feeContext);
|
66 | return [transaction, new bignumber_js_1.default(networkFee.toString(10))];
|
67 | }));
|
68 | mutableNetworkFees.sort(([first, a], [second, b]) => b.div(second.size).comparedTo(a.div(first.size)));
|
69 | mutableTransactions = lodash_1.default.take(mutableNetworkFees, node.blockchain.settings.maxTransactionsPerBlock - 1)
|
70 | .map(([transaction, _unused]) => transaction);
|
71 | }
|
72 | mutableTransactions.unshift(minerTransaction);
|
73 | const [previousHeader, validators] = await Promise.all([
|
74 | node.blockchain.header.get({ hashOrIndex: context.previousHash }),
|
75 | node.blockchain.getValidators(mutableTransactions),
|
76 | ]);
|
77 | const newContext = new context_1.RequestSentContext({
|
78 | viewNumber: context.viewNumber,
|
79 | myIndex: context.myIndex,
|
80 | primaryIndex: context.primaryIndex,
|
81 | expectedView: context.expectedView,
|
82 | validators: context.validators,
|
83 | blockReceivedTimeSeconds: context.blockReceivedTimeSeconds,
|
84 | transactions: mutableTransactions.reduce((acc, transaction) => (Object.assign(Object.assign({}, acc), { [transaction.hashHex]: transaction })), {}),
|
85 | signatures: [],
|
86 | header: {
|
87 | type: 'new',
|
88 | previousHash: context.previousHash,
|
89 | transactionHashes: mutableTransactions.map((transaction) => transaction.hashHex),
|
90 | blockIndex: context.blockIndex,
|
91 | nonce,
|
92 | timestamp: Math.max(consensusContext.nowSeconds(), previousHeader.timestamp + 1),
|
93 | nextConsensus: client_common_1.crypto.getConsensusAddress(validators),
|
94 | },
|
95 | });
|
96 | const mutableSignatures = [];
|
97 | mutableSignatures[newContext.myIndex] = client_common_1.crypto.sign({
|
98 | message: newContext.header.message,
|
99 | privateKey,
|
100 | });
|
101 | requestSentContext = newContext.cloneSignatures({ signatures: mutableSignatures });
|
102 | }
|
103 | if (privateNet) {
|
104 | return common_1.checkSignatures({ node, context: requestSentContext });
|
105 | }
|
106 | common_1.signAndRelay({
|
107 | context: requestSentContext,
|
108 | node,
|
109 | privateKey,
|
110 | consensusMessage: new node_core_1.PrepareRequestConsensusMessage({
|
111 | viewNumber: requestSentContext.viewNumber,
|
112 | nonce: requestSentContext.header.consensusData,
|
113 | nextConsensus: requestSentContext.header.nextConsensus,
|
114 | transactionHashes: requestSentContext.transactionHashes.map((hash) => client_common_1.common.hexToUInt256(hash)),
|
115 | minerTransaction: utils_1.utils.nullthrows(requestSentContext.transactions[requestSentContext.transactionHashes[0]]),
|
116 | signature: utils_1.utils.nullthrows(requestSentContext.signatures[requestSentContext.myIndex]),
|
117 | }),
|
118 | });
|
119 | const { secondsPerBlock } = node.blockchain.settings;
|
120 | return {
|
121 | context: requestSentContext,
|
122 | timerSeconds: secondsPerBlock << (requestSentContext.viewNumber + 1),
|
123 | };
|
124 | }
|
125 | if (context instanceof context_1.RequestSentContext || context.type === 'backup') {
|
126 | return requestChangeView({
|
127 | context,
|
128 | node,
|
129 | privateKey,
|
130 | consensusContext,
|
131 | });
|
132 | }
|
133 | return { context };
|
134 | };
|
135 |
|
136 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQyxDQUFDLENBQUMsQ0FDckQ7Z0JBQ3JCLFNBQVMsRUFBRSxhQUFXLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3RixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBRXJELE9BQU87WUFDTCxPQUFPLEVBQUUsa0JBQWtCO1lBRTNCLFlBQVksRUFBRSxlQUFlLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ3JFLENBQUM7S0FDSDtJQUVELElBQUksT0FBTyxZQUFZLDRCQUFrQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ3RFLE9BQU8saUJBQWlCLENBQUM7WUFDdkIsT0FBTztZQUNQLElBQUk7WUFDSixVQUFVO1lBQ1YsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29uc2Vuc3VzL3NyYy9ydW5Db25zZW5zdXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb24sIGNyeXB0bywgUHJpdmF0ZUtleSwgVUludDE2MCB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHtcbiAgQmxvY2ssXG4gIE1pbmVyVHJhbnNhY3Rpb24sXG4gIE5vZGUsXG4gIE91dHB1dCxcbiAgUHJlcGFyZVJlcXVlc3RDb25zZW5zdXNNZXNzYWdlLFxuICBUcmFuc2FjdGlvbixcbiAgdXRpbHMsXG59IGZyb20gJ0BuZW8tb25lL25vZGUtY29yZSc7XG5pbXBvcnQgeyB1dGlscyBhcyBjb21tb25VdGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNoZWNrRXhwZWN0ZWRWaWV3LFxuICBjaGVja1NpZ25hdHVyZXMsXG4gIGluY3JlbWVudEV4cGVjdGVkVmlldyxcbiAgaW5pdGlhbGl6ZUNvbnNlbnN1c0luaXRpYWwsXG4gIHNpZ25BbmRSZWxheSxcbiAgc2lnbkFuZFJlbGF5Q2hhbmdlVmlldyxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSW50ZXJuYWxPcHRpb25zIH0gZnJvbSAnLi9Db25zZW5zdXMnO1xuaW1wb3J0IHsgQ29uc2Vuc3VzQ29udGV4dCB9IGZyb20gJy4vQ29uc2Vuc3VzQ29udGV4dCc7XG5pbXBvcnQgeyBDb250ZXh0LCBSZXF1ZXN0U2VudENvbnRleHQsIFNpZ25hdHVyZVNlbnRDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBjcmVhdGVNaW5lclRyYW5zYWN0aW9uID0gYXN5bmMgKHtcbiAgbm9kZSxcbiAgZmVlQWRkcmVzcyxcbiAgdHJhbnNhY3Rpb25zLFxuICBub25jZSxcbn06IHtcbiAgcmVhZG9ubHkgbm9kZTogTm9kZTtcbiAgcmVhZG9ubHkgZmVlQWRkcmVzczogVUludDE2MDtcbiAgcmVhZG9ubHkgdHJhbnNhY3Rpb25zOiByZWFkb25seSBUcmFuc2FjdGlvbltdO1xuICByZWFkb25seSBub25jZTogQk47XG59KSA9PiB7XG4gIGNvbnN0IG5ldHdvcmtGZWUgPSBhd2FpdCBCbG9jay5jYWxjdWxhdGVOZXR3b3JrRmVlKG5vZGUuYmxvY2tjaGFpbi5mZWVDb250ZXh0LCB0cmFuc2FjdGlvbnMpO1xuXG4gIGNvbnN0IG91dHB1dHMgPSBuZXR3b3JrRmVlLmlzWmVybygpXG4gICAgPyBbXVxuICAgIDogW1xuICAgICAgICBuZXcgT3V0cHV0KHtcbiAgICAgICAgICBhc3NldDogbm9kZS5ibG9ja2NoYWluLnNldHRpbmdzLnV0aWxpdHlUb2tlbi5oYXNoLFxuICAgICAgICAgIHZhbHVlOiBuZXR3b3JrRmVlLFxuICAgICAgICAgIGFkZHJlc3M6IGZlZUFkZHJlc3MsXG4gICAgICAgIH0pLFxuICAgICAgXTtcblxuICByZXR1cm4gbmV3IE1pbmVyVHJhbnNhY3Rpb24oe1xuICAgIG5vbmNlOiBub25jZS5tb2QodXRpbHMuVUlOVF9NQVguYWRkbigxKSkudG9OdW1iZXIoKSxcbiAgICBvdXRwdXRzLFxuICB9KTtcbn07XG5cbmNvbnN0IHJlcXVlc3RDaGFuZ2VWaWV3ID0gKHtcbiAgY29udGV4dDogY29udGV4dEluLFxuICBub2RlLFxuICBwcml2YXRlS2V5LFxuICBjb25zZW5zdXNDb250ZXh0LFxufToge1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuICByZWFkb25seSBwcml2YXRlS2V5OiBQcml2YXRlS2V5O1xuICByZWFkb25seSBjb25zZW5zdXNDb250ZXh0OiBDb25zZW5zdXNDb250ZXh0O1xufSk6IFJlc3VsdDxDb250ZXh0PiA9PiB7XG4gIGxldCBjb250ZXh0ID0gY29udGV4dEluO1xuXG4gIGNvbnRleHQgPSBjb250ZXh0LmNsb25lRXhwZWN0ZWRWaWV3KHtcbiAgICBleHBlY3RlZFZpZXc6IGluY3JlbWVudEV4cGVjdGVkVmlldyhjb250ZXh0KSxcbiAgfSk7XG5cbiAgc2lnbkFuZFJlbGF5Q2hhbmdlVmlldyh7IGNvbnRleHQsIG5vZGUsIHByaXZhdGVLZXkgfSk7XG5cbiAgY29uc3Qgdmlld051bWJlciA9IGNvbnRleHQuZXhwZWN0ZWRWaWV3W2NvbnRleHQubXlJbmRleF07XG4gIGlmIChjaGVja0V4cGVjdGVkVmlldyh7IGNvbnRleHQsIHZpZXdOdW1iZXIgfSkpIHtcbiAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbnNlbnN1c0luaXRpYWwoe1xuICAgICAgYmxvY2tjaGFpbjogbm9kZS5ibG9ja2NoYWluLFxuICAgICAgY29udGV4dCxcbiAgICAgIHZpZXdOdW1iZXIsXG4gICAgICBjb25zZW5zdXNDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBzZWNvbmRzUGVyQmxvY2sgfSA9IG5vZGUuYmxvY2tjaGFpbi5zZXR0aW5ncztcblxuICByZXR1cm4ge1xuICAgIGNvbnRleHQsXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICB0aW1lclNlY29uZHM6IHNlY29uZHNQZXJCbG9jayA8PCAodmlld051bWJlciArIDEpLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbnNlbnN1cyA9IGFzeW5jICh7XG4gIGNvbnRleHQsXG4gIG5vZGUsXG4gIG9wdGlvbnM6IHsgcHJpdmF0ZUtleSwgZmVlQWRkcmVzcywgcHJpdmF0ZU5ldCB9LFxuICBjb25zZW5zdXNDb250ZXh0LFxufToge1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuICByZWFkb25seSBvcHRpb25zOiBJbnRlcm5hbE9wdGlvbnM7XG4gIHJlYWRvbmx5IGNvbnNlbnN1c0NvbnRleHQ6IENvbnNlbnN1c0NvbnRleHQ7XG59KTogUHJvbWlzZTxSZXN1bHQ8Q29udGV4dD4+ID0+IHtcbiAgaWYgKGNvbnRleHQudHlwZSA9PT0gJ3ByaW1hcnknICYmICEoY29udGV4dCBpbnN0YW5jZW9mIFJlcXVlc3RTZW50Q29udGV4dCkpIHtcbiAgICBsZXQgcmVxdWVzdFNlbnRDb250ZXh0OiBSZXF1ZXN0U2VudENvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTaWduYXR1cmVTZW50Q29udGV4dCkge1xuICAgICAgcmVxdWVzdFNlbnRDb250ZXh0ID0gY29udGV4dC5jbG9uZVJlcXVlc3RTZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vbmNlID0gdXRpbHMucmFuZG9tVUludDY0KCk7XG4gICAgICBsZXQgbXV0YWJsZVRyYW5zYWN0aW9ucyA9IE9iamVjdC52YWx1ZXMobm9kZS5tZW1Qb29sKTtcbiAgICAgIGNvbnN0IG1pbmVyVHJhbnNhY3Rpb24gPSBhd2FpdCBjcmVhdGVNaW5lclRyYW5zYWN0aW9uKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZmVlQWRkcmVzcyxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBtdXRhYmxlVHJhbnNhY3Rpb25zLFxuICAgICAgICBub25jZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobXV0YWJsZVRyYW5zYWN0aW9ucy5sZW5ndGggPj0gbm9kZS5ibG9ja2NoYWluLnNldHRpbmdzLm1heFRyYW5zYWN0aW9uc1BlckJsb2NrKSB7XG4gICAgICAgIGNvbnN0IG11dGFibGVOZXR3b3JrRmVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG11dGFibGVUcmFuc2FjdGlvbnMubWFwPFByb21pc2U8W1RyYW5zYWN0aW9uLCBCaWdOdW1iZXJdPj4oYXN5bmMgKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrRmVlID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0TmV0d29ya0ZlZShub2RlLmJsb2NrY2hhaW4uZmVlQ29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBbdHJhbnNhY3Rpb24sIG5ldyBCaWdOdW1iZXIobmV0d29ya0ZlZS50b1N0cmluZygxMCkpXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBtdXRhYmxlTmV0d29ya0ZlZXMuc29ydCgoW2ZpcnN0LCBhXSwgW3NlY29uZCwgYl0pID0+IGIuZGl2KHNlY29uZC5zaXplKS5jb21wYXJlZFRvKGEuZGl2KGZpcnN0LnNpemUpKSk7XG4gICAgICAgIG11dGFibGVUcmFuc2FjdGlvbnMgPSBfLnRha2UobXV0YWJsZU5ldHdvcmtGZWVzLCBub2RlLmJsb2NrY2hhaW4uc2V0dGluZ3MubWF4VHJhbnNhY3Rpb25zUGVyQmxvY2sgLSAxKVxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICAgICAgICAubWFwKChbdHJhbnNhY3Rpb24sIF91bnVzZWRdKSA9PiB0cmFuc2FjdGlvbik7XG4gICAgICB9XG4gICAgICBtdXRhYmxlVHJhbnNhY3Rpb25zLnVuc2hpZnQobWluZXJUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCBbcHJldmlvdXNIZWFkZXIsIHZhbGlkYXRvcnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBub2RlLmJsb2NrY2hhaW4uaGVhZGVyLmdldCh7IGhhc2hPckluZGV4OiBjb250ZXh0LnByZXZpb3VzSGFzaCB9KSxcbiAgICAgICAgbm9kZS5ibG9ja2NoYWluLmdldFZhbGlkYXRvcnMobXV0YWJsZVRyYW5zYWN0aW9ucyksXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgbmV3Q29udGV4dCA9IG5ldyBSZXF1ZXN0U2VudENvbnRleHQoe1xuICAgICAgICB2aWV3TnVtYmVyOiBjb250ZXh0LnZpZXdOdW1iZXIsXG4gICAgICAgIG15SW5kZXg6IGNvbnRleHQubXlJbmRleCxcbiAgICAgICAgcHJpbWFyeUluZGV4OiBjb250ZXh0LnByaW1hcnlJbmRleCxcbiAgICAgICAgZXhwZWN0ZWRWaWV3OiBjb250ZXh0LmV4cGVjdGVkVmlldyxcbiAgICAgICAgdmFsaWRhdG9yczogY29udGV4dC52YWxpZGF0b3JzLFxuICAgICAgICBibG9ja1JlY2VpdmVkVGltZVNlY29uZHM6IGNvbnRleHQuYmxvY2tSZWNlaXZlZFRpbWVTZWNvbmRzLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IG11dGFibGVUcmFuc2FjdGlvbnMucmVkdWNlPHsgW2tleTogc3RyaW5nXTogVHJhbnNhY3Rpb24gfT4oXG4gICAgICAgICAgKGFjYywgdHJhbnNhY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICBbdHJhbnNhY3Rpb24uaGFzaEhleF06IHRyYW5zYWN0aW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgICAgICBzaWduYXR1cmVzOiBbXSxcbiAgICAgICAgaGVhZGVyOiB7XG4gICAgICAgICAgdHlwZTogJ25ldycsXG4gICAgICAgICAgcHJldmlvdXNIYXNoOiBjb250ZXh0LnByZXZpb3VzSGFzaCxcbiAgICAgICAgICB0cmFuc2FjdGlvbkhhc2hlczogbXV0YWJsZVRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiB0cmFuc2FjdGlvbi5oYXNoSGV4KSxcblxuICAgICAgICAgIGJsb2NrSW5kZXg6IGNvbnRleHQuYmxvY2tJbmRleCxcbiAgICAgICAgICBub25jZSxcbiAgICAgICAgICB0aW1lc3RhbXA6IE1hdGgubWF4KGNvbnNlbnN1c0NvbnRleHQubm93U2Vjb25kcygpLCBwcmV2aW91c0hlYWRlci50aW1lc3RhbXAgKyAxKSxcblxuICAgICAgICAgIG5leHRDb25zZW5zdXM6IGNyeXB0by5nZXRDb25zZW5zdXNBZGRyZXNzKHZhbGlkYXRvcnMpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG11dGFibGVTaWduYXR1cmVzID0gW107XG4gICAgICBtdXRhYmxlU2lnbmF0dXJlc1tuZXdDb250ZXh0Lm15SW5kZXhdID0gY3J5cHRvLnNpZ24oe1xuICAgICAgICBtZXNzYWdlOiBuZXdDb250ZXh0LmhlYWRlci5tZXNzYWdlLFxuICAgICAgICBwcml2YXRlS2V5LFxuICAgICAgfSk7XG5cbiAgICAgIHJlcXVlc3RTZW50Q29udGV4dCA9IG5ld0NvbnRleHQuY2xvbmVTaWduYXR1cmVzKHsgc2lnbmF0dXJlczogbXV0YWJsZVNpZ25hdHVyZXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByaXZhdGVOZXQpIHtcbiAgICAgIHJldHVybiBjaGVja1NpZ25hdHVyZXMoeyBub2RlLCBjb250ZXh0OiByZXF1ZXN0U2VudENvbnRleHQgfSk7XG4gICAgfVxuXG4gICAgc2lnbkFuZFJlbGF5KHtcbiAgICAgIGNvbnRleHQ6IHJlcXVlc3RTZW50Q29udGV4dCxcbiAgICAgIG5vZGUsXG4gICAgICBwcml2YXRlS2V5LFxuICAgICAgY29uc2Vuc3VzTWVzc2FnZTogbmV3IFByZXBhcmVSZXF1ZXN0Q29uc2Vuc3VzTWVzc2FnZSh7XG4gICAgICAgIHZpZXdOdW1iZXI6IHJlcXVlc3RTZW50Q29udGV4dC52aWV3TnVtYmVyLFxuICAgICAgICBub25jZTogcmVxdWVzdFNlbnRDb250ZXh0LmhlYWRlci5jb25zZW5zdXNEYXRhLFxuICAgICAgICBuZXh0Q29uc2Vuc3VzOiByZXF1ZXN0U2VudENvbnRleHQuaGVhZGVyLm5leHRDb25zZW5zdXMsXG4gICAgICAgIHRyYW5zYWN0aW9uSGFzaGVzOiByZXF1ZXN0U2VudENvbnRleHQudHJhbnNhY3Rpb25IYXNoZXMubWFwKChoYXNoKSA9PiBjb21tb24uaGV4VG9VSW50MjU2KGhhc2gpKSxcbiAgICAgICAgbWluZXJUcmFuc2FjdGlvbjogY29tbW9uVXRpbHMubnVsbHRocm93cyhcbiAgICAgICAgICByZXF1ZXN0U2VudENvbnRleHQudHJhbnNhY3Rpb25zW3JlcXVlc3RTZW50Q29udGV4dC50cmFuc2FjdGlvbkhhc2hlc1swXV0sXG4gICAgICAgICkgYXMgTWluZXJUcmFuc2FjdGlvbixcbiAgICAgICAgc2lnbmF0dXJlOiBjb21tb25VdGlscy5udWxsdGhyb3dzKHJlcXVlc3RTZW50Q29udGV4dC5zaWduYXR1cmVzW3JlcXVlc3RTZW50Q29udGV4dC5teUluZGV4XSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgc2Vjb25kc1BlckJsb2NrIH0gPSBub2RlLmJsb2NrY2hhaW4uc2V0dGluZ3M7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dDogcmVxdWVzdFNlbnRDb250ZXh0LFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIHRpbWVyU2Vjb25kczogc2Vjb25kc1BlckJsb2NrIDw8IChyZXF1ZXN0U2VudENvbnRleHQudmlld051bWJlciArIDEpLFxuICAgIH07XG4gIH1cblxuICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFJlcXVlc3RTZW50Q29udGV4dCB8fCBjb250ZXh0LnR5cGUgPT09ICdiYWNrdXAnKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RDaGFuZ2VWaWV3KHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBub2RlLFxuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIGNvbnNlbnN1c0NvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0IH07XG59O1xuIl19
|