@bitgo-beta/sdk-coin-iota 1.0.1-beta.324 → 1.0.1-beta.325

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 (42) hide show
  1. package/dist/src/iota.d.ts +123 -27
  2. package/dist/src/iota.d.ts.map +1 -1
  3. package/dist/src/iota.js +217 -103
  4. package/dist/src/lib/constants.d.ts +50 -1
  5. package/dist/src/lib/constants.d.ts.map +1 -1
  6. package/dist/src/lib/constants.js +68 -4
  7. package/dist/src/lib/iface.d.ts +141 -1
  8. package/dist/src/lib/iface.d.ts.map +1 -1
  9. package/dist/src/lib/iface.js +1 -1
  10. package/dist/src/lib/keyPair.d.ts +100 -6
  11. package/dist/src/lib/keyPair.d.ts.map +1 -1
  12. package/dist/src/lib/keyPair.js +103 -10
  13. package/dist/src/lib/transaction.d.ts +117 -14
  14. package/dist/src/lib/transaction.d.ts.map +1 -1
  15. package/dist/src/lib/transaction.js +190 -67
  16. package/dist/src/lib/transactionBuilder.d.ts +73 -34
  17. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  18. package/dist/src/lib/transactionBuilder.js +90 -45
  19. package/dist/src/lib/transactionBuilderFactory.d.ts +89 -6
  20. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  21. package/dist/src/lib/transactionBuilderFactory.js +103 -16
  22. package/dist/src/lib/transferBuilder.d.ts +43 -0
  23. package/dist/src/lib/transferBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/transferBuilder.js +50 -5
  25. package/dist/src/lib/transferTransaction.d.ts +93 -2
  26. package/dist/src/lib/transferTransaction.d.ts.map +1 -1
  27. package/dist/src/lib/transferTransaction.js +180 -51
  28. package/dist/src/lib/utils.d.ts +107 -8
  29. package/dist/src/lib/utils.d.ts.map +1 -1
  30. package/dist/src/lib/utils.js +134 -23
  31. package/dist/test/unit/helpers/testHelpers.d.ts +57 -0
  32. package/dist/test/unit/helpers/testHelpers.d.ts.map +1 -0
  33. package/dist/test/unit/helpers/testHelpers.js +176 -0
  34. package/dist/test/unit/iota.js +47 -152
  35. package/dist/test/unit/keyPair.js +34 -61
  36. package/dist/test/unit/transactionBuilder/transactionBuilder.js +137 -255
  37. package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +43 -108
  38. package/dist/test/unit/transactionBuilder/transferBuilder.js +296 -762
  39. package/dist/test/unit/transferTransaction.js +106 -353
  40. package/dist/test/unit/utils.js +171 -197
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +7 -7
@@ -68,12 +68,33 @@ class TransferTransaction extends transaction_1.Transaction {
68
68
  this.paymentObjects = txData.paymentObjects;
69
69
  this.updateIsSimulateTx();
70
70
  }
71
+ /**
72
+ * Parses a transfer transaction from its broadcast format (base64 or raw bytes).
73
+ * Extracts recipients, amounts, and payment objects from the transaction data.
74
+ */
71
75
  parseFromBroadcastTx(tx) {
72
76
  const txData = transactions_1.Transaction.from(tx).getData();
73
- if (txData.commands.filter((command) => !constants_1.TRANSFER_TRANSACTION_COMMANDS.includes(command.$kind)).length > 0) {
77
+ this.validateTransferCommands(txData);
78
+ super.parseFromBroadcastTx(tx);
79
+ const { inputObjects, amounts, receivers } = this.parseTransactionInputs(txData);
80
+ this.validateAmountsMatchReceivers(amounts, receivers);
81
+ this.assignParsedObjects(inputObjects);
82
+ this.assignRecipients(receivers, amounts);
83
+ this.updateIsSimulateTx();
84
+ }
85
+ /**
86
+ * Validates that the transaction only contains supported transfer commands.
87
+ */
88
+ validateTransferCommands(txData) {
89
+ const hasUnsupportedCommands = txData.commands.some((command) => !constants_1.TRANSFER_TRANSACTION_COMMANDS.includes(command.$kind));
90
+ if (hasUnsupportedCommands) {
74
91
  throw new sdk_core_1.InvalidTransactionError('Unsupported commands in the transaction');
75
92
  }
76
- super.parseFromBroadcastTx(tx);
93
+ }
94
+ /**
95
+ * Parses transaction inputs to extract objects, amounts, and receiver addresses.
96
+ */
97
+ parseTransactionInputs(txData) {
77
98
  const inputObjects = [];
78
99
  const amounts = [];
79
100
  const receivers = [];
@@ -92,59 +113,120 @@ class TransferTransaction extends transaction_1.Transaction {
92
113
  }
93
114
  }
94
115
  });
116
+ return { inputObjects, amounts, receivers };
117
+ }
118
+ /**
119
+ * Validates that the number of amounts matches the number of receivers.
120
+ */
121
+ validateAmountsMatchReceivers(amounts, receivers) {
95
122
  if (amounts.length !== receivers.length) {
96
- throw new sdk_core_1.InvalidTransactionError('count of amounts does not match count of receivers');
123
+ throw new sdk_core_1.InvalidTransactionError('Count of amounts does not match count of receivers');
97
124
  }
98
- if ((!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) &&
99
- (!this.gasSponsor || this.sender === this.gasSponsor)) {
125
+ }
126
+ /**
127
+ * Assigns parsed input objects to either gas payment objects or payment objects.
128
+ * If no gas objects exist and sender pays own gas, objects become gas objects.
129
+ * Otherwise, they become payment objects.
130
+ */
131
+ assignParsedObjects(inputObjects) {
132
+ if (inputObjects.length === 0) {
133
+ return;
134
+ }
135
+ const noGasObjectsExist = !this.gasPaymentObjects || this.gasPaymentObjects.length === 0;
136
+ const senderPaysOwnGas = !this.gasSponsor || this.sender === this.gasSponsor;
137
+ if (noGasObjectsExist && senderPaysOwnGas) {
100
138
  this.gasPaymentObjects = inputObjects;
101
139
  }
102
- else if (inputObjects.length > 0) {
140
+ else {
103
141
  this._paymentObjects = inputObjects;
104
142
  }
105
- this.recipients = [];
106
- receivers.forEach((recipient, index) => {
107
- this._recipients.push({
108
- address: recipient,
109
- amount: amounts[index],
110
- });
111
- });
112
- this.updateIsSimulateTx();
143
+ }
144
+ /**
145
+ * Creates and assigns recipients from parsed addresses and amounts.
146
+ */
147
+ assignRecipients(receivers, amounts) {
148
+ this._recipients = receivers.map((address, index) => ({
149
+ address,
150
+ amount: amounts[index],
151
+ }));
113
152
  }
114
153
  messageWithIntent(message) {
115
154
  return (0, cryptography_1.messageWithIntent)('TransactionData', message);
116
155
  }
156
+ /**
157
+ * Populates the IOTA transaction with inputs and commands for the transfer.
158
+ * This determines which objects to use for payment (either payment objects or gas objects),
159
+ * consolidates them into a single coin, and then splits/transfers to recipients.
160
+ */
117
161
  populateTxInputsAndCommands() {
118
- const consolidatedCoin = this.shouldUseGasObjectsForPayment()
119
- ? this.consolidateGasObjects()
120
- : this.consolidatePaymentObjects();
121
- this.splitAndTransferToRecipients(consolidatedCoin);
162
+ const sourceCoin = this.getConsolidatedSourceCoin();
163
+ this.splitAndTransferToRecipients(sourceCoin);
122
164
  }
123
- shouldUseGasObjectsForPayment() {
124
- const paymentObjectExists = this.paymentObjects && this.paymentObjects.length > 0;
165
+ /**
166
+ * Determines which objects to use as the payment source and consolidates them.
167
+ * If payment objects are provided, use those. Otherwise, if the sender is paying
168
+ * their own gas, use the gas objects for payment.
169
+ */
170
+ getConsolidatedSourceCoin() {
171
+ if (this.hasPaymentObjects()) {
172
+ return this.consolidatePaymentObjects();
173
+ }
174
+ return this.consolidateGasObjects();
175
+ }
176
+ /**
177
+ * Checks if payment objects exist and if gas objects should be used instead.
178
+ * Gas objects are used when: no payment objects exist AND sender pays their own gas.
179
+ */
180
+ hasPaymentObjects() {
181
+ const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
182
+ if (hasPaymentObjects) {
183
+ return true;
184
+ }
185
+ // If no payment objects, only use gas objects if sender pays own gas
125
186
  const senderPaysOwnGas = !this.gasSponsor || this.gasSponsor === this.sender;
126
- return !paymentObjectExists && senderPaysOwnGas && Boolean(this.gasPaymentObjects);
187
+ return !senderPaysOwnGas;
127
188
  }
189
+ /**
190
+ * Consolidates payment objects into a single coin object.
191
+ * If multiple payment objects exist, they are merged in batches.
192
+ */
128
193
  consolidatePaymentObjects() {
129
194
  if (!this.paymentObjects || this.paymentObjects.length === 0) {
130
195
  throw new sdk_core_1.InvalidTransactionError('Payment objects are required');
131
196
  }
132
197
  const firstObject = this._iotaTransaction.object(transactions_1.Inputs.ObjectRef(this.paymentObjects[0]));
198
+ // Single object doesn't need consolidation
133
199
  if (this.paymentObjects.length === 1) {
134
200
  return firstObject;
135
201
  }
202
+ // Merge remaining objects into the first one
136
203
  return this.mergeObjectsInBatches(firstObject, this.paymentObjects.slice(1), constants_1.MAX_INPUT_OBJECTS);
137
204
  }
205
+ /**
206
+ * Consolidates gas payment objects into a single coin object.
207
+ * If the number of gas objects exceeds the maximum, they are merged in batches.
208
+ */
138
209
  consolidateGasObjects() {
139
210
  if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
140
211
  throw new sdk_core_1.InvalidTransactionError('Gas payment objects are required');
141
212
  }
142
213
  const gasObject = this._iotaTransaction.gas;
214
+ // If within the limit, no consolidation needed
143
215
  if (this.gasPaymentObjects.length <= constants_1.MAX_GAS_PAYMENT_OBJECTS) {
144
216
  return gasObject;
145
217
  }
218
+ // Merge excess gas objects to stay within limits
146
219
  return this.mergeObjectsInBatches(gasObject, this.gasPaymentObjects, constants_1.MAX_INPUT_OBJECTS);
147
220
  }
221
+ /**
222
+ * Merges multiple coin objects into a target coin in batches.
223
+ * This is necessary because IOTA has limits on the number of objects per merge command.
224
+ *
225
+ * @param targetCoin - The coin to merge into
226
+ * @param objectsToMerge - Array of objects to merge
227
+ * @param batchSize - Maximum number of objects to merge per batch
228
+ * @returns The consolidated coin object
229
+ */
148
230
  mergeObjectsInBatches(targetCoin, objectsToMerge, batchSize) {
149
231
  let consolidatedCoin = targetCoin;
150
232
  for (let startIndex = 0; startIndex < objectsToMerge.length; startIndex += batchSize) {
@@ -154,6 +236,11 @@ class TransferTransaction extends transaction_1.Transaction {
154
236
  }
155
237
  return consolidatedCoin;
156
238
  }
239
+ /**
240
+ * Splits the source coin into the amounts needed for each recipient and transfers them.
241
+ * This creates split coin commands for all recipient amounts, then transfer commands
242
+ * to send each split coin to the corresponding recipient.
243
+ */
157
244
  splitAndTransferToRecipients(sourceCoin) {
158
245
  const recipientAmounts = this._recipients.map((recipient) => recipient.amount);
159
246
  const splitCoins = this._iotaTransaction.splitCoins(sourceCoin, recipientAmounts);
@@ -161,55 +248,97 @@ class TransferTransaction extends transaction_1.Transaction {
161
248
  this._iotaTransaction.transferObjects([splitCoins[index]], recipient.address);
162
249
  });
163
250
  }
251
+ /**
252
+ * Validates all transfer transaction data before building.
253
+ * Checks recipients, payment objects, and ensures no duplicate object IDs.
254
+ */
164
255
  validateTxDataImplementation() {
165
- if (!this.recipients || this.recipients?.length === 0) {
256
+ this.validateRecipientsList();
257
+ this.validatePaymentObjectsExist();
258
+ this.validateNoDuplicateObjects();
259
+ }
260
+ /**
261
+ * Validates that recipients exist and don't exceed the maximum allowed.
262
+ */
263
+ validateRecipientsList() {
264
+ if (!this.recipients || this.recipients.length === 0) {
166
265
  throw new sdk_core_1.InvalidTransactionError('Transaction recipients are required');
167
266
  }
168
267
  if (this.recipients.length > constants_1.MAX_RECIPIENTS) {
169
268
  throw new sdk_core_1.InvalidTransactionError(`Recipients count (${this.recipients.length}) exceeds maximum allowed (${constants_1.MAX_RECIPIENTS})`);
170
269
  }
171
- if (!this.paymentObjects || this.paymentObjects?.length === 0) {
172
- if (!this.gasSponsor || this.gasSponsor === this.sender) {
173
- if (!this.gasPaymentObjects || this.gasPaymentObjects?.length === 0) {
174
- throw new sdk_core_1.InvalidTransactionError('Payment or Gas objects are required');
175
- }
176
- }
177
- else {
178
- throw new sdk_core_1.InvalidTransactionError('Payment objects are required');
179
- }
270
+ }
271
+ /**
272
+ * Validates that either payment objects or gas objects exist for funding the transfer.
273
+ * When a gas sponsor is used, payment objects are required.
274
+ * Otherwise, either payment objects or gas objects can be used.
275
+ */
276
+ validatePaymentObjectsExist() {
277
+ const hasPaymentObjects = this.paymentObjects && this.paymentObjects.length > 0;
278
+ if (hasPaymentObjects) {
279
+ return; // Payment objects exist, validation passes
180
280
  }
181
- // Check for duplicate object IDs in payment objects
281
+ // No payment objects - check if gas objects can be used instead
282
+ const hasGasSponsor = this.gasSponsor && this.gasSponsor !== this.sender;
283
+ if (hasGasSponsor) {
284
+ throw new sdk_core_1.InvalidTransactionError('Payment objects are required when using a gas sponsor');
285
+ }
286
+ // No gas sponsor - gas objects must exist
287
+ const hasGasObjects = this.gasPaymentObjects && this.gasPaymentObjects.length > 0;
288
+ if (!hasGasObjects) {
289
+ throw new sdk_core_1.InvalidTransactionError('Payment or Gas objects are required');
290
+ }
291
+ }
292
+ /**
293
+ * Validates that there are no duplicate object IDs within payment objects,
294
+ * gas payment objects, or between the two groups.
295
+ */
296
+ validateNoDuplicateObjects() {
182
297
  const paymentObjectIds = this.paymentObjects?.map((obj) => obj.objectId) ?? [];
183
- const uniquePaymentIds = new Set(paymentObjectIds);
184
- if (uniquePaymentIds.size !== paymentObjectIds.length) {
185
- throw new sdk_core_1.InvalidTransactionError('Duplicate object IDs found in payment objects');
186
- }
187
- if (this.gasPaymentObjects && this.gasPaymentObjects.length > 0) {
188
- const gasObjectIds = this.gasPaymentObjects.map((gas) => gas.objectId);
189
- // Check for duplicate object IDs in gas payment objects
190
- const uniqueGasIds = new Set(gasObjectIds);
191
- if (uniqueGasIds.size !== gasObjectIds.length) {
192
- throw new sdk_core_1.InvalidTransactionError('Duplicate object IDs found in gas payment objects');
193
- }
194
- const duplicates = paymentObjectIds.filter((payment) => gasObjectIds.includes(payment));
195
- if (duplicates.length > 0) {
196
- throw new sdk_core_1.InvalidTransactionError('Payment objects cannot be the same as gas payment objects: ' + duplicates.join(', '));
197
- }
298
+ // Check for duplicates within payment objects
299
+ this.checkForDuplicateIds(paymentObjectIds, 'payment objects');
300
+ if (!this.gasPaymentObjects || this.gasPaymentObjects.length === 0) {
301
+ return;
302
+ }
303
+ const gasObjectIds = this.gasPaymentObjects.map((gas) => gas.objectId);
304
+ // Check for duplicates within gas payment objects
305
+ this.checkForDuplicateIds(gasObjectIds, 'gas payment objects');
306
+ // Check for overlaps between payment and gas objects
307
+ const overlappingIds = paymentObjectIds.filter((id) => gasObjectIds.includes(id));
308
+ if (overlappingIds.length > 0) {
309
+ throw new sdk_core_1.InvalidTransactionError('Payment objects cannot be the same as gas payment objects: ' + overlappingIds.join(', '));
310
+ }
311
+ }
312
+ /**
313
+ * Helper to check for duplicate IDs in an array.
314
+ */
315
+ checkForDuplicateIds(ids, objectType) {
316
+ const uniqueIds = new Set(ids);
317
+ if (uniqueIds.size !== ids.length) {
318
+ throw new sdk_core_1.InvalidTransactionError(`Duplicate object IDs found in ${objectType}`);
198
319
  }
199
320
  }
200
321
  /**
201
322
  * @inheritDoc
323
+ * Provides a human-readable explanation of the transfer transaction.
202
324
  */
203
- explainTransactionImplementation(json, explanationResult) {
325
+ explainTransactionImplementation(_json, explanationResult) {
204
326
  const outputs = this.recipients.map((recipient) => recipient);
205
- const outputAmountBN = this.recipients.reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0));
206
- const outputAmount = outputAmountBN.toString();
327
+ const outputAmount = this.calculateTotalOutputAmount();
207
328
  return {
208
329
  ...explanationResult,
209
330
  outputAmount,
210
331
  outputs,
211
332
  };
212
333
  }
334
+ /**
335
+ * Calculates the total amount being transferred to all recipients.
336
+ */
337
+ calculateTotalOutputAmount() {
338
+ return this.recipients
339
+ .reduce((accumulator, current) => accumulator.plus(current.amount), new bignumber_js_1.default(0))
340
+ .toString();
341
+ }
213
342
  }
214
343
  exports.TransferTransaction = TransferTransaction;
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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LE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4RixJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzFCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FDL0IsNkRBQTZELEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FDdEYsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ08sZ0NBQWdDLENBQ3hDLElBQVksRUFDWixpQkFBeUM7UUFFekMsTUFBTSxPQUFPLEdBQTJCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FDM0MsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFDMUQsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUNqQixDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRS9DLE9BQU87WUFDTCxHQUFHLGlCQUFpQjtZQUNwQixZQUFZO1lBQ1osT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2UEQsa0RBdVBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIHRvSGV4LCBUcmFuc2FjdGlvblJlY2lwaWVudCwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFRyYW5zYWN0aW9uT2JqZWN0SW5wdXQsIFRyYW5zZmVyVHhEYXRhLCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7XG4gIElucHV0cyBhcyBJb3RhSW5wdXRzLFxuICBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50LFxuICBUcmFuc2FjdGlvbiBhcyBJb3RhVHJhbnNhY3Rpb24sXG59IGZyb20gJ0Bpb3RhL2lvdGEtc2RrL3RyYW5zYWN0aW9ucyc7XG5pbXBvcnQgeyBmcm9tQmFzZTY0IH0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdXRpbHMnO1xuaW1wb3J0IHsgbWVzc2FnZVdpdGhJbnRlbnQgYXMgaW90YU1lc3NhZ2VXaXRoSW50ZW50IH0gZnJvbSAnQGlvdGEvaW90YS1zZGsvY3J5cHRvZ3JhcGh5JztcbmltcG9ydCB7IEJjc1JlYWRlciB9IGZyb20gJ0Bpb3RhL2Jjcyc7XG5pbXBvcnQgeyBNQVhfR0FTX1BBWU1FTlRfT0JKRUNUUywgTUFYX0lOUFVUX09CSkVDVFMsIE1BWF9SRUNJUElFTlRTLCBUUkFOU0ZFUl9UUkFOU0FDVElPTl9DT01NQU5EUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zZmVyVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgX3JlY2lwaWVudHM6IFRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gIHByaXZhdGUgX3BheW1lbnRPYmplY3RzPzogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHlwZSA9IFRyYW5zYWN0aW9uVHlwZS5TZW5kO1xuICAgIHRoaXMuX2lucHV0cyA9IFtdO1xuICAgIHRoaXMuX291dHB1dHMgPSBbXTtcbiAgfVxuXG4gIGdldCByZWNpcGllbnRzKCk6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10ge1xuICAgIHJldHVybiB0aGlzLl9yZWNpcGllbnRzO1xuICB9XG5cbiAgc2V0IHJlY2lwaWVudHModmFsdWU6IFRyYW5zYWN0aW9uUmVjaXBpZW50W10pIHtcbiAgICB0aGlzLl9yZWNpcGllbnRzID0gdmFsdWU7XG4gICAgdGhpcy5fcmVidWlsZFJlcXVpcmVkID0gdHJ1ZTtcbiAgfVxuXG4gIGdldCBwYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9wYXltZW50T2JqZWN0cztcbiAgfVxuXG4gIHNldCBwYXltZW50T2JqZWN0cyh2YWx1ZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9yZWJ1aWxkUmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBhZGRJbnB1dHNBbmRPdXRwdXRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5faW90YVRyYW5zYWN0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsQW1vdW50ID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnQpID0+IGFjY3VtdWxhdG9yICsgTnVtYmVyKGN1cnJlbnQuYW1vdW50KSwgMCk7XG4gICAgdGhpcy5fb3V0cHV0cyA9IHRoaXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCwgaW5kZXgpID0+ICh7XG4gICAgICBhZGRyZXNzOiByZWNpcGllbnQuYWRkcmVzcyxcbiAgICAgIHZhbHVlOiByZWNpcGllbnQuYW1vdW50LnRvU3RyaW5nKCksXG4gICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgfSkpO1xuICAgIHRoaXMuX2lucHV0cyA9IFtcbiAgICAgIHtcbiAgICAgICAgYWRkcmVzczogdGhpcy5zZW5kZXIsXG4gICAgICAgIHZhbHVlOiB0b3RhbEFtb3VudC50b1N0cmluZygpLFxuICAgICAgICBjb2luOiB0aGlzLl9jb2luQ29uZmlnLm5hbWUsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICB0b0pzb24oKTogVHJhbnNmZXJUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0pzb24oKSxcbiAgICAgIHJlY2lwaWVudHM6IHRoaXMucmVjaXBpZW50cyxcbiAgICAgIHBheW1lbnRPYmplY3RzOiB0aGlzLnBheW1lbnRPYmplY3RzLFxuICAgIH07XG4gIH1cblxuICBwYXJzZUZyb21KU09OKHR4RGF0YTogVHJhbnNmZXJUeERhdGEpOiB2b2lkIHtcbiAgICBzdXBlci5wYXJzZUZyb21KU09OKHR4RGF0YSk7XG4gICAgdGhpcy5yZWNpcGllbnRzID0gdHhEYXRhLnJlY2lwaWVudHM7XG4gICAgdGhpcy5wYXltZW50T2JqZWN0cyA9IHR4RGF0YS5wYXltZW50T2JqZWN0cztcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcGFyc2VGcm9tQnJvYWRjYXN0VHgodHg6IHN0cmluZyB8IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgICBjb25zdCB0eERhdGEgPSBJb3RhVHJhbnNhY3Rpb24uZnJvbSh0eCkuZ2V0RGF0YSgpO1xuICAgIGlmICh0eERhdGEuY29tbWFuZHMuZmlsdGVyKChjb21tYW5kKSA9PiAhVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZC4ka2luZCkpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgY29tbWFuZHMgaW4gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHN1cGVyLnBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4KTtcbiAgICBjb25zdCBpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSA9IFtdO1xuICAgIGNvbnN0IGFtb3VudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgcmVjZWl2ZXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ09iamVjdCcgJiYgJ0ltbU9yT3duZWRPYmplY3QnIGluIGlucHV0Lk9iamVjdCkge1xuICAgICAgICBpbnB1dE9iamVjdHMucHVzaChpbnB1dC5PYmplY3QuSW1tT3JPd25lZE9iamVjdCBhcyBUcmFuc2FjdGlvbk9iamVjdElucHV0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ1B1cmUnICYmICdieXRlcycgaW4gaW5wdXQuUHVyZSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGZyb21CYXNlNjQoaW5wdXQuUHVyZS5ieXRlcyk7XG4gICAgICAgIGNvbnN0IGhleFZhbHVlID0gJzB4JyArIHRvSGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKHV0aWxzLmlzVmFsaWRBZGRyZXNzKGhleFZhbHVlKSkge1xuICAgICAgICAgIHJlY2VpdmVycy5wdXNoKGhleFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhbW91bnRzLnB1c2gobmV3IEJjc1JlYWRlcih2YWx1ZSkucmVhZDY0KCkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYW1vdW50cy5sZW5ndGggIT09IHJlY2VpdmVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignY291bnQgb2YgYW1vdW50cyBkb2VzIG5vdCBtYXRjaCBjb3VudCBvZiByZWNlaXZlcnMnKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKCF0aGlzLmdhc1BheW1lbnRPYmplY3RzIHx8IHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwKSAmJlxuICAgICAgKCF0aGlzLmdhc1Nwb25zb3IgfHwgdGhpcy5zZW5kZXIgPT09IHRoaXMuZ2FzU3BvbnNvcilcbiAgICApIHtcbiAgICAgIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfSBlbHNlIGlmIChpbnB1dE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5fcGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfVxuICAgIHRoaXMucmVjaXBpZW50cyA9IFtdO1xuICAgIHJlY2VpdmVycy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9yZWNpcGllbnRzLnB1c2goe1xuICAgICAgICBhZGRyZXNzOiByZWNpcGllbnQsXG4gICAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnVwZGF0ZUlzU2ltdWxhdGVUeCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb3B1bGF0ZVR4SW5wdXRzQW5kQ29tbWFuZHMoKTogdm9pZCB7XG4gICAgY29uc3QgY29uc29saWRhdGVkQ29pbiA9IHRoaXMuc2hvdWxkVXNlR2FzT2JqZWN0c0ZvclBheW1lbnQoKVxuICAgICAgPyB0aGlzLmNvbnNvbGlkYXRlR2FzT2JqZWN0cygpXG4gICAgICA6IHRoaXMuY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpO1xuICAgIHRoaXMuc3BsaXRBbmRUcmFuc2ZlclRvUmVjaXBpZW50cyhjb25zb2xpZGF0ZWRDb2luKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkVXNlR2FzT2JqZWN0c0ZvclBheW1lbnQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcGF5bWVudE9iamVjdEV4aXN0cyA9IHRoaXMucGF5bWVudE9iamVjdHMgJiYgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPiAwO1xuICAgIGNvbnN0IHNlbmRlclBheXNPd25HYXMgPSAhdGhpcy5nYXNTcG9uc29yIHx8IHRoaXMuZ2FzU3BvbnNvciA9PT0gdGhpcy5zZW5kZXI7XG4gICAgcmV0dXJuICFwYXltZW50T2JqZWN0RXhpc3RzICYmIHNlbmRlclBheXNPd25HYXMgJiYgQm9vbGVhbih0aGlzLmdhc1BheW1lbnRPYmplY3RzKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMucGF5bWVudE9iamVjdHMgfHwgdGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcnN0T2JqZWN0ID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZih0aGlzLnBheW1lbnRPYmplY3RzWzBdKSk7XG5cbiAgICBpZiAodGhpcy5wYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBmaXJzdE9iamVjdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tZXJnZU9iamVjdHNJbkJhdGNoZXMoZmlyc3RPYmplY3QsIHRoaXMucGF5bWVudE9iamVjdHMuc2xpY2UoMSksIE1BWF9JTlBVVF9PQkpFQ1RTKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc29saWRhdGVHYXNPYmplY3RzKCk6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQge1xuICAgIGlmICghdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdHYXMgcGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdhc09iamVjdCA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5nYXM7XG5cbiAgICBpZiAodGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPD0gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMpIHtcbiAgICAgIHJldHVybiBnYXNPYmplY3Q7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VPYmplY3RzSW5CYXRjaGVzKGdhc09iamVjdCwgdGhpcy5nYXNQYXltZW50T2JqZWN0cywgTUFYX0lOUFVUX09CSkVDVFMpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZU9iamVjdHNJbkJhdGNoZXMoXG4gICAgdGFyZ2V0Q29pbjogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCxcbiAgICBvYmplY3RzVG9NZXJnZTogVHJhbnNhY3Rpb25PYmplY3RJbnB1dFtdLFxuICAgIGJhdGNoU2l6ZTogbnVtYmVyXG4gICk6IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQge1xuICAgIGxldCBjb25zb2xpZGF0ZWRDb2luID0gdGFyZ2V0Q29pbjtcblxuICAgIGZvciAobGV0IHN0YXJ0SW5kZXggPSAwOyBzdGFydEluZGV4IDwgb2JqZWN0c1RvTWVyZ2UubGVuZ3RoOyBzdGFydEluZGV4ICs9IGJhdGNoU2l6ZSkge1xuICAgICAgY29uc3QgYmF0Y2ggPSBvYmplY3RzVG9NZXJnZS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgYmF0Y2hTaXplKTtcbiAgICAgIGNvbnN0IGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMgPSBiYXRjaC5tYXAoKG9iaikgPT4gdGhpcy5faW90YVRyYW5zYWN0aW9uLm9iamVjdChJb3RhSW5wdXRzLk9iamVjdFJlZihvYmopKSk7XG5cbiAgICAgIFtjb25zb2xpZGF0ZWRDb2luXSA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5tZXJnZUNvaW5zKGNvbnNvbGlkYXRlZENvaW4sIGJhdGNoQXNUcmFuc2FjdGlvbk9iamVjdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBjb25zb2xpZGF0ZWRDb2luO1xuICB9XG5cbiAgcHJpdmF0ZSBzcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW46IFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZWNpcGllbnRBbW91bnRzID0gdGhpcy5fcmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4gcmVjaXBpZW50LmFtb3VudCk7XG4gICAgY29uc3Qgc3BsaXRDb2lucyA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5zcGxpdENvaW5zKHNvdXJjZUNvaW4sIHJlY2lwaWVudEFtb3VudHMpO1xuXG4gICAgdGhpcy5fcmVjaXBpZW50cy5mb3JFYWNoKChyZWNpcGllbnQsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLl9pb3RhVHJhbnNhY3Rpb24udHJhbnNmZXJPYmplY3RzKFtzcGxpdENvaW5zW2luZGV4XV0sIHJlY2lwaWVudC5hZGRyZXNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZVR4RGF0YUltcGxlbWVudGF0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yZWNpcGllbnRzIHx8IHRoaXMucmVjaXBpZW50cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHJlY2lwaWVudHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50cy5sZW5ndGggPiBNQVhfUkVDSVBJRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgUmVjaXBpZW50cyBjb3VudCAoJHt0aGlzLnJlY2lwaWVudHMubGVuZ3RofSkgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKCR7TUFYX1JFQ0lQSUVOVFN9KWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBheW1lbnRPYmplY3RzIHx8IHRoaXMucGF5bWVudE9iamVjdHM/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKCF0aGlzLmdhc1Nwb25zb3IgfHwgdGhpcy5nYXNTcG9uc29yID09PSB0aGlzLnNlbmRlcikge1xuICAgICAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cz8ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdQYXltZW50IG9yIEdhcyBvYmplY3RzIGFyZSByZXF1aXJlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlIG9iamVjdCBJRHMgaW4gcGF5bWVudCBvYmplY3RzXG4gICAgY29uc3QgcGF5bWVudE9iamVjdElkcyA9IHRoaXMucGF5bWVudE9iamVjdHM/Lm1hcCgob2JqKSA9PiBvYmoub2JqZWN0SWQpID8/IFtdO1xuICAgIGNvbnN0IHVuaXF1ZVBheW1lbnRJZHMgPSBuZXcgU2V0KHBheW1lbnRPYmplY3RJZHMpO1xuICAgIGlmICh1bmlxdWVQYXltZW50SWRzLnNpemUgIT09IHBheW1lbnRPYmplY3RJZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0R1cGxpY2F0ZSBvYmplY3QgSURzIGZvdW5kIGluIHBheW1lbnQgb2JqZWN0cycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmdhc1BheW1lbnRPYmplY3RzICYmIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZ2FzT2JqZWN0SWRzID0gdGhpcy5nYXNQYXltZW50T2JqZWN0cy5tYXAoKGdhcykgPT4gZ2FzLm9iamVjdElkKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZSBvYmplY3QgSURzIGluIGdhcyBwYXltZW50IG9iamVjdHNcbiAgICAgIGNvbnN0IHVuaXF1ZUdhc0lkcyA9IG5ldyBTZXQoZ2FzT2JqZWN0SWRzKTtcbiAgICAgIGlmICh1bmlxdWVHYXNJZHMuc2l6ZSAhPT0gZ2FzT2JqZWN0SWRzLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0R1cGxpY2F0ZSBvYmplY3QgSURzIGZvdW5kIGluIGdhcyBwYXltZW50IG9iamVjdHMnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVwbGljYXRlcyA9IHBheW1lbnRPYmplY3RJZHMuZmlsdGVyKChwYXltZW50KSA9PiBnYXNPYmplY3RJZHMuaW5jbHVkZXMocGF5bWVudCkpO1xuICAgICAgaWYgKGR1cGxpY2F0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICAgJ1BheW1lbnQgb2JqZWN0cyBjYW5ub3QgYmUgdGhlIHNhbWUgYXMgZ2FzIHBheW1lbnQgb2JqZWN0czogJyArIGR1cGxpY2F0ZXMuam9pbignLCAnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGxhaW5UcmFuc2FjdGlvbkltcGxlbWVudGF0aW9uKFxuICAgIGpzb246IFR4RGF0YSxcbiAgICBleHBsYW5hdGlvblJlc3VsdDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvblxuICApOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2FjdGlvblJlY2lwaWVudFtdID0gdGhpcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50KSA9PiByZWNpcGllbnQpO1xuICAgIGNvbnN0IG91dHB1dEFtb3VudEJOID0gdGhpcy5yZWNpcGllbnRzLnJlZHVjZShcbiAgICAgIChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IucGx1cyhjdXJyZW50LmFtb3VudCksXG4gICAgICBuZXcgQmlnTnVtYmVyKDApXG4gICAgKTtcbiAgICBjb25zdCBvdXRwdXRBbW91bnQgPSBvdXRwdXRBbW91bnRCTi50b1N0cmluZygpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG59XG4iXX0=
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNmZXJUcmFuc2FjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBNkc7QUFFN0csK0NBQTRDO0FBRTVDLDhEQUlxQztBQUNyQyxnREFBa0Q7QUFDbEQsOERBQXlGO0FBQ3pGLG1DQUFzQztBQUN0QywyQ0FBd0g7QUFDeEgsb0RBQTRCO0FBQzVCLGdFQUFxQztBQUVyQyxNQUFhLG1CQUFvQixTQUFRLHlCQUFXO0lBSWxELFlBQVksVUFBZ0M7UUFDMUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsMEJBQWUsQ0FBQyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxVQUFVLENBQUMsS0FBNkI7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxjQUFjLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzNCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxX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Q0ssMEJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLFVBQVU7YUFDbkIsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxzQkFBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFFBQVEsRUFBRSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQWpaRCxrREFpWkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciwgdG9IZXgsIFRyYW5zYWN0aW9uUmVjaXBpZW50LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgVHJhbnNhY3Rpb25PYmplY3RJbnB1dCwgVHJhbnNmZXJUeERhdGEsIFR4RGF0YSB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHtcbiAgSW5wdXRzIGFzIElvdGFJbnB1dHMsXG4gIFRyYW5zYWN0aW9uT2JqZWN0QXJndW1lbnQsXG4gIFRyYW5zYWN0aW9uIGFzIElvdGFUcmFuc2FjdGlvbixcbn0gZnJvbSAnQGlvdGEvaW90YS1zZGsvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IGZyb21CYXNlNjQgfSBmcm9tICdAaW90YS9pb3RhLXNkay91dGlscyc7XG5pbXBvcnQgeyBtZXNzYWdlV2l0aEludGVudCBhcyBpb3RhTWVzc2FnZVdpdGhJbnRlbnQgfSBmcm9tICdAaW90YS9pb3RhLXNkay9jcnlwdG9ncmFwaHknO1xuaW1wb3J0IHsgQmNzUmVhZGVyIH0gZnJvbSAnQGlvdGEvYmNzJztcbmltcG9ydCB7IE1BWF9HQVNfUEFZTUVOVF9PQkpFQ1RTLCBNQVhfSU5QVVRfT0JKRUNUUywgTUFYX1JFQ0lQSUVOVFMsIFRSQU5TRkVSX1RSQU5TQUNUSU9OX0NPTU1BTkRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNmZXJUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSBfcmVjaXBpZW50czogVHJhbnNhY3Rpb25SZWNpcGllbnRbXTtcbiAgcHJpdmF0ZSBfcGF5bWVudE9iamVjdHM/OiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl90eXBlID0gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gICAgdGhpcy5faW5wdXRzID0gW107XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtdO1xuICB9XG5cbiAgZ2V0IHJlY2lwaWVudHMoKTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY2lwaWVudHM7XG4gIH1cblxuICBzZXQgcmVjaXBpZW50cyh2YWx1ZTogVHJhbnNhY3Rpb25SZWNpcGllbnRbXSkge1xuICAgIHRoaXMuX3JlY2lwaWVudHMgPSB2YWx1ZTtcbiAgICB0aGlzLl9yZWJ1aWxkUmVxdWlyZWQgPSB0cnVlO1xuICB9XG5cbiAgZ2V0IHBheW1lbnRPYmplY3RzKCk6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3BheW1lbnRPYmplY3RzO1xuICB9XG5cbiAgc2V0IHBheW1lbnRPYmplY3RzKHZhbHVlOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXltZW50T2JqZWN0cyA9IHZhbHVlO1xuICAgIHRoaXMuX3JlYnVpbGRSZXF1aXJlZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGFkZElucHV0c0FuZE91dHB1dHMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pb3RhVHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG90YWxBbW91bnQgPSB0aGlzLnJlY2lwaWVudHMucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IgKyBOdW1iZXIoY3VycmVudC5hbW91bnQpLCAwKTtcbiAgICB0aGlzLl9vdXRwdXRzID0gdGhpcy5yZWNpcGllbnRzLm1hcCgocmVjaXBpZW50LCBpbmRleCkgPT4gKHtcbiAgICAgIGFkZHJlc3M6IHJlY2lwaWVudC5hZGRyZXNzLFxuICAgICAgdmFsdWU6IHJlY2lwaWVudC5hbW91bnQudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICB9KSk7XG4gICAgdGhpcy5faW5wdXRzID0gW1xuICAgICAge1xuICAgICAgICBhZGRyZXNzOiB0aGlzLnNlbmRlcixcbiAgICAgICAgdmFsdWU6IHRvdGFsQW1vdW50LnRvU3RyaW5nKCksXG4gICAgICAgIGNvaW46IHRoaXMuX2NvaW5Db25maWcubmFtZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUcmFuc2ZlclR4RGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnRvSnNvbigpLFxuICAgICAgcmVjaXBpZW50czogdGhpcy5yZWNpcGllbnRzLFxuICAgICAgcGF5bWVudE9iamVjdHM6IHRoaXMucGF5bWVudE9iamVjdHMsXG4gICAgfTtcbiAgfVxuXG4gIHBhcnNlRnJvbUpTT04odHhEYXRhOiBUcmFuc2ZlclR4RGF0YSk6IHZvaWQge1xuICAgIHN1cGVyLnBhcnNlRnJvbUpTT04odHhEYXRhKTtcbiAgICB0aGlzLnJlY2lwaWVudHMgPSB0eERhdGEucmVjaXBpZW50cztcbiAgICB0aGlzLnBheW1lbnRPYmplY3RzID0gdHhEYXRhLnBheW1lbnRPYmplY3RzO1xuICAgIHRoaXMudXBkYXRlSXNTaW11bGF0ZVR4KCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gZnJvbSBpdHMgYnJvYWRjYXN0IGZvcm1hdCAoYmFzZTY0IG9yIHJhdyBieXRlcykuXG4gICAqIEV4dHJhY3RzIHJlY2lwaWVudHMsIGFtb3VudHMsIGFuZCBwYXltZW50IG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24gZGF0YS5cbiAgICovXG4gIHBhcnNlRnJvbUJyb2FkY2FzdFR4KHR4OiBzdHJpbmcgfCBVaW50OEFycmF5KTogdm9pZCB7XG4gICAgY29uc3QgdHhEYXRhID0gSW90YVRyYW5zYWN0aW9uLmZyb20odHgpLmdldERhdGEoKTtcbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNmZXJDb21tYW5kcyh0eERhdGEpO1xuXG4gICAgc3VwZXIucGFyc2VGcm9tQnJvYWRjYXN0VHgodHgpO1xuXG4gICAgY29uc3QgeyBpbnB1dE9iamVjdHMsIGFtb3VudHMsIHJlY2VpdmVycyB9ID0gdGhpcy5wYXJzZVRyYW5zYWN0aW9uSW5wdXRzKHR4RGF0YSk7XG4gICAgdGhpcy52YWxpZGF0ZUFtb3VudHNNYXRjaFJlY2VpdmVycyhhbW91bnRzLCByZWNlaXZlcnMpO1xuICAgIHRoaXMuYXNzaWduUGFyc2VkT2JqZWN0cyhpbnB1dE9iamVjdHMpO1xuICAgIHRoaXMuYXNzaWduUmVjaXBpZW50cyhyZWNlaXZlcnMsIGFtb3VudHMpO1xuICAgIHRoaXMudXBkYXRlSXNTaW11bGF0ZVR4KCk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9ubHkgY29udGFpbnMgc3VwcG9ydGVkIHRyYW5zZmVyIGNvbW1hbmRzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRyYW5zZmVyQ29tbWFuZHModHhEYXRhOiBSZXR1cm5UeXBlPElvdGFUcmFuc2FjdGlvblsnZ2V0RGF0YSddPik6IHZvaWQge1xuICAgIGNvbnN0IGhhc1Vuc3VwcG9ydGVkQ29tbWFuZHMgPSB0eERhdGEuY29tbWFuZHMuc29tZShcbiAgICAgIChjb21tYW5kKSA9PiAhVFJBTlNGRVJfVFJBTlNBQ1RJT05fQ09NTUFORFMuaW5jbHVkZXMoY29tbWFuZC4ka2luZClcbiAgICApO1xuXG4gICAgaWYgKGhhc1Vuc3VwcG9ydGVkQ29tbWFuZHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignVW5zdXBwb3J0ZWQgY29tbWFuZHMgaW4gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0cmFuc2FjdGlvbiBpbnB1dHMgdG8gZXh0cmFjdCBvYmplY3RzLCBhbW91bnRzLCBhbmQgcmVjZWl2ZXIgYWRkcmVzc2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVRyYW5zYWN0aW9uSW5wdXRzKHR4RGF0YTogUmV0dXJuVHlwZTxJb3RhVHJhbnNhY3Rpb25bJ2dldERhdGEnXT4pOiB7XG4gICAgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W107XG4gICAgYW1vdW50czogc3RyaW5nW107XG4gICAgcmVjZWl2ZXJzOiBzdHJpbmdbXTtcbiAgfSB7XG4gICAgY29uc3QgaW5wdXRPYmplY3RzOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10gPSBbXTtcbiAgICBjb25zdCBhbW91bnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHJlY2VpdmVyczogc3RyaW5nW10gPSBbXTtcblxuICAgIHR4RGF0YS5pbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgIGlmIChpbnB1dC4ka2luZCA9PT0gJ09iamVjdCcgJiYgJ0ltbU9yT3duZWRPYmplY3QnIGluIGlucHV0Lk9iamVjdCkge1xuICAgICAgICBpbnB1dE9iamVjdHMucHVzaChpbnB1dC5PYmplY3QuSW1tT3JPd25lZE9iamVjdCBhcyBUcmFuc2FjdGlvbk9iamVjdElucHV0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LiRraW5kID09PSAnUHVyZScgJiYgJ2J5dGVzJyBpbiBpbnB1dC5QdXJlKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZnJvbUJhc2U2NChpbnB1dC5QdXJlLmJ5dGVzKTtcbiAgICAgICAgY29uc3QgaGV4VmFsdWUgPSAnMHgnICsgdG9IZXgodmFsdWUpO1xuXG4gICAgICAgIGlmICh1dGlscy5pc1ZhbGlkQWRkcmVzcyhoZXhWYWx1ZSkpIHtcbiAgICAgICAgICByZWNlaXZlcnMucHVzaChoZXhWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW1vdW50cy5wdXNoKG5ldyBCY3NSZWFkZXIodmFsdWUpLnJlYWQ2NCgpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBpbnB1dE9iamVjdHMsIGFtb3VudHMsIHJlY2VpdmVycyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBudW1iZXIgb2YgYW1vdW50cyBtYXRjaGVzIHRoZSBudW1iZXIgb2YgcmVjZWl2ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFtb3VudHNNYXRjaFJlY2VpdmVycyhhbW91bnRzOiBzdHJpbmdbXSwgcmVjZWl2ZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGlmIChhbW91bnRzLmxlbmd0aCAhPT0gcmVjZWl2ZXJzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdDb3VudCBvZiBhbW91bnRzIGRvZXMgbm90IG1hdGNoIGNvdW50IG9mIHJlY2VpdmVycycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIHBhcnNlZCBpbnB1dCBvYmplY3RzIHRvIGVpdGhlciBnYXMgcGF5bWVudCBvYmplY3RzIG9yIHBheW1lbnQgb2JqZWN0cy5cbiAgICogSWYgbm8gZ2FzIG9iamVjdHMgZXhpc3QgYW5kIHNlbmRlciBwYXlzIG93biBnYXMsIG9iamVjdHMgYmVjb21lIGdhcyBvYmplY3RzLlxuICAgKiBPdGhlcndpc2UsIHRoZXkgYmVjb21lIHBheW1lbnQgb2JqZWN0cy5cbiAgICovXG4gIHByaXZhdGUgYXNzaWduUGFyc2VkT2JqZWN0cyhpbnB1dE9iamVjdHM6IFRyYW5zYWN0aW9uT2JqZWN0SW5wdXRbXSk6IHZvaWQge1xuICAgIGlmIChpbnB1dE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgbm9HYXNPYmplY3RzRXhpc3QgPSAhdGhpcy5nYXNQYXltZW50T2JqZWN0cyB8fCB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMDtcbiAgICBjb25zdCBzZW5kZXJQYXlzT3duR2FzID0gIXRoaXMuZ2FzU3BvbnNvciB8fCB0aGlzLnNlbmRlciA9PT0gdGhpcy5nYXNTcG9uc29yO1xuXG4gICAgaWYgKG5vR2FzT2JqZWN0c0V4aXN0ICYmIHNlbmRlclBheXNPd25HYXMpIHtcbiAgICAgIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMgPSBpbnB1dE9iamVjdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BheW1lbnRPYmplY3RzID0gaW5wdXRPYmplY3RzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCBhc3NpZ25zIHJlY2lwaWVudHMgZnJvbSBwYXJzZWQgYWRkcmVzc2VzIGFuZCBhbW91bnRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25SZWNpcGllbnRzKHJlY2VpdmVyczogc3RyaW5nW10sIGFtb3VudHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5fcmVjaXBpZW50cyA9IHJlY2VpdmVycy5tYXAoKGFkZHJlc3MsIGluZGV4KSA9PiAoe1xuICAgICAgYWRkcmVzcyxcbiAgICAgIGFtb3VudDogYW1vdW50c1tpbmRleF0sXG4gICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG1lc3NhZ2VXaXRoSW50ZW50KG1lc3NhZ2U6IFVpbnQ4QXJyYXkpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gaW90YU1lc3NhZ2VXaXRoSW50ZW50KCdUcmFuc2FjdGlvbkRhdGEnLCBtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgdGhlIElPVEEgdHJhbnNhY3Rpb24gd2l0aCBpbnB1dHMgYW5kIGNvbW1hbmRzIGZvciB0aGUgdHJhbnNmZXIuXG4gICAqIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvYmplY3RzIHRvIHVzZSBmb3IgcGF5bWVudCAoZWl0aGVyIHBheW1lbnQgb2JqZWN0cyBvciBnYXMgb2JqZWN0cyksXG4gICAqIGNvbnNvbGlkYXRlcyB0aGVtIGludG8gYSBzaW5nbGUgY29pbiwgYW5kIHRoZW4gc3BsaXRzL3RyYW5zZmVycyB0byByZWNpcGllbnRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBvcHVsYXRlVHhJbnB1dHNBbmRDb21tYW5kcygpOiB2b2lkIHtcbiAgICBjb25zdCBzb3VyY2VDb2luID0gdGhpcy5nZXRDb25zb2xpZGF0ZWRTb3VyY2VDb2luKCk7XG4gICAgdGhpcy5zcGxpdEFuZFRyYW5zZmVyVG9SZWNpcGllbnRzKHNvdXJjZUNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgd2hpY2ggb2JqZWN0cyB0byB1c2UgYXMgdGhlIHBheW1lbnQgc291cmNlIGFuZCBjb25zb2xpZGF0ZXMgdGhlbS5cbiAgICogSWYgcGF5bWVudCBvYmplY3RzIGFyZSBwcm92aWRlZCwgdXNlIHRob3NlLiBPdGhlcndpc2UsIGlmIHRoZSBzZW5kZXIgaXMgcGF5aW5nXG4gICAqIHRoZWlyIG93biBnYXMsIHVzZSB0aGUgZ2FzIG9iamVjdHMgZm9yIHBheW1lbnQuXG4gICAqL1xuICBwcml2YXRlIGdldENvbnNvbGlkYXRlZFNvdXJjZUNvaW4oKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgaWYgKHRoaXMuaGFzUGF5bWVudE9iamVjdHMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY29uc29saWRhdGVQYXltZW50T2JqZWN0cygpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25zb2xpZGF0ZUdhc09iamVjdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcGF5bWVudCBvYmplY3RzIGV4aXN0IGFuZCBpZiBnYXMgb2JqZWN0cyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgKiBHYXMgb2JqZWN0cyBhcmUgdXNlZCB3aGVuOiBubyBwYXltZW50IG9iamVjdHMgZXhpc3QgQU5EIHNlbmRlciBwYXlzIHRoZWlyIG93biBnYXMuXG4gICAqL1xuICBwcml2YXRlIGhhc1BheW1lbnRPYmplY3RzKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGhhc1BheW1lbnRPYmplY3RzID0gdGhpcy5wYXltZW50T2JqZWN0cyAmJiB0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCA+IDA7XG4gICAgaWYgKGhhc1BheW1lbnRPYmplY3RzKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBubyBwYXltZW50IG9iamVjdHMsIG9ubHkgdXNlIGdhcyBvYmplY3RzIGlmIHNlbmRlciBwYXlzIG93biBnYXNcbiAgICBjb25zdCBzZW5kZXJQYXlzT3duR2FzID0gIXRoaXMuZ2FzU3BvbnNvciB8fCB0aGlzLmdhc1Nwb25zb3IgPT09IHRoaXMuc2VuZGVyO1xuICAgIHJldHVybiAhc2VuZGVyUGF5c093bkdhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zb2xpZGF0ZXMgcGF5bWVudCBvYmplY3RzIGludG8gYSBzaW5nbGUgY29pbiBvYmplY3QuXG4gICAqIElmIG11bHRpcGxlIHBheW1lbnQgb2JqZWN0cyBleGlzdCwgdGhleSBhcmUgbWVyZ2VkIGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbnNvbGlkYXRlUGF5bWVudE9iamVjdHMoKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgaWYgKCF0aGlzLnBheW1lbnRPYmplY3RzIHx8IHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdE9iamVjdCA9IHRoaXMuX2lvdGFUcmFuc2FjdGlvbi5vYmplY3QoSW90YUlucHV0cy5PYmplY3RSZWYodGhpcy5wYXltZW50T2JqZWN0c1swXSkpO1xuXG4gICAgLy8gU2luZ2xlIG9iamVjdCBkb2Vzbid0IG5lZWQgY29uc29saWRhdGlvblxuICAgIGlmICh0aGlzLnBheW1lbnRPYmplY3RzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGZpcnN0T2JqZWN0O1xuICAgIH1cblxuICAgIC8vIE1lcmdlIHJlbWFpbmluZyBvYmplY3RzIGludG8gdGhlIGZpcnN0IG9uZVxuICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0c0luQmF0Y2hlcyhmaXJzdE9iamVjdCwgdGhpcy5wYXltZW50T2JqZWN0cy5zbGljZSgxKSwgTUFYX0lOUFVUX09CSkVDVFMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnNvbGlkYXRlcyBnYXMgcGF5bWVudCBvYmplY3RzIGludG8gYSBzaW5nbGUgY29pbiBvYmplY3QuXG4gICAqIElmIHRoZSBudW1iZXIgb2YgZ2FzIG9iamVjdHMgZXhjZWVkcyB0aGUgbWF4aW11bSwgdGhleSBhcmUgbWVyZ2VkIGluIGJhdGNoZXMuXG4gICAqL1xuICBwcml2YXRlIGNvbnNvbGlkYXRlR2FzT2JqZWN0cygpOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50IHtcbiAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignR2FzIHBheW1lbnQgb2JqZWN0cyBhcmUgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3QgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uZ2FzO1xuXG4gICAgLy8gSWYgd2l0aGluIHRoZSBsaW1pdCwgbm8gY29uc29saWRhdGlvbiBuZWVkZWRcbiAgICBpZiAodGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPD0gTUFYX0dBU19QQVlNRU5UX09CSkVDVFMpIHtcbiAgICAgIHJldHVybiBnYXNPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgZXhjZXNzIGdhcyBvYmplY3RzIHRvIHN0YXkgd2l0aGluIGxpbWl0c1xuICAgIHJldHVybiB0aGlzLm1lcmdlT2JqZWN0c0luQmF0Y2hlcyhnYXNPYmplY3QsIHRoaXMuZ2FzUGF5bWVudE9iamVjdHMsIE1BWF9JTlBVVF9PQkpFQ1RTKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZXMgbXVsdGlwbGUgY29pbiBvYmplY3RzIGludG8gYSB0YXJnZXQgY29pbiBpbiBiYXRjaGVzLlxuICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIElPVEEgaGFzIGxpbWl0cyBvbiB0aGUgbnVtYmVyIG9mIG9iamVjdHMgcGVyIG1lcmdlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXJnZXRDb2luIC0gVGhlIGNvaW4gdG8gbWVyZ2UgaW50b1xuICAgKiBAcGFyYW0gb2JqZWN0c1RvTWVyZ2UgLSBBcnJheSBvZiBvYmplY3RzIHRvIG1lcmdlXG4gICAqIEBwYXJhbSBiYXRjaFNpemUgLSBNYXhpbXVtIG51bWJlciBvZiBvYmplY3RzIHRvIG1lcmdlIHBlciBiYXRjaFxuICAgKiBAcmV0dXJucyBUaGUgY29uc29saWRhdGVkIGNvaW4gb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIG1lcmdlT2JqZWN0c0luQmF0Y2hlcyhcbiAgICB0YXJnZXRDb2luOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50LFxuICAgIG9iamVjdHNUb01lcmdlOiBUcmFuc2FjdGlvbk9iamVjdElucHV0W10sXG4gICAgYmF0Y2hTaXplOiBudW1iZXJcbiAgKTogVHJhbnNhY3Rpb25PYmplY3RBcmd1bWVudCB7XG4gICAgbGV0IGNvbnNvbGlkYXRlZENvaW4gPSB0YXJnZXRDb2luO1xuXG4gICAgZm9yIChsZXQgc3RhcnRJbmRleCA9IDA7IHN0YXJ0SW5kZXggPCBvYmplY3RzVG9NZXJnZS5sZW5ndGg7IHN0YXJ0SW5kZXggKz0gYmF0Y2hTaXplKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IG9iamVjdHNUb01lcmdlLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBiYXRjaFNpemUpO1xuICAgICAgY29uc3QgYmF0Y2hBc1RyYW5zYWN0aW9uT2JqZWN0cyA9IGJhdGNoLm1hcCgob2JqKSA9PiB0aGlzLl9pb3RhVHJhbnNhY3Rpb24ub2JqZWN0KElvdGFJbnB1dHMuT2JqZWN0UmVmKG9iaikpKTtcblxuICAgICAgW2NvbnNvbGlkYXRlZENvaW5dID0gdGhpcy5faW90YVRyYW5zYWN0aW9uLm1lcmdlQ29pbnMoY29uc29saWRhdGVkQ29pbiwgYmF0Y2hBc1RyYW5zYWN0aW9uT2JqZWN0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnNvbGlkYXRlZENvaW47XG4gIH1cblxuICAvKipcbiAgICogU3BsaXRzIHRoZSBzb3VyY2UgY29pbiBpbnRvIHRoZSBhbW91bnRzIG5lZWRlZCBmb3IgZWFjaCByZWNpcGllbnQgYW5kIHRyYW5zZmVycyB0aGVtLlxuICAgKiBUaGlzIGNyZWF0ZXMgc3BsaXQgY29pbiBjb21tYW5kcyBmb3IgYWxsIHJlY2lwaWVudCBhbW91bnRzLCB0aGVuIHRyYW5zZmVyIGNvbW1hbmRzXG4gICAqIHRvIHNlbmQgZWFjaCBzcGxpdCBjb2luIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlY2lwaWVudC5cbiAgICovXG4gIHByaXZhdGUgc3BsaXRBbmRUcmFuc2ZlclRvUmVjaXBpZW50cyhzb3VyY2VDb2luOiBUcmFuc2FjdGlvbk9iamVjdEFyZ3VtZW50KTogdm9pZCB7XG4gICAgY29uc3QgcmVjaXBpZW50QW1vdW50cyA9IHRoaXMuX3JlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudC5hbW91bnQpO1xuICAgIGNvbnN0IHNwbGl0Q29pbnMgPSB0aGlzLl9pb3RhVHJhbnNhY3Rpb24uc3BsaXRDb2lucyhzb3VyY2VDb2luLCByZWNpcGllbnRBbW91bnRzKTtcblxuICAgIHRoaXMuX3JlY2lwaWVudHMuZm9yRWFjaCgocmVjaXBpZW50LCBpbmRleCkgPT4ge1xuICAgICAgdGhpcy5faW90YVRyYW5zYWN0aW9uLnRyYW5zZmVyT2JqZWN0cyhbc3BsaXRDb2luc1tpbmRleF1dLCByZWNpcGllbnQuYWRkcmVzcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFsbCB0cmFuc2ZlciB0cmFuc2FjdGlvbiBkYXRhIGJlZm9yZSBidWlsZGluZy5cbiAgICogQ2hlY2tzIHJlY2lwaWVudHMsIHBheW1lbnQgb2JqZWN0cywgYW5kIGVuc3VyZXMgbm8gZHVwbGljYXRlIG9iamVjdCBJRHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdmFsaWRhdGVUeERhdGFJbXBsZW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRlUmVjaXBpZW50c0xpc3QoKTtcbiAgICB0aGlzLnZhbGlkYXRlUGF5bWVudE9iamVjdHNFeGlzdCgpO1xuICAgIHRoaXMudmFsaWRhdGVOb0R1cGxpY2F0ZU9iamVjdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCByZWNpcGllbnRzIGV4aXN0IGFuZCBkb24ndCBleGNlZWQgdGhlIG1heGltdW0gYWxsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVSZWNpcGllbnRzTGlzdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVjaXBpZW50cyB8fCB0aGlzLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHJlY2lwaWVudHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVjaXBpZW50cy5sZW5ndGggPiBNQVhfUkVDSVBJRU5UUykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgUmVjaXBpZW50cyBjb3VudCAoJHt0aGlzLnJlY2lwaWVudHMubGVuZ3RofSkgZXhjZWVkcyBtYXhpbXVtIGFsbG93ZWQgKCR7TUFYX1JFQ0lQSUVOVFN9KWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGVpdGhlciBwYXltZW50IG9iamVjdHMgb3IgZ2FzIG9iamVjdHMgZXhpc3QgZm9yIGZ1bmRpbmcgdGhlIHRyYW5zZmVyLlxuICAgKiBXaGVuIGEgZ2FzIHNwb25zb3IgaXMgdXNlZCwgcGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZC5cbiAgICogT3RoZXJ3aXNlLCBlaXRoZXIgcGF5bWVudCBvYmplY3RzIG9yIGdhcyBvYmplY3RzIGNhbiBiZSB1c2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBheW1lbnRPYmplY3RzRXhpc3QoKTogdm9pZCB7XG4gICAgY29uc3QgaGFzUGF5bWVudE9iamVjdHMgPSB0aGlzLnBheW1lbnRPYmplY3RzICYmIHRoaXMucGF5bWVudE9iamVjdHMubGVuZ3RoID4gMDtcbiAgICBpZiAoaGFzUGF5bWVudE9iamVjdHMpIHtcbiAgICAgIHJldHVybjsgLy8gUGF5bWVudCBvYmplY3RzIGV4aXN0LCB2YWxpZGF0aW9uIHBhc3Nlc1xuICAgIH1cblxuICAgIC8vIE5vIHBheW1lbnQgb2JqZWN0cyAtIGNoZWNrIGlmIGdhcyBvYmplY3RzIGNhbiBiZSB1c2VkIGluc3RlYWRcbiAgICBjb25zdCBoYXNHYXNTcG9uc29yID0gdGhpcy5nYXNTcG9uc29yICYmIHRoaXMuZ2FzU3BvbnNvciAhPT0gdGhpcy5zZW5kZXI7XG4gICAgaWYgKGhhc0dhc1Nwb25zb3IpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUGF5bWVudCBvYmplY3RzIGFyZSByZXF1aXJlZCB3aGVuIHVzaW5nIGEgZ2FzIHNwb25zb3InKTtcbiAgICB9XG5cbiAgICAvLyBObyBnYXMgc3BvbnNvciAtIGdhcyBvYmplY3RzIG11c3QgZXhpc3RcbiAgICBjb25zdCBoYXNHYXNPYmplY3RzID0gdGhpcy5nYXNQYXltZW50T2JqZWN0cyAmJiB0aGlzLmdhc1BheW1lbnRPYmplY3RzLmxlbmd0aCA+IDA7XG4gICAgaWYgKCFoYXNHYXNPYmplY3RzKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1BheW1lbnQgb3IgR2FzIG9iamVjdHMgYXJlIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgb2JqZWN0IElEcyB3aXRoaW4gcGF5bWVudCBvYmplY3RzLFxuICAgKiBnYXMgcGF5bWVudCBvYmplY3RzLCBvciBiZXR3ZWVuIHRoZSB0d28gZ3JvdXBzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU5vRHVwbGljYXRlT2JqZWN0cygpOiB2b2lkIHtcbiAgICBjb25zdCBwYXltZW50T2JqZWN0SWRzID0gdGhpcy5wYXltZW50T2JqZWN0cz8ubWFwKChvYmopID0+IG9iai5vYmplY3RJZCkgPz8gW107XG5cbiAgICAvLyBDaGVjayBmb3IgZHVwbGljYXRlcyB3aXRoaW4gcGF5bWVudCBvYmplY3RzXG4gICAgdGhpcy5jaGVja0ZvckR1cGxpY2F0ZUlkcyhwYXltZW50T2JqZWN0SWRzLCAncGF5bWVudCBvYmplY3RzJyk7XG5cbiAgICBpZiAoIXRoaXMuZ2FzUGF5bWVudE9iamVjdHMgfHwgdGhpcy5nYXNQYXltZW50T2JqZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBnYXNPYmplY3RJZHMgPSB0aGlzLmdhc1BheW1lbnRPYmplY3RzLm1hcCgoZ2FzKSA9PiBnYXMub2JqZWN0SWQpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgd2l0aGluIGdhcyBwYXltZW50IG9iamVjdHNcbiAgICB0aGlzLmNoZWNrRm9yRHVwbGljYXRlSWRzKGdhc09iamVjdElkcywgJ2dhcyBwYXltZW50IG9iamVjdHMnKTtcblxuICAgIC8vIENoZWNrIGZvciBvdmVybGFwcyBiZXR3ZWVuIHBheW1lbnQgYW5kIGdhcyBvYmplY3RzXG4gICAgY29uc3Qgb3ZlcmxhcHBpbmdJZHMgPSBwYXltZW50T2JqZWN0SWRzLmZpbHRlcigoaWQpID0+IGdhc09iamVjdElkcy5pbmNsdWRlcyhpZCkpO1xuICAgIGlmIChvdmVybGFwcGluZ0lkcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoXG4gICAgICAgICdQYXltZW50IG9iamVjdHMgY2Fubm90IGJlIHRoZSBzYW1lIGFzIGdhcyBwYXltZW50IG9iamVjdHM6ICcgKyBvdmVybGFwcGluZ0lkcy5qb2luKCcsICcpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRHMgaW4gYW4gYXJyYXkuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrRm9yRHVwbGljYXRlSWRzKGlkczogc3RyaW5nW10sIG9iamVjdFR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVuaXF1ZUlkcyA9IG5ldyBTZXQoaWRzKTtcbiAgICBpZiAodW5pcXVlSWRzLnNpemUgIT09IGlkcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgRHVwbGljYXRlIG9iamVjdCBJRHMgZm91bmQgaW4gJHtvYmplY3RUeXBlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBQcm92aWRlcyBhIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBleHBsYWluVHJhbnNhY3Rpb25JbXBsZW1lbnRhdGlvbihcbiAgICBfanNvbjogVHhEYXRhLFxuICAgIGV4cGxhbmF0aW9uUmVzdWx0OiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uXG4gICk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IG91dHB1dHMgPSB0aGlzLnJlY2lwaWVudHMubWFwKChyZWNpcGllbnQpID0+IHJlY2lwaWVudCk7XG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdGhpcy5jYWxjdWxhdGVUb3RhbE91dHB1dEFtb3VudCgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmV4cGxhbmF0aW9uUmVzdWx0LFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgb3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIGFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCB0byBhbGwgcmVjaXBpZW50cy5cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlVG90YWxPdXRwdXRBbW91bnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWNpcGllbnRzXG4gICAgICAucmVkdWNlKChhY2N1bXVsYXRvciwgY3VycmVudCkgPT4gYWNjdW11bGF0b3IucGx1cyhjdXJyZW50LmFtb3VudCksIG5ldyBCaWdOdW1iZXIoMCkpXG4gICAgICAudG9TdHJpbmcoKTtcbiAgfVxufVxuIl19
@@ -1,22 +1,121 @@
1
1
  import { BaseUtils } from '@bitgo-beta/sdk-core';
2
+ /**
3
+ * Utility class for IOTA-specific validation and conversion operations.
4
+ * Implements the BaseUtils interface and provides methods for validating
5
+ * addresses, keys, signatures, and transaction data.
6
+ */
2
7
  export declare class Utils implements BaseUtils {
3
- /** @inheritdoc */
8
+ /**
9
+ * Validates an IOTA address format.
10
+ * IOTA addresses are 64-character hex strings prefixed with '0x'.
11
+ *
12
+ * @param address - The address to validate
13
+ * @returns true if the address is valid
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * utils.isValidAddress('0x1234...') // true
18
+ * utils.isValidAddress('invalid') // false
19
+ * ```
20
+ */
4
21
  isValidAddress(address: string): boolean;
5
- /** @inheritdoc */
22
+ /**
23
+ * Validates an IOTA block ID (digest).
24
+ * Block IDs are 32-byte base58-encoded strings.
25
+ *
26
+ * @param hash - The block ID to validate
27
+ * @returns true if the block ID is valid
28
+ */
6
29
  isValidBlockId(hash: string): boolean;
7
- /** @inheritdoc */
30
+ /**
31
+ * Validates an IOTA transaction ID (digest).
32
+ * Transaction IDs are 32-byte base58-encoded strings.
33
+ *
34
+ * @param txId - The transaction ID to validate
35
+ * @returns true if the transaction ID is valid
36
+ */
37
+ isValidTransactionId(txId: string): boolean;
38
+ /**
39
+ * Validates an Ed25519 private key format.
40
+ *
41
+ * @param key - The private key to validate (hex string)
42
+ * @returns true if the private key is valid
43
+ */
8
44
  isValidPrivateKey(key: string): boolean;
9
- /** @inheritdoc */
45
+ /**
46
+ * Validates an Ed25519 public key format.
47
+ *
48
+ * @param key - The public key to validate (hex string)
49
+ * @returns true if the public key is valid
50
+ */
10
51
  isValidPublicKey(key: string): boolean;
11
- /** @inheritdoc */
52
+ /**
53
+ * Validates an IOTA signature format.
54
+ * Signatures must be base64-encoded and exactly 64 bytes when decoded.
55
+ *
56
+ * @param signature - The base64-encoded signature to validate
57
+ * @returns true if the signature is valid
58
+ */
12
59
  isValidSignature(signature: string): boolean;
13
- /** @inheritdoc */
14
- isValidTransactionId(txId: string): boolean;
60
+ /**
61
+ * Validates a raw IOTA transaction format.
62
+ * Attempts to parse the transaction using the IOTA SDK.
63
+ *
64
+ * @param rawTransaction - The raw transaction (base64 string or Uint8Array)
65
+ * @returns true if the transaction can be parsed
66
+ */
67
+ isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
68
+ /**
69
+ * Validates a hex string with a specific length requirement.
70
+ * Checks for '0x' or '0X' prefix followed by the specified number of hex characters.
71
+ *
72
+ * @param value - The hex string to validate
73
+ * @param length - The required length (number of hex characters, excluding prefix)
74
+ * @returns true if the hex string matches the format and length
75
+ */
15
76
  isValidHex(value: string, length: number): boolean;
77
+ /**
78
+ * Converts a value to a base64-encoded string.
79
+ * Handles both Uint8Array and hex string inputs.
80
+ *
81
+ * @param value - The value to encode (Uint8Array or hex string)
82
+ * @returns Base64-encoded string
83
+ *
84
+ * @example
85
+ * ```typescript
86
+ * utils.getBase64String(new Uint8Array([1, 2, 3]))
87
+ * utils.getBase64String('0x010203')
88
+ * ```
89
+ */
16
90
  getBase64String(value: string | Uint8Array): string;
91
+ /**
92
+ * Derives an IOTA address from an Ed25519 public key.
93
+ * Uses the IOTA SDK's address derivation algorithm.
94
+ *
95
+ * @param publicKey - The Ed25519 public key (hex string)
96
+ * @returns The derived IOTA address
97
+ *
98
+ * @example
99
+ * ```typescript
100
+ * const address = utils.getAddressFromPublicKey('8c26e54e36c902c5...')
101
+ * // Returns: '0x9882188ba3e8070a...'
102
+ * ```
103
+ */
17
104
  getAddressFromPublicKey(publicKey: string): string;
18
- isValidRawTransaction(rawTransaction: string | Uint8Array): boolean;
19
105
  }
106
+ /**
107
+ * Singleton instance of the Utils class.
108
+ * Use this for all IOTA utility operations throughout the SDK.
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * import utils from './utils';
113
+ *
114
+ * if (utils.isValidAddress(address)) {
115
+ * // Process valid address
116
+ * }
117
+ * ```
118
+ */
20
119
  declare const utils: Utils;
21
120
  export default utils;
22
121
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,sBAAsB,CAAC;AAW7G,qBAAa,KAAM,YAAW,SAAS;IACrC,kBAAkB;IAClB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,kBAAkB;IAClB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,kBAAkB;IAClB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,kBAAkB;IAClB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,kBAAkB;IAClB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAQ5C,kBAAkB;IAClB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI3C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlD,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAQnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAKlD,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;CAQpE;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA8D,MAAM,sBAAsB,CAAC;AAW7G;;;;GAIG;AACH,qBAAa,KAAM,YAAW,SAAS;IAKrC;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC;;;;;;OAMG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC;;;;;;OAMG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ3C;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQtC;;;;;;OAMG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAU5C;;;;;;OAMG;IACH,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO;IAanE;;;;;;;OAOG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKlD;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM;IAOnD;;;;;;;;;;;;OAYG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAInD;AAED;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,KAAK,OAAc,CAAC;AAE1B,eAAe,KAAK,CAAC"}