UNPKG

22.5 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const tslib_1 = require("tslib");
4const client_common_1 = require("@neo-one/client-common");
5const node_core_1 = require("@neo-one/node-core");
6const utils_1 = require("@neo-one/utils");
7const bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js"));
8const lodash_1 = tslib_1.__importDefault(require("lodash"));
9const common_1 = require("./common");
10const context_1 = require("./context");
11const 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};
27const 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};
48exports.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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInJ1bkNvbnNlbnN1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwwREFBNkU7QUFDN0Usa0RBUTRCO0FBQzVCLDBDQUFzRDtBQUN0RCx3RUFBcUM7QUFFckMsNERBQXVCO0FBQ3ZCLHFDQU9rQjtBQUdsQix1Q0FBOEU7QUFHOUUsTUFBTSxzQkFBc0IsR0FBRyxLQUFLLEVBQUUsRUFDcEMsSUFBSSxFQUNKLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxHQU1OLEVBQUUsRUFBRTtJQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0saUJBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUU3RixNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ2pDLENBQUMsQ0FBQyxFQUFFO1FBQ0osQ0FBQyxDQUFDO1lBQ0UsSUFBSSxrQkFBTSxDQUFDO2dCQUNULEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDakQsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLE9BQU8sRUFBRSxVQUFVO2FBQ3BCLENBQUM7U0FDSCxDQUFDO0lBRU4sT0FBTyxJQUFJLDRCQUFnQixDQUFDO1FBQzFCLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLGlCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtRQUNuRCxPQUFPO0tBQ1IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEVBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQ2xCLElBQUksRUFDSixVQUFVLEVBQ1YsZ0JBQWdCLEdBTWpCLEVBQW1CLEVBQUU7SUFDcEIsSUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBRXhCLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDbEMsWUFBWSxFQUFFLDhCQUFxQixDQUFDLE9BQU8sQ0FBQztLQUM3QyxDQUFDLENBQUM7SUFFSCwrQkFBc0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUV0RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6RCxJQUFJLDBCQUFpQixDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUU7UUFDOUMsT0FBTyxtQ0FBMEIsQ0FBQztZQUNoQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsT0FBTztZQUNQLFVBQVU7WUFDVixnQkFBZ0I7U0FDakIsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFFckQsT0FBTztRQUNMLE9BQU87UUFFUCxZQUFZLEVBQUUsZUFBZSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUNsRCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRVcsUUFBQSxZQUFZLEdBQUcsS0FBSyxFQUFFLEVBQ2pDLE9BQU8sRUFDUCxJQUFJLEVBQ0osT0FBTyxFQUFFLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFDL0MsZ0JBQWdCLEdBTWpCLEVBQTRCLEVBQUU7SUFDN0IsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLDRCQUFrQixDQUFDLEVBQUU7UUFDMUUsSUFBSSxrQkFBc0MsQ0FBQztRQUMzQyxJQUFJLE9BQU8sWUFBWSw4QkFBb0IsRUFBRTtZQUMzQyxrQkFBa0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztTQUNqRDthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsaUJBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNuQyxJQUFJLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxzQkFBc0IsQ0FBQztnQkFDcEQsSUFBSTtnQkFDSixVQUFVO2dCQUNWLFlBQVksRUFBRSxtQkFBbUI7Z0JBQ2pDLEtBQUs7YUFDTixDQUFDLENBQUM7WUFFSCxJQUFJLG1CQUFtQixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtnQkFDbEYsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBb0MsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFO29CQUMvRSxNQUFNLFVBQVUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFFL0UsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLHNCQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELENBQUMsQ0FBQyxDQUNILENBQUM7Z0JBRUYsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZHLG1CQUFtQixHQUFHLGdCQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLHVCQUF1QixHQUFHLENBQUMsQ0FBQztxQkFFbkcsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsbUJBQW1CLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7Z0JBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDO2FBQ25ELENBQUMsQ0FBQztZQUVILE1BQU0sVUFBVSxHQUFHLElBQUksNEJBQWtCLENBQUM7Z0JBQ3hDLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUN4QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7Z0JBQ2xDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO2dCQUM5Qix3QkFBd0IsRUFBRSxPQUFPLENBQUMsd0JBQXdCO2dCQUMxRCxZQUFZLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxDQUN0QyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsRUFBRSxDQUFDLGlDQUNqQixHQUFHLEtBQ04sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxJQUNsQyxFQUNGLEVBQUUsQ0FDSDtnQkFDRCxVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLEtBQUs7b0JBQ1gsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7b0JBRWhGLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsS0FBSztvQkFDTCxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsRUFBRSxjQUFjLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFFaEYsYUFBYSxFQUFFLHNCQUFNLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDO2lCQUN0RDthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzdCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxzQkFBTSxDQUFDLElBQUksQ0FBQztnQkFDbEQsT0FBTyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTztnQkFDbEMsVUFBVTthQUNYLENBQUMsQ0FBQztZQUVILGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1NBQ3BGO1FBRUQsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLHdCQUFlLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztTQUMvRDtRQUVELHFCQUFZLENBQUM7WUFDWCxPQUFPLEVBQUUsa0JBQWtCO1lBQzNCLElBQUk7WUFDSixVQUFVO1lBQ1YsZ0JBQWdCLEVBQUUsSUFBSSwwQ0FBOEIsQ0FBQztnQkFDbkQsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFVBQVU7Z0JBQ3pDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDOUMsYUFBYSxFQUFFLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhO2dCQUN0RCxpQkFBaUIsRUFBRSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLHNCQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNoRyxnQkFBZ0IsRUFBRSxhQUFXLENBQUMsVUFBVSxDQUN0QyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckQ7Z0JBQ3JCLFNBQVMsRUFBRSxhQUFXLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3RixDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBRXJELE9BQU87WUFDTCxPQUFPLEVBQUUsa0JBQWtCO1lBRTNCLFlBQVksRUFBRSxlQUFlLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ3JFLENBQUM7S0FDSDtJQUVELElBQUksT0FBTyxZQUFZLDRCQUFrQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ3RFLE9BQU8saUJBQWlCLENBQUM7WUFDdkIsT0FBTztZQUNQLElBQUk7WUFDSixVQUFVO1lBQ1YsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29uc2Vuc3VzL3NyYy9ydW5Db25zZW5zdXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb21tb24sIGNyeXB0bywgUHJpdmF0ZUtleSwgVUludDE2MCB9IGZyb20gJ0BuZW8tb25lL2NsaWVudC1jb21tb24nO1xuaW1wb3J0IHtcbiAgQmxvY2ssXG4gIE1pbmVyVHJhbnNhY3Rpb24sXG4gIE5vZGUsXG4gIE91dHB1dCxcbiAgUHJlcGFyZVJlcXVlc3RDb25zZW5zdXNNZXNzYWdlLFxuICBUcmFuc2FjdGlvbixcbiAgdXRpbHMsXG59IGZyb20gJ0BuZW8tb25lL25vZGUtY29yZSc7XG5pbXBvcnQgeyB1dGlscyBhcyBjb21tb25VdGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIGNoZWNrRXhwZWN0ZWRWaWV3LFxuICBjaGVja1NpZ25hdHVyZXMsXG4gIGluY3JlbWVudEV4cGVjdGVkVmlldyxcbiAgaW5pdGlhbGl6ZUNvbnNlbnN1c0luaXRpYWwsXG4gIHNpZ25BbmRSZWxheSxcbiAgc2lnbkFuZFJlbGF5Q2hhbmdlVmlldyxcbn0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSW50ZXJuYWxPcHRpb25zIH0gZnJvbSAnLi9Db25zZW5zdXMnO1xuaW1wb3J0IHsgQ29uc2Vuc3VzQ29udGV4dCB9IGZyb20gJy4vQ29uc2Vuc3VzQ29udGV4dCc7XG5pbXBvcnQgeyBDb250ZXh0LCBSZXF1ZXN0U2VudENvbnRleHQsIFNpZ25hdHVyZVNlbnRDb250ZXh0IH0gZnJvbSAnLi9jb250ZXh0JztcbmltcG9ydCB7IFJlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBjcmVhdGVNaW5lclRyYW5zYWN0aW9uID0gYXN5bmMgKHtcbiAgbm9kZSxcbiAgZmVlQWRkcmVzcyxcbiAgdHJhbnNhY3Rpb25zLFxuICBub25jZSxcbn06IHtcbiAgcmVhZG9ubHkgbm9kZTogTm9kZTtcbiAgcmVhZG9ubHkgZmVlQWRkcmVzczogVUludDE2MDtcbiAgcmVhZG9ubHkgdHJhbnNhY3Rpb25zOiByZWFkb25seSBUcmFuc2FjdGlvbltdO1xuICByZWFkb25seSBub25jZTogQk47XG59KSA9PiB7XG4gIGNvbnN0IG5ldHdvcmtGZWUgPSBhd2FpdCBCbG9jay5jYWxjdWxhdGVOZXR3b3JrRmVlKG5vZGUuYmxvY2tjaGFpbi5mZWVDb250ZXh0LCB0cmFuc2FjdGlvbnMpO1xuXG4gIGNvbnN0IG91dHB1dHMgPSBuZXR3b3JrRmVlLmlzWmVybygpXG4gICAgPyBbXVxuICAgIDogW1xuICAgICAgICBuZXcgT3V0cHV0KHtcbiAgICAgICAgICBhc3NldDogbm9kZS5ibG9ja2NoYWluLnNldHRpbmdzLnV0aWxpdHlUb2tlbi5oYXNoLFxuICAgICAgICAgIHZhbHVlOiBuZXR3b3JrRmVlLFxuICAgICAgICAgIGFkZHJlc3M6IGZlZUFkZHJlc3MsXG4gICAgICAgIH0pLFxuICAgICAgXTtcblxuICByZXR1cm4gbmV3IE1pbmVyVHJhbnNhY3Rpb24oe1xuICAgIG5vbmNlOiBub25jZS5tb2QodXRpbHMuVUlOVF9NQVguYWRkbigxKSkudG9OdW1iZXIoKSxcbiAgICBvdXRwdXRzLFxuICB9KTtcbn07XG5cbmNvbnN0IHJlcXVlc3RDaGFuZ2VWaWV3ID0gKHtcbiAgY29udGV4dDogY29udGV4dEluLFxuICBub2RlLFxuICBwcml2YXRlS2V5LFxuICBjb25zZW5zdXNDb250ZXh0LFxufToge1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuICByZWFkb25seSBwcml2YXRlS2V5OiBQcml2YXRlS2V5O1xuICByZWFkb25seSBjb25zZW5zdXNDb250ZXh0OiBDb25zZW5zdXNDb250ZXh0O1xufSk6IFJlc3VsdDxDb250ZXh0PiA9PiB7XG4gIGxldCBjb250ZXh0ID0gY29udGV4dEluO1xuXG4gIGNvbnRleHQgPSBjb250ZXh0LmNsb25lRXhwZWN0ZWRWaWV3KHtcbiAgICBleHBlY3RlZFZpZXc6IGluY3JlbWVudEV4cGVjdGVkVmlldyhjb250ZXh0KSxcbiAgfSk7XG5cbiAgc2lnbkFuZFJlbGF5Q2hhbmdlVmlldyh7IGNvbnRleHQsIG5vZGUsIHByaXZhdGVLZXkgfSk7XG5cbiAgY29uc3Qgdmlld051bWJlciA9IGNvbnRleHQuZXhwZWN0ZWRWaWV3W2NvbnRleHQubXlJbmRleF07XG4gIGlmIChjaGVja0V4cGVjdGVkVmlldyh7IGNvbnRleHQsIHZpZXdOdW1iZXIgfSkpIHtcbiAgICByZXR1cm4gaW5pdGlhbGl6ZUNvbnNlbnN1c0luaXRpYWwoe1xuICAgICAgYmxvY2tjaGFpbjogbm9kZS5ibG9ja2NoYWluLFxuICAgICAgY29udGV4dCxcbiAgICAgIHZpZXdOdW1iZXIsXG4gICAgICBjb25zZW5zdXNDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgeyBzZWNvbmRzUGVyQmxvY2sgfSA9IG5vZGUuYmxvY2tjaGFpbi5zZXR0aW5ncztcblxuICByZXR1cm4ge1xuICAgIGNvbnRleHQsXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICB0aW1lclNlY29uZHM6IHNlY29uZHNQZXJCbG9jayA8PCAodmlld051bWJlciArIDEpLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJ1bkNvbnNlbnN1cyA9IGFzeW5jICh7XG4gIGNvbnRleHQsXG4gIG5vZGUsXG4gIG9wdGlvbnM6IHsgcHJpdmF0ZUtleSwgZmVlQWRkcmVzcywgcHJpdmF0ZU5ldCB9LFxuICBjb25zZW5zdXNDb250ZXh0LFxufToge1xuICByZWFkb25seSBjb250ZXh0OiBDb250ZXh0O1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuICByZWFkb25seSBvcHRpb25zOiBJbnRlcm5hbE9wdGlvbnM7XG4gIHJlYWRvbmx5IGNvbnNlbnN1c0NvbnRleHQ6IENvbnNlbnN1c0NvbnRleHQ7XG59KTogUHJvbWlzZTxSZXN1bHQ8Q29udGV4dD4+ID0+IHtcbiAgaWYgKGNvbnRleHQudHlwZSA9PT0gJ3ByaW1hcnknICYmICEoY29udGV4dCBpbnN0YW5jZW9mIFJlcXVlc3RTZW50Q29udGV4dCkpIHtcbiAgICBsZXQgcmVxdWVzdFNlbnRDb250ZXh0OiBSZXF1ZXN0U2VudENvbnRleHQ7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBTaWduYXR1cmVTZW50Q29udGV4dCkge1xuICAgICAgcmVxdWVzdFNlbnRDb250ZXh0ID0gY29udGV4dC5jbG9uZVJlcXVlc3RTZW50KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vbmNlID0gdXRpbHMucmFuZG9tVUludDY0KCk7XG4gICAgICBsZXQgbXV0YWJsZVRyYW5zYWN0aW9ucyA9IE9iamVjdC52YWx1ZXMobm9kZS5tZW1Qb29sKTtcbiAgICAgIGNvbnN0IG1pbmVyVHJhbnNhY3Rpb24gPSBhd2FpdCBjcmVhdGVNaW5lclRyYW5zYWN0aW9uKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgZmVlQWRkcmVzcyxcbiAgICAgICAgdHJhbnNhY3Rpb25zOiBtdXRhYmxlVHJhbnNhY3Rpb25zLFxuICAgICAgICBub25jZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobXV0YWJsZVRyYW5zYWN0aW9ucy5sZW5ndGggPj0gbm9kZS5ibG9ja2NoYWluLnNldHRpbmdzLm1heFRyYW5zYWN0aW9uc1BlckJsb2NrKSB7XG4gICAgICAgIGNvbnN0IG11dGFibGVOZXR3b3JrRmVlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIG11dGFibGVUcmFuc2FjdGlvbnMubWFwPFByb21pc2U8W1RyYW5zYWN0aW9uLCBCaWdOdW1iZXJdPj4oYXN5bmMgKHRyYW5zYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrRmVlID0gYXdhaXQgdHJhbnNhY3Rpb24uZ2V0TmV0d29ya0ZlZShub2RlLmJsb2NrY2hhaW4uZmVlQ29udGV4dCk7XG5cbiAgICAgICAgICAgIHJldHVybiBbdHJhbnNhY3Rpb24sIG5ldyBCaWdOdW1iZXIobmV0d29ya0ZlZS50b1N0cmluZygxMCkpXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBtdXRhYmxlTmV0d29ya0ZlZXMuc29ydCgoW2ZpcnN0LCBhXSwgW3NlY29uZCwgYl0pID0+IGIuZGl2KHNlY29uZC5zaXplKS5jb21wYXJlZFRvKGEuZGl2KGZpcnN0LnNpemUpKSk7XG4gICAgICAgIG11dGFibGVUcmFuc2FjdGlvbnMgPSBfLnRha2UobXV0YWJsZU5ldHdvcmtGZWVzLCBub2RlLmJsb2NrY2hhaW4uc2V0dGluZ3MubWF4VHJhbnNhY3Rpb25zUGVyQmxvY2sgLSAxKVxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWRcbiAgICAgICAgICAubWFwKChbdHJhbnNhY3Rpb24sIF91bnVzZWRdKSA9PiB0cmFuc2FjdGlvbik7XG4gICAgICB9XG4gICAgICBtdXRhYmxlVHJhbnNhY3Rpb25zLnVuc2hpZnQobWluZXJUcmFuc2FjdGlvbik7XG4gICAgICBjb25zdCBbcHJldmlvdXNIZWFkZXIsIHZhbGlkYXRvcnNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBub2RlLmJsb2NrY2hhaW4uaGVhZGVyLmdldCh7IGhhc2hPckluZGV4OiBjb250ZXh0LnByZXZpb3VzSGFzaCB9KSxcbiAgICAgICAgbm9kZS5ibG9ja2NoYWluLmdldFZhbGlkYXRvcnMobXV0YWJsZVRyYW5zYWN0aW9ucyksXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgbmV3Q29udGV4dCA9IG5ldyBSZXF1ZXN0U2VudENvbnRleHQoe1xuICAgICAgICB2aWV3TnVtYmVyOiBjb250ZXh0LnZpZXdOdW1iZXIsXG4gICAgICAgIG15SW5kZXg6IGNvbnRleHQubXlJbmRleCxcbiAgICAgICAgcHJpbWFyeUluZGV4OiBjb250ZXh0LnByaW1hcnlJbmRleCxcbiAgICAgICAgZXhwZWN0ZWRWaWV3OiBjb250ZXh0LmV4cGVjdGVkVmlldyxcbiAgICAgICAgdmFsaWRhdG9yczogY29udGV4dC52YWxpZGF0b3JzLFxuICAgICAgICBibG9ja1JlY2VpdmVkVGltZVNlY29uZHM6IGNvbnRleHQuYmxvY2tSZWNlaXZlZFRpbWVTZWNvbmRzLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IG11dGFibGVUcmFuc2FjdGlvbnMucmVkdWNlPHsgW2tleTogc3RyaW5nXTogVHJhbnNhY3Rpb24gfT4oXG4gICAgICAgICAgKGFjYywgdHJhbnNhY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICBbdHJhbnNhY3Rpb24uaGFzaEhleF06IHRyYW5zYWN0aW9uLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgICAgICBzaWduYXR1cmVzOiBbXSxcbiAgICAgICAgaGVhZGVyOiB7XG4gICAgICAgICAgdHlwZTogJ25ldycsXG4gICAgICAgICAgcHJldmlvdXNIYXNoOiBjb250ZXh0LnByZXZpb3VzSGFzaCxcbiAgICAgICAgICB0cmFuc2FjdGlvbkhhc2hlczogbXV0YWJsZVRyYW5zYWN0aW9ucy5tYXAoKHRyYW5zYWN0aW9uKSA9PiB0cmFuc2FjdGlvbi5oYXNoSGV4KSxcblxuICAgICAgICAgIGJsb2NrSW5kZXg6IGNvbnRleHQuYmxvY2tJbmRleCxcbiAgICAgICAgICBub25jZSxcbiAgICAgICAgICB0aW1lc3RhbXA6IE1hdGgubWF4KGNvbnNlbnN1c0NvbnRleHQubm93U2Vjb25kcygpLCBwcmV2aW91c0hlYWRlci50aW1lc3RhbXAgKyAxKSxcblxuICAgICAgICAgIG5leHRDb25zZW5zdXM6IGNyeXB0by5nZXRDb25zZW5zdXNBZGRyZXNzKHZhbGlkYXRvcnMpLFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG11dGFibGVTaWduYXR1cmVzID0gW107XG4gICAgICBtdXRhYmxlU2lnbmF0dXJlc1tuZXdDb250ZXh0Lm15SW5kZXhdID0gY3J5cHRvLnNpZ24oe1xuICAgICAgICBtZXNzYWdlOiBuZXdDb250ZXh0LmhlYWRlci5tZXNzYWdlLFxuICAgICAgICBwcml2YXRlS2V5LFxuICAgICAgfSk7XG5cbiAgICAgIHJlcXVlc3RTZW50Q29udGV4dCA9IG5ld0NvbnRleHQuY2xvbmVTaWduYXR1cmVzKHsgc2lnbmF0dXJlczogbXV0YWJsZVNpZ25hdHVyZXMgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByaXZhdGVOZXQpIHtcbiAgICAgIHJldHVybiBjaGVja1NpZ25hdHVyZXMoeyBub2RlLCBjb250ZXh0OiByZXF1ZXN0U2VudENvbnRleHQgfSk7XG4gICAgfVxuXG4gICAgc2lnbkFuZFJlbGF5KHtcbiAgICAgIGNvbnRleHQ6IHJlcXVlc3RTZW50Q29udGV4dCxcbiAgICAgIG5vZGUsXG4gICAgICBwcml2YXRlS2V5LFxuICAgICAgY29uc2Vuc3VzTWVzc2FnZTogbmV3IFByZXBhcmVSZXF1ZXN0Q29uc2Vuc3VzTWVzc2FnZSh7XG4gICAgICAgIHZpZXdOdW1iZXI6IHJlcXVlc3RTZW50Q29udGV4dC52aWV3TnVtYmVyLFxuICAgICAgICBub25jZTogcmVxdWVzdFNlbnRDb250ZXh0LmhlYWRlci5jb25zZW5zdXNEYXRhLFxuICAgICAgICBuZXh0Q29uc2Vuc3VzOiByZXF1ZXN0U2VudENvbnRleHQuaGVhZGVyLm5leHRDb25zZW5zdXMsXG4gICAgICAgIHRyYW5zYWN0aW9uSGFzaGVzOiByZXF1ZXN0U2VudENvbnRleHQudHJhbnNhY3Rpb25IYXNoZXMubWFwKChoYXNoKSA9PiBjb21tb24uaGV4VG9VSW50MjU2KGhhc2gpKSxcbiAgICAgICAgbWluZXJUcmFuc2FjdGlvbjogY29tbW9uVXRpbHMubnVsbHRocm93cyhcbiAgICAgICAgICByZXF1ZXN0U2VudENvbnRleHQudHJhbnNhY3Rpb25zW3JlcXVlc3RTZW50Q29udGV4dC50cmFuc2FjdGlvbkhhc2hlc1swXV0sXG4gICAgICAgICkgYXMgTWluZXJUcmFuc2FjdGlvbixcbiAgICAgICAgc2lnbmF0dXJlOiBjb21tb25VdGlscy5udWxsdGhyb3dzKHJlcXVlc3RTZW50Q29udGV4dC5zaWduYXR1cmVzW3JlcXVlc3RTZW50Q29udGV4dC5teUluZGV4XSksXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgc2Vjb25kc1BlckJsb2NrIH0gPSBub2RlLmJsb2NrY2hhaW4uc2V0dGluZ3M7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dDogcmVxdWVzdFNlbnRDb250ZXh0LFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgIHRpbWVyU2Vjb25kczogc2Vjb25kc1BlckJsb2NrIDw8IChyZXF1ZXN0U2VudENvbnRleHQudmlld051bWJlciArIDEpLFxuICAgIH07XG4gIH1cblxuICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFJlcXVlc3RTZW50Q29udGV4dCB8fCBjb250ZXh0LnR5cGUgPT09ICdiYWNrdXAnKSB7XG4gICAgcmV0dXJuIHJlcXVlc3RDaGFuZ2VWaWV3KHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBub2RlLFxuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIGNvbnNlbnN1c0NvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4geyBjb250ZXh0IH07XG59O1xuIl19