obsidian-integration-testing 10.3.2 → 11.0.0
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 +1 -1
- package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +47 -0
- package/dist/lib/cjs/desktop-only-plugin-skip-error.d.cts +30 -0
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +154 -1
- package/dist/lib/cjs/global-setup-core.cjs +26 -5
- package/dist/lib/cjs/index.cjs +10 -1
- package/dist/lib/cjs/index.d.cts +9 -4
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +87 -5
- package/dist/lib/cjs/obsidian-metadata.cjs +1135 -332
- package/dist/lib/cjs/obsidian-metadata.d.cts +57 -6
- package/dist/lib/cjs/open-obsidian-settings-tab.cjs +51 -0
- package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +49 -0
- package/dist/lib/cjs/transport-desktop-cdp.cjs +1 -1
- package/dist/lib/cjs/transport-desktop-cdp.d.cts +1 -2
- package/dist/lib/cjs/transport-options.cjs +15 -1
- package/dist/lib/cjs/transport-options.d.cts +11 -0
- package/dist/lib/esm/desktop-only-plugin-skip-error.d.mts +30 -0
- package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +23 -0
- package/dist/lib/esm/eval-in-obsidian.d.mts +154 -1
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/global-setup-core.mjs +26 -5
- package/dist/lib/esm/index.d.mts +9 -4
- package/dist/lib/esm/index.mjs +7 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +87 -5
- package/dist/lib/esm/obsidian-metadata.d.mts +57 -6
- package/dist/lib/esm/obsidian-metadata.mjs +1135 -332
- package/dist/lib/esm/open-obsidian-settings-tab.d.mts +49 -0
- package/dist/lib/esm/open-obsidian-settings-tab.mjs +27 -0
- package/dist/lib/esm/transport-desktop-cdp.d.mts +1 -2
- package/dist/lib/esm/transport-desktop-cdp.mjs +1 -1
- package/dist/lib/esm/transport-options.d.mts +11 -0
- package/dist/lib/esm/transport-options.mjs +7 -1
- package/package.json +27 -24
- package/dist/obsidian-integration-testing-10.3.2.tgz +0 -0
|
@@ -27,6 +27,7 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
27
27
|
const DESTROY_DELAY_IN_MILLISECONDS = 50;
|
|
28
28
|
const INPUT_POLL_INTERVAL_IN_MILLISECONDS = 50;
|
|
29
29
|
const INPUT_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
30
|
+
const SETTINGS_TAB_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
30
31
|
const WAIT_UNTIL_POLL_INTERVAL_IN_MILLISECONDS = 50;
|
|
31
32
|
const WAIT_UNTIL_TIMEOUT_IN_MILLISECONDS = 5e3;
|
|
32
33
|
const CREATE_NOTE_REPAIR_ATTEMPT_COUNT = 3;
|
|
@@ -71,7 +72,18 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
71
72
|
this.contexts[params.contextId] = context;
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
|
-
const lib = {
|
|
75
|
+
const lib = {
|
|
76
|
+
clickElement,
|
|
77
|
+
clickMouse,
|
|
78
|
+
createNote,
|
|
79
|
+
hoverElement,
|
|
80
|
+
moveMouse,
|
|
81
|
+
openSettingsTab,
|
|
82
|
+
pressKey,
|
|
83
|
+
typeIntoEditor,
|
|
84
|
+
unhoverElement,
|
|
85
|
+
waitUntil
|
|
86
|
+
};
|
|
75
87
|
for (const resolveLib of this.libResolvers) {
|
|
76
88
|
Object.assign(lib, resolveLib());
|
|
77
89
|
}
|
|
@@ -175,10 +187,9 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
175
187
|
await sleep(INPUT_POLL_INTERVAL_IN_MILLISECONDS);
|
|
176
188
|
}
|
|
177
189
|
}
|
|
178
|
-
function
|
|
179
|
-
const { key, modifiers = [] } = pressParams;
|
|
190
|
+
function toElectronModifiers(modifiers) {
|
|
180
191
|
const isMacOS = ns.obsidianModule.Platform.isMacOS;
|
|
181
|
-
|
|
192
|
+
return modifiers.map((modifier) => {
|
|
182
193
|
switch (modifier) {
|
|
183
194
|
case "Alt": {
|
|
184
195
|
return "alt";
|
|
@@ -201,6 +212,46 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
201
212
|
}
|
|
202
213
|
}
|
|
203
214
|
});
|
|
215
|
+
}
|
|
216
|
+
function clickMouse(clickParams) {
|
|
217
|
+
const SINGLE_CLICK_COUNT = 1;
|
|
218
|
+
const { button = "left", modifiers = [], x, y } = clickParams;
|
|
219
|
+
const electronModifiers = toElectronModifiers(modifiers);
|
|
220
|
+
const roundedX = Math.round(x);
|
|
221
|
+
const roundedY = Math.round(y);
|
|
222
|
+
const webContents = globalThis.electron.remote.getCurrentWebContents();
|
|
223
|
+
webContents.sendInputEvent({ modifiers: electronModifiers, type: "mouseMove", x: roundedX, y: roundedY });
|
|
224
|
+
webContents.sendInputEvent({
|
|
225
|
+
button,
|
|
226
|
+
clickCount: SINGLE_CLICK_COUNT,
|
|
227
|
+
modifiers: electronModifiers,
|
|
228
|
+
type: "mouseDown",
|
|
229
|
+
x: roundedX,
|
|
230
|
+
y: roundedY
|
|
231
|
+
});
|
|
232
|
+
webContents.sendInputEvent({
|
|
233
|
+
button,
|
|
234
|
+
clickCount: SINGLE_CLICK_COUNT,
|
|
235
|
+
modifiers: electronModifiers,
|
|
236
|
+
type: "mouseUp",
|
|
237
|
+
x: roundedX,
|
|
238
|
+
y: roundedY
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function clickElement(clickParams) {
|
|
242
|
+
const CENTER_DIVISOR = 2;
|
|
243
|
+
const { button = "left", element, modifiers = [] } = clickParams;
|
|
244
|
+
const rect = element.getBoundingClientRect();
|
|
245
|
+
clickMouse({
|
|
246
|
+
button,
|
|
247
|
+
modifiers,
|
|
248
|
+
x: rect.left + rect.width / CENTER_DIVISOR,
|
|
249
|
+
y: rect.top + rect.height / CENTER_DIVISOR
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
function pressKey(pressParams) {
|
|
253
|
+
const { key, modifiers = [] } = pressParams;
|
|
254
|
+
const electronModifiers = toElectronModifiers(modifiers);
|
|
204
255
|
const webContents = globalThis.electron.remote.getCurrentWebContents();
|
|
205
256
|
webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "keyDown" });
|
|
206
257
|
webContents.sendInputEvent({ keyCode: key, modifiers: electronModifiers, type: "char" });
|
|
@@ -250,6 +301,37 @@ function bootstrapNamespace(bootstrapParams) {
|
|
|
250
301
|
}
|
|
251
302
|
throw new Error(`createNote could not write "${path}".`);
|
|
252
303
|
}
|
|
304
|
+
async function openSettingsTab(openParams) {
|
|
305
|
+
const { tabId, timeoutInMilliseconds = SETTINGS_TAB_TIMEOUT_IN_MILLISECONDS } = openParams;
|
|
306
|
+
const setting = ns.app.setting;
|
|
307
|
+
if (!document.body.contains(setting.containerEl)) {
|
|
308
|
+
document.body.append(setting.containerEl);
|
|
309
|
+
}
|
|
310
|
+
const knownTabs = [...setting.settingTabs, ...setting.pluginTabs];
|
|
311
|
+
if (knownTabs.every((tab) => tab.id !== tabId)) {
|
|
312
|
+
throw new Error(
|
|
313
|
+
`openSettingsTab: no settings tab with id "${tabId}". Available ids: ${knownTabs.map((tab) => tab.id).join(", ")}.`
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
setting.open();
|
|
317
|
+
setting.openTabById(tabId);
|
|
318
|
+
await waitUntil({
|
|
319
|
+
message: `the "${tabId}" settings tab to render`,
|
|
320
|
+
predicate: () => {
|
|
321
|
+
const currentTab = setting.activeTab;
|
|
322
|
+
if (!currentTab) {
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
return currentTab.id === tabId && currentTab.containerEl.childElementCount > 0;
|
|
326
|
+
},
|
|
327
|
+
timeoutInMilliseconds
|
|
328
|
+
});
|
|
329
|
+
const activeTab = setting.activeTab;
|
|
330
|
+
if (!activeTab) {
|
|
331
|
+
throw new Error("openSettingsTab: the settings modal reported no active tab after it rendered.");
|
|
332
|
+
}
|
|
333
|
+
return [...activeTab.containerEl.querySelectorAll(".setting-item-name")].map((nameEl) => nameEl.textContent);
|
|
334
|
+
}
|
|
253
335
|
async function waitUntil(waitParams) {
|
|
254
336
|
const {
|
|
255
337
|
intervalInMilliseconds = WAIT_UNTIL_POLL_INTERVAL_IN_MILLISECONDS,
|
|
@@ -302,4 +384,4 @@ ${generateStackTraceLine(line)}`;
|
|
|
302
384
|
export {
|
|
303
385
|
ensureNamespaceBootstrapped
|
|
304
386
|
};
|
|
305
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zLFxuICBXYWl0VW50aWxQYXJhbXNcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLm1qcyc7XG5pbXBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5UcmFuc3BvcnQsXG4gIFRyYW5zcG9ydEV2YWxPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGdlbmVyYXRlRnVuY3Rpb25DYWxsIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLm1qcyc7XG5pbXBvcnQge1xuICBnZXRCb290c3RyYXBWZXJzaW9uLFxuICBnZXRSZWdpc3RlcmVkTGliUmVzb2x2ZXJzXG59IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5cbmludGVyZmFjZSBCb290c3RyYXBOYW1lc3BhY2VQYXJhbXMge1xuICByZWFkb25seSBsaWJSZXNvbHZlcnM6IExpYlJlc29sdmVyW107XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpcyBib290c3RyYXBwZWRcbiAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzIHdpdGggdGhlIGN1cnJlbnQgbGlicmFyeSB2ZXJzaW9uLlxuICpcbiAqIFBlcmZvcm1zIGEgbGlnaHR3ZWlnaHQgdmVyc2lvbiBjaGVjayB2aWEgdGhlIHRyYW5zcG9ydC4gSWYgdGhlIG5hbWVzcGFjZVxuICogZG9lc24ndCBleGlzdCBvciBoYXMgYSBkaWZmZXJlbnQgdmVyc2lvbiwgc2VuZHMgdGhlIGZ1bGwgYm9vdHN0cmFwIGV4cHJlc3Npb25cbiAqIHRvIHJlZ2lzdGVyIGFsbCBoZWxwZXIgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB0cmFuc3BvcnQgLSBUaGUgdHJhbnNwb3J0IHRvIHVzZSBmb3IgZXZhbHVhdGlvbi5cbiAqIEBwYXJhbSBjd2QgLSBUaGUgd29ya2luZyBkaXJlY3RvcnkgKHZhdWx0IHBhdGgpLlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIE9wdGlvbmFsIHBlci1ldmFsIHRpbWVvdXQuIEZvcndhcmRlZCB0byBib3RoXG4gKiAgIHRoZSB2ZXJzaW9uIGNoZWNrIGFuZCB0aGUgYm9vdHN0cmFwIGV2YWwgc28gYSBodW5nIGBvYnNpZGlhbiBldmFsYCByZWplY3RzXG4gKiAgIGluc3RlYWQgb2YgYmxvY2tpbmcgdGhlIGNhbGxlciBpbmRlZmluaXRlbHkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0OiBPYnNpZGlhblRyYW5zcG9ydCwgY3dkOiBzdHJpbmcsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBldmFsT3B0aW9uczogVHJhbnNwb3J0RXZhbE9wdGlvbnMgPSB7XG4gICAgY3dkLFxuICAgIC4uLih0aW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICB9O1xuICBjb25zdCBib290c3RyYXBWZXJzaW9uID0gZ2V0Qm9vdHN0cmFwVmVyc2lvbigpO1xuICBjb25zdCB2ZXJzaW9uSnNvbiA9IEpTT04uc3RyaW5naWZ5KGJvb3RzdHJhcFZlcnNpb24pO1xuICBjb25zdCB2ZXJzaW9uTWF0Y2hKc29uID0gYXdhaXQgdHJhbnNwb3J0LmV2YWx1YXRlKFxuICAgIGBKU09OLnN0cmluZ2lmeSh3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZz8udmVyc2lvbiA9PT0gJHt2ZXJzaW9uSnNvbn0pYCxcbiAgICBldmFsT3B0aW9uc1xuICApO1xuXG4gIGlmICh2ZXJzaW9uTWF0Y2hKc29uID09PSAndHJ1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBib290c3RyYXBFeHByZXNzaW9uID0gZ2VuZXJhdGVGdW5jdGlvbkNhbGwoYm9vdHN0cmFwTmFtZXNwYWNlLCB7XG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IG5pY2hlL3RyaXZpYWwgXHUyMDE0IGFcbiAgICAgKiBvbmUtbGluZSBgbG9jYWxTdG9yYWdlLnNldEl0ZW1gIHdyYXBwZXIgdXNlZCBvbmx5IGJ5IHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIHNldExvY2FsU3RvcmFnZUl0ZW0obnNQYXJhbXM6IFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICBjYWxsYmFjayhmdW5jdGlvbkFyZ3VtZW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB1bmtub3duO1xuICAgIHJlYWRvbmx5IGNvbnRleHRJZD86IHN0cmluZztcbiAgICByZWFkb25seSBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBnZXRCYXNlUGF0aD86ICgpID0+IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJcGNTZW5kU3luY1BhcmFtcyB7XG4gICAgcmVhZG9ubHkgY2hhbm5lbDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNoYW5uZWxBcmd1bWVudHM6IHVua25vd25bXTtcbiAgfVxuXG4gIC8vIENvbW11bml0eS1wbHVnaW4gQVBJIG1lbWJlcnMgdGhhdCBvbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIGxhY2suXG4gIC8vIGBvYnNpZGlhbi10eXBpbmdzYCBkZWNsYXJlcyB0aGVtIGFzIGFsd2F5cy1wcmVzZW50LCBzbyBwcm9iZSB0aHJvdWdoIHRoaXNcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXcgdG8gZGV0ZWN0IHRoZWlyIHJ1bnRpbWUgYWJzZW5jZSB3aXRob3V0IGEgZmFsc2VcbiAgLy8gYG5vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbmAuXG4gIGludGVyZmFjZSBQbHVnaW5zTGlrZSB7XG4gICAgaXNFbmFibGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBsb2FkUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgbWFuaWZlc3RzPzogdW5rbm93bjtcbiAgICB1bmluc3RhbGxQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfVxuXG4gIGludGVyZmFjZSBTZXRMb2NhbFN0b3JhZ2VJdGVtUGFyYW1zIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICB9XG5cbiAgLy8gYFZhdWx0LmNvbmZpZ0RpcmAgaXMgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQgYnkgYG9ic2lkaWFuLXR5cGluZ3NgLCBidXQgb2xkXG4gIC8vIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgaXQgdW5kZWZpbmVkIGF0IHJ1bnRpbWUuIFByb2JlIHRocm91Z2hcbiAgLy8gVGhpcyBvcHRpb25hbC1tZW1iZXIgdmlldyBzbyBhIGA/PyAnLm9ic2lkaWFuJ2AgZGVmYXVsdCBpcyBub3QgZmxhZ2dlZCBhcyBhblxuICAvLyBVbm5lY2Vzc2FyeSBjb25kaXRpb24uXG4gIGludGVyZmFjZSBWYXVsdExpa2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIFN0cnVjdHVyYWwgbWlycm9yIG9mIE9ic2lkaWFuJ3Mgb3duIGBWYXVsdC5jb25maWdEaXJgOyB0aGUgbmFtZSBoYXMgdG8gbWF0Y2ggZm9yIHRoZSBwcm9iZSB0byByZWFkIGl0LlxuICAgIGNvbmZpZ0Rpcj86IHN0cmluZztcbiAgfVxuXG4gIC8vIGB3aW5kb3cuYXBwYCAvIGBhcHAud29ya3NwYWNlYCBhcmUgZGVjbGFyZWQgYWx3YXlzLXByZXNlbnQsIGJ1dCBhcmUgdHJhbnNpZW50bHlcbiAgLy8gVW5kZWZpbmVkIGR1cmluZyBib290IGFuZCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLiBQcm9iZSB0aHJvdWdoIHRoZXNlXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3cyBzbyB0aGUgcmVhZGluZXNzIGNoZWNrIGNhbiBndWFyZCB0aGVtIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFdvcmtzcGFjZUxpa2Uge1xuICAgIGxheW91dFJlYWR5PzogYm9vbGVhbjtcbiAgfVxuXG4gIGludGVyZmFjZSBBcHBMaWtlIHtcbiAgICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2VMaWtlO1xuICB9XG5cbiAgdHlwZSBDdXJyZW50V2ViQ29udGVudHMgPSBSZXR1cm5UeXBlPFdpbmRvd1snZWxlY3Ryb24nXVsncmVtb3RlJ11bJ2dldEN1cnJlbnRXZWJDb250ZW50cyddPjtcblxuICAvLyBUaGUgRWxlY3Ryb24gbW9kaWZpZXIta2V5IG5hbWVzIGBzZW5kSW5wdXRFdmVudGAgYWNjZXB0cyAoZS5nLiAnbWV0YScsICdjb250cm9sJywgJ3NoaWZ0JywgJ2FsdCcpLlxuICAvLyBEZXJpdmVkIGZyb20gdGhlIHdlYi1jb250ZW50cyB0eXBlIHNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgRWxlY3Ryb24gdHlwaW5ncy5cbiAgdHlwZSBFbGVjdHJvbk1vZGlmaWVyID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczxDdXJyZW50V2ViQ29udGVudHNbJ3NlbmRJbnB1dEV2ZW50J10+WzBdWydtb2RpZmllcnMnXT5bbnVtYmVyXTtcblxuICBpbnRlcmZhY2UgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0ge1xuICAgIFBsYXRmb3JtOiBPYnNpZGlhblBsYXRmb3JtO1xuICB9XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuUGxhdGZvcm0ge1xuICAgIGlzTWFjT1M6IGJvb2xlYW47XG4gIH1cblxuICAvKipcbiAgICogRGVsYXkgKGluIG1zKSBiZWZvcmUgaW52b2tpbmcgYGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKWAgc28gdGhlIGV2YWwgdGhhdFxuICAgKiB0cmlnZ2VyZWQgdGhlIGNhbGwgaGFzIHRpbWUgdG8gcmV0dXJuIGl0cyByZXN1bHQgdG8gdGhlIGNhbGxlci4gV2l0aG91dFxuICAgKiBpdCB0aGUgcmVuZGVyZXIgZGllcyBiZWZvcmUgdGhlIElQQyByZXBseSBzaGlwcywgdGhlIGNhbGxlciB3YWl0cyBmb3IgdGhlXG4gICAqIGZ1bGwgZXZhbCB0aW1lb3V0LCBhbmQgc3RhbGUgYEJyb3dzZXJXaW5kb3dgIGVudHJpZXMgcGlsZSB1cC5cbiAgICovXG4gIGNvbnN0IERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIEludGVydmFsIChpbiBtcykgYmV0d2VlbiBwb2xscyB3aGlsZSB3YWl0aW5nIGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG9cbiAgICogdGFrZSBlZmZlY3QgKHRoZSBlZGl0b3IgZG9jdW1lbnQgdXBkYXRlcywgb3IgYW4gZWxlbWVudCdzIGA6aG92ZXJgIHN0YXRlXG4gICAqIGZsaXBzKS4gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogTWF4aW11bSB0aW1lIChpbiBtcykgdG8gd2FpdCBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvIHRha2UgZWZmZWN0XG4gICAqIGJlZm9yZSBnaXZpbmcgdXAgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGlucHV0IGlzIHJlamVjdGVkIFx1MjAxNCBlLmcuIGFcbiAgICogcmVhZC1vbmx5IGVkaXRvciwgb3IgYSBwb2ludGVyIG1vdmUgdGhhdCBuZXZlciBsYW5kcyBvbiB0aGUgZWxlbWVudCkuXG4gICAqL1xuICBjb25zdCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSBnbG9iYWxUaGlzLmVsZWN0cm9uV2luZG93O1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gKGUuZy4gMC42LngpIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSTogYHBsdWdpbnNgXG4gICAgICAvLyBFeGlzdHMgYnV0IGhhcyBubyBgaXNFbmFibGVkYC9gc2V0RW5hYmxlYCwgYW5kIHRoZXJlIGFyZSBubyB0aGlyZC1wYXJ0eVxuICAgICAgLy8gUGx1Z2lucyB0byBlbmFibGUsIHNvIHNraXAgdGhpcyBzdGVwIHdoZW4gdGhlIEFQSSBpcyBhYnNlbnQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKHBsdWdpbnMuaXNFbmFibGVkICYmICFwbHVnaW5zLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2JzaWRpYW5Nb2R1bGUgPSBhd2FpdCB0aGlzLmdldE9ic2lkaWFuTW9kdWxlKCk7XG4gICAgICAvLyBBdm9pZCBgPz89YDogb2xkIE9ic2lkaWFuJ3MgQ2hyb21pdW0gKGUuZy4gMC42Lnggb24gQ2hyb21pdW0gODApIHByZWRhdGVzXG4gICAgICAvLyBFUzIwMjEgbG9naWNhbC1hc3NpZ25tZW50IGFuZCBjYW5ub3QgcGFyc2UgaXQgaW4gdGhpcyBzZXJpYWxpemVkIGJvb3RzdHJhcC5cbiAgICAgIGxldCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgaWYgKHBhcmFtcy5jb250ZXh0SWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZXh0ID0gdGhpcy5jb250ZXh0c1twYXJhbXMuY29udGV4dElkXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBleGlzdGluZ0NvbnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0c1twYXJhbXMuY29udGV4dElkXSA9IGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbmplY3RlZCBgbGliYCBiYWc6IGJhc2UgaGVscGVycyBmcm9tIHRoZSBoYXJuZXNzLCB0aGVuIHByb3ZpZGVycyBvbiB0b3AuXG4gICAgICAvLyBSZXNvbHZlcnMgcnVuIGluLXJlbmRlcmVyICh0aGV5IHJlYWQgcmVuZGVyZXIgZ2xvYmFscyBhIHByb3ZpZGVyIHB1Ymxpc2hlZCkuXG4gICAgICAvLyBSZWJ1aWxkaW5nIHBlciBldmFsIGtlZXBzIGBsaWJgIGZyZXNoIGFuZCB0b2xlcmFudCBvZiBhIGxhdGUtbG9hZGVkIHByb3ZpZGVyLlxuICAgICAgY29uc3QgbGliID0geyBjcmVhdGVOb3RlLCBob3ZlckVsZW1lbnQsIG1vdmVNb3VzZSwgcHJlc3NLZXksIHR5cGVJbnRvRWRpdG9yLCB1bmhvdmVyRWxlbWVudCwgd2FpdFVudGlsIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIFdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIExvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBIYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyBUZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBIYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIFRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyBVbmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gUmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gQ2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gQW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBCeSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyBZZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIGFzeW5jIHNldExvY2FsU3RvcmFnZUl0ZW0odGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHBhcmFtcy5rZXksIHBhcmFtcy52YWx1ZSk7XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayAoYW5kIHRodXMgYHByZXNzS2V5YCkgY2FuIHJ1bi5cbiAgICBjb25zdCBpc01hY09TID0gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01hY09TO1xuXG4gICAgLy8gTWFwIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCBuYW1lcyB0byBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWVzLlxuICAgIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZCB7XG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICAvLyBNb3ZlIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIHRoZSBlbGVtZW50J3MgYm94LlxuICAgIC8vIFdoZW4gZmx1c2ggYWdhaW5zdCB0aGUgdmlld3BvcnQncyBsZWZ0IGVkZ2UsIHVzZSBqdXN0IHBhc3QgdGhlIHJpZ2h0IGVkZ2UuXG4gICAgLy8gQSBmdWxsLXZpZXdwb3J0LXdpZHRoIGVsZW1lbnQgc2hvdWxkIHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSBpbnN0ZWFkLlxuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHggPSByZWN0LmxlZnQgPj0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID8gcmVjdC5sZWZ0IC0gT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTIDogcmVjdC5yaWdodCArIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUztcbiAgICBjb25zdCB5ID0gcmVjdC50b3AgKyByZWN0LmhlaWdodCAvIENFTlRFUl9ESVZJU09SO1xuICAgIG1vdmVNb3VzZSh7IHgsIHkgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSBjbGVhcmVkLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJykgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlTm90ZShub3RlUGFyYW1zOiBDcmVhdGVOb3RlUGFyYW1zKTogUHJvbWlzZTxURmlsZT4ge1xuICAgIGNvbnN0IHsgY29udGVudCwgcGF0aCB9ID0gbm90ZVBhcmFtcztcblxuICAgIGNvbnN0IGZpbGUgPSBhd2FpdCBucy5hcHAudmF1bHQuY3JlYXRlKHBhdGgsIGNvbnRlbnQpO1xuXG4gICAgLy8gUmVhZCB0aGUgZmlsZSBiYWNrIHJhdGhlciB0aGFuIHRydXN0aW5nIGBmaWxlLnN0YXRgLiBgc3RhdGAgaXMgcHJlY2lzZWx5XG4gICAgLy8gVGhlIGZpZWxkIHRoYXQgbGllcyBoZXJlOiBvbiBhIGxvc3Qgd3JpdGUgaXQgcmVwb3J0cyB0aGUgZnVsbCBieXRlIGNvdW50XG4gICAgLy8gV2hpbGUgdGhlIGZpbGVzeXN0ZW0gaG9sZHMgemVybyBieXRlcy5cbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8PSBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVDsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCBhY3R1YWxDb250ZW50ID0gYXdhaXQgbnMuYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gICAgICBpZiAoYWN0dWFsQ29udGVudCA9PT0gY29udGVudCkge1xuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGF0dGVtcHQgPT09IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgY3JlYXRlTm90ZSBjb3VsZCBub3Qgd3JpdGUgXCIke3BhdGh9XCI6IGV4cGVjdGVkICR7U3RyaW5nKGNvbnRlbnQubGVuZ3RoKX0gY2hhcmFjdGVycywgYFxuICAgICAgICAgICAgKyBgdGhlIHZhdWx0IGhvbGRzICR7U3RyaW5nKGFjdHVhbENvbnRlbnQubGVuZ3RoKX0gYWZ0ZXIgJHtTdHJpbmcoQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpfSByZXBhaXIgYXR0ZW1wdHMuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBIHJld3JpdGUgb2YgdGhlIHNhbWUgY29udGVudCBsYW5kcyBjb3JyZWN0bHkgXHUyMDE0IG1lYXN1cmVkLiBUaGlzIGlzIHRoZVxuICAgICAgLy8gV2hvbGUgd29ya2Fyb3VuZC5cbiAgICAgIGF3YWl0IG5zLmFwcC52YXVsdC5tb2RpZnkoZmlsZSwgY29udGVudCk7XG4gICAgfVxuXG4gICAgLy8gVW5yZWFjaGFibGU6IHRoZSBsb29wIGVpdGhlciByZXR1cm5zIG9yIHRocm93cyBvbiBpdHMgbGFzdCBpdGVyYXRpb24uXG4gICAgdGhyb3cgbmV3IEVycm9yKGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIi5gKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBNkJBLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBcUJQLGVBQXNCLDRCQUE0QixXQUE4QixLQUFhLHVCQUErQztBQUMxSSxRQUFNLGNBQW9DO0FBQUEsSUFDeEM7QUFBQSxJQUNBLEdBQUksMEJBQTBCLFVBQWEsRUFBRSxzQkFBc0I7QUFBQSxFQUNyRTtBQUNBLFFBQU0sbUJBQW1CLG9CQUFvQjtBQUM3QyxRQUFNLGNBQWMsS0FBSyxVQUFVLGdCQUFnQjtBQUNuRCxRQUFNLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUN2QyxtRUFBbUUsV0FBVztBQUFBLElBQzlFO0FBQUEsRUFDRjtBQUVBLE1BQUkscUJBQXFCLFFBQVE7QUFDL0I7QUFBQSxFQUNG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
|
|
387
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcblxuaW50ZXJmYWNlIEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcyB7XG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBsaWJSZXNvbHZlcnM6IFsuLi5nZXRSZWdpc3RlcmVkTGliUmVzb2x2ZXJzKCldLFxuICAgIHZlcnNpb246IGJvb3RzdHJhcFZlcnNpb25cbiAgfSk7XG4gIGF3YWl0IHRyYW5zcG9ydC5ldmFsdWF0ZShib290c3RyYXBFeHByZXNzaW9uLCBldmFsT3B0aW9ucyk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBTZXJpYWxpemVkIHZpYSB0b1N0cmluZygpIGFuZCBleGVjdXRlZCBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MsIG5vdCBpbiBOb2RlLiBDb3ZlcmVkIGJ5IGludGVncmF0aW9uIHRlc3RzLiAqL1xuXG4vKipcbiAqIEJvb3RzdHJhcHMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIHdpdGggYWxsXG4gKiBoZWxwZXIgZnVuY3Rpb25zLiBTZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIHNlbnQgdG8gT2JzaWRpYW4gb25jZVxuICogcGVyIGxpYnJhcnkgdmVyc2lvbi5cbiAqXG4gKiBQcmVzZXJ2ZXMgYGNvbnRleHRzYCBhY3Jvc3MgdmVyc2lvbiB1cGdyYWRlcyBzbyBsaXZlIHtAbGluayBDb250ZXh0SWR9XG4gKiByZWZlcmVuY2VzIHN1cnZpdmUuXG4gKlxuICogTXVzdCBOT1QgcmVmZXJlbmNlIGFueSBvdXRlciBzY29wZSBcdTIwMTQgaXQgaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICpcbiAqIEBwYXJhbSBib290c3RyYXBQYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBpbmNsdWRpbmcgdGhlIGxpYnJhcnkgdmVyc2lvbi5cbiAqL1xuZnVuY3Rpb24gYm9vdHN0cmFwTmFtZXNwYWNlKGJvb3RzdHJhcFBhcmFtczogR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXM8Qm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zPik6IHZvaWQge1xuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyIHtcbiAgICBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZTtcbiAgfVxuXG4gIGludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZSB7XG4gICAgY29udGV4dHM6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICBsaWJSZXNvbHZlcnM6IExpYlJlc29sdmVyW107XG4gICAgb2JzaWRpYW5Nb2R1bGU/OiB1bmtub3duO1xuICAgIHZlcnNpb246IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgZXh0ZW5kcyBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2VTdGF0ZSB7XG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyaXZpYWwgXHUyMDE0IHJlYWRzXG4gICAgICogYHdpbmRvdy5hcHBgLCB3aGljaCBldmVyeSBjbG9zdXJlIGFscmVhZHkgcmVjZWl2ZXMgZGlyZWN0bHkgYXMgaXRzIGBhcHBgXG4gICAgICogYXJnLCBzbyB0aGVyZSBpcyBub3RoaW5nIGdlbmVyYWwtcHVycG9zZSB0byBzaGFyZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBhcHA6IEFwcDtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXRcbiAgICAgKiBvd25zIHRoZSBoYXJuZXNzIHRlc3Qgd2luZG93J3MgbGlmZWN5Y2xlIHZpYSBFbGVjdHJvbiAoYHdpbmRvdy5lbGVjdHJvbldpbmRvd2ApLFxuICAgICAqIHdoaWNoIGlzIHRoZSBoYXJuZXNzJ3MgY29uY2Vybiwgbm90IGEgZ2VuZXJhbCB1dGlsaXR5LlxuICAgICAqL1xuICAgIGRlc3Ryb3lDdXJyZW50V2luZG93KCk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBTeW5jZWQgd2l0aCBgb2JzaWRpYW4tZGV2LXV0aWxzYCAobWlycm9yIGB3b3Jrc3BhY2UudHNgKSBcdTIwMTQgc2VlIEwxNy5cbiAgICAgKi9cbiAgICBlbnN1cmVMYXlvdXRSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgZXJyb3IudHNgKSBcdTIwMTQgc2VlIEwxNy5cbiAgICAgKi9cbiAgICBlcnJvclRvU3RyaW5nKGVycm9yOiB1bmtub3duKTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBUaGlzXG4gICAgICogaXMgdGhlIGhhcm5lc3MncyBvd24gZXZhbCBwbHVtYmluZyAoYnVpbGRzIHRoZSBgbGliYCBiYWcsIHJlc29sdmVzIHRoZVxuICAgICAqIG1vZHVsZSwgaW52b2tlcyB0aGUgY2xvc3VyZSwgZW52ZWxvcGVzIHRoZSByZXN1bHQpIFx1MjAxNCBtZWFuaW5nbGVzcyBvdXRzaWRlXG4gICAgICogdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgZXZhbFdyYXBwZXIobnNQYXJhbXM6IEV2YWxXcmFwcGVyUGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpc1xuICAgICAqIHRoZSBoYXJuZXNzJ3Mgb25lLXRpbWUgYm9vdHN0cmFwIHRoYXQgcmVzb2x2ZXMgdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGZvclxuICAgICAqIHRoZSBwcm9jZXNzOyBjbG9zdXJlcyBvYnRhaW4gaXQgZGlyZWN0bHkgdmlhIHRoZWlyIGBvYnNpZGlhbk1vZHVsZWAgYXJnLlxuICAgICAqL1xuICAgIGdldE9ic2lkaWFuTW9kdWxlKCk6IFByb21pc2U8dW5rbm93bj47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIFJhd1xuICAgICAqIEVsZWN0cm9uIElQQyAoYHdpbmRvdy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luY2ApIGlzIGEgaGFybmVzcy90cmFuc3BvcnRcbiAgICAgKiBwcmltaXRpdmUsIG5vdCBhIGdlbmVyYWwtcHVycG9zZSBoZWxwZXIuXG4gICAgICovXG4gICAgaXBjU2VuZFN5bmMobnNQYXJhbXM6IElwY1NlbmRTeW5jUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiBwYXJ0IG9mIHRoZSBoYXJuZXNzJ3MgdmF1bHQtcGF0aCBoYW5kc2hha2Ugd2l0aCB0aGUgTm9kZSBzaWRlLCBub3QgYVxuICAgICAqIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBwb2xsVmF1bHRCYXNlUGF0aCgpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgRXZhbFdyYXBwZXJQYXJhbXMge1xuICAgIGNhbGxiYWNrKGZ1bmN0aW9uQXJndW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHVua25vd247XG4gICAgcmVhZG9ubHkgY29udGV4dElkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGlucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGludGVyZmFjZSBGaWxlU3lzdGVtQWRhcHRlckxpa2Uge1xuICAgIGJhc2VQYXRoPzogc3RyaW5nO1xuICAgIGdldEJhc2VQYXRoPzogKCkgPT4gc3RyaW5nO1xuICB9XG5cbiAgaW50ZXJmYWNlIElwY1NlbmRTeW5jUGFyYW1zIHtcbiAgICByZWFkb25seSBjaGFubmVsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY2hhbm5lbEFyZ3VtZW50czogdW5rbm93bltdO1xuICB9XG5cbiAgLy8gQ29tbXVuaXR5LXBsdWdpbiBBUEkgbWVtYmVycyB0aGF0IG9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgbGFjay5cbiAgLy8gYG9ic2lkaWFuLXR5cGluZ3NgIGRlY2xhcmVzIHRoZW0gYXMgYWx3YXlzLXByZXNlbnQsIHNvIHByb2JlIHRocm91Z2ggdGhpc1xuICAvLyBPcHRpb25hbC1tZW1iZXIgdmlldyB0byBkZXRlY3QgdGhlaXIgcnVudGltZSBhYnNlbmNlIHdpdGhvdXQgYSBmYWxzZVxuICAvLyBgbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uYC5cbiAgaW50ZXJmYWNlIFBsdWdpbnNMaWtlIHtcbiAgICBpc0VuYWJsZWQ/OiAoKSA9PiBib29sZWFuO1xuICAgIGxvYWRQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICBtYW5pZmVzdHM/OiB1bmtub3duO1xuICAgIHVuaW5zdGFsbFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9XG5cbiAgaW50ZXJmYWNlIFNldExvY2FsU3RvcmFnZUl0ZW1QYXJhbXMge1xuICAgIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmc7XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyBUaGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIFVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gU3RydWN0dXJhbCBtaXJyb3Igb2YgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmNvbmZpZ0RpcmA7IHRoZSBuYW1lIGhhcyB0byBtYXRjaCBmb3IgdGhlIHByb2JlIHRvIHJlYWQgaXQuXG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyBVbmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG5zOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UgPSB7XG4gICAgZ2V0IGFwcCgpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBgYXBwYCBnZXR0ZXIgcmVhZHMgYHdpbmRvdy5hcHBgIHdoaWNoIGlzIHNldCBieSBPYnNpZGlhbi5cbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLmFwcDtcbiAgICB9LFxuXG4gICAgY29udGV4dHM6IGV4aXN0aW5nQ29udGV4dHMsXG5cbiAgICBhc3luYyBkZXN0cm95Q3VycmVudFdpbmRvdyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgY29uc3QgZWxlY3Ryb25XaW5kb3cgPSBnbG9iYWxUaGlzLmVsZWN0cm9uV2luZG93O1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpO1xuICAgICAgfSwgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH0sXG5cbiAgICBhc3luYyBlbnN1cmVMYXlvdXRSZWFkeSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHJlc29sdmUpO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGVycm9yVG9TdHJpbmcodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3IpO1xuICAgIH0sXG5cbiAgICBhc3luYyBldmFsV3JhcHBlcih0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gKGUuZy4gMC42LngpIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSTogYHBsdWdpbnNgXG4gICAgICAvLyBFeGlzdHMgYnV0IGhhcyBubyBgaXNFbmFibGVkYC9gc2V0RW5hYmxlYCwgYW5kIHRoZXJlIGFyZSBubyB0aGlyZC1wYXJ0eVxuICAgICAgLy8gUGx1Z2lucyB0byBlbmFibGUsIHNvIHNraXAgdGhpcyBzdGVwIHdoZW4gdGhlIEFQSSBpcyBhYnNlbnQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKHBsdWdpbnMuaXNFbmFibGVkICYmICFwbHVnaW5zLmlzRW5hYmxlZCgpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMuc2V0RW5hYmxlKHRydWUpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb2JzaWRpYW5Nb2R1bGUgPSBhd2FpdCB0aGlzLmdldE9ic2lkaWFuTW9kdWxlKCk7XG4gICAgICAvLyBBdm9pZCBgPz89YDogb2xkIE9ic2lkaWFuJ3MgQ2hyb21pdW0gKGUuZy4gMC42Lnggb24gQ2hyb21pdW0gODApIHByZWRhdGVzXG4gICAgICAvLyBFUzIwMjEgbG9naWNhbC1hc3NpZ25tZW50IGFuZCBjYW5ub3QgcGFyc2UgaXQgaW4gdGhpcyBzZXJpYWxpemVkIGJvb3RzdHJhcC5cbiAgICAgIGxldCBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgICAgaWYgKHBhcmFtcy5jb250ZXh0SWQpIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb250ZXh0ID0gdGhpcy5jb250ZXh0c1twYXJhbXMuY29udGV4dElkXTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQ29udGV4dCkge1xuICAgICAgICAgIGNvbnRleHQgPSBleGlzdGluZ0NvbnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250ZXh0c1twYXJhbXMuY29udGV4dElkXSA9IGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRoZSBpbmplY3RlZCBgbGliYCBiYWc6IGJhc2UgaGVscGVycyBmcm9tIHRoZSBoYXJuZXNzLCB0aGVuIHByb3ZpZGVycyBvbiB0b3AuXG4gICAgICAvLyBSZXNvbHZlcnMgcnVuIGluLXJlbmRlcmVyICh0aGV5IHJlYWQgcmVuZGVyZXIgZ2xvYmFscyBhIHByb3ZpZGVyIHB1Ymxpc2hlZCkuXG4gICAgICAvLyBSZWJ1aWxkaW5nIHBlciBldmFsIGtlZXBzIGBsaWJgIGZyZXNoIGFuZCB0b2xlcmFudCBvZiBhIGxhdGUtbG9hZGVkIHByb3ZpZGVyLlxuICAgICAgY29uc3QgbGliID0ge1xuICAgICAgICBjbGlja0VsZW1lbnQsXG4gICAgICAgIGNsaWNrTW91c2UsXG4gICAgICAgIGNyZWF0ZU5vdGUsXG4gICAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgICAgbW92ZU1vdXNlLFxuICAgICAgICBvcGVuU2V0dGluZ3NUYWIsXG4gICAgICAgIHByZXNzS2V5LFxuICAgICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgICAgdW5ob3ZlckVsZW1lbnQsXG4gICAgICAgIHdhaXRVbnRpbFxuICAgICAgfTtcbiAgICAgIGZvciAoY29uc3QgcmVzb2x2ZUxpYiBvZiB0aGlzLmxpYlJlc29sdmVycykge1xuICAgICAgICBPYmplY3QuYXNzaWduKGxpYiwgcmVzb2x2ZUxpYigpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZ1bGxBcmd1bWVudHMgPSB7IC4uLnBhcmFtcy5pbnB1dCwgYXBwOiB0aGlzLmFwcCwgY29udGV4dCwgbGliLCBvYnNpZGlhbk1vZHVsZSB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLmNhbGxiYWNrKGZ1bGxBcmd1bWVudHMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAndW5kZWZpbmVkJyB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB2YWx1ZTogcmVzdWx0IH0pO1xuICAgICAgfSBjYXRjaCAoZXZhbEVycm9yKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIHZhbHVlOiB0aGlzLmVycm9yVG9TdHJpbmcoZXZhbEVycm9yKSB9KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZ2V0T2JzaWRpYW5Nb2R1bGUodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHRlbXAtcGx1Z2luIHRyaWNrIGJlbG93IHJlc29sdmVzIGByZXF1aXJlKCdvYnNpZGlhbicpYCwgd2hpY2ggb25seVxuICAgICAgLy8gV29ya3MgaW5zaWRlIGEgcGx1Z2luLWxvYWQgY29udGV4dC4gSXQgbmVlZHMgdGhlIGNvbW11bml0eS1wbHVnaW4gcmVnaXN0cnlcbiAgICAgIC8vIChgbG9hZFBsdWdpbmAgKyBgbWFuaWZlc3RzYCksIHdoaWNoIEZJUlNUIGFwcGVhcnMgaW4gT2JzaWRpYW4gMC45Ljc7IHRoZVxuICAgICAgLy8gMC42LjQtMC45LjYgYmFuZCBoYXMgbm8gcmVnaXN0cnkgYW5kIGNhbm5vdCBydW4gaXQsIHNvIHJldHVybiBgbnVsbGAgKG5vdFxuICAgICAgLy8gYHVuZGVmaW5lZGApIC0gYXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHJ1bi5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAoIXBsdWdpbnMubG9hZFBsdWdpbiB8fCAhcGx1Z2lucy5tYW5pZmVzdHMpIHtcbiAgICAgICAgaWYgKCFoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgICBoYXNXYXJuZWRNaXNzaW5nT2JzaWRpYW5Nb2R1bGUgPSB0cnVlO1xuICAgICAgICAgIGNvbnNvbGUud2FybignW29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmddIGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgOiB0aGlzIE9ic2lkaWFuIHZlcnNpb24gcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJIChhZGRlZCBpbiAwLjkuNyksIHNvIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuIEFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCB3b3JrLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBTTElDRV9TVEFSVCA9IDI7XG4gICAgICBjb25zdCByYW5kb21TdWZmaXggPSBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoU0xJQ0VfU1RBUlQpO1xuICAgICAgY29uc3QgdGVtcG9yYXJ5TW9kdWxlTmFtZSA9IGBnZXQtb2JzaWRpYW4tbW9kdWxlLSR7cmFuZG9tU3VmZml4fWA7XG4gICAgICAvLyBPbGQgdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBgdmF1bHQuY29uZmlnRGlyYCB1bmRlZmluZWQ7IGZhbGwgYmFjayB0b1xuICAgICAgLy8gT2JzaWRpYW4ncyBkZWZhdWx0IGNvbmZpZyBkaXIgc28gdGhlIHRlbXAgcGx1Z2luIHN0aWxsIGdldHMgYSB2YWxpZCBwYXRoLFxuICAgICAgLy8gTG9hZHMsIGFuZCBpdHMgYHJlcXVpcmUoJ29ic2lkaWFuJylgIHJlc29sdmVzIHRoZSBtb2R1bGUuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gY29uZmlnRGlyIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgY29uZmlnRGlyZWN0b3J5ID0gKHRoaXMuYXBwLnZhdWx0IGFzIHVua25vd24gYXMgVmF1bHRMaWtlKS5jb25maWdEaXIgPz8gJy5vYnNpZGlhbic7XG4gICAgICBjb25zdCBwbHVnaW5zRGlyZWN0b3J5ID0gYCR7Y29uZmlnRGlyZWN0b3J5fS9wbHVnaW5zYDtcbiAgICAgIGNvbnN0IGRpcmVjdG9yeSA9IGAke3BsdWdpbnNEaXJlY3Rvcnl9LyR7dGVtcG9yYXJ5TW9kdWxlTmFtZX1gO1xuICAgICAgdGhpcy5hcHAucGx1Z2lucy5tYW5pZmVzdHNbdGVtcG9yYXJ5TW9kdWxlTmFtZV0gPSB7XG4gICAgICAgIGF1dGhvcjogJycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGRpcmAgaXMgT2JzaWRpYW4ncyBvd24gYFBsdWdpbk1hbmlmZXN0YCBtZW1iZXIgbmFtZS5cbiAgICAgICAgZGlyOiBkaXJlY3RvcnksXG4gICAgICAgIGlkOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICBpc0Rlc2t0b3BPbmx5OiBmYWxzZSxcbiAgICAgICAgbWluQXBwVmVyc2lvbjogJycsXG4gICAgICAgIG5hbWU6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIHZlcnNpb246ICcnXG4gICAgICB9O1xuICAgICAgLy8gYGFkYXB0ZXIubWtkaXJgIGlzIG5vdCByZWN1cnNpdmUsIGFuZCBhbiBvbGQgdmVyc2lvbiBvbiBhIGZyZXNoIHZhdWx0IG1heSBub3RcbiAgICAgIC8vIEhhdmUgdGhlIGNvbmZpZy9wbHVnaW5zIGRpcnMgeWV0IFx1MjAxNCBjcmVhdGUgdGhlIGNoYWluIHNvIGBsb2FkUGx1Z2luYCBmaW5kcyB0aGVcbiAgICAgIC8vIFRlbXAgcGx1Z2luIGF0IGA8Y29uZmlnRGlyPi9wbHVnaW5zLzxpZD5gLlxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMoY29uZmlnRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2Rpcihjb25maWdEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5leGlzdHMocGx1Z2luc0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIocGx1Z2luc0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGRpcmVjdG9yeSk7XG5cbiAgICAgIGNvbnN0IHBsdWdpbkZ1bmN0aW9uQm9keSA9ICdjb25zdCByPXJlcXVpcmUsZT1leHBvcnRzO2NvbnN0IG09cihcXCdvYnNpZGlhblxcJyk7d2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmcub2JzaWRpYW5Nb2R1bGU9bTtlLmRlZmF1bHQ9bS5QbHVnaW47JztcbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIud3JpdGUoYCR7ZGlyZWN0b3J5fS9tYWluLmpzYCwgcGx1Z2luRnVuY3Rpb25Cb2R5KTtcblxuICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5sb2FkUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgLy8gYHVuaW5zdGFsbFBsdWdpbmAgYXJyaXZlZCBhZnRlciB0aGUgcGx1Z2luIEFQSSBpdHNlbGYsIHNvIGl0IGlzIGFic2VudCBvblxuICAgICAgLy8gMC45LjcgLSB0aGUgRklSU1QgdmVyc2lvbiB0byBleHBvc2UgYGxvYWRQbHVnaW5gL2BtYW5pZmVzdHNgICgwLjkuNiBhbmQgYmVsb3dcbiAgICAgIC8vIEhhdmUgbmVpdGhlciwgYW5kIHJldHVybiBgdW5kZWZpbmVkYCBhYm92ZSkuIFRoZSBtb2R1bGUgaXMgYWxyZWFkeSBjYXB0dXJlZCBieVxuICAgICAgLy8gVGhlIHBsdWdpbidzIGBtYWluLmpzYCBhdCB0aGlzIHBvaW50LCBzbyBvbmx5IHVuaW5zdGFsbCB3aGVuIHRoZSBtZXRob2QgZXhpc3RzO1xuICAgICAgLy8gT24gMC45LjcgdGhlIHRlbXAgcGx1Z2luIGxpbmdlcnMgaGFybWxlc3NseSBpbiB0aGUgZXBoZW1lcmFsIG93bmVkIHZhdWx0LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHVuaW5zdGFsbFBsdWdpbiBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IHBsdWdpbnNGb3JDbGVhbnVwID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKHBsdWdpbnNGb3JDbGVhbnVwLnVuaW5zdGFsbFBsdWdpbikge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnVuaW5zdGFsbFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGxvYWQgb2JzaWRpYW4gbW9kdWxlJyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGlwY1NlbmRTeW5jKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBnbG9iYWxUaGlzLmVsZWN0cm9uLmlwY1JlbmRlcmVyLnNlbmRTeW5jKHBhcmFtcy5jaGFubmVsLCAuLi5wYXJhbXMuY2hhbm5lbEFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIGxpYlJlc29sdmVyczogYm9vdHN0cmFwUGFyYW1zLmxpYlJlc29sdmVycyxcblxuICAgIG9ic2lkaWFuTW9kdWxlOiBleGlzdGluZ09ic2lkaWFuTW9kdWxlLFxuXG4gICAgYXN5bmMgcG9sbFZhdWx0QmFzZVBhdGgodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIGB3aW5kb3cuYXBwYCwgaXRzIGB3b3Jrc3BhY2VgLCBhbmQgbGF5b3V0IGNhbiBhbGwgYmUgdHJhbnNpZW50bHlcbiAgICAgIC8vIFVuYXZhaWxhYmxlIGR1cmluZyBib290IG9yIHJpZ2h0IGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQsIGFuZCBvbGRcbiAgICAgIC8vIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAuIFRoaXMgcnVucyBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzXG4gICAgICAvLyBSZWFkaW5lc3MgcG9sbCwgd2hpY2ggcmV0cmllcyBvbiB0aHJvdywgc28gY2hlY2sgYHdpbmRvdy5hcHBgIEZJUlNUIGFuZCBiYWlsXG4gICAgICAvLyBDbGVhbmx5IHVudGlsIGl0LCBpdHMgd29ya3NwYWNlLCBhbmQgbGF5b3V0IGFyZSBhbGwgcmVhZHkgXHUyMDE0IG5ldmVyIGRlcmVmZXJlbmNlXG4gICAgICAvLyBBbiB1bmRlZmluZWQgYHdpbmRvdy5hcHBgLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHdpbmRvdy5hcHAvd29ya3NwYWNlIGFyZSBydW50aW1lLW9wdGlvbmFsIGR1cmluZyBib290LlxuICAgICAgY29uc3QgYXBwID0gdGhpcy5hcHAgYXMgdW5rbm93biBhcyBBcHBMaWtlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFhcHA/LndvcmtzcGFjZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ093bmVkIHZhdWx0IGlzIG5vdCByZWFkeSB5ZXQgKHdpbmRvdy5hcHAvd29ya3NwYWNlIG5vdCBpbml0aWFsaXplZCkuJyk7XG4gICAgICB9XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YCBidXQgaGFzIGBsYXlvdXRSZWFkeSA9PT0gdHJ1ZWBcbiAgICAgIC8vIEJ5IHRoZSB0aW1lIGEgd2luZG93IGlzIHVwOyBvbmx5IHdhaXQgdmlhIGBlbnN1cmVMYXlvdXRSZWFkeWAgd2hlbiBpdCBpcyBub3RcbiAgICAgIC8vIFlldCByZWFkeSAobW9kZXJuIHZlcnNpb25zIGVhcmx5IGluIGJvb3QpLCBzbyB0aGUgbWlzc2luZyBtZXRob2QgaXMgbmV2ZXIgaGl0LlxuICAgICAgaWYgKCFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIERhdGFBZGFwdGVyIGlzIGFjdHVhbGx5IEZpbGVTeXN0ZW1BZGFwdGVyIGF0IHJ1bnRpbWUgb24gZGVza3RvcC5cbiAgICAgIGNvbnN0IGFkYXB0ZXIgPSB0aGlzLmFwcC52YXVsdC5hZGFwdGVyIGFzIHVua25vd24gYXMgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlO1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBwcmVkYXRlIHRoZSBgZ2V0QmFzZVBhdGgoKWAgbWV0aG9kIGJ1dFxuICAgICAgLy8gRXhwb3NlIHRoZSBgYmFzZVBhdGhgIHByb3BlcnR5OyB0aGUgbWV0aG9kIGV4aXN0cyBmcm9tIH4wLjkuMjAgb253YXJkLlxuICAgICAgY29uc3QgYmFzZVBhdGggPSBhZGFwdGVyLmdldEJhc2VQYXRoID8gYWRhcHRlci5nZXRCYXNlUGF0aCgpIDogKGFkYXB0ZXIuYmFzZVBhdGggPz8gJycpO1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJhc2VQYXRoKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgdmVyc2lvbjogYm9vdHN0cmFwUGFyYW1zLnZlcnNpb25cbiAgfTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBQYXJ0aWFsPEludGVncmF0aW9uVGVzdGluZ0hvbGRlcj4pLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmcgPSBucztcblxuICBhc3luYyBmdW5jdGlvbiB0eXBlSW50b0VkaXRvcih0eXBlUGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAzMDA7XG5cbiAgICBjb25zdCB7IGVkaXRvciwgdGV4dCB9ID0gdHlwZVBhcmFtcztcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVR5cGluZyA9IGVkaXRvci5nZXRWYWx1ZSgpO1xuXG4gICAgLy8gRm9jdXMgdGhlIGVkaXRvciBhbmQgcGxhY2UgdGhlIGNhcmV0IGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LlxuICAgIGVkaXRvci5mb2N1cygpO1xuICAgIGNvbnN0IGxhc3RMaW5lID0gZWRpdG9yLmxhc3RMaW5lKCk7XG4gICAgZWRpdG9yLnNldEN1cnNvcihsYXN0TGluZSwgZWRpdG9yLmdldExpbmUobGFzdExpbmUpLmxlbmd0aCk7XG5cbiAgICAvLyBMZXQgYW55IGZvY3VzIHRyYXAgKGEgYHNldFRpbWVvdXQoMClgIHJlLWZvY3VzKSBmaXJlIGJlZm9yZSB0eXBpbmcsIHNvIHN0b2xlbiBmb2N1cyBpcyBkZXRlY3RlZC5cbiAgICBhd2FpdCBzbGVlcChGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIC8vIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogYHByZXNzS2V5YCBpbmplY3RzIHRoZSBzYW1lIHRydXN0ZWRcbiAgICAvLyBga2V5RG93bmAgLT4gYGNoYXJgIC0+IGBrZXlVcGAgYSByZWFsIHVzZXIgcHJvZHVjZXMgXHUyMDE0IHRleHQgbGFuZHMgb25seSBpZiB0aGUgZWRpdG9yIGhvbGRzIGZvY3VzLlxuICAgIGZvciAoY29uc3QgY2hhciBvZiB0ZXh0KSB7XG4gICAgICBwcmVzc0tleSh7IGtleTogY2hhciB9KTtcbiAgICB9XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGUgaW5wdXQgb3IgdGhlIHRpbWVvdXQgZWxhcHNlcywgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlZGl0b3IuZ2V0VmFsdWUoKSA9PT0gdmFsdWVCZWZvcmVUeXBpbmcgJiYgRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA8IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKSB7XG4gICAgICBhd2FpdCBzbGVlcChJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgLy8gTWFwcyBPYnNpZGlhbidzIGBNb2RpZmllcmAgbmFtZXMgdG8gRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lcy5cbiAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgLy8gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLCBzbyBhIGtleSBwcmVzcyBhbmQgYSBjbGljayBjYW5ub3QgZGlzYWdyZWUgb24gYCdNb2QnYC5cbiAgZnVuY3Rpb24gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IE1vZGlmaWVyW10pOiBFbGVjdHJvbk1vZGlmaWVyW10ge1xuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4uXG4gICAgY29uc3QgaXNNYWNPUyA9IChucy5vYnNpZGlhbk1vZHVsZSBhcyBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSkuUGxhdGZvcm0uaXNNYWNPUztcblxuICAgIHJldHVybiBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xpY2tNb3VzZShjbGlja1BhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IFNJTkdMRV9DTElDS19DT1VOVCA9IDE7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgbW9kaWZpZXJzID0gW10sIHgsIHkgfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG4gICAgY29uc3Qgcm91bmRlZFggPSBNYXRoLnJvdW5kKHgpO1xuICAgIGNvbnN0IHJvdW5kZWRZID0gTWF0aC5yb3VuZCh5KTtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGNsaWNrIGlzIG1vdXNlTW92ZSAtPiBtb3VzZURvd24gLT4gbW91c2VVcCBhdCBvbmUgcG9pbnQuXG4gICAgLy8gQ2hyb21pdW0gc3ludGhlc2l6ZXMgdGhlIGBjbGlja2AgKG9yIGBjb250ZXh0bWVudWApIERPTSBldmVudCBmcm9tIHRoYXQgc2VxdWVuY2UuXG4gICAgLy8gVGhlIGxlYWRpbmcgbW92ZSBpcyB3aGF0IHB1dHMgdGhlIHBvaW50ZXIgb3ZlciB0aGUgaGl0LXRlc3QgdGFyZ2V0IGJlZm9yZSB0aGUgYnV0dG9uIGdvZXMgZG93bi5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdtb3VzZU1vdmUnLCB4OiByb3VuZGVkWCwgeTogcm91bmRlZFkgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgY2xpY2tDb3VudDogU0lOR0xFX0NMSUNLX0NPVU5ULFxuICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgIHR5cGU6ICdtb3VzZURvd24nLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VVcCcsXG4gICAgICB4OiByb3VuZGVkWCxcbiAgICAgIHk6IHJvdW5kZWRZXG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGlja0VsZW1lbnQoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgYnV0dG9uID0gJ2xlZnQnLCBlbGVtZW50LCBtb2RpZmllcnMgPSBbXSB9ID0gY2xpY2tQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGtleSBwcmVzcyBpcyBrZXlEb3duIC0+IGNoYXIgLT4ga2V5VXA6IGtleURvd24gZmlyZXMgYGtleWRvd25gLCBjaGFyIGZpcmVzXG4gICAgLy8gYGtleXByZXNzYC9gYmVmb3JlaW5wdXRgL2BpbnB1dGAsIGtleVVwIGZpcmVzIGBrZXl1cGAgXHUyMDE0IHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lLlxuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5RG93bicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdjaGFyJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleVVwJyB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSBob3ZlclBhcmFtcztcblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkIHtcbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsgdHlwZTogJ21vdXNlTW92ZScsIHg6IE1hdGgucm91bmQobW92ZVBhcmFtcy54KSwgeTogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLnkpIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdW5ob3ZlckVsZW1lbnQodW5ob3ZlclBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG4gICAgY29uc3QgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTID0gMTtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gdW5ob3ZlclBhcmFtcztcblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIFRoZSBvbmUgc3RlcCB0aGF0IG1ha2VzIGFueSBvZiB0aGlzIHdvcmssIGFuZCBpdCBNVVNUIGhhcHBlbiBiZWZvcmUgYG9wZW4oKWAuXG4gICAgICogYGNvbnRhaW5lckVsYCBpcyBidWlsdCBhdCBzdGFydHVwIGFuZCBpcyBuZXZlciBpbiB0aGUgZG9jdW1lbnQsIGFuZCBgb3BlbigpYCBkb2VzIG5vdCBhdHRhY2ggaXQgXHUyMDE0XG4gICAgICogU28gdGhlIG1vZGFsIGJ1aWxkcyBpbnRvIGEgZGV0YWNoZWQgdHJlZSwgYG9wZW4oKWAgcmV0dXJucyB3aXRob3V0IHRocm93aW5nLCBhbmQgdGhlIGRvY3VtZW50IHRoZVxuICAgICAqIENhbGxlciB0aGVuIHJlYWRzIChvciBzY3JlZW5zaG90cykgaXMgdW50b3VjaGVkLiBBdHRhY2hpbmcgYWZ0ZXJ3YXJkcyBpcyB0b28gbGF0ZTogd2hhdGV2ZXIgdGhlXG4gICAgICogTW9kYWwgcmVuZGVyZWQgb24gb3BlbiBoYXMgYWxyZWFkeSBnb25lIGludG8gdGhlIGRldGFjaGVkIGNvbnRhaW5lciwgc28gdGhlIG1vZGFsIGVuZHMgdXAgb25cbiAgICAgKiBTY3JlZW4gc2hvd2luZyB0aGUgd3JvbmcgdGhpbmcgd2hpbGUgbG9va2luZyBlbnRpcmVseSBzdWNjZXNzZnVsLlxuICAgICAqL1xuICAgIGlmICghZG9jdW1lbnQuYm9keS5jb250YWlucyhzZXR0aW5nLmNvbnRhaW5lckVsKSkge1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2V0dGluZy5jb250YWluZXJFbCk7XG4gICAgfVxuXG4gICAgLy8gQm90aCBsaXN0cyBhcmUgcG9wdWxhdGVkIGJlZm9yZSBgb3BlbigpYCwgc28gYW4gdW5rbm93biBpZCBjYW4gYmUgcmVqZWN0ZWQgdXAgZnJvbnQgXHUyMDE0IHdpdGggdGhlXG4gICAgLy8gSWRzIHRoYXQgRE8gZXhpc3QgXHUyMDE0IGluc3RlYWQgb2Ygc3BlbmRpbmcgdGhlIHdob2xlIHRpbWVvdXQgbG9va2luZyBleGFjdGx5IGxpa2UgdGhlIG1vZGFsLWRvZXMtXG4gICAgLy8gTm90LXJlbmRlciBzeW1wdG9tIHRoaXMgaGVscGVyIGV4aXN0cyB0byBydWxlIG91dC4gUGx1Z2luIHRhYnMgbGl2ZSBpbiBgcGx1Z2luVGFic2AsIG5vdFxuICAgIC8vIGBzZXR0aW5nVGFic2AsIHNvIGJvdGggYXJlIHNlYXJjaGVkLlxuICAgIGNvbnN0IGtub3duVGFicyA9IFsuLi5zZXR0aW5nLnNldHRpbmdUYWJzLCAuLi5zZXR0aW5nLnBsdWdpblRhYnNdO1xuICAgIGlmIChrbm93blRhYnMuZXZlcnkoKHRhYikgPT4gdGFiLmlkICE9PSB0YWJJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG9wZW5TZXR0aW5nc1RhYjogbm8gc2V0dGluZ3MgdGFiIHdpdGggaWQgXCIke3RhYklkfVwiLiBBdmFpbGFibGUgaWRzOiAke2tub3duVGFicy5tYXAoKHRhYikgPT4gdGFiLmlkKS5qb2luKCcsICcpfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIHNldHRpbmcub3BlbigpO1xuICAgIHNldHRpbmcub3BlblRhYkJ5SWQodGFiSWQpO1xuXG4gICAgLy8gUG9sbCB0aGUgbW9kYWwncyBvd24gc3RhdGUgcmF0aGVyIHRoYW4gc2xlZXBpbmc6IGEgZml4ZWQgZGVsYXkgaXMgZWl0aGVyIHRvbyBzaG9ydCBvbiBhIGxvYWRlZFxuICAgIC8vIE1hY2hpbmUgb3Igd2FzdGVkIHRpbWUuIEEgcmVuZGVyZWQgdGFiIGlzIHRoZSByZXF1ZXN0ZWQgb25lIEFORCBoYXMgY29udGVudC5cbiAgICBhd2FpdCB3YWl0VW50aWwoe1xuICAgICAgbWVzc2FnZTogYHRoZSBcIiR7dGFiSWR9XCIgc2V0dGluZ3MgdGFiIHRvIHJlbmRlcmAsXG4gICAgICBwcmVkaWNhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudFRhYiA9IHNldHRpbmcuYWN0aXZlVGFiO1xuICAgICAgICBpZiAoIWN1cnJlbnRUYWIpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRUYWIuaWQgPT09IHRhYklkICYmIGN1cnJlbnRUYWIuY29udGFpbmVyRWwuY2hpbGRFbGVtZW50Q291bnQgPiAwO1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kc1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWN0aXZlVGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgaWYgKCFhY3RpdmVUYWIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlblNldHRpbmdzVGFiOiB0aGUgc2V0dGluZ3MgbW9kYWwgcmVwb3J0ZWQgbm8gYWN0aXZlIHRhYiBhZnRlciBpdCByZW5kZXJlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgZXZlcnkgdGFiIHJlbmRlcnMgYC5zZXR0aW5nLWl0ZW0tbmFtZWAgcm93cyAoSG90a2V5cyBkb2VzIG5vdCksIHNvIGFuIGVtcHR5IGFycmF5IGlzIGEgdmFsaWRcbiAgICAvLyBBbnN3ZXIgaGVyZSBcdTIwMTQgdGhlIHJlbmRlciBpdHNlbGYgd2FzIGFscmVhZHkgcHJvdmVuIGJ5IHRoZSBwb2xsIGFib3ZlLlxuICAgIHJldHVybiBbLi4uYWN0aXZlVGFiLmNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZXR0aW5nLWl0ZW0tbmFtZScpXS5tYXAoKG5hbWVFbCkgPT4gbmFtZUVsLnRleHRDb250ZW50KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRVbnRpbCh3YWl0UGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7XG4gICAgICBpbnRlcnZhbEluTWlsbGlzZWNvbmRzID0gV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBwcmVkaWNhdGUsXG4gICAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSA9IHdhaXRQYXJhbXM7XG5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghKGF3YWl0IHByZWRpY2F0ZSgpKSkge1xuICAgICAgaWYgKERhdGUubm93KCkgLSBzdGFydFRpbWUgPj0gdGltZW91dEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1lc3NhZ2UgPT09IHVuZGVmaW5lZCA/ICcnIDogYDogJHttZXNzYWdlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgd2FpdFVudGlsIHRpbWVkIG91dCBhZnRlciAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHMke3N1ZmZpeH1gKTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHNsZWVwKGludGVydmFsSW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN0cmluZyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBlcnJvci5zdGFjayA/PyBgJHtlcnJvci5uYW1lfTogJHtlcnJvci5tZXNzYWdlfWA7XG4gICAgaWYgKGVycm9yLmNhdXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBlcnJvci5jYXVzZSwgJ0NhdXNlZCBieTonKTtcbiAgICB9XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IpIHtcbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRFcnJvcnM6IHJlYWRvbmx5IHVua25vd25bXSA9IGVycm9yLmVycm9ycztcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBhZ2dyZWdhdGVkRXJyb3JdIG9mIGFnZ3JlZ2F0ZWRFcnJvcnMuZW50cmllcygpKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlLCBhZ2dyZWdhdGVkRXJyb3IsIGBBZ2dyZWdhdGVkIGVycm9yICMke1N0cmluZyhpbmRleCArIDEpfTpgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBlbmROZXN0ZWRFcnJvcihtZXNzYWdlOiBzdHJpbmcsIG5lc3RlZEVycm9yOiB1bmtub3duLCB0aXRsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgcmVzdWx0ID0gYCR7bWVzc2FnZX1cXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGUpfWA7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGVycm9yVG9TdHJpbmdJbXBsKG5lc3RlZEVycm9yKS5zcGxpdCgnXFxuJykpIHtcbiAgICAgIGlmICghbGluZS50cmltKCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXN1bHQgKz0gbGluZS5zdGFydHNXaXRoKFNUQUNLX1RSQUNFX1BSRUZJWClcbiAgICAgICAgPyBgXFxuJHtsaW5lfWBcbiAgICAgICAgOiBgXFxuJHtnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKGxpbmUpfWA7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZW5lcmF0ZVN0YWNrVHJhY2VMaW5lKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtTVEFDS19UUkFDRV9QUkVGSVh9IC0tLSAke3RpdGxlfSAtLS0gKDApYDtcbiAgfVxufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBaUNBLFNBQVMsNEJBQTRCO0FBQ3JDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBcUJQLGVBQXNCLDRCQUE0QixXQUE4QixLQUFhLHVCQUErQztBQUMxSSxRQUFNLGNBQW9DO0FBQUEsSUFDeEM7QUFBQSxJQUNBLEdBQUksMEJBQTBCLFVBQWEsRUFBRSxzQkFBc0I7QUFBQSxFQUNyRTtBQUNBLFFBQU0sbUJBQW1CLG9CQUFvQjtBQUM3QyxRQUFNLGNBQWMsS0FBSyxVQUFVLGdCQUFnQjtBQUNuRCxRQUFNLG1CQUFtQixNQUFNLFVBQVU7QUFBQSxJQUN2QyxtRUFBbUUsV0FBVztBQUFBLElBQzlFO0FBQUEsRUFDRjtBQUVBLE1BQUkscUJBQXFCLFFBQVE7QUFDL0I7QUFBQSxFQUNGO0FBRUEsUUFBTSxzQkFBc0IscUJBQXFCLG9CQUFvQjtBQUFBLElBQ25FLGNBQWMsQ0FBQyxHQUFHLDBCQUEwQixDQUFDO0FBQUEsSUFDN0MsU0FBUztBQUFBLEVBQ1gsQ0FBQztBQUNELFFBQU0sVUFBVSxTQUFTLHFCQUFxQixXQUFXO0FBQzNEO0FBZ0JBLFNBQVMsbUJBQW1CLGlCQUE2RTtBQWtKdkcsUUFBTSxnQ0FBZ0M7QUFPdEMsUUFBTSxzQ0FBc0M7QUFPNUMsUUFBTSxnQ0FBZ0M7QUFPdEMsUUFBTSx1Q0FBdUM7QUFNN0MsUUFBTSwyQ0FBMkM7QUFNakQsUUFBTSxxQ0FBcUM7QUFXM0MsUUFBTSxtQ0FBbUM7QUFPekMsUUFBTSxxQkFBcUI7QUFHM0IsUUFBTSxTQUFTO0FBQ2YsUUFBTSxtQkFBbUIsT0FBTyw4QkFBOEIsWUFBWSxDQUFDO0FBQzNFLFFBQU0s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QUNuRSxVQUFNO0FBQUEsTUFDSix5QkFBeUI7QUFBQSxNQUN6QjtBQUFBLE1BQ0E7QUFBQSxNQUNBLHdCQUF3QjtBQUFBLElBQzFCLElBQUk7QUFFSixVQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLFdBQU8sQ0FBRSxNQUFNLFVBQVUsR0FBSTtBQUMzQixVQUFJLEtBQUssSUFBSSxJQUFJLGFBQWEsdUJBQXVCO0FBQ25ELGNBQU0sU0FBUyxZQUFZLFNBQVksS0FBSyxLQUFLLE9BQU87QUFDeEQsY0FBTSxJQUFJLE1BQU0sNkJBQTZCLE9BQU8scUJBQXFCLENBQUMsZ0JBQWdCLE1BQU0sRUFBRTtBQUFBLE1BQ3BHO0FBQ0EsWUFBTSxNQUFNLHNCQUFzQjtBQUFBLElBQ3BDO0FBQUEsRUFDRjtBQUVBLFdBQVMsa0JBQWtCLE9BQXdCO0FBQ2pELFFBQUksRUFBRSxpQkFBaUIsUUFBUTtBQUM3QixhQUFPLE9BQU8sS0FBSztBQUFBLElBQ3JCO0FBRUEsUUFBSSxVQUFVLE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxLQUFLLE1BQU0sT0FBTztBQUM1RCxRQUFJLE1BQU0sVUFBVSxRQUFXO0FBQzdCLGdCQUFVLGtCQUFrQixTQUFTLE1BQU0sT0FBTyxZQUFZO0FBQUEsSUFDaEU7QUFDQSxRQUFJLGlCQUFpQixnQkFBZ0I7QUFDbkMsWUFBTSxtQkFBdUMsTUFBTTtBQUNuRCxpQkFBVyxDQUFDLE9BQU8sZUFBZSxLQUFLLGlCQUFpQixRQUFRLEdBQUc7QUFDakUsa0JBQVUsa0JBQWtCLFNBQVMsaUJBQWlCLHFCQUFxQixPQUFPLFFBQVEsQ0FBQyxDQUFDLEdBQUc7QUFBQSxNQUNqRztBQUFBLElBQ0Y7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFdBQVMsa0JBQWtCLFNBQWlCLGFBQXNCLE9BQXVCO0FBQ3ZGLFFBQUksU0FBUyxHQUFHLE9BQU87QUFBQSxFQUFLLHVCQUF1QixLQUFLLENBQUM7QUFDekQsZUFBVyxRQUFRLGtCQUFrQixXQUFXLEVBQUUsTUFBTSxJQUFJLEdBQUc7QUFDN0QsVUFBSSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQ2hCO0FBQUEsTUFDRjtBQUNBLGdCQUFVLEtBQUssV0FBVyxrQkFBa0IsSUFDeEM7QUFBQSxFQUFLLElBQUksS0FDVDtBQUFBLEVBQUssdUJBQXVCLElBQUksQ0FBQztBQUFBLElBQ3ZDO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFFQSxXQUFTLHVCQUF1QixPQUF1QjtBQUNyRCxXQUFPLEdBQUcsa0JBQWtCLFFBQVEsS0FBSztBQUFBLEVBQzNDO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -53,6 +53,41 @@ export interface ObsidianRuntimeVersions {
|
|
|
53
53
|
*/
|
|
54
54
|
readonly v8: string;
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* The changelog page URLs for a version, one per publication target, baked into
|
|
58
|
+
* `metadata.json` from Obsidian's own changelog feed (`obsidian.md/changelog.xml`
|
|
59
|
+
* — see the `metadata.json` section in `CLAUDE.md`).
|
|
60
|
+
*
|
|
61
|
+
* Obsidian publishes a *separate* changelog page per platform (desktop / mobile)
|
|
62
|
+
* and per channel (public / catalyst "early access"), each at its own dated slug
|
|
63
|
+
* — the catalyst page typically predates the public one by about a day. Every
|
|
64
|
+
* key is optional: a version carries only the pages the feed actually published
|
|
65
|
+
* for it (a catalyst-only build has no `desktop`, a desktop-only release has no
|
|
66
|
+
* `mobile`, and the oldest versions predate the mobile app entirely).
|
|
67
|
+
*
|
|
68
|
+
* Caveat for the mobile keys: before **1.4.8** (2023-09-05) the mobile app ran
|
|
69
|
+
* its own version line, so a same-keyed mobile page documents a *different*
|
|
70
|
+
* release than the desktop page beside it (mobile `1.4.5` shipped 2023-05-23,
|
|
71
|
+
* desktop `1.4.5` 2023-08-31). From 1.4.8 on the two lines track within days.
|
|
72
|
+
*/
|
|
73
|
+
export interface ObsidianVersionChangelogUrls {
|
|
74
|
+
/**
|
|
75
|
+
The public desktop changelog page URL.
|
|
76
|
+
*/
|
|
77
|
+
readonly desktop?: string;
|
|
78
|
+
/**
|
|
79
|
+
The catalyst ("early access") desktop changelog page URL.
|
|
80
|
+
*/
|
|
81
|
+
readonly desktopCatalyst?: string;
|
|
82
|
+
/**
|
|
83
|
+
The public mobile changelog page URL.
|
|
84
|
+
*/
|
|
85
|
+
readonly mobile?: string;
|
|
86
|
+
/**
|
|
87
|
+
The catalyst ("early access") mobile changelog page URL.
|
|
88
|
+
*/
|
|
89
|
+
readonly mobileCatalyst?: string;
|
|
90
|
+
}
|
|
56
91
|
/**
|
|
57
92
|
* The pre-resolved asset download URLs for a version, baked into `metadata.json`
|
|
58
93
|
* from the upstream `obsidian-versions.json` catalog (see the `metadata.json`
|
|
@@ -61,12 +96,26 @@ export interface ObsidianRuntimeVersions {
|
|
|
61
96
|
* These are the exact URLs the version's assets are published at, so the
|
|
62
97
|
* integration-time download paths can skip the GitHub release-API lookup and the
|
|
63
98
|
* historical dot-vs-hyphen asset-name guessing. Only the assets this library
|
|
64
|
-
* actually downloads are carried: the app `asar
|
|
65
|
-
* A field is absent when the version publishes no such
|
|
66
|
-
* build ships only the `asar`), in which case the caller
|
|
67
|
-
* hand-rolled resolution.
|
|
99
|
+
* actually downloads are carried: the app `asar`, the x64 desktop installers,
|
|
100
|
+
* and the Android `apk`. A field is absent when the version publishes no such
|
|
101
|
+
* asset (e.g. a catalyst build ships only the `asar`), in which case the caller
|
|
102
|
+
* falls back to its hand-rolled resolution.
|
|
68
103
|
*/
|
|
69
104
|
export interface ObsidianVersionDownloads {
|
|
105
|
+
/**
|
|
106
|
+
* The public Android `.apk` URL. Published as a GitHub release asset named
|
|
107
|
+
* uniformly `Obsidian-<version>.apk` — the asset first appears at 1.5.8 and is
|
|
108
|
+
* hyphenated from the start, so it has no dot-separator era to guess around
|
|
109
|
+
* (unlike the desktop installers `installer-asset.ts` handles).
|
|
110
|
+
*
|
|
111
|
+
* There is deliberately no catalyst counterpart. Unlike the desktop catalyst
|
|
112
|
+
* asar, the mobile catalyst build is not published at a URL at all: Obsidian
|
|
113
|
+
* distributes it through a Discord-gated channel, per
|
|
114
|
+
* https://obsidian.md/help/early-access. What this table can carry for a
|
|
115
|
+
* catalyst mobile build is its changelog —
|
|
116
|
+
* {@link ObsidianVersionChangelogUrls.mobileCatalyst}.
|
|
117
|
+
*/
|
|
118
|
+
readonly apk?: string;
|
|
70
119
|
/**
|
|
71
120
|
The `obsidian-<version>.asar.gz` package URL.
|
|
72
121
|
*/
|
|
@@ -96,9 +145,11 @@ export interface ObsidianVersionMetadata {
|
|
|
96
145
|
*/
|
|
97
146
|
readonly available?: boolean;
|
|
98
147
|
/**
|
|
99
|
-
|
|
148
|
+
* The version's changelog page URLs, one per publication target (desktop /
|
|
149
|
+
* mobile × public / catalyst), baked from Obsidian's changelog feed. Absent
|
|
150
|
+
* for the few versions the feed never published a page for.
|
|
100
151
|
*/
|
|
101
|
-
readonly changelogUrl?:
|
|
152
|
+
readonly changelogUrl?: ObsidianVersionChangelogUrls;
|
|
102
153
|
/**
|
|
103
154
|
The release channel: `'public'`, `'catalyst'`, or `'public+catalyst'`.
|
|
104
155
|
*/
|