@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.
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +267 -218
- package/dist/test/resources.d.ts +24 -0
- package/dist/test/resources.d.ts.map +1 -1
- package/dist/test/resources.js +26 -2
- package/dist/test/unit/builder/transfer/transferBuilder.js +22 -1
- package/dist/test/unit/builder/transferAccept/transferAcceptBuilder.js +41 -1
- package/dist/test/unit/builder/transferReject/transferRejectBuilder.js +40 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
package/dist/src/lib/utils.js
CHANGED
|
@@ -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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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
|
|
224
|
-
if (
|
|
225
|
-
const instrumentFields =
|
|
226
|
-
const
|
|
227
|
-
if (
|
|
228
|
-
instrumentAdmin =
|
|
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
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxvREFBNEI7QUFFNUIsOENBQXNGO0FBQ3RGLDRDQUFvRDtBQUVwRCwwREFBMEU7QUFDMUUseUZBQW1GO0FBRW5GLHlDQUFtRjtBQUluRixNQUFhLEtBQUs7SUFDaEIsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMvQixpRUFBaUU7UUFDakUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGlCQUFpQixDQUFDLEdBQVc7UUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsZ0JBQWdCLENBQUMsR0FBVztRQUMxQixPQUFPLElBQUEsa0NBQXVCLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixvQkFBb0IsQ0FBQyxJQUFZO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUM7UUFDbEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCx1QkFBdUIsQ0FBQyxTQUFpQjtRQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsNkJBQTZCLENBQUMsT0FBZSxFQUFFLE1BQXVCO1FBQ3BFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLE1BQTBCLENBQUM7UUFDL0IsSUFBSSxZQUFnQyxDQUFDO1FBQ3JDLElBQUksZUFBbUMsQ0FBQztRQUN4QyxJQUFJLEtBQXlCLENBQUM7UUFDOUIsSUFBSSxlQUFlLEdBQWtCLEVBQUUsQ0FBQztRQUN4QyxJQUFJLG9CQUFvQixHQUFrQixFQUFFLENBQUM7UUFDN0MsSUFBSSxZQUFZLEdBQWtCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLHdCQUF3QixHQUFrQixFQUFFLENBQUM7UUFDakQsSUFBSSw2QkFBNkIsR0FBa0IsRUFBRSxDQUFDO1FBQ3RELElBQUksYUFBYSxHQUFrQixFQUFFLENBQUM7UUFDdEMsSUFBSSxrQkFBa0IsR0FBa0IsRUFBRSxDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDO1FBRTdDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLFNBQVMsS0FBSyxJQUFJO2dCQUFFLE9BQU87WUFDL0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2pDLElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxRQUFRO2dCQUFFLE9BQU87WUFDNUMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO2dCQUFFLE9BQU87WUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUNwQixJQUNFLFFBQVEsRUFBRSxVQUFVLEtBQUssNkJBQTZCO2dCQUN0RCxDQUFDLGVBQWUsQ0FBQyxNQUFNO2dCQUN2QixNQUFNLEtBQUssMEJBQWUsQ0FBQyxrQkFBa0IsRUFDN0MsQ0FBQztnQkFDRCxlQUFlLEdBQUcsTUFBTSxDQUFDO1lBQzNCLENBQUM7WUFDRCxJQUNFLFFBQVEsRUFBRSxVQUFVLEtBQUsscUJBQXFCO2dCQUM5QyxDQUFDLG9CQUFvQixDQUFDLE1BQU07Z0JBQzVCLE1BQU0sS0FBSywwQkFBZSxDQUFDLGtCQUFrQixFQUM3QyxDQUFDO2dCQUNELG9CQUFvQixHQUFHLE1BQU0sQ0FBQztZQUNoQyxDQUFDO1lBQ0QsSUFDRSxRQUFRLEVBQUUsVUFBVSxLQUFLLFFBQVE7Z0JBQ2pDLENBQUMsd0JBQXdCLENBQUMsTUFBTTtnQkFDaEMsQ0FBQyxNQUFNLEtBQUssMEJBQWUsQ0FBQyxjQUFjLElBQUksTUFBTSxLQUFLLDBCQUFlLENBQUMsY0FBYyxDQUFDLEVBQ3hGLENBQUM7Z0JBQ0Qsd0JBQXdCLEdBQUcsTUFBTSxDQUFDO1lBQ3BDLENBQUM7WUFDRCxJQUNFLENBQUMsUUFBUSxFQUFFLFVBQVUsS0FBSyxrQkFBa0IsSUFBSSxRQUFRLEVBQUUsVUFBVSxLQUFLLGtCQUFrQixDQUFDO2dCQUM1RixDQUFDLDZCQUE2QixDQUFDLE1BQU07Z0JBQ3JDLENBQUMsTUFBTSxLQUFLLDBCQUFlLENBQUMsY0FBYyxJQUFJLE1BQU0sS0FBSywwQkFBZSxDQUFDLGNBQWMsQ0FBQyxFQUN4RixDQUFDO2dCQUNELE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ2pFLE1BQU0sV0FBVyxHQUFHLGFBQWEsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO2dCQUM5QyxJQUFJLFdBQVcsRUFBRSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3hDLDZCQUE2QixHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDbkUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUNFLFFBQVEsRUFBRSxVQUFVLEtBQUssUUFBUTtnQkFDakMsQ0FBQyxhQUFhLENBQUMsTUFBTTtnQkFDckIsTUFBTSxLQUFLLDBCQUFlLENBQUMsc0JBQXNCLEVBQ2pELENBQUM7Z0JBQ0QsYUFBYSxHQUFHLE1BQU0sQ0FBQztZQUN6QixDQUFDO1lBQ0QsSUFDRSxRQUFRLEVBQUUsVUFBVSxLQUFLLFNBQVM7Z0JBQ2xDLENBQUMsa0JBQWtCLENBQUMsTUFBTTtnQkFDMUIsTUFBTSxLQUFLLDBCQUFlLENBQUMsc0JBQXNCLEVBQ2pELENBQUM7Z0JBQ0Qsa0JBQWtCLEdBQUcsTUFBTSxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUN0QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxhQUFhLElBQUksYUFBYSxDQUFDLFNBQVMsS0FBSyxJQUFJO2dCQUFFLE9BQU87WUFDL0QsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQ2pDLElBQUksUUFBUSxDQUFDLFNBQVMsS0FBSyxVQUFVO2dCQUFFLE9BQU87WUFDOUMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN2QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxLQUFLLDBCQUEwQjtnQkFBRSxPQUFPO1lBQ2pFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRO2dCQUFFLE9BQU87WUFDckQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsT0FBTztZQUNwQixZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFxQixFQUFFLEtBQWEsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDO1FBRTdHLElBQUksZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0QsSUFBSSxZQUFZLEVBQUUsU0FBUyxLQUFLLE9BQU87Z0JBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDM0QsSUFBSSxZQUFZLEVBQUUsU0FBUyxLQUFLLE9BQU87Z0JBQUUsTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzNFLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDZixDQUFDO2FBQU0sSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDaEUsSUFBSSxZQUFZLEVBQUUsU0FBUyxLQUFLLE9BQU87Z0JBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNoRSxJQUFJLFlBQVksRUFBRSxTQUFTLEtBQUssT0FBTztnQkFBRSxNQUFNLEdBQUcsWUFBWSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDM0UsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNiLE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGlCQUFpQixDQUFDLENBQUM7WUFDOUUsSUFBSSxtQkFBbUIsRUFBRSxTQUFTLEtBQUssT0FBTztnQkFBRSxlQUFlLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztZQUM5RSxJQUFJLGNBQWMsRUFBRSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3pDLGtHQUFrRztnQkFDbEcscUNBQXFDO2dCQUNyQyxNQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztnQkFDL0QsSUFBSSxjQUFjLEVBQUUsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUMzQyxNQUFNLGVBQWUsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7b0JBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQy9DLElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQzt3QkFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO29CQUNuQyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUM7WUFDdkUsTUFBTSxXQUFXLEdBQUcsYUFBYSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7WUFDOUMsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ2xELElBQUksY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUMzQixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO29CQUN0RCxJQUFJLFVBQVUsRUFBRSxTQUFTLEtBQUssT0FBTzt3QkFBRSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBRXZFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzFELElBQUksWUFBWSxFQUFFLFNBQVMsS0FBSyxPQUFPO3dCQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFFN0UsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxVQUFVLEVBQUUsU0FBUyxLQUFLLFNBQVM7d0JBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO29CQUUzRSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO29CQUNqRSxJQUFJLGVBQWUsRUFBRSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQzVDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO3dCQUU5RCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7d0JBQ3RELElBQUksU0FBUyxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQzs0QkFDckMsZUFBZSxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUMxQyxDQUFDO3dCQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDaEQsSUFBSSxNQUFNLEVBQUUsU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDOzRCQUNqQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ25DLENBQUM7b0JBQ0gsQ0FBQztvQkFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO29CQUNuRCxJQUFJLFNBQVMsRUFBRSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ3RDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO3dCQUM1QyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQ3BDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7NEJBQ25ELElBQUksV0FBVyxFQUFFLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQ0FDekMsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxPQUFPLElBQUksRUFBRSxDQUFDO2dDQUNuRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLHdDQUF3QyxDQUFDLENBQUM7Z0NBQzFGLElBQUksU0FBUyxFQUFFLENBQUM7b0NBQ2QsTUFBTSxTQUFTLEdBQUcsU0FBUyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUM7b0NBQ3hDLElBQUksU0FBUyxFQUFFLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQzt3Q0FDcEMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0NBQzFCLENBQUM7Z0NBQ0gsQ0FBQzs0QkFDSCxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzNDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxRCxJQUFJLE9BQU8sRUFBRSxTQUFTLEtBQUssT0FBTztnQkFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzlELElBQUksU0FBUyxFQUFFLFNBQVMsS0FBSyxPQUFPO2dCQUFFLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2RSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDakUsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQ2hELElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO29CQUN6QixNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7b0JBQ2xFLElBQUksaUJBQWlCLEVBQUUsU0FBUyxLQUFLLFNBQVM7d0JBQUUsTUFBTSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQzNGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUksNkJBQTZCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLDZCQUE2QixFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3JFLElBQUksVUFBVSxFQUFFLFNBQVMsS0FBSyxPQUFPO2dCQUFFLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN2RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekUsSUFBSSxZQUFZLEVBQUUsU0FBUyxLQUFLLE9BQU87Z0JBQUUsUUFBUSxHQUFHLFlBQVksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNyRSxJQUFJLFVBQVUsRUFBRSxTQUFTLEtBQUssU0FBUztnQkFBRSxNQUFNLEdBQUcsVUFBVSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDM0UsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLDZCQUE2QixFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDdEYsSUFBSSxhQUFhLEVBQUUsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLFNBQVMsRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7b0JBQ3JDLGVBQWUsR0FBRyxTQUFTLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUMsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELElBQUksTUFBTSxFQUFFLFNBQVMsS0FBSyxNQUFNLEVBQUUsQ0FBQztvQkFDakMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNuQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELElBQUksU0FBUyxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDckMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsUUFBUSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RELElBQUksV0FBVyxFQUFFLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUN0RCxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksaUJBQWlCLEVBQUUsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUMvQyxNQUFNLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEQsSUFBSSxTQUFTLEVBQUUsU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sR0FBRyxRQUFRLENBQUM7WUFDcEIsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRCxJQUFJLFVBQVUsRUFBRSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3hDLE1BQU0sR0FBRyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xFLElBQUksY0FBYyxFQUFFLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7Z0JBQzdELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxTQUFTLEVBQUUsU0FBUyxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUNyQyxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzFDLENBQUM7Z0JBQ0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLE1BQU0sRUFBRSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQ2pDLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDbkMsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsTUFBTTtnQkFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRO2dCQUFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBQ0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksc0JBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQzlFLE1BQU0sVUFBVSxHQUEwQjtZQUN4QyxNQUFNO1lBQ04sUUFBUTtZQUNSLE1BQU0sRUFBRSxlQUFlO1NBQ3hCLENBQUM7UUFDRixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsVUFBVSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksWUFBWSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BDLEtBQUssR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBRyxlQUFlLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNsRixVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsa0NBQWtDLENBQUMsb0JBQThCO1FBQy9ELE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RSxPQUFPLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsS0FBSyxDQUFDLHdDQUF3QyxDQUFDLHlCQUFpQztRQUM5RSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSxvQ0FBMEIsRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxrQ0FBa0MsQ0FBQyxvQkFBOEI7UUFDdkUsTUFBTSxTQUFTLEdBQUcsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdEUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssMkJBQTJCLENBQUMsU0FBaUI7UUFPbkQsT0FBTztZQUNMLE1BQU0sRUFBRSwwQkFBZSxDQUFDLEdBQUc7WUFDM0IsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztZQUMzQyxNQUFNLEVBQUUsK0JBQW9CLENBQUMsT0FBTztZQUNwQyxPQUFPLEVBQUUseUJBQWMsQ0FBQyxhQUFhO1lBQ3JDLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDOUMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyx1QkFBdUIsQ0FBQyxPQUFlLEVBQUUsS0FBYTtRQUM1RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuRCxNQUFNLElBQUksR0FBRyxnQkFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDcEUsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxVQUFVLENBQUMsR0FBVztRQUM1QixPQUFPLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sseUJBQXlCLENBQUMsTUFBYztRQUM5QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sNENBQW1CLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLDJCQUEyQixDQUFDLE1BQWdCO1FBQ2xELE1BQU0sWUFBWSxHQUFHLE1BQU07YUFDeEIsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3RCxNQUFNLEtBQUssR0FBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXpDLEtBQUssTUFBTSxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDN0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDL0MsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxXQUFXLENBQUMsS0FBYTtRQUMvQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVCLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sseUJBQXlCLENBQUMsS0FBZ0I7UUFDaEQsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksc0JBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyw4QkFBOEIsQ0FBQyxlQUF1QjtRQUM1RCxJQUFJLGVBQWUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsTUFBTSxXQUFXLEdBQUcsZUFBSzthQUN0QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxxQkFBVyxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssZUFBZSxDQUFDO2FBQ3pGLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBbUIsQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkQsQ0FBQztDQUNGO0FBOWZELHNCQThmQztBQUVELE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7QUFFMUIsa0JBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpZ051bWJlciBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ2FudG9uVG9rZW4sIGNvaW5zIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuXG5pbXBvcnQgeyBjb21wdXRlUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9oYXNoL2hhc2guanMnO1xuaW1wb3J0IHsgUHJlcGFyZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9wcm90by9wcmVwYXJlZFRyYW5zYWN0aW9uLmpzJztcblxuaW1wb3J0IHsgQ3J5cHRvS2V5Rm9ybWF0LCBTaWduaW5nQWxnb3JpdGhtU3BlYywgU2lnbmluZ0tleVNwZWMgfSBmcm9tICcuL2NvbnN0YW50JztcbmltcG9ydCB7IFByZXBhcmVkVHJhbnNhY3Rpb24gYXMgSVByZXBhcmVkVHJhbnNhY3Rpb24sIFByZXBhcmVkVHhuUGFyc2VkSW5mbyB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgUmVjb3JkRmllbGQgfSBmcm9tICcuL3Jlc291cmNlc0ludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIWFkZHJlc3MgfHwgYWRkcmVzcy50cmltKCkgPT09ICcnKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgW3BhcnR5SGludCwgZmluZ2VycHJpbnRdID0gYWRkcmVzcy50cmltKCkuc3BsaXQoJzo6Jyk7XG4gICAgaWYgKCFmaW5nZXJwcmludCkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFsbCBtZW1vSWRzIGFyZSBjb25zaWRlcmVkIHZhbGlkIGFzIGxvbmcgYXMgc3RyaW5ncyBhcmUgcGFzc2VkXG4gICAgY29uc3QgW2ZpbmdlcnByaW50UGFydF0gPSBmaW5nZXJwcmludC50cmltKCkuc3BsaXQoJz9tZW1vSWQ9Jyk7XG4gICAgaWYgKCFwYXJ0eUhpbnQgfHwgIWZpbmdlcnByaW50UGFydCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmlzVmFsaWRDYW50b25IZXgoZmluZ2VycHJpbnRQYXJ0KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBpc1ZhbGlkQmxvY2tJZChoYXNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBJbiBjYW50b24sIHRoZXJlIGlzIG5vIGJsb2NrIGhhc2gsIHdlIHN0b3JlIHRoZSBoZWlnaHQgYXMgdGhlIF9pZCAoaGFzaClcbiAgICAvLyB0aGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0sIDxibG9ja0hlaWdodD5fPHZlcnNpb24+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==
|