sliftutils 1.7.21 → 1.7.23
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.
- package/index.d.ts +23 -12
- package/package.json +1 -1
- package/storage/IArchives.d.ts +1 -0
- package/storage/IArchives.ts +4 -0
- package/storage/dist/IArchives.ts.cache +3 -3
- package/storage/remoteStorage/ArchivesRemote.ts +5 -5
- package/storage/remoteStorage/blobStore.d.ts +11 -5
- package/storage/remoteStorage/blobStore.ts +160 -53
- package/storage/remoteStorage/createArchives.ts +12 -2
- package/storage/remoteStorage/deployTakeover.d.ts +5 -5
- package/storage/remoteStorage/deployTakeover.ts +38 -31
- package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +8 -8
- package/storage/remoteStorage/dist/blobStore.ts.cache +6 -12
- package/storage/remoteStorage/dist/createArchives.ts.cache +40 -9
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +64 -15
- package/storage/remoteStorage/dist/sourceWrapper.ts.cache +11 -4
- package/storage/remoteStorage/dist/storageController.ts.cache +25 -11
- package/storage/remoteStorage/dist/storageServerState.ts.cache +11 -5
- package/storage/remoteStorage/sourceWrapper.ts +2 -2
- package/storage/remoteStorage/spec.md +20 -2
- package/storage/remoteStorage/storageController.d.ts +6 -1
- package/storage/remoteStorage/storageController.ts +24 -8
- package/storage/remoteStorage/storageServerState.d.ts +0 -1
- package/storage/remoteStorage/storageServerState.ts +160 -28
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
6
|
-
//exports.getMainPortAcquireDelay = exports.getFlushDeadline = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
|
|
6
|
+
//exports.getMainPortAcquireDelay = exports.getFlushDeadline = exports.getTakeoverAltPort = exports.getTakeoverStamp = exports.applyDeployRemap = exports.onTakeoverEvent = exports.registerAltPort = exports.initDeployTakeover = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const child_process_1 = require("child_process");
|
|
@@ -187,17 +187,49 @@ function scheduleEvents() {
|
|
|
187
187
|
(_b = (_a = timer).unref) === null || _b === void 0 ? void 0 : _b.call(_a);
|
|
188
188
|
eventTimers.push(timer);
|
|
189
189
|
};
|
|
190
|
-
|
|
190
|
+
const remap = current.remap;
|
|
191
191
|
if (remap) {
|
|
192
192
|
let altPort = remap.altPort;
|
|
193
193
|
schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
194
|
-
schedule(remap.boundaryA, () => console.log(
|
|
194
|
+
schedule(remap.boundaryA, () => console.log(`${logPrefix()} Deploy switchover write handoff boundary ${iso(remap.boundaryA)} passed: fresh writes now belong to the alternate-port side (port ${altPort})`));
|
|
195
195
|
schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
196
|
-
schedule(remap.boundaryB, () => console.log(
|
|
196
|
+
schedule(remap.boundaryB, () => console.log(`${logPrefix()} Deploy switchover second boundary ${iso(remap.boundaryB)} passed: fresh writes return to the main port`));
|
|
197
197
|
schedule(remap.expire, () => void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); }));
|
|
198
198
|
}
|
|
199
|
+
let dying = current.dying;
|
|
200
|
+
if (dying) {
|
|
201
|
+
let deadline = dying.successorStart + dying.overlap * FLUSH_DEADLINE_FRACTION;
|
|
202
|
+
let killTime = dying.successorStart + dying.overlap;
|
|
203
|
+
let logDeadline = () => {
|
|
204
|
+
if (loggedFlushDeadlineFor === deadline)
|
|
205
|
+
return;
|
|
206
|
+
loggedFlushDeadlineFor = deadline;
|
|
207
|
+
console.log(`${logPrefix()} Deploy switchover flush deadline ${iso(deadline)} reached (now ${iso(Date.now())}): fast writes write through immediately until we are killed at ${iso(killTime)}`);
|
|
208
|
+
};
|
|
209
|
+
if (deadline <= now) {
|
|
210
|
+
logDeadline();
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
schedule(deadline, logDeadline);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
199
216
|
}
|
|
200
|
-
|
|
217
|
+
// Multiple processes (predecessor + successor) often share one journal during a switchover, so
|
|
218
|
+
// every lifecycle line identifies its process
|
|
219
|
+
function logPrefix() {
|
|
220
|
+
return `[pid ${process.pid}]`;
|
|
221
|
+
}
|
|
222
|
+
let loggedFlushDeadlineFor;
|
|
223
|
+
// Recompute is invoked from init, registerAltPort, the poll, and the expiry timer - possibly
|
|
224
|
+
// concurrently. Runs are serialized, or two in-flight runs would both pass the changed-state check
|
|
225
|
+
// and double-fire every transition (logs, rebuild events, timers).
|
|
226
|
+
let recomputeChain = Promise.resolve();
|
|
227
|
+
function recompute() {
|
|
228
|
+
let next = recomputeChain.then(() => recomputeNow());
|
|
229
|
+
recomputeChain = next.then(() => { }, () => { });
|
|
230
|
+
return next;
|
|
231
|
+
}
|
|
232
|
+
async function recomputeNow() {
|
|
201
233
|
if (!initialized || !timelineFolder)
|
|
202
234
|
return;
|
|
203
235
|
let now = Date.now();
|
|
@@ -212,11 +244,11 @@ async function recompute() {
|
|
|
212
244
|
// Matching failures must be loud, or takeover detection fails silently forever
|
|
213
245
|
if (!us && entries.length && !loggedNoMatch) {
|
|
214
246
|
loggedNoMatch = true;
|
|
215
|
-
console.warn(
|
|
247
|
+
console.warn(`${logPrefix()} No deploy timeline entry matches our pid chain (${[...ancestorPids].join(", ")}) - takeover detection cannot work. Entries: ${entries.map(x => { var _a; return `pid=${(_a = x.pid) !== null && _a !== void 0 ? _a : "none"} releaseTime=${x.parameters.releaseTime}`; }).join(" | ")}`);
|
|
216
248
|
}
|
|
217
249
|
if (us && !loggedIdentity) {
|
|
218
250
|
loggedIdentity = true;
|
|
219
|
-
console.log(
|
|
251
|
+
console.log(`${logPrefix()} Deploy timeline entry matched: we are pid=${us.pid}, releaseTime=${us.parameters.releaseTime !== undefined && iso(us.parameters.releaseTime) || "unknown"}, ${entries.length} entries total`);
|
|
220
252
|
}
|
|
221
253
|
let computed = {};
|
|
222
254
|
let usRelease = us === null || us === void 0 ? void 0 : us.parameters.releaseTime;
|
|
@@ -280,16 +312,16 @@ function iso(time) {
|
|
|
280
312
|
function logTransitions(prev, next) {
|
|
281
313
|
if (!prev.dying && next.dying) {
|
|
282
314
|
let { successorStart, overlap } = next.dying;
|
|
283
|
-
console.log(
|
|
315
|
+
console.log(`${logPrefix()} Deploy switchover scheduled: our successor starts at ${iso(successorStart)}; fast-write flushes drain by ${iso(successorStart + overlap * FLUSH_DEADLINE_FRACTION)}, fresh writes hand off at ${iso(successorStart + overlap * BOUNDARY_A_FRACTION)}, and we are killed at ${iso(successorStart + overlap)}`);
|
|
284
316
|
}
|
|
285
317
|
if (!prev.predecessorEnd && next.predecessorEnd) {
|
|
286
|
-
console.log(
|
|
318
|
+
console.log(`${logPrefix()} We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
|
|
287
319
|
}
|
|
288
320
|
if (!prev.remap && next.remap) {
|
|
289
|
-
console.log(
|
|
321
|
+
console.log(`${logPrefix()} Deploy switchover remap active: sources pointing at us are split so [${iso(next.remap.boundaryA)} .. ${iso(next.remap.boundaryB)}] routes to alternate port ${next.remap.altPort} (remap expires at ${iso(next.remap.expire)})`);
|
|
290
322
|
}
|
|
291
323
|
if (prev.remap && !next.remap) {
|
|
292
|
-
console.log(
|
|
324
|
+
console.log(`${logPrefix()} Deploy switchover remap ended; running on the plain stored routing config`);
|
|
293
325
|
}
|
|
294
326
|
}
|
|
295
327
|
/** Starts the takeover machinery. Port fallback (alternate port + registry + acquisition polling)
|
|
@@ -302,10 +334,10 @@ async function initDeployTakeover(config) {
|
|
|
302
334
|
timelineFolder = getTimelineFolder();
|
|
303
335
|
let entries = await readTimelineEntries();
|
|
304
336
|
if (!entries.length) {
|
|
305
|
-
console.log(
|
|
337
|
+
console.log(`${logPrefix()} No deploy timeline entries in ${timelineFolder}; deploy takeover inactive until they appear (port fallback still works)`);
|
|
306
338
|
}
|
|
307
339
|
else {
|
|
308
|
-
console.log(
|
|
340
|
+
console.log(`${logPrefix()} Deploy timeline found at ${timelineFolder} (${entries.length} entries); our pid chain: ${[...ancestorPids].join(" -> ")}`);
|
|
309
341
|
}
|
|
310
342
|
await recompute();
|
|
311
343
|
let poll = setInterval(() => {
|
|
@@ -381,6 +413,23 @@ function applyDeployRemap(routing) {
|
|
|
381
413
|
return { version: routing.version, sources };
|
|
382
414
|
}
|
|
383
415
|
exports.applyDeployRemap = applyDeployRemap;
|
|
416
|
+
/** A stamp of the current remap interpretation, advertised in ping responses - so every connected
|
|
417
|
+
* client learns of a takeover within one ping interval, instead of waiting for its config poll
|
|
418
|
+
* or a write rejection. */
|
|
419
|
+
function getTakeoverStamp() {
|
|
420
|
+
let remap = current.remap;
|
|
421
|
+
if (!remap)
|
|
422
|
+
return undefined;
|
|
423
|
+
return JSON.stringify(remap);
|
|
424
|
+
}
|
|
425
|
+
exports.getTakeoverStamp = getTakeoverStamp;
|
|
426
|
+
/** The middle-window alternate port of an active remap. The OTHER process of the takeover lives on
|
|
427
|
+
* this port on OUR machine (same disk!), so sources pointing at it are self, never sync targets. */
|
|
428
|
+
function getTakeoverAltPort() {
|
|
429
|
+
var _a;
|
|
430
|
+
return (_a = current.remap) === null || _a === void 0 ? void 0 : _a.altPort;
|
|
431
|
+
}
|
|
432
|
+
exports.getTakeoverAltPort = getTakeoverAltPort;
|
|
384
433
|
/** For the dying process: fast-write flush delays must never extend past this time, and after it
|
|
385
434
|
* fast writes flush immediately - so nothing is left in memory when the write window transfers. */
|
|
386
435
|
function getFlushDeadline() {
|
|
@@ -400,5 +449,5 @@ function getMainPortAcquireDelay() {
|
|
|
400
449
|
return ACQUIRE_SLOW_DELAY;
|
|
401
450
|
}
|
|
402
451
|
exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBdUJoQyxJQUFJLFdBQW9GLENBQUM7QUFDekYsSUFB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Z0IsdUJBQXVCO0lBQ25DLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7SUFDakMsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDekUsT0FBTyxrQkFBa0IsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxrQkFBa0IsQ0FBQztBQUM5QixDQUFDO0FBTkQsMERBTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBSZW1vdGVDb25maWcsIFJlbW90ZUNvbmZpZ0Jhc2UsIEhvc3RlZENvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IHBhcnNlSG9zdGVkVXJsLCByZXBsYWNlSG9zdGVkVXJsUG9ydCB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuXG4vLyBEZXBsb3kgdGFrZW92ZXI6IHRoZSBkZXBsb3kgbWFuYWdlciAocXVlcnlzdWIncyBwYXJhbWV0ZXJzVGltZWxpbmUpIHdyaXRlcyA8bj4tcGFyYW1ldGVycy5qc29uXG4vLyBmaWxlcyBpbnRvIG91ciBpbnN0YW5jZSBmb2xkZXIgZGVzY3JpYmluZyB3aGVuIGVhY2ggdmVyc2lvbiBydW5zIGFuZCB3aGVuIGl0IGlzIHNodXQgZG93bi4gT2xkXG4vLyBhbmQgbmV3IHZlcnNpb24gb3ZlcmxhcCBmb3IgdGhlIG92ZXJsYXAgdGltZSAoTyA9IG9sZEVuZCAtIG5ld1N0YXJ0KS4gV2UgdHVybiB0aGF0IG92ZXJsYXAgaW50b1xuLy8gYW4gYXRvbWljIHdyaXRlIGhhbmRvZmYgYnkgUkVJTlRFUlBSRVRJTkcgZXZlcnkgcm91dGluZyBzb3VyY2UgdGhhdCBwb2ludHMgYXQgdXM6IGl0cyB2YWxpZFxuLy8gd2luZG93IGlzIHNwbGl0IHNvIHRoYXQgdGhlIG1pZGRsZSBvZiB0aGUgb3ZlcmxhcCAoW1MgKyAwLjUqTywgUyArIDEuNSpPXSkgcG9pbnRzIGF0IHRoZSBuZXdcbi8vIHByb2Nlc3MncyB0ZW1wb3JhcnkgYWx0ZXJuYXRlIHBvcnQuIFRoZSBleGlzdGluZyB2YWxpZC13aW5kb3cgbWFjaGluZXJ5IHRoZW4gZG9lcyBldmVyeXRoaW5nIC1cbi8vIHRoZSBvbGQgcHJvY2VzcyBzdGFydHMgcmVqZWN0aW5nIGZyZXNoIHdyaXRlcyBhdCB0aGUgZmlyc3QgYm91bmRhcnksIGNsaWVudHMgcmUtcmVzb2x2ZSwgYW5kIHRoZVxuLy8gbmV3IHByb2Nlc3MgKHdoaWNoIHJlY29nbml6ZXMgdGhlIGFsdGVybmF0ZSBwb3J0IGFzIGl0c2VsZikgdGFrZXMgb3Zlci4gVGhlIHJlbWFwIGlzIGFuXG4vLyBJTlRFUlBSRVRBVElPTiBPVkVSTEFZLCBhcHBsaWVkIHdoZXJlIHJvdXRpbmcgY29uZmlncyBhcmUgdXNlZCAoc2VlIGFwcGx5RGVwbG95UmVtYXAgY2FsbGVycykgLVxuLy8gaXQgaXMgbmV2ZXIgd3JpdHRlbiB0byBkaXNrLCBuZXZlciBzeW5jaHJvbml6ZWQsIGFuZCBuZXZlciBwYXJ0IG9mIGFueSBzdG9yZWQgY29uZmlndXJhdGlvbi5cbi8vXG4vLyBFdmVyeXRoaW5nIGhlcmUgaXMgcmVjb21wdXRlZCBpZGVtcG90ZW50bHkgZnJvbSBpdHMgaW5wdXRzICh0aW1lbGluZSBmaWxlcywgdGhlIHBvcnQgcmVnaXN0cnksXG4vLyBvdXIgYW5jZXN0b3IgcGlkcywgdGhlIGNsb2NrKSAtIGZpbGVzIGNhbiBhcHBlYXIgb3IgY2hhbmdlIGF0IGFueSBtb21lbnQsIGFuZCB3ZSBjYW4gc3RhcnQgYXRcbi8vIGFueSBwb2ludCBkdXJpbmcgYSBzd2l0Y2hvdmVyLlxuXG5jb25zdCBQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVggPSAvXihcXGQrKS1wYXJhbWV0ZXJzXFwuanNvbiQvO1xuY29uc3QgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCA9IDYwICogMTAwMDtcbi8vIFByb2Nlc3NlcyBsaXN0ZW5pbmcgb24gYW4gYWx0ZXJuYXRlIHBvcnQgcmVnaXN0ZXIgaXQgaGVyZSAoc2libGluZyBvZiB0aGUgc3RvcmFnZSBmb2xkZXIpLCBrZXllZFxuLy8gYnkgdGhlaXIgYWN0dWFsIHBpZDsgY29udGVudCBpbmNsdWRlcyB0aGVpciBhbmNlc3RvciBwaWRzIHNvIHRoZSB0aW1lbGluZSBlbnRyeSBwaWQgKGEgc2hlbGxcbi8vIGFuY2VzdG9yIG9mIHRoZSBwcm9jZXNzKSBjYW4gYmUgbWF0Y2hlZCB0byBhIHJlZ2lzdHJ5IGVudHJ5XG5jb25zdCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FID0gXCJzdG9yYWdlUG9ydFJlZ2lzdHJ5XCI7XG4vLyBNYWluLXBvcnQgYWNxdWlzaXRpb24gYXR0ZW1wdHMgcnVuIHRoaXMgb2Z0ZW4sIHRpZ2h0ZW5pbmcgbmVhciB0aGUgcHJlZGVjZXNzb3IncyBzY2hlZHVsZWQgZGVhdGhcbmNvbnN0IEFDUVVJUkVfU0xPV19ERUxBWSA9IDMwICogMTAwMDtcbmNvbnN0IEFDUVVJUkVfRkFTVF9ERUxBWSA9IDUgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX1dJTkRPVyA9IDYwICogMTAwMDtcbi8vIERpc2sgcmVzY2FucyBmaXJlIHRoaXMgZmFyIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdyaXRlIGhhbmRvZmYsIGNhdGNoaW5nIGZpbGVzIHRoZSBvdGhlciBwcm9jZXNzXG4vLyB3cm90ZSAodGhlIEJ1bGtEYXRhYmFzZTIgaW5kZXggaXMgYXRvbWljIGJ1dCBpdHMgZW50cmllcyBsYW5kIGF0IHdyaXRlIHRpbWUsIG5vdCBmaWxlIHRpbWUpXG5jb25zdCBTV0lUQ0hfU0NBTl9MRUFEID0gMTAgKiAxMDAwO1xuLy8gVGhlIGR5aW5nIHByb2Nlc3MgbXVzdCBoYXZlIGZsdXNoZWQgZXZlcnl0aGluZyBiZWZvcmUgdGhlIGhhbmRvZmY6IGZhc3Qtd3JpdGUgZGVsYXlzIG5ldmVyXG4vLyBleHRlbmQgcGFzdCBTICsgb3ZlcmxhcCAqIHRoaXMgZnJhY3Rpb24sIGFuZCBhZnRlciB0aGF0IHBvaW50IGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5XG5jb25zdCBGTFVTSF9ERUFETElORV9GUkFDVElPTiA9IDAuMjU7XG5jb25zdCBCT1VOREFSWV9BX0ZSQUNUSU9OID0gMC41O1xuY29uc3QgQk9VTkRBUllfQl9GUkFDVElPTiA9IDEuNTtcbmNvbnN0IFJFTUFQX0VYUElSRV9GUkFDVElPTiA9IDI7XG5cbnR5cGUgVGltZWxpbmVFbnRyeSA9IHtcbiAgICBwaWQ/OiBudW1iZXI7XG4gICAgLy8gcmVsZWFzZVRpbWUgKyBvdmVybGFwVGltZSBkZWZpbmUgZXZlcnl0aGluZzogdGhlIG5ld2VyIGVudHJ5J3MgcmVsZWFzZVRpbWUgaXMgd2hlbiBpdFxuICAgIC8vIHN0YXJ0cywgYW5kIHJlbGVhc2VUaW1lICsgb3ZlcmxhcFRpbWUgaXMgd2hlbiB0aGUgb2xkZXIgb25lIGlzIGtpbGxlZCAoZnJlZWluZyB0aGUgcG9ydCkuXG4gICAgLy8gVGhlIGZpbGVzIGFsc28gY2FycnkgYW4gYWxpdmVXaW5kb3csIHdoaWNoIGlzIGRlbGliZXJhdGVseSBpZ25vcmVkLlxuICAgIHBhcmFtZXRlcnM6IHsgcmVsZWFzZVRpbWU/OiBudW1iZXI7IG92ZXJsYXBUaW1lPzogbnVtYmVyIH07XG59O1xuXG50eXBlIFRha2VvdmVyQ29tcHV0ZWQgPSB7XG4gICAgLy8gV2UgYXJlIHNjaGVkdWxlZCB0byBkaWUgd2l0aCBhIHN1Y2Nlc3NvciBvdmVybGFwcGluZyB1cyAoa25vd24gZnJvbSB0aGUgZmlsZXMgYWxvbmUsIGJlZm9yZVxuICAgIC8vIHRoZSBzdWNjZXNzb3IncyBwb3J0IGlzIGRpc2NvdmVyZWQgLSB0aGUgZmx1c2ggZGVhZGxpbmUgYXBwbGllcyBpbW1lZGlhdGVseSlcbiAgICBkeWluZz86IHsgc3VjY2Vzc29yU3RhcnQ6IG51bWJlcjsgb3ZlcmxhcDogbnVtYmVyIH07XG4gICAgLy8gVGhlIHdpbmRvdyByZWludGVycHJldGF0aW9uLCBvbmNlIHRoZSBtaWRkbGUgd2luZG93J3MgcG9ydCBpcyBrbm93biAodGhlIHN1Y2Nlc3NvcidzXG4gICAgLy8gcmVnaXN0ZXJlZCBhbHRlcm5hdGUgcG9ydCAtIG9yIG91ciBvd24sIHdoZW4gd2UgQVJFIHRoZSBzdWNjZXNzb3IpXG4gICAgcmVtYXA/OiB7IGJvdW5kYXJ5QTogbnVtYmVyOyBib3VuZGFyeUI6IG51bWJlcjsgZXhwaXJlOiBudW1iZXI7IGFsdFBvcnQ6IG51bWJlciB9O1xuICAgIC8vIFdoZW4gb3VyIHByZWRlY2Vzc29yIGRpZXMgYW5kIGZyZWVzIHRoZSBtYWluIHBvcnQgKGZvciBhY3F1aXNpdGlvbiBwYWNpbmcpXG4gICAgcHJlZGVjZXNzb3JFbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBUYWtlb3ZlckV2ZW50ID0gXCJyZW1hcENoYW5nZWRcIiB8IFwiZGlza1NjYW5cIjtcblxubGV0IGluaXRpYWxpemVkOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbmxldCBhbmNlc3RvclBpZHMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbmxldCB0aW1lbGluZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xubGV0IG91ckFsdFBvcnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbmxldCBjdXJyZW50OiBUYWtlb3ZlckNvbXB1dGVkID0ge307XG5sZXQgY3VycmVudEtleSA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpO1xubGV0IGV2ZW50TGlzdGVuZXJzOiAoKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKVtdID0gW107XG5sZXQgZXZlbnRUaW1lcnM6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+W10gPSBbXTtcbmxldCBsb2dnZWROb01hdGNoID0gZmFsc2U7XG5sZXQgbG9nZ2VkSWRlbnRpdHkgPSBmYWxzZTtcblxuZnVuY3Rpb24gZXhlY1RleHQoY29tbWFuZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBleGVjKGNvbW1hbmQsIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoc3Rkb3V0KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8vIFRoZSB0aW1lbGluZSBlbnRyeSBwaWQgaXMgdGhlIHNjcmVlbiBzaGVsbCB0aGF0IHNwYXduZWQgdXMgLSBhbiBhbmNlc3RvciAtIHNvIHdlIHdhbGsgb3VyIHdob2xlXG4vLyBhbmNlc3RvciBjaGFpbiB0byBmaW5kIHdoaWNoIGVudHJ5IGlzIHVzXG5hc3luYyBmdW5jdGlvbiBnZXRBbmNlc3RvclBpZHMoKTogUHJvbWlzZTxTZXQ8bnVtYmVyPj4ge1xuICAgIGxldCBwaWRzID0gbmV3IFNldDxudW1iZXI+KFtwcm9jZXNzLnBpZF0pO1xuICAgIGxldCBjdXJyZW50UGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IHBwaWQ6IG51bWJlcjtcbiAgICAgICAgaWYgKGN1cnJlbnRQaWQgPT09IHByb2Nlc3MucGlkICYmIHByb2Nlc3MucHBpZCkge1xuICAgICAgICAgICAgcHBpZCA9IHByb2Nlc3MucHBpZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcHBpZCA9IHBhcnNlSW50KChhd2FpdCBleGVjVGV4dChgcHMgLW8gcHBpZD0gLXAgJHtjdXJyZW50UGlkfWApKS50cmltKCkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcGlkIHx8IE51bWJlci5pc05hTihwcGlkKSB8fCBwcGlkIDw9IDEgfHwgcGlkcy5oYXMocHBpZCkpIGJyZWFrO1xuICAgICAgICBwaWRzLmFkZChwcGlkKTtcbiAgICAgICAgY3VycmVudFBpZCA9IHBwaWQ7XG4gICAgfVxuICAgIHJldHVybiBwaWRzO1xufVxuXG4vLyBUaGUgaW5zdGFuY2UgZm9sZGVyIGlzIEFMV0FZUyB0aGUgcGFyZW50IG9mIG91ciBjd2QgKHNlcnZpY2VzIHJ1biBpbiA8aW5zdGFuY2U+L2dpdC8pIC0gbmV2ZXJcbi8vIHNlYXJjaCBmb3IgaXQsIGEgd2FsayBjb3VsZCBsYXRjaCBvbnRvIHRoZSB3cm9uZyBmb2xkZXJcbmZ1bmN0aW9uIGdldFRpbWVsaW5lRm9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShwcm9jZXNzLmN3ZCgpKS5yZXBsYWNlQWxsKFwiXFxcXFwiLCBcIi9cIikgKyBcIi9cIjtcbn1cblxuZnVuY3Rpb24gcGlkQWxpdmUocGlkOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgICBwcm9jZXNzLmtpbGwocGlkLCAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gKGUgYXMgeyBjb2RlPzogc3RyaW5nIH0pLmNvZGUgPT09IFwiRVBFUk1cIjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlZ2lzdHJ5Rm9sZGVyKCk6IHN0cmluZyB7XG4gICAgaWYgKCFpbml0aWFsaXplZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlcGxveSB0YWtlb3ZlciBpcyBub3QgaW5pdGlhbGl6ZWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihwYXRoLmRpcm5hbWUocGF0aC5yZXNvbHZlKGluaXRpYWxpemVkLnN0b3JhZ2VGb2xkZXIpKSwgUE9SVF9SRUdJU1RSWV9GT0xERVJfTkFNRSk7XG59XG5cbnR5cGUgUmVnaXN0cnlFbnRyeSA9IHsgcGlkOiBudW1iZXI7IHBvcnQ6IG51bWJlcjsgYW5jZXN0b3JQaWRzOiBudW1iZXJbXSB9O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkUG9ydFJlZ2lzdHJ5KCk6IFByb21pc2U8UmVnaXN0cnlFbnRyeVtdPiB7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICAgIGZpbGVzID0gYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcihmb2xkZXIpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGxldCBlbnRyaWVzOiBSZWdpc3RyeUVudHJ5W10gPSBbXTtcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IC9eKFxcZCspXFwuanNvbiQvLmV4ZWMoZmlsZSk7XG4gICAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuICAgICAgICBsZXQgcGlkID0gcGFyc2VJbnQobWF0Y2hbMV0pO1xuICAgICAgICBpZiAoIXBpZEFsaXZlKHBpZCkpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZnMucHJvbWlzZXMudW5saW5rKHBhdGguam9pbihmb2xkZXIsIGZpbGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGVudHJ5ID0gSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZShwYXRoLmpvaW4oZm9sZGVyLCBmaWxlKSwgXCJ1dGY4XCIpKSBhcyBSZWdpc3RyeUVudHJ5O1xuICAgICAgICAgICAgZW50cmllcy5wdXNoKHsgLi4uZW50cnksIHBpZCB9KTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRUaW1lbGluZUVudHJpZXMoKTogUHJvbWlzZTxUaW1lbGluZUVudHJ5W10+IHtcbiAgICBpZiAoIXRpbWVsaW5lRm9sZGVyKSByZXR1cm4gW107XG4gICAgbGV0IGVudHJpZXM6IFRpbWVsaW5lRW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgYXdhaXQgZnMucHJvbWlzZXMucmVhZGRpcih0aW1lbGluZUZvbGRlcikpIHtcbiAgICAgICAgaWYgKCFQQVJBTUVURVJTX1RJTUVMSU5FX0ZJTEVfUkVHRVgudGVzdChmaWxlKSkgY29udGludWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShhd2FpdCBmcy5wcm9taXNlcy5yZWFkRmlsZSh0aW1lbGluZUZvbGRlciArIGZpbGUsIFwidXRmOFwiKSkgYXMgVGltZWxpbmVFbnRyeSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ291bGQgbm90IHJlYWQgZGVwbG95IHRpbWVsaW5lIGZpbGUgJHt0aW1lbGluZUZvbGRlciArIGZpbGV9OiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xufVxuXG5mdW5jdGlvbiBtYWtlUmVtYXAoc3VjY2Vzc29yU3RhcnQ6IG51bWJlciwgb3ZlcmxhcDogbnVtYmVyLCBhbHRQb3J0OiBudW1iZXIpOiBUYWtlb3ZlckNvbXB1dGVkW1wicmVtYXBcIl0ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGJvdW5kYXJ5QTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogQk9VTkRBUllfQV9GUkFDVElPTixcbiAgICAgICAgYm91bmRhcnlCOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9CX0ZSQUNUSU9OLFxuICAgICAgICBleHBpcmU6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTixcbiAgICAgICAgYWx0UG9ydCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBlbWl0KGV2ZW50OiBUYWtlb3ZlckV2ZW50KTogdm9pZCB7XG4gICAgZm9yIChsZXQgbGlzdGVuZXIgb2YgZXZlbnRMaXN0ZW5lcnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIGxpc3RlbmVyIGZhaWxlZDogJHsoZSBhcyBFcnJvcikuc3RhY2sgPz8gZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2NoZWR1bGVFdmVudHMoKTogdm9pZCB7XG4gICAgZm9yIChsZXQgdGltZXIgb2YgZXZlbnRUaW1lcnMpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gICAgZXZlbnRUaW1lcnMgPSBbXTtcbiAgICBsZXQgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgc2NoZWR1bGUgPSAodGltZTogbnVtYmVyLCBmbmM6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKHRpbWUgPD0gbm93KSByZXR1cm47XG4gICAgICAgIGxldCB0aW1lciA9IHNldFRpbWVvdXQoZm5jLCB0aW1lIC0gbm93KTtcbiAgICAgICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICAgICAgZXZlbnRUaW1lcnMucHVzaCh0aW1lcik7XG4gICAgfTtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGlmIChyZW1hcCkge1xuICAgICAgICBsZXQgYWx0UG9ydCA9IHJlbWFwLmFsdFBvcnQ7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSAtIFNXSVRDSF9TQ0FOX0xFQUQsICgpID0+IGVtaXQoXCJkaXNrU2NhblwiKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSwgKCkgPT4gY29uc29sZS5sb2coYERlcGxveSBzd2l0Y2hvdmVyIHdyaXRlIGhhbmRvZmYgYm91bmRhcnkgcGFzc2VkOiBmcmVzaCB3cml0ZXMgbm93IGJlbG9uZyB0byB0aGUgYWx0ZXJuYXRlLXBvcnQgc2lkZSAocG9ydCAke2FsdFBvcnR9KWApKTtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuYm91bmRhcnlBICsgU1dJVENIX1NDQU5fTEVBRCwgKCkgPT4gZW1pdChcImRpc2tTY2FuXCIpKTtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuYm91bmRhcnlCLCAoKSA9PiBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgc2Vjb25kIGJvdW5kYXJ5IHBhc3NlZDogZnJlc2ggd3JpdGVzIHJldHVybiB0byB0aGUgbWFpbiBwb3J0YCkpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5leHBpcmUsICgpID0+IHZvaWQgcmVjb21wdXRlKCkuY2F0Y2goKGU6IEVycm9yKSA9PiBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgcmVjb21wdXRlIGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpKTtcbiAgICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXRjaGluZyBmYWlsdXJlcyBtdXN0IGJlIGxvdWQsIG9yIHRha2VvdmVyIGRldGVjdGlvbiBmYWlscyBzaWxlbnRseSBmb3JldmVyXG4gICAgaWYgKCF1cyAmJiBlbnRyaWVzLmxlbmd0aCAmJiAhbG9nZ2VkTm9NYXRjaCkge1xuICAgICAgICBsb2dnZWROb01hdGNoID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKGBObyBkZXBsb3kgdGltZWxpbmUgZW50cnkgbWF0Y2hlcyBvdXIgcGlkIGNoYWluICgke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIsIFwiKX0pIC0gdGFrZW92ZXIgZGV0ZWN0aW9uIGNhbm5vdCB3b3JrLiBFbnRyaWVzOiAke2VudHJpZXMubWFwKHggPT4gYHBpZD0ke3gucGlkID8/IFwibm9uZVwifSByZWxlYXNlVGltZT0ke3gucGFyYW1ldGVycy5yZWxlYXNlVGltZX1gKS5qb2luKFwiIHwgXCIpfWApO1xuICAgIH1cbiAgICBpZiAodXMgJiYgIWxvZ2dlZElkZW50aXR5KSB7XG4gICAgICAgIGxvZ2dlZElkZW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coYERlcGxveSB0aW1lbGluZSBlbnRyeSBtYXRjaGVkOiB3ZSBhcmUgcGlkPSR7dXMucGlkfSwgcmVsZWFzZVRpbWU9JHt1cy5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lICE9PSB1bmRlZmluZWQgJiYgaXNvKHVzLnBhcmFtZXRlcnMucmVsZWFzZVRpbWUpIHx8IFwidW5rbm93blwifSwgJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllcyB0b3RhbGApO1xuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBsZXQgdXNSZWxlYXNlID0gdXM/LnBhcmFtZXRlcnMucmVsZWFzZVRpbWU7XG4gICAgaWYgKHVzICYmIHVzUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoZSBuZXdlciBlbnRyeSdzIHJlbGVhc2VUaW1lIGlzIHdoZW4gaXQgc3RhcnRzOyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGlzIHdoZW4gdGhlXG4gICAgICAgIC8vIG9sZGVyIG9uZSBpcyBraWxsZWQuIFRoYXQncyB0aGUgd2hvbGUgdGltZWxpbmUuXG4gICAgICAgIGxldCBuZXh0OiB7IGVudHJ5OiBUaW1lbGluZUVudHJ5OyByZWxlYXNlOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHByZXY6IHsgZW50cnk6IFRpbWVsaW5lRW50cnk7IHJlbGVhc2U6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByZWxlYXNlID0gZW50cnkucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPiB1c1JlbGVhc2UgJiYgKCFuZXh0IHx8IHJlbGVhc2UgPCBuZXh0LnJlbGVhc2UpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHsgZW50cnksIHJlbGVhc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWxlYXNlIDwgdXNSZWxlYXNlICYmICghcHJldiB8fCByZWxlYXNlID4gcHJldi5yZWxlYXNlKSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSB7IGVudHJ5LCByZWxlYXNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQucmVsZWFzZTtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gbmV4dC5lbnRyeS5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IHVzLnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIEV2ZW4gYSBaRVJPLW92ZXJsYXAgZGVwbG95IG5lZWRzIHRoZSBkeWluZyBiZWhhdmlvcnMgLSBkcmFpbmluZyBmYXN0LXdyaXRlIGZsdXNoZXNcbiAgICAgICAgICAgIC8vIGJ5IHRoZSByZWxlYXNlIGFuZCB3cml0aW5nIHRocm91Z2ggYWZ0ZXIgaXQsIG9yIGFja25vd2xlZGdlZCBkYXRhIGRpZXMgd2l0aCB1cy5cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIHJlbWFwICh0aGUgYWx0ZXJuYXRlLXBvcnQgbWlkZGxlIHdpbmRvdykgbmVlZHMgYW4gYWN0dWFsIG92ZXJsYXAuXG4gICAgICAgICAgICBjb21wdXRlZC5keWluZyA9IHsgc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAgfTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBub3cgPCBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JQaWQgPSBuZXh0LmVudHJ5LnBpZDtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yUGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzb3JFbnRyeSA9IHJlZ2lzdHJ5LmZpbmQoeCA9PiB4LmFuY2VzdG9yUGlkcy5pbmNsdWRlcyhzdWNjZXNzb3JQaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvckVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCwgc3VjY2Vzc29yRW50cnkucG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gdXMucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCBwcmV2LmVudHJ5LnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIFRoZSBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsIE9VUiByZWxlYXNlICsgdGhlIG92ZXJsYXBcbiAgICAgICAgICAgIGNvbXB1dGVkLnByZWRlY2Vzc29yRW5kID0gdXNSZWxlYXNlICsgb3ZlcmxhcDtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBvdXJBbHRQb3J0ICYmIG5vdyA8IHVzUmVsZWFzZSArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNSZWxlYXNlLCBvdmVybGFwLCBvdXJBbHRQb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5ID0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWQpO1xuICAgIGlmIChrZXkgPT09IGN1cnJlbnRLZXkpIHJldHVybjtcbiAgICBsb2dUcmFuc2l0aW9ucyhjdXJyZW50LCBjb21wdXRlZCk7XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgc2NoZWR1bGVFdmVudHMoKTtcbiAgICBlbWl0KFwicmVtYXBDaGFuZ2VkXCIpO1xufVxuXG5mdW5jdGlvbiBpc28odGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSkudG9JU09TdHJpbmcoKTtcbn1cblxuLy8gVGhlIHN3aXRjaG92ZXIgbGlmZWN5Y2xlIGlzIHJhcmUgYW5kIGltcG9ydGFudCwgc28gZXZlcnkgc3RhZ2UgZ2V0cyBhIGNsZWFyIGxpbmVcbmZ1bmN0aW9uIGxvZ1RyYW5zaXRpb25zKHByZXY6IFRha2VvdmVyQ29tcHV0ZWQsIG5leHQ6IFRha2VvdmVyQ29tcHV0ZWQpOiB2b2lkIHtcbiAgICBpZiAoIXByZXYuZHlpbmcgJiYgbmV4dC5keWluZykge1xuICAgICAgICBsZXQgeyBzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCB9ID0gbmV4dC5keWluZztcbiAgICAgICAgY29uc29sZS5sb2coYERlcGxveSBzd2l0Y2hvdmVyIHNjaGVkdWxlZDogb3VyIHN1Y2Nlc3NvciBzdGFydHMgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQpfTsgZmFzdC13cml0ZSBmbHVzaGVzIGRyYWluIGJ5ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OKX0sIGZyZXNoIHdyaXRlcyBoYW5kIG9mZiBhdCAke2lzbyhzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OKX0sIGFuZCB3ZSBhcmUga2lsbGVkIGF0ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCl9YCk7XG4gICAgfVxuICAgIGlmICghcHJldi5wcmVkZWNlc3NvckVuZCAmJiBuZXh0LnByZWRlY2Vzc29yRW5kKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBXZSBhcmUgYSBkZXBsb3kgc3VjY2Vzc29yOiBvdXIgcHJlZGVjZXNzb3IgaG9sZHMgdGhlIG1haW4gcG9ydCB1bnRpbCAke2lzbyhuZXh0LnByZWRlY2Vzc29yRW5kKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2LnJlbWFwICYmIG5leHQucmVtYXApIHtcbiAgICAgICAgY29uc29sZS5sb2coYERlcGxveSBzd2l0Y2hvdmVyIHJlbWFwIGFjdGl2ZTogc291cmNlcyBwb2ludGluZyBhdCB1cyBhcmUgc3BsaXQgc28gWyR7aXNvKG5leHQucmVtYXAuYm91bmRhcnlBKX0gLi4gJHtpc28obmV4dC5yZW1hcC5ib3VuZGFyeUIpfV0gcm91dGVzIHRvIGFsdGVybmF0ZSBwb3J0ICR7bmV4dC5yZW1hcC5hbHRQb3J0fSAocmVtYXAgZXhwaXJlcyBhdCAke2lzbyhuZXh0LnJlbWFwLmV4cGlyZSl9KWApO1xuICAgIH1cbiAgICBpZiAocHJldi5yZW1hcCAmJiAhbmV4dC5yZW1hcCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRGVwbG95IHN3aXRjaG92ZXIgcmVtYXAgZW5kZWQ7IHJ1bm5pbmcgb24gdGhlIHBsYWluIHN0b3JlZCByb3V0aW5nIGNvbmZpZ2ApO1xuICAgIH1cbn1cblxuLyoqIFN0YXJ0cyB0aGUgdGFrZW92ZXIgbWFjaGluZXJ5LiBQb3J0IGZhbGxiYWNrIChhbHRlcm5hdGUgcG9ydCArIHJlZ2lzdHJ5ICsgYWNxdWlzaXRpb24gcG9sbGluZylcbiAqICB3b3JrcyByZWdhcmRsZXNzOyB3aXRob3V0IGEgZGVwbG95IHRpbWVsaW5lIGZvbGRlciB0aGUgc3dpdGNob3Zlci1zcGVjaWZpYyBwYXJ0cyAodGhlIHJlbWFwLFxuICogIHRoZSBmbHVzaCBkZWFkbGluZSwgdGhlIHRpZ2h0ZXIgYWNxdWlzaXRpb24gcGFjaW5nKSBzaW1wbHkgc3RheSBpbmVydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gZ2V0VGltZWxpbmVGb2xkZXIoKTtcbiAgICBsZXQgZW50cmllcyA9IGF3YWl0IHJlYWRUaW1lbGluZUVudHJpZXMoKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBObyBkZXBsb3kgdGltZWxpbmUgZW50cmllcyBpbiAke3RpbWVsaW5lRm9sZGVyfTsgZGVwbG95IHRha2VvdmVyIGluYWN0aXZlIHVudGlsIHRoZXkgYXBwZWFyIChwb3J0IGZhbGxiYWNrIHN0aWxsIHdvcmtzKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBEZXBsb3kgdGltZWxpbmUgZm91bmQgYXQgJHt0aW1lbGluZUZvbGRlcn0gKCR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMpOyBvdXIgcGlkIGNoYWluOiAke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIgLT4gXCIpfWApO1xuICAgIH1cbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbiAgICBsZXQgcG9sbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfSwgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCk7XG4gICAgKHBvbGwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vKiogQ2FsbGVkIHdoZW4gd2UgaGFkIHRvIGxpc3RlbiBvbiBhbiBhbHRlcm5hdGUgcG9ydCAodGhlIG1haW4gcG9ydCB3YXMgc3RpbGwgaGVsZCBieSBvdXJcbiAqICBwcmVkZWNlc3Nvcik6IHJlZ2lzdGVycyBpdCBzbyB0aGUgcHJlZGVjZXNzb3IgY2FuIHJvdXRlIHRoZSBtaWRkbGUgb3ZlcmxhcCB3aW5kb3cgdG8gdXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBbHRQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIG91ckFsdFBvcnQgPSBwb3J0O1xuICAgIGxldCBmb2xkZXIgPSBnZXRSZWdpc3RyeUZvbGRlcigpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IGVudHJ5OiBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IHByb2Nlc3MucGlkLCBwb3J0LCBhbmNlc3RvclBpZHM6IFsuLi5hbmNlc3RvclBpZHNdIH07XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihmb2xkZXIsIGAke3Byb2Nlc3MucGlkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gICAgYXdhaXQgcmVjb21wdXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblRha2VvdmVyRXZlbnQobGlzdGVuZXI6IChldmVudDogVGFrZW92ZXJFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGV2ZW50TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKiogVGhlIGludGVycHJldGF0aW9uIG92ZXJsYXk6IHNwbGl0cyBldmVyeSBzb3VyY2UgcG9pbnRpbmcgYXQgb3VyIGRvbWFpbittYWluIHBvcnQgc28gdGhlIG1pZGRsZVxuICogIG9mIHRoZSBkZXBsb3kgb3ZlcmxhcCBwb2ludHMgYXQgdGhlIGFsdGVybmF0ZSBwb3J0LiBQdXJlLCBpbi1tZW1vcnkgb25seSAtIHRoZSBzdG9yZWQgcm91dGluZ1xuICogIGNvbmZpZyBpcyBuZXZlciBtb2RpZmllZCwgYW5kIHRoaXMgbXVzdCBuZXZlciBiZSBhcHBsaWVkIHRvIGRhdGEgdGhhdCBnZXRzIHBlcnNpc3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlcGxveVJlbWFwKHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBsZXQgaW5pdCA9IGluaXRpYWxpemVkO1xuICAgIGlmICghcmVtYXAgfHwgIWluaXQpIHJldHVybiByb3V0aW5nO1xuICAgIGxldCBzb3VyY2VzOiBSZW1vdGVDb25maWdCYXNlW10gPSBbXTtcbiAgICBsZXQgc2xpY2UgPSAoc291cmNlOiBIb3N0ZWRDb25maWcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB1cmw/OiBzdHJpbmcpOiBIb3N0ZWRDb25maWcgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5zb3VyY2UsIHVybDogdXJsIHx8IHNvdXJjZS51cmwsIHZhbGlkV2luZG93OiBbc3RhcnQsIGVuZF0gfTtcbiAgICB9O1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZDogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGluaXQuZG9tYWluIHx8IHBhcnNlZC5wb3J0ICE9PSBpbml0Lm1haW5Qb3J0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBhID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QSwgZW5kKSk7XG4gICAgICAgIGxldCBiID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QiwgZW5kKSk7XG4gICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBzdGFydCwgYSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID4gYSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYSwgYiwgcmVwbGFjZUhvc3RlZFVybFBvcnQoc291cmNlLnVybCwgcmVtYXAuYWx0UG9ydCkpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gYikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYiwgZW5kKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogcm91dGluZy52ZXJzaW9uLCBzb3VyY2VzIH07XG59XG5cbi8qKiBGb3IgdGhlIGR5aW5nIHByb2Nlc3M6IGZhc3Qtd3JpdGUgZmx1c2ggZGVsYXlzIG11c3QgbmV2ZXIgZXh0ZW5kIHBhc3QgdGhpcyB0aW1lLCBhbmQgYWZ0ZXIgaXRcbiAqICBmYXN0IHdyaXRlcyBmbHVzaCBpbW1lZGlhdGVseSAtIHNvIG5vdGhpbmcgaXMgbGVmdCBpbiBtZW1vcnkgd2hlbiB0aGUgd3JpdGUgd2luZG93IHRyYW5zZmVycy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbHVzaERlYWRsaW5lKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGR5aW5nID0gY3VycmVudC5keWluZztcbiAgICBpZiAoIWR5aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBkeWluZy5zdWNjZXNzb3JTdGFydCArIGR5aW5nLm92ZXJsYXAgKiBGTFVTSF9ERUFETElORV9GUkFDVElPTjtcbn1cblxuLyoqIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiBtYWluLXBvcnQgYWNxdWlzaXRpb24gYXR0ZW1wdHM6IHRpZ2h0IGFyb3VuZCB0aGUgcHJlZGVjZXNzb3Inc1xuICogIHNjaGVkdWxlZCBkZWF0aCAod2hlbiB0aGUgcG9ydCBhY3R1YWxseSBmcmVlcyksIHJlbGF4ZWQgb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW5Qb3J0QWNxdWlyZURlbGF5KCk6IG51bWJlciB7XG4gICAgbGV0IGVuZCA9IGN1cnJlbnQucHJlZGVjZXNzb3JFbmQ7XG4gICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkICYmIE1hdGguYWJzKERhdGUubm93KCkgLSBlbmQpIDw9IEFDUVVJUkVfRkFTVF9XSU5ET1cpIHtcbiAgICAgICAgcmV0dXJuIEFDUVVJUkVfRkFTVF9ERUxBWTtcbiAgICB9XG4gICAgcmV0dXJuIEFDUVVJUkVfU0xPV19ERUxBWTtcbn1cbiJdfQ==
|
|
404
|
-
/* _JS_SOURCE_HASH = "
|
|
452
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBdUJoQyxJQUFJLFdBQW9GLENBQUM7QUFDekYsSUFB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IjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IFJlbW90ZUNvbmZpZywgUmVtb3RlQ29uZmlnQmFzZSwgSG9zdGVkQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgcGFyc2VIb3N0ZWRVcmwsIHJlcGxhY2VIb3N0ZWRVcmxQb3J0IH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5cbi8vIERlcGxveSB0YWtlb3ZlcjogdGhlIGRlcGxveSBtYW5hZ2VyIChxdWVyeXN1YidzIHBhcmFtZXRlcnNUaW1lbGluZSkgd3JpdGVzIDxuPi1wYXJhbWV0ZXJzLmpzb25cbi8vIGZpbGVzIGludG8gb3VyIGluc3RhbmNlIGZvbGRlciBkZXNjcmliaW5nIHdoZW4gZWFjaCB2ZXJzaW9uIHJ1bnMgYW5kIHdoZW4gaXQgaXMgc2h1dCBkb3duLiBPbGRcbi8vIGFuZCBuZXcgdmVyc2lvbiBvdmVybGFwIGZvciB0aGUgb3ZlcmxhcCB0aW1lIChPID0gb2xkRW5kIC0gbmV3U3RhcnQpLiBXZSB0dXJuIHRoYXQgb3ZlcmxhcCBpbnRvXG4vLyBhbiBhdG9taWMgd3JpdGUgaGFuZG9mZiBieSBSRUlOVEVSUFJFVElORyBldmVyeSByb3V0aW5nIHNvdXJjZSB0aGF0IHBvaW50cyBhdCB1czogaXRzIHZhbGlkXG4vLyB3aW5kb3cgaXMgc3BsaXQgc28gdGhhdCB0aGUgbWlkZGxlIG9mIHRoZSBvdmVybGFwIChbUyArIDAuNSpPLCBTICsgMS41Kk9dKSBwb2ludHMgYXQgdGhlIG5ld1xuLy8gcHJvY2VzcydzIHRlbXBvcmFyeSBhbHRlcm5hdGUgcG9ydC4gVGhlIGV4aXN0aW5nIHZhbGlkLXdpbmRvdyBtYWNoaW5lcnkgdGhlbiBkb2VzIGV2ZXJ5dGhpbmcgLVxuLy8gdGhlIG9sZCBwcm9jZXNzIHN0YXJ0cyByZWplY3RpbmcgZnJlc2ggd3JpdGVzIGF0IHRoZSBmaXJzdCBib3VuZGFyeSwgY2xpZW50cyByZS1yZXNvbHZlLCBhbmQgdGhlXG4vLyBuZXcgcHJvY2VzcyAod2hpY2ggcmVjb2duaXplcyB0aGUgYWx0ZXJuYXRlIHBvcnQgYXMgaXRzZWxmKSB0YWtlcyBvdmVyLiBUaGUgcmVtYXAgaXMgYW5cbi8vIElOVEVSUFJFVEFUSU9OIE9WRVJMQVksIGFwcGxpZWQgd2hlcmUgcm91dGluZyBjb25maWdzIGFyZSB1c2VkIChzZWUgYXBwbHlEZXBsb3lSZW1hcCBjYWxsZXJzKSAtXG4vLyBpdCBpcyBuZXZlciB3cml0dGVuIHRvIGRpc2ssIG5ldmVyIHN5bmNocm9uaXplZCwgYW5kIG5ldmVyIHBhcnQgb2YgYW55IHN0b3JlZCBjb25maWd1cmF0aW9uLlxuLy9cbi8vIEV2ZXJ5dGhpbmcgaGVyZSBpcyByZWNvbXB1dGVkIGlkZW1wb3RlbnRseSBmcm9tIGl0cyBpbnB1dHMgKHRpbWVsaW5lIGZpbGVzLCB0aGUgcG9ydCByZWdpc3RyeSxcbi8vIG91ciBhbmNlc3RvciBwaWRzLCB0aGUgY2xvY2spIC0gZmlsZXMgY2FuIGFwcGVhciBvciBjaGFuZ2UgYXQgYW55IG1vbWVudCwgYW5kIHdlIGNhbiBzdGFydCBhdFxuLy8gYW55IHBvaW50IGR1cmluZyBhIHN3aXRjaG92ZXIuXG5cbmNvbnN0IFBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWCA9IC9eKFxcZCspLXBhcmFtZXRlcnNcXC5qc29uJC87XG5jb25zdCBUSU1FTElORV9QT0xMX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gUHJvY2Vzc2VzIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydCByZWdpc3RlciBpdCBoZXJlIChzaWJsaW5nIG9mIHRoZSBzdG9yYWdlIGZvbGRlciksIGtleWVkXG4vLyBieSB0aGVpciBhY3R1YWwgcGlkOyBjb250ZW50IGluY2x1ZGVzIHRoZWlyIGFuY2VzdG9yIHBpZHMgc28gdGhlIHRpbWVsaW5lIGVudHJ5IHBpZCAoYSBzaGVsbFxuLy8gYW5jZXN0b3Igb2YgdGhlIHByb2Nlc3MpIGNhbiBiZSBtYXRjaGVkIHRvIGEgcmVnaXN0cnkgZW50cnlcbmNvbnN0IFBPUlRfUkVHSVNUUllfRk9MREVSX05BTUUgPSBcInN0b3JhZ2VQb3J0UmVnaXN0cnlcIjtcbi8vIE1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0cyBydW4gdGhpcyBvZnRlbiwgdGlnaHRlbmluZyBuZWFyIHRoZSBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aFxuY29uc3QgQUNRVUlSRV9TTE9XX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX0RFTEFZID0gNSAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfV0lORE9XID0gNjAgKiAxMDAwO1xuLy8gRGlzayByZXNjYW5zIGZpcmUgdGhpcyBmYXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUgaGFuZG9mZiwgY2F0Y2hpbmcgZmlsZXMgdGhlIG90aGVyIHByb2Nlc3Ncbi8vIHdyb3RlICh0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCBpcyBhdG9taWMgYnV0IGl0cyBlbnRyaWVzIGxhbmQgYXQgd3JpdGUgdGltZSwgbm90IGZpbGUgdGltZSlcbmNvbnN0IFNXSVRDSF9TQ0FOX0xFQUQgPSAxMCAqIDEwMDA7XG4vLyBUaGUgZHlpbmcgcHJvY2VzcyBtdXN0IGhhdmUgZmx1c2hlZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgaGFuZG9mZjogZmFzdC13cml0ZSBkZWxheXMgbmV2ZXJcbi8vIGV4dGVuZCBwYXN0IFMgKyBvdmVybGFwICogdGhpcyBmcmFjdGlvbiwgYW5kIGFmdGVyIHRoYXQgcG9pbnQgZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHlcbmNvbnN0IEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OID0gMC4yNTtcbmNvbnN0IEJPVU5EQVJZX0FfRlJBQ1RJT04gPSAwLjU7XG5jb25zdCBCT1VOREFSWV9CX0ZSQUNUSU9OID0gMS41O1xuY29uc3QgUkVNQVBfRVhQSVJFX0ZSQUNUSU9OID0gMjtcblxudHlwZSBUaW1lbGluZUVudHJ5ID0ge1xuICAgIHBpZD86IG51bWJlcjtcbiAgICAvLyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGRlZmluZSBldmVyeXRoaW5nOiB0aGUgbmV3ZXIgZW50cnkncyByZWxlYXNlVGltZSBpcyB3aGVuIGl0XG4gICAgLy8gc3RhcnRzLCBhbmQgcmVsZWFzZVRpbWUgKyBvdmVybGFwVGltZSBpcyB3aGVuIHRoZSBvbGRlciBvbmUgaXMga2lsbGVkIChmcmVlaW5nIHRoZSBwb3J0KS5cbiAgICAvLyBUaGUgZmlsZXMgYWxzbyBjYXJyeSBhbiBhbGl2ZVdpbmRvdywgd2hpY2ggaXMgZGVsaWJlcmF0ZWx5IGlnbm9yZWQuXG4gICAgcGFyYW1ldGVyczogeyByZWxlYXNlVGltZT86IG51bWJlcjsgb3ZlcmxhcFRpbWU/OiBudW1iZXIgfTtcbn07XG5cbnR5cGUgVGFrZW92ZXJDb21wdXRlZCA9IHtcbiAgICAvLyBXZSBhcmUgc2NoZWR1bGVkIHRvIGRpZSB3aXRoIGEgc3VjY2Vzc29yIG92ZXJsYXBwaW5nIHVzIChrbm93biBmcm9tIHRoZSBmaWxlcyBhbG9uZSwgYmVmb3JlXG4gICAgLy8gdGhlIHN1Y2Nlc3NvcidzIHBvcnQgaXMgZGlzY292ZXJlZCAtIHRoZSBmbHVzaCBkZWFkbGluZSBhcHBsaWVzIGltbWVkaWF0ZWx5KVxuICAgIGR5aW5nPzogeyBzdWNjZXNzb3JTdGFydDogbnVtYmVyOyBvdmVybGFwOiBudW1iZXIgfTtcbiAgICAvLyBUaGUgd2luZG93IHJlaW50ZXJwcmV0YXRpb24sIG9uY2UgdGhlIG1pZGRsZSB3aW5kb3cncyBwb3J0IGlzIGtub3duICh0aGUgc3VjY2Vzc29yJ3NcbiAgICAvLyByZWdpc3RlcmVkIGFsdGVybmF0ZSBwb3J0IC0gb3Igb3VyIG93biwgd2hlbiB3ZSBBUkUgdGhlIHN1Y2Nlc3NvcilcbiAgICByZW1hcD86IHsgYm91bmRhcnlBOiBudW1iZXI7IGJvdW5kYXJ5QjogbnVtYmVyOyBleHBpcmU6IG51bWJlcjsgYWx0UG9ydDogbnVtYmVyIH07XG4gICAgLy8gV2hlbiBvdXIgcHJlZGVjZXNzb3IgZGllcyBhbmQgZnJlZXMgdGhlIG1haW4gcG9ydCAoZm9yIGFjcXVpc2l0aW9uIHBhY2luZylcbiAgICBwcmVkZWNlc3NvckVuZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFRha2VvdmVyRXZlbnQgPSBcInJlbWFwQ2hhbmdlZFwiIHwgXCJkaXNrU2NhblwiO1xuXG5sZXQgaW5pdGlhbGl6ZWQ6IHsgZG9tYWluOiBzdHJpbmc7IG1haW5Qb3J0OiBudW1iZXI7IHN0b3JhZ2VGb2xkZXI6IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xubGV0IGFuY2VzdG9yUGlkcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xubGV0IHRpbWVsaW5lRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5sZXQgb3VyQWx0UG9ydDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGN1cnJlbnQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbmxldCBjdXJyZW50S2V5ID0gSlNPTi5zdHJpbmdpZnkoY3VycmVudCk7XG5sZXQgZXZlbnRMaXN0ZW5lcnM6ICgoZXZlbnQ6IFRha2VvdmVyRXZlbnQpID0+IHZvaWQpW10gPSBbXTtcbmxldCBldmVudFRpbWVyczogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD5bXSA9IFtdO1xubGV0IGxvZ2dlZE5vTWF0Y2ggPSBmYWxzZTtcbmxldCBsb2dnZWRJZGVudGl0eSA9IGZhbHNlO1xuXG5mdW5jdGlvbiBleGVjVGV4dChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGV4ZWMoY29tbWFuZCwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLy8gVGhlIHRpbWVsaW5lIGVudHJ5IHBpZCBpcyB0aGUgc2NyZWVuIHNoZWxsIHRoYXQgc3Bhd25lZCB1cyAtIGFuIGFuY2VzdG9yIC0gc28gd2Ugd2FsayBvdXIgd2hvbGVcbi8vIGFuY2VzdG9yIGNoYWluIHRvIGZpbmQgd2hpY2ggZW50cnkgaXMgdXNcbmFzeW5jIGZ1bmN0aW9uIGdldEFuY2VzdG9yUGlkcygpOiBQcm9taXNlPFNldDxudW1iZXI+PiB7XG4gICAgbGV0IHBpZHMgPSBuZXcgU2V0PG51bWJlcj4oW3Byb2Nlc3MucGlkXSk7XG4gICAgbGV0IGN1cnJlbnRQaWQgPSBwcm9jZXNzLnBpZDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcHBpZDogbnVtYmVyO1xuICAgICAgICBpZiAoY3VycmVudFBpZCA9PT0gcHJvY2Vzcy5waWQgJiYgcHJvY2Vzcy5wcGlkKSB7XG4gICAgICAgICAgICBwcGlkID0gcHJvY2Vzcy5wcGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwcGlkID0gcGFyc2VJbnQoKGF3YWl0IGV4ZWNUZXh0KGBwcyAtbyBwcGlkPSAtcCAke2N1cnJlbnRQaWR9YCkpLnRyaW0oKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBwaWQgfHwgTnVtYmVyLmlzTmFOKHBwaWQpIHx8IHBwaWQgPD0gMSB8fCBwaWRzLmhhcyhwcGlkKSkgYnJlYWs7XG4gICAgICAgIHBpZHMuYWRkKHBwaWQpO1xuICAgICAgICBjdXJyZW50UGlkID0gcHBpZDtcbiAgICB9XG4gICAgcmV0dXJuIHBpZHM7XG59XG5cbi8vIFRoZSBpbnN0YW5jZSBmb2xkZXIgaXMgQUxXQVlTIHRoZSBwYXJlbnQgb2Ygb3VyIGN3ZCAoc2VydmljZXMgcnVuIGluIDxpbnN0YW5jZT4vZ2l0LykgLSBuZXZlclxuLy8gc2VhcmNoIGZvciBpdCwgYSB3YWxrIGNvdWxkIGxhdGNoIG9udG8gdGhlIHdyb25nIGZvbGRlclxuZnVuY3Rpb24gZ2V0VGltZWxpbmVGb2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKHByb2Nlc3MuY3dkKCkpLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKSArIFwiL1wiO1xufVxuXG5mdW5jdGlvbiBwaWRBbGl2ZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFUEVSTVwiO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0cnlGb2xkZXIoKTogc3RyaW5nIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwbG95IHRha2VvdmVyIGlzIG5vdCBpbml0aWFsaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoaW5pdGlhbGl6ZWQuc3RvcmFnZUZvbGRlcikpLCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FKTtcbn1cblxudHlwZSBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IG51bWJlcjsgcG9ydDogbnVtYmVyOyBhbmNlc3RvclBpZHM6IG51bWJlcltdIH07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQb3J0UmVnaXN0cnkoKTogUHJvbWlzZTxSZWdpc3RyeUVudHJ5W10+IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0UmVnaXN0cnlGb2xkZXIoKTtcbiAgICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IGVudHJpZXM6IFJlZ2lzdHJ5RW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oXFxkKylcXC5qc29uJC8uZXhlYyhmaWxlKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICAgIGxldCBwaWQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGlmICghcGlkQWxpdmUocGlkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKGZvbGRlciwgZmlsZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihmb2xkZXIsIGZpbGUpLCBcInV0ZjhcIikpIGFzIFJlZ2lzdHJ5RW50cnk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyAuLi5lbnRyeSwgcGlkIH0pO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRpbWVsaW5lRW50cmllcygpOiBQcm9taXNlPFRpbWVsaW5lRW50cnlbXT4ge1xuICAgIGlmICghdGltZWxpbmVGb2xkZXIpIHJldHVybiBbXTtcbiAgICBsZXQgZW50cmllczogVGltZWxpbmVFbnRyeVtdID0gW107XG4gICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRpbWVsaW5lRm9sZGVyKSkge1xuICAgICAgICBpZiAoIVBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRpbWVsaW5lRm9sZGVyICsgZmlsZSwgXCJ1dGY4XCIpKSBhcyBUaW1lbGluZUVudHJ5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcmVhZCBkZXBsb3kgdGltZWxpbmUgZmlsZSAke3RpbWVsaW5lRm9sZGVyICsgZmlsZX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydDogbnVtYmVyLCBvdmVybGFwOiBudW1iZXIsIGFsdFBvcnQ6IG51bWJlcik6IFRha2VvdmVyQ29tcHV0ZWRbXCJyZW1hcFwiXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYm91bmRhcnlBOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OLFxuICAgICAgICBib3VuZGFyeUI6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0JfRlJBQ1RJT04sXG4gICAgICAgIGV4cGlyZTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OLFxuICAgICAgICBhbHRQb3J0LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGVtaXQoZXZlbnQ6IFRha2VvdmVyRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBldmVudExpc3RlbmVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgbGlzdGVuZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUV2ZW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0aW1lciBvZiBldmVudFRpbWVycykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgICBldmVudFRpbWVycyA9IFtdO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzY2hlZHVsZSA9ICh0aW1lOiBudW1iZXIsIGZuYzogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAodGltZSA8PSBub3cpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dChmbmMsIHRpbWUgLSBub3cpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBldmVudFRpbWVycy5wdXNoKHRpbWVyKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBpZiAocmVtYXApIHtcbiAgICAgICAgbGV0IGFsdFBvcnQgPSByZW1hcC5hbHRQb3J0O1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEgLSBTV0lUQ0hfU0NBTl9MRUFELCAoKSA9PiBlbWl0KFwiZGlza1NjYW5cIikpO1xuICAgICAgICBzY2hlZHVsZShyZW1hcC5ib3VuZGFyeUEsICgpID0+IGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgc3dpdGNob3ZlciB3cml0ZSBoYW5kb2ZmIGJvdW5kYXJ5ICR7aXNvKHJlbWFwLmJvdW5kYXJ5QSl9IHBhc3NlZDogZnJlc2ggd3JpdGVzIG5vdyBiZWxvbmcgdG8gdGhlIGFsdGVybmF0ZS1wb3J0IHNpZGUgKHBvcnQgJHthbHRQb3J0fSlgKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSArIFNXSVRDSF9TQ0FOX0xFQUQsICgpID0+IGVtaXQoXCJkaXNrU2NhblwiKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QiwgKCkgPT4gY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHNlY29uZCBib3VuZGFyeSAke2lzbyhyZW1hcC5ib3VuZGFyeUIpfSBwYXNzZWQ6IGZyZXNoIHdyaXRlcyByZXR1cm4gdG8gdGhlIG1haW4gcG9ydGApKTtcbiAgICAgICAgc2NoZWR1bGUocmVtYXAuZXhwaXJlLCAoKSA9PiB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKSk7XG4gICAgfVxuICAgIGxldCBkeWluZyA9IGN1cnJlbnQuZHlpbmc7XG4gICAgaWYgKGR5aW5nKSB7XG4gICAgICAgIGxldCBkZWFkbGluZSA9IGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xuICAgICAgICBsZXQga2lsbFRpbWUgPSBkeWluZy5zdWNjZXNzb3JTdGFydCArIGR5aW5nLm92ZXJsYXA7XG4gICAgICAgIGxldCBsb2dEZWFkbGluZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChsb2dnZWRGbHVzaERlYWRsaW5lRm9yID09PSBkZWFkbGluZSkgcmV0dXJuO1xuICAgICAgICAgICAgbG9nZ2VkRmx1c2hEZWFkbGluZUZvciA9IGRlYWRsaW5lO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIGZsdXNoIGRlYWRsaW5lICR7aXNvKGRlYWRsaW5lKX0gcmVhY2hlZCAobm93ICR7aXNvKERhdGUubm93KCkpfSk6IGZhc3Qgd3JpdGVzIHdyaXRlIHRocm91Z2ggaW1tZWRpYXRlbHkgdW50aWwgd2UgYXJlIGtpbGxlZCBhdCAke2lzbyhraWxsVGltZSl9YCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZWFkbGluZSA8PSBub3cpIHtcbiAgICAgICAgICAgIGxvZ0RlYWRsaW5lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY2hlZHVsZShkZWFkbGluZSwgbG9nRGVhZGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBNdWx0aXBsZSBwcm9jZXNzZXMgKHByZWRlY2Vzc29yICsgc3VjY2Vzc29yKSBvZnRlbiBzaGFyZSBvbmUgam91cm5hbCBkdXJpbmcgYSBzd2l0Y2hvdmVyLCBzb1xuLy8gZXZlcnkgbGlmZWN5Y2xlIGxpbmUgaWRlbnRpZmllcyBpdHMgcHJvY2Vzc1xuZnVuY3Rpb24gbG9nUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBbcGlkICR7cHJvY2Vzcy5waWR9XWA7XG59XG5sZXQgbG9nZ2VkRmx1c2hEZWFkbGluZUZvcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4vLyBSZWNvbXB1dGUgaXMgaW52b2tlZCBmcm9tIGluaXQsIHJlZ2lzdGVyQWx0UG9ydCwgdGhlIHBvbGwsIGFuZCB0aGUgZXhwaXJ5IHRpbWVyIC0gcG9zc2libHlcbi8vIGNvbmN1cnJlbnRseS4gUnVucyBhcmUgc2VyaWFsaXplZCwgb3IgdHdvIGluLWZsaWdodCBydW5zIHdvdWxkIGJvdGggcGFzcyB0aGUgY2hhbmdlZC1zdGF0ZSBjaGVja1xuLy8gYW5kIGRvdWJsZS1maXJlIGV2ZXJ5IHRyYW5zaXRpb24gKGxvZ3MsIHJlYnVpbGQgZXZlbnRzLCB0aW1lcnMpLlxubGV0IHJlY29tcHV0ZUNoYWluID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5mdW5jdGlvbiByZWNvbXB1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IG5leHQgPSByZWNvbXB1dGVDaGFpbi50aGVuKCgpID0+IHJlY29tcHV0ZU5vdygpKTtcbiAgICByZWNvbXB1dGVDaGFpbiA9IG5leHQudGhlbigoKSA9PiB7IH0sICgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG5leHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlY29tcHV0ZU5vdygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWluaXRpYWxpemVkIHx8ICF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBlbnRyaWVzID0gYXdhaXQgcmVhZFRpbWVsaW5lRW50cmllcygpO1xuICAgIGxldCByZWdpc3RyeSA9IGF3YWl0IHJlYWRQb3J0UmVnaXN0cnkoKTtcbiAgICBsZXQgdXM6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoZW50cnkucGlkICYmIGFuY2VzdG9yUGlkcy5oYXMoZW50cnkucGlkKSkge1xuICAgICAgICAgICAgdXMgPSBlbnRyeTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBNYXRjaGluZyBmYWlsdXJlcyBtdXN0IGJlIGxvdWQsIG9yIHRha2VvdmVyIGRldGVjdGlvbiBmYWlscyBzaWxlbnRseSBmb3JldmVyXG4gICAgaWYgKCF1cyAmJiBlbnRyaWVzLmxlbmd0aCAmJiAhbG9nZ2VkTm9NYXRjaCkge1xuICAgICAgICBsb2dnZWROb01hdGNoID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS53YXJuKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cnkgbWF0Y2hlcyBvdXIgcGlkIGNoYWluICgke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIsIFwiKX0pIC0gdGFrZW92ZXIgZGV0ZWN0aW9uIGNhbm5vdCB3b3JrLiBFbnRyaWVzOiAke2VudHJpZXMubWFwKHggPT4gYHBpZD0ke3gucGlkID8/IFwibm9uZVwifSByZWxlYXNlVGltZT0ke3gucGFyYW1ldGVycy5yZWxlYXNlVGltZX1gKS5qb2luKFwiIHwgXCIpfWApO1xuICAgIH1cbiAgICBpZiAodXMgJiYgIWxvZ2dlZElkZW50aXR5KSB7XG4gICAgICAgIGxvZ2dlZElkZW50aXR5ID0gdHJ1ZTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSB0aW1lbGluZSBlbnRyeSBtYXRjaGVkOiB3ZSBhcmUgcGlkPSR7dXMucGlkfSwgcmVsZWFzZVRpbWU9JHt1cy5wYXJhbWV0ZXJzLnJlbGVhc2VUaW1lICE9PSB1bmRlZmluZWQgJiYgaXNvKHVzLnBhcmFtZXRlcnMucmVsZWFzZVRpbWUpIHx8IFwidW5rbm93blwifSwgJHtlbnRyaWVzLmxlbmd0aH0gZW50cmllcyB0b3RhbGApO1xuICAgIH1cbiAgICBsZXQgY29tcHV0ZWQ6IFRha2VvdmVyQ29tcHV0ZWQgPSB7fTtcbiAgICBsZXQgdXNSZWxlYXNlID0gdXM/LnBhcmFtZXRlcnMucmVsZWFzZVRpbWU7XG4gICAgaWYgKHVzICYmIHVzUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFRoZSBuZXdlciBlbnRyeSdzIHJlbGVhc2VUaW1lIGlzIHdoZW4gaXQgc3RhcnRzOyByZWxlYXNlVGltZSArIG92ZXJsYXBUaW1lIGlzIHdoZW4gdGhlXG4gICAgICAgIC8vIG9sZGVyIG9uZSBpcyBraWxsZWQuIFRoYXQncyB0aGUgd2hvbGUgdGltZWxpbmUuXG4gICAgICAgIGxldCBuZXh0OiB7IGVudHJ5OiBUaW1lbGluZUVudHJ5OyByZWxlYXNlOiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHByZXY6IHsgZW50cnk6IFRpbWVsaW5lRW50cnk7IHJlbGVhc2U6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoZW50cnkgPT09IHVzKSBjb250aW51ZTtcbiAgICAgICAgICAgIGxldCByZWxlYXNlID0gZW50cnkucGFyYW1ldGVycy5yZWxlYXNlVGltZTtcbiAgICAgICAgICAgIGlmIChyZWxlYXNlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKHJlbGVhc2UgPiB1c1JlbGVhc2UgJiYgKCFuZXh0IHx8IHJlbGVhc2UgPCBuZXh0LnJlbGVhc2UpKSB7XG4gICAgICAgICAgICAgICAgbmV4dCA9IHsgZW50cnksIHJlbGVhc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZWxlYXNlIDwgdXNSZWxlYXNlICYmICghcHJldiB8fCByZWxlYXNlID4gcHJldi5yZWxlYXNlKSkge1xuICAgICAgICAgICAgICAgIHByZXYgPSB7IGVudHJ5LCByZWxlYXNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JTdGFydCA9IG5leHQucmVsZWFzZTtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gbmV4dC5lbnRyeS5wYXJhbWV0ZXJzLm92ZXJsYXBUaW1lIHx8IHVzLnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIEV2ZW4gYSBaRVJPLW92ZXJsYXAgZGVwbG95IG5lZWRzIHRoZSBkeWluZyBiZWhhdmlvcnMgLSBkcmFpbmluZyBmYXN0LXdyaXRlIGZsdXNoZXNcbiAgICAgICAgICAgIC8vIGJ5IHRoZSByZWxlYXNlIGFuZCB3cml0aW5nIHRocm91Z2ggYWZ0ZXIgaXQsIG9yIGFja25vd2xlZGdlZCBkYXRhIGRpZXMgd2l0aCB1cy5cbiAgICAgICAgICAgIC8vIE9ubHkgdGhlIHJlbWFwICh0aGUgYWx0ZXJuYXRlLXBvcnQgbWlkZGxlIHdpbmRvdykgbmVlZHMgYW4gYWN0dWFsIG92ZXJsYXAuXG4gICAgICAgICAgICBjb21wdXRlZC5keWluZyA9IHsgc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAgfTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBub3cgPCBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JQaWQgPSBuZXh0LmVudHJ5LnBpZDtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yUGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzb3JFbnRyeSA9IHJlZ2lzdHJ5LmZpbmQoeCA9PiB4LmFuY2VzdG9yUGlkcy5pbmNsdWRlcyhzdWNjZXNzb3JQaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvckVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCwgc3VjY2Vzc29yRW50cnkucG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gdXMucGFyYW1ldGVycy5vdmVybGFwVGltZSB8fCBwcmV2LmVudHJ5LnBhcmFtZXRlcnMub3ZlcmxhcFRpbWUgfHwgMDtcbiAgICAgICAgICAgIC8vIFRoZSBwcmVkZWNlc3NvciBob2xkcyB0aGUgbWFpbiBwb3J0IHVudGlsIE9VUiByZWxlYXNlICsgdGhlIG92ZXJsYXBcbiAgICAgICAgICAgIGNvbXB1dGVkLnByZWRlY2Vzc29yRW5kID0gdXNSZWxlYXNlICsgb3ZlcmxhcDtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBvdXJBbHRQb3J0ICYmIG5vdyA8IHVzUmVsZWFzZSArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04gJiYgIWNvbXB1dGVkLnJlbWFwKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQucmVtYXAgPSBtYWtlUmVtYXAodXNSZWxlYXNlLCBvdmVybGFwLCBvdXJBbHRQb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5ID0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWQpO1xuICAgIGlmIChrZXkgPT09IGN1cnJlbnRLZXkpIHJldHVybjtcbiAgICBsb2dUcmFuc2l0aW9ucyhjdXJyZW50LCBjb21wdXRlZCk7XG4gICAgY3VycmVudCA9IGNvbXB1dGVkO1xuICAgIGN1cnJlbnRLZXkgPSBrZXk7XG4gICAgc2NoZWR1bGVFdmVudHMoKTtcbiAgICBlbWl0KFwicmVtYXBDaGFuZ2VkXCIpO1xufVxuXG5mdW5jdGlvbiBpc28odGltZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGltZSkudG9JU09TdHJpbmcoKTtcbn1cblxuLy8gVGhlIHN3aXRjaG92ZXIgbGlmZWN5Y2xlIGlzIHJhcmUgYW5kIGltcG9ydGFudCwgc28gZXZlcnkgc3RhZ2UgZ2V0cyBhIGNsZWFyIGxpbmVcbmZ1bmN0aW9uIGxvZ1RyYW5zaXRpb25zKHByZXY6IFRha2VvdmVyQ29tcHV0ZWQsIG5leHQ6IFRha2VvdmVyQ29tcHV0ZWQpOiB2b2lkIHtcbiAgICBpZiAoIXByZXYuZHlpbmcgJiYgbmV4dC5keWluZykge1xuICAgICAgICBsZXQgeyBzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCB9ID0gbmV4dC5keWluZztcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHNjaGVkdWxlZDogb3VyIHN1Y2Nlc3NvciBzdGFydHMgYXQgJHtpc28oc3VjY2Vzc29yU3RhcnQpfTsgZmFzdC13cml0ZSBmbHVzaGVzIGRyYWluIGJ5ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OKX0sIGZyZXNoIHdyaXRlcyBoYW5kIG9mZiBhdCAke2lzbyhzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OKX0sIGFuZCB3ZSBhcmUga2lsbGVkIGF0ICR7aXNvKHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCl9YCk7XG4gICAgfVxuICAgIGlmICghcHJldi5wcmVkZWNlc3NvckVuZCAmJiBuZXh0LnByZWRlY2Vzc29yRW5kKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBXZSBhcmUgYSBkZXBsb3kgc3VjY2Vzc29yOiBvdXIgcHJlZGVjZXNzb3IgaG9sZHMgdGhlIG1haW4gcG9ydCB1bnRpbCAke2lzbyhuZXh0LnByZWRlY2Vzc29yRW5kKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwcmV2LnJlbWFwICYmIG5leHQucmVtYXApIHtcbiAgICAgICAgY29uc29sZS5sb2coYCR7bG9nUHJlZml4KCl9IERlcGxveSBzd2l0Y2hvdmVyIHJlbWFwIGFjdGl2ZTogc291cmNlcyBwb2ludGluZyBhdCB1cyBhcmUgc3BsaXQgc28gWyR7aXNvKG5leHQucmVtYXAuYm91bmRhcnlBKX0gLi4gJHtpc28obmV4dC5yZW1hcC5ib3VuZGFyeUIpfV0gcm91dGVzIHRvIGFsdGVybmF0ZSBwb3J0ICR7bmV4dC5yZW1hcC5hbHRQb3J0fSAocmVtYXAgZXhwaXJlcyBhdCAke2lzbyhuZXh0LnJlbWFwLmV4cGlyZSl9KWApO1xuICAgIH1cbiAgICBpZiAocHJldi5yZW1hcCAmJiAhbmV4dC5yZW1hcCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtsb2dQcmVmaXgoKX0gRGVwbG95IHN3aXRjaG92ZXIgcmVtYXAgZW5kZWQ7IHJ1bm5pbmcgb24gdGhlIHBsYWluIHN0b3JlZCByb3V0aW5nIGNvbmZpZ2ApO1xuICAgIH1cbn1cblxuLyoqIFN0YXJ0cyB0aGUgdGFrZW92ZXIgbWFjaGluZXJ5LiBQb3J0IGZhbGxiYWNrIChhbHRlcm5hdGUgcG9ydCArIHJlZ2lzdHJ5ICsgYWNxdWlzaXRpb24gcG9sbGluZylcbiAqICB3b3JrcyByZWdhcmRsZXNzOyB3aXRob3V0IGEgZGVwbG95IHRpbWVsaW5lIGZvbGRlciB0aGUgc3dpdGNob3Zlci1zcGVjaWZpYyBwYXJ0cyAodGhlIHJlbWFwLFxuICogIHRoZSBmbHVzaCBkZWFkbGluZSwgdGhlIHRpZ2h0ZXIgYWNxdWlzaXRpb24gcGFjaW5nKSBzaW1wbHkgc3RheSBpbmVydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gZ2V0VGltZWxpbmVGb2xkZXIoKTtcbiAgICBsZXQgZW50cmllcyA9IGF3YWl0IHJlYWRUaW1lbGluZUVudHJpZXMoKTtcbiAgICBpZiAoIWVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBObyBkZXBsb3kgdGltZWxpbmUgZW50cmllcyBpbiAke3RpbWVsaW5lRm9sZGVyfTsgZGVwbG95IHRha2VvdmVyIGluYWN0aXZlIHVudGlsIHRoZXkgYXBwZWFyIChwb3J0IGZhbGxiYWNrIHN0aWxsIHdvcmtzKWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke2xvZ1ByZWZpeCgpfSBEZXBsb3kgdGltZWxpbmUgZm91bmQgYXQgJHt0aW1lbGluZUZvbGRlcn0gKCR7ZW50cmllcy5sZW5ndGh9IGVudHJpZXMpOyBvdXIgcGlkIGNoYWluOiAke1suLi5hbmNlc3RvclBpZHNdLmpvaW4oXCIgLT4gXCIpfWApO1xuICAgIH1cbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbiAgICBsZXQgcG9sbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSk7XG4gICAgfSwgVElNRUxJTkVfUE9MTF9JTlRFUlZBTCk7XG4gICAgKHBvbGwgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xufVxuXG4vKiogQ2FsbGVkIHdoZW4gd2UgaGFkIHRvIGxpc3RlbiBvbiBhbiBhbHRlcm5hdGUgcG9ydCAodGhlIG1haW4gcG9ydCB3YXMgc3RpbGwgaGVsZCBieSBvdXJcbiAqICBwcmVkZWNlc3Nvcik6IHJlZ2lzdGVycyBpdCBzbyB0aGUgcHJlZGVjZXNzb3IgY2FuIHJvdXRlIHRoZSBtaWRkbGUgb3ZlcmxhcCB3aW5kb3cgdG8gdXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVnaXN0ZXJBbHRQb3J0KHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIG91ckFsdFBvcnQgPSBwb3J0O1xuICAgIGxldCBmb2xkZXIgPSBnZXRSZWdpc3RyeUZvbGRlcigpO1xuICAgIGF3YWl0IGZzLnByb21pc2VzLm1rZGlyKGZvbGRlciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgbGV0IGVudHJ5OiBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IHByb2Nlc3MucGlkLCBwb3J0LCBhbmNlc3RvclBpZHM6IFsuLi5hbmNlc3RvclBpZHNdIH07XG4gICAgYXdhaXQgZnMucHJvbWlzZXMud3JpdGVGaWxlKHBhdGguam9pbihmb2xkZXIsIGAke3Byb2Nlc3MucGlkfS5qc29uYCksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSk7XG4gICAgYXdhaXQgcmVjb21wdXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvblRha2VvdmVyRXZlbnQobGlzdGVuZXI6IChldmVudDogVGFrZW92ZXJFdmVudCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGV2ZW50TGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xufVxuXG4vKiogVGhlIGludGVycHJldGF0aW9uIG92ZXJsYXk6IHNwbGl0cyBldmVyeSBzb3VyY2UgcG9pbnRpbmcgYXQgb3VyIGRvbWFpbittYWluIHBvcnQgc28gdGhlIG1pZGRsZVxuICogIG9mIHRoZSBkZXBsb3kgb3ZlcmxhcCBwb2ludHMgYXQgdGhlIGFsdGVybmF0ZSBwb3J0LiBQdXJlLCBpbi1tZW1vcnkgb25seSAtIHRoZSBzdG9yZWQgcm91dGluZ1xuICogIGNvbmZpZyBpcyBuZXZlciBtb2RpZmllZCwgYW5kIHRoaXMgbXVzdCBuZXZlciBiZSBhcHBsaWVkIHRvIGRhdGEgdGhhdCBnZXRzIHBlcnNpc3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlcGxveVJlbWFwKHJvdXRpbmc6IFJlbW90ZUNvbmZpZyk6IFJlbW90ZUNvbmZpZyB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBsZXQgaW5pdCA9IGluaXRpYWxpemVkO1xuICAgIGlmICghcmVtYXAgfHwgIWluaXQpIHJldHVybiByb3V0aW5nO1xuICAgIGxldCBzb3VyY2VzOiBSZW1vdGVDb25maWdCYXNlW10gPSBbXTtcbiAgICBsZXQgc2xpY2UgPSAoc291cmNlOiBIb3N0ZWRDb25maWcsIHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyLCB1cmw/OiBzdHJpbmcpOiBIb3N0ZWRDb25maWcgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5zb3VyY2UsIHVybDogdXJsIHx8IHNvdXJjZS51cmwsIHZhbGlkV2luZG93OiBbc3RhcnQsIGVuZF0gfTtcbiAgICB9O1xuICAgIGZvciAobGV0IHNvdXJjZSBvZiByb3V0aW5nLnNvdXJjZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIgfHwgc291cmNlLnR5cGUgIT09IFwicmVtb3RlXCIpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZDogeyBhZGRyZXNzOiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoc291cmNlLnVybCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyc2VkLmFkZHJlc3MgIT09IGluaXQuZG9tYWluIHx8IHBhcnNlZC5wb3J0ICE9PSBpbml0Lm1haW5Qb3J0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSBzb3VyY2UudmFsaWRXaW5kb3c7XG4gICAgICAgIGxldCBhID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QSwgZW5kKSk7XG4gICAgICAgIGxldCBiID0gTWF0aC5tYXgoc3RhcnQsIE1hdGgubWluKHJlbWFwLmJvdW5kYXJ5QiwgZW5kKSk7XG4gICAgICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgICAgICBpZiAoYSA+IHN0YXJ0KSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBzdGFydCwgYSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiID4gYSkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYSwgYiwgcmVwbGFjZUhvc3RlZFVybFBvcnQoc291cmNlLnVybCwgcmVtYXAuYWx0UG9ydCkpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kID4gYikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNsaWNlKHNvdXJjZSwgYiwgZW5kKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFhZGRlZCkge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgdmVyc2lvbjogcm91dGluZy52ZXJzaW9uLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIHN0YW1wIG9mIHRoZSBjdXJyZW50IHJlbWFwIGludGVycHJldGF0aW9uLCBhZHZlcnRpc2VkIGluIHBpbmcgcmVzcG9uc2VzIC0gc28gZXZlcnkgY29ubmVjdGVkXG4gKiAgY2xpZW50IGxlYXJucyBvZiBhIHRha2VvdmVyIHdpdGhpbiBvbmUgcGluZyBpbnRlcnZhbCwgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBpdHMgY29uZmlnIHBvbGxcbiAqICBvciBhIHdyaXRlIHJlamVjdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlclN0YW1wKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlbWFwID0gY3VycmVudC5yZW1hcDtcbiAgICBpZiAoIXJlbWFwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyZW1hcCk7XG59XG5cbi8qKiBUaGUgbWlkZGxlLXdpbmRvdyBhbHRlcm5hdGUgcG9ydCBvZiBhbiBhY3RpdmUgcmVtYXAuIFRoZSBPVEhFUiBwcm9jZXNzIG9mIHRoZSB0YWtlb3ZlciBsaXZlcyBvblxuICogIHRoaXMgcG9ydCBvbiBPVVIgbWFjaGluZSAoc2FtZSBkaXNrISksIHNvIHNvdXJjZXMgcG9pbnRpbmcgYXQgaXQgYXJlIHNlbGYsIG5ldmVyIHN5bmMgdGFyZ2V0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWtlb3ZlckFsdFBvcnQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY3VycmVudC5yZW1hcD8uYWx0UG9ydDtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
|
|
453
|
+
/* _JS_SOURCE_HASH = "15f3341884830069c5bd597c97087a376c0e137d0693908ca808d470c4365e30"; */
|
|
@@ -180,11 +180,13 @@ class SourceWrapper {
|
|
|
180
180
|
if (!remote || this.pingTimer || this.disposed)
|
|
181
181
|
return;
|
|
182
182
|
let measure = async () => {
|
|
183
|
+
var _a;
|
|
183
184
|
let start = Date.now();
|
|
185
|
+
let result;
|
|
184
186
|
try {
|
|
185
|
-
await remote.ping();
|
|
187
|
+
result = await remote.ping();
|
|
186
188
|
}
|
|
187
|
-
catch (
|
|
189
|
+
catch (_b) {
|
|
188
190
|
// A failed ping is also our earliest down-detection
|
|
189
191
|
this.noteFailure();
|
|
190
192
|
return;
|
|
@@ -197,6 +199,11 @@ class SourceWrapper {
|
|
|
197
199
|
if (this.pings.length > PING_HISTORY) {
|
|
198
200
|
this.pings.shift();
|
|
199
201
|
}
|
|
202
|
+
let stamp = result === null || result === void 0 ? void 0 : result.takeover;
|
|
203
|
+
if (stamp !== this.lastTakeoverStamp) {
|
|
204
|
+
this.lastTakeoverStamp = stamp;
|
|
205
|
+
(_a = this.onServedConfigChanged) === null || _a === void 0 ? void 0 : _a.call(this);
|
|
206
|
+
}
|
|
200
207
|
};
|
|
201
208
|
void measure();
|
|
202
209
|
this.pingTimer = setInterval(() => {
|
|
@@ -248,5 +255,5 @@ class SourceWrapper {
|
|
|
248
255
|
}
|
|
249
256
|
}
|
|
250
257
|
exports.SourceWrapper = SourceWrapper;
|
|
251
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxvREFBaUQ7QUFFakQsaURBQW1HO0FBQ25HLHFEQUFrRDtBQUNsRCwrQ0FBNEM7QUFDNUMsNENBQWlEO0FBQ2pELDZEQUF3RjtBQUUzRSxRQUFBLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsUUFBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsUUFBQSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixLQUFLLFVBQVUsaUJBQWlCO0lBQzVCLElBQUksQ0FBQyxJQUFBLGFBQU0sR0FBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNELE1BQU0sSUFBQSxxQkFBUyxFQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFBLHFCQUFTLEVBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLGtHQUFrRztBQUNsRyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLDZGQUE2RjtBQUM3RixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFzQztJQUM3QyxvRkFBb0Y7SUFDNUUsVUFBbUI7UUFGcEIsV0FB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QUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0NBQ0o7QUF2TkQsc0NBdU5DIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmFsbG93Y2xpZW50ID0gdHJ1ZTtcblxuaW1wb3J0IHsgaXNOb2RlLCBzb3J0IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvbWlzY1wiO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9iYXRjaGluZ1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0IH0gZnJvbSBcIi4uLy4uL21pc2MvZ2V0U2VjcmV0XCI7XG5pbXBvcnQgeyBJQXJjaGl2ZXMsIEhvc3RlZENvbmZpZywgQmFja2JsYXplQ29uZmlnIH0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBnZXRCdWNrZXRCYXNlVXJsLCBwYXJzZUhvc3RlZFVybCwgcGFyc2VCYWNrYmxhemVVcmwgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IEFyY2hpdmVzUmVtb3RlIH0gZnJvbSBcIi4vQXJjaGl2ZXNSZW1vdGVcIjtcbmltcG9ydCB7IEFyY2hpdmVzVXJsIH0gZnJvbSBcIi4vQXJjaGl2ZXNVcmxcIjtcbmltcG9ydCB7IEFyY2hpdmVzQmFja2JsYXplIH0gZnJvbSBcIi4uL2JhY2tibGF6ZVwiO1xuaW1wb3J0IHsgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsLCBnZXRMb2NhbEFyY2hpdmVzIH0gZnJvbSBcIi4vc3RvcmFnZVNlcnZlclN0YXRlXCI7XG5cbmV4cG9ydCBjb25zdCBSRVRSWV9TVEFSVF9ERUxBWSA9IDIgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IFJFVFJZX01BWF9ERUxBWSA9IDUgKiA2MCAqIDEwMDA7XG5leHBvcnQgY29uc3QgUkVUUllfR1JPV1RIID0gMS41O1xuY29uc3QgQUNDRVNTX1JFQ0hFQ0tfSU5URVJWQUwgPSA2MCAqIDEwMDA7XG5jb25zdCBQSU5HX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuY29uc3QgUElOR19ISVNUT1JZID0gMTA7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0JhY2tibGF6ZUNyZWRzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghaXNOb2RlKCkpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBnZXRTZWNyZXQoXCJiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleUlkXCIpO1xuICAgICAgICBhd2FpdCBnZXRTZWNyZXQoXCJiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleVwiKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8vIE9uZSBzb3VyY2Ugb2YgYSBSZW1vdGVDb25maWcsIGFzIGEgdXNhYmxlIElBcmNoaXZlcy4gUmVhZHMgZmFsbCBiYWNrIHRvIHRoZSBwdWJsaWMtVVJMIGZvcm0gd2hlblxuLy8gd2UgZG9uJ3QgaGF2ZSBBUEkgYWNjZXNzOyB3cml0ZXMgYWx3YXlzIGF0dGVtcHQgdGhlIEFQSSAoc28gYWNjZXNzIGdyYW50ZWQgbGF0ZXIgaXMgcGlja2VkIHVwIG9uXG4vLyB0aGUgbmV4dCB3cml0ZSkuIFdoZW4gYSBjYWxsIGZhaWxzIHdoaWxlIHRoZSBXZWJTb2NrZXQgaXMgZG93biwgbm90ZUZhaWx1cmUgc3RhcnRzIGEgYmFja2dyb3VuZFxuLy8gcmVjb25uZWN0IGxvb3Agd2l0aCBhIHJhbXBpbmcgZGVsYXkgLSBpdCBuZXZlciBibG9ja3MgY2FsbGVycywgaXQganVzdCBrZWVwcyB0cnlpbmcgc28gdGhlXG4vLyBjb25uZWN0aW9uIGV2ZW50dWFsbHkgY29tZXMgYmFjay4gU291cmNlcyB3aXRob3V0IGEgV2ViU29ja2V0IChiYWNrYmxhemUsIFVSTC1mb3JtLCBvdXIgb3duXG4vLyBsb2NhbCBzZXJ2ZXIpIHJlcG9ydCBhbHdheXMtY29ubmVjdGVkOiB0aGV5J3JlIGxhc3QtcmVzb3J0IHNvdXJjZXMgd2hlcmUgdGhyb3dpbmcgaXMgZmluZS5cbmV4cG9ydCBjbGFzcyBTb3VyY2VXcmFwcGVyIHtcbiAgICBwdWJsaWMgYXBpPzogSUFyY2hpdmVzO1xuICAgIHB1YmxpYyB1cmw/OiBBcmNoaXZlc1VybDtcbiAgICBwdWJsaWMgd3JpdGVCbG9ja2VkPzogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVtb3RlPzogQXJjaGl2ZXNSZW1vdGU7XG4gICAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcmVjb25uZWN0UnVubmluZyA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWNjZXNzQ2FjaGU/OiB7IGhhc0FjY2VzczogYm9vbGVhbjsgdGltZTogbnVtYmVyIH07XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgY29uZmlnOiBIb3N0ZWRDb25maWcgfCBCYWNrYmxhemVDb25maWcsXG4gICAgICAgIC8vIGZhbHNlIGZvciBzaG9ydC1saXZlZCBwcm9iZSBpbnN0YW5jZXMsIHdoaWNoIG11c3QgbmV2ZXIgbGVhdmUgYSByZXRyeSBsb29wIGJlaGluZFxuICAgICAgICBwcml2YXRlIGJhY2tncm91bmQ6IGJvb2xlYW4sXG4gICAgKSB7IH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYXN5bmMgY3JlYXRlKGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnLCBvcHRpb25zPzogeyBiYWNrZ3JvdW5kPzogYm9vbGVhbiB9KTogUHJvbWlzZTxTb3VyY2VXcmFwcGVyPiB7XG4gICAgICAgIGxldCB3cmFwcGVyID0gbmV3IFNvdXJjZVdyYXBwZXIoY29uZmlnLCBvcHRpb25zPy5iYWNrZ3JvdW5kICE9PSBmYWxzZSk7XG4gICAgICAgIGlmIChjb25maWcudHlwZSA9PT0gXCJiYWNrYmxhemVcIikge1xuICAgICAgICAgICAgaWYgKGF3YWl0IGhhc0JhY2tibGF6ZUNyZWRzKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLmFwaSA9IG5ldyBBcmNoaXZlc0JhY2tibGF6ZSh7IGJ1Y2tldE5hbWU6IHBhcnNlQmFja2JsYXplVXJsKGNvbmZpZy51cmwpLmJ1Y2tldE5hbWUsIHB1YmxpYzogY29uZmlnLnB1YmxpYywgaW1tdXRhYmxlOiBjb25maWcuaW1tdXRhYmxlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc05vZGUoKSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIud3JpdGVCbG9ja2VkID0gYE5vIGJhY2tibGF6ZSBjcmVkZW50aWFscyBmb3IgJHtjb25maWcudXJsfS4gUHJvdmlkZSBiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleUlkIGFuZCBiYWNrYmxhemUuanNvbi5hcHBsaWNhdGlvbktleSB2aWEgZ2V0U2VjcmV0IHRvIGVuYWJsZSBBUEkgYWNjZXNzLmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIud3JpdGVCbG9ja2VkID0gYEJyb3dzZXJzIGNhbm5vdCB3cml0ZSB0byBiYWNrYmxhemUgKGJ1Y2tldCAke2NvbmZpZy51cmx9KWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXdyYXBwZXIuYXBpICYmIGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci51cmwgPSBuZXcgQXJjaGl2ZXNVcmwoZ2V0QnVja2V0QmFzZVVybChjb25maWcudXJsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkID0gcGFyc2VIb3N0ZWRVcmwoY29uZmlnLnVybCk7XG4gICAgICAgIGxldCBzZXJ2ZXIgPSBpc05vZGUoKSAmJiBnZXRTdG9yYWdlU2VydmVyQ29uZmlnT3B0aW9uYWwoKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChzZXJ2ZXIgJiYgcGFyc2VkLmFkZHJlc3MgPT09IHNlcnZlci5kb21haW4gJiYgcGFyc2VkLnBvcnQgPT09IHNlcnZlci5wb3J0KSB7XG4gICAgICAgICAgICAvLyBBIGJ1Y2tldCBob3N0ZWQgYnkgb3VyIG93biBwcm9jZXNzIC0gdXNlIGl0IGRpcmVjdGx5IGluc3RlYWQgb2YgY2FsbGluZyBvdXJzZWx2ZXNcbiAgICAgICAgICAgIHdyYXBwZXIuYXBpID0gZ2V0TG9jYWxBcmNoaXZlcyhwYXJzZWQuYWNjb3VudCwgcGFyc2VkLmJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgd3JhcHBlci5yZW1vdGUgPSBuZXcgQXJjaGl2ZXNSZW1vdGUoeyB1cmw6IGNvbmZpZy51cmwsIGFjY291bnROYW1lOiBjb25maWcuYWNjb3VudE5hbWUsIHdhaXRGb3JBY2Nlc3M6IGZhbHNlIH0pO1xuICAgICAgICB3cmFwcGVyLmFwaSA9IHdyYXBwZXIucmVtb3RlO1xuICAgICAgICBpZiAoY29uZmlnLnB1YmxpYyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHdyYXBwZXIudXJsID0gbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwoY29uZmlnLnVybCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXREZWJ1Z05hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgLy8gVGhlIHNhbWUgVVJMIGNhbiBhcHBlYXIgYXMgbXVsdGlwbGUgc291cmNlcyAoZGlmZmVyZW50IHJvdXRlcyAvIHZhbGlkIHdpbmRvd3MpLCBzbyB0aGVcbiAgICAgICAgLy8gZGlzdGluZ3Vpc2hpbmcgc2xpY2UgaXMgcGFydCBvZiB0aGUgbmFtZVxuICAgICAgICBsZXQgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCByb3V0ZSA9IHRoaXMuY29uZmlnLnJvdXRlO1xuICAgICAgICBpZiAocm91dGUpIHtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYHJvdXRlIFske3JvdXRlWzBdfSwgJHtyb3V0ZVsxXX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHRoaXMuY29uZmlnLnZhbGlkV2luZG93O1xuICAgICAgICBpZiAoc3RhcnQgIT09IDAgfHwgZW5kICE9PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikge1xuICAgICAgICAgICAgbGV0IHN0YXJ0VGV4dCA9IHN0YXJ0ID09PSAwICYmIFwiMFwiIHx8IG5ldyBEYXRlKHN0YXJ0KS50b0lTT1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IGVuZFRleHQgPSBlbmQgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSICYmIFwiZm9yZXZlclwiIHx8IG5ldyBEYXRlKGVuZCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIHBhcnRzLnB1c2goYHZhbGlkV2luZG93IFske3N0YXJ0VGV4dH0sICR7ZW5kVGV4dH1dYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGBzb3VyY2UvJHt0aGlzLmNvbmZpZy51cmx9JHtwYXJ0cy5sZW5ndGggJiYgYCAoJHtwYXJ0cy5qb2luKFwiLCBcIil9KWAgfHwgXCJcIn1gO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbW90ZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbW90ZS5pc0Nvbm5lY3RlZCgpO1xuICAgIH1cblxuICAgIC8qKiBDYWxsIGFmdGVyIGEgcmVxdWVzdCBmYWlsZWQgd2hpbGUgaXNDb25uZWN0ZWQoKSB3YXMgZmFsc2U6IHN0YXJ0cyAoaWYgbm90IGFscmVhZHkgcnVubmluZylcbiAgICAgKiAgdGhlIGJhY2tncm91bmQgcmVjb25uZWN0IGxvb3AuIE5ldmVyIGJsb2NrcyAtIHRoZSBmYWlsZWQgcmVxdWVzdCBzdGlsbCB0aHJvd3MuICovXG4gICAgcHVibGljIG5vdGVGYWlsdXJlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZCB8fCB0aGlzLmRpc3Bvc2VkIHx8IHRoaXMucmVjb25uZWN0UnVubmluZykgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgICAgICB0aGlzLnJlY29ubmVjdFJ1bm5pbmcgPSB0cnVlO1xuICAgICAgICB2b2lkIHRoaXMucmVjb25uZWN0TG9vcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVjb25uZWN0TG9vcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHJldHJ5RGVsYXkgPSBSRVRSWV9TVEFSVF9ERUxBWTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGF5KHJldHJ5RGVsYXkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSBicmVhaztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gQW55IGNhbGwgcmUtZXN0YWJsaXNoZXMgdGhlIFdlYlNvY2tldDsgdGhlIHJlc3VsdCBkb2Vzbid0IG1hdHRlclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMucmVtb3RlPy5nZXRJbmZvKFJPVVRJTkdfRklMRSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gRXZlbiBhIGZhaWxpbmcgY2FsbCAoZS5nLiBhY2Nlc3MgZGVuaWVkKSBwcm92ZXMgdGhlIGNvbm5lY3Rpb24gaXMgYmFja1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IGNvbm5lY3QgdG8gc3RvcmFnZSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9LCByZXRyeWluZyBpbiAke01hdGgucm91bmQocmV0cnlEZWxheSAvIDEwMDApfXMuICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXRyeURlbGF5ID0gTWF0aC5taW4oUkVUUllfTUFYX0RFTEFZLCByZXRyeURlbGF5ICogUkVUUllfR1JPV1RIKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc29sZS5sb2coYFJlY29ubmVjdGVkIHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfWApO1xuICAgIH1cblxuICAgIC8vIEZvciBob3N0ZWQgc291cmNlczogY2FjaGVkIGFjY2VzcyBjaGVjaywgc28gcmVhZHMga25vdyB3aGV0aGVyIHRvIHVzZSB0aGUgQVBJIG9yIHRoZSBwdWJsaWNcbiAgICAvLyBVUkwgZm9ybS4gQWNjZXNzLCBvbmNlIHNlZW4sIGlzIGFzc3VtZWQgdG8gc3RpY2s7IG5vLWFjY2VzcyBpcyByZS1jaGVja2VkIHBlcmlvZGljYWxseSAodGhlXG4gICAgLy8gY2hlY2sgYWxzbyByZWdpc3RlcnMgb3VyIGFjY2VzcyByZXF1ZXN0IHNlcnZlci1zaWRlLCB3aGljaCBsb2dzIHRoZSBncmFudCBsaW5rKS5cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgcmVtb3RlID0gdGhpcy5yZW1vdGU7XG4gICAgICAgIGlmICghcmVtb3RlKSByZXR1cm4gISF0aGlzLmFwaTtcbiAgICAgICAgbGV0IGNhY2hlZCA9IHRoaXMuYWNjZXNzQ2FjaGU7XG4gICAgICAgIGlmIChjYWNoZWQgJiYgKGNhY2hlZC5oYXNBY2Nlc3MgfHwgRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lIDwgQUNDRVNTX1JFQ0hFQ0tfSU5URVJWQUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkLmhhc0FjY2VzcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgd2FpdGluZyA9IGF3YWl0IHJlbW90ZS53YWl0aW5nRm9yQWNjZXNzKCk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogIXdhaXRpbmcsIHRpbWU6IERhdGUubm93KCkgfTtcbiAgICAgICAgaWYgKHdhaXRpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgTm8gYWNjZXNzIHRvIHN0b3JhZ2UgYWNjb3VudCBmb3IgJHt0aGlzLmNvbmZpZy51cmx9IChvdXIgbWFjaGluZSAke3dhaXRpbmcubWFjaGluZUlkfSwgaXAgJHt3YWl0aW5nLmlwfSkuIFJlYWRpbmcgdmlhIHRoZSBwdWJsaWMgVVJMIGZvcm0gd2hlcmUgcG9zc2libGUuIEdyYW50IGFjY2VzcyBhdCAke3dhaXRpbmcubGlua31gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXdhaXRpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHJlYWQ8VD4ocnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAodGhpcy5hcGkgJiYgYXdhaXQgdGhpcy5jaGVja0FjY2VzcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRoaXMuYXBpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy51cmwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy51cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFwaSkge1xuICAgICAgICAgICAgLy8gTm8gcHVibGljIFVSTCBmb3JtIC0gbGV0IHRoZSBBUEkgY2FsbCB0aHJvdyBpdHMgb3duIGVycm9yICh3aGljaCBpbmNsdWRlcyB0aGUgYWNjZXNzXG4gICAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgZm9yIGhvc3RlZCBzb3VyY2VzKVxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgJHt0aGlzLmNvbmZpZy51cmx9IGhhcyBubyBBUEkgYWNjZXNzIGFuZCBubyBwdWJsaWMgVVJMIGZvcm0gKHB1YmxpYzogZmFsc2UpYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGhhc1dyaXRlQWNjZXNzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAodGhpcy53cml0ZUJsb2NrZWQgfHwgIXRoaXMuYXBpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaS5oYXNXcml0ZUFjY2VzcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGluZ3M6IG51bWJlcltdID0gW107XG4gICAgcHJpdmF0ZSBwaW5nVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPiB8IHVuZGVmaW5lZDtcbiAgICBwcml2YXRlIGxvZ2dlZENvbm5lY3RlZCA9IGZhbHNlO1xuXG4gICAgLyoqIFN0YXJ0cyBtZWFzdXJpbmcgdGhpcyBzb3VyY2UncyBsYXRlbmN5IChmb3IgdmFyaWFibGUtc2hhcmQgdGFyZ2V0IHByZWZlcmVuY2UpLiBPbmx5IGhvc3RlZFxuICAgICAqICByZW1vdGVzIGFyZSBwaW5nZWQ7IG91ciBvd24gbG9jYWwgc2VydmVyIGNvdW50cyBhcyAwLCBldmVyeXRoaW5nIGVsc2UgYXMgSW5maW5pdHkuICovXG4gICAgcHVibGljIHN0YXJ0UGluZ2luZygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVtb3RlID0gdGhpcy5yZW1vdGU7XG4gICAgICAgIGlmICghcmVtb3RlIHx8IHRoaXMucGluZ1RpbWVyIHx8IHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICAgICAgbGV0IG1lYXN1cmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCByZW1vdGUucGluZygpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgLy8gQSBmYWlsZWQgcGluZyBpcyBhbHNvIG91ciBlYXJsaWVzdCBkb3duLWRldGVjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMubm90ZUZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMubG9nZ2VkQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dnZWRDb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb25uZWN0ZWQgdG8gc3RvcmFnZSAke3RoaXMuZ2V0RGVidWdOYW1lKCl9ICgke0RhdGUubm93KCkgLSBzdGFydH1tcylgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGluZ3MucHVzaChEYXRlLm5vdygpIC0gc3RhcnQpO1xuICAgICAgICAgICAgaWYgKHRoaXMucGluZ3MubGVuZ3RoID4gUElOR19ISVNUT1JZKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5waW5ncy5zaGlmdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB2b2lkIG1lYXN1cmUoKTtcbiAgICAgICAgdGhpcy5waW5nVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICB2b2lkIG1lYXN1cmUoKTtcbiAgICAgICAgfSwgUElOR19JTlRFUlZBTCk7XG4gICAgICAgICh0aGlzLnBpbmdUaW1lciBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG4gICAgfVxuXG4gICAgLyoqIFNlZWRzIHRoZSBsYXRlbmN5IGVzdGltYXRlIGJlZm9yZSB0aGUgZmlyc3QgcGluZyBsYW5kcyAoZS5nLiBmcm9tIHRoZSBpbml0aWFsIHJvdXRpbmdcbiAgICAgKiAgZmV0Y2gpLCBzbyB2YXJpYWJsZS1zaGFyZCBwaWNraW5nIGhhcyBzb21ldGhpbmcgaW1tZWRpYXRlbHkuIFJlYWwgcGluZ3MgdGFrZSBvdmVyIGZyb20gdGhlXG4gICAgICogIGZpcnN0IG1lYXN1cmVtZW50IG9uLiAqL1xuICAgIHB1YmxpYyBzZWVkTGF0ZW5jeShtczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnBpbmdzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICB0aGlzLnBpbmdzLnB1c2gobXMpO1xuICAgIH1cblxuICAgIC8qKiBNZWRpYW4gb2YgdGhlIHJlY2VudCBwaW5ncy4gU291cmNlcyB0aGF0IGNhbid0IGJlIHBpbmdlZCBzb3J0IGxhc3QgKEluZmluaXR5KSwgZXhjZXB0IG91clxuICAgICAqICBvd24gaW4tcHJvY2VzcyBzZXJ2ZXIsIHdoaWNoIGlzIHRoZSBiZXN0IHBvc3NpYmxlIHRhcmdldCAoMCkuICovXG4gICAgcHVibGljIGdldExhdGVuY3koKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnLnR5cGUgPT09IFwicmVtb3RlXCIgJiYgdGhpcy5hcGkpIHJldHVybiAwO1xuICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5waW5ncy5sZW5ndGgpIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgbGV0IHNvcnRlZCA9IFsuLi50aGlzLnBpbmdzXTtcbiAgICAgICAgc29ydChzb3J0ZWQsIHggPT4geCk7XG4gICAgICAgIHJldHVybiBzb3J0ZWRbTWF0aC5mbG9vcihzb3J0ZWQubGVuZ3RoIC8gMildO1xuICAgIH1cblxuICAgIC8qKiBXcml0ZXMgYWx3YXlzIGdvIHRocm91Z2ggdGhlIEFQSSwgc28gYSBwZXJtaXNzaW9uIGVycm9yIHRocm93cyB0byB0aGUgY2FsbGVyIG9uIGV2ZXJ5IHdyaXRlXG4gICAgICogIChhbmQgYWNjZXNzIGdyYW50ZWQgaW4gdGhlIG1lYW50aW1lIGlzIHBpY2tlZCB1cCBhdXRvbWF0aWNhbGx5KS4gKi9cbiAgICBwdWJsaWMgYXN5bmMgd3JpdGU8VD4ocnVuOiAoYXJjaGl2ZXM6IElBcmNoaXZlcykgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBpZiAodGhpcy53cml0ZUJsb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLndyaXRlQmxvY2tlZCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFwaSA9IHRoaXMuYXBpO1xuICAgICAgICBpZiAoIWFwaSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgJHt0aGlzLmNvbmZpZy51cmx9IGhhcyBubyBBUEkgYWNjZXNzLCBzbyBpdCBjYW5ub3QgYWNjZXB0IHdyaXRlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBydW4oYXBpKTtcbiAgICAgICAgdGhpcy5hY2Nlc3NDYWNoZSA9IHsgaGFzQWNjZXNzOiB0cnVlLCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5waW5nVGltZXIpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5waW5nVGltZXIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
252
|
-
/* _JS_SOURCE_HASH = "
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlV3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNvdXJjZVdyYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFFMUIsbURBQXdEO0FBQ3hELDJEQUFxRDtBQUNyRCxvREFBaUQ7QUFFakQsaURBQW1HO0FBQ25HLHFEQUFrRDtBQUNsRCwrQ0FBNEM7QUFDNUMsNENBQWlEO0FBQ2pELDZEQUF3RjtBQUUzRSxRQUFBLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDN0IsUUFBQSxlQUFlLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDaEMsUUFBQSxZQUFZLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUMxQyxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ2hDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUV4QixLQUFLLFVBQVUsaUJBQWlCO0lBQzVCLElBQUksQ0FBQyxJQUFBLGFBQU0sR0FBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzVCLElBQUksQ0FBQztRQUNELE1BQU0sSUFBQSxxQkFBUyxFQUFDLGlDQUFpQyxDQUFDLENBQUM7UUFDbkQsTUFBTSxJQUFBLHFCQUFTLEVBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQUMsV0FBTSxDQUFDO1FBQ0wsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxtR0FBbUc7QUFDbkcsbUdBQW1HO0FBQ25HLGtHQUFrRztBQUNsRyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLDZGQUE2RjtBQUM3RixNQUFhLGFBQWE7SUFTdEIsWUFDVyxNQUFzQztJQUM3QyxvRkFBb0Y7SUFDNUUsVUFBbUI7UUFGcEIsV0FB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LENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3pELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxPQUFPO1FBQ1YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0wsQ0FBQztDQUNKO0FBak9ELHNDQWlPQyIsInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5hbGxvd2NsaWVudCA9IHRydWU7XG5cbmltcG9ydCB7IGlzTm9kZSwgc29ydCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL21pc2NcIjtcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvYmF0Y2hpbmdcIjtcbmltcG9ydCB7IGdldFNlY3JldCB9IGZyb20gXCIuLi8uLi9taXNjL2dldFNlY3JldFwiO1xuaW1wb3J0IHsgSUFyY2hpdmVzLCBIb3N0ZWRDb25maWcsIEJhY2tibGF6ZUNvbmZpZyB9IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgZ2V0QnVja2V0QmFzZVVybCwgcGFyc2VIb3N0ZWRVcmwsIHBhcnNlQmFja2JsYXplVXJsIH0gZnJvbSBcIi4vcmVtb3RlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1JlbW90ZSB9IGZyb20gXCIuL0FyY2hpdmVzUmVtb3RlXCI7XG5pbXBvcnQgeyBBcmNoaXZlc1VybCB9IGZyb20gXCIuL0FyY2hpdmVzVXJsXCI7XG5pbXBvcnQgeyBBcmNoaXZlc0JhY2tibGF6ZSB9IGZyb20gXCIuLi9iYWNrYmxhemVcIjtcbmltcG9ydCB7IGdldFN0b3JhZ2VTZXJ2ZXJDb25maWdPcHRpb25hbCwgZ2V0TG9jYWxBcmNoaXZlcyB9IGZyb20gXCIuL3N0b3JhZ2VTZXJ2ZXJTdGF0ZVwiO1xuXG5leHBvcnQgY29uc3QgUkVUUllfU1RBUlRfREVMQVkgPSAyICogMTAwMDtcbmV4cG9ydCBjb25zdCBSRVRSWV9NQVhfREVMQVkgPSA1ICogNjAgKiAxMDAwO1xuZXhwb3J0IGNvbnN0IFJFVFJZX0dST1dUSCA9IDEuNTtcbmNvbnN0IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuY29uc3QgUElOR19JTlRFUlZBTCA9IDYwICogMTAwMDtcbmNvbnN0IFBJTkdfSElTVE9SWSA9IDEwO1xuXG5hc3luYyBmdW5jdGlvbiBoYXNCYWNrYmxhemVDcmVkcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZFwiKTtcbiAgICAgICAgYXdhaXQgZ2V0U2VjcmV0KFwiYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBPbmUgc291cmNlIG9mIGEgUmVtb3RlQ29uZmlnLCBhcyBhIHVzYWJsZSBJQXJjaGl2ZXMuIFJlYWRzIGZhbGwgYmFjayB0byB0aGUgcHVibGljLVVSTCBmb3JtIHdoZW5cbi8vIHdlIGRvbid0IGhhdmUgQVBJIGFjY2Vzczsgd3JpdGVzIGFsd2F5cyBhdHRlbXB0IHRoZSBBUEkgKHNvIGFjY2VzcyBncmFudGVkIGxhdGVyIGlzIHBpY2tlZCB1cCBvblxuLy8gdGhlIG5leHQgd3JpdGUpLiBXaGVuIGEgY2FsbCBmYWlscyB3aGlsZSB0aGUgV2ViU29ja2V0IGlzIGRvd24sIG5vdGVGYWlsdXJlIHN0YXJ0cyBhIGJhY2tncm91bmRcbi8vIHJlY29ubmVjdCBsb29wIHdpdGggYSByYW1waW5nIGRlbGF5IC0gaXQgbmV2ZXIgYmxvY2tzIGNhbGxlcnMsIGl0IGp1c3Qga2VlcHMgdHJ5aW5nIHNvIHRoZVxuLy8gY29ubmVjdGlvbiBldmVudHVhbGx5IGNvbWVzIGJhY2suIFNvdXJjZXMgd2l0aG91dCBhIFdlYlNvY2tldCAoYmFja2JsYXplLCBVUkwtZm9ybSwgb3VyIG93blxuLy8gbG9jYWwgc2VydmVyKSByZXBvcnQgYWx3YXlzLWNvbm5lY3RlZDogdGhleSdyZSBsYXN0LXJlc29ydCBzb3VyY2VzIHdoZXJlIHRocm93aW5nIGlzIGZpbmUuXG5leHBvcnQgY2xhc3MgU291cmNlV3JhcHBlciB7XG4gICAgcHVibGljIGFwaT86IElBcmNoaXZlcztcbiAgICBwdWJsaWMgdXJsPzogQXJjaGl2ZXNVcmw7XG4gICAgcHVibGljIHdyaXRlQmxvY2tlZD86IHN0cmluZztcbiAgICBwcml2YXRlIHJlbW90ZT86IEFyY2hpdmVzUmVtb3RlO1xuICAgIHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHJlY29ubmVjdFJ1bm5pbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFjY2Vzc0NhY2hlPzogeyBoYXNBY2Nlc3M6IGJvb2xlYW47IHRpbWU6IG51bWJlciB9O1xuXG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGNvbmZpZzogSG9zdGVkQ29uZmlnIHwgQmFja2JsYXplQ29uZmlnLFxuICAgICAgICAvLyBmYWxzZSBmb3Igc2hvcnQtbGl2ZWQgcHJvYmUgaW5zdGFuY2VzLCB3aGljaCBtdXN0IG5ldmVyIGxlYXZlIGEgcmV0cnkgbG9vcCBiZWhpbmRcbiAgICAgICAgcHJpdmF0ZSBiYWNrZ3JvdW5kOiBib29sZWFuLFxuICAgICkgeyB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGFzeW5jIGNyZWF0ZShjb25maWc6IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZywgb3B0aW9ucz86IHsgYmFja2dyb3VuZD86IGJvb2xlYW4gfSk6IFByb21pc2U8U291cmNlV3JhcHBlcj4ge1xuICAgICAgICBsZXQgd3JhcHBlciA9IG5ldyBTb3VyY2VXcmFwcGVyKGNvbmZpZywgb3B0aW9ucz8uYmFja2dyb3VuZCAhPT0gZmFsc2UpO1xuICAgICAgICBpZiAoY29uZmlnLnR5cGUgPT09IFwiYmFja2JsYXplXCIpIHtcbiAgICAgICAgICAgIGlmIChhd2FpdCBoYXNCYWNrYmxhemVDcmVkcygpKSB7XG4gICAgICAgICAgICAgICAgd3JhcHBlci5hcGkgPSBuZXcgQXJjaGl2ZXNCYWNrYmxhemUoeyBidWNrZXROYW1lOiBwYXJzZUJhY2tibGF6ZVVybChjb25maWcudXJsKS5idWNrZXROYW1lLCBwdWJsaWM6IGNvbmZpZy5wdWJsaWMsIGltbXV0YWJsZTogY29uZmlnLmltbXV0YWJsZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBObyBiYWNrYmxhemUgY3JlZGVudGlhbHMgZm9yICR7Y29uZmlnLnVybH0uIFByb3ZpZGUgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXlJZCBhbmQgYmFja2JsYXplLmpzb24uYXBwbGljYXRpb25LZXkgdmlhIGdldFNlY3JldCB0byBlbmFibGUgQVBJIGFjY2Vzcy5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3cmFwcGVyLndyaXRlQmxvY2tlZCA9IGBCcm93c2VycyBjYW5ub3Qgd3JpdGUgdG8gYmFja2JsYXplIChidWNrZXQgJHtjb25maWcudXJsfSlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF3cmFwcGVyLmFwaSAmJiBjb25maWcucHVibGljICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHdyYXBwZXIudXJsID0gbmV3IEFyY2hpdmVzVXJsKGdldEJ1Y2tldEJhc2VVcmwoY29uZmlnLnVybCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhcnNlZCA9IHBhcnNlSG9zdGVkVXJsKGNvbmZpZy51cmwpO1xuICAgICAgICBsZXQgc2VydmVyID0gaXNOb2RlKCkgJiYgZ2V0U3RvcmFnZVNlcnZlckNvbmZpZ09wdGlvbmFsKCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoc2VydmVyICYmIHBhcnNlZC5hZGRyZXNzID09PSBzZXJ2ZXIuZG9tYWluICYmIHBhcnNlZC5wb3J0ID09PSBzZXJ2ZXIucG9ydCkge1xuICAgICAgICAgICAgLy8gQSBidWNrZXQgaG9zdGVkIGJ5IG91ciBvd24gcHJvY2VzcyAtIHVzZSBpdCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNhbGxpbmcgb3Vyc2VsdmVzXG4gICAgICAgICAgICB3cmFwcGVyLmFwaSA9IGdldExvY2FsQXJjaGl2ZXMocGFyc2VkLmFjY291bnQsIHBhcnNlZC5idWNrZXROYW1lKTtcbiAgICAgICAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgICAgICB9XG4gICAgICAgIHdyYXBwZXIucmVtb3RlID0gbmV3IEFyY2hpdmVzUmVtb3RlKHsgdXJsOiBjb25maWcudXJsLCBhY2NvdW50TmFtZTogY29uZmlnLmFjY291bnROYW1lLCB3YWl0Rm9yQWNjZXNzOiBmYWxzZSB9KTtcbiAgICAgICAgd3JhcHBlci5hcGkgPSB3cmFwcGVyLnJlbW90ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wdWJsaWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB3cmFwcGVyLnVybCA9IG5ldyBBcmNoaXZlc1VybChnZXRCdWNrZXRCYXNlVXJsKGNvbmZpZy51cmwpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVidWdOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIC8vIFRoZSBzYW1lIFVSTCBjYW4gYXBwZWFyIGFzIG11bHRpcGxlIHNvdXJjZXMgKGRpZmZlcmVudCByb3V0ZXMgLyB2YWxpZCB3aW5kb3dzKSwgc28gdGhlXG4gICAgICAgIC8vIGRpc3Rpbmd1aXNoaW5nIHNsaWNlIGlzIHBhcnQgb2YgdGhlIG5hbWVcbiAgICAgICAgbGV0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBsZXQgcm91dGUgPSB0aGlzLmNvbmZpZy5yb3V0ZTtcbiAgICAgICAgaWYgKHJvdXRlKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGByb3V0ZSBbJHtyb3V0ZVswXX0sICR7cm91dGVbMV19KWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBbc3RhcnQsIGVuZF0gPSB0aGlzLmNvbmZpZy52YWxpZFdpbmRvdztcbiAgICAgICAgaWYgKHN0YXJ0ICE9PSAwIHx8IGVuZCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIGxldCBzdGFydFRleHQgPSBzdGFydCA9PT0gMCAmJiBcIjBcIiB8fCBuZXcgRGF0ZShzdGFydCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBlbmRUZXh0ID0gZW5kID09PSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiAmJiBcImZvcmV2ZXJcIiB8fCBuZXcgRGF0ZShlbmQpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGB2YWxpZFdpbmRvdyBbJHtzdGFydFRleHR9LCAke2VuZFRleHR9XWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgc291cmNlLyR7dGhpcy5jb25maWcudXJsfSR7cGFydHMubGVuZ3RoICYmIGAgKCR7cGFydHMuam9pbihcIiwgXCIpfSlgIHx8IFwiXCJ9YDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdGUuaXNDb25uZWN0ZWQoKTtcbiAgICB9XG5cbiAgICAvKiogQ2FsbCBhZnRlciBhIHJlcXVlc3QgZmFpbGVkIHdoaWxlIGlzQ29ubmVjdGVkKCkgd2FzIGZhbHNlOiBzdGFydHMgKGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcpXG4gICAgICogIHRoZSBiYWNrZ3JvdW5kIHJlY29ubmVjdCBsb29wLiBOZXZlciBibG9ja3MgLSB0aGUgZmFpbGVkIHJlcXVlc3Qgc3RpbGwgdGhyb3dzLiAqL1xuICAgIHB1YmxpYyBub3RlRmFpbHVyZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmJhY2tncm91bmQgfHwgdGhpcy5kaXNwb3NlZCB8fCB0aGlzLnJlY29ubmVjdFJ1bm5pbmcpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGBDYW5ub3QgY29ubmVjdCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gdHJ1ZTtcbiAgICAgICAgdm9pZCB0aGlzLnJlY29ubmVjdExvb3AoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHJlY29ubmVjdExvb3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxldCByZXRyeURlbGF5ID0gUkVUUllfU1RBUlRfREVMQVk7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgICBhd2FpdCBkZWxheShyZXRyeURlbGF5KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgYnJlYWs7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIEFueSBjYWxsIHJlLWVzdGFibGlzaGVzIHRoZSBXZWJTb2NrZXQ7IHRoZSByZXN1bHQgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW90ZT8uZ2V0SW5mbyhST1VUSU5HX0ZJTEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV2ZW4gYSBmYWlsaW5nIGNhbGwgKGUuZy4gYWNjZXNzIGRlbmllZCkgcHJvdmVzIHRoZSBjb25uZWN0aW9uIGlzIGJhY2tcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSBicmVhaztcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBjb25uZWN0IHRvIHN0b3JhZ2UgJHt0aGlzLmdldERlYnVnTmFtZSgpfSwgcmV0cnlpbmcgaW4gJHtNYXRoLnJvdW5kKHJldHJ5RGVsYXkgLyAxMDAwKX1zLiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0cnlEZWxheSA9IE1hdGgubWluKFJFVFJZX01BWF9ERUxBWSwgcmV0cnlEZWxheSAqIFJFVFJZX0dST1dUSCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWNvbm5lY3RSdW5uaW5nID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZWNvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX1gKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgaG9zdGVkIHNvdXJjZXM6IGNhY2hlZCBhY2Nlc3MgY2hlY2ssIHNvIHJlYWRzIGtub3cgd2hldGhlciB0byB1c2UgdGhlIEFQSSBvciB0aGUgcHVibGljXG4gICAgLy8gVVJMIGZvcm0uIEFjY2Vzcywgb25jZSBzZWVuLCBpcyBhc3N1bWVkIHRvIHN0aWNrOyBuby1hY2Nlc3MgaXMgcmUtY2hlY2tlZCBwZXJpb2RpY2FsbHkgKHRoZVxuICAgIC8vIGNoZWNrIGFsc28gcmVnaXN0ZXJzIG91ciBhY2Nlc3MgcmVxdWVzdCBzZXJ2ZXItc2lkZSwgd2hpY2ggbG9ncyB0aGUgZ3JhbnQgbGluaykuXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja0FjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgbGV0IHJlbW90ZSA9IHRoaXMucmVtb3RlO1xuICAgICAgICBpZiAoIXJlbW90ZSkgcmV0dXJuICEhdGhpcy5hcGk7XG4gICAgICAgIGxldCBjYWNoZWQgPSB0aGlzLmFjY2Vzc0NhY2hlO1xuICAgICAgICBpZiAoY2FjaGVkICYmIChjYWNoZWQuaGFzQWNjZXNzIHx8IERhdGUubm93KCkgLSBjYWNoZWQudGltZSA8IEFDQ0VTU19SRUNIRUNLX0lOVEVSVkFMKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZC5oYXNBY2Nlc3M7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHdhaXRpbmcgPSBhd2FpdCByZW1vdGUud2FpdGluZ0ZvckFjY2VzcygpO1xuICAgICAgICB0aGlzLmFjY2Vzc0NhY2hlID0geyBoYXNBY2Nlc3M6ICF3YWl0aW5nLCB0aW1lOiBEYXRlLm5vdygpIH07XG4gICAgICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYE5vIGFjY2VzcyB0byBzdG9yYWdlIGFjY291bnQgZm9yICR7dGhpcy5jb25maWcudXJsfSAob3VyIG1hY2hpbmUgJHt3YWl0aW5nLm1hY2hpbmVJZH0sIGlwICR7d2FpdGluZy5pcH0pLiBSZWFkaW5nIHZpYSB0aGUgcHVibGljIFVSTCBmb3JtIHdoZXJlIHBvc3NpYmxlLiBHcmFudCBhY2Nlc3MgYXQgJHt3YWl0aW5nLmxpbmt9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICF3YWl0aW5nO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMuYXBpICYmIGF3YWl0IHRoaXMuY2hlY2tBY2Nlc3MoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHJ1bih0aGlzLmFwaSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcnVuKHRoaXMudXJsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hcGkpIHtcbiAgICAgICAgICAgIC8vIE5vIHB1YmxpYyBVUkwgZm9ybSAtIGxldCB0aGUgQVBJIGNhbGwgdGhyb3cgaXRzIG93biBlcnJvciAod2hpY2ggaW5jbHVkZXMgdGhlIGFjY2Vzc1xuICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb25zIGZvciBob3N0ZWQgc291cmNlcylcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBydW4odGhpcy5hcGkpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2VzcyBhbmQgbm8gcHVibGljIFVSTCBmb3JtIChwdWJsaWM6IGZhbHNlKWApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYXNXcml0ZUFjY2VzcygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkIHx8ICF0aGlzLmFwaSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5hcGkuaGFzV3JpdGVBY2Nlc3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBpbmdzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgcGluZ1RpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSBsb2dnZWRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RUYWtlb3ZlclN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLyoqIEZpcmVkIHdoZW4gdGhlIHNvdXJjZSdzIGFkdmVydGlzZWQgdGFrZW92ZXIgc3RhbXAgY2hhbmdlcyAoYSBkZXBsb3kgdGFrZW92ZXIgc3RhcnRlZCBvclxuICAgICAqICBlbmRlZCkgLSB0aGUgY2hhaW4gcmVmcmVzaGVzIGl0cyBjb25maWcsIHNvIGNvbm5lY3RlZCBjbGllbnRzIGxlYXJuIHdpdGhpbiBvbmUgcGluZy4gKi9cbiAgICBwdWJsaWMgb25TZXJ2ZWRDb25maWdDaGFuZ2VkOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgICAvKiogU3RhcnRzIG1lYXN1cmluZyB0aGlzIHNvdXJjZSdzIGxhdGVuY3kgKGZvciB2YXJpYWJsZS1zaGFyZCB0YXJnZXQgcHJlZmVyZW5jZSkuIE9ubHkgaG9zdGVkXG4gICAgICogIHJlbW90ZXMgYXJlIHBpbmdlZDsgb3VyIG93biBsb2NhbCBzZXJ2ZXIgY291bnRzIGFzIDAsIGV2ZXJ5dGhpbmcgZWxzZSBhcyBJbmZpbml0eS4gKi9cbiAgICBwdWJsaWMgc3RhcnRQaW5naW5nKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZW1vdGUgPSB0aGlzLnJlbW90ZTtcbiAgICAgICAgaWYgKCFyZW1vdGUgfHwgdGhpcy5waW5nVGltZXIgfHwgdGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuICAgICAgICBsZXQgbWVhc3VyZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiB7IHRha2VvdmVyPzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IHJlbW90ZS5waW5nKCk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBBIGZhaWxlZCBwaW5nIGlzIGFsc28gb3VyIGVhcmxpZXN0IGRvd24tZGV0ZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RlRmFpbHVyZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5sb2dnZWRDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlZENvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENvbm5lY3RlZCB0byBzdG9yYWdlICR7dGhpcy5nZXREZWJ1Z05hbWUoKX0gKCR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zKWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5waW5ncy5wdXNoKERhdGUubm93KCkgLSBzdGFydCk7XG4gICAgICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGggPiBQSU5HX0hJU1RPUlkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBpbmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3RhbXAgPSByZXN1bHQ/LnRha2VvdmVyO1xuICAgICAgICAgICAgaWYgKHN0YW1wICE9PSB0aGlzLmxhc3RUYWtlb3ZlclN0YW1wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VGFrZW92ZXJTdGFtcCA9IHN0YW1wO1xuICAgICAgICAgICAgICAgIHRoaXMub25TZXJ2ZWRDb25maWdDaGFuZ2VkPy4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIHRoaXMucGluZ1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgdm9pZCBtZWFzdXJlKCk7XG4gICAgICAgIH0sIFBJTkdfSU5URVJWQUwpO1xuICAgICAgICAodGhpcy5waW5nVGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgIH1cblxuICAgIC8qKiBTZWVkcyB0aGUgbGF0ZW5jeSBlc3RpbWF0ZSBiZWZvcmUgdGhlIGZpcnN0IHBpbmcgbGFuZHMgKGUuZy4gZnJvbSB0aGUgaW5pdGlhbCByb3V0aW5nXG4gICAgICogIGZldGNoKSwgc28gdmFyaWFibGUtc2hhcmQgcGlja2luZyBoYXMgc29tZXRoaW5nIGltbWVkaWF0ZWx5LiBSZWFsIHBpbmdzIHRha2Ugb3ZlciBmcm9tIHRoZVxuICAgICAqICBmaXJzdCBtZWFzdXJlbWVudCBvbi4gKi9cbiAgICBwdWJsaWMgc2VlZExhdGVuY3kobXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5waW5ncy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5waW5ncy5wdXNoKG1zKTtcbiAgICB9XG5cbiAgICAvKiogTWVkaWFuIG9mIHRoZSByZWNlbnQgcGluZ3MuIFNvdXJjZXMgdGhhdCBjYW4ndCBiZSBwaW5nZWQgc29ydCBsYXN0IChJbmZpbml0eSksIGV4Y2VwdCBvdXJcbiAgICAgKiAgb3duIGluLXByb2Nlc3Mgc2VydmVyLCB3aGljaCBpcyB0aGUgYmVzdCBwb3NzaWJsZSB0YXJnZXQgKDApLiAqL1xuICAgIHB1YmxpYyBnZXRMYXRlbmN5KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5yZW1vdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy50eXBlID09PSBcInJlbW90ZVwiICYmIHRoaXMuYXBpKSByZXR1cm4gMDtcbiAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGluZ3MubGVuZ3RoKSByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIGxldCBzb3J0ZWQgPSBbLi4udGhpcy5waW5nc107XG4gICAgICAgIHNvcnQoc29ydGVkLCB4ID0+IHgpO1xuICAgICAgICByZXR1cm4gc29ydGVkW01hdGguZmxvb3Ioc29ydGVkLmxlbmd0aCAvIDIpXTtcbiAgICB9XG5cbiAgICAvKiogV3JpdGVzIGFsd2F5cyBnbyB0aHJvdWdoIHRoZSBBUEksIHNvIGEgcGVybWlzc2lvbiBlcnJvciB0aHJvd3MgdG8gdGhlIGNhbGxlciBvbiBldmVyeSB3cml0ZVxuICAgICAqICAoYW5kIGFjY2VzcyBncmFudGVkIGluIHRoZSBtZWFudGltZSBpcyBwaWNrZWQgdXAgYXV0b21hdGljYWxseSkuICovXG4gICAgcHVibGljIGFzeW5jIHdyaXRlPFQ+KHJ1bjogKGFyY2hpdmVzOiBJQXJjaGl2ZXMpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgaWYgKHRoaXMud3JpdGVCbG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy53cml0ZUJsb2NrZWQpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhcGkgPSB0aGlzLmFwaTtcbiAgICAgICAgaWYgKCFhcGkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlICR7dGhpcy5jb25maWcudXJsfSBoYXMgbm8gQVBJIGFjY2Vzcywgc28gaXQgY2Fubm90IGFjY2VwdCB3cml0ZXNgKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgcnVuKGFwaSk7XG4gICAgICAgIHRoaXMuYWNjZXNzQ2FjaGUgPSB7IGhhc0FjY2VzczogdHJ1ZSwgdGltZTogRGF0ZS5ub3coKSB9O1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMucGluZ1RpbWVyKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucGluZ1RpbWVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
259
|
+
/* _JS_SOURCE_HASH = "2343e97ab137f9ba46543778415768370623ae76d596d16a91b19d24a503e235"; */
|