socket-function 1.1.49 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -0,0 +1,499 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.watchSlowPromise = exports.errorToWarning = exports.timeoutToUndefinedSilent = exports.timeoutToUndefined = exports.timeoutToError = exports.removeFromSortedList = exports.insertIntoSortedList = exports.compareArray = exports.compare = exports.binarySearchIndex = exports.binarySearchBasic2 = exports.binarySearchBasic = exports.QueueLimited = exports.getRootDomain = exports.sort = exports.keys = exports.entries = exports.last = exports.arrayFromOrderObject = exports.nextId = exports.throttleFunction = exports.promiseObj = exports.PromiseObj = exports.deepCloneJSON = exports.keyByArray = exports.keyBy = exports.getStringKeys = exports.getKeys = exports.isBufferType = exports.recursiveFreeze = exports.list = exports.formatNumberSuffixed = exports.isNodeTrue = exports.isNode = exports.arrayEqual = exports.sha256BufferPromise = exports.sha256HashPromise = exports.sha256HashBuffer = exports.sha256Hash = exports.convertErrorStackToError = exports.timeInYear = exports.timeInWeek = exports.timeInDay = exports.timeInHour = exports.timeInMinute = exports.timeInSecond = void 0;
4
+ const types_1 = require("./types");
5
+ const format_1 = require("./formatting/format");
6
+ const batching_1 = require("./batching");
7
+ const logColors_1 = require("./formatting/logColors");
8
+ exports.timeInSecond = 1000;
9
+ exports.timeInMinute = exports.timeInSecond * 60;
10
+ exports.timeInHour = exports.timeInMinute * 60;
11
+ exports.timeInDay = exports.timeInHour * 24;
12
+ exports.timeInWeek = exports.timeInDay * 7;
13
+ exports.timeInYear = exports.timeInDay * 365;
14
+ function convertErrorStackToError(error) {
15
+ let errorObj = new Error();
16
+ errorObj.stack = String(error);
17
+ errorObj.message = String(error).split("\n")[0].slice("Error: ".length);
18
+ return errorObj;
19
+ }
20
+ exports.convertErrorStackToError = convertErrorStackToError;
21
+ function sha256Hash(buffer) {
22
+ return require("crypto").createHash("sha256").update(buffer).digest("hex");
23
+ }
24
+ exports.sha256Hash = sha256Hash;
25
+ function sha256HashBuffer(buffer) {
26
+ return require("crypto").createHash("sha256").update(buffer).digest();
27
+ }
28
+ exports.sha256HashBuffer = sha256HashBuffer;
29
+ /** Async, but works both clientside and serverside. */
30
+ async function sha256HashPromise(buffer) {
31
+ if (isNode()) {
32
+ return require("crypto").createHash("sha256").update(buffer).digest("hex");
33
+ }
34
+ else {
35
+ let buf = await window.crypto.subtle.digest("SHA-256", buffer);
36
+ return Buffer.from(buf).toString("hex");
37
+ }
38
+ }
39
+ exports.sha256HashPromise = sha256HashPromise;
40
+ async function sha256BufferPromise(buffer) {
41
+ if (isNode()) {
42
+ return require("crypto").createHash("sha256").update(buffer).digest();
43
+ }
44
+ else {
45
+ let buf = await window.crypto.subtle.digest("SHA-256", buffer);
46
+ return Buffer.from(buf);
47
+ }
48
+ }
49
+ exports.sha256BufferPromise = sha256BufferPromise;
50
+ function arrayEqual(a, b) {
51
+ if (a.length !== b.length)
52
+ return false;
53
+ for (let i = 0; i < a.length; i++) {
54
+ if (a[i] !== b[i])
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+ exports.arrayEqual = arrayEqual;
60
+ function isNode() {
61
+ return typeof document === "undefined" && typeof globalThis.WorkerGlobalScope === "undefined";
62
+ }
63
+ exports.isNode = isNode;
64
+ function isNodeTrue() {
65
+ return isNode();
66
+ }
67
+ exports.isNodeTrue = isNodeTrue;
68
+ function formatNumberSuffixed(count) {
69
+ return (0, format_1.formatNumber)(count);
70
+ }
71
+ exports.formatNumberSuffixed = formatNumberSuffixed;
72
+ function list(count) {
73
+ let arr = [];
74
+ for (let i = 0; i < count; i++) {
75
+ arr.push(i);
76
+ }
77
+ return arr;
78
+ }
79
+ exports.list = list;
80
+ function recursiveFreeze(obj) {
81
+ if (!(0, types_1.canHaveChildren)(obj))
82
+ return obj;
83
+ let visited = new Set();
84
+ function iterate(obj) {
85
+ if (!(0, types_1.canHaveChildren)(obj))
86
+ return;
87
+ if (visited.has(obj))
88
+ return;
89
+ visited.add(obj);
90
+ if (ArrayBuffer.isView(obj))
91
+ return;
92
+ Object.freeze(obj);
93
+ let keys = getKeys(obj);
94
+ for (let key of keys) {
95
+ iterate(obj[key]);
96
+ }
97
+ }
98
+ iterate(obj);
99
+ return obj;
100
+ }
101
+ exports.recursiveFreeze = recursiveFreeze;
102
+ function isBufferType(obj) {
103
+ if (typeof obj !== "object")
104
+ return false;
105
+ if (!obj)
106
+ return false;
107
+ if (ArrayBuffer.isView(obj))
108
+ return true;
109
+ if (obj instanceof ArrayBuffer)
110
+ return true;
111
+ if (global.SharedArrayBuffer && obj instanceof global.SharedArrayBuffer)
112
+ return true;
113
+ return false;
114
+ }
115
+ exports.isBufferType = isBufferType;
116
+ function getKeys(obj) {
117
+ if (typeof obj !== "object" && typeof obj !== "function" || obj === null) {
118
+ return [];
119
+ }
120
+ if (obj instanceof MessagePort) {
121
+ return [];
122
+ }
123
+ let keyArray;
124
+ if (isBufferType(obj)) {
125
+ keyArray = [];
126
+ }
127
+ else if (Array.isArray(obj)) {
128
+ // NOTE: We convert the indexes to strings, because that is what javascript does,
129
+ // and differing from it causes regressions that we simply cannot rectify (it breaks hashing
130
+ // consistency).
131
+ keyArray = Array(obj.length).fill(0).map((x, i) => String(i));
132
+ }
133
+ else {
134
+ keyArray = Object.keys(obj);
135
+ }
136
+ for (let symbol of Object.getOwnPropertySymbols(obj)) {
137
+ let key = Symbol.keyFor(symbol);
138
+ if (key) {
139
+ keyArray.push(symbol);
140
+ }
141
+ }
142
+ return keyArray;
143
+ }
144
+ exports.getKeys = getKeys;
145
+ function getStringKeys(obj) {
146
+ return Object.keys(obj);
147
+ }
148
+ exports.getStringKeys = getStringKeys;
149
+ function keyBy(arr, getKey) {
150
+ let map = new Map();
151
+ for (let item of arr) {
152
+ map.set(getKey(item), item);
153
+ }
154
+ return map;
155
+ }
156
+ exports.keyBy = keyBy;
157
+ function keyByArray(arr, getKey) {
158
+ let map = new Map();
159
+ for (let item of arr) {
160
+ let key = getKey(item);
161
+ let arr = map.get(key);
162
+ if (!arr) {
163
+ arr = [];
164
+ map.set(key, arr);
165
+ }
166
+ arr.push(item);
167
+ }
168
+ return map;
169
+ }
170
+ exports.keyByArray = keyByArray;
171
+ function deepCloneJSON(obj) {
172
+ if (obj === undefined)
173
+ return obj;
174
+ let str = JSON.stringify(obj);
175
+ // It is possible for an object to not be defined, but return undefined when JSON.stringified,
176
+ // via overriding the toJSON method.
177
+ if (str === undefined)
178
+ return undefined;
179
+ return JSON.parse(str);
180
+ }
181
+ exports.deepCloneJSON = deepCloneJSON;
182
+ class PromiseObj {
183
+ constructor() {
184
+ this.resolve = (value) => {
185
+ this.resolveCalled = true;
186
+ if (typeof value === "object" && value !== null && value instanceof Promise) {
187
+ value.then(value => this.value = { value }, error => this.value = { error });
188
+ }
189
+ else {
190
+ this.value = { value };
191
+ }
192
+ this.baseResolve(value);
193
+ };
194
+ this.reject = (error) => {
195
+ this.baseReject(error);
196
+ };
197
+ this.promise = new Promise((resolve, reject) => {
198
+ this.baseResolve = resolve;
199
+ this.baseReject = reject;
200
+ });
201
+ this.promise.then(value => this.value = { value }, error => this.value = { error });
202
+ }
203
+ }
204
+ exports.PromiseObj = PromiseObj;
205
+ function promiseObj() {
206
+ return new PromiseObj();
207
+ }
208
+ exports.promiseObj = promiseObj;
209
+ // Allows an immediate call, then delays the next call until the first call finishes + delay
210
+ // - Drops all but the latest call, but only resolves the promises return to all
211
+ // calls once the latest call finishes.
212
+ // - Esentially the same as saying "don't run this function too often, don't run it in parallel,
213
+ // and don't let functions runs be too close together".
214
+ function throttleFunction(delay, fnc) {
215
+ let nextAllowedCall = 0;
216
+ let pendingArgs = undefined;
217
+ function doCall(args, promiseObj) {
218
+ try {
219
+ let result = fnc(...args);
220
+ promiseObj.resolve(result);
221
+ if (result instanceof Promise) {
222
+ // NOTE: The caller should handle the promise. If not, they probably
223
+ // want the unresolved promise rejection, so they can handle it properly.
224
+ void result.finally(() => {
225
+ nextAllowedCall = Date.now() + delay;
226
+ runNextCall();
227
+ });
228
+ }
229
+ else {
230
+ nextAllowedCall = Date.now() + delay;
231
+ runNextCall();
232
+ }
233
+ }
234
+ catch (e) {
235
+ promiseObj.reject(e);
236
+ nextAllowedCall = Date.now() + delay;
237
+ runNextCall();
238
+ }
239
+ }
240
+ function runNextCall() {
241
+ if (nextAllowedCall === Number.POSITIVE_INFINITY)
242
+ return;
243
+ if (!pendingArgs)
244
+ return;
245
+ let time = Date.now();
246
+ if (time > nextAllowedCall) {
247
+ // Set nextAllowedCall to infinity, to prevent new calls from running
248
+ // until doCall finishes.
249
+ nextAllowedCall = Number.POSITIVE_INFINITY;
250
+ // Delay, so we don't turn a series of sequential calls to a series of nested calls
251
+ // (which will cause a stack overflow)
252
+ setTimeout(() => {
253
+ let args = pendingArgs;
254
+ pendingArgs = undefined;
255
+ if (!args) {
256
+ nextAllowedCall = 0;
257
+ console.warn(`Impossible, pendingArgs was reset when we shouldn't have even been in a call`);
258
+ return;
259
+ }
260
+ doCall(args.args, args.promiseObj);
261
+ }, 0);
262
+ }
263
+ else {
264
+ setTimeout(runNextCall, nextAllowedCall - time);
265
+ }
266
+ }
267
+ return function (...args) {
268
+ if (pendingArgs) {
269
+ pendingArgs.args = args;
270
+ return pendingArgs.promiseObj.promise;
271
+ }
272
+ pendingArgs = { args, promiseObj: promiseObj() };
273
+ runNextCall();
274
+ return pendingArgs.promiseObj.promise;
275
+ };
276
+ }
277
+ exports.throttleFunction = throttleFunction;
278
+ function nextId() {
279
+ return Date.now() + "_" + Math.random();
280
+ }
281
+ exports.nextId = nextId;
282
+ function arrayFromOrderObject(obj) {
283
+ if (Array.isArray(obj))
284
+ return obj.slice();
285
+ return Object.entries(obj).sort((a, b) => +a[0] - +b[0]).map(x => x[1]).filter(x => x !== undefined && x !== null);
286
+ }
287
+ exports.arrayFromOrderObject = arrayFromOrderObject;
288
+ function last(arr) {
289
+ return arr[arr.length - 1];
290
+ }
291
+ exports.last = last;
292
+ function entries(obj) {
293
+ return Object.entries(obj);
294
+ }
295
+ exports.entries = entries;
296
+ function keys(obj) {
297
+ return Object.keys(obj);
298
+ }
299
+ exports.keys = keys;
300
+ function sort(arr, sortKey) {
301
+ if (arr.length <= 1)
302
+ return arr;
303
+ arr.sort((a, b) => compare(sortKey(a), sortKey(b)));
304
+ return arr;
305
+ }
306
+ exports.sort = sort;
307
+ function getRootDomain(hostname) {
308
+ if (hostname.startsWith("https://")) {
309
+ hostname = hostname.slice("https://".length);
310
+ }
311
+ hostname = hostname.split("/")[0];
312
+ let parts = hostname.split(".");
313
+ hostname = parts.slice(-2).join(".");
314
+ hostname = hostname.split(":")[0];
315
+ return hostname;
316
+ }
317
+ exports.getRootDomain = getRootDomain;
318
+ class QueueLimited {
319
+ constructor(maxCount) {
320
+ this.maxCount = maxCount;
321
+ this.items = [];
322
+ this.nextIndex = 0;
323
+ }
324
+ push(item) {
325
+ this.items[this.nextIndex] = item;
326
+ this.nextIndex = (this.nextIndex + 1) % this.maxCount;
327
+ }
328
+ getAllUnordered() {
329
+ return this.items;
330
+ }
331
+ reset() {
332
+ this.items = [];
333
+ this.nextIndex = 0;
334
+ }
335
+ clear() {
336
+ this.reset();
337
+ }
338
+ getOldest() {
339
+ if (this.items.length === 0)
340
+ return undefined;
341
+ let index = this.nextIndex - 1;
342
+ if (index === -1) {
343
+ index += this.maxCount;
344
+ }
345
+ return this.items[index];
346
+ }
347
+ }
348
+ exports.QueueLimited = QueueLimited;
349
+ function binarySearchBasic(array, getVal, searchValue) {
350
+ return binarySearchIndex(array.length, i => compare(getVal(array[i]), searchValue));
351
+ }
352
+ exports.binarySearchBasic = binarySearchBasic;
353
+ function binarySearchBasic2(array, getVal, searchValue) {
354
+ return binarySearchIndex(array.length, i => compare(getVal(array[i]), getVal(searchValue)));
355
+ }
356
+ exports.binarySearchBasic2 = binarySearchBasic2;
357
+ /**
358
+ * Searches indexes, allowing you to query structures that aren't arrays. To search an array, use:
359
+ * `binarySearchIndex(array.length, i => compare(array[i], searchValue))`
360
+ *
361
+ * NOTE: If there are duplicates, returns the first match.
362
+ *
363
+ * NOTE: If the value can't be found, returns the bitwise negation of the index where it should be inserted.
364
+ *
365
+ * NOTE: With `if (index < 0) index = ~index;` you will get an index of the value >= the target value.
366
+ */
367
+ function binarySearchIndex(listCount, compare) {
368
+ if (listCount === 0) {
369
+ return ~0;
370
+ }
371
+ let min = 0;
372
+ let max = listCount - 1;
373
+ while (min < max) {
374
+ let fingerIndex = Math.floor((max + min) / 2);
375
+ let comparisonValue = compare(fingerIndex);
376
+ if (comparisonValue < 0) {
377
+ min = fingerIndex + 1;
378
+ }
379
+ else {
380
+ max = fingerIndex;
381
+ }
382
+ }
383
+ let comparison = compare(min);
384
+ if (comparison === 0)
385
+ return min;
386
+ if (comparison > 0)
387
+ return ~min;
388
+ return ~(min + 1);
389
+ }
390
+ exports.binarySearchIndex = binarySearchIndex;
391
+ function compare(lhs, rhs) {
392
+ if (typeof lhs !== typeof rhs) {
393
+ return compare(typeof lhs, typeof rhs);
394
+ }
395
+ if (lhs === rhs)
396
+ return 0;
397
+ if (lhs === null && rhs !== null)
398
+ return -1;
399
+ if (lhs !== null && rhs === null)
400
+ return 1;
401
+ if (typeof lhs === "number") {
402
+ if (Number.isNaN(lhs)) {
403
+ if (Number.isNaN(rhs))
404
+ return 0;
405
+ return -1;
406
+ }
407
+ else {
408
+ if (Number.isNaN(rhs))
409
+ return +1;
410
+ }
411
+ }
412
+ if (lhs < rhs)
413
+ return -1;
414
+ return 1;
415
+ }
416
+ exports.compare = compare;
417
+ function compareArray(lhs, rhs) {
418
+ for (let i = 0; i < Math.min(lhs.length, rhs.length); i++) {
419
+ let comparison = compare(lhs[i], rhs[i]);
420
+ if (comparison !== 0)
421
+ return comparison;
422
+ }
423
+ return lhs.length - rhs.length;
424
+ }
425
+ exports.compareArray = compareArray;
426
+ function insertIntoSortedList(list, map, element) {
427
+ let searchValue = map(element);
428
+ let index = binarySearchIndex(list.length, i => compare(map(list[i]), searchValue));
429
+ if (index < 0)
430
+ index = ~index;
431
+ list.splice(index, 0, element);
432
+ }
433
+ exports.insertIntoSortedList = insertIntoSortedList;
434
+ function removeFromSortedList(list, map, searchValue) {
435
+ let index = binarySearchIndex(list.length, i => compare(map(list[i]), searchValue));
436
+ if (index < 0)
437
+ return;
438
+ list.splice(index, 1);
439
+ }
440
+ exports.removeFromSortedList = removeFromSortedList;
441
+ function timeoutToError(time, p, err) {
442
+ return new Promise((resolve, reject) => {
443
+ let timeout = setTimeout(() => reject(err()), time);
444
+ p.then(resolve, reject).finally(() => clearTimeout(timeout));
445
+ });
446
+ }
447
+ exports.timeoutToError = timeoutToError;
448
+ // NOTE: Both errors and timeouts are converted to undefined
449
+ function timeoutToUndefined(time, p) {
450
+ return new Promise((resolve, reject) => {
451
+ let timeout = setTimeout(() => {
452
+ console.error(`timeoutToUndefined timed out after ${time}`);
453
+ resolve(undefined);
454
+ }, time);
455
+ p.then(resolve, (err) => {
456
+ console.error(`timeoutToUndefined error: ${err.stack}`);
457
+ resolve(undefined);
458
+ }).finally(() => clearTimeout(timeout));
459
+ });
460
+ }
461
+ exports.timeoutToUndefined = timeoutToUndefined;
462
+ function timeoutToUndefinedSilent(time, p) {
463
+ return new Promise((resolve, reject) => {
464
+ let timeout = setTimeout(() => {
465
+ resolve(undefined);
466
+ }, time);
467
+ p.then(resolve, (err) => {
468
+ resolve(undefined);
469
+ }).finally(() => clearTimeout(timeout));
470
+ });
471
+ }
472
+ exports.timeoutToUndefinedSilent = timeoutToUndefinedSilent;
473
+ function errorToWarning(promise) {
474
+ // Return the promise, so they can wait if they want, but have the return type be void,
475
+ // so that they don't have to await it.
476
+ return promise.catch(e => {
477
+ console.warn(e.stack);
478
+ return undefined;
479
+ });
480
+ }
481
+ exports.errorToWarning = errorToWarning;
482
+ function watchSlowPromise(title, promise, config) {
483
+ let { interval = 5000 } = config || {};
484
+ let fulfilled = false;
485
+ void promise.finally(() => fulfilled = true);
486
+ let startTime = Date.now();
487
+ void (async () => {
488
+ while (true) {
489
+ await (0, batching_1.delay)(interval);
490
+ if (fulfilled)
491
+ break;
492
+ console.log(`${(0, logColors_1.yellow)(`Slow promise running for ${(0, format_1.formatTime)(Date.now() - startTime)}`)} | ${title}`);
493
+ }
494
+ })();
495
+ return promise;
496
+ }
497
+ exports.watchSlowPromise = watchSlowPromise;
498
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1pc2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXdEO0FBQ3hELGdEQUErRDtBQUMvRCx5Q0FBbUM7QUFDbkMsc0RBQWdEO0FBRW5DLFFBQUEsWUFBWSxHQUFHLElBQUksQ0FBQztBQUNwQixRQUFBLFlBQVksR0FBRyxvQkFBWSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxRQUFBLFVBQVUsR0FBRyxvQkFBWSxHQUFHLEVBQUUsQ0FBQztBQUMvQixRQUFBLFNBQVMsR0FBRyxrQkFBVSxHQUFHLEVBQUUsQ0FBQztBQUM1QixRQUFBLFVBQVUsR0FBRyxpQkFBUyxHQUFHLENBQUMsQ0FBQztBQUMzQixRQUFBLFVBQVUsR0FBRyxpQkFBUyxHQUFHLEdBQUcsQ0FBQztBQUkxQyxTQUFnQix3QkFBd0IsQ0FBQyxLQUFhO0lBQ2xELElBQUksUUFBUSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7SUFDM0IsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsUUFBUSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEUsT0FBTyxRQUFRLENBQUM7QUFDcEIsQ0FBQztBQUxELDREQUtDO0FBR0QsU0FBZ0IsVUFBVSxDQUFDLE1BQXVCO0lBQzlDLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFGRCxnQ0FFQztBQUNELFNBQWdCLGdCQUFnQixDQUFDLE1BQXVCO0lBQ3BELE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFD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QUEsa0JBQU0sRUFBQyw0QkFBNEIsSUFBQSxtQkFBVSxFQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMxRyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNMLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFmRCw0Q0FlQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNhbkhhdmVDaGlsZHJlbiwgTWF5YmVQcm9taXNlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0VGltZSB9IGZyb20gXCIuL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyBkZWxheSB9IGZyb20gXCIuL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyB5ZWxsb3cgfSBmcm9tIFwiLi9mb3JtYXR0aW5nL2xvZ0NvbG9yc1wiO1xuXG5leHBvcnQgY29uc3QgdGltZUluU2Vjb25kID0gMTAwMDtcbmV4cG9ydCBjb25zdCB0aW1lSW5NaW51dGUgPSB0aW1lSW5TZWNvbmQgKiA2MDtcbmV4cG9ydCBjb25zdCB0aW1lSW5Ib3VyID0gdGltZUluTWludXRlICogNjA7XG5leHBvcnQgY29uc3QgdGltZUluRGF5ID0gdGltZUluSG91ciAqIDI0O1xuZXhwb3J0IGNvbnN0IHRpbWVJbldlZWsgPSB0aW1lSW5EYXkgKiA3O1xuZXhwb3J0IGNvbnN0IHRpbWVJblllYXIgPSB0aW1lSW5EYXkgKiAzNjU7XG5cbmV4cG9ydCB0eXBlIFdhdGNoYWJsZTxUPiA9IChjYWxsYmFjazogKHZhbHVlOiBUKSA9PiB2b2lkKSA9PiBNYXliZVByb21pc2U8dm9pZD47XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0RXJyb3JTdGFja1RvRXJyb3IoZXJyb3I6IHN0cmluZyk6IEVycm9yIHtcbiAgICBsZXQgZXJyb3JPYmogPSBuZXcgRXJyb3IoKTtcbiAgICBlcnJvck9iai5zdGFjayA9IFN0cmluZyhlcnJvcik7XG4gICAgZXJyb3JPYmoubWVzc2FnZSA9IFN0cmluZyhlcnJvcikuc3BsaXQoXCJcXG5cIilbMF0uc2xpY2UoXCJFcnJvcjogXCIubGVuZ3RoKTtcbiAgICByZXR1cm4gZXJyb3JPYmo7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYTI1Nkhhc2goYnVmZmVyOiBCdWZmZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXF1aXJlKFwiY3J5cHRvXCIpLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KFwiaGV4XCIpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNoYTI1Nkhhc2hCdWZmZXIoYnVmZmVyOiBCdWZmZXIgfCBzdHJpbmcpOiBCdWZmZXIge1xuICAgIHJldHVybiByZXF1aXJlKFwiY3J5cHRvXCIpLmNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KCk7XG59XG4vKiogQXN5bmMsIGJ1dCB3b3JrcyBib3RoIGNsaWVudHNpZGUgYW5kIHNlcnZlcnNpZGUuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2hhMjU2SGFzaFByb21pc2UoYnVmZmVyOiBCdWZmZXIpIHtcbiAgICBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmUoXCJjcnlwdG9cIikuY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoYnVmZmVyKS5kaWdlc3QoXCJoZXhcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGJ1ZiA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdChcIlNIQS0yNTZcIiwgYnVmZmVyKTtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJ1ZikudG9TdHJpbmcoXCJoZXhcIik7XG4gICAgfVxufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNoYTI1NkJ1ZmZlclByb21pc2UoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICByZXR1cm4gcmVxdWlyZShcImNyeXB0b1wiKS5jcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShidWZmZXIpLmRpZ2VzdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBidWYgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kaWdlc3QoXCJTSEEtMjU2XCIsIGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShidWYpO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlFcXVhbChhOiB7IFtrZXk6IG51bWJlcl06IHVua25vd247IGxlbmd0aDogbnVtYmVyIH0sIGI6IHsgW2tleTogbnVtYmVyXTogdW5rbm93bjsgbGVuZ3RoOiBudW1iZXIgfSwpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZSgpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiICYmIHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLldvcmtlckdsb2JhbFNjb3BlID09PSBcInVuZGVmaW5lZFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlVHJ1ZSgpIHtcbiAgICByZXR1cm4gaXNOb2RlKCkgYXMgdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlclN1ZmZpeGVkKGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXROdW1iZXIoY291bnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdChjb3VudDogbnVtYmVyKSB7XG4gICAgbGV0IGFycjogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgYXJyLnB1c2goaSk7XG4gICAgfVxuICAgIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWN1cnNpdmVGcmVlemU8VD4ob2JqOiBUKTogVCB7XG4gICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4ob2JqKSkgcmV0dXJuIG9iajtcbiAgICBsZXQgdmlzaXRlZCA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICBmdW5jdGlvbiBpdGVyYXRlKG9iajogdW5rbm93bikge1xuICAgICAgICBpZiAoIWNhbkhhdmVDaGlsZHJlbihvYmopKSByZXR1cm47XG4gICAgICAgIGlmICh2aXNpdGVkLmhhcyhvYmopKSByZXR1cm47XG4gICAgICAgIHZpc2l0ZWQuYWRkKG9iaik7XG4gICAgICAgIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcob2JqKSkgcmV0dXJuO1xuICAgICAgICBPYmplY3QuZnJlZXplKG9iaik7XG4gICAgICAgIGxldCBrZXlzID0gZ2V0S2V5cyhvYmopO1xuICAgICAgICBmb3IgKGxldCBrZXkgb2Yga2V5cykge1xuICAgICAgICAgICAgaXRlcmF0ZShvYmpba2V5XSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaXRlcmF0ZShvYmopO1xuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnQgdHlwZSBBcnJheUJ1ZmZlclZpZXdUeXBlcyA9IFVpbnQ4QXJyYXkgfCBJbnQ4QXJyYXkgfCBVaW50MTZBcnJheSB8IEludDE2QXJyYXkgfCBVaW50MzJBcnJheSB8IEludDMyQXJyYXkgfCBCaWdVaW50NjRBcnJheSB8IEJpZ0ludDY0QXJyYXkgfCBGbG9hdDY0QXJyYXkgfCBGbG9hdDMyQXJyYXkgfCBVaW50OENsYW1wZWRBcnJheTtcbmV4cG9ydCB0eXBlIEJ1ZmZlclR5cGUgPSBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyIHwgQXJyYXlCdWZmZXJWaWV3VHlwZXM7XG5leHBvcnQgZnVuY3Rpb24gaXNCdWZmZXJUeXBlKG9iajogdW5rbm93bik6IG9iaiBpcyBCdWZmZXJUeXBlIHtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICghb2JqKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhvYmopKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiB0cnVlO1xuICAgIGlmIChnbG9iYWwuU2hhcmVkQXJyYXlCdWZmZXIgJiYgb2JqIGluc3RhbmNlb2YgZ2xvYmFsLlNoYXJlZEFycmF5QnVmZmVyKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0S2V5cyhvYmo6IHVua25vd24pIHtcbiAgICBpZiAodHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygb2JqICE9PSBcImZ1bmN0aW9uXCIgfHwgb2JqID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1lc3NhZ2VQb3J0KSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IGtleUFycmF5OiBQcm9wZXJ0eUtleVtdO1xuICAgIGlmIChpc0J1ZmZlclR5cGUob2JqKSkge1xuICAgICAgICBrZXlBcnJheSA9IFtdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIC8vIE5PVEU6IFdlIGNvbnZlcnQgdGhlIGluZGV4ZXMgdG8gc3RyaW5ncywgYmVjYXVzZSB0aGF0IGlzIHdoYXQgamF2YXNjcmlwdCBkb2VzLFxuICAgICAgICAvLyAgYW5kIGRpZmZlcmluZyBmcm9tIGl0IGNhdXNlcyByZWdyZXNzaW9ucyB0aGF0IHdlIHNpbXBseSBjYW5ub3QgcmVjdGlmeSAoaXQgYnJlYWtzIGhhc2hpbmdcbiAgICAgICAgLy8gIGNvbnNpc3RlbmN5KS5cbiAgICAgICAga2V5QXJyYXkgPSBBcnJheShvYmoubGVuZ3RoKS5maWxsKDApLm1hcCgoeCwgaSkgPT4gU3RyaW5nKGkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBrZXlBcnJheSA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgfVxuICAgIGZvciAobGV0IHN5bWJvbCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iaikpIHtcbiAgICAgICAgbGV0IGtleSA9IFN5bWJvbC5rZXlGb3Ioc3ltYm9sKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAga2V5QXJyYXkucHVzaChzeW1ib2wpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlBcnJheTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdHJpbmdLZXlzPFQgZXh0ZW5kcyB7fT4ob2JqOiBUKTogKChrZXlvZiBUKSAmIHN0cmluZylbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5Qnk8VCwgSz4oYXJyOiBUW10sIGdldEtleTogKHZhbHVlOiBUKSA9PiBLKTogTWFwPEssIFQ+IHtcbiAgICBsZXQgbWFwID0gbmV3IE1hcDxLLCBUPigpO1xuICAgIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XG4gICAgICAgIG1hcC5zZXQoZ2V0S2V5KGl0ZW0pLCBpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBrZXlCeUFycmF5PFQsIEs+KGFycjogVFtdLCBnZXRLZXk6ICh2YWx1ZTogVCkgPT4gSyk6IE1hcDxLLCBUW10+IHtcbiAgICBsZXQgbWFwID0gbmV3IE1hcDxLLCBUW10+KCk7XG4gICAgZm9yIChsZXQgaXRlbSBvZiBhcnIpIHtcbiAgICAgICAgbGV0IGtleSA9IGdldEtleShpdGVtKTtcbiAgICAgICAgbGV0IGFyciA9IG1hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKCFhcnIpIHtcbiAgICAgICAgICAgIGFyciA9IFtdO1xuICAgICAgICAgICAgbWFwLnNldChrZXksIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgYXJyLnB1c2goaXRlbSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmVKU09OPFQ+KG9iajogVCk6IFQge1xuICAgIGlmIChvYmogPT09IHVuZGVmaW5lZCkgcmV0dXJuIG9iajtcbiAgICBsZXQgc3RyID0gSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgYW4gb2JqZWN0IHRvIG5vdCBiZSBkZWZpbmVkLCBidXQgcmV0dXJuIHVuZGVmaW5lZCB3aGVuIEpTT04uc3RyaW5naWZpZWQsXG4gICAgLy8gIHZpYSBvdmVycmlkaW5nIHRoZSB0b0pTT04gbWV0aG9kLlxuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuZXhwb3J0IGNsYXNzIFByb21pc2VPYmo8VCA9IHZvaWQ+IHtcbiAgICBwdWJsaWMgcHJvbWlzZTogUHJvbWlzZTxUPjtcbiAgICBwdWJsaWMgdmFsdWU6IHsgdmFsdWU/OiBUOyBlcnJvcj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIC8qKiBSZXNvbHZlIGNhbGxlZCBkb2VzIG5vdCBtZWFuIHRoZSB2YWx1ZSBpcyByZWFkeSwgYXMgaXQgbWF5IGJlIHJlc29sdmVkIHdpdGggYSBwcm9taXNlLiAqL1xuICAgIHB1YmxpYyByZXNvbHZlQ2FsbGVkPzogYm9vbGVhbjtcblxuICAgIHB1YmxpYyByZXNvbHZlID0gKHZhbHVlOiBUIHwgUHJvbWlzZTxUPikgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdmVDYWxsZWQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgdmFsdWUudGhlbihcbiAgICAgICAgICAgICAgICB2YWx1ZSA9PiB0aGlzLnZhbHVlID0geyB2YWx1ZSB9LFxuICAgICAgICAgICAgICAgIGVycm9yID0+IHRoaXMudmFsdWUgPSB7IGVycm9yIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHsgdmFsdWUgfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJhc2VSZXNvbHZlKHZhbHVlKTtcbiAgICB9O1xuICAgIHB1YmxpYyByZWplY3QgPSAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJhc2VSZWplY3QoZXJyb3IpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGJhc2VSZXNvbHZlITogKHZhbHVlOiBUIHwgUHJvbWlzZTxUPikgPT4gdm9pZDtcbiAgICBwcml2YXRlIGJhc2VSZWplY3QhOiAoZXJyb3I6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5iYXNlUmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLmJhc2VSZWplY3QgPSByZWplY3Q7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb21pc2UudGhlbihcbiAgICAgICAgICAgIHZhbHVlID0+IHRoaXMudmFsdWUgPSB7IHZhbHVlIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB0aGlzLnZhbHVlID0geyBlcnJvciB9XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZU9iajxUID0gdm9pZD4oKTogUHJvbWlzZU9iajxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlT2JqPFQ+KCk7XG59XG5cbi8vIEFsbG93cyBhbiBpbW1lZGlhdGUgY2FsbCwgdGhlbiBkZWxheXMgdGhlIG5leHQgY2FsbCB1bnRpbCB0aGUgZmlyc3QgY2FsbCBmaW5pc2hlcyArIGRlbGF5XG4vLyAgLSBEcm9wcyBhbGwgYnV0IHRoZSBsYXRlc3QgY2FsbCwgYnV0IG9ubHkgcmVzb2x2ZXMgdGhlIHByb21pc2VzIHJldHVybiB0byBhbGxcbi8vICAgICAgY2FsbHMgb25jZSB0aGUgbGF0ZXN0IGNhbGwgZmluaXNoZXMuXG4vLyAgLSBFc2VudGlhbGx5IHRoZSBzYW1lIGFzIHNheWluZyBcImRvbid0IHJ1biB0aGlzIGZ1bmN0aW9uIHRvbyBvZnRlbiwgZG9uJ3QgcnVuIGl0IGluIHBhcmFsbGVsLFxuLy8gICAgICBhbmQgZG9uJ3QgbGV0IGZ1bmN0aW9ucyBydW5zIGJlIHRvbyBjbG9zZSB0b2dldGhlclwiLlxuZXhwb3J0IGZ1bmN0aW9uIHRocm90dGxlRnVuY3Rpb248QXJncyBleHRlbmRzIGFueVtdPihcbiAgICBkZWxheTogbnVtYmVyLFxuICAgIGZuYzogKC4uLmFyZ3M6IEFyZ3MpID0+IE1heWJlUHJvbWlzZTx2b2lkPlxuKTogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBuZXh0QWxsb3dlZENhbGwgPSAwO1xuICAgIGxldCBwZW5kaW5nQXJnczogeyBhcmdzOiBBcmdzOyBwcm9taXNlT2JqOiBQcm9taXNlT2JqPHZvaWQ+IH0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gZG9DYWxsKGFyZ3M6IEFyZ3MsIHByb21pc2VPYmo6IFByb21pc2VPYmo8dm9pZD4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBmbmMoLi4uYXJncyk7XG4gICAgICAgICAgICBwcm9taXNlT2JqLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgLy8gTk9URTogVGhlIGNhbGxlciBzaG91bGQgaGFuZGxlIHRoZSBwcm9taXNlLiBJZiBub3QsIHRoZXkgcHJvYmFibHlcbiAgICAgICAgICAgICAgICAvLyAgd2FudCB0aGUgdW5yZXNvbHZlZCBwcm9taXNlIHJlamVjdGlvbiwgc28gdGhleSBjYW4gaGFuZGxlIGl0IHByb3Blcmx5LlxuICAgICAgICAgICAgICAgIHZvaWQgcmVzdWx0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBuZXh0QWxsb3dlZENhbGwgPSBEYXRlLm5vdygpICsgZGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIHJ1bk5leHRDYWxsKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRBbGxvd2VkQ2FsbCA9IERhdGUubm93KCkgKyBkZWxheTtcbiAgICAgICAgICAgICAgICBydW5OZXh0Q2FsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIHByb21pc2VPYmoucmVqZWN0KGUpO1xuICAgICAgICAgICAgbmV4dEFsbG93ZWRDYWxsID0gRGF0ZS5ub3coKSArIGRlbGF5O1xuICAgICAgICAgICAgcnVuTmV4dENhbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBydW5OZXh0Q2FsbCgpIHtcbiAgICAgICAgaWYgKG5leHRBbGxvd2VkQ2FsbCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSByZXR1cm47XG4gICAgICAgIGlmICghcGVuZGluZ0FyZ3MpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGltZSA+IG5leHRBbGxvd2VkQ2FsbCkge1xuICAgICAgICAgICAgLy8gU2V0IG5leHRBbGxvd2VkQ2FsbCB0byBpbmZpbml0eSwgdG8gcHJldmVudCBuZXcgY2FsbHMgZnJvbSBydW5uaW5nXG4gICAgICAgICAgICAvLyAgdW50aWwgZG9DYWxsIGZpbmlzaGVzLlxuICAgICAgICAgICAgbmV4dEFsbG93ZWRDYWxsID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgLy8gRGVsYXksIHNvIHdlIGRvbid0IHR1cm4gYSBzZXJpZXMgb2Ygc2VxdWVudGlhbCBjYWxscyB0byBhIHNlcmllcyBvZiBuZXN0ZWQgY2FsbHNcbiAgICAgICAgICAgIC8vICAod2hpY2ggd2lsbCBjYXVzZSBhIHN0YWNrIG92ZXJmbG93KVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGFyZ3MgPSBwZW5kaW5nQXJncztcbiAgICAgICAgICAgICAgICBwZW5kaW5nQXJncyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBpZiAoIWFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEFsbG93ZWRDYWxsID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBJbXBvc3NpYmxlLCBwZW5kaW5nQXJncyB3YXMgcmVzZXQgd2hlbiB3ZSBzaG91bGRuJ3QgaGF2ZSBldmVuIGJlZW4gaW4gYSBjYWxsYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9DYWxsKGFyZ3MuYXJncywgYXJncy5wcm9taXNlT2JqKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dChydW5OZXh0Q2FsbCwgbmV4dEFsbG93ZWRDYWxsIC0gdGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmIChwZW5kaW5nQXJncykge1xuICAgICAgICAgICAgcGVuZGluZ0FyZ3MuYXJncyA9IGFyZ3M7XG4gICAgICAgICAgICByZXR1cm4gcGVuZGluZ0FyZ3MucHJvbWlzZU9iai5wcm9taXNlO1xuICAgICAgICB9XG4gICAgICAgIHBlbmRpbmdBcmdzID0geyBhcmdzLCBwcm9taXNlT2JqOiBwcm9taXNlT2JqKCkgfTtcbiAgICAgICAgcnVuTmV4dENhbGwoKTtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdBcmdzLnByb21pc2VPYmoucHJvbWlzZTtcbiAgICB9O1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBuZXh0SWQoKSB7XG4gICAgcmV0dXJuIERhdGUubm93KCkgKyBcIl9cIiArIE1hdGgucmFuZG9tKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUZyb21PcmRlck9iamVjdDxUPihvYmo6IHsgW29yZGVyOiBudW1iZXJdOiBUIH0pOiBUW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmouc2xpY2UoKTtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KChhLCBiKSA9PiArYVswXSAtICtiWzBdKS5tYXAoeCA9PiB4WzFdKS5maWx0ZXIoeCA9PiB4ICE9PSB1bmRlZmluZWQgJiYgeCAhPT0gbnVsbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYXN0PFQ+KGFycjogVFtdKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGFyclthcnIubGVuZ3RoIC0gMV07XG59XG5cbmV4cG9ydCB0eXBlIE9iamVjdFZhbHVlczxUPiA9IFRba2V5b2YgVF07XG5leHBvcnQgZnVuY3Rpb24gZW50cmllczxPYmogZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4ob2JqOiBPYmopOiBba2V5b2YgT2JqLCBPYmplY3RWYWx1ZXM8T2JqPl1bXSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKG9iaikgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2V5czxPYmogZXh0ZW5kcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfT4ob2JqOiBPYmopOiAoa2V5b2YgT2JqKVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMob2JqKSBhcyBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0PFQ+KGFycjogVFtdLCBzb3J0S2V5OiAob2JqOiBUKSA9PiB1bmtub3duKSB7XG4gICAgaWYgKGFyci5sZW5ndGggPD0gMSkgcmV0dXJuIGFycjtcbiAgICBhcnIuc29ydCgoYSwgYikgPT4gY29tcGFyZShzb3J0S2V5KGEpLCBzb3J0S2V5KGIpKSk7XG4gICAgcmV0dXJuIGFycjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvb3REb21haW4oaG9zdG5hbWU6IHN0cmluZykge1xuICAgIGlmIChob3N0bmFtZS5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5zbGljZShcImh0dHBzOi8vXCIubGVuZ3RoKTtcbiAgICB9XG4gICAgaG9zdG5hbWUgPSBob3N0bmFtZS5zcGxpdChcIi9cIilbMF07XG4gICAgbGV0IHBhcnRzID0gaG9zdG5hbWUuc3BsaXQoXCIuXCIpO1xuICAgIGhvc3RuYW1lID0gcGFydHMuc2xpY2UoLTIpLmpvaW4oXCIuXCIpO1xuICAgIGhvc3RuYW1lID0gaG9zdG5hbWUuc3BsaXQoXCI6XCIpWzBdO1xuICAgIHJldHVybiBob3N0bmFtZTtcbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXVlTGltaXRlZDxUPiB7XG4gICAgcHJpdmF0ZSBpdGVtczogVFtdID0gW107XG4gICAgcHJpdmF0ZSBuZXh0SW5kZXggPSAwO1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWF4Q291bnQ6IG51bWJlcikgeyB9XG5cbiAgICBwdWJsaWMgcHVzaChpdGVtOiBUKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNbdGhpcy5uZXh0SW5kZXhdID0gaXRlbTtcbiAgICAgICAgdGhpcy5uZXh0SW5kZXggPSAodGhpcy5uZXh0SW5kZXggKyAxKSAlIHRoaXMubWF4Q291bnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFsbFVub3JkZXJlZCgpOiBUW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcztcbiAgICB9XG4gICAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMubmV4dEluZGV4ID0gMDtcbiAgICB9XG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXRPbGRlc3QoKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5uZXh0SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMubWF4Q291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNbaW5kZXhdO1xuICAgIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoQmFzaWM8VCwgVj4oYXJyYXk6IFRbXSwgZ2V0VmFsOiAodmFsOiBUKSA9PiBWLCBzZWFyY2hWYWx1ZTogVik6IG51bWJlciB7XG4gICAgcmV0dXJuIGJpbmFyeVNlYXJjaEluZGV4KGFycmF5Lmxlbmd0aCwgaSA9PiBjb21wYXJlKGdldFZhbChhcnJheVtpXSksIHNlYXJjaFZhbHVlKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoQmFzaWMyPFQsIFY+KGFycmF5OiBUW10sIGdldFZhbDogKHZhbDogVCkgPT4gViwgc2VhcmNoVmFsdWU6IFQpOiBudW1iZXIge1xuICAgIHJldHVybiBiaW5hcnlTZWFyY2hJbmRleChhcnJheS5sZW5ndGgsIGkgPT4gY29tcGFyZShnZXRWYWwoYXJyYXlbaV0pLCBnZXRWYWwoc2VhcmNoVmFsdWUpKSk7XG59XG5cbi8qKlxuICogIFNlYXJjaGVzIGluZGV4ZXMsIGFsbG93aW5nIHlvdSB0byBxdWVyeSBzdHJ1Y3R1cmVzIHRoYXQgYXJlbid0IGFycmF5cy4gVG8gc2VhcmNoIGFuIGFycmF5LCB1c2U6XG4gKiAgICAgIGBiaW5hcnlTZWFyY2hJbmRleChhcnJheS5sZW5ndGgsIGkgPT4gY29tcGFyZShhcnJheVtpXSwgc2VhcmNoVmFsdWUpKWBcbiAqIFxuICogICAgICBOT1RFOiBJZiB0aGVyZSBhcmUgZHVwbGljYXRlcywgcmV0dXJucyB0aGUgZmlyc3QgbWF0Y2guXG4gKiBcbiAqICAgICAgTk9URTogSWYgdGhlIHZhbHVlIGNhbid0IGJlIGZvdW5kLCByZXR1cm5zIHRoZSBiaXR3aXNlIG5lZ2F0aW9uIG9mIHRoZSBpbmRleCB3aGVyZSBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQuXG4gKiBcbiAqICAgICAgTk9URTogV2l0aCBgaWYgKGluZGV4IDwgMCkgaW5kZXggPSB+aW5kZXg7YCB5b3Ugd2lsbCBnZXQgYW4gaW5kZXggb2YgdGhlIHZhbHVlID49IHRoZSB0YXJnZXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlTZWFyY2hJbmRleChsaXN0Q291bnQ6IG51bWJlciwgY29tcGFyZTogKGxoc0luZGV4OiBudW1iZXIpID0+IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKGxpc3RDb3VudCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gfjA7XG4gICAgfVxuICAgIGxldCBtaW4gPSAwO1xuICAgIGxldCBtYXggPSBsaXN0Q291bnQgLSAxO1xuICAgIHdoaWxlIChtaW4gPCBtYXgpIHtcbiAgICAgICAgbGV0IGZpbmdlckluZGV4ID0gTWF0aC5mbG9vcigobWF4ICsgbWluKSAvIDIpO1xuICAgICAgICBsZXQgY29tcGFyaXNvblZhbHVlID0gY29tcGFyZShmaW5nZXJJbmRleCk7XG4gICAgICAgIGlmIChjb21wYXJpc29uVmFsdWUgPCAwKSB7XG4gICAgICAgICAgICBtaW4gPSBmaW5nZXJJbmRleCArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXggPSBmaW5nZXJJbmRleDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQgY29tcGFyaXNvbiA9IGNvbXBhcmUobWluKTtcbiAgICBpZiAoY29tcGFyaXNvbiA9PT0gMCkgcmV0dXJuIG1pbjtcbiAgICBpZiAoY29tcGFyaXNvbiA+IDApIHJldHVybiB+bWluO1xuICAgIHJldHVybiB+KG1pbiArIDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGFyZShsaHM6IHVua25vd24sIHJoczogdW5rbm93bik6IG51bWJlciB7XG4gICAgaWYgKHR5cGVvZiBsaHMgIT09IHR5cGVvZiByaHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmUodHlwZW9mIGxocywgdHlwZW9mIHJocyk7XG4gICAgfVxuICAgIGlmIChsaHMgPT09IHJocykgcmV0dXJuIDA7XG4gICAgaWYgKGxocyA9PT0gbnVsbCAmJiByaHMgIT09IG51bGwpIHJldHVybiAtMTtcbiAgICBpZiAobGhzICE9PSBudWxsICYmIHJocyA9PT0gbnVsbCkgcmV0dXJuIDE7XG4gICAgaWYgKHR5cGVvZiBsaHMgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsaHMpKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJocykpIHJldHVybiAwO1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyaHMpKSByZXR1cm4gKzE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGxocyBhcyBhbnkgPCAocmhzIGFzIGFueSkpIHJldHVybiAtMTtcbiAgICByZXR1cm4gMTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wYXJlQXJyYXkobGhzOiB1bmtub3duW10sIHJoczogdW5rbm93bltdKTogbnVtYmVyIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKGxocy5sZW5ndGgsIHJocy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgbGV0IGNvbXBhcmlzb24gPSBjb21wYXJlKGxoc1tpXSwgcmhzW2ldKTtcbiAgICAgICAgaWYgKGNvbXBhcmlzb24gIT09IDApIHJldHVybiBjb21wYXJpc29uO1xuICAgIH1cbiAgICByZXR1cm4gbGhzLmxlbmd0aCAtIHJocy5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRJbnRvU29ydGVkTGlzdDxUPihsaXN0OiBUW10sIG1hcDogKHZhbDogVCkgPT4gc3RyaW5nIHwgbnVtYmVyLCBlbGVtZW50OiBUKSB7XG4gICAgbGV0IHNlYXJjaFZhbHVlID0gbWFwKGVsZW1lbnQpO1xuICAgIGxldCBpbmRleCA9IGJpbmFyeVNlYXJjaEluZGV4KGxpc3QubGVuZ3RoLCBpID0+IGNvbXBhcmUobWFwKGxpc3RbaV0pLCBzZWFyY2hWYWx1ZSkpO1xuICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4O1xuICAgIGxpc3Quc3BsaWNlKGluZGV4LCAwLCBlbGVtZW50KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVGcm9tU29ydGVkTGlzdDxUPihsaXN0OiBUW10sIG1hcDogKHZhbDogVCkgPT4gc3RyaW5nIHwgbnVtYmVyLCBzZWFyY2hWYWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgbGV0IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5kZXgobGlzdC5sZW5ndGgsIGkgPT4gY29tcGFyZShtYXAobGlzdFtpXSksIHNlYXJjaFZhbHVlKSk7XG4gICAgaWYgKGluZGV4IDwgMCkgcmV0dXJuO1xuICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbn1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0VG9FcnJvcjxUPih0aW1lOiBudW1iZXIsIHA6IFByb21pc2U8VD4sIGVycjogKCkgPT4gRXJyb3IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KGVycigpKSwgdGltZSk7XG4gICAgICAgIHAudGhlbihyZXNvbHZlLCByZWplY3QpLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgICB9KTtcbn1cblxuLy8gTk9URTogQm90aCBlcnJvcnMgYW5kIHRpbWVvdXRzIGFyZSBjb252ZXJ0ZWQgdG8gdW5kZWZpbmVkXG5leHBvcnQgZnVuY3Rpb24gdGltZW91dFRvVW5kZWZpbmVkPFQ+KHRpbWU6IG51bWJlciwgcDogUHJvbWlzZTxUPikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGB0aW1lb3V0VG9VbmRlZmluZWQgdGltZWQgb3V0IGFmdGVyICR7dGltZX1gKTtcbiAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSwgdGltZSk7XG4gICAgICAgIHAudGhlbihyZXNvbHZlLFxuICAgICAgICAgICAgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYHRpbWVvdXRUb1VuZGVmaW5lZCBlcnJvcjogJHtlcnIuc3RhY2t9YCk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICApLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0aW1lb3V0VG9VbmRlZmluZWRTaWxlbnQ8VD4odGltZTogbnVtYmVyLCBwOiBQcm9taXNlPFQ+KSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPFQgfCB1bmRlZmluZWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgfSwgdGltZSk7XG4gICAgICAgIHAudGhlbihcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICApLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yVG9XYXJuaW5nPFQ+KHByb21pc2U6IFByb21pc2U8VD4pOiB2b2lkIHtcbiAgICAvLyBSZXR1cm4gdGhlIHByb21pc2UsIHNvIHRoZXkgY2FuIHdhaXQgaWYgdGhleSB3YW50LCBidXQgaGF2ZSB0aGUgcmV0dXJuIHR5cGUgYmUgdm9pZCxcbiAgICAvLyAgc28gdGhhdCB0aGV5IGRvbid0IGhhdmUgdG8gYXdhaXQgaXQuXG4gICAgcmV0dXJuIHByb21pc2UuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihlLnN0YWNrKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgfSkgYXMgYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2F0Y2hTbG93UHJvbWlzZTxUPih0aXRsZTogc3RyaW5nLCBwcm9taXNlOiBQcm9taXNlPFQ+LCBjb25maWc/OiB7XG4gICAgaW50ZXJ2YWw/OiBudW1iZXI7XG59KSB7XG4gICAgbGV0IHsgaW50ZXJ2YWwgPSA1MDAwIH0gPSBjb25maWcgfHwge307XG4gICAgbGV0IGZ1bGZpbGxlZCA9IGZhbHNlO1xuICAgIHZvaWQgcHJvbWlzZS5maW5hbGx5KCgpID0+IGZ1bGZpbGxlZCA9IHRydWUpO1xuICAgIGxldCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHZvaWQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KGludGVydmFsKTtcbiAgICAgICAgICAgIGlmIChmdWxmaWxsZWQpIGJyZWFrO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7eWVsbG93KGBTbG93IHByb21pc2UgcnVubmluZyBmb3IgJHtmb3JtYXRUaW1lKERhdGUubm93KCkgLSBzdGFydFRpbWUpfWApfSB8ICR7dGl0bGV9YCk7XG4gICAgICAgIH1cbiAgICB9KSgpO1xuICAgIHJldHVybiBwcm9taXNlO1xufSJdfQ==
499
+ /* _JS_SOURCE_HASH = "53986ed7b2bcd5f583771ff74fa1d2b1df2d2371b10f1edadc84d3a96872c75d"; */