@bitgo/sdk-coin-flrp 1.1.0

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 (118) hide show
  1. package/.eslintignore +5 -0
  2. package/.eslintrc.json +7 -0
  3. package/.mocharc.yml +8 -0
  4. package/CHANGELOG.md +23 -0
  5. package/LICENSE +191 -0
  6. package/dist/src/flrp.d.ts +91 -0
  7. package/dist/src/flrp.d.ts.map +1 -0
  8. package/dist/src/flrp.js +343 -0
  9. package/dist/src/iface.d.ts +25 -0
  10. package/dist/src/iface.d.ts.map +1 -0
  11. package/dist/src/iface.js +3 -0
  12. package/dist/src/index.d.ts +6 -0
  13. package/dist/src/index.d.ts.map +1 -0
  14. package/dist/src/index.js +45 -0
  15. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +26 -0
  16. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +1 -0
  17. package/dist/src/lib/atomicInCTransactionBuilder.js +64 -0
  18. package/dist/src/lib/atomicTransactionBuilder.d.ts +96 -0
  19. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +1 -0
  20. package/dist/src/lib/atomicTransactionBuilder.js +318 -0
  21. package/dist/src/lib/constants.d.ts +170 -0
  22. package/dist/src/lib/constants.d.ts.map +1 -0
  23. package/dist/src/lib/constants.js +227 -0
  24. package/dist/src/lib/delegatorTxBuilder.d.ts +58 -0
  25. package/dist/src/lib/delegatorTxBuilder.d.ts.map +1 -0
  26. package/dist/src/lib/delegatorTxBuilder.js +224 -0
  27. package/dist/src/lib/errors.d.ts +8 -0
  28. package/dist/src/lib/errors.d.ts.map +1 -0
  29. package/dist/src/lib/errors.js +19 -0
  30. package/dist/src/lib/exportInCTxBuilder.d.ts +77 -0
  31. package/dist/src/lib/exportInCTxBuilder.d.ts.map +1 -0
  32. package/dist/src/lib/exportInCTxBuilder.js +199 -0
  33. package/dist/src/lib/exportInPTxBuilder.d.ts +30 -0
  34. package/dist/src/lib/exportInPTxBuilder.d.ts.map +1 -0
  35. package/dist/src/lib/exportInPTxBuilder.js +120 -0
  36. package/dist/src/lib/iface.d.ts +119 -0
  37. package/dist/src/lib/iface.d.ts.map +1 -0
  38. package/dist/src/lib/iface.js +22 -0
  39. package/dist/src/lib/importInCTxBuilder.d.ts +67 -0
  40. package/dist/src/lib/importInCTxBuilder.d.ts.map +1 -0
  41. package/dist/src/lib/importInCTxBuilder.js +403 -0
  42. package/dist/src/lib/importInPTxBuilder.d.ts +73 -0
  43. package/dist/src/lib/importInPTxBuilder.d.ts.map +1 -0
  44. package/dist/src/lib/importInPTxBuilder.js +464 -0
  45. package/dist/src/lib/index.d.ts +12 -0
  46. package/dist/src/lib/index.d.ts.map +1 -0
  47. package/dist/src/lib/index.js +39 -0
  48. package/dist/src/lib/keyPair.d.ts +58 -0
  49. package/dist/src/lib/keyPair.d.ts.map +1 -0
  50. package/dist/src/lib/keyPair.js +142 -0
  51. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +81 -0
  52. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +1 -0
  53. package/dist/src/lib/permissionlessValidatorTxBuilder.js +248 -0
  54. package/dist/src/lib/transaction.d.ts +111 -0
  55. package/dist/src/lib/transaction.d.ts.map +1 -0
  56. package/dist/src/lib/transaction.js +322 -0
  57. package/dist/src/lib/transactionBuilder.d.ts +85 -0
  58. package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
  59. package/dist/src/lib/transactionBuilder.js +167 -0
  60. package/dist/src/lib/transactionBuilderFactory.d.ts +37 -0
  61. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
  62. package/dist/src/lib/transactionBuilderFactory.js +91 -0
  63. package/dist/src/lib/types.d.ts +78 -0
  64. package/dist/src/lib/types.d.ts.map +1 -0
  65. package/dist/src/lib/types.js +5 -0
  66. package/dist/src/lib/utils.d.ts +217 -0
  67. package/dist/src/lib/utils.d.ts.map +1 -0
  68. package/dist/src/lib/utils.js +498 -0
  69. package/dist/src/lib/validatorTxBuilder.d.ts +40 -0
  70. package/dist/src/lib/validatorTxBuilder.d.ts.map +1 -0
  71. package/dist/src/lib/validatorTxBuilder.js +180 -0
  72. package/dist/src/register.d.ts +3 -0
  73. package/dist/src/register.d.ts.map +1 -0
  74. package/dist/src/register.js +11 -0
  75. package/dist/src/tflrp.d.ts +8 -0
  76. package/dist/src/tflrp.d.ts.map +1 -0
  77. package/dist/src/tflrp.js +14 -0
  78. package/dist/test/unit/delegatorTxBuilder.test.d.ts +2 -0
  79. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +1 -0
  80. package/dist/test/unit/delegatorTxBuilder.test.js +233 -0
  81. package/dist/test/unit/flrp.d.ts +2 -0
  82. package/dist/test/unit/flrp.d.ts.map +1 -0
  83. package/dist/test/unit/flrp.js +118 -0
  84. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +2 -0
  85. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +1 -0
  86. package/dist/test/unit/lib/atomicTransactionBuilder.js +222 -0
  87. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +2 -0
  88. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +1 -0
  89. package/dist/test/unit/lib/exportInCTxBuilder.js +584 -0
  90. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +2 -0
  91. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +1 -0
  92. package/dist/test/unit/lib/exportInPTxBuilder.js +377 -0
  93. package/dist/test/unit/lib/importInCTxBuilder.d.ts +2 -0
  94. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +1 -0
  95. package/dist/test/unit/lib/importInCTxBuilder.js +257 -0
  96. package/dist/test/unit/lib/importInPTxBuilder.d.ts +2 -0
  97. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +1 -0
  98. package/dist/test/unit/lib/importInPTxBuilder.js +500 -0
  99. package/dist/test/unit/lib/transaction.d.ts +2 -0
  100. package/dist/test/unit/lib/transaction.d.ts.map +1 -0
  101. package/dist/test/unit/lib/transaction.js +460 -0
  102. package/dist/test/unit/lib/utils.d.ts +2 -0
  103. package/dist/test/unit/lib/utils.d.ts.map +1 -0
  104. package/dist/test/unit/lib/utils.js +286 -0
  105. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +2 -0
  106. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +1 -0
  107. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +271 -0
  108. package/dist/test/unit/smoke.d.ts +2 -0
  109. package/dist/test/unit/smoke.d.ts.map +1 -0
  110. package/dist/test/unit/smoke.js +23 -0
  111. package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
  112. package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
  113. package/dist/test/unit/transactionBuilder.test.js +114 -0
  114. package/dist/test/unit/validatorTxBuilder.test.d.ts +2 -0
  115. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +1 -0
  116. package/dist/test/unit/validatorTxBuilder.test.js +293 -0
  117. package/dist/tsconfig.tsbuildinfo +1 -0
  118. package/package.json +57 -0
@@ -0,0 +1,293 @@
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
+ const statics_1 = require("@bitgo/statics");
37
+ const sdk_core_1 = require("@bitgo/sdk-core");
38
+ const assert = __importStar(require("assert"));
39
+ const validatorTxBuilder_1 = require("../../src/lib/validatorTxBuilder");
40
+ const delegatorTxBuilder_1 = require("../../src/lib/delegatorTxBuilder");
41
+ describe('ValidatorTxBuilder', function () {
42
+ const coinConfig = statics_1.coins.get('tflrp');
43
+ let builder;
44
+ beforeEach(function () {
45
+ builder = new validatorTxBuilder_1.ValidatorTxBuilder(coinConfig);
46
+ });
47
+ describe('Constructor', function () {
48
+ it('should initialize with coin config', function () {
49
+ assert.ok(builder);
50
+ assert.ok(builder instanceof validatorTxBuilder_1.ValidatorTxBuilder);
51
+ assert.ok(builder instanceof delegatorTxBuilder_1.DelegatorTxBuilder);
52
+ });
53
+ it('should have correct transaction type', function () {
54
+ assert.strictEqual(builder['transactionType'], sdk_core_1.TransactionType.AddValidator);
55
+ });
56
+ it('should initialize with undefined delegation fee rate', function () {
57
+ assert.strictEqual(builder['_delegationFeeRate'], undefined);
58
+ });
59
+ });
60
+ describe('delegationFeeRate', function () {
61
+ it('should set valid delegation fee rate', function () {
62
+ const result = builder.delegationFeeRate(25000); // 2.5%
63
+ assert.strictEqual(result, builder);
64
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
65
+ });
66
+ it('should reject negative delegation fee rate', function () {
67
+ assert.throws(() => {
68
+ builder.delegationFeeRate(-1000);
69
+ }, sdk_core_1.BuildTransactionError);
70
+ });
71
+ it('should reject delegation fee rate below minimum (2%)', function () {
72
+ assert.throws(() => {
73
+ builder.delegationFeeRate(19999); // Below 2%
74
+ }, sdk_core_1.BuildTransactionError);
75
+ });
76
+ it('should accept minimum delegation fee rate (2%)', function () {
77
+ assert.doesNotThrow(() => {
78
+ builder.delegationFeeRate(20000); // Exactly 2%
79
+ });
80
+ });
81
+ it('should accept delegation fee rate above minimum', function () {
82
+ assert.doesNotThrow(() => {
83
+ builder.delegationFeeRate(30000); // 3%
84
+ });
85
+ });
86
+ it('should handle maximum possible delegation fee rate', function () {
87
+ assert.doesNotThrow(() => {
88
+ builder.delegationFeeRate(1000000); // 100%
89
+ });
90
+ });
91
+ it('should update delegation fee rate when called multiple times', function () {
92
+ builder.delegationFeeRate(25000);
93
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
94
+ builder.delegationFeeRate(30000);
95
+ assert.strictEqual(builder['_delegationFeeRate'], 30000);
96
+ });
97
+ });
98
+ describe('Method chaining', function () {
99
+ it('should allow method chaining with delegation fee rate', function () {
100
+ const result = builder
101
+ .delegationFeeRate(25000) // 2.5%
102
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
103
+ .startTime(1640995200)
104
+ .endTime(1641081600)
105
+ .stakeAmount('1000000000000000000');
106
+ assert.strictEqual(result, builder);
107
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
108
+ assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
109
+ assert.strictEqual(builder['_startTime'], 1640995200n);
110
+ assert.strictEqual(builder['_endTime'], 1641081600n);
111
+ assert.strictEqual(builder['_stakeAmount'], 1000000000000000000n);
112
+ });
113
+ it('should chain with all delegator methods', function () {
114
+ const result = builder
115
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
116
+ .startTime(1640995200)
117
+ .endTime(1641081600)
118
+ .stakeAmount('1000000000000000000')
119
+ .delegationFeeRate(25000) // 2.5%
120
+ .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
121
+ assert.strictEqual(result, builder);
122
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
123
+ });
124
+ it('should work when delegation fee rate is set first', function () {
125
+ const result = builder
126
+ .delegationFeeRate(30000) // 3%
127
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
128
+ assert.strictEqual(result, builder);
129
+ assert.strictEqual(builder['_delegationFeeRate'], 30000);
130
+ assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
131
+ });
132
+ it('should work when delegation fee rate is set last', function () {
133
+ const result = builder
134
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
135
+ .startTime(1640995200)
136
+ .delegationFeeRate(25000); // 2.5%
137
+ assert.strictEqual(result, builder);
138
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
139
+ assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
140
+ });
141
+ });
142
+ describe('Inheritance from DelegatorTxBuilder', function () {
143
+ it('should inherit nodeID method', function () {
144
+ const result = builder.nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
145
+ assert.strictEqual(result, builder);
146
+ assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
147
+ });
148
+ it('should inherit startTime method', function () {
149
+ const result = builder.startTime(1640995200);
150
+ assert.strictEqual(result, builder);
151
+ assert.strictEqual(builder['_startTime'], 1640995200n);
152
+ });
153
+ it('should inherit endTime method', function () {
154
+ const result = builder.endTime(1641081600);
155
+ assert.strictEqual(result, builder);
156
+ assert.strictEqual(builder['_endTime'], 1641081600n);
157
+ });
158
+ it('should inherit stakeAmount method', function () {
159
+ const result = builder.stakeAmount('1000000000000000000');
160
+ assert.strictEqual(result, builder);
161
+ assert.strictEqual(builder['_stakeAmount'], 1000000000000000000n);
162
+ });
163
+ it('should inherit rewardAddresses method', function () {
164
+ const addresses = ['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m'];
165
+ const result = builder.rewardAddresses(addresses);
166
+ assert.strictEqual(result, builder);
167
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
168
+ assert.deepStrictEqual(builder.transaction._rewardAddresses, addresses);
169
+ });
170
+ it('should inherit validation from delegator methods', function () {
171
+ // Should inherit node ID validation - empty node ID should throw
172
+ assert.throws(() => {
173
+ builder.nodeID('');
174
+ }, sdk_core_1.BuildTransactionError);
175
+ // Should inherit time validation - negative time should throw
176
+ assert.throws(() => {
177
+ builder.startTime(-1);
178
+ }, sdk_core_1.BuildTransactionError);
179
+ // Should inherit stake amount validation - negative amount should throw
180
+ assert.throws(() => {
181
+ builder.stakeAmount(-1000);
182
+ }, sdk_core_1.BuildTransactionError);
183
+ });
184
+ });
185
+ describe('Transaction building validation', function () {
186
+ it('should require delegation fee rate for validation', async function () {
187
+ builder
188
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
189
+ .startTime(1640995200)
190
+ .endTime(1641081600)
191
+ .stakeAmount('1000000000000000000')
192
+ .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
193
+ // Validator builder should fail validation without delegation fee rate (0 is invalid)
194
+ await assert.rejects(async () => {
195
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
196
+ await builder.buildFlareTransaction();
197
+ }, sdk_core_1.BuildTransactionError);
198
+ });
199
+ it('should pass validation with delegation fee rate', async function () {
200
+ builder
201
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
202
+ .startTime(1640995200)
203
+ .endTime(1641081600)
204
+ .stakeAmount('1000000000000000000')
205
+ .delegationFeeRate(25000) // 2.5%
206
+ .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
207
+ await assert.doesNotReject(async () => {
208
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
209
+ await builder.buildFlareTransaction();
210
+ });
211
+ });
212
+ it('should require all delegator fields', async function () {
213
+ builder.delegationFeeRate(25000); // 2.5%
214
+ // Should still fail without other required fields
215
+ await assert.rejects(async () => {
216
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
217
+ await builder.buildFlareTransaction();
218
+ }, sdk_core_1.BuildTransactionError);
219
+ });
220
+ });
221
+ describe('buildFlareTransaction', function () {
222
+ it('should reject building without delegation fee rate', async function () {
223
+ builder
224
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
225
+ .startTime(1640995200)
226
+ .endTime(1641081600)
227
+ .stakeAmount('1000000000000000000')
228
+ .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
229
+ await assert.rejects(async () => {
230
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
231
+ await builder.buildFlareTransaction();
232
+ }, sdk_core_1.BuildTransactionError);
233
+ });
234
+ it('should reject building without required delegator fields', async function () {
235
+ builder.delegationFeeRate(25000); // 2.5%
236
+ await assert.rejects(async () => {
237
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
238
+ await builder.buildFlareTransaction();
239
+ }, sdk_core_1.BuildTransactionError);
240
+ });
241
+ it('should build transaction with all required fields', async function () {
242
+ builder
243
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
244
+ .startTime(1640995200)
245
+ .endTime(1641081600)
246
+ .stakeAmount('1000000000000000000')
247
+ .delegationFeeRate(25000) // 2.5%
248
+ .rewardAddresses(['P-flare1x0r5h0l8w6nj3k2p0d5g9t5b8v3a9k1m']);
249
+ await assert.doesNotReject(async () => {
250
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
+ await builder.buildFlareTransaction();
252
+ });
253
+ });
254
+ it('should inherit time validation from delegator builder', function () {
255
+ // This test verifies that time validation happens immediately when setting values
256
+ assert.throws(() => {
257
+ builder
258
+ .nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg')
259
+ .startTime(1641081600)
260
+ .endTime(1640995200) // End time before start time
261
+ .stakeAmount('1000000000000000000')
262
+ .delegationFeeRate(25000); // 2.5%
263
+ }, sdk_core_1.BuildTransactionError);
264
+ });
265
+ });
266
+ describe('Edge cases and validation', function () {
267
+ it('should handle minimum delegation fee rate (2%)', function () {
268
+ assert.doesNotThrow(() => {
269
+ builder.delegationFeeRate(20000); // 2%
270
+ });
271
+ assert.strictEqual(builder['_delegationFeeRate'], 20000);
272
+ });
273
+ it('should handle higher delegation fee rates', function () {
274
+ assert.doesNotThrow(() => {
275
+ builder.delegationFeeRate(50000); // 5%
276
+ });
277
+ assert.strictEqual(builder['_delegationFeeRate'], 50000);
278
+ });
279
+ it('should handle fee rate validation edge cases', function () {
280
+ // Just below minimum (2%)
281
+ assert.throws(() => builder.delegationFeeRate(19999), sdk_core_1.BuildTransactionError);
282
+ // Just at minimum
283
+ assert.doesNotThrow(() => builder.delegationFeeRate(20000));
284
+ });
285
+ it('should maintain validator-specific properties after operations', function () {
286
+ builder.delegationFeeRate(25000); // 2.5%
287
+ builder.nodeID('NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
288
+ assert.strictEqual(builder['_delegationFeeRate'], 25000);
289
+ assert.strictEqual(builder['_nodeID'], 'NodeID-7Xhw2mDxuDS44j42TCB6U5579esbSt3Lg');
290
+ });
291
+ });
292
+ });
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yVHhCdWlsZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdmFsaWRhdG9yVHhCdWlsZGVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBdUM7QUFDdkMsOENBQXlFO0FBQ3pFLCtDQUFpQztBQUNqQyx5RUFBc0U7QUFDdEUseUVBQXNFO0FBRXRFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixNQUFNLFVBQVUsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLElBQUksT0FBMkIsQ0FBQztJQUVoQyxVQUFVLENBQUM7UUFDVCxPQUFPLEdBQUcsSUFBSSx1Q0FBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLFlBQVksdUNBQWtCLENBQUMsQ0FBQztZQUNqRCxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sWUFBWSx1Q0FBa0IsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsMEJBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtZQUN6RCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFD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QUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsMENBQTBDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgVmFsaWRhdG9yVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi92YWxpZGF0b3JUeEJ1aWxkZXInO1xuaW1wb3J0IHsgRGVsZWdhdG9yVHhCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi9kZWxlZ2F0b3JUeEJ1aWxkZXInO1xuXG5kZXNjcmliZSgnVmFsaWRhdG9yVHhCdWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KCd0ZmxycCcpO1xuICBsZXQgYnVpbGRlcjogVmFsaWRhdG9yVHhCdWlsZGVyO1xuXG4gIGJlZm9yZUVhY2goZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkZXIgPSBuZXcgVmFsaWRhdG9yVHhCdWlsZGVyKGNvaW5Db25maWcpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ29uc3RydWN0b3InLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbml0aWFsaXplIHdpdGggY29pbiBjb25maWcnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQub2soYnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIFZhbGlkYXRvclR4QnVpbGRlcik7XG4gICAgICBhc3NlcnQub2soYnVpbGRlciBpbnN0YW5jZW9mIERlbGVnYXRvclR4QnVpbGRlcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCB0cmFuc2FjdGlvbiB0eXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ3RyYW5zYWN0aW9uVHlwZSddLCBUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5pdGlhbGl6ZSB3aXRoIHVuZGVmaW5lZCBkZWxlZ2F0aW9uIGZlZSByYXRlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZGVsZWdhdGlvbkZlZVJhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBzZXQgdmFsaWQgZGVsZWdhdGlvbiBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApOyAvLyAyLjUlXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgMjUwMDApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgbmVnYXRpdmUgZGVsZWdhdGlvbiBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKC0xMDAwKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlamVjdCBkZWxlZ2F0aW9uIGZlZSByYXRlIGJlbG93IG1pbmltdW0gKDIlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDE5OTk5KTsgLy8gQmVsb3cgMiVcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBtaW5pbXVtIGRlbGVnYXRpb24gZmVlIHJhdGUgKDIlKScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDIwMDAwKTsgLy8gRXhhY3RseSAyJVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFjY2VwdCBkZWxlZ2F0aW9uIGZlZSByYXRlIGFib3ZlIG1pbmltdW0nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgzMDAwMCk7IC8vIDMlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1heGltdW0gcG9zc2libGUgZGVsZWdhdGlvbiBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDEwMDAwMDApOyAvLyAxMDAlXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdXBkYXRlIGRlbGVnYXRpb24gZmVlIHJhdGUgd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgMjUwMDApO1xuXG4gICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDMwMDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgMzAwMDApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnTWV0aG9kIGNoYWluaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYWxsb3cgbWV0aG9kIGNoYWluaW5nIHdpdGggZGVsZWdhdGlvbiBmZWUgcmF0ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXJcbiAgICAgICAgLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKSAvLyAyLjUlXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKVxuICAgICAgICAuc3RhcnRUaW1lKDE2NDA5OTUyMDApXG4gICAgICAgIC5lbmRUaW1lKDE2NDEwODE2MDApXG4gICAgICAgIC5zdGFrZUFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwocmVzdWx0LCBidWlsZGVyKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZGVsZWdhdGlvbkZlZVJhdGUnXSwgMjUwMDApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19ub2RlSUQnXSwgJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfc3RhcnRUaW1lJ10sIDE2NDA5OTUyMDBuKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfZW5kVGltZSddLCAxNjQxMDgxNjAwbik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX3N0YWtlQW1vdW50J10sIDEwMDAwMDAwMDAwMDAwMDAwMDBuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2hhaW4gd2l0aCBhbGwgZGVsZWdhdG9yIG1ldGhvZHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKVxuICAgICAgICAuc3RhcnRUaW1lKDE2NDA5OTUyMDApXG4gICAgICAgIC5lbmRUaW1lKDE2NDEwODE2MDApXG4gICAgICAgIC5zdGFrZUFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCkgLy8gMi41JVxuICAgICAgICAucmV3YXJkQWRkcmVzc2VzKFsnUC1mbGFyZTF4MHI1aDBsOHc2bmozazJwMGQ1Zzl0NWI4djNhOWsxbSddKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDI1MDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd29yayB3aGVuIGRlbGVnYXRpb24gZmVlIHJhdGUgaXMgc2V0IGZpcnN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMzAwMDApIC8vIDMlXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDMwMDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfbm9kZUlEJ10sICdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHdvcmsgd2hlbiBkZWxlZ2F0aW9uIGZlZSByYXRlIGlzIHNldCBsYXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApOyAvLyAyLjUlXG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCAyNTAwMCk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX25vZGVJRCddLCAnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnSW5oZXJpdGFuY2UgZnJvbSBEZWxlZ2F0b3JUeEJ1aWxkZXInLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IG5vZGVJRCBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX25vZGVJRCddLCAnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IHN0YXJ0VGltZSBtZXRob2QnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBidWlsZGVyLnN0YXJ0VGltZSgxNjQwOTk1MjAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19zdGFydFRpbWUnXSwgMTY0MDk5NTIwMG4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IGVuZFRpbWUgbWV0aG9kJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5lbmRUaW1lKDE2NDEwODE2MDApO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlc3VsdCwgYnVpbGRlcik7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2VuZFRpbWUnXSwgMTY0MTA4MTYwMG4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IHN0YWtlQW1vdW50IG1ldGhvZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGJ1aWxkZXIuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19zdGFrZUFtb3VudCddLCAxMDAwMDAwMDAwMDAwMDAwMDAwbik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGluaGVyaXQgcmV3YXJkQWRkcmVzc2VzIG1ldGhvZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IFsnUC1mbGFyZTF4MHI1aDBsOHc2bmozazJwMGQ1Zzl0NWI4djNhOWsxbSddO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYnVpbGRlci5yZXdhcmRBZGRyZXNzZXMoYWRkcmVzc2VzKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChyZXN1bHQsIGJ1aWxkZXIpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwoKGJ1aWxkZXIgYXMgYW55KS50cmFuc2FjdGlvbi5fcmV3YXJkQWRkcmVzc2VzLCBhZGRyZXNzZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IHZhbGlkYXRpb24gZnJvbSBkZWxlZ2F0b3IgbWV0aG9kcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFNob3VsZCBpbmhlcml0IG5vZGUgSUQgdmFsaWRhdGlvbiAtIGVtcHR5IG5vZGUgSUQgc2hvdWxkIHRocm93XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci5ub2RlSUQoJycpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcblxuICAgICAgLy8gU2hvdWxkIGluaGVyaXQgdGltZSB2YWxpZGF0aW9uIC0gbmVnYXRpdmUgdGltZSBzaG91bGQgdGhyb3dcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnN0YXJ0VGltZSgtMSk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuXG4gICAgICAvLyBTaG91bGQgaW5oZXJpdCBzdGFrZSBhbW91bnQgdmFsaWRhdGlvbiAtIG5lZ2F0aXZlIGFtb3VudCBzaG91bGQgdGhyb3dcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBidWlsZGVyLnN0YWtlQW1vdW50KC0xMDAwKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2FjdGlvbiBidWlsZGluZyB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVxdWlyZSBkZWxlZ2F0aW9uIGZlZSByYXRlIGZvciB2YWxpZGF0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAucmV3YXJkQWRkcmVzc2VzKFsnUC1mbGFyZTF4MHI1aDBsOHc2bmozazJwMGQ1Zzl0NWI4djNhOWsxbSddKTtcblxuICAgICAgLy8gVmFsaWRhdG9yIGJ1aWxkZXIgc2hvdWxkIGZhaWwgdmFsaWRhdGlvbiB3aXRob3V0IGRlbGVnYXRpb24gZmVlIHJhdGUgKDAgaXMgaW52YWxpZClcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXdhaXQgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHBhc3MgdmFsaWRhdGlvbiB3aXRoIGRlbGVnYXRpb24gZmVlIHJhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKVxuICAgICAgICAuc3RhcnRUaW1lKDE2NDA5OTUyMDApXG4gICAgICAgIC5lbmRUaW1lKDE2NDEwODE2MDApXG4gICAgICAgIC5zdGFrZUFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCkgLy8gMi41JVxuICAgICAgICAucmV3YXJkQWRkcmVzc2VzKFsnUC1mbGFyZTF4MHI1aDBsOHc2bmozazJwMGQ1Zzl0NWI4djNhOWsxbSddKTtcblxuICAgICAgYXdhaXQgYXNzZXJ0LmRvZXNOb3RSZWplY3QoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhd2FpdCAoYnVpbGRlciBhcyBhbnkpLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlcXVpcmUgYWxsIGRlbGVnYXRvciBmaWVsZHMnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDI1MDAwKTsgLy8gMi41JVxuXG4gICAgICAvLyBTaG91bGQgc3RpbGwgZmFpbCB3aXRob3V0IG90aGVyIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhd2FpdCAoYnVpbGRlciBhcyBhbnkpLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2J1aWxkRmxhcmVUcmFuc2FjdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJlamVjdCBidWlsZGluZyB3aXRob3V0IGRlbGVnYXRpb24gZmVlIHJhdGUnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBidWlsZGVyXG4gICAgICAgIC5ub2RlSUQoJ05vZGVJRC03WGh3Mm1EeHVEUzQ0ajQyVENCNlU1NTc5ZXNiU3QzTGcnKVxuICAgICAgICAuc3RhcnRUaW1lKDE2NDA5OTUyMDApXG4gICAgICAgIC5lbmRUaW1lKDE2NDEwODE2MDApXG4gICAgICAgIC5zdGFrZUFtb3VudCgnMTAwMDAwMDAwMDAwMDAwMDAwMCcpXG4gICAgICAgIC5yZXdhcmRBZGRyZXNzZXMoWydQLWZsYXJlMXgwcjVoMGw4dzZuajNrMnAwZDVnOXQ1Yjh2M2E5azFtJ10pO1xuXG4gICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGF3YWl0IChidWlsZGVyIGFzIGFueSkuYnVpbGRGbGFyZVRyYW5zYWN0aW9uKCk7XG4gICAgICB9LCBCdWlsZFRyYW5zYWN0aW9uRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgYnVpbGRpbmcgd2l0aG91dCByZXF1aXJlZCBkZWxlZ2F0b3IgZmllbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlci5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCk7IC8vIDIuNSVcblxuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICBhd2FpdCAoYnVpbGRlciBhcyBhbnkpLmJ1aWxkRmxhcmVUcmFuc2FjdGlvbigpO1xuICAgICAgfSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYnVpbGQgdHJhbnNhY3Rpb24gd2l0aCBhbGwgcmVxdWlyZWQgZmllbGRzJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgYnVpbGRlclxuICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgLnN0YXJ0VGltZSgxNjQwOTk1MjAwKVxuICAgICAgICAuZW5kVGltZSgxNjQxMDgxNjAwKVxuICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApIC8vIDIuNSVcbiAgICAgICAgLnJld2FyZEFkZHJlc3NlcyhbJ1AtZmxhcmUxeDByNWgwbDh3Nm5qM2sycDBkNWc5dDViOHYzYTlrMW0nXSk7XG5cbiAgICAgIGF3YWl0IGFzc2VydC5kb2VzTm90UmVqZWN0KGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgYXdhaXQgKGJ1aWxkZXIgYXMgYW55KS5idWlsZEZsYXJlVHJhbnNhY3Rpb24oKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmhlcml0IHRpbWUgdmFsaWRhdGlvbiBmcm9tIGRlbGVnYXRvciBidWlsZGVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGltZSB2YWxpZGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkgd2hlbiBzZXR0aW5nIHZhbHVlc1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXJcbiAgICAgICAgICAubm9kZUlEKCdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJylcbiAgICAgICAgICAuc3RhcnRUaW1lKDE2NDEwODE2MDApXG4gICAgICAgICAgLmVuZFRpbWUoMTY0MDk5NTIwMCkgLy8gRW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWVcbiAgICAgICAgICAuc3Rha2VBbW91bnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAnKVxuICAgICAgICAgIC5kZWxlZ2F0aW9uRmVlUmF0ZSgyNTAwMCk7IC8vIDIuNSVcbiAgICAgIH0sIEJ1aWxkVHJhbnNhY3Rpb25FcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFZGdlIGNhc2VzIGFuZCB2YWxpZGF0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgaGFuZGxlIG1pbmltdW0gZGVsZWdhdGlvbiBmZWUgcmF0ZSAoMiUpJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMjAwMDApOyAvLyAyJVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDIwMDAwKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFuZGxlIGhpZ2hlciBkZWxlZ2F0aW9uIGZlZSByYXRlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDUwMDAwKTsgLy8gNSVcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGJ1aWxkZXJbJ19kZWxlZ2F0aW9uRmVlUmF0ZSddLCA1MDAwMCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhbmRsZSBmZWUgcmF0ZSB2YWxpZGF0aW9uIGVkZ2UgY2FzZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBKdXN0IGJlbG93IG1pbmltdW0gKDIlKVxuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiBidWlsZGVyLmRlbGVnYXRpb25GZWVSYXRlKDE5OTk5KSwgQnVpbGRUcmFuc2FjdGlvbkVycm9yKTtcblxuICAgICAgLy8gSnVzdCBhdCBtaW5pbXVtXG4gICAgICBhc3NlcnQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMjAwMDApKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFpbnRhaW4gdmFsaWRhdG9yLXNwZWNpZmljIHByb3BlcnRpZXMgYWZ0ZXIgb3BlcmF0aW9ucycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGJ1aWxkZXIuZGVsZWdhdGlvbkZlZVJhdGUoMjUwMDApOyAvLyAyLjUlXG4gICAgICBidWlsZGVyLm5vZGVJRCgnTm9kZUlELTdYaHcybUR4dURTNDRqNDJUQ0I2VTU1Nzllc2JTdDNMZycpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYnVpbGRlclsnX2RlbGVnYXRpb25GZWVSYXRlJ10sIDI1MDAwKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChidWlsZGVyWydfbm9kZUlEJ10sICdOb2RlSUQtN1hodzJtRHh1RFM0NGo0MlRDQjZVNTU3OWVzYlN0M0xnJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=