@bitgo/sdk-coin-canton 1.17.2 → 1.17.4

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.
@@ -84,250 +84,300 @@ class Utils {
84
84
  */
85
85
  parseRawCantonTransactionData(rawData, txType) {
86
86
  const decodedData = this.decodePreparedTransaction(rawData);
87
+ const nodes = decodedData.transaction?.nodes ?? [];
88
+ const getField = (fields, label) => fields.find((f) => f.label === label)?.value?.sum;
87
89
  let sender = '';
88
90
  let receiver = '';
89
91
  let amount = '';
90
92
  let memoId;
91
93
  let instrumentId;
92
94
  let instrumentAdmin;
93
- let token;
94
- let preApprovalNode = [];
95
- let tokenPreApprovalNode = [];
96
- let transferNode = [];
97
- let transferAcceptRejectNode = [];
98
- let tokenTransferAcceptRejectNode = [];
99
- let withdrawnNode = [];
100
- let tokenWithdrawnNode = [];
101
- const nodes = decodedData.transaction?.nodes;
102
- nodes?.forEach((node) => {
103
- const versionedNode = node.versionedNode;
104
- if (!versionedNode || versionedNode.oneofKind !== 'v1')
105
- return;
106
- const v1Node = versionedNode.v1;
107
- const nodeType = v1Node.nodeType;
108
- if (nodeType.oneofKind !== 'create')
109
- return;
110
- const createNode = nodeType.create;
111
- const template = createNode.templateId;
112
- const argSum = createNode.argument?.sum;
113
- if (!argSum || argSum.oneofKind !== 'record')
114
- return;
115
- const fields = argSum.record?.fields;
116
- if (!fields)
117
- return;
118
- if (template?.entityName === 'TransferPreapprovalProposal' &&
119
- !preApprovalNode.length &&
120
- txType === sdk_core_1.TransactionType.OneStepPreApproval) {
121
- preApprovalNode = fields;
95
+ /**
96
+ * Returns the argument fields of the first create node matching the given entity name.
97
+ */
98
+ const findCreateNodeFields = (entityName) => {
99
+ for (const node of nodes) {
100
+ const vn = node.versionedNode;
101
+ if (!vn || vn.oneofKind !== 'v1')
102
+ continue;
103
+ const nt = vn.v1.nodeType;
104
+ if (nt.oneofKind !== 'create')
105
+ continue;
106
+ if (nt.create.templateId?.entityName !== entityName)
107
+ continue;
108
+ const argSum = nt.create.argument?.sum;
109
+ if (!argSum || argSum.oneofKind !== 'record')
110
+ continue;
111
+ const fields = argSum.record?.fields;
112
+ if (fields)
113
+ return fields;
122
114
  }
123
- if (template?.entityName === 'TransferPreapproval' &&
124
- !tokenPreApprovalNode.length &&
125
- txType === sdk_core_1.TransactionType.OneStepPreApproval) {
126
- tokenPreApprovalNode = fields;
115
+ return undefined;
116
+ };
117
+ /**
118
+ * Returns the chosenValue fields of the first exercise node matching the given choiceId.
119
+ */
120
+ const findExerciseNodeFields = (choiceId) => {
121
+ for (const node of nodes) {
122
+ const vn = node.versionedNode;
123
+ if (!vn || vn.oneofKind !== 'v1')
124
+ continue;
125
+ const nt = vn.v1.nodeType;
126
+ if (nt.oneofKind !== 'exercise')
127
+ continue;
128
+ if (nt.exercise.choiceId !== choiceId)
129
+ continue;
130
+ const argSum = nt.exercise.chosenValue?.sum;
131
+ if (!argSum || argSum.oneofKind !== 'record')
132
+ continue;
133
+ const fields = argSum.record?.fields;
134
+ if (fields)
135
+ return fields;
127
136
  }
128
- if (template?.entityName === 'Amulet' &&
129
- !transferAcceptRejectNode.length &&
130
- (txType === sdk_core_1.TransactionType.TransferAccept || txType === sdk_core_1.TransactionType.TransferReject)) {
131
- transferAcceptRejectNode = fields;
137
+ return undefined;
138
+ };
139
+ /**
140
+ * Returns the first acting party of the first exercise node matching the given choiceId.
141
+ */
142
+ const findExerciseActingParty = (choiceId) => {
143
+ for (const node of nodes) {
144
+ const vn = node.versionedNode;
145
+ if (!vn || vn.oneofKind !== 'v1')
146
+ continue;
147
+ const nt = vn.v1.nodeType;
148
+ if (nt.oneofKind !== 'exercise')
149
+ continue;
150
+ if (nt.exercise.choiceId !== choiceId)
151
+ continue;
152
+ return nt.exercise.actingParties[0];
132
153
  }
133
- if ((template?.entityName === 'ExecutedTransfer' || template?.entityName === 'RejectedTransfer') &&
134
- !tokenTransferAcceptRejectNode.length &&
135
- (txType === sdk_core_1.TransactionType.TransferAccept || txType === sdk_core_1.TransactionType.TransferReject)) {
136
- const transferField = fields.find((f) => f.label === 'transfer');
137
- const transferSum = transferField?.value?.sum;
138
- if (transferSum?.oneofKind === 'record') {
139
- tokenTransferAcceptRejectNode = transferSum.record?.fields ?? [];
140
- }
154
+ return undefined;
155
+ };
156
+ /**
157
+ * Extracts sender, receiver, amount, and instrument fields from a transfer record.
158
+ * Canton coin transfers and cbtc use instrumentId.admin; regular token transfers use instrumentIdentifier.source.
159
+ */
160
+ const extractFromTransferRecord = (transferRecord, instrumentFieldName, instrumentAdminFieldName) => {
161
+ const senderData = getField(transferRecord, 'sender');
162
+ if (senderData?.oneofKind === 'party')
163
+ sender = senderData.party ?? '';
164
+ const receiverData = getField(transferRecord, 'receiver');
165
+ if (receiverData?.oneofKind === 'party')
166
+ receiver = receiverData.party ?? '';
167
+ const amountData = getField(transferRecord, 'amount');
168
+ if (amountData?.oneofKind === 'numeric')
169
+ amount = amountData.numeric ?? '';
170
+ const instrumentField = getField(transferRecord, instrumentFieldName);
171
+ if (instrumentField?.oneofKind === 'record') {
172
+ const instrumentFields = instrumentField.record?.fields ?? [];
173
+ const adminData = getField(instrumentFields, instrumentAdminFieldName);
174
+ if (adminData?.oneofKind === 'party')
175
+ instrumentAdmin = adminData.party ?? '';
176
+ const idData = getField(instrumentFields, 'id');
177
+ if (idData?.oneofKind === 'text')
178
+ instrumentId = idData.text ?? '';
141
179
  }
142
- if (template?.entityName === 'Amulet' &&
143
- !withdrawnNode.length &&
144
- txType === sdk_core_1.TransactionType.TransferOfferWithdrawn) {
145
- withdrawnNode = fields;
180
+ };
181
+ switch (txType) {
182
+ case sdk_core_1.TransactionType.OneStepPreApproval: {
183
+ // Canton coin: TransferPreapprovalProposal create node → provider=sender, receiver
184
+ const coinFields = findCreateNodeFields('TransferPreapprovalProposal');
185
+ if (coinFields) {
186
+ const providerData = getField(coinFields, 'provider');
187
+ if (providerData?.oneofKind === 'party')
188
+ sender = providerData.party ?? '';
189
+ const receiverData = getField(coinFields, 'receiver');
190
+ if (receiverData?.oneofKind === 'party')
191
+ receiver = receiverData.party ?? '';
192
+ amount = '0';
193
+ break;
194
+ }
195
+ // Token: TransferPreapproval create node → operator=sender, receiver, instrumentAdmin, instrumentAllowances
196
+ const tokenFields = findCreateNodeFields('TransferPreapproval');
197
+ if (tokenFields) {
198
+ const operatorData = getField(tokenFields, 'operator');
199
+ if (operatorData?.oneofKind === 'party')
200
+ sender = operatorData.party ?? '';
201
+ const receiverData = getField(tokenFields, 'receiver');
202
+ if (receiverData?.oneofKind === 'party')
203
+ receiver = receiverData.party ?? '';
204
+ amount = '0';
205
+ const instrumentAdminData = getField(tokenFields, 'instrumentAdmin');
206
+ if (instrumentAdminData?.oneofKind === 'party')
207
+ instrumentAdmin = instrumentAdminData.party ?? '';
208
+ const allowancesData = getField(tokenFields, 'instrumentAllowances');
209
+ if (allowancesData?.oneofKind === 'list') {
210
+ // for the same instrument admin, if multiple tokens are supported then we can enable all of them,
211
+ // but we won't be doing that for now
212
+ const firstAllowance = allowancesData.list?.elements?.[0]?.sum;
213
+ if (firstAllowance?.oneofKind === 'record') {
214
+ const allowanceFields = firstAllowance.record?.fields ?? [];
215
+ const idData = getField(allowanceFields, 'id');
216
+ if (idData?.oneofKind === 'text')
217
+ instrumentId = idData.text ?? '';
218
+ }
219
+ }
220
+ }
221
+ break;
146
222
  }
147
- if (template?.entityName === 'Holding' &&
148
- !tokenWithdrawnNode.length &&
149
- txType === sdk_core_1.TransactionType.TransferOfferWithdrawn) {
150
- tokenWithdrawnNode = fields;
223
+ case sdk_core_1.TransactionType.TransferAccept: {
224
+ // Canton coin: Amulet create node → dso=sender, owner=receiver, amount.initialAmount
225
+ const amuletFields = findCreateNodeFields('Amulet');
226
+ if (amuletFields) {
227
+ const dsoData = getField(amuletFields, 'dso');
228
+ if (dsoData?.oneofKind === 'party')
229
+ sender = dsoData.party ?? '';
230
+ const ownerData = getField(amuletFields, 'owner');
231
+ if (ownerData?.oneofKind === 'party')
232
+ receiver = ownerData.party ?? '';
233
+ const amountField = getField(amuletFields, 'amount');
234
+ if (amountField?.oneofKind === 'record') {
235
+ const initialAmountData = getField(amountField.record?.fields ?? [], 'initialAmount');
236
+ if (initialAmountData?.oneofKind === 'numeric')
237
+ amount = initialAmountData.numeric ?? '';
238
+ }
239
+ break;
240
+ }
241
+ // Regular token (non-cbtc): ExecutedTransfer create node
242
+ // → transfer.{sender, receiver, amount, instrumentIdentifier.{source=admin, id}}
243
+ const executedTransferFields = findCreateNodeFields('ExecutedTransfer');
244
+ if (executedTransferFields) {
245
+ const transferSum = getField(executedTransferFields, 'transfer');
246
+ if (transferSum?.oneofKind === 'record') {
247
+ extractFromTransferRecord(transferSum.record?.fields ?? [], 'instrumentIdentifier', 'source');
248
+ }
249
+ break;
250
+ }
251
+ // cbtc token fallback: TransferRule_DirectTransfer exercise node
252
+ // → transfer.{sender, receiver, amount, instrumentId.{admin, id}}
253
+ const directTransferFields = findExerciseNodeFields('TransferRule_DirectTransfer');
254
+ if (directTransferFields) {
255
+ const transferSum = getField(directTransferFields, 'transfer');
256
+ if (transferSum?.oneofKind === 'record') {
257
+ extractFromTransferRecord(transferSum.record?.fields ?? [], 'instrumentId', 'admin');
258
+ }
259
+ }
260
+ break;
151
261
  }
152
- });
153
- nodes?.forEach((node) => {
154
- const versionedNode = node.versionedNode;
155
- if (!versionedNode || versionedNode.oneofKind !== 'v1')
156
- return;
157
- const v1Node = versionedNode.v1;
158
- const nodeType = v1Node.nodeType;
159
- if (nodeType.oneofKind !== 'exercise')
160
- return;
161
- const exerciseNode = nodeType.exercise;
162
- const choiceId = exerciseNode.choiceId;
163
- if (!choiceId || choiceId !== 'TransferFactory_Transfer')
164
- return;
165
- const argSum = exerciseNode.chosenValue?.sum;
166
- if (!argSum || argSum.oneofKind !== 'record')
167
- return;
168
- const fields = argSum.record?.fields;
169
- if (!fields)
170
- return;
171
- transferNode = fields;
172
- });
173
- const getField = (fields, label) => fields.find((f) => f.label === label)?.value?.sum;
174
- if (preApprovalNode.length) {
175
- const receiverData = getField(preApprovalNode, 'receiver');
176
- if (receiverData?.oneofKind === 'party')
177
- receiver = receiverData.party ?? '';
178
- const providerData = getField(preApprovalNode, 'provider');
179
- if (providerData?.oneofKind === 'party')
180
- sender = providerData.party ?? '';
181
- amount = '0';
182
- }
183
- else if (tokenPreApprovalNode.length) {
184
- const receiverData = getField(tokenPreApprovalNode, 'receiver');
185
- if (receiverData?.oneofKind === 'party')
186
- receiver = receiverData.party ?? '';
187
- const operatorData = getField(tokenPreApprovalNode, 'operator');
188
- if (operatorData?.oneofKind === 'party')
189
- sender = operatorData.party ?? '';
190
- amount = '0';
191
- const instrumentAdminData = getField(tokenPreApprovalNode, 'instrumentAdmin');
192
- if (instrumentAdminData?.oneofKind === 'party')
193
- instrumentAdmin = instrumentAdminData.party ?? '';
194
- const allowancesData = getField(tokenPreApprovalNode, 'instrumentAllowances');
195
- if (allowancesData?.oneofKind === 'list') {
196
- // for the same instrument admin, if multiple tokens are supported then we can enable all of them,
197
- // but we won't be doing that for now
198
- const firstAllowance = allowancesData.list?.elements?.[0]?.sum;
199
- if (firstAllowance?.oneofKind === 'record') {
200
- const allowanceFields = firstAllowance.record?.fields ?? [];
201
- const idData = getField(allowanceFields, 'id');
202
- if (idData?.oneofKind === 'text') {
203
- instrumentId = idData.text ?? '';
262
+ case sdk_core_1.TransactionType.TransferReject: {
263
+ // Canton coin: Amulet create node dso=sender, owner=receiver, amount.initialAmount
264
+ const amuletFields = findCreateNodeFields('Amulet');
265
+ if (amuletFields) {
266
+ const dsoData = getField(amuletFields, 'dso');
267
+ if (dsoData?.oneofKind === 'party')
268
+ sender = dsoData.party ?? '';
269
+ const ownerData = getField(amuletFields, 'owner');
270
+ if (ownerData?.oneofKind === 'party')
271
+ receiver = ownerData.party ?? '';
272
+ const amountField = getField(amuletFields, 'amount');
273
+ if (amountField?.oneofKind === 'record') {
274
+ const initialAmountData = getField(amountField.record?.fields ?? [], 'initialAmount');
275
+ if (initialAmountData?.oneofKind === 'numeric')
276
+ amount = initialAmountData.numeric ?? '';
204
277
  }
278
+ break;
205
279
  }
280
+ // Regular token (non-cbtc): RejectedTransfer create node
281
+ // → transfer.{sender, receiver, amount, instrumentIdentifier.{source=admin, id}}
282
+ const rejectedTransferFields = findCreateNodeFields('RejectedTransfer');
283
+ if (rejectedTransferFields) {
284
+ const transferSum = getField(rejectedTransferFields, 'transfer');
285
+ if (transferSum?.oneofKind === 'record') {
286
+ extractFromTransferRecord(transferSum.record?.fields ?? [], 'instrumentIdentifier', 'source');
287
+ }
288
+ break;
289
+ }
290
+ // cbtc token fallback: Holding create node (owner=sender, instrument, amount)
291
+ // + TransferInstruction_Reject exercise (actingParties[0]=receiver who rejected)
292
+ const holdingFields = findCreateNodeFields('Holding');
293
+ if (holdingFields) {
294
+ const ownerData = getField(holdingFields, 'owner');
295
+ if (ownerData?.oneofKind === 'party')
296
+ sender = ownerData.party ?? '';
297
+ const amountData = getField(holdingFields, 'amount');
298
+ if (amountData?.oneofKind === 'numeric')
299
+ amount = amountData.numeric ?? '';
300
+ const instrumentData = getField(holdingFields, 'instrument');
301
+ if (instrumentData?.oneofKind === 'record') {
302
+ const instrumentFields = instrumentData.record?.fields ?? [];
303
+ const sourceData = getField(instrumentFields, 'source');
304
+ if (sourceData?.oneofKind === 'party')
305
+ instrumentAdmin = sourceData.party ?? '';
306
+ const idData = getField(instrumentFields, 'id');
307
+ if (idData?.oneofKind === 'text')
308
+ instrumentId = idData.text ?? '';
309
+ }
310
+ const receiverParty = findExerciseActingParty('TransferInstruction_Reject');
311
+ if (receiverParty)
312
+ receiver = receiverParty;
313
+ }
314
+ break;
206
315
  }
207
- }
208
- else if (transferNode.length) {
209
- const transferField = transferNode.find((f) => f.label === 'transfer');
210
- const transferSum = transferField?.value?.sum;
211
- if (transferSum && transferSum.oneofKind === 'record') {
212
- const transferRecord = transferSum.record?.fields;
213
- if (transferRecord?.length) {
214
- const senderData = getField(transferRecord, 'sender');
215
- if (senderData?.oneofKind === 'party')
216
- sender = senderData.party ?? '';
217
- const receiverData = getField(transferRecord, 'receiver');
218
- if (receiverData?.oneofKind === 'party')
219
- receiver = receiverData.party ?? '';
220
- const amountData = getField(transferRecord, 'amount');
316
+ case sdk_core_1.TransactionType.TransferOfferWithdrawn: {
317
+ // Canton coin: Amulet create node → owner=sender=receiver, amount.initialAmount
318
+ const amuletFields = findCreateNodeFields('Amulet');
319
+ if (amuletFields) {
320
+ const ownerData = getField(amuletFields, 'owner');
321
+ if (ownerData?.oneofKind === 'party') {
322
+ receiver = ownerData.party ?? '';
323
+ sender = receiver;
324
+ }
325
+ const amountField = getField(amuletFields, 'amount');
326
+ if (amountField?.oneofKind === 'record') {
327
+ const initialAmountData = getField(amountField.record?.fields ?? [], 'initialAmount');
328
+ if (initialAmountData?.oneofKind === 'numeric')
329
+ amount = initialAmountData.numeric ?? '';
330
+ }
331
+ break;
332
+ }
333
+ // Token: Holding create node → owner=sender=receiver, instrument.{source=admin, id}, amount
334
+ const holdingFields = findCreateNodeFields('Holding');
335
+ if (holdingFields) {
336
+ const ownerData = getField(holdingFields, 'owner');
337
+ if (ownerData?.oneofKind === 'party') {
338
+ receiver = ownerData.party ?? '';
339
+ sender = receiver;
340
+ }
341
+ const amountData = getField(holdingFields, 'amount');
221
342
  if (amountData?.oneofKind === 'numeric')
222
343
  amount = amountData.numeric ?? '';
223
- const instrumentField = getField(transferRecord, 'instrumentId');
224
- if (instrumentField?.oneofKind === 'record') {
225
- const instrumentFields = instrumentField.record?.fields ?? [];
226
- const adminData = getField(instrumentFields, 'admin');
227
- if (adminData?.oneofKind === 'party') {
228
- instrumentAdmin = adminData.party ?? '';
229
- }
344
+ const instrumentData = getField(holdingFields, 'instrument');
345
+ if (instrumentData?.oneofKind === 'record') {
346
+ const instrumentFields = instrumentData.record?.fields ?? [];
347
+ const sourceData = getField(instrumentFields, 'source');
348
+ if (sourceData?.oneofKind === 'party')
349
+ instrumentAdmin = sourceData.party ?? '';
230
350
  const idData = getField(instrumentFields, 'id');
231
- if (idData?.oneofKind === 'text') {
351
+ if (idData?.oneofKind === 'text')
232
352
  instrumentId = idData.text ?? '';
233
- }
234
353
  }
235
- const metaField = getField(transferRecord, 'meta');
236
- if (metaField?.oneofKind === 'record') {
237
- const metaFields = metaField.record?.fields;
238
- if (metaFields && metaFields.length) {
239
- const valuesField = getField(metaFields, 'values');
354
+ }
355
+ break;
356
+ }
357
+ default: {
358
+ // Initial transfer (1-step and 2-step, coin and token): TransferFactory_Transfer exercise node
359
+ // → transfer.{sender, receiver, amount, instrumentId.{admin, id}, meta}
360
+ const transferFields = findExerciseNodeFields('TransferFactory_Transfer');
361
+ if (transferFields) {
362
+ const transferSum = getField(transferFields, 'transfer');
363
+ if (transferSum?.oneofKind === 'record') {
364
+ const transferRecord = transferSum.record?.fields ?? [];
365
+ extractFromTransferRecord(transferRecord, 'instrumentId', 'admin');
366
+ const metaField = getField(transferRecord, 'meta');
367
+ if (metaField?.oneofKind === 'record') {
368
+ const valuesField = getField(metaField.record?.fields ?? [], 'values');
240
369
  if (valuesField?.oneofKind === 'textMap') {
241
- const entries = valuesField.textMap?.entries ?? [];
242
- const memoEntry = entries.find((e) => e.key === 'splice.lfdecentralizedtrust.org/reason');
370
+ const memoEntry = valuesField.textMap?.entries.find((e) => e.key === 'splice.lfdecentralizedtrust.org/reason');
243
371
  if (memoEntry) {
244
372
  const memoValue = memoEntry?.value?.sum;
245
- if (memoValue?.oneofKind === 'text') {
373
+ if (memoValue?.oneofKind === 'text')
246
374
  memoId = memoValue.text;
247
- }
248
375
  }
249
376
  }
250
377
  }
251
378
  }
252
379
  }
253
- }
254
- }
255
- else if (transferAcceptRejectNode.length) {
256
- const dsoData = getField(transferAcceptRejectNode, 'dso');
257
- if (dsoData?.oneofKind === 'party')
258
- sender = dsoData.party ?? '';
259
- const ownerData = getField(transferAcceptRejectNode, 'owner');
260
- if (ownerData?.oneofKind === 'party')
261
- receiver = ownerData.party ?? '';
262
- const amountField = getField(transferAcceptRejectNode, 'amount');
263
- if (amountField && amountField.oneofKind === 'record') {
264
- const amountRecord = amountField.record?.fields;
265
- if (amountRecord?.length) {
266
- const initialAmountData = getField(amountRecord, 'initialAmount');
267
- if (initialAmountData?.oneofKind === 'numeric')
268
- amount = initialAmountData.numeric ?? '';
269
- }
270
- }
271
- }
272
- else if (tokenTransferAcceptRejectNode.length) {
273
- const senderData = getField(tokenTransferAcceptRejectNode, 'sender');
274
- if (senderData?.oneofKind === 'party')
275
- sender = senderData.party ?? '';
276
- const receiverData = getField(tokenTransferAcceptRejectNode, 'receiver');
277
- if (receiverData?.oneofKind === 'party')
278
- receiver = receiverData.party ?? '';
279
- const amountData = getField(tokenTransferAcceptRejectNode, 'amount');
280
- if (amountData?.oneofKind === 'numeric')
281
- amount = amountData.numeric ?? '';
282
- const instrumentSum = getField(tokenTransferAcceptRejectNode, 'instrumentIdentifier');
283
- if (instrumentSum?.oneofKind === 'record') {
284
- const instrumentFields = instrumentSum.record?.fields ?? [];
285
- const adminData = getField(instrumentFields, 'source');
286
- if (adminData?.oneofKind === 'party') {
287
- instrumentAdmin = adminData.party ?? '';
288
- }
289
- const idData = getField(instrumentFields, 'id');
290
- if (idData?.oneofKind === 'text') {
291
- instrumentId = idData.text ?? '';
292
- }
293
- }
294
- }
295
- else if (withdrawnNode.length) {
296
- const ownerData = getField(withdrawnNode, 'owner');
297
- if (ownerData?.oneofKind === 'party') {
298
- receiver = ownerData.party ?? '';
299
- sender = receiver;
300
- }
301
- const amountField = getField(withdrawnNode, 'amount');
302
- if (amountField?.oneofKind === 'record') {
303
- const amountFields = amountField.record?.fields ?? [];
304
- const initialAmountData = getField(amountFields, 'initialAmount');
305
- if (initialAmountData?.oneofKind === 'numeric') {
306
- amount = initialAmountData.numeric ?? '';
307
- }
308
- }
309
- }
310
- else if (tokenWithdrawnNode.length) {
311
- const ownerData = getField(tokenWithdrawnNode, 'owner');
312
- if (ownerData?.oneofKind === 'party') {
313
- receiver = ownerData.party ?? '';
314
- sender = receiver;
315
- }
316
- const amountData = getField(tokenWithdrawnNode, 'amount');
317
- if (amountData?.oneofKind === 'numeric') {
318
- amount = amountData.numeric ?? '';
319
- }
320
- const instrumentData = getField(tokenWithdrawnNode, 'instrument');
321
- if (instrumentData?.oneofKind === 'record') {
322
- const instrumentFields = instrumentData.record?.fields ?? [];
323
- const adminData = getField(instrumentFields, 'source');
324
- if (adminData?.oneofKind === 'party') {
325
- instrumentAdmin = adminData.party ?? '';
326
- }
327
- const idData = getField(instrumentFields, 'id');
328
- if (idData?.oneofKind === 'text') {
329
- instrumentId = idData.text ?? '';
330
- }
380
+ break;
331
381
  }
332
382
  }
333
383
  if (!sender || !receiver || !amount) {
@@ -350,8 +400,7 @@ class Utils {
350
400
  parsedData.memoId = memoId;
351
401
  }
352
402
  if (instrumentId && instrumentAdmin) {
353
- token = this.findTokenNameByContractAddress(`${instrumentAdmin}:${instrumentId}`);
354
- parsedData.token = token;
403
+ parsedData.token = this.findTokenNameByContractAddress(`${instrumentAdmin}:${instrumentId}`);
355
404
  }
356
405
  return parsedData;
357
406
  }
@@ -508,4 +557,4 @@ class Utils {
508
557
  exports.Utils = Utils;
509
558
  const utils = new Utils();
510
559
  exports.default = utils;
511
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxvREFBNEI7QUFFNUIsOENBQXNGO0FBQ3RGLDRDQUFvRDtBQUVwRCwwREFBMEU7QUFDMUUseUZBQW1GO0FBRW5GLHlDQUFtRjtBQUluRixNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMs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QUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsZUFBSzthQUN0QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxxQkFBVyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssZUFBZSxDQUFDO2FBQ3pGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBbUIsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBOWZELHNCQThmQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBjb21wdXRlUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9oYXNoL2hhc2guanMnO1xuaW1wb3J0IHsgUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9wcm90by9wcmVwYXJlZFRyYW5zYWN0aW9uLmpzJztcblxuaW1wb3J0IHsgQ3J5cHRvS2V5Rm9ybWF0LCBTaWduaW5nQWxnb3JpdGhtU3BlYywgU2lnbmluZ0tleVNwZWMgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gYXMgSVByZXBhcmVkVHJhbnNhY3Rpb24sIFByZXBhcmVkVHhuUGFyc2VkSW5mbyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmVjb3JkRmllbGQgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFmaW5nZXJwcmludCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFsbCBtZW1vSWRzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGFzIGxvbmcgYXMgc3RyaW5ncyBhcmUgcGFzc2VkXG4gICAgY29uc3QgW2ZpbmdlcnByaW50UGFydF0gPSBmaW5nZXJwcmludC50cmltKCkuc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50UGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDYW50b25IZXgoZmluZ2VycHJpbnRQYXJ0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJbiBjYW50b24sIHRoZXJlIGlzIG5vIGJsb2NrIGhhc2gsIHdlIHN0b3JlIHRoZSBoZWlnaHQgYXMgdGhlIF9pZCAoaGFzaClcbiAgICAvLyB0aGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0sIDxibG9ja0hlaWdodD5fPHZlcnNpb24+XG4gICAgY29uc3QgW2hlaWdodF0gPSBoYXNoLnNwbGl0KCdfJyk7XG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBOdW1iZXIoaGVpZ2h0KTtcbiAgICByZXR1cm4gIWlzTmFOKGJsb2NrSGVpZ2h0KSAmJiBibG9ja0hlaWdodCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgaXMgYSB2YWxpZCBjYW50b24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgdGhlIGhleCBzdHJpbmcgdmFsdWVcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRDYW50b25IZXgodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS1mQS1GMC05XXs2OH0kLztcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGhleCB2YWx1ZSB0byBiYXNlNjRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleFN0cmluZyAtIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGdldEJhc2U2NEZyb21IZXgoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoZXhTdHJpbmcsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNyZWF0ZSBmaW5nZXJwcmludCAocGFydCBvZiB0aGUgY2FudG9uIHBhcnR5SWQpIGZyb20gcHVibGljIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IHRoZSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5KTtcbiAgICBjb25zdCBoYXNoUHVycG9zZSA9IDEyO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKGhhc2hQdXJwb3NlLCBrZXkucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcGFyc2UgcmF3IGNhbnRvbiB0cmFuc2FjdGlvbiAmIGdldCByZXF1aXJlZCBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByYXdEYXRhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHhUeXBlIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEByZXR1cm5zIHtQcmVwYXJlZFR4blBhcnNlZEluZm99XG4gICAqL1xuICBwYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShyYXdEYXRhOiBzdHJpbmcsIHR4VHlwZTogVHJhbnNhY3Rpb25UeXBlKTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdEYXRhKTtcbiAgICBsZXQgc2VuZGVyID0gJyc7XG4gICAgbGV0IHJlY2VpdmVyID0gJyc7XG4gICAgbGV0IGFtb3VudCA9ICcnO1xuICAgIGxldCBtZW1vSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5zdHJ1bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGluc3RydW1lbnRBZG1pbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCBwcmVBcHByb3ZhbE5vZGU6IFJlY29yZEZpZWxkW10gPSBbXTtcbiAgICBsZXQgdG9rZW5QcmVBcHByb3ZhbE5vZGU6IFJlY29yZEZpZWxkW10gPSBbXTtcbiAgICBsZXQgdHJhbnNmZXJOb2RlOiBSZWNvcmRGaWVsZFtdID0gW107XG4gICAgbGV0IHRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZTogUmVjb3JkRmllbGRbXSA9IFtdO1xuICAgIGxldCB0b2tlblRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZTogUmVjb3JkRmllbGRbXSA9IFtdO1xuICAgIGxldCB3aXRoZHJhd25Ob2RlOiBSZWNvcmRGaWVsZFtdID0gW107XG4gICAgbGV0IHRva2VuV2l0aGRyYXduTm9kZTogUmVjb3JkRmllbGRbXSA9IFtdO1xuICAgIGNvbnN0IG5vZGVzID0gZGVjb2RlZERhdGEudHJhbnNhY3Rpb24/Lm5vZGVzO1xuXG4gICAgbm9kZXM/LmZvckVhY2goKG5vZGUpID0+IHtcbiAgICAgIGNvbnN0IHZlcnNpb25lZE5vZGUgPSBub2RlLnZlcnNpb25lZE5vZGU7XG4gICAgICBpZiAoIXZlcnNpb25lZE5vZGUgfHwgdmVyc2lvbmVkTm9kZS5vbmVvZktpbmQgIT09ICd2MScpIHJldHVybjtcbiAgICAgIGNvbnN0IHYxTm9kZSA9IHZlcnNpb25lZE5vZGUudjE7XG4gICAgICBjb25zdCBub2RlVHlwZSA9IHYxTm9kZS5ub2RlVHlwZTtcbiAgICAgIGlmIChub2RlVHlwZS5vbmVvZktpbmQgIT09ICdjcmVhdGUnKSByZXR1cm47XG4gICAgICBjb25zdCBjcmVhdGVOb2RlID0gbm9kZVR5cGUuY3JlYXRlO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBjcmVhdGVOb2RlLnRlbXBsYXRlSWQ7XG4gICAgICBjb25zdCBhcmdTdW0gPSBjcmVhdGVOb2RlLmFyZ3VtZW50Py5zdW07XG4gICAgICBpZiAoIWFyZ1N1bSB8fCBhcmdTdW0ub25lb2ZLaW5kICE9PSAncmVjb3JkJykgcmV0dXJuO1xuICAgICAgY29uc3QgZmllbGRzID0gYXJnU3VtLnJlY29yZD8uZmllbGRzO1xuICAgICAgaWYgKCFmaWVsZHMpIHJldHVybjtcbiAgICAgIGlmIChcbiAgICAgICAgdGVtcGxhdGU/LmVudGl0eU5hbWUgPT09ICdUcmFuc2ZlclByZWFwcHJvdmFsUHJvcG9zYWwnICYmXG4gICAgICAgICFwcmVBcHByb3ZhbE5vZGUubGVuZ3RoICYmXG4gICAgICAgIHR4VHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLk9uZVN0ZXBQcmVBcHByb3ZhbFxuICAgICAgKSB7XG4gICAgICAgIHByZUFwcHJvdmFsTm9kZSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGVtcGxhdGU/LmVudGl0eU5hbWUgPT09ICdUcmFuc2ZlclByZWFwcHJvdmFsJyAmJlxuICAgICAgICAhdG9rZW5QcmVBcHByb3ZhbE5vZGUubGVuZ3RoICYmXG4gICAgICAgIHR4VHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLk9uZVN0ZXBQcmVBcHByb3ZhbFxuICAgICAgKSB7XG4gICAgICAgIHRva2VuUHJlQXBwcm92YWxOb2RlID0gZmllbGRzO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0ZW1wbGF0ZT8uZW50aXR5TmFtZSA9PT0gJ0FtdWxldCcgJiZcbiAgICAgICAgIXRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZS5sZW5ndGggJiZcbiAgICAgICAgKHR4VHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyQWNjZXB0IHx8IHR4VHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyUmVqZWN0KVxuICAgICAgKSB7XG4gICAgICAgIHRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgKHRlbXBsYXRlPy5lbnRpdHlOYW1lID09PSAnRXhlY3V0ZWRUcmFuc2ZlcicgfHwgdGVtcGxhdGU/LmVudGl0eU5hbWUgPT09ICdSZWplY3RlZFRyYW5zZmVyJykgJiZcbiAgICAgICAgIXRva2VuVHJhbnNmZXJBY2NlcHRSZWplY3ROb2RlLmxlbmd0aCAmJlxuICAgICAgICAodHhUeXBlID09PSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJBY2NlcHQgfHwgdHhUeXBlID09PSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJSZWplY3QpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJGaWVsZCA9IGZpZWxkcy5maW5kKChmKSA9PiBmLmxhYmVsID09PSAndHJhbnNmZXInKTtcbiAgICAgICAgY29uc3QgdHJhbnNmZXJTdW0gPSB0cmFuc2ZlckZpZWxkPy52YWx1ZT8uc3VtO1xuICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICB0b2tlblRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZSA9IHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRlbXBsYXRlPy5lbnRpdHlOYW1lID09PSAnQW11bGV0JyAmJlxuICAgICAgICAhd2l0aGRyYXduTm9kZS5sZW5ndGggJiZcbiAgICAgICAgdHhUeXBlID09PSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJPZmZlcldpdGhkcmF3blxuICAgICAgKSB7XG4gICAgICAgIHdpdGhkcmF3bk5vZGUgPSBmaWVsZHM7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRlbXBsYXRlPy5lbnRpdHlOYW1lID09PSAnSG9sZGluZycgJiZcbiAgICAgICAgIXRva2VuV2l0aGRyYXduTm9kZS5sZW5ndGggJiZcbiAgICAgICAgdHhUeXBlID09PSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJPZmZlcldpdGhkcmF3blxuICAgICAgKSB7XG4gICAgICAgIHRva2VuV2l0aGRyYXduTm9kZSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG5vZGVzPy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWROb2RlID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgaWYgKCF2ZXJzaW9uZWROb2RlIHx8IHZlcnNpb25lZE5vZGUub25lb2ZLaW5kICE9PSAndjEnKSByZXR1cm47XG4gICAgICBjb25zdCB2MU5vZGUgPSB2ZXJzaW9uZWROb2RlLnYxO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPSB2MU5vZGUubm9kZVR5cGU7XG4gICAgICBpZiAobm9kZVR5cGUub25lb2ZLaW5kICE9PSAnZXhlcmNpc2UnKSByZXR1cm47XG4gICAgICBjb25zdCBleGVyY2lzZU5vZGUgPSBub2RlVHlwZS5leGVyY2lzZTtcbiAgICAgIGNvbnN0IGNob2ljZUlkID0gZXhlcmNpc2VOb2RlLmNob2ljZUlkO1xuICAgICAgaWYgKCFjaG9pY2VJZCB8fCBjaG9pY2VJZCAhPT0gJ1RyYW5zZmVyRmFjdG9yeV9UcmFuc2ZlcicpIHJldHVybjtcbiAgICAgIGNvbnN0IGFyZ1N1bSA9IGV4ZXJjaXNlTm9kZS5jaG9zZW5WYWx1ZT8uc3VtO1xuICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIHJldHVybjtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IGFyZ1N1bS5yZWNvcmQ/LmZpZWxkcztcbiAgICAgIGlmICghZmllbGRzKSByZXR1cm47XG4gICAgICB0cmFuc2Zlck5vZGUgPSBmaWVsZHM7XG4gICAgfSk7XG5cbiAgICBjb25zdCBnZXRGaWVsZCA9IChmaWVsZHM6IFJlY29yZEZpZWxkW10sIGxhYmVsOiBzdHJpbmcpID0+IGZpZWxkcy5maW5kKChmKSA9PiBmLmxhYmVsID09PSBsYWJlbCk/LnZhbHVlPy5zdW07XG5cbiAgICBpZiAocHJlQXBwcm92YWxOb2RlLmxlbmd0aCkge1xuICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQocHJlQXBwcm92YWxOb2RlLCAncmVjZWl2ZXInKTtcbiAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCBwcm92aWRlckRhdGEgPSBnZXRGaWVsZChwcmVBcHByb3ZhbE5vZGUsICdwcm92aWRlcicpO1xuICAgICAgaWYgKHByb3ZpZGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBwcm92aWRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBhbW91bnQgPSAnMCc7XG4gICAgfSBlbHNlIGlmICh0b2tlblByZUFwcHJvdmFsTm9kZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKHRva2VuUHJlQXBwcm92YWxOb2RlLCAncmVjZWl2ZXInKTtcbiAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCBvcGVyYXRvckRhdGEgPSBnZXRGaWVsZCh0b2tlblByZUFwcHJvdmFsTm9kZSwgJ29wZXJhdG9yJyk7XG4gICAgICBpZiAob3BlcmF0b3JEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IG9wZXJhdG9yRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgIGNvbnN0IGluc3RydW1lbnRBZG1pbkRhdGEgPSBnZXRGaWVsZCh0b2tlblByZUFwcHJvdmFsTm9kZSwgJ2luc3RydW1lbnRBZG1pbicpO1xuICAgICAgaWYgKGluc3RydW1lbnRBZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgaW5zdHJ1bWVudEFkbWluID0gaW5zdHJ1bWVudEFkbWluRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgIGNvbnN0IGFsbG93YW5jZXNEYXRhID0gZ2V0RmllbGQodG9rZW5QcmVBcHByb3ZhbE5vZGUsICdpbnN0cnVtZW50QWxsb3dhbmNlcycpO1xuICAgICAgaWYgKGFsbG93YW5jZXNEYXRhPy5vbmVvZktpbmQgPT09ICdsaXN0Jykge1xuICAgICAgICAvLyBmb3IgdGhlIHNhbWUgaW5zdHJ1bWVudCBhZG1pbiwgaWYgbXVsdGlwbGUgdG9rZW5zIGFyZSBzdXBwb3J0ZWQgdGhlbiB3ZSBjYW4gZW5hYmxlIGFsbCBvZiB0aGVtLFxuICAgICAgICAvLyBidXQgd2Ugd29uJ3QgYmUgZG9pbmcgdGhhdCBmb3Igbm93XG4gICAgICAgIGNvbnN0IGZpcnN0QWxsb3dhbmNlID0gYWxsb3dhbmNlc0RhdGEubGlzdD8uZWxlbWVudHM/LlswXT8uc3VtO1xuICAgICAgICBpZiAoZmlyc3RBbGxvd2FuY2U/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICBjb25zdCBhbGxvd2FuY2VGaWVsZHMgPSBmaXJzdEFsbG93YW5jZS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChhbGxvd2FuY2VGaWVsZHMsICdpZCcpO1xuICAgICAgICAgIGlmIChpZERhdGE/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgICBpbnN0cnVtZW50SWQgPSBpZERhdGEudGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyYW5zZmVyTm9kZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHRyYW5zZmVyRmllbGQgPSB0cmFuc2Zlck5vZGUuZmluZCgoZikgPT4gZi5sYWJlbCA9PT0gJ3RyYW5zZmVyJyk7XG4gICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IHRyYW5zZmVyRmllbGQ/LnZhbHVlPy5zdW07XG4gICAgICBpZiAodHJhbnNmZXJTdW0gJiYgdHJhbnNmZXJTdW0ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICBjb25zdCB0cmFuc2ZlclJlY29yZCA9IHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzO1xuICAgICAgICBpZiAodHJhbnNmZXJSZWNvcmQ/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IHNlbmRlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ3NlbmRlcicpO1xuICAgICAgICAgIGlmIChzZW5kZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbmRlckRhdGEucGFydHkgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCByZWNlaXZlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ3JlY2VpdmVyJyk7XG4gICAgICAgICAgaWYgKHJlY2VpdmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IHJlY2VpdmVyRGF0YS5wYXJ0eSA/PyAnJztcblxuICAgICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdpbnN0cnVtZW50SWQnKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudEZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbnN0cnVtZW50RmllbGRzID0gaW5zdHJ1bWVudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnYWRtaW4nKTtcbiAgICAgICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICAgICAgICBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgbWV0YUZpZWxkID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdtZXRhJyk7XG4gICAgICAgICAgaWYgKG1ldGFGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgbWV0YUZpZWxkcyA9IG1ldGFGaWVsZC5yZWNvcmQ/LmZpZWxkcztcbiAgICAgICAgICAgIGlmIChtZXRhRmllbGRzICYmIG1ldGFGaWVsZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0ZpZWxkID0gZ2V0RmllbGQobWV0YUZpZWxkcywgJ3ZhbHVlcycpO1xuICAgICAgICAgICAgICBpZiAodmFsdWVzRmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3RleHRNYXAnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IHZhbHVlc0ZpZWxkLnRleHRNYXA/LmVudHJpZXMgPz8gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbWVtb0VudHJ5ID0gZW50cmllcy5maW5kKChlKSA9PiBlLmtleSA9PT0gJ3NwbGljZS5sZmRlY2VudHJhbGl6ZWR0cnVzdC5vcmcvcmVhc29uJyk7XG4gICAgICAgICAgICAgICAgaWYgKG1lbW9FbnRyeSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbWVtb1ZhbHVlID0gbWVtb0VudHJ5Py52YWx1ZT8uc3VtO1xuICAgICAgICAgICAgICAgICAgaWYgKG1lbW9WYWx1ZT8ub25lb2ZLaW5kID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVtb0lkID0gbWVtb1ZhbHVlLnRleHQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmFuc2ZlckFjY2VwdFJlamVjdE5vZGUubGVuZ3RoKSB7XG4gICAgICBjb25zdCBkc29EYXRhID0gZ2V0RmllbGQodHJhbnNmZXJBY2NlcHRSZWplY3ROb2RlLCAnZHNvJyk7XG4gICAgICBpZiAoZHNvRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBkc29EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQodHJhbnNmZXJBY2NlcHRSZWplY3ROb2RlLCAnb3duZXInKTtcbiAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCBhbW91bnRGaWVsZCA9IGdldEZpZWxkKHRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZSwgJ2Ftb3VudCcpO1xuICAgICAgaWYgKGFtb3VudEZpZWxkICYmIGFtb3VudEZpZWxkLm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgYW1vdW50UmVjb3JkID0gYW1vdW50RmllbGQucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChhbW91bnRSZWNvcmQ/Lmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxBbW91bnREYXRhID0gZ2V0RmllbGQoYW1vdW50UmVjb3JkLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICAgIGlmIChpbml0aWFsQW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGluaXRpYWxBbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRva2VuVHJhbnNmZXJBY2NlcHRSZWplY3ROb2RlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgc2VuZGVyRGF0YSA9IGdldEZpZWxkKHRva2VuVHJhbnNmZXJBY2NlcHRSZWplY3ROb2RlLCAnc2VuZGVyJyk7XG4gICAgICBpZiAoc2VuZGVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBzZW5kZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgY29uc3QgcmVjZWl2ZXJEYXRhID0gZ2V0RmllbGQodG9rZW5UcmFuc2ZlckFjY2VwdFJlamVjdE5vZGUsICdyZWNlaXZlcicpO1xuICAgICAgaWYgKHJlY2VpdmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IHJlY2VpdmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZCh0b2tlblRyYW5zZmVyQWNjZXB0UmVqZWN0Tm9kZSwgJ2Ftb3VudCcpO1xuICAgICAgaWYgKGFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBhbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICBjb25zdCBpbnN0cnVtZW50U3VtID0gZ2V0RmllbGQodG9rZW5UcmFuc2ZlckFjY2VwdFJlamVjdE5vZGUsICdpbnN0cnVtZW50SWRlbnRpZmllcicpO1xuICAgICAgaWYgKGluc3RydW1lbnRTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnRTdW0ucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgIGNvbnN0IGFkbWluRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdzb3VyY2UnKTtcbiAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSB7XG4gICAgICAgICAgaW5zdHJ1bWVudEFkbWluID0gYWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh3aXRoZHJhd25Ob2RlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQod2l0aGRyYXduTm9kZSwgJ293bmVyJyk7XG4gICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHtcbiAgICAgICAgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgIHNlbmRlciA9IHJlY2VpdmVyO1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50RmllbGQgPSBnZXRGaWVsZCh3aXRoZHJhd25Ob2RlLCAnYW1vdW50Jyk7XG4gICAgICBpZiAoYW1vdW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgYW1vdW50RmllbGRzID0gYW1vdW50RmllbGQucmVjb3JkPy5maWVsZHMgPz8gW107XG4gICAgICAgIGNvbnN0IGluaXRpYWxBbW91bnREYXRhID0gZ2V0RmllbGQoYW1vdW50RmllbGRzLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICBpZiAoaW5pdGlhbEFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSB7XG4gICAgICAgICAgYW1vdW50ID0gaW5pdGlhbEFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodG9rZW5XaXRoZHJhd25Ob2RlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQodG9rZW5XaXRoZHJhd25Ob2RlLCAnb3duZXInKTtcbiAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgc2VuZGVyID0gcmVjZWl2ZXI7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnREYXRhID0gZ2V0RmllbGQodG9rZW5XaXRoZHJhd25Ob2RlLCAnYW1vdW50Jyk7XG4gICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIHtcbiAgICAgICAgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdHJ1bWVudERhdGEgPSBnZXRGaWVsZCh0b2tlbldpdGhkcmF3bk5vZGUsICdpbnN0cnVtZW50Jyk7XG4gICAgICBpZiAoaW5zdHJ1bWVudERhdGE/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnREYXRhLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICBjb25zdCBhZG1pbkRhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnc291cmNlJyk7XG4gICAgICAgIGlmIChhZG1pbkRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykge1xuICAgICAgICAgIGluc3RydW1lbnRBZG1pbiA9IGFkbWluRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnaWQnKTtcbiAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIHtcbiAgICAgICAgICBpbnN0cnVtZW50SWQgPSBpZERhdGEudGV4dCA/PyAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXNlbmRlciB8fCAhcmVjZWl2ZXIgfHwgIWFtb3VudCkge1xuICAgICAgY29uc3QgbWlzc2luZ0ZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlmICghc2VuZGVyKSBtaXNzaW5nRmllbGRzLnB1c2goJ3NlbmRlcicpO1xuICAgICAgaWYgKCFyZWNlaXZlcikgbWlzc2luZ0ZpZWxkcy5wdXNoKCdyZWNlaXZlcicpO1xuICAgICAgaWYgKCFhbW91bnQpIG1pc3NpbmdGaWVsZHMucHVzaCgnYW1vdW50Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgdHJhbnNhY3Rpb24gZGF0YTogbWlzc2luZyAke21pc3NpbmdGaWVsZHMuam9pbignLCAnKX1gKTtcbiAgICB9XG4gICAgY29uc3QgY29udmVydGVkQW1vdW50ID0gdGhpcy5jb252ZXJ0QW1vdW50VG9Mb3dlc3RVbml0KG5ldyBCaWdOdW1iZXIoYW1vdW50KSk7XG4gICAgY29uc3QgcGFyc2VkRGF0YTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvID0ge1xuICAgICAgc2VuZGVyLFxuICAgICAgcmVjZWl2ZXIsXG4gICAgICBhbW91bnQ6IGNvbnZlcnRlZEFtb3VudCxcbiAgICB9O1xuICAgIGlmIChtZW1vSWQpIHtcbiAgICAgIHBhcnNlZERhdGEubWVtb0lkID0gbWVtb0lkO1xuICAgIH1cbiAgICBpZiAoaW5zdHJ1bWVudElkICYmIGluc3RydW1lbnRBZG1pbikge1xuICAgICAgdG9rZW4gPSB0aGlzLmZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhgJHtpbnN0cnVtZW50QWRtaW59OiR7aW5zdHJ1bWVudElkfWApO1xuICAgICAgcGFyc2VkRGF0YS50b2tlbiA9IHRva2VuO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgdG9wb2xvZ3kgaGFzaCBmcm9tIHRoZSBBUEkgcmVzcG9uc2Ugb2YgdGhlICdjcmVhdGUgcGFydHknIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdG9wb2xvZ3lUcmFuc2FjdGlvbnMgLSBMaXN0IG9mIGJhc2U2NC1lbmNvZGVkIHRvcG9sb2d5IHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBDYW50b24gQVBJLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgYmFzZTY0LWVuY29kZWQgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaC5cbiAgICovXG4gIGNvbXB1dGVIYXNoRnJvbUNyZWF0ZVBhcnR5UmVzcG9uc2UodG9wb2xvZ3lUcmFuc2FjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eEJ1ZmZlcnMgPSB0b3BvbG9neVRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiBCdWZmZXIuZnJvbSh0eCwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHR4QnVmZmVycyk7XG4gIH1cblxuICBhc3luYyBjb21wdXRlSGFzaEZyb21QcmVwYXJlU3VibWlzc2lvblJlc3BvbnNlKHByZXBhcmVkVHJhbnNhY3Rpb25CYXNlNjQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJlcGFyZWRUcmFuc2FjdGlvbiA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihwcmVwYXJlZFRyYW5zYWN0aW9uQmFzZTY0KTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY29tcHV0ZVByZXBhcmVkVHJhbnNhY3Rpb24ocHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2gpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgZmluYWwgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaCBmb3IgYSBsaXN0IG9mIHByZXBhcmVkIENhbnRvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEVhY2ggdHJhbnNhY3Rpb24gaXMgZmlyc3QgaGFzaGVkIHdpdGggcHVycG9zZSBgMTFgLCB0aGVuIGFsbCBoYXNoZXMgYXJlIGNvbWJpbmVkIGFuZFxuICAgKiBoYXNoZWQgYWdhaW4gd2l0aCBwdXJwb3NlIGA1NWAsIGZvbGxvd2luZyB0aGUgQ2FudG9uIHRvcG9sb2d5IGhhc2ggcnVsZXMuXG4gICAqXG4gICAqIFRoZSByZXN1bHRpbmcgaGFzaCBpcyBlbmNvZGVkIGFzIGEgYmFzZTY0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJbXX0gcHJlcGFyZWRUcmFuc2FjdGlvbnMgLSBBbiBhcnJheSBvZiBDYW50b24gdHJhbnNhY3Rpb24gYnVmZmVycy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZpbmFsIHRvcG9sb2d5IGhhc2gsIGJhc2U2NC1lbmNvZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHByZXBhcmVkVHJhbnNhY3Rpb25zOiBCdWZmZXJbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3SGFzaGVzID0gcHJlcGFyZWRUcmFuc2FjdGlvbnMubWFwKCh0eCkgPT4gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCgxMSwgdHgpKTtcbiAgICBjb25zdCBjb21iaW5lZEhhc2hlcyA9IHRoaXMuY29tcHV0ZU11bHRpSGFzaEZvclRvcG9sb2d5KHJhd0hhc2hlcyk7XG4gICAgY29uc3QgY29tcHV0ZWRIYXNoID0gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCg1NSwgY29tYmluZWRIYXNoZXMpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShjb21wdXRlZEhhc2gsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiYXNlNjQtZW5jb2RlZCBFZDI1NTE5IHB1YmxpYyBrZXkgc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmVkIHNpZ25pbmcgcHVibGljIGtleSBvYmplY3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWJsaWNLZXkgVGhlIGJhc2U2NC1lbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RydWN0dXJlZCBzaWduaW5nIGtleSBvYmplY3QgZm9ybWF0dGVkIGZvciB1c2Ugd2l0aCBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2lnbmluZ1B1YmxpY0tleUZyb21FZDI1NTE5KHB1YmxpY0tleTogc3RyaW5nKToge1xuICAgIGZvcm1hdDogbnVtYmVyO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xuICAgIHNjaGVtZTogbnVtYmVyO1xuICAgIGtleVNwZWM6IG51bWJlcjtcbiAgICB1c2FnZTogW107XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IENyeXB0b0tleUZvcm1hdC5SQVcsXG4gICAgICBwdWJsaWNLZXk6IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2Jhc2U2NCcpLFxuICAgICAgc2NoZW1lOiBTaWduaW5nQWxnb3JpdGhtU3BlYy5FRDI1NTE5LFxuICAgICAga2V5U3BlYzogU2lnbmluZ0tleVNwZWMuRUNfQ1VSVkUyNTUxOSxcbiAgICAgIHVzYWdlOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBidWZmZXIgd2l0aCBhIDQtYnl0ZSBiaWctZW5kaWFuIGludGVnZXIgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBwcm92aWRlZCBieXRlIGJ1ZmZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVGhlIGludGVnZXIgdG8gcHJlZml4LCB3cml0dGVuIGFzIDQgYnl0ZXMgaW4gYmlnLWVuZGlhbiBvcmRlclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBhcHBlbmQgYWZ0ZXIgdGhlIGludGVnZXIgcHJlZml4XG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSByZXN1bHRpbmcgYnVmZmVyIHdpdGggdGhlIHByZWZpeGVkIGludGVnZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcHJlZml4ZWRJbnQodmFsdWU6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQzMkJFKHZhbHVlLCAwKTtcbiAgICBCdWZmZXIuZnJvbShieXRlcykuY29weShidWZmZXIsIDQpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW4gU0hBLTI1NiBDYW50b24tc3R5bGUgaGFzaCBieSBwcmVmaXhpbmcgdGhlIGlucHV0IHdpdGggYSBwdXJwb3NlIGlkZW50aWZpZXIsXG4gICAqIHRoZW4gaGFzaGluZyB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhbmQgcHJlcGVuZGluZyBhIG11bHRpLXByZWZpeFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gcHVycG9zZSBBIG51bWVyaWMgaWRlbnRpZmllciB0byBwcmVmaXggdGhlIGhhc2ggaW5wdXQgd2l0aFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBiZSBoYXNoZWRcbiAgICogQHJldHVybnMge1N0cmluZ30gQSBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdGluZyBoYXNoIHdpdGggbXVsdGktcHJlZml4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVTaGEyNTZDYW50b25IYXNoKHB1cnBvc2U6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzaElucHV0ID0gdGhpcy5wcmVmaXhlZEludChwdXJwb3NlLCBieXRlcyk7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGFzaElucHV0KS5kaWdlc3QoKTtcbiAgICBjb25zdCBtdWx0aXByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDEyLCAweDIwXSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW211bHRpcHJlZml4LCBoYXNoXSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IGI2NCBUaGUgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBUaGUgZGVjb2RlZCBieXRlIGFycmF5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZyb21CYXNlNjQoYjY0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYjY0LCAnYmFzZTY0JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBpbnRvIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2U2NCBUaGUgQmFzZTY0LWVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7SVByZXBhcmVkVHJhbnNhY3Rpb259IFRoZSBkZWNvZGVkIGBJUHJlcGFyZWRUcmFuc2FjdGlvbmAgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24oYmFzZTY0OiBzdHJpbmcpOiBJUHJlcGFyZWRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnl0ZXMgPSB0aGlzLmZyb21CYXNlNjQoYmFzZTY0KTtcbiAgICByZXR1cm4gUHJlcGFyZWRUcmFuc2FjdGlvbi5mcm9tQmluYXJ5KGJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhIGRldGVybWluaXN0aWMgY29tYmluZWQgaGFzaCBmcm9tIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgQ2FudG9uLXN0eWxlIFNIQS0yNTYgaGFzaGVzXG4gICAqXG4gICAqIEVhY2ggaGFzaCBpcyBkZWNvZGVkIGZyb20gaGV4LCBzb3J0ZWQgbGV4aWNvZ3JhcGhpY2FsbHkgKGJ5IGhleCksIGFuZCBwcmVmaXhlZCB3aXRoIGl0cyBsZW5ndGhcbiAgICogVGhlIGZpbmFsIGJ1ZmZlciBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIGhhc2hlcyBmb2xsb3dlZCBieSBlYWNoIChsZW5ndGgtcHJlZml4ZWQpIGhhc2hcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaGFzaGVzIC0gQW4gYXJyYXkgb2YgQ2FudG9uLXByZWZpeGVkIFNIQS0yNTYgaGFzaGVzIGluIGhleGFkZWNpbWFsIHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge0J1ZmZlcn0gQSBiaW5hcnkgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgY29tYmluZWQgaGFzaCBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTXVsdGlIYXNoRm9yVG9wb2xvZ3koaGFzaGVzOiBzdHJpbmdbXSk6IEJ1ZmZlciB7XG4gICAgY29uc3Qgc29ydGVkSGFzaGVzID0gaGFzaGVzXG4gICAgICAubWFwKChoZXgpID0+IEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEudG9TdHJpbmcoJ2hleCcpLmxvY2FsZUNvbXBhcmUoYi50b1N0cmluZygnaGV4JykpKTtcblxuICAgIGNvbnN0IG51bUhhc2hlc0J5dGVzID0gdGhpcy5lbmNvZGVJbnQzMihzb3J0ZWRIYXNoZXMubGVuZ3RoKTtcbiAgICBjb25zdCBwYXJ0czogQnVmZmVyW10gPSBbbnVtSGFzaGVzQnl0ZXNdO1xuXG4gICAgZm9yIChjb25zdCBoIG9mIHNvcnRlZEhhc2hlcykge1xuICAgICAgY29uc3QgbGVuZ3RoQnl0ZXMgPSB0aGlzLmVuY29kZUludDMyKGgubGVuZ3RoKTtcbiAgICAgIHBhcnRzLnB1c2gobGVuZ3RoQnl0ZXMsIGgpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KHBhcnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGludG8gYSA0LWJ5dGUgYmlnLWVuZGlhbiBCdWZmZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGludGVnZXIgdG8gZW5jb2RlXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IEEgNC1ieXRlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlSW50MzIodmFsdWU6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGJ1Zi53cml0ZUludDMyQkUodmFsdWUsIDApO1xuICAgIHJldHVybiBidWY7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBjYW50b24gcmF3IHVuaXRzXG4gICAqIEBwYXJhbSB7QmlnTnVtYmVyfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgY29udmVydGVkIHJhdyBjYW50b24gdW5pdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydEFtb3VudFRvTG93ZXN0VW5pdCh2YWx1ZTogQmlnTnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUubXVsdGlwbGllZEJ5KG5ldyBCaWdOdW1iZXIoMTApLnBvdygxMCkpLnRvRml4ZWQoMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiaXRnbyB0b2tlbiBuYW1lIHVzaW5nIHRoZSBvbi1jaGFpbiBpbnN0cnVtZW50IGRldGFpbHNcbiAgICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyAtIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSBmb3JtLCBgaW5zdHJ1bWVudEFkbWluOmluc3RydW1lbnRJZGBcbiAgICogQHJldHVybnMgdG9rZW5OYW1lIGlmIGNvbnRyYWN0QWRkcmVzcyBtYXRjaGVzIHdpdGggYW55IHN1cHBvcnRlZCBjYW50b24gdG9rZW5zXG4gICAqL1xuICBwcml2YXRlIGZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhjb250cmFjdEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbnRyYWN0QWRkcmVzcy5pbmNsdWRlcygnQW11bGV0JykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbnRvblRva2VuID0gY29pbnNcbiAgICAgIC5maWx0ZXIoKGNvaW4pID0+IGNvaW4gaW5zdGFuY2VvZiBDYW50b25Ub2tlbiAmJiBjb2luLmNvbnRyYWN0QWRkcmVzcyA9PT0gY29udHJhY3RBZGRyZXNzKVxuICAgICAgLm1hcCgoY29pbikgPT4gY29pbiBhcyBDYW50b25Ub2tlbik7XG4gICAgcmV0dXJuIGNhbnRvblRva2VuID8gY2FudG9uVG9rZW5bMF0ubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==
560
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxvREFBNEI7QUFFNUIsOENBQXNGO0FBQ3RGLDRDQUFvRDtBQUVwRCwwREFBMEU7QUFDMUUseUZBQW1GO0FBRW5GLHlDQUFtRjtBQUluRixNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMs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QUFFLENBQUM7WUFDdkMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFHLGVBQUs7YUFDdEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFlBQVkscUJBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQzthQUN6RixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQW1CLENBQUMsQ0FBQztRQUN0QyxPQUFPLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7Q0FDRjtBQS9oQkQsc0JBK2hCQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBjb21wdXRlUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9oYXNoL2hhc2guanMnO1xuaW1wb3J0IHsgUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9wcm90by9wcmVwYXJlZFRyYW5zYWN0aW9uLmpzJztcblxuaW1wb3J0IHsgQ3J5cHRvS2V5Rm9ybWF0LCBTaWduaW5nQWxnb3JpdGhtU3BlYywgU2lnbmluZ0tleVNwZWMgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gYXMgSVByZXBhcmVkVHJhbnNhY3Rpb24sIFByZXBhcmVkVHhuUGFyc2VkSW5mbyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmVjb3JkRmllbGQgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFmaW5nZXJwcmludCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFsbCBtZW1vSWRzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGFzIGxvbmcgYXMgc3RyaW5ncyBhcmUgcGFzc2VkXG4gICAgY29uc3QgW2ZpbmdlcnByaW50UGFydF0gPSBmaW5nZXJwcmludC50cmltKCkuc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50UGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDYW50b25IZXgoZmluZ2VycHJpbnRQYXJ0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJbiBjYW50b24sIHRoZXJlIGlzIG5vIGJsb2NrIGhhc2gsIHdlIHN0b3JlIHRoZSBoZWlnaHQgYXMgdGhlIF9pZCAoaGFzaClcbiAgICAvLyB0aGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0sIDxibG9ja0hlaWdodD5fPHZlcnNpb24+XG4gICAgY29uc3QgW2hlaWdodF0gPSBoYXNoLnNwbGl0KCdfJyk7XG4gICAgY29uc3QgYmxvY2tIZWlnaHQgPSBOdW1iZXIoaGVpZ2h0KTtcbiAgICByZXR1cm4gIWlzTmFOKGJsb2NrSGVpZ2h0KSAmJiBibG9ja0hlaWdodCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFByaXZhdGVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFB1YmxpY0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShrZXkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgaW5wdXQgaXMgYSB2YWxpZCBjYW50b24gaGV4IHN0cmluZ1xuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsdWUgdGhlIGhleCBzdHJpbmcgdmFsdWVcbiAgICogQHJldHVybnMge0Jvb2xlYW59IHRydWUgaWYgdmFsaWRcbiAgICovXG4gIGlzVmFsaWRDYW50b25IZXgodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHJlZ2V4ID0gL15bYS1mQS1GMC05XXs2OH0kLztcbiAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGhleCB2YWx1ZSB0byBiYXNlNjRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGhleFN0cmluZyAtIGhleCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7U3RyaW5nfSBiYXNlNjQgZW5jb2RlZCBzdHJpbmdcbiAgICovXG4gIGdldEJhc2U2NEZyb21IZXgoaGV4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShoZXhTdHJpbmcsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGNyZWF0ZSBmaW5nZXJwcmludCAocGFydCBvZiB0aGUgY2FudG9uIHBhcnR5SWQpIGZyb20gcHVibGljIGtleVxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHVibGljS2V5IHRoZSBwdWJsaWMga2V5XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqL1xuICBnZXRBZGRyZXNzRnJvbVB1YmxpY0tleShwdWJsaWNLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qga2V5ID0gdGhpcy5zaWduaW5nUHVibGljS2V5RnJvbUVkMjU1MTkocHVibGljS2V5KTtcbiAgICBjb25zdCBoYXNoUHVycG9zZSA9IDEyO1xuICAgIHJldHVybiB0aGlzLmNvbXB1dGVTaGEyNTZDYW50b25IYXNoKGhhc2hQdXJwb3NlLCBrZXkucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcGFyc2UgcmF3IGNhbnRvbiB0cmFuc2FjdGlvbiAmIGdldCByZXF1aXJlZCBkYXRhXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByYXdEYXRhIGJhc2U2NCBlbmNvZGVkIHN0cmluZ1xuICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uVHlwZX0gdHhUeXBlIHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqIEByZXR1cm5zIHtQcmVwYXJlZFR4blBhcnNlZEluZm99XG4gICAqL1xuICBwYXJzZVJhd0NhbnRvblRyYW5zYWN0aW9uRGF0YShyYXdEYXRhOiBzdHJpbmcsIHR4VHlwZTogVHJhbnNhY3Rpb25UeXBlKTogUHJlcGFyZWRUeG5QYXJzZWRJbmZvIHtcbiAgICBjb25zdCBkZWNvZGVkRGF0YSA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihyYXdEYXRhKTtcbiAgICBjb25zdCBub2RlcyA9IGRlY29kZWREYXRhLnRyYW5zYWN0aW9uPy5ub2RlcyA/PyBbXTtcbiAgICBjb25zdCBnZXRGaWVsZCA9IChmaWVsZHM6IFJlY29yZEZpZWxkW10sIGxhYmVsOiBzdHJpbmcpID0+IGZpZWxkcy5maW5kKChmKSA9PiBmLmxhYmVsID09PSBsYWJlbCk/LnZhbHVlPy5zdW07XG5cbiAgICBsZXQgc2VuZGVyID0gJyc7XG4gICAgbGV0IHJlY2VpdmVyID0gJyc7XG4gICAgbGV0IGFtb3VudCA9ICcnO1xuICAgIGxldCBtZW1vSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaW5zdHJ1bWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGluc3RydW1lbnRBZG1pbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYXJndW1lbnQgZmllbGRzIG9mIHRoZSBmaXJzdCBjcmVhdGUgbm9kZSBtYXRjaGluZyB0aGUgZ2l2ZW4gZW50aXR5IG5hbWUuXG4gICAgICovXG4gICAgY29uc3QgZmluZENyZWF0ZU5vZGVGaWVsZHMgPSAoZW50aXR5TmFtZTogc3RyaW5nKTogUmVjb3JkRmllbGRbXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgY29uc3Qgdm4gPSBub2RlLnZlcnNpb25lZE5vZGU7XG4gICAgICAgIGlmICghdm4gfHwgdm4ub25lb2ZLaW5kICE9PSAndjEnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgbnQgPSB2bi52MS5ub2RlVHlwZTtcbiAgICAgICAgaWYgKG50Lm9uZW9mS2luZCAhPT0gJ2NyZWF0ZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuY3JlYXRlLnRlbXBsYXRlSWQ/LmVudGl0eU5hbWUgIT09IGVudGl0eU5hbWUpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBhcmdTdW0gPSBudC5jcmVhdGUuYXJndW1lbnQ/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjaG9zZW5WYWx1ZSBmaWVsZHMgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMgPSAoY2hvaWNlSWQ6IHN0cmluZyk6IFJlY29yZEZpZWxkW10gfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYXJnU3VtID0gbnQuZXhlcmNpc2UuY2hvc2VuVmFsdWU/LnN1bTtcbiAgICAgICAgaWYgKCFhcmdTdW0gfHwgYXJnU3VtLm9uZW9mS2luZCAhPT0gJ3JlY29yZCcpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBhcmdTdW0ucmVjb3JkPy5maWVsZHM7XG4gICAgICAgIGlmIChmaWVsZHMpIHJldHVybiBmaWVsZHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBhY3RpbmcgcGFydHkgb2YgdGhlIGZpcnN0IGV4ZXJjaXNlIG5vZGUgbWF0Y2hpbmcgdGhlIGdpdmVuIGNob2ljZUlkLlxuICAgICAqL1xuICAgIGNvbnN0IGZpbmRFeGVyY2lzZUFjdGluZ1BhcnR5ID0gKGNob2ljZUlkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIGNvbnN0IHZuID0gbm9kZS52ZXJzaW9uZWROb2RlO1xuICAgICAgICBpZiAoIXZuIHx8IHZuLm9uZW9mS2luZCAhPT0gJ3YxJykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG50ID0gdm4udjEubm9kZVR5cGU7XG4gICAgICAgIGlmIChudC5vbmVvZktpbmQgIT09ICdleGVyY2lzZScpIGNvbnRpbnVlO1xuICAgICAgICBpZiAobnQuZXhlcmNpc2UuY2hvaWNlSWQgIT09IGNob2ljZUlkKSBjb250aW51ZTtcbiAgICAgICAgcmV0dXJuIG50LmV4ZXJjaXNlLmFjdGluZ1BhcnRpZXNbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFeHRyYWN0cyBzZW5kZXIsIHJlY2VpdmVyLCBhbW91bnQsIGFuZCBpbnN0cnVtZW50IGZpZWxkcyBmcm9tIGEgdHJhbnNmZXIgcmVjb3JkLlxuICAgICAqIENhbnRvbiBjb2luIHRyYW5zZmVycyBhbmQgY2J0YyB1c2UgaW5zdHJ1bWVudElkLmFkbWluOyByZWd1bGFyIHRva2VuIHRyYW5zZmVycyB1c2UgaW5zdHJ1bWVudElkZW50aWZpZXIuc291cmNlLlxuICAgICAqL1xuICAgIGNvbnN0IGV4dHJhY3RGcm9tVHJhbnNmZXJSZWNvcmQgPSAoXG4gICAgICB0cmFuc2ZlclJlY29yZDogUmVjb3JkRmllbGRbXSxcbiAgICAgIGluc3RydW1lbnRGaWVsZE5hbWU6IHN0cmluZyxcbiAgICAgIGluc3RydW1lbnRBZG1pbkZpZWxkTmFtZTogc3RyaW5nXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBzZW5kZXJEYXRhID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdzZW5kZXInKTtcbiAgICAgIGlmIChzZW5kZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IHNlbmRlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICBjb25zdCByZWNlaXZlckRhdGEgPSBnZXRGaWVsZCh0cmFuc2ZlclJlY29yZCwgJ3JlY2VpdmVyJyk7XG4gICAgICBpZiAocmVjZWl2ZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gcmVjZWl2ZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgY29uc3QgYW1vdW50RGF0YSA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCAnYW1vdW50Jyk7XG4gICAgICBpZiAoYW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZCA9IGdldEZpZWxkKHRyYW5zZmVyUmVjb3JkLCBpbnN0cnVtZW50RmllbGROYW1lKTtcbiAgICAgIGlmIChpbnN0cnVtZW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgY29uc3QgYWRtaW5EYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgaW5zdHJ1bWVudEFkbWluRmllbGROYW1lKTtcbiAgICAgICAgaWYgKGFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBhZG1pbkRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgIGNvbnN0IGlkRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdpZCcpO1xuICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHN3aXRjaCAodHhUeXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5PbmVTdGVwUHJlQXBwcm92YWw6IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IFRyYW5zZmVyUHJlYXBwcm92YWxQcm9wb3NhbCBjcmVhdGUgbm9kZSDihpIgcHJvdmlkZXI9c2VuZGVyLCByZWNlaXZlclxuICAgICAgICBjb25zdCBjb2luRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUHJlYXBwcm92YWxQcm9wb3NhbCcpO1xuICAgICAgICBpZiAoY29pbkZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IHByb3ZpZGVyRGF0YSA9IGdldEZpZWxkKGNvaW5GaWVsZHMsICdwcm92aWRlcicpO1xuICAgICAgICAgIGlmIChwcm92aWRlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gcHJvdmlkZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKGNvaW5GaWVsZHMsICdyZWNlaXZlcicpO1xuICAgICAgICAgIGlmIChyZWNlaXZlckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSByZWNlaXZlckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgYW1vdW50ID0gJzAnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRva2VuOiBUcmFuc2ZlclByZWFwcHJvdmFsIGNyZWF0ZSBub2RlIOKGkiBvcGVyYXRvcj1zZW5kZXIsIHJlY2VpdmVyLCBpbnN0cnVtZW50QWRtaW4sIGluc3RydW1lbnRBbGxvd2FuY2VzXG4gICAgICAgIGNvbnN0IHRva2VuRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUHJlYXBwcm92YWwnKTtcbiAgICAgICAgaWYgKHRva2VuRmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3BlcmF0b3JEYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdvcGVyYXRvcicpO1xuICAgICAgICAgIGlmIChvcGVyYXRvckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gb3BlcmF0b3JEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHJlY2VpdmVyRGF0YSA9IGdldEZpZWxkKHRva2VuRmllbGRzLCAncmVjZWl2ZXInKTtcbiAgICAgICAgICBpZiAocmVjZWl2ZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHJlY2VpdmVyID0gcmVjZWl2ZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGFtb3VudCA9ICcwJztcbiAgICAgICAgICBjb25zdCBpbnN0cnVtZW50QWRtaW5EYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdpbnN0cnVtZW50QWRtaW4nKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudEFkbWluRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBpbnN0cnVtZW50QWRtaW5EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGFsbG93YW5jZXNEYXRhID0gZ2V0RmllbGQodG9rZW5GaWVsZHMsICdpbnN0cnVtZW50QWxsb3dhbmNlcycpO1xuICAgICAgICAgIGlmIChhbGxvd2FuY2VzRGF0YT8ub25lb2ZLaW5kID09PSAnbGlzdCcpIHtcbiAgICAgICAgICAgIC8vIGZvciB0aGUgc2FtZSBpbnN0cnVtZW50IGFkbWluLCBpZiBtdWx0aXBsZSB0b2tlbnMgYXJlIHN1cHBvcnRlZCB0aGVuIHdlIGNhbiBlbmFibGUgYWxsIG9mIHRoZW0sXG4gICAgICAgICAgICAvLyBidXQgd2Ugd29uJ3QgYmUgZG9pbmcgdGhhdCBmb3Igbm93XG4gICAgICAgICAgICBjb25zdCBmaXJzdEFsbG93YW5jZSA9IGFsbG93YW5jZXNEYXRhLmxpc3Q/LmVsZW1lbnRzPy5bMF0/LnN1bTtcbiAgICAgICAgICAgIGlmIChmaXJzdEFsbG93YW5jZT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgICBjb25zdCBhbGxvd2FuY2VGaWVsZHMgPSBmaXJzdEFsbG93YW5jZS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoYWxsb3dhbmNlRmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgICAgaWYgKGlkRGF0YT8ub25lb2ZLaW5kID09PSAndGV4dCcpIGluc3RydW1lbnRJZCA9IGlkRGF0YS50ZXh0ID8/ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuVHJhbnNmZXJBY2NlcHQ6IHtcbiAgICAgICAgLy8gQ2FudG9uIGNvaW46IEFtdWxldCBjcmVhdGUgbm9kZSDihpIgZHNvPXNlbmRlciwgb3duZXI9cmVjZWl2ZXIsIGFtb3VudC5pbml0aWFsQW1vdW50XG4gICAgICAgIGNvbnN0IGFtdWxldEZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdBbXVsZXQnKTtcbiAgICAgICAgaWYgKGFtdWxldEZpZWxkcykge1xuICAgICAgICAgIGNvbnN0IGRzb0RhdGEgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdkc28nKTtcbiAgICAgICAgICBpZiAoZHNvRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBzZW5kZXIgPSBkc29EYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgIGNvbnN0IG93bmVyRGF0YSA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ293bmVyJyk7XG4gICAgICAgICAgaWYgKG93bmVyRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSByZWNlaXZlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBjb25zdCBhbW91bnRGaWVsZCA9IGdldEZpZWxkKGFtdWxldEZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnRGaWVsZD8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5pdGlhbEFtb3VudERhdGEgPSBnZXRGaWVsZChhbW91bnRGaWVsZC5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luaXRpYWxBbW91bnQnKTtcbiAgICAgICAgICAgIGlmIChpbml0aWFsQW1vdW50RGF0YT8ub25lb2ZLaW5kID09PSAnbnVtZXJpYycpIGFtb3VudCA9IGluaXRpYWxBbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZ3VsYXIgdG9rZW4gKG5vbi1jYnRjKTogRXhlY3V0ZWRUcmFuc2ZlciBjcmVhdGUgbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkZW50aWZpZXIue3NvdXJjZT1hZG1pbiwgaWR9fVxuICAgICAgICBjb25zdCBleGVjdXRlZFRyYW5zZmVyRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0V4ZWN1dGVkVHJhbnNmZXInKTtcbiAgICAgICAgaWYgKGV4ZWN1dGVkVHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKGV4ZWN1dGVkVHJhbnNmZXJGaWVsZHMsICd0cmFuc2ZlcicpO1xuICAgICAgICAgIGlmICh0cmFuc2ZlclN1bT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclN1bS5yZWNvcmQ/LmZpZWxkcyA/PyBbXSwgJ2luc3RydW1lbnRJZGVudGlmaWVyJywgJ3NvdXJjZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBjYnRjIHRva2VuIGZhbGxiYWNrOiBUcmFuc2ZlclJ1bGVfRGlyZWN0VHJhbnNmZXIgZXhlcmNpc2Ugbm9kZVxuICAgICAgICAvLyDihpIgdHJhbnNmZXIue3NlbmRlciwgcmVjZWl2ZXIsIGFtb3VudCwgaW5zdHJ1bWVudElkLnthZG1pbiwgaWR9fVxuICAgICAgICBjb25zdCBkaXJlY3RUcmFuc2ZlckZpZWxkcyA9IGZpbmRFeGVyY2lzZU5vZGVGaWVsZHMoJ1RyYW5zZmVyUnVsZV9EaXJlY3RUcmFuc2ZlcicpO1xuICAgICAgICBpZiAoZGlyZWN0VHJhbnNmZXJGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN1bSA9IGdldEZpZWxkKGRpcmVjdFRyYW5zZmVyRmllbGRzLCAndHJhbnNmZXInKTtcbiAgICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGV4dHJhY3RGcm9tVHJhbnNmZXJSZWNvcmQodHJhbnNmZXJTdW0ucmVjb3JkPy5maWVsZHMgPz8gW10sICdpbnN0cnVtZW50SWQnLCAnYWRtaW4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLlRyYW5zZmVyUmVqZWN0OiB7XG4gICAgICAgIC8vIENhbnRvbiBjb2luOiBBbXVsZXQgY3JlYXRlIG5vZGUg4oaSIGRzbz1zZW5kZXIsIG93bmVyPXJlY2VpdmVyLCBhbW91bnQuaW5pdGlhbEFtb3VudFxuICAgICAgICBjb25zdCBhbXVsZXRGaWVsZHMgPSBmaW5kQ3JlYXRlTm9kZUZpZWxkcygnQW11bGV0Jyk7XG4gICAgICAgIGlmIChhbXVsZXRGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBkc29EYXRhID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnZHNvJyk7XG4gICAgICAgICAgaWYgKGRzb0RhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5Jykgc2VuZGVyID0gZHNvRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBjb25zdCBvd25lckRhdGEgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdvd25lcicpO1xuICAgICAgICAgIGlmIChvd25lckRhdGE/Lm9uZW9mS2luZCA9PT0gJ3BhcnR5JykgcmVjZWl2ZXIgPSBvd25lckRhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgY29uc3QgYW1vdW50RmllbGQgPSBnZXRGaWVsZChhbXVsZXRGaWVsZHMsICdhbW91bnQnKTtcbiAgICAgICAgICBpZiAoYW1vdW50RmllbGQ/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxBbW91bnREYXRhID0gZ2V0RmllbGQoYW1vdW50RmllbGQucmVjb3JkPy5maWVsZHMgPz8gW10sICdpbml0aWFsQW1vdW50Jyk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbEFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBpbml0aWFsQW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBSZWd1bGFyIHRva2VuIChub24tY2J0Yyk6IFJlamVjdGVkVHJhbnNmZXIgY3JlYXRlIG5vZGVcbiAgICAgICAgLy8g4oaSIHRyYW5zZmVyLntzZW5kZXIsIHJlY2VpdmVyLCBhbW91bnQsIGluc3RydW1lbnRJZGVudGlmaWVyLntzb3VyY2U9YWRtaW4sIGlkfX1cbiAgICAgICAgY29uc3QgcmVqZWN0ZWRUcmFuc2ZlckZpZWxkcyA9IGZpbmRDcmVhdGVOb2RlRmllbGRzKCdSZWplY3RlZFRyYW5zZmVyJyk7XG4gICAgICAgIGlmIChyZWplY3RlZFRyYW5zZmVyRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJTdW0gPSBnZXRGaWVsZChyZWplY3RlZFRyYW5zZmVyRmllbGRzLCAndHJhbnNmZXInKTtcbiAgICAgICAgICBpZiAodHJhbnNmZXJTdW0/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGV4dHJhY3RGcm9tVHJhbnNmZXJSZWNvcmQodHJhbnNmZXJTdW0ucmVjb3JkPy5maWVsZHMgPz8gW10sICdpbnN0cnVtZW50SWRlbnRpZmllcicsICdzb3VyY2UnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2J0YyB0b2tlbiBmYWxsYmFjazogSG9sZGluZyBjcmVhdGUgbm9kZSAob3duZXI9c2VuZGVyLCBpbnN0cnVtZW50LCBhbW91bnQpXG4gICAgICAgIC8vICsgVHJhbnNmZXJJbnN0cnVjdGlvbl9SZWplY3QgZXhlcmNpc2UgKGFjdGluZ1BhcnRpZXNbMF09cmVjZWl2ZXIgd2hvIHJlamVjdGVkKVxuICAgICAgICBjb25zdCBob2xkaW5nRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0hvbGRpbmcnKTtcbiAgICAgICAgaWYgKGhvbGRpbmdGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBvd25lckRhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHNlbmRlciA9IG93bmVyRGF0YS5wYXJ0eSA/PyAnJztcbiAgICAgICAgICBjb25zdCBhbW91bnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2Ftb3VudCcpO1xuICAgICAgICAgIGlmIChhbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gYW1vdW50RGF0YS5udW1lcmljID8/ICcnO1xuICAgICAgICAgIGNvbnN0IGluc3RydW1lbnREYXRhID0gZ2V0RmllbGQoaG9sZGluZ0ZpZWxkcywgJ2luc3RydW1lbnQnKTtcbiAgICAgICAgICBpZiAoaW5zdHJ1bWVudERhdGE/Lm9uZW9mS2luZCA9PT0gJ3JlY29yZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc3RydW1lbnRGaWVsZHMgPSBpbnN0cnVtZW50RGF0YS5yZWNvcmQ/LmZpZWxkcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZURhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnc291cmNlJyk7XG4gICAgICAgICAgICBpZiAoc291cmNlRGF0YT8ub25lb2ZLaW5kID09PSAncGFydHknKSBpbnN0cnVtZW50QWRtaW4gPSBzb3VyY2VEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWREYXRhID0gZ2V0RmllbGQoaW5zdHJ1bWVudEZpZWxkcywgJ2lkJyk7XG4gICAgICAgICAgICBpZiAoaWREYXRhPy5vbmVvZktpbmQgPT09ICd0ZXh0JykgaW5zdHJ1bWVudElkID0gaWREYXRhLnRleHQgPz8gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHJlY2VpdmVyUGFydHkgPSBmaW5kRXhlcmNpc2VBY3RpbmdQYXJ0eSgnVHJhbnNmZXJJbnN0cnVjdGlvbl9SZWplY3QnKTtcbiAgICAgICAgICBpZiAocmVjZWl2ZXJQYXJ0eSkgcmVjZWl2ZXIgPSByZWNlaXZlclBhcnR5O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5UcmFuc2Zlck9mZmVyV2l0aGRyYXduOiB7XG4gICAgICAgIC8vIENhbnRvbiBjb2luOiBBbXVsZXQgY3JlYXRlIG5vZGUg4oaSIG93bmVyPXNlbmRlcj1yZWNlaXZlciwgYW1vdW50LmluaXRpYWxBbW91bnRcbiAgICAgICAgY29uc3QgYW11bGV0RmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0FtdWxldCcpO1xuICAgICAgICBpZiAoYW11bGV0RmllbGRzKSB7XG4gICAgICAgICAgY29uc3Qgb3duZXJEYXRhID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHtcbiAgICAgICAgICAgIHJlY2VpdmVyID0gb3duZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgc2VuZGVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFtb3VudEZpZWxkID0gZ2V0RmllbGQoYW11bGV0RmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgaWYgKGFtb3VudEZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCBpbml0aWFsQW1vdW50RGF0YSA9IGdldEZpZWxkKGFtb3VudEZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdLCAnaW5pdGlhbEFtb3VudCcpO1xuICAgICAgICAgICAgaWYgKGluaXRpYWxBbW91bnREYXRhPy5vbmVvZktpbmQgPT09ICdudW1lcmljJykgYW1vdW50ID0gaW5pdGlhbEFtb3VudERhdGEubnVtZXJpYyA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVG9rZW46IEhvbGRpbmcgY3JlYXRlIG5vZGUg4oaSIG93bmVyPXNlbmRlcj1yZWNlaXZlciwgaW5zdHJ1bWVudC57c291cmNlPWFkbWluLCBpZH0sIGFtb3VudFxuICAgICAgICBjb25zdCBob2xkaW5nRmllbGRzID0gZmluZENyZWF0ZU5vZGVGaWVsZHMoJ0hvbGRpbmcnKTtcbiAgICAgICAgaWYgKGhvbGRpbmdGaWVsZHMpIHtcbiAgICAgICAgICBjb25zdCBvd25lckRhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnb3duZXInKTtcbiAgICAgICAgICBpZiAob3duZXJEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIHtcbiAgICAgICAgICAgIHJlY2VpdmVyID0gb3duZXJEYXRhLnBhcnR5ID8/ICcnO1xuICAgICAgICAgICAgc2VuZGVyID0gcmVjZWl2ZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFtb3VudERhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnYW1vdW50Jyk7XG4gICAgICAgICAgaWYgKGFtb3VudERhdGE/Lm9uZW9mS2luZCA9PT0gJ251bWVyaWMnKSBhbW91bnQgPSBhbW91bnREYXRhLm51bWVyaWMgPz8gJyc7XG4gICAgICAgICAgY29uc3QgaW5zdHJ1bWVudERhdGEgPSBnZXRGaWVsZChob2xkaW5nRmllbGRzLCAnaW5zdHJ1bWVudCcpO1xuICAgICAgICAgIGlmIChpbnN0cnVtZW50RGF0YT8ub25lb2ZLaW5kID09PSAncmVjb3JkJykge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1bWVudEZpZWxkcyA9IGluc3RydW1lbnREYXRhLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgY29uc3Qgc291cmNlRGF0YSA9IGdldEZpZWxkKGluc3RydW1lbnRGaWVsZHMsICdzb3VyY2UnKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VEYXRhPy5vbmVvZktpbmQgPT09ICdwYXJ0eScpIGluc3RydW1lbnRBZG1pbiA9IHNvdXJjZURhdGEucGFydHkgPz8gJyc7XG4gICAgICAgICAgICBjb25zdCBpZERhdGEgPSBnZXRGaWVsZChpbnN0cnVtZW50RmllbGRzLCAnaWQnKTtcbiAgICAgICAgICAgIGlmIChpZERhdGE/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBpbnN0cnVtZW50SWQgPSBpZERhdGEudGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gSW5pdGlhbCB0cmFuc2ZlciAoMS1zdGVwIGFuZCAyLXN0ZXAsIGNvaW4gYW5kIHRva2VuKTogVHJhbnNmZXJGYWN0b3J5X1RyYW5zZmVyIGV4ZXJjaXNlIG5vZGVcbiAgICAgICAgLy8g4oaSIHRyYW5zZmVyLntzZW5kZXIsIHJlY2VpdmVyLCBhbW91bnQsIGluc3RydW1lbnRJZC57YWRtaW4sIGlkfSwgbWV0YX1cbiAgICAgICAgY29uc3QgdHJhbnNmZXJGaWVsZHMgPSBmaW5kRXhlcmNpc2VOb2RlRmllbGRzKCdUcmFuc2ZlckZhY3RvcnlfVHJhbnNmZXInKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyRmllbGRzKSB7XG4gICAgICAgICAgY29uc3QgdHJhbnNmZXJTdW0gPSBnZXRGaWVsZCh0cmFuc2ZlckZpZWxkcywgJ3RyYW5zZmVyJyk7XG4gICAgICAgICAgaWYgKHRyYW5zZmVyU3VtPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2ZlclJlY29yZCA9IHRyYW5zZmVyU3VtLnJlY29yZD8uZmllbGRzID8/IFtdO1xuICAgICAgICAgICAgZXh0cmFjdEZyb21UcmFuc2ZlclJlY29yZCh0cmFuc2ZlclJlY29yZCwgJ2luc3RydW1lbnRJZCcsICdhZG1pbicpO1xuICAgICAgICAgICAgY29uc3QgbWV0YUZpZWxkID0gZ2V0RmllbGQodHJhbnNmZXJSZWNvcmQsICdtZXRhJyk7XG4gICAgICAgICAgICBpZiAobWV0YUZpZWxkPy5vbmVvZktpbmQgPT09ICdyZWNvcmQnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlc0ZpZWxkID0gZ2V0RmllbGQobWV0YUZpZWxkLnJlY29yZD8uZmllbGRzID8/IFtdLCAndmFsdWVzJyk7XG4gICAgICAgICAgICAgIGlmICh2YWx1ZXNGaWVsZD8ub25lb2ZLaW5kID09PSAndGV4dE1hcCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1vRW50cnkgPSB2YWx1ZXNGaWVsZC50ZXh0TWFwPy5lbnRyaWVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAoZSkgPT4gZS5rZXkgPT09ICdzcGxpY2UubGZkZWNlbnRyYWxpemVkdHJ1c3Qub3JnL3JlYXNvbidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChtZW1vRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IG1lbW9WYWx1ZSA9IG1lbW9FbnRyeT8udmFsdWU/LnN1bTtcbiAgICAgICAgICAgICAgICAgIGlmIChtZW1vVmFsdWU/Lm9uZW9mS2luZCA9PT0gJ3RleHQnKSBtZW1vSWQgPSBtZW1vVmFsdWUudGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFzZW5kZXIgfHwgIXJlY2VpdmVyIHx8ICFhbW91bnQpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgICBpZiAoIXNlbmRlcikgbWlzc2luZ0ZpZWxkcy5wdXNoKCdzZW5kZXInKTtcbiAgICAgIGlmICghcmVjZWl2ZXIpIG1pc3NpbmdGaWVsZHMucHVzaCgncmVjZWl2ZXInKTtcbiAgICAgIGlmICghYW1vdW50KSBtaXNzaW5nRmllbGRzLnB1c2goJ2Ftb3VudCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHRyYW5zYWN0aW9uIGRhdGE6IG1pc3NpbmcgJHttaXNzaW5nRmllbGRzLmpvaW4oJywgJyl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnRlZEFtb3VudCA9IHRoaXMuY29udmVydEFtb3VudFRvTG93ZXN0VW5pdChuZXcgQmlnTnVtYmVyKGFtb3VudCkpO1xuICAgIGNvbnN0IHBhcnNlZERhdGE6IFByZXBhcmVkVHhuUGFyc2VkSW5mbyA9IHtcbiAgICAgIHNlbmRlcixcbiAgICAgIHJlY2VpdmVyLFxuICAgICAgYW1vdW50OiBjb252ZXJ0ZWRBbW91bnQsXG4gICAgfTtcbiAgICBpZiAobWVtb0lkKSB7XG4gICAgICBwYXJzZWREYXRhLm1lbW9JZCA9IG1lbW9JZDtcbiAgICB9XG4gICAgaWYgKGluc3RydW1lbnRJZCAmJiBpbnN0cnVtZW50QWRtaW4pIHtcbiAgICAgIHBhcnNlZERhdGEudG9rZW4gPSB0aGlzLmZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhgJHtpbnN0cnVtZW50QWRtaW59OiR7aW5zdHJ1bWVudElkfWApO1xuICAgIH1cbiAgICByZXR1cm4gcGFyc2VkRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgdG9wb2xvZ3kgaGFzaCBmcm9tIHRoZSBBUEkgcmVzcG9uc2Ugb2YgdGhlICdjcmVhdGUgcGFydHknIGVuZHBvaW50LlxuICAgKlxuICAgKiBAcGFyYW0gdG9wb2xvZ3lUcmFuc2FjdGlvbnMgLSBMaXN0IG9mIGJhc2U2NC1lbmNvZGVkIHRvcG9sb2d5IHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBDYW50b24gQVBJLlxuICAgKiBAcmV0dXJucyBUaGUgZmluYWwgYmFzZTY0LWVuY29kZWQgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaC5cbiAgICovXG4gIGNvbXB1dGVIYXNoRnJvbUNyZWF0ZVBhcnR5UmVzcG9uc2UodG9wb2xvZ3lUcmFuc2FjdGlvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCB0eEJ1ZmZlcnMgPSB0b3BvbG9neVRyYW5zYWN0aW9ucy5tYXAoKHR4KSA9PiBCdWZmZXIuZnJvbSh0eCwgJ2Jhc2U2NCcpKTtcbiAgICByZXR1cm4gdGhpcy5jb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHR4QnVmZmVycyk7XG4gIH1cblxuICBhc3luYyBjb21wdXRlSGFzaEZyb21QcmVwYXJlU3VibWlzc2lvblJlc3BvbnNlKHByZXBhcmVkVHJhbnNhY3Rpb25CYXNlNjQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgcHJlcGFyZWRUcmFuc2FjdGlvbiA9IHRoaXMuZGVjb2RlUHJlcGFyZWRUcmFuc2FjdGlvbihwcmVwYXJlZFRyYW5zYWN0aW9uQmFzZTY0KTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY29tcHV0ZVByZXBhcmVkVHJhbnNhY3Rpb24ocHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGhhc2gpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgZmluYWwgdG9wb2xvZ3kgdHJhbnNhY3Rpb24gaGFzaCBmb3IgYSBsaXN0IG9mIHByZXBhcmVkIENhbnRvbiB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIEVhY2ggdHJhbnNhY3Rpb24gaXMgZmlyc3QgaGFzaGVkIHdpdGggcHVycG9zZSBgMTFgLCB0aGVuIGFsbCBoYXNoZXMgYXJlIGNvbWJpbmVkIGFuZFxuICAgKiBoYXNoZWQgYWdhaW4gd2l0aCBwdXJwb3NlIGA1NWAsIGZvbGxvd2luZyB0aGUgQ2FudG9uIHRvcG9sb2d5IGhhc2ggcnVsZXMuXG4gICAqXG4gICAqIFRoZSByZXN1bHRpbmcgaGFzaCBpcyBlbmNvZGVkIGFzIGEgYmFzZTY0IHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJbXX0gcHJlcGFyZWRUcmFuc2FjdGlvbnMgLSBBbiBhcnJheSBvZiBDYW50b24gdHJhbnNhY3Rpb24gYnVmZmVycy5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZpbmFsIHRvcG9sb2d5IGhhc2gsIGJhc2U2NC1lbmNvZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlSGFzaEZyb21Ub3BvbG9neVRyYW5zYWN0aW9uKHByZXBhcmVkVHJhbnNhY3Rpb25zOiBCdWZmZXJbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgcmF3SGFzaGVzID0gcHJlcGFyZWRUcmFuc2FjdGlvbnMubWFwKCh0eCkgPT4gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCgxMSwgdHgpKTtcbiAgICBjb25zdCBjb21iaW5lZEhhc2hlcyA9IHRoaXMuY29tcHV0ZU11bHRpSGFzaEZvclRvcG9sb2d5KHJhd0hhc2hlcyk7XG4gICAgY29uc3QgY29tcHV0ZWRIYXNoID0gdGhpcy5jb21wdXRlU2hhMjU2Q2FudG9uSGFzaCg1NSwgY29tYmluZWRIYXNoZXMpO1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShjb21wdXRlZEhhc2gsICdoZXgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBiYXNlNjQtZW5jb2RlZCBFZDI1NTE5IHB1YmxpYyBrZXkgc3RyaW5nIGludG8gYSBzdHJ1Y3R1cmVkIHNpZ25pbmcgcHVibGljIGtleSBvYmplY3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBwdWJsaWNLZXkgVGhlIGJhc2U2NC1lbmNvZGVkIEVkMjU1MTkgcHVibGljIGtleVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc3RydWN0dXJlZCBzaWduaW5nIGtleSBvYmplY3QgZm9ybWF0dGVkIGZvciB1c2Ugd2l0aCBjcnlwdG9ncmFwaGljIG9wZXJhdGlvbnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2lnbmluZ1B1YmxpY0tleUZyb21FZDI1NTE5KHB1YmxpY0tleTogc3RyaW5nKToge1xuICAgIGZvcm1hdDogbnVtYmVyO1xuICAgIHB1YmxpY0tleTogQnVmZmVyO1xuICAgIHNjaGVtZTogbnVtYmVyO1xuICAgIGtleVNwZWM6IG51bWJlcjtcbiAgICB1c2FnZTogW107XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IENyeXB0b0tleUZvcm1hdC5SQVcsXG4gICAgICBwdWJsaWNLZXk6IEJ1ZmZlci5mcm9tKHB1YmxpY0tleSwgJ2Jhc2U2NCcpLFxuICAgICAgc2NoZW1lOiBTaWduaW5nQWxnb3JpdGhtU3BlYy5FRDI1NTE5LFxuICAgICAga2V5U3BlYzogU2lnbmluZ0tleVNwZWMuRUNfQ1VSVkUyNTUxOSxcbiAgICAgIHVzYWdlOiBbXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBidWZmZXIgd2l0aCBhIDQtYnl0ZSBiaWctZW5kaWFuIGludGVnZXIgcHJlZml4IGZvbGxvd2VkIGJ5IHRoZSBwcm92aWRlZCBieXRlIGJ1ZmZlclxuICAgKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgVGhlIGludGVnZXIgdG8gcHJlZml4LCB3cml0dGVuIGFzIDQgYnl0ZXMgaW4gYmlnLWVuZGlhbiBvcmRlclxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBhcHBlbmQgYWZ0ZXIgdGhlIGludGVnZXIgcHJlZml4XG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IFRoZSByZXN1bHRpbmcgYnVmZmVyIHdpdGggdGhlIHByZWZpeGVkIGludGVnZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcHJlZml4ZWRJbnQodmFsdWU6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDQgKyBieXRlcy5sZW5ndGgpO1xuICAgIGJ1ZmZlci53cml0ZVVJbnQzMkJFKHZhbHVlLCAwKTtcbiAgICBCdWZmZXIuZnJvbShieXRlcykuY29weShidWZmZXIsIDQpO1xuICAgIHJldHVybiBidWZmZXI7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW4gU0hBLTI1NiBDYW50b24tc3R5bGUgaGFzaCBieSBwcmVmaXhpbmcgdGhlIGlucHV0IHdpdGggYSBwdXJwb3NlIGlkZW50aWZpZXIsXG4gICAqIHRoZW4gaGFzaGluZyB0aGUgcmVzdWx0aW5nIGJ1ZmZlciBhbmQgcHJlcGVuZGluZyBhIG11bHRpLXByZWZpeFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gcHVycG9zZSBBIG51bWVyaWMgaWRlbnRpZmllciB0byBwcmVmaXggdGhlIGhhc2ggaW5wdXQgd2l0aFxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnl0ZXMgVGhlIGJ1ZmZlciB0byBiZSBoYXNoZWRcbiAgICogQHJldHVybnMge1N0cmluZ30gQSBoZXhhZGVjaW1hbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlc3VsdGluZyBoYXNoIHdpdGggbXVsdGktcHJlZml4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVTaGEyNTZDYW50b25IYXNoKHB1cnBvc2U6IG51bWJlciwgYnl0ZXM6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3QgaGFzaElucHV0ID0gdGhpcy5wcmVmaXhlZEludChwdXJwb3NlLCBieXRlcyk7XG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoaGFzaElucHV0KS5kaWdlc3QoKTtcbiAgICBjb25zdCBtdWx0aXByZWZpeCA9IEJ1ZmZlci5mcm9tKFsweDEyLCAweDIwXSk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW211bHRpcHJlZml4LCBoYXNoXSkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBzdHJpbmcgaW50byBhIFVpbnQ4QXJyYXlcbiAgICogQHBhcmFtIHtTdHJpbmd9IGI2NCBUaGUgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBUaGUgZGVjb2RlZCBieXRlIGFycmF5XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGZyb21CYXNlNjQoYjY0OiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoQnVmZmVyLmZyb20oYjY0LCAnYmFzZTY0JykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZXMgYSBCYXNlNjQtZW5jb2RlZCBwcmVwYXJlZCB0cmFuc2FjdGlvbiBpbnRvIGEgc3RydWN0dXJlZCBvYmplY3RcbiAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2U2NCBUaGUgQmFzZTY0LWVuY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKiBAcmV0dXJucyB7SVByZXBhcmVkVHJhbnNhY3Rpb259IFRoZSBkZWNvZGVkIGBJUHJlcGFyZWRUcmFuc2FjdGlvbmAgb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGRlY29kZVByZXBhcmVkVHJhbnNhY3Rpb24oYmFzZTY0OiBzdHJpbmcpOiBJUHJlcGFyZWRUcmFuc2FjdGlvbiB7XG4gICAgY29uc3QgYnl0ZXMgPSB0aGlzLmZyb21CYXNlNjQoYmFzZTY0KTtcbiAgICByZXR1cm4gUHJlcGFyZWRUcmFuc2FjdGlvbi5mcm9tQmluYXJ5KGJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhIGRldGVybWluaXN0aWMgY29tYmluZWQgaGFzaCBmcm9tIGFuIGFycmF5IG9mIGluZGl2aWR1YWwgQ2FudG9uLXN0eWxlIFNIQS0yNTYgaGFzaGVzXG4gICAqXG4gICAqIEVhY2ggaGFzaCBpcyBkZWNvZGVkIGZyb20gaGV4LCBzb3J0ZWQgbGV4aWNvZ3JhcGhpY2FsbHkgKGJ5IGhleCksIGFuZCBwcmVmaXhlZCB3aXRoIGl0cyBsZW5ndGhcbiAgICogVGhlIGZpbmFsIGJ1ZmZlciBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIGhhc2hlcyBmb2xsb3dlZCBieSBlYWNoIChsZW5ndGgtcHJlZml4ZWQpIGhhc2hcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gaGFzaGVzIC0gQW4gYXJyYXkgb2YgQ2FudG9uLXByZWZpeGVkIFNIQS0yNTYgaGFzaGVzIGluIGhleGFkZWNpbWFsIHN0cmluZyBmb3JtYXRcbiAgICogQHJldHVybnMge0J1ZmZlcn0gQSBiaW5hcnkgYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgY29tYmluZWQgaGFzaCBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlTXVsdGlIYXNoRm9yVG9wb2xvZ3koaGFzaGVzOiBzdHJpbmdbXSk6IEJ1ZmZlciB7XG4gICAgY29uc3Qgc29ydGVkSGFzaGVzID0gaGFzaGVzXG4gICAgICAubWFwKChoZXgpID0+IEJ1ZmZlci5mcm9tKGhleCwgJ2hleCcpKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGEudG9TdHJpbmcoJ2hleCcpLmxvY2FsZUNvbXBhcmUoYi50b1N0cmluZygnaGV4JykpKTtcblxuICAgIGNvbnN0IG51bUhhc2hlc0J5dGVzID0gdGhpcy5lbmNvZGVJbnQzMihzb3J0ZWRIYXNoZXMubGVuZ3RoKTtcbiAgICBjb25zdCBwYXJ0czogQnVmZmVyW10gPSBbbnVtSGFzaGVzQnl0ZXNdO1xuXG4gICAgZm9yIChjb25zdCBoIG9mIHNvcnRlZEhhc2hlcykge1xuICAgICAgY29uc3QgbGVuZ3RoQnl0ZXMgPSB0aGlzLmVuY29kZUludDMyKGgubGVuZ3RoKTtcbiAgICAgIHBhcnRzLnB1c2gobGVuZ3RoQnl0ZXMsIGgpO1xuICAgIH1cblxuICAgIHJldHVybiBCdWZmZXIuY29uY2F0KHBhcnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGVzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGludG8gYSA0LWJ5dGUgYmlnLWVuZGlhbiBCdWZmZXJcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGludGVnZXIgdG8gZW5jb2RlXG4gICAqIEByZXR1cm5zIHtCdWZmZXJ9IEEgNC1ieXRlIGJ1ZmZlciByZXByZXNlbnRpbmcgdGhlIGludGVnZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXRcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlSW50MzIodmFsdWU6IG51bWJlcik6IEJ1ZmZlciB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGJ1Zi53cml0ZUludDMyQkUodmFsdWUsIDApO1xuICAgIHJldHVybiBidWY7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0byBjYW50b24gcmF3IHVuaXRzXG4gICAqIEBwYXJhbSB7QmlnTnVtYmVyfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgY29udmVydGVkIHJhdyBjYW50b24gdW5pdHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgY29udmVydEFtb3VudFRvTG93ZXN0VW5pdCh2YWx1ZTogQmlnTnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUubXVsdGlwbGllZEJ5KG5ldyBCaWdOdW1iZXIoMTApLnBvdygxMCkpLnRvRml4ZWQoMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBiaXRnbyB0b2tlbiBuYW1lIHVzaW5nIHRoZSBvbi1jaGFpbiBpbnN0cnVtZW50IGRldGFpbHNcbiAgICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzcyAtIHRoZSBjb250cmFjdCBhZGRyZXNzIG9mIHRoZSBmb3JtLCBgaW5zdHJ1bWVudEFkbWluOmluc3RydW1lbnRJZGBcbiAgICogQHJldHVybnMgdG9rZW5OYW1lIGlmIGNvbnRyYWN0QWRkcmVzcyBtYXRjaGVzIHdpdGggYW55IHN1cHBvcnRlZCBjYW50b24gdG9rZW5zXG4gICAqL1xuICBwcml2YXRlIGZpbmRUb2tlbk5hbWVCeUNvbnRyYWN0QWRkcmVzcyhjb250cmFjdEFkZHJlc3M6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbnRyYWN0QWRkcmVzcy5pbmNsdWRlcygnQW11bGV0JykpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhbnRvblRva2VuID0gY29pbnNcbiAgICAgIC5maWx0ZXIoKGNvaW4pID0+IGNvaW4gaW5zdGFuY2VvZiBDYW50b25Ub2tlbiAmJiBjb2luLmNvbnRyYWN0QWRkcmVzcyA9PT0gY29udHJhY3RBZGRyZXNzKVxuICAgICAgLm1hcCgoY29pbikgPT4gY29pbiBhcyBDYW50b25Ub2tlbik7XG4gICAgcmV0dXJuIGNhbnRvblRva2VuID8gY2FudG9uVG9rZW5bMF0ubmFtZSA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ==