@kato-lee/utilities 1.0.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.
@@ -0,0 +1,948 @@
1
+ let LARGE_ARRAY_SIZE = 200;
2
+ let FUNC_ERROR_TEXT = 'Expected a function';
3
+ let HASH_UNDEFINED = '__lodash_hash_undefined__';
4
+ let UNORDERED_COMPARE_FLAG = 1, PARTIAL_COMPARE_FLAG = 2;
5
+ let INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991;
6
+ let argsTag = '[object Arguments]', arrayTag = '[object Array]', boolTag = '[object Boolean]', dateTag = '[object Date]', errorTag = '[object Error]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]', mapTag = '[object Map]', numberTag = '[object Number]', objectTag = '[object Object]', promiseTag = '[object Promise]', regexpTag = '[object RegExp]', setTag = '[object Set]', stringTag = '[object String]', symbolTag = '[object Symbol]', weakMapTag = '[object WeakMap]';
7
+ let arrayBufferTag = '[object ArrayBuffer]', dataViewTag = '[object DataView]', float32Tag = '[object Float32Array]', float64Tag = '[object Float64Array]', int8Tag = '[object Int8Array]', int16Tag = '[object Int16Array]', int32Tag = '[object Int32Array]', uint8Tag = '[object Uint8Array]', uint8ClampedTag = '[object Uint8ClampedArray]', uint16Tag = '[object Uint16Array]', uint32Tag = '[object Uint32Array]';
8
+ let reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, reLeadingDot = /^\./, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
9
+ let reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
10
+ let reEscapeChar = /\\(\\)?/g;
11
+ let reIsHostCtor = /^\[object .+?Constructor\]$/;
12
+ let reIsUint = /^(?:0|[1-9]\d*)$/;
13
+ let typedArrayTags = {};
14
+ typedArrayTags[float32Tag] =
15
+ typedArrayTags[float64Tag] =
16
+ typedArrayTags[int8Tag] =
17
+ typedArrayTags[int16Tag] =
18
+ typedArrayTags[int32Tag] =
19
+ typedArrayTags[uint8Tag] =
20
+ typedArrayTags[uint8ClampedTag] =
21
+ typedArrayTags[uint16Tag] =
22
+ typedArrayTags[uint32Tag] =
23
+ true;
24
+ typedArrayTags[argsTag] =
25
+ typedArrayTags[arrayTag] =
26
+ typedArrayTags[arrayBufferTag] =
27
+ typedArrayTags[boolTag] =
28
+ typedArrayTags[dataViewTag] =
29
+ typedArrayTags[dateTag] =
30
+ typedArrayTags[errorTag] =
31
+ typedArrayTags[funcTag] =
32
+ typedArrayTags[mapTag] =
33
+ typedArrayTags[numberTag] =
34
+ typedArrayTags[objectTag] =
35
+ typedArrayTags[regexpTag] =
36
+ typedArrayTags[setTag] =
37
+ typedArrayTags[stringTag] =
38
+ typedArrayTags[weakMapTag] =
39
+ false;
40
+ let freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
41
+ let freeSelf = typeof self == 'object' && self && self.Object === Object && self;
42
+ let root = freeGlobal || freeSelf || Function('return this')();
43
+ let freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
44
+ let freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
45
+ let moduleExports = freeModule && freeModule.exports === freeExports;
46
+ let freeProcess = moduleExports && freeGlobal.process;
47
+ let nodeUtil = (function () {
48
+ try {
49
+ return freeProcess && freeProcess.binding('util');
50
+ }
51
+ catch (e) { }
52
+ })();
53
+ let nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
54
+ function arrayMap(array, iteratee) {
55
+ let index = -1, length = array ? array.length : 0, result = Array(length);
56
+ while (++index < length) {
57
+ result[index] = iteratee(array[index], index, array);
58
+ }
59
+ return result;
60
+ }
61
+ function arraySome(array, predicate) {
62
+ let index = -1, length = array ? array.length : 0;
63
+ while (++index < length) {
64
+ if (predicate(array[index], index, array)) {
65
+ return true;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ function baseProperty(key) {
71
+ return function (object) {
72
+ return object == null ? undefined : object[key];
73
+ };
74
+ }
75
+ function baseSortBy(array, comparer) {
76
+ let length = array.length;
77
+ array.sort(comparer);
78
+ while (length--) {
79
+ array[length] = array[length].value;
80
+ }
81
+ return array;
82
+ }
83
+ function baseTimes(n, iteratee) {
84
+ let index = -1, result = Array(n);
85
+ while (++index < n) {
86
+ result[index] = iteratee(index);
87
+ }
88
+ return result;
89
+ }
90
+ function baseUnary(func) {
91
+ return function (value) {
92
+ return func(value);
93
+ };
94
+ }
95
+ function getValue(object, key) {
96
+ return object == null ? undefined : object[key];
97
+ }
98
+ function isHostObject(value) {
99
+ let result = false;
100
+ if (value != null && typeof value.toString != 'function') {
101
+ try {
102
+ result = !!(value + '');
103
+ }
104
+ catch (e) { }
105
+ }
106
+ return result;
107
+ }
108
+ function mapToArray(map) {
109
+ let index = -1, result = Array(map.size);
110
+ map.forEach(function (value, key) {
111
+ result[++index] = [key, value];
112
+ });
113
+ return result;
114
+ }
115
+ function overArg(func, transform) {
116
+ return function (arg) {
117
+ return func(transform(arg));
118
+ };
119
+ }
120
+ function setToArray(set) {
121
+ let index = -1, result = Array(set.size);
122
+ set.forEach(function (value) {
123
+ result[++index] = value;
124
+ });
125
+ return result;
126
+ }
127
+ let arrayProto = Array.prototype, funcProto = Function.prototype, objectProto = Object.prototype;
128
+ let coreJsData = root['__core-js_shared__'];
129
+ let maskSrcKey = (function () {
130
+ let uid = /[^.]+$/.exec((coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO) || '');
131
+ return uid ? 'Symbol(src)_1.' + uid : '';
132
+ })();
133
+ let funcToString = funcProto.toString;
134
+ let hasOwnProperty = objectProto.hasOwnProperty;
135
+ let objectToString = objectProto.toString;
136
+ let reIsNative = RegExp('^' +
137
+ funcToString
138
+ .call(hasOwnProperty)
139
+ .replace(reRegExpChar, '\\$&')
140
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') +
141
+ '$');
142
+ let Symbol = root.Symbol, Uint8Array = root.Uint8Array, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice;
143
+ let nativeKeys = overArg(Object.keys, Object);
144
+ let DataView = getNative(root, 'DataView'), Map = getNative(root, 'Map'), Promise = getNative(root, 'Promise'), Set = getNative(root, 'Set'), WeakMap = getNative(root, 'WeakMap'), nativeCreate = getNative(Object, 'create');
145
+ let dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map), promiseCtorString = toSource(Promise), setCtorString = toSource(Set), weakMapCtorString = toSource(WeakMap);
146
+ let symbolProto = Symbol ? Symbol.prototype : undefined, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined;
147
+ function Hash(entries) {
148
+ let index = -1, length = entries ? entries.length : 0;
149
+ this.clear();
150
+ while (++index < length) {
151
+ let entry = entries[index];
152
+ this.set(entry[0], entry[1]);
153
+ }
154
+ }
155
+ function hashClear() {
156
+ this.__data__ = nativeCreate ? nativeCreate(null) : {};
157
+ }
158
+ function hashDelete(key) {
159
+ return this.has(key) && delete this.__data__[key];
160
+ }
161
+ function hashGet(key) {
162
+ let data = this.__data__;
163
+ if (nativeCreate) {
164
+ let result = data[key];
165
+ return result === HASH_UNDEFINED ? undefined : result;
166
+ }
167
+ return hasOwnProperty.call(data, key) ? data[key] : undefined;
168
+ }
169
+ function hashHas(key) {
170
+ let data = this.__data__;
171
+ return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);
172
+ }
173
+ function hashSet(key, value) {
174
+ let data = this.__data__;
175
+ data[key] = nativeCreate && value === undefined ? HASH_UNDEFINED : value;
176
+ return this;
177
+ }
178
+ Hash.prototype.clear = hashClear;
179
+ Hash.prototype['delete'] = hashDelete;
180
+ Hash.prototype.get = hashGet;
181
+ Hash.prototype.has = hashHas;
182
+ Hash.prototype.set = hashSet;
183
+ function ListCache(entries) {
184
+ let index = -1, length = entries ? entries.length : 0;
185
+ this.clear();
186
+ while (++index < length) {
187
+ let entry = entries[index];
188
+ this.set(entry[0], entry[1]);
189
+ }
190
+ }
191
+ function listCacheClear() {
192
+ this.__data__ = [];
193
+ }
194
+ function listCacheDelete(key) {
195
+ let data = this.__data__, index = assocIndexOf(data, key);
196
+ if (index < 0) {
197
+ return false;
198
+ }
199
+ let lastIndex = data.length - 1;
200
+ if (index == lastIndex) {
201
+ data.pop();
202
+ }
203
+ else {
204
+ splice.call(data, index, 1);
205
+ }
206
+ return true;
207
+ }
208
+ function listCacheGet(key) {
209
+ let data = this.__data__, index = assocIndexOf(data, key);
210
+ return index < 0 ? undefined : data[index][1];
211
+ }
212
+ function listCacheHas(key) {
213
+ return assocIndexOf(this.__data__, key) > -1;
214
+ }
215
+ function listCacheSet(key, value) {
216
+ let data = this.__data__, index = assocIndexOf(data, key);
217
+ if (index < 0) {
218
+ data.push([key, value]);
219
+ }
220
+ else {
221
+ data[index][1] = value;
222
+ }
223
+ return this;
224
+ }
225
+ ListCache.prototype.clear = listCacheClear;
226
+ ListCache.prototype['delete'] = listCacheDelete;
227
+ ListCache.prototype.get = listCacheGet;
228
+ ListCache.prototype.has = listCacheHas;
229
+ ListCache.prototype.set = listCacheSet;
230
+ function MapCache(entries) {
231
+ let index = -1, length = entries ? entries.length : 0;
232
+ this.clear();
233
+ while (++index < length) {
234
+ let entry = entries[index];
235
+ this.set(entry[0], entry[1]);
236
+ }
237
+ }
238
+ function mapCacheClear() {
239
+ this.__data__ = {
240
+ hash: new Hash(),
241
+ map: new (Map || ListCache)(),
242
+ string: new Hash(),
243
+ };
244
+ }
245
+ function mapCacheDelete(key) {
246
+ return getMapData(this, key)['delete'](key);
247
+ }
248
+ function mapCacheGet(key) {
249
+ return getMapData(this, key).get(key);
250
+ }
251
+ function mapCacheHas(key) {
252
+ return getMapData(this, key).has(key);
253
+ }
254
+ function mapCacheSet(key, value) {
255
+ getMapData(this, key).set(key, value);
256
+ return this;
257
+ }
258
+ MapCache.prototype.clear = mapCacheClear;
259
+ MapCache.prototype['delete'] = mapCacheDelete;
260
+ MapCache.prototype.get = mapCacheGet;
261
+ MapCache.prototype.has = mapCacheHas;
262
+ MapCache.prototype.set = mapCacheSet;
263
+ function SetCache(values) {
264
+ let index = -1, length = values ? values.length : 0;
265
+ this.__data__ = new MapCache();
266
+ while (++index < length) {
267
+ this.add(values[index]);
268
+ }
269
+ }
270
+ function setCacheAdd(value) {
271
+ this.__data__.set(value, HASH_UNDEFINED);
272
+ return this;
273
+ }
274
+ function setCacheHas(value) {
275
+ return this.__data__.has(value);
276
+ }
277
+ SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
278
+ SetCache.prototype.has = setCacheHas;
279
+ function Stack(entries) {
280
+ this.__data__ = new ListCache(entries);
281
+ }
282
+ function stackClear() {
283
+ this.__data__ = new ListCache();
284
+ }
285
+ function stackDelete(key) {
286
+ return this.__data__['delete'](key);
287
+ }
288
+ function stackGet(key) {
289
+ return this.__data__.get(key);
290
+ }
291
+ function stackHas(key) {
292
+ return this.__data__.has(key);
293
+ }
294
+ function stackSet(key, value) {
295
+ let cache = this.__data__;
296
+ if (cache instanceof ListCache) {
297
+ let pairs = cache.__data__;
298
+ if (!Map || pairs.length < LARGE_ARRAY_SIZE - 1) {
299
+ pairs.push([key, value]);
300
+ return this;
301
+ }
302
+ cache = this.__data__ = new MapCache(pairs);
303
+ }
304
+ cache.set(key, value);
305
+ return this;
306
+ }
307
+ Stack.prototype.clear = stackClear;
308
+ Stack.prototype['delete'] = stackDelete;
309
+ Stack.prototype.get = stackGet;
310
+ Stack.prototype.has = stackHas;
311
+ Stack.prototype.set = stackSet;
312
+ function arrayLikeKeys(value, inherited) {
313
+ let result = isArray(value) || isArguments(value) ? baseTimes(value.length, String) : [];
314
+ let length = result.length, skipIndexes = !!length;
315
+ for (let key in value) {
316
+ if ((inherited || hasOwnProperty.call(value, key)) &&
317
+ !(skipIndexes && (key == 'length' || isIndex(key, length)))) {
318
+ result.push(key);
319
+ }
320
+ }
321
+ return result;
322
+ }
323
+ function assocIndexOf(array, key) {
324
+ let length = array.length;
325
+ while (length--) {
326
+ if (eq(array[length][0], key)) {
327
+ return length;
328
+ }
329
+ }
330
+ return -1;
331
+ }
332
+ let baseEach = createBaseEach(baseForOwn);
333
+ let baseFor = createBaseFor();
334
+ function baseForOwn(object, iteratee) {
335
+ return object && baseFor(object, iteratee, keys);
336
+ }
337
+ function baseGet(object, path) {
338
+ path = isKey(path, object) ? [path] : castPath(path);
339
+ let index = 0, length = path.length;
340
+ while (object != null && index < length) {
341
+ object = object[toKey(path[index++])];
342
+ }
343
+ return index && index == length ? object : undefined;
344
+ }
345
+ function baseGetTag(value) {
346
+ return objectToString.call(value);
347
+ }
348
+ function baseHasIn(object, key) {
349
+ return object != null && key in Object(object);
350
+ }
351
+ function baseIsEqual(value, other, customizer, bitmask, stack) {
352
+ if (value === other) {
353
+ return true;
354
+ }
355
+ if (value == null || other == null || (!isObject(value) && !isObjectLike(other))) {
356
+ return value !== value && other !== other;
357
+ }
358
+ return baseIsEqualDeep(value, other, baseIsEqual, customizer, bitmask, stack);
359
+ }
360
+ function baseIsEqualDeep(object, other, equalFunc, customizer, bitmask, stack) {
361
+ let objIsArr = isArray(object), othIsArr = isArray(other), objTag = arrayTag, othTag = arrayTag;
362
+ if (!objIsArr) {
363
+ objTag = getTag(object);
364
+ objTag = objTag == argsTag ? objectTag : objTag;
365
+ }
366
+ if (!othIsArr) {
367
+ othTag = getTag(other);
368
+ othTag = othTag == argsTag ? objectTag : othTag;
369
+ }
370
+ let objIsObj = objTag == objectTag && !isHostObject(object), othIsObj = othTag == objectTag && !isHostObject(other), isSameTag = objTag == othTag;
371
+ if (isSameTag && !objIsObj) {
372
+ stack || (stack = new Stack());
373
+ return objIsArr || isTypedArray(object)
374
+ ? equalArrays(object, other, equalFunc, customizer, bitmask, stack)
375
+ : equalByTag(object, other, objTag, equalFunc, customizer, bitmask, stack);
376
+ }
377
+ if (!(bitmask & PARTIAL_COMPARE_FLAG)) {
378
+ let objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
379
+ if (objIsWrapped || othIsWrapped) {
380
+ let objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
381
+ stack || (stack = new Stack());
382
+ return equalFunc(objUnwrapped, othUnwrapped, customizer, bitmask, stack);
383
+ }
384
+ }
385
+ if (!isSameTag) {
386
+ return false;
387
+ }
388
+ stack || (stack = new Stack());
389
+ return equalObjects(object, other, equalFunc, customizer, bitmask, stack);
390
+ }
391
+ function baseIsMatch(object, source, matchData, customizer) {
392
+ let index = matchData.length, length = index, noCustomizer = !customizer;
393
+ if (object == null) {
394
+ return !length;
395
+ }
396
+ object = Object(object);
397
+ while (index--) {
398
+ let data = matchData[index];
399
+ if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
400
+ return false;
401
+ }
402
+ }
403
+ while (++index < length) {
404
+ data = matchData[index];
405
+ let key = data[0], objValue = object[key], srcValue = data[1];
406
+ if (noCustomizer && data[2]) {
407
+ if (objValue === undefined && !(key in object)) {
408
+ return false;
409
+ }
410
+ }
411
+ else {
412
+ let stack = new Stack();
413
+ if (customizer) {
414
+ let result = customizer(objValue, srcValue, key, object, source, stack);
415
+ }
416
+ if (!(result === undefined
417
+ ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
418
+ : result)) {
419
+ return false;
420
+ }
421
+ }
422
+ }
423
+ return true;
424
+ }
425
+ function baseIsNative(value) {
426
+ if (!isObject(value) || isMasked(value)) {
427
+ return false;
428
+ }
429
+ let pattern = isFunction(value) || isHostObject(value) ? reIsNative : reIsHostCtor;
430
+ return pattern.test(toSource(value));
431
+ }
432
+ function baseIsTypedArray(value) {
433
+ return (isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objectToString.call(value)]);
434
+ }
435
+ function baseIteratee(value) {
436
+ if (typeof value == 'function') {
437
+ return value;
438
+ }
439
+ if (value == null) {
440
+ return identity;
441
+ }
442
+ if (typeof value == 'object') {
443
+ return isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
444
+ }
445
+ return property(value);
446
+ }
447
+ function baseKeys(object) {
448
+ if (!isPrototype(object)) {
449
+ return nativeKeys(object);
450
+ }
451
+ let result = [];
452
+ for (let key in Object(object)) {
453
+ if (hasOwnProperty.call(object, key) && key != 'constructor') {
454
+ result.push(key);
455
+ }
456
+ }
457
+ return result;
458
+ }
459
+ function baseMap(collection, iteratee) {
460
+ let index = -1, result = isArrayLike(collection) ? Array(collection.length) : [];
461
+ baseEach(collection, function (value, key, collection) {
462
+ result[++index] = iteratee(value, key, collection);
463
+ });
464
+ return result;
465
+ }
466
+ function baseMatches(source) {
467
+ let matchData = getMatchData(source);
468
+ if (matchData.length == 1 && matchData[0][2]) {
469
+ return matchesStrictComparable(matchData[0][0], matchData[0][1]);
470
+ }
471
+ return function (object) {
472
+ return object === source || baseIsMatch(object, source, matchData);
473
+ };
474
+ }
475
+ function baseMatchesProperty(path, srcValue) {
476
+ if (isKey(path) && isStrictComparable(srcValue)) {
477
+ return matchesStrictComparable(toKey(path), srcValue);
478
+ }
479
+ return function (object) {
480
+ let objValue = get(object, path);
481
+ return objValue === undefined && objValue === srcValue
482
+ ? hasIn(object, path)
483
+ : baseIsEqual(srcValue, objValue, undefined, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG);
484
+ };
485
+ }
486
+ function baseOrderBy(collection, iteratees, orders) {
487
+ let index = -1;
488
+ iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(baseIteratee));
489
+ let result = baseMap(collection, function (value, key, collection) {
490
+ let criteria = arrayMap(iteratees, function (iteratee) {
491
+ return iteratee(value);
492
+ });
493
+ return { criteria: criteria, index: ++index, value: value };
494
+ });
495
+ return baseSortBy(result, function (object, other) {
496
+ return compareMultiple(object, other, orders);
497
+ });
498
+ }
499
+ function basePropertyDeep(path) {
500
+ return function (object) {
501
+ return baseGet(object, path);
502
+ };
503
+ }
504
+ function baseToString(value) {
505
+ if (typeof value == 'string') {
506
+ return value;
507
+ }
508
+ if (isSymbol(value)) {
509
+ return symbolToString ? symbolToString.call(value) : '';
510
+ }
511
+ let result = value + '';
512
+ return result == '0' && 1 / value == -INFINITY ? '-0' : result;
513
+ }
514
+ function castPath(value) {
515
+ return isArray(value) ? value : stringToPath(value);
516
+ }
517
+ function compareAscending(value, other) {
518
+ if (value !== other) {
519
+ let valIsDefined = value !== undefined, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value);
520
+ let othIsDefined = other !== undefined, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
521
+ if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
522
+ (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
523
+ (valIsNull && othIsDefined && othIsReflexive) ||
524
+ (!valIsDefined && othIsReflexive) ||
525
+ !valIsReflexive) {
526
+ return 1;
527
+ }
528
+ if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
529
+ (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
530
+ (othIsNull && valIsDefined && valIsReflexive) ||
531
+ (!othIsDefined && valIsReflexive) ||
532
+ !othIsReflexive) {
533
+ return -1;
534
+ }
535
+ }
536
+ return 0;
537
+ }
538
+ function compareMultiple(object, other, orders) {
539
+ let index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
540
+ while (++index < length) {
541
+ let result = compareAscending(objCriteria[index], othCriteria[index]);
542
+ if (result) {
543
+ if (index >= ordersLength) {
544
+ return result;
545
+ }
546
+ let order = orders[index];
547
+ return result * (order == 'desc' ? -1 : 1);
548
+ }
549
+ }
550
+ return object.index - other.index;
551
+ }
552
+ function createBaseEach(eachFunc, fromRight) {
553
+ return function (collection, iteratee) {
554
+ if (collection == null) {
555
+ return collection;
556
+ }
557
+ if (!isArrayLike(collection)) {
558
+ return eachFunc(collection, iteratee);
559
+ }
560
+ let length = collection.length;
561
+ let index = fromRight ? length : -1;
562
+ let iterable = Object(collection);
563
+ while (fromRight ? index-- : ++index < length) {
564
+ if (iteratee(iterable[index], index, iterable) === false) {
565
+ break;
566
+ }
567
+ }
568
+ return collection;
569
+ };
570
+ }
571
+ function createBaseFor(fromRight) {
572
+ return function (object, iteratee, keysFunc) {
573
+ let index = -1, iterable = Object(object), props = keysFunc(object), length = props.length;
574
+ while (length--) {
575
+ let key = props[fromRight ? length : ++index];
576
+ if (iteratee(iterable[key], key, iterable) === false) {
577
+ break;
578
+ }
579
+ }
580
+ return object;
581
+ };
582
+ }
583
+ function equalArrays(array, other, equalFunc, customizer, bitmask, stack) {
584
+ let isPartial = bitmask & PARTIAL_COMPARE_FLAG, arrLength = array.length, othLength = other.length;
585
+ if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
586
+ return false;
587
+ }
588
+ let stacked = stack.get(array);
589
+ if (stacked && stack.get(other)) {
590
+ return stacked == other;
591
+ }
592
+ let index = -1, result = true, seen = bitmask & UNORDERED_COMPARE_FLAG ? new SetCache() : undefined;
593
+ stack.set(array, other);
594
+ stack.set(other, array);
595
+ while (++index < arrLength) {
596
+ let arrValue = array[index], othValue = other[index];
597
+ if (customizer) {
598
+ let compared = isPartial
599
+ ? customizer(othValue, arrValue, index, other, array, stack)
600
+ : customizer(arrValue, othValue, index, array, other, stack);
601
+ }
602
+ if (compared !== undefined) {
603
+ if (compared) {
604
+ continue;
605
+ }
606
+ result = false;
607
+ break;
608
+ }
609
+ if (seen) {
610
+ if (!arraySome(other, function (othValue, othIndex) {
611
+ if (!seen.has(othIndex) &&
612
+ (arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
613
+ return seen.add(othIndex);
614
+ }
615
+ })) {
616
+ result = false;
617
+ break;
618
+ }
619
+ }
620
+ else if (!(arrValue === othValue || equalFunc(arrValue, othValue, customizer, bitmask, stack))) {
621
+ result = false;
622
+ break;
623
+ }
624
+ }
625
+ stack['delete'](array);
626
+ stack['delete'](other);
627
+ return result;
628
+ }
629
+ function equalByTag(object, other, tag, equalFunc, customizer, bitmask, stack) {
630
+ switch (tag) {
631
+ case dataViewTag:
632
+ if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
633
+ return false;
634
+ }
635
+ object = object.buffer;
636
+ other = other.buffer;
637
+ case arrayBufferTag:
638
+ if (object.byteLength != other.byteLength ||
639
+ !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
640
+ return false;
641
+ }
642
+ return true;
643
+ case boolTag:
644
+ case dateTag:
645
+ case numberTag:
646
+ return eq(+object, +other);
647
+ case errorTag:
648
+ return object.name == other.name && object.message == other.message;
649
+ case regexpTag:
650
+ case stringTag:
651
+ return object == other + '';
652
+ case mapTag:
653
+ let convert = mapToArray;
654
+ case setTag:
655
+ let isPartial = bitmask & PARTIAL_COMPARE_FLAG;
656
+ convert || (convert = setToArray);
657
+ if (object.size != other.size && !isPartial) {
658
+ return false;
659
+ }
660
+ let stacked = stack.get(object);
661
+ if (stacked) {
662
+ return stacked == other;
663
+ }
664
+ bitmask |= UNORDERED_COMPARE_FLAG;
665
+ stack.set(object, other);
666
+ let result = equalArrays(convert(object), convert(other), equalFunc, customizer, bitmask, stack);
667
+ stack['delete'](object);
668
+ return result;
669
+ case symbolTag:
670
+ if (symbolValueOf) {
671
+ return symbolValueOf.call(object) == symbolValueOf.call(other);
672
+ }
673
+ }
674
+ return false;
675
+ }
676
+ function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
677
+ let isPartial = bitmask & PARTIAL_COMPARE_FLAG, objProps = keys(object), objLength = objProps.length, othProps = keys(other), othLength = othProps.length;
678
+ if (objLength != othLength && !isPartial) {
679
+ return false;
680
+ }
681
+ let index = objLength;
682
+ while (index--) {
683
+ let key = objProps[index];
684
+ if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
685
+ return false;
686
+ }
687
+ }
688
+ let stacked = stack.get(object);
689
+ if (stacked && stack.get(other)) {
690
+ return stacked == other;
691
+ }
692
+ let result = true;
693
+ stack.set(object, other);
694
+ stack.set(other, object);
695
+ let skipCtor = isPartial;
696
+ while (++index < objLength) {
697
+ key = objProps[index];
698
+ let objValue = object[key], othValue = other[key];
699
+ if (customizer) {
700
+ let compared = isPartial
701
+ ? customizer(othValue, objValue, key, other, object, stack)
702
+ : customizer(objValue, othValue, key, object, other, stack);
703
+ }
704
+ if (!(compared === undefined
705
+ ? objValue === othValue || equalFunc(objValue, othValue, customizer, bitmask, stack)
706
+ : compared)) {
707
+ result = false;
708
+ break;
709
+ }
710
+ skipCtor || (skipCtor = key == 'constructor');
711
+ }
712
+ if (result && !skipCtor) {
713
+ let objCtor = object.constructor, othCtor = other.constructor;
714
+ if (objCtor != othCtor &&
715
+ 'constructor' in object &&
716
+ 'constructor' in other &&
717
+ !(typeof objCtor == 'function' &&
718
+ objCtor instanceof objCtor &&
719
+ typeof othCtor == 'function' &&
720
+ othCtor instanceof othCtor)) {
721
+ result = false;
722
+ }
723
+ }
724
+ stack['delete'](object);
725
+ stack['delete'](other);
726
+ return result;
727
+ }
728
+ function getMapData(map, key) {
729
+ let data = map.__data__;
730
+ return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map;
731
+ }
732
+ function getMatchData(object) {
733
+ let result = keys(object), length = result.length;
734
+ while (length--) {
735
+ let key = result[length], value = object[key];
736
+ result[length] = [key, value, isStrictComparable(value)];
737
+ }
738
+ return result;
739
+ }
740
+ function getNative(object, key) {
741
+ let value = getValue(object, key);
742
+ return baseIsNative(value) ? value : undefined;
743
+ }
744
+ let getTag = baseGetTag;
745
+ if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
746
+ (Map && getTag(new Map()) != mapTag) ||
747
+ (Promise && getTag(Promise.resolve()) != promiseTag) ||
748
+ (Set && getTag(new Set()) != setTag) ||
749
+ (WeakMap && getTag(new WeakMap()) != weakMapTag)) {
750
+ getTag = function (value) {
751
+ let result = objectToString.call(value), Ctor = result == objectTag ? value.constructor : undefined, ctorString = Ctor ? toSource(Ctor) : undefined;
752
+ if (ctorString) {
753
+ switch (ctorString) {
754
+ case dataViewCtorString:
755
+ return dataViewTag;
756
+ case mapCtorString:
757
+ return mapTag;
758
+ case promiseCtorString:
759
+ return promiseTag;
760
+ case setCtorString:
761
+ return setTag;
762
+ case weakMapCtorString:
763
+ return weakMapTag;
764
+ }
765
+ }
766
+ return result;
767
+ };
768
+ }
769
+ function hasPath(object, path, hasFunc) {
770
+ path = isKey(path, object) ? [path] : castPath(path);
771
+ let result;
772
+ let index = -1;
773
+ let length = path.length;
774
+ while (++index < length) {
775
+ let key = toKey(path[index]);
776
+ if (!(result = object != null && hasFunc(object, key))) {
777
+ break;
778
+ }
779
+ object = object[key];
780
+ }
781
+ if (result) {
782
+ return result;
783
+ }
784
+ length = object ? object.length : 0;
785
+ return (!!length && isLength(length) && isIndex(key, length) && (isArray(object) || isArguments(object)));
786
+ }
787
+ function isIndex(value, length) {
788
+ length = length == null ? MAX_SAFE_INTEGER : length;
789
+ return (!!length &&
790
+ (typeof value == 'number' || reIsUint.test(value)) &&
791
+ value > -1 &&
792
+ value % 1 == 0 &&
793
+ value < length);
794
+ }
795
+ function isKey(value, object) {
796
+ if (isArray(value)) {
797
+ return false;
798
+ }
799
+ let type = typeof value;
800
+ if (type == 'number' ||
801
+ type == 'symbol' ||
802
+ type == 'boolean' ||
803
+ value == null ||
804
+ isSymbol(value)) {
805
+ return true;
806
+ }
807
+ return (reIsPlainProp.test(value) ||
808
+ !reIsDeepProp.test(value) ||
809
+ (object != null && value in Object(object)));
810
+ }
811
+ function isKeyable(value) {
812
+ let type = typeof value;
813
+ return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean'
814
+ ? value !== '__proto__'
815
+ : value === null;
816
+ }
817
+ function isMasked(func) {
818
+ return !!maskSrcKey && maskSrcKey in func;
819
+ }
820
+ function isPrototype(value) {
821
+ let Ctor = value && value.constructor, proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
822
+ return value === proto;
823
+ }
824
+ function isStrictComparable(value) {
825
+ return value === value && !isObject(value);
826
+ }
827
+ function matchesStrictComparable(key, srcValue) {
828
+ return function (object) {
829
+ if (object == null) {
830
+ return false;
831
+ }
832
+ return object[key] === srcValue && (srcValue !== undefined || key in Object(object));
833
+ };
834
+ }
835
+ let stringToPath = memoize(function (string) {
836
+ string = toString(string);
837
+ let result = [];
838
+ if (reLeadingDot.test(string)) {
839
+ result.push('');
840
+ }
841
+ string.replace(rePropName, function (match, number, quote, string) {
842
+ result.push(quote ? string.replace(reEscapeChar, '$1') : number || match);
843
+ });
844
+ return result;
845
+ });
846
+ function toKey(value) {
847
+ if (typeof value == 'string' || isSymbol(value)) {
848
+ return value;
849
+ }
850
+ let result = value + '';
851
+ return result == '0' && 1 / value == -INFINITY ? '-0' : result;
852
+ }
853
+ function toSource(func) {
854
+ if (func != null) {
855
+ try {
856
+ return funcToString.call(func);
857
+ }
858
+ catch (e) { }
859
+ try {
860
+ return func + '';
861
+ }
862
+ catch (e) { }
863
+ }
864
+ return '';
865
+ }
866
+ function zxhiddenCustomOrderByByJeremyAshkenas(collection, iteratees, orders) {
867
+ if (collection == null) {
868
+ return [];
869
+ }
870
+ if (!isArray(iteratees)) {
871
+ iteratees = iteratees == null ? [] : [iteratees];
872
+ }
873
+ if (!isArray(orders)) {
874
+ orders = orders == null ? [] : [orders];
875
+ }
876
+ return baseOrderBy(collection, iteratees, orders);
877
+ }
878
+ function memoize(func, resolver) {
879
+ if (typeof func != 'function' || (resolver && typeof resolver != 'function')) {
880
+ throw new TypeError(FUNC_ERROR_TEXT);
881
+ }
882
+ let memoized = function () {
883
+ let args = arguments, key = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
884
+ if (cache.has(key)) {
885
+ return cache.get(key);
886
+ }
887
+ let result = func.apply(this, args);
888
+ memoized.cache = cache.set(key, result);
889
+ return result;
890
+ };
891
+ memoized.cache = new (memoize.Cache || MapCache)();
892
+ return memoized;
893
+ }
894
+ memoize.Cache = MapCache;
895
+ function eq(value, other) {
896
+ return value === other || (value !== value && other !== other);
897
+ }
898
+ function isArguments(value) {
899
+ return (isArrayLikeObject(value) &&
900
+ hasOwnProperty.call(value, 'callee') &&
901
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag));
902
+ }
903
+ let isArray = Array.isArray;
904
+ function isArrayLike(value) {
905
+ return value != null && isLength(value.length) && !isFunction(value);
906
+ }
907
+ function isArrayLikeObject(value) {
908
+ return isObjectLike(value) && isArrayLike(value);
909
+ }
910
+ function isFunction(value) {
911
+ let tag = isObject(value) ? objectToString.call(value) : '';
912
+ return tag == funcTag || tag == genTag;
913
+ }
914
+ function isLength(value) {
915
+ return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
916
+ }
917
+ function isObject(value) {
918
+ let type = typeof value;
919
+ return !!value && (type == 'object' || type == 'function');
920
+ }
921
+ function isObjectLike(value) {
922
+ return !!value && typeof value == 'object';
923
+ }
924
+ function isSymbol(value) {
925
+ return (typeof value == 'symbol' || (isObjectLike(value) && objectToString.call(value) == symbolTag));
926
+ }
927
+ let isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
928
+ function toString(value) {
929
+ return value == null ? '' : baseToString(value);
930
+ }
931
+ function get(object, path, defaultValue) {
932
+ let result = object == null ? undefined : baseGet(object, path);
933
+ return result === undefined ? defaultValue : result;
934
+ }
935
+ function hasIn(object, path) {
936
+ return object != null && hasPath(object, path, baseHasIn);
937
+ }
938
+ function keys(object) {
939
+ return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
940
+ }
941
+ function identity(value) {
942
+ return value;
943
+ }
944
+ function property(path) {
945
+ return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
946
+ }
947
+ export default zxhiddenCustomOrderByByJeremyAshkenas;
948
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX29yZGVyLWJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicmFyaWVzL3V0aWxpdGllcy9qcy9fb3JkZXItYnkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDM0IsSUFBSSxlQUFlLEdBQUcscUJBQXFCLENBQUM7QUFDNUMsSUFBSSxjQUFjLEdBQUcsMkJBQTJCLENBQUM7QUFDakQsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLEVBQzVCLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMzQixJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUNsQixnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztBQUV0QyxJQUFJLE9BQU8sR0FBRyxvQkFBb0IsRUFDaEMsUUFBUSxHQUFHLGdCQUFnQixFQUMzQixPQUFPLEdBQUcsa0JBQWtCLEVBQzVCLE9BQU8sR0FBRyxlQUFlLEVBQ3pCLFFBQVEsR0FBRyxnQkFBZ0IsRUFDM0IsT0FBTyxHQUFHLG1CQUFtQixFQUM3QixNQUFNLEdBQUcsNEJBQTRCLEVBQ3JDLE1BQU0sR0FBRyxjQUFjLEVBQ3ZCLFNBQVMsR0FBRyxpQkFBaUIsRUFDN0IsU0FBUyxHQUFHLGlCQUFpQixFQUM3QixVQUFVLEdBQUcsa0JBQWtCLEVBQy9CLFNBQVMsR0FBRyxpQkFBaUIsRUFDN0IsTUFBTSxHQUFHLGNBQWMsRUFDdkIsU0FBUyxHQUFHLGlCQUFpQixFQUM3QixTQUFTLEdBQUcsaUJBQWlCLEVBQzdCLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUVsQyxJQUFJLGNBQWMsR0FBRyxzQkFBc0IsRUFDekMsV0FBVyxHQUFHLG1CQUFtQixFQUNqQyxVQUFVLEdBQUcsdUJBQXVCLEVBQ3BDLFVBQVUsR0FBRyx1QkFBdUIsRUFDcEMsT0FBTyxHQUFHLG9CQUFvQixFQUM5QixRQUFRLEdBQUcscUJBQXFCLEVBQ2hDLFFBQVEsR0FBRyxxQkFBcUIsRUFDaEMs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QUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBSztJQUNyQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxJQUFJO0lBQ3BCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxlQUFlLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsibGV0IExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7XHJcbmxldCBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XHJcbmxldCBIQVNIX1VOREVGSU5FRCA9ICdfX2xvZGFzaF9oYXNoX3VuZGVmaW5lZF9fJztcclxubGV0IFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgPSAxLFxyXG4gIFBBUlRJQUxfQ09NUEFSRV9GTEFHID0gMjtcclxubGV0IElORklOSVRZID0gMSAvIDAsXHJcbiAgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XHJcblxyXG5sZXQgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLFxyXG4gIGFycmF5VGFnID0gJ1tvYmplY3QgQXJyYXldJyxcclxuICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLFxyXG4gIGRhdGVUYWcgPSAnW29iamVjdCBEYXRlXScsXHJcbiAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLFxyXG4gIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxyXG4gIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXHJcbiAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsXHJcbiAgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXScsXHJcbiAgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XScsXHJcbiAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJyxcclxuICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJyxcclxuICBzZXRUYWcgPSAnW29iamVjdCBTZXRdJyxcclxuICBzdHJpbmdUYWcgPSAnW29iamVjdCBTdHJpbmddJyxcclxuICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJyxcclxuICB3ZWFrTWFwVGFnID0gJ1tvYmplY3QgV2Vha01hcF0nO1xyXG5cclxubGV0IGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJyxcclxuICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsXHJcbiAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLFxyXG4gIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJyxcclxuICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsXHJcbiAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsXHJcbiAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsXHJcbiAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsXHJcbiAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJyxcclxuICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLFxyXG4gIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7XHJcblxyXG5sZXQgcmVJc0RlZXBQcm9wID0gL1xcLnxcXFsoPzpbXltcXF1dKnwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKj9cXDEpXFxdLyxcclxuICByZUlzUGxhaW5Qcm9wID0gL15cXHcqJC8sXHJcbiAgcmVMZWFkaW5nRG90ID0gL15cXC4vLFxyXG4gIHJlUHJvcE5hbWUgPVxyXG4gICAgL1teLltcXF1dK3xcXFsoPzooLT9cXGQrKD86XFwuXFxkKyk/KXwoW1wiJ10pKCg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSo/KVxcMilcXF18KD89KD86XFwufFxcW1xcXSkoPzpcXC58XFxbXFxdfCQpKS9nO1xyXG5cclxubGV0IHJlUmVnRXhwQ2hhciA9IC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZztcclxubGV0IHJlRXNjYXBlQ2hhciA9IC9cXFxcKFxcXFwpPy9nO1xyXG5sZXQgcmVJc0hvc3RDdG9yID0gL15cXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXF0kLztcclxubGV0IHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcclxuXHJcbmxldCB0eXBlZEFycmF5VGFncyA9IHt9O1xyXG50eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1tpbnQxNlRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbdWludDhUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID1cclxuICAgIHRydWU7XHJcbnR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID1cclxuICB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2FycmF5QnVmZmVyVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2RhdGFWaWV3VGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9XHJcbiAgdHlwZWRBcnJheVRhZ3NbZnVuY1RhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW21hcFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW29iamVjdFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3JlZ2V4cFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3N0cmluZ1RhZ10gPVxyXG4gIHR5cGVkQXJyYXlUYWdzW3dlYWtNYXBUYWddID1cclxuICAgIGZhbHNlO1xyXG5cclxubGV0IGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xyXG5sZXQgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcclxubGV0IHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XHJcbmxldCBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcclxubGV0IGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJiAhbW9kdWxlLm5vZGVUeXBlICYmIG1vZHVsZTtcclxubGV0IG1vZHVsZUV4cG9ydHMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUuZXhwb3J0cyA9PT0gZnJlZUV4cG9ydHM7XHJcbmxldCBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgZnJlZUdsb2JhbC5wcm9jZXNzO1xyXG5cclxubGV0IG5vZGVVdGlsID0gKGZ1bmN0aW9uICgpIHtcclxuICB0cnkge1xyXG4gICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTtcclxuICB9IGNhdGNoIChlKSB7fVxyXG59KSgpO1xyXG5cclxubGV0IG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7XHJcblxyXG5mdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGFycmF5ID8gYXJyYXkubGVuZ3RoIDogMCxcclxuICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXksIHByZWRpY2F0ZSkge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgbGVuZ3RoID0gYXJyYXkgPyBhcnJheS5sZW5ndGggOiAwO1xyXG5cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBmYWxzZTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0KSB7XHJcbiAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBvYmplY3Rba2V5XTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlU29ydEJ5KGFycmF5LCBjb21wYXJlcikge1xyXG4gIGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XHJcblxyXG4gIGFycmF5LnNvcnQoY29tcGFyZXIpO1xyXG4gIHdoaWxlIChsZW5ndGgtLSkge1xyXG4gICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBhcnJheTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVRpbWVzKG4sIGl0ZXJhdGVlKSB7XHJcbiAgbGV0IGluZGV4ID0gLTEsXHJcbiAgICByZXN1bHQgPSBBcnJheShuKTtcclxuXHJcbiAgd2hpbGUgKCsraW5kZXggPCBuKSB7XHJcbiAgICByZXN1bHRbaW5kZXhdID0gaXRlcmF0ZWUoaW5kZXgpO1xyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykge1xyXG4gIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgIHJldHVybiBmdW5jKHZhbHVlKTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRWYWx1ZShvYmplY3QsIGtleSkge1xyXG4gIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iamVjdFtrZXldO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0hvc3RPYmplY3QodmFsdWUpIHtcclxuICBsZXQgcmVzdWx0ID0gZmFsc2U7XHJcbiAgaWYgKHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnRvU3RyaW5nICE9ICdmdW5jdGlvbicpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3VsdCA9ICEhKHZhbHVlICsgJycpO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gbWFwVG9BcnJheShtYXApIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTtcclxuXHJcbiAgbWFwLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcclxuICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XHJcbiAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0VG9BcnJheShzZXQpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTtcclxuXHJcbiAgc2V0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTtcclxuICB9KTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5sZXQgYXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZSxcclxuICBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXHJcbiAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xyXG5cclxubGV0IGNvcmVKc0RhdGEgPSByb290WydfX2NvcmUtanNfc2hhcmVkX18nXTtcclxubGV0IG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24gKCkge1xyXG4gIGxldCB1aWQgPSAvW14uXSskLy5leGVjKChjb3JlSnNEYXRhICYmIGNvcmVKc0RhdGEua2V5cyAmJiBjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE8pIHx8ICcnKTtcclxuICByZXR1cm4gdWlkID8gJ1N5bWJvbChzcmMpXzEuJyArIHVpZCA6ICcnO1xyXG59KSgpO1xyXG5cclxubGV0IGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcclxubGV0IGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XHJcbmxldCBvYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xyXG5cclxubGV0IHJlSXNOYXRpdmUgPSBSZWdFeHAoXHJcbiAgJ14nICtcclxuICAgIGZ1bmNUb1N0cmluZ1xyXG4gICAgICAuY2FsbChoYXNPd25Qcm9wZXJ0eSlcclxuICAgICAgLnJlcGxhY2UocmVSZWdFeHBDaGFyLCAnXFxcXCQmJylcclxuICAgICAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICtcclxuICAgICckJ1xyXG4pO1xyXG5cclxubGV0IFN5bWJvbCA9IHJvb3QuU3ltYm9sLFxyXG4gIFVpbnQ4QXJyYXkgPSByb290LlVpbnQ4QXJyYXksXHJcbiAgcHJvcGVydHlJc0VudW1lcmFibGUgPSBvYmplY3RQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcclxuICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZTtcclxuXHJcbmxldCBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KTtcclxuXHJcbmxldCBEYXRhVmlldyA9IGdldE5hdGl2ZShyb290LCAnRGF0YVZpZXcnKSxcclxuICBNYXAgPSBnZXROYXRpdmUocm9vdCwgJ01hcCcpLFxyXG4gIFByb21pc2UgPSBnZXROYXRpdmUocm9vdCwgJ1Byb21pc2UnKSxcclxuICBTZXQgPSBnZXROYXRpdmUocm9vdCwgJ1NldCcpLFxyXG4gIFdlYWtNYXAgPSBnZXROYXRpdmUocm9vdCwgJ1dlYWtNYXAnKSxcclxuICBuYXRpdmVDcmVhdGUgPSBnZXROYXRpdmUoT2JqZWN0LCAnY3JlYXRlJyk7XHJcblxyXG5sZXQgZGF0YVZpZXdDdG9yU3RyaW5nID0gdG9Tb3VyY2UoRGF0YVZpZXcpLFxyXG4gIG1hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShNYXApLFxyXG4gIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksXHJcbiAgc2V0Q3RvclN0cmluZyA9IHRvU291cmNlKFNldCksXHJcbiAgd2Vha01hcEN0b3JTdHJpbmcgPSB0b1NvdXJjZShXZWFrTWFwKTtcclxuXHJcbmxldCBzeW1ib2xQcm90byA9IFN5bWJvbCA/IFN5bWJvbC5wcm90b3R5cGUgOiB1bmRlZmluZWQsXHJcbiAgc3ltYm9sVmFsdWVPZiA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udmFsdWVPZiA6IHVuZGVmaW5lZCxcclxuICBzeW1ib2xUb1N0cmluZyA9IHN5bWJvbFByb3RvID8gc3ltYm9sUHJvdG8udG9TdHJpbmcgOiB1bmRlZmluZWQ7XHJcblxyXG5mdW5jdGlvbiBIYXNoKGVudHJpZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XHJcblxyXG4gIHRoaXMuY2xlYXIoKTtcclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XHJcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaENsZWFyKCkge1xyXG4gIHRoaXMuX19kYXRhX18gPSBuYXRpdmVDcmVhdGUgPyBuYXRpdmVDcmVhdGUobnVsbCkgOiB7fTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpIHtcclxuICByZXR1cm4gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldO1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNoR2V0KGtleSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXztcclxuICBpZiAobmF0aXZlQ3JlYXRlKSB7XHJcbiAgICBsZXQgcmVzdWx0ID0gZGF0YVtrZXldO1xyXG4gICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQgOiByZXN1bHQ7XHJcbiAgfVxyXG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc2hIYXMoa2V5KSB7XHJcbiAgbGV0IGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xyXG4gIHJldHVybiBuYXRpdmVDcmVhdGUgPyBkYXRhW2tleV0gIT09IHVuZGVmaW5lZCA6IGhhc093blByb3BlcnR5LmNhbGwoZGF0YSwga2V5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7XHJcbiAgbGV0IGRhdGEgPSB0aGlzLl9fZGF0YV9fO1xyXG4gIGRhdGFba2V5XSA9IG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTtcclxuICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBoYXNoQ2xlYXI7XHJcbkhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7XHJcbkhhc2gucHJvdG90eXBlLmdldCA9IGhhc2hHZXQ7XHJcbkhhc2gucHJvdG90eXBlLmhhcyA9IGhhc2hIYXM7XHJcbkhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7XHJcblxyXG5mdW5jdGlvbiBMaXN0Q2FjaGUoZW50cmllcykge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgbGVuZ3RoID0gZW50cmllcyA/IGVudHJpZXMubGVuZ3RoIDogMDtcclxuXHJcbiAgdGhpcy5jbGVhcigpO1xyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBsZXQgZW50cnkgPSBlbnRyaWVzW2luZGV4XTtcclxuICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBsaXN0Q2FjaGVDbGVhcigpIHtcclxuICB0aGlzLl9fZGF0YV9fID0gW107XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHtcclxuICBsZXQgZGF0YSA9IHRoaXMuX19kYXRhX18sXHJcbiAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpO1xyXG5cclxuICBpZiAoaW5kZXggPCAwKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG4gIGxldCBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7XHJcbiAgaWYgKGluZGV4ID09IGxhc3RJbmRleCkge1xyXG4gICAgZGF0YS5wb3AoKTtcclxuICB9IGVsc2Uge1xyXG4gICAgc3BsaWNlLmNhbGwoZGF0YSwgaW5kZXgsIDEpO1xyXG4gIH1cclxuICByZXR1cm4gdHJ1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXyxcclxuICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XHJcblxyXG4gIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTtcclxufVxyXG5cclxuZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkge1xyXG4gIHJldHVybiBhc3NvY0luZGV4T2YodGhpcy5fX2RhdGFfXywga2V5KSA+IC0xO1xyXG59XHJcblxyXG5mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkge1xyXG4gIGxldCBkYXRhID0gdGhpcy5fX2RhdGFfXyxcclxuICAgIGluZGV4ID0gYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7XHJcblxyXG4gIGlmIChpbmRleCA8IDApIHtcclxuICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlO1xyXG4gIH1cclxuICByZXR1cm4gdGhpcztcclxufVxyXG5cclxuTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IGxpc3RDYWNoZUNsZWFyO1xyXG5MaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTtcclxuTGlzdENhY2hlLnByb3RvdHlwZS5nZXQgPSBsaXN0Q2FjaGVHZXQ7XHJcbkxpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gbGlzdENhY2hlSGFzO1xyXG5MaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDtcclxuXHJcbmZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IGVudHJpZXMgPyBlbnRyaWVzLmxlbmd0aCA6IDA7XHJcblxyXG4gIHRoaXMuY2xlYXIoKTtcclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IGVudHJ5ID0gZW50cmllc1tpbmRleF07XHJcbiAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbWFwQ2FjaGVDbGVhcigpIHtcclxuICB0aGlzLl9fZGF0YV9fID0ge1xyXG4gICAgaGFzaDogbmV3IEhhc2goKSxcclxuICAgIG1hcDogbmV3IChNYXAgfHwgTGlzdENhY2hlKSgpLFxyXG4gICAgc3RyaW5nOiBuZXcgSGFzaCgpLFxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSlbJ2RlbGV0ZSddKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlR2V0KGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkge1xyXG4gIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuaGFzKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHtcclxuICBnZXRNYXBEYXRhKHRoaXMsIGtleSkuc2V0KGtleSwgdmFsdWUpO1xyXG4gIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG5NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyO1xyXG5NYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gbWFwQ2FjaGVEZWxldGU7XHJcbk1hcENhY2hlLnByb3RvdHlwZS5nZXQgPSBtYXBDYWNoZUdldDtcclxuTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzO1xyXG5NYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gbWFwQ2FjaGVTZXQ7XHJcblxyXG5mdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHtcclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIGxlbmd0aCA9IHZhbHVlcyA/IHZhbHVlcy5sZW5ndGggOiAwO1xyXG5cclxuICB0aGlzLl9fZGF0YV9fID0gbmV3IE1hcENhY2hlKCk7XHJcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcclxuICAgIHRoaXMuYWRkKHZhbHVlc1tpbmRleF0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHtcclxuICB0aGlzLl9fZGF0YV9fLnNldCh2YWx1ZSwgSEFTSF9VTkRFRklORUQpO1xyXG4gIHJldHVybiB0aGlzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzZXRDYWNoZUhhcyh2YWx1ZSkge1xyXG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7XHJcbn1cclxuXHJcblNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkO1xyXG5TZXRDYWNoZS5wcm90b3R5cGUuaGFzID0gc2V0Q2FjaGVIYXM7XHJcblxyXG5mdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7XHJcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoZW50cmllcyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7XHJcbiAgdGhpcy5fX2RhdGFfXyA9IG5ldyBMaXN0Q2FjaGUoKTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RhY2tEZWxldGUoa2V5KSB7XHJcbiAgcmV0dXJuIHRoaXMuX19kYXRhX19bJ2RlbGV0ZSddKGtleSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHN0YWNrR2V0KGtleSkge1xyXG4gIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBzdGFja0hhcyhrZXkpIHtcclxuICByZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KTtcclxufVxyXG5cclxuZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkge1xyXG4gIGxldCBjYWNoZSA9IHRoaXMuX19kYXRhX187XHJcbiAgaWYgKGNhY2hlIGluc3RhbmNlb2YgTGlzdENhY2hlKSB7XHJcbiAgICBsZXQgcGFpcnMgPSBjYWNoZS5fX2RhdGFfXztcclxuICAgIGlmICghTWFwIHx8IHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSB7XHJcbiAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBjYWNoZSA9IHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGUocGFpcnMpO1xyXG4gIH1cclxuICBjYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn1cclxuXHJcblN0YWNrLnByb3RvdHlwZS5jbGVhciA9IHN0YWNrQ2xlYXI7XHJcblN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTtcclxuU3RhY2sucHJvdG90eXBlLmdldCA9IHN0YWNrR2V0O1xyXG5TdGFjay5wcm90b3R5cGUuaGFzID0gc3RhY2tIYXM7XHJcblN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDtcclxuXHJcbmZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkge1xyXG4gIGxldCByZXN1bHQgPSBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgPyBiYXNlVGltZXModmFsdWUubGVuZ3RoLCBTdHJpbmcpIDogW107XHJcblxyXG4gIGxldCBsZW5ndGggPSByZXN1bHQubGVuZ3RoLFxyXG4gICAgc2tpcEluZGV4ZXMgPSAhIWxlbmd0aDtcclxuXHJcbiAgZm9yIChsZXQga2V5IGluIHZhbHVlKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChpbmhlcml0ZWQgfHwgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSkgJiZcclxuICAgICAgIShza2lwSW5kZXhlcyAmJiAoa2V5ID09ICdsZW5ndGgnIHx8IGlzSW5kZXgoa2V5LCBsZW5ndGgpKSlcclxuICAgICkge1xyXG4gICAgICByZXN1bHQucHVzaChrZXkpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkge1xyXG4gIGxldCBsZW5ndGggPSBhcnJheS5sZW5ndGg7XHJcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XHJcbiAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkge1xyXG4gICAgICByZXR1cm4gbGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gLTE7XHJcbn1cclxuXHJcbmxldCBiYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoKGJhc2VGb3JPd24pO1xyXG5cclxubGV0IGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7XHJcblxyXG5mdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHtcclxuICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VHZXQob2JqZWN0LCBwYXRoKSB7XHJcbiAgcGF0aCA9IGlzS2V5KHBhdGgsIG9iamVjdCkgPyBbcGF0aF0gOiBjYXN0UGF0aChwYXRoKTtcclxuXHJcbiAgbGV0IGluZGV4ID0gMCxcclxuICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAob2JqZWN0ICE9IG51bGwgJiYgaW5kZXggPCBsZW5ndGgpIHtcclxuICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07XHJcbiAgfVxyXG4gIHJldHVybiBpbmRleCAmJiBpbmRleCA9PSBsZW5ndGggPyBvYmplY3QgOiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcclxuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkge1xyXG4gIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBrZXkgaW4gT2JqZWN0KG9iamVjdCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcclxuICBpZiAodmFsdWUgPT09IG90aGVyKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgaWYgKHZhbHVlID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCB8fCAoIWlzT2JqZWN0KHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHtcclxuICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyO1xyXG4gIH1cclxuICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYmFzZUlzRXF1YWwsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUlzRXF1YWxEZWVwKG9iamVjdCwgb3RoZXIsIGVxdWFsRnVuYywgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spIHtcclxuICBsZXQgb2JqSXNBcnIgPSBpc0FycmF5KG9iamVjdCksXHJcbiAgICBvdGhJc0FyciA9IGlzQXJyYXkob3RoZXIpLFxyXG4gICAgb2JqVGFnID0gYXJyYXlUYWcsXHJcbiAgICBvdGhUYWcgPSBhcnJheVRhZztcclxuXHJcbiAgaWYgKCFvYmpJc0Fycikge1xyXG4gICAgb2JqVGFnID0gZ2V0VGFnKG9iamVjdCk7XHJcbiAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyA/IG9iamVjdFRhZyA6IG9ialRhZztcclxuICB9XHJcbiAgaWYgKCFvdGhJc0Fycikge1xyXG4gICAgb3RoVGFnID0gZ2V0VGFnKG90aGVyKTtcclxuICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb3RoVGFnO1xyXG4gIH1cclxuICBsZXQgb2JqSXNPYmogPSBvYmpUYWcgPT0gb2JqZWN0VGFnICYmICFpc0hvc3RPYmplY3Qob2JqZWN0KSxcclxuICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyAmJiAhaXNIb3N0T2JqZWN0KG90aGVyKSxcclxuICAgIGlzU2FtZVRhZyA9IG9ialRhZyA9PSBvdGhUYWc7XHJcblxyXG4gIGlmIChpc1NhbWVUYWcgJiYgIW9iaklzT2JqKSB7XHJcbiAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7XHJcbiAgICByZXR1cm4gb2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5KG9iamVjdClcclxuICAgICAgPyBlcXVhbEFycmF5cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKVxyXG4gICAgICA6IGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgb2JqVGFnLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxuICB9XHJcbiAgaWYgKCEoYml0bWFzayAmIFBBUlRJQUxfQ09NUEFSRV9GTEFHKSkge1xyXG4gICAgbGV0IG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX193cmFwcGVkX18nKSxcclxuICAgICAgb3RoSXNXcmFwcGVkID0gb3RoSXNPYmogJiYgaGFzT3duUHJvcGVydHkuY2FsbChvdGhlciwgJ19fd3JhcHBlZF9fJyk7XHJcblxyXG4gICAgaWYgKG9iaklzV3JhcHBlZCB8fCBvdGhJc1dyYXBwZWQpIHtcclxuICAgICAgbGV0IG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LFxyXG4gICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjtcclxuXHJcbiAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjaygpKTtcclxuICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAoIWlzU2FtZVRhZykge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2soKSk7XHJcbiAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSwgY3VzdG9taXplcikge1xyXG4gIGxldCBpbmRleCA9IG1hdGNoRGF0YS5sZW5ndGgsXHJcbiAgICBsZW5ndGggPSBpbmRleCxcclxuICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyO1xyXG5cclxuICBpZiAob2JqZWN0ID09IG51bGwpIHtcclxuICAgIHJldHVybiAhbGVuZ3RoO1xyXG4gIH1cclxuICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTtcclxuICB3aGlsZSAoaW5kZXgtLSkge1xyXG4gICAgbGV0IGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdO1xyXG4gICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdID8gZGF0YVsxXSAhPT0gb2JqZWN0W2RhdGFbMF1dIDogIShkYXRhWzBdIGluIG9iamVjdCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07XHJcbiAgICBsZXQga2V5ID0gZGF0YVswXSxcclxuICAgICAgb2JqVmFsdWUgPSBvYmplY3Rba2V5XSxcclxuICAgICAgc3JjVmFsdWUgPSBkYXRhWzFdO1xyXG5cclxuICAgIGlmIChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkge1xyXG4gICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc3RhY2sgPSBuZXcgU3RhY2soKTtcclxuICAgICAgaWYgKGN1c3RvbWl6ZXIpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIShyZXN1bHQgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgPyBiYXNlSXNFcXVhbChcclxuICAgICAgICAgICAgICBzcmNWYWx1ZSxcclxuICAgICAgICAgICAgICBvYmpWYWx1ZSxcclxuICAgICAgICAgICAgICBjdXN0b21pemVyLFxyXG4gICAgICAgICAgICAgIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgfCBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgICAgICAgICAgICBzdGFja1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICA6IHJlc3VsdClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHtcclxuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSB8fCBpc01hc2tlZCh2YWx1ZSkpIHtcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbiAgbGV0IHBhdHRlcm4gPSBpc0Z1bmN0aW9uKHZhbHVlKSB8fCBpc0hvc3RPYmplY3QodmFsdWUpID8gcmVJc05hdGl2ZSA6IHJlSXNIb3N0Q3RvcjtcclxuICByZXR1cm4gcGF0dGVybi50ZXN0KHRvU291cmNlKHZhbHVlKSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHtcclxuICByZXR1cm4gKFxyXG4gICAgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpICYmICEhdHlwZWRBcnJheVRhZ3Nbb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSldXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUl0ZXJhdGVlKHZhbHVlKSB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICByZXR1cm4gaWRlbnRpdHk7XHJcbiAgfVxyXG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IGJhc2VNYXRjaGVzUHJvcGVydHkodmFsdWVbMF0sIHZhbHVlWzFdKSA6IGJhc2VNYXRjaGVzKHZhbHVlKTtcclxuICB9XHJcbiAgcmV0dXJuIHByb3BlcnR5KHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZUtleXMob2JqZWN0KSB7XHJcbiAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7XHJcbiAgICByZXR1cm4gbmF0aXZlS2V5cyhvYmplY3QpO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gW107XHJcbiAgZm9yIChsZXQga2V5IGluIE9iamVjdChvYmplY3QpKSB7XHJcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHtcclxuICAgICAgcmVzdWx0LnB1c2goa2V5KTtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZU1hcChjb2xsZWN0aW9uLCBpdGVyYXRlZSkge1xyXG4gIGxldCBpbmRleCA9IC0xLFxyXG4gICAgcmVzdWx0ID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBBcnJheShjb2xsZWN0aW9uLmxlbmd0aCkgOiBbXTtcclxuXHJcbiAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24gKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHtcclxuICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJhc2VNYXRjaGVzKHNvdXJjZSkge1xyXG4gIGxldCBtYXRjaERhdGEgPSBnZXRNYXRjaERhdGEoc291cmNlKTtcclxuICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkge1xyXG4gICAgcmV0dXJuIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKG1hdGNoRGF0YVswXVswXSwgbWF0Y2hEYXRhWzBdWzFdKTtcclxuICB9XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhKTtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7XHJcbiAgaWYgKGlzS2V5KHBhdGgpICYmIGlzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHtcclxuICAgIHJldHVybiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZSh0b0tleShwYXRoKSwgc3JjVmFsdWUpO1xyXG4gIH1cclxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xyXG4gICAgbGV0IG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgICByZXR1cm4gb2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWVcclxuICAgICAgPyBoYXNJbihvYmplY3QsIHBhdGgpXHJcbiAgICAgIDogYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCB1bmRlZmluZWQsIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgfCBQQVJUSUFMX0NPTVBBUkVfRkxBRyk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHtcclxuICBsZXQgaW5kZXggPSAtMTtcclxuICBpdGVyYXRlZXMgPSBhcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XSwgYmFzZVVuYXJ5KGJhc2VJdGVyYXRlZSkpO1xyXG5cclxuICBsZXQgcmVzdWx0ID0gYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbiAodmFsdWUsIGtleSwgY29sbGVjdGlvbikge1xyXG4gICAgbGV0IGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbiAoaXRlcmF0ZWUpIHtcclxuICAgICAgcmV0dXJuIGl0ZXJhdGVlKHZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHsgY3JpdGVyaWE6IGNyaXRlcmlhLCBpbmRleDogKytpbmRleCwgdmFsdWU6IHZhbHVlIH07XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24gKG9iamVjdCwgb3RoZXIpIHtcclxuICAgIHJldHVybiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7XHJcbiAgcmV0dXJuIGZ1bmN0aW9uIChvYmplY3QpIHtcclxuICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7XHJcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XHJcbiAgICByZXR1cm4gc3ltYm9sVG9TdHJpbmcgPyBzeW1ib2xUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdmFsdWUgKyAnJztcclxuICByZXR1cm4gcmVzdWx0ID09ICcwJyAmJiAxIC8gdmFsdWUgPT0gLUlORklOSVRZID8gJy0wJyA6IHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUpIHtcclxuICByZXR1cm4gaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IHN0cmluZ1RvUGF0aCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7XHJcbiAgaWYgKHZhbHVlICE9PSBvdGhlcikge1xyXG4gICAgbGV0IHZhbElzRGVmaW5lZCA9IHZhbHVlICE9PSB1bmRlZmluZWQsXHJcbiAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLFxyXG4gICAgICB2YWxJc1JlZmxleGl2ZSA9IHZhbHVlID09PSB2YWx1ZSxcclxuICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7XHJcblxyXG4gICAgbGV0IG90aElzRGVmaW5lZCA9IG90aGVyICE9PSB1bmRlZmluZWQsXHJcbiAgICAgIG90aElzTnVsbCA9IG90aGVyID09PSBudWxsLFxyXG4gICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlcixcclxuICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChvdGhlcik7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8XHJcbiAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8XHJcbiAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fFxyXG4gICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHxcclxuICAgICAgIXZhbElzUmVmbGV4aXZlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgICghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHxcclxuICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHxcclxuICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8XHJcbiAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fFxyXG4gICAgICAhb3RoSXNSZWZsZXhpdmVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gLTE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiAwO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7XHJcbiAgbGV0IGluZGV4ID0gLTEsXHJcbiAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSxcclxuICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsXHJcbiAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsXHJcbiAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoO1xyXG5cclxuICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IGNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pO1xyXG4gICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICBpZiAoaW5kZXggPj0gb3JkZXJzTGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgICBsZXQgb3JkZXIgPSBvcmRlcnNbaW5kZXhdO1xyXG4gICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7XHJcbiAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBjb2xsZWN0aW9uO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkge1xyXG4gICAgICByZXR1cm4gZWFjaEZ1bmMoY29sbGVjdGlvbiwgaXRlcmF0ZWUpO1xyXG4gICAgfVxyXG4gICAgbGV0IGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoO1xyXG5cclxuICAgIGxldCBpbmRleCA9IGZyb21SaWdodCA/IGxlbmd0aCA6IC0xO1xyXG4gICAgbGV0IGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pO1xyXG5cclxuICAgIHdoaWxlIChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkge1xyXG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkge1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjcmVhdGVCYXNlRm9yKGZyb21SaWdodCkge1xyXG4gIHJldHVybiBmdW5jdGlvbiAob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHtcclxuICAgIGxldCBpbmRleCA9IC0xLFxyXG4gICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLFxyXG4gICAgICBwcm9wcyA9IGtleXNGdW5jKG9iamVjdCksXHJcbiAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcclxuICAgICAgbGV0IGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdO1xyXG4gICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Q7XHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZXF1YWxBcnJheXMoYXJyYXksIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSB7XHJcbiAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgIGFyckxlbmd0aCA9IGFycmF5Lmxlbmd0aCxcclxuICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDtcclxuXHJcbiAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgbGV0IHN0YWNrZWQgPSBzdGFjay5nZXQoYXJyYXkpO1xyXG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcclxuICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xyXG4gIH1cclxuICBsZXQgaW5kZXggPSAtMSxcclxuICAgIHJlc3VsdCA9IHRydWUsXHJcbiAgICBzZWVuID0gYml0bWFzayAmIFVOT1JERVJFRF9DT01QQVJFX0ZMQUcgPyBuZXcgU2V0Q2FjaGUoKSA6IHVuZGVmaW5lZDtcclxuXHJcbiAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7XHJcbiAgc3RhY2suc2V0KG90aGVyLCBhcnJheSk7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgYXJyTGVuZ3RoKSB7XHJcbiAgICBsZXQgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sXHJcbiAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdO1xyXG5cclxuICAgIGlmIChjdXN0b21pemVyKSB7XHJcbiAgICAgIGxldCBjb21wYXJlZCA9IGlzUGFydGlhbFxyXG4gICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKVxyXG4gICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTtcclxuICAgIH1cclxuICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChjb21wYXJlZCkge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2Vlbikge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24gKG90aFZhbHVlLCBvdGhJbmRleCkge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhc2Vlbi5oYXMob3RoSW5kZXgpICYmXHJcbiAgICAgICAgICAgIChhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwgZXF1YWxGdW5jKGFyclZhbHVlLCBvdGhWYWx1ZSwgY3VzdG9taXplciwgYml0bWFzaywgc3RhY2spKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmFkZChvdGhJbmRleCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICEoYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhhcnJWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSlcclxuICAgICkge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG4gIHN0YWNrWydkZWxldGUnXShhcnJheSk7XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgZXF1YWxGdW5jLCBjdXN0b21pemVyLCBiaXRtYXNrLCBzdGFjaykge1xyXG4gIHN3aXRjaCAodGFnKSB7XHJcbiAgICBjYXNlIGRhdGFWaWV3VGFnOlxyXG4gICAgICBpZiAob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCB8fCBvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIG9iamVjdCA9IG9iamVjdC5idWZmZXI7XHJcbiAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyO1xyXG5cclxuICAgIGNhc2UgYXJyYXlCdWZmZXJUYWc6XHJcbiAgICAgIGlmIChcclxuICAgICAgICBvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoIHx8XHJcbiAgICAgICAgIWVxdWFsRnVuYyhuZXcgVWludDhBcnJheShvYmplY3QpLCBuZXcgVWludDhBcnJheShvdGhlcikpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICBjYXNlIGJvb2xUYWc6XHJcbiAgICBjYXNlIGRhdGVUYWc6XHJcbiAgICBjYXNlIG51bWJlclRhZzpcclxuICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7XHJcblxyXG4gICAgY2FzZSBlcnJvclRhZzpcclxuICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTtcclxuXHJcbiAgICBjYXNlIHJlZ2V4cFRhZzpcclxuICAgIGNhc2Ugc3RyaW5nVGFnOlxyXG4gICAgICByZXR1cm4gb2JqZWN0ID09IG90aGVyICsgJyc7XHJcblxyXG4gICAgY2FzZSBtYXBUYWc6XHJcbiAgICAgIGxldCBjb252ZXJ0ID0gbWFwVG9BcnJheTtcclxuXHJcbiAgICBjYXNlIHNldFRhZzpcclxuICAgICAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRztcclxuICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpO1xyXG5cclxuICAgICAgaWYgKG9iamVjdC5zaXplICE9IG90aGVyLnNpemUgJiYgIWlzUGFydGlhbCkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTtcclxuICAgICAgaWYgKHN0YWNrZWQpIHtcclxuICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjtcclxuICAgICAgfVxyXG4gICAgICBiaXRtYXNrIHw9IFVOT1JERVJFRF9DT01QQVJFX0ZMQUc7XHJcblxyXG4gICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XHJcbiAgICAgIGxldCByZXN1bHQgPSBlcXVhbEFycmF5cyhcclxuICAgICAgICBjb252ZXJ0KG9iamVjdCksXHJcbiAgICAgICAgY29udmVydChvdGhlciksXHJcbiAgICAgICAgZXF1YWxGdW5jLFxyXG4gICAgICAgIGN1c3RvbWl6ZXIsXHJcbiAgICAgICAgYml0bWFzayxcclxuICAgICAgICBzdGFja1xyXG4gICAgICApO1xyXG4gICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuXHJcbiAgICBjYXNlIHN5bWJvbFRhZzpcclxuICAgICAgaWYgKHN5bWJvbFZhbHVlT2YpIHtcclxuICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZi5jYWxsKG9iamVjdCkgPT0gc3ltYm9sVmFsdWVPZi5jYWxsKG90aGVyKTtcclxuICAgICAgfVxyXG4gIH1cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBlcXVhbEZ1bmMsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKSB7XHJcbiAgbGV0IGlzUGFydGlhbCA9IGJpdG1hc2sgJiBQQVJUSUFMX0NPTVBBUkVfRkxBRyxcclxuICAgIG9ialByb3BzID0ga2V5cyhvYmplY3QpLFxyXG4gICAgb2JqTGVuZ3RoID0gb2JqUHJvcHMubGVuZ3RoLFxyXG4gICAgb3RoUHJvcHMgPSBrZXlzKG90aGVyKSxcclxuICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDtcclxuXHJcbiAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBsZXQgaW5kZXggPSBvYmpMZW5ndGg7XHJcbiAgd2hpbGUgKGluZGV4LS0pIHtcclxuICAgIGxldCBrZXkgPSBvYmpQcm9wc1tpbmRleF07XHJcbiAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBrZXkpKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsZXQgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpO1xyXG4gIGlmIChzdGFja2VkICYmIHN0YWNrLmdldChvdGhlcikpIHtcclxuICAgIHJldHVybiBzdGFja2VkID09IG90aGVyO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdHJ1ZTtcclxuICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7XHJcbiAgc3RhY2suc2V0KG90aGVyLCBvYmplY3QpO1xyXG5cclxuICBsZXQgc2tpcEN0b3IgPSBpc1BhcnRpYWw7XHJcbiAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHtcclxuICAgIGtleSA9IG9ialByb3BzW2luZGV4XTtcclxuICAgIGxldCBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLFxyXG4gICAgICBvdGhWYWx1ZSA9IG90aGVyW2tleV07XHJcblxyXG4gICAgaWYgKGN1c3RvbWl6ZXIpIHtcclxuICAgICAgbGV0IGNvbXBhcmVkID0gaXNQYXJ0aWFsXHJcbiAgICAgICAgPyBjdXN0b21pemVyKG90aFZhbHVlLCBvYmpWYWx1ZSwga2V5LCBvdGhlciwgb2JqZWN0LCBzdGFjaylcclxuICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgICEoY29tcGFyZWQgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgID8gb2JqVmFsdWUgPT09IG90aFZhbHVlIHx8IGVxdWFsRnVuYyhvYmpWYWx1ZSwgb3RoVmFsdWUsIGN1c3RvbWl6ZXIsIGJpdG1hc2ssIHN0YWNrKVxyXG4gICAgICAgIDogY29tcGFyZWQpXHJcbiAgICApIHtcclxuICAgICAgcmVzdWx0ID0gZmFsc2U7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgc2tpcEN0b3IgfHwgKHNraXBDdG9yID0ga2V5ID09ICdjb25zdHJ1Y3RvcicpO1xyXG4gIH1cclxuICBpZiAocmVzdWx0ICYmICFza2lwQ3Rvcikge1xyXG4gICAgbGV0IG9iakN0b3IgPSBvYmplY3QuY29uc3RydWN0b3IsXHJcbiAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIG9iakN0b3IgIT0gb3RoQ3RvciAmJlxyXG4gICAgICAnY29uc3RydWN0b3InIGluIG9iamVjdCAmJlxyXG4gICAgICAnY29uc3RydWN0b3InIGluIG90aGVyICYmXHJcbiAgICAgICEoXHJcbiAgICAgICAgdHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgIG9iakN0b3IgaW5zdGFuY2VvZiBvYmpDdG9yICYmXHJcbiAgICAgICAgdHlwZW9mIG90aEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJlxyXG4gICAgICAgIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yXHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICByZXN1bHQgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7XHJcbiAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTtcclxuICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7XHJcbiAgbGV0IGRhdGEgPSBtYXAuX19kYXRhX187XHJcbiAgcmV0dXJuIGlzS2V5YWJsZShrZXkpID8gZGF0YVt0eXBlb2Yga2V5ID09ICdzdHJpbmcnID8gJ3N0cmluZycgOiAnaGFzaCddIDogZGF0YS5tYXA7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE1hdGNoRGF0YShvYmplY3QpIHtcclxuICBsZXQgcmVzdWx0ID0ga2V5cyhvYmplY3QpLFxyXG4gICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDtcclxuXHJcbiAgd2hpbGUgKGxlbmd0aC0tKSB7XHJcbiAgICBsZXQga2V5ID0gcmVzdWx0W2xlbmd0aF0sXHJcbiAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07XHJcblxyXG4gICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07XHJcbiAgfVxyXG4gIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkge1xyXG4gIGxldCB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTtcclxuICByZXR1cm4gYmFzZUlzTmF0aXZlKHZhbHVlKSA/IHZhbHVlIDogdW5kZWZpbmVkO1xyXG59XHJcblxyXG5sZXQgZ2V0VGFnID0gYmFzZUdldFRhZztcclxuXHJcbmlmIChcclxuICAoRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoMSkpKSAhPSBkYXRhVmlld1RhZykgfHxcclxuICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKCkpICE9IG1hcFRhZykgfHxcclxuICAoUHJvbWlzZSAmJiBnZXRUYWcoUHJvbWlzZS5yZXNvbHZlKCkpICE9IHByb21pc2VUYWcpIHx8XHJcbiAgKFNldCAmJiBnZXRUYWcobmV3IFNldCgpKSAhPSBzZXRUYWcpIHx8XHJcbiAgKFdlYWtNYXAgJiYgZ2V0VGFnKG5ldyBXZWFrTWFwKCkpICE9IHdlYWtNYXBUYWcpXHJcbikge1xyXG4gIGdldFRhZyA9IGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgbGV0IHJlc3VsdCA9IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpLFxyXG4gICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkLFxyXG4gICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmIChjdG9yU3RyaW5nKSB7XHJcbiAgICAgIHN3aXRjaCAoY3RvclN0cmluZykge1xyXG4gICAgICAgIGNhc2UgZGF0YVZpZXdDdG9yU3RyaW5nOlxyXG4gICAgICAgICAgcmV0dXJuIGRhdGFWaWV3VGFnO1xyXG4gICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBtYXBUYWc7XHJcbiAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBwcm9taXNlVGFnO1xyXG4gICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiBzZXRUYWc7XHJcbiAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzpcclxuICAgICAgICAgIHJldHVybiB3ZWFrTWFwVGFnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7XHJcbiAgcGF0aCA9IGlzS2V5KHBhdGgsIG9iamVjdCkgPyBbcGF0aF0gOiBjYXN0UGF0aChwYXRoKTtcclxuXHJcbiAgbGV0IHJlc3VsdDtcclxuICBsZXQgaW5kZXggPSAtMTtcclxuICBsZXQgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XHJcblxyXG4gIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XHJcbiAgICBsZXQga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pO1xyXG4gICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XHJcbiAgfVxyXG4gIGlmIChyZXN1bHQpIHtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG4gIGxlbmd0aCA9IG9iamVjdCA/IG9iamVjdC5sZW5ndGggOiAwO1xyXG4gIHJldHVybiAoXHJcbiAgICAhIWxlbmd0aCAmJiBpc0xlbmd0aChsZW5ndGgpICYmIGlzSW5kZXgoa2V5LCBsZW5ndGgpICYmIChpc0FycmF5KG9iamVjdCkgfHwgaXNBcmd1bWVudHMob2JqZWN0KSlcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcclxuICBsZW5ndGggPSBsZW5ndGggPT0gbnVsbCA/IE1BWF9TQUZFX0lOVEVHRVIgOiBsZW5ndGg7XHJcbiAgcmV0dXJuIChcclxuICAgICEhbGVuZ3RoICYmXHJcbiAgICAodHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8IHJlSXNVaW50LnRlc3QodmFsdWUpKSAmJlxyXG4gICAgdmFsdWUgPiAtMSAmJlxyXG4gICAgdmFsdWUgJSAxID09IDAgJiZcclxuICAgIHZhbHVlIDwgbGVuZ3RoXHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkge1xyXG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBsZXQgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcclxuICBpZiAoXHJcbiAgICB0eXBlID09ICdudW1iZXInIHx8XHJcbiAgICB0eXBlID09ICdzeW1ib2wnIHx8XHJcbiAgICB0eXBlID09ICdib29sZWFuJyB8fFxyXG4gICAgdmFsdWUgPT0gbnVsbCB8fFxyXG4gICAgaXNTeW1ib2wodmFsdWUpXHJcbiAgKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcbiAgcmV0dXJuIChcclxuICAgIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHxcclxuICAgICFyZUlzRGVlcFByb3AudGVzdCh2YWx1ZSkgfHxcclxuICAgIChvYmplY3QgIT0gbnVsbCAmJiB2YWx1ZSBpbiBPYmplY3Qob2JqZWN0KSlcclxuICApO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHtcclxuICBsZXQgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcclxuICByZXR1cm4gdHlwZSA9PSAnc3RyaW5nJyB8fCB0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbidcclxuICAgID8gdmFsdWUgIT09ICdfX3Byb3RvX18nXHJcbiAgICA6IHZhbHVlID09PSBudWxsO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7XHJcbiAgcmV0dXJuICEhbWFza1NyY0tleSAmJiBtYXNrU3JjS2V5IGluIGZ1bmM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7XHJcbiAgbGV0IEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvcixcclxuICAgIHByb3RvID0gKHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3Rvci5wcm90b3R5cGUpIHx8IG9iamVjdFByb3RvO1xyXG5cclxuICByZXR1cm4gdmFsdWUgPT09IHByb3RvO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHtcclxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlICYmICFpc09iamVjdCh2YWx1ZSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG1hdGNoZXNTdHJpY3RDb21wYXJhYmxlKGtleSwgc3JjVmFsdWUpIHtcclxuICByZXR1cm4gZnVuY3Rpb24gKG9iamVjdCkge1xyXG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiYgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQgfHwga2V5IGluIE9iamVjdChvYmplY3QpKTtcclxuICB9O1xyXG59XHJcblxyXG5sZXQgc3RyaW5nVG9QYXRoID0gbWVtb2l6ZShmdW5jdGlvbiAoc3RyaW5nKSB7XHJcbiAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTtcclxuXHJcbiAgbGV0IHJlc3VsdCA9IFtdO1xyXG4gIGlmIChyZUxlYWRpbmdEb3QudGVzdChzdHJpbmcpKSB7XHJcbiAgICByZXN1bHQucHVzaCgnJyk7XHJcbiAgfVxyXG4gIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uIChtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3RyaW5nKSB7XHJcbiAgICByZXN1bHQucHVzaChxdW90ZSA/IHN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwgJyQxJykgOiBudW1iZXIgfHwgbWF0Y2gpO1xyXG4gIH0pO1xyXG4gIHJldHVybiByZXN1bHQ7XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gdG9LZXkodmFsdWUpIHtcclxuICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sKHZhbHVlKSkge1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cclxuICBsZXQgcmVzdWx0ID0gdmFsdWUgKyAnJztcclxuICByZXR1cm4gcmVzdWx0ID09ICcwJyAmJiAxIC8gdmFsdWUgPT0gLUlORklOSVRZID8gJy0wJyA6IHJlc3VsdDtcclxufVxyXG5cclxuZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykge1xyXG4gIGlmIChmdW5jICE9IG51bGwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTtcclxuICAgIH0gY2F0Y2ggKGUpIHt9XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnVuYyArICcnO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuICB9XHJcbiAgcmV0dXJuICcnO1xyXG59XHJcblxyXG5mdW5jdGlvbiB6eGhpZGRlbkN1c3RvbU9yZGVyQnlCeUplcmVteUFzaGtlbmFzKGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKSB7XHJcbiAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkge1xyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuICBpZiAoIWlzQXJyYXkoaXRlcmF0ZWVzKSkge1xyXG4gICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdO1xyXG4gIH1cclxuXHJcbiAgaWYgKCFpc0FycmF5KG9yZGVycykpIHtcclxuICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTtcclxuICB9XHJcbiAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGl0ZXJhdGVlcywgb3JkZXJzKTtcclxufVxyXG5cclxuZnVuY3Rpb24gbWVtb2l6ZShmdW5jLCByZXNvbHZlcikge1xyXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAmJiB0eXBlb2YgcmVzb2x2ZXIgIT0gJ2Z1bmN0aW9uJykpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtcclxuICB9XHJcbiAgbGV0IG1lbW9pemVkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgbGV0IGFyZ3MgPSBhcmd1bWVudHMsXHJcbiAgICAgIGtleSA9IHJlc29sdmVyID8gcmVzb2x2ZXIuYXBwbHkodGhpcywgYXJncykgOiBhcmdzWzBdLFxyXG4gICAgICBjYWNoZSA9IG1lbW9pemVkLmNhY2hlO1xyXG5cclxuICAgIGlmIChjYWNoZS5oYXMoa2V5KSkge1xyXG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfTtcclxuICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSkoKTtcclxuICByZXR1cm4gbWVtb2l6ZWQ7XHJcbn1cclxuXHJcbm1lbW9pemUuQ2FjaGUgPSBNYXBDYWNoZTtcclxuXHJcbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xyXG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FyZ3VtZW50cyh2YWx1ZSkge1xyXG4gIHJldHVybiAoXHJcbiAgICBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgJiZcclxuICAgIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJlxyXG4gICAgKCFwcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHZhbHVlLCAnY2FsbGVlJykgfHwgb2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gYXJnc1RhZylcclxuICApO1xyXG59XHJcblxyXG5sZXQgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XHJcblxyXG5mdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkge1xyXG4gIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTtcclxufVxyXG5cclxuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xyXG4gIGxldCB0YWcgPSBpc09iamVjdCh2YWx1ZSkgPyBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA6ICcnO1xyXG4gIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xyXG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xyXG4gIGxldCB0eXBlID0gdHlwZW9mIHZhbHVlO1xyXG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xyXG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JztcclxufVxyXG5cclxuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcclxuICByZXR1cm4gKFxyXG4gICAgdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8IChpc09iamVjdExpa2UodmFsdWUpICYmIG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IHN5bWJvbFRhZylcclxuICApO1xyXG59XHJcblxyXG5sZXQgaXNUeXBlZEFycmF5ID0gbm9kZUlzVHlwZWRBcnJheSA/IGJhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IGJhc2VJc1R5cGVkQXJyYXk7XHJcblxyXG5mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZSA9PSBudWxsID8gJycgOiBiYXNlVG9TdHJpbmcodmFsdWUpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHtcclxuICBsZXQgcmVzdWx0ID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7XHJcbiAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0O1xyXG59XHJcblxyXG5mdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHtcclxuICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYgaGFzUGF0aChvYmplY3QsIHBhdGgsIGJhc2VIYXNJbik7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XHJcbiAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpO1xyXG59XHJcblxyXG5mdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xyXG4gIHJldHVybiB2YWx1ZTtcclxufVxyXG5cclxuZnVuY3Rpb24gcHJvcGVydHkocGF0aCkge1xyXG4gIHJldHVybiBpc0tleShwYXRoKSA/IGJhc2VQcm9wZXJ0eSh0b0tleShwYXRoKSkgOiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB6eGhpZGRlbkN1c3RvbU9yZGVyQnlCeUplcmVteUFzaGtlbmFzO1xyXG4iXX0=