obsidian-integration-testing 2.6.1 → 2.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/eval-in-obsidian.cjs +50 -53
- package/dist/lib/cjs/generate-function-call.cjs +42 -0
- package/dist/lib/cjs/generate-function-call.d.cts +57 -0
- package/dist/lib/cjs/obsidian-config.cjs +46 -3
- package/dist/lib/cjs/obsidian-config.d.cts +24 -0
- package/dist/lib/cjs/transport-appium.cjs +10 -5
- package/dist/lib/cjs/transport-appium.d.cts +3 -1
- package/dist/lib/cjs/transport-desktop-cdp.cjs +12 -23
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +3 -1
- package/dist/lib/cjs/transport-desktop-cli.cjs +88 -39
- package/dist/lib/cjs/transport-desktop-cli.d.cts +41 -1
- package/dist/lib/esm/eval-in-obsidian.mjs +53 -53
- package/dist/lib/esm/generate-function-call.d.mts +57 -0
- package/dist/lib/esm/generate-function-call.mjs +17 -0
- package/dist/lib/esm/obsidian-config.d.mts +24 -0
- package/dist/lib/esm/obsidian-config.mjs +46 -3
- package/dist/lib/esm/transport-appium.d.mts +3 -1
- package/dist/lib/esm/transport-appium.mjs +10 -5
- package/dist/lib/esm/transport-desktop-cdp.d.mts +3 -1
- package/dist/lib/esm/transport-desktop-cdp.mjs +20 -24
- package/dist/lib/esm/transport-desktop-cli.d.mts +41 -1
- package/dist/lib/esm/transport-desktop-cli.mjs +92 -39
- package/dist/obsidian-integration-testing-2.7.1.tgz +0 -0
- package/package.json +1 -1
- package/dist/obsidian-integration-testing-2.6.1.tgz +0 -0
|
@@ -10,13 +10,20 @@ import { join } from "node:path";
|
|
|
10
10
|
import process from "node:process";
|
|
11
11
|
import { exec } from "./exec.mjs";
|
|
12
12
|
import { getFunctionExpressionString } from "./function-expression.mjs";
|
|
13
|
+
import {
|
|
14
|
+
ensureLayoutReady,
|
|
15
|
+
generateFunctionCall
|
|
16
|
+
} from "./generate-function-call.mjs";
|
|
13
17
|
import { log } from "./log.mjs";
|
|
14
18
|
import { noop } from "./noop.mjs";
|
|
15
19
|
import {
|
|
20
|
+
enableCliInConfig,
|
|
16
21
|
getAnyRegisteredVaultPath,
|
|
17
22
|
getVaultId,
|
|
18
23
|
isCliEnabled,
|
|
19
|
-
isVaultRegistered
|
|
24
|
+
isVaultRegistered,
|
|
25
|
+
registerVaultInConfig,
|
|
26
|
+
removeVaultFromConfig
|
|
20
27
|
} from "./obsidian-config.mjs";
|
|
21
28
|
import { serializeError } from "./serialize-error.mjs";
|
|
22
29
|
const UNABLE_TO_FIND_OBSIDIAN = "unable to find Obsidian";
|
|
@@ -27,7 +34,9 @@ const VAULT_POLL_TIMEOUT_IN_MILLISECONDS = 3e4;
|
|
|
27
34
|
const VAULT_CLOSE_DELAY_IN_MILLISECONDS = 1e3;
|
|
28
35
|
const VAULT_EVAL_TIMEOUT_IN_MILLISECONDS = 1e4;
|
|
29
36
|
class DesktopCliTransport {
|
|
30
|
-
/**
|
|
37
|
+
/**
|
|
38
|
+
* Indicates whether this transport is for a mobile platform. Always `false` for this transport.
|
|
39
|
+
*/
|
|
31
40
|
isMobile = false;
|
|
32
41
|
/**
|
|
33
42
|
* Evaluates a JavaScript expression inside Obsidian via `obsidian eval`.
|
|
@@ -105,7 +114,9 @@ class DesktopCliTransport {
|
|
|
105
114
|
);
|
|
106
115
|
}
|
|
107
116
|
if (!isCliEnabled()) {
|
|
108
|
-
|
|
117
|
+
log("[cli-transport] CLI is disabled in obsidian.json. Enabling and restarting Obsidian...");
|
|
118
|
+
enableCliInConfig();
|
|
119
|
+
await this.restartObsidian(vaultPath);
|
|
109
120
|
}
|
|
110
121
|
await this.assertCliAvailable();
|
|
111
122
|
log("[cli-transport] Preflight check passed.");
|
|
@@ -121,17 +132,17 @@ class DesktopCliTransport {
|
|
|
121
132
|
async registerVault(vaultPath) {
|
|
122
133
|
log(`[cli-transport] Registering vault: ${vaultPath}`);
|
|
123
134
|
const existingVaultPath = getAnyRegisteredVaultPath();
|
|
124
|
-
if (
|
|
125
|
-
|
|
135
|
+
if (existingVaultPath) {
|
|
136
|
+
const registerExpr = generateFunctionCall(ipcSendSync, { args: [vaultPath, false], channel: "vault-open", ensureLayoutReady });
|
|
137
|
+
await this.evaluate(registerExpr, { cwd: existingVaultPath });
|
|
138
|
+
await this.enablePluginsInLocalStorage(vaultPath, existingVaultPath);
|
|
139
|
+
} else {
|
|
140
|
+
log("[cli-transport] No existing vault registered. Writing vault entry directly to obsidian.json...");
|
|
141
|
+
registerVaultInConfig(vaultPath);
|
|
142
|
+
log("[cli-transport] Vault entry written. Opening vault via URI protocol...");
|
|
143
|
+
await openVaultViaUri(vaultPath);
|
|
126
144
|
}
|
|
127
|
-
const
|
|
128
|
-
`window.electron.ipcRenderer.sendSync('vault-open', ${JSON.stringify(vaultPath)}, false);`
|
|
129
|
-
);
|
|
130
|
-
await this.evaluate(registerExpr, { cwd: existingVaultPath });
|
|
131
|
-
await this.enablePluginsInLocalStorage(vaultPath, existingVaultPath);
|
|
132
|
-
const pollExpr = buildSimpleExpression(
|
|
133
|
-
"return JSON.stringify(app.vault.adapter.getBasePath());"
|
|
134
|
-
);
|
|
145
|
+
const pollExpr = generateFunctionCall(pollVaultBasePath, { ensureLayoutReady });
|
|
135
146
|
log(`[cli-transport] Polling for vault readiness (timeout=${String(VAULT_POLL_TIMEOUT_IN_MILLISECONDS)}ms)...`);
|
|
136
147
|
const deadline = Date.now() + VAULT_POLL_TIMEOUT_IN_MILLISECONDS;
|
|
137
148
|
while (Date.now() < deadline) {
|
|
@@ -157,13 +168,7 @@ class DesktopCliTransport {
|
|
|
157
168
|
*/
|
|
158
169
|
async unregisterVault(vaultPath) {
|
|
159
170
|
log(`[cli-transport] Unregistering vault: closing window for ${vaultPath}...`);
|
|
160
|
-
const destroyExpr =
|
|
161
|
-
setTimeout(() => {
|
|
162
|
-
if (window.electron && window.electron.remote) {
|
|
163
|
-
window.electron.remote.getCurrentWindow().destroy();
|
|
164
|
-
}
|
|
165
|
-
}, 0);
|
|
166
|
-
`);
|
|
171
|
+
const destroyExpr = generateFunctionCall(destroyCurrentWindow, { ensureLayoutReady });
|
|
167
172
|
try {
|
|
168
173
|
await this.evaluate(destroyExpr, { cwd: vaultPath, timeoutInMilliseconds: VAULT_EVAL_TIMEOUT_IN_MILLISECONDS });
|
|
169
174
|
log("[cli-transport] Window destroy command sent.");
|
|
@@ -173,15 +178,14 @@ class DesktopCliTransport {
|
|
|
173
178
|
log("[cli-transport] Waiting for window to close...");
|
|
174
179
|
await delay(VAULT_CLOSE_DELAY_IN_MILLISECONDS);
|
|
175
180
|
log("[cli-transport] Removing vault from registry...");
|
|
176
|
-
const removeExpr =
|
|
177
|
-
`window.electron.ipcRenderer.sendSync('vault-remove', ${JSON.stringify(vaultPath)});`
|
|
178
|
-
);
|
|
181
|
+
const removeExpr = generateFunctionCall(ipcSendSync, { args: [vaultPath], channel: "vault-remove", ensureLayoutReady });
|
|
179
182
|
const existingVaultForRemoval = getAnyRegisteredVaultPath();
|
|
180
183
|
try {
|
|
181
184
|
if (existingVaultForRemoval) {
|
|
182
185
|
await this.evaluate(removeExpr, { cwd: existingVaultForRemoval, timeoutInMilliseconds: VAULT_EVAL_TIMEOUT_IN_MILLISECONDS });
|
|
183
186
|
} else {
|
|
184
|
-
log("[cli-transport] No existing vault to target for removal IPC \u2014
|
|
187
|
+
log("[cli-transport] No existing vault to target for removal IPC \u2014 removing directly from obsidian.json.");
|
|
188
|
+
removeVaultFromConfig(vaultPath);
|
|
185
189
|
}
|
|
186
190
|
log("[cli-transport] Vault removed from registry.");
|
|
187
191
|
} catch (error) {
|
|
@@ -218,9 +222,7 @@ class DesktopCliTransport {
|
|
|
218
222
|
log("[cli-transport] Could not find vault ID \u2014 skipping localStorage trust flag.");
|
|
219
223
|
return;
|
|
220
224
|
}
|
|
221
|
-
const enableExpr =
|
|
222
|
-
`localStorage.setItem(${JSON.stringify(`enable-plugin-${vaultId}`)}, 'true');`
|
|
223
|
-
);
|
|
225
|
+
const enableExpr = generateFunctionCall(setLocalStorageItem, { ensureLayoutReady, key: `enable-plugin-${vaultId}`, value: "true" });
|
|
224
226
|
await this.evaluate(enableExpr, { cwd: evalTargetVaultPath });
|
|
225
227
|
log(`[cli-transport] Set enable-plugin-${vaultId} in localStorage.`);
|
|
226
228
|
}
|
|
@@ -254,9 +256,32 @@ class DesktopCliTransport {
|
|
|
254
256
|
}
|
|
255
257
|
throw new Error(`Obsidian did not start within ${String(AUTO_START_TIMEOUT_IN_MILLISECONDS)}ms.`);
|
|
256
258
|
}
|
|
259
|
+
/**
|
|
260
|
+
* Restarts Obsidian by killing the running process and relaunching it.
|
|
261
|
+
*
|
|
262
|
+
* Used when a config change (like enabling CLI) requires a restart to take effect.
|
|
263
|
+
*
|
|
264
|
+
* @param vaultPath - The vault path to use for polling after restart.
|
|
265
|
+
*/
|
|
266
|
+
async restartObsidian(vaultPath) {
|
|
267
|
+
log("[cli-transport] Killing Obsidian process...");
|
|
268
|
+
try {
|
|
269
|
+
await exec(getKillObsidianCommand(), { isQuiet: true });
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
await delay(VAULT_CLOSE_DELAY_IN_MILLISECONDS);
|
|
273
|
+
const command = ["obsidian", "eval", "--vault", vaultPath, "--expression", '"1"'];
|
|
274
|
+
await this.ensureObsidianRunningAndRetry(command, vaultPath);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async function destroyCurrentWindow(params) {
|
|
278
|
+
await params.ensureLayoutReady(params);
|
|
279
|
+
await sleep(0);
|
|
280
|
+
window.electronWindow.destroy();
|
|
257
281
|
}
|
|
258
|
-
function
|
|
259
|
-
|
|
282
|
+
async function ipcSendSync(params) {
|
|
283
|
+
await params.ensureLayoutReady(params);
|
|
284
|
+
window.electron.ipcRenderer.sendSync(params.channel, ...params.args);
|
|
260
285
|
}
|
|
261
286
|
function buildScriptFile(expression, resultPath, invokeName) {
|
|
262
287
|
const resultPathJson = JSON.stringify(resultPath.replace(/\\/g, "/"));
|
|
@@ -282,19 +307,17 @@ async function ${invokeName}() {
|
|
|
282
307
|
exports.${invokeName} = ${invokeName};
|
|
283
308
|
`;
|
|
284
309
|
}
|
|
285
|
-
function buildSimpleExpression(body) {
|
|
286
|
-
return `(async () => {
|
|
287
|
-
if (!app.workspace.layoutReady) {
|
|
288
|
-
await new Promise((resolve) => app.workspace.onLayoutReady(resolve));
|
|
289
|
-
}
|
|
290
|
-
${body}
|
|
291
|
-
})()`;
|
|
292
|
-
}
|
|
293
310
|
function delay(ms) {
|
|
294
311
|
return new Promise((resolve) => {
|
|
295
312
|
setTimeout(resolve, ms);
|
|
296
313
|
});
|
|
297
314
|
}
|
|
315
|
+
function getKillObsidianCommand() {
|
|
316
|
+
if (process.platform === "win32") {
|
|
317
|
+
return "taskkill /IM Obsidian.exe /F";
|
|
318
|
+
}
|
|
319
|
+
return "pkill -f Obsidian";
|
|
320
|
+
}
|
|
298
321
|
function getObsidianLaunchCommand() {
|
|
299
322
|
if (process.platform === "win32") {
|
|
300
323
|
const localAppData = process.env["LOCALAPPDATA"] ?? "";
|
|
@@ -305,7 +328,37 @@ function getObsidianLaunchCommand() {
|
|
|
305
328
|
}
|
|
306
329
|
return "obsidian &";
|
|
307
330
|
}
|
|
331
|
+
function getOpenUriCommand(uri) {
|
|
332
|
+
if (process.platform === "win32") {
|
|
333
|
+
return `start "" "${uri}"`;
|
|
334
|
+
}
|
|
335
|
+
if (process.platform === "darwin") {
|
|
336
|
+
return `open "${uri}"`;
|
|
337
|
+
}
|
|
338
|
+
return `xdg-open "${uri}"`;
|
|
339
|
+
}
|
|
340
|
+
async function openVaultViaUri(vaultPath) {
|
|
341
|
+
const encodedPath = encodeURIComponent(vaultPath);
|
|
342
|
+
const uri = `obsidian://open?path=${encodedPath}`;
|
|
343
|
+
const command = getOpenUriCommand(uri);
|
|
344
|
+
log(`[cli-transport] Opening vault via URI: ${uri}`);
|
|
345
|
+
try {
|
|
346
|
+
await exec(command, { isQuiet: true });
|
|
347
|
+
} catch (error) {
|
|
348
|
+
log(`[cli-transport] URI open failed (non-fatal): ${serializeError(error)}`);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async function pollVaultBasePath(params) {
|
|
352
|
+
await params.ensureLayoutReady(params);
|
|
353
|
+
return JSON.stringify(params.app.vault.adapter.getBasePath());
|
|
354
|
+
}
|
|
355
|
+
async function setLocalStorageItem(params) {
|
|
356
|
+
await params.ensureLayoutReady(params);
|
|
357
|
+
localStorage.setItem(params.key, params.value);
|
|
358
|
+
}
|
|
308
359
|
export {
|
|
309
|
-
DesktopCliTransport
|
|
360
|
+
DesktopCliTransport,
|
|
361
|
+
destroyCurrentWindow,
|
|
362
|
+
ipcSendSync
|
|
310
363
|
};
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLm1qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5tanMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vbm9vcC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZFxufSBmcm9tICcuL29ic2lkaWFuLWNvbmZpZy5tanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplRXJyb3IgfSBmcm9tICcuL3NlcmlhbGl6ZS1lcnJvci5tanMnO1xuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLyoqXG4gKiBUcmFuc3BvcnQgdGhhdCBjb21tdW5pY2F0ZXMgd2l0aCBEZXNrdG9wIE9ic2lkaWFuIHZpYSB0aGUgYG9ic2lkaWFuIGV2YWxgIENMSSBjb21tYW5kXG4gKiBhbmQgbWFuYWdlcyB2YXVsdHMgdmlhIEVsZWN0cm9uIElQQy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BDbGlUcmFuc3BvcnQgaW1wbGVtZW50cyBPYnNpZGlhblRyYW5zcG9ydCB7XG4gIC8qKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgZGlzYWJsZWQuIEVuYWJsZSBpdCBpbiBPYnNpZGlhbiBTZXR0aW5ncyBcXHUyMTkyIEdlbmVyYWwgXFx1MjE5MiBDTEkuJyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0UGF0aCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICBpZiAoIWV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWdpc3RlciBhIHZhdWx0OiBubyBleGlzdGluZyB2YXVsdCBpcyByZWdpc3RlcmVkIGluIE9ic2lkaWFuLiBPcGVuIE9ic2lkaWFuIGFuZCBjcmVhdGUgb3Igb3BlbiBhdCBsZWFzdCBvbmUgdmF1bHQgZmlyc3QuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtb3BlbicsICR7SlNPTi5zdHJpbmdpZnkodmF1bHRQYXRoKX0sIGZhbHNlKTtgXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG5cbiAgICBjb25zdCBwb2xsRXhwciA9IGJ1aWxkU2ltcGxlRXhwcmVzc2lvbihcbiAgICAgICdyZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXBwLnZhdWx0LmFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSk7J1xuICAgICk7XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCByZWFkaW5lc3MgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKGJhc2VQYXRoKSA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGNvbnN0IGRlc3Ryb3lFeHByID0gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGBcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAod2luZG93LmVsZWN0cm9uICYmIHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUpIHtcbiAgICAgICAgICB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCByZW1vdmVFeHByID0gYnVpbGRJcGNFeHByZXNzaW9uKFxuICAgICAgYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYygndmF1bHQtcmVtb3ZlJywgJHtKU09OLnN0cmluZ2lmeSh2YXVsdFBhdGgpfSk7YFxuICAgICk7XG4gICAgY29uc3QgZXhpc3RpbmdWYXVsdEZvclJlbW92YWwgPSBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCkge1xuICAgICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlbW92ZUV4cHIsIHsgY3dkOiBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCwgdGltZW91dEluTWlsbGlzZWNvbmRzOiBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgc2tpcHBpbmcuJyk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUV4cHIgPSBidWlsZFNpbXBsZUV4cHJlc3Npb24oXG4gICAgICBgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJHtKU09OLnN0cmluZ2lmeShgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9YCl9LCAndHJ1ZScpO2BcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGFuIGFzeW5jIElJRkUgdGhhdCB3YWl0cyBmb3IgbGF5b3V0IHJlYWR5IGFuZCBleGVjdXRlcyBhbiBJUEMgY2FsbC5cbiAqIFRoZSByZXR1cm4gdmFsdWUgaXMgYEpTT04uc3RyaW5naWZ5KHVuZGVmaW5lZClgIHNvIHRoZSBDTEkgcHJvZHVjZXMgYChubyBvdXRwdXQpYC5cbiAqXG4gKiBAcGFyYW0gaXBjU3RhdGVtZW50IC0gVGhlIElQQyBzdGF0ZW1lbnQgdG8gZXhlY3V0ZS5cbiAqIEByZXR1cm5zIFRoZSBJSUZFIGV4cHJlc3Npb24gc3RyaW5nLlxuICovXG5mdW5jdGlvbiBidWlsZElwY0V4cHJlc3Npb24oaXBjU3RhdGVtZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGlwY1N0YXRlbWVudCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb250ZW50IG9mIGEgdGVtcG9yYXJ5IGAuY2pzYCBzY3JpcHQgZmlsZS5cbiAqXG4gKiBUaGUgc2NyaXB0IGRlZmluZXMgYW4gYXN5bmMgYGludm9rZSgpYCBmdW5jdGlvbiB0aGF0IGV2YWx1YXRlcyB0aGVcbiAqIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IChvciBlcnJvcikgdG8gYHJlc3VsdFBhdGhgLCBhbmQgaXNcbiAqIGV4cG9ydGVkIGZvciB0aGUgQ0xJIHRvIGByZXF1aXJlKClgIGFuZCBjYWxsLlxuICpcbiAqIEBwYXJhbSBleHByZXNzaW9uIC0gVGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAqIEBwYXJhbSByZXN1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHJlc3VsdCBmaWxlLlxuICogQHBhcmFtIGludm9rZU5hbWUgLSBUaGUgdW5pcXVlIGZ1bmN0aW9uIG5hbWUgdG8gZXhwb3J0IChhdm9pZHMgY29sbGlzaW9ucykuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nLCBpbnZva2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCByZXN1bHRQYXRoSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdFBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgcmV0dXJuIGBcInVzZSBzdHJpY3RcIjtcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xuY29uc3Qgc2VyaWFsaXplRXJyb3IgPSAke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcil9O1xuXG5hc3luYyBmdW5jdGlvbiAke2ludm9rZU5hbWV9KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0ICgke2V4cHJlc3Npb259KTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFwiXCIsIHR5cGU6IFwidW5kZWZpbmVkXCIgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcIm51bGxcIiB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IFN0cmluZyhyZXN1bHQpIH0pKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGZzLndyaXRlRmlsZVN5bmMoJHtyZXN1bHRQYXRoSnNvbn0sIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHNlcmlhbGl6ZUVycm9yKGVyciksIHR5cGU6IFwiZXJyb3JcIiB9KSk7XG4gIH1cbn1cblxuZXhwb3J0cy4ke2ludm9rZU5hbWV9ID0gJHtpbnZva2VOYW1lfTtcbmA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2ltcGxlIGFzeW5jIElJRkUgZXhwcmVzc2lvbiB0aGF0IHdhaXRzIGZvciBsYXlvdXQgcmVhZHkuXG4gKlxuICogQHBhcmFtIGJvZHkgLSBUaGUgSmF2YVNjcmlwdCBzdGF0ZW1lbnRzIHRvIGV4ZWN1dGUuXG4gKiBAcmV0dXJucyBUaGUgSUlGRSBleHByZXNzaW9uIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTaW1wbGVFeHByZXNzaW9uKGJvZHk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgKGFzeW5jICgpID0+IHtcbiAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IGFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKSk7XG4gIH1cbiAgJHtib2R5fVxufSkoKWA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuXG4gKlxuICogQHBhcmFtIG1zIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBkZWxheS5cbiAqL1xuZnVuY3Rpb24gZGVsYXkobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFTQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFPcEIsU0FBUyxZQUFZO0FBQ3JCLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsV0FBVztBQUNwQixTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFB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
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBFbnN1cmVMYXlvdXRSZWFkeVBhcmFtcyxcbiAgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXNcbn0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLm1qcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24ubWpzJztcbmltcG9ydCB7XG4gIGVuc3VyZUxheW91dFJlYWR5LFxuICBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbFxufSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9ub29wLm1qcyc7XG5pbXBvcnQge1xuICBlbmFibGVDbGlJbkNvbmZpZyxcbiAgZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcubWpzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IubWpzJztcblxuaW50ZXJmYWNlIElwY1NlbmRTeW5jUGFyYW1zIGV4dGVuZHMgRW5zdXJlTGF5b3V0UmVhZHlQYXJhbXMge1xuICBhcmdzOiB1bmtub3duW107XG4gIGNoYW5uZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIGVudmVsb3BlIHdyaXR0ZW4gYnkgdGhlIHRlbXBvcmFyeSBzY3JpcHQgZmlsZS5cbiAqXG4gKiAtIGB7IHZhbHVlOiBzdHJpbmcsIHR5cGU6ICdlcnJvcicgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHRocmV3OyBgdmFsdWVgIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICdudWxsJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYG51bGxgLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICd1bmRlZmluZWQnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgdW5kZWZpbmVkYC5cbiAqIC0gYHsgdmFsdWU6IHN0cmluZyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYSBzdHJpbmcgdmFsdWUgKG5vIGB0eXBlYCBmaWVsZCkuXG4gKi9cbnR5cGUgU2NyaXB0UmVzdWx0RW52ZWxvcGUgPVxuICB8IHsgdHlwZTogJ2Vycm9yJyB8ICdudWxsJyB8ICd1bmRlZmluZWQnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHZhbHVlOiBzdHJpbmcgfTtcblxuaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMgZXh0ZW5kcyBFbnN1cmVMYXlvdXRSZWFkeVBhcmFtcyB7XG4gIGtleTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1vYmplY3QtdHlwZSAtLSBGb3IgY29uc2lzdGVuY3kgYW5kIGZ1dHVyZSBleHRlbnNpYmlsaXR5LlxuaW50ZXJmYWNlIERlc3Ryb3lDdXJyZW50V2luZG93UGFyYW1zIGV4dGVuZHMgRW5zdXJlTGF5b3V0UmVhZHlQYXJhbXMge1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LW9iamVjdC10eXBlIC0tIEZvciBjb25zaXN0ZW5jeSBhbmQgZnV0dXJlIGV4dGVuc2liaWxpdHkuXG5pbnRlcmZhY2UgUG9sbFZhdWx0QmFzZVBhdGhQYXJhbXMgZXh0ZW5kcyBFbnN1cmVMYXlvdXRSZWFkeVBhcmFtcyB7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgdGhlIGBvYnNpZGlhbiBldmFsYCBDTEkgY29tbWFuZFxuICogYW5kIG1hbmFnZXMgdmF1bHRzIHZpYSBFbGVjdHJvbiBJUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2xpVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5janNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGludm9rZU5hbWUgPSBgaW52b2tlXyR7c2NyaXB0SWR9YDtcbiAgICBjb25zdCBzY3JpcHRDb250ZW50ID0gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb24sIHJlc3VsdFBhdGgsIGludm9rZU5hbWUpO1xuICAgIGF3YWl0IHdyaXRlRmlsZShzY3JpcHRQYXRoLCBzY3JpcHRDb250ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgbW9kdWxlLmNvbnN0cnVjdG9yLl9sb2FkIHRvIGJ5cGFzcyBhbnkgbW9ua2V5LXBhdGNoZWQgcmVxdWlyZSgpXG4gICAgICAvLyAoZS5nLiwgb2JzaWRpYW4tY29kZXNjcmlwdC10b29sa2l0IHBhdGNoZXMgcmVxdWlyZSBpbiB0aGUgcmVuZGVyZXIgcHJvY2VzcykuXG4gICAgICBjb25zdCBzYWZlUmVxdWlyZSA9IGBtb2R1bGUuY29uc3RydWN0b3IuX2xvYWQoJHtKU09OLnN0cmluZ2lmeShzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSl9KWA7XG4gICAgICBjb25zdCByZXF1aXJlRXhwciA9IGAoYXN5bmMgKCkgPT4geyBhd2FpdCAke3NhZmVSZXF1aXJlfS4ke2ludm9rZU5hbWV9KCkgfSkoKWA7XG4gICAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsICdldmFsJywgJy0tYWxsb3ctZm9jdXMtc3RlYWwnLCBgY29kZT0ke3JlcXVpcmVFeHByfWBdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH0gXHUyMDE0IHRoZSB2YXVsdCBtYXkgbm90IGJlIGZvdW5kIG9yIE9ic2lkaWFuIGRpZCBub3QgcnVuIHRoZSBldmFsLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ0xJIGlzIGRpc2FibGVkIGluIG9ic2lkaWFuLmpzb24uIEVuYWJsaW5nIGFuZCByZXN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG4gICAgICBlbmFibGVDbGlJbkNvbmZpZygpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFzc2VydENsaUF2YWlsYWJsZSgpO1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIEVsZWN0cm9uIElQQy5cbiAgICpcbiAgICogVXNlcyBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgdmF1bHQncyBDTEkgaXMgcmVhZHkgYW5kIGBnZXRCYXNlUGF0aCgpYCBtYXRjaGVzIGB2YXVsdFBhdGhgLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKGV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICBjb25zdCByZWdpc3RlckV4cHIgPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChpcGNTZW5kU3luYywgeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJywgZW5zdXJlTGF5b3V0UmVhZHkgfSk7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IGV4aXN0aW5nVmF1bHRQYXRoIH0pO1xuICAgICAgYXdhaXQgdGhpcy5lbmFibGVQbHVnaW5zSW5Mb2NhbFN0b3JhZ2UodmF1bHRQYXRoLCBleGlzdGluZ1ZhdWx0UGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHJlZ2lzdGVyZWQuIFdyaXRpbmcgdmF1bHQgZW50cnkgZGlyZWN0bHkgdG8gb2JzaWRpYW4uanNvbi4uLicpO1xuICAgICAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBlbnRyeSB3cml0dGVuLiBPcGVuaW5nIHZhdWx0IHZpYSBVUkkgcHJvdG9jb2wuLi4nKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvbGxFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwocG9sbFZhdWx0QmFzZVBhdGgsIHsgZW5zdXJlTGF5b3V0UmVhZHkgfSk7XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciB2YXVsdCByZWFkaW5lc3MgKHRpbWVvdXQ9JHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKGJhc2VQYXRoKSA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgbm90IHJlYWR5IHlldC5cbiAgICAgIH1cbiAgICAgIGF3YWl0IGRlbGF5KFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBhdCAke3ZhdWx0UGF0aH0gZGlkIG5vdCBiZWNvbWUgcmVhZHkgd2l0aGluICR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGNvbnN0IGRlc3Ryb3lFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoZGVzdHJveUN1cnJlbnRXaW5kb3csIHsgZW5zdXJlTGF5b3V0UmVhZHkgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGNvbW1hbmQgc2VudC4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXYWl0aW5nIGZvciB3aW5kb3cgdG8gY2xvc2UuLi4nKTtcbiAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gUmVtb3ZpbmcgdmF1bHQgZnJvbSByZWdpc3RyeS4uLicpO1xuICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChpcGNTZW5kU3luYywgeyBhcmdzOiBbdmF1bHRQYXRoXSwgY2hhbm5lbDogJ3ZhdWx0LXJlbW92ZScsIGVuc3VyZUxheW91dFJlYWR5IH0pO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXhpc3RpbmdWYXVsdEZvclJlbW92YWwpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHRvIHRhcmdldCBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVuYWJsZUV4cHIgPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChzZXRMb2NhbFN0b3JhZ2VJdGVtLCB7IGVuc3VyZUxheW91dFJlYWR5LCBrZXk6IGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gLCB2YWx1ZTogJ3RydWUnIH0pO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RhcnRzIE9ic2lkaWFuIGJ5IGtpbGxpbmcgdGhlIHJ1bm5pbmcgcHJvY2VzcyBhbmQgcmVsYXVuY2hpbmcgaXQuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBhIGNvbmZpZyBjaGFuZ2UgKGxpa2UgZW5hYmxpbmcgQ0xJKSByZXF1aXJlcyBhIHJlc3RhcnQgdG8gdGFrZSBlZmZlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byB1c2UgZm9yIHBvbGxpbmcgYWZ0ZXIgcmVzdGFydC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gS2lsbGluZyBPYnNpZGlhbiBwcm9jZXNzLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9jZXNzIG1heSBub3QgYmUgcnVubmluZyBcdTIwMTQgdGhhdCdzIGZpbmUuXG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgJ2V2YWwnLCAnLS12YXVsdCcsIHZhdWx0UGF0aCwgJy0tZXhwcmVzc2lvbicsICdcIjFcIiddO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgdmF1bHRQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIFdhaXRzIGZvciBPYnNpZGlhbidzIHdvcmtzcGFjZSBsYXlvdXQgdG8gYmUgcmVhZHksIHRoZW4gZGVzdHJveXMgdGhlXG4gKiBjdXJyZW50IEVsZWN0cm9uIHdpbmRvdyB2aWEgYHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuZGVzdHJveSgpYC5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc3Ryb3lDdXJyZW50V2luZG93KHBhcmFtczogR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXM8RGVzdHJveUN1cnJlbnRXaW5kb3dQYXJhbXM+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBhcmFtcy5lbnN1cmVMYXlvdXRSZWFkeShwYXJhbXMpO1xuICBhd2FpdCBzbGVlcCgwKTtcbiAgd2luZG93LmVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgT2JzaWRpYW4ncyB3b3Jrc3BhY2UgbGF5b3V0IHRvIGJlIHJlYWR5LCB0aGVuIHNlbmRzIGFuIElQQ1xuICogbWVzc2FnZSBzeW5jaHJvbm91c2x5IHZpYSBFbGVjdHJvbidzIGBpcGNSZW5kZXJlcmAuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgSVBDIGNoYW5uZWwgYW5kIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSBwYXJhbXMuY2hhbm5lbCAtIFRoZSBJUEMgY2hhbm5lbCBuYW1lLlxuICogQHBhcmFtIHBhcmFtcy5hcmdzIC0gVGhlIGFyZ3VtZW50cyB0byBzZW5kLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXBjU2VuZFN5bmMocGFyYW1zOiBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtczxJcGNTZW5kU3luY1BhcmFtcz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgcGFyYW1zLmVuc3VyZUxheW91dFJlYWR5KHBhcmFtcyk7XG4gIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29udGVudCBvZiBhIHRlbXBvcmFyeSBgLmNqc2Agc2NyaXB0IGZpbGUuXG4gKlxuICogVGhlIHNjcmlwdCBkZWZpbmVzIGFuIGFzeW5jIGBpbnZva2UoKWAgZnVuY3Rpb24gdGhhdCBldmFsdWF0ZXMgdGhlXG4gKiBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCAob3IgZXJyb3IpIHRvIGByZXN1bHRQYXRoYCwgYW5kIGlzXG4gKiBleHBvcnRlZCBmb3IgdGhlIENMSSB0byBgcmVxdWlyZSgpYCBhbmQgY2FsbC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gKiBAcGFyYW0gcmVzdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSByZXN1bHQgZmlsZS5cbiAqIEBwYXJhbSBpbnZva2VOYW1lIC0gVGhlIHVuaXF1ZSBmdW5jdGlvbiBuYW1lIHRvIGV4cG9ydCAoYXZvaWRzIGNvbGxpc2lvbnMpLlxuICogQHJldHVybnMgVGhlIHNjcmlwdCBmaWxlIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uOiBzdHJpbmcsIHJlc3VsdFBhdGg6IHN0cmluZywgaW52b2tlTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0UGF0aEpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSk7XG4gIHJldHVybiBgXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcbmNvbnN0IHNlcmlhbGl6ZUVycm9yID0gJHtnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoc2VyaWFsaXplRXJyb3IpfTtcblxuYXN5bmMgZnVuY3Rpb24gJHtpbnZva2VOYW1lfSgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoJHtleHByZXNzaW9ufSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBcIlwiLCB0eXBlOiBcInVuZGVmaW5lZFwiIH0pKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgZnMud3JpdGVGaWxlU3luYygke3Jlc3VsdFBhdGhKc29ufSwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogXCJcIiwgdHlwZTogXCJudWxsXCIgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBTdHJpbmcocmVzdWx0KSB9KSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKCR7cmVzdWx0UGF0aEpzb259LCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBzZXJpYWxpemVFcnJvcihlcnIpLCB0eXBlOiBcImVycm9yXCIgfSkpO1xuICB9XG59XG5cbmV4cG9ydHMuJHtpbnZva2VOYW1lfSA9ICR7aW52b2tlTmFtZX07XG5gO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8ga2lsbCB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gJ3Rhc2traWxsIC9JTSBPYnNpZGlhbi5leGUgL0YnO1xuICB9XG5cbiAgcmV0dXJuICdwa2lsbCAtZiBPYnNpZGlhbic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBsYXVuY2ggdGhlIE9ic2lkaWFuIGJpbmFyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGxvY2FsQXBwRGF0YSA9IHByb2Nlc3MuZW52WydMT0NBTEFQUERBVEEnXSA/PyAnJztcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke2xvY2FsQXBwRGF0YX1cXFxcUHJvZ3JhbXNcXFxcT2JzaWRpYW5cXFxcT2JzaWRpYW4uZXhlXCJgO1xuICB9XG5cbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKSB7XG4gICAgcmV0dXJuICcvQXBwbGljYXRpb25zL09ic2lkaWFuLmFwcC9Db250ZW50cy9NYWNPUy9PYnNpZGlhbiAmJztcbiAgfVxuXG4gIHJldHVybiAnb2JzaWRpYW4gJic7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBvcGVuIGEgVVJJLlxuICpcbiAqIEBwYXJhbSB1cmkgLSBUaGUgVVJJIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5VcmlDb21tYW5kKHVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke3VyaX1cImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gYG9wZW4gXCIke3VyaX1cImA7XG4gIH1cblxuICByZXR1cm4gYHhkZy1vcGVuIFwiJHt1cml9XCJgO1xufVxuXG4vKipcbiAqIE9wZW5zIGEgdmF1bHQgaW4gT2JzaWRpYW4gdXNpbmcgdGhlIGBvYnNpZGlhbjovL29wZW5gIFVSSSBwcm90b2NvbC5cbiAqXG4gKiBUaGlzIHdvcmtzIHdoZXRoZXIgT2JzaWRpYW4gaXMgYWxyZWFkeSBydW5uaW5nIChzaWduYWxzIGl0IHRvIG9wZW4gdGhlIHZhdWx0KVxuICogb3Igbm90IChsYXVuY2hlcyBPYnNpZGlhbiB3aXRoIHRoZSB2YXVsdCkuIFRoZSBVUkkgcHJvdG9jb2wgaXMgaGFuZGxlZCBieSB0aGVcbiAqIE9TLCB3aGljaCByb3V0ZXMgaXQgdG8gdGhlIHJlZ2lzdGVyZWQgT2JzaWRpYW4gaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVuY29kZWRQYXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KHZhdWx0UGF0aCk7XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/cGF0aD0ke2VuY29kZWRQYXRofWA7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRPcGVuVXJpQ29tbWFuZCh1cmkpO1xuICBsb2coYFtjbGktdHJhbnNwb3J0XSBPcGVuaW5nIHZhdWx0IHZpYSBVUkk6ICR7dXJpfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFVSSSBvcGVuIGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgT2JzaWRpYW4ncyB3b3Jrc3BhY2UgbGF5b3V0IHRvIGJlIHJlYWR5LCB0aGVuIHJldHVybnMgdGhlXG4gKiB2YXVsdCdzIGJhc2UgcGF0aCBhcyBhIEpTT04tZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKiBNdXN0IE5PVCByZWZlcmVuY2UgYW55IG91dGVyIHNjb3BlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbXMuXG4gKiBAcmV0dXJucyBUaGUgSlNPTi1lbmNvZGVkIGJhc2UgcGF0aCBzdHJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvbGxWYXVsdEJhc2VQYXRoKHBhcmFtczogR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXM8UG9sbFZhdWx0QmFzZVBhdGhQYXJhbXM+KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgYXdhaXQgcGFyYW1zLmVuc3VyZUxheW91dFJlYWR5KHBhcmFtcyk7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSgocGFyYW1zLmFwcC52YXVsdC5hZGFwdGVyIGFzIEZpbGVTeXN0ZW1BZGFwdGVyKS5nZXRCYXNlUGF0aCgpKTtcbn1cblxuLyoqXG4gKiBXYWl0cyBmb3IgT2JzaWRpYW4ncyB3b3Jrc3BhY2UgbGF5b3V0IHRvIGJlIHJlYWR5LCB0aGVuIHNldHMgYVxuICogYGxvY2FsU3RvcmFnZWAgaXRlbS5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFBhcmFtcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0TG9jYWxTdG9yYWdlSXRlbShwYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXM+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHBhcmFtcy5lbnN1cmVMYXlvdXRSZWFkeShwYXJhbXMpO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBV0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBV3BCLFNBQVMsWUFBWTtBQUNyQixTQUFTLG1DQUFtQztBQUM1QztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsV0FBVztBQUNwQixTQUFTLFlBQVk7QUFDckI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsc0JBQXNCO0FBd0IvQixNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLDJDQUEyQztBQUNqRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNDQUFzQztBQUM1QyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLG9DQUFvQztBQUMxQyxNQUFNLHFDQUFxQztBQWNwQyxNQUFNLG9CQUFpRDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSTVDLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWlCM0IsTUFBYSxTQUFTLFlBQW9CLFNBQWdEO0FBQ3hGLFVBQU0sY0FBYztBQUNwQixVQUFNLFdBQVcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLE1BQU0sV0FBVztBQUN4RCxVQUFNLFlBQVksS0FBSyxPQUFPLEdBQUcsOEJBQThCO0FBQy9ELFVBQU0sYUFBYSxLQUFLLFdBQVcsR0FBRyxRQUFRLE1BQU07QUFDcEQsVUFBTSxhQUFhLEtBQUssV0FBVyxHQUFHLFFBQVEsY0FBYztBQUU1RCxVQUFNLE1BQU0sV0FBVyxFQUFFLFdB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
|
|
Binary file
|
package/package.json
CHANGED
|
Binary file
|