obsidian-integration-testing 4.1.6 → 4.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/cjs/context-id.cjs +1 -1
- package/dist/lib/cjs/dismiss-trust-dialog.cjs +45 -0
- package/dist/lib/cjs/dismiss-trust-dialog.d.cts +36 -0
- package/dist/lib/cjs/enable-plugin.cjs +1 -1
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +6 -2
- package/dist/lib/cjs/obsidian-config.cjs +15 -1
- package/dist/lib/cjs/obsidian-config.d.cts +11 -0
- package/dist/lib/cjs/obsidian-executable.cjs +95 -0
- package/dist/lib/cjs/obsidian-executable.d.cts +24 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +42 -9
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +23 -0
- package/dist/lib/cjs/transport-desktop-cli.cjs +43 -45
- package/dist/lib/cjs/transport-desktop-cli.d.cts +8 -3
- package/dist/lib/esm/context-id.mjs +1 -1
- package/dist/lib/esm/dismiss-trust-dialog.d.mts +36 -0
- package/dist/lib/esm/dismiss-trust-dialog.mjs +21 -0
- package/dist/lib/esm/enable-plugin.mjs +1 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +6 -2
- package/dist/lib/esm/obsidian-config.d.mts +11 -0
- package/dist/lib/esm/obsidian-config.mjs +14 -1
- package/dist/lib/esm/obsidian-executable.d.mts +24 -0
- package/dist/lib/esm/obsidian-executable.mjs +61 -0
- package/dist/lib/esm/transport-desktop-cdp.d.mts +23 -0
- package/dist/lib/esm/transport-desktop-cdp.mjs +42 -9
- package/dist/lib/esm/transport-desktop-cli.d.mts +8 -3
- package/dist/lib/esm/transport-desktop-cli.mjs +44 -46
- package/dist/obsidian-integration-testing-4.2.1.tgz +0 -0
- package/package.json +1 -1
- package/dist/obsidian-integration-testing-4.1.6.tgz +0 -0
|
@@ -37,12 +37,14 @@ var import_promises = require("node:fs/promises");
|
|
|
37
37
|
var import_node_os = require("node:os");
|
|
38
38
|
var import_node_path = require("node:path");
|
|
39
39
|
var import_node_process = __toESM(require("node:process"), 1);
|
|
40
|
+
var import_dismiss_trust_dialog = require("./dismiss-trust-dialog.cjs");
|
|
40
41
|
var import_exec = require("./exec.cjs");
|
|
41
42
|
var import_function_expression = require("./function-expression.cjs");
|
|
42
43
|
var import_log = require("./log.cjs");
|
|
43
44
|
var import_namespace_bootstrap = require("./namespace-bootstrap.cjs");
|
|
44
45
|
var import_noop = require("./noop.cjs");
|
|
45
46
|
var import_obsidian_config = require("./obsidian-config.cjs");
|
|
47
|
+
var import_obsidian_executable = require("./obsidian-executable.cjs");
|
|
46
48
|
var import_serialize_error = require("./serialize-error.cjs");
|
|
47
49
|
const UNABLE_TO_FIND_OBSIDIAN = "unable to find Obsidian";
|
|
48
50
|
const AUTO_START_POLL_INTERVAL_IN_MILLISECONDS = 2e3;
|
|
@@ -166,23 +168,22 @@ ${diagnostics}`);
|
|
|
166
168
|
*/
|
|
167
169
|
async registerVault(vaultPath) {
|
|
168
170
|
(0, import_log.log)(`[cli-transport] Registering vault: ${vaultPath}`);
|
|
169
|
-
const
|
|
170
|
-
if (
|
|
171
|
-
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this,
|
|
171
|
+
const openVaultPath = (0, import_obsidian_config.getAnyOpenVaultPath)();
|
|
172
|
+
if (openVaultPath) {
|
|
173
|
+
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this, openVaultPath);
|
|
172
174
|
const registerExpr = `window.__obsidianIntegrationTesting.ipcSendSync(${JSON.stringify({ args: [vaultPath, false], channel: "vault-open" })})`;
|
|
173
|
-
await this.evaluate(registerExpr, { cwd:
|
|
174
|
-
await this.enablePluginsInLocalStorage(vaultPath,
|
|
175
|
+
await this.evaluate(registerExpr, { cwd: openVaultPath });
|
|
176
|
+
await this.enablePluginsInLocalStorage(vaultPath, openVaultPath);
|
|
175
177
|
} else {
|
|
176
|
-
(0, import_log.log)("[cli-transport] No
|
|
178
|
+
(0, import_log.log)("[cli-transport] No open vault to target. Writing vault entry directly to obsidian.json...");
|
|
177
179
|
(0, import_obsidian_config.registerVaultInConfig)(vaultPath);
|
|
178
180
|
(0, import_log.log)("[cli-transport] Vault entry written. Opening vault via URI protocol...");
|
|
179
181
|
await openVaultViaUri(vaultPath);
|
|
180
182
|
await this.pollVaultReady(vaultPath);
|
|
181
183
|
await this.enablePluginsInLocalStorage(vaultPath, vaultPath);
|
|
182
|
-
await this.dismissTrustDialog(vaultPath);
|
|
183
|
-
return;
|
|
184
184
|
}
|
|
185
185
|
await this.pollVaultReady(vaultPath);
|
|
186
|
+
await this.dismissTrustDialog(vaultPath);
|
|
186
187
|
}
|
|
187
188
|
/**
|
|
188
189
|
* Unregisters a vault from the running Obsidian instance.
|
|
@@ -194,25 +195,29 @@ ${diagnostics}`);
|
|
|
194
195
|
*/
|
|
195
196
|
async unregisterVault(vaultPath) {
|
|
196
197
|
(0, import_log.log)(`[cli-transport] Unregistering vault: closing window for ${vaultPath}...`);
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
198
|
+
if ((0, import_obsidian_config.isVaultOpen)(vaultPath)) {
|
|
199
|
+
try {
|
|
200
|
+
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this, vaultPath);
|
|
201
|
+
const destroyExpr = "window.__obsidianIntegrationTesting.destroyCurrentWindow()";
|
|
202
|
+
await this.evaluate(destroyExpr, { cwd: vaultPath, timeoutInMilliseconds: VAULT_EVAL_TIMEOUT_IN_MILLISECONDS });
|
|
203
|
+
(0, import_log.log)("[cli-transport] Window destroy command sent.");
|
|
204
|
+
} catch (error) {
|
|
205
|
+
(0, import_log.log)(`[cli-transport] Window destroy failed (non-fatal): ${(0, import_serialize_error.serializeError)(error)}`);
|
|
206
|
+
}
|
|
207
|
+
(0, import_log.log)("[cli-transport] Waiting for window to close...");
|
|
208
|
+
await delay(VAULT_CLOSE_DELAY_IN_MILLISECONDS);
|
|
209
|
+
} else {
|
|
210
|
+
(0, import_log.log)("[cli-transport] Vault is not open \u2014 skipping destroy (would otherwise spawn a stray window via the CLI eval).");
|
|
204
211
|
}
|
|
205
|
-
(0, import_log.log)("[cli-transport] Waiting for window to close...");
|
|
206
|
-
await delay(VAULT_CLOSE_DELAY_IN_MILLISECONDS);
|
|
207
212
|
(0, import_log.log)("[cli-transport] Removing vault from registry...");
|
|
208
|
-
const
|
|
213
|
+
const evalTargetForRemoval = (0, import_obsidian_config.getAnyOpenVaultPath)();
|
|
209
214
|
try {
|
|
210
|
-
if (
|
|
211
|
-
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this,
|
|
215
|
+
if (evalTargetForRemoval) {
|
|
216
|
+
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this, evalTargetForRemoval);
|
|
212
217
|
const removeExpr = `window.__obsidianIntegrationTesting.ipcSendSync(${JSON.stringify({ args: [vaultPath], channel: "vault-remove" })})`;
|
|
213
|
-
await this.evaluate(removeExpr, { cwd:
|
|
218
|
+
await this.evaluate(removeExpr, { cwd: evalTargetForRemoval, timeoutInMilliseconds: VAULT_EVAL_TIMEOUT_IN_MILLISECONDS });
|
|
214
219
|
} else {
|
|
215
|
-
(0, import_log.log)("[cli-transport] No
|
|
220
|
+
(0, import_log.log)("[cli-transport] No open vault to target for removal IPC \u2014 removing directly from obsidian.json.");
|
|
216
221
|
(0, import_obsidian_config.removeVaultFromConfig)(vaultPath);
|
|
217
222
|
}
|
|
218
223
|
(0, import_log.log)("[cli-transport] Vault removed from registry.");
|
|
@@ -235,25 +240,20 @@ ${diagnostics}`);
|
|
|
235
240
|
* Dismisses the "Do you trust the author of this vault?" dialog if present.
|
|
236
241
|
*
|
|
237
242
|
* Clicks the "Trust author and enable plugins" button (`.mod-cta`) inside any
|
|
238
|
-
* modal whose text includes "Do you trust the author".
|
|
239
|
-
*
|
|
240
|
-
*
|
|
243
|
+
* modal whose text includes "Do you trust the author". Acts as a safety net
|
|
244
|
+
* for both registration paths:
|
|
245
|
+
*
|
|
246
|
+
* - First vault registered via config file (no prior `enable-plugin-<id>` entry).
|
|
247
|
+
* - Subsequent vault registered while another vault is already open. The
|
|
248
|
+
* `enable-plugin-<newVaultId>` write happens in the existing vault's renderer,
|
|
249
|
+
* but the new vault's renderer may read `localStorage` before that cross-renderer
|
|
250
|
+
* write becomes visible (race observed in Obsidian 1.13.0).
|
|
241
251
|
*
|
|
242
252
|
* @param vaultPath - The vault path to evaluate in.
|
|
243
253
|
*/
|
|
244
254
|
async dismissTrustDialog(vaultPath) {
|
|
245
255
|
await (0, import_namespace_bootstrap.ensureNamespaceBootstrapped)(this, vaultPath);
|
|
246
|
-
const
|
|
247
|
-
var modals = document.querySelectorAll('.modal-container');
|
|
248
|
-
for (var i = 0; i < modals.length; i++) {
|
|
249
|
-
if (modals[i].textContent.includes('Do you trust the author')) {
|
|
250
|
-
var btn = modals[i].querySelector('.mod-cta');
|
|
251
|
-
if (btn) { btn.click(); return true; }
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
return false;
|
|
255
|
-
})()`;
|
|
256
|
-
const result = await this.evaluate(dismissExpr, { cwd: vaultPath });
|
|
256
|
+
const result = await this.evaluate(import_dismiss_trust_dialog.DISMISS_TRUST_DIALOG_EXPR, { cwd: vaultPath });
|
|
257
257
|
if (result === "true") {
|
|
258
258
|
(0, import_log.log)('[cli-transport] Dismissed "Do you trust the author" dialog.');
|
|
259
259
|
}
|
|
@@ -290,8 +290,9 @@ ${diagnostics}`);
|
|
|
290
290
|
*/
|
|
291
291
|
async ensureObsidianRunningAndRetry(command, cwd) {
|
|
292
292
|
(0, import_log.log)("[cli-transport] Obsidian is not running. Starting Obsidian...");
|
|
293
|
+
const launchCommand = await getObsidianLaunchCommand();
|
|
293
294
|
try {
|
|
294
|
-
await (0, import_exec.exec)(
|
|
295
|
+
await (0, import_exec.exec)(launchCommand, { isQuiet: true });
|
|
295
296
|
} catch {
|
|
296
297
|
}
|
|
297
298
|
(0, import_log.log)(`[cli-transport] Polling for Obsidian CLI (timeout=${String(AUTO_START_TIMEOUT_IN_MILLISECONDS)}ms)...`);
|
|
@@ -455,15 +456,12 @@ function getKillObsidianCommand() {
|
|
|
455
456
|
}
|
|
456
457
|
return "pkill -f Obsidian";
|
|
457
458
|
}
|
|
458
|
-
function getObsidianLaunchCommand() {
|
|
459
|
+
async function getObsidianLaunchCommand() {
|
|
460
|
+
const exePath = await (0, import_obsidian_executable.resolveObsidianExecutable)();
|
|
459
461
|
if (import_node_process.default.platform === "win32") {
|
|
460
|
-
|
|
461
|
-
return `start "" "${localAppData}\\Programs\\Obsidian\\Obsidian.exe"`;
|
|
462
|
-
}
|
|
463
|
-
if (import_node_process.default.platform === "darwin") {
|
|
464
|
-
return "/Applications/Obsidian.app/Contents/MacOS/Obsidian &";
|
|
462
|
+
return `start "" "${exePath}"`;
|
|
465
463
|
}
|
|
466
|
-
return "
|
|
464
|
+
return `"${exePath}" &`;
|
|
467
465
|
}
|
|
468
466
|
function getOpenUriCommand(uri) {
|
|
469
467
|
if (import_node_process.default.platform === "win32") {
|
|
@@ -505,4 +503,4 @@ async function openVaultViaUri(vaultPath) {
|
|
|
505
503
|
DesktopCliTransport,
|
|
506
504
|
invokeAndWriteResult
|
|
507
505
|
});
|
|
508
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9uLWV4cHJlc3Npb24uY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL25vb3AuY2pzJztcbmltcG9ydCB7XG4gIGVuYWJsZUNsaUluQ29uZmlnLFxuICBnZXRBbnlSZWdpc3RlcmVkVmF1bHRQYXRoLFxuICBnZXRSZWdpc3RlcmVkVmF1bHRzLFxuICBnZXRWYXVsdElkLFxuICBpc0NsaUVuYWJsZWQsXG4gIGlzVmF1bHRPcGVuLFxuICBpc1ZhdWx0UmVnaXN0ZXJlZCxcbiAgcmVnaXN0ZXJWYXVsdEluQ29uZmlnLFxuICByZW1vdmVWYXVsdEZyb21Db25maWdcbn0gZnJvbSAnLi9vYnNpZGlhbi1jb25maWcuY2pzJztcbmltcG9ydCB7IHNlcmlhbGl6ZUVycm9yIH0gZnJvbSAnLi9zZXJpYWxpemUtZXJyb3IuY2pzJztcblxuaW50ZXJmYWNlIEV4ZWN1dGVTY3JpcHRGaWxlRnNQcm9taXNlcyB7XG4gIGFjY2VzcyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICByZWFkRmlsZShwYXRoOiBzdHJpbmcsIGVuY29kaW5nOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbmludGVyZmFjZSBJbnZva2VBbmRXcml0ZVJlc3VsdEZzUHJvbWlzZXMge1xuICB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBkYXRhOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRQYXJhbXMge1xuICBldmFsdWF0ZSgpOiBQcm9taXNlPHVua25vd24+O1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNlcmlhbGl6ZUVycm9yKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgd3JpdHRlbiBieSB0aGUgdGVtcG9yYXJ5IHNjcmlwdCBmaWxlLlxuICpcbiAqIC0gYHsgdmFsdWU6IHN0cmluZywgdHlwZTogJ2Vycm9yJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIGVycm9yIG1lc3NhZ2UuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ251bGwnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgbnVsbGAuXG4gKiAtIGB7IHZhbHVlOiAnJywgdHlwZTogJ3VuZGVmaW5lZCcgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgeyB2YWx1ZTogc3RyaW5nIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBhIHN0cmluZyB2YWx1ZSAobm8gYHR5cGVgIGZpZWxkKS5cbiAqL1xudHlwZSBTY3JpcHRSZXN1bHRFbnZlbG9wZSA9XG4gIHwgeyB0eXBlOiAnZXJyb3InIHwgJ251bGwnIHwgJ3VuZGVmaW5lZCc7IHZhbHVlOiBzdHJpbmcgfVxuICB8IHsgdmFsdWU6IHN0cmluZyB9O1xuXG5jb25zdCBVTkFCTEVfVE9fRklORF9PQlNJRElBTiA9ICd1bmFibGUgdG8gZmluZCBPYnNpZGlhbic7XG5jb25zdCBBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbmNvbnN0IEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwMDAwO1xuY29uc3QgVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMTAwMDtcbmNvbnN0IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwMDtcblxuaW50ZXJmYWNlIEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMge1xuICBjb21tYW5kOiBzdHJpbmdbXTtcbiAgY3dkOiBzdHJpbmc7XG4gIGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIHJlc3VsdFBhdGg6IHN0cmluZztcbiAgc2NyaXB0Q29udGVudDogc3RyaW5nO1xuICBzY3JpcHRQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVHJhbnNwb3J0IHRoYXQgY29tbXVuaWNhdGVzIHdpdGggRGVza3RvcCBPYnNpZGlhbiB2aWEgdGhlIGBvYnNpZGlhbiBldmFsYCBDTEkgY29tbWFuZFxuICogYW5kIG1hbmFnZXMgdmF1bHRzIHZpYSBFbGVjdHJvbiBJUEMuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZXNrdG9wQ2xpVHJhbnNwb3J0IGltcGxlbWVudHMgT2JzaWRpYW5UcmFuc3BvcnQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB0cmFuc3BvcnQgaXMgZm9yIGEgbW9iaWxlIHBsYXRmb3JtLiBBbHdheXMgYGZhbHNlYCBmb3IgdGhpcyB0cmFuc3BvcnQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNNb2JpbGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiB2aWEgYG9ic2lkaWFuIGV2YWxgLlxuICAgKlxuICAgKiBXcml0ZXMgdGhlIGV4cHJlc3Npb24gdG8gYSB0ZW1wb3JhcnkgYC5janNgIGZpbGUgYW5kIGV4ZWN1dGVzIGEgdGlueVxuICAgKiBgcmVxdWlyZSgpLmludm9rZSgpYCBjYWxsIHZpYSB0aGUgQ0xJLiBUaGUgcmVzdWx0IGlzIHdyaXR0ZW4gdG8gYVxuICAgKiBgLnJlc3VsdC5qc29uYCBmaWxlIGJ5IHRoZSBzY3JpcHQsIGF2b2lkaW5nIENMSSBzdGRvdXQgc2l6ZSBsaW1pdHNcbiAgICogYW5kIElQQyBidWZmZXIgaXNzdWVzLlxuICAgKlxuICAgKiBIYW5kbGVzIGF1dG8tc3RhcnQ6IGlmIE9ic2lkaWFuIGlzIG5vdCBydW5uaW5nLCBsYXVuY2hlcyBpdCB2aWEgVVJJIHByb3RvY29sXG4gICAqIGFuZCByZXRyaWVzIHVudGlsIGl0IGJlY29tZXMgYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRXZhbHVhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBUaGUgbm9ybWFsaXplZCByZXN1bHQgc3RyaW5nICh0cmFuc3BvcnQtc3BlY2lmaWMgcHJlZml4ZXMgc3RyaXBwZWQpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlKGV4cHJlc3Npb246IHN0cmluZywgb3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICBjb25zdCBzY3JpcHRJZCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgY29uc3Qgc2NyaXB0RGlyID0gam9pbih0bXBkaXIoKSwgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnKTtcbiAgICBjb25zdCBzY3JpcHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5qc2ApO1xuICAgIGNvbnN0IHJlc3VsdFBhdGggPSBqb2luKHNjcmlwdERpciwgYCR7c2NyaXB0SWR9LnJlc3VsdC5qc29uYCk7XG5cbiAgICBhd2FpdCBta2RpcihzY3JpcHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgc2NyaXB0Q29udGVudCA9IGJ1aWxkU2NyaXB0RmlsZShleHByZXNzaW9uLCByZXN1bHRQYXRoKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoc2NyaXB0UGF0aCwgc2NyaXB0Q29udGVudCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FmZVNjcmlwdFBhdGggPSBzY3JpcHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIGNvbnN0IGNsaUV4cHIgPSBgKCR7Z2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKGV4ZWN1dGVTY3JpcHRGaWxlKX0pKCR7SlNPTi5zdHJpbmdpZnkoc2FmZVNjcmlwdFBhdGgpfSlgO1xuICAgICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQob3B0aW9ucy5jd2QpO1xuICAgICAgY29uc3QgY29tbWFuZCA9IFsnb2JzaWRpYW4nLCAuLi4odmF1bHRJZCA/IFtgdmF1bHQ9JHt2YXVsdElkfWBdIDogW10pLCAnZXZhbCcsICctLWFsbG93LWZvY3VzLXN0ZWFsJywgYGNvZGU9JHtjbGlFeHByfWBdO1xuXG4gICAgICBsZXQgZXhlY1Jlc3VsdDogRXhlY1Jlc3VsdCB8IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNSZXN1bHQgPSBhd2FpdCBleGVjKGNvbW1hbmQsIHtcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGlzUXVpZXQ6IHRydWUsXG4gICAgICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWUsXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHJlc3VsdFBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gYXdhaXQgYnVpbGREaWFnbm9zdGljcyh7XG4gICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICAgICAgICAgIGV4ZWNSZXN1bHQsXG4gICAgICAgICAgcmVzdWx0UGF0aCxcbiAgICAgICAgICBzY3JpcHRDb250ZW50LFxuICAgICAgICAgIHNjcmlwdFBhdGhcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGRpZCBub3QgZXhlY3V0ZSBmb3IgcGF0aDogJHtvcHRpb25zLmN3ZH1cXG4ke2RpYWdub3N0aWNzfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRTdHIgPSBhd2FpdCByZWFkRmlsZShyZXN1bHRQYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHIpIGFzIFNjcmlwdFJlc3VsdEVudmVsb3BlO1xuXG4gICAgICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTY3JpcHQgZXJyb3IgaW4gT2JzaWRpYW4gZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9OiAke2VudmVsb3BlLnZhbHVlfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGVudmVsb3BlLnZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB1bmxpbmsoc2NyaXB0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgICBhd2FpdCB1bmxpbmsocmVzdWx0UGF0aCkuY2F0Y2gobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgQ0xJLXNwZWNpZmljIHByZWZsaWdodCBjaGVja3MuXG4gICAqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWQsIENMSSBpcyBlbmFibGVkIGluIE9ic2lkaWFuIHNldHRpbmdzLFxuICAgKiBhbmQgdGhlIGBvYnNpZGlhbmAgQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gUEFUSC4gSWYgdGhlIHZhdWx0IGlzIHJlZ2lzdGVyZWRcbiAgICogYnV0IG5vdCBvcGVuLCBvcGVucyBpdCB2aWEgVVJJIHByb3RvY29sIGFuZCBwb2xscyB1bnRpbCBpdCBpcyByZWFkeS5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcHJlZmxpZ2h0Q2hlY2sodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBSdW5uaW5nIHByZWZsaWdodCBjaGVjayBmb3IgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGlmICghaXNWYXVsdFJlZ2lzdGVyZWQodmF1bHRQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVmF1bHQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gT2JzaWRpYW46ICR7dmF1bHRQYXRofS4gUmVnaXN0ZXIgdGhlIHZhdWx0IGZpcnN0IHdpdGggcmVnaXN0ZXJWYXVsdCgpIG9yIFRlbXBWYXVsdC5yZWdpc3RlcigpLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0NsaUVuYWJsZWQoKSkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ0xJIGlzIGRpc2FibGVkIGluIG9ic2lkaWFuLmpzb24uIEVuYWJsaW5nIGFuZCByZXN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG4gICAgICBlbmFibGVDbGlJbkNvbmZpZygpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0YXJ0T2JzaWRpYW4odmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmFzc2VydENsaUF2YWlsYWJsZSgpO1xuXG4gICAgaWYgKCFpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyByZWdpc3RlcmVkIGJ1dCBub3Qgb3BlbjogJHt2YXVsdFBhdGh9LiBPcGVuaW5nIHZpYSBVUkkuLi5gKTtcbiAgICAgIGF3YWl0IG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGgpO1xuICAgICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFByZWZsaWdodCBjaGVjayBwYXNzZWQuJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgdmF1bHQgaW4gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UgdmlhIEVsZWN0cm9uIElQQy5cbiAgICpcbiAgICogVXNlcyBgdmF1bHQtb3BlbmAgSVBDIHRvIHJlZ2lzdGVyIGFuZCBvcGVuIHRoZSB2YXVsdCwgdGhlbiBwb2xscyB1bnRpbFxuICAgKiB0aGUgdmF1bHQncyBDTEkgaXMgcmVhZHkgYW5kIGBnZXRCYXNlUGF0aCgpYCBtYXRjaGVzIGB2YXVsdFBhdGhgLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUmVnaXN0ZXJpbmcgdmF1bHQ6ICR7dmF1bHRQYXRofWApO1xuICAgIGNvbnN0IGV4aXN0aW5nVmF1bHRQYXRoID0gZ2V0QW55UmVnaXN0ZXJlZFZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKGV4aXN0aW5nVmF1bHRQYXRoKSB7XG4gICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXhpc3RpbmdWYXVsdFBhdGgpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLmlwY1NlbmRTeW5jKCR7SlNPTi5zdHJpbmdpZnkoeyBhcmdzOiBbdmF1bHRQYXRoLCBmYWxzZV0sIGNoYW5uZWw6ICd2YXVsdC1vcGVuJyB9KX0pYDtcbiAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUocmVnaXN0ZXJFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIGV4aXN0aW5nVmF1bHRQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gTm8gZXhpc3RpbmcgdmF1bHQgcmVnaXN0ZXJlZC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnJlZ2lzdGVycyBhIHZhdWx0IGZyb20gdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2UuXG4gICAqXG4gICAqIFNjaGVkdWxlcyB0aGUgdmF1bHQgd2luZG93IHRvIGNsb3NlLCB3YWl0cywgdGhlbiByZW1vdmVzIHRoZSB2YXVsdFxuICAgKiBmcm9tIHRoZSByZWdpc3RyeSB2aWEgYHZhdWx0LXJlbW92ZWAgSVBDLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyB1bnJlZ2lzdGVyVmF1bHQodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBVbnJlZ2lzdGVyaW5nIHZhdWx0OiBjbG9zaW5nIHdpbmRvdyBmb3IgJHt2YXVsdFBhdGh9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKGRlc3Ryb3lFeHByLCB7IGN3ZDogdmF1bHRQYXRoLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IFZBVUxUX0VWQUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBXaW5kb3cgZGVzdHJveSBjb21tYW5kIHNlbnQuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFdpbmRvdyBkZXN0cm95IGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCA9IGdldEFueVJlZ2lzdGVyZWRWYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV4aXN0aW5nVmF1bHRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBleGlzdGluZ1ZhdWx0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXhpc3RpbmdWYXVsdEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIGV4aXN0aW5nIHZhdWx0IHRvIHRhcmdldCBmb3IgcmVtb3ZhbCBJUEMgXHUyMDE0IHJlbW92aW5nIGRpcmVjdGx5IGZyb20gb2JzaWRpYW4uanNvbi4nKTtcbiAgICAgICAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnKHZhdWx0UGF0aCk7XG4gICAgICB9XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCByZW1vdmVkIGZyb20gcmVnaXN0cnkuJyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlZ2lzdHJ5IHJlbW92YWwgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0gUEFUSC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXNzZXJ0Q2xpQXZhaWxhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInID8gJ3doZXJlLmV4ZSBvYnNpZGlhbicgOiAnd2hpY2ggb2JzaWRpYW4nO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgaXNRdWlldDogdHJ1ZSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2JzaWRpYW4gQ0xJIGlzIG5vdCBhdmFpbGFibGUuIEVuc3VyZSBPYnNpZGlhbiBpcyBpbnN0YWxsZWQgYW5kIGl0cyBDTEkgaXMgaW4geW91ciBQQVRILicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgaWYgcHJlc2VudC5cbiAgICpcbiAgICogQ2xpY2tzIHRoZSBcIlRydXN0IGF1dGhvciBhbmQgZW5hYmxlIHBsdWdpbnNcIiBidXR0b24gKGAubW9kLWN0YWApIGluc2lkZSBhbnlcbiAgICogbW9kYWwgd2hvc2UgdGV4dCBpbmNsdWRlcyBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIuIFRoaXMgaXMgbmVlZGVkIHdoZW4gYVxuICAgKiB2YXVsdCB3aXRoIGNvbW11bml0eSBwbHVnaW5zIGlzIG9wZW5lZCB3aXRob3V0IGEgcHJpb3IgYGVuYWJsZS1wbHVnaW4tPGlkPmBcbiAgICogZW50cnkgaW4gbG9jYWxTdG9yYWdlIChlLmcuLCB0aGUgdmVyeSBmaXJzdCB2YXVsdCByZWdpc3RlcmVkIHZpYSBjb25maWcgZmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byBldmFsdWF0ZSBpbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRoaXMsIHZhdWx0UGF0aCk7XG4gICAgY29uc3QgZGlzbWlzc0V4cHIgPSBgKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1jb250YWluZXInKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChtb2RhbHNbaV0udGV4dENvbnRlbnQuaW5jbHVkZXMoJ0RvIHlvdSB0cnVzdCB0aGUgYXV0aG9yJykpIHtcbiAgICAgICAgICB2YXIgYnRuID0gbW9kYWxzW2ldLnF1ZXJ5U2VsZWN0b3IoJy5tb2QtY3RhJyk7XG4gICAgICAgICAgaWYgKGJ0bikgeyBidG4uY2xpY2soKTsgcmV0dXJuIHRydWU7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pKClgO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoZGlzbWlzc0V4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgaWYgKHJlc3VsdCA9PT0gJ3RydWUnKSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBEaXNtaXNzZWQgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvclwiIGRpYWxvZy4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBgZW5hYmxlLXBsdWdpbi08dmF1bHRJZD5gIGluIE9ic2lkaWFuJ3MgbG9jYWxTdG9yYWdlIHRvIHByZXZlbnRcbiAgICogdGhlIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3Igb2YgdGhpcyB2YXVsdD9cIiBkaWFsb2cgZnJvbSBhcHBlYXJpbmdcbiAgICogd2hlbiBhIHZhdWx0IHdpdGggY29tbXVuaXR5IHBsdWdpbnMgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICpcbiAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGB2YXVsdC1vcGVuYCBJUEMgKHNvIHRoZSB2YXVsdCBJRCBleGlzdHMgaW5cbiAgICogYG9ic2lkaWFuLmpzb25gKSBhbmQgYmVmb3JlIHRoZSBuZXcgdmF1bHQgd2luZG93IGZpbmlzaGVzIGxvYWRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKiBAcGFyYW0gZXZhbFRhcmdldFZhdWx0UGF0aCAtIFRoZSB2YXVsdCBwYXRoIHRvIHVzZSBhcyBldmFsIHRhcmdldCAoYW4gZXhpc3RpbmcsIGxvYWRlZCB2YXVsdCkuXG4gICAqICAgbG9jYWxTdG9yYWdlIGlzIHNoYXJlZCBhY3Jvc3MgYWxsIE9ic2lkaWFuIHdpbmRvd3MgKHNhbWUgRWxlY3Ryb24gb3JpZ2luKSwgc28gdGhlXG4gICAqICAgYGxvY2FsU3RvcmFnZS5zZXRJdGVtYCBjYWxsIGNhbiBydW4gaW4gYW55IGxvYWRlZCB2YXVsdCB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGg6IHN0cmluZywgZXZhbFRhcmdldFZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBpZiAoIXZhdWx0SWQpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENvdWxkIG5vdCBmaW5kIHZhdWx0IElEIFx1MjAxNCBza2lwcGluZyBsb2NhbFN0b3JhZ2UgdHJ1c3QgZmxhZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgZXZhbFRhcmdldFZhdWx0UGF0aCk7XG4gICAgY29uc3QgZW5hYmxlRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5zZXRMb2NhbFN0b3JhZ2VJdGVtKCR7SlNPTi5zdHJpbmdpZnkoeyBrZXk6IGBlbmFibGUtcGx1Z2luLSR7dmF1bHRJZH1gLCB2YWx1ZTogJ3RydWUnIH0pfSlgO1xuICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZW5hYmxlRXhwciwgeyBjd2Q6IGV2YWxUYXJnZXRWYXVsdFBhdGggfSk7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gU2V0IGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfSBpbiBsb2NhbFN0b3JhZ2UuYCk7XG4gIH1cblxuICAvKipcbiAgICogTGF1bmNoZXMgT2JzaWRpYW4gYmluYXJ5IGFuZCByZXRyaWVzIHRoZSBldmFsIHVudGlsIGl0IHJlc3BvbmRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29tbWFuZCAtIFRoZSBDTEkgY29tbWFuZCBhcnJheSB0byByZXRyeS5cbiAgICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZDogc3RyaW5nW10sIGN3ZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gaXMgbm90IHJ1bm5pbmcuIFN0YXJ0aW5nIE9ic2lkaWFuLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIGxhdW5jaCBjb21tYW5kIG1heSBmYWlsIG9uIHNvbWUgc3lzdGVtcyBcdTIwMTQgd2UnbGwgc3RpbGwgdHJ5IHBvbGxpbmcuXG4gICAgfVxuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgT2JzaWRpYW4gQ0xJICh0aW1lb3V0PSR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgYXdhaXQgZGVsYXkoQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBleGVjKGNvbW1hbmQsIHsgY3dkLCBpc1F1aWV0OiB0cnVlIH0pO1xuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBDTEkgcmVzcG9uZGVkLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgICBpZiAoIW1lc3NhZ2UuaW5jbHVkZXMoVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4pKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gT2JzaWRpYW4gbm90IHJlYWR5IHlldCwgcmV0cnlpbmcuLi4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYE9ic2lkaWFuIGRpZCBub3Qgc3RhcnQgd2l0aGluICR7U3RyaW5nKEFVVE9fU1RBUlRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvbGxzIHVudGlsIHRoZSB2YXVsdCBpcyByZWFkeSBhbmQgcmVzcG9uZGluZyB0byBldmFsIGNhbGxzLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHZhdWx0IGZvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwb2xsRXhwciA9ICd3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5wb2xsVmF1bHRCYXNlUGF0aCgpJztcblxuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFBvbGxpbmcgZm9yIHZhdWx0IHJlYWRpbmVzcyAodGltZW91dD0ke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gKTtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyBWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTO1xuICAgIGxldCBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNCb290c3RyYXBwZWQpIHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBhd2FpdCB0aGlzLmV2YWx1YXRlKHBvbGxFeHByLCB7IGN3ZDogdmF1bHRQYXRoIH0pO1xuICAgICAgICBpZiAoSlNPTi5wYXJzZShiYXNlUGF0aCkgPT09IHZhdWx0UGF0aCkge1xuICAgICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGlzIHJlYWR5LicpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFZhdWx0IG5vdCByZWFkeSB5ZXQgXHUyMDE0IG5hbWVzcGFjZSBtYXkgbm90IGJlIGJvb3RzdHJhcHBlZCB5ZXQgZWl0aGVyLlxuICAgICAgICBpc0Jvb3RzdHJhcHBlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgYXdhaXQgZGVsYXkoVkFVTFRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IGF0ICR7dmF1bHRQYXRofSBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcoVkFVTFRfUE9MTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN0YXJ0cyBPYnNpZGlhbiBieSBraWxsaW5nIHRoZSBydW5uaW5nIHByb2Nlc3MgYW5kIHJlbGF1bmNoaW5nIGl0LlxuICAgKlxuICAgKiBVc2VkIHdoZW4gYSBjb25maWcgY2hhbmdlIChsaWtlIGVuYWJsaW5nIENMSSkgcmVxdWlyZXMgYSByZXN0YXJ0IHRvIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGZvciBwb2xsaW5nIGFmdGVyIHJlc3RhcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3RhcnRPYnNpZGlhbih2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIEtpbGxpbmcgT2JzaWRpYW4gcHJvY2Vzcy4uLicpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBleGVjKGdldEtpbGxPYnNpZGlhbkNvbW1hbmQoKSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gUHJvY2VzcyBtYXkgbm90IGJlIHJ1bm5pbmcgXHUyMDE0IHRoYXQncyBmaW5lLlxuICAgIH1cblxuICAgIGF3YWl0IGRlbGF5KFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICBjb25zdCByZXN0YXJ0VmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgICBjb25zdCBjb21tYW5kID0gWydvYnNpZGlhbicsIC4uLihyZXN0YXJ0VmF1bHRJZCA/IFtgdmF1bHQ9JHtyZXN0YXJ0VmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnY29kZT1cIjFcIiddO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgdmF1bHRQYXRoKTtcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhbiBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhIEpTT04gZmlsZS5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBpbnZvY2F0aW9uIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnZva2VBbmRXcml0ZVJlc3VsdChwYXJhbXM6IEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSB3aW5kb3cuYXBwIGlzIHNldCBieSBPYnNpZGlhbiBhdCBydW50aW1lLlxuICBjb25zdCBmc1Byb21pc2VzID0gUmVmbGVjdC5nZXQod2luZG93LmFwcC52YXVsdC5hZGFwdGVyLCAnZnNQcm9taXNlcycpIGFzIEludm9rZUFuZFdyaXRlUmVzdWx0RnNQcm9taXNlcztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZXZhbHVhdGUoKTtcbiAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnLCB2YWx1ZTogJycgfSkpO1xuICAgIH0gZWxzZSBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnbnVsbCcsIHZhbHVlOiAnJyB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tYmFzZS10by1zdHJpbmcgLS0gSW50ZW50aW9uYWw6IHJlc3VsdCBpcyBhbiBhcmJpdHJhcnkgdmFsdWUgZnJvbSB0aGUgZXZhbHVhdGVkIGV4cHJlc3Npb24uXG4gICAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogU3RyaW5nKHJlc3VsdCkgfSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHBhcmFtcy5zZXJpYWxpemVFcnJvcihlcnIpIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGRldGFpbGVkIGRpYWdub3N0aWMgc3RyaW5nIGZvciB0aGUgXCJTY3JpcHQgZGlkIG5vdCBleGVjdXRlXCIgZXJyb3IuXG4gKlxuICogUGVyZm9ybXMgbGl2ZSBlbnZpcm9ubWVudCBjaGVja3MgKHByb2Nlc3MgbGlzdCwgdmF1bHQgcmVnaXN0cnksIENMSSBjb25maWcpXG4gKiBhbmQgaW5jbHVkZXMgdGhlIGNvbW1hbmQsIGV4ZWMgb3V0cHV0LCBhbmQgc2NyaXB0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkaWFnbm9zdGljIHBhcmFtZXRlcnMuXG4gKiBAcmV0dXJucyBBIGZvcm1hdHRlZCBkaWFnbm9zdGljIHN0cmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGREaWFnbm9zdGljcyhwYXJhbXM6IEJ1aWxkRGlhZ25vc3RpY3NQYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICBsaW5lcy5wdXNoKGAgIENvbW1hbmQ6ICR7cGFyYW1zLmNvbW1hbmQuam9pbignICcpfWApO1xuICBsaW5lcy5wdXNoKGAgIFdvcmtpbmcgZGlyZWN0b3J5OiAke3BhcmFtcy5jd2R9YCk7XG4gIGxpbmVzLnB1c2goYCAgU2NyaXB0IHBhdGg6ICR7cGFyYW1zLnNjcmlwdFBhdGh9YCk7XG4gIGxpbmVzLnB1c2goYCAgRXhwZWN0ZWQgcmVzdWx0IGZpbGU6ICR7cGFyYW1zLnJlc3VsdFBhdGh9YCk7XG5cbiAgaWYgKHBhcmFtcy5leGVjUmVzdWx0KSB7XG4gICAgbGluZXMucHVzaChgICBFeGl0IGNvZGU6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUgPT09IG51bGwgPyAnKG51bGwgXHUyMDE0IHByb2Nlc3MgZGlkIG5vdCBleGl0IG5vcm1hbGx5KScgOiBTdHJpbmcocGFyYW1zLmV4ZWNSZXN1bHQuZXhpdENvZGUpfWApO1xuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5leGl0U2lnbmFsKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIEV4aXQgc2lnbmFsOiAke3BhcmFtcy5leGVjUmVzdWx0LmV4aXRTaWduYWx9YCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0ZG91dDogJHtwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpfWApO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKSkge1xuICAgICAgbGluZXMucHVzaChgICBzdGRlcnI6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuc3RkZXJyLnRyaW0oKX1gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRvdXQudHJpbSgpICYmICFwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKCcgIHN0ZG91dC9zdGRlcnI6IChlbXB0eSknKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICBleGVjIHJlc3VsdDogKG5vdCBhdmFpbGFibGUgXHUyMDE0IE9ic2lkaWFuIHdhcyBhdXRvLXN0YXJ0ZWQgYW5kIHJldHJpZWQpJyk7XG4gIH1cblxuICBsaW5lcy5wdXNoKCdFbnZpcm9ubWVudCBjaGVja3M6Jyk7XG4gIGxpbmVzLnB1c2goYCAgT2JzaWRpYW4gcnVubmluZzogJHthd2FpdCBpc09ic2lkaWFuUnVubmluZygpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIENMSSBlbmFibGVkIGluIG9ic2lkaWFuLmpzb246ICR7aXNDbGlFbmFibGVkKCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgVmF1bHQgcmVnaXN0ZXJlZDogJHtpc1ZhdWx0UmVnaXN0ZXJlZChwYXJhbXMuY3dkKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBTY3JpcHQgZmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhwYXJhbXMuc2NyaXB0UGF0aCkgPyAneWVzJyA6ICdubyAoYWxyZWFkeSBjbGVhbmVkIHVwKSd9YCk7XG4gIGxpbmVzLnB1c2goYCAgUmVzdWx0IGZpbGUgZXhpc3RzOiAke2V4aXN0c1N5bmMocGFyYW1zLnJlc3VsdFBhdGgpID8gJ3llcycgOiAnbm8nfWApO1xuXG4gIGNvbnN0IHJlZ2lzdGVyZWRWYXVsdHMgPSBnZXRSZWdpc3RlcmVkVmF1bHRzKCk7XG4gIGlmIChyZWdpc3RlcmVkVmF1bHRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6IChub25lKScpO1xuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJyAgUmVnaXN0ZXJlZCB2YXVsdHM6Jyk7XG4gICAgZm9yIChjb25zdCB2YXVsdCBvZiByZWdpc3RlcmVkVmF1bHRzKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgICAgLSAke3ZhdWx0LnBhdGh9IChvcGVuOiAke1N0cmluZyh2YXVsdC5vcGVuKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaChgICBTY3JpcHQgY29udGVudDpcXG4ke3BhcmFtcy5zY3JpcHRDb250ZW50fWApO1xuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGNvbnRlbnQgb2YgYSB0ZW1wb3Jhcnkgc2NyaXB0IGZpbGUuXG4gKlxuICogU2VyaWFsaXplcyB7QGxpbmsgaW52b2tlQW5kV3JpdGVSZXN1bHR9IGludG8gYSBzZWxmLWNvbnRhaW5lZCBJSUZFIHRoYXRcbiAqIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiwgd3JpdGVzIHRoZSByZXN1bHQgKG9yIGVycm9yKSB0byBgcmVzdWx0UGF0aGAuXG4gKlxuICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICogQHBhcmFtIHJlc3VsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgcmVzdWx0IGZpbGUuXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0IGZpbGUgY29udGVudC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRTY3JpcHRGaWxlKGV4cHJlc3Npb246IHN0cmluZywgcmVzdWx0UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZm5TdHIgPSBnZXRGdW5jdGlvbkV4cHJlc3Npb25TdHJpbmcoaW52b2tlQW5kV3JpdGVSZXN1bHQpO1xuICBjb25zdCBzZXJpYWxpemVFcnJvclN0ciA9IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhzZXJpYWxpemVFcnJvcik7XG4gIGNvbnN0IHJlc3VsdFBhdGhKc29uID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICByZXR1cm4gYCgke2ZuU3RyfSkoeyBldmFsdWF0ZTogYXN5bmMgKCkgPT4gKCR7ZXhwcmVzc2lvbn0pLCByZXN1bHRQYXRoOiAke3Jlc3VsdFBhdGhKc29ufSwgc2VyaWFsaXplRXJyb3I6ICR7c2VyaWFsaXplRXJyb3JTdHJ9IH0pYDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBnaXZlbiBkZWxheS5cbiAqXG4gKiBAcGFyYW0gbXMgLSBUaGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGRlbGF5LlxuICovXG5mdW5jdGlvbiBkZWxheShtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZWFkcyBhIHNjcmlwdCBmaWxlIGZyb20gZGlzaywgbG9ncyBpdHMgY29udGVudCwgYW5kIGV4ZWN1dGVzIGl0IHZpYSBgbmV3IEZ1bmN0aW9uYC5cbiAqXG4gKiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUuXG4gKlxuICogQHBhcmFtIHNjcmlwdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgc2NyaXB0IGZpbGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVTY3JpcHRGaWxlKHNjcmlwdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gd2luZG93LmFwcCBpcyBzZXQgYnkgT2JzaWRpYW4gYXQgcnVudGltZS5cbiAgY29uc3QgZnNQcm9taXNlcyA9IFJlZmxlY3QuZ2V0KHdpbmRvdy5hcHAudmF1bHQuYWRhcHRlciwgJ2ZzUHJvbWlzZXMnKSBhcyBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXM7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmc1Byb21pc2VzLmFjY2VzcyhzY3JpcHRQYXRoKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBmaWxlIG5vdCBmb3VuZDogJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cblxuICBjb25zdCBzY3JpcHQgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKHNjcmlwdFBhdGgsICd1dGYtOCcpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZSAtLSBEaWFnbm9zdGljIGxvZ2dpbmcgaW5zaWRlIE9ic2lkaWFuIHByb2Nlc3M7IG5vIGxvZ2dlciBhdmFpbGFibGUuXG4gIGNvbnNvbGUuZGVidWcoYEV4ZWN1dGluZyAke3NjcmlwdFBhdGh9OlxcbiR7c2NyaXB0fWApO1xuXG4gIGxldCBmbjogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWltcGxpZWQtZXZhbCwgbm8tbmV3LWZ1bmMgLS0gVGhlIHNjcmlwdCBpcyBhIHRydXN0ZWQsIHNlbGYtZ2VuZXJhdGVkIElJRkUgZXhwcmVzc2lvbi5cbiAgICBmbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7c2NyaXB0fWApIGFzICgpID0+IFByb21pc2U8dm9pZD47XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXJzaW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBmbigpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZXhlY3V0aW5nICR7c2NyaXB0UGF0aH1gLCB7IGNhdXNlIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBraWxsIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiAndGFza2tpbGwgL0lNIE9ic2lkaWFuLmV4ZSAvRic7XG4gIH1cblxuICByZXR1cm4gJ3BraWxsIC1mIE9ic2lkaWFuJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGxhdW5jaCB0aGUgT2JzaWRpYW4gYmluYXJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T2JzaWRpYW5MYXVuY2hDb21tYW5kKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgY29uc3QgbG9jYWxBcHBEYXRhID0gcHJvY2Vzcy5lbnZbJ0xPQ0FMQVBQREFUQSddID8/ICcnO1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7bG9jYWxBcHBEYXRhfVxcXFxQcm9ncmFtc1xcXFxPYnNpZGlhblxcXFxPYnNpZGlhbi5leGVcImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gJy9BcHBsaWNhdGlvbnMvT2JzaWRpYW4uYXBwL0NvbnRlbnRzL01hY09TL09ic2lkaWFuICYnO1xuICB9XG5cbiAgcmV0dXJuICdvYnNpZGlhbiAmJztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIG9wZW4gYSBVUkkuXG4gKlxuICogQHBhcmFtIHVyaSAtIFRoZSBVUkkgdG8gb3Blbi5cbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gZ2V0T3BlblVyaUNvbW1hbmQodXJpOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJykge1xuICAgIHJldHVybiBgc3RhcnQgXCJcIiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xuICAgIHJldHVybiBgb3BlbiBcIiR7dXJpfVwiYDtcbiAgfVxuXG4gIHJldHVybiBgeGRnLW9wZW4gXCIke3VyaX1cImA7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIE9ic2lkaWFuIHByb2Nlc3MgaXMgY3VycmVudGx5IHJ1bm5pbmcuXG4gKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGZvdW5kLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaXNPYnNpZGlhblJ1bm5pbmcoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyAndGFza2xpc3QgL0ZJIFwiSU1BR0VOQU1FIGVxIE9ic2lkaWFuLmV4ZVwiIC9OSCdcbiAgICA6ICdwZ3JlcCAtZiBPYnNpZGlhbic7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICAgIHJldHVybiBvdXRwdXQuaW5jbHVkZXMoJ09ic2lkaWFuLmV4ZScpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0LnRyaW0oKS5sZW5ndGggPiAwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBPcGVucyBhIHZhdWx0IGluIE9ic2lkaWFuIHVzaW5nIHRoZSBgb2JzaWRpYW46Ly9vcGVuYCBVUkkgcHJvdG9jb2wuXG4gKlxuICogVGhpcyB3b3JrcyB3aGV0aGVyIE9ic2lkaWFuIGlzIGFscmVhZHkgcnVubmluZyAoc2lnbmFscyBpdCB0byBvcGVuIHRoZSB2YXVsdClcbiAqIG9yIG5vdCAobGF1bmNoZXMgT2JzaWRpYW4gd2l0aCB0aGUgdmF1bHQpLiBUaGUgVVJJIHByb3RvY29sIGlzIGhhbmRsZWQgYnkgdGhlXG4gKiBPUywgd2hpY2ggcm91dGVzIGl0IHRvIHRoZSByZWdpc3RlcmVkIE9ic2lkaWFuIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5WYXVsdFZpYVVyaSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICBpZiAoIXZhdWx0SWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBvcGVuIHZhdWx0IHZpYSBVUkk6IHZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIG9ic2lkaWFuLmpzb246ICR7dmF1bHRQYXRofWApO1xuICB9XG4gIGNvbnN0IHVyaSA9IGBvYnNpZGlhbjovL29wZW4/dmF1bHQ9JHtlbmNvZGVVUklDb21wb25lbnQodmF1bHRJZCl9YDtcbiAgY29uc3QgY29tbWFuZCA9IGdldE9wZW5VcmlDb21tYW5kKHVyaSk7XG4gIGxvZyhgW2NsaS10cmFuc3BvcnRdIE9wZW5pbmcgdmF1bHQgdmlhIFVSSTogJHt1cml9YCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZXhlYyhjb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVVJJIG9wZW4gZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNBLHFCQUEyQjtBQUMzQixzQkFLTztBQUNQLHFCQUF1QjtBQUN2Qix1QkFBcUI7QUFDckIsMEJBQW9CO0FBUXBCLGtCQUFxQjtBQUNyQixpQ0FBNEM7QUFDNUMsaUJBQW9CO0FBQ3BCLGlDQUE0QztBQUM1QyxrQkFBcUI7QUFDckIsNkJBVU87QUFDUCw2QkFBK0I7QUE2Qi9CLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMkNBQTJDO0FBQ2pELE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sc0NBQXNDO0FBQzVDLE1BQU0scUNBQXFDO0FBQzNDLE1BQU0sb0NBQW9DO0FBQzFDLE1BQU0scUNBQXFDO0FBZXBDLE1BQU0sb0JBQWlEO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJNUMsV0FBVztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBaUIzQixNQUFhLFNBQVMsWUFBb0IsU0FBZ0Q7QUFDeEYsVUFBTSxjQUFjO0FBQ3BCLFVBQU0sV0FBVyxPQUFPLEtBQUssT0FBTyxDQUFDLEVBQUUsTUFBTSxXQUFXO0FBQ3hELFVBQU0sZ0JBQVksMkJBQUssdUJBQU8sR0FBRyw4QkFBOEI7QUFDL0QsVUFBTSxpQkFBYSx1QkFBSyxX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TztBQUNkLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixVQUFVLElBQUksRUFBRSxNQUFNLENBQUM7QUFBQSxFQUM1RDtBQUNGO0FBT0EsU0FBUyx5QkFBaUM7QUFDeEMsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPO0FBQ1Q7QUFPQSxTQUFTLDJCQUFtQztBQUMxQyxNQUFJLG9CQUFBQSxRQUFRLGFBQWEsU0FBUztBQUNoQyxVQUFNLGVBQWUsb0JBQUFBLFFBQVEsSUFBSSxjQUFjLEtBQUs7QUFDcEQsV0FBTyxhQUFhLFlBQVk7QUFBQSxFQUNsQztBQUVBLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUNUO0FBUUEsU0FBUyxrQkFBa0IsS0FBcUI7QUFDOUMsTUFBSSxvQkFBQUEsUUFBUSxhQUFhLFNBQVM7QUFDaEMsV0FBTyxhQUFhLEdBQUc7QUFBQSxFQUN6QjtBQUVBLE1BQUksb0JBQUFBLFFBQVEsYUFBYSxVQUFVO0FBQ2pDLFdBQU8sU0FBUyxHQUFHO0FBQUEsRUFDckI7QUFFQSxTQUFPLGFBQWEsR0FBRztBQUN6QjtBQU9BLGVBQWUsb0JBQXNDO0FBQ25ELFFBQU0sVUFBVSxvQkFBQUEsUUFBUSxhQUFhLFVBQ2pDLGlEQUNBO0FBQ0osTUFBSTtBQUNGLFVBQU0sU0FBUyxVQUFNLGtCQUFLLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUNwRCxRQUFJLG9CQUFBQSxRQUFRLGFBQWEsU0FBUztBQUNoQyxhQUFPLE9BQU8sU0FBUyxjQUFjO0FBQUEsSUFDdkM7QUFDQSxXQUFPLE9BQU8sS0FBSyxFQUFFLFNBQVM7QUFBQSxFQUNoQyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQVdBLGVBQWUsZ0JBQWdCLFdBQWtDO0FBQy9ELFFBQU0sY0FBVSxtQ0FBVyxTQUFTO0FBQ3BDLE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJLE1BQU0sd0VBQXdFLFNBQVMsRUFBRTtBQUFBLEVBQ3JHO0FBQ0EsUUFBTSxNQUFNLHlCQUF5QixtQkFBbUIsT0FBTyxDQUFDO0FBQ2hFLFFBQU0sVUFBVSxrQkFBa0IsR0FBRztBQUNyQyxzQkFBSSwwQ0FBMEMsR0FBRyxFQUFFO0FBQ25ELE1BQUk7QUFDRixjQUFNLGtCQUFLLFNBQVMsRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLEVBQ3ZDLFNBQVMsT0FBZ0I7QUFDdkIsd0JBQUksb0RBQWdELHVDQUFlLEtBQUssQ0FBQyxFQUFFO0FBQUEsRUFDN0U7QUFDRjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
506
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1kZXNrdG9wLWNsaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIERlc2t0b3AgQ0xJIHRyYW5zcG9ydCBcdTIwMTQgZXZhbHVhdGVzIGV4cHJlc3Npb25zIHZpYSBgb2JzaWRpYW4gZXZhbGAgYW5kIG1hbmFnZXNcbiAqIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIG1rZGlyLFxuICByZWFkRmlsZSxcbiAgdW5saW5rLFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0IH0gZnJvbSAnLi9leGVjLmNqcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQgeyBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSIH0gZnJvbSAnLi9kaXNtaXNzLXRydXN0LWRpYWxvZy5janMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5janMnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nIH0gZnJvbSAnLi9mdW5jdGlvbi1leHByZXNzaW9uLmNqcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZy5janMnO1xuaW1wb3J0IHsgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkIH0gZnJvbSAnLi9uYW1lc3BhY2UtYm9vdHN0cmFwLmNqcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi9ub29wLmNqcyc7XG5pbXBvcnQge1xuICBlbmFibGVDbGlJbkNvbmZpZyxcbiAgZ2V0QW55T3BlblZhdWx0UGF0aCxcbiAgZ2V0UmVnaXN0ZXJlZFZhdWx0cyxcbiAgZ2V0VmF1bHRJZCxcbiAgaXNDbGlFbmFibGVkLFxuICBpc1ZhdWx0T3BlbixcbiAgaXNWYXVsdFJlZ2lzdGVyZWQsXG4gIHJlZ2lzdGVyVmF1bHRJbkNvbmZpZyxcbiAgcmVtb3ZlVmF1bHRGcm9tQ29uZmlnXG59IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLmNqcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLmNqcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVFcnJvciB9IGZyb20gJy4vc2VyaWFsaXplLWVycm9yLmNqcyc7XG5cbmludGVyZmFjZSBFeGVjdXRlU2NyaXB0RmlsZUZzUHJvbWlzZXMge1xuICBhY2Nlc3MocGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhZEZpbGUocGF0aDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgSW52b2tlQW5kV3JpdGVSZXN1bHRGc1Byb21pc2VzIHtcbiAgd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuaW50ZXJmYWNlIEludm9rZUFuZFdyaXRlUmVzdWx0UGFyYW1zIHtcbiAgZXZhbHVhdGUoKTogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVzdWx0UGF0aDogc3RyaW5nO1xuICBzZXJpYWxpemVFcnJvcihlcnJvcjogdW5rbm93bik6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaXNjcmltaW5hdGVkIGVudmVsb3BlIHdyaXR0ZW4gYnkgdGhlIHRlbXBvcmFyeSBzY3JpcHQgZmlsZS5cbiAqXG4gKiAtIGB7IHZhbHVlOiBzdHJpbmcsIHR5cGU6ICdlcnJvcicgfWAgXHUyMDE0IHRoZSBleHByZXNzaW9uIHRocmV3OyBgdmFsdWVgIGlzIHRoZSBlcnJvciBtZXNzYWdlLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICdudWxsJyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYG51bGxgLlxuICogLSBgeyB2YWx1ZTogJycsIHR5cGU6ICd1bmRlZmluZWQnIH1gIFx1MjAxNCB0aGUgZXhwcmVzc2lvbiByZXR1cm5lZCBgdW5kZWZpbmVkYC5cbiAqIC0gYHsgdmFsdWU6IHN0cmluZyB9YCBcdTIwMTQgdGhlIGV4cHJlc3Npb24gcmV0dXJuZWQgYSBzdHJpbmcgdmFsdWUgKG5vIGB0eXBlYCBmaWVsZCkuXG4gKi9cbnR5cGUgU2NyaXB0UmVzdWx0RW52ZWxvcGUgPVxuICB8IHsgdHlwZTogJ2Vycm9yJyB8ICdudWxsJyB8ICd1bmRlZmluZWQnOyB2YWx1ZTogc3RyaW5nIH1cbiAgfCB7IHZhbHVlOiBzdHJpbmcgfTtcblxuY29uc3QgVU5BQkxFX1RPX0ZJTkRfT0JTSURJQU4gPSAndW5hYmxlIHRvIGZpbmQgT2JzaWRpYW4nO1xuY29uc3QgQVVUT19TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDIwMDA7XG5jb25zdCBBVVRPX1NUQVJUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzAwMDA7XG5jb25zdCBWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDAwMDtcbmNvbnN0IFZBVUxUX0NMT1NFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBWQVVMVF9FVkFMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTAwMDA7XG5cbmludGVyZmFjZSBCdWlsZERpYWdub3N0aWNzUGFyYW1zIHtcbiAgY29tbWFuZDogc3RyaW5nW107XG4gIGN3ZDogc3RyaW5nO1xuICBleGVjUmVzdWx0OiBFeGVjUmVzdWx0IHwgdW5kZWZpbmVkO1xuICByZXN1bHRQYXRoOiBzdHJpbmc7XG4gIHNjcmlwdENvbnRlbnQ6IHN0cmluZztcbiAgc2NyaXB0UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRyYW5zcG9ydCB0aGF0IGNvbW11bmljYXRlcyB3aXRoIERlc2t0b3AgT2JzaWRpYW4gdmlhIHRoZSBgb2JzaWRpYW4gZXZhbGAgQ0xJIGNvbW1hbmRcbiAqIGFuZCBtYW5hZ2VzIHZhdWx0cyB2aWEgRWxlY3Ryb24gSVBDLlxuICovXG5leHBvcnQgY2xhc3MgRGVza3RvcENsaVRyYW5zcG9ydCBpbXBsZW1lbnRzIE9ic2lkaWFuVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgdHJhbnNwb3J0IGlzIGZvciBhIG1vYmlsZSBwbGF0Zm9ybS4gQWx3YXlzIGBmYWxzZWAgZm9yIHRoaXMgdHJhbnNwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzTW9iaWxlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBhIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIGBvYnNpZGlhbiBldmFsYC5cbiAgICpcbiAgICogV3JpdGVzIHRoZSBleHByZXNzaW9uIHRvIGEgdGVtcG9yYXJ5IGAuY2pzYCBmaWxlIGFuZCBleGVjdXRlcyBhIHRpbnlcbiAgICogYHJlcXVpcmUoKS5pbnZva2UoKWAgY2FsbCB2aWEgdGhlIENMSS4gVGhlIHJlc3VsdCBpcyB3cml0dGVuIHRvIGFcbiAgICogYC5yZXN1bHQuanNvbmAgZmlsZSBieSB0aGUgc2NyaXB0LCBhdm9pZGluZyBDTEkgc3Rkb3V0IHNpemUgbGltaXRzXG4gICAqIGFuZCBJUEMgYnVmZmVyIGlzc3Vlcy5cbiAgICpcbiAgICogSGFuZGxlcyBhdXRvLXN0YXJ0OiBpZiBPYnNpZGlhbiBpcyBub3QgcnVubmluZywgbGF1bmNoZXMgaXQgdmlhIFVSSSBwcm90b2NvbFxuICAgKiBhbmQgcmV0cmllcyB1bnRpbCBpdCBiZWNvbWVzIGF2YWlsYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEV2YWx1YXRpb24gb3B0aW9ucy5cbiAgICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcmVzdWx0IHN0cmluZyAodHJhbnNwb3J0LXNwZWNpZmljIHByZWZpeGVzIHN0cmlwcGVkKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBldmFsdWF0ZShleHByZXNzaW9uOiBzdHJpbmcsIG9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgY29uc3Qgc2NyaXB0SWQgPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgIGNvbnN0IHNjcmlwdERpciA9IGpvaW4odG1wZGlyKCksICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nJyk7XG4gICAgY29uc3Qgc2NyaXB0UGF0aCA9IGpvaW4oc2NyaXB0RGlyLCBgJHtzY3JpcHRJZH0uanNgKTtcbiAgICBjb25zdCByZXN1bHRQYXRoID0gam9pbihzY3JpcHREaXIsIGAke3NjcmlwdElkfS5yZXN1bHQuanNvbmApO1xuXG4gICAgYXdhaXQgbWtkaXIoc2NyaXB0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSBidWlsZFNjcmlwdEZpbGUoZXhwcmVzc2lvbiwgcmVzdWx0UGF0aCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHNjcmlwdFBhdGgsIHNjcmlwdENvbnRlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhZmVTY3JpcHRQYXRoID0gc2NyaXB0UGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBjbGlFeHByID0gYCgke2dldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhleGVjdXRlU2NyaXB0RmlsZSl9KSgke0pTT04uc3RyaW5naWZ5KHNhZmVTY3JpcHRQYXRoKX0pYDtcbiAgICAgIGNvbnN0IHZhdWx0SWQgPSBnZXRWYXVsdElkKG9wdGlvbnMuY3dkKTtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgLi4uKHZhdWx0SWQgPyBbYHZhdWx0PSR7dmF1bHRJZH1gXSA6IFtdKSwgJ2V2YWwnLCAnLS1hbGxvdy1mb2N1cy1zdGVhbCcsIGBjb2RlPSR7Y2xpRXhwcn1gXTtcblxuICAgICAgbGV0IGV4ZWNSZXN1bHQ6IEV4ZWNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBleGVjUmVzdWx0ID0gYXdhaXQgZXhlYyhjb21tYW5kLCB7XG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBpc1F1aWV0OiB0cnVlLFxuICAgICAgICAgIHNob3VsZEluY2x1ZGVEZXRhaWxzOiB0cnVlLFxuICAgICAgICAgIC4uLihvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKFVOQUJMRV9UT19GSU5EX09CU0lESUFOKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlT2JzaWRpYW5SdW5uaW5nQW5kUmV0cnkoY29tbWFuZCwgb3B0aW9ucy5jd2QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzU3luYyhyZXN1bHRQYXRoKSkge1xuICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IGF3YWl0IGJ1aWxkRGlhZ25vc3RpY3Moe1xuICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgY3dkOiBvcHRpb25zLmN3ZCxcbiAgICAgICAgICBleGVjUmVzdWx0LFxuICAgICAgICAgIHJlc3VsdFBhdGgsXG4gICAgICAgICAgc2NyaXB0Q29udGVudCxcbiAgICAgICAgICBzY3JpcHRQYXRoXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNjcmlwdCBkaWQgbm90IGV4ZWN1dGUgZm9yIHBhdGg6ICR7b3B0aW9ucy5jd2R9XFxuJHtkaWFnbm9zdGljc31gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0U3RyID0gYXdhaXQgcmVhZEZpbGUocmVzdWx0UGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyKSBhcyBTY3JpcHRSZXN1bHRFbnZlbG9wZTtcblxuICAgICAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgICAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGVycm9yIGluIE9ic2lkaWFuIGZvciBwYXRoOiAke29wdGlvbnMuY3dkfTogJHtlbnZlbG9wZS52YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBlbnZlbG9wZS52YWx1ZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdW5saW5rKHNjcmlwdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgICAgYXdhaXQgdW5saW5rKHJlc3VsdFBhdGgpLmNhdGNoKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIENMSS1zcGVjaWZpYyBwcmVmbGlnaHQgY2hlY2tzLlxuICAgKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkLCBDTEkgaXMgZW5hYmxlZCBpbiBPYnNpZGlhbiBzZXR0aW5ncyxcbiAgICogYW5kIHRoZSBgb2JzaWRpYW5gIENMSSBiaW5hcnkgaXMgYXZhaWxhYmxlIGluIFBBVEguIElmIHRoZSB2YXVsdCBpcyByZWdpc3RlcmVkXG4gICAqIGJ1dCBub3Qgb3Blbiwgb3BlbnMgaXQgdmlhIFVSSSBwcm90b2NvbCBhbmQgcG9sbHMgdW50aWwgaXQgaXMgcmVhZHkuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHByZWZsaWdodENoZWNrKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUnVubmluZyBwcmVmbGlnaHQgY2hlY2sgZm9yIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBpZiAoIWlzVmF1bHRSZWdpc3RlcmVkKHZhdWx0UGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZhdWx0IGlzIG5vdCByZWdpc3RlcmVkIGluIE9ic2lkaWFuOiAke3ZhdWx0UGF0aH0uIFJlZ2lzdGVyIHRoZSB2YXVsdCBmaXJzdCB3aXRoIHJlZ2lzdGVyVmF1bHQoKSBvciBUZW1wVmF1bHQucmVnaXN0ZXIoKS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaXNDbGlFbmFibGVkKCkpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIENMSSBpcyBkaXNhYmxlZCBpbiBvYnNpZGlhbi5qc29uLiBFbmFibGluZyBhbmQgcmVzdGFydGluZyBPYnNpZGlhbi4uLicpO1xuICAgICAgZW5hYmxlQ2xpSW5Db25maWcoKTtcbiAgICAgIGF3YWl0IHRoaXMucmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDbGlBdmFpbGFibGUoKTtcblxuICAgIGlmICghaXNWYXVsdE9wZW4odmF1bHRQYXRoKSkge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVnaXN0ZXJlZCBidXQgbm90IG9wZW46ICR7dmF1bHRQYXRofS4gT3BlbmluZyB2aWEgVVJJLi4uYCk7XG4gICAgICBhd2FpdCBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMucG9sbFZhdWx0UmVhZHkodmF1bHRQYXRoKTtcbiAgICB9XG5cbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBQcmVmbGlnaHQgY2hlY2sgcGFzc2VkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHZhdWx0IGluIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBFbGVjdHJvbiBJUEMuXG4gICAqXG4gICAqIFVzZXMgYHZhdWx0LW9wZW5gIElQQyB0byByZWdpc3RlciBhbmQgb3BlbiB0aGUgdmF1bHQsIHRoZW4gcG9sbHMgdW50aWxcbiAgICogdGhlIHZhdWx0J3MgQ0xJIGlzIHJlYWR5IGFuZCBgZ2V0QmFzZVBhdGgoKWAgbWF0Y2hlcyBgdmF1bHRQYXRoYC5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJWYXVsdCh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFJlZ2lzdGVyaW5nIHZhdWx0OiAke3ZhdWx0UGF0aH1gKTtcbiAgICBjb25zdCBvcGVuVmF1bHRQYXRoID0gZ2V0QW55T3BlblZhdWx0UGF0aCgpO1xuXG4gICAgaWYgKG9wZW5WYXVsdFBhdGgpIHtcbiAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBvcGVuVmF1bHRQYXRoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyRXhwciA9IGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5pcGNTZW5kU3luYygke0pTT04uc3RyaW5naWZ5KHsgYXJnczogW3ZhdWx0UGF0aCwgZmFsc2VdLCBjaGFubmVsOiAndmF1bHQtb3BlbicgfSl9KWA7XG4gICAgICBhd2FpdCB0aGlzLmV2YWx1YXRlKHJlZ2lzdGVyRXhwciwgeyBjd2Q6IG9wZW5WYXVsdFBhdGggfSk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIG9wZW5WYXVsdFBhdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBObyBvcGVuIHZhdWx0IHRvIHRhcmdldC4gV3JpdGluZyB2YXVsdCBlbnRyeSBkaXJlY3RseSB0byBvYnNpZGlhbi5qc29uLi4uJyk7XG4gICAgICByZWdpc3RlclZhdWx0SW5Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IGVudHJ5IHdyaXR0ZW4uIE9wZW5pbmcgdmF1bHQgdmlhIFVSSSBwcm90b2NvbC4uLicpO1xuICAgICAgYXdhaXQgb3BlblZhdWx0VmlhVXJpKHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLnBvbGxWYXVsdFJlYWR5KHZhdWx0UGF0aCk7XG4gICAgICBhd2FpdCB0aGlzLmVuYWJsZVBsdWdpbnNJbkxvY2FsU3RvcmFnZSh2YXVsdFBhdGgsIHZhdWx0UGF0aCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5wb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc1RydXN0RGlhbG9nKHZhdWx0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgYSB2YXVsdCBmcm9tIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlLlxuICAgKlxuICAgKiBTY2hlZHVsZXMgdGhlIHZhdWx0IHdpbmRvdyB0byBjbG9zZSwgd2FpdHMsIHRoZW4gcmVtb3ZlcyB0aGUgdmF1bHRcbiAgICogZnJvbSB0aGUgcmVnaXN0cnkgdmlhIGB2YXVsdC1yZW1vdmVgIElQQy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdW5yZWdpc3RlclZhdWx0KHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVW5yZWdpc3RlcmluZyB2YXVsdDogY2xvc2luZyB3aW5kb3cgZm9yICR7dmF1bHRQYXRofS4uLmApO1xuICAgIGlmIChpc1ZhdWx0T3Blbih2YXVsdFBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodGhpcywgdmF1bHRQYXRoKTtcbiAgICAgICAgY29uc3QgZGVzdHJveUV4cHIgPSAnd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuZGVzdHJveUN1cnJlbnRXaW5kb3coKSc7XG4gICAgICAgIGF3YWl0IHRoaXMuZXZhbHVhdGUoZGVzdHJveUV4cHIsIHsgY3dkOiB2YXVsdFBhdGgsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgY29tbWFuZCBzZW50LicpO1xuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gV2luZG93IGRlc3Ryb3kgZmFpbGVkIChub24tZmF0YWwpOiAke3NlcmlhbGl6ZUVycm9yKGVycm9yKX1gKTtcbiAgICAgIH1cblxuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gV2FpdGluZyBmb3Igd2luZG93IHRvIGNsb3NlLi4uJyk7XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9DTE9TRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBWYXVsdCBpcyBub3Qgb3BlbiBcdTIwMTQgc2tpcHBpbmcgZGVzdHJveSAod291bGQgb3RoZXJ3aXNlIHNwYXduIGEgc3RyYXkgd2luZG93IHZpYSB0aGUgQ0xJIGV2YWwpLicpO1xuICAgIH1cblxuICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFJlbW92aW5nIHZhdWx0IGZyb20gcmVnaXN0cnkuLi4nKTtcbiAgICBjb25zdCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCA9IGdldEFueU9wZW5WYXVsdFBhdGgoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKGV2YWxUYXJnZXRGb3JSZW1vdmFsKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0Rm9yUmVtb3ZhbCk7XG4gICAgICAgIGNvbnN0IHJlbW92ZUV4cHIgPSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuaXBjU2VuZFN5bmMoJHtKU09OLnN0cmluZ2lmeSh7IGFyZ3M6IFt2YXVsdFBhdGhdLCBjaGFubmVsOiAndmF1bHQtcmVtb3ZlJyB9KX0pYDtcbiAgICAgICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShyZW1vdmVFeHByLCB7IGN3ZDogZXZhbFRhcmdldEZvclJlbW92YWwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogVkFVTFRfRVZBTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE5vIG9wZW4gdmF1bHQgdG8gdGFyZ2V0IGZvciByZW1vdmFsIElQQyBcdTIwMTQgcmVtb3ZpbmcgZGlyZWN0bHkgZnJvbSBvYnNpZGlhbi5qc29uLicpO1xuICAgICAgICByZW1vdmVWYXVsdEZyb21Db25maWcodmF1bHRQYXRoKTtcbiAgICAgIH1cbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIFZhdWx0IHJlbW92ZWQgZnJvbSByZWdpc3RyeS4nKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gVmF1bHQgcmVnaXN0cnkgcmVtb3ZhbCBmYWlsZWQgKG5vbi1mYXRhbCk6ICR7c2VyaWFsaXplRXJyb3IoZXJyb3IpfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgT2JzaWRpYW4gQ0xJIGJpbmFyeSBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBQQVRILlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhc3NlcnRDbGlBdmFpbGFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29tbWFuZCA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyAnd2hlcmUuZXhlIG9ic2lkaWFuJyA6ICd3aGljaCBvYnNpZGlhbic7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPYnNpZGlhbiBDTEkgaXMgbm90IGF2YWlsYWJsZS4gRW5zdXJlIE9ic2lkaWFuIGlzIGluc3RhbGxlZCBhbmQgaXRzIENMSSBpcyBpbiB5b3VyIFBBVEguJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc21pc3NlcyB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBpZiBwcmVzZW50LlxuICAgKlxuICAgKiBDbGlja3MgdGhlIFwiVHJ1c3QgYXV0aG9yIGFuZCBlbmFibGUgcGx1Z2luc1wiIGJ1dHRvbiAoYC5tb2QtY3RhYCkgaW5zaWRlIGFueVxuICAgKiBtb2RhbCB3aG9zZSB0ZXh0IGluY2x1ZGVzIFwiRG8geW91IHRydXN0IHRoZSBhdXRob3JcIi4gQWN0cyBhcyBhIHNhZmV0eSBuZXRcbiAgICogZm9yIGJvdGggcmVnaXN0cmF0aW9uIHBhdGhzOlxuICAgKlxuICAgKiAtIEZpcnN0IHZhdWx0IHJlZ2lzdGVyZWQgdmlhIGNvbmZpZyBmaWxlIChubyBwcmlvciBgZW5hYmxlLXBsdWdpbi08aWQ+YCBlbnRyeSkuXG4gICAqIC0gU3Vic2VxdWVudCB2YXVsdCByZWdpc3RlcmVkIHdoaWxlIGFub3RoZXIgdmF1bHQgaXMgYWxyZWFkeSBvcGVuLiBUaGVcbiAgICogICBgZW5hYmxlLXBsdWdpbi08bmV3VmF1bHRJZD5gIHdyaXRlIGhhcHBlbnMgaW4gdGhlIGV4aXN0aW5nIHZhdWx0J3MgcmVuZGVyZXIsXG4gICAqICAgYnV0IHRoZSBuZXcgdmF1bHQncyByZW5kZXJlciBtYXkgcmVhZCBgbG9jYWxTdG9yYWdlYCBiZWZvcmUgdGhhdCBjcm9zcy1yZW5kZXJlclxuICAgKiAgIHdyaXRlIGJlY29tZXMgdmlzaWJsZSAocmFjZSBvYnNlcnZlZCBpbiBPYnNpZGlhbiAxLjEzLjApLlxuICAgKlxuICAgKiBAcGFyYW0gdmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gZXZhbHVhdGUgaW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRpc21pc3NUcnVzdERpYWxvZyh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUoRElTTUlTU19UUlVTVF9ESUFMT0dfRVhQUiwgeyBjd2Q6IHZhdWx0UGF0aCB9KTtcbiAgICBpZiAocmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIERpc21pc3NlZCBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yXCIgZGlhbG9nLicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGBlbmFibGUtcGx1Z2luLTx2YXVsdElkPmAgaW4gT2JzaWRpYW4ncyBsb2NhbFN0b3JhZ2UgdG8gcHJldmVudFxuICAgKiB0aGUgXCJEbyB5b3UgdHJ1c3QgdGhlIGF1dGhvciBvZiB0aGlzIHZhdWx0P1wiIGRpYWxvZyBmcm9tIGFwcGVhcmluZ1xuICAgKiB3aGVuIGEgdmF1bHQgd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYHZhdWx0LW9wZW5gIElQQyAoc28gdGhlIHZhdWx0IElEIGV4aXN0cyBpblxuICAgKiBgb2JzaWRpYW4uanNvbmApIGFuZCBiZWZvcmUgdGhlIG5ldyB2YXVsdCB3aW5kb3cgZmluaXNoZXMgbG9hZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSB2YXVsdCBmb2xkZXIuXG4gICAqIEBwYXJhbSBldmFsVGFyZ2V0VmF1bHRQYXRoIC0gVGhlIHZhdWx0IHBhdGggdG8gdXNlIGFzIGV2YWwgdGFyZ2V0IChhbiBleGlzdGluZywgbG9hZGVkIHZhdWx0KS5cbiAgICogICBsb2NhbFN0b3JhZ2UgaXMgc2hhcmVkIGFjcm9zcyBhbGwgT2JzaWRpYW4gd2luZG93cyAoc2FtZSBFbGVjdHJvbiBvcmlnaW4pLCBzbyB0aGVcbiAgICogICBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIGNhbGwgY2FuIHJ1biBpbiBhbnkgbG9hZGVkIHZhdWx0IHdpbmRvdy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5hYmxlUGx1Z2luc0luTG9jYWxTdG9yYWdlKHZhdWx0UGF0aDogc3RyaW5nLCBldmFsVGFyZ2V0VmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2YXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGlmICghdmF1bHRJZCkge1xuICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gQ291bGQgbm90IGZpbmQgdmF1bHQgSUQgXHUyMDE0IHNraXBwaW5nIGxvY2FsU3RvcmFnZSB0cnVzdCBmbGFnLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCBldmFsVGFyZ2V0VmF1bHRQYXRoKTtcbiAgICBjb25zdCBlbmFibGVFeHByID0gYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnNldExvY2FsU3RvcmFnZUl0ZW0oJHtKU09OLnN0cmluZ2lmeSh7IGtleTogYGVuYWJsZS1wbHVnaW4tJHt2YXVsdElkfWAsIHZhbHVlOiAndHJ1ZScgfSl9KWA7XG4gICAgYXdhaXQgdGhpcy5ldmFsdWF0ZShlbmFibGVFeHByLCB7IGN3ZDogZXZhbFRhcmdldFZhdWx0UGF0aCB9KTtcbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBTZXQgZW5hYmxlLXBsdWdpbi0ke3ZhdWx0SWR9IGluIGxvY2FsU3RvcmFnZS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXVuY2hlcyBPYnNpZGlhbiBiaW5hcnkgYW5kIHJldHJpZXMgdGhlIGV2YWwgdW50aWwgaXQgcmVzcG9uZHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIENMSSBjb21tYW5kIGFycmF5IHRvIHJldHJ5LlxuICAgKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kOiBzdHJpbmdbXSwgY3dkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBpcyBub3QgcnVubmluZy4gU3RhcnRpbmcgT2JzaWRpYW4uLi4nKTtcblxuICAgIGNvbnN0IGxhdW5jaENvbW1hbmQgPSBhd2FpdCBnZXRPYnNpZGlhbkxhdW5jaENvbW1hbmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZXhlYyhsYXVuY2hDb21tYW5kLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgbGF1bmNoIGNvbW1hbmQgbWF5IGZhaWwgb24gc29tZSBzeXN0ZW1zIFx1MjAxNCB3ZSdsbCBzdGlsbCB0cnkgcG9sbGluZy5cbiAgICB9XG5cbiAgICBsb2coYFtjbGktdHJhbnNwb3J0XSBQb2xsaW5nIGZvciBPYnNpZGlhbiBDTEkgKHRpbWVvdXQ9JHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYCk7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBhd2FpdCBkZWxheShBVVRPX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBjd2QsIGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgICAgIGxvZygnW2NsaS10cmFuc3BvcnRdIE9ic2lkaWFuIENMSSByZXNwb25kZWQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICAgIGlmICghbWVzc2FnZS5pbmNsdWRlcyhVTkFCTEVfVE9fRklORF9PQlNJRElBTikpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBsb2coJ1tjbGktdHJhbnNwb3J0XSBPYnNpZGlhbiBub3QgcmVhZHkgeWV0LCByZXRyeWluZy4uLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgT2JzaWRpYW4gZGlkIG5vdCBzdGFydCB3aXRoaW4gJHtTdHJpbmcoQVVUT19TVEFSVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMuYCk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgdGhlIHZhdWx0IGlzIHJlYWR5IGFuZCByZXNwb25kaW5nIHRvIGV2YWwgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwb2xsVmF1bHRSZWFkeSh2YXVsdFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBvbGxFeHByID0gJ3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLnBvbGxWYXVsdEJhc2VQYXRoKCknO1xuXG4gICAgbG9nKGBbY2xpLXRyYW5zcG9ydF0gUG9sbGluZyBmb3IgdmF1bHQgcmVhZGluZXNzICh0aW1lb3V0PSR7U3RyaW5nKFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIFZBVUxUX1BPTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgbGV0IGlzQm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKERhdGUubm93KCkgPCBkZWFkbGluZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0Jvb3RzdHJhcHBlZCkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0aGlzLCB2YXVsdFBhdGgpO1xuICAgICAgICAgIGlzQm9vdHN0cmFwcGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IGF3YWl0IHRoaXMuZXZhbHVhdGUocG9sbEV4cHIsIHsgY3dkOiB2YXVsdFBhdGggfSk7XG4gICAgICAgIGlmIChKU09OLnBhcnNlKGJhc2VQYXRoKSA9PT0gdmF1bHRQYXRoKSB7XG4gICAgICAgICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gVmF1bHQgaXMgcmVhZHkuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gVmF1bHQgbm90IHJlYWR5IHlldCBcdTIwMTQgbmFtZXNwYWNlIG1heSBub3QgYmUgYm9vdHN0cmFwcGVkIHlldCBlaXRoZXIuXG4gICAgICAgIGlzQm9vdHN0cmFwcGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBhd2FpdCBkZWxheShWQVVMVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVmF1bHQgYXQgJHt2YXVsdFBhdGh9IGRpZCBub3QgYmVjb21lIHJlYWR5IHdpdGhpbiAke1N0cmluZyhWQVVMVF9QT0xMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKX1tc2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3RhcnRzIE9ic2lkaWFuIGJ5IGtpbGxpbmcgdGhlIHJ1bm5pbmcgcHJvY2VzcyBhbmQgcmVsYXVuY2hpbmcgaXQuXG4gICAqXG4gICAqIFVzZWQgd2hlbiBhIGNvbmZpZyBjaGFuZ2UgKGxpa2UgZW5hYmxpbmcgQ0xJKSByZXF1aXJlcyBhIHJlc3RhcnQgdG8gdGFrZSBlZmZlY3QuXG4gICAqXG4gICAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgdmF1bHQgcGF0aCB0byB1c2UgZm9yIHBvbGxpbmcgYWZ0ZXIgcmVzdGFydC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzdGFydE9ic2lkaWFuKHZhdWx0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbG9nKCdbY2xpLXRyYW5zcG9ydF0gS2lsbGluZyBPYnNpZGlhbiBwcm9jZXNzLi4uJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV4ZWMoZ2V0S2lsbE9ic2lkaWFuQ29tbWFuZCgpLCB7IGlzUXVpZXQ6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBQcm9jZXNzIG1heSBub3QgYmUgcnVubmluZyBcdTIwMTQgdGhhdCdzIGZpbmUuXG4gICAgfVxuXG4gICAgYXdhaXQgZGVsYXkoVkFVTFRfQ0xPU0VfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGNvbnN0IHJlc3RhcnRWYXVsdElkID0gZ2V0VmF1bHRJZCh2YXVsdFBhdGgpO1xuICAgIGNvbnN0IGNvbW1hbmQgPSBbJ29ic2lkaWFuJywgLi4uKHJlc3RhcnRWYXVsdElkID8gW2B2YXVsdD0ke3Jlc3RhcnRWYXVsdElkfWBdIDogW10pLCAnZXZhbCcsICdjb2RlPVwiMVwiJ107XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVPYnNpZGlhblJ1bm5pbmdBbmRSZXRyeShjb21tYW5kLCB2YXVsdFBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGFuIGV4cHJlc3Npb24sIHdyaXRlcyB0aGUgcmVzdWx0IHRvIGEgSlNPTiBmaWxlLlxuICpcbiAqIFNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICogTXVzdCBOT1QgcmVmZXJlbmNlIGFueSBvdXRlciBzY29wZS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGludm9jYXRpb24gcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludm9rZUFuZFdyaXRlUmVzdWx0KHBhcmFtczogSW52b2tlQW5kV3JpdGVSZXN1bHRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIHdpbmRvdy5hcHAgaXMgc2V0IGJ5IE9ic2lkaWFuIGF0IHJ1bnRpbWUuXG4gIGNvbnN0IGZzUHJvbWlzZXMgPSBSZWZsZWN0LmdldCh3aW5kb3cuYXBwLnZhdWx0LmFkYXB0ZXIsICdmc1Byb21pc2VzJykgYXMgSW52b2tlQW5kV3JpdGVSZXN1bHRGc1Byb21pc2VzO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5ldmFsdWF0ZSgpO1xuICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUocGFyYW1zLnJlc3VsdFBhdGgsIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcsIHZhbHVlOiAnJyB9KSk7XG4gICAgfSBlbHNlIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdudWxsJywgdmFsdWU6ICcnIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1iYXNlLXRvLXN0cmluZyAtLSBJbnRlbnRpb25hbDogcmVzdWx0IGlzIGFuIGFyYml0cmFyeSB2YWx1ZSBmcm9tIHRoZSBldmFsdWF0ZWQgZXhwcmVzc2lvbi5cbiAgICAgIGF3YWl0IGZzUHJvbWlzZXMud3JpdGVGaWxlKHBhcmFtcy5yZXN1bHRQYXRoLCBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiBTdHJpbmcocmVzdWx0KSB9KSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBhd2FpdCBmc1Byb21pc2VzLndyaXRlRmlsZShwYXJhbXMucmVzdWx0UGF0aCwgSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogcGFyYW1zLnNlcmlhbGl6ZUVycm9yKGVycikgfSkpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZGV0YWlsZWQgZGlhZ25vc3RpYyBzdHJpbmcgZm9yIHRoZSBcIlNjcmlwdCBkaWQgbm90IGV4ZWN1dGVcIiBlcnJvci5cbiAqXG4gKiBQZXJmb3JtcyBsaXZlIGVudmlyb25tZW50IGNoZWNrcyAocHJvY2VzcyBsaXN0LCB2YXVsdCByZWdpc3RyeSwgQ0xJIGNvbmZpZylcbiAqIGFuZCBpbmNsdWRlcyB0aGUgY29tbWFuZCwgZXhlYyBvdXRwdXQsIGFuZCBzY3JpcHQgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRpYWdub3N0aWMgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEgZm9ybWF0dGVkIGRpYWdub3N0aWMgc3RyaW5nLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZERpYWdub3N0aWNzKHBhcmFtczogQnVpbGREaWFnbm9zdGljc1BhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGxpbmVzLnB1c2goYCAgQ29tbWFuZDogJHtwYXJhbXMuY29tbWFuZC5qb2luKCcgJyl9YCk7XG4gIGxpbmVzLnB1c2goYCAgV29ya2luZyBkaXJlY3Rvcnk6ICR7cGFyYW1zLmN3ZH1gKTtcbiAgbGluZXMucHVzaChgICBTY3JpcHQgcGF0aDogJHtwYXJhbXMuc2NyaXB0UGF0aH1gKTtcbiAgbGluZXMucHVzaChgICBFeHBlY3RlZCByZXN1bHQgZmlsZTogJHtwYXJhbXMucmVzdWx0UGF0aH1gKTtcblxuICBpZiAocGFyYW1zLmV4ZWNSZXN1bHQpIHtcbiAgICBsaW5lcy5wdXNoKGAgIEV4aXQgY29kZTogJHtwYXJhbXMuZXhlY1Jlc3VsdC5leGl0Q29kZSA9PT0gbnVsbCA/ICcobnVsbCBcdTIwMTQgcHJvY2VzcyBkaWQgbm90IGV4aXQgbm9ybWFsbHkpJyA6IFN0cmluZyhwYXJhbXMuZXhlY1Jlc3VsdC5leGl0Q29kZSl9YCk7XG4gICAgaWYgKHBhcmFtcy5leGVjUmVzdWx0LmV4aXRTaWduYWwpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgRXhpdCBzaWduYWw6ICR7cGFyYW1zLmV4ZWNSZXN1bHQuZXhpdFNpZ25hbH1gKTtcbiAgICB9XG4gICAgaWYgKHBhcmFtcy5leGVjUmVzdWx0LnN0ZG91dC50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgc3Rkb3V0OiAke3BhcmFtcy5leGVjUmVzdWx0LnN0ZG91dC50cmltKCl9YCk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKGAgIHN0ZGVycjogJHtwYXJhbXMuZXhlY1Jlc3VsdC5zdGRlcnIudHJpbSgpfWApO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5leGVjUmVzdWx0LnN0ZG91dC50cmltKCkgJiYgIXBhcmFtcy5leGVjUmVzdWx0LnN0ZGVyci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goJyAgc3Rkb3V0L3N0ZGVycjogKGVtcHR5KScpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsaW5lcy5wdXNoKCcgIGV4ZWMgcmVzdWx0OiAobm90IGF2YWlsYWJsZSBcdTIwMTQgT2JzaWRpYW4gd2FzIGF1dG8tc3RhcnRlZCBhbmQgcmV0cmllZCknKTtcbiAgfVxuXG4gIGxpbmVzLnB1c2goJ0Vudmlyb25tZW50IGNoZWNrczonKTtcbiAgbGluZXMucHVzaChgICBPYnNpZGlhbiBydW5uaW5nOiAke2F3YWl0IGlzT2JzaWRpYW5SdW5uaW5nKCkgPyAneWVzJyA6ICdOTyd9YCk7XG4gIGxpbmVzLnB1c2goYCAgQ0xJIGVuYWJsZWQgaW4gb2JzaWRpYW4uanNvbjogJHtpc0NsaUVuYWJsZWQoKSA/ICd5ZXMnIDogJ05PJ31gKTtcbiAgbGluZXMucHVzaChgICBWYXVsdCByZWdpc3RlcmVkOiAke2lzVmF1bHRSZWdpc3RlcmVkKHBhcmFtcy5jd2QpID8gJ3llcycgOiAnTk8nfWApO1xuICBsaW5lcy5wdXNoKGAgIFNjcmlwdCBmaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKHBhcmFtcy5zY3JpcHRQYXRoKSA/ICd5ZXMnIDogJ25vIChhbHJlYWR5IGNsZWFuZWQgdXApJ31gKTtcbiAgbGluZXMucHVzaChgICBSZXN1bHQgZmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhwYXJhbXMucmVzdWx0UGF0aCkgPyAneWVzJyA6ICdubyd9YCk7XG5cbiAgY29uc3QgcmVnaXN0ZXJlZFZhdWx0cyA9IGdldFJlZ2lzdGVyZWRWYXVsdHMoKTtcbiAgaWYgKHJlZ2lzdGVyZWRWYXVsdHMubGVuZ3RoID09PSAwKSB7XG4gICAgbGluZXMucHVzaCgnICBSZWdpc3RlcmVkIHZhdWx0czogKG5vbmUpJyk7XG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaCgnICBSZWdpc3RlcmVkIHZhdWx0czonKTtcbiAgICBmb3IgKGNvbnN0IHZhdWx0IG9mIHJlZ2lzdGVyZWRWYXVsdHMpIHtcbiAgICAgIGxpbmVzLnB1c2goYCAgICAtICR7dmF1bHQucGF0aH0gKG9wZW46ICR7U3RyaW5nKHZhdWx0Lm9wZW4pfSlgKTtcbiAgICB9XG4gIH1cblxuICBsaW5lcy5wdXNoKGAgIFNjcmlwdCBjb250ZW50OlxcbiR7cGFyYW1zLnNjcmlwdENvbnRlbnR9YCk7XG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29udGVudCBvZiBhIHRlbXBvcmFyeSBzY3JpcHQgZmlsZS5cbiAqXG4gKiBTZXJpYWxpemVzIHtAbGluayBpbnZva2VBbmRXcml0ZVJlc3VsdH0gaW50byBhIHNlbGYtY29udGFpbmVkIElJRkUgdGhhdFxuICogZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uLCB3cml0ZXMgdGhlIHJlc3VsdCAob3IgZXJyb3IpIHRvIGByZXN1bHRQYXRoYC5cbiAqXG4gKiBAcGFyYW0gZXhwcmVzc2lvbiAtIFRoZSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gKiBAcGFyYW0gcmVzdWx0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSByZXN1bHQgZmlsZS5cbiAqIEByZXR1cm5zIFRoZSBzY3JpcHQgZmlsZSBjb250ZW50LlxuICovXG5mdW5jdGlvbiBidWlsZFNjcmlwdEZpbGUoZXhwcmVzc2lvbjogc3RyaW5nLCByZXN1bHRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmblN0ciA9IGdldEZ1bmN0aW9uRXhwcmVzc2lvblN0cmluZyhpbnZva2VBbmRXcml0ZVJlc3VsdCk7XG4gIGNvbnN0IHNlcmlhbGl6ZUVycm9yU3RyID0gZ2V0RnVuY3Rpb25FeHByZXNzaW9uU3RyaW5nKHNlcmlhbGl6ZUVycm9yKTtcbiAgY29uc3QgcmVzdWx0UGF0aEpzb24gPSBKU09OLnN0cmluZ2lmeShyZXN1bHRQYXRoLnJlcGxhY2UoL1xcXFwvZywgJy8nKSk7XG4gIHJldHVybiBgKCR7Zm5TdHJ9KSh7IGV2YWx1YXRlOiBhc3luYyAoKSA9PiAoJHtleHByZXNzaW9ufSksIHJlc3VsdFBhdGg6ICR7cmVzdWx0UGF0aEpzb259LCBzZXJpYWxpemVFcnJvcjogJHtzZXJpYWxpemVFcnJvclN0cn0gfSlgO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGdpdmVuIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBtcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgZGVsYXkuXG4gKi9cbmZ1bmN0aW9uIGRlbGF5KG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBtcyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgc2NyaXB0IGZpbGUgZnJvbSBkaXNrLCBsb2dzIGl0cyBjb250ZW50LCBhbmQgZXhlY3V0ZXMgaXQgdmlhIGBuZXcgRnVuY3Rpb25gLlxuICpcbiAqIFNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICogTXVzdCBOT1QgcmVmZXJlbmNlIGFueSBvdXRlciBzY29wZS5cbiAqXG4gKiBAcGFyYW0gc2NyaXB0UGF0aCAtIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzY3JpcHQgZmlsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVNjcmlwdEZpbGUoc2NyaXB0UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSB3aW5kb3cuYXBwIGlzIHNldCBieSBPYnNpZGlhbiBhdCBydW50aW1lLlxuICBjb25zdCBmc1Byb21pc2VzID0gUmVmbGVjdC5nZXQod2luZG93LmFwcC52YXVsdC5hZGFwdGVyLCAnZnNQcm9taXNlcycpIGFzIEV4ZWN1dGVTY3JpcHRGaWxlRnNQcm9taXNlcztcblxuICB0cnkge1xuICAgIGF3YWl0IGZzUHJvbWlzZXMuYWNjZXNzKHNjcmlwdFBhdGgpO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2NyaXB0IGZpbGUgbm90IGZvdW5kOiAke3NjcmlwdFBhdGh9YCwgeyBjYXVzZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHNjcmlwdCA9IGF3YWl0IGZzUHJvbWlzZXMucmVhZEZpbGUoc2NyaXB0UGF0aCwgJ3V0Zi04Jyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlIC0tIERpYWdub3N0aWMgbG9nZ2luZyBpbnNpZGUgT2JzaWRpYW4gcHJvY2Vzczsgbm8gbG9nZ2VyIGF2YWlsYWJsZS5cbiAgY29uc29sZS5kZWJ1ZyhgRXhlY3V0aW5nICR7c2NyaXB0UGF0aH06XFxuJHtzY3JpcHR9YCk7XG5cbiAgbGV0IGZuOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW1wbGllZC1ldmFsLCBuby1uZXctZnVuYyAtLSBUaGUgc2NyaXB0IGlzIGEgdHJ1c3RlZCwgc2VsZi1nZW5lcmF0ZWQgSUlGRSBleHByZXNzaW9uLlxuICAgIGZuID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtzY3JpcHR9YCkgYXMgKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHBhcnNpbmcgJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGZuKCk7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBleGVjdXRpbmcgJHtzY3JpcHRQYXRofWAsIHsgY2F1c2UgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIHRvIGtpbGwgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMgVGhlIHNoZWxsIGNvbW1hbmQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBnZXRLaWxsT2JzaWRpYW5Db21tYW5kKCk6IHN0cmluZyB7XG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuICd0YXNra2lsbCAvSU0gT2JzaWRpYW4uZXhlIC9GJztcbiAgfVxuXG4gIHJldHVybiAncGtpbGwgLWYgT2JzaWRpYW4nO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGNvbW1hbmQgdG8gbGF1bmNoIHRoZSBPYnNpZGlhbiBiaW5hcnkuXG4gKlxuICogUmVzb2x2ZXMgdGhlIGFjdHVhbCBpbnN0YWxsZWQgT2JzaWRpYW4gZXhlY3V0YWJsZSAoY292ZXJpbmcgaW5zdGFsbGVyLWJhc2VkXG4gKiBhbmQgYFBBVEhgLWJhc2VkIGluc3RhbGxzIHN1Y2ggYXMgYHNjb29wYCkgYW5kIHZlcmlmaWVzIGl0IGV4aXN0cyBiZWZvcmVcbiAqIHJldHVybmluZyBhIGNvbW1hbmQuIFRocm93cyBpZiBPYnNpZGlhbiBpcyBub3QgaW5zdGFsbGVkLlxuICpcbiAqIEByZXR1cm5zIFRoZSBzaGVsbCBjb21tYW5kIHN0cmluZy5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgT2JzaWRpYW4gY2Fubm90IGJlIGxvY2F0ZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE9ic2lkaWFuTGF1bmNoQ29tbWFuZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgcmV0dXJuIGBzdGFydCBcIlwiIFwiJHtleGVQYXRofVwiYDtcbiAgfVxuXG4gIHJldHVybiBgXCIke2V4ZVBhdGh9XCIgJmA7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgY29tbWFuZCB0byBvcGVuIGEgVVJJLlxuICpcbiAqIEBwYXJhbSB1cmkgLSBUaGUgVVJJIHRvIG9wZW4uXG4gKiBAcmV0dXJucyBUaGUgc2hlbGwgY29tbWFuZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGdldE9wZW5VcmlDb21tYW5kKHVyaTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcbiAgICByZXR1cm4gYHN0YXJ0IFwiXCIgXCIke3VyaX1cImA7XG4gIH1cblxuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcbiAgICByZXR1cm4gYG9wZW4gXCIke3VyaX1cImA7XG4gIH1cblxuICByZXR1cm4gYHhkZy1vcGVuIFwiJHt1cml9XCJgO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBPYnNpZGlhbiBwcm9jZXNzIGlzIGN1cnJlbnRseSBydW5uaW5nLlxuICpcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgT2JzaWRpYW4gcHJvY2VzcyBpcyBmb3VuZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzT2JzaWRpYW5SdW5uaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjb21tYW5kID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8gJ3Rhc2tsaXN0IC9GSSBcIklNQUdFTkFNRSBlcSBPYnNpZGlhbi5leGVcIiAvTkgnXG4gICAgOiAncGdyZXAgLWYgT2JzaWRpYW4nO1xuICB0cnkge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgICByZXR1cm4gb3V0cHV0LmluY2x1ZGVzKCdPYnNpZGlhbi5leGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dC50cmltKCkubGVuZ3RoID4gMDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogT3BlbnMgYSB2YXVsdCBpbiBPYnNpZGlhbiB1c2luZyB0aGUgYG9ic2lkaWFuOi8vb3BlbmAgVVJJIHByb3RvY29sLlxuICpcbiAqIFRoaXMgd29ya3Mgd2hldGhlciBPYnNpZGlhbiBpcyBhbHJlYWR5IHJ1bm5pbmcgKHNpZ25hbHMgaXQgdG8gb3BlbiB0aGUgdmF1bHQpXG4gKiBvciBub3QgKGxhdW5jaGVzIE9ic2lkaWFuIHdpdGggdGhlIHZhdWx0KS4gVGhlIFVSSSBwcm90b2NvbCBpcyBoYW5kbGVkIGJ5IHRoZVxuICogT1MsIHdoaWNoIHJvdXRlcyBpdCB0byB0aGUgcmVnaXN0ZXJlZCBPYnNpZGlhbiBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB2YXVsdFBhdGggLSBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgdmF1bHQgZm9sZGVyLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuVmF1bHRWaWFVcmkodmF1bHRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmF1bHRJZCA9IGdldFZhdWx0SWQodmF1bHRQYXRoKTtcbiAgaWYgKCF2YXVsdElkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgb3BlbiB2YXVsdCB2aWEgVVJJOiB2YXVsdCBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvYnNpZGlhbi5qc29uOiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuICBjb25zdCB1cmkgPSBgb2JzaWRpYW46Ly9vcGVuP3ZhdWx0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhdWx0SWQpfWA7XG4gIGNvbnN0IGNvbW1hbmQgPSBnZXRPcGVuVXJpQ29tbWFuZCh1cmkpO1xuICBsb2coYFtjbGktdHJhbnNwb3J0XSBPcGVuaW5nIHZhdWx0IHZpYSBVUkk6ICR7dXJpfWApO1xuICB0cnkge1xuICAgIGF3YWl0IGV4ZWMoY29tbWFuZCwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2NsaS10cmFuc3BvcnRdIFVSSSBvcGVuIGZhaWxlZCAobm9uLWZhdGFsKTogJHtzZXJpYWxpemVFcnJvcihlcnJvcil9YCk7XG4gIH1cbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFTQSxxQkFBMkI7QUFDM0Isc0JBS087QUFDUCxxQkFBdUI7QUFDdkIsdUJBQXFCO0FBQ3JCLDBCQUFvQjtBQVFwQixrQ0FBMEM7QUFDMUMsa0JBQXFCO0FBQ3JCLGlDQUE0QztBQUM1QyxpQkFBb0I7QUFDcEIsaUNBQTRDO0FBQzVDLGtCQUFxQjtBQUNyQiw2QkFVTztBQUNQLGlDQUEwQztBQUMxQyw2QkFBK0I7QUE2Qi9CLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sMkNBQTJDO0FBQ2pE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
|
|
@@ -71,9 +71,14 @@ export declare class DesktopCliTransport implements ObsidianTransport {
|
|
|
71
71
|
* Dismisses the "Do you trust the author of this vault?" dialog if present.
|
|
72
72
|
*
|
|
73
73
|
* Clicks the "Trust author and enable plugins" button (`.mod-cta`) inside any
|
|
74
|
-
* modal whose text includes "Do you trust the author".
|
|
75
|
-
*
|
|
76
|
-
*
|
|
74
|
+
* modal whose text includes "Do you trust the author". Acts as a safety net
|
|
75
|
+
* for both registration paths:
|
|
76
|
+
*
|
|
77
|
+
* - First vault registered via config file (no prior `enable-plugin-<id>` entry).
|
|
78
|
+
* - Subsequent vault registered while another vault is already open. The
|
|
79
|
+
* `enable-plugin-<newVaultId>` write happens in the existing vault's renderer,
|
|
80
|
+
* but the new vault's renderer may read `localStorage` before that cross-renderer
|
|
81
|
+
* write becomes visible (race observed in Obsidian 1.13.0).
|
|
77
82
|
*
|
|
78
83
|
* @param vaultPath - The vault path to evaluate in.
|
|
79
84
|
*/
|
|
@@ -56,4 +56,4 @@ class ContextId {
|
|
|
56
56
|
export {
|
|
57
57
|
ContextId
|
|
58
58
|
};
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtaWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUeXBlZCBjb250ZXh0IGlkZW50aWZpZXJzIGZvciBwZXJzaXN0aW5nIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzXG4gKiBhY3Jvc3Mge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxscy5cbiAqL1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuXG4vKipcbiAqIFdyYXBzIGEge0BsaW5rIENvbnRleHRPZn0gZXh0cmFjdGlvbiBpbnRvIGFuIG9iamVjdCB3aXRoIGEgYGNvbnRleHRgIHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRBcmdzPFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+IHtcbiAgY29udGV4dDogQ29udGV4dE9mPFRDb250ZXh0SWQ+O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBjb250ZXh0IHR5cGUgZnJvbSBhIHtAbGluayBDb250ZXh0SWR9LlxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0T2Y8VD4gPSBUIGV4dGVuZHMgQ29udGV4dElkPGluZmVyIENvbnRleHQ+ID8gQ29udGV4dCA6IG5ldmVyO1xuXG4vKipcbiAqIEEgdHlwZWQgY29udGV4dCBpZGVudGlmaWVyIGZvciBwZXJzaXN0aW5nIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzXG4gKiBhY3Jvc3Mge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxscy5cbiAqXG4gKiBUaGUgY29udGV4dCBpcyBhIHBlcnNpc3RlbnQgb2JqZWN0IHN0b3JlZCBvbiBgd2luZG93YCBpbiB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIEFsbCBjYWxscyBzaGFyaW5nIHRoZSBzYW1lIGBDb250ZXh0SWRgIHNoYXJlIHRoZSBzYW1lIGNvbnRleHQgb2JqZWN0LFxuICogYWxsb3dpbmcgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgKGUuZy4gYFRGaWxlYCwgYEVkaXRvcmApIHRvIHN1cnZpdmUgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAgZm9yIHVzZSB3aXRoIGBhd2FpdCB1c2luZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0SWQ8X0NvbnRleHQ+
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbnRleHQtaWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBUeXBlZCBjb250ZXh0IGlkZW50aWZpZXJzIGZvciBwZXJzaXN0aW5nIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzXG4gKiBhY3Jvc3Mge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxscy5cbiAqL1xuXG5pbXBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuXG4vKipcbiAqIFdyYXBzIGEge0BsaW5rIENvbnRleHRPZn0gZXh0cmFjdGlvbiBpbnRvIGFuIG9iamVjdCB3aXRoIGEgYGNvbnRleHRgIHByb3BlcnR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRBcmdzPFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+IHtcbiAgY29udGV4dDogQ29udGV4dE9mPFRDb250ZXh0SWQ+O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBjb250ZXh0IHR5cGUgZnJvbSBhIHtAbGluayBDb250ZXh0SWR9LlxuICovXG5leHBvcnQgdHlwZSBDb250ZXh0T2Y8VD4gPSBUIGV4dGVuZHMgQ29udGV4dElkPGluZmVyIENvbnRleHQ+ID8gQ29udGV4dCA6IG5ldmVyO1xuXG4vKipcbiAqIEEgdHlwZWQgY29udGV4dCBpZGVudGlmaWVyIGZvciBwZXJzaXN0aW5nIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzXG4gKiBhY3Jvc3Mge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxscy5cbiAqXG4gKiBUaGUgY29udGV4dCBpcyBhIHBlcnNpc3RlbnQgb2JqZWN0IHN0b3JlZCBvbiBgd2luZG93YCBpbiB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqIEFsbCBjYWxscyBzaGFyaW5nIHRoZSBzYW1lIGBDb250ZXh0SWRgIHNoYXJlIHRoZSBzYW1lIGNvbnRleHQgb2JqZWN0LFxuICogYWxsb3dpbmcgbm9uLXNlcmlhbGl6YWJsZSB2YWx1ZXMgKGUuZy4gYFRGaWxlYCwgYEVkaXRvcmApIHRvIHN1cnZpdmUgYWNyb3NzIGNhbGxzLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAgZm9yIHVzZSB3aXRoIGBhd2FpdCB1c2luZ2AuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250ZXh0SWQ8X0NvbnRleHQ+IGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGNvbnRleHQgaWQuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgIHRoaXMuaWQgPSBgX19jdHhfJHtTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpfWA7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGlzIGNvbnRleHQgZnJvbSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAgICpcbiAgICogQHBhcmFtIHZhdWx0UGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBPYnNpZGlhbiB2YXVsdC4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuY3dkKClgLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpc3Bvc2UodmF1bHRQYXRoPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgZXZhbEluT2JzaWRpYW4oe1xuICAgICAgYXJnczogeyBpZDogdGhpcy5pZCB9LFxuICAgICAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFNlcmlhbGl6ZWQgdmlhIHRvU3RyaW5nKCkgYW5kIGV4ZWN1dGVkIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cbiAgICAgIGZuKHsgaWQgfSk6IHZvaWQge1xuICAgICAgICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nQ29udGV4dHMge1xuICAgICAgICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgfVxuICAgICAgICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyIHtcbiAgICAgICAgICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdDb250ZXh0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAgICAgICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gICAgICAgIGlmIChob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlIC0tIE5vIG90aGVyIHdheS5cbiAgICAgICAgICBkZWxldGUgaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcuY29udGV4dHNbaWRdO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLyogdjggaWdub3JlIHN0b3AgKi9cbiAgICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgICAuLi4odmF1bHRQYXRoID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdmF1bHRQYXRoIH0pXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhpcyBjb250ZXh0IGlkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb250ZXh0IGlkIGlzIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZXh0IGlkLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29udGV4dCBpZC5cbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRleHQgaWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbnRleHQgaWQuXG4gICAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBT0EsU0FBUyxzQkFBc0I7QUF3QnhCLE1BQU0sVUFBK0M7QUFBQSxFQUN6QztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS1YsY0FBYztBQUNuQixVQUFNLGNBQWM7QUFDcEIsU0FBSyxLQUFLLFNBQVMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUEsRUFDN0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxNQUFhLFFBQVEsV0FBbUM7QUFDdEQsVUFBTSxlQUFlO0FBQUEsTUFDbkIsTUFBTSxFQUFFLElBQUksS0FBSyxHQUFHO0FBQUE7QUFBQSxNQUVwQixHQUFHLEVBQUUsR0FBRyxHQUFTO0FBU2YsY0FBTSxTQUFTO0FBQ2YsWUFBSSxPQUFPLDhCQUE4QixVQUFVO0FBRWpELGlCQUFPLE9BQU8sNkJBQTZCLFNBQVMsRUFBRTtBQUFBLFFBQ3hEO0FBQUEsTUFDRjtBQUFBO0FBQUEsTUFFQSwyQkFBMkI7QUFBQSxNQUMzQixHQUFJLGNBQWMsU0FBWSxDQUFDLElBQUksRUFBRSxVQUFVO0FBQUEsSUFDakQsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxPQUFjLE9BQU8sWUFBWSxJQUFtQjtBQUNsRCxVQUFNLEtBQUssUUFBUTtBQUFBLEVBQ3JCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sU0FBaUI7QUFDdEIsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFdBQW1CO0FBQ3hCLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file
|
|
3
|
+
*
|
|
4
|
+
* Provides the JavaScript expression evaluated inside Obsidian to dismiss the
|
|
5
|
+
* "Do you trust the author of this vault?" modal that appears when a vault
|
|
6
|
+
* with community plugins is opened without a prior `enable-plugin-<id>`
|
|
7
|
+
* entry in `localStorage`.
|
|
8
|
+
*
|
|
9
|
+
* Shared between desktop transports (CLI + CDP) because the modal markup and
|
|
10
|
+
* close mechanism are identical regardless of how the eval is delivered.
|
|
11
|
+
*
|
|
12
|
+
* Cross-version compatibility (verified against Obsidian 1.12.7 and 1.13.0):
|
|
13
|
+
*
|
|
14
|
+
* - `Modal` (the base class) always creates an X-icon element wired to
|
|
15
|
+
* `Modal.close()`. The class name changed across versions:
|
|
16
|
+
* - 1.12.x and earlier: `.modal-close-button`
|
|
17
|
+
* - 1.13.0+: `.modal-header-button`
|
|
18
|
+
* Clicking it removes the container from the DOM with no side effects —
|
|
19
|
+
* the only universal exit. The dialog's own action buttons are not safe to
|
|
20
|
+
* rely on: in 1.12.7 they have no marker classes at all and the cancel
|
|
21
|
+
* button writes `localStorage = "false"` (permanently disabling plugins).
|
|
22
|
+
* In 1.13.0 the cancel button has `.mod-cancel` and the action button has
|
|
23
|
+
* no marker class; clicking the action button asynchronously opens the
|
|
24
|
+
* Settings modal as a side effect.
|
|
25
|
+
*
|
|
26
|
+
* - We also write `enable-plugin-<appId>` to `"true"` directly. Plugins are
|
|
27
|
+
* loaded lazily by `evalWrapper` / `enablePluginWithErrorCapture` on the
|
|
28
|
+
* first eval that needs them, so we deliberately avoid calling
|
|
29
|
+
* `setEnable(true)` here — it would synchronously trigger plugin load,
|
|
30
|
+
* queuing every subsequent eval (including `destroyCurrentWindow`) behind
|
|
31
|
+
* it and pushing teardown past test hook timeouts.
|
|
32
|
+
*
|
|
33
|
+
* Returns the string `'true'` if a dialog was found and dismissed, `'false'`
|
|
34
|
+
* otherwise. The evaluator stringifies the boolean.
|
|
35
|
+
*/
|
|
36
|
+
export declare const DISMISS_TRUST_DIALOG_EXPR = "(function() {\n var modals = document.querySelectorAll('.modal-container');\n for (var i = 0; i < modals.length; i++) {\n var modal = modals[i];\n if (!modal.textContent.includes('Do you trust the author')) { continue; }\n try {\n var appId = window.app && window.app.appId;\n if (appId) { localStorage.setItem('enable-plugin-' + appId, 'true'); }\n } catch (e) { /* localStorage may be unavailable in edge cases */ }\n var closeBtn = modal.querySelector('.modal-close-button, .modal-header-button');\n if (closeBtn) {\n closeBtn.click();\n return true;\n }\n }\n return false;\n})()";
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const DISMISS_TRUST_DIALOG_EXPR = `(function() {
|
|
2
|
+
var modals = document.querySelectorAll('.modal-container');
|
|
3
|
+
for (var i = 0; i < modals.length; i++) {
|
|
4
|
+
var modal = modals[i];
|
|
5
|
+
if (!modal.textContent.includes('Do you trust the author')) { continue; }
|
|
6
|
+
try {
|
|
7
|
+
var appId = window.app && window.app.appId;
|
|
8
|
+
if (appId) { localStorage.setItem('enable-plugin-' + appId, 'true'); }
|
|
9
|
+
} catch (e) { /* localStorage may be unavailable in edge cases */ }
|
|
10
|
+
var closeBtn = modal.querySelector('.modal-close-button, .modal-header-button');
|
|
11
|
+
if (closeBtn) {
|
|
12
|
+
closeBtn.click();
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return false;
|
|
17
|
+
})()`;
|
|
18
|
+
export {
|
|
19
|
+
DISMISS_TRUST_DIALOG_EXPR
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc21pc3MtdHJ1c3QtZGlhbG9nLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvdmlkZXMgdGhlIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBldmFsdWF0ZWQgaW5zaWRlIE9ic2lkaWFuIHRvIGRpc21pc3MgdGhlXG4gKiBcIkRvIHlvdSB0cnVzdCB0aGUgYXV0aG9yIG9mIHRoaXMgdmF1bHQ/XCIgbW9kYWwgdGhhdCBhcHBlYXJzIHdoZW4gYSB2YXVsdFxuICogd2l0aCBjb21tdW5pdHkgcGx1Z2lucyBpcyBvcGVuZWQgd2l0aG91dCBhIHByaW9yIGBlbmFibGUtcGx1Z2luLTxpZD5gXG4gKiBlbnRyeSBpbiBgbG9jYWxTdG9yYWdlYC5cbiAqXG4gKiBTaGFyZWQgYmV0d2VlbiBkZXNrdG9wIHRyYW5zcG9ydHMgKENMSSArIENEUCkgYmVjYXVzZSB0aGUgbW9kYWwgbWFya3VwIGFuZFxuICogY2xvc2UgbWVjaGFuaXNtIGFyZSBpZGVudGljYWwgcmVnYXJkbGVzcyBvZiBob3cgdGhlIGV2YWwgaXMgZGVsaXZlcmVkLlxuICpcbiAqIENyb3NzLXZlcnNpb24gY29tcGF0aWJpbGl0eSAodmVyaWZpZWQgYWdhaW5zdCBPYnNpZGlhbiAxLjEyLjcgYW5kIDEuMTMuMCk6XG4gKlxuICogLSBgTW9kYWxgICh0aGUgYmFzZSBjbGFzcykgYWx3YXlzIGNyZWF0ZXMgYW4gWC1pY29uIGVsZW1lbnQgd2lyZWQgdG9cbiAqICAgYE1vZGFsLmNsb3NlKClgLiBUaGUgY2xhc3MgbmFtZSBjaGFuZ2VkIGFjcm9zcyB2ZXJzaW9uczpcbiAqICAgICAtIDEuMTIueCBhbmQgZWFybGllcjogYC5tb2RhbC1jbG9zZS1idXR0b25gXG4gKiAgICAgLSAxLjEzLjArOiAgICAgICAgICAgIGAubW9kYWwtaGVhZGVyLWJ1dHRvbmBcbiAqICAgQ2xpY2tpbmcgaXQgcmVtb3ZlcyB0aGUgY29udGFpbmVyIGZyb20gdGhlIERPTSB3aXRoIG5vIHNpZGUgZWZmZWN0cyBcdTIwMTRcbiAqICAgdGhlIG9ubHkgdW5pdmVyc2FsIGV4aXQuIFRoZSBkaWFsb2cncyBvd24gYWN0aW9uIGJ1dHRvbnMgYXJlIG5vdCBzYWZlIHRvXG4gKiAgIHJlbHkgb246IGluIDEuMTIuNyB0aGV5IGhhdmUgbm8gbWFya2VyIGNsYXNzZXMgYXQgYWxsIGFuZCB0aGUgY2FuY2VsXG4gKiAgIGJ1dHRvbiB3cml0ZXMgYGxvY2FsU3RvcmFnZSA9IFwiZmFsc2VcImAgKHBlcm1hbmVudGx5IGRpc2FibGluZyBwbHVnaW5zKS5cbiAqICAgSW4gMS4xMy4wIHRoZSBjYW5jZWwgYnV0dG9uIGhhcyBgLm1vZC1jYW5jZWxgIGFuZCB0aGUgYWN0aW9uIGJ1dHRvbiBoYXNcbiAqICAgbm8gbWFya2VyIGNsYXNzOyBjbGlja2luZyB0aGUgYWN0aW9uIGJ1dHRvbiBhc3luY2hyb25vdXNseSBvcGVucyB0aGVcbiAqICAgU2V0dGluZ3MgbW9kYWwgYXMgYSBzaWRlIGVmZmVjdC5cbiAqXG4gKiAtIFdlIGFsc28gd3JpdGUgYGVuYWJsZS1wbHVnaW4tPGFwcElkPmAgdG8gYFwidHJ1ZVwiYCBkaXJlY3RseS4gUGx1Z2lucyBhcmVcbiAqICAgbG9hZGVkIGxhemlseSBieSBgZXZhbFdyYXBwZXJgIC8gYGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmVgIG9uIHRoZVxuICogICBmaXJzdCBldmFsIHRoYXQgbmVlZHMgdGhlbSwgc28gd2UgZGVsaWJlcmF0ZWx5IGF2b2lkIGNhbGxpbmdcbiAqICAgYHNldEVuYWJsZSh0cnVlKWAgaGVyZSBcdTIwMTQgaXQgd291bGQgc3luY2hyb25vdXNseSB0cmlnZ2VyIHBsdWdpbiBsb2FkLFxuICogICBxdWV1aW5nIGV2ZXJ5IHN1YnNlcXVlbnQgZXZhbCAoaW5jbHVkaW5nIGBkZXN0cm95Q3VycmVudFdpbmRvd2ApIGJlaGluZFxuICogICBpdCBhbmQgcHVzaGluZyB0ZWFyZG93biBwYXN0IHRlc3QgaG9vayB0aW1lb3V0cy5cbiAqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgYCd0cnVlJ2AgaWYgYSBkaWFsb2cgd2FzIGZvdW5kIGFuZCBkaXNtaXNzZWQsIGAnZmFsc2UnYFxuICogb3RoZXJ3aXNlLiBUaGUgZXZhbHVhdG9yIHN0cmluZ2lmaWVzIHRoZSBib29sZWFuLlxuICovXG5cbmV4cG9ydCBjb25zdCBESVNNSVNTX1RSVVNUX0RJQUxPR19FWFBSID0gYChmdW5jdGlvbigpIHtcbiAgdmFyIG1vZGFscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tb2RhbC1jb250YWluZXInKTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RhbHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbW9kYWwgPSBtb2RhbHNbaV07XG4gICAgaWYgKCFtb2RhbC50ZXh0Q29udGVudC5pbmNsdWRlcygnRG8geW91IHRydXN0IHRoZSBhdXRob3InKSkgeyBjb250aW51ZTsgfVxuICAgIHRyeSB7XG4gICAgICB2YXIgYXBwSWQgPSB3aW5kb3cuYXBwICYmIHdpbmRvdy5hcHAuYXBwSWQ7XG4gICAgICBpZiAoYXBwSWQpIHsgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2VuYWJsZS1wbHVnaW4tJyArIGFwcElkLCAndHJ1ZScpOyB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBsb2NhbFN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlIGluIGVkZ2UgY2FzZXMgKi8gfVxuICAgIHZhciBjbG9zZUJ0biA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy5tb2RhbC1jbG9zZS1idXR0b24sIC5tb2RhbC1oZWFkZXItYnV0dG9uJyk7XG4gICAgaWYgKGNsb3NlQnRuKSB7XG4gICAgICBjbG9zZUJ0bi5jbGljaygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn0pKClgO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBb0NPLE1BQU0sNEJBQTRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -33,4 +33,4 @@ async function enablePluginWithErrorCapture({ app, pluginId }) {
|
|
|
33
33
|
export {
|
|
34
34
|
enablePluginWithErrorCapture
|
|
35
35
|
};
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGFmdGVyIHRoZSBlbmFibGUgYXR0ZW1wdC5cbiAgICogQSBwbHVnaW4gY2FuIGJlIFwiZW5hYmxlZFwiIChjb25maWd1cmVkKSBidXQgbm90IFwibG9hZGVkXCIgKGZhaWxlZCB0byBpbml0aWFsaXplKS5cbiAgICovXG4gIGlzRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIGluc3RhbmNlIGFjdHVhbGx5IGV4aXN0cyBpbiBgYXBwLnBsdWdpbnMucGx1Z2luc2AuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgY2hlY2sgXHUyMDE0IGEgcGx1Z2luIHRoYXQgaXMgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgaXNMb2FkZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdTZXJpYWxpemVFcnJvcjtcbn1cblxuaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ1NlcmlhbGl6ZUVycm9yIHtcbiAgc2VyaWFsaXplRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIHBsdWdpbiBpbnNpZGUgT2JzaWRpYW4gYW5kIGNhcHR1cmVzIGFueSBsb2FkIGVycm9yLlxuICpcbiAqIE1vbmtleS1wYXRjaGVzIGBhcHAucGx1Z2lucy5sb2FkUGx1Z2luYCB0byBpbnRlcmNlcHQgZXJyb3JzIGJlZm9yZVxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luYCB0cnktY2F0Y2ggc3dhbGxvd3MgdGhlbS4gVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogaXMgYWx3YXlzIHJlc3RvcmVkIGluIGEgYGZpbmFsbHlgIGJsb2NrLlxuICpcbiAqIERlc2lnbmVkIHRvIGJlIHBhc3NlZCBhcyB0aGUgYGZuYCBhcmd1bWVudCB0byB7QGxpbmsgZXZhbEluT2JzaWRpYW59LlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGNvbW1vbiBhcmdzIHBsdXMgdGhlIHBsdWdpbiBJRC5cbiAqIEBwYXJhbSBhcmdzLmFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXJncy5wbHVnaW5JZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAqIEByZXR1cm5zIFRoZSBlbmFibGUgcmVzdWx0IHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgZW5hYmxlZCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlKHsgYXBwLCBwbHVnaW5JZCB9OiBDb21tb25BcmdzICYgRW5hYmxlUGx1Z2luUGFyYW1zKTogUHJvbWlzZTxFbmFibGVQbHVnaW5SZXN1bHQ+
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VuYWJsZS1wbHVnaW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTaGFyZWQgaGVscGVyIGZvciBlbmFibGluZyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCBlcnJvciBjYXB0dXJlLlxuICogVXNlZCBieSBib3RoIHRoZSBnbG9iYWwgc2V0dXAgYW5kIGludGVncmF0aW9uIHRlc3RzLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGNvZGUgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7IENvbW1vbkFyZ3MgfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZW5hYmxlUGx1Z2luV2l0aEVycm9yQ2FwdHVyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5hYmxlUGx1Z2luUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAgICovXG4gIHBsdWdpbklkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGVuYWJsaW5nIGEgcGx1Z2luIHdpdGggZXJyb3IgY2FwdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmFibGVQbHVnaW5SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHBsdWdpbiBmYWlsZWQgdG8gbG9hZCwgb3IgYHVuZGVmaW5lZGAgaWYgaXQgbG9hZGVkIHN1Y2Nlc3NmdWxseS5cbiAgICovXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwbHVnaW4gaXMgaW4gdGhlIGVuYWJsZWQgc2V0IGFmdGVyIHRoZSBlbmFibGUgYXR0ZW1wdC5cbiAgICogQSBwbHVnaW4gY2FuIGJlIFwiZW5hYmxlZFwiIChjb25maWd1cmVkKSBidXQgbm90IFwibG9hZGVkXCIgKGZhaWxlZCB0byBpbml0aWFsaXplKS5cbiAgICovXG4gIGlzRW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcGx1Z2luIGluc3RhbmNlIGFjdHVhbGx5IGV4aXN0cyBpbiBgYXBwLnBsdWdpbnMucGx1Z2luc2AuXG4gICAqIFRoaXMgaXMgdGhlIGRlZmluaXRpdmUgY2hlY2sgXHUyMDE0IGEgcGx1Z2luIHRoYXQgaXMgZW5hYmxlZCBidXQgbm90IGxvYWRlZCBoYXMgZmFpbGVkLlxuICAgKi9cbiAgaXNMb2FkZWQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXIge1xuICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdTZXJpYWxpemVFcnJvcjtcbn1cblxuaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ1NlcmlhbGl6ZUVycm9yIHtcbiAgc2VyaWFsaXplRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5hYmxlcyBhIHBsdWdpbiBpbnNpZGUgT2JzaWRpYW4gYW5kIGNhcHR1cmVzIGFueSBsb2FkIGVycm9yLlxuICpcbiAqIE1vbmtleS1wYXRjaGVzIGBhcHAucGx1Z2lucy5sb2FkUGx1Z2luYCB0byBpbnRlcmNlcHQgZXJyb3JzIGJlZm9yZVxuICogT2JzaWRpYW4ncyBgZW5hYmxlUGx1Z2luYCB0cnktY2F0Y2ggc3dhbGxvd3MgdGhlbS4gVGhlIG9yaWdpbmFsIG1ldGhvZFxuICogaXMgYWx3YXlzIHJlc3RvcmVkIGluIGEgYGZpbmFsbHlgIGJsb2NrLlxuICpcbiAqIERlc2lnbmVkIHRvIGJlIHBhc3NlZCBhcyB0aGUgYGZuYCBhcmd1bWVudCB0byB7QGxpbmsgZXZhbEluT2JzaWRpYW59LlxuICpcbiAqIEBwYXJhbSBhcmdzIC0gVGhlIGNvbW1vbiBhcmdzIHBsdXMgdGhlIHBsdWdpbiBJRC5cbiAqIEBwYXJhbSBhcmdzLmFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gYXJncy5wbHVnaW5JZCAtIFRoZSBJRCBvZiB0aGUgcGx1Z2luIHRvIGVuYWJsZS5cbiAqIEByZXR1cm5zIFRoZSBlbmFibGUgcmVzdWx0IHdpdGggZXJyb3IgbWVzc2FnZSBhbmQgZW5hYmxlZCBzdGF0dXMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlKHsgYXBwLCBwbHVnaW5JZCB9OiBDb21tb25BcmdzICYgRW5hYmxlUGx1Z2luUGFyYW1zKTogUHJvbWlzZTxFbmFibGVQbHVnaW5SZXN1bHQ+IHtcbiAgaWYgKCFhcHAucGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgIGF3YWl0IGFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgfVxuXG4gIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBJbnRlbnRpb25hbCBtb25rZXktcGF0Y2g7IHJlc3RvcmVkIGluIGZpbmFsbHkuXG4gIGNvbnN0IG9yaWdMb2FkUGx1Z2luID0gYXBwLnBsdWdpbnMubG9hZFBsdWdpbjtcbiAgYXBwLnBsdWdpbnMubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uIGxvYWRQbHVnaW4oaWQ6IHN0cmluZywgaXNVc2VyRW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPFBsdWdpbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmlnTG9hZFBsdWdpbi5jYWxsKHRoaXMsIGlkLCBpc1VzZXJFbmFibGVkKTtcbiAgICAgIGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAgICAgY29uc3QgaG9sZGVyID0gd2luZG93IGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICAgICAgZXJyb3JNZXNzYWdlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnNlcmlhbGl6ZUVycm9yKGVycm9yKSA/PyBTdHJpbmcoZXJyb3IpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnBsdWdpbnMuZW5hYmxlUGx1Z2luQW5kU2F2ZShwbHVnaW5JZCk7XG4gIH0gZmluYWxseSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gSW50ZW50aW9uYWwgcmVzdG9yZSBvZiBtb25rZXktcGF0Y2guXG4gICAgYXBwLnBsdWdpbnMubG9hZFBsdWdpbiA9IG9yaWdMb2FkUGx1Z2luO1xuICB9XG5cbiAgY29uc3QgaXNMb2FkZWQgPSBwbHVnaW5JZCBpbiBhcHAucGx1Z2lucy5wbHVnaW5zO1xuXG4gIGlmICghZXJyb3JNZXNzYWdlICYmICFpc0xvYWRlZCkge1xuICAgIGVycm9yTWVzc2FnZSA9IGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGlzIGluIHRoZSBlbmFibGVkIHNldCBidXQgbm90IGxvYWRlZC4gYFxuICAgICAgKyAnT2JzaWRpYW4gbWF5IGhhdmUgY2F1Z2h0IHRoZSBlcnJvciBiZWZvcmUgdGhlIG1vbmtleS1wYXRjaC4gJ1xuICAgICAgKyAnQ2hlY2sgdGhlIE9ic2lkaWFuIGNvbnNvbGUgZm9yIGRldGFpbHMuJztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIGlzRW5hYmxlZDogYXBwLnBsdWdpbnMuZW5hYmxlZFBsdWdpbnMuaGFzKHBsdWdpbklkKSxcbiAgICBpc0xvYWRlZFxuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBbUVBLGVBQXNCLDZCQUE2QixFQUFFLEtBQUssU0FBUyxHQUFpRTtBQUNsSSxNQUFJLENBQUMsSUFBSSxRQUFRLFVBQVUsR0FBRztBQUM1QixVQUFNLElBQUksUUFBUSxVQUFVLElBQUk7QUFBQSxFQUNsQztBQUVBLE1BQUk7QUFFSixRQUFNLGlCQUFpQixJQUFJLFFBQVE7QUFDbkMsTUFBSSxRQUFRLGFBQWEsZUFBZSxXQUFXLElBQVksZUFBMEM7QUFDdkcsUUFBSTtBQUNGLFlBQU0sU0FBUyxNQUFNLGVBQWUsS0FBSyxNQUFNLElBQUksYUFBYTtBQUNoRSxxQkFBZTtBQUNmLGFBQU87QUFBQSxJQUNULFNBQVMsT0FBTztBQUVkLFlBQU0sU0FBUztBQUNmLHFCQUFlLE9BQU8sOEJBQThCLGVBQWUsS0FBSyxLQUFLLE9BQU8sS0FBSztBQUN6RixZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFFQSxNQUFJO0FBQ0YsVUFBTSxJQUFJLFFBQVEsb0JBQW9CLFFBQVE7QUFBQSxFQUNoRCxVQUFFO0FBRUEsUUFBSSxRQUFRLGFBQWE7QUFBQSxFQUMzQjtBQUVBLFFBQU0sV0FBVyxZQUFZLElBQUksUUFBUTtBQUV6QyxNQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVTtBQUM5QixtQkFBZSxXQUFXLFFBQVE7QUFBQSxFQUdwQztBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxXQUFXLElBQUksUUFBUSxlQUFlLElBQUksUUFBUTtBQUFBLElBQ2xEO0FBQUEsRUFDRjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
|
package/dist/lib/esm/library.mjs
CHANGED