sliftutils 1.7.19 → 1.7.21
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 +15 -2
- package/package.json +2 -2
- package/storage/remoteStorage/ArchivesRemote.d.ts +3 -1
- package/storage/remoteStorage/ArchivesRemote.ts +2 -2
- package/storage/remoteStorage/createArchives.d.ts +1 -0
- package/storage/remoteStorage/createArchives.ts +38 -7
- package/storage/remoteStorage/deployTakeover.d.ts +4 -0
- package/storage/remoteStorage/deployTakeover.ts +9 -0
- package/storage/remoteStorage/dist/blobStore.ts.cache +16 -4
- package/storage/remoteStorage/dist/createArchives.ts.cache +14 -3
- package/storage/remoteStorage/dist/deployTakeover.ts.cache +73 -39
- package/storage/remoteStorage/dist/storageServerState.ts.cache +22 -9
- package/storage/remoteStorage/sourceWrapper.d.ts +4 -0
- package/storage/remoteStorage/sourceWrapper.ts +11 -1
- package/storage/remoteStorage/storageController.d.ts +3 -1
- package/storage/remoteStorage/storageController.ts +7 -2
- package/yarn.lock +4 -4
|
@@ -23,7 +23,6 @@ const remoteConfig_1 = require("./remoteConfig");
|
|
|
23
23
|
// our ancestor pids, the clock) - files can appear or change at any moment, and we can start at
|
|
24
24
|
// any point during a switchover.
|
|
25
25
|
const PARAMETERS_TIMELINE_FILE_REGEX = /^(\d+)-parameters\.json$/;
|
|
26
|
-
const ALIVE_WINDOW_FOREVER = Number.MAX_SAFE_INTEGER;
|
|
27
26
|
const TIMELINE_POLL_INTERVAL = 60 * 1000;
|
|
28
27
|
// Processes listening on an alternate port register it here (sibling of the storage folder), keyed
|
|
29
28
|
// by their actual pid; content includes their ancestor pids so the timeline entry pid (a shell
|
|
@@ -50,6 +49,8 @@ let current = {};
|
|
|
50
49
|
let currentKey = JSON.stringify(current);
|
|
51
50
|
let eventListeners = [];
|
|
52
51
|
let eventTimers = [];
|
|
52
|
+
let loggedNoMatch = false;
|
|
53
|
+
let loggedIdentity = false;
|
|
53
54
|
function execText(command) {
|
|
54
55
|
return new Promise((resolve, reject) => {
|
|
55
56
|
(0, child_process_1.exec)(command, (error, stdout) => {
|
|
@@ -86,22 +87,10 @@ async function getAncestorPids() {
|
|
|
86
87
|
}
|
|
87
88
|
return pids;
|
|
88
89
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
try {
|
|
94
|
-
files = await fs_1.default.promises.readdir(dir);
|
|
95
|
-
}
|
|
96
|
-
catch (_a) { }
|
|
97
|
-
if (files.some(file => PARAMETERS_TIMELINE_FILE_REGEX.test(file))) {
|
|
98
|
-
return dir.replaceAll("\\", "/") + "/";
|
|
99
|
-
}
|
|
100
|
-
let parent = path_1.default.dirname(dir);
|
|
101
|
-
if (parent === dir)
|
|
102
|
-
return undefined;
|
|
103
|
-
dir = parent;
|
|
104
|
-
}
|
|
90
|
+
// The instance folder is ALWAYS the parent of our cwd (services run in <instance>/git/) - never
|
|
91
|
+
// search for it, a walk could latch onto the wrong folder
|
|
92
|
+
function getTimelineFolder() {
|
|
93
|
+
return path_1.default.dirname(process.cwd()).replaceAll("\\", "/") + "/";
|
|
105
94
|
}
|
|
106
95
|
function pidAlive(pid) {
|
|
107
96
|
try {
|
|
@@ -200,8 +189,11 @@ function scheduleEvents() {
|
|
|
200
189
|
};
|
|
201
190
|
let remap = current.remap;
|
|
202
191
|
if (remap) {
|
|
192
|
+
let altPort = remap.altPort;
|
|
203
193
|
schedule(remap.boundaryA - SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
194
|
+
schedule(remap.boundaryA, () => console.log(`Deploy switchover write handoff boundary passed: fresh writes now belong to the alternate-port side (port ${altPort})`));
|
|
204
195
|
schedule(remap.boundaryA + SWITCH_SCAN_LEAD, () => emit("diskScan"));
|
|
196
|
+
schedule(remap.boundaryB, () => console.log(`Deploy switchover second boundary passed: fresh writes return to the main port`));
|
|
205
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}`); }));
|
|
206
198
|
}
|
|
207
199
|
}
|
|
@@ -217,27 +209,44 @@ async function recompute() {
|
|
|
217
209
|
us = entry;
|
|
218
210
|
}
|
|
219
211
|
}
|
|
212
|
+
// Matching failures must be loud, or takeover detection fails silently forever
|
|
213
|
+
if (!us && entries.length && !loggedNoMatch) {
|
|
214
|
+
loggedNoMatch = true;
|
|
215
|
+
console.warn(`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
|
+
}
|
|
217
|
+
if (us && !loggedIdentity) {
|
|
218
|
+
loggedIdentity = true;
|
|
219
|
+
console.log(`Deploy timeline entry matched: we are pid=${us.pid}, releaseTime=${us.parameters.releaseTime !== undefined && iso(us.parameters.releaseTime) || "unknown"}, ${entries.length} entries total`);
|
|
220
|
+
}
|
|
220
221
|
let computed = {};
|
|
221
|
-
|
|
222
|
-
|
|
222
|
+
let usRelease = us === null || us === void 0 ? void 0 : us.parameters.releaseTime;
|
|
223
|
+
if (us && usRelease !== undefined) {
|
|
224
|
+
// The newer entry's releaseTime is when it starts; releaseTime + overlapTime is when the
|
|
225
|
+
// older one is killed. That's the whole timeline.
|
|
223
226
|
let next;
|
|
224
227
|
let prev;
|
|
225
228
|
for (let entry of entries) {
|
|
226
229
|
if (entry === us)
|
|
227
230
|
continue;
|
|
228
|
-
|
|
229
|
-
|
|
231
|
+
let release = entry.parameters.releaseTime;
|
|
232
|
+
if (release === undefined)
|
|
233
|
+
continue;
|
|
234
|
+
if (release > usRelease && (!next || release < next.release)) {
|
|
235
|
+
next = { entry, release };
|
|
230
236
|
}
|
|
231
|
-
if (
|
|
232
|
-
prev = entry;
|
|
237
|
+
if (release < usRelease && (!prev || release > prev.release)) {
|
|
238
|
+
prev = { entry, release };
|
|
233
239
|
}
|
|
234
240
|
}
|
|
235
|
-
if (next
|
|
236
|
-
let
|
|
237
|
-
let
|
|
241
|
+
if (next) {
|
|
242
|
+
let successorStart = next.release;
|
|
243
|
+
let overlap = next.entry.parameters.overlapTime || us.parameters.overlapTime || 0;
|
|
244
|
+
// Even a ZERO-overlap deploy needs the dying behaviors - draining fast-write flushes
|
|
245
|
+
// by the release and writing through after it, or acknowledged data dies with us.
|
|
246
|
+
// Only the remap (the alternate-port middle window) needs an actual overlap.
|
|
247
|
+
computed.dying = { successorStart, overlap };
|
|
238
248
|
if (overlap > 0 && now < successorStart + overlap * REMAP_EXPIRE_FRACTION) {
|
|
239
|
-
|
|
240
|
-
const successorPid = next.pid;
|
|
249
|
+
const successorPid = next.entry.pid;
|
|
241
250
|
if (successorPid) {
|
|
242
251
|
let successorEntry = registry.find(x => x.ancestorPids.includes(successorPid));
|
|
243
252
|
if (successorEntry) {
|
|
@@ -246,23 +255,43 @@ async function recompute() {
|
|
|
246
255
|
}
|
|
247
256
|
}
|
|
248
257
|
}
|
|
249
|
-
if (prev
|
|
250
|
-
let overlap = prev.
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
258
|
+
if (prev) {
|
|
259
|
+
let overlap = us.parameters.overlapTime || prev.entry.parameters.overlapTime || 0;
|
|
260
|
+
// The predecessor holds the main port until OUR release + the overlap
|
|
261
|
+
computed.predecessorEnd = usRelease + overlap;
|
|
262
|
+
if (overlap > 0 && ourAltPort && now < usRelease + overlap * REMAP_EXPIRE_FRACTION && !computed.remap) {
|
|
263
|
+
computed.remap = makeRemap(usRelease, overlap, ourAltPort);
|
|
254
264
|
}
|
|
255
265
|
}
|
|
256
266
|
}
|
|
257
267
|
let key = JSON.stringify(computed);
|
|
258
268
|
if (key === currentKey)
|
|
259
269
|
return;
|
|
270
|
+
logTransitions(current, computed);
|
|
260
271
|
current = computed;
|
|
261
272
|
currentKey = key;
|
|
262
|
-
console.log(`Deploy takeover state changed: ${key}`);
|
|
263
273
|
scheduleEvents();
|
|
264
274
|
emit("remapChanged");
|
|
265
275
|
}
|
|
276
|
+
function iso(time) {
|
|
277
|
+
return new Date(time).toISOString();
|
|
278
|
+
}
|
|
279
|
+
// The switchover lifecycle is rare and important, so every stage gets a clear line
|
|
280
|
+
function logTransitions(prev, next) {
|
|
281
|
+
if (!prev.dying && next.dying) {
|
|
282
|
+
let { successorStart, overlap } = next.dying;
|
|
283
|
+
console.log(`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
|
+
}
|
|
285
|
+
if (!prev.predecessorEnd && next.predecessorEnd) {
|
|
286
|
+
console.log(`We are a deploy successor: our predecessor holds the main port until ${iso(next.predecessorEnd)}`);
|
|
287
|
+
}
|
|
288
|
+
if (!prev.remap && next.remap) {
|
|
289
|
+
console.log(`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
|
+
}
|
|
291
|
+
if (prev.remap && !next.remap) {
|
|
292
|
+
console.log(`Deploy switchover remap ended; running on the plain stored routing config`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
266
295
|
/** Starts the takeover machinery. Port fallback (alternate port + registry + acquisition polling)
|
|
267
296
|
* works regardless; without a deploy timeline folder the switchover-specific parts (the remap,
|
|
268
297
|
* the flush deadline, the tighter acquisition pacing) simply stay inert. */
|
|
@@ -270,9 +299,14 @@ async function initDeployTakeover(config) {
|
|
|
270
299
|
var _a, _b;
|
|
271
300
|
initialized = config;
|
|
272
301
|
ancestorPids = await getAncestorPids();
|
|
273
|
-
timelineFolder =
|
|
274
|
-
|
|
275
|
-
|
|
302
|
+
timelineFolder = getTimelineFolder();
|
|
303
|
+
let entries = await readTimelineEntries();
|
|
304
|
+
if (!entries.length) {
|
|
305
|
+
console.log(`No deploy timeline entries in ${timelineFolder}; deploy takeover inactive until they appear (port fallback still works)`);
|
|
306
|
+
}
|
|
307
|
+
else {
|
|
308
|
+
console.log(`Deploy timeline found at ${timelineFolder} (${entries.length} entries); our pid chain: ${[...ancestorPids].join(" -> ")}`);
|
|
309
|
+
}
|
|
276
310
|
await recompute();
|
|
277
311
|
let poll = setInterval(() => {
|
|
278
312
|
void recompute().catch((e) => { var _a; return console.error(`Deploy takeover recompute failed: ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); });
|
|
@@ -366,5 +400,5 @@ function getMainPortAcquireDelay() {
|
|
|
366
400
|
return ACQUIRE_SLOW_DELAY;
|
|
367
401
|
}
|
|
368
402
|
exports.getMainPortAcquireDelay = getMainPortAcquireDelay;
|
|
369
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95VGFrZW92ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJkZXBsb3lUYWtlb3Zlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIsZ0RBQXdCO0FBQ3hCLGlEQUFxQztBQUVyQyxpREFBc0U7QUFFdEUsaUdBQWlHO0FBQ2pHLGlHQUFpRztBQUNqRyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcsbUdBQW1HO0FBQ25HLDBGQUEwRjtBQUMxRixrR0FBa0c7QUFDbEcsK0ZBQStGO0FBQy9GLEVBQUU7QUFDRixpR0FBaUc7QUFDakcsZ0dBQWdHO0FBQ2hHLGlDQUFpQztBQUVqQyxNQUFNLDhCQUE4QixHQUFHLDBCQUEwQixDQUFDO0FBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0FBQ3JELE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN6QyxtR0FBbUc7QUFDbkcsK0ZBQStGO0FBQy9GLDhEQUE4RDtBQUM5RCxNQUFNLHlCQUF5QixHQUFHLHFCQUFxQixDQUFDO0FBQ3hELG1HQUFtRztBQUNuRyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxrR0FBa0c7QUFDbEcsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUNuQyw2RkFBNkY7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBQ3JDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBQ2hDLE1BQU0scUJBQXFCLEdB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QUFPLEdBQUcsdUJBQXVCLENBQUM7QUFDMUUsQ0FBQztBQUpELDRDQUlDO0FBRUQ7eUVBQ3lFO0FBQ3pFLFNBQWdCLHVCQUF1QjtJQUNuQyxJQUFJLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ2pDLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3pFLE9BQU8sa0JBQWtCLENBQUM7SUFDOUIsQ0FBQztJQUNELE9BQU8sa0JBQWtCLENBQUM7QUFDOUIsQ0FBQztBQU5ELDBEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgUmVtb3RlQ29uZmlnLCBSZW1vdGVDb25maWdCYXNlLCBIb3N0ZWRDb25maWcgfSBmcm9tIFwiLi4vSUFyY2hpdmVzXCI7XG5pbXBvcnQgeyBwYXJzZUhvc3RlZFVybCwgcmVwbGFjZUhvc3RlZFVybFBvcnQgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcblxuLy8gRGVwbG95IHRha2VvdmVyOiB0aGUgZGVwbG95IG1hbmFnZXIgKHF1ZXJ5c3ViJ3MgcGFyYW1ldGVyc1RpbWVsaW5lKSB3cml0ZXMgPG4+LXBhcmFtZXRlcnMuanNvblxuLy8gZmlsZXMgaW50byBvdXIgaW5zdGFuY2UgZm9sZGVyIGRlc2NyaWJpbmcgd2hlbiBlYWNoIHZlcnNpb24gcnVucyBhbmQgd2hlbiBpdCBpcyBzaHV0IGRvd24uIE9sZFxuLy8gYW5kIG5ldyB2ZXJzaW9uIG92ZXJsYXAgZm9yIHRoZSBvdmVybGFwIHRpbWUgKE8gPSBvbGRFbmQgLSBuZXdTdGFydCkuIFdlIHR1cm4gdGhhdCBvdmVybGFwIGludG9cbi8vIGFuIGF0b21pYyB3cml0ZSBoYW5kb2ZmIGJ5IFJFSU5URVJQUkVUSU5HIGV2ZXJ5IHJvdXRpbmcgc291cmNlIHRoYXQgcG9pbnRzIGF0IHVzOiBpdHMgdmFsaWRcbi8vIHdpbmRvdyBpcyBzcGxpdCBzbyB0aGF0IHRoZSBtaWRkbGUgb2YgdGhlIG92ZXJsYXAgKFtTICsgMC41Kk8sIFMgKyAxLjUqT10pIHBvaW50cyBhdCB0aGUgbmV3XG4vLyBwcm9jZXNzJ3MgdGVtcG9yYXJ5IGFsdGVybmF0ZSBwb3J0LiBUaGUgZXhpc3RpbmcgdmFsaWQtd2luZG93IG1hY2hpbmVyeSB0aGVuIGRvZXMgZXZlcnl0aGluZyAtXG4vLyB0aGUgb2xkIHByb2Nlc3Mgc3RhcnRzIHJlamVjdGluZyBmcmVzaCB3cml0ZXMgYXQgdGhlIGZpcnN0IGJvdW5kYXJ5LCBjbGllbnRzIHJlLXJlc29sdmUsIGFuZCB0aGVcbi8vIG5ldyBwcm9jZXNzICh3aGljaCByZWNvZ25pemVzIHRoZSBhbHRlcm5hdGUgcG9ydCBhcyBpdHNlbGYpIHRha2VzIG92ZXIuIFRoZSByZW1hcCBpcyBhblxuLy8gSU5URVJQUkVUQVRJT04gT1ZFUkxBWSwgYXBwbGllZCB3aGVyZSByb3V0aW5nIGNvbmZpZ3MgYXJlIHVzZWQgKHNlZSBhcHBseURlcGxveVJlbWFwIGNhbGxlcnMpIC1cbi8vIGl0IGlzIG5ldmVyIHdyaXR0ZW4gdG8gZGlzaywgbmV2ZXIgc3luY2hyb25pemVkLCBhbmQgbmV2ZXIgcGFydCBvZiBhbnkgc3RvcmVkIGNvbmZpZ3VyYXRpb24uXG4vL1xuLy8gRXZlcnl0aGluZyBoZXJlIGlzIHJlY29tcHV0ZWQgaWRlbXBvdGVudGx5IGZyb20gaXRzIGlucHV0cyAodGltZWxpbmUgZmlsZXMsIHRoZSBwb3J0IHJlZ2lzdHJ5LFxuLy8gb3VyIGFuY2VzdG9yIHBpZHMsIHRoZSBjbG9jaykgLSBmaWxlcyBjYW4gYXBwZWFyIG9yIGNoYW5nZSBhdCBhbnkgbW9tZW50LCBhbmQgd2UgY2FuIHN0YXJ0IGF0XG4vLyBhbnkgcG9pbnQgZHVyaW5nIGEgc3dpdGNob3Zlci5cblxuY29uc3QgUEFSQU1FVEVSU19USU1FTElORV9GSUxFX1JFR0VYID0gL14oXFxkKyktcGFyYW1ldGVyc1xcLmpzb24kLztcbmNvbnN0IEFMSVZFX1dJTkRPV19GT1JFVkVSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5jb25zdCBUSU1FTElORV9QT0xMX0lOVEVSVkFMID0gNjAgKiAxMDAwO1xuLy8gUHJvY2Vzc2VzIGxpc3RlbmluZyBvbiBhbiBhbHRlcm5hdGUgcG9ydCByZWdpc3RlciBpdCBoZXJlIChzaWJsaW5nIG9mIHRoZSBzdG9yYWdlIGZvbGRlciksIGtleWVkXG4vLyBieSB0aGVpciBhY3R1YWwgcGlkOyBjb250ZW50IGluY2x1ZGVzIHRoZWlyIGFuY2VzdG9yIHBpZHMgc28gdGhlIHRpbWVsaW5lIGVudHJ5IHBpZCAoYSBzaGVsbFxuLy8gYW5jZXN0b3Igb2YgdGhlIHByb2Nlc3MpIGNhbiBiZSBtYXRjaGVkIHRvIGEgcmVnaXN0cnkgZW50cnlcbmNvbnN0IFBPUlRfUkVHSVNUUllfRk9MREVSX05BTUUgPSBcInN0b3JhZ2VQb3J0UmVnaXN0cnlcIjtcbi8vIE1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0cyBydW4gdGhpcyBvZnRlbiwgdGlnaHRlbmluZyBuZWFyIHRoZSBwcmVkZWNlc3NvcidzIHNjaGVkdWxlZCBkZWF0aFxuY29uc3QgQUNRVUlSRV9TTE9XX0RFTEFZID0gMzAgKiAxMDAwO1xuY29uc3QgQUNRVUlSRV9GQVNUX0RFTEFZID0gNSAqIDEwMDA7XG5jb25zdCBBQ1FVSVJFX0ZBU1RfV0lORE9XID0gNjAgKiAxMDAwO1xuLy8gRGlzayByZXNjYW5zIGZpcmUgdGhpcyBmYXIgYmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUgaGFuZG9mZiwgY2F0Y2hpbmcgZmlsZXMgdGhlIG90aGVyIHByb2Nlc3Ncbi8vIHdyb3RlICh0aGUgQnVsa0RhdGFiYXNlMiBpbmRleCBpcyBhdG9taWMgYnV0IGl0cyBlbnRyaWVzIGxhbmQgYXQgd3JpdGUgdGltZSwgbm90IGZpbGUgdGltZSlcbmNvbnN0IFNXSVRDSF9TQ0FOX0xFQUQgPSAxMCAqIDEwMDA7XG4vLyBUaGUgZHlpbmcgcHJvY2VzcyBtdXN0IGhhdmUgZmx1c2hlZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgaGFuZG9mZjogZmFzdC13cml0ZSBkZWxheXMgbmV2ZXJcbi8vIGV4dGVuZCBwYXN0IFMgKyBvdmVybGFwICogdGhpcyBmcmFjdGlvbiwgYW5kIGFmdGVyIHRoYXQgcG9pbnQgZmFzdCB3cml0ZXMgZmx1c2ggaW1tZWRpYXRlbHlcbmNvbnN0IEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OID0gMC4yNTtcbmNvbnN0IEJPVU5EQVJZX0FfRlJBQ1RJT04gPSAwLjU7XG5jb25zdCBCT1VOREFSWV9CX0ZSQUNUSU9OID0gMS41O1xuY29uc3QgUkVNQVBfRVhQSVJFX0ZSQUNUSU9OID0gMjtcblxudHlwZSBUaW1lbGluZUVudHJ5ID0ge1xuICAgIHBpZD86IG51bWJlcjtcbiAgICBhbGl2ZVdpbmRvdzogW251bWJlciwgbnVtYmVyXTtcbiAgICBwYXJhbWV0ZXJzOiB1bmtub3duO1xufTtcblxudHlwZSBUYWtlb3ZlckNvbXB1dGVkID0ge1xuICAgIC8vIFdlIGFyZSBzY2hlZHVsZWQgdG8gZGllIHdpdGggYSBzdWNjZXNzb3Igb3ZlcmxhcHBpbmcgdXMgKGtub3duIGZyb20gdGhlIGZpbGVzIGFsb25lLCBiZWZvcmVcbiAgICAvLyB0aGUgc3VjY2Vzc29yJ3MgcG9ydCBpcyBkaXNjb3ZlcmVkIC0gdGhlIGZsdXNoIGRlYWRsaW5lIGFwcGxpZXMgaW1tZWRpYXRlbHkpXG4gICAgZHlpbmc/OiB7IHN1Y2Nlc3NvclN0YXJ0OiBudW1iZXI7IG92ZXJsYXA6IG51bWJlciB9O1xuICAgIC8vIFRoZSB3aW5kb3cgcmVpbnRlcnByZXRhdGlvbiwgb25jZSB0aGUgbWlkZGxlIHdpbmRvdydzIHBvcnQgaXMga25vd24gKHRoZSBzdWNjZXNzb3Inc1xuICAgIC8vIHJlZ2lzdGVyZWQgYWx0ZXJuYXRlIHBvcnQgLSBvciBvdXIgb3duLCB3aGVuIHdlIEFSRSB0aGUgc3VjY2Vzc29yKVxuICAgIHJlbWFwPzogeyBib3VuZGFyeUE6IG51bWJlcjsgYm91bmRhcnlCOiBudW1iZXI7IGV4cGlyZTogbnVtYmVyOyBhbHRQb3J0OiBudW1iZXIgfTtcbiAgICAvLyBXaGVuIG91ciBwcmVkZWNlc3NvciBkaWVzIGFuZCBmcmVlcyB0aGUgbWFpbiBwb3J0IChmb3IgYWNxdWlzaXRpb24gcGFjaW5nKVxuICAgIHByZWRlY2Vzc29yRW5kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVGFrZW92ZXJFdmVudCA9IFwicmVtYXBDaGFuZ2VkXCIgfCBcImRpc2tTY2FuXCI7XG5cbmxldCBpbml0aWFsaXplZDogeyBkb21haW46IHN0cmluZzsgbWFpblBvcnQ6IG51bWJlcjsgc3RvcmFnZUZvbGRlcjogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG5sZXQgYW5jZXN0b3JQaWRzID0gbmV3IFNldDxudW1iZXI+KCk7XG5sZXQgdGltZWxpbmVGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmxldCBvdXJBbHRQb3J0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5sZXQgY3VycmVudDogVGFrZW92ZXJDb21wdXRlZCA9IHt9O1xubGV0IGN1cnJlbnRLZXkgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KTtcbmxldCBldmVudExpc3RlbmVyczogKChldmVudDogVGFrZW92ZXJFdmVudCkgPT4gdm9pZClbXSA9IFtdO1xubGV0IGV2ZW50VGltZXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PltdID0gW107XG5cbmZ1bmN0aW9uIGV4ZWNUZXh0KGNvbW1hbmQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZXhlYyhjb21tYW5kLCAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuXG4vLyBUaGUgdGltZWxpbmUgZW50cnkgcGlkIGlzIHRoZSBzY3JlZW4gc2hlbGwgdGhhdCBzcGF3bmVkIHVzIC0gYW4gYW5jZXN0b3IgLSBzbyB3ZSB3YWxrIG91ciB3aG9sZVxuLy8gYW5jZXN0b3IgY2hhaW4gdG8gZmluZCB3aGljaCBlbnRyeSBpcyB1c1xuYXN5bmMgZnVuY3Rpb24gZ2V0QW5jZXN0b3JQaWRzKCk6IFByb21pc2U8U2V0PG51bWJlcj4+IHtcbiAgICBsZXQgcGlkcyA9IG5ldyBTZXQ8bnVtYmVyPihbcHJvY2Vzcy5waWRdKTtcbiAgICBsZXQgY3VycmVudFBpZCA9IHByb2Nlc3MucGlkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCBwcGlkOiBudW1iZXI7XG4gICAgICAgIGlmIChjdXJyZW50UGlkID09PSBwcm9jZXNzLnBpZCAmJiBwcm9jZXNzLnBwaWQpIHtcbiAgICAgICAgICAgIHBwaWQgPSBwcm9jZXNzLnBwaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHBwaWQgPSBwYXJzZUludCgoYXdhaXQgZXhlY1RleHQoYHBzIC1vIHBwaWQ9IC1wICR7Y3VycmVudFBpZH1gKSkudHJpbSgpKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcHBpZCB8fCBOdW1iZXIuaXNOYU4ocHBpZCkgfHwgcHBpZCA8PSAxIHx8IHBpZHMuaGFzKHBwaWQpKSBicmVhaztcbiAgICAgICAgcGlkcy5hZGQocHBpZCk7XG4gICAgICAgIGN1cnJlbnRQaWQgPSBwcGlkO1xuICAgIH1cbiAgICByZXR1cm4gcGlkcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFRpbWVsaW5lRm9sZGVyKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGRpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgbGV0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGRpcik7XG4gICAgICAgIH0gY2F0Y2ggeyB9XG4gICAgICAgIGlmIChmaWxlcy5zb21lKGZpbGUgPT4gUEFSQU1FVEVSU19USU1FTElORV9GSUxFX1JFR0VYLnRlc3QoZmlsZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlyLnJlcGxhY2VBbGwoXCJcXFxcXCIsIFwiL1wiKSArIFwiL1wiO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyKTtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gZGlyKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBkaXIgPSBwYXJlbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBwaWRBbGl2ZShwaWQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICAgIHByb2Nlc3Mua2lsbChwaWQsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAoZSBhcyB7IGNvZGU/OiBzdHJpbmcgfSkuY29kZSA9PT0gXCJFUEVSTVwiO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmVnaXN0cnlGb2xkZXIoKTogc3RyaW5nIHtcbiAgICBpZiAoIWluaXRpYWxpemVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGVwbG95IHRha2VvdmVyIGlzIG5vdCBpbml0aWFsaXplZGApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoaW5pdGlhbGl6ZWQuc3RvcmFnZUZvbGRlcikpLCBQT1JUX1JFR0lTVFJZX0ZPTERFUl9OQU1FKTtcbn1cblxudHlwZSBSZWdpc3RyeUVudHJ5ID0geyBwaWQ6IG51bWJlcjsgcG9ydDogbnVtYmVyOyBhbmNlc3RvclBpZHM6IG51bWJlcltdIH07XG5cbmFzeW5jIGZ1bmN0aW9uIHJlYWRQb3J0UmVnaXN0cnkoKTogUHJvbWlzZTxSZWdpc3RyeUVudHJ5W10+IHtcbiAgICBsZXQgZm9sZGVyID0gZ2V0UmVnaXN0cnlGb2xkZXIoKTtcbiAgICBsZXQgZmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgdHJ5IHtcbiAgICAgICAgZmlsZXMgPSBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKGZvbGRlcik7XG4gICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IGVudHJpZXM6IFJlZ2lzdHJ5RW50cnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gL14oXFxkKylcXC5qc29uJC8uZXhlYyhmaWxlKTtcbiAgICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG4gICAgICAgIGxldCBwaWQgPSBwYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgIGlmICghcGlkQWxpdmUocGlkKSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBmcy5wcm9taXNlcy51bmxpbmsocGF0aC5qb2luKGZvbGRlciwgZmlsZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCB7IH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgZW50cnkgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHBhdGguam9pbihmb2xkZXIsIGZpbGUpLCBcInV0ZjhcIikpIGFzIFJlZ2lzdHJ5RW50cnk7XG4gICAgICAgICAgICBlbnRyaWVzLnB1c2goeyAuLi5lbnRyeSwgcGlkIH0pO1xuICAgICAgICB9IGNhdGNoIHsgfVxuICAgIH1cbiAgICByZXR1cm4gZW50cmllcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRpbWVsaW5lRW50cmllcygpOiBQcm9taXNlPFRpbWVsaW5lRW50cnlbXT4ge1xuICAgIGlmICghdGltZWxpbmVGb2xkZXIpIHJldHVybiBbXTtcbiAgICBsZXQgZW50cmllczogVGltZWxpbmVFbnRyeVtdID0gW107XG4gICAgZm9yIChsZXQgZmlsZSBvZiBhd2FpdCBmcy5wcm9taXNlcy5yZWFkZGlyKHRpbWVsaW5lRm9sZGVyKSkge1xuICAgICAgICBpZiAoIVBBUkFNRVRFUlNfVElNRUxJTkVfRklMRV9SRUdFWC50ZXN0KGZpbGUpKSBjb250aW51ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGVudHJpZXMucHVzaChKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKHRpbWVsaW5lRm9sZGVyICsgZmlsZSwgXCJ1dGY4XCIpKSBhcyBUaW1lbGluZUVudHJ5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcmVhZCBkZXBsb3kgdGltZWxpbmUgZmlsZSAke3RpbWVsaW5lRm9sZGVyICsgZmlsZX06ICR7KGUgYXMgRXJyb3IpLnN0YWNrID8/IGV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVudHJpZXM7XG59XG5cbmZ1bmN0aW9uIG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydDogbnVtYmVyLCBvdmVybGFwOiBudW1iZXIsIGFsdFBvcnQ6IG51bWJlcik6IFRha2VvdmVyQ29tcHV0ZWRbXCJyZW1hcFwiXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYm91bmRhcnlBOiBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBCT1VOREFSWV9BX0ZSQUNUSU9OLFxuICAgICAgICBib3VuZGFyeUI6IHN1Y2Nlc3NvclN0YXJ0ICsgb3ZlcmxhcCAqIEJPVU5EQVJZX0JfRlJBQ1RJT04sXG4gICAgICAgIGV4cGlyZTogc3VjY2Vzc29yU3RhcnQgKyBvdmVybGFwICogUkVNQVBfRVhQSVJFX0ZSQUNUSU9OLFxuICAgICAgICBhbHRQb3J0LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGVtaXQoZXZlbnQ6IFRha2VvdmVyRXZlbnQpOiB2b2lkIHtcbiAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBldmVudExpc3RlbmVycykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBEZXBsb3kgdGFrZW92ZXIgbGlzdGVuZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5zdGFjayA/PyBlfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBzY2hlZHVsZUV2ZW50cygpOiB2b2lkIHtcbiAgICBmb3IgKGxldCB0aW1lciBvZiBldmVudFRpbWVycykge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgICBldmVudFRpbWVycyA9IFtdO1xuICAgIGxldCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGxldCBzY2hlZHVsZSA9ICh0aW1lOiBudW1iZXIsIGZuYzogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAodGltZSA8PSBub3cpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVyID0gc2V0VGltZW91dChmbmMsIHRpbWUgLSBub3cpO1xuICAgICAgICAodGltZXIgYXMgeyB1bnJlZj86ICgpID0+IHZvaWQgfSkudW5yZWY/LigpO1xuICAgICAgICBldmVudFRpbWVycy5wdXNoKHRpbWVyKTtcbiAgICB9O1xuICAgIGxldCByZW1hcCA9IGN1cnJlbnQucmVtYXA7XG4gICAgaWYgKHJlbWFwKSB7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSAtIFNXSVRDSF9TQ0FOX0xFQUQsICgpID0+IGVtaXQoXCJkaXNrU2NhblwiKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmJvdW5kYXJ5QSArIFNXSVRDSF9TQ0FOX0xFQUQsICgpID0+IGVtaXQoXCJkaXNrU2NhblwiKSk7XG4gICAgICAgIHNjaGVkdWxlKHJlbWFwLmV4cGlyZSwgKCkgPT4gdm9pZCByZWNvbXB1dGUoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYERlcGxveSB0YWtlb3ZlciByZWNvbXB1dGUgZmFpbGVkOiAke2Uuc3RhY2sgPz8gZX1gKSkpO1xuICAgIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVjb21wdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghaW5pdGlhbGl6ZWQgfHwgIXRpbWVsaW5lRm9sZGVyKSByZXR1cm47XG4gICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgbGV0IGVudHJpZXMgPSBhd2FpdCByZWFkVGltZWxpbmVFbnRyaWVzKCk7XG4gICAgbGV0IHJlZ2lzdHJ5ID0gYXdhaXQgcmVhZFBvcnRSZWdpc3RyeSgpO1xuICAgIGxldCB1czogVGltZWxpbmVFbnRyeSB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS5waWQgJiYgYW5jZXN0b3JQaWRzLmhhcyhlbnRyeS5waWQpKSB7XG4gICAgICAgICAgICB1cyA9IGVudHJ5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBjb21wdXRlZDogVGFrZW92ZXJDb21wdXRlZCA9IHt9O1xuICAgIGlmICh1cykge1xuICAgICAgICBsZXQgdXNTdGFydCA9IHVzLmFsaXZlV2luZG93WzBdO1xuICAgICAgICBsZXQgbmV4dDogVGltZWxpbmVFbnRyeSB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHByZXY6IFRpbWVsaW5lRW50cnkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmIChlbnRyeSA9PT0gdXMpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKGVudHJ5LmFsaXZlV2luZG93WzBdID4gdXNTdGFydCAmJiAoIW5leHQgfHwgZW50cnkuYWxpdmVXaW5kb3dbMF0gPCBuZXh0LmFsaXZlV2luZG93WzBdKSkge1xuICAgICAgICAgICAgICAgIG5leHQgPSBlbnRyeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbnRyeS5hbGl2ZVdpbmRvd1swXSA8IHVzU3RhcnQgJiYgKCFwcmV2IHx8IGVudHJ5LmFsaXZlV2luZG93WzBdID4gcHJldi5hbGl2ZVdpbmRvd1swXSkpIHtcbiAgICAgICAgICAgICAgICBwcmV2ID0gZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHQgJiYgdXMuYWxpdmVXaW5kb3dbMV0gIT09IEFMSVZFX1dJTkRPV19GT1JFVkVSICYmIG5leHQuYWxpdmVXaW5kb3dbMF0gPD0gdXMuYWxpdmVXaW5kb3dbMV0pIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gdXMuYWxpdmVXaW5kb3dbMV0gLSBuZXh0LmFsaXZlV2luZG93WzBdO1xuICAgICAgICAgICAgbGV0IHN1Y2Nlc3NvclN0YXJ0ID0gbmV4dC5hbGl2ZVdpbmRvd1swXTtcbiAgICAgICAgICAgIGlmIChvdmVybGFwID4gMCAmJiBub3cgPCBzdWNjZXNzb3JTdGFydCArIG92ZXJsYXAgKiBSRU1BUF9FWFBJUkVfRlJBQ1RJT04pIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZC5keWluZyA9IHsgc3VjY2Vzc29yU3RhcnQsIG92ZXJsYXAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdWNjZXNzb3JQaWQgPSBuZXh0LnBpZDtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2Vzc29yUGlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdWNjZXNzb3JFbnRyeSA9IHJlZ2lzdHJ5LmZpbmQoeCA9PiB4LmFuY2VzdG9yUGlkcy5pbmNsdWRlcyhzdWNjZXNzb3JQaWQpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NvckVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcChzdWNjZXNzb3JTdGFydCwgb3ZlcmxhcCwgc3VjY2Vzc29yRW50cnkucG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXYgJiYgcHJldi5hbGl2ZVdpbmRvd1sxXSA+IHVzU3RhcnQpIHtcbiAgICAgICAgICAgIGxldCBvdmVybGFwID0gcHJldi5hbGl2ZVdpbmRvd1sxXSAtIHVzU3RhcnQ7XG4gICAgICAgICAgICBjb21wdXRlZC5wcmVkZWNlc3NvckVuZCA9IHByZXYuYWxpdmVXaW5kb3dbMV07XG4gICAgICAgICAgICBpZiAob3ZlcmxhcCA+IDAgJiYgb3VyQWx0UG9ydCAmJiBub3cgPCB1c1N0YXJ0ICsgb3ZlcmxhcCAqIFJFTUFQX0VYUElSRV9GUkFDVElPTiAmJiAhY29tcHV0ZWQucmVtYXApIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZC5yZW1hcCA9IG1ha2VSZW1hcCh1c1N0YXJ0LCBvdmVybGFwLCBvdXJBbHRQb3J0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBsZXQga2V5ID0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWQpO1xuICAgIGlmIChrZXkgPT09IGN1cnJlbnRLZXkpIHJldHVybjtcbiAgICBjdXJyZW50ID0gY29tcHV0ZWQ7XG4gICAgY3VycmVudEtleSA9IGtleTtcbiAgICBjb25zb2xlLmxvZyhgRGVwbG95IHRha2VvdmVyIHN0YXRlIGNoYW5nZWQ6ICR7a2V5fWApO1xuICAgIHNjaGVkdWxlRXZlbnRzKCk7XG4gICAgZW1pdChcInJlbWFwQ2hhbmdlZFwiKTtcbn1cblxuLyoqIFN0YXJ0cyB0aGUgdGFrZW92ZXIgbWFjaGluZXJ5LiBQb3J0IGZhbGxiYWNrIChhbHRlcm5hdGUgcG9ydCArIHJlZ2lzdHJ5ICsgYWNxdWlzaXRpb24gcG9sbGluZylcbiAqICB3b3JrcyByZWdhcmRsZXNzOyB3aXRob3V0IGEgZGVwbG95IHRpbWVsaW5lIGZvbGRlciB0aGUgc3dpdGNob3Zlci1zcGVjaWZpYyBwYXJ0cyAodGhlIHJlbWFwLFxuICogIHRoZSBmbHVzaCBkZWFkbGluZSwgdGhlIHRpZ2h0ZXIgYWNxdWlzaXRpb24gcGFjaW5nKSBzaW1wbHkgc3RheSBpbmVydC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0RGVwbG95VGFrZW92ZXIoY29uZmlnOiB7IGRvbWFpbjogc3RyaW5nOyBtYWluUG9ydDogbnVtYmVyOyBzdG9yYWdlRm9sZGVyOiBzdHJpbmcgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGluaXRpYWxpemVkID0gY29uZmlnO1xuICAgIGFuY2VzdG9yUGlkcyA9IGF3YWl0IGdldEFuY2VzdG9yUGlkcygpO1xuICAgIHRpbWVsaW5lRm9sZGVyID0gYXdhaXQgZmluZFRpbWVsaW5lRm9sZGVyKCk7XG4gICAgaWYgKCF0aW1lbGluZUZvbGRlcikgcmV0dXJuO1xuICAgIGF3YWl0IHJlY29tcHV0ZSgpO1xuICAgIGxldCBwb2xsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB2b2lkIHJlY29tcHV0ZSgpLmNhdGNoKChlOiBFcnJvcikgPT4gY29uc29sZS5lcnJvcihgRGVwbG95IHRha2VvdmVyIHJlY29tcHV0ZSBmYWlsZWQ6ICR7ZS5zdGFjayA/PyBlfWApKTtcbiAgICB9LCBUSU1FTElORV9QT0xMX0lOVEVSVkFMKTtcbiAgICAocG9sbCBhcyB7IHVucmVmPzogKCkgPT4gdm9pZCB9KS51bnJlZj8uKCk7XG59XG5cbi8qKiBDYWxsZWQgd2hlbiB3ZSBoYWQgdG8gbGlzdGVuIG9uIGFuIGFsdGVybmF0ZSBwb3J0ICh0aGUgbWFpbiBwb3J0IHdhcyBzdGlsbCBoZWxkIGJ5IG91clxuICogIHByZWRlY2Vzc29yKTogcmVnaXN0ZXJzIGl0IHNvIHRoZSBwcmVkZWNlc3NvciBjYW4gcm91dGUgdGhlIG1pZGRsZSBvdmVybGFwIHdpbmRvdyB0byB1cy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWdpc3RlckFsdFBvcnQocG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgb3VyQWx0UG9ydCA9IHBvcnQ7XG4gICAgbGV0IGZvbGRlciA9IGdldFJlZ2lzdHJ5Rm9sZGVyKCk7XG4gICAgYXdhaXQgZnMucHJvbWlzZXMubWtkaXIoZm9sZGVyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBsZXQgZW50cnk6IFJlZ2lzdHJ5RW50cnkgPSB7IHBpZDogcHJvY2Vzcy5waWQsIHBvcnQsIGFuY2VzdG9yUGlkczogWy4uLmFuY2VzdG9yUGlkc10gfTtcbiAgICBhd2FpdCBmcy5wcm9taXNlcy53cml0ZUZpbGUocGF0aC5qb2luKGZvbGRlciwgYCR7cHJvY2Vzcy5waWR9Lmpzb25gKSwgSlNPTi5zdHJpbmdpZnkoZW50cnkpKTtcbiAgICBhd2FpdCByZWNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9uVGFrZW92ZXJFdmVudChsaXN0ZW5lcjogKGV2ZW50OiBUYWtlb3ZlckV2ZW50KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgZXZlbnRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG59XG5cbi8qKiBUaGUgaW50ZXJwcmV0YXRpb24gb3ZlcmxheTogc3BsaXRzIGV2ZXJ5IHNvdXJjZSBwb2ludGluZyBhdCBvdXIgZG9tYWluK21haW4gcG9ydCBzbyB0aGUgbWlkZGxlXG4gKiAgb2YgdGhlIGRlcGxveSBvdmVybGFwIHBvaW50cyBhdCB0aGUgYWx0ZXJuYXRlIHBvcnQuIFB1cmUsIGluLW1lbW9yeSBvbmx5IC0gdGhlIHN0b3JlZCByb3V0aW5nXG4gKiAgY29uZmlnIGlzIG5ldmVyIG1vZGlmaWVkLCBhbmQgdGhpcyBtdXN0IG5ldmVyIGJlIGFwcGxpZWQgdG8gZGF0YSB0aGF0IGdldHMgcGVyc2lzdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVwbG95UmVtYXAocm91dGluZzogUmVtb3RlQ29uZmlnKTogUmVtb3RlQ29uZmlnIHtcbiAgICBsZXQgcmVtYXAgPSBjdXJyZW50LnJlbWFwO1xuICAgIGxldCBpbml0ID0gaW5pdGlhbGl6ZWQ7XG4gICAgaWYgKCFyZW1hcCB8fCAhaW5pdCkgcmV0dXJuIHJvdXRpbmc7XG4gICAgbGV0IHNvdXJjZXM6IFJlbW90ZUNvbmZpZ0Jhc2VbXSA9IFtdO1xuICAgIGxldCBzbGljZSA9IChzb3VyY2U6IEhvc3RlZENvbmZpZywgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHVybD86IHN0cmluZyk6IEhvc3RlZENvbmZpZyA9PiB7XG4gICAgICAgIHJldHVybiB7IC4uLnNvdXJjZSwgdXJsOiB1cmwgfHwgc291cmNlLnVybCwgdmFsaWRXaW5kb3c6IFtzdGFydCwgZW5kXSB9O1xuICAgIH07XG4gICAgZm9yIChsZXQgc291cmNlIG9mIHJvdXRpbmcuc291cmNlcykge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIiB8fCBzb3VyY2UudHlwZSAhPT0gXCJyZW1vdGVcIikge1xuICAgICAgICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFyc2VkOiB7IGFkZHJlc3M6IHN0cmluZzsgcG9ydDogbnVtYmVyIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBwYXJzZWQgPSBwYXJzZUhvc3RlZFVybChzb3VyY2UudXJsKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJzZWQuYWRkcmVzcyAhPT0gaW5pdC5kb21haW4gfHwgcGFyc2VkLnBvcnQgIT09IGluaXQubWFpblBvcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzb3VyY2UpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtzdGFydCwgZW5kXSA9IHNvdXJjZS52YWxpZFdpbmRvdztcbiAgICAgICAgbGV0IGEgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlBLCBlbmQpKTtcbiAgICAgICAgbGV0IGIgPSBNYXRoLm1heChzdGFydCwgTWF0aC5taW4ocmVtYXAuYm91bmRhcnlCLCBlbmQpKTtcbiAgICAgICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgICAgIGlmIChhID4gc3RhcnQpIHtcbiAgICAgICAgICAgIHNvdXJjZXMucHVzaChzbGljZShzb3VyY2UsIHN0YXJ0LCBhKSk7XG4gICAgICAgICAgICBhZGRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgPiBhKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBhLCBiLCByZXBsYWNlSG9zdGVkVXJsUG9ydChzb3VyY2UudXJsLCByZW1hcC5hbHRQb3J0KSkpO1xuICAgICAgICAgICAgYWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmQgPiBiKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc2xpY2Uoc291cmNlLCBiLCBlbmQpKTtcbiAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWFkZGVkKSB7XG4gICAgICAgICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyB2ZXJzaW9uOiByb3V0aW5nLnZlcnNpb24sIHNvdXJjZXMgfTtcbn1cblxuLyoqIEZvciB0aGUgZHlpbmcgcHJvY2VzczogZmFzdC13cml0ZSBmbHVzaCBkZWxheXMgbXVzdCBuZXZlciBleHRlbmQgcGFzdCB0aGlzIHRpbWUsIGFuZCBhZnRlciBpdFxuICogIGZhc3Qgd3JpdGVzIGZsdXNoIGltbWVkaWF0ZWx5IC0gc28gbm90aGluZyBpcyBsZWZ0IGluIG1lbW9yeSB3aGVuIHRoZSB3cml0ZSB3aW5kb3cgdHJhbnNmZXJzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsdXNoRGVhZGxpbmUoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgZHlpbmcgPSBjdXJyZW50LmR5aW5nO1xuICAgIGlmICghZHlpbmcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGR5aW5nLnN1Y2Nlc3NvclN0YXJ0ICsgZHlpbmcub3ZlcmxhcCAqIEZMVVNIX0RFQURMSU5FX0ZSQUNUSU9OO1xufVxuXG4vKiogSG93IGxvbmcgdG8gd2FpdCBiZXR3ZWVuIG1haW4tcG9ydCBhY3F1aXNpdGlvbiBhdHRlbXB0czogdGlnaHQgYXJvdW5kIHRoZSBwcmVkZWNlc3NvcidzXG4gKiAgc2NoZWR1bGVkIGRlYXRoICh3aGVuIHRoZSBwb3J0IGFjdHVhbGx5IGZyZWVzKSwgcmVsYXhlZCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpblBvcnRBY3F1aXJlRGVsYXkoKTogbnVtYmVyIHtcbiAgICBsZXQgZW5kID0gY3VycmVudC5wcmVkZWNlc3NvckVuZDtcbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQgJiYgTWF0aC5hYnMoRGF0ZS5ub3coKSAtIGVuZCkgPD0gQUNRVUlSRV9GQVNUX1dJTkRPVykge1xuICAgICAgICByZXR1cm4gQUNRVUlSRV9GQVNUX0RFTEFZO1xuICAgIH1cbiAgICByZXR1cm4gQUNRVUlSRV9TTE9XX0RFTEFZO1xufVxuIl19
|
|
370
|
-
/* _JS_SOURCE_HASH = "
|
|
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 = "a08184229257d763b4ac8c035749703d5b9307f9f4f5397463dfa2118fadf2eb"; */
|