@bitgo-beta/sdk-coin-hbar 1.0.2-beta.2 → 1.0.2-beta.2000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/src/hbar.d.ts +83 -12
  2. package/dist/src/hbar.d.ts.map +1 -1
  3. package/dist/src/hbar.js +393 -26
  4. package/dist/src/hbarToken.d.ts +4 -1
  5. package/dist/src/hbarToken.d.ts.map +1 -1
  6. package/dist/src/hbarToken.js +12 -3
  7. package/dist/src/index.d.ts +1 -0
  8. package/dist/src/index.d.ts.map +1 -1
  9. package/dist/src/index.js +7 -2
  10. package/dist/src/lib/accountUpdateBuilder.d.ts +41 -0
  11. package/dist/src/lib/accountUpdateBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/accountUpdateBuilder.js +100 -0
  13. package/dist/src/lib/coinTransferBuilder.d.ts +1 -1
  14. package/dist/src/lib/coinTransferBuilder.d.ts.map +1 -1
  15. package/dist/src/lib/coinTransferBuilder.js +12 -28
  16. package/dist/src/lib/constants.d.ts +2 -1
  17. package/dist/src/lib/constants.d.ts.map +1 -1
  18. package/dist/src/lib/constants.js +3 -2
  19. package/dist/src/lib/iface.d.ts +9 -1
  20. package/dist/src/lib/iface.d.ts.map +1 -1
  21. package/dist/src/lib/iface.js +1 -1
  22. package/dist/src/lib/index.d.ts +2 -0
  23. package/dist/src/lib/index.d.ts.map +1 -1
  24. package/dist/src/lib/index.js +26 -10
  25. package/dist/src/lib/keyPair.d.ts +1 -0
  26. package/dist/src/lib/keyPair.d.ts.map +1 -1
  27. package/dist/src/lib/keyPair.js +7 -7
  28. package/dist/src/lib/tokenAssociateBuilder.js +9 -28
  29. package/dist/src/lib/tokenTransferBuilder.d.ts +1 -1
  30. package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -1
  31. package/dist/src/lib/tokenTransferBuilder.js +15 -31
  32. package/dist/src/lib/transaction.d.ts +7 -1
  33. package/dist/src/lib/transaction.d.ts.map +1 -1
  34. package/dist/src/lib/transaction.js +94 -41
  35. package/dist/src/lib/transactionBuilder.d.ts +1 -1
  36. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  37. package/dist/src/lib/transactionBuilder.js +18 -37
  38. package/dist/src/lib/transactionBuilderFactory.d.ts +5 -0
  39. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  40. package/dist/src/lib/transactionBuilderFactory.js +12 -3
  41. package/dist/src/lib/transferBuilder.d.ts +1 -1
  42. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  43. package/dist/src/lib/transferBuilder.js +5 -24
  44. package/dist/src/lib/utils.d.ts +18 -1
  45. package/dist/src/lib/utils.d.ts.map +1 -1
  46. package/dist/src/lib/utils.js +112 -41
  47. package/dist/src/lib/walletInitializationBuilder.js +12 -28
  48. package/dist/src/register.d.ts +3 -0
  49. package/dist/src/register.d.ts.map +1 -0
  50. package/dist/src/register.js +15 -0
  51. package/dist/src/seedValidator.js +24 -10
  52. package/dist/test/fixtures/hbar.d.ts +6 -0
  53. package/dist/test/fixtures/hbar.d.ts.map +1 -0
  54. package/dist/test/fixtures/hbar.js +9 -0
  55. package/dist/test/resources/hbar.d.ts +67 -0
  56. package/dist/test/resources/hbar.d.ts.map +1 -0
  57. package/dist/test/resources/hbar.js +73 -0
  58. package/dist/test/unit/fixtures/hbarBackupKey.d.ts +4 -0
  59. package/dist/test/unit/fixtures/hbarBackupKey.d.ts.map +1 -0
  60. package/dist/test/unit/fixtures/hbarBackupKey.js +10 -0
  61. package/dist/test/unit/getBuilderFactory.d.ts +3 -0
  62. package/dist/test/unit/getBuilderFactory.d.ts.map +1 -0
  63. package/dist/test/unit/getBuilderFactory.js +10 -0
  64. package/dist/test/unit/hbar.d.ts +2 -0
  65. package/dist/test/unit/hbar.d.ts.map +1 -0
  66. package/dist/test/unit/hbar.js +1496 -0
  67. package/dist/test/unit/hbarToken.d.ts +2 -0
  68. package/dist/test/unit/hbarToken.d.ts.map +1 -0
  69. package/dist/test/unit/hbarToken.js +34 -0
  70. package/dist/test/unit/keyPair.d.ts +2 -0
  71. package/dist/test/unit/keyPair.d.ts.map +1 -0
  72. package/dist/test/unit/keyPair.js +179 -0
  73. package/dist/test/unit/transaction.d.ts +2 -0
  74. package/dist/test/unit/transaction.d.ts.map +1 -0
  75. package/dist/test/unit/transaction.js +94 -0
  76. package/dist/test/unit/transactionBuilder/accountUpdateBuilder.d.ts +2 -0
  77. package/dist/test/unit/transactionBuilder/accountUpdateBuilder.d.ts.map +1 -0
  78. package/dist/test/unit/transactionBuilder/accountUpdateBuilder.js +221 -0
  79. package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.d.ts +2 -0
  80. package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.d.ts.map +1 -0
  81. package/dist/test/unit/transactionBuilder/tokenAssociateBuilder.js +215 -0
  82. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
  83. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
  84. package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +329 -0
  85. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
  86. package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
  87. package/dist/test/unit/transactionBuilder/transferBuilder.js +353 -0
  88. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts +2 -0
  89. package/dist/test/unit/transactionBuilder/walletInitialization.d.ts.map +1 -0
  90. package/dist/test/unit/transactionBuilder/walletInitialization.js +214 -0
  91. package/dist/test/unit/utils.d.ts +2 -0
  92. package/dist/test/unit/utils.d.ts.map +1 -0
  93. package/dist/test/unit/utils.js +275 -0
  94. package/dist/tsconfig.tsbuildinfo +1 -0
  95. package/package.json +17 -14
  96. package/.eslintignore +0 -5
  97. package/.mocharc.yml +0 -8
  98. package/CHANGELOG.md +0 -26
package/dist/src/hbar.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
11
15
  }) : function(o, v) {
12
16
  o["default"] = v;
13
17
  });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
21
35
  Object.defineProperty(exports, "__esModule", { value: true });
22
36
  exports.Hbar = void 0;
23
37
  /**
@@ -31,6 +45,8 @@ const seedValidator_1 = require("./seedValidator");
31
45
  const lib_1 = require("./lib");
32
46
  const Utils = __importStar(require("./lib/utils"));
33
47
  const _ = __importStar(require("lodash"));
48
+ const sdk_1 = require("@hashgraph/sdk");
49
+ const keyPair_1 = require("./lib/keyPair");
34
50
  class Hbar extends sdk_core_1.BaseCoin {
35
51
  constructor(bitgo, staticsCoin) {
36
52
  super(bitgo);
@@ -73,12 +89,11 @@ class Hbar extends sdk_core_1.BaseCoin {
73
89
  return false;
74
90
  }
75
91
  }
76
- /**
77
- * Generate Hedera Hashgraph key pair
78
- *
79
- * @param seed
80
- * @returns {Object} object with generated pub, prv
81
- */
92
+ /** inheritdoc */
93
+ deriveKeyWithSeed() {
94
+ throw new sdk_core_1.NotSupported('method deriveKeyWithSeed not supported for eddsa curve');
95
+ }
96
+ /** inheritdoc */
82
97
  generateKeyPair(seed) {
83
98
  const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
84
99
  const keys = keyPair.getKeys();
@@ -90,6 +105,15 @@ class Hbar extends sdk_core_1.BaseCoin {
90
105
  prv: keys.prv,
91
106
  };
92
107
  }
108
+ /** inheritdoc */
109
+ generateRootKeyPair(seed) {
110
+ const keyPair = seed ? new lib_1.KeyPair({ seed }) : new lib_1.KeyPair();
111
+ const keys = keyPair.getKeys(true);
112
+ if (!keys.prv) {
113
+ throw new Error('Missing prv in key generation.');
114
+ }
115
+ return { prv: keys.prv + keys.pub, pub: keys.pub };
116
+ }
93
117
  async parseTransaction(params) {
94
118
  return {};
95
119
  }
@@ -100,14 +124,161 @@ class Hbar extends sdk_core_1.BaseCoin {
100
124
  * @param {String} params.address - the address to verify
101
125
  * @param {String} params.baseAddress - the base address from the wallet
102
126
  */
103
- isWalletAddress(params) {
127
+ async isWalletAddress(params) {
104
128
  const { address, baseAddress } = params;
105
129
  return Utils.isSameBaseAddress(address, baseAddress);
106
130
  }
131
+ /**
132
+ * Verify a token enablement transaction with strict validation
133
+ * @param txHex - The transaction hex to verify
134
+ * @param expectedToken - Object containing tokenId (preferred) or tokenName
135
+ * @param expectedAccountId - The expected account ID that will enable the token
136
+ * @throws Error if the transaction is not a valid token enablement transaction
137
+ */
138
+ async verifyTokenEnablementTransaction(txHex, expectedToken, expectedAccountId) {
139
+ if (!txHex || !expectedAccountId || (!expectedToken.tokenId && !expectedToken.tokenName)) {
140
+ const missing = [];
141
+ if (!txHex)
142
+ missing.push('txHex');
143
+ if (!expectedAccountId)
144
+ missing.push('expectedAccountId');
145
+ if (!expectedToken.tokenId && !expectedToken.tokenName)
146
+ missing.push('expectedToken.tokenId|tokenName');
147
+ throw new Error(`Missing required parameters: ${missing.join(', ')}`);
148
+ }
149
+ try {
150
+ const transaction = new lib_1.Transaction(statics_1.coins.get(this.getChain()));
151
+ transaction.fromRawTransaction(txHex);
152
+ const raw = transaction.toJson();
153
+ const explainedTx = await this.explainTransaction({ txHex });
154
+ this.validateTxStructureStrict(explainedTx);
155
+ this.validateNoTransfers(raw);
156
+ this.validateAccountIdMatches(explainedTx, raw, expectedAccountId);
157
+ this.validateTokenEnablementTarget(explainedTx, raw, expectedToken);
158
+ this.validateAssociateInstructionOnly(raw);
159
+ this.validateTxHexAgainstExpected(txHex, expectedToken, expectedAccountId);
160
+ }
161
+ catch (error) {
162
+ throw new Error(`Invalid token enablement transaction: ${error.message}`);
163
+ }
164
+ }
165
+ validateTxStructureStrict(ex) {
166
+ if (!ex.outputs || ex.outputs.length === 0) {
167
+ throw new Error('Invalid token enablement transaction: missing required token association output');
168
+ }
169
+ if (ex.outputs.length !== 1) {
170
+ throw new Error(`Expected exactly 1 output, got ${ex.outputs.length}`);
171
+ }
172
+ const out0 = ex.outputs[0];
173
+ if (out0.amount !== '0') {
174
+ throw new Error(`Expected output amount '0', got ${out0.amount}`);
175
+ }
176
+ }
177
+ validateNoTransfers(raw) {
178
+ if (raw.instructionsData?.params?.recipients?.length && raw.instructionsData.params.recipients.length > 0) {
179
+ const hasNonZeroTransfers = raw.instructionsData.params.recipients.some((recipient) => recipient.amount && recipient.amount !== '0');
180
+ if (hasNonZeroTransfers) {
181
+ throw new Error('Transaction contains transfers; not a pure token enablement.');
182
+ }
183
+ }
184
+ if (raw.amount && raw.amount !== '0') {
185
+ throw new Error('Transaction contains transfers; not a pure token enablement.');
186
+ }
187
+ }
188
+ validateAccountIdMatches(ex, raw, expectedAccountId) {
189
+ if (ex.outputs && ex.outputs.length > 0) {
190
+ const out0 = ex.outputs[0];
191
+ const normalizedOutput = Utils.getAddressDetails(out0.address).address;
192
+ const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
193
+ if (normalizedOutput !== normalizedExpected) {
194
+ throw new Error(`Expected account ${expectedAccountId}, got ${out0.address}`);
195
+ }
196
+ }
197
+ const assocAcct = raw.instructionsData?.params?.accountId;
198
+ if (assocAcct) {
199
+ const normalizedAssoc = Utils.getAddressDetails(assocAcct).address;
200
+ const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
201
+ if (normalizedAssoc !== normalizedExpected) {
202
+ throw new Error(`Associate account ${assocAcct} does not match expected ${expectedAccountId}`);
203
+ }
204
+ }
205
+ }
206
+ validateTokenEnablementTarget(ex, raw, expected) {
207
+ if (ex.outputs && ex.outputs.length > 0) {
208
+ const out0 = ex.outputs[0];
209
+ const explainedName = out0.tokenName;
210
+ if (expected.tokenName) {
211
+ if (explainedName !== expected.tokenName) {
212
+ throw new Error(`Expected token name ${expected.tokenName}, got ${explainedName}`);
213
+ }
214
+ }
215
+ if (expected.tokenId && explainedName) {
216
+ const actualTokenId = Utils.getHederaTokenIdFromName(explainedName);
217
+ if (!actualTokenId) {
218
+ throw new Error(`Unable to resolve tokenId for token name ${explainedName}`);
219
+ }
220
+ if (actualTokenId !== expected.tokenId) {
221
+ throw new Error(`Expected tokenId ${expected.tokenId}, but transaction contains tokenId ${actualTokenId} (${explainedName})`);
222
+ }
223
+ }
224
+ }
225
+ else {
226
+ throw new Error('Transaction missing token information in outputs');
227
+ }
228
+ const tokenNames = raw.instructionsData?.params?.tokenNames || [];
229
+ if (tokenNames.length !== 1) {
230
+ throw new Error(`Expected exactly 1 token to associate, got ${tokenNames.length}`);
231
+ }
232
+ }
233
+ validateTxHexAgainstExpected(txHex, expectedToken, expectedAccountId) {
234
+ const transaction = new lib_1.Transaction(statics_1.coins.get(this.getChain()));
235
+ transaction.fromRawTransaction(txHex);
236
+ const txBody = transaction.txBody;
237
+ if (!txBody.tokenAssociate) {
238
+ throw new Error('Transaction is not a TokenAssociate transaction');
239
+ }
240
+ const actualAccountId = Utils.stringifyAccountId(txBody.tokenAssociate.account);
241
+ const normalizedActual = Utils.getAddressDetails(actualAccountId).address;
242
+ const normalizedExpected = Utils.getAddressDetails(expectedAccountId).address;
243
+ if (normalizedActual !== normalizedExpected) {
244
+ throw new Error(`TxHex account ${actualAccountId} does not match expected ${expectedAccountId}`);
245
+ }
246
+ const actualTokens = txBody.tokenAssociate.tokens || [];
247
+ if (actualTokens.length !== 1) {
248
+ throw new Error(`TxHex contains ${actualTokens.length} tokens, expected exactly 1`);
249
+ }
250
+ const actualTokenId = Utils.stringifyTokenId(actualTokens[0]);
251
+ if (expectedToken.tokenId) {
252
+ if (actualTokenId !== expectedToken.tokenId) {
253
+ throw new Error(`TxHex tokenId ${actualTokenId} does not match expected ${expectedToken.tokenId}`);
254
+ }
255
+ }
256
+ if (expectedToken.tokenName) {
257
+ const expectedTokenId = Utils.getHederaTokenIdFromName(expectedToken.tokenName);
258
+ if (!expectedTokenId) {
259
+ throw new Error(`Unable to resolve tokenId for expected token name ${expectedToken.tokenName}`);
260
+ }
261
+ if (actualTokenId !== expectedTokenId) {
262
+ throw new Error(`TxHex tokenId ${actualTokenId} does not match expected tokenId ${expectedTokenId} for token ${expectedToken.tokenName}`);
263
+ }
264
+ }
265
+ }
266
+ validateAssociateInstructionOnly(raw) {
267
+ const instructionType = String(raw.instructionsData?.type || '').toLowerCase();
268
+ if (instructionType === 'contractexecute' ||
269
+ instructionType === 'contractcall' ||
270
+ instructionType === 'precompile') {
271
+ throw new Error(`Contract-based token association not allowed for blind enablement; got ${instructionType}`);
272
+ }
273
+ const isNativeAssociate = instructionType === 'tokenassociate' || instructionType === 'associate' || instructionType === 'associate_token';
274
+ if (!isNativeAssociate) {
275
+ throw new Error(`Only native TokenAssociate is allowed for blind enablement; got ${instructionType || 'unknown'}`);
276
+ }
277
+ }
107
278
  async verifyTransaction(params) {
108
279
  // asset name to transfer amount map
109
280
  const coinConfig = statics_1.coins.get(this.getChain());
110
- const { txParams: txParams, txPrebuild: txPrebuild, memo: memo } = params;
281
+ const { txParams, txPrebuild, memo, verification } = params;
111
282
  const transaction = new lib_1.Transaction(coinConfig);
112
283
  if (!txPrebuild.txHex) {
113
284
  throw new Error('missing required tx prebuild property txHex');
@@ -122,10 +293,27 @@ class Hbar extends sdk_core_1.BaseCoin {
122
293
  if (!txParams.recipients) {
123
294
  throw new Error('missing required tx params property recipients');
124
295
  }
296
+ if (txParams.type === 'enabletoken' && verification?.verifyTokenEnablement) {
297
+ const r0 = txParams.recipients[0];
298
+ const expectedToken = {};
299
+ if (r0.tokenName) {
300
+ expectedToken.tokenName = r0.tokenName;
301
+ const tokenId = Utils.getHederaTokenIdFromName(r0.tokenName);
302
+ if (tokenId) {
303
+ expectedToken.tokenId = tokenId;
304
+ }
305
+ }
306
+ if (!expectedToken.tokenName && !expectedToken.tokenId) {
307
+ throw new Error('Token enablement request missing token information');
308
+ }
309
+ await this.verifyTokenEnablementTransaction(txPrebuild.txHex, expectedToken, r0.address);
310
+ return true;
311
+ }
125
312
  // for enabletoken, recipient output amount is 0
126
313
  const recipients = txParams.recipients.map((recipient) => ({
127
314
  ...recipient,
128
315
  amount: txParams.type === 'enabletoken' ? '0' : recipient.amount,
316
+ address: Utils.getAddressDetails(recipient.address).address,
129
317
  }));
130
318
  if (coinConfig.isToken) {
131
319
  recipients.forEach((recipient) => {
@@ -136,7 +324,7 @@ class Hbar extends sdk_core_1.BaseCoin {
136
324
  });
137
325
  }
138
326
  // verify recipients from params and explainedTx
139
- const filteredRecipients = recipients === null || recipients === void 0 ? void 0 : recipients.map((recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']));
327
+ const filteredRecipients = recipients?.map((recipient) => _.pick(recipient, ['address', 'amount', 'tokenName']));
140
328
  const filteredOutputs = explainedTx.outputs.map((output) => _.pick(output, ['address', 'amount', 'tokenName']));
141
329
  if (!_.isEqual(filteredOutputs, filteredRecipients)) {
142
330
  throw new Error('Tx outputs does not match with expected txParams recipients');
@@ -149,7 +337,6 @@ class Hbar extends sdk_core_1.BaseCoin {
149
337
  * @param params
150
338
  * @param params.txPrebuild {Object} prebuild object returned by platform
151
339
  * @param params.prv {String} user prv
152
- * @param params.wallet.addressVersion {String} this is the version of the Algorand multisig address generation format
153
340
  * @returns Promise<SignedTransaction>
154
341
  */
155
342
  async signTransaction(params) {
@@ -186,7 +373,124 @@ class Hbar extends sdk_core_1.BaseCoin {
186
373
  * @param params
187
374
  */
188
375
  async recover(params) {
189
- throw new sdk_core_1.MethodNotImplementedError();
376
+ const isUnsignedSweep = (params.backupKey.startsWith(keyPair_1.PUBLIC_KEY_PREFIX) && params.userKey.startsWith(keyPair_1.PUBLIC_KEY_PREFIX)) ||
377
+ (Utils.isValidPublicKey(params.userKey) && Utils.isValidPublicKey(params.backupKey));
378
+ // Validate the root address
379
+ if (!this.isValidAddress(params.rootAddress)) {
380
+ throw new Error('invalid rootAddress, got: ' + params.rootAddress);
381
+ }
382
+ // Validate the destination address
383
+ if (!this.isValidAddress(params.recoveryDestination)) {
384
+ throw new Error('invalid recoveryDestination, got: ' + params.recoveryDestination);
385
+ }
386
+ // Validate nodeId
387
+ if (params.nodeId && !Utils.isValidAddress(params.nodeId)) {
388
+ throw new Error('invalid nodeId, got: ' + params.nodeId);
389
+ }
390
+ // validate fee
391
+ if (params.maxFee && !Utils.isValidAmount(params.maxFee)) {
392
+ throw new Error('invalid maxFee, got: ' + params.maxFee);
393
+ }
394
+ // validate startTime
395
+ if (params.startTime) {
396
+ Utils.validateStartTime(params.startTime);
397
+ }
398
+ if (isUnsignedSweep && !params.startTime) {
399
+ throw new Error('start time is required for unsigned sweep');
400
+ }
401
+ if (!isUnsignedSweep && !params.walletPassphrase) {
402
+ throw new Error('walletPassphrase is required for non-bitgo recovery');
403
+ }
404
+ let userPrv;
405
+ let backUp;
406
+ if (!isUnsignedSweep) {
407
+ try {
408
+ userPrv = this.bitgo.decrypt({ input: params.userKey, password: params.walletPassphrase });
409
+ backUp = this.bitgo.decrypt({ input: params.backupKey, password: params.walletPassphrase });
410
+ }
411
+ catch (e) {
412
+ throw new Error('unable to decrypt userKey or backupKey with the walletPassphrase provided, got error: ' + e.message);
413
+ }
414
+ }
415
+ // validate userKey for unsigned sweep
416
+ if (isUnsignedSweep && !Utils.isValidPublicKey(params.userKey)) {
417
+ throw new Error('invalid userKey, got: ' + params.userKey);
418
+ }
419
+ // validate backupKey for unsigned sweep
420
+ if (isUnsignedSweep && !Utils.isValidPublicKey(params.backupKey)) {
421
+ throw new Error('invalid backupKey, got: ' + params.backupKey);
422
+ }
423
+ const { address: destinationAddress, memoId } = Utils.getAddressDetails(params.recoveryDestination);
424
+ const nodeId = params.nodeId ? params.nodeId : '0.0.3';
425
+ const client = this.getHbarClient();
426
+ const balance = await this.getAccountBalance(params.rootAddress, client);
427
+ const fee = params.maxFee ? params.maxFee : '10000000'; // default fee to 1 hbar
428
+ const nativeBalance = sdk_1.Hbar.fromString(balance.hbars).toTinybars().toString();
429
+ const spendableAmount = new bignumber_js_1.BigNumber(nativeBalance).minus(fee);
430
+ let txBuilder;
431
+ if (!params.tokenId) {
432
+ if (spendableAmount.isZero() || spendableAmount.isNegative()) {
433
+ throw new Error(`Insufficient balance to recover, got balance: ${nativeBalance} fee: ${fee}`);
434
+ }
435
+ txBuilder = this.getBuilderFactory().getTransferBuilder();
436
+ txBuilder.send({ address: destinationAddress, amount: spendableAmount.toString() });
437
+ }
438
+ else {
439
+ if (spendableAmount.isNegative()) {
440
+ throw new Error(`Insufficient native balance to recover tokens, got native balance: ${nativeBalance} fee: ${fee}`);
441
+ }
442
+ const tokenBalance = balance.tokens.find((token) => token.tokenId === params.tokenId);
443
+ const token = Utils.getHederaTokenNameFromId(params.tokenId);
444
+ if (!token) {
445
+ throw new Error(`Unsupported token: ${params.tokenId}`);
446
+ }
447
+ if (!tokenBalance || new bignumber_js_1.BigNumber(tokenBalance.balance).isZero()) {
448
+ throw new Error(`Insufficient balance to recover token: ${params.tokenId} for account: ${params.rootAddress}`);
449
+ }
450
+ txBuilder = this.getBuilderFactory().getTokenTransferBuilder();
451
+ txBuilder.send({ address: destinationAddress, amount: tokenBalance.balance, tokenName: token.name });
452
+ }
453
+ txBuilder.node({ nodeId });
454
+ txBuilder.fee({ fee });
455
+ txBuilder.source({ address: params.rootAddress });
456
+ txBuilder.validDuration(180);
457
+ if (memoId) {
458
+ txBuilder.memo(memoId);
459
+ }
460
+ if (params.startTime) {
461
+ txBuilder.startTime(Utils.normalizeStarttime(params.startTime));
462
+ }
463
+ if (isUnsignedSweep) {
464
+ const tx = await txBuilder.build();
465
+ const txJson = tx.toJson();
466
+ return {
467
+ txHex: tx.toBroadcastFormat(),
468
+ coin: this.getChain(),
469
+ id: txJson.id,
470
+ startTime: txJson.startTime,
471
+ validDuration: txJson.validDuration,
472
+ nodeId: txJson.node,
473
+ memo: txJson.memo,
474
+ userKey: params.userKey,
475
+ backupKey: params.backupKey,
476
+ bitgoKey: params.bitgoKey,
477
+ maxFee: fee,
478
+ address: params.rootAddress,
479
+ recipients: txJson.instructionsData.params.recipients,
480
+ amount: txJson.amount,
481
+ json: txJson,
482
+ };
483
+ }
484
+ txBuilder.sign({ key: userPrv });
485
+ txBuilder.sign({ key: backUp });
486
+ const tx = await txBuilder.build();
487
+ return {
488
+ tx: tx.toBroadcastFormat(),
489
+ id: tx.toJson().id,
490
+ coin: this.getChain(),
491
+ startTime: tx.toJson().startTime,
492
+ nodeId: tx.toJson().node,
493
+ };
190
494
  }
191
495
  /**
192
496
  * Explain a Hedera transaction from txHex
@@ -197,9 +501,6 @@ class Hbar extends sdk_core_1.BaseCoin {
197
501
  if (!txHex) {
198
502
  throw new Error('missing explain tx parameters');
199
503
  }
200
- if (!params.feeInfo) {
201
- throw new Error('missing fee information');
202
- }
203
504
  const factory = this.getBuilderFactory();
204
505
  const txBuilder = factory.from(txHex);
205
506
  const tx = await txBuilder.build();
@@ -241,6 +542,14 @@ class Hbar extends sdk_core_1.BaseCoin {
241
542
  });
242
543
  });
243
544
  break;
545
+ case 'cryptoUpdateAccount':
546
+ const updateParams = txJson.instructionsData.params;
547
+ outputs.push({
548
+ address: updateParams.accountId,
549
+ amount: '0',
550
+ memo,
551
+ });
552
+ break;
244
553
  default:
245
554
  throw new Error('Transaction format outside of cryptoTransfer not supported for explanation.');
246
555
  }
@@ -260,9 +569,9 @@ class Hbar extends sdk_core_1.BaseCoin {
260
569
  id: txJson.id,
261
570
  outputs,
262
571
  outputAmount: outputAmount.toString(),
263
- changeOutputs: [],
264
- changeAmount: '0',
265
- fee: params.feeInfo,
572
+ changeOutputs: [], // account based does not use change outputs
573
+ changeAmount: '0', // account base does not make change
574
+ fee: params.feeInfo?.fee || txJson.fee, // in the instance no feeInfo is passed in as a param, show the fee given by the txJSON
266
575
  timestamp: txJson.startTime,
267
576
  expiration: txJson.validDuration,
268
577
  };
@@ -287,6 +596,13 @@ class Hbar extends sdk_core_1.BaseCoin {
287
596
  isValidPub(pub) {
288
597
  return Utils.isValidPublicKey(pub);
289
598
  }
599
+ supportsDeriveKeyWithSeed() {
600
+ return false;
601
+ }
602
+ /** inherited doc */
603
+ getDefaultMultisigType() {
604
+ return sdk_core_1.multisigTypes.onchain;
605
+ }
290
606
  getTokenEnablementConfig() {
291
607
  return {
292
608
  requiresTokenEnablement: true,
@@ -296,6 +612,57 @@ class Hbar extends sdk_core_1.BaseCoin {
296
612
  getBuilderFactory() {
297
613
  return new lib_1.TransactionBuilderFactory(statics_1.coins.get(this.getChain()));
298
614
  }
615
+ getHbarClient() {
616
+ const client = this.bitgo.getEnv() === 'prod' ? sdk_1.Client.forMainnet() : sdk_1.Client.forTestnet();
617
+ return client;
618
+ }
619
+ async getAccountBalance(accountId, client) {
620
+ try {
621
+ const balance = await new sdk_1.AccountBalanceQuery().setAccountId(accountId).execute(client);
622
+ return balance.toJSON();
623
+ }
624
+ catch (e) {
625
+ throw new Error('Failed to get account balance, error: ' + e.message);
626
+ }
627
+ }
628
+ async broadcastTransaction({ serializedSignedTransaction, startTime, }) {
629
+ try {
630
+ const hbarTx = sdk_1.Transaction.fromBytes(Utils.toUint8Array(serializedSignedTransaction));
631
+ if (startTime) {
632
+ Utils.isValidTimeString(startTime);
633
+ while (!Utils.shouldBroadcastNow(startTime)) {
634
+ await Utils.sleep(1000);
635
+ }
636
+ }
637
+ return this.clientBroadcastTransaction(hbarTx);
638
+ }
639
+ catch (e) {
640
+ throw new Error('Failed to broadcast transaction, error: ' + e.message);
641
+ }
642
+ }
643
+ async clientBroadcastTransaction(hbarTx) {
644
+ const client = this.getHbarClient();
645
+ const transactionResponse = await hbarTx.execute(client);
646
+ const transactionReceipt = await transactionResponse.getReceipt(client);
647
+ return { txId: transactionResponse.transactionId.toString(), status: transactionReceipt.status.toString() };
648
+ }
649
+ /** @inheritDoc */
650
+ auditDecryptedKey({ prv, publicKey, multiSigType }) {
651
+ if (multiSigType === 'tss') {
652
+ throw new Error('Unsupported multiSigType');
653
+ }
654
+ let hbarKeyPair;
655
+ try {
656
+ hbarKeyPair = new lib_1.KeyPair({ prv });
657
+ }
658
+ catch (e) {
659
+ throw new Error(`Invalid private key: ${e.message}`);
660
+ }
661
+ const genPubKey = hbarKeyPair.getKeys().pub;
662
+ if (publicKey && publicKey !== genPubKey) {
663
+ throw new Error('Invalid public key');
664
+ }
665
+ }
299
666
  }
300
667
  exports.Hbar = Hbar;
301
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILGlEQUFxRjtBQUNyRixtREFpQjhCO0FBQzlCLCtDQUF5QztBQUN6QyxxREFBdUM7QUFDdkMsbURBQWdEO0FBQ2hELCtCQUF1RjtBQUN2RixtREFBcUM7QUFDckMsMENBQTRCO0FBMEM1QixNQUFhLElBQUssU0FBUSxtQkFBUTtJQUdoQyxZQUFZLEtBQWdCLEVBQUUsV0FBdUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7U0FDdkU7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFnQixFQUFFLFdBQXVDO1FBQzdFLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7O09BR0c7SUFDSCx3QkFBd0I7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gs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bXBvcnQgeyBDb2luRmFtaWx5LCBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBLZXlQYWlyLFxuICBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFNpZ25lZFRyYW5zYWN0aW9uLFxuICBTaWduVHJhbnNhY3Rpb25PcHRpb25zLFxuICBWZXJpZnlBZGRyZXNzT3B0aW9ucyBhcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uUmVjaXBpZW50IGFzIFJlY2lwaWVudCxcbiAgVHJhbnNhY3Rpb25QcmVidWlsZCBhcyBCYXNlVHJhbnNhY3Rpb25QcmVidWlsZCxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgTWVtbyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgc3RlbGxhciBmcm9tICdzdGVsbGFyLXNkayc7XG5pbXBvcnQgeyBTZWVkVmFsaWRhdG9yIH0gZnJvbSAnLi9zZWVkVmFsaWRhdG9yJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSGJhcktleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEhiYXJTaWduVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR4SW5mbyB7XG4gIHJlY2lwaWVudHM6IFJlY2lwaWVudFtdO1xuICBmcm9tOiBzdHJpbmc7XG4gIHR4aWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm86IFR4SW5mbztcbiAgZmVlSW5mbzogVHJhbnNhY3Rpb25GZWU7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleD86IHN0cmluZztcbiAgaGFsZlNpZ25lZD86IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xuICBmZWVJbmZvOiBUcmFuc2FjdGlvbkZlZTtcbiAgLy8gVE9ETyhCRy0yNDgwOSk6IGdldCB0aGUgbWVtbyBmcm9tIHRoZSB0b0pzb25cbiAgbWVtbz86IHtcbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgdmFsdWU6IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYmFyVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zIHtcbiAgdHhQcmVidWlsZDogVHJhbnNhY3Rpb25QcmVidWlsZDtcbiAgbWVtbz86IE1lbW87XG59XG5cbmludGVyZmFjZSBWZXJpZnlBZGRyZXNzT3B0aW9ucyBleHRlbmRzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyB7XG4gIGJhc2VBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBIYmFyIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBIYmFyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgaXMgYSB2YWxpZCBiYXNlNTggb3IgaGV4IGFkZHJlc3NcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgSGVkZXJhIEhhc2hncmFwaCBrZXkgcGFpclxuICAgKlxuICAgKiBAcGFyYW0gc2VlZFxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3Qgd2l0aCBnZW5lcmF0ZWQgcHViLCBwcnZcbiAgICovXG4gIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgSGJhcktleVBhaXIoeyBzZWVkIH0pIDogbmV3IEhiYXJLZXlQYWlyKCk7XG4gICAgY29uc3Qga2V5cyA9IGtleVBhaXIuZ2V0S2V5cygpO1xuXG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdLZXlwYWlyIGdlbmVyYXRpb24gZmFpbGVkIHRvIGdlbmVyYXRlIGEgcHJ2Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy5wdWIsXG4gICAgICBwcnY6IGtleXMucHJ2LFxuICAgIH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIGJhc2UgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWZXJpZnlBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIC0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB3YWxsZXRcbiAgICovXG4gIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBiYXNlQWRkcmVzcyB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzLCBiYXNlQWRkcmVzcyk7XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IEhiYXJWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBhc3NldCBuYW1lIHRvIHRyYW5zZmVyIGFtb3VudCBtYXBcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSk7XG4gICAgY29uc3QgeyB0eFBhcmFtczogdHhQYXJhbXMsIHR4UHJlYnVpbGQ6IHR4UHJlYnVpbGQsIG1lbW86IG1lbW8gfSA9IHBhcmFtcztcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbihjb2luQ29uZmlnKTtcbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwcmVidWlsZCBwcm9wZXJ0eSB0eEhleCcpO1xuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uLmZyb21SYXdUcmFuc2FjdGlvbih0eFByZWJ1aWxkLnR4SGV4KTtcbiAgICBjb25zdCBleHBsYWluVHhQYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMgPSB7XG4gICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICAgIGZlZUluZm86IHR4UHJlYnVpbGQuZmVlSW5mbyxcbiAgICAgIG1lbW86IG1lbW8sXG4gICAgfTtcbiAgICBjb25zdCBleHBsYWluZWRUeCA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKGV4cGxhaW5UeFBhcmFtcyk7XG5cbiAgICBpZiAoIXR4UGFyYW1zLnJlY2lwaWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eCBwYXJhbXMgcHJvcGVydHkgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIC8vIGZvciBlbmFibGV0b2tlbiwgcmVjaXBpZW50IG91dHB1dCBhbW91bnQgaXMgMFxuICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiAoe1xuICAgICAgLi4ucmVjaXBpZW50LFxuICAgICAgYW1vdW50OiB0eFBhcmFtcy50eXBlID09PSAnZW5hYmxldG9rZW4nID8gJzAnIDogcmVjaXBpZW50LmFtb3VudCxcbiAgICB9KSk7XG4gICAgaWYgKGNvaW5Db25maWcuaXNUb2tlbikge1xuICAgICAgcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgaWYgKHJlY2lwaWVudC50b2tlbk5hbWUgIT09IHVuZGVmaW5lZCAmJiByZWNpcGllbnQudG9rZW5OYW1lICE9PSBjb2luQ29uZmlnLm5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luY29ycmVjdCB0b2tlbiBuYW1lIHNwZWNpZmllZCBpbiByZWNpcGllbnRzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjaXBpZW50LnRva2VuTmFtZSA9IGNvaW5Db25maWcubmFtZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIHZlcmlmeSByZWNpcGllbnRzIGZyb20gcGFyYW1zIGFuZCBleHBsYWluZWRUeFxuICAgIGNvbnN0IGZpbHRlcmVkUmVjaXBpZW50cyA9IHJlY2lwaWVudHM/Lm1hcCgocmVjaXBpZW50KSA9PiBfLnBpY2socmVjaXBpZW50LCBbJ2FkZHJlc3MnLCAnYW1vdW50JywgJ3Rva2VuTmFtZSddKSk7XG4gICAgY29uc3QgZmlsdGVyZWRPdXRwdXRzID0gZXhwbGFpbmVkVHgub3V0cHV0cy5tYXAoKG91dHB1dCkgPT4gXy5waWNrKG91dHB1dCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuXG4gICAgaWYgKCFfLmlzRXF1YWwoZmlsdGVyZWRPdXRwdXRzLCBmaWx0ZXJlZFJlY2lwaWVudHMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1R4IG91dHB1dHMgZG9lcyBub3QgbWF0Y2ggd2l0aCBleHBlY3RlZCB0eFBhcmFtcyByZWNpcGllbnRzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIEBwYXJhbSBwYXJhbXMudHhQcmVidWlsZCB7T2JqZWN0fSBwcmVidWlsZCBvYmplY3QgcmV0dXJuZWQgYnkgcGxhdGZvcm1cbiAgICogQHBhcmFtIHBhcmFtcy5wcnYge1N0cmluZ30gdXNlciBwcnZcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXQuYWRkcmVzc1ZlcnNpb24ge1N0cmluZ30gdGhpcyBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgQWxnb3JhbmQgbXVsdGlzaWcgYWRkcmVzcyBnZW5lcmF0aW9uIGZvcm1hdFxuICAgKiBAcmV0dXJucyBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPlxuICAgKi9cbiAgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHBhcmFtczogSGJhclNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFNpZ25lZFRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20ocGFyYW1zLnR4UHJlYnVpbGQudHhIZXgpO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBwYXJhbXMucHJ2IH0pO1xuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGlmICghdHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtZXNzYWdlZCBwYXNzZWQgdG8gc2lnbk1lc3NhZ2UnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IHtcbiAgICAgIHR4SGV4OiB0cmFuc2FjdGlvbi50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLnNpZ25hdHVyZS5sZW5ndGggPj0gMiA/IHJlc3BvbnNlIDogeyBoYWxmU2lnbmVkOiByZXNwb25zZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gbWVzc2FnZSB3aXRoIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHJldHVybiB7QnVmZmVyfSBBIHNpZ25hdHVyZSBvdmVyIHRoZSBnaXZlbiBtZXNzYWdlIHVzaW5nIHRoZSBnaXZlbiBrZXlcbiAgICovXG4gIGFzeW5jIHNpZ25NZXNzYWdlKGtleTogS2V5UGFpciwgbWVzc2FnZTogc3RyaW5nIHwgQnVmZmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICBjb25zdCBtc2cgPSBCdWZmZXIuaXNCdWZmZXIobWVzc2FnZSkgPyBtZXNzYWdlLnRvU3RyaW5nKCd1dGY4JykgOiBtZXNzYWdlO1xuICAgIC8vIHJlY29uc3RpdHV0ZSBrZXlzIGFuZCBzaWduXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKG5ldyBIYmFyS2V5UGFpcih7IHBydjoga2V5LnBydiB9KS5zaWduTWVzc2FnZShtc2cpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvLlxuICAgKiBXZSBuZWVkIHRvIGRvIHRocmVlIHF1ZXJpZXMgZHVyaW5nIHRoaXM6XG4gICAqIDEpIE5vZGUgcXVlcnkgLSBob3cgbXVjaCBtb25leSBpcyBpbiB0aGUgYWNjb3VudFxuICAgKiAyKSBCdWlsZCB0cmFuc2FjdGlvbiAtIGJ1aWxkIG91ciB0cmFuc2FjdGlvbiBmb3IgdGhlIGFtb3VudFxuICAgKiAzKSBTZW5kIHNpZ25lZCBidWlsZCAtIHNlbmQgb3VyIHNpZ25lZCBidWlsZCB0byBhIHB1YmxpYyBub2RlXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIHJlY292ZXIocGFyYW1zOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbiBhIEhlZGVyYSB0cmFuc2FjdGlvbiBmcm9tIHR4SGV4XG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBjb25zdCB0eEhleCA9IHBhcmFtcy50eEhleCB8fCAocGFyYW1zLmhhbGZTaWduZWQgJiYgcGFyYW1zLmhhbGZTaWduZWQudHhIZXgpO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBleHBsYWluIHR4IHBhcmFtZXRlcnMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmFtcy5mZWVJbmZvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgZmVlIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmZyb20odHhIZXgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3QgdHhKc29uID0gdHgudG9Kc29uKCk7XG5cbiAgICBsZXQgb3V0cHV0QW1vdW50ID0gbmV3IEJpZ051bWJlcigwKTtcbiAgICBjb25zdCBvdXRwdXRzOiB7IGFkZHJlc3M6IHN0cmluZzsgYW1vdW50OiBzdHJpbmc7IG1lbW86IHN0cmluZzsgdG9rZW5OYW1lPzogc3RyaW5nIH1bXSA9IFtdO1xuICAgIC8vIFRPRE8oQkctMjQ4MDkpOiBnZXQgdGhlIG1lbW8gZnJvbSB0aGUgdG9Kc29uXG4gICAgbGV0IG1lbW8gPSAnJztcbiAgICBpZiAocGFyYW1zLm1lbW8pIHtcbiAgICAgIG1lbW8gPSBwYXJhbXMubWVtby52YWx1ZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2NyeXB0b1RyYW5zZmVyJzpcbiAgICAgICAgY29uc3QgcmVjaXBpZW50cyA9IHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy5yZWNpcGllbnRzIHx8IFtdO1xuICAgICAgICByZWNpcGllbnRzLmZvckVhY2goKHJlY2lwaWVudCkgPT4ge1xuICAgICAgICAgIGlmICghcmVjaXBpZW50LnRva2VuTmFtZSkge1xuICAgICAgICAgICAgLy8gdG9rZW4gdHJhbnNmZXIgZG9lc24ndCBjaGFuZ2Ugb3V0cHV0QW1vdW50XG4gICAgICAgICAgICBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnQucGx1cyhyZWNpcGllbnQuYW1vdW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgICAgICAgYW1vdW50OiByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgICAgICBtZW1vLFxuICAgICAgICAgICAgLi4uKHJlY2lwaWVudC50b2tlbk5hbWUgJiYge1xuICAgICAgICAgICAgICB0b2tlbk5hbWU6IHJlY2lwaWVudC50b2tlbk5hbWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd0b2tlbkFzc29jaWF0ZSc6XG4gICAgICAgIGNvbnN0IHRva2VucyA9IHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcy50b2tlbk5hbWVzIHx8IFtdO1xuICAgICAgICBjb25zdCBhY2NvdW50SWQgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMuYWNjb3VudElkO1xuICAgICAgICB0b2tlbnMuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgICAgICAgYWRkcmVzczogYWNjb3VudElkLFxuICAgICAgICAgICAgYW1vdW50OiAnMCcsXG4gICAgICAgICAgICBtZW1vLFxuICAgICAgICAgICAgdG9rZW5OYW1lOiB0b2tlbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGZvcm1hdCBvdXRzaWRlIG9mIGNyeXB0b1RyYW5zZmVyIG5vdCBzdXBwb3J0ZWQgZm9yIGV4cGxhbmF0aW9uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3BsYXlPcmRlciA9IFtcbiAgICAgICdpZCcsXG4gICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgJ291dHB1dHMnLFxuICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgJ2ZlZScsXG4gICAgICAndGltZXN0YW1wJyxcbiAgICAgICdleHBpcmF0aW9uJyxcbiAgICAgICdtZW1vJyxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcixcbiAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICBvdXRwdXRzLFxuICAgICAgb3V0cHV0QW1vdW50OiBvdXRwdXRBbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLCAvLyBhY2NvdW50IGJhc2VkIGRvZXMgbm90IHVzZSBjaGFuZ2Ugb3V0cHV0c1xuICAgICAgY2hhbmdlQW1vdW50OiAnMCcsIC8vIGFjY291bnQgYmFzZSBkb2VzIG5vdCBtYWtlIGNoYW5nZVxuICAgICAgZmVlOiBwYXJhbXMuZmVlSW5mbyxcbiAgICAgIHRpbWVzdGFtcDogdHhKc29uLnN0YXJ0VGltZSxcbiAgICAgIGV4cGlyYXRpb246IHR4SnNvbi52YWxpZER1cmF0aW9uLFxuICAgIH0gYXMgYW55O1xuICB9XG5cbiAgaXNTdGVsbGFyU2VlZChzZWVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU2VlZFZhbGlkYXRvci5pc1ZhbGlkRWQyNTUxOVNlZWRGb3JDb2luKHNlZWQsIENvaW5GYW1pbHkuWExNKTtcbiAgfVxuXG4gIGNvbnZlcnRGcm9tU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gYXNzdW1lIHRoaXMgaXMgYSB0cnVzdCBjdXN0b2RpYWwgc2VlZCBpZiBpdHMgYSB2YWxpZCBlZDI1NTE5IHBydlxuICAgIGlmICghdGhpcy5pc1N0ZWxsYXJTZWVkKHNlZWQpIHx8IFNlZWRWYWxpZGF0b3IuaGFzQ29tcGV0aW5nU2VlZEZvcm1hdHMoc2VlZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChTZWVkVmFsaWRhdG9yLmlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZCwgQ29pbkZhbWlseS5YTE0pKSB7XG4gICAgICBjb25zdCBrZXlGcm9tU2VlZCA9IG5ldyBIYmFyS2V5UGFpcih7IHNlZWQ6IHN0ZWxsYXIuU3RyS2V5LmRlY29kZUVkMjU1MTlTZWNyZXRTZWVkKHNlZWQpIH0pO1xuICAgICAgY29uc3Qga2V5cyA9IGtleUZyb21TZWVkLmdldEtleXMoKTtcbiAgICAgIGlmIChrZXlzICE9PSB1bmRlZmluZWQgJiYga2V5cy5wcnYpIHtcbiAgICAgICAgcmV0dXJuIGtleXMucHJ2O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk6IFRva2VuRW5hYmxlbWVudENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVpcmVzVG9rZW5FbmFibGVtZW50OiB0cnVlLFxuICAgICAgc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHM6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnVpbGRlckZhY3RvcnkoKTogVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgfVxufVxuIl19
668
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9oYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gsaURBQXFGO0FBQ3JGLG1EQXNCOEI7QUFDOUIsK0NBQXlDO0FBQ3pDLHFEQUF1QztBQUN2QyxtREFBZ0Q7QUFDaEQsK0JBQXFIO0FBQ3JILG1EQUFxQztBQUNyQywwQ0FBNEI7QUFDNUIsd0NBTXdCO0FBQ3hCLDJDQUFrRDtBQWdIbEQsTUFBYSxJQUFLLFNBQVEsbUJBQVE7SUFHaEMsWUFBWSxLQUFnQixFQUFFLFdBQXVDO1FBQ25FLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUViLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDeEUsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILHdCQUF3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TyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQzVDLElBQUksU0FBUyxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXp1QkQsb0JBeXVCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCB7IENvaW5GYW1pbHksIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VDb2luLFxuICBCaXRHb0Jhc2UsXG4gIEtleVBhaXIsXG4gIFBhcnNlZFRyYW5zYWN0aW9uLFxuICBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU2lnbmVkVHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zIGFzIEJhc2VWZXJpZnlBZGRyZXNzT3B0aW9ucyxcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25SZWNpcGllbnQgYXMgUmVjaXBpZW50LFxuICBUcmFuc2FjdGlvblByZWJ1aWxkIGFzIEJhc2VUcmFuc2FjdGlvblByZWJ1aWxkLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBNZW1vLFxuICBUb2tlbkVuYWJsZW1lbnRDb25maWcsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvblJlc3VsdCxcbiAgTm90U3VwcG9ydGVkLFxuICBNdWx0aXNpZ1R5cGUsXG4gIG11bHRpc2lnVHlwZXMsXG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgc3RlbGxhciBmcm9tICdzdGVsbGFyLXNkayc7XG5pbXBvcnQgeyBTZWVkVmFsaWRhdG9yIH0gZnJvbSAnLi9zZWVkVmFsaWRhdG9yJztcbmltcG9ydCB7IEtleVBhaXIgYXMgSGJhcktleVBhaXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zYWN0aW9uLCBSZWNpcGllbnQgYXMgSGVkZXJhUmVjaXBpZW50IH0gZnJvbSAnLi9saWInO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBUcmFuc2FjdGlvbiBhcyBIYmFyVHJhbnNhY3Rpb24sXG4gIEFjY291bnRCYWxhbmNlUXVlcnksXG4gIEFjY291bnRCYWxhbmNlSnNvbixcbiAgSGJhciBhcyBIYmFyVW5pdCxcbn0gZnJvbSAnQGhhc2hncmFwaC9zZGsnO1xuaW1wb3J0IHsgUFVCTElDX0tFWV9QUkVGSVggfSBmcm9tICcuL2xpYi9rZXlQYWlyJztcblxuLy8gSGVkZXJhLXNwZWNpZmljIHRyYW5zYWN0aW9uIGRhdGEgaW50ZXJmYWNlIGZvciByYXcgdHJhbnNhY3Rpb24gdmFsaWRhdGlvblxuaW50ZXJmYWNlIEhlZGVyYVJhd1RyYW5zYWN0aW9uRGF0YSB7XG4gIGlkPzogc3RyaW5nO1xuICBmcm9tPzogc3RyaW5nO1xuICBmZWU/OiBudW1iZXI7XG4gIHN0YXJ0VGltZT86IHN0cmluZztcbiAgdmFsaWREdXJhdGlvbj86IHN0cmluZztcbiAgbm9kZT86IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbiAgYW1vdW50Pzogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnNEYXRhPzoge1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgYWNjb3VudElkPzogc3RyaW5nO1xuICAgIHBhcmFtcz86IHtcbiAgICAgIGFjY291bnRJZD86IHN0cmluZztcbiAgICAgIHRva2VuTmFtZXM/OiBzdHJpbmdbXTtcbiAgICAgIHJlY2lwaWVudHM/OiBBcnJheTx7XG4gICAgICAgIGFkZHJlc3M6IHN0cmluZztcbiAgICAgICAgYW1vdW50OiBzdHJpbmc7XG4gICAgICAgIHRva2VuTmFtZT86IHN0cmluZztcbiAgICAgIH0+O1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgaW50ZXJmYWNlIEhiYXJTaWduVHJhbnNhY3Rpb25PcHRpb25zIGV4dGVuZHMgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIHBydjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR4SW5mbyB7XG4gIHJlY2lwaWVudHM6IFJlY2lwaWVudFtdO1xuICBmcm9tOiBzdHJpbmc7XG4gIHR4aWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblByZWJ1aWxkIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uUHJlYnVpbGQge1xuICB0eEhleDogc3RyaW5nO1xuICB0eEluZm86IFR4SW5mbztcbiAgZmVlSW5mbzogVHJhbnNhY3Rpb25GZWU7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMge1xuICB0eEhleD86IHN0cmluZztcbiAgaGFsZlNpZ25lZD86IHtcbiAgICB0eEhleDogc3RyaW5nO1xuICB9O1xuICBmZWVJbmZvPzogVHJhbnNhY3Rpb25GZWU7XG4gIC8vIFRPRE8oQkctMjQ4MDkpOiBnZXQgdGhlIG1lbW8gZnJvbSB0aGUgdG9Kc29uXG4gIG1lbW8/OiB7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGJhclZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyB7XG4gIHR4UHJlYnVpbGQ6IFRyYW5zYWN0aW9uUHJlYnVpbGQ7XG4gIG1lbW8/OiBNZW1vO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5QWRkcmVzc09wdGlvbnMgZXh0ZW5kcyBCYXNlVmVyaWZ5QWRkcmVzc09wdGlvbnMge1xuICBiYXNlQWRkcmVzczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5T3B0aW9ucyB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIHJvb3RBZGRyZXNzOiBzdHJpbmc7XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgYml0Z29LZXk/OiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIG1heEZlZT86IHN0cmluZztcbiAgbm9kZUlkPzogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIHRva2VuSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlJbmZvIHtcbiAgaWQ6IHN0cmluZztcbiAgdHg6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBzdGFydFRpbWU6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2ZmbGluZVZhdWx0VHhJbmZvIHtcbiAgdHhIZXg6IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgYml0Z29LZXk/OiBzdHJpbmc7XG4gIGFkZHJlc3M6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBtYXhGZWU6IHN0cmluZztcbiAgcmVjaXBpZW50czogUmVjaXBpZW50W107XG4gIGFtb3VudDogc3RyaW5nO1xuICBzdGFydFRpbWU6IHN0cmluZztcbiAgdmFsaWREdXJhdGlvbjogc3RyaW5nO1xuICBub2RlSWQ6IHN0cmluZztcbiAgbWVtbzogc3RyaW5nO1xuICBqc29uPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyBleHRlbmRzIEJhc2VCcm9hZGNhc3RUcmFuc2FjdGlvbk9wdGlvbnMge1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQgZXh0ZW5kcyBCYXNlQnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQge1xuICBzdGF0dXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBIYmFyIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPikge1xuICAgIHN1cGVyKGJpdGdvKTtcblxuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgZ2V0Q2hhaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICBnZXRGYW1pbHkoKTogQ29pbkZhbWlseSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIGdldEZ1bGxOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIGdldEJhc2VGYWN0b3IoKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBIYmFyKGJpdGdvLCBzdGF0aWNzQ29pbik7XG4gIH1cblxuICAvKipcbiAgICogRmxhZyBmb3Igc2VuZGluZyB2YWx1ZSBvZiAwXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIG9rYXkgdG8gc2VuZCAwIHZhbHVlLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIHZhbHVlbGVzc1RyYW5zZmVyQWxsb3dlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgaXMgYSB2YWxpZCBiYXNlNTggb3IgaGV4IGFkZHJlc3NcbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gVXRpbHMuaXNWYWxpZEFkZHJlc3NXaXRoUGF5bWVudElkKGFkZHJlc3MpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogaW5oZXJpdGRvYyAqL1xuICBkZXJpdmVLZXlXaXRoU2VlZCgpOiB7IGRlcml2YXRpb25QYXRoOiBzdHJpbmc7IGtleTogc3RyaW5nIH0ge1xuICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWQoJ21ldGhvZCBkZXJpdmVLZXlXaXRoU2VlZCBub3Qgc3VwcG9ydGVkIGZvciBlZGRzYSBjdXJ2ZScpO1xuICB9XG5cbiAgLyoqIGluaGVyaXRkb2MgKi9cbiAgZ2VuZXJhdGVLZXlQYWlyKHNlZWQ/OiBCdWZmZXIpOiBLZXlQYWlyIHtcbiAgICBjb25zdCBrZXlQYWlyID0gc2VlZCA/IG5ldyBIYmFyS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgSGJhcktleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRLZXlzKCk7XG5cbiAgICBpZiAoIWtleXMucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0tleXBhaXIgZ2VuZXJhdGlvbiBmYWlsZWQgdG8gZ2VuZXJhdGUgYSBwcnYnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnB1YixcbiAgICAgIHBydjoga2V5cy5wcnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZG9jICovXG4gIGdlbmVyYXRlUm9vdEtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IEhiYXJLZXlQYWlyKHsgc2VlZCB9KSA6IG5ldyBIYmFyS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEtleXModHJ1ZSk7XG4gICAgaWYgKCFrZXlzLnBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJ2OiBrZXlzLnBydiArIGtleXMucHViLCBwdWI6IGtleXMucHViIH07XG4gIH1cblxuICBhc3luYyBwYXJzZVRyYW5zYWN0aW9uKHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPFBhcnNlZFRyYW5zYWN0aW9uPiB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgdmFsaWQsIHRoZW4gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIGJhc2UgYWRkcmVzcy5cbiAgICpcbiAgICogQHBhcmFtIHtWZXJpZnlBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwYXJhbXMuYWRkcmVzcyAtIHRoZSBhZGRyZXNzIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcGFyYW1zLmJhc2VBZGRyZXNzIC0gdGhlIGJhc2UgYWRkcmVzcyBmcm9tIHRoZSB3YWxsZXRcbiAgICovXG4gIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyhwYXJhbXM6IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBiYXNlQWRkcmVzcyB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBVdGlscy5pc1NhbWVCYXNlQWRkcmVzcyhhZGRyZXNzLCBiYXNlQWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IGEgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbiB3aXRoIHN0cmljdCB2YWxpZGF0aW9uXG4gICAqIEBwYXJhbSB0eEhleCAtIFRoZSB0cmFuc2FjdGlvbiBoZXggdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFRva2VuIC0gT2JqZWN0IGNvbnRhaW5pbmcgdG9rZW5JZCAocHJlZmVycmVkKSBvciB0b2tlbk5hbWVcbiAgICogQHBhcmFtIGV4cGVjdGVkQWNjb3VudElkIC0gVGhlIGV4cGVjdGVkIGFjY291bnQgSUQgdGhhdCB3aWxsIGVuYWJsZSB0aGUgdG9rZW5cbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgbm90IGEgdmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvblxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5VG9rZW5FbmFibGVtZW50VHJhbnNhY3Rpb24oXG4gICAgdHhIZXg6IHN0cmluZyxcbiAgICBleHBlY3RlZFRva2VuOiB7IHRva2VuSWQ/OiBzdHJpbmc7IHRva2VuTmFtZT86IHN0cmluZyB9LFxuICAgIGV4cGVjdGVkQWNjb3VudElkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0eEhleCB8fCAhZXhwZWN0ZWRBY2NvdW50SWQgfHwgKCFleHBlY3RlZFRva2VuLnRva2VuSWQgJiYgIWV4cGVjdGVkVG9rZW4udG9rZW5OYW1lKSkge1xuICAgICAgY29uc3QgbWlzc2luZzogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghdHhIZXgpIG1pc3NpbmcucHVzaCgndHhIZXgnKTtcbiAgICAgIGlmICghZXhwZWN0ZWRBY2NvdW50SWQpIG1pc3NpbmcucHVzaCgnZXhwZWN0ZWRBY2NvdW50SWQnKTtcbiAgICAgIGlmICghZXhwZWN0ZWRUb2tlbi50b2tlbklkICYmICFleHBlY3RlZFRva2VuLnRva2VuTmFtZSkgbWlzc2luZy5wdXNoKCdleHBlY3RlZFRva2VuLnRva2VuSWR8dG9rZW5OYW1lJyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyczogJHttaXNzaW5nLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICAgIHRyYW5zYWN0aW9uLmZyb21SYXdUcmFuc2FjdGlvbih0eEhleCk7XG4gICAgICBjb25zdCByYXcgPSB0cmFuc2FjdGlvbi50b0pzb24oKTtcblxuICAgICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7IHR4SGV4IH0pO1xuXG4gICAgICB0aGlzLnZhbGlkYXRlVHhTdHJ1Y3R1cmVTdHJpY3QoZXhwbGFpbmVkVHgpO1xuICAgICAgdGhpcy52YWxpZGF0ZU5vVHJhbnNmZXJzKHJhdyk7XG4gICAgICB0aGlzLnZhbGlkYXRlQWNjb3VudElkTWF0Y2hlcyhleHBsYWluZWRUeCwgcmF3LCBleHBlY3RlZEFjY291bnRJZCk7XG4gICAgICB0aGlzLnZhbGlkYXRlVG9rZW5FbmFibGVtZW50VGFyZ2V0KGV4cGxhaW5lZFR4LCByYXcsIGV4cGVjdGVkVG9rZW4pO1xuICAgICAgdGhpcy52YWxpZGF0ZUFzc29jaWF0ZUluc3RydWN0aW9uT25seShyYXcpO1xuICAgICAgdGhpcy52YWxpZGF0ZVR4SGV4QWdhaW5zdEV4cGVjdGVkKHR4SGV4LCBleHBlY3RlZFRva2VuLCBleHBlY3RlZEFjY291bnRJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0b2tlbiBlbmFibGVtZW50IHRyYW5zYWN0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVR4U3RydWN0dXJlU3RyaWN0KGV4OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFleC5vdXRwdXRzIHx8IGV4Lm91dHB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gZW5hYmxlbWVudCB0cmFuc2FjdGlvbjogbWlzc2luZyByZXF1aXJlZCB0b2tlbiBhc3NvY2lhdGlvbiBvdXRwdXQnKTtcbiAgICB9XG4gICAgaWYgKGV4Lm91dHB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBvdXRwdXQsIGdvdCAke2V4Lm91dHB1dHMubGVuZ3RofWApO1xuICAgIH1cbiAgICBjb25zdCBvdXQwID0gZXgub3V0cHV0c1swXTtcbiAgICBpZiAob3V0MC5hbW91bnQgIT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBvdXRwdXQgYW1vdW50ICcwJywgZ290ICR7b3V0MC5hbW91bnR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vVHJhbnNmZXJzKHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgaWYgKHJhdy5pbnN0cnVjdGlvbnNEYXRhPy5wYXJhbXM/LnJlY2lwaWVudHM/Lmxlbmd0aCAmJiByYXcuaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoYXNOb25aZXJvVHJhbnNmZXJzID0gcmF3Lmluc3RydWN0aW9uc0RhdGEucGFyYW1zLnJlY2lwaWVudHMuc29tZShcbiAgICAgICAgKHJlY2lwaWVudDogSGVkZXJhUmVjaXBpZW50KSA9PiByZWNpcGllbnQuYW1vdW50ICYmIHJlY2lwaWVudC5hbW91bnQgIT09ICcwJ1xuICAgICAgKTtcbiAgICAgIGlmIChoYXNOb25aZXJvVHJhbnNmZXJzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gY29udGFpbnMgdHJhbnNmZXJzOyBub3QgYSBwdXJlIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJhdy5hbW91bnQgJiYgcmF3LmFtb3VudCAhPT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGNvbnRhaW5zIHRyYW5zZmVyczsgbm90IGEgcHVyZSB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVBY2NvdW50SWRNYXRjaGVzKFxuICAgIGV4OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhLFxuICAgIGV4cGVjdGVkQWNjb3VudElkOiBzdHJpbmdcbiAgKTogdm9pZCB7XG4gICAgaWYgKGV4Lm91dHB1dHMgJiYgZXgub3V0cHV0cy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvdXQwID0gZXgub3V0cHV0c1swXTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRPdXRwdXQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhvdXQwLmFkZHJlc3MpLmFkZHJlc3M7XG4gICAgICBjb25zdCBub3JtYWxpemVkRXhwZWN0ZWQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhleHBlY3RlZEFjY291bnRJZCkuYWRkcmVzcztcbiAgICAgIGlmIChub3JtYWxpemVkT3V0cHV0ICE9PSBub3JtYWxpemVkRXhwZWN0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhY2NvdW50ICR7ZXhwZWN0ZWRBY2NvdW50SWR9LCBnb3QgJHtvdXQwLmFkZHJlc3N9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXNzb2NBY2N0ID0gcmF3Lmluc3RydWN0aW9uc0RhdGE/LnBhcmFtcz8uYWNjb3VudElkO1xuICAgIGlmIChhc3NvY0FjY3QpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRBc3NvYyA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFzc29jQWNjdCkuYWRkcmVzcztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFeHBlY3RlZCA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGV4cGVjdGVkQWNjb3VudElkKS5hZGRyZXNzO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRBc3NvYyAhPT0gbm9ybWFsaXplZEV4cGVjdGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQXNzb2NpYXRlIGFjY291bnQgJHthc3NvY0FjY3R9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICR7ZXhwZWN0ZWRBY2NvdW50SWR9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRva2VuRW5hYmxlbWVudFRhcmdldChcbiAgICBleDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgICByYXc6IEhlZGVyYVJhd1RyYW5zYWN0aW9uRGF0YSxcbiAgICBleHBlY3RlZDogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfVxuICApOiB2b2lkIHtcbiAgICBpZiAoZXgub3V0cHV0cyAmJiBleC5vdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG91dDAgPSBleC5vdXRwdXRzWzBdO1xuICAgICAgY29uc3QgZXhwbGFpbmVkTmFtZSA9IG91dDAudG9rZW5OYW1lO1xuXG4gICAgICBpZiAoZXhwZWN0ZWQudG9rZW5OYW1lKSB7XG4gICAgICAgIGlmIChleHBsYWluZWROYW1lICE9PSBleHBlY3RlZC50b2tlbk5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHRva2VuIG5hbWUgJHtleHBlY3RlZC50b2tlbk5hbWV9LCBnb3QgJHtleHBsYWluZWROYW1lfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChleHBlY3RlZC50b2tlbklkICYmIGV4cGxhaW5lZE5hbWUpIHtcbiAgICAgICAgY29uc3QgYWN0dWFsVG9rZW5JZCA9IFV0aWxzLmdldEhlZGVyYVRva2VuSWRGcm9tTmFtZShleHBsYWluZWROYW1lKTtcbiAgICAgICAgaWYgKCFhY3R1YWxUb2tlbklkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0b2tlbklkIGZvciB0b2tlbiBuYW1lICR7ZXhwbGFpbmVkTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0dWFsVG9rZW5JZCAhPT0gZXhwZWN0ZWQudG9rZW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFeHBlY3RlZCB0b2tlbklkICR7ZXhwZWN0ZWQudG9rZW5JZH0sIGJ1dCB0cmFuc2FjdGlvbiBjb250YWlucyB0b2tlbklkICR7YWN0dWFsVG9rZW5JZH0gKCR7ZXhwbGFpbmVkTmFtZX0pYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBtaXNzaW5nIHRva2VuIGluZm9ybWF0aW9uIGluIG91dHB1dHMnKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbk5hbWVzID0gcmF3Lmluc3RydWN0aW9uc0RhdGE/LnBhcmFtcz8udG9rZW5OYW1lcyB8fCBbXTtcbiAgICBpZiAodG9rZW5OYW1lcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgZXhhY3RseSAxIHRva2VuIHRvIGFzc29jaWF0ZSwgZ290ICR7dG9rZW5OYW1lcy5sZW5ndGh9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVR4SGV4QWdhaW5zdEV4cGVjdGVkKFxuICAgIHR4SGV4OiBzdHJpbmcsXG4gICAgZXhwZWN0ZWRUb2tlbjogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfSxcbiAgICBleHBlY3RlZEFjY291bnRJZDogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpKTtcbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24odHhIZXgpO1xuXG4gICAgY29uc3QgdHhCb2R5ID0gdHJhbnNhY3Rpb24udHhCb2R5O1xuICAgIGlmICghdHhCb2R5LnRva2VuQXNzb2NpYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyYW5zYWN0aW9uIGlzIG5vdCBhIFRva2VuQXNzb2NpYXRlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsQWNjb3VudElkID0gVXRpbHMuc3RyaW5naWZ5QWNjb3VudElkKHR4Qm9keS50b2tlbkFzc29jaWF0ZS5hY2NvdW50ISk7XG4gICAgY29uc3Qgbm9ybWFsaXplZEFjdHVhbCA9IFV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKGFjdHVhbEFjY291bnRJZCkuYWRkcmVzcztcbiAgICBjb25zdCBub3JtYWxpemVkRXhwZWN0ZWQgPSBVdGlscy5nZXRBZGRyZXNzRGV0YWlscyhleHBlY3RlZEFjY291bnRJZCkuYWRkcmVzcztcbiAgICBpZiAobm9ybWFsaXplZEFjdHVhbCAhPT0gbm9ybWFsaXplZEV4cGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFR4SGV4IGFjY291bnQgJHthY3R1YWxBY2NvdW50SWR9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkICR7ZXhwZWN0ZWRBY2NvdW50SWR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVG9rZW5zID0gdHhCb2R5LnRva2VuQXNzb2NpYXRlLnRva2VucyB8fCBbXTtcbiAgICBpZiAoYWN0dWFsVG9rZW5zLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeEhleCBjb250YWlucyAke2FjdHVhbFRva2Vucy5sZW5ndGh9IHRva2VucywgZXhwZWN0ZWQgZXhhY3RseSAxYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWN0dWFsVG9rZW5JZCA9IFV0aWxzLnN0cmluZ2lmeVRva2VuSWQoYWN0dWFsVG9rZW5zWzBdKTtcblxuICAgIGlmIChleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgIGlmIChhY3R1YWxUb2tlbklkICE9PSBleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeEhleCB0b2tlbklkICR7YWN0dWFsVG9rZW5JZH0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgJHtleHBlY3RlZFRva2VuLnRva2VuSWR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4cGVjdGVkVG9rZW4udG9rZW5OYW1lKSB7XG4gICAgICBjb25zdCBleHBlY3RlZFRva2VuSWQgPSBVdGlscy5nZXRIZWRlcmFUb2tlbklkRnJvbU5hbWUoZXhwZWN0ZWRUb2tlbi50b2tlbk5hbWUpO1xuICAgICAgaWYgKCFleHBlY3RlZFRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSB0b2tlbklkIGZvciBleHBlY3RlZCB0b2tlbiBuYW1lICR7ZXhwZWN0ZWRUb2tlbi50b2tlbk5hbWV9YCk7XG4gICAgICB9XG4gICAgICBpZiAoYWN0dWFsVG9rZW5JZCAhPT0gZXhwZWN0ZWRUb2tlbklkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVHhIZXggdG9rZW5JZCAke2FjdHVhbFRva2VuSWR9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHRva2VuSWQgJHtleHBlY3RlZFRva2VuSWR9IGZvciB0b2tlbiAke2V4cGVjdGVkVG9rZW4udG9rZW5OYW1lfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlQXNzb2NpYXRlSW5zdHJ1Y3Rpb25Pbmx5KHJhdzogSGVkZXJhUmF3VHJhbnNhY3Rpb25EYXRhKTogdm9pZCB7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlID0gU3RyaW5nKHJhdy5pbnN0cnVjdGlvbnNEYXRhPy50eXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgaWYgKFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udHJhY3RleGVjdXRlJyB8fFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAnY29udHJhY3RjYWxsJyB8fFxuICAgICAgaW5zdHJ1Y3Rpb25UeXBlID09PSAncHJlY29tcGlsZSdcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udHJhY3QtYmFzZWQgdG9rZW4gYXNzb2NpYXRpb24gbm90IGFsbG93ZWQgZm9yIGJsaW5kIGVuYWJsZW1lbnQ7IGdvdCAke2luc3RydWN0aW9uVHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc05hdGl2ZUFzc29jaWF0ZSA9XG4gICAgICBpbnN0cnVjdGlvblR5cGUgPT09ICd0b2tlbmFzc29jaWF0ZScgfHwgaW5zdHJ1Y3Rpb25UeXBlID09PSAnYXNzb2NpYXRlJyB8fCBpbnN0cnVjdGlvblR5cGUgPT09ICdhc3NvY2lhdGVfdG9rZW4nO1xuICAgIGlmICghaXNOYXRpdmVBc3NvY2lhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE9ubHkgbmF0aXZlIFRva2VuQXNzb2NpYXRlIGlzIGFsbG93ZWQgZm9yIGJsaW5kIGVuYWJsZW1lbnQ7IGdvdCAke2luc3RydWN0aW9uVHlwZSB8fCAndW5rbm93bid9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbihwYXJhbXM6IEhiYXJWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBhc3NldCBuYW1lIHRvIHRyYW5zZmVyIGFtb3VudCBtYXBcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSk7XG4gICAgY29uc3QgeyB0eFBhcmFtcywgdHhQcmVidWlsZCwgbWVtbywgdmVyaWZpY2F0aW9uIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZyk7XG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcHJlYnVpbGQgcHJvcGVydHkgdHhIZXgnKTtcbiAgICB9XG5cbiAgICB0cmFuc2FjdGlvbi5mcm9tUmF3VHJhbnNhY3Rpb24odHhQcmVidWlsZC50eEhleCk7XG4gICAgY29uc3QgZXhwbGFpblR4UGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zID0ge1xuICAgICAgdHhIZXg6IHR4UHJlYnVpbGQudHhIZXgsXG4gICAgICBmZWVJbmZvOiB0eFByZWJ1aWxkLmZlZUluZm8sXG4gICAgICBtZW1vOiBtZW1vLFxuICAgIH07XG4gICAgY29uc3QgZXhwbGFpbmVkVHggPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbihleHBsYWluVHhQYXJhbXMpO1xuXG4gICAgaWYgKCF0eFBhcmFtcy5yZWNpcGllbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgdHggcGFyYW1zIHByb3BlcnR5IHJlY2lwaWVudHMnKTtcbiAgICB9XG5cbiAgICBpZiAodHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJyAmJiB2ZXJpZmljYXRpb24/LnZlcmlmeVRva2VuRW5hYmxlbWVudCkge1xuICAgICAgY29uc3QgcjAgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuICAgICAgY29uc3QgZXhwZWN0ZWRUb2tlbjogeyB0b2tlbklkPzogc3RyaW5nOyB0b2tlbk5hbWU/OiBzdHJpbmcgfSA9IHt9O1xuXG4gICAgICBpZiAocjAudG9rZW5OYW1lKSB7XG4gICAgICAgIGV4cGVjdGVkVG9rZW4udG9rZW5OYW1lID0gcjAudG9rZW5OYW1lO1xuICAgICAgICBjb25zdCB0b2tlbklkID0gVXRpbHMuZ2V0SGVkZXJhVG9rZW5JZEZyb21OYW1lKHIwLnRva2VuTmFtZSk7XG4gICAgICAgIGlmICh0b2tlbklkKSB7XG4gICAgICAgICAgZXhwZWN0ZWRUb2tlbi50b2tlbklkID0gdG9rZW5JZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWV4cGVjdGVkVG9rZW4udG9rZW5OYW1lICYmICFleHBlY3RlZFRva2VuLnRva2VuSWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUb2tlbiBlbmFibGVtZW50IHJlcXVlc3QgbWlzc2luZyB0b2tlbiBpbmZvcm1hdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLnZlcmlmeVRva2VuRW5hYmxlbWVudFRyYW5zYWN0aW9uKHR4UHJlYnVpbGQudHhIZXgsIGV4cGVjdGVkVG9rZW4sIHIwLmFkZHJlc3MpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gZm9yIGVuYWJsZXRva2VuLCByZWNpcGllbnQgb3V0cHV0IGFtb3VudCBpcyAwXG4gICAgY29uc3QgcmVjaXBpZW50cyA9IHR4UGFyYW1zLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+ICh7XG4gICAgICAuLi5yZWNpcGllbnQsXG4gICAgICBhbW91bnQ6IHR4UGFyYW1zLnR5cGUgPT09ICdlbmFibGV0b2tlbicgPyAnMCcgOiByZWNpcGllbnQuYW1vdW50LFxuICAgICAgYWRkcmVzczogVXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocmVjaXBpZW50LmFkZHJlc3MpLmFkZHJlc3MsXG4gICAgfSkpO1xuICAgIGlmIChjb2luQ29uZmlnLmlzVG9rZW4pIHtcbiAgICAgIHJlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50KSA9PiB7XG4gICAgICAgIGlmIChyZWNpcGllbnQudG9rZW5OYW1lICE9PSB1bmRlZmluZWQgJiYgcmVjaXBpZW50LnRva2VuTmFtZSAhPT0gY29pbkNvbmZpZy5uYW1lKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbmNvcnJlY3QgdG9rZW4gbmFtZSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIHJlY2lwaWVudC50b2tlbk5hbWUgPSBjb2luQ29uZmlnLm5hbWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgcmVjaXBpZW50cyBmcm9tIHBhcmFtcyBhbmQgZXhwbGFpbmVkVHhcbiAgICBjb25zdCBmaWx0ZXJlZFJlY2lwaWVudHMgPSByZWNpcGllbnRzPy5tYXAoKHJlY2lwaWVudCkgPT4gXy5waWNrKHJlY2lwaWVudCwgWydhZGRyZXNzJywgJ2Ftb3VudCcsICd0b2tlbk5hbWUnXSkpO1xuICAgIGNvbnN0IGZpbHRlcmVkT3V0cHV0cyA9IGV4cGxhaW5lZFR4Lm91dHB1dHMubWFwKChvdXRwdXQpID0+IF8ucGljayhvdXRwdXQsIFsnYWRkcmVzcycsICdhbW91bnQnLCAndG9rZW5OYW1lJ10pKTtcblxuICAgIGlmICghXy5pc0VxdWFsKGZpbHRlcmVkT3V0cHV0cywgZmlsdGVyZWRSZWNpcGllbnRzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUeCBvdXRwdXRzIGRvZXMgbm90IG1hdGNoIHdpdGggZXhwZWN0ZWQgdHhQYXJhbXMgcmVjaXBpZW50cycpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIGtleWNoYWluIGFuZCBoYWxmLXNpZ24gcHJlYnVpbHQgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiBAcGFyYW0gcGFyYW1zLnR4UHJlYnVpbGQge09iamVjdH0gcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHBsYXRmb3JtXG4gICAqIEBwYXJhbSBwYXJhbXMucHJ2IHtTdHJpbmd9IHVzZXIgcHJ2XG4gICAqIEByZXR1cm5zIFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBhc3luYyBzaWduVHJhbnNhY3Rpb24ocGFyYW1zOiBIYmFyU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8U2lnbmVkVHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5nZXRCdWlsZGVyRmFjdG9yeSgpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZnJvbShwYXJhbXMudHhQcmVidWlsZC50eEhleCk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IHBhcmFtcy5wcnYgfSk7XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgaWYgKCF0cmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIG1lc3NhZ2VkIHBhc3NlZCB0byBzaWduTWVzc2FnZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgdHhIZXg6IHRyYW5zYWN0aW9uLnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgfTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uc2lnbmF0dXJlLmxlbmd0aCA+PSAyID8gcmVzcG9uc2UgOiB7IGhhbGZTaWduZWQ6IHJlc3BvbnNlIH07XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBtZXNzYWdlIHdpdGggcHJpdmF0ZSBrZXlcbiAgICpcbiAgICogQHBhcmFtIGtleVxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKiBAcmV0dXJuIHtCdWZmZXJ9IEEgc2lnbmF0dXJlIG92ZXIgdGhlIGdpdmVuIG1lc3NhZ2UgdXNpbmcgdGhlIGdpdmVuIGtleVxuICAgKi9cbiAgYXN5bmMgc2lnbk1lc3NhZ2Uoa2V5OiBLZXlQYWlyLCBtZXNzYWdlOiBzdHJpbmcgfCBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGNvbnN0IG1zZyA9IEJ1ZmZlci5pc0J1ZmZlcihtZXNzYWdlKSA/IG1lc3NhZ2UudG9TdHJpbmcoJ3V0ZjgnKSA6IG1lc3NhZ2U7XG4gICAgLy8gcmVjb25zdGl0dXRlIGtleXMgYW5kIHNpZ25cbiAgICByZXR1cm4gQnVmZmVyLmZyb20obmV3IEhiYXJLZXlQYWlyKHsgcHJ2OiBrZXkucHJ2IH0pLnNpZ25NZXNzYWdlKG1zZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R28uXG4gICAqIFdlIG5lZWQgdG8gZG8gdGhyZWUgcXVlcmllcyBkdXJpbmcgdGhpczpcbiAgICogMSkgTm9kZSBxdWVyeSAtIGhvdyBtdWNoIG1vbmV5IGlzIGluIHRoZSBhY2NvdW50XG4gICAqIDIpIEJ1aWxkIHRyYW5zYWN0aW9uIC0gYnVpbGQgb3VyIHRyYW5zYWN0aW9uIGZvciB0aGUgYW1vdW50XG4gICAqIDMpIFNlbmQgc2lnbmVkIGJ1aWxkIC0gc2VuZCBvdXIgc2lnbmVkIGJ1aWxkIHRvIGEgcHVibGljIG5vZGVcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IE9mZmxpbmVWYXVsdFR4SW5mbz4ge1xuICAgIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9XG4gICAgICAocGFyYW1zLmJhY2t1cEtleS5zdGFydHNXaXRoKFBVQkxJQ19LRVlfUFJFRklYKSAmJiBwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKFBVQkxJQ19LRVlfUFJFRklYKSkgfHxcbiAgICAgIChVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy51c2VyS2V5KSAmJiBVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy5iYWNrdXBLZXkpKTtcblxuICAgIC8vIFZhbGlkYXRlIHRoZSByb290IGFkZHJlc3NcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLnJvb3RBZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJvb3RBZGRyZXNzLCBnb3Q6ICcgKyBwYXJhbXMucm9vdEFkZHJlc3MpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24sIGdvdDogJyArIHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBub2RlSWRcbiAgICBpZiAocGFyYW1zLm5vZGVJZCAmJiAhVXRpbHMuaXNWYWxpZEFkZHJlc3MocGFyYW1zLm5vZGVJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBub2RlSWQsIGdvdDogJyArIHBhcmFtcy5ub2RlSWQpO1xuICAgIH1cblxuICAgIC8vIHZhbGlkYXRlIGZlZVxuICAgIGlmIChwYXJhbXMubWF4RmVlICYmICFVdGlscy5pc1ZhbGlkQW1vdW50KHBhcmFtcy5tYXhGZWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWF4RmVlLCBnb3Q6ICcgKyBwYXJhbXMubWF4RmVlKTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBzdGFydFRpbWVcblxuICAgIGlmIChwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICBVdGlscy52YWxpZGF0ZVN0YXJ0VGltZShwYXJhbXMuc3RhcnRUaW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwICYmICFwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0YXJ0IHRpbWUgaXMgcmVxdWlyZWQgZm9yIHVuc2lnbmVkIHN3ZWVwJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1Vuc2lnbmVkU3dlZXAgJiYgIXBhcmFtcy53YWxsZXRQYXNzcGhyYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dhbGxldFBhc3NwaHJhc2UgaXMgcmVxdWlyZWQgZm9yIG5vbi1iaXRnbyByZWNvdmVyeScpO1xuICAgIH1cblxuICAgIGxldCB1c2VyUHJ2OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGJhY2tVcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlmICghaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICB0cnkge1xuICAgICAgICB1c2VyUHJ2ID0gdGhpcy5iaXRnby5kZWNyeXB0KHsgaW5wdXQ6IHBhcmFtcy51c2VyS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICAgIGJhY2tVcCA9IHRoaXMuYml0Z28uZGVjcnlwdCh7IGlucHV0OiBwYXJhbXMuYmFja3VwS2V5LCBwYXNzd29yZDogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAndW5hYmxlIHRvIGRlY3J5cHQgdXNlcktleSBvciBiYWNrdXBLZXkgd2l0aCB0aGUgd2FsbGV0UGFzc3BocmFzZSBwcm92aWRlZCwgZ290IGVycm9yOiAnICsgZS5tZXNzYWdlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdmFsaWRhdGUgdXNlcktleSBmb3IgdW5zaWduZWQgc3dlZXBcbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwICYmICFVdGlscy5pc1ZhbGlkUHVibGljS2V5KHBhcmFtcy51c2VyS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVzZXJLZXksIGdvdDogJyArIHBhcmFtcy51c2VyS2V5KTtcbiAgICB9XG5cbiAgICAvLyB2YWxpZGF0ZSBiYWNrdXBLZXkgZm9yIHVuc2lnbmVkIHN3ZWVwXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCAmJiAhVXRpbHMuaXNWYWxpZFB1YmxpY0tleShwYXJhbXMuYmFja3VwS2V5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGJhY2t1cEtleSwgZ290OiAnICsgcGFyYW1zLmJhY2t1cEtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIG1lbW9JZCB9ID0gVXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24pO1xuICAgIGNvbnN0IG5vZGVJZCA9IHBhcmFtcy5ub2RlSWQgPyBwYXJhbXMubm9kZUlkIDogJzAuMC4zJztcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmdldEhiYXJDbGllbnQoKTtcbiAgICBjb25zdCBiYWxhbmNlID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50QmFsYW5jZShwYXJhbXMucm9vdEFkZHJlc3MsIGNsaWVudCk7XG4gICAgY29uc3QgZmVlID0gcGFyYW1zLm1heEZlZSA/IHBhcmFtcy5tYXhGZWUgOiAnMTAwMDAwMDAnOyAvLyBkZWZhdWx0IGZlZSB0byAxIGhiYXJcbiAgICBjb25zdCBuYXRpdmVCYWxhbmNlID0gSGJhclVuaXQuZnJvbVN0cmluZyhiYWxhbmNlLmhiYXJzKS50b1RpbnliYXJzKCkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBzcGVuZGFibGVBbW91bnQgPSBuZXcgQmlnTnVtYmVyKG5hdGl2ZUJhbGFuY2UpLm1pbnVzKGZlZSk7XG5cbiAgICBsZXQgdHhCdWlsZGVyO1xuICAgIGlmICghcGFyYW1zLnRva2VuSWQpIHtcbiAgICAgIGlmIChzcGVuZGFibGVBbW91bnQuaXNaZXJvKCkgfHwgc3BlbmRhYmxlQW1vdW50LmlzTmVnYXRpdmUoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBiYWxhbmNlIHRvIHJlY292ZXIsIGdvdCBiYWxhbmNlOiAke25hdGl2ZUJhbGFuY2V9IGZlZTogJHtmZWV9YCk7XG4gICAgICB9XG4gICAgICB0eEJ1aWxkZXIgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCkuZ2V0VHJhbnNmZXJCdWlsZGVyKCk7XG4gICAgICB0eEJ1aWxkZXIuc2VuZCh7IGFkZHJlc3M6IGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50OiBzcGVuZGFibGVBbW91bnQudG9TdHJpbmcoKSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNwZW5kYWJsZUFtb3VudC5pc05lZ2F0aXZlKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbnN1ZmZpY2llbnQgbmF0aXZlIGJhbGFuY2UgdG8gcmVjb3ZlciB0b2tlbnMsIGdvdCBuYXRpdmUgYmFsYW5jZTogJHtuYXRpdmVCYWxhbmNlfSBmZWU6ICR7ZmVlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRva2VuQmFsYW5jZSA9IGJhbGFuY2UudG9rZW5zLmZpbmQoKHRva2VuKSA9PiB0b2tlbi50b2tlbklkID09PSBwYXJhbXMudG9rZW5JZCk7XG4gICAgICBjb25zdCB0b2tlbiA9IFV0aWxzLmdldEhlZGVyYVRva2VuTmFtZUZyb21JZChwYXJhbXMudG9rZW5JZCk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdG9rZW46ICR7cGFyYW1zLnRva2VuSWR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRva2VuQmFsYW5jZSB8fCBuZXcgQmlnTnVtYmVyKHRva2VuQmFsYW5jZS5iYWxhbmNlKS5pc1plcm8oKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3VmZmljaWVudCBiYWxhbmNlIHRvIHJlY292ZXIgdG9rZW46ICR7cGFyYW1zLnRva2VuSWR9IGZvciBhY2NvdW50OiAke3BhcmFtcy5yb290QWRkcmVzc31gKTtcbiAgICAgIH1cbiAgICAgIHR4QnVpbGRlciA9IHRoaXMuZ2V0QnVpbGRlckZhY3RvcnkoKS5nZXRUb2tlblRyYW5zZmVyQnVpbGRlcigpO1xuICAgICAgdHhCdWlsZGVyLnNlbmQoeyBhZGRyZXNzOiBkZXN0aW5hdGlvbkFkZHJlc3MsIGFtb3VudDogdG9rZW5CYWxhbmNlLmJhbGFuY2UsIHRva2VuTmFtZTogdG9rZW4ubmFtZSB9KTtcbiAgICB9XG5cbiAgICB0eEJ1aWxkZXIubm9kZSh7IG5vZGVJZCB9KTtcbiAgICB0eEJ1aWxkZXIuZmVlKHsgZmVlIH0pO1xuICAgIHR4QnVpbGRlci5zb3VyY2UoeyBhZGRyZXNzOiBwYXJhbXMucm9vdEFkZHJlc3MgfSk7XG4gICAgdHhCdWlsZGVyLnZhbGlkRHVyYXRpb24oMTgwKTtcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICB0eEJ1aWxkZXIubWVtbyhtZW1vSWQpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc3RhcnRUaW1lKSB7XG4gICAgICB0eEJ1aWxkZXIuc3RhcnRUaW1lKFV0aWxzLm5vcm1hbGl6ZVN0YXJ0dGltZShwYXJhbXMuc3RhcnRUaW1lKSk7XG4gICAgfVxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCB0eEpzb24gPSB0eC50b0pzb24oKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4SGV4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICAgIGlkOiB0eEpzb24uaWQsXG4gICAgICAgIHN0YXJ0VGltZTogdHhKc29uLnN0YXJ0VGltZSxcbiAgICAgICAgdmFsaWREdXJhdGlvbjogdHhKc29uLnZhbGlkRHVyYXRpb24sXG4gICAgICAgIG5vZGVJZDogdHhKc29uLm5vZGUsXG4gICAgICAgIG1lbW86IHR4SnNvbi5tZW1vLFxuICAgICAgICB1c2VyS2V5OiBwYXJhbXMudXNlcktleSxcbiAgICAgICAgYmFja3VwS2V5OiBwYXJhbXMuYmFja3VwS2V5LFxuICAgICAgICBiaXRnb0tleTogcGFyYW1zLmJpdGdvS2V5LFxuICAgICAgICBtYXhGZWU6IGZlZSxcbiAgICAgICAgYWRkcmVzczogcGFyYW1zLnJvb3RBZGRyZXNzLFxuICAgICAgICByZWNpcGllbnRzOiB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cyxcbiAgICAgICAgYW1vdW50OiB0eEpzb24uYW1vdW50LFxuICAgICAgICBqc29uOiB0eEpzb24sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiB1c2VyUHJ2IH0pO1xuICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBiYWNrVXAgfSk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR4OiB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgaWQ6IHR4LnRvSnNvbigpLmlkLFxuICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgc3RhcnRUaW1lOiB0eC50b0pzb24oKS5zdGFydFRpbWUsXG4gICAgICBub2RlSWQ6IHR4LnRvSnNvbigpLm5vZGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluIGEgSGVkZXJhIHRyYW5zYWN0aW9uIGZyb20gdHhIZXhcbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKi9cbiAgYXN5bmMgZXhwbGFpblRyYW5zYWN0aW9uKHBhcmFtczogRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGNvbnN0IHR4SGV4ID0gcGFyYW1zLnR4SGV4IHx8IChwYXJhbXMuaGFsZlNpZ25lZCAmJiBwYXJhbXMuaGFsZlNpZ25lZC50eEhleCk7XG4gICAgaWYgKCF0eEhleCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIGV4cGxhaW4gdHggcGFyYW1ldGVycycpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmdldEJ1aWxkZXJGYWN0b3J5KCk7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKHR4SGV4KTtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHR4SnNvbiA9IHR4LnRvSnNvbigpO1xuXG4gICAgbGV0IG91dHB1dEFtb3VudCA9IG5ldyBCaWdOdW1iZXIoMCk7XG4gICAgY29uc3Qgb3V0cHV0czogeyBhZGRyZXNzOiBzdHJpbmc7IGFtb3VudDogc3RyaW5nOyBtZW1vOiBzdHJpbmc7IHRva2VuTmFtZT86IHN0cmluZyB9W10gPSBbXTtcbiAgICAvLyBUT0RPKEJHLTI0ODA5KTogZ2V0IHRoZSBtZW1vIGZyb20gdGhlIHRvSnNvblxuICAgIGxldCBtZW1vID0gJyc7XG4gICAgaWYgKHBhcmFtcy5tZW1vKSB7XG4gICAgICBtZW1vID0gcGFyYW1zLm1lbW8udmFsdWU7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS50eXBlKSB7XG4gICAgICBjYXNlICdjcnlwdG9UcmFuc2Zlcic6XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMucmVjaXBpZW50cyB8fCBbXTtcbiAgICAgICAgcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXJlY2lwaWVudC50b2tlbk5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRva2VuIHRyYW5zZmVyIGRvZXNuJ3QgY2hhbmdlIG91dHB1dEFtb3VudFxuICAgICAgICAgICAgb3V0cHV0QW1vdW50ID0gb3V0cHV0QW1vdW50LnBsdXMocmVjaXBpZW50LmFtb3VudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dHMucHVzaCh7XG4gICAgICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgICAgICAgIGFtb3VudDogcmVjaXBpZW50LmFtb3VudC50b1N0cmluZygpLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIC4uLihyZWNpcGllbnQudG9rZW5OYW1lICYmIHtcbiAgICAgICAgICAgICAgdG9rZW5OYW1lOiByZWNpcGllbnQudG9rZW5OYW1lLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAndG9rZW5Bc3NvY2lhdGUnOlxuICAgICAgICBjb25zdCB0b2tlbnMgPSB0eEpzb24uaW5zdHJ1Y3Rpb25zRGF0YS5wYXJhbXMudG9rZW5OYW1lcyB8fCBbXTtcbiAgICAgICAgY29uc3QgYWNjb3VudElkID0gdHhKc29uLmluc3RydWN0aW9uc0RhdGEucGFyYW1zLmFjY291bnRJZDtcbiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFjY291bnRJZCxcbiAgICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgICAgbWVtbyxcbiAgICAgICAgICAgIHRva2VuTmFtZTogdG9rZW4sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY3J5cHRvVXBkYXRlQWNjb3VudCc6XG4gICAgICAgIGNvbnN0IHVwZGF0ZVBhcmFtcyA9IHR4SnNvbi5pbnN0cnVjdGlvbnNEYXRhLnBhcmFtcztcbiAgICAgICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBhZGRyZXNzOiB1cGRhdGVQYXJhbXMuYWNjb3VudElkLFxuICAgICAgICAgIGFtb3VudDogJzAnLFxuICAgICAgICAgIG1lbW8sXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmFuc2FjdGlvbiBmb3JtYXQgb3V0c2lkZSBvZiBjcnlwdG9UcmFuc2ZlciBub3Qgc3VwcG9ydGVkIGZvciBleHBsYW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbXG4gICAgICAnaWQnLFxuICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICdvdXRwdXRzJyxcbiAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICdmZWUnLFxuICAgICAgJ3RpbWVzdGFtcCcsXG4gICAgICAnZXhwaXJhdGlvbicsXG4gICAgICAnbWVtbycsXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIG91dHB1dEFtb3VudDogb3V0cHV0QW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSwgLy8gYWNjb3VudCBiYXNlZCBkb2VzIG5vdCB1c2UgY2hhbmdlIG91dHB1dHNcbiAgICAgIGNoYW5nZUFtb3VudDogJzAnLCAvLyBhY2NvdW50IGJhc2UgZG9lcyBub3QgbWFrZSBjaGFuZ2VcbiAgICAgIGZlZTogcGFyYW1zLmZlZUluZm8/LmZlZSB8fCB0eEpzb24uZmVlLCAvLyBpbiB0aGUgaW5zdGFuY2Ugbm8gZmVlSW5mbyBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbSwgc2hvdyB0aGUgZmVlIGdpdmVuIGJ5IHRoZSB0eEpTT05cbiAgICAgIHRpbWVzdGFtcDogdHhKc29uLnN0YXJ0VGltZSxcbiAgICAgIGV4cGlyYXRpb246IHR4SnNvbi52YWxpZER1cmF0aW9uLFxuICAgIH0gYXMgYW55O1xuICB9XG5cbiAgaXNTdGVsbGFyU2VlZChzZWVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gU2VlZFZhbGlkYXRvci5pc1ZhbGlkRWQyNTUxOVNlZWRGb3JDb2luKHNlZWQsIENvaW5GYW1pbHkuWExNKTtcbiAgfVxuXG4gIGNvbnZlcnRGcm9tU3RlbGxhclNlZWQoc2VlZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gYXNzdW1lIHRoaXMgaXMgYSB0cnVzdCBjdXN0b2RpYWwgc2VlZCBpZiBpdHMgYSB2YWxpZCBlZDI1NTE5IHBydlxuICAgIGlmICghdGhpcy5pc1N0ZWxsYXJTZWVkKHNlZWQpIHx8IFNlZWRWYWxpZGF0b3IuaGFzQ29tcGV0aW5nU2VlZEZvcm1hdHMoc2VlZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChTZWVkVmFsaWRhdG9yLmlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZCwgQ29pbkZhbWlseS5YTE0pKSB7XG4gICAgICBjb25zdCBrZXlGcm9tU2VlZCA9IG5ldyBIYmFyS2V5UGFpcih7IHNlZWQ6IHN0ZWxsYXIuU3RyS2V5LmRlY29kZUVkMjU1MTlTZWNyZXRTZWVkKHNlZWQpIH0pO1xuICAgICAgY29uc3Qga2V5cyA9IGtleUZyb21TZWVkLmdldEtleXMoKTtcbiAgICAgIGlmIChrZXlzICE9PSB1bmRlZmluZWQgJiYga2V5cy5wcnYpIHtcbiAgICAgICAgcmV0dXJuIGtleXMucHJ2O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBVdGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICBzdXBwb3J0c0Rlcml2ZUtleVdpdGhTZWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBpbmhlcml0ZWQgZG9jICovXG4gIGdldERlZmF1bHRNdWx0aXNpZ1R5cGUoKTogTXVsdGlzaWdUeXBlIHtcbiAgICByZXR1cm4gbXVsdGlzaWdUeXBlcy5vbmNoYWluO1xuICB9XG5cbiAgcHVibGljIGdldFRva2VuRW5hYmxlbWVudENvbmZpZygpOiBUb2tlbkVuYWJsZW1lbnRDb25maWcge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1aXJlc1Rva2VuRW5hYmxlbWVudDogdHJ1ZSxcbiAgICAgIHN1cHBvcnRzTXVsdGlwbGVUb2tlbkVuYWJsZW1lbnRzOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkZXJGYWN0b3J5KCk6IFRyYW5zYWN0aW9uQnVpbGRlckZhY3Rvcnkge1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEhiYXJDbGllbnQoKTogQ2xpZW50IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmJpdGdvLmdldEVudigpID09PSAncHJvZCcgPyBDbGllbnQuZm9yTWFpbm5ldCgpIDogQ2xpZW50LmZvclRlc3RuZXQoKTtcbiAgICByZXR1cm4gY2xpZW50O1xuICB9XG5cbiAgYXN5bmMgZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkOiBzdHJpbmcsIGNsaWVudDogQ2xpZW50KTogUHJvbWlzZTxBY2NvdW50QmFsYW5jZUpzb24+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFsYW5jZSA9IGF3YWl0IG5ldyBBY2NvdW50QmFsYW5jZVF1ZXJ5KCkuc2V0QWNjb3VudElkKGFjY291bnRJZCkuZXhlY3V0ZShjbGllbnQpO1xuXG4gICAgICByZXR1cm4gYmFsYW5jZS50b0pTT04oKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgYWNjb3VudCBiYWxhbmNlLCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnJvYWRjYXN0VHJhbnNhY3Rpb24oe1xuICAgIHNlcmlhbGl6ZWRTaWduZWRUcmFuc2FjdGlvbixcbiAgICBzdGFydFRpbWUsXG4gIH06IEJyb2FkY2FzdFRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8QnJvYWRjYXN0VHJhbnNhY3Rpb25SZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaGJhclR4ID0gSGJhclRyYW5zYWN0aW9uLmZyb21CeXRlcyhVdGlscy50b1VpbnQ4QXJyYXkoc2VyaWFsaXplZFNpZ25lZFRyYW5zYWN0aW9uKSk7XG5cbiAgICAgIGlmIChzdGFydFRpbWUpIHtcbiAgICAgICAgVXRpbHMuaXNWYWxpZFRpbWVTdHJpbmcoc3RhcnRUaW1lKTtcbiAgICAgICAgd2hpbGUgKCFVdGlscy5zaG91bGRCcm9hZGNhc3ROb3coc3RhcnRUaW1lKSkge1xuICAgICAgICAgIGF3YWl0IFV0aWxzLnNsZWVwKDEwMDApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNsaWVudEJyb2FkY2FzdFRyYW5zYWN0aW9uKGhiYXJUeCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gYnJvYWRjYXN0IHRyYW5zYWN0aW9uLCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2xpZW50QnJvYWRjYXN0VHJhbnNhY3Rpb24oaGJhclR4OiBIYmFyVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLmdldEhiYXJDbGllbnQoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblJlc3BvbnNlID0gYXdhaXQgaGJhclR4LmV4ZWN1dGUoY2xpZW50KTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblJlY2VpcHQgPSBhd2FpdCB0cmFuc2FjdGlvblJlc3BvbnNlLmdldFJlY2VpcHQoY2xpZW50KTtcblxuICAgIHJldHVybiB7IHR4SWQ6IHRyYW5zYWN0aW9uUmVzcG9uc2UudHJhbnNhY3Rpb25JZC50b1N0cmluZygpLCBzdGF0dXM6IHRyYW5zYWN0aW9uUmVjZWlwdC5zdGF0dXMudG9TdHJpbmcoKSB9O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIGF1ZGl0RGVjcnlwdGVkS2V5KHsgcHJ2LCBwdWJsaWNLZXksIG11bHRpU2lnVHlwZSB9OiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIGlmIChtdWx0aVNpZ1R5cGUgPT09ICd0c3MnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG11bHRpU2lnVHlwZScpO1xuICAgIH1cblxuICAgIGxldCBoYmFyS2V5UGFpcjtcblxuICAgIHRyeSB7XG4gICAgICBoYmFyS2V5UGFpciA9IG5ldyBIYmFyS2V5UGFpcih7IHBydiB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJpdmF0ZSBrZXk6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBjb25zdCBnZW5QdWJLZXkgPSBoYmFyS2V5UGFpci5nZXRLZXlzKCkucHViO1xuICAgIGlmIChwdWJsaWNLZXkgJiYgcHVibGljS2V5ICE9PSBnZW5QdWJLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBwdWJsaWMga2V5Jyk7XG4gICAgfVxuICB9XG59XG4iXX0=