@bitgo-beta/sdk-coin-flrp 1.0.1-beta.28 → 1.0.1-beta.281

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 (112) hide show
  1. package/dist/src/flrp.d.ts +6 -75
  2. package/dist/src/flrp.d.ts.map +1 -1
  3. package/dist/src/flrp.js +13 -298
  4. package/dist/src/index.d.ts +0 -1
  5. package/dist/src/index.d.ts.map +1 -1
  6. package/dist/src/index.js +1 -2
  7. package/dist/src/lib/ExportInCTxBuilder.d.ts +50 -0
  8. package/dist/src/lib/ExportInCTxBuilder.d.ts.map +1 -0
  9. package/dist/src/lib/ExportInCTxBuilder.js +187 -0
  10. package/dist/src/lib/ExportInPTxBuilder.d.ts +47 -0
  11. package/dist/src/lib/ExportInPTxBuilder.d.ts.map +1 -0
  12. package/dist/src/lib/ExportInPTxBuilder.js +330 -0
  13. package/dist/src/lib/ImportInCTxBuilder.d.ts +47 -0
  14. package/dist/src/lib/ImportInCTxBuilder.d.ts.map +1 -0
  15. package/dist/src/lib/ImportInCTxBuilder.js +213 -0
  16. package/dist/src/lib/ImportInPTxBuilder.d.ts +33 -0
  17. package/dist/src/lib/ImportInPTxBuilder.d.ts.map +1 -0
  18. package/dist/src/lib/ImportInPTxBuilder.js +197 -0
  19. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +18 -16
  20. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -1
  21. package/dist/src/lib/atomicInCTransactionBuilder.js +38 -36
  22. package/dist/src/lib/atomicTransactionBuilder.d.ts +42 -76
  23. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -1
  24. package/dist/src/lib/atomicTransactionBuilder.js +141 -218
  25. package/dist/src/lib/iface.d.ts +50 -51
  26. package/dist/src/lib/iface.d.ts.map +1 -1
  27. package/dist/src/lib/iface.js +22 -10
  28. package/dist/src/lib/index.d.ts +4 -0
  29. package/dist/src/lib/index.d.ts.map +1 -1
  30. package/dist/src/lib/index.js +10 -2
  31. package/dist/src/lib/keyPair.d.ts +5 -5
  32. package/dist/src/lib/keyPair.d.ts.map +1 -1
  33. package/dist/src/lib/keyPair.js +17 -9
  34. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +46 -0
  35. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  36. package/dist/src/lib/permissionlessValidatorTxBuilder.js +134 -0
  37. package/dist/src/lib/transaction.d.ts +8 -73
  38. package/dist/src/lib/transaction.d.ts.map +1 -1
  39. package/dist/src/lib/transaction.js +139 -207
  40. package/dist/src/lib/transactionBuilder.d.ts +107 -0
  41. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  42. package/dist/src/lib/transactionBuilder.js +210 -0
  43. package/dist/src/lib/transactionBuilderFactory.d.ts +27 -30
  44. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  45. package/dist/src/lib/transactionBuilderFactory.js +84 -75
  46. package/dist/src/lib/utils.d.ts +98 -147
  47. package/dist/src/lib/utils.d.ts.map +1 -1
  48. package/dist/src/lib/utils.js +346 -319
  49. package/dist/test/resources/account.d.ts +49 -0
  50. package/dist/test/resources/account.d.ts.map +1 -0
  51. package/dist/test/resources/account.js +52 -0
  52. package/dist/test/resources/transactionData/exportInC.d.ts +20 -0
  53. package/dist/test/resources/transactionData/exportInC.d.ts.map +1 -0
  54. package/dist/test/resources/transactionData/exportInC.js +34 -0
  55. package/dist/test/resources/transactionData/exportInP.d.ts +69 -0
  56. package/dist/test/resources/transactionData/exportInP.d.ts.map +1 -0
  57. package/dist/test/resources/transactionData/exportInP.js +140 -0
  58. package/dist/test/resources/transactionData/importInP.d.ts +35 -0
  59. package/dist/test/resources/transactionData/importInP.d.ts.map +1 -0
  60. package/dist/test/resources/transactionData/importInP.js +58 -0
  61. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  62. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  63. package/dist/test/unit/lib/exportInCTxBuilder.js +166 -0
  64. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  65. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  66. package/dist/test/unit/lib/exportInPTxBuilder.js +121 -0
  67. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  68. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  69. package/dist/test/unit/lib/importInPTxBuilder.js +73 -0
  70. package/dist/test/unit/lib/keyPair.d.ts +2 -0
  71. package/dist/test/unit/lib/keyPair.d.ts.map +1 -0
  72. package/dist/test/unit/lib/keyPair.js +158 -0
  73. package/dist/test/unit/lib/signFlowTestSuit.d.ts +20 -0
  74. package/dist/test/unit/lib/signFlowTestSuit.d.ts.map +1 -0
  75. package/dist/test/unit/lib/signFlowTestSuit.js +93 -0
  76. package/dist/test/unit/lib/utils.js +29 -223
  77. package/dist/tsconfig.tsbuildinfo +1 -1
  78. package/package.json +16 -13
  79. package/.eslintignore +0 -5
  80. package/.eslintrc.json +0 -7
  81. package/.mocharc.yml +0 -8
  82. package/CHANGELOG.md +0 -0
  83. package/dist/src/iface.d.ts +0 -25
  84. package/dist/src/iface.d.ts.map +0 -1
  85. package/dist/src/iface.js +0 -3
  86. package/dist/src/lib/constants.d.ts +0 -11
  87. package/dist/src/lib/constants.d.ts.map +0 -1
  88. package/dist/src/lib/constants.js +0 -17
  89. package/dist/src/lib/errors.d.ts +0 -8
  90. package/dist/src/lib/errors.d.ts.map +0 -1
  91. package/dist/src/lib/errors.js +0 -19
  92. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  93. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  94. package/dist/src/lib/exportInCTxBuilder.js +0 -170
  95. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  96. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  97. package/dist/src/lib/exportInPTxBuilder.js +0 -56
  98. package/dist/test/unit/flrp.d.ts +0 -2
  99. package/dist/test/unit/flrp.d.ts.map +0 -1
  100. package/dist/test/unit/flrp.js +0 -118
  101. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  102. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  103. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  104. package/dist/test/unit/lib/exportTxBuilder.d.ts +0 -2
  105. package/dist/test/unit/lib/exportTxBuilder.d.ts.map +0 -1
  106. package/dist/test/unit/lib/exportTxBuilder.js +0 -45
  107. package/dist/test/unit/lib/transaction.d.ts +0 -2
  108. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  109. package/dist/test/unit/lib/transaction.js +0 -460
  110. package/dist/test/unit/smoke.d.ts +0 -2
  111. package/dist/test/unit/smoke.d.ts.map +0 -1
  112. package/dist/test/unit/smoke.js +0 -23
@@ -5,127 +5,171 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Transaction = void 0;
7
7
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
8
+ const flarejs_1 = require("@flarenetwork/flarejs");
8
9
  const buffer_1 = require("buffer");
9
- const iface_1 = require("./iface");
10
+ const crypto_1 = require("crypto");
10
11
  const utils_1 = __importDefault(require("./utils"));
11
12
  /**
12
- * Flare P-chain transaction implementation using FlareJS
13
- * Based on AVAX transaction patterns adapted for Flare network
13
+ * Checks if a signature is empty (first 90 hex chars are zeros)
14
+ * @param signature
15
+ * @returns {boolean}
14
16
  */
17
+ function isEmptySignature(signature) {
18
+ return !!signature && utils_1.default.removeHexPrefix(signature).startsWith(''.padStart(90, '0'));
19
+ }
20
+ /**
21
+ * Checks if an empty signature has an embedded address (non-zero bytes after position 90)
22
+ * @param signature Hex string of the signature
23
+ */
24
+ function hasEmbeddedAddress(signature) {
25
+ if (!isEmptySignature(signature))
26
+ return false;
27
+ const cleanSig = utils_1.default.removeHexPrefix(signature);
28
+ if (cleanSig.length < 130)
29
+ return false;
30
+ const embeddedPart = cleanSig.substring(90, 130);
31
+ // Check if it's not all zeros
32
+ return embeddedPart !== '0'.repeat(40);
33
+ }
34
+ /**
35
+ * Generates a function to check if a signature slot matches a given address.
36
+ * If signatures have embedded addresses, it matches by address.
37
+ * Otherwise, it just finds empty slots.
38
+ * @param signatures Array of signature hex strings
39
+ */
40
+ function generateSelectorSignature(signatures) {
41
+ // Check if any empty signature has an embedded address
42
+ const hasEmbeddedAddresses = signatures.some((sig) => isEmptySignature(sig) && hasEmbeddedAddress(sig));
43
+ if (hasEmbeddedAddresses) {
44
+ // Look for address embedded in the empty signature (after position 90)
45
+ return function (sig, address) {
46
+ try {
47
+ if (!isEmptySignature(sig)) {
48
+ return false;
49
+ }
50
+ const cleanSig = utils_1.default.removeHexPrefix(sig);
51
+ const embeddedAddr = cleanSig.substring(90, 130).toLowerCase();
52
+ return embeddedAddr === address.toLowerCase();
53
+ }
54
+ catch (e) {
55
+ return false;
56
+ }
57
+ };
58
+ }
59
+ else {
60
+ // Look for any empty slot (no embedded addresses)
61
+ return function (sig, address) {
62
+ return isEmptySignature(sig);
63
+ };
64
+ }
65
+ }
15
66
  class Transaction extends sdk_core_1.BaseTransaction {
16
67
  constructor(coinConfig) {
17
68
  super(coinConfig);
18
69
  this._threshold = 2;
19
70
  this._locktime = BigInt(0);
20
71
  this._fromAddresses = [];
72
+ this._to = [];
21
73
  this._rewardAddresses = [];
22
- this._utxos = [];
74
+ this._utxos = []; // Define proper type based on Flare's UTXO structure
23
75
  this._fee = {};
24
- this._memo = new Uint8Array(); // FlareJS memo field
25
76
  this._network = coinConfig.network;
26
- this._assetId = 'FLR'; // Default FLR asset
27
- this._blockchainID = this._network.blockchainID || '';
28
- this._networkID = this._network.networkID || 0;
29
- }
30
- /**
31
- * Get the base transaction from FlareJS UnsignedTx
32
- * TODO: Implement proper FlareJS transaction extraction
33
- */
34
- get flareTransaction() {
35
- return this._flareTransaction;
77
+ // Decode cb58-encoded asset ID to hex for use in transaction serialization
78
+ this._assetId = utils_1.default.cb58Decode(this._network.assetId).toString('hex');
79
+ this._blockchainID = this._network.blockchainID;
80
+ this._networkID = this._network.networkID;
36
81
  }
37
82
  get signature() {
38
- if (this.credentials.length === 0) {
83
+ if (!this.hasCredentials) {
39
84
  return [];
40
85
  }
41
- // TODO: Extract signatures from FlareJS credentials
42
- // For now, return placeholder
43
- return [];
86
+ return this.credentials[0].getSignatures().filter((s) => !isEmptySignature(s));
44
87
  }
45
88
  get credentials() {
46
- // TODO: Extract credentials from FlareJS transaction
47
- // For now, return empty array
48
- return [];
89
+ return this._flareTransaction?.credentials;
49
90
  }
50
91
  get hasCredentials() {
51
92
  return this.credentials !== undefined && this.credentials.length > 0;
52
93
  }
53
94
  /** @inheritdoc */
54
95
  canSign({ key }) {
55
- // TODO: Implement proper signing validation for FlareJS
56
96
  return true;
57
97
  }
58
- /**
59
- * Sign a Flare transaction using FlareJS
60
- * @param {KeyPair} keyPair
61
- */
62
98
  async sign(keyPair) {
63
99
  const prv = keyPair.getPrivateKey();
64
100
  if (!prv) {
65
101
  throw new sdk_core_1.SigningError('Missing private key');
66
102
  }
67
- if (!this.flareTransaction) {
103
+ if (!this._flareTransaction) {
68
104
  throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
69
105
  }
70
106
  if (!this.hasCredentials) {
71
107
  throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
72
108
  }
73
- // TODO: Implement FlareJS signing process
74
- // This will involve:
75
- // 1. Creating FlareJS signature using private key
76
- // 2. Attaching signature to appropriate credential
77
- // 3. Updating transaction with signed credentials
78
- throw new Error('FlareJS signing not yet implemented - placeholder');
79
- }
80
- /**
81
- * Set memo from string
82
- * @param {string} memo - Memo text
83
- */
84
- setMemo(memo) {
85
- this._memo = utils_1.default.stringToBytes(memo);
86
- }
87
- /**
88
- * Set memo from various formats
89
- * @param {string | Record<string, unknown> | Uint8Array} memo - Memo data
90
- */
91
- setMemoData(memo) {
92
- this._memo = utils_1.default.createMemoBytes(memo);
93
- }
94
- /**
95
- * Get memo as bytes (FlareJS format)
96
- * @returns {Uint8Array} Memo bytes
97
- */
98
- getMemoBytes() {
99
- return this._memo;
100
- }
101
- /**
102
- * Get memo as string
103
- * @returns {string} Memo string
104
- */
105
- getMemoString() {
106
- return utils_1.default.parseMemoBytes(this._memo);
107
- }
108
- /**
109
- * Check if transaction has memo
110
- * @returns {boolean} Whether memo exists and is not empty
111
- */
112
- hasMemo() {
113
- return this._memo.length > 0;
114
- }
115
- toHexString(byteArray) {
116
- return buffer_1.Buffer.from(byteArray).toString('hex');
109
+ const unsignedTx = this._flareTransaction;
110
+ const unsignedBytes = unsignedTx.toBytes();
111
+ const publicKey = flarejs_1.secp256k1.getPublicKey(prv);
112
+ // Derive both EVM and P-chain addresses from the public key
113
+ const evmAddressHex = new flarejs_1.Address(flarejs_1.secp256k1.publicKeyToEthAddress(publicKey)).toHex();
114
+ // P-chain address derivation: ripemd160(sha256(publicKey))
115
+ const sha256Hash = (0, crypto_1.createHash)('sha256').update(buffer_1.Buffer.from(publicKey)).digest();
116
+ const pChainAddressBuffer = (0, crypto_1.createHash)('ripemd160').update(sha256Hash).digest();
117
+ const pChainAddressHex = pChainAddressBuffer.toString('hex');
118
+ const addressMap = unsignedTx.getAddresses();
119
+ // Check for both EVM and P-chain address formats
120
+ const hasMatchingAddress = addressMap.some((addr) => {
121
+ const addrHex = buffer_1.Buffer.from(addr).toString('hex').toLowerCase();
122
+ return (addrHex === utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase() || addrHex === pChainAddressHex.toLowerCase());
123
+ });
124
+ if (hasMatchingAddress) {
125
+ const signature = await flarejs_1.secp256k1.sign(unsignedBytes, prv);
126
+ let signatureSet = false;
127
+ // Use address-based slot matching (like AVAX-P)
128
+ let checkSign = undefined;
129
+ for (const credential of unsignedTx.credentials) {
130
+ const signatures = credential.getSignatures();
131
+ if (checkSign === undefined) {
132
+ checkSign = generateSelectorSignature(signatures);
133
+ }
134
+ // Find the slot that matches this address
135
+ for (let i = 0; i < signatures.length; i++) {
136
+ const sig = signatures[i];
137
+ // Try matching with P-chain address first, then EVM address
138
+ if (checkSign(sig, pChainAddressHex) || checkSign(sig, utils_1.default.removeHexPrefix(evmAddressHex).toLowerCase())) {
139
+ credential.setSignature(i, signature);
140
+ signatureSet = true;
141
+ // Clear raw signed bytes since we've modified the transaction
142
+ this._rawSignedBytes = undefined;
143
+ break;
144
+ }
145
+ }
146
+ if (signatureSet)
147
+ break;
148
+ }
149
+ if (!signatureSet) {
150
+ throw new sdk_core_1.SigningError('No matching signature slot found for this private key');
151
+ }
152
+ }
117
153
  }
118
- /** @inheritdoc */
119
154
  toBroadcastFormat() {
120
- if (!this.flareTransaction) {
155
+ if (!this._flareTransaction) {
121
156
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
122
157
  }
123
- // TODO: Implement FlareJS transaction serialization
124
- // For now, return placeholder
125
- return 'flare-tx-hex-placeholder';
158
+ // If we have the original raw signed bytes, use them directly to preserve exact format
159
+ if (this._rawSignedBytes) {
160
+ return flarejs_1.utils.bufferToHex(this._rawSignedBytes);
161
+ }
162
+ const unsignedTx = this._flareTransaction;
163
+ // For signed transactions, return the full signed tx with credentials
164
+ // Check signature.length for robustness
165
+ if (this.signature.length > 0) {
166
+ return flarejs_1.utils.bufferToHex(unsignedTx.getSignedTx().toBytes());
167
+ }
168
+ // For unsigned transactions, return just the transaction bytes
169
+ return flarejs_1.utils.bufferToHex(unsignedTx.toBytes());
126
170
  }
127
171
  toJson() {
128
- if (!this.flareTransaction) {
172
+ if (!this._flareTransaction) {
129
173
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
130
174
  }
131
175
  return {
@@ -138,167 +182,60 @@ class Transaction extends sdk_core_1.BaseTransaction {
138
182
  signatures: this.signature,
139
183
  outputs: this.outputs,
140
184
  changeOutputs: this.changeOutputs,
141
- sourceChain: this._network.blockchainID,
142
- destinationChain: this._network.cChainBlockchainID,
143
- memo: this.getMemoString(), // Include memo in JSON representation
144
185
  };
145
186
  }
146
187
  setTransaction(tx) {
147
188
  this._flareTransaction = tx;
148
189
  }
149
- /**
150
- * Set the transaction type
151
- * @param {TransactionType} transactionType The transaction type to be set
152
- */
153
190
  setTransactionType(transactionType) {
154
- const supportedTypes = [
155
- sdk_core_1.TransactionType.Export,
156
- sdk_core_1.TransactionType.Import,
157
- sdk_core_1.TransactionType.AddValidator,
158
- sdk_core_1.TransactionType.AddDelegator,
159
- sdk_core_1.TransactionType.AddPermissionlessValidator,
160
- sdk_core_1.TransactionType.AddPermissionlessDelegator,
161
- ];
162
- if (!supportedTypes.includes(transactionType)) {
191
+ if (![sdk_core_1.TransactionType.AddPermissionlessValidator].includes(transactionType)) {
163
192
  throw new Error(`Transaction type ${transactionType} is not supported`);
164
193
  }
165
194
  this._type = transactionType;
166
195
  }
167
- /**
168
- * Returns the portion of the transaction that needs to be signed in Buffer format.
169
- * Only needed for coins that support adding signatures directly (e.g. TSS).
170
- */
171
196
  get signablePayload() {
172
- if (!this.flareTransaction) {
173
- throw new sdk_core_1.InvalidTransactionError('Empty transaction for signing');
174
- }
175
- // TODO: Implement FlareJS signable payload extraction
176
- // For now, return placeholder
177
- return buffer_1.Buffer.from('flare-signable-payload');
197
+ return utils_1.default.sha256(this._flareTransaction.toBytes());
178
198
  }
179
199
  get id() {
180
- if (!this.flareTransaction) {
181
- throw new sdk_core_1.InvalidTransactionError('Empty transaction for ID generation');
182
- }
183
- // TODO: Implement FlareJS transaction ID generation
184
- // For now, return placeholder
185
- return 'flare-transaction-id-placeholder';
200
+ const bufferArray = utils_1.default.sha256(this._flareTransaction.toBytes());
201
+ return utils_1.default.cb58Encode(buffer_1.Buffer.from(bufferArray));
186
202
  }
187
203
  get fromAddresses() {
188
- return this._fromAddresses.map((address) => {
189
- // TODO: Format addresses using FlareJS utilities
190
- return address;
191
- });
204
+ return this._fromAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
192
205
  }
193
206
  get rewardAddresses() {
194
- return this._rewardAddresses.map((address) => {
195
- // TODO: Format addresses using FlareJS utilities
196
- return address;
197
- });
207
+ return this._rewardAddresses.map((a) => flarejs_1.utils.format(this._network.alias, this._network.hrp, a));
208
+ }
209
+ get fee() {
210
+ return { fee: '0', ...this._fee };
198
211
  }
199
- /**
200
- * Get the list of outputs. Amounts are expressed in absolute value.
201
- */
202
212
  get outputs() {
203
213
  switch (this.type) {
204
- case sdk_core_1.TransactionType.Export:
205
- // TODO: Extract export outputs from FlareJS transaction
206
- return [];
207
- case sdk_core_1.TransactionType.Import:
208
- // TODO: Extract import outputs from FlareJS transaction
209
- return [];
210
- case sdk_core_1.TransactionType.AddValidator:
211
214
  case sdk_core_1.TransactionType.AddPermissionlessValidator:
212
- // TODO: Extract validator outputs from FlareJS transaction
213
- return [
214
- {
215
- address: this._nodeID || 'placeholder-node-id',
216
- value: this._stakeAmount?.toString() || '0',
217
- },
218
- ];
219
- case sdk_core_1.TransactionType.AddDelegator:
220
- case sdk_core_1.TransactionType.AddPermissionlessDelegator:
221
- // TODO: Extract delegator outputs from FlareJS transaction
222
215
  return [
223
216
  {
224
- address: this._nodeID || 'placeholder-node-id',
225
- value: this._stakeAmount?.toString() || '0',
217
+ address: this._flareTransaction.getTx().subnetValidator.validator.nodeId.toString(),
218
+ value: this._flareTransaction.getTx().subnetValidator.validator.weight.toJSON(),
226
219
  },
227
220
  ];
228
221
  default:
229
222
  return [];
230
223
  }
231
224
  }
232
- get fee() {
233
- return { fee: '0', ...this._fee };
234
- }
235
225
  get changeOutputs() {
236
- // TODO: Extract change outputs from FlareJS transaction
237
- // For now, return empty array
238
- return [];
239
- }
240
- get inputs() {
241
- // TODO: Extract inputs from FlareJS transaction
242
- // For now, return placeholder based on UTXOs
243
- return this._utxos.map((utxo) => ({
244
- id: utxo.txid + iface_1.INPUT_SEPARATOR + utxo.outputidx,
245
- address: this.fromAddresses.sort().join(iface_1.ADDRESS_SEPARATOR),
246
- value: utxo.amount,
247
- }));
248
- }
249
- /**
250
- * Flare wrapper to create signature and return it for credentials
251
- * @param prv
252
- * @return hexstring
253
- */
254
- createSignature(prv) {
255
- // TODO: Implement FlareJS signature creation
256
- // This should use FlareJS signing utilities
257
- const signval = utils_1.default.createSignature(this._network, this.signablePayload, prv);
258
- return signval.toString('hex');
226
+ return this._flareTransaction.getTx().baseTx.outputs.map(utils_1.default.mapOutputToEntry(this._network));
259
227
  }
260
- /**
261
- * Check if transaction is for C-chain (cross-chain)
262
- */
263
- get isTransactionForCChain() {
264
- return this.type === sdk_core_1.TransactionType.Export || this.type === sdk_core_1.TransactionType.Import;
265
- }
266
- /** @inheritdoc */
267
228
  explainTransaction() {
268
229
  const txJson = this.toJson();
269
230
  const displayOrder = ['id', 'inputs', 'outputAmount', 'changeAmount', 'outputs', 'changeOutputs', 'fee', 'type'];
270
- // Add memo to display order if present
271
- if (this.hasMemo()) {
272
- displayOrder.push('memo');
273
- }
274
- // Calculate total output amount
275
- const outputAmount = txJson.outputs
276
- .reduce((sum, output) => {
277
- return sum + BigInt(output.value || '0');
278
- }, BigInt(0))
279
- .toString();
280
- // Calculate total change amount
281
- const changeAmount = txJson.changeOutputs
282
- .reduce((sum, output) => {
283
- return sum + BigInt(output.value || '0');
284
- }, BigInt(0))
285
- .toString();
231
+ const outputAmount = txJson.outputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
232
+ const changeAmount = txJson.changeOutputs.reduce((p, n) => p + BigInt(n.value), BigInt(0)).toString();
286
233
  let rewardAddresses;
287
- const stakingTypes = [
288
- sdk_core_1.TransactionType.AddValidator,
289
- sdk_core_1.TransactionType.AddDelegator,
290
- sdk_core_1.TransactionType.AddPermissionlessValidator,
291
- sdk_core_1.TransactionType.AddPermissionlessDelegator,
292
- ];
293
- if (stakingTypes.includes(txJson.type)) {
234
+ if ([sdk_core_1.TransactionType.AddPermissionlessValidator].includes(txJson.type)) {
294
235
  rewardAddresses = this.rewardAddresses;
295
236
  displayOrder.splice(6, 0, 'rewardAddresses');
296
237
  }
297
- // Add cross-chain information for export/import
298
- if (this.isTransactionForCChain) {
299
- displayOrder.push('sourceChain', 'destinationChain');
300
- }
301
- const explanation = {
238
+ return {
302
239
  displayOrder,
303
240
  id: txJson.id,
304
241
  inputs: txJson.inputs,
@@ -310,12 +247,7 @@ class Transaction extends sdk_core_1.BaseTransaction {
310
247
  fee: this.fee,
311
248
  type: txJson.type,
312
249
  };
313
- // Add memo to explanation if present
314
- if (this.hasMemo()) {
315
- explanation.memo = this.getMemoString();
316
- }
317
- return explanation;
318
250
  }
319
251
  }
320
252
  exports.Transaction = Transaction;
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUU5QixtQ0FBZ0M7QUFDaEMsbUNBUWlCO0FBRWpCLG9EQUE0QjtBQUU1Qjs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSwwQkFBZTtJQXNCOUMsWUFBWSxVQUFnQztRQUMxQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFaYixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsY0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFDaEMsV0FBTSxHQUFxQixFQUFFLENBQUM7UUFFOUIsU0FBSSxHQUE0QixFQUFFLENBQUM7UUFHbkMsVUFBSyxHQUFlLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFJaEUsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsT0FBdUIsQ0FBQztRQUNuRCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLG9CQUFvQjtRQUMzQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQStCLENBQUM7SUFDOUMsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFD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QU0sQ0FBQyxJQUFJO1NBQ2xCLENBQUM7UUFFRixxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNuQixXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMxQyxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGO0FBNVdELGtDQTRXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFVuc2lnbmVkVHgsIENyZWRlbnRpYWwgfSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHtcbiAgQmFzZUtleSxcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBFbnRyeSxcbiAgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsXG4gIFNpZ25pbmdFcnJvcixcbiAgVHJhbnNhY3Rpb25GZWUsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgRmxhcmVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHtcbiAgQUREUkVTU19TRVBBUkFUT1IsXG4gIERlY29kZWRVdHhvT2JqLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFR4LFxuICBUeERhdGEsXG4gIEZscnBFbnRyeSxcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9uIGltcGxlbWVudGF0aW9uIHVzaW5nIEZsYXJlSlNcbiAqIEJhc2VkIG9uIEFWQVggdHJhbnNhY3Rpb24gcGF0dGVybnMgYWRhcHRlZCBmb3IgRmxhcmUgbmV0d29ya1xuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2ZsYXJlVHJhbnNhY3Rpb246IFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBGbGFyZU5ldHdvcms7XG4gIHB1YmxpYyBfbmV0d29ya0lEOiBudW1iZXI7XG4gIHB1YmxpYyBfYXNzZXRJZDogc3RyaW5nO1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogc3RyaW5nO1xuICBwdWJsaWMgX25vZGVJRDogc3RyaW5nO1xuICBwdWJsaWMgX3N0YXJ0VGltZTogYmlnaW50O1xuICBwdWJsaWMgX2VuZFRpbWU6IGJpZ2ludDtcbiAgcHVibGljIF9zdGFrZUFtb3VudDogYmlnaW50O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWUgPSBCaWdJbnQoMCk7XG4gIHB1YmxpYyBfZnJvbUFkZHJlc3Nlczogc3RyaW5nW10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IHN0cmluZ1tdID0gW107XG4gIHB1YmxpYyBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcbiAgcHVibGljIF90bzogc3RyaW5nW107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuICBwdWJsaWMgX2Jsc1B1YmxpY0tleTogc3RyaW5nO1xuICBwdWJsaWMgX2Jsc1NpZ25hdHVyZTogc3RyaW5nO1xuICBwdWJsaWMgX21lbW86IFVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheSgpOyAvLyBGbGFyZUpTIG1lbW8gZmllbGRcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKGNvaW5Db25maWcpO1xuICAgIHRoaXMuX25ldHdvcmsgPSBjb2luQ29uZmlnLm5ldHdvcmsgYXMgRmxhcmVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSAnRkxSJzsgLy8gRGVmYXVsdCBGTFIgYXNzZXRcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCB8fCAnJztcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRCB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYmFzZSB0cmFuc2FjdGlvbiBmcm9tIEZsYXJlSlMgVW5zaWduZWRUeFxuICAgKiBUT0RPOiBJbXBsZW1lbnQgcHJvcGVyIEZsYXJlSlMgdHJhbnNhY3Rpb24gZXh0cmFjdGlvblxuICAgKi9cbiAgZ2V0IGZsYXJlVHJhbnNhY3Rpb24oKTogVW5zaWduZWRUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBUT0RPOiBFeHRyYWN0IHNpZ25hdHVyZXMgZnJvbSBGbGFyZUpTIGNyZWRlbnRpYWxzXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBjcmVkZW50aWFscyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogSW1wbGVtZW50IHByb3BlciBzaWduaW5nIHZhbGlkYXRpb24gZm9yIEZsYXJlSlNcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIGEgRmxhcmUgdHJhbnNhY3Rpb24gdXNpbmcgRmxhcmVKU1xuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpIGFzIEJ1ZmZlcjtcblxuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgU2lnbmluZ0Vycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdlbXB0eSBjcmVkZW50aWFscyB0byBzaWduJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmluZyBwcm9jZXNzXG4gICAgLy8gVGhpcyB3aWxsIGludm9sdmU6XG4gICAgLy8gMS4gQ3JlYXRpbmcgRmxhcmVKUyBzaWduYXR1cmUgdXNpbmcgcHJpdmF0ZSBrZXlcbiAgICAvLyAyLiBBdHRhY2hpbmcgc2lnbmF0dXJlIHRvIGFwcHJvcHJpYXRlIGNyZWRlbnRpYWxcbiAgICAvLyAzLiBVcGRhdGluZyB0cmFuc2FjdGlvbiB3aXRoIHNpZ25lZCBjcmVkZW50aWFsc1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdGbGFyZUpTIHNpZ25pbmcgbm90IHlldCBpbXBsZW1lbnRlZCAtIHBsYWNlaG9sZGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSBzdHJpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lbW8gLSBNZW1vIHRleHRcbiAgICovXG4gIHNldE1lbW8obWVtbzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fbWVtbyA9IHV0aWxzLnN0cmluZ1RvQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1lbW8gZnJvbSB2YXJpb3VzIGZvcm1hdHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IFVpbnQ4QXJyYXl9IG1lbW8gLSBNZW1vIGRhdGFcbiAgICovXG4gIHNldE1lbW9EYXRhKG1lbW86IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgVWludDhBcnJheSk6IHZvaWQge1xuICAgIHRoaXMuX21lbW8gPSB1dGlscy5jcmVhdGVNZW1vQnl0ZXMobWVtbyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lbW8gYXMgYnl0ZXMgKEZsYXJlSlMgZm9ybWF0KVxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gTWVtbyBieXRlc1xuICAgKi9cbiAgZ2V0TWVtb0J5dGVzKCk6IFVpbnQ4QXJyYXkge1xuICAgIHJldHVybiB0aGlzLl9tZW1vO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1vIGFzIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBNZW1vIHN0cmluZ1xuICAgKi9cbiAgZ2V0TWVtb1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5wYXJzZU1lbW9CeXRlcyh0aGlzLl9tZW1vKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0cmFuc2FjdGlvbiBoYXMgbWVtb1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtZW1vIGV4aXN0cyBhbmQgaXMgbm90IGVtcHR5XG4gICAqL1xuICBoYXNNZW1vKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9tZW1vLmxlbmd0aCA+IDA7XG4gIH1cblxuICB0b0hleFN0cmluZyhieXRlQXJyYXk6IFVpbnQ4QXJyYXkpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShieXRlQXJyYXkpLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b0Jyb2FkY2FzdEZvcm1hdCgpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBJbXBsZW1lbnQgRmxhcmVKUyB0cmFuc2FjdGlvbiBzZXJpYWxpemF0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuICdmbGFyZS10eC1oZXgtcGxhY2Vob2xkZXInO1xuICB9XG5cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIGlucHV0czogdGhpcy5pbnB1dHMsXG4gICAgICBmcm9tQWRkcmVzc2VzOiB0aGlzLmZyb21BZGRyZXNzZXMsXG4gICAgICB0aHJlc2hvbGQ6IHRoaXMuX3RocmVzaG9sZCxcbiAgICAgIGxvY2t0aW1lOiB0aGlzLl9sb2NrdGltZS50b1N0cmluZygpLFxuICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgc2lnbmF0dXJlczogdGhpcy5zaWduYXR1cmUsXG4gICAgICBvdXRwdXRzOiB0aGlzLm91dHB1dHMsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0aGlzLmNoYW5nZU91dHB1dHMsXG4gICAgICBzb3VyY2VDaGFpbjogdGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQsXG4gICAgICBkZXN0aW5hdGlvbkNoYWluOiB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCxcbiAgICAgIG1lbW86IHRoaXMuZ2V0TWVtb1N0cmluZygpLCAvLyBJbmNsdWRlIG1lbW8gaW4gSlNPTiByZXByZXNlbnRhdGlvblxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBjb25zdCBzdXBwb3J0ZWRUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuSW1wb3J0LFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcixcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gICAgXTtcblxuICAgIGlmICghc3VwcG9ydGVkVHlwZXMuaW5jbHVkZXModHJhbnNhY3Rpb25UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIGlmICghdGhpcy5mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGZvciBzaWduaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogSW1wbGVtZW50IEZsYXJlSlMgc2lnbmFibGUgcGF5bG9hZCBleHRyYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyXG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKCdmbGFyZS1zaWduYWJsZS1wYXlsb2FkJyk7XG4gIH1cblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuZmxhcmVUcmFuc2FjdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKCdFbXB0eSB0cmFuc2FjdGlvbiBmb3IgSUQgZ2VuZXJhdGlvbicpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHRyYW5zYWN0aW9uIElEIGdlbmVyYXRpb25cbiAgICAvLyBGb3Igbm93LCByZXR1cm4gcGxhY2Vob2xkZXJcbiAgICByZXR1cm4gJ2ZsYXJlLXRyYW5zYWN0aW9uLWlkLXBsYWNlaG9sZGVyJztcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHJld2FyZEFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jld2FyZEFkZHJlc3Nlcy5tYXAoKGFkZHJlc3MpID0+IHtcbiAgICAgIC8vIFRPRE86IEZvcm1hdCBhZGRyZXNzZXMgdXNpbmcgRmxhcmVKUyB1dGlsaXRpZXNcbiAgICAgIHJldHVybiBhZGRyZXNzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBvdXRwdXRzLiBBbW91bnRzIGFyZSBleHByZXNzZWQgaW4gYWJzb2x1dGUgdmFsdWUuXG4gICAqL1xuICBnZXQgb3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IGV4cG9ydCBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW107XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIC8vIFRPRE86IEV4dHJhY3QgaW1wb3J0IG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yOlxuICAgICAgICAvLyBUT0RPOiBFeHRyYWN0IHZhbGlkYXRvciBvdXRwdXRzIGZyb20gRmxhcmVKUyB0cmFuc2FjdGlvblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IHRoaXMuX25vZGVJRCB8fCAncGxhY2Vob2xkZXItbm9kZS1pZCcsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy5fc3Rha2VBbW91bnQ/LnRvU3RyaW5nKCkgfHwgJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3I6XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc0RlbGVnYXRvcjpcbiAgICAgICAgLy8gVE9ETzogRXh0cmFjdCBkZWxlZ2F0b3Igb3V0cHV0cyBmcm9tIEZsYXJlSlMgdHJhbnNhY3Rpb25cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLl9ub2RlSUQgfHwgJ3BsYWNlaG9sZGVyLW5vZGUtaWQnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3N0YWtlQW1vdW50Py50b1N0cmluZygpIHx8ICcwJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBjaGFuZ2VPdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIC8vIFRPRE86IEV4dHJhY3QgY2hhbmdlIG91dHB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIGVtcHR5IGFycmF5XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBGbHJwRW50cnlbXSB7XG4gICAgLy8gVE9ETzogRXh0cmFjdCBpbnB1dHMgZnJvbSBGbGFyZUpTIHRyYW5zYWN0aW9uXG4gICAgLy8gRm9yIG5vdywgcmV0dXJuIHBsYWNlaG9sZGVyIGJhc2VkIG9uIFVUWE9zXG4gICAgcmV0dXJuIHRoaXMuX3V0eG9zLm1hcCgodXR4bykgPT4gKHtcbiAgICAgIGlkOiB1dHhvLnR4aWQgKyBJTlBVVF9TRVBBUkFUT1IgKyB1dHhvLm91dHB1dGlkeCxcbiAgICAgIGFkZHJlc3M6IHRoaXMuZnJvbUFkZHJlc3Nlcy5zb3J0KCkuam9pbihBRERSRVNTX1NFUEFSQVRPUiksXG4gICAgICB2YWx1ZTogdXR4by5hbW91bnQsXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXJlIHdyYXBwZXIgdG8gY3JlYXRlIHNpZ25hdHVyZSBhbmQgcmV0dXJuIGl0IGZvciBjcmVkZW50aWFsc1xuICAgKiBAcGFyYW0gcHJ2XG4gICAqIEByZXR1cm4gaGV4c3RyaW5nXG4gICAqL1xuICBjcmVhdGVTaWduYXR1cmUocHJ2OiBCdWZmZXIpOiBzdHJpbmcge1xuICAgIC8vIFRPRE86IEltcGxlbWVudCBGbGFyZUpTIHNpZ25hdHVyZSBjcmVhdGlvblxuICAgIC8vIFRoaXMgc2hvdWxkIHVzZSBGbGFyZUpTIHNpZ25pbmcgdXRpbGl0aWVzXG4gICAgY29uc3Qgc2lnbnZhbCA9IHV0aWxzLmNyZWF0ZVNpZ25hdHVyZSh0aGlzLl9uZXR3b3JrLCB0aGlzLnNpZ25hYmxlUGF5bG9hZCwgcHJ2KTtcbiAgICByZXR1cm4gc2lnbnZhbC50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHJhbnNhY3Rpb24gaXMgZm9yIEMtY2hhaW4gKGNyb3NzLWNoYWluKVxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkV4cG9ydCB8fCB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdpbnB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcblxuICAgIC8vIEFkZCBtZW1vIHRvIGRpc3BsYXkgb3JkZXIgaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZGlzcGxheU9yZGVyLnB1c2goJ21lbW8nKTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgb3V0cHV0IGFtb3VudFxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHR4SnNvbi5vdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgY2hhbmdlIGFtb3VudFxuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHR4SnNvbi5jaGFuZ2VPdXRwdXRzXG4gICAgICAucmVkdWNlKChzdW0sIG91dHB1dCkgPT4ge1xuICAgICAgICByZXR1cm4gc3VtICsgQmlnSW50KG91dHB1dC52YWx1ZSB8fCAnMCcpO1xuICAgICAgfSwgQmlnSW50KDApKVxuICAgICAgLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGNvbnN0IHN0YWtpbmdUeXBlcyA9IFtcbiAgICAgIFRyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IsXG4gICAgICBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAgICAgVHJhbnNhY3Rpb25UeXBlLkFkZFBlcm1pc3Npb25sZXNzRGVsZWdhdG9yLFxuICAgIF07XG5cbiAgICBpZiAoc3Rha2luZ1R5cGVzLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY3Jvc3MtY2hhaW4gaW5mb3JtYXRpb24gZm9yIGV4cG9ydC9pbXBvcnRcbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uRm9yQ0NoYWluKSB7XG4gICAgICBkaXNwbGF5T3JkZXIucHVzaCgnc291cmNlQ2hhaW4nLCAnZGVzdGluYXRpb25DaGFpbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGV4cGxhbmF0aW9uOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uICYgeyBtZW1vPzogc3RyaW5nIH0gPSB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIG1lbW8gdG8gZXhwbGFuYXRpb24gaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLmhhc01lbW8oKSkge1xuICAgICAgZXhwbGFuYXRpb24ubWVtbyA9IHRoaXMuZ2V0TWVtb1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsYW5hdGlvbjtcbiAgfVxufVxuIl19
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLG1EQVE4QjtBQUM5QixtREFRK0I7QUFDL0IsbUNBQWdDO0FBQ2hDLG1DQUFvQztBQUdwQyxvREFBNEI7QUFFNUI7Ozs7R0FJRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsU0FBaUI7SUFDekMsT0FBTyxDQUFDLENBQUMsU0FBUyxJQUFJLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQztBQVNEOzs7R0FHRztBQUNILFNBQVMsa0JBQWtCLENBQUMsU0FBaUI7SUFDM0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUc7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCw4QkFBOEI7SUFDOUIsT0FBTyxZQUFZLEtBQUssR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLHlCQUF5QixDQUFDLFVBQW9CO0lBQ3JELHVEQUF1RDtJQUN2RCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxD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R0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzdFLFlBQVk7WUFDWixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekYsWUFBWTtZQUNaLGVBQWU7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7U0FDbEIsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTVPRCxrQ0E0T0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGbGFyZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uVHlwZSxcbiAgVHJhbnNhY3Rpb25GZWUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7XG4gIHV0aWxzIGFzIEZsYXJlVXRpbHMsXG4gIENyZWRlbnRpYWwsXG4gIHB2bVNlcmlhbCxcbiAgVW5zaWduZWRUeCxcbiAgc2VjcDI1NmsxLFxuICBFVk1VbnNpZ25lZFR4LFxuICBBZGRyZXNzLFxufSBmcm9tICdAZmxhcmVuZXR3b3JrL2ZsYXJlanMnO1xuaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSAnYnVmZmVyJztcbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgRGVjb2RlZFV0eG9PYmosIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIFR4LCBUeERhdGEgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHNpZ25hdHVyZSBpcyBlbXB0eSAoZmlyc3QgOTAgaGV4IGNoYXJzIGFyZSB6ZXJvcylcbiAqIEBwYXJhbSBzaWduYXR1cmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHNpZ25hdHVyZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXNpZ25hdHVyZSAmJiB1dGlscy5yZW1vdmVIZXhQcmVmaXgoc2lnbmF0dXJlKS5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHNpZ25hdHVyZSBzbG90IGNoZWNraW5nXG4gKi9cbmludGVyZmFjZSBDaGVja1NpZ25hdHVyZSB7XG4gIChzaWduYXR1cmU6IHN0cmluZywgYWRkcmVzc0hleDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gZW1wdHkgc2lnbmF0dXJlIGhhcyBhbiBlbWJlZGRlZCBhZGRyZXNzIChub24temVybyBieXRlcyBhZnRlciBwb3NpdGlvbiA5MClcbiAqIEBwYXJhbSBzaWduYXR1cmUgSGV4IHN0cmluZyBvZiB0aGUgc2lnbmF0dXJlXG4gKi9cbmZ1bmN0aW9uIGhhc0VtYmVkZGVkQWRkcmVzcyhzaWduYXR1cmU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnbmF0dXJlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBjbGVhblNpZyA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWduYXR1cmUpO1xuICBpZiAoY2xlYW5TaWcubGVuZ3RoIDwgMTMwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVtYmVkZGVkUGFydCA9IGNsZWFuU2lnLnN1YnN0cmluZyg5MCwgMTMwKTtcbiAgLy8gQ2hlY2sgaWYgaXQncyBub3QgYWxsIHplcm9zXG4gIHJldHVybiBlbWJlZGRlZFBhcnQgIT09ICcwJy5yZXBlYXQoNDApO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIGEgc2lnbmF0dXJlIHNsb3QgbWF0Y2hlcyBhIGdpdmVuIGFkZHJlc3MuXG4gKiBJZiBzaWduYXR1cmVzIGhhdmUgZW1iZWRkZWQgYWRkcmVzc2VzLCBpdCBtYXRjaGVzIGJ5IGFkZHJlc3MuXG4gKiBPdGhlcndpc2UsIGl0IGp1c3QgZmluZHMgZW1wdHkgc2xvdHMuXG4gKiBAcGFyYW0gc2lnbmF0dXJlcyBBcnJheSBvZiBzaWduYXR1cmUgaGV4IHN0cmluZ3NcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzdHJpbmdbXSk6IENoZWNrU2lnbmF0dXJlIHtcbiAgLy8gQ2hlY2sgaWYgYW55IGVtcHR5IHNpZ25hdHVyZSBoYXMgYW4gZW1iZWRkZWQgYWRkcmVzc1xuICBjb25zdCBoYXNFbWJlZGRlZEFkZHJlc3NlcyA9IHNpZ25hdHVyZXMuc29tZSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZykgJiYgaGFzRW1iZWRkZWRBZGRyZXNzKHNpZykpO1xuXG4gIGlmIChoYXNFbWJlZGRlZEFkZHJlc3Nlcykge1xuICAgIC8vIExvb2sgZm9yIGFkZHJlc3MgZW1iZWRkZWQgaW4gdGhlIGVtcHR5IHNpZ25hdHVyZSAoYWZ0ZXIgcG9zaXRpb24gOTApXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWc6IHN0cmluZywgYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUoc2lnKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjbGVhblNpZyA9IHV0aWxzLnJlbW92ZUhleFByZWZpeChzaWcpO1xuICAgICAgICBjb25zdCBlbWJlZGRlZEFkZHIgPSBjbGVhblNpZy5zdWJzdHJpbmcoOTAsIDEzMCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIGVtYmVkZGVkQWRkciA9PT0gYWRkcmVzcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBhbnkgZW1wdHkgc2xvdCAobm8gZW1iZWRkZWQgYWRkcmVzc2VzKVxuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnOiBzdHJpbmcsIGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGlzRW1wdHlTaWduYXR1cmUoc2lnKTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByb3RlY3RlZCBfZmxhcmVUcmFuc2FjdGlvbjogVHg7XG4gIHB1YmxpYyBfdHlwZTogVHJhbnNhY3Rpb25UeXBlO1xuICBwdWJsaWMgX25ldHdvcms6IEZsYXJlTmV0d29yaztcbiAgcHVibGljIF9uZXR3b3JrSUQ6IG51bWJlcjtcbiAgcHVibGljIF9hc3NldElkOiBzdHJpbmc7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBzdHJpbmc7XG4gIHB1YmxpYyBfbm9kZUlEOiBzdHJpbmc7XG4gIHB1YmxpYyBfc3RhcnRUaW1lOiBiaWdpbnQ7XG4gIHB1YmxpYyBfZW5kVGltZTogYmlnaW50O1xuICBwdWJsaWMgX3N0YWtlQW1vdW50OiBiaWdpbnQ7XG4gIHB1YmxpYyBfdGhyZXNob2xkID0gMjtcbiAgcHVibGljIF9sb2NrdGltZSA9IEJpZ0ludCgwKTtcbiAgcHVibGljIF9mcm9tQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF90bzogVWludDhBcnJheVtdID0gW107XG4gIHB1YmxpYyBfcmV3YXJkQWRkcmVzc2VzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgcHVibGljIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdOyAvLyBEZWZpbmUgcHJvcGVyIHR5cGUgYmFzZWQgb24gRmxhcmUncyBVVFhPIHN0cnVjdHVyZVxuICBwdWJsaWMgX2ZlZTogUGFydGlhbDxUcmFuc2FjdGlvbkZlZT4gPSB7fTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgcmF3IHNpZ25lZCBieXRlcyB0byBwcmVzZXJ2ZSBleGFjdCBmb3JtYXQgd2hlbiByZS1zZXJpYWxpemluZ1xuICBwdWJsaWMgX3Jhd1NpZ25lZEJ5dGVzOiBCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEZsYXJlTmV0d29yaztcbiAgICAvLyBEZWNvZGUgY2I1OC1lbmNvZGVkIGFzc2V0IElEIHRvIGhleCBmb3IgdXNlIGluIHRyYW5zYWN0aW9uIHNlcmlhbGl6YXRpb25cbiAgICB0aGlzLl9hc3NldElkID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmFzc2V0SWQpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB0aGlzLl9ibG9ja2NoYWluSUQgPSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRDtcbiAgICB0aGlzLl9uZXR3b3JrSUQgPSB0aGlzLl9uZXR3b3JrLm5ldHdvcmtJRDtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5oYXNDcmVkZW50aWFscykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jcmVkZW50aWFsc1swXS5nZXRTaWduYXR1cmVzKCkuZmlsdGVyKChzKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShzKSk7XG4gIH1cblxuICBnZXQgY3JlZGVudGlhbHMoKTogQ3JlZGVudGlhbFtdIHtcbiAgICByZXR1cm4gKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCk/LmNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGNhblNpZ24oeyBrZXkgfTogQmFzZUtleSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2lnbihrZXlQYWlyOiBLZXlQYWlyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJ2ID0ga2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgVWludDhBcnJheTtcbiAgICBpZiAoIXBydikge1xuICAgICAgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignTWlzc2luZyBwcml2YXRlIGtleScpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgY3JlZGVudGlhbHMgdG8gc2lnbicpO1xuICAgIH1cblxuICAgIGNvbnN0IHVuc2lnbmVkVHggPSB0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIEVWTVVuc2lnbmVkVHg7XG4gICAgY29uc3QgdW5zaWduZWRCeXRlcyA9IHVuc2lnbmVkVHgudG9CeXRlcygpO1xuICAgIGNvbnN0IHB1YmxpY0tleSA9IHNlY3AyNTZrMS5nZXRQdWJsaWNLZXkocHJ2KTtcblxuICAgIC8vIERlcml2ZSBib3RoIEVWTSBhbmQgUC1jaGFpbiBhZGRyZXNzZXMgZnJvbSB0aGUgcHVibGljIGtleVxuICAgIGNvbnN0IGV2bUFkZHJlc3NIZXggPSBuZXcgQWRkcmVzcyhzZWNwMjU2azEucHVibGljS2V5VG9FdGhBZGRyZXNzKHB1YmxpY0tleSkpLnRvSGV4KCk7XG5cbiAgICAvLyBQLWNoYWluIGFkZHJlc3MgZGVyaXZhdGlvbjogcmlwZW1kMTYwKHNoYTI1NihwdWJsaWNLZXkpKVxuICAgIGNvbnN0IHNoYTI1Nkhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoQnVmZmVyLmZyb20ocHVibGljS2V5KSkuZGlnZXN0KCk7XG4gICAgY29uc3QgcENoYWluQWRkcmVzc0J1ZmZlciA9IGNyZWF0ZUhhc2goJ3JpcGVtZDE2MCcpLnVwZGF0ZShzaGEyNTZIYXNoKS5kaWdlc3QoKTtcbiAgICBjb25zdCBwQ2hhaW5BZGRyZXNzSGV4ID0gcENoYWluQWRkcmVzc0J1ZmZlci50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCBhZGRyZXNzTWFwID0gdW5zaWduZWRUeC5nZXRBZGRyZXNzZXMoKTtcblxuICAgIC8vIENoZWNrIGZvciBib3RoIEVWTSBhbmQgUC1jaGFpbiBhZGRyZXNzIGZvcm1hdHNcbiAgICBjb25zdCBoYXNNYXRjaGluZ0FkZHJlc3MgPSBhZGRyZXNzTWFwLnNvbWUoKGFkZHIpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJIZXggPSBCdWZmZXIuZnJvbShhZGRyKS50b1N0cmluZygnaGV4JykudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGFkZHJIZXggPT09IHV0aWxzLnJlbW92ZUhleFByZWZpeChldm1BZGRyZXNzSGV4KS50b0xvd2VyQ2FzZSgpIHx8IGFkZHJIZXggPT09IHBDaGFpbkFkZHJlc3NIZXgudG9Mb3dlckNhc2UoKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGlmIChoYXNNYXRjaGluZ0FkZHJlc3MpIHtcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IHNlY3AyNTZrMS5zaWduKHVuc2lnbmVkQnl0ZXMsIHBydik7XG5cbiAgICAgIGxldCBzaWduYXR1cmVTZXQgPSBmYWxzZTtcbiAgICAgIC8vIFVzZSBhZGRyZXNzLWJhc2VkIHNsb3QgbWF0Y2hpbmcgKGxpa2UgQVZBWC1QKVxuICAgICAgbGV0IGNoZWNrU2lnbjogQ2hlY2tTaWduYXR1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGZvciAoY29uc3QgY3JlZGVudGlhbCBvZiB1bnNpZ25lZFR4LmNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZXMgPSBjcmVkZW50aWFsLmdldFNpZ25hdHVyZXMoKTtcbiAgICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2hlY2tTaWduID0gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpbmQgdGhlIHNsb3QgdGhhdCBtYXRjaGVzIHRoaXMgYWRkcmVzc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpZ25hdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBzaWcgPSBzaWduYXR1cmVzW2ldO1xuICAgICAgICAgIC8vIFRyeSBtYXRjaGluZyB3aXRoIFAtY2hhaW4gYWRkcmVzcyBmaXJzdCwgdGhlbiBFVk0gYWRkcmVzc1xuICAgICAgICAgIGlmIChjaGVja1NpZ24oc2lnLCBwQ2hhaW5BZGRyZXNzSGV4KSB8fCBjaGVja1NpZ24oc2lnLCB1dGlscy5yZW1vdmVIZXhQcmVmaXgoZXZtQWRkcmVzc0hleCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIGNyZWRlbnRpYWwuc2V0U2lnbmF0dXJlKGksIHNpZ25hdHVyZSk7XG4gICAgICAgICAgICBzaWduYXR1cmVTZXQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQ2xlYXIgcmF3IHNpZ25lZCBieXRlcyBzaW5jZSB3ZSd2ZSBtb2RpZmllZCB0aGUgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgIHRoaXMuX3Jhd1NpZ25lZEJ5dGVzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNpZ25hdHVyZVNldCkgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2lnbmF0dXJlU2V0KSB7XG4gICAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ05vIG1hdGNoaW5nIHNpZ25hdHVyZSBzbG90IGZvdW5kIGZvciB0aGlzIHByaXZhdGUga2V5Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9Ccm9hZGNhc3RGb3JtYXQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICAvLyBJZiB3ZSBoYXZlIHRoZSBvcmlnaW5hbCByYXcgc2lnbmVkIGJ5dGVzLCB1c2UgdGhlbSBkaXJlY3RseSB0byBwcmVzZXJ2ZSBleGFjdCBmb3JtYXRcbiAgICBpZiAodGhpcy5fcmF3U2lnbmVkQnl0ZXMpIHtcbiAgICAgIHJldHVybiBGbGFyZVV0aWxzLmJ1ZmZlclRvSGV4KHRoaXMuX3Jhd1NpZ25lZEJ5dGVzKTtcbiAgICB9XG4gICAgY29uc3QgdW5zaWduZWRUeCA9IHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeDtcbiAgICAvLyBGb3Igc2lnbmVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIHRoZSBmdWxsIHNpZ25lZCB0eCB3aXRoIGNyZWRlbnRpYWxzXG4gICAgLy8gQ2hlY2sgc2lnbmF0dXJlLmxlbmd0aCBmb3Igcm9idXN0bmVzc1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gRmxhcmVVdGlscy5idWZmZXJUb0hleCh1bnNpZ25lZFR4LmdldFNpZ25lZFR4KCkudG9CeXRlcygpKTtcbiAgICB9XG4gICAgLy8gRm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIGp1c3QgdGhlIHRyYW5zYWN0aW9uIGJ5dGVzXG4gICAgcmV0dXJuIEZsYXJlVXRpbHMuYnVmZmVyVG9IZXgodW5zaWduZWRUeC50b0J5dGVzKCkpO1xuICB9XG5cbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLl9mbGFyZVRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICB9O1xuICB9XG5cbiAgc2V0VHJhbnNhY3Rpb24odHg6IFR4KTogdm9pZCB7XG4gICAgdGhpcy5fZmxhcmVUcmFuc2FjdGlvbiA9IHR4IGFzIFVuc2lnbmVkVHg7XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICBpZiAoIVtUcmFuc2FjdGlvblR5cGUuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JdLmluY2x1ZGVzKHRyYW5zYWN0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYoKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkudG9CeXRlcygpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1ZmZlckFycmF5ID0gdXRpbHMuc2hhMjU2KCh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLnRvQnl0ZXMoKSk7XG4gICAgcmV0dXJuIHV0aWxzLmNiNThFbmNvZGUoQnVmZmVyLmZyb20oYnVmZmVyQXJyYXkpKTtcbiAgfVxuXG4gIGdldCBmcm9tQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fZnJvbUFkZHJlc3Nlcy5tYXAoKGEpID0+IEZsYXJlVXRpbHMuZm9ybWF0KHRoaXMuX25ldHdvcmsuYWxpYXMsIHRoaXMuX25ldHdvcmsuaHJwLCBhKSk7XG4gIH1cblxuICBnZXQgcmV3YXJkQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcmV3YXJkQWRkcmVzc2VzLm1hcCgoYSkgPT4gRmxhcmVVdGlscy5mb3JtYXQodGhpcy5fbmV0d29yay5hbGlhcywgdGhpcy5fbmV0d29yay5ocnAsIGEpKTtcbiAgfVxuXG4gIGdldCBmZWUoKTogVHJhbnNhY3Rpb25GZWUge1xuICAgIHJldHVybiB7IGZlZTogJzAnLCAuLi50aGlzLl9mZWUgfTtcbiAgfVxuXG4gIGdldCBvdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcjpcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhZGRyZXNzOiAoXG4gICAgICAgICAgICAgICh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhcbiAgICAgICAgICAgICkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci5ub2RlSWQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIHZhbHVlOiAoXG4gICAgICAgICAgICAgICh0aGlzLl9mbGFyZVRyYW5zYWN0aW9uIGFzIFVuc2lnbmVkVHgpLmdldFR4KCkgYXMgcHZtU2VyaWFsLkFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yVHhcbiAgICAgICAgICAgICkuc3VibmV0VmFsaWRhdG9yLnZhbGlkYXRvci53ZWlnaHQudG9KU09OKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICByZXR1cm4gKFxuICAgICAgKHRoaXMuX2ZsYXJlVHJhbnNhY3Rpb24gYXMgVW5zaWduZWRUeCkuZ2V0VHgoKSBhcyBwdm1TZXJpYWwuQWRkUGVybWlzc2lvbmxlc3NWYWxpZGF0b3JUeFxuICAgICkuYmFzZVR4Lm91dHB1dHMubWFwKHV0aWxzLm1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICB9XG5cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdpbnB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcblxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHR4SnNvbi5vdXRwdXRzLnJlZHVjZSgocCwgbikgPT4gcCArIEJpZ0ludChuLnZhbHVlKSwgQmlnSW50KDApKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLnJlZHVjZSgocCwgbikgPT4gcCArIEJpZ0ludChuLnZhbHVlKSwgQmlnSW50KDApKS50b1N0cmluZygpO1xuXG4gICAgbGV0IHJld2FyZEFkZHJlc3NlcztcbiAgICBpZiAoW1RyYW5zYWN0aW9uVHlwZS5BZGRQZXJtaXNzaW9ubGVzc1ZhbGlkYXRvcl0uaW5jbHVkZXModHhKc29uLnR5cGUpKSB7XG4gICAgICByZXdhcmRBZGRyZXNzZXMgPSB0aGlzLnJld2FyZEFkZHJlc3NlcztcbiAgICAgIGRpc3BsYXlPcmRlci5zcGxpY2UoNiwgMCwgJ3Jld2FyZEFkZHJlc3NlcycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuICB9XG59XG4iXX0=