@bitgo-beta/sdk-coin-xtz 1.4.3-alpha.402 → 1.4.3-alpha.404

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/src/index.d.ts +5 -0
  2. package/dist/src/index.d.ts.map +1 -0
  3. package/dist/src/index.js +44 -0
  4. package/dist/src/lib/address.d.ts +8 -0
  5. package/dist/src/lib/address.d.ts.map +1 -0
  6. package/dist/src/lib/address.js +10 -0
  7. package/dist/src/lib/iface.d.ts +148 -0
  8. package/dist/src/lib/iface.d.ts.map +1 -0
  9. package/dist/src/lib/iface.js +3 -0
  10. package/dist/src/lib/index.d.ts +10 -0
  11. package/dist/src/lib/index.d.ts.map +1 -0
  12. package/dist/src/lib/index.js +51 -0
  13. package/dist/src/lib/keyPair.d.ts +40 -0
  14. package/dist/src/lib/keyPair.d.ts.map +1 -0
  15. package/dist/src/lib/keyPair.js +149 -0
  16. package/dist/src/lib/multisigUtils.d.ts +134 -0
  17. package/dist/src/lib/multisigUtils.d.ts.map +1 -0
  18. package/dist/src/lib/multisigUtils.js +1193 -0
  19. package/dist/src/lib/transaction.d.ts +119 -0
  20. package/dist/src/lib/transaction.d.ts.map +1 -0
  21. package/dist/src/lib/transaction.js +329 -0
  22. package/dist/src/lib/transactionBuilder.d.ts +171 -0
  23. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  24. package/dist/src/lib/transactionBuilder.js +453 -0
  25. package/dist/src/lib/transferBuilder.d.ts +24 -0
  26. package/dist/src/lib/transferBuilder.d.ts.map +1 -0
  27. package/dist/src/lib/transferBuilder.js +64 -0
  28. package/dist/src/lib/utils.d.ts +280 -0
  29. package/dist/src/lib/utils.d.ts.map +1 -0
  30. package/dist/src/lib/utils.js +492 -0
  31. package/dist/src/register.d.ts +3 -0
  32. package/dist/src/register.d.ts.map +1 -0
  33. package/dist/src/register.js +11 -0
  34. package/dist/src/txtz.d.ts +13 -0
  35. package/dist/src/txtz.d.ts.map +1 -0
  36. package/dist/src/txtz.js +14 -0
  37. package/dist/src/xtz.d.ts +125 -0
  38. package/dist/src/xtz.d.ts.map +1 -0
  39. package/dist/src/xtz.js +409 -0
  40. package/dist/test/fixtures.d.ts +571 -0
  41. package/dist/test/fixtures.d.ts.map +1 -0
  42. package/dist/test/fixtures.js +656 -0
  43. package/dist/test/resources.d.ts +451 -0
  44. package/dist/test/resources.d.ts.map +1 -0
  45. package/dist/test/resources.js +349 -0
  46. package/dist/test/unit/keyPair.d.ts +2 -0
  47. package/dist/test/unit/keyPair.d.ts.map +1 -0
  48. package/dist/test/unit/keyPair.js +142 -0
  49. package/dist/test/unit/offlineTransactionBuilder.d.ts +2 -0
  50. package/dist/test/unit/offlineTransactionBuilder.d.ts.map +1 -0
  51. package/dist/test/unit/offlineTransactionBuilder.js +291 -0
  52. package/dist/test/unit/transaction.d.ts +2 -0
  53. package/dist/test/unit/transaction.d.ts.map +1 -0
  54. package/dist/test/unit/transaction.js +98 -0
  55. package/dist/test/unit/transactionBuilder.d.ts +2 -0
  56. package/dist/test/unit/transactionBuilder.d.ts.map +1 -0
  57. package/dist/test/unit/transactionBuilder.js +656 -0
  58. package/dist/test/unit/transferBuilder.d.ts +2 -0
  59. package/dist/test/unit/transferBuilder.d.ts.map +1 -0
  60. package/dist/test/unit/transferBuilder.js +82 -0
  61. package/dist/test/unit/util.d.ts +2 -0
  62. package/dist/test/unit/util.d.ts.map +1 -0
  63. package/dist/test/unit/util.js +198 -0
  64. package/dist/test/unit/xtz.d.ts +2 -0
  65. package/dist/test/unit/xtz.d.ts.map +1 -0
  66. package/dist/test/unit/xtz.js +192 -0
  67. package/dist/tsconfig.tsbuildinfo +1 -0
  68. package/package.json +11 -8
  69. package/.eslintignore +0 -5
  70. package/.mocharc.yml +0 -8
  71. package/CHANGELOG.md +0 -784
@@ -0,0 +1,1193 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getMultisigTransferDataFromOperation = getMultisigTransferDataFromOperation;
37
+ exports.getOriginationDataFromOperation = getOriginationDataFromOperation;
38
+ exports.singlesigTransactionOperation = singlesigTransactionOperation;
39
+ exports.multisigTransactionOperation = multisigTransactionOperation;
40
+ exports.updateMultisigTransferSignatures = updateMultisigTransferSignatures;
41
+ exports.getMultisigTransferSignatures = getMultisigTransferSignatures;
42
+ exports.genericMultisigDataToSign = genericMultisigDataToSign;
43
+ exports.revealOperation = revealOperation;
44
+ exports.genericMultisigOriginationOperation = genericMultisigOriginationOperation;
45
+ exports.getOwnersPublicKeys = getOwnersPublicKeys;
46
+ exports.forwarderOriginationOperation = forwarderOriginationOperation;
47
+ const _ = __importStar(require("lodash"));
48
+ const utils_1 = require("./utils");
49
+ // Default n of m for multisig wallets
50
+ const DEFAULT_N = 2;
51
+ const DEFAULT_M = 3;
52
+ /**
53
+ * Helper method to get the transfer details from a generic multisig transaction operation.
54
+ *
55
+ * @param {TransactionOp} operation A transaction operation JSON
56
+ * @returns {TransferData} Information about the destination, token and transfer amount
57
+ */
58
+ function getMultisigTransferDataFromOperation(operation) {
59
+ const fee = {
60
+ fee: operation.fee,
61
+ gasLimit: operation.gas_limit,
62
+ storageLimit: operation.storage_limit,
63
+ };
64
+ if (!operation.parameters) {
65
+ // Singlesig transaction
66
+ return {
67
+ coin: 'mutez',
68
+ from: operation.source,
69
+ to: operation.destination,
70
+ amount: operation.amount,
71
+ fee,
72
+ };
73
+ }
74
+ // These follow the structure from the response of genericMultisigTransferParams()
75
+ const transferArgs = operation.parameters.value.args[0].args[1].args[0];
76
+ const accountType = transferArgs[3].prim;
77
+ const counter = operation.parameters.value.args[0].args[0].int;
78
+ // In multisig transactions, the wallet contract is the destination
79
+ const from = operation.destination;
80
+ let accountTypeIndex;
81
+ switch (accountType) {
82
+ case 'IMPLICIT_ACCOUNT':
83
+ accountTypeIndex = 4;
84
+ break;
85
+ case 'CONTRACT':
86
+ accountTypeIndex = 5;
87
+ break;
88
+ default:
89
+ throw new Error('Invalid contract parameters');
90
+ }
91
+ return {
92
+ coin: transferArgs[accountTypeIndex].args[0].prim,
93
+ from,
94
+ to: transferArgs[2].args[1].string,
95
+ amount: transferArgs[accountTypeIndex].args[1].int,
96
+ fee,
97
+ counter,
98
+ };
99
+ }
100
+ /**
101
+ * Helper method to get the wallet or address initialization tx from an origination operation
102
+ *
103
+ * @param {OriginationOp} operation
104
+ * @returns {OriginationData} Information about the wallet contract creating a forwarder contract
105
+ */
106
+ function getOriginationDataFromOperation(operation) {
107
+ const fee = {
108
+ fee: operation.fee,
109
+ gasLimit: operation.gas_limit,
110
+ storageLimit: operation.storage_limit,
111
+ };
112
+ const { source: from, counter, balance } = operation;
113
+ // Transactions initializing a forwarder contract contain the address of the wallet contract
114
+ const forwarderDestination = _.get(operation, 'script.code[2].args[0][3].args[0][0].args[1].string');
115
+ return {
116
+ fee,
117
+ counter,
118
+ balance,
119
+ from,
120
+ forwarderDestination,
121
+ };
122
+ }
123
+ /**
124
+ * Helper method to build a singlesig transaction operation.
125
+ *
126
+ * @param {string} counter Source account next counter
127
+ * @param {string} source The account that will pay for fees, and in singlesig transactions, where
128
+ * the funds are taken from
129
+ * @param {string} amount The amount in mutez to be transferred
130
+ * @param {string} destination The account address to send the funds to
131
+ * @param {string} fee Fees in mutez to pay by the source account
132
+ * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
133
+ * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
134
+ * @returns {TransactionOp}A Tezos transaction operation
135
+ */
136
+ function singlesigTransactionOperation(counter, source, amount, destination, fee = utils_1.DEFAULT_FEE.TRANSFER.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.TRANSFER.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.TRANSFER.toString()) {
137
+ return {
138
+ kind: 'transaction',
139
+ source,
140
+ fee,
141
+ counter,
142
+ gas_limit: gasLimit,
143
+ storage_limit: storageLimit,
144
+ amount,
145
+ destination,
146
+ };
147
+ }
148
+ /**
149
+ * Create a multisig wallet transaction operation.
150
+ *
151
+ * @see {@link transactionOperation}
152
+ * @param {string} counter Source account next counter
153
+ * @param {string} source The account that will pay for fees, and in singlesig transactions, where
154
+ * the funds are taken from
155
+ * @param {string} amount The amount in mutez to be transferred
156
+ * @param {string} contractAddress If it is a multisig transfer, the smart contract address with the
157
+ * funds to be transferred from
158
+ * @param {string} contractCounter If it is a multisig transfer, the smart contract counter to use
159
+ * in the next transaction
160
+ * @param {string} destinationAddress An implicit or originated address to transfer fudns to
161
+ * @param {string[]} signatures signatures List of signatures authorizing the funds transfer form
162
+ * the multisig wallet
163
+ * @param {string} fee Fees in mutez to pay by the source account
164
+ * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
165
+ * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
166
+ * @param {number} m The number of signers (owners) for the multisig wallet being used. Default is 3
167
+ * @returns {TransactionOp} A Tezos operation with a generic multisig transfer
168
+ */
169
+ function multisigTransactionOperation(counter, source, amount, contractAddress, contractCounter, destinationAddress, signatures, fee = utils_1.DEFAULT_FEE.TRANSFER.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.TRANSFER.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.TRANSFER.toString(), m = DEFAULT_M) {
170
+ return {
171
+ kind: 'transaction',
172
+ source,
173
+ fee,
174
+ counter,
175
+ gas_limit: gasLimit,
176
+ storage_limit: storageLimit,
177
+ amount: '0', // Don't transfer any funds from he source account to the contract in multisig txs
178
+ destination: contractAddress,
179
+ parameters: genericMultisigTransferParams(destinationAddress, amount, contractCounter, signatures, m),
180
+ };
181
+ }
182
+ /**
183
+ * Helper function to build the parameters to call the generic multisig smart contract with.
184
+ *
185
+ * @param {string} destinationAddress An implicit or originated address
186
+ * @param {number} amount Number of Mutez to be transferred
187
+ * @param {string} contractCounter Multisig contract counter number
188
+ * @param {IndexedSignature[]} signatures List of transactions and their order
189
+ * @param {number} m The multisig wallet total number of signers (owners)
190
+ * @returns The parameters object
191
+ */
192
+ function genericMultisigTransferParams(destinationAddress, amount, contractCounter, signatures, m) {
193
+ const transactionSignatures = buildSignatures(signatures);
194
+ return {
195
+ entrypoint: 'main',
196
+ value: {
197
+ prim: 'Pair',
198
+ args: [
199
+ {
200
+ prim: 'Pair',
201
+ args: [{ int: contractCounter }, { prim: 'Left', args: [transferToAccount(destinationAddress, amount)] }],
202
+ },
203
+ transactionSignatures,
204
+ ],
205
+ },
206
+ };
207
+ }
208
+ /**
209
+ * Replace the signatures in a multisig transaction operation with new ones.
210
+ *
211
+ * @param {TransactionOp} transaction Transaction to mutate
212
+ * @param {IndexedSignature[]} signatures List of transactions and their order
213
+ */
214
+ function updateMultisigTransferSignatures(transaction, signatures) {
215
+ transaction.parameters.value.args[1] = buildSignatures(signatures, transaction.parameters.value.args[1]);
216
+ }
217
+ /**
218
+ * Ge the list if multisig signatures if any in a convenient format.
219
+ *
220
+ * @param {TransactionOp} transaction The transaction to search the signatures in
221
+ * @returns {IndexedSignature[]} A list of signatures and their order in teh transfer script
222
+ */
223
+ function getMultisigTransferSignatures(transaction) {
224
+ const signatures = [];
225
+ if (!transaction.parameters && !transaction.parameters.value && !transaction.parameters.value) {
226
+ return [];
227
+ }
228
+ const rawSignatures = transaction.parameters.value.args[1];
229
+ for (let i = 0; i < rawSignatures.length; i++) {
230
+ if (rawSignatures[i].prim === 'Some') {
231
+ signatures.push({
232
+ signature: rawSignatures[i].args[0].string,
233
+ index: i,
234
+ });
235
+ }
236
+ }
237
+ return signatures;
238
+ }
239
+ /**
240
+ * Build a list of ordered signatures, putting a None primitive for the missing indexes.
241
+ *
242
+ * @param {IndexedSignature[]} signatures List of transactions and their order
243
+ * @param {number} m Size of the signature list
244
+ * @param {any[]} existingSignatures List of existing signatures to merge with the generated ones
245
+ * @returns {any[]} List of signatures in the right order
246
+ */
247
+ function buildSignatures(signatures, existingSignatures = [], m = DEFAULT_M) {
248
+ // Initialize the array with the existing signatures and/or empty objects
249
+ const transactionSignatures = existingSignatures;
250
+ const size = existingSignatures.length;
251
+ if (size > m) {
252
+ throw new Error('Too many signatures. Expected less than ' + m + ' got ' + size);
253
+ }
254
+ for (let i = size; i < m; i++) {
255
+ transactionSignatures.push({ prim: 'None' });
256
+ }
257
+ // Replace the empty signatures for the real ones based on the right index
258
+ signatures.forEach((s) => {
259
+ if (s.index) {
260
+ transactionSignatures[s.index] = { prim: 'Some', args: [{ string: s.signature }] };
261
+ }
262
+ else {
263
+ for (let i = 0; i < transactionSignatures.length; i++) {
264
+ // Search for the first "null" signature
265
+ if (transactionSignatures[i].prim === 'None') {
266
+ transactionSignatures[i] = { prim: 'Some', args: [{ string: s.signature }] };
267
+ break;
268
+ }
269
+ }
270
+ }
271
+ });
272
+ return transactionSignatures;
273
+ }
274
+ /**
275
+ * Helper function to build the Michelson script to be signed to transfer funds from a multisig
276
+ * wallet.
277
+ *
278
+ * @param contractAddress The multisig smart contract address
279
+ * @param {string} destinationAddress The destination account address (implicit or originated)
280
+ * @param {number} amount Number of mutez to transfer
281
+ * @param {string} contractCounter Wallet counter to use in the transaction
282
+ * @returns A JSON representation of the Michelson script to sign and approve a transfer
283
+ */
284
+ function genericMultisigDataToSign(contractAddress, destinationAddress, amount, contractCounter) {
285
+ const data = {
286
+ prim: 'Pair',
287
+ args: [
288
+ { int: contractCounter },
289
+ {
290
+ prim: 'Left',
291
+ args: [transferToAccount(destinationAddress, amount)],
292
+ },
293
+ ],
294
+ };
295
+ const type = {
296
+ prim: 'pair',
297
+ args: [
298
+ {
299
+ prim: 'nat',
300
+ annots: ['%counter'],
301
+ },
302
+ {
303
+ prim: 'or',
304
+ args: [
305
+ {
306
+ prim: 'lambda',
307
+ args: [
308
+ { prim: 'unit' },
309
+ {
310
+ prim: 'list',
311
+ args: [{ prim: 'operation' }],
312
+ },
313
+ ],
314
+ annots: ['%operation'],
315
+ },
316
+ {
317
+ prim: 'pair',
318
+ args: [
319
+ {
320
+ prim: 'nat',
321
+ annots: ['%threshold'],
322
+ },
323
+ {
324
+ prim: 'list',
325
+ args: [{ prim: 'key' }],
326
+ annots: ['%keys'],
327
+ },
328
+ ],
329
+ annots: ['%change_keys'],
330
+ },
331
+ ],
332
+ annots: [':action'],
333
+ },
334
+ ],
335
+ annots: [':payload'],
336
+ };
337
+ return buildPair(data, type, contractAddress);
338
+ }
339
+ /**
340
+ * Util function to build a Michelson Pair object.
341
+ *
342
+ * @param data
343
+ * @param type
344
+ * @param contractAddress
345
+ */
346
+ function buildPair(data, type, contractAddress) {
347
+ return {
348
+ data: {
349
+ prim: 'Pair',
350
+ args: [{ string: contractAddress }, data],
351
+ },
352
+ type: {
353
+ prim: 'pair',
354
+ args: [{ prim: 'address' }, type],
355
+ },
356
+ };
357
+ }
358
+ /**
359
+ * Build the lambda for the multisig transaction transfer to an implicit or originated account.
360
+ *
361
+ * @param {string} address Account address to send the funds to
362
+ * @param {string} amount The amount in mutez to transfer
363
+ * @see {@link https://tezostaquito.io/docs/making_transfers#transfer-000005-50-mutez-tokens-from-a-kt1-address-to-a-tz1-address}
364
+ */
365
+ function transferToAccount(address, amount) {
366
+ if ((0, utils_1.isValidKey)(address, utils_1.hashTypes.KT)) {
367
+ return transferToOriginatedAccount(address, amount);
368
+ }
369
+ // Lambda to transfer to an implicit account
370
+ return [
371
+ { prim: 'DROP' },
372
+ { prim: 'NIL', args: [{ prim: 'operation' }] },
373
+ {
374
+ prim: 'PUSH',
375
+ args: [{ prim: 'key_hash' }, { string: address }],
376
+ },
377
+ { prim: 'IMPLICIT_ACCOUNT' },
378
+ {
379
+ prim: 'PUSH',
380
+ args: [{ prim: 'mutez' }, { int: amount }],
381
+ },
382
+ { prim: 'UNIT' },
383
+ { prim: 'TRANSFER_TOKENS' },
384
+ { prim: 'CONS' },
385
+ ];
386
+ }
387
+ /**
388
+ * Build the lambda for the multisig transaction transfer to an originated account.
389
+ *
390
+ * @param {string} address Originated account address to send the funds to
391
+ * @param {string} amount The amount in mutez to transfer
392
+ * @see {@link https://tezostaquito.io/docs/making_transfers#transfer-0000001-1-mutez-tokens-from-a-kt1-address-to-a-kt1-address}
393
+ */
394
+ function transferToOriginatedAccount(address, amount) {
395
+ return [
396
+ { prim: 'DROP' },
397
+ { prim: 'NIL', args: [{ prim: 'operation' }] },
398
+ {
399
+ prim: 'PUSH',
400
+ args: [{ prim: 'address' }, { string: address }],
401
+ },
402
+ { prim: 'CONTRACT', args: [{ prim: 'unit' }] },
403
+ [
404
+ {
405
+ prim: 'IF_NONE',
406
+ args: [[[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]], []],
407
+ },
408
+ ],
409
+ {
410
+ prim: 'PUSH',
411
+ args: [{ prim: 'mutez' }, { int: amount }],
412
+ },
413
+ { prim: 'UNIT' },
414
+ { prim: 'TRANSFER_TOKENS' },
415
+ { prim: 'CONS' },
416
+ ];
417
+ }
418
+ /**
419
+ * Create a reveal operation for a public key.
420
+ *
421
+ * @param {string} counter Source account next counter
422
+ * @param {string} source Source account address
423
+ * @param {string} pubKey The public key to reveal
424
+ * @param {string} fee Fees in mutez to pay by the source account
425
+ * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
426
+ * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
427
+ * @returns An origination operation
428
+ */
429
+ function revealOperation(counter, source, pubKey, fee = utils_1.DEFAULT_FEE.REVEAL.toString(), gasLimit = utils_1.DEFAULT_GAS_LIMIT.REVEAL.toString(), storageLimit = utils_1.DEFAULT_STORAGE_LIMIT.REVEAL.toString()) {
430
+ return {
431
+ kind: 'reveal',
432
+ counter,
433
+ source,
434
+ fee,
435
+ gas_limit: gasLimit,
436
+ storage_limit: storageLimit,
437
+ public_key: pubKey,
438
+ };
439
+ }
440
+ /**
441
+ * Create an origination operation for the generic multisg contract. It does not create a reveal
442
+ * operation for the source account.
443
+ *
444
+ * @param {string} counter Valid source account counter to use
445
+ * @param {string} source Source account address
446
+ * @param {string} fee Fees in mutez to pay by the source account
447
+ * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
448
+ * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
449
+ * @param {string} balance New multisig account initial balance taken from the source account
450
+ * @param {string[]} pubKeys List of public keys of the multisig owner
451
+ * @param {string} delegate Optional implicit address to delegate the wallet funds to
452
+ * @param {number} threshold Minimum number of signatures required to authorize a multisig operation
453
+ * @returns An origination operation
454
+ */
455
+ function genericMultisigOriginationOperation(counter, source, fee, gasLimit, storageLimit, balance, pubKeys, delegate, threshold = DEFAULT_N) {
456
+ const walletPublicKeys = [];
457
+ pubKeys.forEach((pk) => walletPublicKeys.push({ string: pk }));
458
+ const originationOp = {
459
+ kind: 'origination',
460
+ counter,
461
+ source,
462
+ fee,
463
+ gas_limit: gasLimit,
464
+ storage_limit: storageLimit,
465
+ balance,
466
+ script: {
467
+ code: genericMultisig,
468
+ storage: {
469
+ prim: 'Pair',
470
+ args: [
471
+ {
472
+ int: '0',
473
+ },
474
+ {
475
+ prim: 'Pair',
476
+ args: [
477
+ {
478
+ int: threshold.toString(),
479
+ },
480
+ walletPublicKeys,
481
+ ],
482
+ },
483
+ ],
484
+ },
485
+ },
486
+ };
487
+ if (delegate) {
488
+ originationOp.delegate = delegate;
489
+ }
490
+ return originationOp;
491
+ }
492
+ /**
493
+ * Get the public key of each owner of an multisig wallet origination contract.
494
+ *
495
+ * @param {OriginationOp} operation An operation with the generic multisig wallet origination
496
+ * @returns {string[]} List of all the owners set in the origination transaction
497
+ */
498
+ function getOwnersPublicKeys(operation) {
499
+ const ownersArgs = _.get(operation, 'script.storage.args[1].args[1]');
500
+ if (!ownersArgs) {
501
+ return [];
502
+ }
503
+ return ownersArgs.map((o) => o.string);
504
+ }
505
+ /**
506
+ * Generic Multisig contract from https://github.com/murbard/smart-contracts/blob/master/multisig/michelson/generic.tz
507
+ */
508
+ const genericMultisig = [
509
+ {
510
+ prim: 'parameter',
511
+ args: [
512
+ {
513
+ prim: 'or',
514
+ args: [
515
+ { prim: 'unit', annots: ['%default'] },
516
+ {
517
+ prim: 'pair',
518
+ args: [
519
+ {
520
+ prim: 'pair',
521
+ args: [
522
+ {
523
+ prim: 'nat',
524
+ annots: ['%counter'],
525
+ },
526
+ {
527
+ prim: 'or',
528
+ args: [
529
+ {
530
+ prim: 'lambda',
531
+ args: [
532
+ { prim: 'unit' },
533
+ {
534
+ prim: 'list',
535
+ args: [
536
+ {
537
+ prim: 'operation',
538
+ },
539
+ ],
540
+ },
541
+ ],
542
+ annots: ['%operation'],
543
+ },
544
+ {
545
+ prim: 'pair',
546
+ args: [
547
+ {
548
+ prim: 'nat',
549
+ annots: ['%threshold'],
550
+ },
551
+ {
552
+ prim: 'list',
553
+ args: [{ prim: 'key' }],
554
+ annots: ['%keys'],
555
+ },
556
+ ],
557
+ annots: ['%change_keys'],
558
+ },
559
+ ],
560
+ annots: [':action'],
561
+ },
562
+ ],
563
+ annots: [':payload'],
564
+ },
565
+ {
566
+ prim: 'list',
567
+ args: [
568
+ {
569
+ prim: 'option',
570
+ args: [{ prim: 'signature' }],
571
+ },
572
+ ],
573
+ annots: ['%sigs'],
574
+ },
575
+ ],
576
+ annots: ['%main'],
577
+ },
578
+ ],
579
+ },
580
+ ],
581
+ },
582
+ {
583
+ prim: 'storage',
584
+ args: [
585
+ {
586
+ prim: 'pair',
587
+ args: [
588
+ {
589
+ prim: 'nat',
590
+ annots: ['%stored_counter'],
591
+ },
592
+ {
593
+ prim: 'pair',
594
+ args: [
595
+ {
596
+ prim: 'nat',
597
+ annots: ['%threshold'],
598
+ },
599
+ {
600
+ prim: 'list',
601
+ args: [{ prim: 'key' }],
602
+ annots: ['%keys'],
603
+ },
604
+ ],
605
+ },
606
+ ],
607
+ },
608
+ ],
609
+ },
610
+ {
611
+ prim: 'code',
612
+ args: [
613
+ [
614
+ [
615
+ [
616
+ { prim: 'DUP' },
617
+ { prim: 'CAR' },
618
+ {
619
+ prim: 'DIP',
620
+ args: [[{ prim: 'CDR' }]],
621
+ },
622
+ ],
623
+ ],
624
+ {
625
+ prim: 'IF_LEFT',
626
+ args: [
627
+ [
628
+ { prim: 'DROP' },
629
+ {
630
+ prim: 'NIL',
631
+ args: [{ prim: 'operation' }],
632
+ },
633
+ { prim: 'PAIR' },
634
+ ],
635
+ [
636
+ {
637
+ prim: 'PUSH',
638
+ args: [{ prim: 'mutez' }, { int: '0' }],
639
+ },
640
+ { prim: 'AMOUNT' },
641
+ [
642
+ [{ prim: 'COMPARE' }, { prim: 'EQ' }],
643
+ {
644
+ prim: 'IF',
645
+ args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
646
+ },
647
+ ],
648
+ { prim: 'SWAP' },
649
+ { prim: 'DUP' },
650
+ {
651
+ prim: 'DIP',
652
+ args: [[{ prim: 'SWAP' }]],
653
+ },
654
+ {
655
+ prim: 'DIP',
656
+ args: [
657
+ [
658
+ [
659
+ [
660
+ { prim: 'DUP' },
661
+ { prim: 'CAR' },
662
+ {
663
+ prim: 'DIP',
664
+ args: [[{ prim: 'CDR' }]],
665
+ },
666
+ ],
667
+ ],
668
+ { prim: 'DUP' },
669
+ { prim: 'SELF' },
670
+ { prim: 'ADDRESS' },
671
+ { prim: 'PAIR' },
672
+ { prim: 'PACK' },
673
+ {
674
+ prim: 'DIP',
675
+ args: [
676
+ [
677
+ [
678
+ [
679
+ { prim: 'DUP' },
680
+ {
681
+ prim: 'CAR',
682
+ annots: ['@counter'],
683
+ },
684
+ {
685
+ prim: 'DIP',
686
+ args: [
687
+ [
688
+ {
689
+ prim: 'CDR',
690
+ },
691
+ ],
692
+ ],
693
+ },
694
+ ],
695
+ ],
696
+ {
697
+ prim: 'DIP',
698
+ args: [[{ prim: 'SWAP' }]],
699
+ },
700
+ ],
701
+ ],
702
+ },
703
+ { prim: 'SWAP' },
704
+ ],
705
+ ],
706
+ },
707
+ [
708
+ [
709
+ { prim: 'DUP' },
710
+ {
711
+ prim: 'CAR',
712
+ annots: ['@stored_counter'],
713
+ },
714
+ {
715
+ prim: 'DIP',
716
+ args: [[{ prim: 'CDR' }]],
717
+ },
718
+ ],
719
+ ],
720
+ {
721
+ prim: 'DIP',
722
+ args: [[{ prim: 'SWAP' }]],
723
+ },
724
+ [
725
+ [{ prim: 'COMPARE' }, { prim: 'EQ' }],
726
+ {
727
+ prim: 'IF',
728
+ args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
729
+ },
730
+ ],
731
+ {
732
+ prim: 'DIP',
733
+ args: [[{ prim: 'SWAP' }]],
734
+ },
735
+ [
736
+ [
737
+ { prim: 'DUP' },
738
+ {
739
+ prim: 'CAR',
740
+ annots: ['@threshold'],
741
+ },
742
+ {
743
+ prim: 'DIP',
744
+ args: [
745
+ [
746
+ {
747
+ prim: 'CDR',
748
+ annots: ['@keys'],
749
+ },
750
+ ],
751
+ ],
752
+ },
753
+ ],
754
+ ],
755
+ {
756
+ prim: 'DIP',
757
+ args: [
758
+ [
759
+ {
760
+ prim: 'PUSH',
761
+ args: [{ prim: 'nat' }, { int: '0' }],
762
+ annots: ['@valid'],
763
+ },
764
+ { prim: 'SWAP' },
765
+ {
766
+ prim: 'ITER',
767
+ args: [
768
+ [
769
+ {
770
+ prim: 'DIP',
771
+ args: [[{ prim: 'SWAP' }]],
772
+ },
773
+ { prim: 'SWAP' },
774
+ {
775
+ prim: 'IF_CONS',
776
+ args: [
777
+ [
778
+ [
779
+ {
780
+ prim: 'IF_NONE',
781
+ args: [
782
+ [
783
+ {
784
+ prim: 'SWAP',
785
+ },
786
+ {
787
+ prim: 'DROP',
788
+ },
789
+ ],
790
+ [
791
+ {
792
+ prim: 'SWAP',
793
+ },
794
+ {
795
+ prim: 'DIP',
796
+ args: [
797
+ [
798
+ {
799
+ prim: 'SWAP',
800
+ },
801
+ {
802
+ prim: 'DIP',
803
+ args: [
804
+ {
805
+ int: '2',
806
+ },
807
+ [
808
+ [
809
+ {
810
+ prim: 'DIP',
811
+ args: [
812
+ [
813
+ {
814
+ prim: 'DUP',
815
+ },
816
+ ],
817
+ ],
818
+ },
819
+ {
820
+ prim: 'SWAP',
821
+ },
822
+ ],
823
+ ],
824
+ ],
825
+ },
826
+ [
827
+ [
828
+ {
829
+ prim: 'DIP',
830
+ args: [
831
+ {
832
+ int: '2',
833
+ },
834
+ [
835
+ {
836
+ prim: 'DUP',
837
+ },
838
+ ],
839
+ ],
840
+ },
841
+ {
842
+ prim: 'DIG',
843
+ args: [
844
+ {
845
+ int: '3',
846
+ },
847
+ ],
848
+ },
849
+ ],
850
+ {
851
+ prim: 'DIP',
852
+ args: [
853
+ [
854
+ {
855
+ prim: 'CHECK_SIGNATURE',
856
+ },
857
+ ],
858
+ ],
859
+ },
860
+ {
861
+ prim: 'SWAP',
862
+ },
863
+ {
864
+ prim: 'IF',
865
+ args: [
866
+ [
867
+ {
868
+ prim: 'DROP',
869
+ },
870
+ ],
871
+ [
872
+ {
873
+ prim: 'FAILWITH',
874
+ },
875
+ ],
876
+ ],
877
+ },
878
+ ],
879
+ {
880
+ prim: 'PUSH',
881
+ args: [
882
+ {
883
+ prim: 'nat',
884
+ },
885
+ {
886
+ int: '1',
887
+ },
888
+ ],
889
+ },
890
+ {
891
+ prim: 'ADD',
892
+ annots: ['@valid'],
893
+ },
894
+ ],
895
+ ],
896
+ },
897
+ ],
898
+ ],
899
+ },
900
+ ],
901
+ ],
902
+ [
903
+ [
904
+ {
905
+ prim: 'UNIT',
906
+ },
907
+ {
908
+ prim: 'FAILWITH',
909
+ },
910
+ ],
911
+ ],
912
+ ],
913
+ },
914
+ { prim: 'SWAP' },
915
+ ],
916
+ ],
917
+ },
918
+ ],
919
+ ],
920
+ },
921
+ [
922
+ [{ prim: 'COMPARE' }, { prim: 'LE' }],
923
+ {
924
+ prim: 'IF',
925
+ args: [[], [[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]]],
926
+ },
927
+ ],
928
+ {
929
+ prim: 'IF_CONS',
930
+ args: [[[{ prim: 'UNIT' }, { prim: 'FAILWITH' }]], []],
931
+ },
932
+ { prim: 'DROP' },
933
+ {
934
+ prim: 'DIP',
935
+ args: [
936
+ [
937
+ [
938
+ [
939
+ { prim: 'DUP' },
940
+ { prim: 'CAR' },
941
+ {
942
+ prim: 'DIP',
943
+ args: [[{ prim: 'CDR' }]],
944
+ },
945
+ ],
946
+ ],
947
+ {
948
+ prim: 'PUSH',
949
+ args: [{ prim: 'nat' }, { int: '1' }],
950
+ },
951
+ {
952
+ prim: 'ADD',
953
+ annots: ['@new_counter'],
954
+ },
955
+ { prim: 'PAIR' },
956
+ ],
957
+ ],
958
+ },
959
+ {
960
+ prim: 'IF_LEFT',
961
+ args: [
962
+ [{ prim: 'UNIT' }, { prim: 'EXEC' }],
963
+ [
964
+ {
965
+ prim: 'DIP',
966
+ args: [[{ prim: 'CAR' }]],
967
+ },
968
+ { prim: 'SWAP' },
969
+ { prim: 'PAIR' },
970
+ {
971
+ prim: 'NIL',
972
+ args: [{ prim: 'operation' }],
973
+ },
974
+ ],
975
+ ],
976
+ },
977
+ { prim: 'PAIR' },
978
+ ],
979
+ ],
980
+ },
981
+ ],
982
+ ],
983
+ },
984
+ ];
985
+ /**
986
+ * Add contract address to forwarder contract template and return contract Michelson code as JSON
987
+ *
988
+ * @param {string} contractAddress - multisig contractAddress that will receive forwarded funds
989
+ * @returns {object[]} Michelson code for the origination operation
990
+ */
991
+ function createForwarder(contractAddress) {
992
+ return [
993
+ {
994
+ prim: 'parameter',
995
+ args: [
996
+ {
997
+ prim: 'or',
998
+ args: [
999
+ { prim: 'unit', annots: ['%default'] },
1000
+ {
1001
+ prim: 'pair',
1002
+ args: [
1003
+ { prim: 'nat' },
1004
+ {
1005
+ prim: 'contract',
1006
+ args: [
1007
+ {
1008
+ prim: 'pair',
1009
+ args: [
1010
+ { prim: 'address', annots: [':from'] },
1011
+ {
1012
+ prim: 'pair',
1013
+ args: [
1014
+ { prim: 'address', annots: [':to'] },
1015
+ { prim: 'nat', annots: [':value'] },
1016
+ ],
1017
+ },
1018
+ ],
1019
+ },
1020
+ ],
1021
+ },
1022
+ ],
1023
+ annots: ['%flush'],
1024
+ },
1025
+ ],
1026
+ },
1027
+ ],
1028
+ },
1029
+ { prim: 'storage', args: [{ prim: 'unit' }] },
1030
+ {
1031
+ prim: 'code',
1032
+ args: [
1033
+ [
1034
+ {
1035
+ prim: 'CAST',
1036
+ args: [
1037
+ {
1038
+ prim: 'pair',
1039
+ args: [
1040
+ {
1041
+ prim: 'or',
1042
+ args: [
1043
+ { prim: 'unit' },
1044
+ {
1045
+ prim: 'pair',
1046
+ args: [
1047
+ { prim: 'nat' },
1048
+ {
1049
+ prim: 'contract',
1050
+ args: [
1051
+ {
1052
+ prim: 'pair',
1053
+ args: [
1054
+ { prim: 'address' },
1055
+ { prim: 'pair', args: [{ prim: 'address' }, { prim: 'nat' }] },
1056
+ ],
1057
+ },
1058
+ ],
1059
+ },
1060
+ ],
1061
+ },
1062
+ ],
1063
+ },
1064
+ { prim: 'unit' },
1065
+ ],
1066
+ },
1067
+ ],
1068
+ },
1069
+ { prim: 'CAR' },
1070
+ {
1071
+ prim: 'IF_LEFT',
1072
+ args: [
1073
+ [
1074
+ { prim: 'DROP' },
1075
+ {
1076
+ prim: 'NONE',
1077
+ args: [
1078
+ {
1079
+ prim: 'pair',
1080
+ args: [
1081
+ { prim: 'nat' },
1082
+ {
1083
+ prim: 'contract',
1084
+ args: [
1085
+ {
1086
+ prim: 'pair',
1087
+ args: [
1088
+ { prim: 'address' },
1089
+ { prim: 'pair', args: [{ prim: 'address' }, { prim: 'nat' }] },
1090
+ ],
1091
+ },
1092
+ ],
1093
+ },
1094
+ ],
1095
+ },
1096
+ ],
1097
+ },
1098
+ ],
1099
+ [{ prim: 'SOME' }],
1100
+ ],
1101
+ },
1102
+ { prim: 'DIP', args: [[{ prim: 'PUSH', args: [{ prim: 'address' }, { string: contractAddress }] }]] },
1103
+ {
1104
+ prim: 'IF_NONE',
1105
+ args: [
1106
+ [{ prim: 'NIL', args: [{ prim: 'operation' }] }],
1107
+ [
1108
+ { prim: 'DIP', args: [[{ prim: 'DUP' }]] },
1109
+ { prim: 'DUP' },
1110
+ { prim: 'CAR' },
1111
+ { prim: 'DIP', args: [[{ prim: 'CDR' }]] },
1112
+ { prim: 'DIG', args: [{ int: '2' }] },
1113
+ { prim: 'PAIR' },
1114
+ { prim: 'SELF' },
1115
+ { prim: 'ADDRESS' },
1116
+ { prim: 'PAIR' },
1117
+ { prim: 'DIP', args: [[{ prim: 'PUSH', args: [{ prim: 'mutez' }, { int: '0' }] }]] },
1118
+ { prim: 'TRANSFER_TOKENS' },
1119
+ { prim: 'DIP', args: [[{ prim: 'NIL', args: [{ prim: 'operation' }] }]] },
1120
+ { prim: 'CONS' },
1121
+ ],
1122
+ ],
1123
+ },
1124
+ { prim: 'BALANCE' },
1125
+ { prim: 'PUSH', args: [{ prim: 'mutez' }, { int: '0' }] },
1126
+ { prim: 'COMPARE' },
1127
+ { prim: 'EQ' },
1128
+ {
1129
+ prim: 'IF',
1130
+ args: [
1131
+ [{ prim: 'DIP', args: [[{ prim: 'DROP' }]] }],
1132
+ [
1133
+ {
1134
+ prim: 'DIP',
1135
+ args: [
1136
+ [
1137
+ { prim: 'CONTRACT', args: [{ prim: 'unit' }] },
1138
+ {
1139
+ prim: 'IF_NONE',
1140
+ args: [
1141
+ [
1142
+ { prim: 'PUSH', args: [{ prim: 'string' }, { string: 'not a wallet' }] },
1143
+ { prim: 'FAILWITH' },
1144
+ ],
1145
+ [],
1146
+ ],
1147
+ },
1148
+ { prim: 'BALANCE' },
1149
+ { prim: 'UNIT' },
1150
+ { prim: 'TRANSFER_TOKENS' },
1151
+ ],
1152
+ ],
1153
+ },
1154
+ { prim: 'SWAP' },
1155
+ { prim: 'CONS' },
1156
+ ],
1157
+ ],
1158
+ },
1159
+ { prim: 'DIP', args: [[{ prim: 'UNIT' }]] },
1160
+ { prim: 'PAIR' },
1161
+ ],
1162
+ ],
1163
+ },
1164
+ ];
1165
+ }
1166
+ /**
1167
+ * Create an origination operation for a forwarder contract
1168
+ *
1169
+ * @param {string} contractAddress originated multisig address to forward funds
1170
+ * @param {string} counter Valid source account counter to use
1171
+ * @param {string} source Source account address
1172
+ * @param {string} fee Fees in mutez to pay by the source account
1173
+ * @param {string} gasLimit Maximum amount in mutez to spend in gas fees
1174
+ * @param {string} storageLimit Maximum amount in mutez to spend in storage fees
1175
+ * @param {string} balance New multisig account initial balance taken from the source account
1176
+ * @returns {OriginationOp} the operation
1177
+ */
1178
+ function forwarderOriginationOperation(contractAddress, counter, source, fee, gasLimit, storageLimit, balance) {
1179
+ return {
1180
+ kind: 'origination',
1181
+ counter,
1182
+ source,
1183
+ fee,
1184
+ gas_limit: gasLimit,
1185
+ storage_limit: storageLimit,
1186
+ balance,
1187
+ script: {
1188
+ code: createForwarder(contractAddress),
1189
+ storage: { prim: 'Unit' },
1190
+ },
1191
+ };
1192
+ }
1193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlzaWdVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvbXVsdGlzaWdVdGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLG9GQTRDQztBQVFELDBFQW1CQztBQWNELHNFQW1CQztBQXVCRCxvRUF3QkM7QUF5Q0QsNEVBRUM7QUFRRCxzRUFlQztBQStDRCw4REEyREM7QUErRkQsMENBaUJDO0FBaUJELGtGQThDQztBQVFELGtEQU1DO0FBcXFCRCxzRUFzQkM7QUF6c0NELDBDQUE0QjtBQUU1QixtQ0FBdUc7QUFFdkcsc0NBQXNDO0FBQ3RDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNwQixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFFcEI7Ozs7O0dBS0c7QUFDSCxTQUFnQixvQ0FBb0MsQ0FBQyxTQUF3QjtJQUMzRSxNQUFNLEdBQUcsR0FBRztRQUNWLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRztRQUNsQixRQUFRLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDN0IsWUFBWSxFQUFFLFNBQVMsQ0FBQyxhQUFhO0tBQ3RDLENBQUM7SUFFRixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzFCLHdCQUF3QjtRQUN4QixPQUFPO1lBQ0wsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU07WUFDdEIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ3pCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixHQUFHO1NBQ0osQ0FBQztJQUNKLENBQUM7SUFDRCxrRkFBa0Y7SUFDbEYsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN6QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMvRCxtRUFBbUU7SUFDbkUsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQztJQUVuQyxJQUFJLGdCQUFnQixDQUFDO0lBQ3JCLFFBQVEsV0FBVyxFQUFFLENBQUM7UUFDcEIsS0FBSyxrQkFBa0I7WUFDckIsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLE1BQU07UUFDUixLQUFLLFVBQVU7WUFDYixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDckIsTUFBTTtRQUNSO1lBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1FBQ2pELElBQUk7UUFDSixFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQ2xDLE1BQU0sRUFBRSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztRQUNsRCxHQUFHO1FBQ0gsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQiwrQkFBK0IsQ0FBQyxTQUF3QjtJQUN0RSxNQUFNLEdBQUcsR0FBRztRQUNWLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBRztRQUNsQixRQUFRLEVBQUUsU0FBUyxDQUFDLFNBQVM7UUFDN0IsWUFBWSxFQUFFLFNBQVMsQ0FBQyxhQUFhO0tBQ3RDLENBQUM7SUFFRixNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRXJELDRGQUE0RjtJQUM1RixNQUFNLG9CQUFvQixHQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLHFEQUFxRCxDQUFDLENBQUM7SUFFN0csT0FBTztRQUNMLEdBQUc7UUFDSCxPQUFPO1FBQ1AsT0FBTztRQUNQLElBQUk7UUFDSixvQkFBb0I7S0FDckIsQ0FBQztBQUNKLENBQUM7QUFDRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsT0FBZSxFQUNmLE1BQWMsRUFDZCxNQUFjLEVBQ2QsV0FBbUIsRUFDbkIsTUFBYyxtQkFBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFDN0MsV0FBbUIseUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUN4RCxlQUF1Qiw2QkFBcUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO0lBRWhFLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixNQUFNO1FBQ04sR0FBRztRQUNILE9BQU87UUFDUCxTQUFTLEVBQUUsUUFBUTtRQUNuQixhQUFhLEVBQUUsWUFBWTtRQUMzQixNQUFNO1FBQ04sV0FBVztLQUNaLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBZ0IsNEJBQTRCLENBQzFDLE9BQWUsRUFDZixNQUFjLEVBQ2QsTUFBYyxFQUNkLGVBQXVCLEVBQ3ZCLGVBQXVCLEVBQ3ZCLGtCQUEwQixFQUMxQixVQUE4QixFQUM5QixNQUFjLG1CQUFXLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUM3QyxXQUFtQix5QkFBaUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEVBQ3hELGVBQXVCLDZCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFDaEUsSUFBWSxTQUFTO0lBRXJCLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixNQUFNO1FBQ04sR0FBRztRQUNILE9BQU87UUFDUCxTQUFTLEVBQUUsUUFBUTtRQUNuQixhQUFhLEVBQUUsWUFBWTtRQUMzQixNQUFNLEVBQUUsR0FBRyxFQUFFLGtGQUFrRjtRQUMvRixXQUFXLEVBQUUsZUFBZTtRQUM1QixVQUFVLEVBQUUsNkJBQTZCLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0tBQ3RHLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyw2QkFBNkIsQ0FDcEMsa0JBQTBCLEVBQzFCLE1BQWMsRUFDZCxlQUF1QixFQUN2QixVQUE4QixFQUM5QixDQUFTO0lBRVQsTUFBTSxxQkFBcUIsR0FBVSxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakUsT0FBTztRQUNMLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLEtBQUssRUFBRTtZQUNMLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFO2dCQUNKO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzFHO2dCQUNELHFCQUFxQjthQUN0QjtTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGdDQUFnQyxDQUFDLFdBQTBCLEVBQUUsVUFBOEI7SUFDekcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0csQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQUMsV0FBMEI7SUFDdEUsTUFBTSxVQUFVLEdBQXVCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5RixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDckMsVUFBVSxDQUFDLElBQUksQ0FBQztnQkFDZCxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO2dCQUMxQyxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxVQUE4QixFQUFFLGtCQUFrQixHQUFHLEVBQUUsRUFBRSxJQUFZLFNBQVM7SUFDckcseUVBQXlFO0lBQ3pFLE1BQU0scUJBQXFCLEdBQVUsa0JBQWtCLENBQUM7SUFDeEQsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUIscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELDBFQUEwRTtJQUMxRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDdkIsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWixxQkFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckYsQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3RELHdDQUF3QztnQkFDeEMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFLENBQUM7b0JBQzdDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO29CQUM3RSxNQUFNO2dCQUNSLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxxQkFBcUIsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IseUJBQXlCLENBQ3ZDLGVBQXVCLEVBQ3ZCLGtCQUEwQixFQUMxQixNQUFjLEVBQ2QsZUFBdUI7SUFFdkIsTUFBTSxJQUFJLEdBQUc7UUFDWCxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRTtZQUNKLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRTtZQUN4QjtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQzthQUN0RDtTQUNGO0tBQ0YsQ0FBQztJQUNGLE1BQU0sSUFBSSxHQUFHO1FBQ1gsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUU7WUFDSjtnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUM7YUFDckI7WUFDRDtnQkFDRSxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFOzRCQUNKLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTs0QkFDaEI7Z0NBQ0UsSUFBSSxFQUFFLE1BQU07Z0NBQ1osSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7NkJBQzlCO3lCQUNGO3dCQUNELE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDdkI7b0JBQ0Q7d0JBQ0UsSUFBSSxFQUFFLE1BQU07d0JBQ1osSUFBSSxFQUFFOzRCQUNKO2dDQUNFLElBQUksRUFBRSxLQUFLO2dDQUNYLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQzs2QkFDdkI7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLE1BQU07Z0NBQ1osSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0NBQ3ZCLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQzs2QkFDbEI7eUJBQ0Y7d0JBQ0QsTUFBTSxFQUFFLENBQUMsY0FBYyxDQUFDO3FCQUN6QjtpQkFDRjtnQkFDRCxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDcEI7U0FDRjtRQUNELE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztLQUNyQixDQUFDO0lBQ0YsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFBUyxFQUFFLElBQVMsRUFBRSxlQUFvQjtJQUMzRCxPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsRUFBRSxJQUFJLENBQUM7U0FDMUM7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksQ0FBQztTQUNsQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxPQUFlLEVBQUUsTUFBYztJQUN4RCxJQUFJLElBQUEsa0JBQVUsRUFBQyxPQUFPLEVBQUUsaUJBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sMkJBQTJCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFDRCw0Q0FBNEM7SUFDNUMsT0FBTztRQUNMLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtRQUNoQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRTtRQUM5QztZQUNFLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7U0FDbEQ7UUFDRCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRTtRQUM1QjtZQUNFLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDM0M7UUFDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7UUFDaEIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO0tBQ2pCLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUywyQkFBMkIsQ0FBQyxPQUFlLEVBQUUsTUFBYztJQUNsRSxPQUFPO1FBQ0wsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1FBQ2hCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFO1FBQzlDO1lBQ0UsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUNqRDtRQUNELEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFO1FBQzlDO1lBQ0U7Z0JBQ0UsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDdkQ7U0FDRjtRQUNEO1lBQ0UsSUFBSSxFQUFFLE1BQU07WUFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUMzQztRQUNELEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtRQUNoQixFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtRQUMzQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7S0FDakIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixPQUFlLEVBQ2YsTUFBYyxFQUNkLE1BQWMsRUFDZCxNQUFjLG1CQUFXLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUMzQyxXQUFtQix5QkFBaUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQ3RELGVBQXVCLDZCQUFxQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7SUFFOUQsT0FBTztRQUNMLElBQUksRUFBRSxRQUFRO1FBQ2QsT0FBTztRQUNQLE1BQU07UUFDTixHQUFHO1FBQ0gsU0FBUyxFQUFFLFFBQVE7UUFDbkIsYUFBYSxFQUFFLFlBQVk7UUFDM0IsVUFBVSxFQUFFLE1BQU07S0FDbkIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQWdCLG1DQUFtQyxDQUNqRCxPQUFlLEVBQ2YsTUFBYyxFQUNkLEdBQVcsRUFDWCxRQUFnQixFQUNoQixZQUFvQixFQUNwQixPQUFlLEVBQ2YsT0FBaUIsRUFDakIsUUFBaUIsRUFDakIsWUFBb0IsU0FBUztJQUU3QixNQUFNLGdCQUFnQixHQUFVLEVBQUUsQ0FBQztJQUNuQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sYUFBYSxHQUFrQjtRQUNuQyxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPO1FBQ1AsTUFBTTtRQUNOLEdBQUc7UUFDSCxTQUFTLEVBQUUsUUFBUTtRQUNuQixhQUFhLEVBQUUsWUFBWTtRQUMzQixPQUFPO1FBQ1AsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLGVBQWU7WUFDckIsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRTtvQkFDSjt3QkFDRSxHQUFHLEVBQUUsR0FBRztxQkFDVDtvQkFDRDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUU7NEJBQ0o7Z0NBQ0UsR0FBRyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUU7NkJBQzFCOzRCQUNELGdCQUFnQjt5QkFDakI7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0YsQ0FBQztJQUNGLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixhQUFhLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsU0FBd0I7SUFDMUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQUc7SUFDdEI7UUFDRSxJQUFJLEVBQUUsV0FBVztRQUNqQixJQUFJLEVBQUU7WUFDSjtnQkFDRSxJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUU7b0JBQ0osRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFO29CQUN0Qzt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUU7NEJBQ0o7Z0NBQ0UsSUFBSSxFQUFFLE1BQU07Z0NBQ1osSUFBSSxFQUFFO29DQUNKO3dDQUNFLElBQUksRUFBRSxLQUFLO3dDQUNYLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztxQ0FDckI7b0NBQ0Q7d0NBQ0UsSUFBSSxFQUFFLElBQUk7d0NBQ1YsSUFBSSxFQUFFOzRDQUNKO2dEQUNFLElBQUksRUFBRSxRQUFRO2dEQUNkLElBQUksRUFBRTtvREFDSixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7b0RBQ2hCO3dEQUNFLElBQUksRUFBRSxNQUFNO3dEQUNaLElBQUksRUFBRTs0REFDSjtnRUFDRSxJQUFJLEVBQUUsV0FBVzs2REFDbEI7eURBQ0Y7cURBQ0Y7aURBQ0Y7Z0RBQ0QsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDOzZDQUN2Qjs0Q0FDRDtnREFDRSxJQUFJLEVBQUUsTUFBTTtnREFDWixJQUFJLEVBQUU7b0RBQ0o7d0RBQ0UsSUFBSSxFQUFFLEtBQUs7d0RBQ1gsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO3FEQUN2QjtvREFDRDt3REFDRSxJQUFJLEVBQUUsTUFBTTt3REFDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzt3REFDdkIsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDO3FEQUNsQjtpREFDRjtnREFDRCxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUM7NkNBQ3pCO3lDQUNGO3dDQUNELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQztxQ0FDcEI7aUNBQ0Y7Z0NBQ0QsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDOzZCQUNyQjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsTUFBTTtnQ0FDWixJQUFJLEVBQUU7b0NBQ0o7d0NBQ0UsSUFBSSxFQUFFLFFBQVE7d0NBQ2QsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7cUNBQzlCO2lDQUNGO2dDQUNELE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQzs2QkFDbEI7eUJBQ0Y7d0JBQ0QsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDO3FCQUNsQjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFNBQVM7UUFDZixJQUFJLEVBQUU7WUFDSjtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsTUFBTSxFQUFFLENBQUMsaUJBQWlCLENBQUM7cUJBQzVCO29CQUNEO3dCQUNFLElBQUksRUFBRSxNQUFNO3dCQUNaLElBQUksRUFBRTs0QkFDSjtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7NkJBQ3ZCOzRCQUNEO2dDQUNFLElBQUksRUFBRSxNQUFNO2dDQUNaLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO2dDQUN2QixNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7NkJBQ2xCO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRTtZQUNKO2dCQUNFO29CQUNFO3dCQUNFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTt3QkFDZixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7d0JBQ2Y7NEJBQ0UsSUFBSSxFQUFFLEtBQUs7NEJBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3lCQUMxQjtxQkFDRjtpQkFDRjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUU7d0JBQ0o7NEJBQ0UsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFOzRCQUNoQjtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQzs2QkFDOUI7NEJBQ0QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO3lCQUNqQjt3QkFDRDs0QkFDRTtnQ0FDRSxJQUFJLEVBQUUsTUFBTTtnQ0FDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs2QkFDeEM7NEJBQ0QsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFOzRCQUNsQjtnQ0FDRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO2dDQUNyQztvQ0FDRSxJQUFJLEVBQUUsSUFBSTtvQ0FDVixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztpQ0FDdkQ7NkJBQ0Y7NEJBQ0QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFOzRCQUNoQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7NEJBQ2Y7Z0NBQ0UsSUFBSSxFQUFFLEtBQUs7Z0NBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDOzZCQUMzQjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUU7b0NBQ0o7d0NBQ0U7NENBQ0U7Z0RBQ0UsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO2dEQUNmLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtnREFDZjtvREFDRSxJQUFJLEVBQUUsS0FBSztvREFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aURBQzFCOzZDQUNGO3lDQUNGO3dDQUNELEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTt3Q0FDZixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7d0NBQ2hCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTt3Q0FDbkIsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO3dDQUNoQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7d0NBQ2hCOzRDQUNFLElBQUksRUFBRSxLQUFLOzRDQUNYLElBQUksRUFBRTtnREFDSjtvREFDRTt3REFDRTs0REFDRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7NERBQ2Y7Z0VBQ0UsSUFBSSxFQUFFLEtBQUs7Z0VBQ1gsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDOzZEQUNyQjs0REFDRDtnRUFDRSxJQUFJLEVBQUUsS0FBSztnRUFDWCxJQUFJLEVBQUU7b0VBQ0o7d0VBQ0U7NEVBQ0UsSUFBSSxFQUFFLEtBQUs7eUVBQ1o7cUVBQ0Y7aUVBQ0Y7NkRBQ0Y7eURBQ0Y7cURBQ0Y7b0RBQ0Q7d0RBQ0UsSUFBSSxFQUFFLEtBQUs7d0RBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO3FEQUMzQjtpREFDRjs2Q0FDRjt5Q0FDRjt3Q0FDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7cUNBQ2pCO2lDQUNGOzZCQUNGOzRCQUNEO2dDQUNFO29DQUNFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtvQ0FDZjt3Q0FDRSxJQUFJLEVBQUUsS0FBSzt3Q0FDWCxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztxQ0FDNUI7b0NBQ0Q7d0NBQ0UsSUFBSSxFQUFFLEtBQUs7d0NBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO3FDQUMxQjtpQ0FDRjs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7NkJBQzNCOzRCQUNEO2dDQUNFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0NBQ3JDO29DQUNFLElBQUksRUFBRSxJQUFJO29DQUNWLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lDQUN2RDs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7NkJBQzNCOzRCQUNEO2dDQUNFO29DQUNFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtvQ0FDZjt3Q0FDRSxJQUFJLEVBQUUsS0FBSzt3Q0FDWCxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7cUNBQ3ZCO29DQUNEO3dDQUNFLElBQUksRUFBRSxLQUFLO3dDQUNYLElBQUksRUFBRTs0Q0FDSjtnREFDRTtvREFDRSxJQUFJLEVBQUUsS0FBSztvREFDWCxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUM7aURBQ2xCOzZDQUNGO3lDQUNGO3FDQUNGO2lDQUNGOzZCQUNGOzRCQUNEO2dDQUNFLElBQUksRUFBRSxLQUFLO2dDQUNYLElBQUksRUFBRTtvQ0FDSjt3Q0FDRTs0Q0FDRSxJQUFJLEVBQUUsTUFBTTs0Q0FDWixJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs0Q0FDckMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO3lDQUNuQjt3Q0FDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7d0NBQ2hCOzRDQUNFLElBQUksRUFBRSxNQUFNOzRDQUNaLElBQUksRUFBRTtnREFDSjtvREFDRTt3REFDRSxJQUFJLEVBQUUsS0FBSzt3REFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7cURBQzNCO29EQUNELEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtvREFDaEI7d0RBQ0UsSUFBSSxFQUFFLFNBQVM7d0RBQ2YsSUFBSSxFQUFFOzREQUNKO2dFQUNFO29FQUNFO3dFQUNFLElBQUksRUFBRSxTQUFTO3dFQUNmLElBQUksRUFBRTs0RUFDSjtnRkFDRTtvRkFDRSxJQUFJLEVBQUUsTUFBTTtpRkFDYjtnRkFDRDtvRkFDRSxJQUFJLEVBQUUsTUFBTTtpRkFDYjs2RUFDRjs0RUFDRDtnRkFDRTtvRkFDRSxJQUFJLEVBQUUsTUFBTTtpRkFDYjtnRkFDRDtvRkFDRSxJQUFJLEVBQUUsS0FBSztvRkFDWCxJQUFJLEVBQUU7d0ZBQ0o7NEZBQ0U7Z0dBQ0UsSUFBSSxFQUFFLE1BQU07NkZBQ2I7NEZBQ0Q7Z0dBQ0UsSUFBSSxFQUFFLEtBQUs7Z0dBQ1gsSUFBSSxFQUFFO29HQUNKO3dHQUNFLEdBQUcsRUFBRSxHQUFHO3FHQUNUO29HQUNEO3dHQUNFOzRHQUNFO2dIQUNFLElBQUksRUFBRSxLQUFLO2dIQUNYLElBQUksRUFBRTtvSEFDSjt3SEFDRTs0SEFDRSxJQUFJLEVBQUUsS0FBSzt5SEFDWjtxSEFDRjtpSEFDRjs2R0FDRjs0R0FDRDtnSEFDRSxJQUFJLEVBQUUsTUFBTTs2R0FDYjt5R0FDRjtxR0FDRjtpR0FDRjs2RkFDRjs0RkFDRDtnR0FDRTtvR0FDRTt3R0FDRSxJQUFJLEVBQUUsS0FBSzt3R0FDWCxJQUFJLEVBQUU7NEdBQ0o7Z0hBQ0UsR0FBRyxFQUFFLEdBQUc7NkdBQ1Q7NEdBQ0Q7Z0hBQ0U7b0hBQ0UsSUFBSSxFQUFFLEtBQUs7aUhBQ1o7NkdBQ0Y7eUdBQ0Y7cUdBQ0Y7b0dBQ0Q7d0dBQ0UsSUFBSSxFQUFFLEtBQUs7d0dBQ1gsSUFBSSxFQUFFOzRHQUNKO2dIQUNFLEdBQUcsRUFBRSxHQUFHOzZHQUNUO3lHQUNGO3FHQUNGO2lHQUNGO2dHQUNEO29HQUNFLElBQUksRUFBRSxLQUFLO29HQUNYLElBQUksRUFBRTt3R0FDSjs0R0FDRTtnSEFDRSxJQUFJLEVBQUUsaUJBQWlCOzZHQUN4Qjt5R0FDRjtxR0FDRjtpR0FDRjtnR0FDRDtvR0FDRSxJQUFJLEVBQUUsTUFBTTtpR0FDYjtnR0FDRDtvR0FDRSxJQUFJLEVBQUUsSUFBSTtvR0FDVixJQUFJLEVBQUU7d0dBQ0o7NEdBQ0U7Z0hBQ0UsSUFBSSxFQUFFLE1BQU07NkdBQ2I7eUdBQ0Y7d0dBQ0Q7NEdBQ0U7Z0hBQ0UsSUFBSSxFQUFFLFVBQVU7NkdBQ2pCO3lHQUNGO3FHQUNGO2lHQUNGOzZGQUNGOzRGQUNEO2dHQUNFLElBQUksRUFBRSxNQUFNO2dHQUNaLElBQUksRUFBRTtvR0FDSjt3R0FDRSxJQUFJLEVBQUUsS0FBSztxR0FDWjtvR0FDRDt3R0FDRSxHQUFHLEVBQUUsR0FBRztxR0FDVDtpR0FDRjs2RkFDRjs0RkFDRDtnR0FDRSxJQUFJLEVBQUUsS0FBSztnR0FDWCxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkZBQ25CO3lGQUNGO3FGQUNGO2lGQUNGOzZFQUNGO3lFQUNGO3FFQUNGO2lFQUNGOzZEQUNGOzREQUNEO2dFQUNFO29FQUNFO3dFQUNFLElBQUksRUFBRSxNQUFNO3FFQUNiO29FQUNEO3dFQUNFLElBQUksRUFBRSxVQUFVO3FFQUNqQjtpRUFDRjs2REFDRjt5REFDRjtxREFDRjtvREFDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7aURBQ2pCOzZDQUNGO3lDQUNGO3FDQUNGO2lDQUNGOzZCQUNGOzRCQUNEO2dDQUNFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7Z0NBQ3JDO29DQUNFLElBQUksRUFBRSxJQUFJO29DQUNWLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lDQUN2RDs2QkFDRjs0QkFDRDtnQ0FDRSxJQUFJLEVBQUUsU0FBUztnQ0FDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs2QkFDdkQ7NEJBQ0QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFOzRCQUNoQjtnQ0FDRSxJQUFJLEVBQUUsS0FBSztnQ0FDWCxJQUFJLEVBQUU7b0NBQ0o7d0NBQ0U7NENBQ0U7Z0RBQ0UsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO2dEQUNmLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtnREFDZjtvREFDRSxJQUFJLEVBQUUsS0FBSztvREFDWCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aURBQzFCOzZDQUNGO3lDQUNGO3dDQUNEOzRDQUNFLElBQUksRUFBRSxNQUFNOzRDQUNaLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO3lDQUN0Qzt3Q0FDRDs0Q0FDRSxJQUFJLEVBQUUsS0FBSzs0Q0FDWCxNQUFNLEVBQUUsQ0FBQyxjQUFjLENBQUM7eUNBQ3pCO3dDQUNELEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtxQ0FDakI7aUNBQ0Y7NkJBQ0Y7NEJBQ0Q7Z0NBQ0UsSUFBSSxFQUFFLFNBQVM7Z0NBQ2YsSUFBSSxFQUFFO29DQUNKLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7b0NBQ3BDO3dDQUNFOzRDQUNFLElBQUksRUFBRSxLQUFLOzRDQUNYLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzt5Q0FDMUI7d0NBQ0QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO3dDQUNoQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7d0NBQ2hCOzRDQUNFLElBQUksRUFBRSxLQUFLOzRDQUNYLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO3lDQUM5QjtxQ0FDRjtpQ0FDRjs2QkFDRjs0QkFDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7eUJBQ2pCO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsZUFBdUI7SUFDOUMsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLFdBQVc7WUFDakIsSUFBSSxFQUFFO2dCQUNKO29CQUNFLElBQUksRUFBRSxJQUFJO29CQUNWLElBQUksRUFBRTt3QkFDSixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQ3RDOzRCQUNFLElBQUksRUFBRSxNQUFNOzRCQUNaLElBQUksRUFBRTtnQ0FDSixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7Z0NBQ2Y7b0NBQ0UsSUFBSSxFQUFFLFVBQVU7b0NBQ2hCLElBQUksRUFBRTt3Q0FDSjs0Q0FDRSxJQUFJLEVBQUUsTUFBTTs0Q0FDWixJQUFJLEVBQUU7Z0RBQ0osRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dEQUN0QztvREFDRSxJQUFJLEVBQUUsTUFBTTtvREFDWixJQUFJLEVBQUU7d0RBQ0osRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dEQUNwQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7cURBQ3BDO2lEQUNGOzZDQUNGO3lDQUNGO3FDQUNGO2lDQUNGOzZCQUNGOzRCQUNELE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzt5QkFDbkI7cUJBQ0Y7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFDN0M7WUFDRSxJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRTtnQkFDSjtvQkFDRTt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUU7NEJBQ0o7Z0NBQ0UsSUFBSSxFQUFFLE1BQU07Z0NBQ1osSUFBSSxFQUFFO29DQUNKO3dDQUNFLElBQUksRUFBRSxJQUFJO3dDQUNWLElBQUksRUFBRTs0Q0FDSixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7NENBQ2hCO2dEQUNFLElBQUksRUFBRSxNQUFNO2dEQUNaLElBQUksRUFBRTtvREFDSixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7b0RBQ2Y7d0RBQ0UsSUFBSSxFQUFFLFVBQVU7d0RBQ2hCLElBQUksRUFBRTs0REFDSjtnRUFDRSxJQUFJLEVBQUUsTUFBTTtnRUFDWixJQUFJLEVBQUU7b0VBQ0osRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO29FQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtpRUFDL0Q7NkRBQ0Y7eURBQ0Y7cURBQ0Y7aURBQ0Y7NkNBQ0Y7eUNBQ0Y7cUNBQ0Y7b0NBQ0QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO2lDQUNqQjs2QkFDRjt5QkFDRjtxQkFDRjtvQkFDRCxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7b0JBQ2Y7d0JBQ0UsSUFBSSxFQUFFLFNBQVM7d0JBQ2YsSUFBSSxFQUFFOzRCQUNKO2dDQUNFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtnQ0FDaEI7b0NBQ0UsSUFBSSxFQUFFLE1BQU07b0NBQ1osSUFBSSxFQUFFO3dDQUNKOzRDQUNFLElBQUksRUFBRSxNQUFNOzRDQUNaLElBQUksRUFBRTtnREFDSixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7Z0RBQ2Y7b0RBQ0UsSUFBSSxFQUFFLFVBQVU7b0RBQ2hCLElBQUksRUFBRTt3REFDSjs0REFDRSxJQUFJLEVBQUUsTUFBTTs0REFDWixJQUFJLEVBQUU7Z0VBQ0osRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2dFQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTs2REFDL0Q7eURBQ0Y7cURBQ0Y7aURBQ0Y7NkNBQ0Y7eUNBQ0Y7cUNBQ0Y7aUNBQ0Y7NkJBQ0Y7NEJBQ0QsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzt5QkFDbkI7cUJBQ0Y7b0JBQ0QsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7b0JBQ3JHO3dCQUNFLElBQUksRUFBRSxTQUFTO3dCQUNmLElBQUksRUFBRTs0QkFDSixDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7NEJBQ2hEO2dDQUNFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtnQ0FDMUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO2dDQUNmLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtnQ0FDZixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0NBQzFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFO2dDQUNyQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0NBQ2hCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtnQ0FDaEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO2dDQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0NBQ2hCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dDQUNwRixFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRTtnQ0FDM0IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0NBQ3pFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTs2QkFDakI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO29CQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRTtvQkFDekQsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO29CQUNuQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7b0JBQ2Q7d0JBQ0UsSUFBSSxFQUFFLElBQUk7d0JBQ1YsSUFBSSxFQUFFOzRCQUNKLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7NEJBQzdDO2dDQUNFO29DQUNFLElBQUksRUFBRSxLQUFLO29DQUNYLElBQUksRUFBRTt3Q0FDSjs0Q0FDRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRTs0Q0FDOUM7Z0RBQ0UsSUFBSSxFQUFFLFNBQVM7Z0RBQ2YsSUFBSSxFQUFFO29EQUNKO3dEQUNFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQyxFQUFFO3dEQUN4RSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7cURBQ3JCO29EQUNELEVBQUU7aURBQ0g7NkNBQ0Y7NENBQ0QsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFOzRDQUNuQixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7NENBQ2hCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFO3lDQUM1QjtxQ0FDRjtpQ0FDRjtnQ0FDRCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7Z0NBQ2hCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTs2QkFDakI7eUJBQ0Y7cUJBQ0Y7b0JBQ0QsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFO29CQUMzQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7aUJBQ2pCO2FBQ0Y7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQiw2QkFBNkIsQ0FDM0MsZUFBdUIsRUFDdkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxHQUFXLEVBQ1gsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsT0FBZTtJQUVmLE9BQU87UUFDTCxJQUFJLEVBQUUsYUFBYTtRQUNuQixPQUFPO1FBQ1AsTUFBTTtRQUNOLEdBQUc7UUFDSCxTQUFTLEVBQUUsUUFBUTtRQUNuQixhQUFhLEVBQUUsWUFBWTtRQUMzQixPQUFPO1FBQ1AsTUFBTSxFQUFFO1lBQ04sSUFBSSxFQUFFLGVBQWUsQ0FBQyxlQUFlLENBQUM7WUFDdEMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRTtTQUMxQjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSW5kZXhlZFNpZ25hdHVyZSwgT3JpZ2luYXRpb25EYXRhLCBPcmlnaW5hdGlvbk9wLCBSZXZlYWxPcCwgVHJhbnNhY3Rpb25PcCwgVHJhbnNmZXJEYXRhIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBERUZBVUxUX0ZFRSwgREVGQVVMVF9HQVNfTElNSVQsIERFRkFVTFRfU1RPUkFHRV9MSU1JVCwgaGFzaFR5cGVzLCBpc1ZhbGlkS2V5IH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIERlZmF1bHQgbiBvZiBtIGZvciBtdWx0aXNpZyB3YWxsZXRzXG5jb25zdCBERUZBVUxUX04gPSAyO1xuY29uc3QgREVGQVVMVF9NID0gMztcblxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgdHJhbnNmZXIgZGV0YWlscyBmcm9tIGEgZ2VuZXJpYyBtdWx0aXNpZyB0cmFuc2FjdGlvbiBvcGVyYXRpb24uXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbk9wfSBvcGVyYXRpb24gQSB0cmFuc2FjdGlvbiBvcGVyYXRpb24gSlNPTlxuICogQHJldHVybnMge1RyYW5zZmVyRGF0YX0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRlc3RpbmF0aW9uLCB0b2tlbiBhbmQgdHJhbnNmZXIgYW1vdW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNdWx0aXNpZ1RyYW5zZmVyRGF0YUZyb21PcGVyYXRpb24ob3BlcmF0aW9uOiBUcmFuc2FjdGlvbk9wKTogVHJhbnNmZXJEYXRhIHtcbiAgY29uc3QgZmVlID0ge1xuICAgIGZlZTogb3BlcmF0aW9uLmZlZSxcbiAgICBnYXNMaW1pdDogb3BlcmF0aW9uLmdhc19saW1pdCxcbiAgICBzdG9yYWdlTGltaXQ6IG9wZXJhdGlvbi5zdG9yYWdlX2xpbWl0LFxuICB9O1xuXG4gIGlmICghb3BlcmF0aW9uLnBhcmFtZXRlcnMpIHtcbiAgICAvLyBTaW5nbGVzaWcgdHJhbnNhY3Rpb25cbiAgICByZXR1cm4ge1xuICAgICAgY29pbjogJ211dGV6JyxcbiAgICAgIGZyb206IG9wZXJhdGlvbi5zb3VyY2UsXG4gICAgICB0bzogb3BlcmF0aW9uLmRlc3RpbmF0aW9uLFxuICAgICAgYW1vdW50OiBvcGVyYXRpb24uYW1vdW50LFxuICAgICAgZmVlLFxuICAgIH07XG4gIH1cbiAgLy8gVGhlc2UgZm9sbG93IHRoZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgcmVzcG9uc2Ugb2YgZ2VuZXJpY011bHRpc2lnVHJhbnNmZXJQYXJhbXMoKVxuICBjb25zdCB0cmFuc2ZlckFyZ3MgPSBvcGVyYXRpb24ucGFyYW1ldGVycy52YWx1ZS5hcmdzWzBdLmFyZ3NbMV0uYXJnc1swXTtcbiAgY29uc3QgYWNjb3VudFR5cGUgPSB0cmFuc2ZlckFyZ3NbM10ucHJpbTtcbiAgY29uc3QgY291bnRlciA9IG9wZXJhdGlvbi5wYXJhbWV0ZXJzLnZhbHVlLmFyZ3NbMF0uYXJnc1swXS5pbnQ7XG4gIC8vIEluIG11bHRpc2lnIHRyYW5zYWN0aW9ucywgdGhlIHdhbGxldCBjb250cmFjdCBpcyB0aGUgZGVzdGluYXRpb25cbiAgY29uc3QgZnJvbSA9IG9wZXJhdGlvbi5kZXN0aW5hdGlvbjtcblxuICBsZXQgYWNjb3VudFR5cGVJbmRleDtcbiAgc3dpdGNoIChhY2NvdW50VHlwZSkge1xuICAgIGNhc2UgJ0lNUExJQ0lUX0FDQ09VTlQnOlxuICAgICAgYWNjb3VudFR5cGVJbmRleCA9IDQ7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdDT05UUkFDVCc6XG4gICAgICBhY2NvdW50VHlwZUluZGV4ID0gNTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29udHJhY3QgcGFyYW1ldGVycycpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb2luOiB0cmFuc2ZlckFyZ3NbYWNjb3VudFR5cGVJbmRleF0uYXJnc1swXS5wcmltLFxuICAgIGZyb20sXG4gICAgdG86IHRyYW5zZmVyQXJnc1syXS5hcmdzWzFdLnN0cmluZyxcbiAgICBhbW91bnQ6IHRyYW5zZmVyQXJnc1thY2NvdW50VHlwZUluZGV4XS5hcmdzWzFdLmludCxcbiAgICBmZWUsXG4gICAgY291bnRlcixcbiAgfTtcbn1cblxuLyoqXG4gKiAgSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIHdhbGxldCBvciBhZGRyZXNzIGluaXRpYWxpemF0aW9uIHR4IGZyb20gYW4gb3JpZ2luYXRpb24gb3BlcmF0aW9uXG4gKlxuICogQHBhcmFtIHtPcmlnaW5hdGlvbk9wfSBvcGVyYXRpb25cbiAqIEByZXR1cm5zIHtPcmlnaW5hdGlvbkRhdGF9IEluZm9ybWF0aW9uIGFib3V0IHRoZSB3YWxsZXQgY29udHJhY3QgY3JlYXRpbmcgYSBmb3J3YXJkZXIgY29udHJhY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9yaWdpbmF0aW9uRGF0YUZyb21PcGVyYXRpb24ob3BlcmF0aW9uOiBPcmlnaW5hdGlvbk9wKTogT3JpZ2luYXRpb25EYXRhIHtcbiAgY29uc3QgZmVlID0ge1xuICAgIGZlZTogb3BlcmF0aW9uLmZlZSxcbiAgICBnYXNMaW1pdDogb3BlcmF0aW9uLmdhc19saW1pdCxcbiAgICBzdG9yYWdlTGltaXQ6IG9wZXJhdGlvbi5zdG9yYWdlX2xpbWl0LFxuICB9O1xuXG4gIGNvbnN0IHsgc291cmNlOiBmcm9tLCBjb3VudGVyLCBiYWxhbmNlIH0gPSBvcGVyYXRpb247XG5cbiAgLy8gVHJhbnNhY3Rpb25zIGluaXRpYWxpemluZyBhIGZvcndhcmRlciBjb250cmFjdCBjb250YWluIHRoZSBhZGRyZXNzIG9mIHRoZSB3YWxsZXQgY29udHJhY3RcbiAgY29uc3QgZm9yd2FyZGVyRGVzdGluYXRpb246IHN0cmluZyA9IF8uZ2V0KG9wZXJhdGlvbiwgJ3NjcmlwdC5jb2RlWzJdLmFyZ3NbMF1bM10uYXJnc1swXVswXS5hcmdzWzFdLnN0cmluZycpO1xuXG4gIHJldHVybiB7XG4gICAgZmVlLFxuICAgIGNvdW50ZXIsXG4gICAgYmFsYW5jZSxcbiAgICBmcm9tLFxuICAgIGZvcndhcmRlckRlc3RpbmF0aW9uLFxuICB9O1xufVxuLyoqXG4gKiBIZWxwZXIgbWV0aG9kIHRvIGJ1aWxkIGEgc2luZ2xlc2lnIHRyYW5zYWN0aW9uIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRlciBTb3VyY2UgYWNjb3VudCBuZXh0IGNvdW50ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIGFjY291bnQgdGhhdCB3aWxsIHBheSBmb3IgZmVlcywgYW5kIGluIHNpbmdsZXNpZyB0cmFuc2FjdGlvbnMsIHdoZXJlXG4gKiAgICAgICAgdGhlIGZ1bmRzIGFyZSB0YWtlbiBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IFRoZSBhbW91bnQgaW4gbXV0ZXogdG8gYmUgdHJhbnNmZXJyZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiBUaGUgYWNjb3VudCBhZGRyZXNzIHRvIHNlbmQgdGhlIGZ1bmRzIHRvXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlIEZlZXMgaW4gbXV0ZXogdG8gcGF5IGJ5IHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IGdhc0xpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIGdhcyBmZWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RvcmFnZUxpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIHN0b3JhZ2UgZmVlc1xuICogQHJldHVybnMge1RyYW5zYWN0aW9uT3B9QSBUZXpvcyB0cmFuc2FjdGlvbiBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXNpZ1RyYW5zYWN0aW9uT3BlcmF0aW9uKFxuICBjb3VudGVyOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZyxcbiAgZGVzdGluYXRpb246IHN0cmluZyxcbiAgZmVlOiBzdHJpbmcgPSBERUZBVUxUX0ZFRS5UUkFOU0ZFUi50b1N0cmluZygpLFxuICBnYXNMaW1pdDogc3RyaW5nID0gREVGQVVMVF9HQVNfTElNSVQuVFJBTlNGRVIudG9TdHJpbmcoKSxcbiAgc3RvcmFnZUxpbWl0OiBzdHJpbmcgPSBERUZBVUxUX1NUT1JBR0VfTElNSVQuVFJBTlNGRVIudG9TdHJpbmcoKVxuKTogVHJhbnNhY3Rpb25PcCB7XG4gIHJldHVybiB7XG4gICAga2luZDogJ3RyYW5zYWN0aW9uJyxcbiAgICBzb3VyY2UsXG4gICAgZmVlLFxuICAgIGNvdW50ZXIsXG4gICAgZ2FzX2xpbWl0OiBnYXNMaW1pdCxcbiAgICBzdG9yYWdlX2xpbWl0OiBzdG9yYWdlTGltaXQsXG4gICAgYW1vdW50LFxuICAgIGRlc3RpbmF0aW9uLFxuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIG11bHRpc2lnIHdhbGxldCB0cmFuc2FjdGlvbiBvcGVyYXRpb24uXG4gKlxuICogQHNlZSB7QGxpbmsgdHJhbnNhY3Rpb25PcGVyYXRpb259XG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRlciBTb3VyY2UgYWNjb3VudCBuZXh0IGNvdW50ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIGFjY291bnQgdGhhdCB3aWxsIHBheSBmb3IgZmVlcywgYW5kIGluIHNpbmdsZXNpZyB0cmFuc2FjdGlvbnMsIHdoZXJlXG4gKiAgICAgICAgdGhlIGZ1bmRzIGFyZSB0YWtlbiBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gYW1vdW50IFRoZSBhbW91bnQgaW4gbXV0ZXogdG8gYmUgdHJhbnNmZXJyZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250cmFjdEFkZHJlc3MgSWYgaXQgaXMgYSBtdWx0aXNpZyB0cmFuc2ZlciwgdGhlIHNtYXJ0IGNvbnRyYWN0IGFkZHJlc3Mgd2l0aCB0aGVcbiAqICAgICAgICBmdW5kcyB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RDb3VudGVyIElmIGl0IGlzIGEgbXVsdGlzaWcgdHJhbnNmZXIsIHRoZSBzbWFydCBjb250cmFjdCBjb3VudGVyIHRvIHVzZVxuICogICAgICAgIGluIHRoZSBuZXh0IHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb25BZGRyZXNzIEFuIGltcGxpY2l0IG9yIG9yaWdpbmF0ZWQgYWRkcmVzcyB0byB0cmFuc2ZlciBmdWRucyB0b1xuICogQHBhcmFtIHtzdHJpbmdbXX0gc2lnbmF0dXJlcyBzaWduYXR1cmVzIExpc3Qgb2Ygc2lnbmF0dXJlcyBhdXRob3JpemluZyB0aGUgZnVuZHMgdHJhbnNmZXIgZm9ybVxuICogICAgICAgIHRoZSBtdWx0aXNpZyB3YWxsZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmZWUgRmVlcyBpbiBtdXRleiB0byBwYXkgYnkgdGhlIHNvdXJjZSBhY2NvdW50XG4gKiBAcGFyYW0ge3N0cmluZ30gZ2FzTGltaXQgTWF4aW11bSBhbW91bnQgaW4gbXV0ZXogdG8gc3BlbmQgaW4gZ2FzIGZlZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdG9yYWdlTGltaXQgTWF4aW11bSBhbW91bnQgaW4gbXV0ZXogdG8gc3BlbmQgaW4gc3RvcmFnZSBmZWVzXG4gKiBAcGFyYW0ge251bWJlcn0gbSBUaGUgbnVtYmVyIG9mIHNpZ25lcnMgKG93bmVycykgZm9yIHRoZSBtdWx0aXNpZyB3YWxsZXQgYmVpbmcgdXNlZC4gRGVmYXVsdCBpcyAzXG4gKiBAcmV0dXJucyB7VHJhbnNhY3Rpb25PcH0gQSBUZXpvcyBvcGVyYXRpb24gd2l0aCBhIGdlbmVyaWMgbXVsdGlzaWcgdHJhbnNmZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpc2lnVHJhbnNhY3Rpb25PcGVyYXRpb24oXG4gIGNvdW50ZXI6IHN0cmluZyxcbiAgc291cmNlOiBzdHJpbmcsXG4gIGFtb3VudDogc3RyaW5nLFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgY29udHJhY3RDb3VudGVyOiBzdHJpbmcsXG4gIGRlc3RpbmF0aW9uQWRkcmVzczogc3RyaW5nLFxuICBzaWduYXR1cmVzOiBJbmRleGVkU2lnbmF0dXJlW10sXG4gIGZlZTogc3RyaW5nID0gREVGQVVMVF9GRUUuVFJBTlNGRVIudG9TdHJpbmcoKSxcbiAgZ2FzTGltaXQ6IHN0cmluZyA9IERFRkFVTFRfR0FTX0xJTUlULlRSQU5TRkVSLnRvU3RyaW5nKCksXG4gIHN0b3JhZ2VMaW1pdDogc3RyaW5nID0gREVGQVVMVF9TVE9SQUdFX0xJTUlULlRSQU5TRkVSLnRvU3RyaW5nKCksXG4gIG06IG51bWJlciA9IERFRkFVTFRfTVxuKTogVHJhbnNhY3Rpb25PcCB7XG4gIHJldHVybiB7XG4gICAga2luZDogJ3RyYW5zYWN0aW9uJyxcbiAgICBzb3VyY2UsXG4gICAgZmVlLFxuICAgIGNvdW50ZXIsXG4gICAgZ2FzX2xpbWl0OiBnYXNMaW1pdCxcbiAgICBzdG9yYWdlX2xpbWl0OiBzdG9yYWdlTGltaXQsXG4gICAgYW1vdW50OiAnMCcsIC8vIERvbid0IHRyYW5zZmVyIGFueSBmdW5kcyBmcm9tIGhlIHNvdXJjZSBhY2NvdW50IHRvIHRoZSBjb250cmFjdCBpbiBtdWx0aXNpZyB0eHNcbiAgICBkZXN0aW5hdGlvbjogY29udHJhY3RBZGRyZXNzLFxuICAgIHBhcmFtZXRlcnM6IGdlbmVyaWNNdWx0aXNpZ1RyYW5zZmVyUGFyYW1zKGRlc3RpbmF0aW9uQWRkcmVzcywgYW1vdW50LCBjb250cmFjdENvdW50ZXIsIHNpZ25hdHVyZXMsIG0pLFxuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBidWlsZCB0aGUgcGFyYW1ldGVycyB0byBjYWxsIHRoZSBnZW5lcmljIG11bHRpc2lnIHNtYXJ0IGNvbnRyYWN0IHdpdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uQWRkcmVzcyBBbiBpbXBsaWNpdCBvciBvcmlnaW5hdGVkIGFkZHJlc3NcbiAqIEBwYXJhbSB7bnVtYmVyfSBhbW91bnQgTnVtYmVyIG9mIE11dGV6IHRvIGJlIHRyYW5zZmVycmVkXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RDb3VudGVyIE11bHRpc2lnIGNvbnRyYWN0IGNvdW50ZXIgbnVtYmVyXG4gKiBAcGFyYW0ge0luZGV4ZWRTaWduYXR1cmVbXX0gc2lnbmF0dXJlcyBMaXN0IG9mIHRyYW5zYWN0aW9ucyBhbmQgdGhlaXIgb3JkZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBtIFRoZSBtdWx0aXNpZyB3YWxsZXQgdG90YWwgbnVtYmVyIG9mIHNpZ25lcnMgKG93bmVycylcbiAqIEByZXR1cm5zIFRoZSBwYXJhbWV0ZXJzIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZW5lcmljTXVsdGlzaWdUcmFuc2ZlclBhcmFtcyhcbiAgZGVzdGluYXRpb25BZGRyZXNzOiBzdHJpbmcsXG4gIGFtb3VudDogc3RyaW5nLFxuICBjb250cmFjdENvdW50ZXI6IHN0cmluZyxcbiAgc2lnbmF0dXJlczogSW5kZXhlZFNpZ25hdHVyZVtdLFxuICBtOiBudW1iZXJcbikge1xuICBjb25zdCB0cmFuc2FjdGlvblNpZ25hdHVyZXM6IGFueVtdID0gYnVpbGRTaWduYXR1cmVzKHNpZ25hdHVyZXMpO1xuICByZXR1cm4ge1xuICAgIGVudHJ5cG9pbnQ6ICdtYWluJyxcbiAgICB2YWx1ZToge1xuICAgICAgcHJpbTogJ1BhaXInLFxuICAgICAgYXJnczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJpbTogJ1BhaXInLFxuICAgICAgICAgIGFyZ3M6IFt7IGludDogY29udHJhY3RDb3VudGVyIH0sIHsgcHJpbTogJ0xlZnQnLCBhcmdzOiBbdHJhbnNmZXJUb0FjY291bnQoZGVzdGluYXRpb25BZGRyZXNzLCBhbW91bnQpXSB9XSxcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNhY3Rpb25TaWduYXR1cmVzLFxuICAgICAgXSxcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdGhlIHNpZ25hdHVyZXMgaW4gYSBtdWx0aXNpZyB0cmFuc2FjdGlvbiBvcGVyYXRpb24gd2l0aCBuZXcgb25lcy5cbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9uT3B9IHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIHRvIG11dGF0ZVxuICogQHBhcmFtIHtJbmRleGVkU2lnbmF0dXJlW119IHNpZ25hdHVyZXMgTGlzdCBvZiB0cmFuc2FjdGlvbnMgYW5kIHRoZWlyIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNdWx0aXNpZ1RyYW5zZmVyU2lnbmF0dXJlcyh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25PcCwgc2lnbmF0dXJlczogSW5kZXhlZFNpZ25hdHVyZVtdKSB7XG4gIHRyYW5zYWN0aW9uLnBhcmFtZXRlcnMudmFsdWUuYXJnc1sxXSA9IGJ1aWxkU2lnbmF0dXJlcyhzaWduYXR1cmVzLCB0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzLnZhbHVlLmFyZ3NbMV0pO1xufVxuXG4vKipcbiAqIEdlIHRoZSBsaXN0IGlmIG11bHRpc2lnIHNpZ25hdHVyZXMgaWYgYW55IGluIGEgY29udmVuaWVudCBmb3JtYXQuXG4gKlxuICogQHBhcmFtIHtUcmFuc2FjdGlvbk9wfSB0cmFuc2FjdGlvbiBUaGUgdHJhbnNhY3Rpb24gdG8gc2VhcmNoIHRoZSBzaWduYXR1cmVzIGluXG4gKiBAcmV0dXJucyB7SW5kZXhlZFNpZ25hdHVyZVtdfSBBIGxpc3Qgb2Ygc2lnbmF0dXJlcyBhbmQgdGhlaXIgb3JkZXIgaW4gdGVoIHRyYW5zZmVyIHNjcmlwdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TXVsdGlzaWdUcmFuc2ZlclNpZ25hdHVyZXModHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uT3ApOiBJbmRleGVkU2lnbmF0dXJlW10ge1xuICBjb25zdCBzaWduYXR1cmVzOiBJbmRleGVkU2lnbmF0dXJlW10gPSBbXTtcbiAgaWYgKCF0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzICYmICF0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzLnZhbHVlICYmICF0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzLnZhbHVlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHJhd1NpZ25hdHVyZXMgPSB0cmFuc2FjdGlvbi5wYXJhbWV0ZXJzLnZhbHVlLmFyZ3NbMV07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3U2lnbmF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChyYXdTaWduYXR1cmVzW2ldLnByaW0gPT09ICdTb21lJykge1xuICAgICAgc2lnbmF0dXJlcy5wdXNoKHtcbiAgICAgICAgc2lnbmF0dXJlOiByYXdTaWduYXR1cmVzW2ldLmFyZ3NbMF0uc3RyaW5nLFxuICAgICAgICBpbmRleDogaSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2lnbmF0dXJlcztcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGxpc3Qgb2Ygb3JkZXJlZCBzaWduYXR1cmVzLCBwdXR0aW5nIGEgTm9uZSBwcmltaXRpdmUgZm9yIHRoZSBtaXNzaW5nIGluZGV4ZXMuXG4gKlxuICogQHBhcmFtIHtJbmRleGVkU2lnbmF0dXJlW119IHNpZ25hdHVyZXMgTGlzdCBvZiB0cmFuc2FjdGlvbnMgYW5kIHRoZWlyIG9yZGVyXG4gKiBAcGFyYW0ge251bWJlcn0gbSBTaXplIG9mIHRoZSBzaWduYXR1cmUgbGlzdFxuICogQHBhcmFtIHthbnlbXX0gZXhpc3RpbmdTaWduYXR1cmVzIExpc3Qgb2YgZXhpc3Rpbmcgc2lnbmF0dXJlcyB0byBtZXJnZSB3aXRoIHRoZSBnZW5lcmF0ZWQgb25lc1xuICogQHJldHVybnMge2FueVtdfSBMaXN0IG9mIHNpZ25hdHVyZXMgaW4gdGhlIHJpZ2h0IG9yZGVyXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2lnbmF0dXJlcyhzaWduYXR1cmVzOiBJbmRleGVkU2lnbmF0dXJlW10sIGV4aXN0aW5nU2lnbmF0dXJlcyA9IFtdLCBtOiBudW1iZXIgPSBERUZBVUxUX00pIHtcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgYXJyYXkgd2l0aCB0aGUgZXhpc3Rpbmcgc2lnbmF0dXJlcyBhbmQvb3IgZW1wdHkgb2JqZWN0c1xuICBjb25zdCB0cmFuc2FjdGlvblNpZ25hdHVyZXM6IGFueVtdID0gZXhpc3RpbmdTaWduYXR1cmVzO1xuICBjb25zdCBzaXplID0gZXhpc3RpbmdTaWduYXR1cmVzLmxlbmd0aDtcbiAgaWYgKHNpemUgPiBtKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUb28gbWFueSBzaWduYXR1cmVzLiBFeHBlY3RlZCBsZXNzIHRoYW4gJyArIG0gKyAnIGdvdCAnICsgc2l6ZSk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IHNpemU7IGkgPCBtOyBpKyspIHtcbiAgICB0cmFuc2FjdGlvblNpZ25hdHVyZXMucHVzaCh7IHByaW06ICdOb25lJyB9KTtcbiAgfVxuICAvLyBSZXBsYWNlIHRoZSBlbXB0eSBzaWduYXR1cmVzIGZvciB0aGUgcmVhbCBvbmVzIGJhc2VkIG9uIHRoZSByaWdodCBpbmRleFxuICBzaWduYXR1cmVzLmZvckVhY2goKHMpID0+IHtcbiAgICBpZiAocy5pbmRleCkge1xuICAgICAgdHJhbnNhY3Rpb25TaWduYXR1cmVzW3MuaW5kZXhdID0geyBwcmltOiAnU29tZScsIGFyZ3M6IFt7IHN0cmluZzogcy5zaWduYXR1cmUgfV0gfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2FjdGlvblNpZ25hdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgXCJudWxsXCIgc2lnbmF0dXJlXG4gICAgICAgIGlmICh0cmFuc2FjdGlvblNpZ25hdHVyZXNbaV0ucHJpbSA9PT0gJ05vbmUnKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb25TaWduYXR1cmVzW2ldID0geyBwcmltOiAnU29tZScsIGFyZ3M6IFt7IHN0cmluZzogcy5zaWduYXR1cmUgfV0gfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0cmFuc2FjdGlvblNpZ25hdHVyZXM7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGJ1aWxkIHRoZSBNaWNoZWxzb24gc2NyaXB0IHRvIGJlIHNpZ25lZCB0byB0cmFuc2ZlciBmdW5kcyBmcm9tIGEgbXVsdGlzaWdcbiAqIHdhbGxldC5cbiAqXG4gKiBAcGFyYW0gY29udHJhY3RBZGRyZXNzIFRoZSBtdWx0aXNpZyBzbWFydCBjb250cmFjdCBhZGRyZXNzXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb25BZGRyZXNzIFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IGFkZHJlc3MgKGltcGxpY2l0IG9yIG9yaWdpbmF0ZWQpXG4gKiBAcGFyYW0ge251bWJlcn0gYW1vdW50IE51bWJlciBvZiBtdXRleiB0byB0cmFuc2ZlclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0Q291bnRlciBXYWxsZXQgY291bnRlciB0byB1c2UgaW4gdGhlIHRyYW5zYWN0aW9uXG4gKiBAcmV0dXJucyBBIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIE1pY2hlbHNvbiBzY3JpcHQgdG8gc2lnbiBhbmQgYXBwcm92ZSBhIHRyYW5zZmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmljTXVsdGlzaWdEYXRhVG9TaWduKFxuICBjb250cmFjdEFkZHJlc3M6IHN0cmluZyxcbiAgZGVzdGluYXRpb25BZGRyZXNzOiBzdHJpbmcsXG4gIGFtb3VudDogc3RyaW5nLFxuICBjb250cmFjdENvdW50ZXI6IHN0cmluZ1xuKSB7XG4gIGNvbnN0IGRhdGEgPSB7XG4gICAgcHJpbTogJ1BhaXInLFxuICAgIGFyZ3M6IFtcbiAgICAgIHsgaW50OiBjb250cmFjdENvdW50ZXIgfSxcbiAgICAgIHtcbiAgICAgICAgcHJpbTogJ0xlZnQnLFxuICAgICAgICBhcmdzOiBbdHJhbnNmZXJUb0FjY291bnQoZGVzdGluYXRpb25BZGRyZXNzLCBhbW91bnQpXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfTtcbiAgY29uc3QgdHlwZSA9IHtcbiAgICBwcmltOiAncGFpcicsXG4gICAgYXJnczogW1xuICAgICAge1xuICAgICAgICBwcmltOiAnbmF0JyxcbiAgICAgICAgYW5ub3RzOiBbJyVjb3VudGVyJ10sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwcmltOiAnb3InLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ2xhbWJkYScsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIHsgcHJpbTogJ3VuaXQnIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ29wZXJhdGlvbicgfV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYW5ub3RzOiBbJyVvcGVyYXRpb24nXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICduYXQnLFxuICAgICAgICAgICAgICAgIGFubm90czogWycldGhyZXNob2xkJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ2tleScgfV0sXG4gICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVrZXlzJ10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgYW5ub3RzOiBbJyVjaGFuZ2Vfa2V5cyddLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGFubm90czogWyc6YWN0aW9uJ10sXG4gICAgICB9LFxuICAgIF0sXG4gICAgYW5ub3RzOiBbJzpwYXlsb2FkJ10sXG4gIH07XG4gIHJldHVybiBidWlsZFBhaXIoZGF0YSwgdHlwZSwgY29udHJhY3RBZGRyZXNzKTtcbn1cblxuLyoqXG4gKiBVdGlsIGZ1bmN0aW9uIHRvIGJ1aWxkIGEgTWljaGVsc29uIFBhaXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcGFyYW0gdHlwZVxuICogQHBhcmFtIGNvbnRyYWN0QWRkcmVzc1xuICovXG5mdW5jdGlvbiBidWlsZFBhaXIoZGF0YTogYW55LCB0eXBlOiBhbnksIGNvbnRyYWN0QWRkcmVzczogYW55KSB7XG4gIHJldHVybiB7XG4gICAgZGF0YToge1xuICAgICAgcHJpbTogJ1BhaXInLFxuICAgICAgYXJnczogW3sgc3RyaW5nOiBjb250cmFjdEFkZHJlc3MgfSwgZGF0YV0sXG4gICAgfSxcbiAgICB0eXBlOiB7XG4gICAgICBwcmltOiAncGFpcicsXG4gICAgICBhcmdzOiBbeyBwcmltOiAnYWRkcmVzcycgfSwgdHlwZV0sXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgbGFtYmRhIGZvciB0aGUgbXVsdGlzaWcgdHJhbnNhY3Rpb24gdHJhbnNmZXIgdG8gYW4gaW1wbGljaXQgb3Igb3JpZ2luYXRlZCBhY2NvdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIEFjY291bnQgYWRkcmVzcyB0byBzZW5kIHRoZSBmdW5kcyB0b1xuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCBUaGUgYW1vdW50IGluIG11dGV6IHRvIHRyYW5zZmVyXG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rlem9zdGFxdWl0by5pby9kb2NzL21ha2luZ190cmFuc2ZlcnMjdHJhbnNmZXItMDAwMDA1LTUwLW11dGV6LXRva2Vucy1mcm9tLWEta3QxLWFkZHJlc3MtdG8tYS10ejEtYWRkcmVzc31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmZXJUb0FjY291bnQoYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZykge1xuICBpZiAoaXNWYWxpZEtleShhZGRyZXNzLCBoYXNoVHlwZXMuS1QpKSB7XG4gICAgcmV0dXJuIHRyYW5zZmVyVG9PcmlnaW5hdGVkQWNjb3VudChhZGRyZXNzLCBhbW91bnQpO1xuICB9XG4gIC8vIExhbWJkYSB0byB0cmFuc2ZlciB0byBhbiBpbXBsaWNpdCBhY2NvdW50XG4gIHJldHVybiBbXG4gICAgeyBwcmltOiAnRFJPUCcgfSxcbiAgICB7IHByaW06ICdOSUwnLCBhcmdzOiBbeyBwcmltOiAnb3BlcmF0aW9uJyB9XSB9LFxuICAgIHtcbiAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgIGFyZ3M6IFt7IHByaW06ICdrZXlfaGFzaCcgfSwgeyBzdHJpbmc6IGFkZHJlc3MgfV0sXG4gICAgfSxcbiAgICB7IHByaW06ICdJTVBMSUNJVF9BQ0NPVU5UJyB9LFxuICAgIHtcbiAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgIGFyZ3M6IFt7IHByaW06ICdtdXRleicgfSwgeyBpbnQ6IGFtb3VudCB9XSxcbiAgICB9LFxuICAgIHsgcHJpbTogJ1VOSVQnIH0sXG4gICAgeyBwcmltOiAnVFJBTlNGRVJfVE9LRU5TJyB9LFxuICAgIHsgcHJpbTogJ0NPTlMnIH0sXG4gIF07XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGxhbWJkYSBmb3IgdGhlIG11bHRpc2lnIHRyYW5zYWN0aW9uIHRyYW5zZmVyIHRvIGFuIG9yaWdpbmF0ZWQgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkcmVzcyBPcmlnaW5hdGVkIGFjY291bnQgYWRkcmVzcyB0byBzZW5kIHRoZSBmdW5kcyB0b1xuICogQHBhcmFtIHtzdHJpbmd9IGFtb3VudCBUaGUgYW1vdW50IGluIG11dGV6IHRvIHRyYW5zZmVyXG4gKiBAc2VlIHtAbGluayBodHRwczovL3Rlem9zdGFxdWl0by5pby9kb2NzL21ha2luZ190cmFuc2ZlcnMjdHJhbnNmZXItMDAwMDAwMS0xLW11dGV6LXRva2Vucy1mcm9tLWEta3QxLWFkZHJlc3MtdG8tYS1rdDEtYWRkcmVzc31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmZXJUb09yaWdpbmF0ZWRBY2NvdW50KGFkZHJlc3M6IHN0cmluZywgYW1vdW50OiBzdHJpbmcpIHtcbiAgcmV0dXJuIFtcbiAgICB7IHByaW06ICdEUk9QJyB9LFxuICAgIHsgcHJpbTogJ05JTCcsIGFyZ3M6IFt7IHByaW06ICdvcGVyYXRpb24nIH1dIH0sXG4gICAge1xuICAgICAgcHJpbTogJ1BVU0gnLFxuICAgICAgYXJnczogW3sgcHJpbTogJ2FkZHJlc3MnIH0sIHsgc3RyaW5nOiBhZGRyZXNzIH1dLFxuICAgIH0sXG4gICAgeyBwcmltOiAnQ09OVFJBQ1QnLCBhcmdzOiBbeyBwcmltOiAndW5pdCcgfV0gfSxcbiAgICBbXG4gICAgICB7XG4gICAgICAgIHByaW06ICdJRl9OT05FJyxcbiAgICAgICAgYXJnczogW1tbeyBwcmltOiAnVU5JVCcgfSwgeyBwcmltOiAnRkFJTFdJVEgnIH1dXSwgW11dLFxuICAgICAgfSxcbiAgICBdLFxuICAgIHtcbiAgICAgIHByaW06ICdQVVNIJyxcbiAgICAgIGFyZ3M6IFt7IHByaW06ICdtdXRleicgfSwgeyBpbnQ6IGFtb3VudCB9XSxcbiAgICB9LFxuICAgIHsgcHJpbTogJ1VOSVQnIH0sXG4gICAgeyBwcmltOiAnVFJBTlNGRVJfVE9LRU5TJyB9LFxuICAgIHsgcHJpbTogJ0NPTlMnIH0sXG4gIF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcmV2ZWFsIG9wZXJhdGlvbiBmb3IgYSBwdWJsaWMga2V5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudGVyIFNvdXJjZSBhY2NvdW50IG5leHQgY291bnRlclxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBTb3VyY2UgYWNjb3VudCBhZGRyZXNzXG4gKiBAcGFyYW0ge3N0cmluZ30gcHViS2V5IFRoZSBwdWJsaWMga2V5IHRvIHJldmVhbFxuICogQHBhcmFtIHtzdHJpbmd9IGZlZSBGZWVzIGluIG11dGV6IHRvIHBheSBieSB0aGUgc291cmNlIGFjY291bnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBnYXNMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBnYXMgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IHN0b3JhZ2VMaW1pdCBNYXhpbXVtIGFtb3VudCBpbiBtdXRleiB0byBzcGVuZCBpbiBzdG9yYWdlIGZlZXNcbiAqIEByZXR1cm5zIEFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2ZWFsT3BlcmF0aW9uKFxuICBjb3VudGVyOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBwdWJLZXk6IHN0cmluZyxcbiAgZmVlOiBzdHJpbmcgPSBERUZBVUxUX0ZFRS5SRVZFQUwudG9TdHJpbmcoKSxcbiAgZ2FzTGltaXQ6IHN0cmluZyA9IERFRkFVTFRfR0FTX0xJTUlULlJFVkVBTC50b1N0cmluZygpLFxuICBzdG9yYWdlTGltaXQ6IHN0cmluZyA9IERFRkFVTFRfU1RPUkFHRV9MSU1JVC5SRVZFQUwudG9TdHJpbmcoKVxuKTogUmV2ZWFsT3Age1xuICByZXR1cm4ge1xuICAgIGtpbmQ6ICdyZXZlYWwnLFxuICAgIGNvdW50ZXIsXG4gICAgc291cmNlLFxuICAgIGZlZSxcbiAgICBnYXNfbGltaXQ6IGdhc0xpbWl0LFxuICAgIHN0b3JhZ2VfbGltaXQ6IHN0b3JhZ2VMaW1pdCxcbiAgICBwdWJsaWNfa2V5OiBwdWJLZXksXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvbiBmb3IgdGhlIGdlbmVyaWMgbXVsdGlzZyBjb250cmFjdC4gSXQgZG9lcyBub3QgY3JlYXRlIGEgcmV2ZWFsXG4gKiBvcGVyYXRpb24gZm9yIHRoZSBzb3VyY2UgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRlciBWYWxpZCBzb3VyY2UgYWNjb3VudCBjb3VudGVyIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBTb3VyY2UgYWNjb3VudCBhZGRyZXNzXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlIEZlZXMgaW4gbXV0ZXogdG8gcGF5IGJ5IHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IGdhc0xpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIGdhcyBmZWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RvcmFnZUxpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIHN0b3JhZ2UgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IGJhbGFuY2UgTmV3IG11bHRpc2lnIGFjY291bnQgaW5pdGlhbCBiYWxhbmNlIHRha2VuIGZyb20gdGhlIHNvdXJjZSBhY2NvdW50XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwdWJLZXlzIExpc3Qgb2YgcHVibGljIGtleXMgb2YgdGhlIG11bHRpc2lnIG93bmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVsZWdhdGUgT3B0aW9uYWwgaW1wbGljaXQgYWRkcmVzcyB0byBkZWxlZ2F0ZSB0aGUgd2FsbGV0IGZ1bmRzIHRvXG4gKiBAcGFyYW0ge251bWJlcn0gdGhyZXNob2xkIE1pbmltdW0gbnVtYmVyIG9mIHNpZ25hdHVyZXMgcmVxdWlyZWQgdG8gYXV0aG9yaXplIGEgbXVsdGlzaWcgb3BlcmF0aW9uXG4gKiBAcmV0dXJucyBBbiBvcmlnaW5hdGlvbiBvcGVyYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyaWNNdWx0aXNpZ09yaWdpbmF0aW9uT3BlcmF0aW9uKFxuICBjb3VudGVyOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBmZWU6IHN0cmluZyxcbiAgZ2FzTGltaXQ6IHN0cmluZyxcbiAgc3RvcmFnZUxpbWl0OiBzdHJpbmcsXG4gIGJhbGFuY2U6IHN0cmluZyxcbiAgcHViS2V5czogc3RyaW5nW10sXG4gIGRlbGVnYXRlPzogc3RyaW5nLFxuICB0aHJlc2hvbGQ6IG51bWJlciA9IERFRkFVTFRfTlxuKTogT3JpZ2luYXRpb25PcCB7XG4gIGNvbnN0IHdhbGxldFB1YmxpY0tleXM6IGFueVtdID0gW107XG4gIHB1YktleXMuZm9yRWFjaCgocGspID0+IHdhbGxldFB1YmxpY0tleXMucHVzaCh7IHN0cmluZzogcGsgfSkpO1xuICBjb25zdCBvcmlnaW5hdGlvbk9wOiBPcmlnaW5hdGlvbk9wID0ge1xuICAgIGtpbmQ6ICdvcmlnaW5hdGlvbicsXG4gICAgY291bnRlcixcbiAgICBzb3VyY2UsXG4gICAgZmVlLFxuICAgIGdhc19saW1pdDogZ2FzTGltaXQsXG4gICAgc3RvcmFnZV9saW1pdDogc3RvcmFnZUxpbWl0LFxuICAgIGJhbGFuY2UsXG4gICAgc2NyaXB0OiB7XG4gICAgICBjb2RlOiBnZW5lcmljTXVsdGlzaWcsXG4gICAgICBzdG9yYWdlOiB7XG4gICAgICAgIHByaW06ICdQYWlyJyxcbiAgICAgICAgYXJnczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGludDogJzAnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ1BhaXInLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW50OiB0aHJlc2hvbGQudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgd2FsbGV0UHVibGljS2V5cyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbiAgaWYgKGRlbGVnYXRlKSB7XG4gICAgb3JpZ2luYXRpb25PcC5kZWxlZ2F0ZSA9IGRlbGVnYXRlO1xuICB9XG4gIHJldHVybiBvcmlnaW5hdGlvbk9wO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcHVibGljIGtleSBvZiBlYWNoIG93bmVyIG9mIGFuIG11bHRpc2lnIHdhbGxldCBvcmlnaW5hdGlvbiBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge09yaWdpbmF0aW9uT3B9IG9wZXJhdGlvbiBBbiBvcGVyYXRpb24gd2l0aCB0aGUgZ2VuZXJpYyBtdWx0aXNpZyB3YWxsZXQgb3JpZ2luYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gTGlzdCBvZiBhbGwgdGhlIG93bmVycyBzZXQgaW4gdGhlIG9yaWdpbmF0aW9uIHRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPd25lcnNQdWJsaWNLZXlzKG9wZXJhdGlvbjogT3JpZ2luYXRpb25PcCk6IHN0cmluZ1tdIHtcbiAgY29uc3Qgb3duZXJzQXJncyA9IF8uZ2V0KG9wZXJhdGlvbiwgJ3NjcmlwdC5zdG9yYWdlLmFyZ3NbMV0uYXJnc1sxXScpO1xuICBpZiAoIW93bmVyc0FyZ3MpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIG93bmVyc0FyZ3MubWFwKChvKSA9PiBvLnN0cmluZyk7XG59XG5cbi8qKlxuICogR2VuZXJpYyBNdWx0aXNpZyBjb250cmFjdCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tdXJiYXJkL3NtYXJ0LWNvbnRyYWN0cy9ibG9iL21hc3Rlci9tdWx0aXNpZy9taWNoZWxzb24vZ2VuZXJpYy50elxuICovXG5jb25zdCBnZW5lcmljTXVsdGlzaWcgPSBbXG4gIHtcbiAgICBwcmltOiAncGFyYW1ldGVyJyxcbiAgICBhcmdzOiBbXG4gICAgICB7XG4gICAgICAgIHByaW06ICdvcicsXG4gICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICB7IHByaW06ICd1bml0JywgYW5ub3RzOiBbJyVkZWZhdWx0J10gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnbmF0JyxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJyVjb3VudGVyJ10sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnb3InLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ2xhbWJkYScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ3VuaXQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnb3BlcmF0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJW9wZXJhdGlvbiddLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJyV0aHJlc2hvbGQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdsaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbeyBwcmltOiAna2V5JyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJWtleXMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJWNoYW5nZV9rZXlzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJzphY3Rpb24nXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBhbm5vdHM6IFsnOnBheWxvYWQnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdsaXN0JyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByaW06ICdvcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbeyBwcmltOiAnc2lnbmF0dXJlJyB9XSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJXNpZ3MnXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBhbm5vdHM6IFsnJW1haW4nXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgcHJpbTogJ3N0b3JhZ2UnLFxuICAgIGFyZ3M6IFtcbiAgICAgIHtcbiAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICBhcmdzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgICAgICBhbm5vdHM6IFsnJXN0b3JlZF9jb3VudGVyJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnbmF0JyxcbiAgICAgICAgICAgICAgICBhbm5vdHM6IFsnJXRocmVzaG9sZCddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ2xpc3QnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdrZXknIH1dLFxuICAgICAgICAgICAgICAgIGFubm90czogWycla2V5cyddLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgcHJpbTogJ2NvZGUnLFxuICAgIGFyZ3M6IFtcbiAgICAgIFtcbiAgICAgICAgW1xuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgIHsgcHJpbTogJ0NBUicgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnQ0RSJyB9XV0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIF0sXG4gICAgICAgIHtcbiAgICAgICAgICBwcmltOiAnSUZfTEVGVCcsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7IHByaW06ICdEUk9QJyB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ05JTCcsXG4gICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ29wZXJhdGlvbicgfV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ1BVU0gnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFt7IHByaW06ICdtdXRleicgfSwgeyBpbnQ6ICcwJyB9XSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBwcmltOiAnQU1PVU5UJyB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW3sgcHJpbTogJ0NPTVBBUkUnIH0sIHsgcHJpbTogJ0VRJyB9XSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwcmltOiAnSUYnLFxuICAgICAgICAgICAgICAgICAgYXJnczogW1tdLCBbW3sgcHJpbTogJ1VOSVQnIH0sIHsgcHJpbTogJ0ZBSUxXSVRIJyB9XV1dLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnU1dBUCcgfV1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnRFVQJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnQ0FSJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdDRFInIH1dXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnRFVQJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdTRUxGJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdBRERSRVNTJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdQQUNLJyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnRFVQJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnQ0FSJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJ0Bjb3VudGVyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NEUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ1NXQVAnIH1dXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnU1dBUCcgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0NBUicsXG4gICAgICAgICAgICAgICAgICAgIGFubm90czogWydAc3RvcmVkX2NvdW50ZXInXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ0NEUicgfV1dLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdTV0FQJyB9XV0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBbeyBwcmltOiAnQ09NUEFSRScgfSwgeyBwcmltOiAnRVEnIH1dLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHByaW06ICdJRicsXG4gICAgICAgICAgICAgICAgICBhcmdzOiBbW10sIFtbeyBwcmltOiAnVU5JVCcgfSwgeyBwcmltOiAnRkFJTFdJVEgnIH1dXV0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnU1dBUCcgfV1dLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgeyBwcmltOiAnRFVQJyB9LFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcmltOiAnQ0FSJyxcbiAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJ0B0aHJlc2hvbGQnXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnQ0RSJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RzOiBbJ0BrZXlzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnUFVTSCcsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ25hdCcgfSwgeyBpbnQ6ICcwJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgICBhbm5vdHM6IFsnQHZhbGlkJ10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnSVRFUicsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1t7IHByaW06ICdTV0FQJyB9XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnSUZfQ09OUycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0lGX05PTkUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ1NXQVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RST1AnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnU1dBUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdTV0FQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRFVQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdTV0FQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdEVVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJRycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ6ICczJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnQ0hFQ0tfU0lHTkFUVVJFJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdTV0FQJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdJRicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdEUk9QJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdGQUlMV0lUSCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ1BVU0gnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ25hdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ6ICcxJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnQUREJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90czogWydAdmFsaWQnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdVTklUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdGQUlMV0lUSCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnU1dBUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIFt7IHByaW06ICdDT01QQVJFJyB9LCB7IHByaW06ICdMRScgfV0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcHJpbTogJ0lGJyxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtbXSwgW1t7IHByaW06ICdVTklUJyB9LCB7IHByaW06ICdGQUlMV0lUSCcgfV1dXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ0lGX0NPTlMnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtbW3sgcHJpbTogJ1VOSVQnIH0sIHsgcHJpbTogJ0ZBSUxXSVRIJyB9XV0sIFtdXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgeyBwcmltOiAnRFJPUCcgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdESVAnLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RVUCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NBUicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0RJUCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtbeyBwcmltOiAnQ0RSJyB9XV0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnUFVTSCcsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ25hdCcgfSwgeyBpbnQ6ICcxJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdBREQnLFxuICAgICAgICAgICAgICAgICAgICAgIGFubm90czogWydAbmV3X2NvdW50ZXInXSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnUEFJUicgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHByaW06ICdJRl9MRUZUJyxcbiAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICBbeyBwcmltOiAnVU5JVCcgfSwgeyBwcmltOiAnRVhFQycgfV0sXG4gICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbW3sgcHJpbTogJ0NBUicgfV1dLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdTV0FQJyB9LFxuICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdQQUlSJyB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ05JTCcsXG4gICAgICAgICAgICAgICAgICAgICAgYXJnczogW3sgcHJpbTogJ29wZXJhdGlvbicgfV0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIF0sXG4gIH0sXG5dO1xuXG4vKipcbiAqIEFkZCBjb250cmFjdCBhZGRyZXNzIHRvIGZvcndhcmRlciBjb250cmFjdCB0ZW1wbGF0ZSBhbmQgcmV0dXJuIGNvbnRyYWN0IE1pY2hlbHNvbiBjb2RlIGFzIEpTT05cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RBZGRyZXNzIC0gbXVsdGlzaWcgY29udHJhY3RBZGRyZXNzIHRoYXQgd2lsbCByZWNlaXZlIGZvcndhcmRlZCBmdW5kc1xuICogQHJldHVybnMge29iamVjdFtdfSBNaWNoZWxzb24gY29kZSBmb3IgdGhlIG9yaWdpbmF0aW9uIG9wZXJhdGlvblxuICovXG5mdW5jdGlvbiBjcmVhdGVGb3J3YXJkZXIoY29udHJhY3RBZGRyZXNzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwcmltOiAncGFyYW1ldGVyJyxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByaW06ICdvcicsXG4gICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgeyBwcmltOiAndW5pdCcsIGFubm90czogWyclZGVmYXVsdCddIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgIHsgcHJpbTogJ25hdCcgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwcmltOiAnY29udHJhY3QnLFxuICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ2FkZHJlc3MnLCBhbm5vdHM6IFsnOmZyb20nXSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAncGFpcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdhZGRyZXNzJywgYW5ub3RzOiBbJzp0byddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnbmF0JywgYW5ub3RzOiBbJzp2YWx1ZSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGFubm90czogWyclZmx1c2gnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICB7IHByaW06ICdzdG9yYWdlJywgYXJnczogW3sgcHJpbTogJ3VuaXQnIH1dIH0sXG4gICAge1xuICAgICAgcHJpbTogJ2NvZGUnLFxuICAgICAgYXJnczogW1xuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcHJpbTogJ0NBU1QnLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJpbTogJ29yJyxcbiAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ3VuaXQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICduYXQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltOiAnY29udHJhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnYWRkcmVzcycgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdwYWlyJywgYXJnczogW3sgcHJpbTogJ2FkZHJlc3MnIH0sIHsgcHJpbTogJ25hdCcgfV0gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHByaW06ICd1bml0JyB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwcmltOiAnQ0FSJyB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByaW06ICdJRl9MRUZUJyxcbiAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RST1AnIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcHJpbTogJ05PTkUnLFxuICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ3BhaXInLFxuICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ25hdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ2NvbnRyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW06ICdwYWlyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnYWRkcmVzcycgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAncGFpcicsIGFyZ3M6IFt7IHByaW06ICdhZGRyZXNzJyB9LCB7IHByaW06ICduYXQnIH1dIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIFt7IHByaW06ICdTT01FJyB9XSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHByaW06ICdESVAnLCBhcmdzOiBbW3sgcHJpbTogJ1BVU0gnLCBhcmdzOiBbeyBwcmltOiAnYWRkcmVzcycgfSwgeyBzdHJpbmc6IGNvbnRyYWN0QWRkcmVzcyB9XSB9XV0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAnSUZfTk9ORScsXG4gICAgICAgICAgICBhcmdzOiBbXG4gICAgICAgICAgICAgIFt7IHByaW06ICdOSUwnLCBhcmdzOiBbeyBwcmltOiAnb3BlcmF0aW9uJyB9XSB9XSxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RJUCcsIGFyZ3M6IFtbeyBwcmltOiAnRFVQJyB9XV0gfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdEVVAnIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnQ0FSJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0RJUCcsIGFyZ3M6IFtbeyBwcmltOiAnQ0RSJyB9XV0gfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdESUcnLCBhcmdzOiBbeyBpbnQ6ICcyJyB9XSB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnU0VMRicgfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdBRERSRVNTJyB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnRElQJywgYXJnczogW1t7IHByaW06ICdQVVNIJywgYXJnczogW3sgcHJpbTogJ211dGV6JyB9LCB7IGludDogJzAnIH1dIH1dXSB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ1RSQU5TRkVSX1RPS0VOUycgfSxcbiAgICAgICAgICAgICAgICB7IHByaW06ICdESVAnLCBhcmdzOiBbW3sgcHJpbTogJ05JTCcsIGFyZ3M6IFt7IHByaW06ICdvcGVyYXRpb24nIH1dIH1dXSB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NPTlMnIH0sXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwcmltOiAnQkFMQU5DRScgfSxcbiAgICAgICAgICB7IHByaW06ICdQVVNIJywgYXJnczogW3sgcHJpbTogJ211dGV6JyB9LCB7IGludDogJzAnIH1dIH0sXG4gICAgICAgICAgeyBwcmltOiAnQ09NUEFSRScgfSxcbiAgICAgICAgICB7IHByaW06ICdFUScgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcmltOiAnSUYnLFxuICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICBbeyBwcmltOiAnRElQJywgYXJnczogW1t7IHByaW06ICdEUk9QJyB9XV0gfV0sXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwcmltOiAnRElQJyxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IFtcbiAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0NPTlRSQUNUJywgYXJnczogW3sgcHJpbTogJ3VuaXQnIH1dIH0sXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbTogJ0lGX05PTkUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnUFVTSCcsIGFyZ3M6IFt7IHByaW06ICdzdHJpbmcnIH0sIHsgc3RyaW5nOiAnbm90IGEgd2FsbGV0JyB9XSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ0ZBSUxXSVRIJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHByaW06ICdCQUxBTkNFJyB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcHJpbTogJ1VOSVQnIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyBwcmltOiAnVFJBTlNGRVJfVE9LRU5TJyB9LFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgcHJpbTogJ1NXQVAnIH0sXG4gICAgICAgICAgICAgICAgeyBwcmltOiAnQ09OUycgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHByaW06ICdESVAnLCBhcmdzOiBbW3sgcHJpbTogJ1VOSVQnIH1dXSB9LFxuICAgICAgICAgIHsgcHJpbTogJ1BBSVInIH0sXG4gICAgICAgIF0sXG4gICAgICBdLFxuICAgIH0sXG4gIF07XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9yaWdpbmF0aW9uIG9wZXJhdGlvbiBmb3IgYSBmb3J3YXJkZXIgY29udHJhY3RcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RBZGRyZXNzIG9yaWdpbmF0ZWQgbXVsdGlzaWcgYWRkcmVzcyB0byBmb3J3YXJkIGZ1bmRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRlciBWYWxpZCBzb3VyY2UgYWNjb3VudCBjb3VudGVyIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBTb3VyY2UgYWNjb3VudCBhZGRyZXNzXG4gKiBAcGFyYW0ge3N0cmluZ30gZmVlIEZlZXMgaW4gbXV0ZXogdG8gcGF5IGJ5IHRoZSBzb3VyY2UgYWNjb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IGdhc0xpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIGdhcyBmZWVzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RvcmFnZUxpbWl0IE1heGltdW0gYW1vdW50IGluIG11dGV6IHRvIHNwZW5kIGluIHN0b3JhZ2UgZmVlc1xuICogQHBhcmFtIHtzdHJpbmd9IGJhbGFuY2UgTmV3IG11bHRpc2lnIGFjY291bnQgaW5pdGlhbCBiYWxhbmNlIHRha2VuIGZyb20gdGhlIHNvdXJjZSBhY2NvdW50XG4gKiBAcmV0dXJucyB7T3JpZ2luYXRpb25PcH0gdGhlIG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZGVyT3JpZ2luYXRpb25PcGVyYXRpb24oXG4gIGNvbnRyYWN0QWRkcmVzczogc3RyaW5nLFxuICBjb3VudGVyOiBzdHJpbmcsXG4gIHNvdXJjZTogc3RyaW5nLFxuICBmZWU6IHN0cmluZyxcbiAgZ2FzTGltaXQ6IHN0cmluZyxcbiAgc3RvcmFnZUxpbWl0OiBzdHJpbmcsXG4gIGJhbGFuY2U6IHN0cmluZ1xuKTogT3JpZ2luYXRpb25PcCB7XG4gIHJldHVybiB7XG4gICAga2luZDogJ29yaWdpbmF0aW9uJyxcbiAgICBjb3VudGVyLFxuICAgIHNvdXJjZSxcbiAgICBmZWUsXG4gICAgZ2FzX2xpbWl0OiBnYXNMaW1pdCxcbiAgICBzdG9yYWdlX2xpbWl0OiBzdG9yYWdlTGltaXQsXG4gICAgYmFsYW5jZSxcbiAgICBzY3JpcHQ6IHtcbiAgICAgIGNvZGU6IGNyZWF0ZUZvcndhcmRlcihjb250cmFjdEFkZHJlc3MpLFxuICAgICAgc3RvcmFnZTogeyBwcmltOiAnVW5pdCcgfSxcbiAgICB9LFxuICB9O1xufVxuIl19