occam-languages 3.0.30 → 3.0.32

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.
@@ -70,35 +70,31 @@ _export(exports, {
70
70
  return some;
71
71
  }
72
72
  });
73
- const _necessary = require("necessary");
74
- const { filter: arrayFilter } = _necessary.arrayUtilities;
75
73
  function one(array, callback, ...initialArguments) {
76
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
77
- function next(index, ...nextArguments) {
74
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
75
+ function next(index, count, ...nextArguments) {
78
76
  if (index === length) {
79
- if (count !== 1) {
77
+ if (count === 0) {
80
78
  return back();
81
79
  }
82
80
  return forward(...nextArguments, back);
83
81
  }
84
82
  const element = array[index];
85
83
  return callback(element, ...initialArguments, (...forwardArguments)=>{
86
- forwardArguments.pop(); ///
87
- count++;
88
- if (count === 2) {
84
+ if (count === 1) {
89
85
  return back();
90
86
  }
91
- return next(index + 1, ...forwardArguments);
92
- }, (...backArguments)=>{
93
- const exception = backArguments.pop();
87
+ forwardArguments.pop(); ///
88
+ return next(index + 1, count + 1, ...forwardArguments);
89
+ }, (exception)=>{
94
90
  if (exception) {
95
91
  return back(exception);
96
92
  }
97
- return next(index + 1, ...nextArguments);
93
+ return next(index + 1, count, ...nextArguments);
98
94
  }, index);
99
95
  }
100
- let count = 0;
101
- return next(index, ...initialArguments);
96
+ const index = 0, count = 0;
97
+ return next(index, count);
102
98
  }
103
99
  function some(array, callback, ...initialArguments) {
104
100
  const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
@@ -107,8 +103,7 @@ function some(array, callback, ...initialArguments) {
107
103
  return back();
108
104
  }
109
105
  const element = array[index];
110
- return callback(element, ...initialArguments, forward, (...backArguments)=>{
111
- const exception = backArguments.pop();
106
+ return callback(element, ...initialArguments, forward, (exception)=>{
112
107
  if (exception) {
113
108
  return back(exception);
114
109
  }
@@ -119,8 +114,9 @@ function some(array, callback, ...initialArguments) {
119
114
  return next(index);
120
115
  }
121
116
  function each(array, callback, ...initialArguments) {
122
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
123
- function next(index, ...nextArguments) {
117
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
118
+ function next(index, count, ...nextArguments) {
119
+ const back = nextArguments.pop();
124
120
  if (index === length) {
125
121
  if (count === 0) {
126
122
  return back();
@@ -129,104 +125,84 @@ function each(array, callback, ...initialArguments) {
129
125
  }
130
126
  const element = array[index];
131
127
  return callback(element, ...nextArguments, (...forwardArguments)=>{
132
- forwardArguments.pop(); ///
133
- count++;
134
- return next(index + 1, ...forwardArguments);
128
+ return next(index + 1, count + 1, ...forwardArguments);
135
129
  }, back, index);
136
130
  }
137
- let count = 0;
138
- return next(index, ...initialArguments);
131
+ const index = 0, count = 0;
132
+ return next(index, count, ...initialArguments, back);
139
133
  }
140
134
  function every(array, callback, ...initialArguments) {
141
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
135
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
142
136
  function next(index, ...nextArguments) {
137
+ const back = nextArguments.pop();
143
138
  if (index === length) {
144
139
  return forward(...nextArguments, back);
145
140
  }
146
141
  const element = array[index];
147
142
  return callback(element, ...nextArguments, (...forwardArguments)=>{
148
- forwardArguments.pop(); ///
149
143
  return next(index + 1, ...forwardArguments);
150
144
  }, back, index);
151
145
  }
152
- return next(index, ...initialArguments);
146
+ const index = 0;
147
+ return next(index, ...initialArguments, back);
153
148
  }
154
149
  function map(array, callback, ...initialArguments) {
155
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
150
+ const back = initialArguments.pop(), forward = initialArguments.pop(), arrayA = array, arrayB = [], length = array.length;
156
151
  function next(index, arrayB, ...nextArguments) {
152
+ const back = nextArguments.pop();
157
153
  if (index === length) {
158
154
  return forward(arrayB, ...nextArguments, back);
159
155
  }
160
156
  const elementA = arrayA[index];
161
157
  return callback(elementA, ...nextArguments, (elementB, ...forwardArguments)=>{
162
- forwardArguments.pop(); ///
163
- arrayB = [
158
+ return next(index + 1, [
164
159
  ...arrayB,
165
160
  elementB
166
- ];
167
- return next(index + 1, arrayB, ...forwardArguments);
161
+ ], ...forwardArguments);
168
162
  }, back, index);
169
163
  }
170
- const arrayA = array, arrayB = [];
171
- return next(index, arrayB, ...initialArguments);
172
- }
173
- function find(array, callback, ...initialArguments) {
174
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
175
- function next(index, ...nextArguments) {
176
- if (index === length) {
177
- return back();
178
- }
179
- const element = array[index];
180
- return callback(element, ...nextArguments, (...forwardArguments)=>{
181
- forwardArguments.pop(); ///
182
- return forward(element, ...forwardArguments, back);
183
- }, (...backArguments)=>{
184
- const exception = backArguments.pop();
185
- if (exception) {
186
- return back(exception);
187
- }
188
- return next(index + 1, ...nextArguments);
189
- }, index);
190
- }
191
- return next(index, ...initialArguments);
164
+ const index = 0;
165
+ return next(index, arrayB, ...initialArguments, back);
192
166
  }
193
167
  function reduce(array, initialValue, callback, ...initialArguments) {
194
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
168
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
195
169
  function next(index, value, ...nextArguments) {
170
+ const back = nextArguments.pop();
196
171
  if (index === length) {
197
172
  return forward(value, ...nextArguments, back);
198
173
  }
199
174
  const element = array[index];
200
175
  return callback(element, value, ...nextArguments, (value, ...forwardArguments)=>{
201
- forwardArguments.pop(); ///
202
176
  return next(index + 1, value, ...forwardArguments);
203
177
  }, back, index);
204
178
  }
205
- return next(index, initialValue, ...initialArguments);
179
+ const index = 0;
180
+ return next(index, initialValue, ...initialArguments, back);
206
181
  }
207
182
  function forEach(array, callback, ...initialArguments) {
208
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
183
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
209
184
  function next(index, ...nextArguments) {
185
+ const back = nextArguments.pop();
210
186
  if (index === length) {
211
187
  return forward(...nextArguments, back);
212
188
  }
213
189
  const element = array[index];
214
190
  return callback(element, ...nextArguments, (...forwardArguments)=>{
215
- forwardArguments.pop(); ///
216
191
  return next(index + 1, ...forwardArguments);
217
192
  }, back, index);
218
193
  }
219
- return next(index, ...initialArguments);
194
+ const index = 0;
195
+ return next(index, ...initialArguments, back);
220
196
  }
221
197
  function filter(array, callback, ...initialArguments) {
222
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, deletedElements = [], index = length - 1;
198
+ const back = initialArguments.pop(), forward = initialArguments.pop(), deletedElements = [], length = array.length;
223
199
  function next(index, ...nextArguments) {
200
+ const back = nextArguments.pop();
224
201
  if (index === -1) {
225
202
  return forward(deletedElements, ...nextArguments, back);
226
203
  }
227
204
  const element = array[index];
228
205
  return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
229
- forwardArguments.pop(); ///
230
206
  if (!passed) {
231
207
  const startIndex = index, deleteCount = 1, deletedElement = element; ///
232
208
  array.splice(startIndex, deleteCount);
@@ -235,163 +211,181 @@ function filter(array, callback, ...initialArguments) {
235
211
  return next(index - 1, ...forwardArguments);
236
212
  }, back, index);
237
213
  }
238
- return next(index, ...initialArguments);
214
+ const index = length - 1;
215
+ return next(index, ...initialArguments, back);
239
216
  }
240
217
  function prune(array, callback, ...initialArguments) {
241
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
218
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
242
219
  function next(index, ...nextArguments) {
220
+ const back = nextArguments.pop();
243
221
  if (index === length) {
244
222
  const deletedElement = undefined;
245
223
  return forward(deletedElement, ...nextArguments, back);
246
224
  }
247
225
  const element = array[index];
248
226
  return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
249
- forwardArguments.pop(); ///
250
227
  if (!passed) {
251
228
  const startIndex = index, deleteCount = 1, deletedElement = element; ///
252
229
  array.splice(startIndex, deleteCount);
253
- return forward(deletedElement, ...forwardArguments, back);
230
+ return forward(deletedElement, ...forwardArguments);
254
231
  }
255
232
  return next(index + 1, ...forwardArguments);
256
233
  }, back, index);
257
234
  }
258
- return next(index, ...initialArguments);
235
+ const index = 0;
236
+ return next(index, ...initialArguments, back);
259
237
  }
260
238
  function extract(array, callback, ...initialArguments) {
261
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
239
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
262
240
  function next(index, ...nextArguments) {
241
+ const back = nextArguments.pop();
263
242
  if (index === length) {
264
243
  const deletedElement = undefined;
265
244
  return forward(deletedElement, ...nextArguments, back);
266
245
  }
267
246
  const element = array[index];
268
247
  return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
269
- forwardArguments.pop(); ///
270
248
  if (passed) {
271
249
  const startIndex = index, deleteCount = 1, deletedElement = element; ///
272
250
  array.splice(startIndex, deleteCount);
273
- return forward(deletedElement, ...forwardArguments, back);
251
+ return forward(deletedElement, ...forwardArguments);
274
252
  }
275
253
  return next(index + 1, ...forwardArguments);
276
254
  }, back, index);
277
255
  }
278
- return next(index, ...initialArguments);
256
+ const index = 0;
257
+ return next(index, ...initialArguments, back);
279
258
  }
280
- function match(arrayA, arrayB, callback, ...initialArguments) {
281
- const back = initialArguments.pop(), forward = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length;
282
- if (arrayALength !== arrayBLength) {
283
- return back();
284
- }
285
- const length = arrayALength, index = 0;
286
- function next(index, ...nextArguments) {
259
+ function find(array, callback, ...initialArguments) {
260
+ const back = initialArguments.pop(), forward = initialArguments.pop(), elements = [], length = array.length;
261
+ function next(index, elements, ...nextArguments) {
262
+ const back = nextArguments.pop();
287
263
  if (index === length) {
288
- return forward(...nextArguments, back);
264
+ return forward(elements, ...nextArguments, back);
289
265
  }
290
- const elementA = arrayA[index], elementB = arrayB[index];
291
- return callback(elementA, elementB, ...nextArguments, (...forwardArguments)=>{
292
- forwardArguments.pop(); ///
293
- return next(index + 1, ...forwardArguments);
266
+ const element = array[index];
267
+ return callback(element, ...nextArguments, (passed, ...forwardArguments)=>{
268
+ if (passed) {
269
+ return next(index + 1, [
270
+ ...elements,
271
+ element
272
+ ], ...forwardArguments);
273
+ }
274
+ return next(index + 1, elements, ...forwardArguments);
294
275
  }, back, index);
295
276
  }
296
- return next(index, ...initialArguments);
277
+ const index = 0;
278
+ return next(index, elements, ...initialArguments, back);
297
279
  }
298
- function resolve(arrayA, arrayB, callback, ...initialArguments) {
299
- arrayA = [
300
- ...arrayA
301
- ];
302
- const back = initialArguments.pop(), forward = initialArguments.pop();
303
- function nextPass(...nextPassArguments) {
304
- const length = arrayA.length; ///
280
+ function resolve(array, callback, ...initialArguments) {
281
+ const back = initialArguments.pop(), forward = initialArguments.pop(), arrayA = array, arrayB = [];
282
+ function next(arrayA, arrayB, ...nextArguments) {
283
+ const back = nextArguments.pop(), length = arrayA.length;
305
284
  if (length === 0) {
306
- return forward(...nextPassArguments, back);
285
+ return forward(arrayB, ...nextArguments, back);
307
286
  }
308
- function nextElement(index, success, ...nextElementArguments) {
309
- if (index === length) {
310
- if (!success) {
311
- return back();
312
- }
313
- arrayFilter(arrayA, (elementA)=>{
314
- const arrayBIncludesElementA = arrayB.includes(elementA);
315
- if (!arrayBIncludesElementA) {
316
- return true;
317
- }
318
- });
319
- return nextPass(...nextElementArguments);
320
- }
321
- const elementA = arrayA[index];
322
- return callback(elementA, ...nextElementArguments, (...forwardArguments)=>{
323
- forwardArguments.pop(); ///
324
- const elementB = elementA; ///
325
- arrayB.push(elementB);
326
- return nextElement(index + 1, true, ...forwardArguments);
327
- }, (...backArguments)=>{
328
- const exception = backArguments.pop();
287
+ return find(arrayA, (element, ...callbackArguments)=>{
288
+ const index = callbackArguments.pop(), back = callbackArguments.pop(), forward = callbackArguments.pop();
289
+ return callback(element, ...callbackArguments, (...forwardArguments)=>{
290
+ const success = true;
291
+ return forward(success, ...forwardArguments);
292
+ }, (exception)=>{
329
293
  if (exception) {
330
294
  return back(exception);
331
295
  }
332
- return nextElement(index + 1, success, ...nextElementArguments);
296
+ const success = false;
297
+ return forward(success, ...callbackArguments, back);
333
298
  }, index);
299
+ }, ...nextArguments, (elements, ...forwardArguments)=>{
300
+ const elementsLength = elements.length;
301
+ if (elementsLength === 0) {
302
+ return back();
303
+ }
304
+ return next(arrayA.filter((element)=>!elements.includes(element)), [
305
+ ...arrayB,
306
+ ...elements
307
+ ], ...forwardArguments);
308
+ }, back);
309
+ }
310
+ return next(arrayA, arrayB, ...initialArguments, back);
311
+ }
312
+ function match(arrayA, arrayB, callback, ...initialArguments) {
313
+ const back = initialArguments.pop(), forward = initialArguments.pop(), arrayALength = arrayA.length, arrayBLength = arrayB.length, length = arrayALength; ///
314
+ if (arrayALength !== arrayBLength) {
315
+ return back();
316
+ }
317
+ function next(index, ...nextArguments) {
318
+ const back = nextArguments.pop();
319
+ if (index === length) {
320
+ return forward(...nextArguments, back);
334
321
  }
335
- const index = 0, success = false;
336
- return nextElement(index, success, ...nextPassArguments);
322
+ const elementA = arrayA[index], elementB = arrayB[index];
323
+ return callback(elementA, elementB, ...nextArguments, (...forwardArguments)=>{
324
+ return next(index + 1, ...forwardArguments);
325
+ }, back, index);
337
326
  }
338
- return nextPass(...initialArguments);
327
+ const index = 0;
328
+ return next(index, ...initialArguments, back);
339
329
  }
340
330
  function forwardsEvery(array, callback, ...initialArguments) {
341
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
331
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
342
332
  function next(index, ...nextArguments) {
333
+ const back = nextArguments.pop();
343
334
  if (index === length) {
344
335
  return forward(...nextArguments, back);
345
336
  }
346
337
  const element = array[index];
347
338
  return callback(element, ...nextArguments, (...forwardArguments)=>{
348
- forwardArguments.pop(); ///
349
339
  return next(index + 1, ...forwardArguments);
350
340
  }, back, index);
351
341
  }
352
- return next(index, ...initialArguments);
342
+ const index = 0;
343
+ return next(index, ...initialArguments, back);
353
344
  }
354
345
  function backwardsEvery(array, callback, ...initialArguments) {
355
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = length - 1;
346
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
356
347
  function next(index, ...nextArguments) {
348
+ const back = nextArguments.pop();
357
349
  if (index === -1) {
358
350
  return forward(...nextArguments, back);
359
351
  }
360
352
  const element = array[index];
361
353
  return callback(element, ...nextArguments, (...forwardArguments)=>{
362
- forwardArguments.pop(); ///
363
354
  return next(index - 1, ...forwardArguments);
364
355
  }, back, index);
365
356
  }
366
- return next(index, ...initialArguments);
357
+ const index = length - 1;
358
+ return next(index, ...initialArguments, back);
367
359
  }
368
360
  function forwardsForEach(array, callback, ...initialArguments) {
369
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = 0;
361
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
370
362
  function next(index, ...nextArguments) {
363
+ const back = nextArguments.pop();
371
364
  if (index === length) {
372
365
  return forward(...nextArguments, back);
373
366
  }
374
367
  const element = array[index];
375
368
  return callback(element, ...nextArguments, (...forwardArguments)=>{
376
- forwardArguments.pop(); ///
377
369
  return next(index + 1, ...forwardArguments);
378
370
  }, back, index);
379
371
  }
380
- return next(index, ...initialArguments);
372
+ const index = 0;
373
+ return next(index, ...initialArguments, back);
381
374
  }
382
375
  function backwardsForEach(array, callback, ...initialArguments) {
383
- const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length, index = length - 1;
376
+ const back = initialArguments.pop(), forward = initialArguments.pop(), length = array.length;
384
377
  function next(index, ...nextArguments) {
378
+ const back = nextArguments.pop();
385
379
  if (index === -1) {
386
380
  return forward(...nextArguments, back);
387
381
  }
388
382
  const element = array[index];
389
383
  return callback(element, ...nextArguments, (...forwardArguments)=>{
390
- forwardArguments.pop(); ///
391
384
  return next(index - 1, ...forwardArguments);
392
385
  }, back, index);
393
386
  }
394
- return next(index, ...initialArguments);
387
+ const index = length - 1;
388
+ return next(index, ...initialArguments, back);
395
389
  }
396
390
  function all(callbacks, ...initialArguments) {
397
391
  return every(callbacks, (callback, ...callbackArguments)=>{
@@ -409,14 +403,14 @@ const _default = {
409
403
  each,
410
404
  every,
411
405
  map,
412
- find,
413
406
  reduce,
414
407
  forEach,
415
408
  filter,
416
409
  prune,
417
410
  extract,
418
- match,
411
+ find,
419
412
  resolve,
413
+ match,
420
414
  forwardsEvery,
421
415
  backwardsEvery,
422
416
  forwardsForEach,
@@ -425,4 +419,4 @@ const _default = {
425
419
  exists
426
420
  };
427
421
 
428
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuY29uc3QgeyBmaWx0ZXI6IGFycmF5RmlsdGVyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIG9uZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGlmIChjb3VudCAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgY291bnQrKztcblxuICAgICAgICBpZiAoY291bnQgPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAoLi4uYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgICBjb25zdCBleGNlcHRpb24gPSBiYWNrQXJndW1lbnRzLnBvcCgpO1xuXG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYmFjayhleGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5uZXh0QXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBsZXQgY291bnQgPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICBmb3J3YXJkLFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIGNvdW50Kys7XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgbGV0IGNvdW50ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXAoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGFycmF5QiwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEEgPSBhcnJheUFbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudEEsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKGVsZW1lbnRCLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBhcnJheUIgPSBbICAvLy9cbiAgICAgICAgICAuLi5hcnJheUIsXG4gICAgICAgICAgZWxlbWVudEJcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIGFycmF5QiwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGFycmF5QSA9IGFycmF5LCAvLy9cbiAgICAgICAgYXJyYXlCID0gW107XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGFycmF5QiwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIGZvcndhcmQoZWxlbWVudCwgLi4uZm9yd2FyZEFyZ3VtZW50cywgYmFjayk7XG4gICAgICB9LFxuICAgICAgKC4uLmJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IDA7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgdmFsdWUsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQodmFsdWUsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWUsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGluaXRpYWxWYWx1ZSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlcihhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cyA9IFtdLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50cywgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBydW5lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgY29uc3QgZGVsZXRlZEVsZW1lbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKGRlbGV0ZWRFbGVtZW50LCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAocGFzc2VkLCAuLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMsIGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aDtcblxuICBpZiAoYXJyYXlBTGVuZ3RoICE9PSBhcnJheUJMZW5ndGgpIHtcbiAgICByZXR1cm4gYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyYXlBTGVuZ3RoLCAgLy8vXG4gICAgICAgIGluZGV4ID0gMDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XSxcbiAgICAgICAgICBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50QSxcbiAgICAgIGVsZW1lbnRCLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBhcnJheUEgPSBbICAvLy9cbiAgICAuLi5hcnJheUFcbiAgXTtcblxuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCk7XG5cbiAgZnVuY3Rpb24gbmV4dFBhc3MoLi4ubmV4dFBhc3NBcmd1bWVudHMpIHtcbiAgICBjb25zdCBsZW5ndGggPSBhcnJheUEubGVuZ3RoOyAvLy9cblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRQYXNzQXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBuZXh0RWxlbWVudChpbmRleCwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpIHtcbiAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICAgIH1cblxuICAgICAgICBhcnJheUZpbHRlcihhcnJheUEsIChlbGVtZW50QSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFycmF5QkluY2x1ZGVzRWxlbWVudEEgPSBhcnJheUIuaW5jbHVkZXMoZWxlbWVudEEpO1xuXG4gICAgICAgICAgaWYgKCFhcnJheUJJbmNsdWRlc0VsZW1lbnRBKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXh0UGFzcyguLi5uZXh0RWxlbWVudEFyZ3VtZW50cyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICBlbGVtZW50QSxcbiAgICAgICAgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMsXG4gICAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgICAgY29uc3QgZWxlbWVudEIgPSBlbGVtZW50QTsgIC8vL1xuXG4gICAgICAgICAgYXJyYXlCLnB1c2goZWxlbWVudEIpO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgdHJ1ZSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG4gICAgICAgICguLi5iYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gYmFja0FyZ3VtZW50cy5wb3AoKTtcblxuICAgICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBiYWNrKGV4Y2VwdGlvbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4ICsgMSwgc3VjY2VzcywgLi4ubmV4dEVsZW1lbnRBcmd1bWVudHMpO1xuICAgICAgICB9LFxuICAgICAgICBpbmRleFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbmRleCA9IDAsXG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgcmV0dXJuIG5leHRFbGVtZW50KGluZGV4LCBzdWNjZXNzLCAuLi5uZXh0UGFzc0FyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gbmV4dFBhc3MoLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBmb3J3YXJkQXJndW1lbnRzLnBvcCgpOyAgLy8vXG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcbiAgICAgICAgaW5kZXggPSAwO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgZm9yd2FyZEFyZ3VtZW50cy5wb3AoKTsgIC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLFxuICAgICAgICBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7ICAvLy9cblxuICAgICAgICByZXR1cm4gbmV4dChpbmRleCAtIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGwoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBldmVyeShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5pbml0aWFsQXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhjYWxsYmFja3MsIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgcmV0dXJuIHNvbWUoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgb25lLFxuICBzb21lLFxuICBlYWNoLFxuICBldmVyeSxcbiAgbWFwLFxuICBmaW5kLFxuICByZWR1Y2UsXG4gIGZvckVhY2gsXG4gIGZpbHRlcixcbiAgcHJ1bmUsXG4gIGV4dHJhY3QsXG4gIG1hdGNoLFxuICByZXNvbHZlLFxuICBmb3J3YXJkc0V2ZXJ5LFxuICBiYWNrd2FyZHNFdmVyeSxcbiAgZm9yd2FyZHNGb3JFYWNoLFxuICBiYWNrd2FyZHNGb3JFYWNoLFxuICBhbGwsXG4gIGV4aXN0c1xufTtcbiJdLCJuYW1lcyI6WyJhbGwiLCJiYWNrd2FyZHNFdmVyeSIsImJhY2t3YXJkc0ZvckVhY2giLCJlYWNoIiwiZXZlcnkiLCJleGlzdHMiLCJleHRyYWN0IiwiZmlsdGVyIiwiZmluZCIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwiZm9yd2FyZHNGb3JFYWNoIiwibWFwIiwibWF0Y2giLCJvbmUiLCJwcnVuZSIsInJlZHVjZSIsInJlc29sdmUiLCJzb21lIiwiYXJyYXlGaWx0ZXIiLCJhcnJheVV0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJpbml0aWFsQXJndW1lbnRzIiwiYmFjayIsInBvcCIsImZvcndhcmQiLCJsZW5ndGgiLCJpbmRleCIsIm5leHQiLCJuZXh0QXJndW1lbnRzIiwiY291bnQiLCJlbGVtZW50IiwiZm9yd2FyZEFyZ3VtZW50cyIsImJhY2tBcmd1bWVudHMiLCJleGNlcHRpb24iLCJhcnJheUIiLCJlbGVtZW50QSIsImFycmF5QSIsImVsZW1lbnRCIiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJkZWxldGVkRWxlbWVudHMiLCJwYXNzZWQiLCJzdGFydEluZGV4IiwiZGVsZXRlQ291bnQiLCJkZWxldGVkRWxlbWVudCIsInNwbGljZSIsInVuc2hpZnQiLCJ1bmRlZmluZWQiLCJhcnJheUFMZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJuZXh0UGFzcyIsIm5leHRQYXNzQXJndW1lbnRzIiwibmV4dEVsZW1lbnQiLCJzdWNjZXNzIiwibmV4dEVsZW1lbnRBcmd1bWVudHMiLCJhcnJheUJJbmNsdWRlc0VsZW1lbnRBIiwiaW5jbHVkZXMiLCJwdXNoIiwiY2FsbGJhY2tzIiwiY2FsbGJhY2tBcmd1bWVudHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQXduQmdCQTtlQUFBQTs7UUF2RkFDO2VBQUFBOztRQTBEQUM7ZUFBQUE7O1FBeUNoQjtlQUFBOztRQTNpQmdCQztlQUFBQTs7UUFxQ0FDO2VBQUFBOztRQWdnQkFDO2VBQUFBOztRQTdRQUM7ZUFBQUE7O1FBakZBQztlQUFBQTs7UUFoR0FDO2VBQUFBOztRQW1FQUM7ZUFBQUE7O1FBaVFBQztlQUFBQTs7UUEwREFDO2VBQUFBOztRQW5hQUM7ZUFBQUE7O1FBK1BBQztlQUFBQTs7UUFwWkFDO2VBQUFBOztRQWtVQUM7ZUFBQUE7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
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCBjb3VudCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBpZiAoY291bnQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5pbml0aWFsQXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcndhcmRBcmd1bWVudHMucG9wKCk7IC8vL1xuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgY291bnQgKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICAoZXhjZXB0aW9uKSA9PiB7XG4gICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYmFjayhleGNlcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCBjb3VudCwgLi4ubmV4dEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwLFxuICAgICAgICBjb3VudCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGNvdW50KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgpIHtcbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLmluaXRpYWxBcmd1bWVudHMsXG4gICAgICBmb3J3YXJkLFxuICAgICAgKGV4Y2VwdGlvbikgPT4ge1xuICAgICAgICBpZiAoZXhjZXB0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSk7XG4gICAgICB9LFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIGNvdW50LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBiYWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgY291bnQgKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwLFxuICAgICAgICBjb3VudCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGNvdW50LCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBhcnJheUEgPSBhcnJheSwgLy8vXG4gICAgICAgIGFycmF5QiA9IFtdLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50QSA9IGFycmF5QVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50QSxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoZWxlbWVudEIsIC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCBbIC4uLmFycmF5QiwgZWxlbWVudEIgXSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgYXJyYXlCLCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZHVjZShhcnJheSwgaW5pdGlhbFZhbHVlLCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCB2YWx1ZSwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKHZhbHVlLCAuLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIHZhbHVlLFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICh2YWx1ZSwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIHZhbHVlLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCBpbml0aWFsVmFsdWUsIC4uLmluaXRpYWxBcmd1bWVudHMsIGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cywgYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZGVsZXRlZEVsZW1lbnRzID0gW10sXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudHMsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIChwYXNzZWQsIC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gaW5kZXgsIC8vL1xuICAgICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgICBkZWxldGVkRWxlbWVudCA9IGVsZW1lbnQ7IC8vL1xuXG4gICAgICAgICAgYXJyYXkuc3BsaWNlKHN0YXJ0SW5kZXgsIGRlbGV0ZUNvdW50KTtcblxuICAgICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4IC0gMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cywgYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcnVuZShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIGNvbnN0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gZm9yd2FyZChkZWxldGVkRWxlbWVudCwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKHBhc3NlZCwgLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBjb25zdCBiYWNrID0gbmV4dEFyZ3VtZW50cy5wb3AoKTtcblxuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICBjb25zdCBkZWxldGVkRWxlbWVudCA9IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIChwYXNzZWQsIC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpbmRleCwgLy8vXG4gICAgICAgICAgICAgICAgZGVsZXRlQ291bnQgPSAxLFxuICAgICAgICAgICAgICAgIGRlbGV0ZWRFbGVtZW50ID0gZWxlbWVudDsgLy8vXG5cbiAgICAgICAgICBhcnJheS5zcGxpY2Uoc3RhcnRJbmRleCwgZGVsZXRlQ291bnQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZvcndhcmQoZGVsZXRlZEVsZW1lbnQsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggKyAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmQoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZWxlbWVudHMgPSBbXSxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIGVsZW1lbnRzLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IGxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoZWxlbWVudHMsIC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgIChwYXNzZWQsIC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgWyAuLi5lbGVtZW50cywgZWxlbWVudCBdLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgZWxlbWVudHMsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIGVsZW1lbnRzLCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoYXJyYXksIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBID0gYXJyYXksIC8vL1xuICAgICAgICBhcnJheUIgPSBbXTtcblxuICBmdW5jdGlvbiBuZXh0KGFycmF5QSwgYXJyYXlCLCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCksXG4gICAgICAgICAgbGVuZ3RoID0gYXJyYXlBLmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKGFycmF5QiwgLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpbmQoXG4gICAgICBhcnJheUEsXG4gICAgICAoZWxlbWVudCwgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjYWxsYmFja0FyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgICAgICAgYmFjayA9IGNhbGxiYWNrQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICAgICAgICBmb3J3YXJkID0gY2FsbGJhY2tBcmd1bWVudHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgLi4uY2FsbGJhY2tBcmd1bWVudHMsXG4gICAgICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgICAgICAgICByZXR1cm4gZm9yd2FyZChzdWNjZXNzLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChleGNlcHRpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChleGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGJhY2soZXhjZXB0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm4gZm9yd2FyZChzdWNjZXNzLCAuLi5jYWxsYmFja0FyZ3VtZW50cywgYmFjayk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoZWxlbWVudHMsIC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNMZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGVsZW1lbnRzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KFxuICAgICAgICAgIGFycmF5QS5maWx0ZXIoKGVsZW1lbnQpID0+ICFlbGVtZW50cy5pbmNsdWRlcyhlbGVtZW50KSksXG4gICAgICAgICAgWyAuLi5hcnJheUIsIC4uLmVsZW1lbnRzIF0sXG4gICAgICAgICAgLi4uZm9yd2FyZEFyZ3VtZW50c1xuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGJhY2tcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5leHQoYXJyYXlBLCBhcnJheUIsIC4uLmluaXRpYWxBcmd1bWVudHMsIGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2goYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIGNvbnN0IGJhY2sgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBmb3J3YXJkID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgYXJyYXlBTGVuZ3RoID0gYXJyYXlBLmxlbmd0aCxcbiAgICAgICAgYXJyYXlCTGVuZ3RoID0gYXJyYXlCLmxlbmd0aCxcbiAgICAgICAgbGVuZ3RoID0gYXJyYXlBTGVuZ3RoOyAgLy8vXG5cbiAgaWYgKGFycmF5QUxlbmd0aCAhPT0gYXJyYXlCTGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhY2soKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5leHQoaW5kZXgsIC4uLm5leHRBcmd1bWVudHMpIHtcbiAgICBjb25zdCBiYWNrID0gbmV4dEFyZ3VtZW50cy5wb3AoKTtcblxuICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50QSA9IGFycmF5QVtpbmRleF0sXG4gICAgICAgICAgZWxlbWVudEIgPSBhcnJheUJbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudEEsXG4gICAgICBlbGVtZW50QixcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dChpbmRleCArIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IDA7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMsIGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cywgYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZvcndhcmQoLi4ubmV4dEFyZ3VtZW50cywgYmFjayk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudCA9IGFycmF5W2luZGV4XTtcblxuICAgIHJldHVybiBjYWxsYmFjayhcbiAgICAgIGVsZW1lbnQsXG4gICAgICAuLi5uZXh0QXJndW1lbnRzLFxuICAgICAgKC4uLmZvcndhcmRBcmd1bWVudHMpID0+IHtcbiAgICAgICAgcmV0dXJuIG5leHQoaW5kZXggLSAxLCAuLi5mb3J3YXJkQXJndW1lbnRzKTtcbiAgICAgIH0sXG4gICAgICBiYWNrLFxuICAgICAgaW5kZXhcbiAgICApO1xuICB9XG5cbiAgY29uc3QgaW5kZXggPSBsZW5ndGggLSAxO1xuXG4gIHJldHVybiBuZXh0KGluZGV4LCAuLi5pbml0aWFsQXJndW1lbnRzLCBiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcndhcmRzRm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIC4uLmluaXRpYWxBcmd1bWVudHMpIHtcbiAgY29uc3QgYmFjayA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGZvcndhcmQgPSBpbml0aWFsQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cbiAgZnVuY3Rpb24gbmV4dChpbmRleCwgLi4ubmV4dEFyZ3VtZW50cykge1xuICAgIGNvbnN0IGJhY2sgPSBuZXh0QXJndW1lbnRzLnBvcCgpO1xuXG4gICAgaWYgKGluZGV4ID09PSBsZW5ndGgpIHtcbiAgICAgIHJldHVybiBmb3J3YXJkKC4uLm5leHRBcmd1bWVudHMsIGJhY2spO1xuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBhcnJheVtpbmRleF07XG5cbiAgICByZXR1cm4gY2FsbGJhY2soXG4gICAgICBlbGVtZW50LFxuICAgICAgLi4ubmV4dEFyZ3VtZW50cyxcbiAgICAgICguLi5mb3J3YXJkQXJndW1lbnRzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXh0KGluZGV4ICsgMSwgLi4uZm9yd2FyZEFyZ3VtZW50cyk7XG4gICAgICB9LFxuICAgICAgYmFjayxcbiAgICAgIGluZGV4XG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGluZGV4ID0gMDtcblxuICByZXR1cm4gbmV4dChpbmRleCwgLi4uaW5pdGlhbEFyZ3VtZW50cywgYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICBjb25zdCBiYWNrID0gaW5pdGlhbEFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgZm9yd2FyZCA9IGluaXRpYWxBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblxuICBmdW5jdGlvbiBuZXh0KGluZGV4LCAuLi5uZXh0QXJndW1lbnRzKSB7XG4gICAgY29uc3QgYmFjayA9IG5leHRBcmd1bWVudHMucG9wKCk7XG5cbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm4gZm9yd2FyZCguLi5uZXh0QXJndW1lbnRzLCBiYWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50ID0gYXJyYXlbaW5kZXhdO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKFxuICAgICAgZWxlbWVudCxcbiAgICAgIC4uLm5leHRBcmd1bWVudHMsXG4gICAgICAoLi4uZm9yd2FyZEFyZ3VtZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dChpbmRleCAtIDEsIC4uLmZvcndhcmRBcmd1bWVudHMpO1xuICAgICAgfSxcbiAgICAgIGJhY2ssXG4gICAgICBpbmRleFxuICAgICk7XG4gIH1cblxuICBjb25zdCBpbmRleCA9IGxlbmd0aCAtIDE7XG5cbiAgcmV0dXJuIG5leHQoaW5kZXgsIC4uLmluaXRpYWxBcmd1bWVudHMsIGJhY2spO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsKGNhbGxiYWNrcywgLi4uaW5pdGlhbEFyZ3VtZW50cykge1xuICByZXR1cm4gZXZlcnkoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uaW5pdGlhbEFyZ3VtZW50cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGlzdHMoY2FsbGJhY2tzLCAuLi5pbml0aWFsQXJndW1lbnRzKSB7XG4gIHJldHVybiBzb21lKGNhbGxiYWNrcywgKGNhbGxiYWNrLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayguLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gIH0sIC4uLmluaXRpYWxBcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG9uZSxcbiAgc29tZSxcbiAgZWFjaCxcbiAgZXZlcnksXG4gIG1hcCxcbiAgcmVkdWNlLFxuICBmb3JFYWNoLFxuICBmaWx0ZXIsXG4gIHBydW5lLFxuICBleHRyYWN0LFxuICBmaW5kLFxuICByZXNvbHZlLFxuICBtYXRjaCxcbiAgZm9yd2FyZHNFdmVyeSxcbiAgYmFja3dhcmRzRXZlcnksXG4gIGZvcndhcmRzRm9yRWFjaCxcbiAgYmFja3dhcmRzRm9yRWFjaCxcbiAgYWxsLFxuICBleGlzdHNcbn07XG4iXSwibmFtZXMiOlsiYWxsIiwiYmFja3dhcmRzRXZlcnkiLCJiYWNrd2FyZHNGb3JFYWNoIiwiZWFjaCIsImV2ZXJ5IiwiZXhpc3RzIiwiZXh0cmFjdCIsImZpbHRlciIsImZpbmQiLCJmb3JFYWNoIiwiZm9yd2FyZHNFdmVyeSIsImZvcndhcmRzRm9yRWFjaCIsIm1hcCIsIm1hdGNoIiwib25lIiwicHJ1bmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFycmF5IiwiY2FsbGJhY2siLCJpbml0aWFsQXJndW1lbnRzIiwiYmFjayIsInBvcCIsImZvcndhcmQiLCJsZW5ndGgiLCJuZXh0IiwiaW5kZXgiLCJjb3VudCIsIm5leHRBcmd1bWVudHMiLCJlbGVtZW50IiwiZm9yd2FyZEFyZ3VtZW50cyIsImV4Y2VwdGlvbiIsImFycmF5QSIsImFycmF5QiIsImVsZW1lbnRBIiwiZWxlbWVudEIiLCJpbml0aWFsVmFsdWUiLCJ2YWx1ZSIsImRlbGV0ZWRFbGVtZW50cyIsInBhc3NlZCIsInN0YXJ0SW5kZXgiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsImVsZW1lbnRzIiwiY2FsbGJhY2tBcmd1bWVudHMiLCJzdWNjZXNzIiwiZWxlbWVudHNMZW5ndGgiLCJpbmNsdWRlcyIsImFycmF5QUxlbmd0aCIsImFycmF5Qkxlbmd0aCIsImNhbGxiYWNrcyJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBeW1CZ0JBO2VBQUFBOztRQTFGQUM7ZUFBQUE7O1FBNERBQztlQUFBQTs7UUEwQ2hCO2VBQUE7O1FBdGlCZ0JDO2VBQUFBOztRQW1DQUM7ZUFBQUE7O1FBNmZBQztlQUFBQTs7UUEvU0FDO2VBQUFBOztRQW5GQUM7ZUFBQUE7O1FBNkhBQztlQUFBQTs7UUEzSkFDO2VBQUFBOztRQWtTQUM7ZUFBQUE7O1FBNERBQztlQUFBQTs7UUE3WkFDO2VBQUFBOztRQTJUQUM7ZUFBQUE7O1FBemNBQztlQUFBQTs7UUFvUkFDO2VBQUFBOztRQXRHQUM7ZUFBQUE7O1FBNk5BQztlQUFBQTs7UUE5VkFDO2VBQUFBOzs7QUE3Q1QsU0FBU0osSUFBSUssS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZ0JBQWdCO0lBQ3RELE1BQU1DLE9BQU9ELGlCQUFpQkUsR0FBRyxJQUMzQkMsVUFBVUgsaUJBQWlCRSxHQUFHLElBQzlCRSxTQUFTTixNQUFNTSxNQUFNO0lBRTNCLFNBQVNDLEtBQUtDLEtBQUssRUFBRUMsS0FBSyxFQUFFLEdBQUdDLGFBQWE7UUFDMUMsSUFBSUYsVUFBVUYsUUFBUTtZQUNwQixJQUFJRyxVQUFVLEdBQUc7Z0JBQ2YsT0FBT047WUFDVDtZQUVBLE9BQU9F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