@dbx-tools/appkit 0.6.58 → 0.6.60
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 +37 -13
- package/index.ts +3 -0
- package/lib/index.d.ts +3 -0
- package/lib/index.js +3 -1
- package/lib/src/create-app.d.ts +17 -1
- package/lib/src/create-app.js +47 -13
- package/lib/src/identity.d.ts +2 -2
- package/lib/src/identity.js +3 -3
- package/lib/src/interceptor.d.ts +152 -0
- package/lib/src/interceptor.js +141 -0
- package/lib/src/lakebase-resolver.d.ts +30 -0
- package/lib/src/lakebase-resolver.js +36 -2
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/create-app.ts +62 -15
- package/src/identity.ts +2 -2
- package/src/interceptor.ts +261 -0
- package/src/lakebase-resolver.ts +38 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `createApp` INTERCEPTOR context: an in-process handle an app hands to
|
|
3
|
+
* add-ons (the tunnel, chiefly) so they can read the env auto-configuration
|
|
4
|
+
* computed, hook AppKit's lifecycle, and supervise sibling child processes as one
|
|
5
|
+
* unit - concurrently-style, where any death takes the whole set down.
|
|
6
|
+
*
|
|
7
|
+
* An interceptor is a plain function `(ctx) => void | Promise<void>` passed to
|
|
8
|
+
* {@link CreateAppConfig.interceptor} ("one or many"). {@link createApp} runs each
|
|
9
|
+
* one AFTER auto-configuration has populated `process.env` but as part of booting
|
|
10
|
+
* the app, so an interceptor sees the resolved connection and can bind processes
|
|
11
|
+
* before or during setup.
|
|
12
|
+
*
|
|
13
|
+
* The names here mirror AppKit's own vocabulary rather than inventing parallel
|
|
14
|
+
* ones: {@link LifecycleEvent} and {@link InterceptorContext.onLifecycle} are the
|
|
15
|
+
* exact shape of `PluginContext.onLifecycle` (`setup:complete` / `server:ready` /
|
|
16
|
+
* `shutdown`). The bridge that makes that hook reachable from OUTSIDE a plugin -
|
|
17
|
+
* where interceptors run - is {@link lifecycleBridge}, a tiny internal plugin
|
|
18
|
+
* {@link createApp} injects to capture `this.context` and relay its events.
|
|
19
|
+
*
|
|
20
|
+
* @module
|
|
21
|
+
*/
|
|
22
|
+
import { Plugin, toPlugin } from "@databricks/appkit";
|
|
23
|
+
import { log } from "@dbx-tools/shared-core";
|
|
24
|
+
const logger = log.logger("interceptor");
|
|
25
|
+
/** How long bound children get to exit on `SIGTERM` before the app force-exits. */
|
|
26
|
+
const TEARDOWN_GRACE_MS = 3000;
|
|
27
|
+
/** The signals that trigger teardown when the MAIN process receives them. */
|
|
28
|
+
const TEARDOWN_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
|
|
29
|
+
/**
|
|
30
|
+
* Build an {@link InterceptorContext} + its {@link InterceptorRuntime}.
|
|
31
|
+
*
|
|
32
|
+
* Teardown is the generalized `superviseExit`: the first child exit or main-process
|
|
33
|
+
* termination signal flips a one-shot guard, `SIGTERM`s the other bound children,
|
|
34
|
+
* then `process.exit`s after {@link TEARDOWN_GRACE_MS} (an `unref`'d timer, so it
|
|
35
|
+
* never itself holds the loop open). The process-signal listeners are installed
|
|
36
|
+
* lazily on the first `bindProcess` so an app that binds nothing is untouched.
|
|
37
|
+
*/
|
|
38
|
+
export function createInterceptorContext(env) {
|
|
39
|
+
const handlers = new Map();
|
|
40
|
+
const children = new Set();
|
|
41
|
+
let shuttingDown = false;
|
|
42
|
+
let signalsBound = false;
|
|
43
|
+
const teardown = (code) => {
|
|
44
|
+
if (shuttingDown)
|
|
45
|
+
return;
|
|
46
|
+
shuttingDown = true;
|
|
47
|
+
for (const child of children) {
|
|
48
|
+
if (!child.killed)
|
|
49
|
+
child.kill("SIGTERM");
|
|
50
|
+
}
|
|
51
|
+
setTimeout(() => process.exit(code), TEARDOWN_GRACE_MS).unref();
|
|
52
|
+
};
|
|
53
|
+
const broadcastSignal = (signal) => {
|
|
54
|
+
for (const child of children) {
|
|
55
|
+
if (!child.killed)
|
|
56
|
+
child.kill(signal);
|
|
57
|
+
}
|
|
58
|
+
teardown(0);
|
|
59
|
+
};
|
|
60
|
+
const bindProcessSignals = () => {
|
|
61
|
+
if (signalsBound)
|
|
62
|
+
return;
|
|
63
|
+
signalsBound = true;
|
|
64
|
+
for (const signal of TEARDOWN_SIGNALS) {
|
|
65
|
+
process.on(signal, () => broadcastSignal(signal));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const bindProcess = (child) => {
|
|
69
|
+
bindProcessSignals();
|
|
70
|
+
children.add(child);
|
|
71
|
+
child.once("exit", (code) => {
|
|
72
|
+
logger.warn("bound process exited; tearing down the app", { code });
|
|
73
|
+
teardown(typeof code === "number" ? code : 1);
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
const onLifecycle = (event, fn) => {
|
|
77
|
+
const list = handlers.get(event);
|
|
78
|
+
if (list)
|
|
79
|
+
list.push(fn);
|
|
80
|
+
else
|
|
81
|
+
handlers.set(event, [fn]);
|
|
82
|
+
};
|
|
83
|
+
const emitLifecycle = async (event) => {
|
|
84
|
+
const list = handlers.get(event);
|
|
85
|
+
if (!list)
|
|
86
|
+
return;
|
|
87
|
+
for (const fn of list) {
|
|
88
|
+
try {
|
|
89
|
+
await fn();
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
// Match AppKit: a failing lifecycle handler is logged, never fatal, and
|
|
93
|
+
// never blocks its siblings.
|
|
94
|
+
logger.warn("lifecycle handler failed", { event, error });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
const context = {
|
|
99
|
+
env,
|
|
100
|
+
onLifecycle,
|
|
101
|
+
broadcastSignal,
|
|
102
|
+
bindProcess,
|
|
103
|
+
};
|
|
104
|
+
return { context, emitLifecycle };
|
|
105
|
+
}
|
|
106
|
+
function hasOnLifecycle(context) {
|
|
107
|
+
return typeof context?.onLifecycle === "function";
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The internal plugin {@link createApp} injects to make AppKit's lifecycle
|
|
111
|
+
* reachable from interceptor code. On `setup()` it reads its own `this.context`
|
|
112
|
+
* (the real `PluginContext`) and forwards each {@link LifecycleEvent} to the
|
|
113
|
+
* interceptor runtime, so `ctx.onLifecycle(...)` handlers fire on the genuine
|
|
114
|
+
* events. It owns no routes, config surface, or exports.
|
|
115
|
+
*/
|
|
116
|
+
export class LifecycleBridgePlugin extends Plugin {
|
|
117
|
+
static manifest = {
|
|
118
|
+
name: "dbxToolsLifecycleBridge",
|
|
119
|
+
displayName: "Lifecycle Bridge",
|
|
120
|
+
description: "Relays AppKit lifecycle events to the createApp interceptor context.",
|
|
121
|
+
stability: "beta",
|
|
122
|
+
hidden: true,
|
|
123
|
+
resources: { required: [], optional: [] },
|
|
124
|
+
};
|
|
125
|
+
async setup() {
|
|
126
|
+
const runtime = this.config.runtime;
|
|
127
|
+
if (!runtime)
|
|
128
|
+
return;
|
|
129
|
+
if (!hasOnLifecycle(this.context)) {
|
|
130
|
+
logger.debug("no PluginContext.onLifecycle to bridge; interceptor lifecycle events inert");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const events = ["setup:complete", "server:ready", "shutdown"];
|
|
134
|
+
for (const event of events) {
|
|
135
|
+
this.context.onLifecycle(event, () => runtime.emitLifecycle(event));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Factory for the injected {@link LifecycleBridgePlugin}. */
|
|
140
|
+
export const lifecycleBridge = toPlugin(LifecycleBridgePlugin);
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBR0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQThDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFzRnpDLG1GQUFtRjtBQUNuRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFVLENBQUM7QUFjbEU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsR0FBbUI7SUFDMUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQXNDLENBQUM7SUFDL0QsTUFBTSxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7SUFDNUMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUV6QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBUSxFQUFFO1FBQ3RDLElBQUksWUFBWTtZQUFFLE9BQU87UUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2xFLENBQUMsQ0FBQztJQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsTUFBc0IsRUFBUSxFQUFFO1FBQ3ZELEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNkLENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsR0FBUyxFQUFFO1FBQ3BDLElBQUksWUFBWTtZQUFFLE9BQU87UUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBc0IsRUFBUSxFQUFFO1FBQ25ELGtCQUFrQixFQUFFLENBQUM7UUFDckIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQixLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNENBQTRDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLFFBQVEsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7SUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQXFCLEVBQUUsRUFBb0IsRUFBUSxFQUFFO1FBQ3hFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxJQUFJO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs7WUFDbkIsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxLQUFxQixFQUFpQixFQUFFO1FBQ25FLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ2xCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDYixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZix3RUFBd0U7Z0JBQ3hFLDZCQUE2QjtnQkFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQXVCO1FBQ2xDLEdBQUc7UUFDSCxXQUFXO1FBQ1gsZUFBZTtRQUNmLFdBQVc7S0FDWixDQUFDO0lBRUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztBQUNwQyxDQUFDO0FBaUJELFNBQVMsY0FBYyxDQUFDLE9BQWdCO0lBQ3RDLE9BQU8sT0FBUSxPQUE0QyxFQUFFLFdBQVcsS0FBSyxVQUFVLENBQUM7QUFDMUYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxNQUE2QjtJQUN0RSxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsV0FBVyxFQUFFLGtCQUFrQjtRQUMvQixXQUFXLEVBQUUsc0VBQXNFO1FBQ25GLFNBQVMsRUFBRSxNQUFNO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO1FBQ1osU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO0tBQ1UsQ0FBQztJQUU3QyxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU87UUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsS0FBSyxDQUFDLDRFQUE0RSxDQUFDLENBQUM7WUFDM0YsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE1BQU0sR0FBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDaEYsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7SUFDSCxDQUFDOztBQUdILDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBgY3JlYXRlQXBwYCBJTlRFUkNFUFRPUiBjb250ZXh0OiBhbiBpbi1wcm9jZXNzIGhhbmRsZSBhbiBhcHAgaGFuZHMgdG9cbiAqIGFkZC1vbnMgKHRoZSB0dW5uZWwsIGNoaWVmbHkpIHNvIHRoZXkgY2FuIHJlYWQgdGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb25cbiAqIGNvbXB1dGVkLCBob29rIEFwcEtpdCdzIGxpZmVjeWNsZSwgYW5kIHN1cGVydmlzZSBzaWJsaW5nIGNoaWxkIHByb2Nlc3NlcyBhcyBvbmVcbiAqIHVuaXQgLSBjb25jdXJyZW50bHktc3R5bGUsIHdoZXJlIGFueSBkZWF0aCB0YWtlcyB0aGUgd2hvbGUgc2V0IGRvd24uXG4gKlxuICogQW4gaW50ZXJjZXB0b3IgaXMgYSBwbGFpbiBmdW5jdGlvbiBgKGN0eCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD5gIHBhc3NlZCB0b1xuICoge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5pbnRlcmNlcHRvcn0gKFwib25lIG9yIG1hbnlcIikuIHtAbGluayBjcmVhdGVBcHB9IHJ1bnMgZWFjaFxuICogb25lIEFGVEVSIGF1dG8tY29uZmlndXJhdGlvbiBoYXMgcG9wdWxhdGVkIGBwcm9jZXNzLmVudmAgYnV0IGFzIHBhcnQgb2YgYm9vdGluZ1xuICogdGhlIGFwcCwgc28gYW4gaW50ZXJjZXB0b3Igc2VlcyB0aGUgcmVzb2x2ZWQgY29ubmVjdGlvbiBhbmQgY2FuIGJpbmQgcHJvY2Vzc2VzXG4gKiBiZWZvcmUgb3IgZHVyaW5nIHNldHVwLlxuICpcbiAqIFRoZSBuYW1lcyBoZXJlIG1pcnJvciBBcHBLaXQncyBvd24gdm9jYWJ1bGFyeSByYXRoZXIgdGhhbiBpbnZlbnRpbmcgcGFyYWxsZWxcbiAqIG9uZXM6IHtAbGluayBMaWZlY3ljbGVFdmVudH0gYW5kIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHQub25MaWZlY3ljbGV9IGFyZSB0aGVcbiAqIGV4YWN0IHNoYXBlIG9mIGBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlYCAoYHNldHVwOmNvbXBsZXRlYCAvIGBzZXJ2ZXI6cmVhZHlgIC9cbiAqIGBzaHV0ZG93bmApLiBUaGUgYnJpZGdlIHRoYXQgbWFrZXMgdGhhdCBob29rIHJlYWNoYWJsZSBmcm9tIE9VVFNJREUgYSBwbHVnaW4gLVxuICogd2hlcmUgaW50ZXJjZXB0b3JzIHJ1biAtIGlzIHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9LCBhIHRpbnkgaW50ZXJuYWwgcGx1Z2luXG4gKiB7QGxpbmsgY3JlYXRlQXBwfSBpbmplY3RzIHRvIGNhcHR1cmUgYHRoaXMuY29udGV4dGAgYW5kIHJlbGF5IGl0cyBldmVudHMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgUGx1Z2luLCB0b1BsdWdpbiwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vbGFrZWJhc2UtcmVzb2x2ZXIudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImludGVyY2VwdG9yXCIpO1xuXG4vKipcbiAqIEFwcEtpdCdzIHBsdWdpbi1saWZlY3ljbGUgZXZlbnRzLCB2ZXJiYXRpbSBmcm9tIGBQbHVnaW5Db250ZXh0YFxuICogKGBub2RlX21vZHVsZXMvQGRhdGFicmlja3MvYXBwa2l0Ly4uLi9jb3JlL3BsdWdpbi1jb250ZXh0LmQudHNgKS4gUmUtZGVjbGFyZWRcbiAqIHN0cnVjdHVyYWxseSByYXRoZXIgdGhhbiBpbXBvcnRlZCBiZWNhdXNlIGBQbHVnaW5Db250ZXh0YCBpcyBub3QgaW4gdGhlXG4gKiBwYWNrYWdlJ3MgYGV4cG9ydHNgIG1hcCAodGhlIHNhbWUgcmVhc29uIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gZXhpc3RzIGluXG4gKiBgLi9wbHVnaW5gKS5cbiAqXG4gKiAtIGBzZXR1cDpjb21wbGV0ZWAgLSBldmVyeSBwbHVnaW4ncyBgc2V0dXAoKWAgaGFzIHJlc29sdmVkLlxuICogLSBgc2VydmVyOnJlYWR5YCAtIHRoZSBgc2VydmVyKClgIHBsdWdpbiBpcyBsaXN0ZW5pbmcgKG5ldmVyIGZpcmVzIGZvciBhXG4gKiAgIHNlcnZlcmxlc3MgYXBwLCBlLmcuIHRoZSB0dW5uZWwgZ2F0ZSkuXG4gKiAtIGBzaHV0ZG93bmAgLSB0aGUgYXBwIGlzIHRlYXJpbmcgZG93bi5cbiAqL1xuZXhwb3J0IHR5cGUgTGlmZWN5Y2xlRXZlbnQgPSBcInNldHVwOmNvbXBsZXRlXCIgfCBcInNlcnZlcjpyZWFkeVwiIHwgXCJzaHV0ZG93blwiO1xuXG4vKiogQSBsaWZlY3ljbGUgc3Vic2NyaWJlci4gRXJyb3JzIGFyZSBsb2dnZWQsIG5vdCBwcm9wYWdhdGVkIChtYXRjaGVzIEFwcEtpdCkuICovXG5leHBvcnQgdHlwZSBMaWZlY3ljbGVIYW5kbGVyID0gKCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogVGhlIGVudiBhdXRvLWNvbmZpZ3VyYXRpb24gcmVzb2x2ZWQgYmVmb3JlIGJvb3QsIGV4cG9zZWQgdG8gaW50ZXJjZXB0b3JzIHNvXG4gKiB0aGV5IHJlYWQgQ09NUFVURUQgdmFsdWVzIGluc3RlYWQgb2YgcmUtcmVhZGluZyBgcHJvY2Vzcy5lbnZgIHRoZW1zZWx2ZXMuXG4gKlxuICogYGxha2ViYXNlYCBpcyB0aGUgcmVzb2x2ZWQgUG9zdGdyZXMgY29ubmVjdGlvbiB3aGVuIExha2ViYXNlIGF1dG8tY29uZmlnIHJhblxuICogKHNlZSBgY3JlYXRlLWFwcGAncyBgYXV0b0NvbmZpZ3VyZWApLCBlbHNlIGB1bmRlZmluZWRgLiBgZGF0YWJyaWNrc0hvc3RgIGlzIHRoZVxuICogd29ya3NwYWNlIGhvc3QgYXMgcmVzb2x2ZWQgaW50byB0aGUgZW52aXJvbm1lbnQgKGBEQVRBQlJJQ0tTX0hPU1RgKSwgd2hpY2ggdGhlXG4gKiB0dW5uZWwgaW50ZXJjZXB0b3IgYm90aCByZWFkcyBhbmQsIHdoZW4gaXQgbXVzdCwgc2V0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEFwcEVudiB7XG4gIC8qKiBSZXNvbHZlZCBMYWtlYmFzZSBjb25uZWN0aW9uLCB3aGVuIGF1dG8tY29uZmlnIHJlc29sdmVkIG9uZS4gKi9cbiAgcmVhZG9ubHkgbGFrZWJhc2U/OiBMYWtlYmFzZUNvbm5lY3Rpb247XG4gIC8qKiBSZXNvbHZlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob3N0IChgREFUQUJSSUNLU19IT1NUYCksIHdoZW4ga25vd24uICovXG4gIHJlYWRvbmx5IGRhdGFicmlja3NIb3N0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvY2VzcyB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0LmJpbmRQcm9jZXNzfSBjYW4gc3VwZXJ2aXNlLiBBIGJhcmVcbiAqIGBub2RlOmNoaWxkX3Byb2Nlc3NgIGBDaGlsZFByb2Nlc3NgIChlLmcuIHBvcnRyKSBzYXRpc2ZpZXMgdGhpcywgYW5kIHNvIGRvZXNcbiAqIGBAZGJ4LXRvb2xzL2NvcmVgJ3MgYHNwYXduKClgIHJlc3VsdCAoYSBgQ2hpbGRQcm9jZXNzUmVzdWx0YCBJUyBhXG4gKiBgQ2hpbGRQcm9jZXNzYCkgLSBvbmUgY29kZSBwYXRoIGhhbmRsZXMgYm90aC5cbiAqL1xuZXhwb3J0IHR5cGUgQmluZGFibGVQcm9jZXNzID0gUGljazxDaGlsZFByb2Nlc3MsIFwicGlkXCIgfCBcImtpbGxcIiB8IFwia2lsbGVkXCIgfCBcIm9uY2VcIj47XG5cbi8qKlxuICogVGhlIGhhbmRsZSBwYXNzZWQgdG8gZWFjaCBpbnRlcmNlcHRvci5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgY3JlYXRlQXBwIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW3NlcnZlcigpXSxcbiAqICAgaW50ZXJjZXB0b3I6IChjdHgpID0+IHtcbiAqICAgICBjb25zdCBwb3J0ciA9IHNwYXduUG9ydHIoY3R4LmVudi5kYXRhYnJpY2tzSG9zdCk7XG4gKiAgICAgY3R4LmJpbmRQcm9jZXNzKHBvcnRyKTsgICAgICAgICAgICAvLyBhcHAgPC0+IHBvcnRyIGxpdmUvZGllIHRvZ2V0aGVyXG4gKiAgICAgY3R4Lm9uTGlmZWN5Y2xlKFwic2h1dGRvd25cIiwgKCkgPT4gcG9ydHIua2lsbChcIlNJR1RFUk1cIikpO1xuICogICB9LFxuICogfSk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJjZXB0b3JDb250ZXh0IHtcbiAgLyoqIFRoZSBlbnYgYXV0by1jb25maWd1cmF0aW9uIGNvbXB1dGVkIGJlZm9yZSBib290LiAqL1xuICByZWFkb25seSBlbnY6IFJlc29sdmVkQXBwRW52O1xuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIGFuIEFwcEtpdCBsaWZlY3ljbGUgZXZlbnQuIE1pcnJvcnMgYFBsdWdpbkNvbnRleHQub25MaWZlY3ljbGVgO1xuICAgKiB0aGUgaW5qZWN0ZWQge0BsaW5rIGxpZmVjeWNsZUJyaWRnZX0gcmVsYXlzIHRoZSByZWFsIGV2ZW50cyBoZXJlIG9uY2UgdGhlIGFwcFxuICAgKiBib290cy4gQSBoYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIGFuIGV2ZW50IHRoYXQgYWxyZWFkeSBmaXJlZCBpcyBOT1QgY2FsbGVkXG4gICAqIHJldHJvYWN0aXZlbHkgKHNhbWUgc2VtYW50aWNzIGFzIEFwcEtpdCkuXG4gICAqL1xuICBvbkxpZmVjeWNsZShldmVudDogTGlmZWN5Y2xlRXZlbnQsIGZuOiBMaWZlY3ljbGVIYW5kbGVyKTogdm9pZDtcbiAgLyoqXG4gICAqIEJyb2FkY2FzdCBhIHRlcm1pbmF0aW9uIHNpZ25hbCBmcm9tIHRoZSBtYWluIGFwcCB0byBldmVyeSBib3VuZCBwcm9jZXNzLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoaXMgcHJvY2VzcyByZWNlaXZlcyBgU0lHSU5UYC9gU0lHVEVSTWAvYFNJR0hVUGA7XG4gICAqIGV4cG9zZWQgc28gYW4gaW50ZXJjZXB0b3IgY2FuIHRyaWdnZXIgdGVhcmRvd24gaXRzZWxmLlxuICAgKi9cbiAgYnJvYWRjYXN0U2lnbmFsKHNpZ25hbDogTm9kZUpTLlNpZ25hbHMpOiB2b2lkO1xuICAvKipcbiAgICogU3VwZXJ2aXNlIGEgY2hpbGQgcHJvY2VzcyBhbG9uZ3NpZGUgdGhlIGFwcCwgY29uY3VycmVudGx5LXN0eWxlOiBzaWduYWxzIHBhc3NcbiAgICogdGhyb3VnaCwgYW5kIGlmIEVJVEhFUiB0aGUgY2hpbGQgb3IgdGhlIGFwcCBkaWVzIHRoZSB3aG9sZSBzZXQgY29tZXMgZG93bi5cbiAgICogR2VuZXJhbGl6ZXMgdGhlIHR1bm5lbCdzIG9sZCBoYW5kLXJvbGxlZCBgc3VwZXJ2aXNlRXhpdGAuIFNhZmUgdG8gY2FsbCBmb3JcbiAgICogc2V2ZXJhbCBjaGlsZHJlbjsgdGVhcmRvd24gaXMgaWRlbXBvdGVudC5cbiAgICovXG4gIGJpbmRQcm9jZXNzKGNoaWxkOiBCaW5kYWJsZVByb2Nlc3MpOiB2b2lkO1xufVxuXG4vKiogQSBzaW5nbGUgaW50ZXJjZXB0b3IsIG9yIHNldmVyYWwuIFRoZSBgY3JlYXRlQXBwYCBgaW50ZXJjZXB0b3I/OmAgb3B0aW9uLiAqL1xuZXhwb3J0IHR5cGUgSW50ZXJjZXB0b3IgPSAoY3R4OiBJbnRlcmNlcHRvckNvbnRleHQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4vKiogSG93IGxvbmcgYm91bmQgY2hpbGRyZW4gZ2V0IHRvIGV4aXQgb24gYFNJR1RFUk1gIGJlZm9yZSB0aGUgYXBwIGZvcmNlLWV4aXRzLiAqL1xuY29uc3QgVEVBUkRPV05fR1JBQ0VfTVMgPSAzMDAwO1xuXG4vKiogVGhlIHNpZ25hbHMgdGhhdCB0cmlnZ2VyIHRlYXJkb3duIHdoZW4gdGhlIE1BSU4gcHJvY2VzcyByZWNlaXZlcyB0aGVtLiAqL1xuY29uc3QgVEVBUkRPV05fU0lHTkFMUyA9IFtcIlNJR0lOVFwiLCBcIlNJR1RFUk1cIiwgXCJTSUdIVVBcIl0gYXMgY29uc3Q7XG5cbi8qKlxuICogVGhlIG11dGFibGUgbWFjaGluZXJ5IGJlaGluZCBhbiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fS4gU3BsaXQgb3V0IHNvXG4gKiB7QGxpbmsgY3JlYXRlSW50ZXJjZXB0b3JDb250ZXh0fSBjYW4gaGFuZCB0aGUgcHVibGljIGNvbnRleHQgdG8gaW50ZXJjZXB0b3JzXG4gKiB3aGlsZSBgY3JlYXRlLWFwcGAgcmV0YWlucyB0aGUgYGVtaXRMaWZlY3ljbGVgIHNpZGUtY2hhbm5lbCB0aGUgYnJpZGdlIGRyaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlcmNlcHRvclJ1bnRpbWUge1xuICAvKiogVGhlIGNvbnRleHQgaGFuZGVkIHRvIGVhY2ggaW50ZXJjZXB0b3IuICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEludGVyY2VwdG9yQ29udGV4dDtcbiAgLyoqIEZpcmUgYSBsaWZlY3ljbGUgZXZlbnQgdG8gZXZlcnkgc3Vic2NyaWJlciAoY2FsbGVkIGJ5IHtAbGluayBsaWZlY3ljbGVCcmlkZ2V9KS4gKi9cbiAgZW1pdExpZmVjeWNsZShldmVudDogTGlmZWN5Y2xlRXZlbnQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEJ1aWxkIGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9ICsgaXRzIHtAbGluayBJbnRlcmNlcHRvclJ1bnRpbWV9LlxuICpcbiAqIFRlYXJkb3duIGlzIHRoZSBnZW5lcmFsaXplZCBgc3VwZXJ2aXNlRXhpdGA6IHRoZSBmaXJzdCBjaGlsZCBleGl0IG9yIG1haW4tcHJvY2Vzc1xuICogdGVybWluYXRpb24gc2lnbmFsIGZsaXBzIGEgb25lLXNob3QgZ3VhcmQsIGBTSUdURVJNYHMgdGhlIG90aGVyIGJvdW5kIGNoaWxkcmVuLFxuICogdGhlbiBgcHJvY2Vzcy5leGl0YHMgYWZ0ZXIge0BsaW5rIFRFQVJET1dOX0dSQUNFX01TfSAoYW4gYHVucmVmYCdkIHRpbWVyLCBzbyBpdFxuICogbmV2ZXIgaXRzZWxmIGhvbGRzIHRoZSBsb29wIG9wZW4pLiBUaGUgcHJvY2Vzcy1zaWduYWwgbGlzdGVuZXJzIGFyZSBpbnN0YWxsZWRcbiAqIGxhemlseSBvbiB0aGUgZmlyc3QgYGJpbmRQcm9jZXNzYCBzbyBhbiBhcHAgdGhhdCBiaW5kcyBub3RoaW5nIGlzIHVudG91Y2hlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUludGVyY2VwdG9yQ29udGV4dChlbnY6IFJlc29sdmVkQXBwRW52KTogSW50ZXJjZXB0b3JSdW50aW1lIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyW10+KCk7XG4gIGNvbnN0IGNoaWxkcmVuID0gbmV3IFNldDxCaW5kYWJsZVByb2Nlc3M+KCk7XG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgbGV0IHNpZ25hbHNCb3VuZCA9IGZhbHNlO1xuXG4gIGNvbnN0IHRlYXJkb3duID0gKGNvZGU6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQua2lsbGVkKSBjaGlsZC5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksIFRFQVJET1dOX0dSQUNFX01TKS51bnJlZigpO1xuICB9O1xuXG4gIGNvbnN0IGJyb2FkY2FzdFNpZ25hbCA9IChzaWduYWw6IE5vZGVKUy5TaWduYWxzKTogdm9pZCA9PiB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgaWYgKCFjaGlsZC5raWxsZWQpIGNoaWxkLmtpbGwoc2lnbmFsKTtcbiAgICB9XG4gICAgdGVhcmRvd24oMCk7XG4gIH07XG5cbiAgY29uc3QgYmluZFByb2Nlc3NTaWduYWxzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzaWduYWxzQm91bmQpIHJldHVybjtcbiAgICBzaWduYWxzQm91bmQgPSB0cnVlO1xuICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIFRFQVJET1dOX1NJR05BTFMpIHtcbiAgICAgIHByb2Nlc3Mub24oc2lnbmFsLCAoKSA9PiBicm9hZGNhc3RTaWduYWwoc2lnbmFsKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGJpbmRQcm9jZXNzID0gKGNoaWxkOiBCaW5kYWJsZVByb2Nlc3MpOiB2b2lkID0+IHtcbiAgICBiaW5kUHJvY2Vzc1NpZ25hbHMoKTtcbiAgICBjaGlsZHJlbi5hZGQoY2hpbGQpO1xuICAgIGNoaWxkLm9uY2UoXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcImJvdW5kIHByb2Nlc3MgZXhpdGVkOyB0ZWFyaW5nIGRvd24gdGhlIGFwcFwiLCB7IGNvZGUgfSk7XG4gICAgICB0ZWFyZG93bih0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IGNvZGUgOiAxKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBvbkxpZmVjeWNsZSA9IChldmVudDogTGlmZWN5Y2xlRXZlbnQsIGZuOiBMaWZlY3ljbGVIYW5kbGVyKTogdm9pZCA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKGxpc3QpIGxpc3QucHVzaChmbik7XG4gICAgZWxzZSBoYW5kbGVycy5zZXQoZXZlbnQsIFtmbl0pO1xuICB9O1xuXG4gIGNvbnN0IGVtaXRMaWZlY3ljbGUgPSBhc3luYyAoZXZlbnQ6IExpZmVjeWNsZUV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbGlzdCA9IGhhbmRsZXJzLmdldChldmVudCk7XG4gICAgaWYgKCFsaXN0KSByZXR1cm47XG4gICAgZm9yIChjb25zdCBmbiBvZiBsaXN0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmbigpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gTWF0Y2ggQXBwS2l0OiBhIGZhaWxpbmcgbGlmZWN5Y2xlIGhhbmRsZXIgaXMgbG9nZ2VkLCBuZXZlciBmYXRhbCwgYW5kXG4gICAgICAgIC8vIG5ldmVyIGJsb2NrcyBpdHMgc2libGluZ3MuXG4gICAgICAgIGxvZ2dlci53YXJuKFwibGlmZWN5Y2xlIGhhbmRsZXIgZmFpbGVkXCIsIHsgZXZlbnQsIGVycm9yIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBjb250ZXh0OiBJbnRlcmNlcHRvckNvbnRleHQgPSB7XG4gICAgZW52LFxuICAgIG9uTGlmZWN5Y2xlLFxuICAgIGJyb2FkY2FzdFNpZ25hbCxcbiAgICBiaW5kUHJvY2VzcyxcbiAgfTtcblxuICByZXR1cm4geyBjb250ZXh0LCBlbWl0TGlmZWN5Y2xlIH07XG59XG5cbi8qKiBDb25maWcgZm9yIHtAbGluayBMaWZlY3ljbGVCcmlkZ2VQbHVnaW59OiB0aGUgc2luayBpdHMgY2FwdHVyZWQgZXZlbnRzIGZsb3cgdG8uICovXG5pbnRlcmZhY2UgTGlmZWN5Y2xlQnJpZGdlQ29uZmlnIGV4dGVuZHMgQmFzZVBsdWdpbkNvbmZpZyB7XG4gIC8qKiBUaGUgcnVudGltZSB3aG9zZSBgZW1pdExpZmVjeWNsZWAgcmVjZWl2ZXMgdGhlIHJlYWwgQXBwS2l0IGV2ZW50cy4gKi9cbiAgcnVudGltZT86IEludGVyY2VwdG9yUnVudGltZTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIHNoYXBlIG9mIHRoZSBgUGx1Z2luQ29udGV4dC5vbkxpZmVjeWNsZWAgd2UgYnJpZGdlLiBNaXJyb3JzIG9ubHkgdGhlXG4gKiBvbmUgbWV0aG9kIHdlIHRvdWNoIChsaWtlIHtAbGluayBQbHVnaW5Db250ZXh0TGlrZX0gaW4gYC4vcGx1Z2luYCksIHNpbmNlXG4gKiBBcHBLaXQncyBgUGx1Z2luQ29udGV4dGAgaXMgbm90IGltcG9ydGFibGUgZnJvbSB0aGUgcGFja2FnZSdzIGBleHBvcnRzYC5cbiAqL1xuaW50ZXJmYWNlIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgb25MaWZlY3ljbGUoZXZlbnQ6IExpZmVjeWNsZUV2ZW50LCBmbjogTGlmZWN5Y2xlSGFuZGxlcik6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIGhhc09uTGlmZWN5Y2xlKGNvbnRleHQ6IHVua25vd24pOiBjb250ZXh0IGlzIExpZmVjeWNsZUNvbnRleHRMaWtlIHtcbiAgcmV0dXJuIHR5cGVvZiAoY29udGV4dCBhcyBMaWZlY3ljbGVDb250ZXh0TGlrZSB8IHVuZGVmaW5lZCk/Lm9uTGlmZWN5Y2xlID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogVGhlIGludGVybmFsIHBsdWdpbiB7QGxpbmsgY3JlYXRlQXBwfSBpbmplY3RzIHRvIG1ha2UgQXBwS2l0J3MgbGlmZWN5Y2xlXG4gKiByZWFjaGFibGUgZnJvbSBpbnRlcmNlcHRvciBjb2RlLiBPbiBgc2V0dXAoKWAgaXQgcmVhZHMgaXRzIG93biBgdGhpcy5jb250ZXh0YFxuICogKHRoZSByZWFsIGBQbHVnaW5Db250ZXh0YCkgYW5kIGZvcndhcmRzIGVhY2gge0BsaW5rIExpZmVjeWNsZUV2ZW50fSB0byB0aGVcbiAqIGludGVyY2VwdG9yIHJ1bnRpbWUsIHNvIGBjdHgub25MaWZlY3ljbGUoLi4uKWAgaGFuZGxlcnMgZmlyZSBvbiB0aGUgZ2VudWluZVxuICogZXZlbnRzLiBJdCBvd25zIG5vIHJvdXRlcywgY29uZmlnIHN1cmZhY2UsIG9yIGV4cG9ydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaWZlY3ljbGVCcmlkZ2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW48TGlmZWN5Y2xlQnJpZGdlQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBcImRieFRvb2xzTGlmZWN5Y2xlQnJpZGdlXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiTGlmZWN5Y2xlIEJyaWRnZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlJlbGF5cyBBcHBLaXQgbGlmZWN5Y2xlIGV2ZW50cyB0byB0aGUgY3JlYXRlQXBwIGludGVyY2VwdG9yIGNvbnRleHQuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICBoaWRkZW46IHRydWUsXG4gICAgcmVzb3VyY2VzOiB7IHJlcXVpcmVkOiBbXSwgb3B0aW9uYWw6IFtdIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwiZGJ4VG9vbHNMaWZlY3ljbGVCcmlkZ2VcIj47XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMuY29uZmlnLnJ1bnRpbWU7XG4gICAgaWYgKCFydW50aW1lKSByZXR1cm47XG4gICAgaWYgKCFoYXNPbkxpZmVjeWNsZSh0aGlzLmNvbnRleHQpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJubyBQbHVnaW5Db250ZXh0Lm9uTGlmZWN5Y2xlIHRvIGJyaWRnZTsgaW50ZXJjZXB0b3IgbGlmZWN5Y2xlIGV2ZW50cyBpbmVydFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzOiBMaWZlY3ljbGVFdmVudFtdID0gW1wic2V0dXA6Y29tcGxldGVcIiwgXCJzZXJ2ZXI6cmVhZHlcIiwgXCJzaHV0ZG93blwiXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50cykge1xuICAgICAgdGhpcy5jb250ZXh0Lm9uTGlmZWN5Y2xlKGV2ZW50LCAoKSA9PiBydW50aW1lLmVtaXRMaWZlY3ljbGUoZXZlbnQpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEZhY3RvcnkgZm9yIHRoZSBpbmplY3RlZCB7QGxpbmsgTGlmZWN5Y2xlQnJpZGdlUGx1Z2lufS4gKi9cbmV4cG9ydCBjb25zdCBsaWZlY3ljbGVCcmlkZ2UgPSB0b1BsdWdpbihMaWZlY3ljbGVCcmlkZ2VQbHVnaW4pO1xuIl19
|
|
@@ -118,5 +118,35 @@ export declare function resolveLakebaseConnection(config?: LakebaseResolverInput
|
|
|
118
118
|
* (which reads env directly) picks them up during its own `setup()`.
|
|
119
119
|
* Existing env values are preserved; only missing keys are filled in,
|
|
120
120
|
* which keeps explicit overrides authoritative.
|
|
121
|
+
*
|
|
122
|
+
* This does NOT set `PGUSER`, which needs an await - see
|
|
123
|
+
* {@link applyLakebaseEnv} for the complete set a Postgres pool requires.
|
|
121
124
|
*/
|
|
122
125
|
export declare function applyLakebaseToEnv(resolved: LakebaseConnection): void;
|
|
126
|
+
/**
|
|
127
|
+
* Resolve the connection AND apply every Postgres env var a Lakebase pool needs,
|
|
128
|
+
* returning the resolved connection plus the username that was applied.
|
|
129
|
+
*
|
|
130
|
+
* This is the whole set, which is the point of having one function for it:
|
|
131
|
+
* `createLakebasePool()` throws unless `LAKEBASE_ENDPOINT`, `PGHOST`,
|
|
132
|
+
* `PGDATABASE`, **and** a username (`PGUSER`, or `DATABRICKS_CLIENT_ID` for a
|
|
133
|
+
* service principal) are all present, and a Databricks App `postgres` resource
|
|
134
|
+
* binding supplies only the first. Anything that wants a working pool - the
|
|
135
|
+
* `lakebase` plugin, or AppKit's PERSISTENT cache, which quietly degrades to
|
|
136
|
+
* in-memory when the pool cannot be built - needs all four, so callers should not
|
|
137
|
+
* pair {@link applyLakebaseToEnv} with their own username lookup.
|
|
138
|
+
*
|
|
139
|
+
* `PGUSER` is applied with `??=` like the rest, so an explicitly configured value
|
|
140
|
+
* stays authoritative. The lookup returns `undefined` rather than throwing when it
|
|
141
|
+
* cannot determine a user, leaving the pool to resolve its own.
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* import { lakebaseResolver } from "@dbx-tools/appkit";
|
|
145
|
+
*
|
|
146
|
+
* // Enough for `createLakebasePool()` to build a pool.
|
|
147
|
+
* const { user } = await lakebaseResolver.applyLakebaseEnv({ autoCreate: false });
|
|
148
|
+
*/
|
|
149
|
+
export declare function applyLakebaseEnv(config?: LakebaseResolverInputs, signal?: AbortSignal): Promise<{
|
|
150
|
+
resolved: LakebaseConnection;
|
|
151
|
+
user?: string;
|
|
152
|
+
}>;
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
*
|
|
35
35
|
* @module
|
|
36
36
|
*/
|
|
37
|
-
import { ConfigurationError, ExecutionError, getWorkspaceClient, ValidationError, } from "@databricks/appkit";
|
|
37
|
+
import { ConfigurationError, ExecutionError, getUsernameWithApiLookup, getWorkspaceClient, ValidationError, } from "@databricks/appkit";
|
|
38
38
|
import { project } from "@dbx-tools/core";
|
|
39
39
|
import { async, log, object, string } from "@dbx-tools/shared-core";
|
|
40
40
|
import { z } from "zod";
|
|
@@ -306,6 +306,9 @@ export async function resolveLakebaseConnection(config, signal) {
|
|
|
306
306
|
* (which reads env directly) picks them up during its own `setup()`.
|
|
307
307
|
* Existing env values are preserved; only missing keys are filled in,
|
|
308
308
|
* which keeps explicit overrides authoritative.
|
|
309
|
+
*
|
|
310
|
+
* This does NOT set `PGUSER`, which needs an await - see
|
|
311
|
+
* {@link applyLakebaseEnv} for the complete set a Postgres pool requires.
|
|
309
312
|
*/
|
|
310
313
|
export function applyLakebaseToEnv(resolved) {
|
|
311
314
|
if (resolved.endpoint)
|
|
@@ -317,6 +320,37 @@ export function applyLakebaseToEnv(resolved) {
|
|
|
317
320
|
process.env.PGPORT ??= String(resolved.port);
|
|
318
321
|
process.env.PGSSLMODE ??= resolved.sslMode;
|
|
319
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* Resolve the connection AND apply every Postgres env var a Lakebase pool needs,
|
|
325
|
+
* returning the resolved connection plus the username that was applied.
|
|
326
|
+
*
|
|
327
|
+
* This is the whole set, which is the point of having one function for it:
|
|
328
|
+
* `createLakebasePool()` throws unless `LAKEBASE_ENDPOINT`, `PGHOST`,
|
|
329
|
+
* `PGDATABASE`, **and** a username (`PGUSER`, or `DATABRICKS_CLIENT_ID` for a
|
|
330
|
+
* service principal) are all present, and a Databricks App `postgres` resource
|
|
331
|
+
* binding supplies only the first. Anything that wants a working pool - the
|
|
332
|
+
* `lakebase` plugin, or AppKit's PERSISTENT cache, which quietly degrades to
|
|
333
|
+
* in-memory when the pool cannot be built - needs all four, so callers should not
|
|
334
|
+
* pair {@link applyLakebaseToEnv} with their own username lookup.
|
|
335
|
+
*
|
|
336
|
+
* `PGUSER` is applied with `??=` like the rest, so an explicitly configured value
|
|
337
|
+
* stays authoritative. The lookup returns `undefined` rather than throwing when it
|
|
338
|
+
* cannot determine a user, leaving the pool to resolve its own.
|
|
339
|
+
*
|
|
340
|
+
* @example
|
|
341
|
+
* import { lakebaseResolver } from "@dbx-tools/appkit";
|
|
342
|
+
*
|
|
343
|
+
* // Enough for `createLakebasePool()` to build a pool.
|
|
344
|
+
* const { user } = await lakebaseResolver.applyLakebaseEnv({ autoCreate: false });
|
|
345
|
+
*/
|
|
346
|
+
export async function applyLakebaseEnv(config, signal) {
|
|
347
|
+
const resolved = await resolveLakebaseConnection(config, signal);
|
|
348
|
+
applyLakebaseToEnv(resolved);
|
|
349
|
+
const user = await getUsernameWithApiLookup({});
|
|
350
|
+
if (user)
|
|
351
|
+
process.env.PGUSER ??= user;
|
|
352
|
+
return { resolved, ...(user ? { user } : {}) };
|
|
353
|
+
}
|
|
320
354
|
/**
|
|
321
355
|
* Adapt an {@link AbortSignal} into the api client's cancellation context.
|
|
322
356
|
* AppKit resolves a different copy of `@databricks/sdk-experimental` than this
|
|
@@ -676,4 +710,4 @@ async function pickDatabase(ws, project, branch, signal) {
|
|
|
676
710
|
logger.debug("autopg: resolved database", { database: choice });
|
|
677
711
|
return choice;
|
|
678
712
|
}
|
|
679
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGVBQWUsR0FDaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFZLFNBQVMsQ0FBQztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5Qiw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUM3QyxNQUFNLHNCQUFzQixHQUFHLEtBQUssQ0FBQztBQUNyQyw4RUFBOEU7QUFDOUUsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFDakMsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsdUZBQXVGO0FBQ3ZGLE1BQU0saUJBQWlCLEdBQUcsR0FBRyxDQUFDO0FBQzlCLGdFQUFnRTtBQUNoRSxNQUFNLHdCQUF3QixHQUFHLDBCQUEwQixDQUFDO0FBQzVELDRFQUE0RTtBQUM1RSxNQUFNLDJCQUEyQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0QsdUVBQXVFO0FBQ3ZFLE1BQU0sMkJBQTJCLEdBQUcsY0FBYyxDQUFDO0FBQ25ELHFEQUFxRDtBQUNyRCxNQUFNLGdCQUFnQixHQUFHLHFCQUFxQixDQUFDO0FBMEIvQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzdCLHNDQUFzQztJQUN0QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtDQUM1QixDQUFDLENBQUM7QUFHSCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlCLGlFQUFpRTtJQUNqRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQixHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMxQixxRUFBcUU7SUFDckUscUVBQXFFO0lBQ3JFLE1BQU0sRUFBRSxDQUFDO1NBQ04sTUFBTSxDQUFDO1FBQ04sYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDcEMsNERBQTREO1FBQzVELEtBQUssRUFBRSxDQUFDO2FBQ0wsTUFBTSxDQUFDO1lBQ04sSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7WUFDM0IsY0FBYyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7U0FDdEMsQ0FBQzthQUNELFFBQVEsRUFBRTtRQUNiLGtFQUFrRTtRQUNsRSxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUNyQyxDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBR0gsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QixtREFBbUQ7SUFDbkQsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsTUFBTSxFQUFFLENBQUM7U0FDTixNQUFNLENBQUM7UUFDTiw2REFBNkQ7UUFDN0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDL0IsYUFBYSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDckMsQ0FBQztTQUNELFFBQVEsRUFBRTtDQUNkLENBQUMsQ0FBQztBQUdILE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsaUVBQWlFO0lBQ2pFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzNCLE1BQU0sRUFBRSxDQUFDO1NBQ04sTUFBTSxDQUFDO1FBQ04sbUVBQW1FO1FBQ25FLDZEQUE2RDtRQUM3RCx1REFBdUQ7UUFDdkQsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUN6QyxDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBR0g7Ozs7O0dBS0c7QUFDSCxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbEMsZUFBZSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdEMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxFQUFFO0lBQzNDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLFFBQVEsRUFBRTtJQUMxQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLEVBQUU7SUFDN0MsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxFQUFFO0NBQzlDLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDNUIsS0FBSyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsUUFBUSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDakMsQ0FBQyxDQUFDO0FBR0gsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUVwRSxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEtBQWtDO0lBQzFELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzFELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQixNQUFNLGVBQWUsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSw0QkFBNEIsWUFBWSxFQUFFLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUF5QjtJQUNwRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE9BQWUsRUFBRSxNQUFjO0lBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLG1CQUFtQixJQUFJLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JGLE1BQU0sTUFBTSxHQUFHLE9BQU8sR0FBRyxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxPQUFlLEVBQUUsTUFBYyxFQUFFLE1BQW9CO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsa0JBQWtCLENBQ3RDLE1BQStCO0lBRS9CLE1BQU0sVUFBVSxHQUFHLE1BQU0sRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUN2RixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLE1BQU0sa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsTUFBTSxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU87UUFDTCxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTztRQUMxQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTTtRQUN2QyxnRUFBZ0U7UUFDaEUsbUVBQW1FO1FBQ25FLHVDQUF1QztRQUN2QyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7UUFDekIsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLElBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVE7UUFDekYsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUk7UUFDekUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJO1FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFVBQVUsSUFBSSxNQUFNLENBQUMsT0FBTztRQUN4RCxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVU7S0FDL0IsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHlCQUF5QixDQUM3QyxNQUErQixFQUMvQixNQUFvQjtJQUVwQixNQUFNLE1BQU0sR0FBRyxNQUFNLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksWUFBWSxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksZ0JBQWdCLENBQUM7SUFFbkQsa0VBQWtFO0lBQ2xFLG1FQUFtRTtJQUNuRSxJQUFJLFFBQVEsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUN0QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsT0FBTyxLQUFLLGNBQWMsQ0FBQyxPQUFPLENBQUM7UUFDbkMsTUFBTSxLQUFLLGNBQWMsQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QyxPQUFPLEtBQUssY0FBYyxDQUFDLE9BQU8sQ0FBQztRQUNuQyxNQUFNLEtBQUssY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxJQUFJLGNBQWMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3RDLFFBQVEsR0FBRyxjQUFjLENBQUMsa0JBQWtCLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCwwQ0FBMEM7SUFDMUMsSUFBSSxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0RSxDQUFDO0lBRUQsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbEMsb0VBQW9FO0lBQ3BFLGdFQUFnRTtJQUNoRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLE1BQU0sS0FBSyxHQUFHLE1BQU0sa0JBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDeEIsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDdEIsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDOUIsQ0FBQztJQUNILENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxHQUFHLE1BQU0sbUJBQW1CLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLEVBQUUsR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMzRCxRQUFRLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN0QixNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUMsSUFBSSxjQUFjLENBQUMsT0FBTyxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2pGLE1BQU0sRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2hDLEVBQUUsRUFDRixjQUFjLENBQUMsT0FBTyxFQUN0QixjQUFjLENBQUMsTUFBTSxFQUNyQixjQUFjLENBQUMsVUFBVSxFQUN6QixNQUFNLENBQ1AsQ0FBQztZQUNGLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDOUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBNEI7SUFDN0QsSUFBSSxRQUFRLENBQUMsUUFBUTtRQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUMzRSxJQUFJLFFBQVEsQ0FBQyxJQUFJO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQztJQUN4RCxJQUFJLFFBQVEsQ0FBQyxRQUFRO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUNwRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxLQUFLLFFBQVEsQ0FBQyxPQUFPLENBQUM7QUFDN0MsQ0FBQztBQU9EOzs7Ozs7R0FNRztBQUNILFNBQVMsY0FBYyxDQUFDLE1BQStCO0lBQ3JELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBRSxTQUFTLENBQUMsTUFBTSxDQUFrQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbEYsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMsYUFBYSxDQUFJLE1BQW9CLEVBQUUsSUFBWSxFQUFFLElBQWE7SUFDekUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sQ0FBQyxPQUFPO1FBQUUsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMENBQTBDLEVBQUU7UUFDdkQsSUFBSTtRQUNKLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU07S0FDNUIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLGNBQWMsQ0FBQyw4Q0FBOEMsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsRyxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLEtBQUssVUFBVSxPQUFPLENBQ3BCLEVBQW1CLEVBQ25CLElBQVksRUFDWixNQUFvQixFQUNwQixNQUFvQjtJQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNwQztRQUNFLElBQUk7UUFDSixNQUFNLEVBQUUsS0FBSztRQUNiLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3BELEdBQUcsRUFBRSxLQUFLO0tBQ1gsRUFDRCxjQUFjLENBQUMsTUFBTSxDQUFDLENBQ3ZCLENBQUM7SUFDRixPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxzRUFBc0U7QUFDdEUsS0FBSyxVQUFVLFFBQVEsQ0FDckIsRUFBbUIsRUFDbkIsSUFBWSxFQUNaLE1BQW9CLEVBQ3BCLElBQWEsRUFDYixLQUE4QixFQUM5QixNQUFvQjtJQUVwQixNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNwQztRQUNFLElBQUk7UUFDSixNQUFNLEVBQUUsTUFBTTtRQUNkLEtBQUs7UUFDTCxPQUFPLEVBQUUsSUFBSSxPQUFPLENBQUM7WUFDbkIsTUFBTSxFQUFFLGtCQUFrQjtZQUMxQixjQUFjLEVBQUUsa0JBQWtCO1NBQ25DLENBQUM7UUFDRixHQUFHLEVBQUUsS0FBSztRQUNWLE9BQU8sRUFBRSxJQUFJO0tBQ2QsRUFDRCxjQUFjLENBQUMsTUFBTSxDQUFDLENBQ3ZCLENBQUM7SUFDRixPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLEVBQW1CLEVBQUUsTUFBb0I7SUFDbkUsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEYsT0FBTyxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUM1QixDQUFDO0FBRUQsS0FBSyxVQUFVLFlBQVksQ0FDekIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQW9CO0lBRXBCLE1BQU0sR0FBRyxHQUFHLE1BQU0sT0FBTyxDQUN2QixFQUFFLEVBQ0YsR0FBRyxRQUFRLGFBQWEsT0FBTyxXQUFXLEVBQzFDLGtCQUFrQixFQUNsQixNQUFNLENBQ1AsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDNUIsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQzFCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFjLEVBQ2QsTUFBb0I7SUFFcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQ3ZCLEVBQUUsRUFDRixHQUFHLFFBQVEsYUFBYSxPQUFPLGFBQWEsTUFBTSxZQUFZLEVBQzlELGtCQUFrQixFQUNsQixNQUFNLENBQ1AsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELEtBQUssVUFBVSxhQUFhLENBQzFCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFjLEVBQ2QsTUFBb0I7SUFFcEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxPQUFPLENBQ3ZCLEVBQUUsRUFDRixHQUFHLFFBQVEsYUFBYSxPQUFPLGFBQWEsTUFBTSxZQUFZLEVBQzlELGtCQUFrQixFQUNsQixNQUFNLENBQ1AsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELEtBQUssVUFBVSxXQUFXLENBQ3hCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFjLEVBQ2QsVUFBa0IsRUFDbEIsTUFBb0I7SUFFcEIsT0FBTyxPQUFPLENBQ1osRUFBRSxFQUNGLEdBQUcsUUFBUSxhQUFhLE9BQU8sYUFBYSxNQUFNLGNBQWMsVUFBVSxFQUFFLEVBQzVFLGNBQWMsRUFDZCxNQUFNLENBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxrQkFBa0IsQ0FDL0IsRUFBbUIsRUFDbkIsSUFBWSxFQUNaLE1BQW9CO0lBRXBCLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNoRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVM7WUFBRSxTQUFTO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0QsS0FBSyxNQUFNLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QixNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ2xELElBQUksQ0FBQyxRQUFRO2dCQUFFLFNBQVM7WUFDeEIsTUFBTSxTQUFTLEdBQUcsTUFBTSxhQUFhLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdkUsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO1lBQ3BFLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNoQixNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFO29CQUMvQyxJQUFJO29CQUNKLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSTtpQkFDckIsQ0FBQyxDQUFDO2dCQUNILE9BQU87b0JBQ0wsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLE1BQU0sRUFBRSxRQUFRO29CQUNoQixRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUk7aUJBQ3JCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGtDQUFrQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsS0FBSyxVQUFVLG1CQUFtQixDQUNoQyxFQUFtQixFQUNuQixVQUFzQyxFQUN0QyxNQUFvQjtJQUVwQixNQUFNLFFBQVEsR0FBRyxNQUFNLFlBQVksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFHLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDeEQsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1RCxPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ3pCLE1BQU0sa0JBQWtCLENBQUMsZ0JBQWdCLENBQ3ZDLGtCQUFrQixFQUNsQixrRkFBa0YsQ0FDbkYsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEVBQUUsR0FBRyxVQUFVLElBQUksQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQztRQUNwRCxPQUFPLGFBQWEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxRQUFRO1NBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQztTQUM3QyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsVUFBVSxFQUNWLHFHQUFxRyxVQUFVLEVBQUUsQ0FDbEgsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzVCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9FLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEYsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsVUFBVSxFQUNWLGtGQUFrRixDQUNuRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILEtBQUssVUFBVSxhQUFhLENBQzFCLEVBQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLE1BQW9CO0lBRXBCLE1BQU0sQ0FBQyxJQUFJLENBQUMscUNBQXFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUMzRSxJQUFJLENBQUM7UUFDSCxNQUFNLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FDdkIsRUFBRSxFQUNGLEdBQUcsUUFBUSxXQUFXLEVBQ3RCLGVBQWUsRUFDZixFQUFFLElBQUksRUFBRSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxFQUFFLEVBQzVDLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUN6QixNQUFNLENBQ1AsQ0FBQztRQUNGLE1BQU0sZ0JBQWdCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDO1lBQUUsTUFBTSxHQUFHLENBQUM7UUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRTtZQUMvRCxPQUFPLEVBQUUsU0FBUztTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxLQUFjO0lBQzFDLElBQUksQ0FBQyxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxHQUFHLEtBS1QsQ0FBQztJQUNGLElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDeEQsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckUsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQWMsRUFBRSxPQUFnQjtJQUN2RCxNQUFNLENBQUMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNoRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckYsT0FBTyxJQUFJLGNBQWMsQ0FBQyw4QkFBOEIsTUFBTSxFQUFFLEVBQUU7UUFDaEUsT0FBTyxFQUFFO1lBQ1AsU0FBUyxFQUFFLE1BQU07WUFDakIsU0FBUyxFQUFFLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztTQUMzRjtLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQzdCLEVBQW1CLEVBQ25CLEVBQWEsRUFDYixNQUFvQjtJQUVwQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsTUFBTSxlQUFlLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxTQUFTLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sY0FBYyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDekIsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssR0FBRyxvQkFBb0IsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQzNFLE1BQU0sU0FBUyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLElBQUksTUFBTSxFQUFFLEVBQUUsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNqQixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxlQUFlLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztJQUNILENBQUM7SUFDRCxNQUFNLElBQUksY0FBYyxDQUFDLHdDQUF3QyxNQUFNLEVBQUUsRUFBRTtRQUN6RSxPQUFPLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTtLQUNoRSxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsaUJBQWlCLENBQzlCLEVBQW1CLEVBQ25CLE9BQWUsRUFDZixNQUFjLEVBQ2QsVUFBa0IsRUFDbEIsTUFBb0I7SUFFcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLElBQUksSUFBSSxHQUFvQixJQUFJLENBQUM7SUFDakMsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssR0FBRyx5QkFBeUIsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2hGLElBQUksR0FBRyxNQUFNLFdBQVcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUM7UUFDekMsSUFBSSxLQUFLLElBQUksMkJBQTJCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2pFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEtBQUssS0FBSywyQkFBMkIsRUFBRSxDQUFDO1lBQ3RFLGtFQUFrRTtZQUNsRSwrREFBK0Q7WUFDL0QsOEJBQThCO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELE1BQU0sSUFBSSxjQUFjLENBQUMsMkNBQTJDLFVBQVUsRUFBRSxFQUFFO1FBQ2hGLE9BQU8sRUFBRTtZQUNQLE9BQU87WUFDUCxNQUFNO1lBQ04sVUFBVTtZQUNWLFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxJQUFJLFNBQVM7U0FDcEQ7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUsVUFBVSxDQUN2QixFQUFtQixFQUNuQixPQUFlLEVBQ2YsTUFBb0I7SUFFcEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxZQUFZLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUIsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsK0JBQStCLE9BQU8sR0FBRyxFQUN6QywrREFBK0QsQ0FDaEUsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FDVixpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsTUFBTTtRQUN2QyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNwRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLFVBQVUsR0FBRyxRQUFRO2FBQ3hCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUM1QyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2QsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsVUFBVSxFQUNWLFlBQVksT0FBTyw4SEFBOEgsVUFBVSxFQUFFLENBQzlKLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNyRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsS0FBSyxVQUFVLFlBQVksQ0FDekIsRUFBbUIsRUFDbkIsT0FBZSxFQUNmLE1BQWMsRUFDZCxNQUFvQjtJQUVwQixNQUFNLFNBQVMsR0FBRyxNQUFNLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMsa0NBQWtDLE9BQU8sYUFBYSxNQUFNLEdBQUcsRUFDL0QsbUVBQW1FLENBQ3BFLENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxPQUFPLEdBQ1gsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxhQUFhLEtBQUssd0JBQXdCLENBQUM7UUFDM0UsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ25CLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0QsTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsVUFBVSxFQUNWLG9HQUFvRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3ZILENBQUM7SUFDSixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO0lBQ3pDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxLQUFLLFVBQVUsWUFBWSxDQUN6QixFQUFtQixFQUNuQixPQUFlLEVBQ2YsTUFBYyxFQUNkLE1BQW9CO0lBRXBCLE1BQU0sU0FBUyxHQUFHLE1BQU0sYUFBYSxDQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25FLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN2QyxrQ0FBa0MsT0FBTyxhQUFhLE1BQU0sR0FBRyxFQUMvRCw0REFBNEQsQ0FDN0QsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxTQUFTO1NBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQztTQUN2QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sTUFBTSxHQUNWLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0YsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FDeEMsVUFBVSxFQUNWLDhCQUE4QixnQkFBZ0IscURBQXFELEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdEgsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiByZXNvbHZlci5cbiAqXG4gKiBSZWFkcyB0aGUgc2FtZSBlbnYgdmFycyB0aGUgYGxha2ViYXNlYCBwbHVnaW4gY29uc3VtZXMgKGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCBgUEdQT1JUYCwgYFBHU1NMTU9ERWAsIGBMQUtFQkFTRV9FTkRQT0lOVGApIGFuZCBmaWxscyBpblxuICogd2hpY2hldmVyIHBpZWNlcyBhcmUgbWlzc2luZyB1c2luZyB0aGUgTGFrZWJhc2UgQXV0b3NjYWxpbmcgUkVTVCBBUElcbiAqIHVuZGVyIGAvYXBpLzIuMC9wb3N0Z3Jlcy9gIHZpYSB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LlxuICpcbiAqIGBMQUtFQkFTRV9FTkRQT0lOVGAgKGFuZCBgY29uZmlnLmVuZHBvaW50YCkgYWNjZXB0IGFueXRoaW5nXG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kcyAtIGNhbm9uaWNhbCByZXNvdXJjZSBwYXRocywgUG9zdGdyZXNcbiAqIFVSSXMsIGJhcmUgaG9zdG5hbWVzLCBvciBiYXJlIHByb2plY3QgaWRzLiBUaGUgcmVzb2x2ZXIgbGF5ZXJzXG4gKiB3aGF0ZXZlciBwaWVjZXMgZmFsbCBvdXQgb2YgcGFyc2luZyB1bmRlciBleHBsaWNpdCBjb25maWcgLyBlbnZcbiAqIHZhbHVlcywgdGhlbiBmaWxscyB0aGUgcmVtYWluaW5nIGdhcHMgdmlhIHRoZSBBUEk6XG4gKlxuICogICAxLiBSZXZlcnNlLWxvb2t1cDogd2hlbiBhIGhvc3QgaXMga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGggaXMsXG4gKiAgICAgIHNjYW4gcHJvamVjdHMgLT4gYnJhbmNoZXMgLT4gZW5kcG9pbnRzIGZvciBhIG1hdGNoaW5nXG4gKiAgICAgIGBzdGF0dXMuaG9zdHMuaG9zdGAgYW5kIHJlY292ZXIgdGhlIG93bmluZyBwcm9qZWN0L2JyYW5jaC9lbmRwb2ludC5cbiAqICAgMi4gUGljazogd2hlbiBhIHByb2plY3QgaXMga25vd24gYnV0IGNoaWxkIHJlc291cmNlcyBhcmVuJ3QsIHByZWZlclxuICogICAgICB0aGUgc2VydmVyLXNpZGUgZGVmYXVsdCAoYHN0YXR1cy5kZWZhdWx0YCwgYEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWAsXG4gKiAgICAgIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkgYW5kIGZhbGwgYmFjayB0byBcInRoZSBvbmx5IG9uZVwiIHdoZW4gYVxuICogICAgICBsaXN0aW5nIHJldHVybnMgYSBzaW5nbGUgcmVzdWx0LlxuICogICAzLiBBdXRvLWNyZWF0ZTogd2hlbiBubyBwcm9qZWN0cyBleGlzdCBhdCBhbGwsIGNyZWF0ZSBvbmUgd2hvc2VcbiAqICAgICAgaWQgZGVmYXVsdHMgdG8gYHByb2plY3QubmFtZSgpYCBzbHVnaWZpZWQgKG92ZXJyaWRlXG4gKiAgICAgIHdpdGggYGNvbmZpZy5hdXRvQ3JlYXRlOiBcIm15LWlkXCJgIG9yIGRpc2FibGUgd2l0aFxuICogICAgICBgY29uZmlnLmF1dG9DcmVhdGU6IGZhbHNlYCkuIFRoZSBjcmVhdGUgY2FsbCBpcyBpZGVtcG90ZW50IC0gYW5cbiAqICAgICAgYEFMUkVBRFlfRVhJU1RTYCByZXNwb25zZSBmcm9tIGEgY29uY3VycmVudCBib290IGlzIHRyZWF0ZWQgYXNcbiAqICAgICAgc3VjY2Vzcy4gVGhlbiBwb2xsIHRoZSBkZWZhdWx0IGVuZHBvaW50IHVudGlsIGl0IHJlcG9ydHNcbiAqICAgICAgYGN1cnJlbnRfc3RhdGVgIGBSRUFEWWAgb3IgYElETEVgLlxuICpcbiAqIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdyaXRlcyB0aGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG9cbiAqIGBwcm9jZXNzLmVudmAgc28gdGhlIGRvd25zdHJlYW0gYGxha2ViYXNlYCBwbHVnaW4gcGlja3MgdGhlbSB1cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hcGkvd29ya3NwYWNlL3Bvc3RncmVzXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdldFdvcmtzcGFjZUNsaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwcm9qZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYXN5bmMsIGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlc29sdmVDb25maWdWYWx1ZSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG5pbXBvcnQgeyBNQVhfVENQX1BPUlQsIHRvQ29udGV4dCB9IGZyb20gXCIuL2RhdGFicmlja3MudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlQWRkcmVzcyxcbiAgcGFyc2VSZXNvdXJjZVBhdGgsXG4gIFNTTF9NT0RFUyxcbiAgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMsXG4gIHR5cGUgU3NsTW9kZSxcbn0gZnJvbSBcIi4vcGdhZGRyZXNzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJsYWtlYmFzZS1yZXNvbHZlclwiKTtcbmNvbnN0IEFQSV9CQVNFID0gXCIvYXBpLzIuMC9wb3N0Z3Jlc1wiO1xuY29uc3QgREVGQVVMVF9QT1JUID0gNTQzMjtcbmNvbnN0IERFRkFVTFRfU1NMX01PREU6IFNzbE1vZGUgPSBcInJlcXVpcmVcIjtcbmNvbnN0IERFRkFVTFRfUEdfVkVSU0lPTiA9IDE3O1xuLyoqIExha2ViYXNlIHByb2plY3QgaWRzOiBgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYC4gKi9cbmNvbnN0IFBST0pFQ1RfSURfTUFYX0xFTiA9IDYzO1xuY29uc3QgT1BFUkFUSU9OX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuY29uc3QgT1BFUkFUSU9OX1BPTExfTVMgPSAyXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuY29uc3QgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUyA9IDJfMDAwO1xuLyoqIENlaWxpbmcgb24gYSBzaW5nbGUgYmFja29mZiBzdGVwLCBzbyBhIGxvbmcgd2FpdCBzdGlsbCBwb2xscyByZWd1bGFybHkuICovXG5jb25zdCBQT0xMX01BWF9ERUxBWV9NUyA9IDE1XzAwMDtcbmNvbnN0IFBPTExfQkFDS09GRl9GQUNUT1IgPSAxLjU7XG4vKiogRnJhY3Rpb24gb2YgZWFjaCBkZWxheSBhcHBsaWVkIGFzICsvLSBqaXR0ZXIsIHNvIGNvbmN1cnJlbnQgYm9vdHMgZGVzeW5jaHJvbml6ZS4gKi9cbmNvbnN0IFBPTExfSklUVEVSX1JBVElPID0gMC4yO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuZW5kcG9pbnRfdHlwZWAgZm9yIHRoZSB3cml0YWJsZSBwcmltYXJ5LiAqL1xuY29uc3QgUkVBRF9XUklURV9FTkRQT0lOVF9UWVBFID0gXCJFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEVcIjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgIHZhbHVlcyB0aGF0IHdpbGwgYWNjZXB0IGEgY29ubmVjdGlvbi4gKi9cbmNvbnN0IENPTk5FQ1RBQkxFX0VORFBPSU5UX1NUQVRFUyA9IG5ldyBTZXQoW1wiUkVBRFlcIiwgXCJJRExFXCJdKTtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgIGJlZm9yZSBhIGhvc3RuYW1lIGlzIG1lYW5pbmdmdWwuICovXG5jb25zdCBJTklUSUFMSVpJTkdfRU5EUE9JTlRfU1RBVEUgPSBcIklOSVRJQUxJWklOR1wiO1xuLyoqIExha2ViYXNlJ3Mgb3duIGRlZmF1bHQgUG9zdGdyZXMgZGF0YWJhc2UgbmFtZS4gKi9cbmNvbnN0IERFRkFVTFRfREFUQUJBU0UgPSBcImRhdGFicmlja3NfcG9zdGdyZXNcIjtcblxuLyoqXG4gKiBVc2VyLXN1cHBsaWVkIExha2ViYXNlIGlucHV0cyAoY29uZmlnIG9yIGVudikgYmVmb3JlIGFueSBBUEkgcmVzb2x1dGlvbi5cbiAqIEV4dGVuZHMge0BsaW5rIExha2ViYXNlQ29ubmVjdGlvbklucHV0c30gd2l0aCByZXNvbHZlci1vbmx5IG9wdGlvbnMuXG4gKiB7QGxpbmsgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbn0gZmlsbHMgZ2FwcyBmcm9tIHRoZSBMYWtlYmFzZSBBUEkgd2hlblxuICogaXQgaGFzIGVub3VnaCBjb250ZXh0ICh0eXBpY2FsbHkgYSBgcHJvamVjdGApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlUmVzb2x2ZXJJbnB1dHMgZXh0ZW5kcyBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMge1xuICAvKipcbiAgICogV2hhdCB0byBkbyB3aGVuIG5vIHByb2plY3QgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UgYXQgYWxsLlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZGVyaXZlIGEgcHJvamVjdCBpZCBmcm9tXG4gICAqICAge0BsaW5rIHByb2plY3QubmFtZX0gKHRoZSBob3N0IHJlcG8ncyBgcGFja2FnZS5qc29uYFxuICAgKiAgIG5hbWUpIHNsdWdpZmllZCB0byBMYWtlYmFzZSBpZCBjb25zdHJhaW50cywgdGhlbiBjcmVhdGUgaXQuXG4gICAqIC0gYHN0cmluZ2A6IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggdGhpcyBleGFjdCBpZC5cbiAgICogLSBgZmFsc2VgOiBza2lwIGNyZWF0aW9uIGFuZCB0aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGF1dG9DcmVhdGU/OiBzdHJpbmcgfCBmYWxzZTtcbn1cblxuLyoqIEZ1bGx5LXJlc29sdmVkIExha2ViYXNlIFBvc3RncmVzIGNvbm5lY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlQ29ubmVjdGlvbiBleHRlbmRzIExha2ViYXNlQ29ubmVjdGlvbklucHV0cyB7XG4gIHBvcnQ6IG51bWJlcjtcbiAgc3NsTW9kZTogU3NsTW9kZTtcbn1cblxuLyoqXG4gKiBFdmVyeSBmaWVsZCBvZiB0aGUgTGFrZWJhc2UgUkVTVCBwYXlsb2FkcyBpcyBtb2RlbGxlZCBhcyBvcHRpb25hbCBhbmRcbiAqIHZhbGlkYXRlZCBhdCB0aGUgYm91bmRhcnkgcmF0aGVyIHRoYW4gYXNzZXJ0ZWQgd2l0aCBhIGNhc3Q6IHRoZSBwaWNrZXJzIGJlbG93XG4gKiBicmFuY2ggb24gYHN0YXR1cy4qYCwgYW5kIGEgc2hhcGUgY2hhbmdlIHVwc3RyZWFtIHNob3VsZCBzdXJmYWNlIGFzIG9uZSBsb3VkXG4gKiBlcnJvciBoZXJlIGluc3RlYWQgb2YgYW4gYHVuZGVmaW5lZGAgdGhyZWUgZnJhbWVzIGF3YXkuIEVudW0tc2hhcGVkIGZpZWxkc1xuICogc3RheSBgc3RyaW5nYCBzbyBhIG5ld2x5IGFkZGVkIHN0YXRlIGRvZXMgbm90IGZhaWwgdGhlIHdob2xlIHJlc3BvbnNlLlxuICovXG5jb25zdCBwcm9qZWN0U2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBGdWxsIHJlc291cmNlIHBhdGg6IGBwcm9qZWN0cy97cH1gLlxuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcbnR5cGUgUHJvamVjdCA9IHouaW5mZXI8dHlwZW9mIHByb2plY3RTY2hlbWE+O1xuXG5jb25zdCBlbmRwb2ludFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gRnVsbCByZXNvdXJjZSBwYXRoOiBgcHJvamVjdHMve3B9L2JyYW5jaGVzL3tifS9lbmRwb2ludHMve2V9YC5cbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICB1aWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgLy8gU2VydmVyLXNpZGUgc3RhdGUuIEFsbCBjb25uZWN0aW9uIGluZm8gbGl2ZXMgaGVyZSAtIHRoZSBzcGVjIGJsb2NrXG4gIC8vIG9ubHkgY2FycmllcyB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uLCBub3QgdGhlIHJ1bnRpbWUgaG9zdG5hbWVzLlxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGVuZHBvaW50X3R5cGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIC8vIFJlc29sdmVkIGhvc3RuYW1lczsgYGhvc3RzLmhvc3RgIGlzIHRoZSB3cml0YWJsZSBwcmltYXJ5LlxuICAgICAgaG9zdHM6IHpcbiAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICAgIHJlYWRfb25seV9ob3N0OiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIH0pXG4gICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgLy8gQ29tcHV0ZSBzdGF0ZTogYElOSVRJQUxJWklOR2AsIGBTVEFSVElOR2AsIGBSRUFEWWAsIGBJRExFYCwgLi4uXG4gICAgICBjdXJyZW50X3N0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBFbmRwb2ludCA9IHouaW5mZXI8dHlwZW9mIGVuZHBvaW50U2NoZW1hPjtcblxuY29uc3QgYnJhbmNoU2NoZW1hID0gei5vYmplY3Qoe1xuICAvLyBGdWxsIHJlc291cmNlIHBhdGg6IGBwcm9qZWN0cy97cH0vYnJhbmNoZXMve2J9YC5cbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIC8vIFRydWUgZm9yIHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBicmFuY2ggKGUuZy4gYHByb2R1Y3Rpb25gKS5cbiAgICAgIGRlZmF1bHQ6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICBjdXJyZW50X3N0YXRlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBCcmFuY2ggPSB6LmluZmVyPHR5cGVvZiBicmFuY2hTY2hlbWE+O1xuXG5jb25zdCBkYXRhYmFzZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gRnVsbCByZXNvdXJjZSBwYXRoOiBgcHJvamVjdHMve3B9L2JyYW5jaGVzL3tifS9kYXRhYmFzZXMve2R9YC5cbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBzdGF0dXM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIC8vIEFjdHVhbCBQb3N0Z3JlcyBkYXRhYmFzZSBuYW1lICh1c2VkIGFzIGBQR0RBVEFCQVNFYCkuIE1heSBkaWZmZXJcbiAgICAgIC8vIGZyb20gdGhlIHJlc291cmNlIGlkIC0gZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAgICAgIC8vIHN1cmZhY2VzIGFzIFBvc3RncmVzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYC5cbiAgICAgIHBvc3RncmVzX2RhdGFiYXNlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSlcbiAgICAub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBEYXRhYmFzZSA9IHouaW5mZXI8dHlwZW9mIGRhdGFiYXNlU2NoZW1hPjtcblxuLyoqXG4gKiBMYWtlYmFzZSBSRVNUIGxpc3QgcmVzcG9uc2VzIGZvbGxvdyB0aGUgR29vZ2xlIEFJUCBjb252ZW50aW9uOlxuICogYHsgPHBsdXJhbC1yZXNvdXJjZT46IFRbXSwgbmV4dF9wYWdlX3Rva2VuPzogc3RyaW5nIH1gLiBXZSBvbmx5IHJlYWRcbiAqIHRoZSBmaXJzdCBwYWdlOyBmb3IgYXV0by1jb25maWcncyBcInBpY2sgc29tZXRoaW5nIHNlbnNpYmxlXCIgc2VtYW50aWNzIHRoZVxuICogY2FwIGlzIGZpbmUuXG4gKi9cbmNvbnN0IGxpc3RSZXNwb25zZVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmV4dF9wYWdlX3Rva2VuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIHByb2plY3RzOiB6LmFycmF5KHByb2plY3RTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGJyYW5jaGVzOiB6LmFycmF5KGJyYW5jaFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgZW5kcG9pbnRzOiB6LmFycmF5KGVuZHBvaW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICBkYXRhYmFzZXM6IHouYXJyYXkoZGF0YWJhc2VTY2hlbWEpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBMb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGVudmVsb3BlIHJldHVybmVkIGJ5IG11dGF0aW5nIFJFU1QgY2FsbHMuXG4gKiBgZG9uZTogdHJ1ZWAgbWVhbnMgdGVybWluYWw7IGNoZWNrIGBlcnJvcmAgYmVmb3JlIHJlYWRpbmcgYHJlc3BvbnNlYC5cbiAqL1xuY29uc3Qgb3BlcmF0aW9uU2NoZW1hID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIGRvbmU6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGVycm9yOiB6LnVua25vd24oKS5vcHRpb25hbCgpLFxuICByZXNwb25zZTogei51bmtub3duKCkub3B0aW9uYWwoKSxcbn0pO1xudHlwZSBPcGVyYXRpb24gPSB6LmluZmVyPHR5cGVvZiBvcGVyYXRpb25TY2hlbWE+O1xuXG4vKiogYFBHUE9SVGAgbXVzdCBsYW5kIGluc2lkZSB0aGUgVENQIHBvcnQgcmFuZ2UuICovXG5jb25zdCBwb3J0U2NoZW1hID0gei5jb2VyY2UubnVtYmVyKCkuaW50KCkubWluKDEpLm1heChNQVhfVENQX1BPUlQpO1xuXG5jb25zdCBzc2xNb2RlU2NoZW1hID0gei5lbnVtKFNTTF9NT0RFUyk7XG5cbi8qKlxuICogVmFsaWRhdGUgYSBgUEdQT1JUYC1zaGFwZWQgdmFsdWUuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiB1bnNldCwgYW5kIHRocm93c1xuICogYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSBuYW1pbmcgYFBHUE9SVGAgZm9yIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgVENQXG4gKiBwb3J0LCBzbyBhIHR5cG8gY2Fubm90IHJlYWNoIHRoZSBjb25uZWN0aW9uIHJlY29yZCBhcyBgTmFOYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUG9ydCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IHBvcnRTY2hlbWEuc2FmZVBhcnNlKHZhbHVlKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJQR1BPUlRcIiwgdmFsdWUsIGBhIFRDUCBwb3J0IGJldHdlZW4gMSBhbmQgJHtNQVhfVENQX1BPUlR9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHU1NMTU9ERWAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZFxuICogdGhyb3dzIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1NTTE1PREVgIGZvciBhbiB1bnN1cHBvcnRlZCBtb2RlXG4gKiByYXRoZXIgdGhhbiBoYW5kaW5nIGBwZ2AgYSB2YWx1ZSBpdCB3aWxsIHJlamVjdCBhdCBjb25uZWN0IHRpbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNzbE1vZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFNzbE1vZGUgfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gc3NsTW9kZVNjaGVtYS5zYWZlUGFyc2UodmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoIXBhcnNlZC5zdWNjZXNzKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcIlBHU1NMTU9ERVwiLCB2YWx1ZSwgU1NMX01PREVTLmpvaW4oXCIsIFwiKSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufVxuXG4vKipcbiAqIERlbGF5IGJlZm9yZSB0aGUgbmV4dCBwb2xsIGF0dGVtcHQ6IGV4cG9uZW50aWFsIGJhY2tvZmYgY2FwcGVkIGF0XG4gKiB7QGxpbmsgUE9MTF9NQVhfREVMQVlfTVN9LCBwbHVzIGppdHRlciBzbyBzZXZlcmFsIGFwcHMgYm9vdGluZyBhZ2FpbnN0IHRoZVxuICogc2FtZSB3b3Jrc3BhY2UgZG8gbm90IHJldHJ5IGluIGxvY2tzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IE1hdGgubWluKGJhc2VNcyAqIFBPTExfQkFDS09GRl9GQUNUT1IgKiogYXR0ZW1wdCwgUE9MTF9NQVhfREVMQVlfTVMpO1xuICBjb25zdCBqaXR0ZXIgPSBiYWNrb2ZmICogUE9MTF9KSVRURVJfUkFUSU8gKiAoTWF0aC5yYW5kb20oKSAqIDIgLSAxKTtcbiAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgucm91bmQoYmFja29mZiArIGppdHRlcikpO1xufVxuXG4vKipcbiAqIFdhaXQgb3V0IHtAbGluayBuZXh0UG9sbERlbGF5fSBiZWZvcmUgdGhlIG5leHQgYXR0ZW1wdC4gUmVqZWN0cyB3aXRoIHRoZVxuICogc2lnbmFsJ3MgcmVhc29uIHdoZW4gdGhlIGNhbGxlciBjYW5jZWxzIG1pZC13YWl0LCBzbyBhIHBvbGwgbG9vcCB1bndpbmRzXG4gKiBpbnN0ZWFkIG9mIGZpbmlzaGluZyBpdHMgYmFja29mZiBmaXJzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbGxEZWxheShhdHRlbXB0OiBudW1iZXIsIGJhc2VNczogbnVtYmVyLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gYXN5bmMuc2xlZXAobmV4dFBvbGxEZWxheShhdHRlbXB0LCBiYXNlTXMpLCBzaWduYWwpO1xufVxuXG4vKipcbiAqIFB1bGwgcmVzb2x2ZXIgaW5wdXRzIGZyb20gYHByb2Nlc3MuZW52YCwgcGFyc2UgdGhlIGFkZHJlc3MgYmxvYiwgYW5kXG4gKiBsYXllciBleHBsaWNpdCBjb25maWcgb24gdG9wIHdpdGggdGhpcyBwcmVjZWRlbmNlOlxuICpcbiAqICAgYGNvbmZpZy48ZmllbGQ+YCA+IGBjb25maWcucmVzb2x2ZUNvbmZpZ1ZhbHVlYCAoYGVudmAsIHRoZW4gYnVuZGxlXG4gKiAgIHZhbGlkYXRlIEpTT04pID4gd2hhdGV2ZXIge0BsaW5rIHBhcnNlQWRkcmVzc30gcmVjb3ZlcmVkIGZyb20gdGhlXG4gKiAgIGBlbmRwb2ludGAgLyBgTEFLRUJBU0VfRU5EUE9JTlRgIGJsb2IuXG4gKlxuICogU2V0IGBjb25maWcuZW5kcG9pbnRgIChvciBgTEFLRUJBU0VfRU5EUE9JTlRgKSB0byBhbnkgaW5wdXRcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzOiBjYW5vbmljYWwgcmVzb3VyY2UgcGF0aHMsIFBvc3RncmVzXG4gKiBVUklzLCBiYXJlIGhvc3RuYW1lcywgb3IgYmFyZSBwcm9qZWN0IGlkcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWtlYmFzZUlucHV0cyhcbiAgY29uZmlnPzogTGFrZWJhc2VSZXNvbHZlcklucHV0cyxcbik6IFByb21pc2U8TGFrZWJhc2VSZXNvbHZlcklucHV0cz4ge1xuICBjb25zdCByYXdBZGRyZXNzID0gY29uZmlnPy5lbmRwb2ludCA/PyAoYXdhaXQgcmVzb2x2ZUNvbmZpZ1ZhbHVlKFwiTEFLRUJBU0VfRU5EUE9JTlRcIikpO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUFkZHJlc3MocmF3QWRkcmVzcyk7XG4gIGNvbnN0IHBvcnRFbnYgPSBwYXJzZVBvcnQoYXdhaXQgcmVzb2x2ZUNvbmZpZ1ZhbHVlKFwiUEdQT1JUXCIpKTtcbiAgY29uc3Qgc3NsTW9kZUVudiA9IHBhcnNlU3NsTW9kZShhd2FpdCByZXNvbHZlQ29uZmlnVmFsdWUoXCJQR1NTTE1PREVcIikpO1xuICByZXR1cm4ge1xuICAgIHByb2plY3Q6IGNvbmZpZz8ucHJvamVjdCA/PyBwYXJzZWQucHJvamVjdCxcbiAgICBicmFuY2g6IGNvbmZpZz8uYnJhbmNoID8/IHBhcnNlZC5icmFuY2gsXG4gICAgLy8gT25seSBjYW5vbmljYWwgZW5kcG9pbnQgcmVzb3VyY2UgcGF0aHMgc3Vydml2ZSBoZXJlOyBVUklzIGFuZFxuICAgIC8vIGJhcmUgaG9zdG5hbWVzIHNldCBgaG9zdGAgaW5zdGVhZCBhbmQgbGVhdmUgYGVuZHBvaW50YCB1bmRlZmluZWRcbiAgICAvLyB1bnRpbCB0aGUgUkVTVCByZXNvbHZlciBmaWxscyBpdCBpbi5cbiAgICBlbmRwb2ludDogcGFyc2VkLmVuZHBvaW50LFxuICAgIGRhdGFiYXNlOiBjb25maWc/LmRhdGFiYXNlID8/IChhd2FpdCByZXNvbHZlQ29uZmlnVmFsdWUoXCJQR0RBVEFCQVNFXCIpKSA/PyBwYXJzZWQuZGF0YWJhc2UsXG4gICAgaG9zdDogY29uZmlnPy5ob3N0ID8/IChhd2FpdCByZXNvbHZlQ29uZmlnVmFsdWUoXCJQR0hPU1RcIikpID8/IHBhcnNlZC5ob3N0LFxuICAgIHBvcnQ6IGNvbmZpZz8ucG9ydCA/PyBwb3J0RW52ID8/IHBhcnNlZC5wb3J0LFxuICAgIHNzbE1vZGU6IGNvbmZpZz8uc3NsTW9kZSA/PyBzc2xNb2RlRW52ID8/IHBhcnNlZC5zc2xNb2RlLFxuICAgIGF1dG9DcmVhdGU6IGNvbmZpZz8uYXV0b0NyZWF0ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgZnVsbHktcG9wdWxhdGVkIFBvc3RncmVzIGNvbm5lY3Rpb24gcmVjb3JkIGZyb20gY29uZmlnICsgZW52LlxuICpcbiAqIFJldHVybnMgaW1tZWRpYXRlbHkgd2l0aG91dCBuZXR3b3JrIHRyYWZmaWMgd2hlbiBlbnYgYWxyZWFkeSBzdXBwbGllc1xuICogYGVuZHBvaW50YCwgYGhvc3RgLCBhbmQgYGRhdGFiYXNlYC4gT3RoZXJ3aXNlIGlzc3VlcyBSRVNUIGNhbGxzIGFuZFxuICogbWF5IGF1dG8tY3JlYXRlIGEgcHJvamVjdCAoc2VlIG1vZHVsZSBkb2NzdHJpbmcpLlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgZXZlcnkgUkVTVCBjYWxsIGFuZCBpbnRlci1wb2xsIHNsZWVwLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBsYWtlYmFzZVJlc29sdmVyLnJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gKiAgIHsgYXV0b0NyZWF0ZTogZmFsc2UgfSxcbiAqICAgQWJvcnRTaWduYWwudGltZW91dCg2MF8wMDApLFxuICogKTtcbiAqIGxha2ViYXNlUmVzb2x2ZXIuYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb24oXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxMYWtlYmFzZUNvbm5lY3Rpb24+IHtcbiAgY29uc3QgaW5wdXRzID0gYXdhaXQgcmVhZExha2ViYXNlSW5wdXRzKGNvbmZpZyk7XG4gIGxldCB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0IH0gPSBpbnB1dHM7XG4gIGNvbnN0IHBvcnQgPSBpbnB1dHMucG9ydCA/PyBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHNzbE1vZGUgPSBpbnB1dHMuc3NsTW9kZSA/PyBERUZBVUxUX1NTTF9NT0RFO1xuXG4gIC8vIFJlc291cmNlIHBhdGhzIG1heSBjYXJyeSByZWR1bmRhbnQgaW5mbzsgaGFydmVzdCBwcm9qZWN0L2JyYW5jaFxuICAvLyBmcm9tIGFueSBjYW5vbmljYWwgcGF0aCB0aGF0IHNudWNrIGluIHZpYSBQR0RBVEFCQVNFIG9yIHNpbWlsYXIuXG4gIGlmIChlbmRwb2ludCAmJiAoIXByb2plY3QgfHwgIWJyYW5jaCkpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgcHJvamVjdCA/Pz0gcGFyc2VkRW5kcG9pbnQucHJvamVjdDtcbiAgICBicmFuY2ggPz89IHBhcnNlZEVuZHBvaW50LmJyYW5jaDtcbiAgfVxuICBpZiAoZGF0YWJhc2UgJiYgKCFwcm9qZWN0IHx8ICFicmFuY2gpKSB7XG4gICAgY29uc3QgcGFyc2VkRGF0YWJhc2UgPSBwYXJzZUFkZHJlc3MoZGF0YWJhc2UpO1xuICAgIHByb2plY3QgPz89IHBhcnNlZERhdGFiYXNlLnByb2plY3Q7XG4gICAgYnJhbmNoID8/PSBwYXJzZWREYXRhYmFzZS5icmFuY2g7XG4gICAgaWYgKHBhcnNlZERhdGFiYXNlLmRhdGFiYXNlUmVzb3VyY2VJZCkge1xuICAgICAgZGF0YWJhc2UgPSBwYXJzZWREYXRhYmFzZS5kYXRhYmFzZVJlc291cmNlSWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gQWxyZWFkeSBjb21wbGV0ZTogc2tpcCBldmVyeSBSRVNUIGNhbGwuXG4gIGlmIChlbmRwb2ludCAmJiBob3N0ICYmIGRhdGFiYXNlKSB7XG4gICAgcmV0dXJuIHsgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludCwgZGF0YWJhc2UsIGhvc3QsIHBvcnQsIHNzbE1vZGUgfTtcbiAgfVxuXG4gIGNvbnN0IHdzID0gZ2V0V29ya3NwYWNlQ2xpZW50KHt9KTtcblxuICAvLyBIb3N0IGtub3duIGJ1dCBubyByZXNvdXJjZSBwYXRoOiBzY2FuIHRoZSB3b3Jrc3BhY2UgdG8gZmluZCB3aGljaFxuICAvLyBlbmRwb2ludCBvd25zIHRoaXMgaG9zdCBzbyB3ZSBjYW4gcG9wdWxhdGUgTEFLRUJBU0VfRU5EUE9JTlQuXG4gIGlmICghcHJvamVjdCAmJiBob3N0KSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBmaW5kRW5kcG9pbnRCeUhvc3Qod3MsIGhvc3QsIHNpZ25hbCk7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICBwcm9qZWN0ID0gZm91bmQucHJvamVjdDtcbiAgICAgIGJyYW5jaCA9IGZvdW5kLmJyYW5jaDtcbiAgICAgIGVuZHBvaW50ID8/PSBmb3VuZC5lbmRwb2ludDtcbiAgICB9XG4gIH1cblxuICAvLyBObyBwcm9qZWN0IGFueXdoZXJlIGluIGNvbmZpZy9lbnYvYWRkcmVzczogbGlzdCwgcGljaywgb3IgY3JlYXRlLlxuICBpZiAoIXByb2plY3QpIHtcbiAgICBwcm9qZWN0ID0gYXdhaXQgcGlja09yQ3JlYXRlUHJvamVjdCh3cywgY29uZmlnPy5hdXRvQ3JlYXRlLCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFicmFuY2gpIHtcbiAgICBicmFuY2ggPSBhd2FpdCBwaWNrQnJhbmNoKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICB9XG5cbiAgaWYgKCFlbmRwb2ludCkge1xuICAgIGNvbnN0IGVwID0gYXdhaXQgcGlja0VuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gICAgZW5kcG9pbnQgPSBlcC5uYW1lO1xuICAgIGhvc3QgPz89IGVwLmhvc3Q7XG4gIH1cblxuICBpZiAoIWhvc3QgJiYgZW5kcG9pbnQpIHtcbiAgICBjb25zdCBwYXJzZWRFbmRwb2ludCA9IHBhcnNlQWRkcmVzcyhlbmRwb2ludCk7XG4gICAgaWYgKHBhcnNlZEVuZHBvaW50LnByb2plY3QgJiYgcGFyc2VkRW5kcG9pbnQuYnJhbmNoICYmIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQpIHtcbiAgICAgIGNvbnN0IGVwID0gYXdhaXQgd2FpdEVuZHBvaW50UmVhZHkoXG4gICAgICAgIHdzLFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5wcm9qZWN0LFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5icmFuY2gsXG4gICAgICAgIHBhcnNlZEVuZHBvaW50LmVuZHBvaW50SWQsXG4gICAgICAgIHNpZ25hbCxcbiAgICAgICk7XG4gICAgICBob3N0ID0gZXAuc3RhdHVzPy5ob3N0cz8uaG9zdDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgaG9zdCBmcm9tIGVuZHBvaW50XCIsIHsgaG9zdCB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRhdGFiYXNlKSB7XG4gICAgZGF0YWJhc2UgPSBhd2FpdCBwaWNrRGF0YWJhc2Uod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgfVxuXG4gIHJldHVybiB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0LCBwb3J0LCBzc2xNb2RlIH07XG59XG5cbi8qKlxuICogV3JpdGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG8gYHByb2Nlc3MuZW52YCBzbyB0aGUgYGxha2ViYXNlYCBwbHVnaW5cbiAqICh3aGljaCByZWFkcyBlbnYgZGlyZWN0bHkpIHBpY2tzIHRoZW0gdXAgZHVyaW5nIGl0cyBvd24gYHNldHVwKClgLlxuICogRXhpc3RpbmcgZW52IHZhbHVlcyBhcmUgcHJlc2VydmVkOyBvbmx5IG1pc3Npbmcga2V5cyBhcmUgZmlsbGVkIGluLFxuICogd2hpY2gga2VlcHMgZXhwbGljaXQgb3ZlcnJpZGVzIGF1dGhvcml0YXRpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUxha2ViYXNlVG9FbnYocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IHZvaWQge1xuICBpZiAocmVzb2x2ZWQuZW5kcG9pbnQpIHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5UID8/PSByZXNvbHZlZC5lbmRwb2ludDtcbiAgaWYgKHJlc29sdmVkLmhvc3QpIHByb2Nlc3MuZW52LlBHSE9TVCA/Pz0gcmVzb2x2ZWQuaG9zdDtcbiAgaWYgKHJlc29sdmVkLmRhdGFiYXNlKSBwcm9jZXNzLmVudi5QR0RBVEFCQVNFID8/PSByZXNvbHZlZC5kYXRhYmFzZTtcbiAgcHJvY2Vzcy5lbnYuUEdQT1JUID8/PSBTdHJpbmcocmVzb2x2ZWQucG9ydCk7XG4gIHByb2Nlc3MuZW52LlBHU1NMTU9ERSA/Pz0gcmVzb2x2ZWQuc3NsTW9kZTtcbn1cblxudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBSZXR1cm5UeXBlPHR5cGVvZiBnZXRXb3Jrc3BhY2VDbGllbnQ+O1xuXG4vKiogVGhlIFNESyBgQ29udGV4dGAgYWNjZXB0ZWQgYnkgdGhlIHdvcmtzcGFjZSBjbGllbnQncyBvd24gY29weSBvZiB0aGUgU0RLLiAqL1xudHlwZSBBcGlSZXF1ZXN0Q29udGV4dCA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8V29ya3NwYWNlQ2xpZW50W1wiYXBpQ2xpZW50XCJdW1wicmVxdWVzdFwiXT5bMV0+O1xuXG4vKipcbiAqIEFkYXB0IGFuIHtAbGluayBBYm9ydFNpZ25hbH0gaW50byB0aGUgYXBpIGNsaWVudCdzIGNhbmNlbGxhdGlvbiBjb250ZXh0LlxuICogQXBwS2l0IHJlc29sdmVzIGEgZGlmZmVyZW50IGNvcHkgb2YgYEBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxgIHRoYW4gdGhpc1xuICogcGFja2FnZSBkb2VzLCBhbmQgYENvbnRleHRgIGNhcnJpZXMgYSBwcml2YXRlIGZpZWxkLCBzbyB0aGUgdHdvIGRlY2xhcmF0aW9uc1xuICogYXJlIG5vbWluYWxseSBpbmNvbXBhdGlibGUgZXZlbiB0aG91Z2ggdGhlIGFwaSBjbGllbnQgb25seSByZWFkc1xuICogYGNhbmNlbGxhdGlvblRva2VuYCBhbmQgYGxvZ2dlcmAgb2ZmIHRoZSBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIHJlcXVlc3RDb250ZXh0KHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQpOiBBcGlSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzaWduYWwgPyAodG9Db250ZXh0KHNpZ25hbCkgYXMgdW5rbm93biBhcyBBcGlSZXF1ZXN0Q29udGV4dCkgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBMYWtlYmFzZSBSRVNUIGJvZHkuIFRoZSBmdWxsIHBheWxvYWQgaXMgbG9nZ2VkIHJhdGhlciB0aGFuIHRocm93blxuICogc28gYSBjbGllbnQgbmV2ZXIgcmVjZWl2ZXMgdXBzdHJlYW0gZGV0YWlsLlxuICovXG5mdW5jdGlvbiBwYXJzZVJlc3BvbnNlPFQ+KHNjaGVtYTogei5ab2RUeXBlPFQ+LCBwYXRoOiBzdHJpbmcsIGJvZHk6IHVua25vd24pOiBUIHtcbiAgY29uc3QgcGFyc2VkID0gc2NoZW1hLnNhZmVQYXJzZShib2R5KTtcbiAgaWYgKHBhcnNlZC5zdWNjZXNzKSByZXR1cm4gcGFyc2VkLmRhdGE7XG4gIGxvZ2dlci5lcnJvcihcImF1dG9wZzogdW5leHBlY3RlZCBMYWtlYmFzZSBBUEkgcmVzcG9uc2VcIiwge1xuICAgIHBhdGgsXG4gICAgaXNzdWVzOiBwYXJzZWQuZXJyb3IuaXNzdWVzLFxuICB9KTtcbiAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwiTGFrZWJhc2UgQVBJIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgcmVzcG9uc2VcIiwgeyBjb250ZXh0OiB7IHBhdGggfSB9KTtcbn1cblxuLyoqIEdFVCBoZWxwZXIgdGhhdCB2YWxpZGF0ZXMgdGhlIEpTT04gYm9keSBhbmQgZm9yd2FyZHMgY2FuY2VsbGF0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0SnNvbjxUPihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgd3MuYXBpQ2xpZW50LnJlcXVlc3QoXG4gICAge1xuICAgICAgcGF0aCxcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHsgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KSxcbiAgICAgIHJhdzogZmFsc2UsXG4gICAgfSxcbiAgICByZXF1ZXN0Q29udGV4dChzaWduYWwpLFxuICApO1xuICByZXR1cm4gcGFyc2VSZXNwb25zZShzY2hlbWEsIHBhdGgsIHJlcyk7XG59XG5cbi8qKiBQT1NUIGhlbHBlciBmb3IgY3JlYXRlIC8gbXV0YXRlIGNhbGxzOyB2YWxpZGF0ZXMgdGhlIEpTT04gYm9keS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RKc29uPFQ+KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwYXRoOiBzdHJpbmcsXG4gIHNjaGVtYTogei5ab2RUeXBlPFQ+LFxuICBib2R5OiB1bmtub3duLFxuICBxdWVyeT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IHdzLmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgcXVlcnksXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSksXG4gICAgICByYXc6IGZhbHNlLFxuICAgICAgcGF5bG9hZDogYm9keSxcbiAgICB9LFxuICAgIHJlcXVlc3RDb250ZXh0KHNpZ25hbCksXG4gICk7XG4gIHJldHVybiBwYXJzZVJlc3BvbnNlKHNjaGVtYSwgcGF0aCwgcmVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdFByb2plY3RzKHdzOiBXb3Jrc3BhY2VDbGllbnQsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxQcm9qZWN0W10+IHtcbiAgY29uc3QgcmVzID0gYXdhaXQgZ2V0SnNvbih3cywgYCR7QVBJX0JBU0V9L3Byb2plY3RzYCwgbGlzdFJlc3BvbnNlU2NoZW1hLCBzaWduYWwpO1xuICByZXR1cm4gcmVzLnByb2plY3RzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJhbmNoZXMoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPEJyYW5jaFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuYnJhbmNoZXMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RFbmRwb2ludHMoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2VuZHBvaW50c2AsXG4gICAgbGlzdFJlc3BvbnNlU2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHJlcy5lbmRwb2ludHMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REYXRhYmFzZXMoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxEYXRhYmFzZVtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2RhdGFiYXNlc2AsXG4gICAgbGlzdFJlc3BvbnNlU2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbiAgcmV0dXJuIHJlcy5kYXRhYmFzZXMgPz8gW107XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEVuZHBvaW50KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICByZXR1cm4gZ2V0SnNvbihcbiAgICB3cyxcbiAgICBgJHtBUElfQkFTRX0vcHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0vZW5kcG9pbnRzLyR7ZW5kcG9pbnRJZH1gLFxuICAgIGVuZHBvaW50U2NoZW1hLFxuICAgIHNpZ25hbCxcbiAgKTtcbn1cblxuLyoqXG4gKiBTY2FuIHRoZSB3b3Jrc3BhY2UgZm9yIGFuIGVuZHBvaW50IHdob3NlIGBzdGF0dXMuaG9zdHMuaG9zdGAgbWF0Y2hlc1xuICogdGhlIHByb3ZpZGVkIGhvc3RuYW1lLiBVc2VkIHRvIHJlY292ZXIgdGhlIG93bmluZyBwcm9qZWN0L2JyYW5jaC9cbiAqIGVuZHBvaW50IHJlc291cmNlIHBhdGggd2hlbiB0aGUgY2FsbGVyIG9ubHkgc3VwcGxpZWQgYSBQb3N0Z3JlcyBVUkkuXG4gKlxuICogTyhwcm9qZWN0cyAqIGJyYW5jaGVzICogZW5kcG9pbnRzKSAtIGZpbmUgZm9yIHR5cGljYWwgd29ya3NwYWNlc1xuICogKHNpbmdsZSBkaWdpdHMgcGVyIHRpZXIpOyBwYWdpbmF0aW9uIGlzIGludGVudGlvbmFsbHkgbm90IGZvbGxvd2VkXG4gKiBzaW5jZSB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgZmFsbGJhY2suXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRFbmRwb2ludEJ5SG9zdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgaG9zdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyBwcm9qZWN0OiBzdHJpbmc7IGJyYW5jaDogc3RyaW5nOyBlbmRwb2ludDogc3RyaW5nIH0gfCBudWxsPiB7XG4gIGNvbnN0IHByb2plY3RzID0gYXdhaXQgbGlzdFByb2plY3RzKHdzLCBzaWduYWwpO1xuICBmb3IgKGNvbnN0IHAgb2YgcHJvamVjdHMpIHtcbiAgICBjb25zdCBwcm9qZWN0SWQgPSBwYXJzZVJlc291cmNlUGF0aChwLm5hbWUpLnByb2plY3Q7XG4gICAgaWYgKCFwcm9qZWN0SWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0SWQsIHNpZ25hbCk7XG4gICAgZm9yIChjb25zdCBiIG9mIGJyYW5jaGVzKSB7XG4gICAgICBjb25zdCBicmFuY2hJZCA9IHBhcnNlUmVzb3VyY2VQYXRoKGIubmFtZSkuYnJhbmNoO1xuICAgICAgaWYgKCFicmFuY2hJZCkgY29udGludWU7XG4gICAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0RW5kcG9pbnRzKHdzLCBwcm9qZWN0SWQsIGJyYW5jaElkLCBzaWduYWwpO1xuICAgICAgY29uc3QgbWF0Y2ggPSBlbmRwb2ludHMuZmluZCgoZSkgPT4gZS5zdGF0dXM/Lmhvc3RzPy5ob3N0ID09PSBob3N0KTtcbiAgICAgIGlmIChtYXRjaD8ubmFtZSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG1hdGNoZWQgZW5kcG9pbnQgYnkgaG9zdFwiLCB7XG4gICAgICAgICAgaG9zdCxcbiAgICAgICAgICBlbmRwb2ludDogbWF0Y2gubmFtZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvamVjdDogcHJvamVjdElkLFxuICAgICAgICAgIGJyYW5jaDogYnJhbmNoSWQsXG4gICAgICAgICAgZW5kcG9pbnQ6IG1hdGNoLm5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogbm8gZW5kcG9pbnQgbWF0Y2hlZCBob3N0XCIsIHsgaG9zdCB9KTtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogUGljayB0aGUgcHJvamVjdCB0byB1c2UsIG9yIGNyZWF0ZSBvbmUgd2hlbiB0aGUgd29ya3NwYWNlIGlzIGVtcHR5LlxuICpcbiAqIFNlbGVjdGlvbiBvcmRlcjpcbiAqIDEuIEV4YWN0bHkgb25lIHByb2plY3QgbGlzdGVkIC0+IHVzZSBpdC5cbiAqIDIuIFplcm8gcHJvamVjdHMgQU5EIGBhdXRvQ3JlYXRlICE9PSBmYWxzZWAgLT4gZW5zdXJlIGEgcHJvamVjdCB3aXRoXG4gKiAgICB0aGUgcmVzb2x2ZWQgaWQgZXhpc3RzLCB0aGVuIHJldHVybiBpdHMgaWQuXG4gKiAzLiBaZXJvIHByb2plY3RzIEFORCBgYXV0b0NyZWF0ZSA9PT0gZmFsc2VgIC0+IHRocm93LlxuICogNC4gTXVsdGlwbGUgcHJvamVjdHMgLT4gdGhyb3cgd2l0aCB0aGUgY2FuZGlkYXRlIGxpc3QgKHNldFxuICogICAgYGNvbmZpZy5wcm9qZWN0YCBvciBwaW4gYSBwcm9qZWN0IGlkIGluIGBMQUtFQkFTRV9FTkRQT0lOVGApLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrT3JDcmVhdGVQcm9qZWN0KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBhdXRvQ3JlYXRlOiBzdHJpbmcgfCBmYWxzZSB8IHVuZGVmaW5lZCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGxpc3RQcm9qZWN0cyh3cywgc2lnbmFsKTtcbiAgaWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGlkID0gcGFyc2VSZXNvdXJjZVBhdGgocHJvamVjdHNbMF0hLm5hbWUpLnByb2plY3Q7XG4gICAgaWYgKGlkKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHVzaW5nIG9ubHkgcHJvamVjdFwiLCB7IHByb2plY3Q6IGlkIH0pO1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgfVxuICBpZiAocHJvamVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGF1dG9DcmVhdGUgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgICAgXCJMYWtlYmFzZSBwcm9qZWN0XCIsXG4gICAgICAgIFwiYXV0b0NyZWF0ZSBpcyBmYWxzZTsgY3JlYXRlIGEgcHJvamVjdCBvciBzZXQgY29uZmlnLnByb2plY3QgLyBMQUtFQkFTRV9FTkRQT0lOVC5cIixcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGlkID0gYXV0b0NyZWF0ZSA/PyAoYXdhaXQgZGVmYXVsdFByb2plY3RJZCgpKTtcbiAgICByZXR1cm4gZW5zdXJlUHJvamVjdCh3cywgaWQsIHNpZ25hbCk7XG4gIH1cbiAgY29uc3QgY2FuZGlkYXRlcyA9IHByb2plY3RzXG4gICAgLm1hcCgocCkgPT4gcGFyc2VSZXNvdXJjZVBhdGgocC5uYW1lKS5wcm9qZWN0KVxuICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgIC5qb2luKFwiLCBcIik7XG4gIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICBcIkxha2ViYXNlXCIsXG4gICAgYE11bHRpcGxlIHByb2plY3RzIGZvdW5kOyBzZXQgY29uZmlnLnByb2plY3Qgb3IgcGluIGEgcHJvamVjdCBpZCBpbiBMQUtFQkFTRV9FTkRQT0lOVC4gQ2FuZGlkYXRlczogJHtjYW5kaWRhdGVzfWAsXG4gICk7XG59XG5cbi8qKlxuICogRGVyaXZlIGEgTGFrZWJhc2UgcHJvamVjdCBpZCBmcm9tIHRoZSBob3N0IHJlcG8ncyBgcGFja2FnZS5qc29uYFxuICogbmFtZSAodmlhIHtAbGluayBwcm9qZWN0Lm5hbWV9KSBzbHVnaWZpZWQgdG8gc2F0aXNmeSB0aGVcbiAqIExha2ViYXNlIGlkIGNvbnN0cmFpbnQgKGBeW2Etel1bYS16MC05LV17MCw2MX1bYS16MC05XSRgKS5cbiAqXG4gKiBUaHJvd3Mgd2hlbiB0aGUgc2x1ZyBlbmRzIHVwIGVtcHR5IG9yIHN0YXJ0cyB3aXRoIGEgZGlnaXQsIHNpbmNlIHRoZVxuICogc2VydmVyIHdvdWxkIHJlamVjdCBpdCBhbnl3YXkgLSBjYWxsZXJzIHNob3VsZCBwYXNzIGFuIGV4cGxpY2l0XG4gKiBgYXV0b0NyZWF0ZWAgaWQgaW4gdGhhdCBjYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZWZhdWx0UHJvamVjdElkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG5hbWUgPSBwcm9qZWN0Lm5hbWUoKTtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b1NsdWdXaXRoT3B0aW9ucyh7IG1heExlbmd0aDogUFJPSkVDVF9JRF9NQVhfTEVOIH0sIG5hbWUpO1xuICBpZiAoIXNsdWcgfHwgIS9eW2Etel0vLnRlc3Qoc2x1ZykpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogcHJvamVjdCBuYW1lIGRvZXMgbm90IHNsdWdpZnkgdG8gYSBMYWtlYmFzZSBwcm9qZWN0IGlkXCIsIHsgbmFtZSB9KTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBcIkNvdWxkIG5vdCBkZXJpdmUgYSBwcm9qZWN0IGlkIGZyb20gdGhlIHBhY2thZ2UgbmFtZTsgcGFzcyBhdXRvQ3JlYXRlIGV4cGxpY2l0bHkuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gc2x1Zztcbn1cblxuLyoqXG4gKiBFbnN1cmUgYSBMYWtlYmFzZSBwcm9qZWN0IHdpdGggYHByb2plY3RJZGAgZXhpc3RzLiBDcmVhdGVzIGl0IGFuZFxuICogd2FpdHMgZm9yIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlLiBBbiBgQUxSRUFEWV9FWElTVFNgXG4gKiByZXNwb25zZSBpcyB0cmVhdGVkIGFzIHN1Y2Nlc3MgLSBzb21lb25lIGVsc2UgKGEgY29uY3VycmVudCBib290LFxuICogYSBzaWJsaW5nIHByb2Nlc3MpIHdvbiB0aGUgcmFjZSBhbmQgdGhlIHByb2plY3Qgd2Ugd2FudGVkIGlzIG5vd1xuICogc2l0dGluZyB0aGVyZSByZWFkeSBmb3IgZG93bnN0cmVhbSBwaWNrZXJzLlxuICpcbiAqIFByb2plY3QgY3JlYXRpb24gdHlwaWNhbGx5IHByb3Zpc2lvbnMgYSBkZWZhdWx0IGBwcm9kdWN0aW9uYCBicmFuY2hcbiAqIGFsb25nc2lkZTsgZG93bnN0cmVhbSBwaWNrZXJzIGhhbmRsZSB0aGUgcmVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IG5vIHByb2plY3RzIGZvdW5kOyBjcmVhdGluZ1wiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBvcCA9IGF3YWl0IHBvc3RKc29uKFxuICAgICAgd3MsXG4gICAgICBgJHtBUElfQkFTRX0vcHJvamVjdHNgLFxuICAgICAgb3BlcmF0aW9uU2NoZW1hLFxuICAgICAgeyBzcGVjOiB7IHBnX3ZlcnNpb246IERFRkFVTFRfUEdfVkVSU0lPTiB9IH0sXG4gICAgICB7IHByb2plY3RfaWQ6IHByb2plY3RJZCB9LFxuICAgICAgc2lnbmFsLFxuICAgICk7XG4gICAgYXdhaXQgd2FpdEZvck9wZXJhdGlvbih3cywgb3AsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IGNyZWF0ZWQgcHJvamVjdFwiLCB7IHByb2plY3Q6IHByb2plY3RJZCB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFpc0FscmVhZHlFeGlzdHNFcnJvcihlcnIpKSB0aHJvdyBlcnI7XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IHByb2plY3QgYWxyZWFkeSBleGlzdHMgKHJhY2UpOyBwcm9jZWVkaW5nXCIsIHtcbiAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcHJvamVjdElkO1xufVxuXG4vKipcbiAqIFJlY29nbml6ZSB0aGUgRGF0YWJyaWNrcyBTREsncyBgQUxSRUFEWV9FWElTVFNgIGZhaWx1cmUgbW9kZXMgc28gYVxuICogbG9zdCByYWNlIGR1cmluZyBgZW5zdXJlUHJvamVjdGAgYmVjb21lcyBhIG5vLW9wIGluc3RlYWQgb2YgYW4gZXJyb3IuXG4gKlxuICogVGhlIFNESyB0aHJvd3MgYEFwaUVycm9yIHsgZXJyb3JDb2RlLCBzdGF0dXNDb2RlIH1gIGZvciBzdHJ1Y3R1cmVkXG4gKiBzZXJ2ZXIgZXJyb3JzIGFuZCBgSHR0cEVycm9yIHsgY29kZSB9YCBmb3IgdHJhbnNwb3J0LWxheWVyIDR4eC81eHguXG4gKiBCb3RoIHN1cmZhY2UgYSBodW1hbiBtZXNzYWdlIHRoYXQgb2Z0ZW4gY2FycmllcyBcImFscmVhZHkgZXhpc3RzXCIgc29cbiAqIHdlIHVzZSB0aGF0IGFzIGEgZmluYWwgZmFsbGJhY2sgZm9yIGZvcndhcmQgY29tcGF0aWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gaXNBbHJlYWR5RXhpc3RzRXJyb3IoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFlcnJvciB8fCB0eXBlb2YgZXJyb3IgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZSA9IGVycm9yIGFzIHtcbiAgICBzdGF0dXNDb2RlPzogbnVtYmVyO1xuICAgIGNvZGU/OiBudW1iZXI7XG4gICAgZXJyb3JDb2RlPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIGlmIChlLnN0YXR1c0NvZGUgPT09IDQwOSB8fCBlLmNvZGUgPT09IDQwOSkgcmV0dXJuIHRydWU7XG4gIGlmIChlLmVycm9yQ29kZSAmJiAvYWxyZWFkeS4/ZXhpc3RzL2kudGVzdChlLmVycm9yQ29kZSkpIHJldHVybiB0cnVlO1xuICBpZiAoZS5tZXNzYWdlICYmIC9hbHJlYWR5Lj9leGlzdHMvaS50ZXN0KGUubWVzc2FnZSkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVkdWNlIGEgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWx1cmUgdG8gYW4gZXJyb3Igc2FmZSB0byBwcm9wYWdhdGU6IHRoZVxuICogb3BlcmF0aW9uIG5hbWUgcGx1cyB3aGF0ZXZlciBjb2RlIHRoZSBwYXlsb2FkIGNhcnJpZXMuIFRoZSBwYXlsb2FkIGl0c2VsZiBjYW5cbiAqIGVjaG8gcmVxdWVzdCBjb250ZXh0LCBzbyBpdCBnb2VzIHRvIHRoZSBsb2cgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gb3BlcmF0aW9uRmFpbGVkKG9wTmFtZTogc3RyaW5nLCBvcEVycm9yOiB1bmtub3duKTogRXhlY3V0aW9uRXJyb3Ige1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IG9wZXJhdGlvbiBmYWlsZWRcIiwgeyBvcGVyYXRpb246IG9wTmFtZSwgZXJyb3I6IG9wRXJyb3IgfSk7XG4gIGNvbnN0IGNvZGUgPSBvYmplY3QuaXNSZWNvcmQob3BFcnJvcikgPyAob3BFcnJvci5jb2RlID8/IG9wRXJyb3IucmVhc29uKSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGZhaWxlZDogJHtvcE5hbWV9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIG9wZXJhdGlvbjogb3BOYW1lLFxuICAgICAgZXJyb3JDb2RlOiB0eXBlb2YgY29kZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgY29kZSA9PT0gXCJudW1iZXJcIiA/IFN0cmluZyhjb2RlKSA6IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYSBMYWtlYmFzZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIHVudGlsIGBkb25lOiB0cnVlYC4gUmV0dXJuc1xuICogdGhlIGZpbmFsIG9wZXJhdGlvbiBlbnZlbG9wZSAod2hpY2ggbWF5IGNhcnJ5IGByZXNwb25zZWAgb3IgYGVycm9yYCkuXG4gKlxuICogVGhyb3dzIHdoZW46XG4gKiAgIC0gdGhlIHJlc3BvbnNlIGNhcnJpZXMgYW4gYGVycm9yYCBmaWVsZDtcbiAqICAgLSBgb3AubmFtZWAgaXMgbWlzc2luZyAobm90aGluZyB0byBwb2xsKTtcbiAqICAgLSB0aGUgdGltZW91dCBlbGFwc2VzIGJlZm9yZSBgZG9uZTogdHJ1ZWA7XG4gKiAgIC0gYHNpZ25hbGAgYWJvcnRzIG1pZC13YWl0LlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0Rm9yT3BlcmF0aW9uKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBvcDogT3BlcmF0aW9uLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8T3BlcmF0aW9uPiB7XG4gIGlmIChvcC5kb25lKSB7XG4gICAgaWYgKG9wLmVycm9yKSB7XG4gICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3AubmFtZSA/PyBcInVua25vd25cIiwgb3AuZXJyb3IpO1xuICAgIH1cbiAgICByZXR1cm4gb3A7XG4gIH1cbiAgY29uc3Qgb3BOYW1lID0gb3AubmFtZTtcbiAgaWYgKCFvcE5hbWUpIHtcbiAgICB0aHJvdyBFeGVjdXRpb25FcnJvci5taXNzaW5nRGF0YShcIm9wZXJhdGlvbiBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IE9QRVJBVElPTl9USU1FT1VUX01TOyBhdHRlbXB0KyspIHtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgT1BFUkFUSU9OX1BPTExfTVMsIHNpZ25hbCk7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS8ke29wTmFtZX1gLCBvcGVyYXRpb25TY2hlbWEsIHNpZ25hbCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBvcGVyYXRpb24gc3RhdHVzXCIsIHsgb3A6IG9wTmFtZSwgZG9uZTogY3VycmVudC5kb25lIH0pO1xuICAgIGlmIChjdXJyZW50LmRvbmUpIHtcbiAgICAgIGlmIChjdXJyZW50LmVycm9yKSB7XG4gICAgICAgIHRocm93IG9wZXJhdGlvbkZhaWxlZChvcE5hbWUsIGN1cnJlbnQuZXJyb3IpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihgTGFrZWJhc2Ugb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGU6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogb3BOYW1lLCB0aW1lb3V0TXM6IE9QRVJBVElPTl9USU1FT1VUX01TIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBvbGwgYGdldEVuZHBvaW50YCB1bnRpbCB0aGUgY29tcHV0ZSByZXBvcnRzIGEgdXNhYmxlXG4gKiBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgLiBgUkVBRFlgIGFuZCBgSURMRWAgYXJlIGJvdGggYWNjZXB0YWJsZSAtXG4gKiBgSURMRWAganVzdCBtZWFucyB0aGUgY29tcHV0ZSBoYXMgc2NhbGVkIHRvIHplcm8gYnV0IGEgY29ubmVjdGlvblxuICogd2lsbCB3YWtlIGl0LiBSZXR1cm5zIHRoZSBmaW5hbCBlbmRwb2ludCBwYXlsb2FkICh3aXRoIGBob3N0cy5ob3N0YCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdhaXRFbmRwb2ludFJlYWR5KFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBlbmRwb2ludElkOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCBsYXN0OiBFbmRwb2ludCB8IG51bGwgPSBudWxsO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgRGF0ZS5ub3coKSAtIHN0YXJ0IDwgRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgbGFzdCA9IGF3YWl0IGdldEVuZHBvaW50KHdzLCBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50SWQsIHNpZ25hbCk7XG4gICAgY29uc3Qgc3RhdGUgPSBsYXN0LnN0YXR1cz8uY3VycmVudF9zdGF0ZTtcbiAgICBpZiAoc3RhdGUgJiYgQ09OTkVDVEFCTEVfRU5EUE9JTlRfU1RBVEVTLmhhcyhzdGF0ZSkpIHJldHVybiBsYXN0O1xuICAgIGlmIChsYXN0LnN0YXR1cz8uaG9zdHM/Lmhvc3QgJiYgc3RhdGUgIT09IElOSVRJQUxJWklOR19FTkRQT0lOVF9TVEFURSkge1xuICAgICAgLy8gQ29tcHV0ZSBpcyBpbiBzb21lIG90aGVyIHN0YXRlIChTVEFSVElORywgZXRjLikgYnV0IGhvc3RuYW1lIGlzXG4gICAgICAvLyBhbHJlYWR5IHB1Ymxpc2hlZCAtIGdvb2QgZW5vdWdoIHRvIGNvbm5lY3Q7IGxha2ViYXNlJ3MgT0F1dGhcbiAgICAgIC8vIHRva2VuIHJlcXVlc3Qgd2lsbCB3YWtlIGl0LlxuICAgICAgcmV0dXJuIGxhc3Q7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogd2FpdGluZyBmb3IgZW5kcG9pbnRcIiwgeyBlbmRwb2ludElkLCBzdGF0ZSB9KTtcbiAgICBhd2FpdCBwb2xsRGVsYXkoYXR0ZW1wdCwgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUywgc2lnbmFsKTtcbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIGVuZHBvaW50IGRpZCBub3QgYmVjb21lIHJlYWR5OiAke2VuZHBvaW50SWR9YCwge1xuICAgIGNvbnRleHQ6IHtcbiAgICAgIHByb2plY3QsXG4gICAgICBicmFuY2gsXG4gICAgICBlbmRwb2ludElkLFxuICAgICAgdGltZW91dE1zOiBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TLFxuICAgICAgbGFzdFN0YXRlOiBsYXN0Py5zdGF0dXM/LmN1cnJlbnRfc3RhdGUgPz8gXCJ1bmtub3duXCIsXG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBicmFuY2ggZm9yIGEgcHJvamVjdC4gUHJlZmVycyB0aGUgYnJhbmNoIGZsYWdnZWRcbiAqIGBzdGF0dXMuZGVmYXVsdDogdHJ1ZWAgKHNlcnZlci1zaWRlIGRlZmF1bHQsIHR5cGljYWxseSBgcHJvZHVjdGlvbmBcbiAqIHVubGVzcyB0aGUgcHJvamVjdCBvd25lciBjaGFuZ2VkIGl0KS4gRmFsbHMgYmFjayB0byB0aGUgb25seSBicmFuY2hcbiAqIHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gT3RoZXJ3aXNlIHRocm93cyB3aXRoIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0JyYW5jaChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGJyYW5jaGVzID0gYXdhaXQgbGlzdEJyYW5jaGVzKHdzLCBwcm9qZWN0LCBzaWduYWwpO1xuICBpZiAoYnJhbmNoZXMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgTGFrZWJhc2UgYnJhbmNoIGluIHByb2plY3QgJyR7cHJvamVjdH0nYCxcbiAgICAgIFwiVGhlIHByb2plY3QgaGFzIG5vIGJyYW5jaGVzOyBjcmVhdGUgb25lIG9yIHNldCBjb25maWcuYnJhbmNoLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZmxhZ2dlZCA9IGJyYW5jaGVzLmZpbmQoKGIpID0+IGIuc3RhdHVzPy5kZWZhdWx0ID09PSB0cnVlKTtcbiAgY29uc3QgY2hvaWNlID1cbiAgICBwYXJzZVJlc291cmNlUGF0aChmbGFnZ2VkPy5uYW1lKS5icmFuY2ggPz9cbiAgICAoYnJhbmNoZXMubGVuZ3RoID09PSAxID8gcGFyc2VSZXNvdXJjZVBhdGgoYnJhbmNoZXNbMF0hLm5hbWUpLmJyYW5jaCA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGJyYW5jaGVzXG4gICAgICAubWFwKChiKSA9PiBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaClcbiAgICAgIC5maWx0ZXIoKGlkKTogaWQgaXMgc3RyaW5nID0+IEJvb2xlYW4oaWQpKVxuICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgUHJvamVjdCAnJHtwcm9qZWN0fScgaGFzIG11bHRpcGxlIGJyYW5jaGVzIGFuZCBub25lIG1hcmtlZCBkZWZhdWx0OyBzZXQgY29uZmlnLmJyYW5jaCBvciBpbmNsdWRlIHRoZSBicmFuY2ggaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICAgICk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiByZXNvbHZlZCBicmFuY2hcIiwgeyBwcm9qZWN0LCBicmFuY2g6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBwcmltYXJ5IGVuZHBvaW50IGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBQcmVmZXJzXG4gKiBgc3RhdHVzLmVuZHBvaW50X3R5cGUgPT09IEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWA7IGZhbGxzIGJhY2sgdG9cbiAqIHRoZSBvbmx5IGVuZHBvaW50IHdoZW4gdGhlcmUncyBleGFjdGx5IG9uZS4gUmV0dXJucyBgeyBuYW1lLCBob3N0IH1gXG4gKiBzbyB0aGUgY2FsbGVyIGNhbiBwb3B1bGF0ZSBib3RoIGBMQUtFQkFTRV9FTkRQT0lOVGAgYW5kIGBQR0hPU1RgXG4gKiBmcm9tIGEgc2luZ2xlIGNhbGwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBob3N0Pzogc3RyaW5nIH0+IHtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZW5kcG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGVuZHBvaW50IGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBlbmRwb2ludHM7IGNyZWF0ZSBvbmUgb3Igc2V0IExBS0VCQVNFX0VORFBPSU5ULlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcHJpbWFyeSA9XG4gICAgZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5lbmRwb2ludF90eXBlID09PSBSRUFEX1dSSVRFX0VORFBPSU5UX1RZUEUpID8/XG4gICAgKGVuZHBvaW50cy5sZW5ndGggPT09IDEgPyBlbmRwb2ludHNbMF0gOiB1bmRlZmluZWQpO1xuICBpZiAoIXByaW1hcnk/Lm5hbWUpIHtcbiAgICBjb25zdCBuYW1lcyA9IGVuZHBvaW50cy5tYXAoKGUpID0+IGUubmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5pbnZhbGlkQ29ubmVjdGlvbihcbiAgICAgIFwiTGFrZWJhc2VcIixcbiAgICAgIGBCcmFuY2ggaGFzIG5vIHByaW1hcnkgcmVhZC13cml0ZSBlbmRwb2ludDsgc2V0IExBS0VCQVNFX0VORFBPSU5UIG9yIGNvbmZpZy5lbmRwb2ludC4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGNvbnN0IGhvc3QgPSBwcmltYXJ5LnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZW5kcG9pbnRcIiwgeyBlbmRwb2ludDogcHJpbWFyeS5uYW1lLCBob3N0IH0pO1xuICByZXR1cm4geyBuYW1lOiBwcmltYXJ5Lm5hbWUsIGhvc3QgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBkZWZhdWx0IHBvc3RncmVzIGRhdGFiYXNlIGZvciBhIChwcm9qZWN0LCBicmFuY2gpLiBUaGVcbiAqIFBvc3RncmVzIGRhdGFiYXNlIE5BTUUgKGBzdGF0dXMucG9zdGdyZXNfZGF0YWJhc2VgKSBpcyB3aGF0XG4gKiBgUEdEQVRBQkFTRWAgbmVlZHMgLSB0aGlzIGRpZmZlcnMgZnJvbSB0aGUgcmVzb3VyY2UgaWQsIHdoaWNoIGNhblxuICogdXNlIGEgZGlmZmVyZW50IHNlcGFyYXRvciAoZS5nLiByZXNvdXJjZSBgZGF0YWJyaWNrcy1wb3N0Z3Jlc2BcbiAqIHN1cmZhY2VzIGFzIGRhdGFiYXNlIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkuIFByZWZlcnNcbiAqIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCAodGhlIExha2ViYXNlIGRlZmF1bHQpLCBvdGhlcndpc2UgdGhlIG9ubHlcbiAqIGRhdGFiYXNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRGF0YWJhc2UoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGF0YWJhc2VzID0gYXdhaXQgbGlzdERhdGFiYXNlcyh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICBpZiAoZGF0YWJhc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGRhdGFiYXNlIGluICdwcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofSdgLFxuICAgICAgXCJUaGUgYnJhbmNoIGhhcyBubyBkYXRhYmFzZXM7IGNyZWF0ZSBvbmUgb3Igc2V0IFBHREFUQUJBU0UuXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IGRhdGFiYXNlc1xuICAgIC5tYXAoKGQpID0+IGQuc3RhdHVzPy5wb3N0Z3Jlc19kYXRhYmFzZSlcbiAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgbmFtZXMuZmluZCgobikgPT4gbiA9PT0gREVGQVVMVF9EQVRBQkFTRSkgPz8gKG5hbWVzLmxlbmd0aCA9PT0gMSA/IG5hbWVzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFjaG9pY2UpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgTXVsdGlwbGUgZGF0YWJhc2VzIGFuZCBubyAnJHtERUZBVUxUX0RBVEFCQVNFfSc7IHNldCBQR0RBVEFCQVNFIG9yIGNvbmZpZy5kYXRhYmFzZS4gQ2FuZGlkYXRlczogJHtuYW1lcy5qb2luKFwiLCBcIil9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgZGF0YWJhc2VcIiwgeyBkYXRhYmFzZTogY2hvaWNlIH0pO1xuICByZXR1cm4gY2hvaWNlO1xufVxuIl19
|
|
713
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ3hCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFDTCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLFNBQVMsR0FHVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUMvQyxNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQztBQUNyQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxnQkFBZ0IsR0FBWSxTQUFTLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsOERBQThEO0FBQzlELE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQzlCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUN4QyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUNoQyxN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QUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMzRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLGtCQUFrQixDQUFDLGlCQUFpQixDQUN4QyxVQUFVLEVBQ1YsOEJBQThCLGdCQUFnQixxREFBcUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUN0SCxDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNoRSxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlc29sdmVyLlxuICpcbiAqIFJlYWRzIHRoZSBzYW1lIGVudiB2YXJzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBjb25zdW1lcyAoYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsIGBQR1BPUlRgLCBgUEdTU0xNT0RFYCwgYExBS0VCQVNFX0VORFBPSU5UYCkgYW5kIGZpbGxzIGluXG4gKiB3aGljaGV2ZXIgcGllY2VzIGFyZSBtaXNzaW5nIHVzaW5nIHRoZSBMYWtlYmFzZSBBdXRvc2NhbGluZyBSRVNUIEFQSVxuICogdW5kZXIgYC9hcGkvMi4wL3Bvc3RncmVzL2AgdmlhIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQuXG4gKlxuICogYExBS0VCQVNFX0VORFBPSU5UYCAoYW5kIGBjb25maWcuZW5kcG9pbnRgKSBhY2NlcHQgYW55dGhpbmdcbiAqIHtAbGluayBwYXJzZUFkZHJlc3N9IHVuZGVyc3RhbmRzIC0gY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuIFRoZSByZXNvbHZlciBsYXllcnNcbiAqIHdoYXRldmVyIHBpZWNlcyBmYWxsIG91dCBvZiBwYXJzaW5nIHVuZGVyIGV4cGxpY2l0IGNvbmZpZyAvIGVudlxuICogdmFsdWVzLCB0aGVuIGZpbGxzIHRoZSByZW1haW5pbmcgZ2FwcyB2aWEgdGhlIEFQSTpcbiAqXG4gKiAgIDEuIFJldmVyc2UtbG9va3VwOiB3aGVuIGEgaG9zdCBpcyBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aCBpcyxcbiAqICAgICAgc2NhbiBwcm9qZWN0cyAtPiBicmFuY2hlcyAtPiBlbmRwb2ludHMgZm9yIGEgbWF0Y2hpbmdcbiAqICAgICAgYHN0YXR1cy5ob3N0cy5ob3N0YCBhbmQgcmVjb3ZlciB0aGUgb3duaW5nIHByb2plY3QvYnJhbmNoL2VuZHBvaW50LlxuICogICAyLiBQaWNrOiB3aGVuIGEgcHJvamVjdCBpcyBrbm93biBidXQgY2hpbGQgcmVzb3VyY2VzIGFyZW4ndCwgcHJlZmVyXG4gKiAgICAgIHRoZSBzZXJ2ZXItc2lkZSBkZWZhdWx0IChgc3RhdHVzLmRlZmF1bHRgLCBgRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFYCxcbiAqICAgICAgYGRhdGFicmlja3NfcG9zdGdyZXNgKSBhbmQgZmFsbCBiYWNrIHRvIFwidGhlIG9ubHkgb25lXCIgd2hlbiBhXG4gKiAgICAgIGxpc3RpbmcgcmV0dXJucyBhIHNpbmdsZSByZXN1bHQuXG4gKiAgIDMuIEF1dG8tY3JlYXRlOiB3aGVuIG5vIHByb2plY3RzIGV4aXN0IGF0IGFsbCwgY3JlYXRlIG9uZSB3aG9zZVxuICogICAgICBpZCBkZWZhdWx0cyB0byBgcHJvamVjdC5uYW1lKClgIHNsdWdpZmllZCAob3ZlcnJpZGVcbiAqICAgICAgd2l0aCBgY29uZmlnLmF1dG9DcmVhdGU6IFwibXktaWRcImAgb3IgZGlzYWJsZSB3aXRoXG4gKiAgICAgIGBjb25maWcuYXV0b0NyZWF0ZTogZmFsc2VgKS4gVGhlIGNyZWF0ZSBjYWxsIGlzIGlkZW1wb3RlbnQgLSBhblxuICogICAgICBgQUxSRUFEWV9FWElTVFNgIHJlc3BvbnNlIGZyb20gYSBjb25jdXJyZW50IGJvb3QgaXMgdHJlYXRlZCBhc1xuICogICAgICBzdWNjZXNzLiBUaGVuIHBvbGwgdGhlIGRlZmF1bHQgZW5kcG9pbnQgdW50aWwgaXQgcmVwb3J0c1xuICogICAgICBgY3VycmVudF9zdGF0ZWAgYFJFQURZYCBvciBgSURMRWAuXG4gKlxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gd3JpdGVzIHRoZSByZXNvbHZlZCB2YWx1ZXMgYmFjayB0b1xuICogYHByb2Nlc3MuZW52YCBzbyB0aGUgZG93bnN0cmVhbSBgbGFrZWJhc2VgIHBsdWdpbiBwaWNrcyB0aGVtIHVwLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmRhdGFicmlja3MuY29tL2FwaS93b3Jrc3BhY2UvcG9zdGdyZXNcbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0VXNlcm5hbWVXaXRoQXBpTG9va3VwLFxuICBnZXRXb3Jrc3BhY2VDbGllbnQsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcHJvamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGFzeW5jLCBsb2csIG9iamVjdCwgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyByZXNvbHZlQ29uZmlnVmFsdWUgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxuaW1wb3J0IHsgTUFYX1RDUF9QT1JULCB0b0NvbnRleHQgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLnRzXCI7XG5pbXBvcnQge1xuICBwYXJzZUFkZHJlc3MsXG4gIHBhcnNlUmVzb3VyY2VQYXRoLFxuICBTU0xfTU9ERVMsXG4gIHR5cGUgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzLFxuICB0eXBlIFNzbE1vZGUsXG59IGZyb20gXCIuL3BnYWRkcmVzcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibGFrZWJhc2UtcmVzb2x2ZXJcIik7XG5jb25zdCBBUElfQkFTRSA9IFwiL2FwaS8yLjAvcG9zdGdyZXNcIjtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDU0MzI7XG5jb25zdCBERUZBVUxUX1NTTF9NT0RFOiBTc2xNb2RlID0gXCJyZXF1aXJlXCI7XG5jb25zdCBERUZBVUxUX1BHX1ZFUlNJT04gPSAxNztcbi8qKiBMYWtlYmFzZSBwcm9qZWN0IGlkczogYF5bYS16XVthLXowLTktXXswLDYxfVthLXowLTldJGAuICovXG5jb25zdCBQUk9KRUNUX0lEX01BWF9MRU4gPSA2MztcbmNvbnN0IE9QRVJBVElPTl9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IE9QRVJBVElPTl9QT0xMX01TID0gMl8wMDA7XG5jb25zdCBFTkRQT0lOVF9SRUFEWV9USU1FT1VUX01TID0gNSAqIDYwXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1BPTExfTVMgPSAyXzAwMDtcbi8qKiBDZWlsaW5nIG9uIGEgc2luZ2xlIGJhY2tvZmYgc3RlcCwgc28gYSBsb25nIHdhaXQgc3RpbGwgcG9sbHMgcmVndWxhcmx5LiAqL1xuY29uc3QgUE9MTF9NQVhfREVMQVlfTVMgPSAxNV8wMDA7XG5jb25zdCBQT0xMX0JBQ0tPRkZfRkFDVE9SID0gMS41O1xuLyoqIEZyYWN0aW9uIG9mIGVhY2ggZGVsYXkgYXBwbGllZCBhcyArLy0gaml0dGVyLCBzbyBjb25jdXJyZW50IGJvb3RzIGRlc3luY2hyb25pemUuICovXG5jb25zdCBQT0xMX0pJVFRFUl9SQVRJTyA9IDAuMjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmVuZHBvaW50X3R5cGVgIGZvciB0aGUgd3JpdGFibGUgcHJpbWFyeS4gKi9cbmNvbnN0IFJFQURfV1JJVEVfRU5EUE9JTlRfVFlQRSA9IFwiRU5EUE9JTlRfVFlQRV9SRUFEX1dSSVRFXCI7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCB2YWx1ZXMgdGhhdCB3aWxsIGFjY2VwdCBhIGNvbm5lY3Rpb24uICovXG5jb25zdCBDT05ORUNUQUJMRV9FTkRQT0lOVF9TVEFURVMgPSBuZXcgU2V0KFtcIlJFQURZXCIsIFwiSURMRVwiXSk7XG4vKiogRW5kcG9pbnQgYHN0YXR1cy5jdXJyZW50X3N0YXRlYCBiZWZvcmUgYSBob3N0bmFtZSBpcyBtZWFuaW5nZnVsLiAqL1xuY29uc3QgSU5JVElBTElaSU5HX0VORFBPSU5UX1NUQVRFID0gXCJJTklUSUFMSVpJTkdcIjtcbi8qKiBMYWtlYmFzZSdzIG93biBkZWZhdWx0IFBvc3RncmVzIGRhdGFiYXNlIG5hbWUuICovXG5jb25zdCBERUZBVUxUX0RBVEFCQVNFID0gXCJkYXRhYnJpY2tzX3Bvc3RncmVzXCI7XG5cbi8qKlxuICogVXNlci1zdXBwbGllZCBMYWtlYmFzZSBpbnB1dHMgKGNvbmZpZyBvciBlbnYpIGJlZm9yZSBhbnkgQVBJIHJlc29sdXRpb24uXG4gKiBFeHRlbmRzIHtAbGluayBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHN9IHdpdGggcmVzb2x2ZXItb25seSBvcHRpb25zLlxuICoge0BsaW5rIHJlc29sdmVMYWtlYmFzZUNvbm5lY3Rpb259IGZpbGxzIGdhcHMgZnJvbSB0aGUgTGFrZWJhc2UgQVBJIHdoZW5cbiAqIGl0IGhhcyBlbm91Z2ggY29udGV4dCAodHlwaWNhbGx5IGEgYHByb2plY3RgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZVJlc29sdmVySW5wdXRzIGV4dGVuZHMgTGFrZWJhc2VDb25uZWN0aW9uSW5wdXRzIHtcbiAgLyoqXG4gICAqIFdoYXQgdG8gZG8gd2hlbiBubyBwcm9qZWN0IGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlIGF0IGFsbC5cbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGRlcml2ZSBhIHByb2plY3QgaWQgZnJvbVxuICAgKiAgIHtAbGluayBwcm9qZWN0Lm5hbWV9ICh0aGUgaG9zdCByZXBvJ3MgYHBhY2thZ2UuanNvbmBcbiAgICogICBuYW1lKSBzbHVnaWZpZWQgdG8gTGFrZWJhc2UgaWQgY29uc3RyYWludHMsIHRoZW4gY3JlYXRlIGl0LlxuICAgKiAtIGBzdHJpbmdgOiBjcmVhdGUgYSBuZXcgcHJvamVjdCB3aXRoIHRoaXMgZXhhY3QgaWQuXG4gICAqIC0gYGZhbHNlYDogc2tpcCBjcmVhdGlvbiBhbmQgdGhyb3cgd2l0aCBhIGNsZWFyIGVycm9yIG1lc3NhZ2UuXG4gICAqL1xuICBhdXRvQ3JlYXRlPzogc3RyaW5nIHwgZmFsc2U7XG59XG5cbi8qKiBGdWxseS1yZXNvbHZlZCBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWtlYmFzZUNvbm5lY3Rpb24gZXh0ZW5kcyBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMge1xuICBwb3J0OiBudW1iZXI7XG4gIHNzbE1vZGU6IFNzbE1vZGU7XG59XG5cbi8qKlxuICogRXZlcnkgZmllbGQgb2YgdGhlIExha2ViYXNlIFJFU1QgcGF5bG9hZHMgaXMgbW9kZWxsZWQgYXMgb3B0aW9uYWwgYW5kXG4gKiB2YWxpZGF0ZWQgYXQgdGhlIGJvdW5kYXJ5IHJhdGhlciB0aGFuIGFzc2VydGVkIHdpdGggYSBjYXN0OiB0aGUgcGlja2VycyBiZWxvd1xuICogYnJhbmNoIG9uIGBzdGF0dXMuKmAsIGFuZCBhIHNoYXBlIGNoYW5nZSB1cHN0cmVhbSBzaG91bGQgc3VyZmFjZSBhcyBvbmUgbG91ZFxuICogZXJyb3IgaGVyZSBpbnN0ZWFkIG9mIGFuIGB1bmRlZmluZWRgIHRocmVlIGZyYW1lcyBhd2F5LiBFbnVtLXNoYXBlZCBmaWVsZHNcbiAqIHN0YXkgYHN0cmluZ2Agc28gYSBuZXdseSBhZGRlZCBzdGF0ZSBkb2VzIG5vdCBmYWlsIHRoZSB3aG9sZSByZXNwb25zZS5cbiAqL1xuY29uc3QgcHJvamVjdFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gRnVsbCByZXNvdXJjZSBwYXRoOiBgcHJvamVjdHMve3B9YC5cbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG50eXBlIFByb2plY3QgPSB6LmluZmVyPHR5cGVvZiBwcm9qZWN0U2NoZW1hPjtcblxuY29uc3QgZW5kcG9pbnRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIEZ1bGwgcmVzb3VyY2UgcGF0aDogYHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZW5kcG9pbnRzL3tlfWAuXG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdWlkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8vIFNlcnZlci1zaWRlIHN0YXRlLiBBbGwgY29ubmVjdGlvbiBpbmZvIGxpdmVzIGhlcmUgLSB0aGUgc3BlYyBibG9ja1xuICAvLyBvbmx5IGNhcnJpZXMgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiwgbm90IHRoZSBydW50aW1lIGhvc3RuYW1lcy5cbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICBlbmRwb2ludF90eXBlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAvLyBSZXNvbHZlZCBob3N0bmFtZXM7IGBob3N0cy5ob3N0YCBpcyB0aGUgd3JpdGFibGUgcHJpbWFyeS5cbiAgICAgIGhvc3RzOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIGhvc3Q6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgICByZWFkX29ubHlfaG9zdDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICB9KVxuICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgIC8vIENvbXB1dGUgc3RhdGU6IGBJTklUSUFMSVpJTkdgLCBgU1RBUlRJTkdgLCBgUkVBRFlgLCBgSURMRWAsIC4uLlxuICAgICAgY3VycmVudF9zdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbnR5cGUgRW5kcG9pbnQgPSB6LmluZmVyPHR5cGVvZiBlbmRwb2ludFNjaGVtYT47XG5cbmNvbnN0IGJyYW5jaFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgLy8gRnVsbCByZXNvdXJjZSBwYXRoOiBgcHJvamVjdHMve3B9L2JyYW5jaGVzL3tifWAuXG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICAvLyBUcnVlIGZvciB0aGUgcHJvamVjdCdzIGRlZmF1bHQgYnJhbmNoIChlLmcuIGBwcm9kdWN0aW9uYCkuXG4gICAgICBkZWZhdWx0OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgY3VycmVudF9zdGF0ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbnR5cGUgQnJhbmNoID0gei5pbmZlcjx0eXBlb2YgYnJhbmNoU2NoZW1hPjtcblxuY29uc3QgZGF0YWJhc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8vIEZ1bGwgcmVzb3VyY2UgcGF0aDogYHByb2plY3RzL3twfS9icmFuY2hlcy97Yn0vZGF0YWJhc2VzL3tkfWAuXG4gIG5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgc3RhdHVzOiB6XG4gICAgLm9iamVjdCh7XG4gICAgICAvLyBBY3R1YWwgUG9zdGdyZXMgZGF0YWJhc2UgbmFtZSAodXNlZCBhcyBgUEdEQVRBQkFTRWApLiBNYXkgZGlmZmVyXG4gICAgICAvLyBmcm9tIHRoZSByZXNvdXJjZSBpZCAtIGUuZy4gcmVzb3VyY2UgYGRhdGFicmlja3MtcG9zdGdyZXNgXG4gICAgICAvLyBzdXJmYWNlcyBhcyBQb3N0Z3JlcyBkYXRhYmFzZSBgZGF0YWJyaWNrc19wb3N0Z3Jlc2AuXG4gICAgICBwb3N0Z3Jlc19kYXRhYmFzZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pXG4gICAgLm9wdGlvbmFsKCksXG59KTtcbnR5cGUgRGF0YWJhc2UgPSB6LmluZmVyPHR5cGVvZiBkYXRhYmFzZVNjaGVtYT47XG5cbi8qKlxuICogTGFrZWJhc2UgUkVTVCBsaXN0IHJlc3BvbnNlcyBmb2xsb3cgdGhlIEdvb2dsZSBBSVAgY29udmVudGlvbjpcbiAqIGB7IDxwbHVyYWwtcmVzb3VyY2U+OiBUW10sIG5leHRfcGFnZV90b2tlbj86IHN0cmluZyB9YC4gV2Ugb25seSByZWFkXG4gKiB0aGUgZmlyc3QgcGFnZTsgZm9yIGF1dG8tY29uZmlnJ3MgXCJwaWNrIHNvbWV0aGluZyBzZW5zaWJsZVwiIHNlbWFudGljcyB0aGVcbiAqIGNhcCBpcyBmaW5lLlxuICovXG5jb25zdCBsaXN0UmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIG5leHRfcGFnZV90b2tlbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBwcm9qZWN0czogei5hcnJheShwcm9qZWN0U2NoZW1hKS5vcHRpb25hbCgpLFxuICBicmFuY2hlczogei5hcnJheShicmFuY2hTY2hlbWEpLm9wdGlvbmFsKCksXG4gIGVuZHBvaW50czogei5hcnJheShlbmRwb2ludFNjaGVtYSkub3B0aW9uYWwoKSxcbiAgZGF0YWJhc2VzOiB6LmFycmF5KGRhdGFiYXNlU2NoZW1hKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogTG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBlbnZlbG9wZSByZXR1cm5lZCBieSBtdXRhdGluZyBSRVNUIGNhbGxzLlxuICogYGRvbmU6IHRydWVgIG1lYW5zIHRlcm1pbmFsOyBjaGVjayBgZXJyb3JgIGJlZm9yZSByZWFkaW5nIGByZXNwb25zZWAuXG4gKi9cbmNvbnN0IG9wZXJhdGlvblNjaGVtYSA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBkb25lOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICBlcnJvcjogei51bmtub3duKCkub3B0aW9uYWwoKSxcbiAgcmVzcG9uc2U6IHoudW5rbm93bigpLm9wdGlvbmFsKCksXG59KTtcbnR5cGUgT3BlcmF0aW9uID0gei5pbmZlcjx0eXBlb2Ygb3BlcmF0aW9uU2NoZW1hPjtcblxuLyoqIGBQR1BPUlRgIG11c3QgbGFuZCBpbnNpZGUgdGhlIFRDUCBwb3J0IHJhbmdlLiAqL1xuY29uc3QgcG9ydFNjaGVtYSA9IHouY29lcmNlLm51bWJlcigpLmludCgpLm1pbigxKS5tYXgoTUFYX1RDUF9QT1JUKTtcblxuY29uc3Qgc3NsTW9kZVNjaGVtYSA9IHouZW51bShTU0xfTU9ERVMpO1xuXG4vKipcbiAqIFZhbGlkYXRlIGEgYFBHUE9SVGAtc2hhcGVkIHZhbHVlLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdW5zZXQsIGFuZCB0aHJvd3NcbiAqIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gbmFtaW5nIGBQR1BPUlRgIGZvciBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIFRDUFxuICogcG9ydCwgc28gYSB0eXBvIGNhbm5vdCByZWFjaCB0aGUgY29ubmVjdGlvbiByZWNvcmQgYXMgYE5hTmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBvcnQodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBwb3J0U2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwiUEdQT1JUXCIsIHZhbHVlLCBgYSBUQ1AgcG9ydCBiZXR3ZWVuIDEgYW5kICR7TUFYX1RDUF9QT1JUfWApO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGBQR1NTTE1PREVgLXNoYXBlZCB2YWx1ZS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHVuc2V0LCBhbmRcbiAqIHRocm93cyBhIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG5hbWluZyBgUEdTU0xNT0RFYCBmb3IgYW4gdW5zdXBwb3J0ZWQgbW9kZVxuICogcmF0aGVyIHRoYW4gaGFuZGluZyBgcGdgIGEgdmFsdWUgaXQgd2lsbCByZWplY3QgYXQgY29ubmVjdCB0aW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTc2xNb2RlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBTc2xNb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnNlZCA9IHNzbE1vZGVTY2hlbWEuc2FmZVBhcnNlKHZhbHVlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHRocm93IFZhbGlkYXRpb25FcnJvci5pbnZhbGlkVmFsdWUoXCJQR1NTTE1PREVcIiwgdmFsdWUsIFNTTF9NT0RFUy5qb2luKFwiLCBcIikpO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuLyoqXG4gKiBEZWxheSBiZWZvcmUgdGhlIG5leHQgcG9sbCBhdHRlbXB0OiBleHBvbmVudGlhbCBiYWNrb2ZmIGNhcHBlZCBhdFxuICoge0BsaW5rIFBPTExfTUFYX0RFTEFZX01TfSwgcGx1cyBqaXR0ZXIgc28gc2V2ZXJhbCBhcHBzIGJvb3RpbmcgYWdhaW5zdCB0aGVcbiAqIHNhbWUgd29ya3NwYWNlIGRvIG5vdCByZXRyeSBpbiBsb2Nrc3RlcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5leHRQb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBNYXRoLm1pbihiYXNlTXMgKiBQT0xMX0JBQ0tPRkZfRkFDVE9SICoqIGF0dGVtcHQsIFBPTExfTUFYX0RFTEFZX01TKTtcbiAgY29uc3Qgaml0dGVyID0gYmFja29mZiAqIFBPTExfSklUVEVSX1JBVElPICogKE1hdGgucmFuZG9tKCkgKiAyIC0gMSk7XG4gIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGJhY2tvZmYgKyBqaXR0ZXIpKTtcbn1cblxuLyoqXG4gKiBXYWl0IG91dCB7QGxpbmsgbmV4dFBvbGxEZWxheX0gYmVmb3JlIHRoZSBuZXh0IGF0dGVtcHQuIFJlamVjdHMgd2l0aCB0aGVcbiAqIHNpZ25hbCdzIHJlYXNvbiB3aGVuIHRoZSBjYWxsZXIgY2FuY2VscyBtaWQtd2FpdCwgc28gYSBwb2xsIGxvb3AgdW53aW5kc1xuICogaW5zdGVhZCBvZiBmaW5pc2hpbmcgaXRzIGJhY2tvZmYgZmlyc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2xsRGVsYXkoYXR0ZW1wdDogbnVtYmVyLCBiYXNlTXM6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGFzeW5jLnNsZWVwKG5leHRQb2xsRGVsYXkoYXR0ZW1wdCwgYmFzZU1zKSwgc2lnbmFsKTtcbn1cblxuLyoqXG4gKiBQdWxsIHJlc29sdmVyIGlucHV0cyBmcm9tIGBwcm9jZXNzLmVudmAsIHBhcnNlIHRoZSBhZGRyZXNzIGJsb2IsIGFuZFxuICogbGF5ZXIgZXhwbGljaXQgY29uZmlnIG9uIHRvcCB3aXRoIHRoaXMgcHJlY2VkZW5jZTpcbiAqXG4gKiAgIGBjb25maWcuPGZpZWxkPmAgPiBgY29uZmlnLnJlc29sdmVDb25maWdWYWx1ZWAgKGBlbnZgLCB0aGVuIGJ1bmRsZVxuICogICB2YWxpZGF0ZSBKU09OKSA+IHdoYXRldmVyIHtAbGluayBwYXJzZUFkZHJlc3N9IHJlY292ZXJlZCBmcm9tIHRoZVxuICogICBgZW5kcG9pbnRgIC8gYExBS0VCQVNFX0VORFBPSU5UYCBibG9iLlxuICpcbiAqIFNldCBgY29uZmlnLmVuZHBvaW50YCAob3IgYExBS0VCQVNFX0VORFBPSU5UYCkgdG8gYW55IGlucHV0XG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kczogY2Fub25pY2FsIHJlc291cmNlIHBhdGhzLCBQb3N0Z3Jlc1xuICogVVJJcywgYmFyZSBob3N0bmFtZXMsIG9yIGJhcmUgcHJvamVjdCBpZHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTGFrZWJhc2VJbnB1dHMoXG4gIGNvbmZpZz86IExha2ViYXNlUmVzb2x2ZXJJbnB1dHMsXG4pOiBQcm9taXNlPExha2ViYXNlUmVzb2x2ZXJJbnB1dHM+IHtcbiAgY29uc3QgcmF3QWRkcmVzcyA9IGNvbmZpZz8uZW5kcG9pbnQgPz8gKGF3YWl0IHJlc29sdmVDb25maWdWYWx1ZShcIkxBS0VCQVNFX0VORFBPSU5UXCIpKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VBZGRyZXNzKHJhd0FkZHJlc3MpO1xuICBjb25zdCBwb3J0RW52ID0gcGFyc2VQb3J0KGF3YWl0IHJlc29sdmVDb25maWdWYWx1ZShcIlBHUE9SVFwiKSk7XG4gIGNvbnN0IHNzbE1vZGVFbnYgPSBwYXJzZVNzbE1vZGUoYXdhaXQgcmVzb2x2ZUNvbmZpZ1ZhbHVlKFwiUEdTU0xNT0RFXCIpKTtcbiAgcmV0dXJuIHtcbiAgICBwcm9qZWN0OiBjb25maWc/LnByb2plY3QgPz8gcGFyc2VkLnByb2plY3QsXG4gICAgYnJhbmNoOiBjb25maWc/LmJyYW5jaCA/PyBwYXJzZWQuYnJhbmNoLFxuICAgIC8vIE9ubHkgY2Fub25pY2FsIGVuZHBvaW50IHJlc291cmNlIHBhdGhzIHN1cnZpdmUgaGVyZTsgVVJJcyBhbmRcbiAgICAvLyBiYXJlIGhvc3RuYW1lcyBzZXQgYGhvc3RgIGluc3RlYWQgYW5kIGxlYXZlIGBlbmRwb2ludGAgdW5kZWZpbmVkXG4gICAgLy8gdW50aWwgdGhlIFJFU1QgcmVzb2x2ZXIgZmlsbHMgaXQgaW4uXG4gICAgZW5kcG9pbnQ6IHBhcnNlZC5lbmRwb2ludCxcbiAgICBkYXRhYmFzZTogY29uZmlnPy5kYXRhYmFzZSA/PyAoYXdhaXQgcmVzb2x2ZUNvbmZpZ1ZhbHVlKFwiUEdEQVRBQkFTRVwiKSkgPz8gcGFyc2VkLmRhdGFiYXNlLFxuICAgIGhvc3Q6IGNvbmZpZz8uaG9zdCA/PyAoYXdhaXQgcmVzb2x2ZUNvbmZpZ1ZhbHVlKFwiUEdIT1NUXCIpKSA/PyBwYXJzZWQuaG9zdCxcbiAgICBwb3J0OiBjb25maWc/LnBvcnQgPz8gcG9ydEVudiA/PyBwYXJzZWQucG9ydCxcbiAgICBzc2xNb2RlOiBjb25maWc/LnNzbE1vZGUgPz8gc3NsTW9kZUVudiA/PyBwYXJzZWQuc3NsTW9kZSxcbiAgICBhdXRvQ3JlYXRlOiBjb25maWc/LmF1dG9DcmVhdGUsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGZ1bGx5LXBvcHVsYXRlZCBQb3N0Z3JlcyBjb25uZWN0aW9uIHJlY29yZCBmcm9tIGNvbmZpZyArIGVudi5cbiAqXG4gKiBSZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQgbmV0d29yayB0cmFmZmljIHdoZW4gZW52IGFscmVhZHkgc3VwcGxpZXNcbiAqIGBlbmRwb2ludGAsIGBob3N0YCwgYW5kIGBkYXRhYmFzZWAuIE90aGVyd2lzZSBpc3N1ZXMgUkVTVCBjYWxscyBhbmRcbiAqIG1heSBhdXRvLWNyZWF0ZSBhIHByb2plY3QgKHNlZSBtb2R1bGUgZG9jc3RyaW5nKS5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIGV2ZXJ5IFJFU1QgY2FsbCBhbmQgaW50ZXItcG9sbCBzbGVlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgbGFrZWJhc2VSZXNvbHZlciB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5yZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICogICB7IGF1dG9DcmVhdGU6IGZhbHNlIH0sXG4gKiAgIEFib3J0U2lnbmFsLnRpbWVvdXQoNjBfMDAwKSxcbiAqICk7XG4gKiBsYWtlYmFzZVJlc29sdmVyLmFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGlucHV0cyA9IGF3YWl0IHJlYWRMYWtlYmFzZUlucHV0cyhjb25maWcpO1xuICBsZXQgeyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCB9ID0gaW5wdXRzO1xuICBjb25zdCBwb3J0ID0gaW5wdXRzLnBvcnQgPz8gREVGQVVMVF9QT1JUO1xuICBjb25zdCBzc2xNb2RlID0gaW5wdXRzLnNzbE1vZGUgPz8gREVGQVVMVF9TU0xfTU9ERTtcblxuICAvLyBSZXNvdXJjZSBwYXRocyBtYXkgY2FycnkgcmVkdW5kYW50IGluZm87IGhhcnZlc3QgcHJvamVjdC9icmFuY2hcbiAgLy8gZnJvbSBhbnkgY2Fub25pY2FsIHBhdGggdGhhdCBzbnVjayBpbiB2aWEgUEdEQVRBQkFTRSBvciBzaW1pbGFyLlxuICBpZiAoZW5kcG9pbnQgJiYgKCFwcm9qZWN0IHx8ICFicmFuY2gpKSB7XG4gICAgY29uc3QgcGFyc2VkRW5kcG9pbnQgPSBwYXJzZUFkZHJlc3MoZW5kcG9pbnQpO1xuICAgIHByb2plY3QgPz89IHBhcnNlZEVuZHBvaW50LnByb2plY3Q7XG4gICAgYnJhbmNoID8/PSBwYXJzZWRFbmRwb2ludC5icmFuY2g7XG4gIH1cbiAgaWYgKGRhdGFiYXNlICYmICghcHJvamVjdCB8fCAhYnJhbmNoKSkge1xuICAgIGNvbnN0IHBhcnNlZERhdGFiYXNlID0gcGFyc2VBZGRyZXNzKGRhdGFiYXNlKTtcbiAgICBwcm9qZWN0ID8/PSBwYXJzZWREYXRhYmFzZS5wcm9qZWN0O1xuICAgIGJyYW5jaCA/Pz0gcGFyc2VkRGF0YWJhc2UuYnJhbmNoO1xuICAgIGlmIChwYXJzZWREYXRhYmFzZS5kYXRhYmFzZVJlc291cmNlSWQpIHtcbiAgICAgIGRhdGFiYXNlID0gcGFyc2VkRGF0YWJhc2UuZGF0YWJhc2VSZXNvdXJjZUlkO1xuICAgIH1cbiAgfVxuXG4gIC8vIEFscmVhZHkgY29tcGxldGU6IHNraXAgZXZlcnkgUkVTVCBjYWxsLlxuICBpZiAoZW5kcG9pbnQgJiYgaG9zdCAmJiBkYXRhYmFzZSkge1xuICAgIHJldHVybiB7IHByb2plY3QsIGJyYW5jaCwgZW5kcG9pbnQsIGRhdGFiYXNlLCBob3N0LCBwb3J0LCBzc2xNb2RlIH07XG4gIH1cblxuICBjb25zdCB3cyA9IGdldFdvcmtzcGFjZUNsaWVudCh7fSk7XG5cbiAgLy8gSG9zdCBrbm93biBidXQgbm8gcmVzb3VyY2UgcGF0aDogc2NhbiB0aGUgd29ya3NwYWNlIHRvIGZpbmQgd2hpY2hcbiAgLy8gZW5kcG9pbnQgb3ducyB0aGlzIGhvc3Qgc28gd2UgY2FuIHBvcHVsYXRlIExBS0VCQVNFX0VORFBPSU5ULlxuICBpZiAoIXByb2plY3QgJiYgaG9zdCkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgZmluZEVuZHBvaW50QnlIb3N0KHdzLCBob3N0LCBzaWduYWwpO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgcHJvamVjdCA9IGZvdW5kLnByb2plY3Q7XG4gICAgICBicmFuY2ggPSBmb3VuZC5icmFuY2g7XG4gICAgICBlbmRwb2ludCA/Pz0gZm91bmQuZW5kcG9pbnQ7XG4gICAgfVxuICB9XG5cbiAgLy8gTm8gcHJvamVjdCBhbnl3aGVyZSBpbiBjb25maWcvZW52L2FkZHJlc3M6IGxpc3QsIHBpY2ssIG9yIGNyZWF0ZS5cbiAgaWYgKCFwcm9qZWN0KSB7XG4gICAgcHJvamVjdCA9IGF3YWl0IHBpY2tPckNyZWF0ZVByb2plY3Qod3MsIGNvbmZpZz8uYXV0b0NyZWF0ZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGlmICghYnJhbmNoKSB7XG4gICAgYnJhbmNoID0gYXdhaXQgcGlja0JyYW5jaCh3cywgcHJvamVjdCwgc2lnbmFsKTtcbiAgfVxuXG4gIGlmICghZW5kcG9pbnQpIHtcbiAgICBjb25zdCBlcCA9IGF3YWl0IHBpY2tFbmRwb2ludCh3cywgcHJvamVjdCwgYnJhbmNoLCBzaWduYWwpO1xuICAgIGVuZHBvaW50ID0gZXAubmFtZTtcbiAgICBob3N0ID8/PSBlcC5ob3N0O1xuICB9XG5cbiAgaWYgKCFob3N0ICYmIGVuZHBvaW50KSB7XG4gICAgY29uc3QgcGFyc2VkRW5kcG9pbnQgPSBwYXJzZUFkZHJlc3MoZW5kcG9pbnQpO1xuICAgIGlmIChwYXJzZWRFbmRwb2ludC5wcm9qZWN0ICYmIHBhcnNlZEVuZHBvaW50LmJyYW5jaCAmJiBwYXJzZWRFbmRwb2ludC5lbmRwb2ludElkKSB7XG4gICAgICBjb25zdCBlcCA9IGF3YWl0IHdhaXRFbmRwb2ludFJlYWR5KFxuICAgICAgICB3cyxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQucHJvamVjdCxcbiAgICAgICAgcGFyc2VkRW5kcG9pbnQuYnJhbmNoLFxuICAgICAgICBwYXJzZWRFbmRwb2ludC5lbmRwb2ludElkLFxuICAgICAgICBzaWduYWwsXG4gICAgICApO1xuICAgICAgaG9zdCA9IGVwLnN0YXR1cz8uaG9zdHM/Lmhvc3Q7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGhvc3QgZnJvbSBlbmRwb2ludFwiLCB7IGhvc3QgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkYXRhYmFzZSkge1xuICAgIGRhdGFiYXNlID0gYXdhaXQgcGlja0RhdGFiYXNlKHdzLCBwcm9qZWN0LCBicmFuY2gsIHNpZ25hbCk7XG4gIH1cblxuICByZXR1cm4geyBwcm9qZWN0LCBicmFuY2gsIGVuZHBvaW50LCBkYXRhYmFzZSwgaG9zdCwgcG9ydCwgc3NsTW9kZSB9O1xufVxuXG4vKipcbiAqIFdyaXRlIHJlc29sdmVkIHZhbHVlcyBiYWNrIHRvIGBwcm9jZXNzLmVudmAgc28gdGhlIGBsYWtlYmFzZWAgcGx1Z2luXG4gKiAod2hpY2ggcmVhZHMgZW52IGRpcmVjdGx5KSBwaWNrcyB0aGVtIHVwIGR1cmluZyBpdHMgb3duIGBzZXR1cCgpYC5cbiAqIEV4aXN0aW5nIGVudiB2YWx1ZXMgYXJlIHByZXNlcnZlZDsgb25seSBtaXNzaW5nIGtleXMgYXJlIGZpbGxlZCBpbixcbiAqIHdoaWNoIGtlZXBzIGV4cGxpY2l0IG92ZXJyaWRlcyBhdXRob3JpdGF0aXZlLlxuICpcbiAqIFRoaXMgZG9lcyBOT1Qgc2V0IGBQR1VTRVJgLCB3aGljaCBuZWVkcyBhbiBhd2FpdCAtIHNlZVxuICoge0BsaW5rIGFwcGx5TGFrZWJhc2VFbnZ9IGZvciB0aGUgY29tcGxldGUgc2V0IGEgUG9zdGdyZXMgcG9vbCByZXF1aXJlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uKTogdm9pZCB7XG4gIGlmIChyZXNvbHZlZC5lbmRwb2ludCkgcHJvY2Vzcy5lbnYuTEFLRUJBU0VfRU5EUE9JTlQgPz89IHJlc29sdmVkLmVuZHBvaW50O1xuICBpZiAocmVzb2x2ZWQuaG9zdCkgcHJvY2Vzcy5lbnYuUEdIT1NUID8/PSByZXNvbHZlZC5ob3N0O1xuICBpZiAocmVzb2x2ZWQuZGF0YWJhc2UpIHByb2Nlc3MuZW52LlBHREFUQUJBU0UgPz89IHJlc29sdmVkLmRhdGFiYXNlO1xuICBwcm9jZXNzLmVudi5QR1BPUlQgPz89IFN0cmluZyhyZXNvbHZlZC5wb3J0KTtcbiAgcHJvY2Vzcy5lbnYuUEdTU0xNT0RFID8/PSByZXNvbHZlZC5zc2xNb2RlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIGNvbm5lY3Rpb24gQU5EIGFwcGx5IGV2ZXJ5IFBvc3RncmVzIGVudiB2YXIgYSBMYWtlYmFzZSBwb29sIG5lZWRzLFxuICogcmV0dXJuaW5nIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uIHBsdXMgdGhlIHVzZXJuYW1lIHRoYXQgd2FzIGFwcGxpZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgd2hvbGUgc2V0LCB3aGljaCBpcyB0aGUgcG9pbnQgb2YgaGF2aW5nIG9uZSBmdW5jdGlvbiBmb3IgaXQ6XG4gKiBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRocm93cyB1bmxlc3MgYExBS0VCQVNFX0VORFBPSU5UYCwgYFBHSE9TVGAsXG4gKiBgUEdEQVRBQkFTRWAsICoqYW5kKiogYSB1c2VybmFtZSAoYFBHVVNFUmAsIG9yIGBEQVRBQlJJQ0tTX0NMSUVOVF9JRGAgZm9yIGFcbiAqIHNlcnZpY2UgcHJpbmNpcGFsKSBhcmUgYWxsIHByZXNlbnQsIGFuZCBhIERhdGFicmlja3MgQXBwIGBwb3N0Z3Jlc2AgcmVzb3VyY2VcbiAqIGJpbmRpbmcgc3VwcGxpZXMgb25seSB0aGUgZmlyc3QuIEFueXRoaW5nIHRoYXQgd2FudHMgYSB3b3JraW5nIHBvb2wgLSB0aGVcbiAqIGBsYWtlYmFzZWAgcGx1Z2luLCBvciBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLCB3aGljaCBxdWlldGx5IGRlZ3JhZGVzIHRvXG4gKiBpbi1tZW1vcnkgd2hlbiB0aGUgcG9vbCBjYW5ub3QgYmUgYnVpbHQgLSBuZWVkcyBhbGwgZm91ciwgc28gY2FsbGVycyBzaG91bGQgbm90XG4gKiBwYWlyIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdpdGggdGhlaXIgb3duIHVzZXJuYW1lIGxvb2t1cC5cbiAqXG4gKiBgUEdVU0VSYCBpcyBhcHBsaWVkIHdpdGggYD8/PWAgbGlrZSB0aGUgcmVzdCwgc28gYW4gZXhwbGljaXRseSBjb25maWd1cmVkIHZhbHVlXG4gKiBzdGF5cyBhdXRob3JpdGF0aXZlLiBUaGUgbG9va3VwIHJldHVybnMgYHVuZGVmaW5lZGAgcmF0aGVyIHRoYW4gdGhyb3dpbmcgd2hlbiBpdFxuICogY2Fubm90IGRldGVybWluZSBhIHVzZXIsIGxlYXZpbmcgdGhlIHBvb2wgdG8gcmVzb2x2ZSBpdHMgb3duLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBsYWtlYmFzZVJlc29sdmVyIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogLy8gRW5vdWdoIGZvciBgY3JlYXRlTGFrZWJhc2VQb29sKClgIHRvIGJ1aWxkIGEgcG9vbC5cbiAqIGNvbnN0IHsgdXNlciB9ID0gYXdhaXQgbGFrZWJhc2VSZXNvbHZlci5hcHBseUxha2ViYXNlRW52KHsgYXV0b0NyZWF0ZTogZmFsc2UgfSk7XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUxha2ViYXNlRW52KFxuICBjb25maWc/OiBMYWtlYmFzZVJlc29sdmVySW5wdXRzLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8eyByZXNvbHZlZDogTGFrZWJhc2VDb25uZWN0aW9uOyB1c2VyPzogc3RyaW5nIH0+IHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uKGNvbmZpZywgc2lnbmFsKTtcbiAgYXBwbHlMYWtlYmFzZVRvRW52KHJlc29sdmVkKTtcbiAgY29uc3QgdXNlciA9IGF3YWl0IGdldFVzZXJuYW1lV2l0aEFwaUxvb2t1cCh7fSk7XG4gIGlmICh1c2VyKSBwcm9jZXNzLmVudi5QR1VTRVIgPz89IHVzZXI7XG4gIHJldHVybiB7IHJlc29sdmVkLCAuLi4odXNlciA/IHsgdXNlciB9IDoge30pIH07XG59XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTx0eXBlb2YgZ2V0V29ya3NwYWNlQ2xpZW50PjtcblxuLyoqIFRoZSBTREsgYENvbnRleHRgIGFjY2VwdGVkIGJ5IHRoZSB3b3Jrc3BhY2UgY2xpZW50J3Mgb3duIGNvcHkgb2YgdGhlIFNESy4gKi9cbnR5cGUgQXBpUmVxdWVzdENvbnRleHQgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPFdvcmtzcGFjZUNsaWVudFtcImFwaUNsaWVudFwiXVtcInJlcXVlc3RcIl0+WzFdPjtcblxuLyoqXG4gKiBBZGFwdCBhbiB7QGxpbmsgQWJvcnRTaWduYWx9IGludG8gdGhlIGFwaSBjbGllbnQncyBjYW5jZWxsYXRpb24gY29udGV4dC5cbiAqIEFwcEtpdCByZXNvbHZlcyBhIGRpZmZlcmVudCBjb3B5IG9mIGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYCB0aGFuIHRoaXNcbiAqIHBhY2thZ2UgZG9lcywgYW5kIGBDb250ZXh0YCBjYXJyaWVzIGEgcHJpdmF0ZSBmaWVsZCwgc28gdGhlIHR3byBkZWNsYXJhdGlvbnNcbiAqIGFyZSBub21pbmFsbHkgaW5jb21wYXRpYmxlIGV2ZW4gdGhvdWdoIHRoZSBhcGkgY2xpZW50IG9ubHkgcmVhZHNcbiAqIGBjYW5jZWxsYXRpb25Ub2tlbmAgYW5kIGBsb2dnZXJgIG9mZiB0aGUgb2JqZWN0LlxuICovXG5mdW5jdGlvbiByZXF1ZXN0Q29udGV4dChzaWduYWw6IEFib3J0U2lnbmFsIHwgdW5kZWZpbmVkKTogQXBpUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc2lnbmFsID8gKHRvQ29udGV4dChzaWduYWwpIGFzIHVua25vd24gYXMgQXBpUmVxdWVzdENvbnRleHQpIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgTGFrZWJhc2UgUkVTVCBib2R5LiBUaGUgZnVsbCBwYXlsb2FkIGlzIGxvZ2dlZCByYXRoZXIgdGhhbiB0aHJvd25cbiAqIHNvIGEgY2xpZW50IG5ldmVyIHJlY2VpdmVzIHVwc3RyZWFtIGRldGFpbC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VSZXNwb25zZTxUPihzY2hlbWE6IHouWm9kVHlwZTxUPiwgcGF0aDogc3RyaW5nLCBib2R5OiB1bmtub3duKTogVCB7XG4gIGNvbnN0IHBhcnNlZCA9IHNjaGVtYS5zYWZlUGFyc2UoYm9keSk7XG4gIGlmIChwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHBhcnNlZC5kYXRhO1xuICBsb2dnZXIuZXJyb3IoXCJhdXRvcGc6IHVuZXhwZWN0ZWQgTGFrZWJhc2UgQVBJIHJlc3BvbnNlXCIsIHtcbiAgICBwYXRoLFxuICAgIGlzc3VlczogcGFyc2VkLmVycm9yLmlzc3VlcyxcbiAgfSk7XG4gIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIkxha2ViYXNlIEFQSSByZXR1cm5lZCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlXCIsIHsgY29udGV4dDogeyBwYXRoIH0gfSk7XG59XG5cbi8qKiBHRVQgaGVscGVyIHRoYXQgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkgYW5kIGZvcndhcmRzIGNhbmNlbGxhdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEpzb248VD4oXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhdGg6IHN0cmluZyxcbiAgc2NoZW1hOiB6LlpvZFR5cGU8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IHdzLmFwaUNsaWVudC5yZXF1ZXN0KFxuICAgIHtcbiAgICAgIHBhdGgsXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IEFjY2VwdDogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSksXG4gICAgICByYXc6IGZhbHNlLFxuICAgIH0sXG4gICAgcmVxdWVzdENvbnRleHQoc2lnbmFsKSxcbiAgKTtcbiAgcmV0dXJuIHBhcnNlUmVzcG9uc2Uoc2NoZW1hLCBwYXRoLCByZXMpO1xufVxuXG4vKiogUE9TVCBoZWxwZXIgZm9yIGNyZWF0ZSAvIG11dGF0ZSBjYWxsczsgdmFsaWRhdGVzIHRoZSBKU09OIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SnNvbjxUPihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGF0aDogc3RyaW5nLFxuICBzY2hlbWE6IHouWm9kVHlwZTxUPixcbiAgYm9keTogdW5rbm93bixcbiAgcXVlcnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCByZXMgPSBhd2FpdCB3cy5hcGlDbGllbnQucmVxdWVzdChcbiAgICB7XG4gICAgICBwYXRoLFxuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIHF1ZXJ5LFxuICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe1xuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIH0pLFxuICAgICAgcmF3OiBmYWxzZSxcbiAgICAgIHBheWxvYWQ6IGJvZHksXG4gICAgfSxcbiAgICByZXF1ZXN0Q29udGV4dChzaWduYWwpLFxuICApO1xuICByZXR1cm4gcGFyc2VSZXNwb25zZShzY2hlbWEsIHBhdGgsIHJlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9qZWN0cyh3czogV29ya3NwYWNlQ2xpZW50LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UHJvamVjdFtdPiB7XG4gIGNvbnN0IHJlcyA9IGF3YWl0IGdldEpzb24od3MsIGAke0FQSV9CQVNFfS9wcm9qZWN0c2AsIGxpc3RSZXNwb25zZVNjaGVtYSwgc2lnbmFsKTtcbiAgcmV0dXJuIHJlcy5wcm9qZWN0cyA/PyBbXTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdEJyYW5jaGVzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxCcmFuY2hbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzYCxcbiAgICBsaXN0UmVzcG9uc2VTY2hlbWEsXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gcmVzLmJyYW5jaGVzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RW5kcG9pbnRzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnRbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9lbmRwb2ludHNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZW5kcG9pbnRzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0RGF0YWJhc2VzKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RGF0YWJhc2VbXT4ge1xuICBjb25zdCByZXMgPSBhd2FpdCBnZXRKc29uKFxuICAgIHdzLFxuICAgIGAke0FQSV9CQVNFfS9wcm9qZWN0cy8ke3Byb2plY3R9L2JyYW5jaGVzLyR7YnJhbmNofS9kYXRhYmFzZXNgLFxuICAgIGxpc3RSZXNwb25zZVNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiByZXMuZGF0YWJhc2VzID8/IFtdO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRFbmRwb2ludChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgcmV0dXJuIGdldEpzb24oXG4gICAgd3MsXG4gICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzLyR7cHJvamVjdH0vYnJhbmNoZXMvJHticmFuY2h9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YCxcbiAgICBlbmRwb2ludFNjaGVtYSxcbiAgICBzaWduYWwsXG4gICk7XG59XG5cbi8qKlxuICogU2NhbiB0aGUgd29ya3NwYWNlIGZvciBhbiBlbmRwb2ludCB3aG9zZSBgc3RhdHVzLmhvc3RzLmhvc3RgIG1hdGNoZXNcbiAqIHRoZSBwcm92aWRlZCBob3N0bmFtZS4gVXNlZCB0byByZWNvdmVyIHRoZSBvd25pbmcgcHJvamVjdC9icmFuY2gvXG4gKiBlbmRwb2ludCByZXNvdXJjZSBwYXRoIHdoZW4gdGhlIGNhbGxlciBvbmx5IHN1cHBsaWVkIGEgUG9zdGdyZXMgVVJJLlxuICpcbiAqIE8ocHJvamVjdHMgKiBicmFuY2hlcyAqIGVuZHBvaW50cykgLSBmaW5lIGZvciB0eXBpY2FsIHdvcmtzcGFjZXNcbiAqIChzaW5nbGUgZGlnaXRzIHBlciB0aWVyKTsgcGFnaW5hdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5vdCBmb2xsb3dlZFxuICogc2luY2UgdGhpcyBpcyBhIGJlc3QtZWZmb3J0IGZhbGxiYWNrLlxuICovXG5hc3luYyBmdW5jdGlvbiBmaW5kRW5kcG9pbnRCeUhvc3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIGhvc3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHsgcHJvamVjdDogc3RyaW5nOyBicmFuY2g6IHN0cmluZzsgZW5kcG9pbnQ6IHN0cmluZyB9IHwgbnVsbD4ge1xuICBjb25zdCBwcm9qZWN0cyA9IGF3YWl0IGxpc3RQcm9qZWN0cyh3cywgc2lnbmFsKTtcbiAgZm9yIChjb25zdCBwIG9mIHByb2plY3RzKSB7XG4gICAgY29uc3QgcHJvamVjdElkID0gcGFyc2VSZXNvdXJjZVBhdGgocC5uYW1lKS5wcm9qZWN0O1xuICAgIGlmICghcHJvamVjdElkKSBjb250aW51ZTtcbiAgICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdElkLCBzaWduYWwpO1xuICAgIGZvciAoY29uc3QgYiBvZiBicmFuY2hlcykge1xuICAgICAgY29uc3QgYnJhbmNoSWQgPSBwYXJzZVJlc291cmNlUGF0aChiLm5hbWUpLmJyYW5jaDtcbiAgICAgIGlmICghYnJhbmNoSWQpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdEVuZHBvaW50cyh3cywgcHJvamVjdElkLCBicmFuY2hJZCwgc2lnbmFsKTtcbiAgICAgIGNvbnN0IG1hdGNoID0gZW5kcG9pbnRzLmZpbmQoKGUpID0+IGUuc3RhdHVzPy5ob3N0cz8uaG9zdCA9PT0gaG9zdCk7XG4gICAgICBpZiAobWF0Y2g/Lm5hbWUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBtYXRjaGVkIGVuZHBvaW50IGJ5IGhvc3RcIiwge1xuICAgICAgICAgIGhvc3QsXG4gICAgICAgICAgZW5kcG9pbnQ6IG1hdGNoLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHByb2plY3Q6IHByb2plY3RJZCxcbiAgICAgICAgICBicmFuY2g6IGJyYW5jaElkLFxuICAgICAgICAgIGVuZHBvaW50OiBtYXRjaC5uYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IG5vIGVuZHBvaW50IG1hdGNoZWQgaG9zdFwiLCB7IGhvc3QgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHByb2plY3QgdG8gdXNlLCBvciBjcmVhdGUgb25lIHdoZW4gdGhlIHdvcmtzcGFjZSBpcyBlbXB0eS5cbiAqXG4gKiBTZWxlY3Rpb24gb3JkZXI6XG4gKiAxLiBFeGFjdGx5IG9uZSBwcm9qZWN0IGxpc3RlZCAtPiB1c2UgaXQuXG4gKiAyLiBaZXJvIHByb2plY3RzIEFORCBgYXV0b0NyZWF0ZSAhPT0gZmFsc2VgIC0+IGVuc3VyZSBhIHByb2plY3Qgd2l0aFxuICogICAgdGhlIHJlc29sdmVkIGlkIGV4aXN0cywgdGhlbiByZXR1cm4gaXRzIGlkLlxuICogMy4gWmVybyBwcm9qZWN0cyBBTkQgYGF1dG9DcmVhdGUgPT09IGZhbHNlYCAtPiB0aHJvdy5cbiAqIDQuIE11bHRpcGxlIHByb2plY3RzIC0+IHRocm93IHdpdGggdGhlIGNhbmRpZGF0ZSBsaXN0IChzZXRcbiAqICAgIGBjb25maWcucHJvamVjdGAgb3IgcGluIGEgcHJvamVjdCBpZCBpbiBgTEFLRUJBU0VfRU5EUE9JTlRgKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja09yQ3JlYXRlUHJvamVjdChcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgYXV0b0NyZWF0ZTogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgcHJvamVjdHMgPSBhd2FpdCBsaXN0UHJvamVjdHMod3MsIHNpZ25hbCk7XG4gIGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpZCA9IHBhcnNlUmVzb3VyY2VQYXRoKHByb2plY3RzWzBdIS5uYW1lKS5wcm9qZWN0O1xuICAgIGlmIChpZCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiB1c2luZyBvbmx5IHByb2plY3RcIiwgeyBwcm9qZWN0OiBpZCB9KTtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChhdXRvQ3JlYXRlID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiTGFrZWJhc2UgcHJvamVjdFwiLFxuICAgICAgICBcImF1dG9DcmVhdGUgaXMgZmFsc2U7IGNyZWF0ZSBhIHByb2plY3Qgb3Igc2V0IGNvbmZpZy5wcm9qZWN0IC8gTEFLRUJBU0VfRU5EUE9JTlQuXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBpZCA9IGF1dG9DcmVhdGUgPz8gKGF3YWl0IGRlZmF1bHRQcm9qZWN0SWQoKSk7XG4gICAgcmV0dXJuIGVuc3VyZVByb2plY3Qod3MsIGlkLCBzaWduYWwpO1xuICB9XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBwcm9qZWN0c1xuICAgIC5tYXAoKHApID0+IHBhcnNlUmVzb3VyY2VQYXRoKHAubmFtZSkucHJvamVjdClcbiAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAuam9pbihcIiwgXCIpO1xuICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgXCJMYWtlYmFzZVwiLFxuICAgIGBNdWx0aXBsZSBwcm9qZWN0cyBmb3VuZDsgc2V0IGNvbmZpZy5wcm9qZWN0IG9yIHBpbiBhIHByb2plY3QgaWQgaW4gTEFLRUJBU0VfRU5EUE9JTlQuIENhbmRpZGF0ZXM6ICR7Y2FuZGlkYXRlc31gLFxuICApO1xufVxuXG4vKipcbiAqIERlcml2ZSBhIExha2ViYXNlIHByb2plY3QgaWQgZnJvbSB0aGUgaG9zdCByZXBvJ3MgYHBhY2thZ2UuanNvbmBcbiAqIG5hbWUgKHZpYSB7QGxpbmsgcHJvamVjdC5uYW1lfSkgc2x1Z2lmaWVkIHRvIHNhdGlzZnkgdGhlXG4gKiBMYWtlYmFzZSBpZCBjb25zdHJhaW50IChgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYCkuXG4gKlxuICogVGhyb3dzIHdoZW4gdGhlIHNsdWcgZW5kcyB1cCBlbXB0eSBvciBzdGFydHMgd2l0aCBhIGRpZ2l0LCBzaW5jZSB0aGVcbiAqIHNlcnZlciB3b3VsZCByZWplY3QgaXQgYW55d2F5IC0gY2FsbGVycyBzaG91bGQgcGFzcyBhbiBleHBsaWNpdFxuICogYGF1dG9DcmVhdGVgIGlkIGluIHRoYXQgY2FzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVmYXVsdFByb2plY3RJZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBuYW1lID0gcHJvamVjdC5uYW1lKCk7XG4gIGNvbnN0IHNsdWcgPSBzdHJpbmcudG9TbHVnV2l0aE9wdGlvbnMoeyBtYXhMZW5ndGg6IFBST0pFQ1RfSURfTUFYX0xFTiB9LCBuYW1lKTtcbiAgaWYgKCFzbHVnIHx8ICEvXlthLXpdLy50ZXN0KHNsdWcpKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IHByb2plY3QgbmFtZSBkb2VzIG5vdCBzbHVnaWZ5IHRvIGEgTGFrZWJhc2UgcHJvamVjdCBpZFwiLCB7IG5hbWUgfSk7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgXCJDb3VsZCBub3QgZGVyaXZlIGEgcHJvamVjdCBpZCBmcm9tIHRoZSBwYWNrYWdlIG5hbWU7IHBhc3MgYXV0b0NyZWF0ZSBleHBsaWNpdGx5LlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHNsdWc7XG59XG5cbi8qKlxuICogRW5zdXJlIGEgTGFrZWJhc2UgcHJvamVjdCB3aXRoIGBwcm9qZWN0SWRgIGV4aXN0cy4gQ3JlYXRlcyBpdCBhbmRcbiAqIHdhaXRzIGZvciB0aGUgY3JlYXRlIG9wZXJhdGlvbiB0byBjb21wbGV0ZS4gQW4gYEFMUkVBRFlfRVhJU1RTYFxuICogcmVzcG9uc2UgaXMgdHJlYXRlZCBhcyBzdWNjZXNzIC0gc29tZW9uZSBlbHNlIChhIGNvbmN1cnJlbnQgYm9vdCxcbiAqIGEgc2libGluZyBwcm9jZXNzKSB3b24gdGhlIHJhY2UgYW5kIHRoZSBwcm9qZWN0IHdlIHdhbnRlZCBpcyBub3dcbiAqIHNpdHRpbmcgdGhlcmUgcmVhZHkgZm9yIGRvd25zdHJlYW0gcGlja2Vycy5cbiAqXG4gKiBQcm9qZWN0IGNyZWF0aW9uIHR5cGljYWxseSBwcm92aXNpb25zIGEgZGVmYXVsdCBgcHJvZHVjdGlvbmAgYnJhbmNoXG4gKiBhbG9uZ3NpZGU7IGRvd25zdHJlYW0gcGlja2VycyBoYW5kbGUgdGhlIHJlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZVByb2plY3QoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3RJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBubyBwcm9qZWN0cyBmb3VuZDsgY3JlYXRpbmdcIiwgeyBwcm9qZWN0OiBwcm9qZWN0SWQgfSk7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3AgPSBhd2FpdCBwb3N0SnNvbihcbiAgICAgIHdzLFxuICAgICAgYCR7QVBJX0JBU0V9L3Byb2plY3RzYCxcbiAgICAgIG9wZXJhdGlvblNjaGVtYSxcbiAgICAgIHsgc3BlYzogeyBwZ192ZXJzaW9uOiBERUZBVUxUX1BHX1ZFUlNJT04gfSB9LFxuICAgICAgeyBwcm9qZWN0X2lkOiBwcm9qZWN0SWQgfSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIGF3YWl0IHdhaXRGb3JPcGVyYXRpb24od3MsIG9wLCBzaWduYWwpO1xuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBjcmVhdGVkIHByb2plY3RcIiwgeyBwcm9qZWN0OiBwcm9qZWN0SWQgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICghaXNBbHJlYWR5RXhpc3RzRXJyb3IoZXJyKSkgdGhyb3cgZXJyO1xuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBwcm9qZWN0IGFscmVhZHkgZXhpc3RzIChyYWNlKTsgcHJvY2VlZGluZ1wiLCB7XG4gICAgICBwcm9qZWN0OiBwcm9qZWN0SWQsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3RJZDtcbn1cblxuLyoqXG4gKiBSZWNvZ25pemUgdGhlIERhdGFicmlja3MgU0RLJ3MgYEFMUkVBRFlfRVhJU1RTYCBmYWlsdXJlIG1vZGVzIHNvIGFcbiAqIGxvc3QgcmFjZSBkdXJpbmcgYGVuc3VyZVByb2plY3RgIGJlY29tZXMgYSBuby1vcCBpbnN0ZWFkIG9mIGFuIGVycm9yLlxuICpcbiAqIFRoZSBTREsgdGhyb3dzIGBBcGlFcnJvciB7IGVycm9yQ29kZSwgc3RhdHVzQ29kZSB9YCBmb3Igc3RydWN0dXJlZFxuICogc2VydmVyIGVycm9ycyBhbmQgYEh0dHBFcnJvciB7IGNvZGUgfWAgZm9yIHRyYW5zcG9ydC1sYXllciA0eHgvNXh4LlxuICogQm90aCBzdXJmYWNlIGEgaHVtYW4gbWVzc2FnZSB0aGF0IG9mdGVuIGNhcnJpZXMgXCJhbHJlYWR5IGV4aXN0c1wiIHNvXG4gKiB3ZSB1c2UgdGhhdCBhcyBhIGZpbmFsIGZhbGxiYWNrIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkuXG4gKi9cbmZ1bmN0aW9uIGlzQWxyZWFkeUV4aXN0c0Vycm9yKGVycm9yOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghZXJyb3IgfHwgdHlwZW9mIGVycm9yICE9PSBcIm9iamVjdFwiKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGUgPSBlcnJvciBhcyB7XG4gICAgc3RhdHVzQ29kZT86IG51bWJlcjtcbiAgICBjb2RlPzogbnVtYmVyO1xuICAgIGVycm9yQ29kZT86IHN0cmluZztcbiAgICBtZXNzYWdlPzogc3RyaW5nO1xuICB9O1xuICBpZiAoZS5zdGF0dXNDb2RlID09PSA0MDkgfHwgZS5jb2RlID09PSA0MDkpIHJldHVybiB0cnVlO1xuICBpZiAoZS5lcnJvckNvZGUgJiYgL2FscmVhZHkuP2V4aXN0cy9pLnRlc3QoZS5lcnJvckNvZGUpKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGUubWVzc2FnZSAmJiAvYWxyZWFkeS4/ZXhpc3RzL2kudGVzdChlLm1lc3NhZ2UpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJlZHVjZSBhIExha2ViYXNlIG9wZXJhdGlvbiBmYWlsdXJlIHRvIGFuIGVycm9yIHNhZmUgdG8gcHJvcGFnYXRlOiB0aGVcbiAqIG9wZXJhdGlvbiBuYW1lIHBsdXMgd2hhdGV2ZXIgY29kZSB0aGUgcGF5bG9hZCBjYXJyaWVzLiBUaGUgcGF5bG9hZCBpdHNlbGYgY2FuXG4gKiBlY2hvIHJlcXVlc3QgY29udGV4dCwgc28gaXQgZ29lcyB0byB0aGUgbG9nIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIG9wZXJhdGlvbkZhaWxlZChvcE5hbWU6IHN0cmluZywgb3BFcnJvcjogdW5rbm93bik6IEV4ZWN1dGlvbkVycm9yIHtcbiAgbG9nZ2VyLmVycm9yKFwiYXV0b3BnOiBvcGVyYXRpb24gZmFpbGVkXCIsIHsgb3BlcmF0aW9uOiBvcE5hbWUsIGVycm9yOiBvcEVycm9yIH0pO1xuICBjb25zdCBjb2RlID0gb2JqZWN0LmlzUmVjb3JkKG9wRXJyb3IpID8gKG9wRXJyb3IuY29kZSA/PyBvcEVycm9yLnJlYXNvbikgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIG9wZXJhdGlvbiBmYWlsZWQ6ICR7b3BOYW1lfWAsIHtcbiAgICBjb250ZXh0OiB7XG4gICAgICBvcGVyYXRpb246IG9wTmFtZSxcbiAgICAgIGVycm9yQ29kZTogdHlwZW9mIGNvZGUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGNvZGUgPT09IFwibnVtYmVyXCIgPyBTdHJpbmcoY29kZSkgOiBcInVua25vd25cIixcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQb2xsIGEgTGFrZWJhc2UgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiB1bnRpbCBgZG9uZTogdHJ1ZWAuIFJldHVybnNcbiAqIHRoZSBmaW5hbCBvcGVyYXRpb24gZW52ZWxvcGUgKHdoaWNoIG1heSBjYXJyeSBgcmVzcG9uc2VgIG9yIGBlcnJvcmApLlxuICpcbiAqIFRocm93cyB3aGVuOlxuICogICAtIHRoZSByZXNwb25zZSBjYXJyaWVzIGFuIGBlcnJvcmAgZmllbGQ7XG4gKiAgIC0gYG9wLm5hbWVgIGlzIG1pc3NpbmcgKG5vdGhpbmcgdG8gcG9sbCk7XG4gKiAgIC0gdGhlIHRpbWVvdXQgZWxhcHNlcyBiZWZvcmUgYGRvbmU6IHRydWVgO1xuICogICAtIGBzaWduYWxgIGFib3J0cyBtaWQtd2FpdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2FpdEZvck9wZXJhdGlvbihcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgb3A6IE9wZXJhdGlvbixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPE9wZXJhdGlvbj4ge1xuICBpZiAob3AuZG9uZSkge1xuICAgIGlmIChvcC5lcnJvcikge1xuICAgICAgdGhyb3cgb3BlcmF0aW9uRmFpbGVkKG9wLm5hbWUgPz8gXCJ1bmtub3duXCIsIG9wLmVycm9yKTtcbiAgICB9XG4gICAgcmV0dXJuIG9wO1xuICB9XG4gIGNvbnN0IG9wTmFtZSA9IG9wLm5hbWU7XG4gIGlmICghb3BOYW1lKSB7XG4gICAgdGhyb3cgRXhlY3V0aW9uRXJyb3IubWlzc2luZ0RhdGEoXCJvcGVyYXRpb24gbmFtZVwiKTtcbiAgfVxuICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBEYXRlLm5vdygpIC0gc3RhcnQgPCBPUEVSQVRJT05fVElNRU9VVF9NUzsgYXR0ZW1wdCsrKSB7XG4gICAgYXdhaXQgcG9sbERlbGF5KGF0dGVtcHQsIE9QRVJBVElPTl9QT0xMX01TLCBzaWduYWwpO1xuICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRKc29uKHdzLCBgJHtBUElfQkFTRX0vJHtvcE5hbWV9YCwgb3BlcmF0aW9uU2NoZW1hLCBzaWduYWwpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogb3BlcmF0aW9uIHN0YXR1c1wiLCB7IG9wOiBvcE5hbWUsIGRvbmU6IGN1cnJlbnQuZG9uZSB9KTtcbiAgICBpZiAoY3VycmVudC5kb25lKSB7XG4gICAgICBpZiAoY3VycmVudC5lcnJvcikge1xuICAgICAgICB0aHJvdyBvcGVyYXRpb25GYWlsZWQob3BOYW1lLCBjdXJyZW50LmVycm9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoYExha2ViYXNlIG9wZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlOiAke29wTmFtZX1gLCB7XG4gICAgY29udGV4dDogeyBvcGVyYXRpb246IG9wTmFtZSwgdGltZW91dE1zOiBPUEVSQVRJT05fVElNRU9VVF9NUyB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQb2xsIGBnZXRFbmRwb2ludGAgdW50aWwgdGhlIGNvbXB1dGUgcmVwb3J0cyBhIHVzYWJsZVxuICogYHN0YXR1cy5jdXJyZW50X3N0YXRlYC4gYFJFQURZYCBhbmQgYElETEVgIGFyZSBib3RoIGFjY2VwdGFibGUgLVxuICogYElETEVgIGp1c3QgbWVhbnMgdGhlIGNvbXB1dGUgaGFzIHNjYWxlZCB0byB6ZXJvIGJ1dCBhIGNvbm5lY3Rpb25cbiAqIHdpbGwgd2FrZSBpdC4gUmV0dXJucyB0aGUgZmluYWwgZW5kcG9pbnQgcGF5bG9hZCAod2l0aCBgaG9zdHMuaG9zdGApLlxuICovXG5hc3luYyBmdW5jdGlvbiB3YWl0RW5kcG9pbnRSZWFkeShcbiAgd3M6IFdvcmtzcGFjZUNsaWVudCxcbiAgcHJvamVjdDogc3RyaW5nLFxuICBicmFuY2g6IHN0cmluZyxcbiAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8RW5kcG9pbnQ+IHtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgbGFzdDogRW5kcG9pbnQgfCBudWxsID0gbnVsbDtcbiAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IERhdGUubm93KCkgLSBzdGFydCA8IEVORFBPSU5UX1JFQURZX1RJTUVPVVRfTVM7IGF0dGVtcHQrKykge1xuICAgIGxhc3QgPSBhd2FpdCBnZXRFbmRwb2ludCh3cywgcHJvamVjdCwgYnJhbmNoLCBlbmRwb2ludElkLCBzaWduYWwpO1xuICAgIGNvbnN0IHN0YXRlID0gbGFzdC5zdGF0dXM/LmN1cnJlbnRfc3RhdGU7XG4gICAgaWYgKHN0YXRlICYmIENPTk5FQ1RBQkxFX0VORFBPSU5UX1NUQVRFUy5oYXMoc3RhdGUpKSByZXR1cm4gbGFzdDtcbiAgICBpZiAobGFzdC5zdGF0dXM/Lmhvc3RzPy5ob3N0ICYmIHN0YXRlICE9PSBJTklUSUFMSVpJTkdfRU5EUE9JTlRfU1RBVEUpIHtcbiAgICAgIC8vIENvbXB1dGUgaXMgaW4gc29tZSBvdGhlciBzdGF0ZSAoU1RBUlRJTkcsIGV0Yy4pIGJ1dCBob3N0bmFtZSBpc1xuICAgICAgLy8gYWxyZWFkeSBwdWJsaXNoZWQgLSBnb29kIGVub3VnaCB0byBjb25uZWN0OyBsYWtlYmFzZSdzIE9BdXRoXG4gICAgICAvLyB0b2tlbiByZXF1ZXN0IHdpbGwgd2FrZSBpdC5cbiAgICAgIHJldHVybiBsYXN0O1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHdhaXRpbmcgZm9yIGVuZHBvaW50XCIsIHsgZW5kcG9pbnRJZCwgc3RhdGUgfSk7XG4gICAgYXdhaXQgcG9sbERlbGF5KGF0dGVtcHQsIEVORFBPSU5UX1JFQURZX1BPTExfTVMsIHNpZ25hbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBMYWtlYmFzZSBlbmRwb2ludCBkaWQgbm90IGJlY29tZSByZWFkeTogJHtlbmRwb2ludElkfWAsIHtcbiAgICBjb250ZXh0OiB7XG4gICAgICBwcm9qZWN0LFxuICAgICAgYnJhbmNoLFxuICAgICAgZW5kcG9pbnRJZCxcbiAgICAgIHRpbWVvdXRNczogRU5EUE9JTlRfUkVBRFlfVElNRU9VVF9NUyxcbiAgICAgIGxhc3RTdGF0ZTogbGFzdD8uc3RhdHVzPy5jdXJyZW50X3N0YXRlID8/IFwidW5rbm93blwiLFxuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIGRlZmF1bHQgYnJhbmNoIGZvciBhIHByb2plY3QuIFByZWZlcnMgdGhlIGJyYW5jaCBmbGFnZ2VkXG4gKiBgc3RhdHVzLmRlZmF1bHQ6IHRydWVgIChzZXJ2ZXItc2lkZSBkZWZhdWx0LCB0eXBpY2FsbHkgYHByb2R1Y3Rpb25gXG4gKiB1bmxlc3MgdGhlIHByb2plY3Qgb3duZXIgY2hhbmdlZCBpdCkuIEZhbGxzIGJhY2sgdG8gdGhlIG9ubHkgYnJhbmNoXG4gKiB3aGVuIHRoZXJlJ3MgZXhhY3RseSBvbmUuIE90aGVyd2lzZSB0aHJvd3Mgd2l0aCB0aGUgY2FuZGlkYXRlIGxpc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBpY2tCcmFuY2goXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBicmFuY2hlcyA9IGF3YWl0IGxpc3RCcmFuY2hlcyh3cywgcHJvamVjdCwgc2lnbmFsKTtcbiAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYExha2ViYXNlIGJyYW5jaCBpbiBwcm9qZWN0ICcke3Byb2plY3R9J2AsXG4gICAgICBcIlRoZSBwcm9qZWN0IGhhcyBubyBicmFuY2hlczsgY3JlYXRlIG9uZSBvciBzZXQgY29uZmlnLmJyYW5jaC5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZsYWdnZWQgPSBicmFuY2hlcy5maW5kKChiKSA9PiBiLnN0YXR1cz8uZGVmYXVsdCA9PT0gdHJ1ZSk7XG4gIGNvbnN0IGNob2ljZSA9XG4gICAgcGFyc2VSZXNvdXJjZVBhdGgoZmxhZ2dlZD8ubmFtZSkuYnJhbmNoID8/XG4gICAgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMSA/IHBhcnNlUmVzb3VyY2VQYXRoKGJyYW5jaGVzWzBdIS5uYW1lKS5icmFuY2ggOiB1bmRlZmluZWQpO1xuICBpZiAoIWNob2ljZSkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBicmFuY2hlc1xuICAgICAgLm1hcCgoYikgPT4gcGFyc2VSZXNvdXJjZVBhdGgoYi5uYW1lKS5icmFuY2gpXG4gICAgICAuZmlsdGVyKChpZCk6IGlkIGlzIHN0cmluZyA9PiBCb29sZWFuKGlkKSlcbiAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgYFByb2plY3QgJyR7cHJvamVjdH0nIGhhcyBtdWx0aXBsZSBicmFuY2hlcyBhbmQgbm9uZSBtYXJrZWQgZGVmYXVsdDsgc2V0IGNvbmZpZy5icmFuY2ggb3IgaW5jbHVkZSB0aGUgYnJhbmNoIGluIExBS0VCQVNFX0VORFBPSU5ULiBDYW5kaWRhdGVzOiAke2NhbmRpZGF0ZXN9YCxcbiAgICApO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogcmVzb2x2ZWQgYnJhbmNoXCIsIHsgcHJvamVjdCwgYnJhbmNoOiBjaG9pY2UgfSk7XG4gIHJldHVybiBjaG9pY2U7XG59XG5cbi8qKlxuICogUGljayB0aGUgcHJpbWFyeSBlbmRwb2ludCBmb3IgYSAocHJvamVjdCwgYnJhbmNoKS4gUHJlZmVyc1xuICogYHN0YXR1cy5lbmRwb2ludF90eXBlID09PSBFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEVgOyBmYWxscyBiYWNrIHRvXG4gKiB0aGUgb25seSBlbmRwb2ludCB3aGVuIHRoZXJlJ3MgZXhhY3RseSBvbmUuIFJldHVybnMgYHsgbmFtZSwgaG9zdCB9YFxuICogc28gdGhlIGNhbGxlciBjYW4gcG9wdWxhdGUgYm90aCBgTEFLRUJBU0VfRU5EUE9JTlRgIGFuZCBgUEdIT1NUYFxuICogZnJvbSBhIHNpbmdsZSBjYWxsLlxuICovXG5hc3luYyBmdW5jdGlvbiBwaWNrRW5kcG9pbnQoXG4gIHdzOiBXb3Jrc3BhY2VDbGllbnQsXG4gIHByb2plY3Q6IHN0cmluZyxcbiAgYnJhbmNoOiBzdHJpbmcsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgaG9zdD86IHN0cmluZyB9PiB7XG4gIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGxpc3RFbmRwb2ludHMod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgaWYgKGVuZHBvaW50cy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBMYWtlYmFzZSBlbmRwb2ludCBpbiAncHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0nYCxcbiAgICAgIFwiVGhlIGJyYW5jaCBoYXMgbm8gZW5kcG9pbnRzOyBjcmVhdGUgb25lIG9yIHNldCBMQUtFQkFTRV9FTkRQT0lOVC5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IHByaW1hcnkgPVxuICAgIGVuZHBvaW50cy5maW5kKChlKSA9PiBlLnN0YXR1cz8uZW5kcG9pbnRfdHlwZSA9PT0gUkVBRF9XUklURV9FTkRQT0lOVF9UWVBFKSA/P1xuICAgIChlbmRwb2ludHMubGVuZ3RoID09PSAxID8gZW5kcG9pbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgaWYgKCFwcmltYXJ5Py5uYW1lKSB7XG4gICAgY29uc3QgbmFtZXMgPSBlbmRwb2ludHMubWFwKChlKSA9PiBlLm5hbWUpLmZpbHRlcihCb29sZWFuKTtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IuaW52YWxpZENvbm5lY3Rpb24oXG4gICAgICBcIkxha2ViYXNlXCIsXG4gICAgICBgQnJhbmNoIGhhcyBubyBwcmltYXJ5IHJlYWQtd3JpdGUgZW5kcG9pbnQ7IHNldCBMQUtFQkFTRV9FTkRQT0lOVCBvciBjb25maWcuZW5kcG9pbnQuIENhbmRpZGF0ZXM6ICR7bmFtZXMuam9pbihcIiwgXCIpfWAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBob3N0ID0gcHJpbWFyeS5zdGF0dXM/Lmhvc3RzPy5ob3N0O1xuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGVuZHBvaW50XCIsIHsgZW5kcG9pbnQ6IHByaW1hcnkubmFtZSwgaG9zdCB9KTtcbiAgcmV0dXJuIHsgbmFtZTogcHJpbWFyeS5uYW1lLCBob3N0IH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZGVmYXVsdCBwb3N0Z3JlcyBkYXRhYmFzZSBmb3IgYSAocHJvamVjdCwgYnJhbmNoKS4gVGhlXG4gKiBQb3N0Z3JlcyBkYXRhYmFzZSBOQU1FIChgc3RhdHVzLnBvc3RncmVzX2RhdGFiYXNlYCkgaXMgd2hhdFxuICogYFBHREFUQUJBU0VgIG5lZWRzIC0gdGhpcyBkaWZmZXJzIGZyb20gdGhlIHJlc291cmNlIGlkLCB3aGljaCBjYW5cbiAqIHVzZSBhIGRpZmZlcmVudCBzZXBhcmF0b3IgKGUuZy4gcmVzb3VyY2UgYGRhdGFicmlja3MtcG9zdGdyZXNgXG4gKiBzdXJmYWNlcyBhcyBkYXRhYmFzZSBgZGF0YWJyaWNrc19wb3N0Z3Jlc2ApLiBQcmVmZXJzXG4gKiBgZGF0YWJyaWNrc19wb3N0Z3Jlc2AgKHRoZSBMYWtlYmFzZSBkZWZhdWx0KSwgb3RoZXJ3aXNlIHRoZSBvbmx5XG4gKiBkYXRhYmFzZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGlja0RhdGFiYXNlKFxuICB3czogV29ya3NwYWNlQ2xpZW50LFxuICBwcm9qZWN0OiBzdHJpbmcsXG4gIGJyYW5jaDogc3RyaW5nLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGRhdGFiYXNlcyA9IGF3YWl0IGxpc3REYXRhYmFzZXMod3MsIHByb2plY3QsIGJyYW5jaCwgc2lnbmFsKTtcbiAgaWYgKGRhdGFiYXNlcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBMYWtlYmFzZSBkYXRhYmFzZSBpbiAncHJvamVjdHMvJHtwcm9qZWN0fS9icmFuY2hlcy8ke2JyYW5jaH0nYCxcbiAgICAgIFwiVGhlIGJyYW5jaCBoYXMgbm8gZGF0YWJhc2VzOyBjcmVhdGUgb25lIG9yIHNldCBQR0RBVEFCQVNFLlwiLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBkYXRhYmFzZXNcbiAgICAubWFwKChkKSA9PiBkLnN0YXR1cz8ucG9zdGdyZXNfZGF0YWJhc2UpXG4gICAgLmZpbHRlcigobik6IG4gaXMgc3RyaW5nID0+IEJvb2xlYW4obikpO1xuICBjb25zdCBjaG9pY2UgPVxuICAgIG5hbWVzLmZpbmQoKG4pID0+IG4gPT09IERFRkFVTFRfREFUQUJBU0UpID8/IChuYW1lcy5sZW5ndGggPT09IDEgPyBuYW1lc1swXSA6IHVuZGVmaW5lZCk7XG4gIGlmICghY2hvaWNlKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLmludmFsaWRDb25uZWN0aW9uKFxuICAgICAgXCJMYWtlYmFzZVwiLFxuICAgICAgYE11bHRpcGxlIGRhdGFiYXNlcyBhbmQgbm8gJyR7REVGQVVMVF9EQVRBQkFTRX0nOyBzZXQgUEdEQVRBQkFTRSBvciBjb25maWcuZGF0YWJhc2UuIENhbmRpZGF0ZXM6ICR7bmFtZXMuam9pbihcIiwgXCIpfWAsXG4gICAgKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHJlc29sdmVkIGRhdGFiYXNlXCIsIHsgZGF0YWJhc2U6IGNob2ljZSB9KTtcbiAgcmV0dXJuIGNob2ljZTtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/appkit.ts","../src/config.ts","../src/create-app.ts","../src/databricks.ts","../src/identity.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/appkit.ts","../src/config.ts","../src/create-app.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
|