@dbx-tools/appkit 0.6.57 → 0.6.59
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 +39 -12
- package/lib/src/create-app.d.ts +8 -0
- package/lib/src/create-app.js +6 -10
- package/lib/src/lakebase-resolver.d.ts +30 -0
- package/lib/src/lakebase-resolver.js +36 -2
- package/package.json +3 -3
- package/src/create-app.ts +13 -12
- package/src/lakebase-resolver.ts +38 -0
package/README.md
CHANGED
|
@@ -86,6 +86,22 @@ const resolved = await lakebaseResolver.resolveLakebaseConnection({
|
|
|
86
86
|
lakebaseResolver.applyLakebaseToEnv(resolved);
|
|
87
87
|
```
|
|
88
88
|
|
|
89
|
+
`applyLakebaseEnv()` does both steps and applies the COMPLETE set a Postgres pool
|
|
90
|
+
needs, `PGUSER` included — it is what auto-configuration itself calls, so a caller
|
|
91
|
+
outside `createApp` gets the same env rather than a hand-rolled subset:
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
const { resolved, user } = await lakebaseResolver.applyLakebaseEnv({ autoCreate: false });
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Reach for it when something other than the `lakebase()` plugin needs a working
|
|
98
|
+
pool. AppKit's PERSISTENT cache is the common case: it builds its own pool from
|
|
99
|
+
env, and `createLakebasePool()` throws unless `LAKEBASE_ENDPOINT`, `PGHOST`,
|
|
100
|
+
`PGDATABASE`, and a username are all present — while a Databricks App `postgres`
|
|
101
|
+
resource binding supplies only the first. Miss one and the cache degrades silently
|
|
102
|
+
to in-memory. `@dbx-tools/cli-tunnel`'s OTP gate calls this for exactly that
|
|
103
|
+
reason.
|
|
104
|
+
|
|
89
105
|
## Configuration
|
|
90
106
|
|
|
91
107
|
`createApp.createApp()` accepts everything AppKit's `createApp` does, plus:
|
|
@@ -94,6 +110,16 @@ lakebaseResolver.applyLakebaseToEnv(resolved);
|
|
|
94
110
|
| --------------- | ------------------------------- | ------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
95
111
|
| `autoConfigure` | `"provision" \| "env" \| false` | `"provision"` | What to run before AppKit boots. `"provision"` resolves the Lakebase connection into `process.env` and grants the AppKit cache schema; `"env"` resolves the connection only; `false` skips auto-configuration. Omit it to gate the default on a `lakebase` plugin being registered, or set it explicitly to run regardless. |
|
|
96
112
|
|
|
113
|
+
Set `autoConfigure` explicitly on an app that registers no `lakebase()` plugin but
|
|
114
|
+
still wants AppKit's PERSISTENT cache. AppKit only chooses Lakebase for
|
|
115
|
+
`CacheManager` when it can build a pool, and that reads `LAKEBASE_ENDPOINT`,
|
|
116
|
+
`PGHOST`, and `PGDATABASE` from `process.env` — while a Databricks App `postgres`
|
|
117
|
+
resource binding supplies only the first. Without the resolution step the cache
|
|
118
|
+
degrades silently to in-memory, so anything it holds (a session signing key, a
|
|
119
|
+
one-time code) is lost on every restart. `"env"` is the right mode inside a
|
|
120
|
+
deployed app, since the app service principal cannot grant on the cache schema
|
|
121
|
+
anyway.
|
|
122
|
+
|
|
97
123
|
`lakebaseResolver.resolveLakebaseConnection()` accepts:
|
|
98
124
|
|
|
99
125
|
| Option | Type | Default | Description |
|
|
@@ -120,7 +146,8 @@ Environment variables read during resolution:
|
|
|
120
146
|
|
|
121
147
|
Resolved values are written back to `process.env` by
|
|
122
148
|
`lakebaseResolver.applyLakebaseToEnv()`, which never overwrites a variable that
|
|
123
|
-
is already set.
|
|
149
|
+
is already set. That function covers everything except `PGUSER`, which needs an
|
|
150
|
+
await; `lakebaseResolver.applyLakebaseEnv()` resolves and applies the full set.
|
|
124
151
|
|
|
125
152
|
## Resolve Local And Bundle Config
|
|
126
153
|
|
|
@@ -288,17 +315,17 @@ is shared. `@dbx-tools/appkit-mastra` exposes this as its `genieIdentity` option
|
|
|
288
315
|
|
|
289
316
|
## Modules
|
|
290
317
|
|
|
291
|
-
| Module | Responsibility
|
|
292
|
-
| ------------------ |
|
|
293
|
-
| `createApp` | `createApp()` wrapper and `autoConfigure()`.
|
|
294
|
-
| `lakebaseResolver` | Lakebase connection discovery, default picking, optional auto-create, and env application. |
|
|
295
|
-
| `pgaddress` | Permissive Lakebase/Postgres address parser.
|
|
296
|
-
| `config` | Local/env/bundle/app-yaml config lookup.
|
|
297
|
-
| `appkit` | Execution context lookup and initialization.
|
|
298
|
-
| `databricks` | App env detection and SDK context cancellation adapters.
|
|
299
|
-
| `plugin` | Typed AppKit plugin data, instance, and required-instance lookup.
|
|
300
|
-
| `provision` | Cache schema provisioning helpers.
|
|
301
|
-
| `identity` | OBO-vs-service-principal request identity: modes, resolution, and the forwarded headers.
|
|
318
|
+
| Module | Responsibility |
|
|
319
|
+
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
320
|
+
| `createApp` | `createApp()` wrapper and `autoConfigure()`. |
|
|
321
|
+
| `lakebaseResolver` | Lakebase connection discovery, default picking, optional auto-create, and env application (`applyLakebaseEnv()` for the full set a pool needs). |
|
|
322
|
+
| `pgaddress` | Permissive Lakebase/Postgres address parser. |
|
|
323
|
+
| `config` | Local/env/bundle/app-yaml config lookup. |
|
|
324
|
+
| `appkit` | Execution context lookup and initialization. |
|
|
325
|
+
| `databricks` | App env detection and SDK context cancellation adapters. |
|
|
326
|
+
| `plugin` | Typed AppKit plugin data, instance, and required-instance lookup. |
|
|
327
|
+
| `provision` | Cache schema provisioning helpers. |
|
|
328
|
+
| `identity` | OBO-vs-service-principal request identity: modes, resolution, and the forwarded headers. |
|
|
302
329
|
|
|
303
330
|
The shell-facing wrapper for auto-config is
|
|
304
331
|
[`@dbx-tools/cli-appkit-env`](../../cli/appkit-env). Higher-level agent composition
|
package/lib/src/create-app.d.ts
CHANGED
|
@@ -34,6 +34,14 @@ type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
|
|
|
34
34
|
* Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
|
|
35
35
|
* set it explicitly to run regardless of the plugin list, or pass `false` to
|
|
36
36
|
* skip auto-configuration entirely.
|
|
37
|
+
*
|
|
38
|
+
* Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
|
|
39
|
+
* AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
|
|
40
|
+
* `createLakebasePool()` can build a pool, and that reads `LAKEBASE_ENDPOINT` /
|
|
41
|
+
* `PGHOST` / `PGDATABASE` straight from `process.env` - so without this step the
|
|
42
|
+
* cache silently falls back to in-memory, and anything it holds (a session
|
|
43
|
+
* signing key, a one-time code) is lost on restart. `"env"` is the right mode
|
|
44
|
+
* there: the app SP cannot grant on the cache schema anyway.
|
|
37
45
|
*/
|
|
38
46
|
export type AutoConfigureMode = "env" | "provision";
|
|
39
47
|
/** AppKit's `createApp` config plus the dbx-tools auto-configuration switch. */
|
package/lib/src/create-app.js
CHANGED
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
*
|
|
21
21
|
* @module
|
|
22
22
|
*/
|
|
23
|
-
import { createApp as appkitCreateApp
|
|
23
|
+
import { createApp as appkitCreateApp } from "@databricks/appkit";
|
|
24
24
|
import { async, log } from "@dbx-tools/shared-core";
|
|
25
|
-
import {
|
|
25
|
+
import { applyLakebaseEnv } from "./lakebase-resolver.js";
|
|
26
26
|
import { provisionCacheSchema } from "./provision.js";
|
|
27
27
|
const logger = log.logger("create-app");
|
|
28
28
|
const LAKEBASE_PLUGIN = "lakebase";
|
|
@@ -75,15 +75,11 @@ export async function autoConfigure(config, signal) {
|
|
|
75
75
|
/**
|
|
76
76
|
* Resolve Lakebase Postgres connection info, write the resolved values to
|
|
77
77
|
* `process.env`, and return the record. Used by {@link autoConfigure}; call
|
|
78
|
-
* {@link
|
|
79
|
-
*
|
|
78
|
+
* {@link applyLakebaseEnv} directly when finer control is needed (a different
|
|
79
|
+
* `autoCreate` policy, or a caller that wants the env without booting AppKit).
|
|
80
80
|
*/
|
|
81
81
|
async function autoConfigureLakebase(provision, signal) {
|
|
82
|
-
const resolved = await
|
|
83
|
-
applyLakebaseToEnv(resolved);
|
|
84
|
-
const user = await getUsernameWithApiLookup({});
|
|
85
|
-
if (user)
|
|
86
|
-
process.env.PGUSER ??= user;
|
|
82
|
+
const { resolved, user } = await applyLakebaseEnv(undefined, signal);
|
|
87
83
|
logger.info("env updated", { ...redactLakebaseConnection(resolved), user });
|
|
88
84
|
if (provision) {
|
|
89
85
|
await provisionCacheSchema(user, logger);
|
|
@@ -117,4 +113,4 @@ export async function createApp(config) {
|
|
|
117
113
|
delete appConfig.autoConfigure;
|
|
118
114
|
return appkitCreateApp(appConfig);
|
|
119
115
|
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jcmVhdGUtYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUNMLGtCQUFrQixFQUNsQix5QkFBeUIsR0FFMUIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQTZCdEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV4QyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDbkMsTUFBTSxzQkFBc0IsR0FBc0IsV0FBVyxDQUFDO0FBRTlEOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztBQUU5QyxTQUFTLFVBQVUsQ0FDakIsTUFBc0MsRUFDdEMsSUFBWTtJQUVaLE9BQU8sT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDakMsTUFBMkIsRUFDM0IsTUFBb0I7SUFFcEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLGFBQWEsSUFBSSxzQkFBc0IsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxNQUFNLEVBQUUsYUFBYSxLQUFLLFNBQVMsQ0FBQztJQUNyRCxNQUFNLHFCQUFxQixHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25CLGFBQWEsRUFBRSxJQUFJO1lBQ25CLHFCQUFxQjtZQUNyQixXQUFXLEVBQUUsS0FBSztZQUNsQixhQUFhLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7U0FDbEUsQ0FBQyxDQUFDO1FBQ0gsT0FBTztJQUNULENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBRWpGLE1BQU0sU0FBUyxHQUFHLElBQUksS0FBSyxXQUFXLENBQUM7SUFDdkMsTUFBTSxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUMvRixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxLQUFLLFVBQVUscUJBQXFCLENBQ2xDLFNBQWtCLEVBQ2xCLE1BQW1CO0lBRW5CLE1BQU0sUUFBUSxHQUFHLE1BQU0seUJBQXlCLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3BFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLE1BQU0sd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEQsSUFBSSxJQUFJO1FBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDO0lBQ3RDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxNQUFNLG9CQUFvQixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsUUFBNEI7SUFDNUQsT0FBTztRQUNMLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztRQUN6QixNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDdkIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO1FBQzNCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7UUFDbkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLE9BQU8sRUFBRSxRQUFRLENBQUMsT0FBTztLQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsU0FBUyxDQUM3QixNQUEyQjtJQUUzQixNQUFNLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDaEMsT0FBTyxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQy9CLE9BQU8sZUFBZSxDQUFJLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGBjcmVhdGVBcHBgIHdyYXBwZXI6IHJ1bnMgZGJ4LXRvb2xzIGF1dG8tY29uZmlndXJhdGlvbiwgdGhlbiBkZWxlZ2F0ZXMgdG9cbiAqIEFwcEtpdCdzIG93biBgY3JlYXRlQXBwYCB3aXRoIHRoZSBleGFjdCBzYW1lIGFyZ3VtZW50cy5cbiAqXG4gKiBEcm9wIGl0IGluIGFzIGEgb25lLWZvci1vbmUgcmVwbGFjZW1lbnQgZm9yIGBAZGF0YWJyaWNrcy9hcHBraXRgJ3NcbiAqIGBjcmVhdGVBcHBgIC0gc2FtZSBwYXJhbWV0ZXJzLCBzYW1lIHJldHVybiB0eXBlLCBmdWxsIHBsdWdpbi1leHBvcnQgaW5mZXJlbmNlXG4gKiBwcmVzZXJ2ZWQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgbGFrZWJhc2UsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqIGBgYFxuICpcbiAqIEF1dG8tY29uZmlndXJhdGlvbiBydW5zIEJFRk9SRSBkZWxlZ2F0aW5nIHNvIHBsdWdpbnMgc2VlIGEgZnVsbHkgcG9wdWxhdGVkXG4gKiBgcHJvY2Vzcy5lbnZgIGR1cmluZyB0aGVpciBzeW5jaHJvbm91cyBgc2V0dXAoKWAuIExha2ViYXNlIFBvc3RncmVzIHJ1bnMgd2hlblxuICogYSBgbGFrZWJhc2VgIHBsdWdpbiBpcyBwcmVzZW50LCBvciB3aGVuIHtAbGluayBBdXRvQ29uZmlndXJlTW9kZX0gaXMgc2V0XG4gKiBleHBsaWNpdGx5IG9uIHRoZSBjb25maWcgb2JqZWN0LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVBcHAgYXMgYXBwa2l0Q3JlYXRlQXBwLCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4vLyBBcHBLaXQncyByb290IGJhcnJlbCByZS1leHBvcnRzIGBQbHVnaW5EYXRhYCBidXQgbm90IGBQbHVnaW5NYXBgOyB0aGUgcGFja2FnZVxuLy8gcHVibGlzaGVzIHRoaXMgc3VicGF0aCBmb3IgZXhhY3RseSB0aGF0IHR5cGUuXG5pbXBvcnQgdHlwZSB7IFBsdWdpbk1hcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvZGlzdC9zaGFyZWQvc3JjL3BsdWdpblwiO1xuaW1wb3J0IHsgYXN5bmMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7XG4gIGFwcGx5TGFrZWJhc2VUb0VudixcbiAgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbixcbiAgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb24sXG59IGZyb20gXCIuL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5pbXBvcnQgeyBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3Byb3Zpc2lvbi50c1wiO1xuXG50eXBlIEFwcEtpdENyZWF0ZUFwcENvbmZpZyA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8dHlwZW9mIGFwcGtpdENyZWF0ZUFwcD5bMF0+O1xudHlwZSBBcHBLaXRQbHVnaW5zID0gTm9uTnVsbGFibGU8QXBwS2l0Q3JlYXRlQXBwQ29uZmlnW1wicGx1Z2luc1wiXT47XG5cbi8qKlxuICogV2hhdCBhdXRvLWNvbmZpZ3VyYXRpb24gZG9lcyBiZWZvcmUgQXBwS2l0IGJvb3RzLlxuICpcbiAqIC0gYFwicHJvdmlzaW9uXCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCwgdGhlblxuICogICBncmFudCB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSB0byB0aGUgY29ubmVjdGluZyByb2xlLlxuICogLSBgXCJlbnZcImA6IHJlc29sdmUgdGhlIExha2ViYXNlIGNvbm5lY3Rpb24gaW50byBgcHJvY2Vzcy5lbnZgIG9ubHkuXG4gKlxuICogT21pdCBpdCB0byBnZXQgYFwicHJvdmlzaW9uXCJgIGdhdGVkIG9uIGEgYGxha2ViYXNlYCBwbHVnaW4gYmVpbmcgcmVnaXN0ZXJlZDtcbiAqIHNldCBpdCBleHBsaWNpdGx5IHRvIHJ1biByZWdhcmRsZXNzIG9mIHRoZSBwbHVnaW4gbGlzdCwgb3IgcGFzcyBgZmFsc2VgIHRvXG4gKiBza2lwIGF1dG8tY29uZmlndXJhdGlvbiBlbnRpcmVseS5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0b0NvbmZpZ3VyZU1vZGUgPSBcImVudlwiIHwgXCJwcm92aXNpb25cIjtcblxuLyoqIEFwcEtpdCdzIGBjcmVhdGVBcHBgIGNvbmZpZyBwbHVzIHRoZSBkYngtdG9vbHMgYXV0by1jb25maWd1cmF0aW9uIHN3aXRjaC4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZUFwcENvbmZpZzxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucyA9IEFwcEtpdFBsdWdpbnM+ID0gT21pdDxcbiAgQXBwS2l0Q3JlYXRlQXBwQ29uZmlnLFxuICBcInBsdWdpbnNcIiB8IFwib25QbHVnaW5zUmVhZHlcIlxuPiAmIHtcbiAgcGx1Z2lucz86IFQ7XG4gIG9uUGx1Z2luc1JlYWR5PzogKGFwcGtpdDogUGx1Z2luTWFwPFQ+KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLyoqIEF1dG8tY29uZmlndXJhdGlvbiB0byBydW4gYmVmb3JlIEFwcEtpdCBib290cy4gRGVmYXVsdHMgdG8gYFwicHJvdmlzaW9uXCJgLiAqL1xuICBhdXRvQ29uZmlndXJlPzogQXV0b0NvbmZpZ3VyZU1vZGUgfCBmYWxzZTtcbn07XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjcmVhdGUtYXBwXCIpO1xuXG5jb25zdCBMQUtFQkFTRV9QTFVHSU4gPSBcImxha2ViYXNlXCI7XG5jb25zdCBERUZBVUxUX0FVVE9fQ09ORklHVVJFOiBBdXRvQ29uZmlndXJlTW9kZSA9IFwicHJvdmlzaW9uXCI7XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gYm9vdC10aW1lIGF1dG8tY29uZmlndXJhdGlvbi4gSXQgcnVucyBhcyB0aGUgc2VydmljZSBwcmluY2lwYWxcbiAqIGJlZm9yZSBhbnkgcGx1Z2luIGlzIGNvbnN0cnVjdGVkLCBzbyBpdCBzaXRzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3JcbiAqIGNoYWluIGFuZCBpbmhlcml0cyBubyB0aW1lb3V0LCByZXRyeSwgb3IgdGVsZW1ldHJ5IGZyb20gaXQuIFRoZSBidWRnZXQgY292ZXJzXG4gKiB0aGUgcmVzb2x2ZXIncyBvd24gd29yc3QgY2FzZSAoY3JlYXRlIGEgcHJvamVjdCwgdGhlbiB3YWl0IGZvciBpdHMgZW5kcG9pbnQpXG4gKiBwbHVzIHRoZSBjYWNoZS1zY2hlbWEgZ3JhbnRzLlxuICovXG5jb25zdCBBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TID0gMTEgKiA2MF8wMDA7XG5cbmZ1bmN0aW9uIHVzZXNQbHVnaW48VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc6IENyZWF0ZUFwcENvbmZpZzxUPiB8IHVuZGVmaW5lZCxcbiAgbmFtZTogc3RyaW5nLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKGNvbmZpZz8ucGx1Z2lucz8uc29tZSgoZW50cnkpID0+IGVudHJ5Lm5hbWUgPT09IG5hbWUpKTtcbn1cblxuLyoqXG4gKiBSdW4gZW5hYmxlZCBhdXRvLWNvbmZpZ3VyYXRpb24gc3RlcHMgd2l0aG91dCBjYWxsaW5nIEFwcEtpdCdzIGBjcmVhdGVBcHBgLlxuICpcbiAqIExha2ViYXNlIFBvc3RncmVzIHJlc29sdmVzIHdoZW4ge0BsaW5rIENyZWF0ZUFwcENvbmZpZy5hdXRvQ29uZmlndXJlfSBpcyBzZXRcbiAqIGV4cGxpY2l0bHkgb3IgYSBgbGFrZWJhc2VgIHBsdWdpbiBpcyBsaXN0ZWQgaW4gYGNvbmZpZy5wbHVnaW5zYC4gYHNpZ25hbGBcbiAqIGNhbmNlbHMgdGhlIHJlc29sdXRpb247IGl0IGlzIGNvbWJpbmVkIHdpdGggYW4gaW50ZXJuYWwgYm9vdCB0aW1lb3V0IGVpdGhlclxuICogd2F5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqXG4gKiAvLyBQb3B1bGF0ZSBQR0hPU1QgLyBQR0RBVEFCQVNFIC8gTEFLRUJBU0VfRU5EUE9JTlQgd2l0aG91dCBib290aW5nIEFwcEtpdC5cbiAqIGF3YWl0IGNyZWF0ZUFwcC5hdXRvQ29uZmlndXJlKHsgYXV0b0NvbmZpZ3VyZTogXCJlbnZcIiB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGF1dG9Db25maWd1cmU8VCBleHRlbmRzIEFwcEtpdFBsdWdpbnM+KFxuICBjb25maWc/OiBDcmVhdGVBcHBDb25maWc8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG1vZGUgPSBjb25maWc/LmF1dG9Db25maWd1cmUgPz8gREVGQVVMVF9BVVRPX0NPTkZJR1VSRTtcbiAgY29uc3QgZXhwbGljaXQgPSBjb25maWc/LmF1dG9Db25maWd1cmUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbGFrZWJhc2VQbHVnaW5QcmVzZW50ID0gdXNlc1BsdWdpbihjb25maWcsIExBS0VCQVNFX1BMVUdJTik7XG4gIGlmIChtb2RlID09PSBmYWxzZSB8fCAhKGV4cGxpY2l0IHx8IGxha2ViYXNlUGx1Z2luUHJlc2VudCkpIHtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGF1dG9Db25maWd1cmU6IG1vZGUsXG4gICAgICBsYWtlYmFzZVBsdWdpblByZXNlbnQsXG4gICAgICBwcm92aXNpb25lZDogZmFsc2UsXG4gICAgICBza2lwcGVkUmVhc29uOiBtb2RlID09PSBmYWxzZSA/IFwiZGlzYWJsZWRcIiA6IFwibm8gbGFrZWJhc2UgcGx1Z2luXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgYXN5bmMudGllQWJvcnRTaWduYWwoY29udHJvbGxlciwgQWJvcnRTaWduYWwudGltZW91dChBVVRPX0NPTkZJR1VSRV9USU1FT1VUX01TKSk7XG5cbiAgY29uc3QgcHJvdmlzaW9uID0gbW9kZSA9PT0gXCJwcm92aXNpb25cIjtcbiAgYXdhaXQgYXV0b0NvbmZpZ3VyZUxha2ViYXNlKHByb3Zpc2lvbiwgY29udHJvbGxlci5zaWduYWwpO1xuICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHsgYXV0b0NvbmZpZ3VyZTogbW9kZSwgbGFrZWJhc2VQbHVnaW5QcmVzZW50LCBwcm92aXNpb25lZDogcHJvdmlzaW9uIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgTGFrZWJhc2UgUG9zdGdyZXMgY29ubmVjdGlvbiBpbmZvLCB3cml0ZSB0aGUgcmVzb2x2ZWQgdmFsdWVzIHRvXG4gKiBgcHJvY2Vzcy5lbnZgLCBhbmQgcmV0dXJuIHRoZSByZWNvcmQuIFVzZWQgYnkge0BsaW5rIGF1dG9Db25maWd1cmV9OyBjYWxsXG4gKiB7QGxpbmsgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbn0gYW5kIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IGRpcmVjdGx5IHdoZW5cbiAqIGZpbmVyIGNvbnRyb2wgaXMgbmVlZGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlTGFrZWJhc2UoXG4gIHByb3Zpc2lvbjogYm9vbGVhbixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbih1bmRlZmluZWQsIHNpZ25hbCk7XG4gIGFwcGx5TGFrZWJhc2VUb0VudihyZXNvbHZlZCk7XG4gIGNvbnN0IHVzZXIgPSBhd2FpdCBnZXRVc2VybmFtZVdpdGhBcGlMb29rdXAoe30pO1xuICBpZiAodXNlcikgcHJvY2Vzcy5lbnYuUEdVU0VSID8/PSB1c2VyO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm9qZWN0OiByZXNvbHZlZC5wcm9qZWN0LFxuICAgIGJyYW5jaDogcmVzb2x2ZWQuYnJhbmNoLFxuICAgIGVuZHBvaW50OiByZXNvbHZlZC5lbmRwb2ludCxcbiAgICBkYXRhYmFzZTogcmVzb2x2ZWQuZGF0YWJhc2UsXG4gICAgaG9zdDogcmVzb2x2ZWQuaG9zdCxcbiAgICBwb3J0OiByZXNvbHZlZC5wb3J0LFxuICAgIHNzbE1vZGU6IHJlc29sdmVkLnNzbE1vZGUsXG4gIH07XG59XG5cbi8qKlxuICogQXV0by1jb25maWd1cmluZyBkcm9wLWluIGZvciBBcHBLaXQncyBgY3JlYXRlQXBwYDogc2FtZSBjb25maWcsIHNhbWUgdHlwZWRcbiAqIHBsdWdpbi1leHBvcnQgbWFwLCB3aXRoIHtAbGluayBhdXRvQ29uZmlndXJlfSBydW4gZmlyc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgbGFrZWJhc2UsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcDxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZz86IENyZWF0ZUFwcENvbmZpZzxUPixcbik6IFByb21pc2U8UGx1Z2luTWFwPFQ+PiB7XG4gIGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgY29uc3QgYXBwQ29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgZGVsZXRlIGFwcENvbmZpZy5hdXRvQ29uZmlndXJlO1xuICByZXR1cm4gYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG59XG4iXX0=
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jcmVhdGUtYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFFSCxPQUFPLEVBQUUsU0FBUyxJQUFJLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSWxFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLHdCQUF3QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBcUN0RCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFzQixXQUFXLENBQUM7QUFFOUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBRTlDLFNBQVMsVUFBVSxDQUNqQixNQUFzQyxFQUN0QyxJQUFZO0lBRVosT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUNqQyxNQUEyQixFQUMzQixNQUFvQjtJQUVwQixNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsYUFBYSxJQUFJLHNCQUFzQixDQUFDO0lBQzdELE1BQU0sUUFBUSxHQUFHLE1BQU0sRUFBRSxhQUFhLEtBQUssU0FBUyxDQUFDO0lBQ3JELE1BQU0scUJBQXFCLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNsRSxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxFQUFFLENBQUM7UUFDM0QsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkIsYUFBYSxFQUFFLElBQUk7WUFDbkIscUJBQXFCO1lBQ3JCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLGFBQWEsRUFBRSxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtTQUNsRSxDQUFDLENBQUM7UUFDSCxPQUFPO0lBQ1QsQ0FBQztJQUVELE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7SUFFakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLFdBQVcsQ0FBQztJQUN2QyxNQUFNLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQy9GLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILEtBQUssVUFBVSxxQkFBcUIsQ0FDbEMsU0FBa0IsRUFDbEIsTUFBbUI7SUFFbkIsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNyRSxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RSxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsTUFBTSxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxTQUFTLHdCQUF3QixDQUFDLFFBQTRCO0lBQzVELE9BQU87UUFDTCxPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87UUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1FBQ3ZCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtRQUMzQixRQUFRLEVBQUUsUUFBUSxDQUFDLFFBQVE7UUFDM0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO1FBQ25CLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtRQUNuQixPQUFPLEVBQUUsUUFBUSxDQUFDLE9BQU87S0FDMUIsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFNBQVMsQ0FDN0IsTUFBMkI7SUFFM0IsTUFBTSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBQ2hDLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQztJQUMvQixPQUFPLGVBQWUsQ0FBSSxTQUFTLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBgY3JlYXRlQXBwYCB3cmFwcGVyOiBydW5zIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24sIHRoZW4gZGVsZWdhdGVzIHRvXG4gKiBBcHBLaXQncyBvd24gYGNyZWF0ZUFwcGAgd2l0aCB0aGUgZXhhY3Qgc2FtZSBhcmd1bWVudHMuXG4gKlxuICogRHJvcCBpdCBpbiBhcyBhIG9uZS1mb3Itb25lIHJlcGxhY2VtZW50IGZvciBgQGRhdGFicmlja3MvYXBwa2l0YCdzXG4gKiBgY3JlYXRlQXBwYCAtIHNhbWUgcGFyYW1ldGVycywgc2FtZSByZXR1cm4gdHlwZSwgZnVsbCBwbHVnaW4tZXhwb3J0IGluZmVyZW5jZVxuICogcHJlc2VydmVkOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGxha2ViYXNlLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwLmNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtzZXJ2ZXIoKSwgbGFrZWJhc2UoKV0gfSk7XG4gKiBgYGBcbiAqXG4gKiBBdXRvLWNvbmZpZ3VyYXRpb24gcnVucyBCRUZPUkUgZGVsZWdhdGluZyBzbyBwbHVnaW5zIHNlZSBhIGZ1bGx5IHBvcHVsYXRlZFxuICogYHByb2Nlc3MuZW52YCBkdXJpbmcgdGhlaXIgc3luY2hyb25vdXMgYHNldHVwKClgLiBMYWtlYmFzZSBQb3N0Z3JlcyBydW5zIHdoZW5cbiAqIGEgYGxha2ViYXNlYCBwbHVnaW4gaXMgcHJlc2VudCwgb3Igd2hlbiB7QGxpbmsgQXV0b0NvbmZpZ3VyZU1vZGV9IGlzIHNldFxuICogZXhwbGljaXRseSBvbiB0aGUgY29uZmlnIG9iamVjdC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlQXBwIGFzIGFwcGtpdENyZWF0ZUFwcCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbi8vIEFwcEtpdCdzIHJvb3QgYmFycmVsIHJlLWV4cG9ydHMgYFBsdWdpbkRhdGFgIGJ1dCBub3QgYFBsdWdpbk1hcGA7IHRoZSBwYWNrYWdlXG4vLyBwdWJsaXNoZXMgdGhpcyBzdWJwYXRoIGZvciBleGFjdGx5IHRoYXQgdHlwZS5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFwIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9kaXN0L3NoYXJlZC9zcmMvcGx1Z2luXCI7XG5pbXBvcnQgeyBhc3luYywgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgYXBwbHlMYWtlYmFzZUVudiwgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb24gfSBmcm9tIFwiLi9sYWtlYmFzZS1yZXNvbHZlci50c1wiO1xuaW1wb3J0IHsgcHJvdmlzaW9uQ2FjaGVTY2hlbWEgfSBmcm9tIFwiLi9wcm92aXNpb24udHNcIjtcblxudHlwZSBBcHBLaXRDcmVhdGVBcHBDb25maWcgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBhcHBraXRDcmVhdGVBcHA+WzBdPjtcbnR5cGUgQXBwS2l0UGx1Z2lucyA9IE5vbk51bGxhYmxlPEFwcEtpdENyZWF0ZUFwcENvbmZpZ1tcInBsdWdpbnNcIl0+O1xuXG4vKipcbiAqIFdoYXQgYXV0by1jb25maWd1cmF0aW9uIGRvZXMgYmVmb3JlIEFwcEtpdCBib290cy5cbiAqXG4gKiAtIGBcInByb3Zpc2lvblwiYDogcmVzb2x2ZSB0aGUgTGFrZWJhc2UgY29ubmVjdGlvbiBpbnRvIGBwcm9jZXNzLmVudmAsIHRoZW5cbiAqICAgZ3JhbnQgdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEgdG8gdGhlIGNvbm5lY3Rpbmcgcm9sZS5cbiAqIC0gYFwiZW52XCJgOiByZXNvbHZlIHRoZSBMYWtlYmFzZSBjb25uZWN0aW9uIGludG8gYHByb2Nlc3MuZW52YCBvbmx5LlxuICpcbiAqIE9taXQgaXQgdG8gZ2V0IGBcInByb3Zpc2lvblwiYCBnYXRlZCBvbiBhIGBsYWtlYmFzZWAgcGx1Z2luIGJlaW5nIHJlZ2lzdGVyZWQ7XG4gKiBzZXQgaXQgZXhwbGljaXRseSB0byBydW4gcmVnYXJkbGVzcyBvZiB0aGUgcGx1Z2luIGxpc3QsIG9yIHBhc3MgYGZhbHNlYCB0b1xuICogc2tpcCBhdXRvLWNvbmZpZ3VyYXRpb24gZW50aXJlbHkuXG4gKlxuICogU2V0IGl0IEVYUExJQ0lUTFkgb24gYW4gYXBwIHRoYXQgaGFzIG5vIGBsYWtlYmFzZSgpYCBwbHVnaW4gYnV0IHN0aWxsIHdhbnRzXG4gKiBBcHBLaXQncyBQRVJTSVNURU5UIGNhY2hlLiBBcHBLaXQgcGlja3MgTGFrZWJhc2UgZm9yIGBDYWNoZU1hbmFnZXJgIG9ubHkgd2hlblxuICogYGNyZWF0ZUxha2ViYXNlUG9vbCgpYCBjYW4gYnVpbGQgYSBwb29sLCBhbmQgdGhhdCByZWFkcyBgTEFLRUJBU0VfRU5EUE9JTlRgIC9cbiAqIGBQR0hPU1RgIC8gYFBHREFUQUJBU0VgIHN0cmFpZ2h0IGZyb20gYHByb2Nlc3MuZW52YCAtIHNvIHdpdGhvdXQgdGhpcyBzdGVwIHRoZVxuICogY2FjaGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byBpbi1tZW1vcnksIGFuZCBhbnl0aGluZyBpdCBob2xkcyAoYSBzZXNzaW9uXG4gKiBzaWduaW5nIGtleSwgYSBvbmUtdGltZSBjb2RlKSBpcyBsb3N0IG9uIHJlc3RhcnQuIGBcImVudlwiYCBpcyB0aGUgcmlnaHQgbW9kZVxuICogdGhlcmU6IHRoZSBhcHAgU1AgY2Fubm90IGdyYW50IG9uIHRoZSBjYWNoZSBzY2hlbWEgYW55d2F5LlxuICovXG5leHBvcnQgdHlwZSBBdXRvQ29uZmlndXJlTW9kZSA9IFwiZW52XCIgfCBcInByb3Zpc2lvblwiO1xuXG4vKiogQXBwS2l0J3MgYGNyZWF0ZUFwcGAgY29uZmlnIHBsdXMgdGhlIGRieC10b29scyBhdXRvLWNvbmZpZ3VyYXRpb24gc3dpdGNoLiAqL1xuZXhwb3J0IHR5cGUgQ3JlYXRlQXBwQ29uZmlnPFQgZXh0ZW5kcyBBcHBLaXRQbHVnaW5zID0gQXBwS2l0UGx1Z2lucz4gPSBPbWl0PFxuICBBcHBLaXRDcmVhdGVBcHBDb25maWcsXG4gIFwicGx1Z2luc1wiIHwgXCJvblBsdWdpbnNSZWFkeVwiXG4+ICYge1xuICBwbHVnaW5zPzogVDtcbiAgb25QbHVnaW5zUmVhZHk/OiAoYXBwa2l0OiBQbHVnaW5NYXA8VD4pID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAvKiogQXV0by1jb25maWd1cmF0aW9uIHRvIHJ1biBiZWZvcmUgQXBwS2l0IGJvb3RzLiBEZWZhdWx0cyB0byBgXCJwcm92aXNpb25cImAuICovXG4gIGF1dG9Db25maWd1cmU/OiBBdXRvQ29uZmlndXJlTW9kZSB8IGZhbHNlO1xufTtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNyZWF0ZS1hcHBcIik7XG5cbmNvbnN0IExBS0VCQVNFX1BMVUdJTiA9IFwibGFrZWJhc2VcIjtcbmNvbnN0IERFRkFVTFRfQVVUT19DT05GSUdVUkU6IEF1dG9Db25maWd1cmVNb2RlID0gXCJwcm92aXNpb25cIjtcblxuLyoqXG4gKiBVcHBlciBib3VuZCBvbiBib290LXRpbWUgYXV0by1jb25maWd1cmF0aW9uLiBJdCBydW5zIGFzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICogYmVmb3JlIGFueSBwbHVnaW4gaXMgY29uc3RydWN0ZWQsIHNvIGl0IHNpdHMgb3V0c2lkZSBBcHBLaXQncyBpbnRlcmNlcHRvclxuICogY2hhaW4gYW5kIGluaGVyaXRzIG5vIHRpbWVvdXQsIHJldHJ5LCBvciB0ZWxlbWV0cnkgZnJvbSBpdC4gVGhlIGJ1ZGdldCBjb3ZlcnNcbiAqIHRoZSByZXNvbHZlcidzIG93biB3b3JzdCBjYXNlIChjcmVhdGUgYSBwcm9qZWN0LCB0aGVuIHdhaXQgZm9yIGl0cyBlbmRwb2ludClcbiAqIHBsdXMgdGhlIGNhY2hlLXNjaGVtYSBncmFudHMuXG4gKi9cbmNvbnN0IEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMgPSAxMSAqIDYwXzAwMDtcblxuZnVuY3Rpb24gdXNlc1BsdWdpbjxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZzogQ3JlYXRlQXBwQ29uZmlnPFQ+IHwgdW5kZWZpbmVkLFxuICBuYW1lOiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oY29uZmlnPy5wbHVnaW5zPy5zb21lKChlbnRyeSkgPT4gZW50cnkubmFtZSA9PT0gbmFtZSkpO1xufVxuXG4vKipcbiAqIFJ1biBlbmFibGVkIGF1dG8tY29uZmlndXJhdGlvbiBzdGVwcyB3aXRob3V0IGNhbGxpbmcgQXBwS2l0J3MgYGNyZWF0ZUFwcGAuXG4gKlxuICogTGFrZWJhc2UgUG9zdGdyZXMgcmVzb2x2ZXMgd2hlbiB7QGxpbmsgQ3JlYXRlQXBwQ29uZmlnLmF1dG9Db25maWd1cmV9IGlzIHNldFxuICogZXhwbGljaXRseSBvciBhIGBsYWtlYmFzZWAgcGx1Z2luIGlzIGxpc3RlZCBpbiBgY29uZmlnLnBsdWdpbnNgLiBgc2lnbmFsYFxuICogY2FuY2VscyB0aGUgcmVzb2x1dGlvbjsgaXQgaXMgY29tYmluZWQgd2l0aCBhbiBpbnRlcm5hbCBib290IHRpbWVvdXQgZWl0aGVyXG4gKiB3YXkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIC8vIFBvcHVsYXRlIFBHSE9TVCAvIFBHREFUQUJBU0UgLyBMQUtFQkFTRV9FTkRQT0lOVCB3aXRob3V0IGJvb3RpbmcgQXBwS2l0LlxuICogYXdhaXQgY3JlYXRlQXBwLmF1dG9Db25maWd1cmUoeyBhdXRvQ29uZmlndXJlOiBcImVudlwiIH0pO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXV0b0NvbmZpZ3VyZTxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZz86IENyZWF0ZUFwcENvbmZpZzxUPixcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSA/PyBERUZBVUxUX0FVVE9fQ09ORklHVVJFO1xuICBjb25zdCBleHBsaWNpdCA9IGNvbmZpZz8uYXV0b0NvbmZpZ3VyZSAhPT0gdW5kZWZpbmVkO1xuICBjb25zdCBsYWtlYmFzZVBsdWdpblByZXNlbnQgPSB1c2VzUGx1Z2luKGNvbmZpZywgTEFLRUJBU0VfUExVR0lOKTtcbiAgaWYgKG1vZGUgPT09IGZhbHNlIHx8ICEoZXhwbGljaXQgfHwgbGFrZWJhc2VQbHVnaW5QcmVzZW50KSkge1xuICAgIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwge1xuICAgICAgYXV0b0NvbmZpZ3VyZTogbW9kZSxcbiAgICAgIGxha2ViYXNlUGx1Z2luUHJlc2VudCxcbiAgICAgIHByb3Zpc2lvbmVkOiBmYWxzZSxcbiAgICAgIHNraXBwZWRSZWFzb246IG1vZGUgPT09IGZhbHNlID8gXCJkaXNhYmxlZFwiIDogXCJubyBsYWtlYmFzZSBwbHVnaW5cIixcbiAgICB9KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBhc3luYy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBzaWduYWwpO1xuICBhc3luYy50aWVBYm9ydFNpZ25hbChjb250cm9sbGVyLCBBYm9ydFNpZ25hbC50aW1lb3V0KEFVVE9fQ09ORklHVVJFX1RJTUVPVVRfTVMpKTtcblxuICBjb25zdCBwcm92aXNpb24gPSBtb2RlID09PSBcInByb3Zpc2lvblwiO1xuICBhd2FpdCBhdXRvQ29uZmlndXJlTGFrZWJhc2UocHJvdmlzaW9uLCBjb250cm9sbGVyLnNpZ25hbCk7XG4gIGxvZ2dlci5pbmZvKFwicmVhZHlcIiwgeyBhdXRvQ29uZmlndXJlOiBtb2RlLCBsYWtlYmFzZVBsdWdpblByZXNlbnQsIHByb3Zpc2lvbmVkOiBwcm92aXNpb24gfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBMYWtlYmFzZSBQb3N0Z3JlcyBjb25uZWN0aW9uIGluZm8sIHdyaXRlIHRoZSByZXNvbHZlZCB2YWx1ZXMgdG9cbiAqIGBwcm9jZXNzLmVudmAsIGFuZCByZXR1cm4gdGhlIHJlY29yZC4gVXNlZCBieSB7QGxpbmsgYXV0b0NvbmZpZ3VyZX07IGNhbGxcbiAqIHtAbGluayBhcHBseUxha2ViYXNlRW52fSBkaXJlY3RseSB3aGVuIGZpbmVyIGNvbnRyb2wgaXMgbmVlZGVkIChhIGRpZmZlcmVudFxuICogYGF1dG9DcmVhdGVgIHBvbGljeSwgb3IgYSBjYWxsZXIgdGhhdCB3YW50cyB0aGUgZW52IHdpdGhvdXQgYm9vdGluZyBBcHBLaXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiBhdXRvQ29uZmlndXJlTGFrZWJhc2UoXG4gIHByb3Zpc2lvbjogYm9vbGVhbixcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8TGFrZWJhc2VDb25uZWN0aW9uPiB7XG4gIGNvbnN0IHsgcmVzb2x2ZWQsIHVzZXIgfSA9IGF3YWl0IGFwcGx5TGFrZWJhc2VFbnYodW5kZWZpbmVkLCBzaWduYWwpO1xuICBsb2dnZXIuaW5mbyhcImVudiB1cGRhdGVkXCIsIHsgLi4ucmVkYWN0TGFrZWJhc2VDb25uZWN0aW9uKHJlc29sdmVkKSwgdXNlciB9KTtcbiAgaWYgKHByb3Zpc2lvbikge1xuICAgIGF3YWl0IHByb3Zpc2lvbkNhY2hlU2NoZW1hKHVzZXIsIGxvZ2dlcik7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG5mdW5jdGlvbiByZWRhY3RMYWtlYmFzZUNvbm5lY3Rpb24ocmVzb2x2ZWQ6IExha2ViYXNlQ29ubmVjdGlvbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwcm9qZWN0OiByZXNvbHZlZC5wcm9qZWN0LFxuICAgIGJyYW5jaDogcmVzb2x2ZWQuYnJhbmNoLFxuICAgIGVuZHBvaW50OiByZXNvbHZlZC5lbmRwb2ludCxcbiAgICBkYXRhYmFzZTogcmVzb2x2ZWQuZGF0YWJhc2UsXG4gICAgaG9zdDogcmVzb2x2ZWQuaG9zdCxcbiAgICBwb3J0OiByZXNvbHZlZC5wb3J0LFxuICAgIHNzbE1vZGU6IHJlc29sdmVkLnNzbE1vZGUsXG4gIH07XG59XG5cbi8qKlxuICogQXV0by1jb25maWd1cmluZyBkcm9wLWluIGZvciBBcHBLaXQncyBgY3JlYXRlQXBwYDogc2FtZSBjb25maWcsIHNhbWUgdHlwZWRcbiAqIHBsdWdpbi1leHBvcnQgbWFwLCB3aXRoIHtAbGluayBhdXRvQ29uZmlndXJlfSBydW4gZmlyc3QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgbGFrZWJhc2UsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqXG4gKiBjb25zdCBhcHAgPSBhd2FpdCBjcmVhdGVBcHAuY3JlYXRlQXBwKHsgcGx1Z2luczogW3NlcnZlcigpLCBsYWtlYmFzZSgpXSB9KTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcDxUIGV4dGVuZHMgQXBwS2l0UGx1Z2lucz4oXG4gIGNvbmZpZz86IENyZWF0ZUFwcENvbmZpZzxUPixcbik6IFByb21pc2U8UGx1Z2luTWFwPFQ+PiB7XG4gIGF3YWl0IGF1dG9Db25maWd1cmUoY29uZmlnKTtcbiAgY29uc3QgYXBwQ29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgZGVsZXRlIGFwcENvbmZpZy5hdXRvQ29uZmlndXJlO1xuICByZXR1cm4gYXBwa2l0Q3JlYXRlQXBwPFQ+KGFwcENvbmZpZyk7XG59XG4iXX0=
|
|
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWJhc2UtcmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLGVBQWUsR0FDaEIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixpQkFBaUIsRUFDakIsU0FBUyxHQUdWLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFZLFNBQVMsQ0FBQztBQUM1QyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztBQUM5Qiw4REFBOEQ7QUFDOUQsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLE1BQU0seUJBQXlCLEdB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ZXMgY29ubmVjdGlvbiByZXNvbHZlci5cbiAqXG4gKiBSZWFkcyB0aGUgc2FtZSBlbnYgdmFycyB0aGUgYGxha2ViYXNlYCBwbHVnaW4gY29uc3VtZXMgKGBQR0hPU1RgLFxuICogYFBHREFUQUJBU0VgLCBgUEdQT1JUYCwgYFBHU1NMTU9ERWAsIGBMQUtFQkFTRV9FTkRQT0lOVGApIGFuZCBmaWxscyBpblxuICogd2hpY2hldmVyIHBpZWNlcyBhcmUgbWlzc2luZyB1c2luZyB0aGUgTGFrZWJhc2UgQXV0b3NjYWxpbmcgUkVTVCBBUElcbiAqIHVuZGVyIGAvYXBpLzIuMC9wb3N0Z3Jlcy9gIHZpYSB0aGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgY2xpZW50LlxuICpcbiAqIGBMQUtFQkFTRV9FTkRQT0lOVGAgKGFuZCBgY29uZmlnLmVuZHBvaW50YCkgYWNjZXB0IGFueXRoaW5nXG4gKiB7QGxpbmsgcGFyc2VBZGRyZXNzfSB1bmRlcnN0YW5kcyAtIGNhbm9uaWNhbCByZXNvdXJjZSBwYXRocywgUG9zdGdyZXNcbiAqIFVSSXMsIGJhcmUgaG9zdG5hbWVzLCBvciBiYXJlIHByb2plY3QgaWRzLiBUaGUgcmVzb2x2ZXIgbGF5ZXJzXG4gKiB3aGF0ZXZlciBwaWVjZXMgZmFsbCBvdXQgb2YgcGFyc2luZyB1bmRlciBleHBsaWNpdCBjb25maWcgLyBlbnZcbiAqIHZhbHVlcywgdGhlbiBmaWxscyB0aGUgcmVtYWluaW5nIGdhcHMgdmlhIHRoZSBBUEk6XG4gKlxuICogICAxLiBSZXZlcnNlLWxvb2t1cDogd2hlbiBhIGhvc3QgaXMga25vd24gYnV0IG5vIHJlc291cmNlIHBhdGggaXMsXG4gKiAgICAgIHNjYW4gcHJvamVjdHMgLT4gYnJhbmNoZXMgLT4gZW5kcG9pbnRzIGZvciBhIG1hdGNoaW5nXG4gKiAgICAgIGBzdGF0dXMuaG9zdHMuaG9zdGAgYW5kIHJlY292ZXIgdGhlIG93bmluZyBwcm9qZWN0L2JyYW5jaC9lbmRwb2ludC5cbiAqICAgMi4gUGljazogd2hlbiBhIHByb2plY3QgaXMga25vd24gYnV0IGNoaWxkIHJlc291cmNlcyBhcmVuJ3QsIHByZWZlclxuICogICAgICB0aGUgc2VydmVyLXNpZGUgZGVmYXVsdCAoYHN0YXR1cy5kZWZhdWx0YCwgYEVORFBPSU5UX1RZUEVfUkVBRF9XUklURWAsXG4gKiAgICAgIGBkYXRhYnJpY2tzX3Bvc3RncmVzYCkgYW5kIGZhbGwgYmFjayB0byBcInRoZSBvbmx5IG9uZVwiIHdoZW4gYVxuICogICAgICBsaXN0aW5nIHJldHVybnMgYSBzaW5nbGUgcmVzdWx0LlxuICogICAzLiBBdXRvLWNyZWF0ZTogd2hlbiBubyBwcm9qZWN0cyBleGlzdCBhdCBhbGwsIGNyZWF0ZSBvbmUgd2hvc2VcbiAqICAgICAgaWQgZGVmYXVsdHMgdG8gYHByb2plY3QubmFtZSgpYCBzbHVnaWZpZWQgKG92ZXJyaWRlXG4gKiAgICAgIHdpdGggYGNvbmZpZy5hdXRvQ3JlYXRlOiBcIm15LWlkXCJgIG9yIGRpc2FibGUgd2l0aFxuICogICAgICBgY29uZmlnLmF1dG9DcmVhdGU6IGZhbHNlYCkuIFRoZSBjcmVhdGUgY2FsbCBpcyBpZGVtcG90ZW50IC0gYW5cbiAqICAgICAgYEFMUkVBRFlfRVhJU1RTYCByZXNwb25zZSBmcm9tIGEgY29uY3VycmVudCBib290IGlzIHRyZWF0ZWQgYXNcbiAqICAgICAgc3VjY2Vzcy4gVGhlbiBwb2xsIHRoZSBkZWZhdWx0IGVuZHBvaW50IHVudGlsIGl0IHJlcG9ydHNcbiAqICAgICAgYGN1cnJlbnRfc3RhdGVgIGBSRUFEWWAgb3IgYElETEVgLlxuICpcbiAqIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IHdyaXRlcyB0aGUgcmVzb2x2ZWQgdmFsdWVzIGJhY2sgdG9cbiAqIGBwcm9jZXNzLmVudmAgc28gdGhlIGRvd25zdHJlYW0gYGxha2ViYXNlYCBwbHVnaW4gcGlja3MgdGhlbSB1cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5kYXRhYnJpY2tzLmNvbS9hcGkvd29ya3NwYWNlL3Bvc3RncmVzXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdldFdvcmtzcGFjZUNsaWVudCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwcm9qZWN0IH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYXN5bmMsIGxvZywgb2JqZWN0LCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlc29sdmVDb25maWdWYWx1ZSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuXG5pbXBvcnQgeyBNQVhfVENQX1BPUlQsIHRvQ29udGV4dCB9IGZyb20gXCIuL2RhdGFicmlja3MudHNcIjtcbmltcG9ydCB7XG4gIHBhcnNlQWRkcmVzcyxcbiAgcGFyc2VSZXNvdXJjZVBhdGgsXG4gIFNTTF9NT0RFUyxcbiAgdHlwZSBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMsXG4gIHR5cGUgU3NsTW9kZSxcbn0gZnJvbSBcIi4vcGdhZGRyZXNzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJsYWtlYmFzZS1yZXNvbHZlclwiKTtcbmNvbnN0IEFQSV9CQVNFID0gXCIvYXBpLzIuMC9wb3N0Z3Jlc1wiO1xuY29uc3QgREVGQVVMVF9QT1JUID0gNTQzMjtcbmNvbnN0IERFRkFVTFRfU1NMX01PREU6IFNzbE1vZGUgPSBcInJlcXVpcmVcIjtcbmNvbnN0IERFRkFVTFRfUEdfVkVSU0lPTiA9IDE3O1xuLyoqIExha2ViYXNlIHByb2plY3QgaWRzOiBgXlthLXpdW2EtejAtOS1dezAsNjF9W2EtejAtOV0kYC4gKi9cbmNvbnN0IFBST0pFQ1RfSURfTUFYX0xFTiA9IDYzO1xuY29uc3QgT1BFUkFUSU9OX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuY29uc3QgT1BFUkFUSU9OX1BPTExfTVMgPSAyXzAwMDtcbmNvbnN0IEVORFBPSU5UX1JFQURZX1RJTUVPVVRfTVMgPSA1ICogNjBfMDAwO1xuY29uc3QgRU5EUE9JTlRfUkVBRFlfUE9MTF9NUyA9IDJfMDAwO1xuLyoqIENlaWxpbmcgb24gYSBzaW5nbGUgYmFja29mZiBzdGVwLCBzbyBhIGxvbmcgd2FpdCBzdGlsbCBwb2xscyByZWd1bGFybHkuICovXG5jb25zdCBQT0xMX01BWF9ERUxBWV9NUyA9IDE1XzAwMDtcbmNvbnN0IFBPTExfQkFDS09GRl9GQUNUT1IgPSAxLjU7XG4vKiogRnJhY3Rpb24gb2YgZWFjaCBkZWxheSBhcHBsaWVkIGFzICsvLSBqaXR0ZXIsIHNvIGNvbmN1cnJlbnQgYm9vdHMgZGVzeW5jaHJvbml6ZS4gKi9cbmNvbnN0IFBPTExfSklUVEVSX1JBVElPID0gMC4yO1xuLyoqIEVuZHBvaW50IGBzdGF0dXMuZW5kcG9pbnRfdHlwZWAgZm9yIHRoZSB3cml0YWJsZSBwcmltYXJ5LiAqL1xuY29uc3QgUkVBRF9XUklURV9FTkRQT0lOVF9UWVBFID0gXCJFTkRQT0lOVF9UWVBFX1JFQURfV1JJVEVcIjtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgIHZhbHVlcyB0aGF0IHdpbGwgYWNjZXB0IGEgY29ubmVjdGlvbi4gKi9cbmNvbnN0IENPTk5FQ1RBQkxFX0VORFBPSU5UX1NUQVRFUyA9IG5ldyBTZXQoW1wiUkVBRFlcIiwgXCJJRExFXCJdKTtcbi8qKiBFbmRwb2ludCBgc3RhdHVzLmN1cnJlbnRfc3RhdGVgIGJlZm9yZSBhIGhvc3RuYW1lIGlzIG1lYW5pbmdmdWwuICovXG5jb25zdCBJTklUSUFMSVpJTkdfRU5EUE9JTlRfU1RBVEUgPSBcIklOSVRJQUxJWklOR1wiO1xuLyoqIExha2ViYXNlJ3Mgb3duIGRlZmF1bHQgUG9zdGdyZXMgZGF0YWJhc2UgbmFtZS4gKi9cbmNvbnN0IERFRkFVTFRfREFUQUJBU0UgPSBcImRhdGFicmlja3NfcG9zdGdyZXNcIjtcblxuLyoqXG4gKiBVc2VyLXN1cHBsaWVkIExha2ViYXNlIGlucHV0cyAoY29uZmlnIG9yIGVudikgYmVmb3JlIGFueSBBUEkgcmVzb2x1dGlvbi5cbiAqIEV4dGVuZHMge0BsaW5rIExha2ViYXNlQ29ubmVjdGlvbklucHV0c30gd2l0aCByZXNvbHZlci1vbmx5IG9wdGlvbnMuXG4gKiB7QGxpbmsgcmVzb2x2ZUxha2ViYXNlQ29ubmVjdGlvbn0gZmlsbHMgZ2FwcyBmcm9tIHRoZSBMYWtlYmFzZSBBUEkgd2hlblxuICogaXQgaGFzIGVub3VnaCBjb250ZXh0ICh0eXBpY2FsbHkgYSBgcHJvamVjdGApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExha2ViYXNlUmVzb2x2ZXJJbnB1dHMgZXh0ZW5kcyBMYWtlYmFzZUNvbm5lY3Rpb25JbnB1dHMge1xuICAvKipcbiAgICogV2hhdCB0byBkbyB3aGVuIG5vIHByb2plY3QgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UgYXQgYWxsLlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZGVyaXZlIGEgcHJvamVjdCBpZCBmcm9tXG4gICAqICAge0BsaW5rIHByb2plY3QubmFtZX0gKHRoZSBob3N0IHJlcG8ncyBgcGFja2FnZS5qc29uYFxuICAgKiAgIG5hbWUpIHNsdWdpZmllZCB0byBMYWtlYmFzZSBpZCBjb25zdHJhaW50cywgdGhlbiBjcmVhdGUgaXQuXG4gICAqIC0gYHN0cmluZ2A6IGNyZWF0ZSBhIG5ldyBwcm9qZWN0IHdpdGggdGhpcyBleGFjdCBpZC5cbiAgICogLSBgZmFsc2VgOiBza2lwIGNyZWF0aW9uIGFuZCB0aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgbWVzc2FnZS5cbiAgICovXG4gIGF1dG9DcmVhdGU/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/package.json
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
31
|
-
"@dbx-tools/core": "0.6.
|
|
32
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
+
"@dbx-tools/core": "0.6.59",
|
|
32
|
+
"@dbx-tools/shared-core": "0.6.59",
|
|
33
33
|
"yaml": "^2.9.0",
|
|
34
34
|
"zod": "4.3.6"
|
|
35
35
|
},
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"./package.json": "./package.json"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
-
"version": "0.6.
|
|
50
|
+
"version": "0.6.59",
|
|
51
51
|
"types": "./lib/index.d.ts",
|
|
52
52
|
"type": "module",
|
|
53
53
|
"exports": {
|
package/src/create-app.ts
CHANGED
|
@@ -21,17 +21,13 @@
|
|
|
21
21
|
* @module
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
|
-
import { createApp as appkitCreateApp
|
|
24
|
+
import { createApp as appkitCreateApp } from "@databricks/appkit";
|
|
25
25
|
// AppKit's root barrel re-exports `PluginData` but not `PluginMap`; the package
|
|
26
26
|
// publishes this subpath for exactly that type.
|
|
27
27
|
import type { PluginMap } from "@databricks/appkit/dist/shared/src/plugin";
|
|
28
28
|
import { async, log } from "@dbx-tools/shared-core";
|
|
29
29
|
|
|
30
|
-
import {
|
|
31
|
-
applyLakebaseToEnv,
|
|
32
|
-
resolveLakebaseConnection,
|
|
33
|
-
type LakebaseConnection,
|
|
34
|
-
} from "./lakebase-resolver.ts";
|
|
30
|
+
import { applyLakebaseEnv, type LakebaseConnection } from "./lakebase-resolver.ts";
|
|
35
31
|
import { provisionCacheSchema } from "./provision.ts";
|
|
36
32
|
|
|
37
33
|
type AppKitCreateAppConfig = NonNullable<Parameters<typeof appkitCreateApp>[0]>;
|
|
@@ -47,6 +43,14 @@ type AppKitPlugins = NonNullable<AppKitCreateAppConfig["plugins"]>;
|
|
|
47
43
|
* Omit it to get `"provision"` gated on a `lakebase` plugin being registered;
|
|
48
44
|
* set it explicitly to run regardless of the plugin list, or pass `false` to
|
|
49
45
|
* skip auto-configuration entirely.
|
|
46
|
+
*
|
|
47
|
+
* Set it EXPLICITLY on an app that has no `lakebase()` plugin but still wants
|
|
48
|
+
* AppKit's PERSISTENT cache. AppKit picks Lakebase for `CacheManager` only when
|
|
49
|
+
* `createLakebasePool()` can build a pool, and that reads `LAKEBASE_ENDPOINT` /
|
|
50
|
+
* `PGHOST` / `PGDATABASE` straight from `process.env` - so without this step the
|
|
51
|
+
* cache silently falls back to in-memory, and anything it holds (a session
|
|
52
|
+
* signing key, a one-time code) is lost on restart. `"env"` is the right mode
|
|
53
|
+
* there: the app SP cannot grant on the cache schema anyway.
|
|
50
54
|
*/
|
|
51
55
|
export type AutoConfigureMode = "env" | "provision";
|
|
52
56
|
|
|
@@ -125,17 +129,14 @@ export async function autoConfigure<T extends AppKitPlugins>(
|
|
|
125
129
|
/**
|
|
126
130
|
* Resolve Lakebase Postgres connection info, write the resolved values to
|
|
127
131
|
* `process.env`, and return the record. Used by {@link autoConfigure}; call
|
|
128
|
-
* {@link
|
|
129
|
-
*
|
|
132
|
+
* {@link applyLakebaseEnv} directly when finer control is needed (a different
|
|
133
|
+
* `autoCreate` policy, or a caller that wants the env without booting AppKit).
|
|
130
134
|
*/
|
|
131
135
|
async function autoConfigureLakebase(
|
|
132
136
|
provision: boolean,
|
|
133
137
|
signal: AbortSignal,
|
|
134
138
|
): Promise<LakebaseConnection> {
|
|
135
|
-
const resolved = await
|
|
136
|
-
applyLakebaseToEnv(resolved);
|
|
137
|
-
const user = await getUsernameWithApiLookup({});
|
|
138
|
-
if (user) process.env.PGUSER ??= user;
|
|
139
|
+
const { resolved, user } = await applyLakebaseEnv(undefined, signal);
|
|
139
140
|
logger.info("env updated", { ...redactLakebaseConnection(resolved), user });
|
|
140
141
|
if (provision) {
|
|
141
142
|
await provisionCacheSchema(user, logger);
|
package/src/lakebase-resolver.ts
CHANGED
|
@@ -38,6 +38,7 @@
|
|
|
38
38
|
import {
|
|
39
39
|
ConfigurationError,
|
|
40
40
|
ExecutionError,
|
|
41
|
+
getUsernameWithApiLookup,
|
|
41
42
|
getWorkspaceClient,
|
|
42
43
|
ValidationError,
|
|
43
44
|
} from "@databricks/appkit";
|
|
@@ -383,6 +384,9 @@ export async function resolveLakebaseConnection(
|
|
|
383
384
|
* (which reads env directly) picks them up during its own `setup()`.
|
|
384
385
|
* Existing env values are preserved; only missing keys are filled in,
|
|
385
386
|
* which keeps explicit overrides authoritative.
|
|
387
|
+
*
|
|
388
|
+
* This does NOT set `PGUSER`, which needs an await - see
|
|
389
|
+
* {@link applyLakebaseEnv} for the complete set a Postgres pool requires.
|
|
386
390
|
*/
|
|
387
391
|
export function applyLakebaseToEnv(resolved: LakebaseConnection): void {
|
|
388
392
|
if (resolved.endpoint) process.env.LAKEBASE_ENDPOINT ??= resolved.endpoint;
|
|
@@ -392,6 +396,40 @@ export function applyLakebaseToEnv(resolved: LakebaseConnection): void {
|
|
|
392
396
|
process.env.PGSSLMODE ??= resolved.sslMode;
|
|
393
397
|
}
|
|
394
398
|
|
|
399
|
+
/**
|
|
400
|
+
* Resolve the connection AND apply every Postgres env var a Lakebase pool needs,
|
|
401
|
+
* returning the resolved connection plus the username that was applied.
|
|
402
|
+
*
|
|
403
|
+
* This is the whole set, which is the point of having one function for it:
|
|
404
|
+
* `createLakebasePool()` throws unless `LAKEBASE_ENDPOINT`, `PGHOST`,
|
|
405
|
+
* `PGDATABASE`, **and** a username (`PGUSER`, or `DATABRICKS_CLIENT_ID` for a
|
|
406
|
+
* service principal) are all present, and a Databricks App `postgres` resource
|
|
407
|
+
* binding supplies only the first. Anything that wants a working pool - the
|
|
408
|
+
* `lakebase` plugin, or AppKit's PERSISTENT cache, which quietly degrades to
|
|
409
|
+
* in-memory when the pool cannot be built - needs all four, so callers should not
|
|
410
|
+
* pair {@link applyLakebaseToEnv} with their own username lookup.
|
|
411
|
+
*
|
|
412
|
+
* `PGUSER` is applied with `??=` like the rest, so an explicitly configured value
|
|
413
|
+
* stays authoritative. The lookup returns `undefined` rather than throwing when it
|
|
414
|
+
* cannot determine a user, leaving the pool to resolve its own.
|
|
415
|
+
*
|
|
416
|
+
* @example
|
|
417
|
+
* import { lakebaseResolver } from "@dbx-tools/appkit";
|
|
418
|
+
*
|
|
419
|
+
* // Enough for `createLakebasePool()` to build a pool.
|
|
420
|
+
* const { user } = await lakebaseResolver.applyLakebaseEnv({ autoCreate: false });
|
|
421
|
+
*/
|
|
422
|
+
export async function applyLakebaseEnv(
|
|
423
|
+
config?: LakebaseResolverInputs,
|
|
424
|
+
signal?: AbortSignal,
|
|
425
|
+
): Promise<{ resolved: LakebaseConnection; user?: string }> {
|
|
426
|
+
const resolved = await resolveLakebaseConnection(config, signal);
|
|
427
|
+
applyLakebaseToEnv(resolved);
|
|
428
|
+
const user = await getUsernameWithApiLookup({});
|
|
429
|
+
if (user) process.env.PGUSER ??= user;
|
|
430
|
+
return { resolved, ...(user ? { user } : {}) };
|
|
431
|
+
}
|
|
432
|
+
|
|
395
433
|
type WorkspaceClient = ReturnType<typeof getWorkspaceClient>;
|
|
396
434
|
|
|
397
435
|
/** The SDK `Context` accepted by the workspace client's own copy of the SDK. */
|