obsidian-integration-testing 9.1.1 → 9.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/README.md +223 -18
- package/dist/lib/cjs/connect-to-cdp.cjs +23 -2
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +44 -1
- package/dist/lib/cjs/global-setup-core.cjs +28 -1
- package/dist/lib/cjs/index.cjs +12 -1
- package/dist/lib/cjs/index.d.cts +5 -0
- package/dist/lib/cjs/leftover-cleanup.cjs +134 -0
- package/dist/lib/cjs/leftover-cleanup.d.cts +216 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +20 -2
- package/dist/lib/cjs/obsidian-metadata.cjs +18 -1
- package/dist/lib/cjs/run-version-matrix.cjs +64 -0
- package/dist/lib/cjs/run-version-matrix.d.cts +49 -0
- package/dist/lib/cjs/setup-lock.cjs +145 -32
- package/dist/lib/cjs/setup-lock.d.cts +9 -3
- package/dist/lib/cjs/temp-vault.cjs +3 -2
- package/dist/lib/cjs/transport-appium.cjs +102 -30
- package/dist/lib/cjs/transport-appium.d.cts +50 -3
- package/dist/lib/cjs/transport-factory.cjs +66 -4
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +175 -0
- package/dist/lib/cjs/version-matrix.d.cts +224 -0
- package/dist/lib/esm/connect-to-cdp.mjs +27 -2
- package/dist/lib/esm/eval-in-obsidian.d.mts +44 -1
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/global-setup-core.mjs +36 -2
- package/dist/lib/esm/index.d.mts +5 -0
- package/dist/lib/esm/index.mjs +11 -1
- package/dist/lib/esm/leftover-cleanup.d.mts +216 -0
- package/dist/lib/esm/leftover-cleanup.mjs +105 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +20 -2
- package/dist/lib/esm/obsidian-metadata.mjs +18 -1
- package/dist/lib/esm/run-version-matrix.d.mts +49 -0
- package/dist/lib/esm/run-version-matrix.mjs +48 -0
- package/dist/lib/esm/setup-lock.d.mts +9 -3
- package/dist/lib/esm/setup-lock.mjs +145 -32
- package/dist/lib/esm/temp-vault.mjs +3 -2
- package/dist/lib/esm/transport-appium.d.mts +50 -3
- package/dist/lib/esm/transport-appium.mjs +100 -29
- package/dist/lib/esm/transport-factory.mjs +75 -5
- package/dist/lib/esm/transport-options.d.mts +57 -0
- package/dist/lib/esm/version-matrix.d.mts +224 -0
- package/dist/lib/esm/version-matrix.mjs +147 -0
- package/dist/obsidian-integration-testing-9.2.1.tgz +0 -0
- package/package.json +18 -25
- package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readdir,
|
|
3
|
+
rm,
|
|
4
|
+
stat
|
|
5
|
+
} from "node:fs/promises";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
const DEFAULT_LEFTOVER_MAX_AGE_IN_MILLISECONDS = 72e5;
|
|
9
|
+
const HARNESS_TEMP_DIR_NAME = "obsidian-integration-testing";
|
|
10
|
+
const OWNED_USER_DATA_DIR_PREFIX = "userdata-";
|
|
11
|
+
const TEMP_VAULT_DIR_PREFIX = "temp-vault-";
|
|
12
|
+
function checkIsLeftoverStale(params) {
|
|
13
|
+
if (params.maxAgeInMilliseconds === 0) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
return params.nowInMilliseconds - params.modifiedAtInMilliseconds >= params.maxAgeInMilliseconds;
|
|
17
|
+
}
|
|
18
|
+
function filterLeftoverNames(params) {
|
|
19
|
+
const excludedNames = params.excludedNames ?? [];
|
|
20
|
+
return params.names.map((name) => name.trim()).filter((name) => params.prefixes.some((prefix) => name.startsWith(prefix))).filter((name) => !excludedNames.includes(name));
|
|
21
|
+
}
|
|
22
|
+
function resolveLeftoverMaxAgeInMilliseconds(options) {
|
|
23
|
+
return options?.leftoverMaxAgeInMilliseconds ?? DEFAULT_LEFTOVER_MAX_AGE_IN_MILLISECONDS;
|
|
24
|
+
}
|
|
25
|
+
function resolveShouldSweepLeftovers(options) {
|
|
26
|
+
return options?.shouldSweepLeftovers ?? true;
|
|
27
|
+
}
|
|
28
|
+
async function sweepDeviceLeftovers(params) {
|
|
29
|
+
const { listNames, removeDir, vaultBasePath } = params;
|
|
30
|
+
const names = filterLeftoverNames({ names: await listNames(), prefixes: [TEMP_VAULT_DIR_PREFIX] });
|
|
31
|
+
if (names.length === 0) {
|
|
32
|
+
return { failedNames: [], removedCount: 0 };
|
|
33
|
+
}
|
|
34
|
+
for (const name of names) {
|
|
35
|
+
try {
|
|
36
|
+
await removeDir(`${vaultBasePath}${name}`);
|
|
37
|
+
} catch {
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const survivingNames = filterLeftoverNames({ names: await listNames(), prefixes: [TEMP_VAULT_DIR_PREFIX] });
|
|
41
|
+
const failedNames = names.filter((name) => survivingNames.includes(name));
|
|
42
|
+
return { failedNames, removedCount: names.length - failedNames.length };
|
|
43
|
+
}
|
|
44
|
+
async function sweepHostLeftovers(options) {
|
|
45
|
+
const maxAgeInMilliseconds = options?.maxAgeInMilliseconds ?? DEFAULT_LEFTOVER_MAX_AGE_IN_MILLISECONDS;
|
|
46
|
+
const nowInMilliseconds = Date.now();
|
|
47
|
+
const roots = options?.roots ?? getDefaultLeftoverRoots();
|
|
48
|
+
let failedCount = 0;
|
|
49
|
+
let removedCount = 0;
|
|
50
|
+
for (const root of roots) {
|
|
51
|
+
const names = filterLeftoverNames({
|
|
52
|
+
excludedNames: options?.excludedNames,
|
|
53
|
+
names: await readDirNames(root.path),
|
|
54
|
+
prefixes: root.prefixes
|
|
55
|
+
});
|
|
56
|
+
for (const name of names) {
|
|
57
|
+
const path = join(root.path, name);
|
|
58
|
+
if (!await checkIsRemovableDir({ maxAgeInMilliseconds, nowInMilliseconds, path })) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
await rm(path, { force: true, recursive: true });
|
|
63
|
+
removedCount++;
|
|
64
|
+
} catch {
|
|
65
|
+
failedCount++;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return { failedCount, removedCount };
|
|
70
|
+
}
|
|
71
|
+
async function checkIsRemovableDir(params) {
|
|
72
|
+
const { maxAgeInMilliseconds, nowInMilliseconds } = params;
|
|
73
|
+
try {
|
|
74
|
+
const stats = await stat(params.path);
|
|
75
|
+
return stats.isDirectory() && checkIsLeftoverStale({ maxAgeInMilliseconds, modifiedAtInMilliseconds: stats.mtimeMs, nowInMilliseconds });
|
|
76
|
+
} catch {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function getDefaultLeftoverRoots() {
|
|
81
|
+
return [
|
|
82
|
+
{ path: tmpdir(), prefixes: [TEMP_VAULT_DIR_PREFIX] },
|
|
83
|
+
{ path: join(tmpdir(), HARNESS_TEMP_DIR_NAME), prefixes: [OWNED_USER_DATA_DIR_PREFIX] }
|
|
84
|
+
];
|
|
85
|
+
}
|
|
86
|
+
async function readDirNames(path) {
|
|
87
|
+
try {
|
|
88
|
+
return await readdir(path);
|
|
89
|
+
} catch {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
DEFAULT_LEFTOVER_MAX_AGE_IN_MILLISECONDS,
|
|
95
|
+
HARNESS_TEMP_DIR_NAME,
|
|
96
|
+
OWNED_USER_DATA_DIR_PREFIX,
|
|
97
|
+
TEMP_VAULT_DIR_PREFIX,
|
|
98
|
+
checkIsLeftoverStale,
|
|
99
|
+
filterLeftoverNames,
|
|
100
|
+
resolveLeftoverMaxAgeInMilliseconds,
|
|
101
|
+
resolveShouldSweepLeftovers,
|
|
102
|
+
sweepDeviceLeftovers,
|
|
103
|
+
sweepHostLeftovers
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2xlZnRvdmVyLWNsZWFudXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTd2VlcHMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBhIHByZXZpb3VzIGludGVncmF0aW9uIHJ1biBsZWFrZWQgXHUyMDE0IHRoZVxuICogYHRlbXAtdmF1bHQtKmAgc3RhZ2luZy92YXVsdCBkaXJlY3RvcmllcyBhbmQgdGhlIG93bmVkIGluc3RhbmNlJ3NcbiAqIGB1c2VyZGF0YS0qYCBDaHJvbWl1bSBwcm9maWxlcy5cbiAqXG4gKiBBIHJ1biB0aGF0IGRpZXMgbWlkLWZsaWdodCBjYW5ub3QgY2xlYW4gdXAgYWZ0ZXIgaXRzZWxmOiBvbiBBbmRyb2lkIHRoZVxuICogdGVhcmRvd24gdGFsa3MgdG8gdGhlIFdlYlZpZXcsIGFuZCBhIGRlYWQgV2ViVmlldyBpcyBleGFjdGx5IHdoYXQgbW9zdFxuICogZmFpbHVyZXMgYXJlIChgVmF1bHQgY2xlYW51cCBlcnJvciAobm9uLWZhdGFsKTogbm8gc3VjaCB3aW5kb3dgKS4gRXZlcnlcbiAqIGZhaWx1cmUgdGhlcmVmb3JlIGxlYWtzIGEgdmF1bHQsIGV2ZXJ5IGxlYWtlZCB2YXVsdCBzdGF5cyByZWdpc3RlcmVkIGZvclxuICogT2JzaWRpYW4gdG8gZW51bWVyYXRlIGF0IHN0YXJ0dXAsIGFuZCB0aGF0IGVudW1lcmF0aW9uIGhhcyB0byBmaW5pc2ggaW5zaWRlXG4gKiB0aGUgV2ViVmlldy1yZWFkaW5lc3MgYnVkZ2V0IFx1MjAxNCBzbyBlYWNoIGZhaWx1cmUgbWFrZXMgdGhlIG5leHQgb25lIGxpa2VsaWVyLlxuICogU3dlZXBpbmcgZm9yZWlnbiByZXNpZHVlIGF0IHRoZSBTVEFSVCBvZiBhIHJ1biBicmVha3MgdGhhdCBsb29wLCBiZWNhdXNlIGl0XG4gKiBydW5zIGJlZm9yZSBhbnl0aGluZyB0aGF0IGNhbiBkaWUuXG4gKlxuICogVGhlIHR3byBzaWRlcyB1c2UgZGVsaWJlcmF0ZWx5IGRpZmZlcmVudCBzYWZldHkgZ2F0ZXMgKHNlZSB0aGUgcmVwbydzIEwzMSk6XG4gKlxuICogLSAqKkRldmljZSAoQW5kcm9pZCkqKiBcdTIwMTQgdW5jb25kaXRpb25hbC4gQW5kcm9pZCBydW5zIGhvbGQgdGhlIGV4Y2x1c2l2ZVxuICogICBgYW5kcm9pZGAgc2V0dXAgbG9jaywgc28gbm8gY29uY3VycmVudCBydW4gY2FuIG93biBhIGRldmljZSB2YXVsdCwgYW5kIGFuXG4gKiAgIGFnZSBnYXRlIHdvdWxkIGxldCBhIHZhdWx0IGxlYWtlZCB0ZW4gbWludXRlcyBhZ28gc3Vydml2ZSBpbnRvIHRoZSBuZXh0IHJ1bi5cbiAqIC0gKipIb3N0KiogXHUyMDE0IGFnZS1nYXRlZC4gRGVza3RvcCBydW5zIGFyZSBkZWxpYmVyYXRlbHkgKm5vdCogc2VyaWFsaXplZCAoZWFjaFxuICogICBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlKSBhbmQgZXZlcnkgcHJvamVjdCBvbiB0aGUgbWFjaGluZSBzaGFyZXMgb25lXG4gKiAgIGB0bXBkaXIoKWAsIHNvIGEgZGlyZWN0b3J5IHlvdW5nIGVub3VnaCB0byBiZWxvbmcgdG8gYSBsaXZlIHJ1biBpcyBsZWZ0XG4gKiAgIGFsb25lLlxuICovXG5cbmltcG9ydCB7XG4gIHJlYWRkaXIsXG4gIHJtLFxuICBzdGF0XG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5cbi8qKlxuICogRGVmYXVsdCBmb3IgdGhlIGBsZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzYCB0cmFuc3BvcnQgb3B0aW9uIFx1MjAxNCB0d28gaG91cnMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTID0gNzIwMDAwMDtcblxuLyoqXG4gKiBOYW1lIG9mIHRoZSBoYXJuZXNzJ3Mgb3duIGRpcmVjdG9yeSBpbnNpZGUge0BsaW5rIHRtcGRpcn0sIHdoaWNoIGhvbGRzIHRoZVxuICogb3duZWQgaW5zdGFuY2VzJyB1c2VyLWRhdGEgZGlyZWN0b3JpZXMgYWxvbmdzaWRlIHRoZSB2ZXJzaW9uL2luc3RhbGxlciBjYWNoZXNcbiAqIGFuZCB0aGUgc2V0dXAgbG9ja3MuXG4gKi9cbmV4cG9ydCBjb25zdCBIQVJORVNTX1RFTVBfRElSX05BTUUgPSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyc7XG5cbi8qKlxuICogUHJlZml4IG9mIGFuIG93bmVkIGRlc2t0b3AgaW5zdGFuY2UncyBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgY29uc3QgT1dORURfVVNFUl9EQVRBX0RJUl9QUkVGSVggPSAndXNlcmRhdGEtJztcblxuLyoqXG4gKiBQcmVmaXggb2YgYSB0ZW1wb3JhcnkgdmF1bHQgZGlyZWN0b3J5LCBib3RoIG9uIHRoZSBob3N0ICh3aGVyZSBpdCBpcyBjcmVhdGVkKVxuICogYW5kIG9uIGFuIEFuZHJvaWQgZGV2aWNlICh3aGVyZSBpdCBrZWVwcyBpdHMgaG9zdCBiYXNlbmFtZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBURU1QX1ZBVUxUX0RJUl9QUkVGSVggPSAndGVtcC12YXVsdC0nO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjaGVja0lzTGVmdG92ZXJTdGFsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tJc0xlZnRvdmVyU3RhbGVQYXJhbXMge1xuICAvKipcbiAgICogSG93IG9sZCBhbiBlbnRyeSBtdXN0IGJlIHRvIGNvdW50IGFzIHN0YWxlLiBgMGAgZGlzYWJsZXMgdGhlIGdhdGUsIG1ha2luZ1xuICAgKiBldmVyeSBlbnRyeSBzdGFsZS5cbiAgICovXG4gIHJlYWRvbmx5IG1heEFnZUluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBlbnRyeSdzIG1vZGlmaWNhdGlvbiB0aW1lLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IG1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKiBUaGUgY3VycmVudCB0aW1lLCBpbiBlcG9jaCBtaWxsaXNlY29uZHMuICovXG4gIHJlYWRvbmx5IG5vd0luTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbHRlckxlZnRvdmVyTmFtZXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckxlZnRvdmVyTmFtZXNQYXJhbXMge1xuICAvKiogTmFtZXMgdG8ga2VlcCBldmVuIHdoZW4gdGhleSBtYXRjaCBhIHByZWZpeCAoZS5nLiB0aGUgY3VycmVudCBydW4ncyBvd24gdmF1bHQpLiAqL1xuICByZWFkb25seSBleGNsdWRlZE5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFJhdyBlbnRyeSBuYW1lcy4gQWNjZXB0cyBgYWRiIHNoZWxsIGxzYCBvdXRwdXQgc3BsaXQgaW50byBsaW5lcywgc28gZWFjaFxuICAgKiBuYW1lIGlzIHRyaW1tZWQgKGRyb3BwaW5nIHRoZSB0cmFpbGluZyBgXFxyYCBhbiBgYWRiYCBzaGVsbCBhZGRzIG9uIFdpbmRvd3MpXG4gICAqIGFuZCBibGFuayBsaW5lcyBhcmUgZHJvcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogRGlyZWN0b3J5LW5hbWUgcHJlZml4ZXMgdGhhdCBtYXJrIGFuIGVudHJ5IGFzIHRoZSBoYXJuZXNzJ3Mgb3duIHJlc2lkdWUuICovXG4gIHJlYWRvbmx5IHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGRpcmVjdG9yeSB0aGUgaG9zdCBzd2VlcCBzY2FucywgdG9nZXRoZXIgd2l0aCB0aGUgcHJlZml4ZXMgdGhhdCBtYXJrXG4gKiByZXNpZHVlIGluc2lkZSBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMZWZ0b3ZlclJvb3Qge1xuICAvKiogVGhlIGFic29sdXRlIHBhdGggdG8gc2Nhbi4gKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKiBEaXJlY3RvcnktbmFtZSBwcmVmaXhlcyB0aGF0IG1hcmsgYW4gZW50cnkgYXMgcmVtb3ZhYmxlIHJlc2lkdWUuICovXG4gIHJlYWRvbmx5IHByZWZpeGVzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgc3dlZXBEZXZpY2VMZWZ0b3ZlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3ZWVwRGV2aWNlTGVmdG92ZXJzUGFyYW1zIHtcbiAgLyoqXG4gICAqIExpc3RzIHRoZSBlbnRyeSBuYW1lcyBkaXJlY3RseSB1bmRlciB0aGUgdmF1bHQgYmFzZSBwYXRoLiBBIGxpc3RpbmcgZmFpbHVyZVxuICAgKiBtdXN0IHJlc29sdmUgdG8gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiByZWplY3QgXHUyMDE0IGEgZGV2aWNlIHdpdGggbm8gdmF1bHRcbiAgICogZGlyZWN0b3J5IHlldCBpcyB0aGUgbm9ybWFsIGZpcnN0LXJ1biBzdGF0ZSwgbm90IGFuIGVycm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbGlzdE5hbWVzOiAoKSA9PiBQcm9taXNlPHJlYWRvbmx5IHN0cmluZ1tdPjtcblxuICAvKipcbiAgICogUmVtb3ZlcyBPTkUgZGlyZWN0b3J5LCBieSBhYnNvbHV0ZSBkZXZpY2UgcGF0aC4gTWF5IHJlamVjdDsgdGhlIGNhbGxlclxuICAgKiB0cmVhdHMgYSByZWplY3Rpb24gYXMgdGhpcyBkaXJlY3RvcnkgZmFpbGluZyBhbmQgbW92ZXMgb24gdG8gdGhlIG5leHQuXG4gICAqL1xuICByZWFkb25seSByZW1vdmVEaXI6IChwYXRoOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIFRoZSBhYnNvbHV0ZSBkZXZpY2UgcGF0aCB0aGUgdmF1bHRzIHNpdCB1bmRlciwgaW5jbHVkaW5nIGl0cyB0cmFpbGluZyBzZXBhcmF0b3IuICovXG4gIHJlYWRvbmx5IHZhdWx0QmFzZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIHN3ZWVwRGV2aWNlTGVmdG92ZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcERldmljZUxlZnRvdmVyc1Jlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZXMgdGhhdCB3ZXJlIHN0aWxsIHByZXNlbnQgYWZ0ZXIgdGhlIHN3ZWVwLiBOYW1lZCByYXRoZXIgdGhhblxuICAgKiBjb3VudGVkLCBiZWNhdXNlIHRoZSBpbnRlcmVzdGluZyBjYXNlIGlzIGEgZGlyZWN0b3J5IHRoYXQgZmFpbHMgRVZFUlkgcnVuXG4gICAqIGFuZCBhIGNhbGxlciBjYW4gb25seSBzYXkgc28gaWYgaXQga25vd3Mgd2hpY2ggb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbGVkTmFtZXM6IHN0cmluZ1tdO1xuXG4gIC8qKiBIb3cgbWFueSBkaXJlY3RvcmllcyBhcmUgdmVyaWZpYWJseSBnb25lLiAqL1xuICByZWFkb25seSByZW1vdmVkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgc3dlZXBIb3N0TGVmdG92ZXJzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEhvc3RMZWZ0b3ZlcnNPcHRpb25zIHtcbiAgLyoqIE5hbWVzIHRvIGtlZXAgcmVnYXJkbGVzcyBvZiBhZ2UgKGUuZy4gdGhlIGN1cnJlbnQgcnVuJ3Mgb3duIGRpcmVjdG9yaWVzKS4gKi9cbiAgcmVhZG9ubHkgZXhjbHVkZWROYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBIb3cgb2xkIGEgZGlyZWN0b3J5IG11c3QgYmUgYmVmb3JlIGl0IGlzIHJlbW92ZWQuIGAwYCByZW1vdmVzIGV2ZXJ5IG1hdGNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgREVGQVVMVF9MRUZUT1ZFUl9NQVhfQUdFX0lOX01JTExJU0VDT05EU31cbiAgICovXG4gIHJlYWRvbmx5IG1heEFnZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgcm9vdHMgdG8gc3dlZXAuIERlZmF1bHRzIHRvIHRoZSB0ZW1wLXZhdWx0IHJvb3QgKHtAbGluayB0bXBkaXJ9KSBhbmQgdGhlXG4gICAqIG93bmVkIHVzZXItZGF0YSByb290IChgPHRtcGRpcj4ve0BsaW5rIEhBUk5FU1NfVEVNUF9ESVJfTkFNRX1gKS5cbiAgICovXG4gIHJlYWRvbmx5IHJvb3RzPzogcmVhZG9ubHkgTGVmdG92ZXJSb290W10gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBzd2VlcEhvc3RMZWZ0b3ZlcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3ZWVwSG9zdExlZnRvdmVyc1Jlc3VsdCB7XG4gIC8qKiBIb3cgbWFueSBkaXJlY3RvcmllcyB3ZXJlIHNlbGVjdGVkIGZvciByZW1vdmFsIGJ1dCBjb3VsZCBub3QgYmUgcmVtb3ZlZC4gKi9cbiAgcmVhZG9ubHkgZmFpbGVkQ291bnQ6IG51bWJlcjtcblxuICAvKiogSG93IG1hbnkgZGlyZWN0b3JpZXMgd2VyZSByZW1vdmVkLiAqL1xuICByZWFkb25seSByZW1vdmVkQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY2hlY2tJc1JlbW92YWJsZURpcn0uXG4gKi9cbmludGVyZmFjZSBDaGVja0lzUmVtb3ZhYmxlRGlyUGFyYW1zIHtcbiAgLyoqIEhvdyBvbGQgdGhlIGVudHJ5IG11c3QgYmUgdG8gYmUgcmVtb3ZlZCAoYDBgIGRpc2FibGVzIHRoZSBnYXRlKS4gKi9cbiAgcmVhZG9ubHkgbWF4QWdlSW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIHN3ZWVwJ3MgcmVmZXJlbmNlIHRpbWUsIGluIGVwb2NoIG1pbGxpc2Vjb25kcy4gKi9cbiAgcmVhZG9ubHkgbm93SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKiogVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIGVudHJ5LiAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGV0aGVyIGEgbGVmdG92ZXIgZW50cnkgaXMgb2xkIGVub3VnaCB0byBiZSByZW1vdmVkLlxuICpcbiAqIFRoZSBnYXRlIGV4aXN0cyBiZWNhdXNlIGV2ZXJ5IHByb2plY3Qgb24gdGhlIG1hY2hpbmUgc2hhcmVzIG9uZSBgdG1wZGlyKClgXG4gKiBhbmQgZGVza3RvcCBydW5zIGFyZSBub3Qgc2VyaWFsaXplZCwgc28gYSB5b3VuZyBkaXJlY3RvcnkgbWF5IHdlbGwgYmVsb25nIHRvXG4gKiBhIHJ1biB0aGF0IGlzIHN0aWxsIGluIGZsaWdodC4gQW4gZW50cnkgd2hvc2UgbW9kaWZpY2F0aW9uIHRpbWUgaXMgaW4gdGhlXG4gKiBmdXR1cmUgKGEgY2xvY2sgc2tldykgaXMgdHJlYXRlZCBhcyBsaXZlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBhZ2UgY29tcGFyaXNvbiBpbnB1dHMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZW50cnkgbWF5IGJlIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lzTGVmdG92ZXJTdGFsZShwYXJhbXM6IENoZWNrSXNMZWZ0b3ZlclN0YWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGlmIChwYXJhbXMubWF4QWdlSW5NaWxsaXNlY29uZHMgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBwYXJhbXMubm93SW5NaWxsaXNlY29uZHMgLSBwYXJhbXMubW9kaWZpZWRBdEluTWlsbGlzZWNvbmRzID49IHBhcmFtcy5tYXhBZ2VJbk1pbGxpc2Vjb25kcztcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHRoZSBlbnRyeSBuYW1lcyB0aGF0IGFyZSB0aGUgaGFybmVzcydzIG93biByZXNpZHVlLlxuICpcbiAqIE5hbWUtb25seSwgc28gdGhlIGNhbGxlciBjYW4gZmlsdGVyIGEgbGFyZ2UgZGlyZWN0b3J5IGxpc3RpbmcgYmVmb3JlIHBheWluZ1xuICogZm9yIGEgYHN0YXRgIHBlciBlbnRyeSwgYW5kIHNvIHRoZSBBbmRyb2lkIHN3ZWVwIGNhbiBmZWVkIGl0IHJhd1xuICogYGFkYiBzaGVsbCBsc2Agb3V0cHV0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbmFtZXMsIHByZWZpeGVzLCBhbmQgZXhjbHVzaW9ucy5cbiAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBuYW1lcywgdHJpbW1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckxlZnRvdmVyTmFtZXMocGFyYW1zOiBGaWx0ZXJMZWZ0b3Zlck5hbWVzUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNsdWRlZE5hbWVzID0gcGFyYW1zLmV4Y2x1ZGVkTmFtZXMgPz8gW107XG4gIHJldHVybiBwYXJhbXMubmFtZXNcbiAgICAubWFwKChuYW1lKSA9PiBuYW1lLnRyaW0oKSlcbiAgICAuZmlsdGVyKChuYW1lKSA9PiBwYXJhbXMucHJlZml4ZXMuc29tZSgocHJlZml4KSA9PiBuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkpXG4gICAgLmZpbHRlcigobmFtZSkgPT4gIWV4Y2x1ZGVkTmFtZXMuaW5jbHVkZXMobmFtZSkpO1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsZWZ0b3ZlciBhZ2UgZ2F0ZSwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlbiB0aGUgb3B0aW9uIGlzXG4gKiBvbWl0dGVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIG1heCBhZ2UgaW4gbWlsbGlzZWNvbmRzIChgMGAgZGlzYWJsZXMgdGhlIGdhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHMob3B0aW9uczogT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIG9wdGlvbnM/LmxlZnRvdmVyTWF4QWdlSW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MRUZUT1ZFUl9NQVhfQUdFX0lOX01JTExJU0VDT05EUztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB3aGV0aGVyIGxlZnRvdmVyIGRpcmVjdG9yaWVzIGFyZSBzd2VwdCwgYXBwbHlpbmcgdGhlIGRlZmF1bHQgd2hlblxuICogdGhlIG9wdGlvbiBpcyBvbWl0dGVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIHN3ZWVwcyBzaG91bGQgcnVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNob3VsZFN3ZWVwTGVmdG92ZXJzKG9wdGlvbnM6IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb3B0aW9ucz8uc2hvdWxkU3dlZXBMZWZ0b3ZlcnMgPz8gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBsZWZ0b3ZlciB2YXVsdCBkaXJlY3RvcmllcyBhIGRldmljZSBpcyBjYXJyeWluZywgb25lIGRpcmVjdG9yeSBhdFxuICogYSB0aW1lLCBhbmQgcmVwb3J0cyB3aGF0IGlzIHZlcmlmaWFibHkgZ29uZS5cbiAqXG4gKiAqKk9uZSBkaXJlY3RvcnkgcGVyIHJlbW92YWwsIGFuZCBhIGZhaWx1cmUgaXMgbm9uLWZhdGFsLioqIFJlbW92aW5nIHRoZSB3aG9sZVxuICogc2V0IGluIGEgc2luZ2xlIGBybSAtcmZgIGxldHMgb25lIHVuLXJlbW92YWJsZSBlbnRyeSBkZWNpZGUgdGhlIGZhdGUgb2YgZXZlcnlcbiAqIG90aGVyOiBhIG5hbWUgdGhhdCB0aGUgRlVTRSBsYXllciBjYW5ub3QgZXhwcmVzcyAoYW4gQW5kcm9pZCBlbXVsYXRvciBjYW5cbiAqIHByb2R1Y2Ugb25lIFx1MjAxNCBgcm0gLXJmYCwgYGZpbmQgLWRlbGV0ZWAgYW5kIGZvcmNlLXN0b3BwaW5nIE9ic2lkaWFuIGZpcnN0IGFsbFxuICogYW5zd2VyIGBPcGVyYXRpb24gbm90IHBlcm1pdHRlZGApIGlzIHBlcm1hbmVudCwgc28gYSBzd2VlcCB0aGF0IGdpdmVzIHVwIG9uIGl0XG4gKiBnaXZlcyB1cCBmb3JldmVyLCBhbmQgdGhlIHJlc2lkdWUgb25seSBncm93cy4gUGVyLWRpcmVjdG9yeSwgdGhhdCBlbnRyeSBjb3N0c1xuICogb25lIHdhcm5pbmcgcGVyIHJ1biBpbnN0ZWFkIG9mIHRoZSB3aG9sZSBzd2VlcC5cbiAqXG4gKiAqKlRoZSByZXN1bHQgaXMgbWVhc3VyZWQsIG5vdCBhc3N1bWVkLioqIFRoZSBkaXJlY3RvcmllcyBhcmUgcmUtbGlzdGVkXG4gKiBhZnRlcndhcmRzIGFuZCBvbmx5IHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgZGlzYXBwZWFyZWQgYXJlIGNvdW50ZWQsIGJlY2F1c2VcbiAqIHRoZSBmYWlsdXJlIHRoaXMgd2FzIHdyaXR0ZW4gZm9yIHdhcyBhIHN3ZWVwIHRoYXQgcmVwb3J0ZWQgc3VjY2VzcyB3aGlsZVxuICogY2xlYXJpbmcgbm90aGluZyBcdTIwMTQgYSByZW1vdmFsIGNvbW1hbmQgY2FuIGV4aXQgbm9uLXplcm8sIG9yIHBhcnRpYWxseSBzdWNjZWVkLFxuICogYW5kIG5laXRoZXIgaXMgdmlzaWJsZSBmcm9tIGl0cyBleGl0IGNvZGUgYWxvbmUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIEhvdyB0byBsaXN0IGFuZCByZW1vdmUsIGFuZCB0aGUgYmFzZSBwYXRoIHRvIHN3ZWVwLlxuICogQHJldHVybnMgVGhlIHZlcmlmaWVkIHJlbW92YWwgY291bnQgYW5kIHRoZSBuYW1lcyB0aGF0IHN1cnZpdmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBEZXZpY2VMZWZ0b3ZlcnMoXG4gIHBhcmFtczogU3dlZXBEZXZpY2VMZWZ0b3ZlcnNQYXJhbXNcbik6IFByb21pc2U8U3dlZXBEZXZpY2VMZWZ0b3ZlcnNSZXN1bHQ+IHtcbiAgY29uc3QgeyBsaXN0TmFtZXMsIHJlbW92ZURpciwgdmF1bHRCYXNlUGF0aCB9ID0gcGFyYW1zO1xuXG4gIGNvbnN0IG5hbWVzID0gZmlsdGVyTGVmdG92ZXJOYW1lcyh7IG5hbWVzOiBhd2FpdCBsaXN0TmFtZXMoKSwgcHJlZml4ZXM6IFtURU1QX1ZBVUxUX0RJUl9QUkVGSVhdIH0pO1xuICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHsgZmFpbGVkTmFtZXM6IFtdLCByZW1vdmVkQ291bnQ6IDAgfTtcbiAgfVxuXG4gIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW1vdmVEaXIoYCR7dmF1bHRCYXNlUGF0aH0ke25hbWV9YCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBOb24tZmF0YWwgYnkgZGVzaWduOiB0aGUgbmV4dCBkaXJlY3Rvcnkgc3RpbGwgZ2V0cyBpdHMgY2hhbmNlLlxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN1cnZpdmluZ05hbWVzID0gZmlsdGVyTGVmdG92ZXJOYW1lcyh7IG5hbWVzOiBhd2FpdCBsaXN0TmFtZXMoKSwgcHJlZml4ZXM6IFtURU1QX1ZBVUxUX0RJUl9QUkVGSVhdIH0pO1xuICBjb25zdCBmYWlsZWROYW1lcyA9IG5hbWVzLmZpbHRlcigobmFtZSkgPT4gc3Vydml2aW5nTmFtZXMuaW5jbHVkZXMobmFtZSkpO1xuXG4gIHJldHVybiB7IGZhaWxlZE5hbWVzLCByZW1vdmVkQ291bnQ6IG5hbWVzLmxlbmd0aCAtIGZhaWxlZE5hbWVzLmxlbmd0aCB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSBkaXJlY3RvcmllcyBsZWZ0IGJlaGluZCBieSBlYXJsaWVyIHJ1bnMuXG4gKlxuICogQmVzdC1lZmZvcnQgdGhyb3VnaG91dDogYW4gdW5yZWFkYWJsZSByb290LCBhbiBlbnRyeSB0aGF0IGNhbm5vdCBiZSBgc3RhdGBlZCxcbiAqIGFuZCBhIGRpcmVjdG9yeSB0aGF0IHJlZnVzZXMgdG8gYmUgcmVtb3ZlZCAoYSBsaXZlIHByb2Nlc3Mgc3RpbGwgaG9sZGluZyBhXG4gKiBoYW5kbGUgYW5zd2VycyBgRVBFUk1gIG9uIFdpbmRvd3MpIGFyZSBhbGwgc2tpcHBlZCByYXRoZXIgdGhhbiB0aHJvd24sIHNvIGFcbiAqIHN3ZWVwIGNhbiBuZXZlciBmYWlsIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHN3ZWVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBIb3cgbWFueSBkaXJlY3RvcmllcyB3ZXJlIHJlbW92ZWQsIGFuZCBob3cgbWFueSByZXNpc3RlZCByZW1vdmFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3dlZXBIb3N0TGVmdG92ZXJzKG9wdGlvbnM/OiBTd2VlcEhvc3RMZWZ0b3ZlcnNPcHRpb25zKTogUHJvbWlzZTxTd2VlcEhvc3RMZWZ0b3ZlcnNSZXN1bHQ+IHtcbiAgY29uc3QgbWF4QWdlSW5NaWxsaXNlY29uZHMgPSBvcHRpb25zPy5tYXhBZ2VJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xFRlRPVkVSX01BWF9BR0VfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCBub3dJbk1pbGxpc2Vjb25kcyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHJvb3RzID0gb3B0aW9ucz8ucm9vdHMgPz8gZ2V0RGVmYXVsdExlZnRvdmVyUm9vdHMoKTtcblxuICBsZXQgZmFpbGVkQ291bnQgPSAwO1xuICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcblxuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICBjb25zdCBuYW1lcyA9IGZpbHRlckxlZnRvdmVyTmFtZXMoe1xuICAgICAgZXhjbHVkZWROYW1lczogb3B0aW9ucz8uZXhjbHVkZWROYW1lcyxcbiAgICAgIG5hbWVzOiBhd2FpdCByZWFkRGlyTmFtZXMocm9vdC5wYXRoKSxcbiAgICAgIHByZWZpeGVzOiByb290LnByZWZpeGVzXG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGNvbnN0IHBhdGggPSBqb2luKHJvb3QucGF0aCwgbmFtZSk7XG4gICAgICBpZiAoIWF3YWl0IGNoZWNrSXNSZW1vdmFibGVEaXIoeyBtYXhBZ2VJbk1pbGxpc2Vjb25kcywgbm93SW5NaWxsaXNlY29uZHMsIHBhdGggfSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHJtKHBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgZmFpbGVkQ291bnQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBmYWlsZWRDb3VudCwgcmVtb3ZlZENvdW50IH07XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgYSBtYXRjaGVkIGVudHJ5IGlzIGEgZGlyZWN0b3J5IG9sZCBlbm91Z2ggdG8gcmVtb3ZlLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW50cnkgcGF0aCBhbmQgYWdlLWdhdGUgaW5wdXRzLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVudHJ5IG1heSBiZSByZW1vdmVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjaGVja0lzUmVtb3ZhYmxlRGlyKHBhcmFtczogQ2hlY2tJc1JlbW92YWJsZURpclBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IG1heEFnZUluTWlsbGlzZWNvbmRzLCBub3dJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXJhbXMucGF0aCk7XG4gICAgcmV0dXJuIHN0YXRzLmlzRGlyZWN0b3J5KClcbiAgICAgICYmIGNoZWNrSXNMZWZ0b3ZlclN0YWxlKHsgbWF4QWdlSW5NaWxsaXNlY29uZHMsIG1vZGlmaWVkQXRJbk1pbGxpc2Vjb25kczogc3RhdHMubXRpbWVNcywgbm93SW5NaWxsaXNlY29uZHMgfSk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIFZhbmlzaGVkLCBvciB1bnJlYWRhYmxlIFx1MjAxNCBlaXRoZXIgd2F5IGl0IGlzIG5vdCBvdXJzIHRvIHJlbW92ZS5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290cyBzd2VwdCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3QgbmFtZSBpdHMgb3duLlxuICpcbiAqIEByZXR1cm5zIFRoZSB0ZW1wLXZhdWx0IHJvb3QgYW5kIHRoZSBvd25lZCB1c2VyLWRhdGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gZ2V0RGVmYXVsdExlZnRvdmVyUm9vdHMoKTogTGVmdG92ZXJSb290W10ge1xuICByZXR1cm4gW1xuICAgIHsgcGF0aDogdG1wZGlyKCksIHByZWZpeGVzOiBbVEVNUF9WQVVMVF9ESVJfUFJFRklYXSB9LFxuICAgIHsgcGF0aDogam9pbih0bXBkaXIoKSwgSEFSTkVTU19URU1QX0RJUl9OQU1FKSwgcHJlZml4ZXM6IFtPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWF0gfVxuICBdO1xufVxuXG4vKipcbiAqIExpc3RzIGEgZGlyZWN0b3J5J3MgZW50cnkgbmFtZXMsIHRyZWF0aW5nIGFuIHVucmVhZGFibGUgZGlyZWN0b3J5IGFzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSBwYXRoIC0gVGhlIGFic29sdXRlIHBhdGggdG8gbGlzdC5cbiAqIEByZXR1cm5zIFRoZSBlbnRyeSBuYW1lcywgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZERpck5hbWVzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcmVhZGRpcihwYXRoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQkE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQU9kLE1BQU0sMkNBQTJDO0FBT2pELE1BQU0sd0JBQXdCO0FBSzlCLE1BQU0sNkJBQTZCO0FBTW5DLE1BQU0sd0JBQXdCO0FBOEk5QixTQUFTLHFCQUFxQixRQUE2QztBQUNoRixNQUFJLE9BQU8seUJBQXlCLEdBQUc7QUFDckMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLE9BQU8sb0JBQW9CLE9BQU8sNEJBQTRCLE9BQU87QUFDOUU7QUFZTyxTQUFTLG9CQUFvQixRQUE2QztBQUMvRSxRQUFNLGdCQUFnQixPQUFPLGlCQUFpQixDQUFDO0FBQy9DLFNBQU8sT0FBTyxNQUNYLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQ3pCLE9BQU8sQ0FBQyxTQUFTLE9BQU8sU0FBUyxLQUFLLENBQUMsV0FBVyxLQUFLLFdBQVcsTUFBTSxDQUFDLENBQUMsRUFDMUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxjQUFjLFNBQVMsSUFBSSxDQUFDO0FBQ25EO0FBU08sU0FBUyxvQ0FBb0MsU0FBdUQ7QUFDekcsU0FBTyxTQUFTLGdDQUFnQztBQUNsRDtBQVNPLFNBQVMsNEJBQTRCLFNBQXdEO0FBQ2xHLFNBQU8sU0FBUyx3QkFBd0I7QUFDMUM7QUF1QkEsZUFBc0IscUJBQ3BCLFFBQ3FDO0FBQ3JDLFFBQU0sRUFBRSxXQUFXLFdBQVcsY0FBYyxJQUFJO0FBRWhELFFBQU0sUUFBUSxvQkFBb0IsRUFBRSxPQUFPLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0FBQ2pHLE1BQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsV0FBTyxFQUFFLGFBQWEsQ0FBQyxHQUFHLGNBQWMsRUFBRTtBQUFBLEVBQzVDO0FBRUEsYUFBVyxRQUFRLE9BQU87QUFDeEIsUUFBSTtBQUNGLFlBQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxJQUFJLEVBQUU7QUFBQSxJQUMzQyxRQUFRO0FBQUEsSUFFUjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGlCQUFpQixvQkFBb0IsRUFBRSxPQUFPLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0FBQzFHLFFBQU0sY0FBYyxNQUFNLE9BQU8sQ0FBQyxTQUFTLGVBQWUsU0FBUyxJQUFJLENBQUM7QUFFeEUsU0FBTyxFQUFFLGFBQWEsY0FBYyxNQUFNLFNBQVMsWUFBWSxPQUFPO0FBQ3hFO0FBYUEsZUFBc0IsbUJBQW1CLFNBQXdFO0FBQy9HLFFBQU0sdUJBQXVCLFNBQVMsd0JBQXdCO0FBQzlELFFBQU0sb0JBQW9CLEtBQUssSUFBSTtBQUNuQyxRQUFNLFFBQVEsU0FBUyxTQUFTLHdCQUF3QjtBQUV4RCxNQUFJLGNBQWM7QUFDbEIsTUFBSSxlQUFlO0FBRW5CLGFBQVcsUUFBUSxPQUFPO0FBQ3hCLFVBQU0sUUFBUSxvQkFBb0I7QUFBQSxNQUNoQyxlQUFlLFNBQVM7QUFBQSxNQUN4QixPQUFPLE1BQU0sYUFBYSxLQUFLLElBQUk7QUFBQSxNQUNuQyxVQUFVLEtBQUs7QUFBQSxJQUNqQixDQUFDO0FBRUQsZUFBVyxRQUFRLE9BQU87QUFDeEIsWUFBTSxPQUFPLEtBQUssS0FBSyxNQUFNLElBQUk7QUFDakMsVUFBSSxDQUFDLE1BQU0sb0JBQW9CLEVBQUUsc0JBQXNCLG1CQUFtQixLQUFLLENBQUMsR0FBRztBQUNqRjtBQUFBLE1BQ0Y7QUFFQSxVQUFJO0FBQ0YsY0FBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLE1BQU0sV0FBVyxLQUFLLENBQUM7QUFDL0M7QUFBQSxNQUNGLFFBQVE7QUFDTjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sRUFBRSxhQUFhLGFBQWE7QUFDckM7QUFRQSxlQUFlLG9CQUFvQixRQUFxRDtBQUN0RixRQUFNLEVBQUUsc0JBQXNCLGtCQUFrQixJQUFJO0FBQ3BELE1BQUk7QUFDRixVQUFNLFFBQVEsTUFBTSxLQUFLLE9BQU8sSUFBSTtBQUNwQyxXQUFPLE1BQU0sWUFBWSxLQUNwQixxQkFBcUIsRUFBRSxzQkFBc0IsMEJBQTBCLE1BQU0sU0FBUyxrQkFBa0IsQ0FBQztBQUFBLEVBQ2hILFFBQVE7QUFFTixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBT0EsU0FBUywwQkFBMEM7QUFDakQsU0FBTztBQUFBLElBQ0wsRUFBRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMscUJBQXFCLEVBQUU7QUFBQSxJQUNwRCxFQUFFLE1BQU0sS0FBSyxPQUFPLEdBQUcscUJBQXFCLEdBQUcsVUFBVSxDQUFDLDBCQUEwQixFQUFFO0FBQUEsRUFDeEY7QUFDRjtBQVFBLGVBQWUsYUFBYSxNQUFpQztBQUMzRCxNQUFJO0FBQ0YsV0FBTyxNQUFNLFFBQVEsSUFBSTtBQUFBLEVBQzNCLFFBQVE7QUFDTixXQUFPLENBQUM7QUFBQSxFQUNWO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
package/dist/lib/esm/library.mjs
CHANGED
|
@@ -29,6 +29,7 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
29
29
|
const INPUT_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
30
30
|
const WAIT_UNTIL_POLL_INTERVAL_IN_MILLISECONDS = 50;
|
|
31
31
|
const WAIT_UNTIL_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
32
|
+
const CREATE_NOTE_REPAIR_ATTEMPT_COUNT = 3;
|
|
32
33
|
const STACK_TRACE_PREFIX = " at";
|
|
33
34
|
const holder = window;
|
|
34
35
|
const existingContexts = holder.__obsidianIntegrationTesting?.contexts ?? {};
|
|
@@ -70,7 +71,7 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
70
71
|
this.contexts[params.contextId] = context;
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
|
-
const lib = { hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement, waitUntil };
|
|
74
|
+
const lib = { createNote, hoverElement, moveMouse, pressKey, typeIntoEditor, unhoverElement, waitUntil };
|
|
74
75
|
for (const resolveLib of this.libResolvers) {
|
|
75
76
|
Object.assign(lib, resolveLib());
|
|
76
77
|
}
|
|
@@ -226,6 +227,23 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
226
227
|
await sleep(INPUT_POLL_INTERVAL_IN_MILLISECONDS);
|
|
227
228
|
}
|
|
228
229
|
}
|
|
230
|
+
async function createNote(createParams) {
|
|
231
|
+
const { content, path } = createParams;
|
|
232
|
+
const file = await ns.app.vault.create(path, content);
|
|
233
|
+
for (let attempt = 0; attempt <= CREATE_NOTE_REPAIR_ATTEMPT_COUNT; attempt++) {
|
|
234
|
+
const actualContent = await ns.app.vault.read(file);
|
|
235
|
+
if (actualContent === content) {
|
|
236
|
+
return file;
|
|
237
|
+
}
|
|
238
|
+
if (attempt === CREATE_NOTE_REPAIR_ATTEMPT_COUNT) {
|
|
239
|
+
throw new Error(
|
|
240
|
+
`createNote could not write "${path}": expected ${String(content.length)} characters, the vault holds ${String(actualContent.length)} after ${String(CREATE_NOTE_REPAIR_ATTEMPT_COUNT)} repair attempts.`
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
await ns.app.vault.modify(file, content);
|
|
244
|
+
}
|
|
245
|
+
throw new Error(`createNote could not write "${path}".`);
|
|
246
|
+
}
|
|
229
247
|
async function waitUntil(waitParams) {
|
|
230
248
|
const {
|
|
231
249
|
intervalInMilliseconds = WAIT_UNTIL_POLL_INTERVAL_IN_MILLISECONDS,
|
|
@@ -278,4 +296,4 @@ ${generateStackTraceLine(line)}`;
|
|
|
278
296
|
export {
|
|
279
297
|
ensureNamespaceBootstrapped
|
|
280
298
|
};
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgUHJlc3NLZXlQYXJhbXMsXG4gIFR5cGVJbnRvRWRpdG9yUGFyYW1zLFxuICBVbmhvdmVyRWxlbWVudFBhcmFtcyxcbiAgV2FpdFVudGlsUGFyYW1zXG59IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZUZ1bmN0aW9uQ2FsbFBhcmFtcyB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbCB9IGZyb20gJy4vZ2VuZXJhdGUtZnVuY3Rpb24tY2FsbC5tanMnO1xuaW1wb3J0IHtcbiAgZ2V0Qm9vdHN0cmFwVmVyc2lvbixcbiAgZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVyc1xufSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgcmVhZG9ubHkgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGUgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBuYW1lc3BhY2UgaXMgYm9vdHN0cmFwcGVkXG4gKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2VzcyB3aXRoIHRoZSBjdXJyZW50IGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQZXJmb3JtcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gY2hlY2sgdmlhIHRoZSB0cmFuc3BvcnQuIElmIHRoZSBuYW1lc3BhY2VcbiAqIGRvZXNuJ3QgZXhpc3Qgb3IgaGFzIGEgZGlmZmVyZW50IHZlcnNpb24sIHNlbmRzIHRoZSBmdWxsIGJvb3RzdHJhcCBleHByZXNzaW9uXG4gKiB0byByZWdpc3RlciBhbGwgaGVscGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gY3dkIC0gVGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh2YXVsdCBwYXRoKS5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBPcHRpb25hbCBwZXItZXZhbCB0aW1lb3V0LiBGb3J3YXJkZWQgdG8gYm90aFxuICogICB0aGUgdmVyc2lvbiBjaGVjayBhbmQgdGhlIGJvb3RzdHJhcCBldmFsIHNvIGEgaHVuZyBgb2JzaWRpYW4gZXZhbGAgcmVqZWN0c1xuICogICBpbnN0ZWFkIG9mIGJsb2NraW5nIHRoZSBjYWxsZXIgaW5kZWZpbml0ZWx5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQsIGN3ZDogc3RyaW5nLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZXZhbE9wdGlvbnM6IFRyYW5zcG9ydEV2YWxPcHRpb25zID0ge1xuICAgIGN3ZCxcbiAgICAuLi4odGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB0aW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgfTtcbiAgY29uc3QgYm9vdHN0cmFwVmVyc2lvbiA9IGdldEJvb3RzdHJhcFZlcnNpb24oKTtcbiAgY29uc3QgdmVyc2lvbkpzb24gPSBKU09OLnN0cmluZ2lmeShib290c3RyYXBWZXJzaW9uKTtcbiAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKGNoZWNrUmVzdWx0ID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwciwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgZm4oZm5BcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBnZXRCYXNlUGF0aD86ICgpID0+IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJcGNTZW5kU3luY1BhcmFtcyB7XG4gICAgcmVhZG9ubHkgYXJnczogdW5rbm93bltdO1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgfVxuXG4gIC8vIENvbW11bml0eS1wbHVnaW4gQVBJIG1lbWJlcnMgdGhhdCBvbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIGxhY2suXG4gIC8vIGBvYnNpZGlhbi10eXBpbmdzYCBkZWNsYXJlcyB0aGVtIGFzIGFsd2F5cy1wcmVzZW50LCBzbyBwcm9iZSB0aHJvdWdoIHRoaXNcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXcgdG8gZGV0ZWN0IHRoZWlyIHJ1bnRpbWUgYWJzZW5jZSB3aXRob3V0IGEgZmFsc2VcbiAgLy8gYG5vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbmAuXG4gIGludGVyZmFjZSBQbHVnaW5zTGlrZSB7XG4gICAgaXNFbmFibGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBsb2FkUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgbWFuaWZlc3RzPzogdW5rbm93bjtcbiAgICB1bmluc3RhbGxQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfVxuXG4gIGludGVyZmFjZSBTZXRMb2NhbFN0b3JhZ2VJdGVtUGFyYW1zIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gVGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyBVbm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gVW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIFByZWZpeCB1c2VkIGJ5IHtAbGluayBlcnJvclRvU3RyaW5nfSdzIG5lc3RlZC1lcnJvciBzZXBhcmF0b3IgbGluZXMsIG1hdGNoaW5nXG4gICAqIHRoZSBgICAgIGF0YCBwcmVmaXggb2YgYSBWOCBzdGFjay10cmFjZSBmcmFtZSBzbyB0aGUgc2VwYXJhdG9ycyBibGVuZCBpbnRvXG4gICAqIHRoZSBzdXJyb3VuZGluZyBzdGFjay4gS2VwdCBpZGVudGljYWwgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AnIGBlcnJvclRvU3RyaW5nYC5cbiAgICovXG4gIGNvbnN0IFNUQUNLX1RSQUNFX1BSRUZJWCA9ICcgICAgYXQnO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IGV4aXN0aW5nQ29udGV4dHMgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMgPz8ge307XG4gIGNvbnN0IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8ub2JzaWRpYW5Nb2R1bGU7XG4gIC8vIFdhcm4gYXQgbW9zdCBvbmNlIHBlciBib290c3RyYXAgdGhhdCBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYCBvbiB0aGlzIHZlcnNpb24uXG4gIGxldCBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSBmYWxzZTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gd2luZG93LmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSB3aW5kb3cuZWxlY3Ryb25XaW5kb3c7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gRXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIFBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHsgaG92ZXJFbGVtZW50LCBtb3ZlTW91c2UsIHByZXNzS2V5LCB0eXBlSW50b0VkaXRvciwgdW5ob3ZlckVsZW1lbnQsIHdhaXRVbnRpbCB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3MgPSB7IC4uLnBhcmFtcy5hcmdzLCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZm4oZnVsbEFyZ3MpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgfSBjYXRjaCAoZXZhbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiB0aGlzLmVycm9yVG9TdHJpbmcoZXZhbEVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T2JzaWRpYW5Nb2R1bGUodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHRlbXAtcGx1Z2luIHRyaWNrIGJlbG93IHJlc29sdmVzIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggb25seVxuICAgICAgLy8gV29ya3MgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gSXQgbmVlZHMgdGhlIGNvbW11bml0eS1wbHVnaW4gcmVnaXN0cnlcbiAgICAgIC8vIChgbG9hZFBsdWdpbmAgKyBgbWFuaWZlc3RzYCksIHdoaWNoIEZJUlNUIGFwcGVhcnMgaW4gT2JzaWRpYW4gMC45Ljc7IHRoZVxuICAgICAgLy8gMC42LjQtMC45LjYgYmFuZCBoYXMgbm8gcmVnaXN0cnkgYW5kIGNhbm5vdCBydW4gaXQsIHNvIHJldHVybiBgbnVsbGAgKG5vdFxuICAgICAgLy8gYHVuZGVmaW5lZGApIC0gYXBwLW9ubHkgY2xvc3VyZXMgKGBmbih7IGFwcCB9KWApIHN0aWxsIHJ1bi5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAoIXBsdWdpbnMubG9hZFBsdWdpbiB8fCAhcGx1Z2lucy5tYW5pZmVzdHMpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgICBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUud2FybignW29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmddIGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgOiB0aGlzIE9ic2lkaWFuIHZlcnNpb24gcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJIChhZGRlZCBpbiAwLjkuNyksIHNvIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuIEFwcC1vbmx5IGNsb3N1cmVzIChgZm4oeyBhcHAgfSlgKSBzdGlsbCB3b3JrLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgICAgY29uc3QgdGVtcE1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIExvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpciA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpciA9IGAke2NvbmZpZ0Rpcn0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXIgPSBgJHtwbHVnaW5zRGlyfS8ke3RlbXBNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wTW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGF1dGhvcjogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgZGlyLFxuICAgICAgICBpZDogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIHZlcnNpb246ICcnXG4gICAgICB9O1xuICAgICAgLy8gYGFkYXB0ZXIubWtkaXJgIGlzIG5vdCByZWN1cnNpdmUsIGFuZCBhbiBvbGQgdmVyc2lvbiBvbiBhIGZyZXNoIHZhdWx0IG1heSBub3RcbiAgICAgIC8vIEhhdmUgdGhlIGNvbmZpZy9wbHVnaW5zIGRpcnMgeWV0IFx1MjAxNCBjcmVhdGUgdGhlIGNoYWluIHNvIGBsb2FkUGx1Z2luYCBmaW5kcyB0aGVcbiAgICAgIC8vIFRlbXAgcGx1Z2luIGF0IGA8Y29uZmlnRGlyPi9wbHVnaW5zLzxpZD5gLlxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoY29uZmlnRGlyKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2Rpcihjb25maWdEaXIpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGx1Z2luc0RpcikpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIocGx1Z2luc0Rpcik7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGRpcik7XG5cbiAgICAgIGNvbnN0IHBsdWdpbkZuQm9keSA9ICdjb25zdCByPXJlcXVpcmUsZT1leHBvcnRzO2NvbnN0IG09cihcXCdvYnNpZGlhblxcJyk7d2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcub2JzaWRpYW5Nb2R1bGU9bTtlLmRlZmF1bHQ9bS5QbHVnaW47JztcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7ZGlyfS9tYWluLmpzYCwgcGx1Z2luRm5Cb2R5KTtcblxuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5sb2FkUGx1Z2luKHRlbXBNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBIYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIFRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyBVbmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gUmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gQ2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gQW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBCeSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyBZZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNldExvY2FsU3RvcmFnZUl0ZW0odGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhcmFtcy5rZXksIHBhcmFtcy52YWx1ZSk7XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gICh3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj4pLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcgPSBucztcblxuICBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbiAgICBjb25zdCB7IGVkaXRvciwgdGV4dCB9ID0gdHlwZVBhcmFtcztcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVR5cGluZyA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXG4gICAgLy8gRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIGVkaXRvci5mb2N1cygpO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gZWRpdG9yLmxhc3RMaW5lKCk7XG4gICAgZWRpdG9yLnNldEN1cnNvcihsYXN0TGluZSwgZWRpdG9yLmdldExpbmUobGFzdExpbmUpLmxlbmd0aCk7XG5cbiAgICAvLyBMZXQgYW55IGZvY3VzIHRyYXAgKGEgYHNldFRpbWVvdXQoMClgIHJlLWZvY3VzKSBmaXJlIGJlZm9yZSB0eXBpbmcsIHNvIHN0b2xlbiBmb2N1cyBpcyBkZXRlY3RlZC5cbiAgICBhd2FpdCBzbGVlcChGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIC8vIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogYHByZXNzS2V5YCBpbmplY3RzIHRoZSBzYW1lIHRydXN0ZWRcbiAgICAvLyBga2V5RG93bmAgLT4gYGNoYXJgIC0+IGBrZXlVcGAgYSByZWFsIHVzZXIgcHJvZHVjZXMgXHUyMDE0IHRleHQgbGFuZHMgb25seSBpZiB0aGUgZWRpdG9yIGhvbGRzIGZvY3VzLlxuICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICBwcmVzc0tleSh7IGtleTogY2hhciB9KTtcbiAgICB9XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcywgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlZGl0b3IuZ2V0VmFsdWUoKSA9PT0gdmFsdWVCZWZvcmVUeXBpbmcgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIChhbmQgdGh1cyBgcHJlc3NLZXlgKSBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICAvLyBNYXAgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gICAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IG1vZGlmaWVycy5tYXAoKG1vZGlmaWVyKTogRWxlY3Ryb25Nb2RpZmllciA9PiB7XG4gICAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICAgIGNhc2UgJ0FsdCc6XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICBjYXNlICdDdHJsJzpcbiAgICAgICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdNZXRhJzpcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICBjYXNlICdNb2QnOlxuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdTaGlmdCc6XG4gICAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgLy8gTW92ZSB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSB0aGUgZWxlbWVudCdzIGJveC5cbiAgICAvLyBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdCBwYXN0IHRoZSByaWdodCBlZGdlLlxuICAgIC8vIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA/IHJlY3QubGVmdCAtIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA6IHJlY3QucmlnaHQgKyBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFM7XG4gICAgY29uc3QgeSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUjtcbiAgICBtb3ZlTW91c2UoeyB4LCB5IH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgY2xlYXJlZCwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBeUJBLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBcUJQLGVBQXNC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
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zLFxuICBXYWl0VW50aWxQYXJhbXNcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLm1qcyc7XG5pbXBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlRnVuY3Rpb25DYWxsIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLm1qcyc7XG5pbXBvcnQge1xuICBnZXRCb290c3RyYXBWZXJzaW9uLFxuICBnZXRSZWdpc3RlcmVkTGliUmVzb2x2ZXJzXG59IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5cbmludGVyZmFjZSBCb290c3RyYXBOYW1lc3BhY2VQYXJhbXMge1xuICByZWFkb25seSBsaWJSZXNvbHZlcnM6IExpYlJlc29sdmVyW107XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpcyBib290c3RyYXBwZWRcbiAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSB2ZXJzaW9uLlxuICpcbiAqIFBlcmZvcm1zIGEgbGlnaHR3ZWlnaHQgdmVyc2lvbiBjaGVjayB2aWEgdGhlIHRyYW5zcG9ydC4gSWYgdGhlIG5hbWVzcGFjZVxuICogZG9lc24ndCBleGlzdCBvciBoYXMgYSBkaWZmZXJlbnQgdmVyc2lvbiwgc2VuZHMgdGhlIGZ1bGwgYm9vdHN0cmFwIGV4cHJlc3Npb25cbiAqIHRvIHJlZ2lzdGVyIGFsbCBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHVzZSBmb3IgZXZhbHVhdGlvbi5cbiAqIEBwYXJhbSBjd2QgLSBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpLlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIE9wdGlvbmFsIHBlci1ldmFsIHRpbWVvdXQuIEZvcndhcmRlZCB0byBib3RoXG4gKiAgIHRoZSB2ZXJzaW9uIGNoZWNrIGFuZCB0aGUgYm9vdHN0cmFwIGV2YWwgc28gYSBodW5nIGBvYnNpZGlhbiBldmFsYCByZWplY3RzXG4gKiAgIGluc3RlYWQgb2YgYmxvY2tpbmcgdGhlIGNhbGxlciBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCwgY3dkOiBzdHJpbmcsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBldmFsT3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMgPSB7XG4gICAgY3dkLFxuICAgIC4uLih0aW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICB9O1xuICBjb25zdCBib290c3RyYXBWZXJzaW9uID0gZ2V0Qm9vdHN0cmFwVmVyc2lvbigpO1xuICBjb25zdCB2ZXJzaW9uSnNvbiA9IEpTT04uc3RyaW5naWZ5KGJvb3RzdHJhcFZlcnNpb24pO1xuICBjb25zdCBjaGVja1Jlc3VsdCA9IGF3YWl0IHRyYW5zcG9ydC5ldmFsdWF0ZShcbiAgICBgSlNPTi5zdHJpbmdpZnkod2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnZlcnNpb24gPT09ICR7dmVyc2lvbkpzb259KWAsXG4gICAgZXZhbE9wdGlvbnNcbiAgKTtcblxuICBpZiAoY2hlY2tSZXN1bHQgPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHIgPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBsaWJSZXNvbHZlcnM6IFsuLi5nZXRSZWdpc3RlcmVkTGliUmVzb2x2ZXJzKCldLFxuICAgIHZlcnNpb246IGJvb3RzdHJhcFZlcnNpb25cbiAgfSk7XG4gIGF3YWl0IHRyYW5zcG9ydC5ldmFsdWF0ZShib290c3RyYXBFeHByLCBldmFsT3B0aW9ucyk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBTZXJpYWxpemVkIHZpYSB0b1N0cmluZygpIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MsIG5vdCBpbiBOb2RlLiBDb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLiAqL1xuXG4vKipcbiAqIEJvb3RzdHJhcHMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIHdpdGggYWxsXG4gKiBoZWxwZXIgZnVuY3Rpb25zLiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIHNlbnQgdG8gT2JzaWRpYW4gb25jZVxuICogcGVyIGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQcmVzZXJ2ZXMgYGNvbnRleHRzYCBhY3Jvc3MgdmVyc2lvbiB1cGdyYWRlcyBzbyBsaXZlIHtAbGluayBDb250ZXh0SWR9XG4gKiByZWZlcmVuY2VzIHN1cnZpdmUuXG4gKlxuICogTXVzdCBOT1QgcmVmZXJlbmNlIGFueSBvdXRlciBzY29wZSBcdTIwMTQgaXQgaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICpcbiAqIEBwYXJhbSBib290c3RyYXBQYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBpbmNsdWRpbmcgdGhlIGxpYnJhcnkgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gYm9vdHN0cmFwTmFtZXNwYWNlKGJvb3RzdHJhcFBhcmFtczogR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXM8Qm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zPik6IHZvaWQge1xuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyIHtcbiAgICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZTtcbiAgfVxuXG4gIGludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZSB7XG4gICAgY29udGV4dHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICBsaWJSZXNvbHZlcnM6IExpYlJlc29sdmVyW107XG4gICAgb2JzaWRpYW5Nb2R1bGU/OiB1bmtub3duO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgZXh0ZW5kcyBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZSB7XG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyaXZpYWwgXHUyMDE0IHJlYWRzXG4gICAgICogYHdpbmRvdy5hcHBgLCB3aGljaCBldmVyeSBjbG9zdXJlIGFscmVhZHkgcmVjZWl2ZXMgZGlyZWN0bHkgYXMgaXRzIGBhcHBgXG4gICAgICogYXJnLCBzbyB0aGVyZSBpcyBub3RoaW5nIGdlbmVyYWwtcHVycG9zZSB0byBzaGFyZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhcHA6IEFwcDtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXRcbiAgICAgKiBvd25zIHRoZSBoYXJuZXNzIHRlc3Qgd2luZG93J3MgbGlmZWN5Y2xlIHZpYSBFbGVjdHJvbiAoYHdpbmRvdy5lbGVjdHJvbldpbmRvd2ApLFxuICAgICAqIHdoaWNoIGlzIHRoZSBoYXJuZXNzJ3MgY29uY2Vybiwgbm90IGEgZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGB3b3Jrc3BhY2UudHNgKSBcdTIwMTQgc2VlIEwxNy5cbiAgICAgKi9cbiAgICBlbnN1cmVMYXlvdXRSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgZXJyb3IudHNgKSBcdTIwMTQgc2VlIEwxNy5cbiAgICAgKi9cbiAgICBlcnJvclRvU3RyaW5nKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBUaGlzXG4gICAgICogaXMgdGhlIGhhcm5lc3MncyBvd24gZXZhbCBwbHVtYmluZyAoYnVpbGRzIHRoZSBgbGliYCBiYWcsIHJlc29sdmVzIHRoZVxuICAgICAqIG1vZHVsZSwgaW52b2tlcyB0aGUgY2xvc3VyZSwgZW52ZWxvcGVzIHRoZSByZXN1bHQpIFx1MjAxNCBtZWFuaW5nbGVzcyBvdXRzaWRlXG4gICAgICogdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgZXZhbFdyYXBwZXIobnNQYXJhbXM6IEV2YWxXcmFwcGVyUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpc1xuICAgICAqIHRoZSBoYXJuZXNzJ3Mgb25lLXRpbWUgYm9vdHN0cmFwIHRoYXQgcmVzb2x2ZXMgdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGZvclxuICAgICAqIHRoZSBwcm9jZXNzOyBjbG9zdXJlcyBvYnRhaW4gaXQgZGlyZWN0bHkgdmlhIHRoZWlyIGBvYnNpZGlhbk1vZHVsZWAgYXJnLlxuICAgICAqL1xuICAgIGdldE9ic2lkaWFuTW9kdWxlKCk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIFJhd1xuICAgICAqIEVsZWN0cm9uIElQQyAoYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luY2ApIGlzIGEgaGFybmVzcy90cmFuc3BvcnRcbiAgICAgKiBwcmltaXRpdmUsIG5vdCBhIGdlbmVyYWwtcHVycG9zZSBoZWxwZXIuXG4gICAgICovXG4gICAgaXBjU2VuZFN5bmMobnNQYXJhbXM6IElwY1NlbmRTeW5jUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiBwYXJ0IG9mIHRoZSBoYXJuZXNzJ3MgdmF1bHQtcGF0aCBoYW5kc2hha2Ugd2l0aCB0aGUgTm9kZSBzaWRlLCBub3QgYVxuICAgICAqIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBwb2xsVmF1bHRCYXNlUGF0aCgpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIHJlYWRvbmx5IGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJlYWRvbmx5IGNvbnRleHRJZD86IHN0cmluZztcbiAgICBmbihmbkFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGdldEJhc2VQYXRoPzogKCkgPT4gc3RyaW5nO1xuICB9XG5cbiAgaW50ZXJmYWNlIElwY1NlbmRTeW5jUGFyYW1zIHtcbiAgICByZWFkb25seSBhcmdzOiB1bmtub3duW107XG4gICAgcmVhZG9ubHkgY2hhbm5lbDogc3RyaW5nO1xuICB9XG5cbiAgLy8gQ29tbXVuaXR5LXBsdWdpbiBBUEkgbWVtYmVycyB0aGF0IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgbGFjay5cbiAgLy8gYG9ic2lkaWFuLXR5cGluZ3NgIGRlY2xhcmVzIHRoZW0gYXMgYWx3YXlzLXByZXNlbnQsIHNvIHByb2JlIHRocm91Z2ggdGhpc1xuICAvLyBPcHRpb25hbC1tZW1iZXIgdmlldyB0byBkZXRlY3QgdGhlaXIgcnVudGltZSBhYnNlbmNlIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFBsdWdpbnNMaWtlIHtcbiAgICBpc0VuYWJsZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIGxvYWRQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtYW5pZmVzdHM/OiB1bmtub3duO1xuICAgIHVuaW5zdGFsbFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyBUaGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIFVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyBVbmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBpbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4ge0BsaW5rIHdhaXRVbnRpbH0gcHJlZGljYXRlIGNoZWNrcyB3aGVuIHRoZVxuICAgKiBjYWxsZXIgZG9lcyBub3Qgb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSB0aW1lIChpbiBtcykge0BsaW5rIHdhaXRVbnRpbH0gd2FpdHMgZm9yIGl0cyBwcmVkaWNhdGUgdG9cbiAgICogYmVjb21lIHRydXRoeSBiZWZvcmUgcmVqZWN0aW5nLCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3Qgb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogSG93IG1hbnkgdGltZXMge0BsaW5rIGNyZWF0ZU5vdGV9IHJld3JpdGVzIGEgbm90ZSB3aG9zZSBjb250ZW50IGRpZCBub3RcbiAgICogcmVhY2ggdGhlIGZpbGVzeXN0ZW0gYmVmb3JlIGdpdmluZyB1cC5cbiAgICpcbiAgICogVGhlIEFuZHJvaWQgZW11bGF0b3IgbG9zZXMgcm91Z2hseSAxIHdyaXRlIGluIDExMCwgc28gYSBzaW5nbGUgcmVwYWlyXG4gICAqIGFscmVhZHkgbWFrZXMgYSBsb3N0IG5vdGUgYXN0cm9ub21pY2FsbHkgdW5saWtlbHk7IHRoZSBleHRyYSBhdHRlbXB0cyBjb3N0XG4gICAqIG5vdGhpbmcgd2hlbiBub3RoaW5nIGlzIGxvc3QsIGFuZCB0aGUgY2FwIGlzIHdoYXQga2VlcHMgYSBnZW51aW5lbHkgYnJva2VuXG4gICAqIHdyaXRlIGZyb20gYmVpbmcgcmV0cmllZCBmb3JldmVyIGluc3RlYWQgb2YgZmFpbGluZyB3aXRoIGEgcmVhZGFibGUgZXJyb3IuXG4gICAqL1xuICBjb25zdCBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCA9IDM7XG5cbiAgLyoqXG4gICAqIFByZWZpeCB1c2VkIGJ5IHtAbGluayBlcnJvclRvU3RyaW5nfSdzIG5lc3RlZC1lcnJvciBzZXBhcmF0b3IgbGluZXMsIG1hdGNoaW5nXG4gICAqIHRoZSBgICAgIGF0YCBwcmVmaXggb2YgYSBWOCBzdGFjay10cmFjZSBmcmFtZSBzbyB0aGUgc2VwYXJhdG9ycyBibGVuZCBpbnRvXG4gICAqIHRoZSBzdXJyb3VuZGluZyBzdGFjay4gS2VwdCBpZGVudGljYWwgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AnIGBlcnJvclRvU3RyaW5nYC5cbiAgICovXG4gIGNvbnN0IFNUQUNLX1RSQUNFX1BSRUZJWCA9ICcgICAgYXQnO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICBjb25zdCBob2xkZXIgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj47XG4gIGNvbnN0IGV4aXN0aW5nQ29udGV4dHMgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8uY29udGV4dHMgPz8ge307XG4gIGNvbnN0IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUgPSBob2xkZXIuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8ub2JzaWRpYW5Nb2R1bGU7XG4gIC8vIFdhcm4gYXQgbW9zdCBvbmNlIHBlciBib290c3RyYXAgdGhhdCBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYCBvbiB0aGlzIHZlcnNpb24uXG4gIGxldCBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSBmYWxzZTtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gd2luZG93LmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSB3aW5kb3cuZWxlY3Ryb25XaW5kb3c7XG4gICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gRXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIFBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHsgY3JlYXRlTm90ZSwgaG92ZXJFbGVtZW50LCBtb3ZlTW91c2UsIHByZXNzS2V5LCB0eXBlSW50b0VkaXRvciwgdW5ob3ZlckVsZW1lbnQsIHdhaXRVbnRpbCB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3MgPSB7IC4uLnBhcmFtcy5hcmdzLCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuZm4oZnVsbEFyZ3MpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgfSBjYXRjaCAoZXZhbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiB0aGlzLmVycm9yVG9TdHJpbmcoZXZhbEVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T2JzaWRpYW5Nb2R1bGUodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHRlbXAtcGx1Z2luIHRyaWNrIGJlbG93IHJlc29sdmVzIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggb25seVxuICAgICAgLy8gV29ya3MgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gSXQgbmVlZHMgdGhlIGNvbW11bml0eS1wbHVnaW4gcmVnaXN0cnlcbiAgICAgIC8vIChgbG9hZFBsdWdpbmAgKyBgbWFuaWZlc3RzYCksIHdoaWNoIEZJUlNUIGFwcGVhcnMgaW4gT2JzaWRpYW4gMC45Ljc7IHRoZVxuICAgICAgLy8gMC42LjQtMC45LjYgYmFuZCBoYXMgbm8gcmVnaXN0cnkgYW5kIGNhbm5vdCBydW4gaXQsIHNvIHJldHVybiBgbnVsbGAgKG5vdFxuICAgICAgLy8gYHVuZGVmaW5lZGApIC0gYXBwLW9ubHkgY2xvc3VyZXMgKGBmbih7IGFwcCB9KWApIHN0aWxsIHJ1bi5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAoIXBsdWdpbnMubG9hZFBsdWdpbiB8fCAhcGx1Z2lucy5tYW5pZmVzdHMpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgICBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUud2FybignW29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmddIGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgOiB0aGlzIE9ic2lkaWFuIHZlcnNpb24gcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJIChhZGRlZCBpbiAwLjkuNyksIHNvIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuIEFwcC1vbmx5IGNsb3N1cmVzIChgZm4oeyBhcHAgfSlgKSBzdGlsbCB3b3JrLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgICAgY29uc3QgdGVtcE1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIExvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpciA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpciA9IGAke2NvbmZpZ0Rpcn0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXIgPSBgJHtwbHVnaW5zRGlyfS8ke3RlbXBNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wTW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGF1dGhvcjogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgZGlyLFxuICAgICAgICBpZDogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcE1vZHVsZU5hbWUsXG4gICAgICAgIHZlcnNpb246ICcnXG4gICAgICB9O1xuICAgICAgLy8gYGFkYXB0ZXIubWtkaXJgIGlzIG5vdCByZWN1cnNpdmUsIGFuZCBhbiBvbGQgdmVyc2lvbiBvbiBhIGZyZXNoIHZhdWx0IG1heSBub3RcbiAgICAgIC8vIEhhdmUgdGhlIGNvbmZpZy9wbHVnaW5zIGRpcnMgeWV0IFx1MjAxNCBjcmVhdGUgdGhlIGNoYWluIHNvIGBsb2FkUGx1Z2luYCBmaW5kcyB0aGVcbiAgICAgIC8vIFRlbXAgcGx1Z2luIGF0IGA8Y29uZmlnRGlyPi9wbHVnaW5zLzxpZD5gLlxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoY29uZmlnRGlyKSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2Rpcihjb25maWdEaXIpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGx1Z2luc0RpcikpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIocGx1Z2luc0Rpcik7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGRpcik7XG5cbiAgICAgIGNvbnN0IHBsdWdpbkZuQm9keSA9ICdjb25zdCByPXJlcXVpcmUsZT1leHBvcnRzO2NvbnN0IG09cihcXCdvYnNpZGlhblxcJyk7d2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcub2JzaWRpYW5Nb2R1bGU9bTtlLmRlZmF1bHQ9bS5QbHVnaW47JztcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7ZGlyfS9tYWluLmpzYCwgcGx1Z2luRm5Cb2R5KTtcblxuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5sb2FkUGx1Z2luKHRlbXBNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBIYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIFRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcE1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmFyZ3MpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyBVbmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gUmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gQ2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gQW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBCeSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyBZZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNldExvY2FsU3RvcmFnZUl0ZW0odGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhcmFtcy5rZXksIHBhcmFtcy52YWx1ZSk7XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gICh3aW5kb3cgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj4pLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcgPSBucztcblxuICBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbiAgICBjb25zdCB7IGVkaXRvciwgdGV4dCB9ID0gdHlwZVBhcmFtcztcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVR5cGluZyA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXG4gICAgLy8gRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIGVkaXRvci5mb2N1cygpO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gZWRpdG9yLmxhc3RMaW5lKCk7XG4gICAgZWRpdG9yLnNldEN1cnNvcihsYXN0TGluZSwgZWRpdG9yLmdldExpbmUobGFzdExpbmUpLmxlbmd0aCk7XG5cbiAgICAvLyBMZXQgYW55IGZvY3VzIHRyYXAgKGEgYHNldFRpbWVvdXQoMClgIHJlLWZvY3VzKSBmaXJlIGJlZm9yZSB0eXBpbmcsIHNvIHN0b2xlbiBmb2N1cyBpcyBkZXRlY3RlZC5cbiAgICBhd2FpdCBzbGVlcChGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIC8vIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogYHByZXNzS2V5YCBpbmplY3RzIHRoZSBzYW1lIHRydXN0ZWRcbiAgICAvLyBga2V5RG93bmAgLT4gYGNoYXJgIC0+IGBrZXlVcGAgYSByZWFsIHVzZXIgcHJvZHVjZXMgXHUyMDE0IHRleHQgbGFuZHMgb25seSBpZiB0aGUgZWRpdG9yIGhvbGRzIGZvY3VzLlxuICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICBwcmVzc0tleSh7IGtleTogY2hhciB9KTtcbiAgICB9XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcywgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlZGl0b3IuZ2V0VmFsdWUoKSA9PT0gdmFsdWVCZWZvcmVUeXBpbmcgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIChhbmQgdGh1cyBgcHJlc3NLZXlgKSBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICAvLyBNYXAgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gICAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IG1vZGlmaWVycy5tYXAoKG1vZGlmaWVyKTogRWxlY3Ryb25Nb2RpZmllciA9PiB7XG4gICAgICBzd2l0Y2ggKG1vZGlmaWVyKSB7XG4gICAgICAgIGNhc2UgJ0FsdCc6XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICBjYXNlICdDdHJsJzpcbiAgICAgICAgICByZXR1cm4gJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdNZXRhJzpcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICBjYXNlICdNb2QnOlxuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICBjYXNlICdTaGlmdCc6XG4gICAgICAgICAgcmV0dXJuICdzaGlmdCc7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSB3aW5kb3cuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IHdpbmRvdy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgLy8gTW92ZSB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSB0aGUgZWxlbWVudCdzIGJveC5cbiAgICAvLyBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdCBwYXN0IHRoZSByaWdodCBlZGdlLlxuICAgIC8vIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA/IHJlY3QubGVmdCAtIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA6IHJlY3QucmlnaHQgKyBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFM7XG4gICAgY29uc3QgeSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUjtcbiAgICBtb3ZlTW91c2UoeyB4LCB5IH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgY2xlYXJlZCwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vdGUoY3JlYXRlUGFyYW1zOiBDcmVhdGVOb3RlUGFyYW1zKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHsgY29udGVudCwgcGF0aCB9ID0gY3JlYXRlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUE2QkEsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxF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
|