@dbx-tools/auth 0.9.32 → 0.9.36
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 +49 -97
- package/index.ts +8 -26
- package/lib/index.d.ts +8 -26
- package/lib/index.js +6 -22
- package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
- package/lib/src/_databricks-cli.js +172 -0
- package/lib/src/_errors.d.ts +5 -0
- package/lib/src/_errors.js +10 -0
- package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
- package/lib/src/_lifecycle.js +214 -0
- package/lib/src/_logging.d.ts +1 -1
- package/lib/src/_logging.js +2 -2
- package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
- package/lib/src/_personal-access-token.js +30 -0
- package/lib/src/_profile-config.d.ts +43 -0
- package/lib/src/_profile-config.js +443 -0
- package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
- package/lib/src/_service-principal.js +69 -0
- package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
- package/lib/src/_storage.js +94 -0
- package/lib/src/_types.d.ts +40 -0
- package/lib/src/_types.js +2 -0
- package/lib/src/client.d.ts +30 -0
- package/lib/src/client.js +223 -0
- package/lib/src/config.d.ts +36 -0
- package/lib/src/config.js +15 -0
- package/lib/src/profile.d.ts +11 -0
- package/lib/src/profile.js +21 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -10
- package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
- package/src/_errors.ts +11 -0
- package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
- package/src/_logging.ts +2 -2
- package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
- package/src/_profile-config.ts +545 -0
- package/src/{service-principal.ts → _service-principal.ts} +2 -2
- package/src/{storage.ts → _storage.ts} +2 -31
- package/src/_types.ts +45 -0
- package/src/client.ts +291 -0
- package/src/config.ts +44 -0
- package/src/profile.ts +33 -0
- package/lib/exports.d.ts +0 -2
- package/lib/exports.js +0 -3
- package/lib/src/_profile-core.d.ts +0 -28
- package/lib/src/_profile-core.js +0 -216
- package/lib/src/_profile.d.ts +0 -15
- package/lib/src/_profile.js +0 -236
- package/lib/src/databricks-auth.d.ts +0 -11
- package/lib/src/databricks-auth.js +0 -314
- package/lib/src/databricks-cli.js +0 -239
- package/lib/src/errors.d.ts +0 -7
- package/lib/src/errors.js +0 -14
- package/lib/src/file-storage.d.ts +0 -20
- package/lib/src/file-storage.js +0 -207
- package/lib/src/generated/databricks-cli-assets.json +0 -33
- package/lib/src/http-client.d.ts +0 -23
- package/lib/src/http-client.js +0 -116
- package/lib/src/lifecycle.js +0 -233
- package/lib/src/personal-access-token.js +0 -30
- package/lib/src/service-principal.js +0 -69
- package/lib/src/storage.js +0 -112
- package/lib/src/types.d.ts +0 -165
- package/lib/src/types.js +0 -67
- package/src/_profile-core.ts +0 -258
- package/src/_profile.ts +0 -319
- package/src/databricks-auth.ts +0 -416
- package/src/errors.ts +0 -16
- package/src/file-storage.ts +0 -230
- package/src/generated/databricks-cli-assets.json +0 -33
- package/src/http-client.ts +0 -147
- package/src/types.ts +0 -196
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
import { homedir } from "node:os";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import * as bin from "@dbx-tools/core/bin";
|
|
4
|
-
import * as exec from "@dbx-tools/core/exec";
|
|
5
|
-
import * as stringUtils from "@dbx-tools/shared-core/string-utils";
|
|
6
|
-
import cliAssets from "./generated/databricks-cli-assets.json" with { type: "json" };
|
|
7
|
-
import { authLogger, failureMetadata, tokenMetadata } from "./_logging.js";
|
|
8
|
-
import { AuthError } from "./errors.js";
|
|
9
|
-
const resolutionCache = new Map();
|
|
10
|
-
const logger = authLogger("cli");
|
|
11
|
-
/** Resolve a compatible Databricks CLI, installing the pinned build asset when needed. */
|
|
12
|
-
export function resolveDatabricksCli(environment = process.env, options = {}) {
|
|
13
|
-
const candidate = stringValue(environment.DATABRICKS_CLI_PATH) ?? "databricks";
|
|
14
|
-
const key = `${candidate}\0${homedir()}\0${process.platform}\0${process.arch}\0${options.install !== false}`;
|
|
15
|
-
const cached = resolutionCache.get(key);
|
|
16
|
-
if (cached) {
|
|
17
|
-
logger.debug("reused Databricks CLI resolution", {
|
|
18
|
-
candidate,
|
|
19
|
-
install: options.install !== false,
|
|
20
|
-
});
|
|
21
|
-
return cached;
|
|
22
|
-
}
|
|
23
|
-
logger.debug("resolving Databricks CLI", {
|
|
24
|
-
candidate,
|
|
25
|
-
install: options.install !== false,
|
|
26
|
-
platform: process.platform,
|
|
27
|
-
arch: process.arch,
|
|
28
|
-
minimumVersion: cliAssets.minimumVersion,
|
|
29
|
-
});
|
|
30
|
-
const resolved = resolveDatabricksCliUncached(candidate, options.install !== false).catch((error) => {
|
|
31
|
-
resolutionCache.delete(key);
|
|
32
|
-
throw error;
|
|
33
|
-
});
|
|
34
|
-
resolutionCache.set(key, resolved);
|
|
35
|
-
return resolved;
|
|
36
|
-
}
|
|
37
|
-
/** Clear cached CLI resolution, primarily after installation or environment changes. */
|
|
38
|
-
export function resetDatabricksCliResolution() {
|
|
39
|
-
resolutionCache.clear();
|
|
40
|
-
logger.debug("cleared Databricks CLI resolution cache");
|
|
41
|
-
}
|
|
42
|
-
async function resolveDatabricksCliUncached(candidate, install) {
|
|
43
|
-
if (await compatibleDatabricksCli(candidate)) {
|
|
44
|
-
logger.debug("selected installed Databricks CLI", { executable: candidate });
|
|
45
|
-
return candidate;
|
|
46
|
-
}
|
|
47
|
-
const managed = managedExecutable();
|
|
48
|
-
if (await compatibleDatabricksCli(managed)) {
|
|
49
|
-
logger.debug("selected managed Databricks CLI", { executable: managed });
|
|
50
|
-
return managed;
|
|
51
|
-
}
|
|
52
|
-
if (!install) {
|
|
53
|
-
logger.debug("compatible Databricks CLI unavailable and installation disabled");
|
|
54
|
-
return undefined;
|
|
55
|
-
}
|
|
56
|
-
const asset = platformAsset();
|
|
57
|
-
if (!asset) {
|
|
58
|
-
logger.debug("no managed Databricks CLI asset for platform", {
|
|
59
|
-
platform: process.platform,
|
|
60
|
-
arch: process.arch,
|
|
61
|
-
});
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
const root = join(homedir(), ".databricks");
|
|
65
|
-
const binDir = join(root, "bin");
|
|
66
|
-
const executable = managedExecutableName();
|
|
67
|
-
const installed = await bin.ensure("databricks", asset, {
|
|
68
|
-
autoUnpackage: true,
|
|
69
|
-
destination: { root, binDir, path: join(binDir, executable) },
|
|
70
|
-
minVersion: cliAssets.minimumVersion,
|
|
71
|
-
selector: ({ source }) => join(source, executable),
|
|
72
|
-
versionParser: (output) => {
|
|
73
|
-
const version = bin.parseVersion(output);
|
|
74
|
-
return version === cliAssets.version ? version : undefined;
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
logger.debug("ensured managed Databricks CLI", {
|
|
78
|
-
executable: installed.path,
|
|
79
|
-
version: cliAssets.version,
|
|
80
|
-
});
|
|
81
|
-
return installed.path;
|
|
82
|
-
}
|
|
83
|
-
function managedExecutable() {
|
|
84
|
-
return join(homedir(), ".databricks", "bin", managedExecutableName());
|
|
85
|
-
}
|
|
86
|
-
function managedExecutableName() {
|
|
87
|
-
return process.platform === "win32" ? "databricks.exe" : "databricks";
|
|
88
|
-
}
|
|
89
|
-
async function compatibleDatabricksCli(executable) {
|
|
90
|
-
try {
|
|
91
|
-
const result = await runProcess(executable, ["--version"], {}, 10_000);
|
|
92
|
-
if (result.exitCode !== 0) {
|
|
93
|
-
logger.debug("Databricks CLI version probe failed", {
|
|
94
|
-
executable,
|
|
95
|
-
exitCode: result.exitCode,
|
|
96
|
-
});
|
|
97
|
-
return false;
|
|
98
|
-
}
|
|
99
|
-
const version = bin.parseVersion(result);
|
|
100
|
-
const compatible = version !== undefined && bin.isVersionAtLeast(version, cliAssets.minimumVersion);
|
|
101
|
-
logger.debug("probed Databricks CLI version", {
|
|
102
|
-
executable,
|
|
103
|
-
version: version ?? "unknown",
|
|
104
|
-
minimumVersion: cliAssets.minimumVersion,
|
|
105
|
-
compatible,
|
|
106
|
-
});
|
|
107
|
-
return compatible;
|
|
108
|
-
}
|
|
109
|
-
catch (cause) {
|
|
110
|
-
logger.debug("Databricks CLI version probe unavailable", {
|
|
111
|
-
executable,
|
|
112
|
-
error: failureMetadata(cause),
|
|
113
|
-
});
|
|
114
|
-
return false;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
function platformAsset() {
|
|
118
|
-
const key = `${process.platform}-${process.arch}`;
|
|
119
|
-
return cliAssets.assets[key];
|
|
120
|
-
}
|
|
121
|
-
/** Run interactive Databricks CLI login for one profile. */
|
|
122
|
-
export async function databricksCliLogin(profile, timeoutMs, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
|
|
123
|
-
logger.debug("starting Databricks CLI login", { profile, executable, timeoutMs });
|
|
124
|
-
const result = await runProcess(executable, ["auth", "login", "--profile", profile, "--timeout", `${Math.ceil(timeoutMs / 1000)}s`], environment);
|
|
125
|
-
if (result.exitCode !== 0)
|
|
126
|
-
throw new AuthError("cli", result.stderr || `databricks auth login exited ${result.exitCode}`);
|
|
127
|
-
logger.debug("Databricks CLI login completed", { profile, executable });
|
|
128
|
-
}
|
|
129
|
-
/** Request one profile token from the Databricks CLI. */
|
|
130
|
-
export async function databricksCliToken(profile, forceRefresh = false, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
|
|
131
|
-
logger.debug("requesting Databricks CLI token", { profile, executable, forceRefresh });
|
|
132
|
-
const args = ["auth", "token", "--profile", profile, "--output", "json"];
|
|
133
|
-
if (forceRefresh)
|
|
134
|
-
args.push("--force-refresh");
|
|
135
|
-
const result = await runProcess(executable, args, environment);
|
|
136
|
-
if (result.exitCode !== 0)
|
|
137
|
-
throw new AuthError("cli", result.stderr || `databricks auth token exited ${result.exitCode}`);
|
|
138
|
-
let value;
|
|
139
|
-
try {
|
|
140
|
-
value = JSON.parse(result.stdout ?? "");
|
|
141
|
-
}
|
|
142
|
-
catch (cause) {
|
|
143
|
-
throw new AuthError("cli", "Databricks CLI token output was not JSON", { cause });
|
|
144
|
-
}
|
|
145
|
-
const accessToken = stringValue(value.access_token ?? value.accessToken);
|
|
146
|
-
if (!accessToken)
|
|
147
|
-
throw new AuthError("cli", "Databricks CLI token output had no access token");
|
|
148
|
-
const token = {
|
|
149
|
-
accessToken,
|
|
150
|
-
tokenType: stringValue(value.token_type ?? value.tokenType) ?? "Bearer",
|
|
151
|
-
...(stringValue(value.refresh_token ?? value.refreshToken)
|
|
152
|
-
? { refreshToken: stringValue(value.refresh_token ?? value.refreshToken) }
|
|
153
|
-
: {}),
|
|
154
|
-
...(stringValue(value.expiry ?? value.expires_at)
|
|
155
|
-
? { expiry: stringValue(value.expiry ?? value.expires_at) }
|
|
156
|
-
: {}),
|
|
157
|
-
scopes: Array.isArray(value.scopes)
|
|
158
|
-
? value.scopes.filter((scope) => typeof scope === "string")
|
|
159
|
-
: [],
|
|
160
|
-
};
|
|
161
|
-
logger.debug("received Databricks CLI token", {
|
|
162
|
-
profile,
|
|
163
|
-
forceRefresh,
|
|
164
|
-
token: tokenMetadata(token),
|
|
165
|
-
});
|
|
166
|
-
return token;
|
|
167
|
-
}
|
|
168
|
-
async function runProcess(command, args, environment, timeoutMs) {
|
|
169
|
-
const controller = timeoutMs === undefined ? undefined : new AbortController();
|
|
170
|
-
const timeout = controller ? setTimeout(() => controller.abort(), timeoutMs) : undefined;
|
|
171
|
-
try {
|
|
172
|
-
return await exec.spawn(command, args, {
|
|
173
|
-
env: { ...process.env, ...environment },
|
|
174
|
-
stdin: "ignore",
|
|
175
|
-
stdout: "capture",
|
|
176
|
-
stderr: "capture",
|
|
177
|
-
signal: controller?.signal,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
finally {
|
|
181
|
-
if (timeout)
|
|
182
|
-
clearTimeout(timeout);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
/** Provider that lazily delegates U2M credentials to the Databricks CLI. */
|
|
186
|
-
export class DatabricksCliProvider {
|
|
187
|
-
profile;
|
|
188
|
-
executableOrResolver;
|
|
189
|
-
environment;
|
|
190
|
-
resolution;
|
|
191
|
-
constructor(profile, executableOrResolver = () => resolveDatabricksCli(), environment = {}) {
|
|
192
|
-
this.profile = profile;
|
|
193
|
-
this.executableOrResolver = executableOrResolver;
|
|
194
|
-
this.environment = environment;
|
|
195
|
-
}
|
|
196
|
-
async authenticate(_timeoutMs) {
|
|
197
|
-
return databricksCliToken(this.profile, false, await this.resolveExecutable(), this.environment);
|
|
198
|
-
}
|
|
199
|
-
async login(timeoutMs) {
|
|
200
|
-
const executable = await this.resolveExecutable();
|
|
201
|
-
await databricksCliLogin(this.profile, timeoutMs, executable, this.environment);
|
|
202
|
-
return databricksCliToken(this.profile, false, executable, this.environment);
|
|
203
|
-
}
|
|
204
|
-
async refresh(_token) {
|
|
205
|
-
return databricksCliToken(this.profile, true, await this.resolveExecutable(), this.environment);
|
|
206
|
-
}
|
|
207
|
-
canAuthenticateSilently() {
|
|
208
|
-
return true;
|
|
209
|
-
}
|
|
210
|
-
resolveExecutable() {
|
|
211
|
-
if (typeof this.executableOrResolver === "string") {
|
|
212
|
-
logger.debug("using configured Databricks CLI executable", {
|
|
213
|
-
profile: this.profile,
|
|
214
|
-
executable: this.executableOrResolver,
|
|
215
|
-
});
|
|
216
|
-
return Promise.resolve(this.executableOrResolver);
|
|
217
|
-
}
|
|
218
|
-
if (this.resolution) {
|
|
219
|
-
logger.debug("reused provider CLI resolution", { profile: this.profile });
|
|
220
|
-
return this.resolution;
|
|
221
|
-
}
|
|
222
|
-
logger.debug("resolving provider CLI lazily", { profile: this.profile });
|
|
223
|
-
this.resolution = this.executableOrResolver()
|
|
224
|
-
.then((executable) => {
|
|
225
|
-
if (!executable)
|
|
226
|
-
throw new AuthError("cli", "Databricks CLI is unavailable on this platform");
|
|
227
|
-
return executable;
|
|
228
|
-
})
|
|
229
|
-
.catch((error) => {
|
|
230
|
-
this.resolution = undefined;
|
|
231
|
-
throw error;
|
|
232
|
-
});
|
|
233
|
-
return this.resolution;
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
function stringValue(value) {
|
|
237
|
-
return stringUtils.trimToNull(value) ?? undefined;
|
|
238
|
-
}
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJyaWNrcy1jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJyaWNrcy1jbGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLElBQUksTUFBTSxzQkFBc0IsQ0FBQztBQUM3QyxPQUFPLEtBQUssV0FBVyxNQUFNLHFDQUFxQyxDQUFDO0FBRW5FLE9BQU8sU0FBUyxNQUFNLHdDQUF3QyxDQUFDLE9BQU8sSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBR3hDLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QyxDQUFDO0FBQ3ZFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQWVqQywwRkFBMEY7QUFDMUYsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxjQUE0RCxPQUFPLENBQUMsR0FBRyxFQUN2RSxVQUEwQyxFQUFFO0lBRTVDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxZQUFZLENBQUM7SUFDL0UsTUFBTSxHQUFHLEdBQUcsR0FBRyxTQUFTLEtBQUssT0FBTyxFQUFFLEtBQUssT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDN0csTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRTtZQUMvQyxTQUFTO1lBQ1QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSztTQUNuQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsRUFBRTtRQUN2QyxTQUFTO1FBQ1QsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEtBQUssS0FBSztRQUNsQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7UUFDMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1FBQ2xCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztLQUN6QyxDQUFDLENBQUM7SUFDSCxNQUFNLFFBQVEsR0FBRyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQ3ZGLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDUixlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQyxDQUNGLENBQUM7SUFDRixlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsd0ZBQXdGO0FBQ3hGLE1BQU0sVUFBVSw0QkFBNEI7SUFDMUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsS0FBSyxVQUFVLDRCQUE0QixDQUN6QyxTQUFpQixFQUNqQixPQUFnQjtJQUVoQixJQUFJLE1BQU0sdUJBQXVCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDN0UsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDcEMsSUFBSSxNQUFNLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUM7UUFDaEYsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzlCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE1BQU0sQ0FBQyxLQUFLLENBQUMsOENBQThDLEVBQUU7WUFDM0QsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtTQUNuQixDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRTtRQUN0RCxhQUFhLEVBQUUsSUFBSTtRQUNuQixXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1FBQzdELFVBQVUsRUFBRSxTQUFTLENBQUMsY0FBYztRQUNwQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztRQUNsRCxhQUFhLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN4QixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sT0FBTyxLQUFLLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdELENBQUM7S0FDRixDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFO1FBQzdDLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSTtRQUMxQixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87S0FDM0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsU0FBUyxxQkFBcUI7SUFDNUIsT0FBTyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUN4RSxDQUFDO0FBRUQsS0FBSyxVQUFVLHVCQUF1QixDQUFDLFVBQWtCO0lBQ3ZELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsRUFBRTtnQkFDbEQsVUFBVTtnQkFDVixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FDZCxPQUFPLEtBQUssU0FBUyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ25GLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUU7WUFDNUMsVUFBVTtZQUNWLE9BQU8sRUFBRSxPQUFPLElBQUksU0FBUztZQUM3QixjQUFjLEVBQUUsU0FBUyxDQUFDLGNBQWM7WUFDeEMsVUFBVTtTQUNYLENBQUMsQ0FBQztRQUNILE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywwQ0FBMEMsRUFBRTtZQUN2RCxVQUFVO1lBQ1YsS0FBSyxFQUFFLGVBQWUsQ0FBQyxLQUFLLENBQUM7U0FDOUIsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYTtJQUNwQixNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksRUFBbUMsQ0FBQztJQUNuRixPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxPQUFlLEVBQ2YsU0FBaUIsRUFDakIsVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLElBQUksWUFBWSxFQUM1RCxjQUFzQyxFQUFFO0lBRXhDLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDbEYsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQzdCLFVBQVUsRUFDVixDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQ3ZGLFdBQVcsQ0FDWixDQUFDO0lBQ0YsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUM7UUFDdkIsTUFBTSxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sSUFBSSxnQ0FBZ0MsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDakcsTUFBTSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0IsQ0FDdEMsT0FBZSxFQUNmLFlBQVksR0FBRyxLQUFLLEVBQ3BCLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLFlBQVksRUFDNUQsY0FBc0MsRUFBRTtJQUV4QyxNQUFNLENBQUMsS0FBSyxDQUFDLGlDQUFpQyxFQUFFLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RSxJQUFJLFlBQVk7UUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxVQUFVLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMvRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssQ0FBQztRQUN2QixNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLGdDQUFnQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNqRyxJQUFJLEtBQThCLENBQUM7SUFDbkMsSUFBSSxDQUFDO1FBQ0gsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQTRCLENBQUM7SUFDckUsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSwwQ0FBMEMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RSxJQUFJLENBQUMsV0FBVztRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLGlEQUFpRCxDQUFDLENBQUM7SUFDaEcsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXO1FBQ1gsU0FBUyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRO1FBQ3ZFLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDO1lBQ3hELENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLGFBQWEsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDMUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDM0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDakMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO1lBQzVFLENBQUMsQ0FBQyxFQUFFO0tBQ1AsQ0FBQztJQUNGLE1BQU0sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUU7UUFDNUMsT0FBTztRQUNQLFlBQVk7UUFDWixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQztLQUM1QixDQUFDLENBQUM7SUFDSCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUN2QixPQUFlLEVBQ2YsSUFBYyxFQUNkLFdBQW1DLEVBQ25DLFNBQWtCO0lBRWxCLE1BQU0sVUFBVSxHQUFHLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUMvRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RixJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFO1lBQ3JDLEdBQUcsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLFdBQVcsRUFBRTtZQUN2QyxLQUFLLEVBQUUsUUFBUTtZQUNmLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTTtTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULElBQUksT0FBTztZQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxDQUFDO0FBQ0gsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSxNQUFNLE9BQU8scUJBQXFCO0lBSWI7SUFDQTtJQUVBO0lBTlgsVUFBVSxDQUFtQjtJQUVyQyxZQUNtQixPQUFlLEVBQ2YsdUJBQXVELEdBQUcsRUFBRSxDQUMzRSxvQkFBb0IsRUFBRSxFQUNQLGNBQXNDLEVBQUU7UUFIeEMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FDYjtRQUNQLGdCQUFXLEdBQVgsV0FBVyxDQUE2QjtJQUN4RCxDQUFDO0lBRUosS0FBSyxDQUFDLFlBQVksQ0FBQyxVQUFrQjtRQUNuQyxPQUFPLGtCQUFrQixDQUN2QixJQUFJLENBQUMsT0FBTyxFQUNaLEtBQUssRUFDTCxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUM5QixJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBaUI7UUFDM0IsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNsRCxNQUFNLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQWE7UUFDekIsT0FBTyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxLQUFLLENBQUMsNENBQTRDLEVBQUU7Z0JBQ3pELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0I7YUFDdEMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRTthQUMxQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVTtnQkFDYixNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxnREFBZ0QsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0ICogYXMgYmluIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvYmluXCI7XG5pbXBvcnQgKiBhcyBleGVjIGZyb20gXCJAZGJ4LXRvb2xzL2NvcmUvZXhlY1wiO1xuaW1wb3J0ICogYXMgc3RyaW5nVXRpbHMgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvc3RyaW5nLXV0aWxzXCI7XG5cbmltcG9ydCBjbGlBc3NldHMgZnJvbSBcIi4vZ2VuZXJhdGVkL2RhdGFicmlja3MtY2xpLWFzc2V0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5pbXBvcnQgeyBhdXRoTG9nZ2VyLCBmYWlsdXJlTWV0YWRhdGEsIHRva2VuTWV0YWRhdGEgfSBmcm9tIFwiLi9fbG9nZ2luZy50c1wiO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFRva2VuLCBUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgcmVzb2x1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJjbGlcIik7XG5cbmludGVyZmFjZSBEYXRhYnJpY2tzQ2xpQXNzZXQge1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hhMjU2OiBzdHJpbmc7XG59XG5cbi8qKiBEZWZlcnJlZCBEYXRhYnJpY2tzIENMSSBsb29rdXAgdXNlZCBieSBVMk0gdG9rZW4gYWNxdWlzaXRpb24uICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzQ2xpUmVzb2x2ZXIgPSAoKSA9PiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8qKiBDb250cm9scyB3aGV0aGVyIENMSSByZXNvbHV0aW9uIG1heSBpbnN0YWxsIHRoZSBwaW5uZWQgbWFuYWdlZCBleGVjdXRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMge1xuICBpbnN0YWxsPzogYm9vbGVhbjtcbn1cblxuLyoqIFJlc29sdmUgYSBjb21wYXRpYmxlIERhdGFicmlja3MgQ0xJLCBpbnN0YWxsaW5nIHRoZSBwaW5uZWQgYnVpbGQgYXNzZXQgd2hlbiBuZWVkZWQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NDbGkoXG4gIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHByb2Nlc3MuZW52LFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhbmRpZGF0ZSA9IHN0cmluZ1ZhbHVlKGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJX1BBVEgpID8/IFwiZGF0YWJyaWNrc1wiO1xuICBjb25zdCBrZXkgPSBgJHtjYW5kaWRhdGV9XFwwJHtob21lZGlyKCl9XFwwJHtwcm9jZXNzLnBsYXRmb3JtfVxcMCR7cHJvY2Vzcy5hcmNofVxcMCR7b3B0aW9ucy5pbnN0YWxsICE9PSBmYWxzZX1gO1xuICBjb25zdCBjYWNoZWQgPSByZXNvbHV0aW9uQ2FjaGUuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJyZXVzZWQgRGF0YWJyaWNrcyBDTEkgcmVzb2x1dGlvblwiLCB7XG4gICAgICBjYW5kaWRhdGUsXG4gICAgICBpbnN0YWxsOiBvcHRpb25zLmluc3RhbGwgIT09IGZhbHNlLFxuICAgIH0pO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIERhdGFicmlja3MgQ0xJXCIsIHtcbiAgICBjYW5kaWRhdGUsXG4gICAgaW5zdGFsbDogb3B0aW9ucy5pbnN0YWxsICE9PSBmYWxzZSxcbiAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICBhcmNoOiBwcm9jZXNzLmFyY2gsXG4gICAgbWluaW11bVZlcnNpb246IGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbixcbiAgfSk7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZURhdGFicmlja3NDbGlVbmNhY2hlZChjYW5kaWRhdGUsIG9wdGlvbnMuaW5zdGFsbCAhPT0gZmFsc2UpLmNhdGNoKFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgcmVzb2x1dGlvbkNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSxcbiAgKTtcbiAgcmVzb2x1dGlvbkNhY2hlLnNldChrZXksIHJlc29sdmVkKTtcbiAgcmV0dXJuIHJlc29sdmVkO1xufVxuXG4vKiogQ2xlYXIgY2FjaGVkIENMSSByZXNvbHV0aW9uLCBwcmltYXJpbHkgYWZ0ZXIgaW5zdGFsbGF0aW9uIG9yIGVudmlyb25tZW50IGNoYW5nZXMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbigpOiB2b2lkIHtcbiAgcmVzb2x1dGlvbkNhY2hlLmNsZWFyKCk7XG4gIGxvZ2dlci5kZWJ1ZyhcImNsZWFyZWQgRGF0YWJyaWNrcyBDTEkgcmVzb2x1dGlvbiBjYWNoZVwiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NDbGlVbmNhY2hlZChcbiAgY2FuZGlkYXRlOiBzdHJpbmcsXG4gIGluc3RhbGw6IGJvb2xlYW4sXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoYXdhaXQgY29tcGF0aWJsZURhdGFicmlja3NDbGkoY2FuZGlkYXRlKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIGluc3RhbGxlZCBEYXRhYnJpY2tzIENMSVwiLCB7IGV4ZWN1dGFibGU6IGNhbmRpZGF0ZSB9KTtcbiAgICByZXR1cm4gY2FuZGlkYXRlO1xuICB9XG4gIGNvbnN0IG1hbmFnZWQgPSBtYW5hZ2VkRXhlY3V0YWJsZSgpO1xuICBpZiAoYXdhaXQgY29tcGF0aWJsZURhdGFicmlja3NDbGkobWFuYWdlZCkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBtYW5hZ2VkIERhdGFicmlja3MgQ0xJXCIsIHsgZXhlY3V0YWJsZTogbWFuYWdlZCB9KTtcbiAgICByZXR1cm4gbWFuYWdlZDtcbiAgfVxuICBpZiAoIWluc3RhbGwpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJjb21wYXRpYmxlIERhdGFicmlja3MgQ0xJIHVuYXZhaWxhYmxlIGFuZCBpbnN0YWxsYXRpb24gZGlzYWJsZWRcIik7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBhc3NldCA9IHBsYXRmb3JtQXNzZXQoKTtcbiAgaWYgKCFhc3NldCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm5vIG1hbmFnZWQgRGF0YWJyaWNrcyBDTEkgYXNzZXQgZm9yIHBsYXRmb3JtXCIsIHtcbiAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IGpvaW4oaG9tZWRpcigpLCBcIi5kYXRhYnJpY2tzXCIpO1xuICBjb25zdCBiaW5EaXIgPSBqb2luKHJvb3QsIFwiYmluXCIpO1xuICBjb25zdCBleGVjdXRhYmxlID0gbWFuYWdlZEV4ZWN1dGFibGVOYW1lKCk7XG4gIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IGJpbi5lbnN1cmUoXCJkYXRhYnJpY2tzXCIsIGFzc2V0LCB7XG4gICAgYXV0b1VucGFja2FnZTogdHJ1ZSxcbiAgICBkZXN0aW5hdGlvbjogeyByb290LCBiaW5EaXIsIHBhdGg6IGpvaW4oYmluRGlyLCBleGVjdXRhYmxlKSB9LFxuICAgIG1pblZlcnNpb246IGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbixcbiAgICBzZWxlY3RvcjogKHsgc291cmNlIH0pID0+IGpvaW4oc291cmNlLCBleGVjdXRhYmxlKSxcbiAgICB2ZXJzaW9uUGFyc2VyOiAob3V0cHV0KSA9PiB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gYmluLnBhcnNlVmVyc2lvbihvdXRwdXQpO1xuICAgICAgcmV0dXJuIHZlcnNpb24gPT09IGNsaUFzc2V0cy52ZXJzaW9uID8gdmVyc2lvbiA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbiAgbG9nZ2VyLmRlYnVnKFwiZW5zdXJlZCBtYW5hZ2VkIERhdGFicmlja3MgQ0xJXCIsIHtcbiAgICBleGVjdXRhYmxlOiBpbnN0YWxsZWQucGF0aCxcbiAgICB2ZXJzaW9uOiBjbGlBc3NldHMudmVyc2lvbixcbiAgfSk7XG4gIHJldHVybiBpbnN0YWxsZWQucGF0aDtcbn1cblxuZnVuY3Rpb24gbWFuYWdlZEV4ZWN1dGFibGUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4oaG9tZWRpcigpLCBcIi5kYXRhYnJpY2tzXCIsIFwiYmluXCIsIG1hbmFnZWRFeGVjdXRhYmxlTmFtZSgpKTtcbn1cblxuZnVuY3Rpb24gbWFuYWdlZEV4ZWN1dGFibGVOYW1lKCk6IHN0cmluZyB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIgPyBcImRhdGFicmlja3MuZXhlXCIgOiBcImRhdGFicmlja3NcIjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGF0aWJsZURhdGFicmlja3NDbGkoZXhlY3V0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuUHJvY2VzcyhleGVjdXRhYmxlLCBbXCItLXZlcnNpb25cIl0sIHt9LCAxMF8wMDApO1xuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIkRhdGFicmlja3MgQ0xJIHZlcnNpb24gcHJvYmUgZmFpbGVkXCIsIHtcbiAgICAgICAgZXhlY3V0YWJsZSxcbiAgICAgICAgZXhpdENvZGU6IHJlc3VsdC5leGl0Q29kZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2ZXJzaW9uID0gYmluLnBhcnNlVmVyc2lvbihyZXN1bHQpO1xuICAgIGNvbnN0IGNvbXBhdGlibGUgPVxuICAgICAgdmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGJpbi5pc1ZlcnNpb25BdExlYXN0KHZlcnNpb24sIGNsaUFzc2V0cy5taW5pbXVtVmVyc2lvbik7XG4gICAgbG9nZ2VyLmRlYnVnKFwicHJvYmVkIERhdGFicmlja3MgQ0xJIHZlcnNpb25cIiwge1xuICAgICAgZXhlY3V0YWJsZSxcbiAgICAgIHZlcnNpb246IHZlcnNpb24gPz8gXCJ1bmtub3duXCIsXG4gICAgICBtaW5pbXVtVmVyc2lvbjogY2xpQXNzZXRzLm1pbmltdW1WZXJzaW9uLFxuICAgICAgY29tcGF0aWJsZSxcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGF0aWJsZTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIENMSSB2ZXJzaW9uIHByb2JlIHVuYXZhaWxhYmxlXCIsIHtcbiAgICAgIGV4ZWN1dGFibGUsXG4gICAgICBlcnJvcjogZmFpbHVyZU1ldGFkYXRhKGNhdXNlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGxhdGZvcm1Bc3NldCgpOiBEYXRhYnJpY2tzQ2xpQXNzZXQgfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXkgPSBgJHtwcm9jZXNzLnBsYXRmb3JtfS0ke3Byb2Nlc3MuYXJjaH1gIGFzIGtleW9mIHR5cGVvZiBjbGlBc3NldHMuYXNzZXRzO1xuICByZXR1cm4gY2xpQXNzZXRzLmFzc2V0c1trZXldO1xufVxuXG4vKiogUnVuIGludGVyYWN0aXZlIERhdGFicmlja3MgQ0xJIGxvZ2luIGZvciBvbmUgcHJvZmlsZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzQ2xpTG9naW4oXG4gIHByb2ZpbGU6IHN0cmluZyxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4gIGV4ZWN1dGFibGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NMSV9QQVRIID8/IFwiZGF0YWJyaWNrc1wiLFxuICBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcInN0YXJ0aW5nIERhdGFicmlja3MgQ0xJIGxvZ2luXCIsIHsgcHJvZmlsZSwgZXhlY3V0YWJsZSwgdGltZW91dE1zIH0pO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Qcm9jZXNzKFxuICAgIGV4ZWN1dGFibGUsXG4gICAgW1wiYXV0aFwiLCBcImxvZ2luXCIsIFwiLS1wcm9maWxlXCIsIHByb2ZpbGUsIFwiLS10aW1lb3V0XCIsIGAke01hdGguY2VpbCh0aW1lb3V0TXMgLyAxMDAwKX1zYF0sXG4gICAgZW52aXJvbm1lbnQsXG4gICk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApXG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCByZXN1bHQuc3RkZXJyIHx8IGBkYXRhYnJpY2tzIGF1dGggbG9naW4gZXhpdGVkICR7cmVzdWx0LmV4aXRDb2RlfWApO1xuICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIENMSSBsb2dpbiBjb21wbGV0ZWRcIiwgeyBwcm9maWxlLCBleGVjdXRhYmxlIH0pO1xufVxuXG4vKiogUmVxdWVzdCBvbmUgcHJvZmlsZSB0b2tlbiBmcm9tIHRoZSBEYXRhYnJpY2tzIENMSS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzQ2xpVG9rZW4oXG4gIHByb2ZpbGU6IHN0cmluZyxcbiAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gIGV4ZWN1dGFibGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NMSV9QQVRIID8/IFwiZGF0YWJyaWNrc1wiLFxuICBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogUHJvbWlzZTxUb2tlbj4ge1xuICBsb2dnZXIuZGVidWcoXCJyZXF1ZXN0aW5nIERhdGFicmlja3MgQ0xJIHRva2VuXCIsIHsgcHJvZmlsZSwgZXhlY3V0YWJsZSwgZm9yY2VSZWZyZXNoIH0pO1xuICBjb25zdCBhcmdzID0gW1wiYXV0aFwiLCBcInRva2VuXCIsIFwiLS1wcm9maWxlXCIsIHByb2ZpbGUsIFwiLS1vdXRwdXRcIiwgXCJqc29uXCJdO1xuICBpZiAoZm9yY2VSZWZyZXNoKSBhcmdzLnB1c2goXCItLWZvcmNlLXJlZnJlc2hcIik7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1blByb2Nlc3MoZXhlY3V0YWJsZSwgYXJncywgZW52aXJvbm1lbnQpO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjbGlcIiwgcmVzdWx0LnN0ZGVyciB8fCBgZGF0YWJyaWNrcyBhdXRoIHRva2VuIGV4aXRlZCAke3Jlc3VsdC5leGl0Q29kZX1gKTtcbiAgbGV0IHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICB2YWx1ZSA9IEpTT04ucGFyc2UocmVzdWx0LnN0ZG91dCA/PyBcIlwiKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY2xpXCIsIFwiRGF0YWJyaWNrcyBDTEkgdG9rZW4gb3V0cHV0IHdhcyBub3QgSlNPTlwiLCB7IGNhdXNlIH0pO1xuICB9XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gc3RyaW5nVmFsdWUodmFsdWUuYWNjZXNzX3Rva2VuID8/IHZhbHVlLmFjY2Vzc1Rva2VuKTtcbiAgaWYgKCFhY2Nlc3NUb2tlbikgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCBcIkRhdGFicmlja3MgQ0xJIHRva2VuIG91dHB1dCBoYWQgbm8gYWNjZXNzIHRva2VuXCIpO1xuICBjb25zdCB0b2tlbiA9IHtcbiAgICBhY2Nlc3NUb2tlbixcbiAgICB0b2tlblR5cGU6IHN0cmluZ1ZhbHVlKHZhbHVlLnRva2VuX3R5cGUgPz8gdmFsdWUudG9rZW5UeXBlKSA/PyBcIkJlYXJlclwiLFxuICAgIC4uLihzdHJpbmdWYWx1ZSh2YWx1ZS5yZWZyZXNoX3Rva2VuID8/IHZhbHVlLnJlZnJlc2hUb2tlbilcbiAgICAgID8geyByZWZyZXNoVG9rZW46IHN0cmluZ1ZhbHVlKHZhbHVlLnJlZnJlc2hfdG9rZW4gPz8gdmFsdWUucmVmcmVzaFRva2VuKSB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVmFsdWUodmFsdWUuZXhwaXJ5ID8/IHZhbHVlLmV4cGlyZXNfYXQpXG4gICAgICA/IHsgZXhwaXJ5OiBzdHJpbmdWYWx1ZSh2YWx1ZS5leHBpcnkgPz8gdmFsdWUuZXhwaXJlc19hdCkgfVxuICAgICAgOiB7fSksXG4gICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHZhbHVlLnNjb3BlcylcbiAgICAgID8gdmFsdWUuc2NvcGVzLmZpbHRlcigoc2NvcGUpOiBzY29wZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHNjb3BlID09PSBcInN0cmluZ1wiKVxuICAgICAgOiBbXSxcbiAgfTtcbiAgbG9nZ2VyLmRlYnVnKFwicmVjZWl2ZWQgRGF0YWJyaWNrcyBDTEkgdG9rZW5cIiwge1xuICAgIHByb2ZpbGUsXG4gICAgZm9yY2VSZWZyZXNoLFxuICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgfSk7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcnVuUHJvY2VzcyhcbiAgY29tbWFuZDogc3RyaW5nLFxuICBhcmdzOiBzdHJpbmdbXSxcbiAgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHRpbWVvdXRNcz86IG51bWJlcixcbik6IFByb21pc2U8eyBleGl0Q29kZTogbnVtYmVyOyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb250cm9sbGVyID0gdGltZW91dE1zID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGNvbnN0IHRpbWVvdXQgPSBjb250cm9sbGVyID8gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRpbWVvdXRNcykgOiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGV4ZWMuc3Bhd24oY29tbWFuZCwgYXJncywge1xuICAgICAgZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi5lbnZpcm9ubWVudCB9LFxuICAgICAgc3RkaW46IFwiaWdub3JlXCIsXG4gICAgICBzdGRvdXQ6IFwiY2FwdHVyZVwiLFxuICAgICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICAgIHNpZ25hbDogY29udHJvbGxlcj8uc2lnbmFsLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0aW1lb3V0KSBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gIH1cbn1cblxuLyoqIFByb3ZpZGVyIHRoYXQgbGF6aWx5IGRlbGVnYXRlcyBVMk0gY3JlZGVudGlhbHMgdG8gdGhlIERhdGFicmlja3MgQ0xJLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFicmlja3NDbGlQcm92aWRlciBpbXBsZW1lbnRzIFRva2VuUHJvdmlkZXIge1xuICBwcml2YXRlIHJlc29sdXRpb24/OiBQcm9taXNlPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9maWxlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBleGVjdXRhYmxlT3JSZXNvbHZlcjogc3RyaW5nIHwgRGF0YWJyaWNrc0NsaVJlc29sdmVyID0gKCkgPT5cbiAgICAgIHJlc29sdmVEYXRhYnJpY2tzQ2xpKCksXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuICApIHt9XG5cbiAgYXN5bmMgYXV0aGVudGljYXRlKF90aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gZGF0YWJyaWNrc0NsaVRva2VuKFxuICAgICAgdGhpcy5wcm9maWxlLFxuICAgICAgZmFsc2UsXG4gICAgICBhd2FpdCB0aGlzLnJlc29sdmVFeGVjdXRhYmxlKCksXG4gICAgICB0aGlzLmVudmlyb25tZW50LFxuICAgICk7XG4gIH1cblxuICBhc3luYyBsb2dpbih0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8VG9rZW4+IHtcbiAgICBjb25zdCBleGVjdXRhYmxlID0gYXdhaXQgdGhpcy5yZXNvbHZlRXhlY3V0YWJsZSgpO1xuICAgIGF3YWl0IGRhdGFicmlja3NDbGlMb2dpbih0aGlzLnByb2ZpbGUsIHRpbWVvdXRNcywgZXhlY3V0YWJsZSwgdGhpcy5lbnZpcm9ubWVudCk7XG4gICAgcmV0dXJuIGRhdGFicmlja3NDbGlUb2tlbih0aGlzLnByb2ZpbGUsIGZhbHNlLCBleGVjdXRhYmxlLCB0aGlzLmVudmlyb25tZW50KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goX3Rva2VuOiBUb2tlbik6IFByb21pc2U8VG9rZW4+IHtcbiAgICByZXR1cm4gZGF0YWJyaWNrc0NsaVRva2VuKHRoaXMucHJvZmlsZSwgdHJ1ZSwgYXdhaXQgdGhpcy5yZXNvbHZlRXhlY3V0YWJsZSgpLCB0aGlzLmVudmlyb25tZW50KTtcbiAgfVxuXG4gIGNhbkF1dGhlbnRpY2F0ZVNpbGVudGx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlRXhlY3V0YWJsZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5leGVjdXRhYmxlT3JSZXNvbHZlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidXNpbmcgY29uZmlndXJlZCBEYXRhYnJpY2tzIENMSSBleGVjdXRhYmxlXCIsIHtcbiAgICAgICAgcHJvZmlsZTogdGhpcy5wcm9maWxlLFxuICAgICAgICBleGVjdXRhYmxlOiB0aGlzLmV4ZWN1dGFibGVPclJlc29sdmVyLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZXhlY3V0YWJsZU9yUmVzb2x2ZXIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZXNvbHV0aW9uKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXVzZWQgcHJvdmlkZXIgQ0xJIHJlc29sdXRpb25cIiwgeyBwcm9maWxlOiB0aGlzLnByb2ZpbGUgfSk7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZpbmcgcHJvdmlkZXIgQ0xJIGxhemlseVwiLCB7IHByb2ZpbGU6IHRoaXMucHJvZmlsZSB9KTtcbiAgICB0aGlzLnJlc29sdXRpb24gPSB0aGlzLmV4ZWN1dGFibGVPclJlc29sdmVyKClcbiAgICAgIC50aGVuKChleGVjdXRhYmxlKSA9PiB7XG4gICAgICAgIGlmICghZXhlY3V0YWJsZSlcbiAgICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY2xpXCIsIFwiRGF0YWJyaWNrcyBDTEkgaXMgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGU7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnJlc29sdXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvbjtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9OdWxsKHZhbHVlKSA/PyB1bmRlZmluZWQ7XG59XG4iXX0=
|
package/lib/src/errors.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** Authentication failure with a stable category for callers and language shims. */
|
|
2
|
-
export declare class AuthError extends Error {
|
|
3
|
-
readonly kind: "config" | "oauth" | "storage" | "lock-timeout" | "cli" | "http";
|
|
4
|
-
constructor(kind: "config" | "oauth" | "storage" | "lock-timeout" | "cli" | "http", message: string, options?: ErrorOptions);
|
|
5
|
-
}
|
|
6
|
-
/** Normalize arbitrary failures without erasing their original cause. */
|
|
7
|
-
export declare function authError(kind: AuthError["kind"], message: string, cause?: unknown): AuthError;
|
package/lib/src/errors.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/** Authentication failure with a stable category for callers and language shims. */
|
|
2
|
-
export class AuthError extends Error {
|
|
3
|
-
kind;
|
|
4
|
-
constructor(kind, message, options) {
|
|
5
|
-
super(message, options);
|
|
6
|
-
this.kind = kind;
|
|
7
|
-
this.name = "AuthError";
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
/** Normalize arbitrary failures without erasing their original cause. */
|
|
11
|
-
export function authError(kind, message, cause) {
|
|
12
|
-
return cause instanceof AuthError ? cause : new AuthError(kind, message, { cause });
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvRkFBb0Y7QUFDcEYsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBRXZCO0lBRFgsWUFDVyxJQUFzRSxFQUMvRSxPQUFlLEVBQ2YsT0FBc0I7UUFFdEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUpmLFNBQUksR0FBSixJQUFJLENBQWtFO1FBSy9FLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQXVCLEVBQUUsT0FBZSxFQUFFLEtBQWU7SUFDakYsT0FBTyxLQUFLLFlBQVksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQXV0aGVudGljYXRpb24gZmFpbHVyZSB3aXRoIGEgc3RhYmxlIGNhdGVnb3J5IGZvciBjYWxsZXJzIGFuZCBsYW5ndWFnZSBzaGltcy4gKi9cbmV4cG9ydCBjbGFzcyBBdXRoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IFwiY29uZmlnXCIgfCBcIm9hdXRoXCIgfCBcInN0b3JhZ2VcIiB8IFwibG9jay10aW1lb3V0XCIgfCBcImNsaVwiIHwgXCJodHRwXCIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9IFwiQXV0aEVycm9yXCI7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhcmJpdHJhcnkgZmFpbHVyZXMgd2l0aG91dCBlcmFzaW5nIHRoZWlyIG9yaWdpbmFsIGNhdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dGhFcnJvcihraW5kOiBBdXRoRXJyb3JbXCJraW5kXCJdLCBtZXNzYWdlOiBzdHJpbmcsIGNhdXNlPzogdW5rbm93bik6IEF1dGhFcnJvciB7XG4gIHJldHVybiBjYXVzZSBpbnN0YW5jZW9mIEF1dGhFcnJvciA/IGNhdXNlIDogbmV3IEF1dGhFcnJvcihraW5kLCBtZXNzYWdlLCB7IGNhdXNlIH0pO1xufVxuIl19
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { CredentialStore, LockAdapter, Token } from "./types.ts";
|
|
2
|
-
import { FileLayout } from "./types.ts";
|
|
3
|
-
/** File-backed credential store preserving unrelated Databricks CLI entries. */
|
|
4
|
-
export declare class FileCredentialStore implements CredentialStore {
|
|
5
|
-
private readonly root;
|
|
6
|
-
private readonly layout;
|
|
7
|
-
private readonly locks;
|
|
8
|
-
constructor(root?: string, layout?: FileLayout, locks?: LockAdapter);
|
|
9
|
-
load(key: string): Promise<Token | undefined>;
|
|
10
|
-
prepareWrite(): Promise<void>;
|
|
11
|
-
save(key: string, token: Token): Promise<void>;
|
|
12
|
-
remove(key: string): Promise<void>;
|
|
13
|
-
acquireLock(key: string, timeoutMs?: number): Promise<string>;
|
|
14
|
-
releaseLock(lease: string): Promise<void>;
|
|
15
|
-
name(): string;
|
|
16
|
-
private forKey;
|
|
17
|
-
private withCacheLock;
|
|
18
|
-
private readCache;
|
|
19
|
-
private writeCache;
|
|
20
|
-
}
|
package/lib/src/file-storage.js
DELETED
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
-
import { chmod, mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { basename, dirname, join } from "node:path";
|
|
5
|
-
import { acquireFileLock } from "@dbx-tools/core/file-lock";
|
|
6
|
-
import { authLogger, credentialId, tokenMetadata } from "./_logging.js";
|
|
7
|
-
import { AuthError } from "./errors.js";
|
|
8
|
-
import { FileLayout } from "./types.js";
|
|
9
|
-
const logger = authLogger("file-storage");
|
|
10
|
-
class FileLocks {
|
|
11
|
-
lockDirectory;
|
|
12
|
-
leases = new Map();
|
|
13
|
-
constructor(lockDirectory) {
|
|
14
|
-
this.lockDirectory = lockDirectory;
|
|
15
|
-
}
|
|
16
|
-
async acquire(key, timeoutMs) {
|
|
17
|
-
logger.debug("waiting for file lock", {
|
|
18
|
-
credential: credentialId(key),
|
|
19
|
-
timeoutMs,
|
|
20
|
-
});
|
|
21
|
-
const lease = await acquireFileLock(key, { dir: this.lockDirectory, timeoutMs });
|
|
22
|
-
const id = randomUUID();
|
|
23
|
-
this.leases.set(id, lease);
|
|
24
|
-
logger.debug("file lock acquired", {
|
|
25
|
-
credential: credentialId(key),
|
|
26
|
-
backend: lease.backend,
|
|
27
|
-
});
|
|
28
|
-
return id;
|
|
29
|
-
}
|
|
30
|
-
async release(id) {
|
|
31
|
-
const lease = this.leases.get(id);
|
|
32
|
-
if (!lease)
|
|
33
|
-
return;
|
|
34
|
-
this.leases.delete(id);
|
|
35
|
-
await lease.release();
|
|
36
|
-
logger.debug("file lock released", { backend: lease.backend });
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/** File-backed credential store preserving unrelated Databricks CLI entries. */
|
|
40
|
-
export class FileCredentialStore {
|
|
41
|
-
root;
|
|
42
|
-
layout;
|
|
43
|
-
locks;
|
|
44
|
-
constructor(root = join(homedir(), ".databricks"), layout = FileLayout.Single, locks) {
|
|
45
|
-
this.root = root;
|
|
46
|
-
this.layout = layout;
|
|
47
|
-
this.locks = locks ?? new FileLocks(join(root, "locks"));
|
|
48
|
-
}
|
|
49
|
-
async load(key) {
|
|
50
|
-
const store = this.forKey(key);
|
|
51
|
-
return store.withCacheLock(async () => {
|
|
52
|
-
const token = deserializeToken((await store.readCache()).tokens[key]);
|
|
53
|
-
logger.debug("loaded file credential", {
|
|
54
|
-
credential: credentialId(key),
|
|
55
|
-
layout: this.layout,
|
|
56
|
-
token: tokenMetadata(token),
|
|
57
|
-
});
|
|
58
|
-
return token;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
async prepareWrite() {
|
|
62
|
-
await ensureDirectory(this.root, 0o700);
|
|
63
|
-
logger.debug("prepared credential directory", { layout: this.layout });
|
|
64
|
-
}
|
|
65
|
-
async save(key, token) {
|
|
66
|
-
const store = this.forKey(key);
|
|
67
|
-
await store.withCacheLock(async () => {
|
|
68
|
-
const cache = await store.readCache();
|
|
69
|
-
cache.tokens[key] = serializeToken(token);
|
|
70
|
-
await store.writeCache(cache);
|
|
71
|
-
logger.debug("saved file credential", {
|
|
72
|
-
credential: credentialId(key),
|
|
73
|
-
layout: this.layout,
|
|
74
|
-
token: tokenMetadata(token),
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
async remove(key) {
|
|
79
|
-
const store = this.forKey(key);
|
|
80
|
-
await store.withCacheLock(async () => {
|
|
81
|
-
const cache = await store.readCache();
|
|
82
|
-
delete cache.tokens[key];
|
|
83
|
-
await store.writeCache(cache);
|
|
84
|
-
logger.debug("removed file credential", {
|
|
85
|
-
credential: credentialId(key),
|
|
86
|
-
layout: this.layout,
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
acquireLock(key, timeoutMs) {
|
|
91
|
-
return this.locks.acquire(this.layout === FileLayout.Single ? `${this.root}:refresh` : `${this.root}:${key}:refresh`, timeoutMs);
|
|
92
|
-
}
|
|
93
|
-
releaseLock(lease) {
|
|
94
|
-
return this.locks.release(lease);
|
|
95
|
-
}
|
|
96
|
-
name() {
|
|
97
|
-
return "file";
|
|
98
|
-
}
|
|
99
|
-
forKey(key) {
|
|
100
|
-
if (this.layout === FileLayout.Single)
|
|
101
|
-
return this;
|
|
102
|
-
const digest = createHash("sha256").update(key).digest("hex");
|
|
103
|
-
return new FileCredentialStore(join(this.root, digest), FileLayout.Single, this.locks);
|
|
104
|
-
}
|
|
105
|
-
async withCacheLock(action) {
|
|
106
|
-
await ensureDirectory(this.root, 0o700);
|
|
107
|
-
const lease = await this.locks.acquire(`${this.root}:cache`, 30_000);
|
|
108
|
-
try {
|
|
109
|
-
return await action();
|
|
110
|
-
}
|
|
111
|
-
finally {
|
|
112
|
-
await this.locks.release(lease);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
async readCache() {
|
|
116
|
-
try {
|
|
117
|
-
const source = await readTextFile(join(this.root, "token-cache.json"));
|
|
118
|
-
const cache = source ? JSON.parse(source) : { version: 1, tokens: {} };
|
|
119
|
-
if (cache.version !== 1 || typeof cache.tokens !== "object" || !cache.tokens) {
|
|
120
|
-
throw new AuthError("storage", "Token cache must use version 1");
|
|
121
|
-
}
|
|
122
|
-
logger.debug("read token cache", {
|
|
123
|
-
exists: Boolean(source),
|
|
124
|
-
credentialCount: Object.keys(cache.tokens).length,
|
|
125
|
-
});
|
|
126
|
-
return cache;
|
|
127
|
-
}
|
|
128
|
-
catch (cause) {
|
|
129
|
-
if (cause instanceof AuthError)
|
|
130
|
-
throw cause;
|
|
131
|
-
throw new AuthError("storage", "Could not read Databricks token cache", { cause });
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async writeCache(cache) {
|
|
135
|
-
try {
|
|
136
|
-
await atomicWriteTextFile(join(this.root, "token-cache.json"), `${JSON.stringify(cache, null, 2)}\n`, 0o600);
|
|
137
|
-
logger.debug("wrote token cache", { credentialCount: Object.keys(cache.tokens).length });
|
|
138
|
-
}
|
|
139
|
-
catch (cause) {
|
|
140
|
-
throw new AuthError("storage", "Could not write Databricks token cache", { cause });
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async function ensureDirectory(path, mode) {
|
|
145
|
-
await mkdir(path, { recursive: true, mode });
|
|
146
|
-
await chmod(path, mode);
|
|
147
|
-
}
|
|
148
|
-
async function readTextFile(path) {
|
|
149
|
-
try {
|
|
150
|
-
return await readFile(path, "utf8");
|
|
151
|
-
}
|
|
152
|
-
catch (cause) {
|
|
153
|
-
if (cause.code === "ENOENT")
|
|
154
|
-
return undefined;
|
|
155
|
-
throw cause;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
async function atomicWriteTextFile(path, content, mode) {
|
|
159
|
-
const parent = dirname(path);
|
|
160
|
-
await ensureDirectory(parent, 0o700);
|
|
161
|
-
const temporary = join(parent, `.${basename(path)}-${randomUUID()}.tmp`);
|
|
162
|
-
try {
|
|
163
|
-
await writeFile(temporary, content, { mode, flag: "wx" });
|
|
164
|
-
await chmod(temporary, mode);
|
|
165
|
-
await rename(temporary, path);
|
|
166
|
-
}
|
|
167
|
-
finally {
|
|
168
|
-
await unlink(temporary).catch((cause) => {
|
|
169
|
-
if (cause.code !== "ENOENT")
|
|
170
|
-
throw cause;
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
function serializeToken(token) {
|
|
175
|
-
return {
|
|
176
|
-
access_token: token.accessToken,
|
|
177
|
-
token_type: token.tokenType,
|
|
178
|
-
...(token.refreshToken ? { refresh_token: token.refreshToken } : {}),
|
|
179
|
-
...(token.expiry ? { expiry: token.expiry } : {}),
|
|
180
|
-
...(token.scopes.length ? { scopes: token.scopes } : {}),
|
|
181
|
-
};
|
|
182
|
-
}
|
|
183
|
-
function deserializeToken(value) {
|
|
184
|
-
if (!value || typeof value !== "object")
|
|
185
|
-
return undefined;
|
|
186
|
-
const record = value;
|
|
187
|
-
const accessToken = stringValue(record.access_token ?? record.accessToken);
|
|
188
|
-
if (!accessToken)
|
|
189
|
-
return undefined;
|
|
190
|
-
return {
|
|
191
|
-
accessToken,
|
|
192
|
-
tokenType: stringValue(record.token_type ?? record.tokenType) ?? "Bearer",
|
|
193
|
-
...(stringValue(record.refresh_token ?? record.refreshToken)
|
|
194
|
-
? { refreshToken: stringValue(record.refresh_token ?? record.refreshToken) }
|
|
195
|
-
: {}),
|
|
196
|
-
...(stringValue(record.expiry ?? record.expires_at)
|
|
197
|
-
? { expiry: stringValue(record.expiry ?? record.expires_at) }
|
|
198
|
-
: {}),
|
|
199
|
-
scopes: Array.isArray(record.scopes)
|
|
200
|
-
? record.scopes.filter((scope) => typeof scope === "string")
|
|
201
|
-
: [],
|
|
202
|
-
};
|
|
203
|
-
}
|
|
204
|
-
function stringValue(value) {
|
|
205
|
-
return typeof value === "string" && value.trim() ? value : undefined;
|
|
206
|
-
}
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1zdG9yYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2ZpbGUtc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZUFBZSxFQUFzQixNQUFNLDJCQUEyQixDQUFDO0FBRWhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBTzFDLE1BQU0sU0FBUztJQUdnQjtJQUZaLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUUzRCxZQUE2QixhQUFxQjtRQUFyQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtJQUFHLENBQUM7SUFFdEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFXLEVBQUUsU0FBa0I7UUFDM0MsTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsRUFBRTtZQUNwQyxVQUFVLEVBQUUsWUFBWSxDQUFDLEdBQUcsQ0FBQztZQUM3QixTQUFTO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxlQUFlLENBQUMsR0FBRyxFQUFFLEVBQUUs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cnQgeyBjcmVhdGVIYXNoLCByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBjaG1vZCwgbWtkaXIsIHJlYWRGaWxlLCByZW5hbWUsIHVubGluaywgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGFjcXVpcmVGaWxlTG9jaywgdHlwZSBGaWxlTG9ja0xlYXNlIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZS9maWxlLWxvY2tcIjtcblxuaW1wb3J0IHsgYXV0aExvZ2dlciwgY3JlZGVudGlhbElkLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBDcmVkZW50aWFsU3RvcmUsIExvY2tBZGFwdGVyLCBUb2tlbiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5pbXBvcnQgeyBGaWxlTGF5b3V0IH0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcImZpbGUtc3RvcmFnZVwiKTtcblxuaW50ZXJmYWNlIFRva2VuQ2FjaGUge1xuICB2ZXJzaW9uOiBudW1iZXI7XG4gIHRva2VuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmNsYXNzIEZpbGVMb2NrcyBpbXBsZW1lbnRzIExvY2tBZGFwdGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsZWFzZXMgPSBuZXcgTWFwPHN0cmluZywgRmlsZUxvY2tMZWFzZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGxvY2tEaXJlY3Rvcnk6IHN0cmluZykge31cblxuICBhc3luYyBhY3F1aXJlKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIndhaXRpbmcgZm9yIGZpbGUgbG9ja1wiLCB7XG4gICAgICBjcmVkZW50aWFsOiBjcmVkZW50aWFsSWQoa2V5KSxcbiAgICAgIHRpbWVvdXRNcyxcbiAgICB9KTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IGFjcXVpcmVGaWxlTG9jayhrZXksIHsgZGlyOiB0aGlzLmxvY2tEaXJlY3RvcnksIHRpbWVvdXRNcyB9KTtcbiAgICBjb25zdCBpZCA9IHJhbmRvbVVVSUQoKTtcbiAgICB0aGlzLmxlYXNlcy5zZXQoaWQsIGxlYXNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlIGxvY2sgYWNxdWlyZWRcIiwge1xuICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICBiYWNrZW5kOiBsZWFzZS5iYWNrZW5kLFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbiAgfVxuXG4gIGFzeW5jIHJlbGVhc2UoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxlYXNlID0gdGhpcy5sZWFzZXMuZ2V0KGlkKTtcbiAgICBpZiAoIWxlYXNlKSByZXR1cm47XG4gICAgdGhpcy5sZWFzZXMuZGVsZXRlKGlkKTtcbiAgICBhd2FpdCBsZWFzZS5yZWxlYXNlKCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZSBsb2NrIHJlbGVhc2VkXCIsIHsgYmFja2VuZDogbGVhc2UuYmFja2VuZCB9KTtcbiAgfVxufVxuXG4vKiogRmlsZS1iYWNrZWQgY3JlZGVudGlhbCBzdG9yZSBwcmVzZXJ2aW5nIHVucmVsYXRlZCBEYXRhYnJpY2tzIENMSSBlbnRyaWVzLiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVDcmVkZW50aWFsU3RvcmUgaW1wbGVtZW50cyBDcmVkZW50aWFsU3RvcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tzOiBMb2NrQWRhcHRlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvb3QgPSBqb2luKGhvbWVkaXIoKSwgXCIuZGF0YWJyaWNrc1wiKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxheW91dCA9IEZpbGVMYXlvdXQuU2luZ2xlLFxuICAgIGxvY2tzPzogTG9ja0FkYXB0ZXIsXG4gICkge1xuICAgIHRoaXMubG9ja3MgPSBsb2NrcyA/PyBuZXcgRmlsZUxvY2tzKGpvaW4ocm9vdCwgXCJsb2Nrc1wiKSk7XG4gIH1cblxuICBhc3luYyBsb2FkKGtleTogc3RyaW5nKTogUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICByZXR1cm4gc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB0b2tlbiA9IGRlc2VyaWFsaXplVG9rZW4oKGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpKS50b2tlbnNba2V5XSk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICAgIHRva2VuOiB0b2tlbk1ldGFkYXRhKHRva2VuKSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRva2VuO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcHJlcGFyZVdyaXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBsb2dnZXIuZGVidWcoXCJwcmVwYXJlZCBjcmVkZW50aWFsIGRpcmVjdG9yeVwiLCB7IGxheW91dDogdGhpcy5sYXlvdXQgfSk7XG4gIH1cblxuICBhc3luYyBzYXZlKGtleTogc3RyaW5nLCB0b2tlbjogVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuZm9yS2V5KGtleSk7XG4gICAgYXdhaXQgc3RvcmUud2l0aENhY2hlTG9jayhhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHN0b3JlLnJlYWRDYWNoZSgpO1xuICAgICAgY2FjaGUudG9rZW5zW2tleV0gPSBzZXJpYWxpemVUb2tlbih0b2tlbik7XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNhdmVkIGZpbGUgY3JlZGVudGlhbFwiLCB7XG4gICAgICAgIGNyZWRlbnRpYWw6IGNyZWRlbnRpYWxJZChrZXkpLFxuICAgICAgICBsYXlvdXQ6IHRoaXMubGF5b3V0LFxuICAgICAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0b3JlID0gdGhpcy5mb3JLZXkoa2V5KTtcbiAgICBhd2FpdCBzdG9yZS53aXRoQ2FjaGVMb2NrKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgc3RvcmUucmVhZENhY2hlKCk7XG4gICAgICBkZWxldGUgY2FjaGUudG9rZW5zW2tleV07XG4gICAgICBhd2FpdCBzdG9yZS53cml0ZUNhY2hlKGNhY2hlKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlbW92ZWQgZmlsZSBjcmVkZW50aWFsXCIsIHtcbiAgICAgICAgY3JlZGVudGlhbDogY3JlZGVudGlhbElkKGtleSksXG4gICAgICAgIGxheW91dDogdGhpcy5sYXlvdXQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjcXVpcmVMb2NrKGtleTogc3RyaW5nLCB0aW1lb3V0TXM/OiBudW1iZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmxvY2tzLmFjcXVpcmUoXG4gICAgICB0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUgPyBgJHt0aGlzLnJvb3R9OnJlZnJlc2hgIDogYCR7dGhpcy5yb290fToke2tleX06cmVmcmVzaGAsXG4gICAgICB0aW1lb3V0TXMsXG4gICAgKTtcbiAgfVxuXG4gIHJlbGVhc2VMb2NrKGxlYXNlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2Nrcy5yZWxlYXNlKGxlYXNlKTtcbiAgfVxuXG4gIG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmaWxlXCI7XG4gIH1cblxuICBwcml2YXRlIGZvcktleShrZXk6IHN0cmluZyk6IEZpbGVDcmVkZW50aWFsU3RvcmUge1xuICAgIGlmICh0aGlzLmxheW91dCA9PT0gRmlsZUxheW91dC5TaW5nbGUpIHJldHVybiB0aGlzO1xuICAgIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGtleSkuZGlnZXN0KFwiaGV4XCIpO1xuICAgIHJldHVybiBuZXcgRmlsZUNyZWRlbnRpYWxTdG9yZShqb2luKHRoaXMucm9vdCwgZGlnZXN0KSwgRmlsZUxheW91dC5TaW5nbGUsIHRoaXMubG9ja3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2FjaGVMb2NrPFQ+KGFjdGlvbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIGF3YWl0IGVuc3VyZURpcmVjdG9yeSh0aGlzLnJvb3QsIDBvNzAwKTtcbiAgICBjb25zdCBsZWFzZSA9IGF3YWl0IHRoaXMubG9ja3MuYWNxdWlyZShgJHt0aGlzLnJvb3R9OmNhY2hlYCwgMzBfMDAwKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGFjdGlvbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmxvY2tzLnJlbGVhc2UobGVhc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZENhY2hlKCk6IFByb21pc2U8VG9rZW5DYWNoZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkVGV4dEZpbGUoam9pbih0aGlzLnJvb3QsIFwidG9rZW4tY2FjaGUuanNvblwiKSk7XG4gICAgICBjb25zdCBjYWNoZSA9IHNvdXJjZSA/IChKU09OLnBhcnNlKHNvdXJjZSkgYXMgVG9rZW5DYWNoZSkgOiB7IHZlcnNpb246IDEsIHRva2Vuczoge30gfTtcbiAgICAgIGlmIChjYWNoZS52ZXJzaW9uICE9PSAxIHx8IHR5cGVvZiBjYWNoZS50b2tlbnMgIT09IFwib2JqZWN0XCIgfHwgIWNhY2hlLnRva2Vucykge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwic3RvcmFnZVwiLCBcIlRva2VuIGNhY2hlIG11c3QgdXNlIHZlcnNpb24gMVwiKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInJlYWQgdG9rZW4gY2FjaGVcIiwge1xuICAgICAgICBleGlzdHM6IEJvb2xlYW4oc291cmNlKSxcbiAgICAgICAgY3JlZGVudGlhbENvdW50OiBPYmplY3Qua2V5cyhjYWNoZS50b2tlbnMpLmxlbmd0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBBdXRoRXJyb3IpIHRocm93IGNhdXNlO1xuICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcInN0b3JhZ2VcIiwgXCJDb3VsZCBub3QgcmVhZCBEYXRhYnJpY2tzIHRva2VuIGNhY2hlXCIsIHsgY2F1c2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUNhY2hlKGNhY2hlOiBUb2tlbkNhY2hlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGF0b21pY1dyaXRlVGV4dEZpbGUoXG4gICAgICAgIGpvaW4odGhpcy5yb290LCBcInRva2VuLWNhY2hlLmpzb25cIiksXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGNhY2hlLCBudWxsLCAyKX1cXG5gLFxuICAgICAgICAwbzYwMCxcbiAgICAgICk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ3cm90ZSB0b2tlbiBjYWNoZVwiLCB7IGNyZWRlbnRpYWxDb3VudDogT2JqZWN0LmtleXMoY2FjaGUudG9rZW5zKS5sZW5ndGggfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJzdG9yYWdlXCIsIFwiQ291bGQgbm90IHdyaXRlIERhdGFicmlja3MgdG9rZW4gY2FjaGVcIiwgeyBjYXVzZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGlyZWN0b3J5KHBhdGg6IHN0cmluZywgbW9kZTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG1rZGlyKHBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlLCBtb2RlIH0pO1xuICBhd2FpdCBjaG1vZChwYXRoLCBtb2RlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZFRleHRGaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRGaWxlKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBpZiAoKGNhdXNlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSA9PT0gXCJFTk9FTlRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB0aHJvdyBjYXVzZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBhdG9taWNXcml0ZVRleHRGaWxlKHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nLCBtb2RlOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGFyZW50ID0gZGlybmFtZShwYXRoKTtcbiAgYXdhaXQgZW5zdXJlRGlyZWN0b3J5KHBhcmVudCwgMG83MDApO1xuICBjb25zdCB0ZW1wb3JhcnkgPSBqb2luKHBhcmVudCwgYC4ke2Jhc2VuYW1lKHBhdGgpfS0ke3JhbmRvbVVVSUQoKX0udG1wYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeSwgY29udGVudCwgeyBtb2RlLCBmbGFnOiBcInd4XCIgfSk7XG4gICAgYXdhaXQgY2htb2QodGVtcG9yYXJ5LCBtb2RlKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5LCBwYXRoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCB1bmxpbmsodGVtcG9yYXJ5KS5jYXRjaCgoY2F1c2U6IE5vZGVKUy5FcnJub0V4Y2VwdGlvbikgPT4ge1xuICAgICAgaWYgKGNhdXNlLmNvZGUgIT09IFwiRU5PRU5UXCIpIHRocm93IGNhdXNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRva2VuKHRva2VuOiBUb2tlbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NfdG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgIHRva2VuX3R5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICAuLi4odG9rZW4ucmVmcmVzaFRva2VuID8geyByZWZyZXNoX3Rva2VuOiB0b2tlbi5yZWZyZXNoVG9rZW4gfSA6IHt9KSxcbiAgICAuLi4odG9rZW4uZXhwaXJ5ID8geyBleHBpcnk6IHRva2VuLmV4cGlyeSB9IDoge30pLFxuICAgIC4uLih0b2tlbi5zY29wZXMubGVuZ3RoID8geyBzY29wZXM6IHRva2VuLnNjb3BlcyB9IDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZVRva2VuKHZhbHVlOiB1bmtub3duKTogVG9rZW4gfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVjb3JkID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gc3RyaW5nVmFsdWUocmVjb3JkLmFjY2Vzc190b2tlbiA/PyByZWNvcmQuYWNjZXNzVG9rZW4pO1xuICBpZiAoIWFjY2Vzc1Rva2VuKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHRva2VuVHlwZTogc3RyaW5nVmFsdWUocmVjb3JkLnRva2VuX3R5cGUgPz8gcmVjb3JkLnRva2VuVHlwZSkgPz8gXCJCZWFyZXJcIixcbiAgICAuLi4oc3RyaW5nVmFsdWUocmVjb3JkLnJlZnJlc2hfdG9rZW4gPz8gcmVjb3JkLnJlZnJlc2hUb2tlbilcbiAgICAgID8geyByZWZyZXNoVG9rZW46IHN0cmluZ1ZhbHVlKHJlY29yZC5yZWZyZXNoX3Rva2VuID8/IHJlY29yZC5yZWZyZXNoVG9rZW4pIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzdHJpbmdWYWx1ZShyZWNvcmQuZXhwaXJ5ID8/IHJlY29yZC5leHBpcmVzX2F0KVxuICAgICAgPyB7IGV4cGlyeTogc3RyaW5nVmFsdWUocmVjb3JkLmV4cGlyeSA/PyByZWNvcmQuZXhwaXJlc19hdCkgfVxuICAgICAgOiB7fSksXG4gICAgc2NvcGVzOiBBcnJheS5pc0FycmF5KHJlY29yZC5zY29wZXMpXG4gICAgICA/IHJlY29yZC5zY29wZXMuZmlsdGVyKChzY29wZSk6IHNjb3BlIGlzIHN0cmluZyA9PiB0eXBlb2Ygc2NvcGUgPT09IFwic3RyaW5nXCIpXG4gICAgICA6IFtdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpbmdWYWx1ZSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUudHJpbSgpID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"schemaVersion": 1,
|
|
3
|
-
"dbxToolsVersion": "0.9.21",
|
|
4
|
-
"minimumVersion": "0.296.0",
|
|
5
|
-
"version": "1.19.0",
|
|
6
|
-
"publishedAt": "2026-09-30T13:13:22Z",
|
|
7
|
-
"assets": {
|
|
8
|
-
"darwin-arm64": {
|
|
9
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_darwin_arm64.tar.gz",
|
|
10
|
-
"sha256": "b84c6a8c623578308a724cdd7181b92b0816c2531564f16f8de7559b2a39f51f"
|
|
11
|
-
},
|
|
12
|
-
"darwin-x64": {
|
|
13
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_darwin_amd64.tar.gz",
|
|
14
|
-
"sha256": "d29a5dc1ea7d44d0d892fd4beac05d22daa932982ca6bf98a06d52c95f5ed4cd"
|
|
15
|
-
},
|
|
16
|
-
"linux-arm64": {
|
|
17
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_linux_arm64.tar.gz",
|
|
18
|
-
"sha256": "2997ccbda57090ee48bd9282d5cb3a5bef78025db64fd1573fbd7c8726856086"
|
|
19
|
-
},
|
|
20
|
-
"linux-x64": {
|
|
21
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_linux_amd64.tar.gz",
|
|
22
|
-
"sha256": "bddf87df3d72b61384da724b40f18ab483a98af742748260097a7bb8154b070e"
|
|
23
|
-
},
|
|
24
|
-
"win32-arm64": {
|
|
25
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_windows_arm64.tar.gz",
|
|
26
|
-
"sha256": "c28d098490ea1966230c07585312f8bc66e18d468e34b06319d44e29d61c4602"
|
|
27
|
-
},
|
|
28
|
-
"win32-x64": {
|
|
29
|
-
"url": "https://github.com/databricks/cli/releases/download/v1.19.0/databricks_cli_1.19.0_windows_amd64.tar.gz",
|
|
30
|
-
"sha256": "0ded24a2b001e001c815b9c1c66dc2ef1f6c2e60c64f63c6d9afb8e9fe85afdb"
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
package/lib/src/http-client.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { type DatabricksAuthDependencies } from "./databricks-auth.ts";
|
|
2
|
-
import type { AuthClient, DatabricksAuthOptions } from "./types.ts";
|
|
3
|
-
/** Options for one Databricks JSON API request. */
|
|
4
|
-
export interface DatabricksRequestOptions {
|
|
5
|
-
method?: string;
|
|
6
|
-
body?: unknown;
|
|
7
|
-
headers?: Headers | Record<string, string> | [string, string][];
|
|
8
|
-
login?: boolean;
|
|
9
|
-
signal?: AbortSignal;
|
|
10
|
-
}
|
|
11
|
-
/** Dependency-light Databricks JSON client with one rejected-token refresh. */
|
|
12
|
-
export declare class DatabricksClient {
|
|
13
|
-
readonly auth: AuthClient;
|
|
14
|
-
private readonly fetcher;
|
|
15
|
-
private constructor();
|
|
16
|
-
static create(options?: DatabricksAuthOptions, dependencies?: DatabricksAuthDependencies): Promise<DatabricksClient>;
|
|
17
|
-
profile(): string;
|
|
18
|
-
host(): string;
|
|
19
|
-
principal(): string;
|
|
20
|
-
workspaceId(): string | undefined;
|
|
21
|
-
request(path: string, options?: DatabricksRequestOptions): Promise<unknown>;
|
|
22
|
-
private send;
|
|
23
|
-
}
|