@dbx-tools/core 0.9.19 → 0.9.21
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/._LICENSE +0 -0
- package/._README.md +0 -0
- package/._index.ts +0 -0
- package/._package.json +0 -0
- package/README.md +1 -2
- package/index.ts +1 -1
- package/lib/._index.d.ts +0 -0
- package/lib/._index.js +0 -0
- package/lib/._tsconfig.tsbuildinfo +0 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/._bin.d.ts +0 -0
- package/lib/src/._bin.js +0 -0
- package/lib/src/._brand-files.d.ts +0 -0
- package/lib/src/._brand-files.js +0 -0
- package/lib/src/._bundle.d.ts +0 -0
- package/lib/src/._bundle.js +0 -0
- package/lib/src/._config-utils.d.ts +0 -0
- package/lib/src/._config-utils.js +0 -0
- package/lib/src/._dependency-resolver.d.ts +0 -0
- package/lib/src/._dependency-resolver.js +0 -0
- package/lib/src/._exec.d.ts +0 -0
- package/lib/src/._exec.js +0 -0
- package/lib/src/._file-lock.d.ts +0 -0
- package/lib/src/._file-lock.js +0 -0
- package/lib/src/._file.d.ts +0 -0
- package/lib/src/._file.js +0 -0
- package/lib/src/._npm-resolver.d.ts +0 -0
- package/lib/src/._npm-resolver.js +0 -0
- package/lib/src/._process-lock.d.ts +0 -0
- package/lib/src/._process-lock.js +0 -0
- package/lib/src/._project-utils.d.ts +0 -0
- package/lib/src/._project-utils.js +0 -0
- package/lib/src/bin.d.ts +0 -5
- package/lib/src/bin.js +4 -7
- package/lib/src/npm-resolver.d.ts +44 -0
- package/lib/src/npm-resolver.js +367 -0
- package/package.json +3 -3
- package/src/._bin.ts +0 -0
- package/src/._brand-files.ts +0 -0
- package/src/._bundle.ts +0 -0
- package/src/._config-utils.ts +0 -0
- package/src/._dependency-resolver.ts +0 -0
- package/src/._exec.ts +0 -0
- package/src/._file-lock.ts +0 -0
- package/src/._file.ts +0 -0
- package/src/._process-lock.ts +0 -0
- package/src/._project-utils.ts +0 -0
- package/src/bin.ts +3 -13
package/._LICENSE
ADDED
|
Binary file
|
package/._README.md
ADDED
|
Binary file
|
package/._index.ts
ADDED
|
Binary file
|
package/._package.json
ADDED
|
Binary file
|
package/README.md
CHANGED
|
@@ -55,8 +55,7 @@ be unpacked automatically; a single-file archive needs no selector, while a
|
|
|
55
55
|
selector can choose a binary from a larger archive. The selected file is
|
|
56
56
|
normalized to mode `0755` and must report an acceptable version before it is
|
|
57
57
|
atomically moved into place; the final renamed path runs the same validation
|
|
58
|
-
again before returning.
|
|
59
|
-
the producer already identified the requested version.
|
|
58
|
+
again before returning.
|
|
60
59
|
|
|
61
60
|
Every candidate runs with `--version` before it is accepted. Set
|
|
62
61
|
`versionArgument` for a different argument and `minVersion` to require a partial
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
6
|
-
export const PACKAGE_VERSION = "0.9.
|
|
6
|
+
export const PACKAGE_VERSION = "0.9.21";
|
|
7
7
|
export * as bin from "./src/bin.ts";
|
|
8
8
|
export * as brandFiles from "./src/brand-files.ts";
|
|
9
9
|
export * as bundle from "./src/bundle.ts";
|
package/lib/._index.d.ts
ADDED
|
Binary file
|
package/lib/._index.js
ADDED
|
Binary file
|
|
Binary file
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.9.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.9.21";
|
|
3
3
|
export * as bin from "./src/bin.ts";
|
|
4
4
|
export * as brandFiles from "./src/brand-files.ts";
|
|
5
5
|
export * as bundle from "./src/bundle.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/core";
|
|
5
|
-
export const PACKAGE_VERSION = "0.9.
|
|
5
|
+
export const PACKAGE_VERSION = "0.9.21";
|
|
6
6
|
export * as bin from "./src/bin.js";
|
|
7
7
|
export * as brandFiles from "./src/brand-files.js";
|
|
8
8
|
export * as bundle from "./src/bundle.js";
|
|
@@ -16,4 +16,4 @@ export * as projectUtils from "./src/project-utils.js";
|
|
|
16
16
|
export { BrandContextSchema, defaultBrandContext, parseBrandContext, brandContextJsonSchema, brandContextPrompt } from "./src/brand-files.js";
|
|
17
17
|
export { MAX_TCP_PORT, ENV_ONLY, valueSchema, bundleResourceSchema, bundleEnvEntrySchema, bundleAppSchema, appEnvEntrySchema, appSchema } from "./src/config-utils.js";
|
|
18
18
|
export { COMMAND_NOT_FOUND_EXIT_CODE } from "./src/exec.js";
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssV0FBVyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sS0FBSyxrQkFBa0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFlBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU5SSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3ZLLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvY29yZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjIxXCI7XG5leHBvcnQgKiBhcyBiaW4gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0ICogYXMgYnJhbmRGaWxlcyBmcm9tIFwiLi9zcmMvYnJhbmQtZmlsZXMudHNcIjtcbmV4cG9ydCAqIGFzIGJ1bmRsZSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWdVdGlscyBmcm9tIFwiLi9zcmMvY29uZmlnLXV0aWxzLnRzXCI7XG5leHBvcnQgKiBhcyBkZXBlbmRlbmN5UmVzb2x2ZXIgZnJvbSBcIi4vc3JjL2RlcGVuZGVuY3ktcmVzb2x2ZXIudHNcIjtcbmV4cG9ydCAqIGFzIGV4ZWMgZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGUgZnJvbSBcIi4vc3JjL2ZpbGUudHNcIjtcbmV4cG9ydCAqIGFzIGZpbGVMb2NrIGZyb20gXCIuL3NyYy9maWxlLWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHByb2Nlc3NMb2NrIGZyb20gXCIuL3NyYy9wcm9jZXNzLWxvY2sudHNcIjtcbmV4cG9ydCAqIGFzIHByb2plY3RVdGlscyBmcm9tIFwiLi9zcmMvcHJvamVjdC11dGlscy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCaW5Db250ZXh0LCBCaW5TZWxlY3Rpb25Db250ZXh0LCBCaW5TZWxlY3RvciwgQmluVmVyc2lvbk91dHB1dCwgQmluVmVyc2lvblBhcnNlciwgQmluT3B0aW9ucywgQmluVXJsUmVzb2x2ZUNvbnRleHQsIEJpblNvdXJjZSwgQmluVXJsIH0gZnJvbSBcIi4vc3JjL2Jpbi50c1wiO1xuZXhwb3J0IHsgQnJhbmRDb250ZXh0U2NoZW1hLCBkZWZhdWx0QnJhbmRDb250ZXh0LCBwYXJzZUJyYW5kQ29udGV4dCwgYnJhbmRDb250ZXh0SnNvblNjaGVtYSwgYnJhbmRDb250ZXh0UHJvbXB0IH0gZnJvbSBcIi4vc3JjL2JyYW5kLWZpbGVzLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJyYW5kQ29udGV4dCwgQnJhbmRDb250ZXh0SW5wdXQgfSBmcm9tIFwiLi9zcmMvYnJhbmQtZmlsZXMudHNcIjtcbmV4cG9ydCB7IE1BWF9UQ1BfUE9SVCwgRU5WX09OTFksIHZhbHVlU2NoZW1hLCBidW5kbGVSZXNvdXJjZVNjaGVtYSwgYnVuZGxlRW52RW50cnlTY2hlbWEsIGJ1bmRsZUFwcFNjaGVtYSwgYXBwRW52RW50cnlTY2hlbWEsIGFwcFNjaGVtYSB9IGZyb20gXCIuL3NyYy9jb25maWctdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ29uZmlnTWFwVmFsdWUsIENvbmZpZ0RhdGEsIENvbmZpZ1NvdXJjZSwgQ29uZmlnT3B0aW9ucywgQ29uZmlnRmlsZSB9IGZyb20gXCIuL3NyYy9jb25maWctdXRpbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGVwZW5kZW5jeVJlc29sdmVyT3B0aW9ucywgRGVwZW5kZW5jeUluZm8sIFJlc29sdmVkTnBtVmVyc2lvbiwgTnBtU3BlY2lmaWVySW5wdXQsIFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzLCBNaXNzaW5nRGVwZW5kZW5jeUluZm8gfSBmcm9tIFwiLi9zcmMvZGVwZW5kZW5jeS1yZXNvbHZlci50c1wiO1xuZXhwb3J0IHsgQ09NTUFORF9OT1RfRk9VTkRfRVhJVF9DT0RFIH0gZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRXhlY1N0ZGlvLCBMaW5lSGFuZGxlciwgU3RkaW9PcHRpb24sIEV4ZWNSZXN1bHQsIENoaWxkUHJvY2Vzc1Jlc3VsdCwgRXhlY09wdGlvbnMsIFN5bmNFeGVjU3RkaW8sIFN5bmNFeGVjT3B0aW9ucywgU3Bhd25BcmdzIH0gZnJvbSBcIi4vc3JjL2V4ZWMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRmlsZUxvY2tCYWNrZW5kLCBGaWxlTG9ja0FjcXVpc2l0aW9uLCBGaWxlTG9ja09wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZmlsZS1sb2NrLnRzXCI7XG5leHBvcnQgdHlwZSB7IFByb2plY3RDb250ZXh0LCBOcG1SZWdpc3RyeU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvcHJvamVjdC11dGlscy50c1wiO1xuIl19
|
|
Binary file
|
package/lib/src/._bin.js
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/lib/src/bin.d.ts
CHANGED
|
@@ -46,11 +46,6 @@ export interface BinUrlResolveContext {
|
|
|
46
46
|
export interface BinSource {
|
|
47
47
|
url: string;
|
|
48
48
|
sha256?: string;
|
|
49
|
-
/**
|
|
50
|
-
* Skip `--version` on this candidate. Use when the source already identified
|
|
51
|
-
* the requested version, such as `cargo install --version`.
|
|
52
|
-
*/
|
|
53
|
-
trustVersion?: boolean;
|
|
54
49
|
}
|
|
55
50
|
/** A download source resolved only when the executable is not already installed. */
|
|
56
51
|
export type BinUrl = string | BinSource | ((context: BinUrlResolveContext) => string | BinSource | Promise<string | BinSource>);
|
package/lib/src/bin.js
CHANGED
|
@@ -296,11 +296,8 @@ export async function ensure(name, url, options = {}) {
|
|
|
296
296
|
logger.debug("resolved binary source", { name, from });
|
|
297
297
|
const selected = await selectedBin(destination, source, temp, options);
|
|
298
298
|
await chmod(selected, 0o755);
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
throw new Error(source.trustVersion
|
|
302
|
-
? `selected binary is not executable: ${selected}`
|
|
303
|
-
: `selected binary has no acceptable version: ${selected}`);
|
|
299
|
+
if (!(await isValidBin(selected, options))) {
|
|
300
|
+
throw new Error(`selected binary has no acceptable version: ${selected}`);
|
|
304
301
|
}
|
|
305
302
|
await mkdir(destination.binDir, { recursive: true });
|
|
306
303
|
staged = join(destination.binDir, `.${name}-${randomUUID()}`);
|
|
@@ -308,7 +305,7 @@ export async function ensure(name, url, options = {}) {
|
|
|
308
305
|
await chmod(staged, 0o755);
|
|
309
306
|
await rename(staged, destination.path);
|
|
310
307
|
staged = undefined;
|
|
311
|
-
if (!(await isValidBin(destination.path,
|
|
308
|
+
if (!(await isValidBin(destination.path, options))) {
|
|
312
309
|
throw new Error(`installed binary is invalid after rename: ${destination.path}`);
|
|
313
310
|
}
|
|
314
311
|
logger.info("installed binary", {
|
|
@@ -325,4 +322,4 @@ export async function ensure(name, url, options = {}) {
|
|
|
325
322
|
}
|
|
326
323
|
});
|
|
327
324
|
}
|
|
328
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFnRnRDLFNBQVMsT0FBTyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsV0FBd0I7SUFDdEUsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJ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LEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDOUQsTUFBTSxRQUFRLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pDLE1BQU0sS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMzQixNQUFNLE1BQU0sQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sR0FBRyxTQUFTLENBQUM7WUFDbkIsSUFBSSxDQUFDLENBQUMsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFO2dCQUM5QixJQUFJO2dCQUNKLElBQUk7Z0JBQ0osRUFBRSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2FBQ3JCLENBQUMsQ0FBQztZQUNILE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksTUFBTTtnQkFBRSxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM5QyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEluc3RhbGwgYW5kIHJldXNlIGV4ZWN1dGFibGUgYmluYXJpZXMgdW5kZXIgYSBwZXItdG9vbCBob21lIGRpcmVjdG9yeS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgY2htb2QsXG4gIGNvcHlGaWxlLFxuICBta2RpcixcbiAgbWtkdGVtcCxcbiAgcmVhZGRpcixcbiAgcmVuYW1lLFxuICBybSxcbiAgc3RhdCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaG9tZWRpciwgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSBcIm5vZGU6dXRpbFwiO1xuXG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IGV4dHJhY3RaaXAgZnJvbSBcImV4dHJhY3QtemlwXCI7XG5pbXBvcnQgeyB4IGFzIGV4dHJhY3RUYXIgfSBmcm9tIFwidGFyXCI7XG5cbmltcG9ydCB7IHdpdGhGaWxlTG9jayB9IGZyb20gXCIuL2ZpbGUtbG9jay50c1wiO1xuXG5jb25zdCBleGVjRmlsZUFzeW5jID0gcHJvbWlzaWZ5KGV4ZWNGaWxlKTtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjb3JlOmJpblwiKTtcblxuaW50ZXJmYWNlIFBhcnNlZFZlcnNpb24ge1xuICByYXc6IHN0cmluZztcbiAgcGFydHM6IG51bWJlcltdO1xufVxuXG5pbnRlcmZhY2UgQmluQWNjZXNzQ29udGV4dCB7XG4gIGZpbGU6IGJvb2xlYW47XG4gIGV4ZWN1dGFibGU6IGJvb2xlYW47XG59XG5cbi8qKiBTdGFibGUgcGF0aHMgZm9yIGFuIGluc3RhbGxlZCBiaW5hcnkuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbkNvbnRleHQge1xuICByb290OiBzdHJpbmc7XG4gIGJpbkRpcjogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKiBUZW1wb3JhcnkgZG93bmxvYWQgYW5kIGV4dHJhY3Rpb24gcGF0aHMgc3VwcGxpZWQgdG8gYSBjdXN0b20gc2VsZWN0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpblNlbGVjdGlvbkNvbnRleHQge1xuICBkZXN0aW5hdGlvbjogQmluQ29udGV4dDtcbiAgZG93bmxvYWRQYXRoOiBzdHJpbmc7XG4gIHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNlbGVjdCB0aGUgZXhlY3V0YWJsZSBmcm9tIGEgZG93bmxvYWQgb3IgdW5wYWNrZWQgYXJjaGl2ZS4gQSBzZWxlY3RvciBtYXlcbiAqIGFsc28gcHJlcGFyZSB0aGUgZmlsZSwgc3VjaCBhcyBhcHBseWluZyBpdHMgZXhlY3V0YWJsZSBtb2RlLlxuICovXG5leHBvcnQgdHlwZSBCaW5TZWxlY3RvciA9IChjb250ZXh0OiBCaW5TZWxlY3Rpb25Db250ZXh0KSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG5cbi8qKiBDYXB0dXJlZCBvdXRwdXQgcGFzc2VkIHRvIGEgY3VzdG9tIGJpbmFyeSB2ZXJzaW9uIHBhcnNlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluVmVyc2lvbk91dHB1dCB7XG4gIHN0ZG91dDogc3RyaW5nO1xuICBzdGRlcnI6IHN0cmluZztcbn1cblxuLyoqIEV4dHJhY3QgYSB2ZXJzaW9uIHN0cmluZyBmcm9tIGEgc3VjY2Vzc2Z1bCB2ZXJzaW9uLWNvbW1hbmQgcmVzdWx0LiAqL1xuZXhwb3J0IHR5cGUgQmluVmVyc2lvblBhcnNlciA9IChvdXRwdXQ6IEJpblZlcnNpb25PdXRwdXQpID0+IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBlbnN1cmV9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5PcHRpb25zIHtcbiAgYXV0b1VucGFja2FnZT86IGJvb2xlYW47XG4gIHNlbGVjdG9yPzogQmluU2VsZWN0b3I7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIC8qKiBFeGFjdCBpbnN0YWxsYXRpb24gcGF0aHMuIE9taXNzaW9uIGtlZXBzIGAkSE9NRS8uPG5hbWU+L2Jpbi88bmFtZT5gLiAqL1xuICBkZXN0aW5hdGlvbj86IEJpbkNvbnRleHQ7XG4gIC8qKiBNaW5pbXVtIGFjY2VwdGVkIG51bWVyaWMgdmVyc2lvbiwgd2l0aCBvbmUgdG8gdGhyZWUgY29tcG9uZW50cy4gKi9cbiAgbWluVmVyc2lvbj86IHN0cmluZztcbiAgLyoqIEFyZ3VtZW50IHBhc3NlZCB0byB0aGUgYmluYXJ5IGZvciB2ZXJzaW9uIGRldGVjdGlvbi4gRGVmYXVsdHMgdG8gYC0tdmVyc2lvbmAuICovXG4gIHZlcnNpb25Bcmd1bWVudD86IHN0cmluZztcbiAgLyoqIFZlcnNpb24gb3V0cHV0IHBhcnNlci4gRGVmYXVsdHMgdG8ge0BsaW5rIHBhcnNlVmVyc2lvbn0uICovXG4gIHZlcnNpb25QYXJzZXI/OiBCaW5WZXJzaW9uUGFyc2VyO1xuICAvKiogU2tpcCBgLS12ZXJzaW9uYCBhbmQgdHJlYXQgYW4gZXhlY3V0YWJsZSBmaWxlIGFzIGFjY2VwdGFibGUuICovXG4gIHNraXBWZXJzaW9uQ2hlY2s/OiBib29sZWFuO1xufVxuXG4vKiogVGVtcG9yYXJ5IGRpcmVjdG9yeSBjcmVhdGVkIGZvciBvbmUgYGVuc3VyZWAgYXR0ZW1wdCBhZnRlciB0aGUgaW5zdGFsbCBsb2NrLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5VcmxSZXNvbHZlQ29udGV4dCB7XG4gIHJlYWRvbmx5IHRlbXBEaXI6IHN0cmluZztcbn1cblxuLyoqIERvd25sb2FkIHNvdXJjZSByZXNvbHZlZCBvbmx5IHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgbm90IGFscmVhZHkgaW5zdGFsbGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5Tb3VyY2Uge1xuICB1cmw6IHN0cmluZztcbiAgc2hhMjU2Pzogc3RyaW5nO1xuICAvKipcbiAgICogU2tpcCBgLS12ZXJzaW9uYCBvbiB0aGlzIGNhbmRpZGF0ZS4gVXNlIHdoZW4gdGhlIHNvdXJjZSBhbHJlYWR5IGlkZW50aWZpZWRcbiAgICogdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLCBzdWNoIGFzIGBjYXJnbyBpbnN0YWxsIC0tdmVyc2lvbmAuXG4gICAqL1xuICB0cnVzdFZlcnNpb24/OiBib29sZWFuO1xufVxuXG4vKiogQSBkb3dubG9hZCBzb3VyY2UgcmVzb2x2ZWQgb25seSB3aGVuIHRoZSBleGVjdXRhYmxlIGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZC4gKi9cbmV4cG9ydCB0eXBlIEJpblVybCA9XG4gIHwgc3RyaW5nXG4gIHwgQmluU291cmNlXG4gIHwgKChjb250ZXh0OiBCaW5VcmxSZXNvbHZlQ29udGV4dCkgPT4gc3RyaW5nIHwgQmluU291cmNlIHwgUHJvbWlzZTxzdHJpbmcgfCBCaW5Tb3VyY2U+KTtcblxuZnVuY3Rpb24gY29udGV4dChuYW1lOiBzdHJpbmcsIGhvbWVEaXI6IHN0cmluZywgZGVzdGluYXRpb24/OiBCaW5Db250ZXh0KTogQmluQ29udGV4dCB7XG4gIGlmICghbmFtZSB8fCBiYXNlbmFtZShuYW1lKSAhPT0gbmFtZSB8fCBuYW1lID09PSBcIi5cIiB8fCBuYW1lID09PSBcIi4uXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIGJpbmFyeSBuYW1lOiAke25hbWV9YCk7XG4gIH1cbiAgaWYgKGRlc3RpbmF0aW9uKSByZXR1cm4gZGVzdGluYXRpb247XG4gIGNvbnN0IHJvb3QgPSBqb2luKGhvbWVEaXIsIGAuJHtuYW1lfWApO1xuICBjb25zdCBiaW5EaXIgPSBqb2luKHJvb3QsIFwiYmluXCIpO1xuICByZXR1cm4geyByb290LCBiaW5EaXIsIHBhdGg6IGpvaW4oYmluRGlyLCBuYW1lKSB9O1xufVxuXG5mdW5jdGlvbiBkaXNwbGF5VXJsKHJhdzogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJhdyk7XG4gICAgaWYgKHVybC5wcm90b2NvbCA9PT0gXCJkYXRhOlwiKSByZXR1cm4gXCJkYXRhOlwiO1xuICAgIHVybC51c2VybmFtZSA9IFwiXCI7XG4gICAgdXJsLnBhc3N3b3JkID0gXCJcIjtcbiAgICB1cmwuc2VhcmNoID0gXCJcIjtcbiAgICB1cmwuaGFzaCA9IFwiXCI7XG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFjY2Vzc0NvbnRleHQocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCaW5BY2Nlc3NDb250ZXh0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIGNvbnN0IGZpbGUgPSBlbnRyeS5pc0ZpbGUoKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZSxcbiAgICAgIGV4ZWN1dGFibGU6IGZpbGUgJiYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIiB8fCAoZW50cnkubW9kZSAmIDBvMTExKSAhPT0gMCksXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHsgZmlsZTogZmFsc2UsIGV4ZWN1dGFibGU6IGZhbHNlIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZWN0ZWRWZXJzaW9ucyhvdXRwdXQ6IHN0cmluZyk6IFBhcnNlZFZlcnNpb25bXSB7XG4gIGNvbnN0IHZlcnNpb25zOiBQYXJzZWRWZXJzaW9uW10gPSBbXTtcbiAgY29uc3QgcGF0dGVybiA9IC9cXGJ2PyhcXGQrKD86XFwuXFxkKyl7MCwyfSkoPzpbLSsuX10/W2Etel1bMC05YS16LitfLV0qKT8vZ2k7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKHBhdHRlcm4pKSB7XG4gICAgY29uc3QgcmF3ID0gbWF0Y2hbMF0ucmVwbGFjZSgvXnYvaSwgXCJcIik7XG4gICAgY29uc3QgcGFydHMgPSBtYXRjaFsxXT8uc3BsaXQoXCIuXCIpLm1hcChOdW1iZXIpO1xuICAgIGlmIChwYXJ0cz8uZXZlcnkoTnVtYmVyLmlzRmluaXRlKSkgdmVyc2lvbnMucHVzaCh7IHJhdywgcGFydHMgfSk7XG4gIH1cbiAgcmV0dXJuIHZlcnNpb25zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBpZiAoYS5wYXJ0cy5sZW5ndGggIT09IGIucGFydHMubGVuZ3RoKSByZXR1cm4gYi5wYXJ0cy5sZW5ndGggLSBhLnBhcnRzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5wYXJ0cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIGNvbnN0IG9yZGVyID0gKGIucGFydHNbaW5kZXhdID8/IDApIC0gKGEucGFydHNbaW5kZXhdID8/IDApO1xuICAgICAgaWYgKG9yZGVyICE9PSAwKSByZXR1cm4gb3JkZXI7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgZGVlcGVzdCwgaGlnaGVzdCB2ZXJzaW9uIGZyb20gc3Rkb3V0LCBmYWxsaW5nIGJhY2sgdG8gc3RkZXJyIG9ubHlcbiAqIHdoZW4gc3Rkb3V0IGNvbnRhaW5zIG5vIHZlcnNpb24uIFN1cHBvcnRzIG9uZSB0byB0aHJlZSBudW1lcmljIGNvbXBvbmVudHNcbiAqIGFuZCBjb21tb24gc3VmZml4ZXMgc3VjaCBhcyBgcmMxYCwgYC5wb3N0MWAsIGFuZCBgLWRldi4yYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvbih7IHN0ZG91dCwgc3RkZXJyIH06IEJpblZlcnNpb25PdXRwdXQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gZGV0ZWN0ZWRWZXJzaW9ucyhzdGRvdXQpLmF0KDApPy5yYXcgPz8gZGV0ZWN0ZWRWZXJzaW9ucyhzdGRlcnIpLmF0KDApPy5yYXc7XG59XG5cbmZ1bmN0aW9uIG51bWVyaWNWZXJzaW9uKHZlcnNpb246IHN0cmluZywgc3RyaWN0OiBib29sZWFuKTogbnVtYmVyW10gfCB1bmRlZmluZWQge1xuICBjb25zdCBwYXR0ZXJuID0gc3RyaWN0ID8gL15cXHMqdj8oXFxkKyg/OlxcLlxcZCspezAsMn0pXFxzKiQvaSA6IC9cXGJ2PyhcXGQrKD86XFwuXFxkKyl7MCwyfSkvaTtcbiAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWModmVyc2lvbik7XG4gIHJldHVybiBtYXRjaD8uWzFdPy5zcGxpdChcIi5cIikubWFwKE51bWJlcik7XG59XG5cbmZ1bmN0aW9uIG1lZXRzTWluVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcsIG1pblZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIW1pblZlcnNpb24pIHJldHVybiB0cnVlO1xuICBjb25zdCBhY3R1YWwgPSBudW1lcmljVmVyc2lvbih2ZXJzaW9uLCBmYWxzZSk7XG4gIGNvbnN0IG1pbmltdW0gPSBudW1lcmljVmVyc2lvbihtaW5WZXJzaW9uLCB0cnVlKTtcbiAgaWYgKCFtaW5pbXVtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCBtaW5pbXVtIGJpbmFyeSB2ZXJzaW9uOiAke21pblZlcnNpb259YCk7XG4gIH1cbiAgaWYgKCFhY3R1YWwpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IE1hdGgubWF4KGFjdHVhbC5sZW5ndGgsIG1pbmltdW0ubGVuZ3RoKTsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGRpZmZlcmVuY2UgPSAoYWN0dWFsW2luZGV4XSA/PyAwKSAtIChtaW5pbXVtW2luZGV4XSA/PyAwKTtcbiAgICBpZiAoZGlmZmVyZW5jZSAhPT0gMCkgcmV0dXJuIGRpZmZlcmVuY2UgPiAwO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpc1ZhbGlkQmluKHBhdGg6IHN0cmluZywgb3B0aW9uczogQmluT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBsb2dnZXIuZGVidWcoXCJjaGVja2luZyBiaW5hcnlcIiwge1xuICAgIHBhdGgsXG4gICAgbWluVmVyc2lvbjogb3B0aW9ucy5taW5WZXJzaW9uLFxuICAgIHZlcnNpb25Bcmd1bWVudDogb3B0aW9ucy52ZXJzaW9uQXJndW1lbnQgPz8gXCItLXZlcnNpb25cIixcbiAgfSk7XG4gIGNvbnN0IGFjY2VzcyA9IGF3YWl0IGFjY2Vzc0NvbnRleHQocGF0aCk7XG4gIGlmICghYWNjZXNzLmZpbGUgfHwgIWFjY2Vzcy5leGVjdXRhYmxlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYmluYXJ5IGFjY2VzcyBjaGVjayBmYWlsZWRcIiwgeyBwYXRoLCAuLi5hY2Nlc3MgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChvcHRpb25zLnNraXBWZXJzaW9uQ2hlY2spIHtcbiAgICBsb2dnZXIuZGVidWcoXCJiaW5hcnkgdmVyc2lvbiBjaGVjayBza2lwcGVkXCIsIHsgcGF0aCB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBsZXQgc3Rkb3V0OiBzdHJpbmc7XG4gIGxldCBzdGRlcnI6IHN0cmluZztcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjRmlsZUFzeW5jKHBhdGgsIFtvcHRpb25zLnZlcnNpb25Bcmd1bWVudCA/PyBcIi0tdmVyc2lvblwiXSwge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0pO1xuICAgIHN0ZG91dCA9IHJlc3VsdC5zdGRvdXQ7XG4gICAgc3RkZXJyID0gcmVzdWx0LnN0ZGVycjtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJiaW5hcnkgdmVyc2lvbiBjb21tYW5kIGZhaWxlZFwiLCB7XG4gICAgICBwYXRoLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdXNlKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgdmVyc2lvbiA9IChvcHRpb25zLnZlcnNpb25QYXJzZXIgPz8gcGFyc2VWZXJzaW9uKSh7XG4gICAgc3Rkb3V0LFxuICAgIHN0ZGVycixcbiAgfSk7XG4gIGNvbnN0IHZhbGlkID0gdmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIG1lZXRzTWluVmVyc2lvbih2ZXJzaW9uLCBvcHRpb25zLm1pblZlcnNpb24pO1xuICBsb2dnZXIuZGVidWcoXCJiaW5hcnkgdmVyc2lvbiBjaGVja2VkXCIsIHtcbiAgICBwYXRoLFxuICAgIHZlcnNpb24sXG4gICAgbWluVmVyc2lvbjogb3B0aW9ucy5taW5WZXJzaW9uLFxuICAgIHZhbGlkLFxuICB9KTtcbiAgcmV0dXJuIHZhbGlkO1xufVxuXG5mdW5jdGlvbiBkb3dubG9hZE5hbWUodXJsOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gYmFzZW5hbWUoZGVjb2RlVVJJQ29tcG9uZW50KG5ldyBVUkwodXJsKS5wYXRobmFtZSkpO1xuICAgIHJldHVybiBjYW5kaWRhdGUgJiYgQnVmZmVyLmJ5dGVMZW5ndGgoY2FuZGlkYXRlKSA8PSAyMDAgPyBjYW5kaWRhdGUgOiBuYW1lO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB1bnBhY2soYXJjaGl2ZTogc3RyaW5nLCBkZXN0aW5hdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGZpbGVuYW1lID0gYXJjaGl2ZS50b0xvd2VyQ2FzZSgpO1xuICBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoXCIuemlwXCIpKSB7XG4gICAgYXdhaXQgZXh0cmFjdFppcChhcmNoaXZlLCB7IGRpcjogZGVzdGluYXRpb24gfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChmaWxlbmFtZS5lbmRzV2l0aChcIi50YXJcIikgfHwgZmlsZW5hbWUuZW5kc1dpdGgoXCIudGFyLmd6XCIpIHx8IGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRnelwiKSkge1xuICAgIGF3YWl0IGV4dHJhY3RUYXIoeyBmaWxlOiBhcmNoaXZlLCBjd2Q6IGRlc3RpbmF0aW9uIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIGJpbmFyeSBhcmNoaXZlOiAke2Jhc2VuYW1lKGFyY2hpdmUpfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxlc1VuZGVyKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHJlYWRkaXIocm9vdCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICBjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgY29uc3QgcGF0aCA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZpbGVzLnB1c2goLi4uKGF3YWl0IGZpbGVzVW5kZXIocGF0aCkpKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBmaWxlcy5wdXNoKHBhdGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdFNpbmdsZUZpbGUoc291cmNlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlcyA9IGF3YWl0IGZpbGVzVW5kZXIoc291cmNlKTtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBmaWxlcy5hdCgwKTtcbiAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gMSB8fCAhc2VsZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJpbmFyeSBhcmNoaXZlIG11c3QgY29udGFpbiBvbmUgZmlsZSwgZm91bmQgJHtmaWxlcy5sZW5ndGh9YCk7XG4gIH1cbiAgcmV0dXJuIHNlbGVjdGVkO1xufVxuXG5mdW5jdGlvbiBmaWxlVXJsUGF0aCh1cmw6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwpO1xuICAgIGlmIChwYXJzZWQucHJvdG9jb2wgIT09IFwiZmlsZTpcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZmlsZVVSTFRvUGF0aChwYXJzZWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNlbGVjdGVkQmluKFxuICBkZXN0aW5hdGlvbjogQmluQ29udGV4dCxcbiAgc291cmNlOiBCaW5Tb3VyY2UsXG4gIHRlbXA6IHN0cmluZyxcbiAgb3B0aW9uczogQmluT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgdXJsIH0gPSBzb3VyY2U7XG4gIGNvbnN0IGxvY2FsUGF0aCA9IGZpbGVVcmxQYXRoKHVybCk7XG4gIGlmIChsb2NhbFBhdGgpIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCBhY2Nlc3NDb250ZXh0KGxvY2FsUGF0aCk7XG4gICAgaWYgKCFhY2Nlc3MuZmlsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiaW5hcnkgZmlsZSBVUkwgZG9lcyBub3QgZXhpc3Q6ICR7ZGlzcGxheVVybCh1cmwpfWApO1xuICAgIH1cbiAgICBsb2dnZXIuZGVidWcoXCJ1c2luZyBsb2NhbCBiaW5hcnlcIiwgeyBmcm9tOiBkaXNwbGF5VXJsKHVybCksIHBhdGg6IGxvY2FsUGF0aCB9KTtcbiAgICByZXR1cm4gbG9jYWxQYXRoO1xuICB9XG4gIGNvbnN0IG5hbWUgPSBkb3dubG9hZE5hbWUodXJsLCBiYXNlbmFtZShkZXN0aW5hdGlvbi5wYXRoKSk7XG4gIGNvbnN0IGRvd25sb2FkUGF0aCA9IGpvaW4odGVtcCwgbmFtZSk7XG4gIGxvZ2dlci5kZWJ1ZyhcImRvd25sb2FkaW5nIGJpbmFyeVwiLCB7XG4gICAgZnJvbTogZGlzcGxheVVybCh1cmwpLFxuICAgIHRvOiBkb3dubG9hZFBhdGgsXG4gIH0pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGJpbmFyeSBkb3dubG9hZCBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgfVxuICBjb25zdCBkb3dubG9hZGVkID0gQnVmZmVyLmZyb20oYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKSk7XG4gIGlmIChzb3VyY2Uuc2hhMjU2KSB7XG4gICAgaWYgKCEvXlswLTlhLWZdezY0fSQvaS50ZXN0KHNvdXJjZS5zaGEyNTYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYmluYXJ5IGRvd25sb2FkIFNIQS0yNTYgZGlnZXN0IG11c3QgY29udGFpbiA2NCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzXCIpO1xuICAgIH1cbiAgICBjb25zdCBhY3R1YWwgPSBjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShkb3dubG9hZGVkKS5kaWdlc3QoXCJoZXhcIik7XG4gICAgaWYgKGFjdHVhbC50b0xvd2VyQ2FzZSgpICE9PSBzb3VyY2Uuc2hhMjU2LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYmluYXJ5IGRvd25sb2FkIGRpZ2VzdCBtaXNtYXRjaDogJHtkaXNwbGF5VXJsKHVybCl9YCk7XG4gICAgfVxuICB9XG4gIGF3YWl0IHdyaXRlRmlsZShkb3dubG9hZFBhdGgsIGRvd25sb2FkZWQsIHsgbW9kZTogMG83NTUgfSk7XG5cbiAgbGV0IHNlbGVjdGVkU291cmNlID0gZG93bmxvYWRQYXRoO1xuICBpZiAob3B0aW9ucy5hdXRvVW5wYWNrYWdlKSB7XG4gICAgc2VsZWN0ZWRTb3VyY2UgPSBqb2luKHRlbXAsIGB1bnBhY2tlZC0ke3JhbmRvbVVVSUQoKX1gKTtcbiAgICBhd2FpdCBta2RpcihzZWxlY3RlZFNvdXJjZSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwidW5wYWNraW5nIGJpbmFyeSBhcmNoaXZlXCIsIHtcbiAgICAgIGFyY2hpdmU6IGRvd25sb2FkUGF0aCxcbiAgICAgIHRvOiBzZWxlY3RlZFNvdXJjZSxcbiAgICB9KTtcbiAgICBhd2FpdCB1bnBhY2soZG93bmxvYWRQYXRoLCBzZWxlY3RlZFNvdXJjZSk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zZWxlY3Rvcikge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgb3B0aW9ucy5zZWxlY3Rvcih7XG4gICAgICBkZXN0aW5hdGlvbixcbiAgICAgIGRvd25sb2FkUGF0aCxcbiAgICAgIHNvdXJjZTogc2VsZWN0ZWRTb3VyY2UsXG4gICAgfSk7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgYmluYXJ5XCIsIHsgcGF0aDogc2VsZWN0ZWQgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG4gIGNvbnN0IHNlbGVjdGVkID0gb3B0aW9ucy5hdXRvVW5wYWNrYWdlID8gYXdhaXQgc2VsZWN0U2luZ2xlRmlsZShzZWxlY3RlZFNvdXJjZSkgOiBzZWxlY3RlZFNvdXJjZTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgYmluYXJ5XCIsIHsgcGF0aDogc2VsZWN0ZWQgfSk7XG4gIHJldHVybiBzZWxlY3RlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYW4gZXhpc3RpbmcgZXhlY3V0YWJsZSBvciBpbnN0YWxsIGl0IGF0b21pY2FsbHkgdW5kZXJcbiAqIGAkSE9NRS8uPG5hbWU+L2Jpbi88bmFtZT5gLiBJbnN0YWxsYXRpb24gdXNlcyBhIGNoZWNrLWxvY2stY2hlY2stbG9hZFxuICogc2VxdWVuY2Ugc28gY29uY3VycmVudCBjYWxsZXJzIHJlc29sdmUgYW5kIGRvd25sb2FkIHRoZSBiaW5hcnkgb25seSBvbmNlLlxuICogVGhlIGRvd25sb2FkZWQgY2FuZGlkYXRlIGFuZCBmaW5hbCByZW5hbWVkIGV4ZWN1dGFibGUgbXVzdCBib3RoIHBhc3MgdGhlXG4gKiBzYW1lIGV4ZWN1dGFibGUgYW5kIHZlcnNpb24gY2hlY2tzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlKFxuICBuYW1lOiBzdHJpbmcsXG4gIHVybDogQmluVXJsLFxuICBvcHRpb25zOiBCaW5PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPEJpbkNvbnRleHQ+IHtcbiAgaWYgKG9wdGlvbnMubWluVmVyc2lvbiAmJiAhbnVtZXJpY1ZlcnNpb24ob3B0aW9ucy5taW5WZXJzaW9uLCB0cnVlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgbWluaW11bSBiaW5hcnkgdmVyc2lvbjogJHtvcHRpb25zLm1pblZlcnNpb259YCk7XG4gIH1cbiAgY29uc3QgZGVzdGluYXRpb24gPSBjb250ZXh0KG5hbWUsIG9wdGlvbnMuaG9tZURpciA/PyBob21lZGlyKCksIG9wdGlvbnMuZGVzdGluYXRpb24pO1xuICBpZiAoYXdhaXQgaXNWYWxpZEJpbihkZXN0aW5hdGlvbi5wYXRoLCBvcHRpb25zKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIGluc3RhbGxlZCBiaW5hcnlcIiwgeyBuYW1lLCBwYXRoOiBkZXN0aW5hdGlvbi5wYXRoIH0pO1xuICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIndhaXRpbmcgZm9yIGJpbmFyeSBpbnN0YWxsIGxvY2tcIiwgeyBuYW1lLCBwYXRoOiBkZXN0aW5hdGlvbi5wYXRoIH0pO1xuICByZXR1cm4gd2l0aEZpbGVMb2NrKFtcImJpbi5lbnN1cmVcIiwgZGVzdGluYXRpb24ucGF0aF0sIGFzeW5jICgpID0+IHtcbiAgICBpZiAoYXdhaXQgaXNWYWxpZEJpbihkZXN0aW5hdGlvbi5wYXRoLCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwidXNpbmcgYmluYXJ5IGluc3RhbGxlZCBieSBhbm90aGVyIGNhbGxlclwiLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhdGg6IGRlc3RpbmF0aW9uLnBhdGgsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoXCJpbnN0YWxsaW5nIGJpbmFyeVwiLCB7XG4gICAgICBuYW1lLFxuICAgICAgdG86IGRlc3RpbmF0aW9uLnBhdGgsXG4gICAgICBtaW5WZXJzaW9uOiBvcHRpb25zLm1pblZlcnNpb24sXG4gICAgfSk7XG4gICAgY29uc3QgdGVtcCA9IGF3YWl0IG1rZHRlbXAoam9pbih0bXBkaXIoKSwgYCR7bmFtZX0tYCkpO1xuICAgIGxldCBzdGFnZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSB0eXBlb2YgdXJsID09PSBcImZ1bmN0aW9uXCIgPyBhd2FpdCB1cmwoeyB0ZW1wRGlyOiB0ZW1wIH0pIDogdXJsO1xuICAgICAgY29uc3Qgc291cmNlID0gdHlwZW9mIHJlc29sdmVkID09PSBcInN0cmluZ1wiID8geyB1cmw6IHJlc29sdmVkIH0gOiByZXNvbHZlZDtcbiAgICAgIGNvbnN0IGZyb20gPSBkaXNwbGF5VXJsKHNvdXJjZS51cmwpO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgYmluYXJ5IHNvdXJjZVwiLCB7IG5hbWUsIGZyb20gfSk7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IGF3YWl0IHNlbGVjdGVkQmluKGRlc3RpbmF0aW9uLCBzb3VyY2UsIHRlbXAsIG9wdGlvbnMpO1xuICAgICAgYXdhaXQgY2htb2Qoc2VsZWN0ZWQsIDBvNzU1KTtcbiAgICAgIGNvbnN0IGFjY2VwdGVkID0gc291cmNlLnRydXN0VmVyc2lvbiA/IHsgLi4ub3B0aW9ucywgc2tpcFZlcnNpb25DaGVjazogdHJ1ZSB9IDogb3B0aW9ucztcbiAgICAgIGlmICghKGF3YWl0IGlzVmFsaWRCaW4oc2VsZWN0ZWQsIGFjY2VwdGVkKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIHNvdXJjZS50cnVzdFZlcnNpb25cbiAgICAgICAgICAgID8gYHNlbGVjdGVkIGJpbmFyeSBpcyBub3QgZXhlY3V0YWJsZTogJHtzZWxlY3RlZH1gXG4gICAgICAgICAgICA6IGBzZWxlY3RlZCBiaW5hcnkgaGFzIG5vIGFjY2VwdGFibGUgdmVyc2lvbjogJHtzZWxlY3RlZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBta2RpcihkZXN0aW5hdGlvbi5iaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgc3RhZ2VkID0gam9pbihkZXN0aW5hdGlvbi5iaW5EaXIsIGAuJHtuYW1lfS0ke3JhbmRvbVVVSUQoKX1gKTtcbiAgICAgIGF3YWl0IGNvcHlGaWxlKHNlbGVjdGVkLCBzdGFnZWQpO1xuICAgICAgYXdhaXQgY2htb2Qoc3RhZ2VkLCAwbzc1NSk7XG4gICAgICBhd2FpdCByZW5hbWUoc3RhZ2VkLCBkZXN0aW5hdGlvbi5wYXRoKTtcbiAgICAgIHN0YWdlZCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICghKGF3YWl0IGlzVmFsaWRCaW4oZGVzdGluYXRpb24ucGF0aCwgYWNjZXB0ZWQpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluc3RhbGxlZCBiaW5hcnkgaXMgaW52YWxpZCBhZnRlciByZW5hbWU6ICR7ZGVzdGluYXRpb24ucGF0aH1gKTtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci5pbmZvKFwiaW5zdGFsbGVkIGJpbmFyeVwiLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZyb20sXG4gICAgICAgIHRvOiBkZXN0aW5hdGlvbi5wYXRoLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZGVzdGluYXRpb247XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzdGFnZWQpIGF3YWl0IHJtKHN0YWdlZCwgeyBmb3JjZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHJtKHRlbXAsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH0pO1xufVxuIl19
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLEtBQUssRUFDTCxPQUFPLEVBQ1AsT0FBTyxFQUNQLE1BQU0sRUFDTixFQUFFLEVBQ0YsSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLFVBQVUsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV0QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFOUMsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUEyRXRDLFNBQVMsT0FBTyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsV0FBd0I7SUFDdEUsSUFBSSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJ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LFNBQVMsQ0FBQztZQUNuQixJQUFJLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbkYsQ0FBQztZQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Z0JBQzlCLElBQUk7Z0JBQ0osSUFBSTtnQkFDSixFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUk7YUFDckIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxXQUFXLENBQUM7UUFDckIsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsSUFBSSxNQUFNO2dCQUFFLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW5zdGFsbCBhbmQgcmV1c2UgZXhlY3V0YWJsZSBiaW5hcmllcyB1bmRlciBhIHBlci10b29sIGhvbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBjcmVhdGVIYXNoLCByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQge1xuICBjaG1vZCxcbiAgY29weUZpbGUsXG4gIG1rZGlyLFxuICBta2R0ZW1wLFxuICByZWFkZGlyLFxuICByZW5hbWUsXG4gIHJtLFxuICBzdGF0LFxuICB3cml0ZUZpbGUsXG59IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBob21lZGlyLCB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgYmFzZW5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tIFwibm9kZTp1dGlsXCI7XG5cbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgZXh0cmFjdFppcCBmcm9tIFwiZXh0cmFjdC16aXBcIjtcbmltcG9ydCB7IHggYXMgZXh0cmFjdFRhciB9IGZyb20gXCJ0YXJcIjtcblxuaW1wb3J0IHsgd2l0aEZpbGVMb2NrIH0gZnJvbSBcIi4vZmlsZS1sb2NrLnRzXCI7XG5cbmNvbnN0IGV4ZWNGaWxlQXN5bmMgPSBwcm9taXNpZnkoZXhlY0ZpbGUpO1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNvcmU6YmluXCIpO1xuXG5pbnRlcmZhY2UgUGFyc2VkVmVyc2lvbiB7XG4gIHJhdzogc3RyaW5nO1xuICBwYXJ0czogbnVtYmVyW107XG59XG5cbmludGVyZmFjZSBCaW5BY2Nlc3NDb250ZXh0IHtcbiAgZmlsZTogYm9vbGVhbjtcbiAgZXhlY3V0YWJsZTogYm9vbGVhbjtcbn1cblxuLyoqIFN0YWJsZSBwYXRocyBmb3IgYW4gaW5zdGFsbGVkIGJpbmFyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluQ29udGV4dCB7XG4gIHJvb3Q6IHN0cmluZztcbiAgYmluRGlyOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbn1cblxuLyoqIFRlbXBvcmFyeSBkb3dubG9hZCBhbmQgZXh0cmFjdGlvbiBwYXRocyBzdXBwbGllZCB0byBhIGN1c3RvbSBzZWxlY3Rvci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluU2VsZWN0aW9uQ29udGV4dCB7XG4gIGRlc3RpbmF0aW9uOiBCaW5Db250ZXh0O1xuICBkb3dubG9hZFBhdGg6IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogU2VsZWN0IHRoZSBleGVjdXRhYmxlIGZyb20gYSBkb3dubG9hZCBvciB1bnBhY2tlZCBhcmNoaXZlLiBBIHNlbGVjdG9yIG1heVxuICogYWxzbyBwcmVwYXJlIHRoZSBmaWxlLCBzdWNoIGFzIGFwcGx5aW5nIGl0cyBleGVjdXRhYmxlIG1vZGUuXG4gKi9cbmV4cG9ydCB0eXBlIEJpblNlbGVjdG9yID0gKGNvbnRleHQ6IEJpblNlbGVjdGlvbkNvbnRleHQpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcblxuLyoqIENhcHR1cmVkIG91dHB1dCBwYXNzZWQgdG8gYSBjdXN0b20gYmluYXJ5IHZlcnNpb24gcGFyc2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5WZXJzaW9uT3V0cHV0IHtcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xufVxuXG4vKiogRXh0cmFjdCBhIHZlcnNpb24gc3RyaW5nIGZyb20gYSBzdWNjZXNzZnVsIHZlcnNpb24tY29tbWFuZCByZXN1bHQuICovXG5leHBvcnQgdHlwZSBCaW5WZXJzaW9uUGFyc2VyID0gKG91dHB1dDogQmluVmVyc2lvbk91dHB1dCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGVuc3VyZX0uICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbk9wdGlvbnMge1xuICBhdXRvVW5wYWNrYWdlPzogYm9vbGVhbjtcbiAgc2VsZWN0b3I/OiBCaW5TZWxlY3RvcjtcbiAgaG9tZURpcj86IHN0cmluZztcbiAgLyoqIEV4YWN0IGluc3RhbGxhdGlvbiBwYXRocy4gT21pc3Npb24ga2VlcHMgYCRIT01FLy48bmFtZT4vYmluLzxuYW1lPmAuICovXG4gIGRlc3RpbmF0aW9uPzogQmluQ29udGV4dDtcbiAgLyoqIE1pbmltdW0gYWNjZXB0ZWQgbnVtZXJpYyB2ZXJzaW9uLCB3aXRoIG9uZSB0byB0aHJlZSBjb21wb25lbnRzLiAqL1xuICBtaW5WZXJzaW9uPzogc3RyaW5nO1xuICAvKiogQXJndW1lbnQgcGFzc2VkIHRvIHRoZSBiaW5hcnkgZm9yIHZlcnNpb24gZGV0ZWN0aW9uLiBEZWZhdWx0cyB0byBgLS12ZXJzaW9uYC4gKi9cbiAgdmVyc2lvbkFyZ3VtZW50Pzogc3RyaW5nO1xuICAvKiogVmVyc2lvbiBvdXRwdXQgcGFyc2VyLiBEZWZhdWx0cyB0byB7QGxpbmsgcGFyc2VWZXJzaW9ufS4gKi9cbiAgdmVyc2lvblBhcnNlcj86IEJpblZlcnNpb25QYXJzZXI7XG4gIC8qKiBTa2lwIGAtLXZlcnNpb25gIGFuZCB0cmVhdCBhbiBleGVjdXRhYmxlIGZpbGUgYXMgYWNjZXB0YWJsZS4gKi9cbiAgc2tpcFZlcnNpb25DaGVjaz86IGJvb2xlYW47XG59XG5cbi8qKiBUZW1wb3JhcnkgZGlyZWN0b3J5IGNyZWF0ZWQgZm9yIG9uZSBgZW5zdXJlYCBhdHRlbXB0IGFmdGVyIHRoZSBpbnN0YWxsIGxvY2suICovXG5leHBvcnQgaW50ZXJmYWNlIEJpblVybFJlc29sdmVDb250ZXh0IHtcbiAgcmVhZG9ubHkgdGVtcERpcjogc3RyaW5nO1xufVxuXG4vKiogRG93bmxvYWQgc291cmNlIHJlc29sdmVkIG9ubHkgd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBub3QgYWxyZWFkeSBpbnN0YWxsZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpblNvdXJjZSB7XG4gIHVybDogc3RyaW5nO1xuICBzaGEyNTY/OiBzdHJpbmc7XG59XG5cbi8qKiBBIGRvd25sb2FkIHNvdXJjZSByZXNvbHZlZCBvbmx5IHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgbm90IGFscmVhZHkgaW5zdGFsbGVkLiAqL1xuZXhwb3J0IHR5cGUgQmluVXJsID1cbiAgfCBzdHJpbmdcbiAgfCBCaW5Tb3VyY2VcbiAgfCAoKGNvbnRleHQ6IEJpblVybFJlc29sdmVDb250ZXh0KSA9PiBzdHJpbmcgfCBCaW5Tb3VyY2UgfCBQcm9taXNlPHN0cmluZyB8IEJpblNvdXJjZT4pO1xuXG5mdW5jdGlvbiBjb250ZXh0KG5hbWU6IHN0cmluZywgaG9tZURpcjogc3RyaW5nLCBkZXN0aW5hdGlvbj86IEJpbkNvbnRleHQpOiBCaW5Db250ZXh0IHtcbiAgaWYgKCFuYW1lIHx8IGJhc2VuYW1lKG5hbWUpICE9PSBuYW1lIHx8IG5hbWUgPT09IFwiLlwiIHx8IG5hbWUgPT09IFwiLi5cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgYmluYXJ5IG5hbWU6ICR7bmFtZX1gKTtcbiAgfVxuICBpZiAoZGVzdGluYXRpb24pIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgY29uc3Qgcm9vdCA9IGpvaW4oaG9tZURpciwgYC4ke25hbWV9YCk7XG4gIGNvbnN0IGJpbkRpciA9IGpvaW4ocm9vdCwgXCJiaW5cIik7XG4gIHJldHVybiB7IHJvb3QsIGJpbkRpciwgcGF0aDogam9pbihiaW5EaXIsIG5hbWUpIH07XG59XG5cbmZ1bmN0aW9uIGRpc3BsYXlVcmwocmF3OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3KTtcbiAgICBpZiAodXJsLnByb3RvY29sID09PSBcImRhdGE6XCIpIHJldHVybiBcImRhdGE6XCI7XG4gICAgdXJsLnVzZXJuYW1lID0gXCJcIjtcbiAgICB1cmwucGFzc3dvcmQgPSBcIlwiO1xuICAgIHVybC5zZWFyY2ggPSBcIlwiO1xuICAgIHVybC5oYXNoID0gXCJcIjtcbiAgICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiByYXc7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gYWNjZXNzQ29udGV4dChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJpbkFjY2Vzc0NvbnRleHQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IHN0YXQocGF0aCk7XG4gICAgY29uc3QgZmlsZSA9IGVudHJ5LmlzRmlsZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlLFxuICAgICAgZXhlY3V0YWJsZTogZmlsZSAmJiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gXCJ3aW4zMlwiIHx8IChlbnRyeS5tb2RlICYgMG8xMTEpICE9PSAwKSxcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBmaWxlOiBmYWxzZSwgZXhlY3V0YWJsZTogZmFsc2UgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXRlY3RlZFZlcnNpb25zKG91dHB1dDogc3RyaW5nKTogUGFyc2VkVmVyc2lvbltdIHtcbiAgY29uc3QgdmVyc2lvbnM6IFBhcnNlZFZlcnNpb25bXSA9IFtdO1xuICBjb25zdCBwYXR0ZXJuID0gL1xcYnY/KFxcZCsoPzpcXC5cXGQrKXswLDJ9KSg/OlstKy5fXT9bYS16XVswLTlhLXouK18tXSopPy9naTtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwocGF0dGVybikpIHtcbiAgICBjb25zdCByYXcgPSBtYXRjaFswXS5yZXBsYWNlKC9edi9pLCBcIlwiKTtcbiAgICBjb25zdCBwYXJ0cyA9IG1hdGNoWzFdPy5zcGxpdChcIi5cIikubWFwKE51bWJlcik7XG4gICAgaWYgKHBhcnRzPy5ldmVyeShOdW1iZXIuaXNGaW5pdGUpKSB2ZXJzaW9ucy5wdXNoKHsgcmF3LCBwYXJ0cyB9KTtcbiAgfVxuICByZXR1cm4gdmVyc2lvbnMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLnBhcnRzLmxlbmd0aCAhPT0gYi5wYXJ0cy5sZW5ndGgpIHJldHVybiBiLnBhcnRzLmxlbmd0aCAtIGEucGFydHMubGVuZ3RoO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBhLnBhcnRzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgY29uc3Qgb3JkZXIgPSAoYi5wYXJ0c1tpbmRleF0gPz8gMCkgLSAoYS5wYXJ0c1tpbmRleF0gPz8gMCk7XG4gICAgICBpZiAob3JkZXIgIT09IDApIHJldHVybiBvcmRlcjtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIHRoZSBkZWVwZXN0LCBoaWdoZXN0IHZlcnNpb24gZnJvbSBzdGRvdXQsIGZhbGxpbmcgYmFjayB0byBzdGRlcnIgb25seVxuICogd2hlbiBzdGRvdXQgY29udGFpbnMgbm8gdmVyc2lvbi4gU3VwcG9ydHMgb25lIHRvIHRocmVlIG51bWVyaWMgY29tcG9uZW50c1xuICogYW5kIGNvbW1vbiBzdWZmaXhlcyBzdWNoIGFzIGByYzFgLCBgLnBvc3QxYCwgYW5kIGAtZGV2LjJgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWZXJzaW9uKHsgc3Rkb3V0LCBzdGRlcnIgfTogQmluVmVyc2lvbk91dHB1dCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBkZXRlY3RlZFZlcnNpb25zKHN0ZG91dCkuYXQoMCk/LnJhdyA/PyBkZXRlY3RlZFZlcnNpb25zKHN0ZGVycikuYXQoMCk/LnJhdztcbn1cblxuZnVuY3Rpb24gbnVtZXJpY1ZlcnNpb24odmVyc2lvbjogc3RyaW5nLCBzdHJpY3Q6IGJvb2xlYW4pOiBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdHRlcm4gPSBzdHJpY3QgPyAvXlxccyp2PyhcXGQrKD86XFwuXFxkKyl7MCwyfSlcXHMqJC9pIDogL1xcYnY/KFxcZCsoPzpcXC5cXGQrKXswLDJ9KS9pO1xuICBjb25zdCBtYXRjaCA9IHBhdHRlcm4uZXhlYyh2ZXJzaW9uKTtcbiAgcmV0dXJuIG1hdGNoPy5bMV0/LnNwbGl0KFwiLlwiKS5tYXAoTnVtYmVyKTtcbn1cblxuZnVuY3Rpb24gbWVldHNNaW5WZXJzaW9uKHZlcnNpb246IHN0cmluZywgbWluVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghbWluVmVyc2lvbikgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGFjdHVhbCA9IG51bWVyaWNWZXJzaW9uKHZlcnNpb24sIGZhbHNlKTtcbiAgY29uc3QgbWluaW11bSA9IG51bWVyaWNWZXJzaW9uKG1pblZlcnNpb24sIHRydWUpO1xuICBpZiAoIW1pbmltdW0pIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIG1pbmltdW0gYmluYXJ5IHZlcnNpb246ICR7bWluVmVyc2lvbn1gKTtcbiAgfVxuICBpZiAoIWFjdHVhbCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgTWF0aC5tYXgoYWN0dWFsLmxlbmd0aCwgbWluaW11bS5sZW5ndGgpOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IChhY3R1YWxbaW5kZXhdID8/IDApIC0gKG1pbmltdW1baW5kZXhdID8/IDApO1xuICAgIGlmIChkaWZmZXJlbmNlICE9PSAwKSByZXR1cm4gZGlmZmVyZW5jZSA+IDA7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGlzVmFsaWRCaW4ocGF0aDogc3RyaW5nLCBvcHRpb25zOiBCaW5PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGxvZ2dlci5kZWJ1ZyhcImNoZWNraW5nIGJpbmFyeVwiLCB7XG4gICAgcGF0aCxcbiAgICBtaW5WZXJzaW9uOiBvcHRpb25zLm1pblZlcnNpb24sXG4gICAgdmVyc2lvbkFyZ3VtZW50OiBvcHRpb25zLnZlcnNpb25Bcmd1bWVudCA/PyBcIi0tdmVyc2lvblwiLFxuICB9KTtcbiAgY29uc3QgYWNjZXNzID0gYXdhaXQgYWNjZXNzQ29udGV4dChwYXRoKTtcbiAgaWYgKCFhY2Nlc3MuZmlsZSB8fCAhYWNjZXNzLmV4ZWN1dGFibGUpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJiaW5hcnkgYWNjZXNzIGNoZWNrIGZhaWxlZFwiLCB7IHBhdGgsIC4uLmFjY2VzcyB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG9wdGlvbnMuc2tpcFZlcnNpb25DaGVjaykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImJpbmFyeSB2ZXJzaW9uIGNoZWNrIHNraXBwZWRcIiwgeyBwYXRoIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGxldCBzdGRvdXQ6IHN0cmluZztcbiAgbGV0IHN0ZGVycjogc3RyaW5nO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNGaWxlQXN5bmMocGF0aCwgW29wdGlvbnMudmVyc2lvbkFyZ3VtZW50ID8/IFwiLS12ZXJzaW9uXCJdLCB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSk7XG4gICAgc3Rkb3V0ID0gcmVzdWx0LnN0ZG91dDtcbiAgICBzdGRlcnIgPSByZXN1bHQuc3RkZXJyO1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImJpbmFyeSB2ZXJzaW9uIGNvbW1hbmQgZmFpbGVkXCIsIHtcbiAgICAgIHBhdGgsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoY2F1c2UpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCB2ZXJzaW9uID0gKG9wdGlvbnMudmVyc2lvblBhcnNlciA/PyBwYXJzZVZlcnNpb24pKHtcbiAgICBzdGRvdXQsXG4gICAgc3RkZXJyLFxuICB9KTtcbiAgY29uc3QgdmFsaWQgPSB2ZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgbWVldHNNaW5WZXJzaW9uKHZlcnNpb24sIG9wdGlvbnMubWluVmVyc2lvbik7XG4gIGxvZ2dlci5kZWJ1ZyhcImJpbmFyeSB2ZXJzaW9uIGNoZWNrZWRcIiwge1xuICAgIHBhdGgsXG4gICAgdmVyc2lvbixcbiAgICBtaW5WZXJzaW9uOiBvcHRpb25zLm1pblZlcnNpb24sXG4gICAgdmFsaWQsXG4gIH0pO1xuICByZXR1cm4gdmFsaWQ7XG59XG5cbmZ1bmN0aW9uIGRvd25sb2FkTmFtZSh1cmw6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBiYXNlbmFtZShkZWNvZGVVUklDb21wb25lbnQobmV3IFVSTCh1cmwpLnBhdGhuYW1lKSk7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBCdWZmZXIuYnl0ZUxlbmd0aChjYW5kaWRhdGUpIDw9IDIwMCA/IGNhbmRpZGF0ZSA6IG5hbWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHVucGFjayhhcmNoaXZlOiBzdHJpbmcsIGRlc3RpbmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgZmlsZW5hbWUgPSBhcmNoaXZlLnRvTG93ZXJDYXNlKCk7XG4gIGlmIChmaWxlbmFtZS5lbmRzV2l0aChcIi56aXBcIikpIHtcbiAgICBhd2FpdCBleHRyYWN0WmlwKGFyY2hpdmUsIHsgZGlyOiBkZXN0aW5hdGlvbiB9KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRhclwiKSB8fCBmaWxlbmFtZS5lbmRzV2l0aChcIi50YXIuZ3pcIikgfHwgZmlsZW5hbWUuZW5kc1dpdGgoXCIudGd6XCIpKSB7XG4gICAgYXdhaXQgZXh0cmFjdFRhcih7IGZpbGU6IGFyY2hpdmUsIGN3ZDogZGVzdGluYXRpb24gfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgYmluYXJ5IGFyY2hpdmU6ICR7YmFzZW5hbWUoYXJjaGl2ZSl9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGVzVW5kZXIocm9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBwYXRoID0gam9pbihyb290LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgZmlsZXMucHVzaCguLi4oYXdhaXQgZmlsZXNVbmRlcihwYXRoKSkpO1xuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGZpbGVzLnB1c2gocGF0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0U2luZ2xlRmlsZShzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVzID0gYXdhaXQgZmlsZXNVbmRlcihzb3VyY2UpO1xuICBjb25zdCBzZWxlY3RlZCA9IGZpbGVzLmF0KDApO1xuICBpZiAoZmlsZXMubGVuZ3RoICE9PSAxIHx8ICFzZWxlY3RlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYmluYXJ5IGFyY2hpdmUgbXVzdCBjb250YWluIG9uZSBmaWxlLCBmb3VuZCAke2ZpbGVzLmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4gc2VsZWN0ZWQ7XG59XG5cbmZ1bmN0aW9uIGZpbGVVcmxQYXRoKHVybDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gXCJmaWxlOlwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBmaWxlVVJMVG9QYXRoKHBhcnNlZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VsZWN0ZWRCaW4oXG4gIGRlc3RpbmF0aW9uOiBCaW5Db250ZXh0LFxuICBzb3VyY2U6IEJpblNvdXJjZSxcbiAgdGVtcDogc3RyaW5nLFxuICBvcHRpb25zOiBCaW5PcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgeyB1cmwgfSA9IHNvdXJjZTtcbiAgY29uc3QgbG9jYWxQYXRoID0gZmlsZVVybFBhdGgodXJsKTtcbiAgaWYgKGxvY2FsUGF0aCkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IGFjY2Vzc0NvbnRleHQobG9jYWxQYXRoKTtcbiAgICBpZiAoIWFjY2Vzcy5maWxlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGJpbmFyeSBmaWxlIFVSTCBkb2VzIG5vdCBleGlzdDogJHtkaXNwbGF5VXJsKHVybCl9YCk7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIGxvY2FsIGJpbmFyeVwiLCB7IGZyb206IGRpc3BsYXlVcmwodXJsKSwgcGF0aDogbG9jYWxQYXRoIH0pO1xuICAgIHJldHVybiBsb2NhbFBhdGg7XG4gIH1cbiAgY29uc3QgbmFtZSA9IGRvd25sb2FkTmFtZSh1cmwsIGJhc2VuYW1lKGRlc3RpbmF0aW9uLnBhdGgpKTtcbiAgY29uc3QgZG93bmxvYWRQYXRoID0gam9pbih0ZW1wLCBuYW1lKTtcbiAgbG9nZ2VyLmRlYnVnKFwiZG93bmxvYWRpbmcgYmluYXJ5XCIsIHtcbiAgICBmcm9tOiBkaXNwbGF5VXJsKHVybCksXG4gICAgdG86IGRvd25sb2FkUGF0aCxcbiAgfSk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgYmluYXJ5IGRvd25sb2FkIGZhaWxlZCAoJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICB9XG4gIGNvbnN0IGRvd25sb2FkZWQgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKHNvdXJjZS5zaGEyNTYpIHtcbiAgICBpZiAoIS9eWzAtOWEtZl17NjR9JC9pLnRlc3Qoc291cmNlLnNoYTI1NikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJiaW5hcnkgZG93bmxvYWQgU0hBLTI1NiBkaWdlc3QgbXVzdCBjb250YWluIDY0IGhleGFkZWNpbWFsIGNoYXJhY3RlcnNcIik7XG4gICAgfVxuICAgIGNvbnN0IGFjdHVhbCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGRvd25sb2FkZWQpLmRpZ2VzdChcImhleFwiKTtcbiAgICBpZiAoYWN0dWFsLnRvTG93ZXJDYXNlKCkgIT09IHNvdXJjZS5zaGEyNTYudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiaW5hcnkgZG93bmxvYWQgZGlnZXN0IG1pc21hdGNoOiAke2Rpc3BsYXlVcmwodXJsKX1gKTtcbiAgICB9XG4gIH1cbiAgYXdhaXQgd3JpdGVGaWxlKGRvd25sb2FkUGF0aCwgZG93bmxvYWRlZCwgeyBtb2RlOiAwbzc1NSB9KTtcblxuICBsZXQgc2VsZWN0ZWRTb3VyY2UgPSBkb3dubG9hZFBhdGg7XG4gIGlmIChvcHRpb25zLmF1dG9VbnBhY2thZ2UpIHtcbiAgICBzZWxlY3RlZFNvdXJjZSA9IGpvaW4odGVtcCwgYHVucGFja2VkLSR7cmFuZG9tVVVJRCgpfWApO1xuICAgIGF3YWl0IG1rZGlyKHNlbGVjdGVkU291cmNlKTtcbiAgICBsb2dnZXIuZGVidWcoXCJ1bnBhY2tpbmcgYmluYXJ5IGFyY2hpdmVcIiwge1xuICAgICAgYXJjaGl2ZTogZG93bmxvYWRQYXRoLFxuICAgICAgdG86IHNlbGVjdGVkU291cmNlLFxuICAgIH0pO1xuICAgIGF3YWl0IHVucGFjayhkb3dubG9hZFBhdGgsIHNlbGVjdGVkU291cmNlKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNlbGVjdG9yKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBvcHRpb25zLnNlbGVjdG9yKHtcbiAgICAgIGRlc3RpbmF0aW9uLFxuICAgICAgZG93bmxvYWRQYXRoLFxuICAgICAgc291cmNlOiBzZWxlY3RlZFNvdXJjZSxcbiAgICB9KTtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBiaW5hcnlcIiwgeyBwYXRoOiBzZWxlY3RlZCB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbiAgY29uc3Qgc2VsZWN0ZWQgPSBvcHRpb25zLmF1dG9VbnBhY2thZ2UgPyBhd2FpdCBzZWxlY3RTaW5nbGVGaWxlKHNlbGVjdGVkU291cmNlKSA6IHNlbGVjdGVkU291cmNlO1xuICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBiaW5hcnlcIiwgeyBwYXRoOiBzZWxlY3RlZCB9KTtcbiAgcmV0dXJuIHNlbGVjdGVkO1xufVxuXG4vKipcbiAqIFJldHVybiBhbiBleGlzdGluZyBleGVjdXRhYmxlIG9yIGluc3RhbGwgaXQgYXRvbWljYWxseSB1bmRlclxuICogYCRIT01FLy48bmFtZT4vYmluLzxuYW1lPmAuIEluc3RhbGxhdGlvbiB1c2VzIGEgY2hlY2stbG9jay1jaGVjay1sb2FkXG4gKiBzZXF1ZW5jZSBzbyBjb25jdXJyZW50IGNhbGxlcnMgcmVzb2x2ZSBhbmQgZG93bmxvYWQgdGhlIGJpbmFyeSBvbmx5IG9uY2UuXG4gKiBUaGUgZG93bmxvYWRlZCBjYW5kaWRhdGUgYW5kIGZpbmFsIHJlbmFtZWQgZXhlY3V0YWJsZSBtdXN0IGJvdGggcGFzcyB0aGVcbiAqIHNhbWUgZXhlY3V0YWJsZSBhbmQgdmVyc2lvbiBjaGVja3MuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnN1cmUoXG4gIG5hbWU6IHN0cmluZyxcbiAgdXJsOiBCaW5VcmwsXG4gIG9wdGlvbnM6IEJpbk9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QmluQ29udGV4dD4ge1xuICBpZiAob3B0aW9ucy5taW5WZXJzaW9uICYmICFudW1lcmljVmVyc2lvbihvcHRpb25zLm1pblZlcnNpb24sIHRydWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCBtaW5pbXVtIGJpbmFyeSB2ZXJzaW9uOiAke29wdGlvbnMubWluVmVyc2lvbn1gKTtcbiAgfVxuICBjb25zdCBkZXN0aW5hdGlvbiA9IGNvbnRleHQobmFtZSwgb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKSwgb3B0aW9ucy5kZXN0aW5hdGlvbik7XG4gIGlmIChhd2FpdCBpc1ZhbGlkQmluKGRlc3RpbmF0aW9uLnBhdGgsIG9wdGlvbnMpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwidXNpbmcgaW5zdGFsbGVkIGJpbmFyeVwiLCB7IG5hbWUsIHBhdGg6IGRlc3RpbmF0aW9uLnBhdGggfSk7XG4gICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKFwid2FpdGluZyBmb3IgYmluYXJ5IGluc3RhbGwgbG9ja1wiLCB7IG5hbWUsIHBhdGg6IGRlc3RpbmF0aW9uLnBhdGggfSk7XG4gIHJldHVybiB3aXRoRmlsZUxvY2soW1wiYmluLmVuc3VyZVwiLCBkZXN0aW5hdGlvbi5wYXRoXSwgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChhd2FpdCBpc1ZhbGlkQmluKGRlc3RpbmF0aW9uLnBhdGgsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ1c2luZyBiaW5hcnkgaW5zdGFsbGVkIGJ5IGFub3RoZXIgY2FsbGVyXCIsIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGF0aDogZGVzdGluYXRpb24ucGF0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgIH1cblxuICAgIGxvZ2dlci5kZWJ1ZyhcImluc3RhbGxpbmcgYmluYXJ5XCIsIHtcbiAgICAgIG5hbWUsXG4gICAgICB0bzogZGVzdGluYXRpb24ucGF0aCxcbiAgICAgIG1pblZlcnNpb246IG9wdGlvbnMubWluVmVyc2lvbixcbiAgICB9KTtcbiAgICBjb25zdCB0ZW1wID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBgJHtuYW1lfS1gKSk7XG4gICAgbGV0IHN0YWdlZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHR5cGVvZiB1cmwgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHVybCh7IHRlbXBEaXI6IHRlbXAgfSkgOiB1cmw7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0eXBlb2YgcmVzb2x2ZWQgPT09IFwic3RyaW5nXCIgPyB7IHVybDogcmVzb2x2ZWQgfSA6IHJlc29sdmVkO1xuICAgICAgY29uc3QgZnJvbSA9IGRpc3BsYXlVcmwoc291cmNlLnVybCk7XG4gICAgICBsb2dnZXIuZGVidWcoXCJyZXNvbHZlZCBiaW5hcnkgc291cmNlXCIsIHsgbmFtZSwgZnJvbSB9KTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgc2VsZWN0ZWRCaW4oZGVzdGluYXRpb24sIHNvdXJjZSwgdGVtcCwgb3B0aW9ucyk7XG4gICAgICBhd2FpdCBjaG1vZChzZWxlY3RlZCwgMG83NTUpO1xuICAgICAgaWYgKCEoYXdhaXQgaXNWYWxpZEJpbihzZWxlY3RlZCwgb3B0aW9ucykpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgc2VsZWN0ZWQgYmluYXJ5IGhhcyBubyBhY2NlcHRhYmxlIHZlcnNpb246ICR7c2VsZWN0ZWR9YCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG1rZGlyKGRlc3RpbmF0aW9uLmJpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBzdGFnZWQgPSBqb2luKGRlc3RpbmF0aW9uLmJpbkRpciwgYC4ke25hbWV9LSR7cmFuZG9tVVVJRCgpfWApO1xuICAgICAgYXdhaXQgY29weUZpbGUoc2VsZWN0ZWQsIHN0YWdlZCk7XG4gICAgICBhd2FpdCBjaG1vZChzdGFnZWQsIDBvNzU1KTtcbiAgICAgIGF3YWl0IHJlbmFtZShzdGFnZWQsIGRlc3RpbmF0aW9uLnBhdGgpO1xuICAgICAgc3RhZ2VkID0gdW5kZWZpbmVkO1xuICAgICAgaWYgKCEoYXdhaXQgaXNWYWxpZEJpbihkZXN0aW5hdGlvbi5wYXRoLCBvcHRpb25zKSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnN0YWxsZWQgYmluYXJ5IGlzIGludmFsaWQgYWZ0ZXIgcmVuYW1lOiAke2Rlc3RpbmF0aW9uLnBhdGh9YCk7XG4gICAgICB9XG4gICAgICBsb2dnZXIuaW5mbyhcImluc3RhbGxlZCBiaW5hcnlcIiwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBmcm9tLFxuICAgICAgICB0bzogZGVzdGluYXRpb24ucGF0aCxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc3RhZ2VkKSBhd2FpdCBybShzdGFnZWQsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICBhd2FpdCBybSh0ZW1wLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve npm dependency specifiers against the configured registry.
|
|
3
|
+
*
|
|
4
|
+
* Callers pass an already-parsed `package.json`. The function never writes that
|
|
5
|
+
* project: it copies the manifest into a temporary directory, proves that this
|
|
6
|
+
* Bun version's missing-package errors are parseable, then pins unavailable
|
|
7
|
+
* packages (or their parents) until `bun install` succeeds. The returned maps
|
|
8
|
+
* are the resolvable registry specifiers.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
type InstallResult = {
|
|
13
|
+
ok: boolean;
|
|
14
|
+
stdout: string;
|
|
15
|
+
stderr: string;
|
|
16
|
+
missing: string[];
|
|
17
|
+
};
|
|
18
|
+
type PackageInfo = {
|
|
19
|
+
name: string;
|
|
20
|
+
versions: string[];
|
|
21
|
+
latest?: string;
|
|
22
|
+
dependencies: Record<string, Record<string, string>>;
|
|
23
|
+
};
|
|
24
|
+
type ResolveDependenciesOptions = {
|
|
25
|
+
verify?: () => Promise<void>;
|
|
26
|
+
install?: (manifest: Record<string, unknown>) => Promise<InstallResult>;
|
|
27
|
+
packageInfo?: (name: string) => Promise<PackageInfo | undefined>;
|
|
28
|
+
};
|
|
29
|
+
/** Registry dependency maps that `bun install` can resolve. */
|
|
30
|
+
export type ResolvedNpmDependencies = {
|
|
31
|
+
dependencies: Record<string, string>;
|
|
32
|
+
devDependencies: Record<string, string>;
|
|
33
|
+
optionalDependencies: Record<string, string>;
|
|
34
|
+
peerDependencies: Record<string, string>;
|
|
35
|
+
overrides: Record<string, string>;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Return resolvable dependency specifiers for an in-memory `package.json`.
|
|
39
|
+
*
|
|
40
|
+
* The input object is not mutated. Bun missing-package parsing is self-tested
|
|
41
|
+
* once per process before any install attempt.
|
|
42
|
+
*/
|
|
43
|
+
export declare function resolveDependencies(manifest: Record<string, unknown>, options?: ResolveDependenciesOptions): Promise<ResolvedNpmDependencies>;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve npm dependency specifiers against the configured registry.
|
|
3
|
+
*
|
|
4
|
+
* Callers pass an already-parsed `package.json`. The function never writes that
|
|
5
|
+
* project: it copies the manifest into a temporary directory, proves that this
|
|
6
|
+
* Bun version's missing-package errors are parseable, then pins unavailable
|
|
7
|
+
* packages (or their parents) until `bun install` succeeds. The returned maps
|
|
8
|
+
* are the resolvable registry specifiers.
|
|
9
|
+
*
|
|
10
|
+
* @module
|
|
11
|
+
*/
|
|
12
|
+
import { randomUUID } from "node:crypto";
|
|
13
|
+
import { mkdtemp, rm, writeFile } from "node:fs/promises";
|
|
14
|
+
import { tmpdir } from "node:os";
|
|
15
|
+
import { delimiter, dirname, join } from "node:path";
|
|
16
|
+
import { functionUtils, json, object } from "@dbx-tools/shared-core";
|
|
17
|
+
import { spawn } from "./exec.js";
|
|
18
|
+
import { npmRegistry } from "./project-utils.js";
|
|
19
|
+
const DEPENDENCY_FIELDS = [
|
|
20
|
+
"dependencies",
|
|
21
|
+
"devDependencies",
|
|
22
|
+
"optionalDependencies",
|
|
23
|
+
"peerDependencies",
|
|
24
|
+
];
|
|
25
|
+
const INSTALL_ARGS = ["install", "--ignore-scripts", "--no-cache"];
|
|
26
|
+
const MAX_ITERATIONS = 100;
|
|
27
|
+
/**
|
|
28
|
+
* Return resolvable dependency specifiers for an in-memory `package.json`.
|
|
29
|
+
*
|
|
30
|
+
* The input object is not mutated. Bun missing-package parsing is self-tested
|
|
31
|
+
* once per process before any install attempt.
|
|
32
|
+
*/
|
|
33
|
+
export async function resolveDependencies(manifest, options = {}) {
|
|
34
|
+
const working = structuredClone(manifest);
|
|
35
|
+
await (options.verify ?? verifyBunErrorParsing)();
|
|
36
|
+
const install = options.install ?? installManifest;
|
|
37
|
+
const packageInfo = options.packageInfo ?? createPackageInfoLookup();
|
|
38
|
+
const attempted = new Set();
|
|
39
|
+
for (let iteration = 1; iteration <= MAX_ITERATIONS; iteration += 1) {
|
|
40
|
+
const result = await install(working);
|
|
41
|
+
if (result.ok)
|
|
42
|
+
return snapshot(working);
|
|
43
|
+
if (result.missing.length === 0) {
|
|
44
|
+
throw new Error([
|
|
45
|
+
"bun install failed without a parseable missing package.",
|
|
46
|
+
"",
|
|
47
|
+
"Raw Bun output:",
|
|
48
|
+
`${result.stdout}\n${result.stderr}`,
|
|
49
|
+
].join("\n"));
|
|
50
|
+
}
|
|
51
|
+
let changed = false;
|
|
52
|
+
for (const missing of result.missing) {
|
|
53
|
+
const pin = await pinForMissing(missing, working, packageInfo, attempted);
|
|
54
|
+
if (pin)
|
|
55
|
+
changed = pinPackage(working, pin.name, pin.version) || changed;
|
|
56
|
+
}
|
|
57
|
+
if (!changed) {
|
|
58
|
+
throw new Error(`No remaining registry pin for: ${result.missing.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Reached ${MAX_ITERATIONS} install attempts without a successful bun install.`);
|
|
62
|
+
}
|
|
63
|
+
const verifyBunErrorParsing = functionUtils.memoize(async () => {
|
|
64
|
+
const impossible = `__npm_resolver_missing_${randomUUID()}__`;
|
|
65
|
+
const result = await installManifest({
|
|
66
|
+
private: true,
|
|
67
|
+
dependencies: { [impossible]: "1.0.0" },
|
|
68
|
+
});
|
|
69
|
+
if (result.ok) {
|
|
70
|
+
throw new Error(`Bun self-test unexpectedly succeeded for ${impossible}`);
|
|
71
|
+
}
|
|
72
|
+
if (!result.missing.includes(impossible)) {
|
|
73
|
+
throw new Error([
|
|
74
|
+
"Bun's missing-package output is not parseable.",
|
|
75
|
+
"",
|
|
76
|
+
`Expected: ${impossible}`,
|
|
77
|
+
`Parsed: ${JSON.stringify(result.missing)}`,
|
|
78
|
+
"",
|
|
79
|
+
"Raw Bun output:",
|
|
80
|
+
`${result.stdout}\n${result.stderr}`,
|
|
81
|
+
].join("\n"));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
async function installManifest(manifest) {
|
|
85
|
+
const dir = await mkdtemp(join(tmpdir(), "npm-resolver-"));
|
|
86
|
+
try {
|
|
87
|
+
await writeFile(join(dir, "package.json"), `${JSON.stringify(manifest, null, 2)}\n`);
|
|
88
|
+
const [command, ...prefix] = bunArgv();
|
|
89
|
+
const url = registryUrl();
|
|
90
|
+
const registryArgs = url ? ["--registry", url] : [];
|
|
91
|
+
const result = await spawn(command, [...prefix, ...INSTALL_ARGS, ...registryArgs], {
|
|
92
|
+
cwd: dir,
|
|
93
|
+
stdin: "ignore",
|
|
94
|
+
stdout: "capture",
|
|
95
|
+
stderr: "capture",
|
|
96
|
+
env: registryEnv(),
|
|
97
|
+
});
|
|
98
|
+
const stdout = result.stdout;
|
|
99
|
+
const stderr = result.stderr;
|
|
100
|
+
return {
|
|
101
|
+
ok: result.exitCode === 0,
|
|
102
|
+
stdout,
|
|
103
|
+
stderr,
|
|
104
|
+
missing: parseMissingPackages(`${stdout}\n${stderr}`),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
await rm(dir, { recursive: true, force: true });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function parseMissingPackages(output) {
|
|
112
|
+
const packages = new Set();
|
|
113
|
+
const url404 = /(?:GET|HEAD)\s+https?:\/\/[^/\s]+\/((?:@[^/\s]+(?:%2[fF]|\/)[^/?\s]+)|(?:[^/?\s]+))[^\s]*\s+-\s+404/g;
|
|
114
|
+
for (const match of output.matchAll(url404)) {
|
|
115
|
+
packages.add(decodePackageName(match[1] ?? ""));
|
|
116
|
+
}
|
|
117
|
+
const packageNotFound = /package\s+["']([^"']+)["']\s+(?:was\s+)?not\s+found/gi;
|
|
118
|
+
for (const match of output.matchAll(packageNotFound)) {
|
|
119
|
+
packages.add(match[1] ?? "");
|
|
120
|
+
}
|
|
121
|
+
const failedResolve = /failed\s+to\s+resolve\s+["']([^"']+)["']/gi;
|
|
122
|
+
for (const match of output.matchAll(failedResolve)) {
|
|
123
|
+
packages.add(stripVersion(match[1] ?? ""));
|
|
124
|
+
}
|
|
125
|
+
const failedAt = /((?:@[^/\s]+\/)?[^@\s]+)@[^\s]+\s+failed to resolve/gi;
|
|
126
|
+
for (const match of output.matchAll(failedAt)) {
|
|
127
|
+
packages.add(match[1] ?? "");
|
|
128
|
+
}
|
|
129
|
+
packages.delete("");
|
|
130
|
+
return [...packages];
|
|
131
|
+
}
|
|
132
|
+
function decodePackageName(value) {
|
|
133
|
+
let name = value;
|
|
134
|
+
try {
|
|
135
|
+
name = decodeURIComponent(name);
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Leave it encoded when the segment is not a valid URI component.
|
|
139
|
+
}
|
|
140
|
+
return name.replace(/%2f/gi, "/");
|
|
141
|
+
}
|
|
142
|
+
function stripVersion(value) {
|
|
143
|
+
if (value.startsWith("@")) {
|
|
144
|
+
const slash = value.indexOf("/");
|
|
145
|
+
const at = value.indexOf("@", slash + 1);
|
|
146
|
+
return at === -1 ? value : value.slice(0, at);
|
|
147
|
+
}
|
|
148
|
+
const at = value.indexOf("@");
|
|
149
|
+
return at === -1 ? value : value.slice(0, at);
|
|
150
|
+
}
|
|
151
|
+
function registryUrl() {
|
|
152
|
+
return npmRegistry(null, { overrideOnly: true, envVars: true })?.toString();
|
|
153
|
+
}
|
|
154
|
+
function registryEnv() {
|
|
155
|
+
const env = { ...process.env };
|
|
156
|
+
const runtimeBin = dirname(process.execPath);
|
|
157
|
+
const pathEntries = (env.PATH ?? "").split(delimiter).filter(Boolean);
|
|
158
|
+
if (!pathEntries.includes(runtimeBin)) {
|
|
159
|
+
env.PATH = [runtimeBin, ...pathEntries].join(delimiter);
|
|
160
|
+
}
|
|
161
|
+
const url = registryUrl();
|
|
162
|
+
if (url) {
|
|
163
|
+
env.npm_config_registry = url;
|
|
164
|
+
env.NPM_CONFIG_REGISTRY = url;
|
|
165
|
+
env.BUN_CONFIG_REGISTRY = url;
|
|
166
|
+
}
|
|
167
|
+
return env;
|
|
168
|
+
}
|
|
169
|
+
function bunArgv() {
|
|
170
|
+
return /\bbun\b/i.test(process.execPath) ? [process.execPath] : ["bun"];
|
|
171
|
+
}
|
|
172
|
+
function snapshot(manifest) {
|
|
173
|
+
return {
|
|
174
|
+
dependencies: dependencyMap(manifest, "dependencies"),
|
|
175
|
+
devDependencies: dependencyMap(manifest, "devDependencies"),
|
|
176
|
+
optionalDependencies: dependencyMap(manifest, "optionalDependencies"),
|
|
177
|
+
peerDependencies: dependencyMap(manifest, "peerDependencies"),
|
|
178
|
+
overrides: overrideMap(manifest),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function dependencyMap(manifest, field) {
|
|
182
|
+
const value = manifest[field];
|
|
183
|
+
if (!object.isRecord(value))
|
|
184
|
+
return {};
|
|
185
|
+
const out = {};
|
|
186
|
+
for (const [name, spec] of Object.entries(value)) {
|
|
187
|
+
if (typeof spec === "string")
|
|
188
|
+
out[name] = spec;
|
|
189
|
+
}
|
|
190
|
+
return out;
|
|
191
|
+
}
|
|
192
|
+
function declaredDependencies(manifest) {
|
|
193
|
+
const out = {};
|
|
194
|
+
for (const field of DEPENDENCY_FIELDS)
|
|
195
|
+
Object.assign(out, dependencyMap(manifest, field));
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
198
|
+
function isRegistrySpecifier(spec) {
|
|
199
|
+
return !/^(workspace:|catalog:|file:|link:|git\+|github:|https?:|npm:)/i.test(spec);
|
|
200
|
+
}
|
|
201
|
+
function overrideMap(manifest) {
|
|
202
|
+
const value = manifest.overrides;
|
|
203
|
+
if (!object.isRecord(value))
|
|
204
|
+
return {};
|
|
205
|
+
const out = {};
|
|
206
|
+
for (const [name, spec] of Object.entries(value)) {
|
|
207
|
+
if (typeof spec === "string")
|
|
208
|
+
out[name] = spec;
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
function pinPackage(manifest, name, version) {
|
|
213
|
+
let changed = false;
|
|
214
|
+
const overrides = overrideMap(manifest);
|
|
215
|
+
if (overrides[name] !== version) {
|
|
216
|
+
overrides[name] = version;
|
|
217
|
+
manifest.overrides = overrides;
|
|
218
|
+
changed = true;
|
|
219
|
+
}
|
|
220
|
+
for (const field of DEPENDENCY_FIELDS) {
|
|
221
|
+
const deps = dependencyMap(manifest, field);
|
|
222
|
+
if (name in deps && deps[name] !== version && isRegistrySpecifier(deps[name] ?? "")) {
|
|
223
|
+
deps[name] = version;
|
|
224
|
+
manifest[field] = deps;
|
|
225
|
+
changed = true;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return changed;
|
|
229
|
+
}
|
|
230
|
+
function newestFirst(versions) {
|
|
231
|
+
return [...versions].sort((left, right) => right.localeCompare(left, undefined, { numeric: true, sensitivity: "base" }));
|
|
232
|
+
}
|
|
233
|
+
async function pinForMissing(missing, manifest, packageInfo, attempted) {
|
|
234
|
+
const available = await packageInfo(missing);
|
|
235
|
+
if (available) {
|
|
236
|
+
const version = nextUnusedVersion(missing, available, attempted);
|
|
237
|
+
if (version) {
|
|
238
|
+
attempted.add(`${missing}@${version}`);
|
|
239
|
+
return { name: missing, version };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const parent of await parentPackages(missing, manifest, packageInfo)) {
|
|
243
|
+
const info = await packageInfo(parent);
|
|
244
|
+
if (!info)
|
|
245
|
+
continue;
|
|
246
|
+
const version = compatibleParentVersion(missing, info, attempted);
|
|
247
|
+
if (!version)
|
|
248
|
+
continue;
|
|
249
|
+
attempted.add(`${parent}@${version}`);
|
|
250
|
+
return { name: parent, version };
|
|
251
|
+
}
|
|
252
|
+
return undefined;
|
|
253
|
+
}
|
|
254
|
+
function nextUnusedVersion(name, info, attempted) {
|
|
255
|
+
const preferred = info.latest
|
|
256
|
+
? [info.latest, ...newestFirst(info.versions)]
|
|
257
|
+
: newestFirst(info.versions);
|
|
258
|
+
for (const version of preferred) {
|
|
259
|
+
if (!attempted.has(`${name}@${version}`))
|
|
260
|
+
return version;
|
|
261
|
+
}
|
|
262
|
+
return undefined;
|
|
263
|
+
}
|
|
264
|
+
function compatibleParentVersion(missing, info, attempted) {
|
|
265
|
+
for (const version of newestFirst(info.versions)) {
|
|
266
|
+
if (attempted.has(`${info.name}@${version}`))
|
|
267
|
+
continue;
|
|
268
|
+
if (!(missing in (info.dependencies[version] ?? {})))
|
|
269
|
+
return version;
|
|
270
|
+
}
|
|
271
|
+
return undefined;
|
|
272
|
+
}
|
|
273
|
+
async function parentPackages(missing, manifest, packageInfo) {
|
|
274
|
+
const declared = declaredDependencies(manifest);
|
|
275
|
+
if (missing in declared && isRegistrySpecifier(declared[missing] ?? ""))
|
|
276
|
+
return [];
|
|
277
|
+
const parents = [];
|
|
278
|
+
for (const name of Object.keys(declared)) {
|
|
279
|
+
if (name === missing || !isRegistrySpecifier(declared[name] ?? ""))
|
|
280
|
+
continue;
|
|
281
|
+
const info = await packageInfo(name);
|
|
282
|
+
if (!info)
|
|
283
|
+
continue;
|
|
284
|
+
if (Object.values(info.dependencies).some((map) => missing in map))
|
|
285
|
+
parents.push(name);
|
|
286
|
+
}
|
|
287
|
+
return parents;
|
|
288
|
+
}
|
|
289
|
+
function createPackageInfoLookup() {
|
|
290
|
+
const cache = new Map();
|
|
291
|
+
return (name) => {
|
|
292
|
+
const cached = cache.get(name);
|
|
293
|
+
if (cached)
|
|
294
|
+
return cached;
|
|
295
|
+
const pending = loadPackageInfo(name);
|
|
296
|
+
cache.set(name, pending);
|
|
297
|
+
void pending.then(undefined, () => {
|
|
298
|
+
cache.delete(name);
|
|
299
|
+
});
|
|
300
|
+
return pending;
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
async function loadPackageInfo(name) {
|
|
304
|
+
const result = await spawn("npm", ["view", name, "--json"], {
|
|
305
|
+
stdin: "ignore",
|
|
306
|
+
stdout: "capture",
|
|
307
|
+
stderr: "capture",
|
|
308
|
+
env: registryEnv(),
|
|
309
|
+
});
|
|
310
|
+
if (result.exitCode !== 0)
|
|
311
|
+
return undefined;
|
|
312
|
+
const packument = json.parse(result.stdout);
|
|
313
|
+
if (!object.isRecord(packument))
|
|
314
|
+
return undefined;
|
|
315
|
+
const versions = publishedVersions(packument);
|
|
316
|
+
if (versions.length === 0)
|
|
317
|
+
return undefined;
|
|
318
|
+
return {
|
|
319
|
+
name,
|
|
320
|
+
versions,
|
|
321
|
+
latest: latestTag(packument) ?? versions.at(-1),
|
|
322
|
+
dependencies: versionDependencies(packument),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function publishedVersions(packument) {
|
|
326
|
+
if (typeof packument.version === "string" && !packument.versions) {
|
|
327
|
+
return [packument.version];
|
|
328
|
+
}
|
|
329
|
+
const versions = packument.versions;
|
|
330
|
+
if (Array.isArray(versions)) {
|
|
331
|
+
return versions.filter((value) => typeof value === "string");
|
|
332
|
+
}
|
|
333
|
+
if (object.isRecord(versions))
|
|
334
|
+
return Object.keys(versions);
|
|
335
|
+
return [];
|
|
336
|
+
}
|
|
337
|
+
function latestTag(packument) {
|
|
338
|
+
const tags = packument["dist-tags"];
|
|
339
|
+
if (!object.isRecord(tags) || typeof tags.latest !== "string")
|
|
340
|
+
return undefined;
|
|
341
|
+
return tags.latest;
|
|
342
|
+
}
|
|
343
|
+
function versionDependencies(packument) {
|
|
344
|
+
const versions = packument.versions;
|
|
345
|
+
if (!object.isRecord(versions)) {
|
|
346
|
+
return typeof packument.version === "string"
|
|
347
|
+
? { [packument.version]: stringMap(packument.dependencies) }
|
|
348
|
+
: {};
|
|
349
|
+
}
|
|
350
|
+
const out = {};
|
|
351
|
+
for (const [version, value] of Object.entries(versions)) {
|
|
352
|
+
if (object.isRecord(value))
|
|
353
|
+
out[version] = stringMap(value.dependencies);
|
|
354
|
+
}
|
|
355
|
+
return out;
|
|
356
|
+
}
|
|
357
|
+
function stringMap(value) {
|
|
358
|
+
if (!object.isRecord(value))
|
|
359
|
+
return {};
|
|
360
|
+
const out = {};
|
|
361
|
+
for (const [name, spec] of Object.entries(value)) {
|
|
362
|
+
if (typeof spec === "string")
|
|
363
|
+
out[name] = spec;
|
|
364
|
+
}
|
|
365
|
+
return out;
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnBtLXJlc29sdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25wbS1yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRCxNQUFNLGlCQUFpQixHQUFHO0lBQ3hCLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtDQUNWLENBQUM7QUFFWCxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLENBQVUsQ0FBQztBQUM1RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUM7QUFpQzNCOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsUUFBaUMsRUFDakMsVUFBc0MsRUFBRTtJQUV4QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUkscUJBQXFCLENBQUMsRUFBRSxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO0lBQ25E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QU8sRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFjO0lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc29sdmUgbnBtIGRlcGVuZGVuY3kgc3BlY2lmaWVycyBhZ2FpbnN0IHRoZSBjb25maWd1cmVkIHJlZ2lzdHJ5LlxuICpcbiAqIENhbGxlcnMgcGFzcyBhbiBhbHJlYWR5LXBhcnNlZCBgcGFja2FnZS5qc29uYC4gVGhlIGZ1bmN0aW9uIG5ldmVyIHdyaXRlcyB0aGF0XG4gKiBwcm9qZWN0OiBpdCBjb3BpZXMgdGhlIG1hbmlmZXN0IGludG8gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBwcm92ZXMgdGhhdCB0aGlzXG4gKiBCdW4gdmVyc2lvbidzIG1pc3NpbmctcGFja2FnZSBlcnJvcnMgYXJlIHBhcnNlYWJsZSwgdGhlbiBwaW5zIHVuYXZhaWxhYmxlXG4gKiBwYWNrYWdlcyAob3IgdGhlaXIgcGFyZW50cykgdW50aWwgYGJ1biBpbnN0YWxsYCBzdWNjZWVkcy4gVGhlIHJldHVybmVkIG1hcHNcbiAqIGFyZSB0aGUgcmVzb2x2YWJsZSByZWdpc3RyeSBzcGVjaWZpZXJzLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBta2R0ZW1wLCBybSwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBkZWxpbWl0ZXIsIGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGZ1bmN0aW9uVXRpbHMsIGpzb24sIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIi4vZXhlYy50c1wiO1xuaW1wb3J0IHsgbnBtUmVnaXN0cnkgfSBmcm9tIFwiLi9wcm9qZWN0LXV0aWxzLnRzXCI7XG5cbmNvbnN0IERFUEVOREVOQ1lfRklFTERTID0gW1xuICBcImRlcGVuZGVuY2llc1wiLFxuICBcImRldkRlcGVuZGVuY2llc1wiLFxuICBcIm9wdGlvbmFsRGVwZW5kZW5jaWVzXCIsXG4gIFwicGVlckRlcGVuZGVuY2llc1wiLFxuXSBhcyBjb25zdDtcblxuY29uc3QgSU5TVEFMTF9BUkdTID0gW1wiaW5zdGFsbFwiLCBcIi0taWdub3JlLXNjcmlwdHNcIiwgXCItLW5vLWNhY2hlXCJdIGFzIGNvbnN0O1xuY29uc3QgTUFYX0lURVJBVElPTlMgPSAxMDA7XG5cbnR5cGUgRGVwZW5kZW5jeUZpZWxkID0gKHR5cGVvZiBERVBFTkRFTkNZX0ZJRUxEUylbbnVtYmVyXTtcblxudHlwZSBJbnN0YWxsUmVzdWx0ID0ge1xuICBvazogYm9vbGVhbjtcbiAgc3Rkb3V0OiBzdHJpbmc7XG4gIHN0ZGVycjogc3RyaW5nO1xuICBtaXNzaW5nOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgUGFja2FnZUluZm8gPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmVyc2lvbnM6IHN0cmluZ1tdO1xuICBsYXRlc3Q/OiBzdHJpbmc7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59O1xuXG50eXBlIFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge1xuICB2ZXJpZnk/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBpbnN0YWxsPzogKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUHJvbWlzZTxJbnN0YWxsUmVzdWx0PjtcbiAgcGFja2FnZUluZm8/OiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPjtcbn07XG5cbi8qKiBSZWdpc3RyeSBkZXBlbmRlbmN5IG1hcHMgdGhhdCBgYnVuIGluc3RhbGxgIGNhbiByZXNvbHZlLiAqL1xuZXhwb3J0IHR5cGUgUmVzb2x2ZWROcG1EZXBlbmRlbmNpZXMgPSB7XG4gIGRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZGV2RGVwZW5kZW5jaWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBvcHRpb25hbERlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcGVlckRlcGVuZGVuY2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gcmVzb2x2YWJsZSBkZXBlbmRlbmN5IHNwZWNpZmllcnMgZm9yIGFuIGluLW1lbW9yeSBgcGFja2FnZS5qc29uYC5cbiAqXG4gKiBUaGUgaW5wdXQgb2JqZWN0IGlzIG5vdCBtdXRhdGVkLiBCdW4gbWlzc2luZy1wYWNrYWdlIHBhcnNpbmcgaXMgc2VsZi10ZXN0ZWRcbiAqIG9uY2UgcGVyIHByb2Nlc3MgYmVmb3JlIGFueSBpbnN0YWxsIGF0dGVtcHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlRGVwZW5kZW5jaWVzKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIG9wdGlvbnM6IFJlc29sdmVEZXBlbmRlbmNpZXNPcHRpb25zID0ge30sXG4pOiBQcm9taXNlPFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzPiB7XG4gIGNvbnN0IHdvcmtpbmcgPSBzdHJ1Y3R1cmVkQ2xvbmUobWFuaWZlc3QpO1xuICBhd2FpdCAob3B0aW9ucy52ZXJpZnkgPz8gdmVyaWZ5QnVuRXJyb3JQYXJzaW5nKSgpO1xuICBjb25zdCBpbnN0YWxsID0gb3B0aW9ucy5pbnN0YWxsID8/IGluc3RhbGxNYW5pZmVzdDtcbiAgY29uc3QgcGFja2FnZUluZm8gPSBvcHRpb25zLnBhY2thZ2VJbmZvID8/IGNyZWF0ZVBhY2thZ2VJbmZvTG9va3VwKCk7XG4gIGNvbnN0IGF0dGVtcHRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAobGV0IGl0ZXJhdGlvbiA9IDE7IGl0ZXJhdGlvbiA8PSBNQVhfSVRFUkFUSU9OUzsgaXRlcmF0aW9uICs9IDEpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnN0YWxsKHdvcmtpbmcpO1xuICAgIGlmIChyZXN1bHQub2spIHJldHVybiBzbmFwc2hvdCh3b3JraW5nKTtcbiAgICBpZiAocmVzdWx0Lm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICBcImJ1biBpbnN0YWxsIGZhaWxlZCB3aXRob3V0IGEgcGFyc2VhYmxlIG1pc3NpbmcgcGFja2FnZS5cIixcbiAgICAgICAgICBcIlwiLFxuICAgICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgICAgYCR7cmVzdWx0LnN0ZG91dH1cXG4ke3Jlc3VsdC5zdGRlcnJ9YCxcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3QgbWlzc2luZyBvZiByZXN1bHQubWlzc2luZykge1xuICAgICAgY29uc3QgcGluID0gYXdhaXQgcGluRm9yTWlzc2luZyhtaXNzaW5nLCB3b3JraW5nLCBwYWNrYWdlSW5mbywgYXR0ZW1wdGVkKTtcbiAgICAgIGlmIChwaW4pIGNoYW5nZWQgPSBwaW5QYWNrYWdlKHdvcmtpbmcsIHBpbi5uYW1lLCBwaW4udmVyc2lvbikgfHwgY2hhbmdlZDtcbiAgICB9XG4gICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbWFpbmluZyByZWdpc3RyeSBwaW4gZm9yOiAke3Jlc3VsdC5taXNzaW5nLmpvaW4oXCIsIFwiKX1gKTtcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFJlYWNoZWQgJHtNQVhfSVRFUkFUSU9OU30gaW5zdGFsbCBhdHRlbXB0cyB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBidW4gaW5zdGFsbC5gKTtcbn1cblxuY29uc3QgdmVyaWZ5QnVuRXJyb3JQYXJzaW5nID0gZnVuY3Rpb25VdGlscy5tZW1vaXplKGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgaW1wb3NzaWJsZSA9IGBfX25wbV9yZXNvbHZlcl9taXNzaW5nXyR7cmFuZG9tVVVJRCgpfV9fYDtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaW5zdGFsbE1hbmlmZXN0KHtcbiAgICBwcml2YXRlOiB0cnVlLFxuICAgIGRlcGVuZGVuY2llczogeyBbaW1wb3NzaWJsZV06IFwiMS4wLjBcIiB9LFxuICB9KTtcbiAgaWYgKHJlc3VsdC5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQnVuIHNlbGYtdGVzdCB1bmV4cGVjdGVkbHkgc3VjY2VlZGVkIGZvciAke2ltcG9zc2libGV9YCk7XG4gIH1cbiAgaWYgKCFyZXN1bHQubWlzc2luZy5pbmNsdWRlcyhpbXBvc3NpYmxlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIFtcbiAgICAgICAgXCJCdW4ncyBtaXNzaW5nLXBhY2thZ2Ugb3V0cHV0IGlzIG5vdCBwYXJzZWFibGUuXCIsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIGBFeHBlY3RlZDogJHtpbXBvc3NpYmxlfWAsXG4gICAgICAgIGBQYXJzZWQ6ICR7SlNPTi5zdHJpbmdpZnkocmVzdWx0Lm1pc3NpbmcpfWAsXG4gICAgICAgIFwiXCIsXG4gICAgICAgIFwiUmF3IEJ1biBvdXRwdXQ6XCIsXG4gICAgICAgIGAke3Jlc3VsdC5zdGRvdXR9XFxuJHtyZXN1bHQuc3RkZXJyfWAsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgKTtcbiAgfVxufSk7XG5cbmFzeW5jIGZ1bmN0aW9uIGluc3RhbGxNYW5pZmVzdChtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPEluc3RhbGxSZXN1bHQ+IHtcbiAgY29uc3QgZGlyID0gYXdhaXQgbWtkdGVtcChqb2luKHRtcGRpcigpLCBcIm5wbS1yZXNvbHZlci1cIikpO1xuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKGRpciwgXCJwYWNrYWdlLmpzb25cIiksIGAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0LCBudWxsLCAyKX1cXG5gKTtcbiAgICBjb25zdCBbY29tbWFuZCwgLi4ucHJlZml4XSA9IGJ1bkFyZ3YoKTtcbiAgICBjb25zdCB1cmwgPSByZWdpc3RyeVVybCgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5QXJncyA9IHVybCA/IFtcIi0tcmVnaXN0cnlcIiwgdXJsXSA6IFtdO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNwYXduKGNvbW1hbmQsIFsuLi5wcmVmaXgsIC4uLklOU1RBTExfQVJHUywgLi4ucmVnaXN0cnlBcmdzXSwge1xuICAgICAgY3dkOiBkaXIsXG4gICAgICBzdGRpbjogXCJpZ25vcmVcIixcbiAgICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgICAgZW52OiByZWdpc3RyeUVudigpLFxuICAgIH0pO1xuICAgIGNvbnN0IHN0ZG91dCA9IHJlc3VsdC5zdGRvdXQ7XG4gICAgY29uc3Qgc3RkZXJyID0gcmVzdWx0LnN0ZGVycjtcbiAgICByZXR1cm4ge1xuICAgICAgb2s6IHJlc3VsdC5leGl0Q29kZSA9PT0gMCxcbiAgICAgIHN0ZG91dCxcbiAgICAgIHN0ZGVycixcbiAgICAgIG1pc3Npbmc6IHBhcnNlTWlzc2luZ1BhY2thZ2VzKGAke3N0ZG91dH1cXG4ke3N0ZGVycn1gKSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHJtKGRpciwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTWlzc2luZ1BhY2thZ2VzKG91dHB1dDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYWNrYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1cmw0MDQgPVxuICAgIC8oPzpHRVR8SEVBRClcXHMraHR0cHM/OlxcL1xcL1teL1xcc10rXFwvKCg/OkBbXi9cXHNdKyg/OiUyW2ZGXXxcXC8pW14vP1xcc10rKXwoPzpbXi8/XFxzXSspKVteXFxzXSpcXHMrLVxccys0MDQvZztcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBvdXRwdXQubWF0Y2hBbGwodXJsNDA0KSkge1xuICAgIHBhY2thZ2VzLmFkZChkZWNvZGVQYWNrYWdlTmFtZShtYXRjaFsxXSA/PyBcIlwiKSk7XG4gIH1cbiAgY29uc3QgcGFja2FnZU5vdEZvdW5kID0gL3BhY2thZ2VcXHMrW1wiJ10oW15cIiddKylbXCInXVxccysoPzp3YXNcXHMrKT9ub3RcXHMrZm91bmQvZ2k7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygb3V0cHV0Lm1hdGNoQWxsKHBhY2thZ2VOb3RGb3VuZCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgY29uc3QgZmFpbGVkUmVzb2x2ZSA9IC9mYWlsZWRcXHMrdG9cXHMrcmVzb2x2ZVxccytbXCInXShbXlwiJ10rKVtcIiddL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRSZXNvbHZlKSkge1xuICAgIHBhY2thZ2VzLmFkZChzdHJpcFZlcnNpb24obWF0Y2hbMV0gPz8gXCJcIikpO1xuICB9XG4gIGNvbnN0IGZhaWxlZEF0ID0gLygoPzpAW14vXFxzXStcXC8pP1teQFxcc10rKUBbXlxcc10rXFxzK2ZhaWxlZCB0byByZXNvbHZlL2dpO1xuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG91dHB1dC5tYXRjaEFsbChmYWlsZWRBdCkpIHtcbiAgICBwYWNrYWdlcy5hZGQobWF0Y2hbMV0gPz8gXCJcIik7XG4gIH1cbiAgcGFja2FnZXMuZGVsZXRlKFwiXCIpO1xuICByZXR1cm4gWy4uLnBhY2thZ2VzXTtcbn1cblxuZnVuY3Rpb24gZGVjb2RlUGFja2FnZU5hbWUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBuYW1lID0gdmFsdWU7XG4gIHRyeSB7XG4gICAgbmFtZSA9IGRlY29kZVVSSUNvbXBvbmVudChuYW1lKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gTGVhdmUgaXQgZW5jb2RlZCB3aGVuIHRoZSBzZWdtZW50IGlzIG5vdCBhIHZhbGlkIFVSSSBjb21wb25lbnQuXG4gIH1cbiAgcmV0dXJuIG5hbWUucmVwbGFjZSgvJTJmL2dpLCBcIi9cIik7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVmVyc2lvbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJAXCIpKSB7XG4gICAgY29uc3Qgc2xhc2ggPSB2YWx1ZS5pbmRleE9mKFwiL1wiKTtcbiAgICBjb25zdCBhdCA9IHZhbHVlLmluZGV4T2YoXCJAXCIsIHNsYXNoICsgMSk7XG4gICAgcmV0dXJuIGF0ID09PSAtMSA/IHZhbHVlIDogdmFsdWUuc2xpY2UoMCwgYXQpO1xuICB9XG4gIGNvbnN0IGF0ID0gdmFsdWUuaW5kZXhPZihcIkBcIik7XG4gIHJldHVybiBhdCA9PT0gLTEgPyB2YWx1ZSA6IHZhbHVlLnNsaWNlKDAsIGF0KTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0cnlVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG5wbVJlZ2lzdHJ5KG51bGwsIHsgb3ZlcnJpZGVPbmx5OiB0cnVlLCBlbnZWYXJzOiB0cnVlIH0pPy50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RyeUVudigpOiBOb2RlSlMuUHJvY2Vzc0VudiB7XG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gIGNvbnN0IHJ1bnRpbWVCaW4gPSBkaXJuYW1lKHByb2Nlc3MuZXhlY1BhdGgpO1xuICBjb25zdCBwYXRoRW50cmllcyA9IChlbnYuUEFUSCA/PyBcIlwiKS5zcGxpdChkZWxpbWl0ZXIpLmZpbHRlcihCb29sZWFuKTtcbiAgaWYgKCFwYXRoRW50cmllcy5pbmNsdWRlcyhydW50aW1lQmluKSkge1xuICAgIGVudi5QQVRIID0gW3J1bnRpbWVCaW4sIC4uLnBhdGhFbnRyaWVzXS5qb2luKGRlbGltaXRlcik7XG4gIH1cbiAgY29uc3QgdXJsID0gcmVnaXN0cnlVcmwoKTtcbiAgaWYgKHVybCkge1xuICAgIGVudi5ucG1fY29uZmlnX3JlZ2lzdHJ5ID0gdXJsO1xuICAgIGVudi5OUE1fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICAgIGVudi5CVU5fQ09ORklHX1JFR0lTVFJZID0gdXJsO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbmZ1bmN0aW9uIGJ1bkFyZ3YoKTogc3RyaW5nW10ge1xuICByZXR1cm4gL1xcYmJ1blxcYi9pLnRlc3QocHJvY2Vzcy5leGVjUGF0aCkgPyBbcHJvY2Vzcy5leGVjUGF0aF0gOiBbXCJidW5cIl07XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90KG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlc29sdmVkTnBtRGVwZW5kZW5jaWVzIHtcbiAgcmV0dXJuIHtcbiAgICBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwiZGVwZW5kZW5jaWVzXCIpLFxuICAgIGRldkRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJkZXZEZXBlbmRlbmNpZXNcIiksXG4gICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6IGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIFwib3B0aW9uYWxEZXBlbmRlbmNpZXNcIiksXG4gICAgcGVlckRlcGVuZGVuY2llczogZGVwZW5kZW5jeU1hcChtYW5pZmVzdCwgXCJwZWVyRGVwZW5kZW5jaWVzXCIpLFxuICAgIG92ZXJyaWRlczogb3ZlcnJpZGVNYXAobWFuaWZlc3QpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBkZXBlbmRlbmN5TWFwKFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGZpZWxkOiBEZXBlbmRlbmN5RmllbGQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgdmFsdWUgPSBtYW5pZmVzdFtmaWVsZF07XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykgT2JqZWN0LmFzc2lnbihvdXQsIGRlcGVuZGVuY3lNYXAobWFuaWZlc3QsIGZpZWxkKSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbmZ1bmN0aW9uIGlzUmVnaXN0cnlTcGVjaWZpZXIoc3BlYzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhL14od29ya3NwYWNlOnxjYXRhbG9nOnxmaWxlOnxsaW5rOnxnaXRcXCt8Z2l0aHViOnxodHRwcz86fG5wbTopL2kudGVzdChzcGVjKTtcbn1cblxuZnVuY3Rpb24gb3ZlcnJpZGVNYXAobWFuaWZlc3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHZhbHVlID0gbWFuaWZlc3Qub3ZlcnJpZGVzO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh2YWx1ZSkpIHJldHVybiB7fTtcbiAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW25hbWUsIHNwZWNdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgIGlmICh0eXBlb2Ygc3BlYyA9PT0gXCJzdHJpbmdcIikgb3V0W25hbWVdID0gc3BlYztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5mdW5jdGlvbiBwaW5QYWNrYWdlKG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgbmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgY29uc3Qgb3ZlcnJpZGVzID0gb3ZlcnJpZGVNYXAobWFuaWZlc3QpO1xuICBpZiAob3ZlcnJpZGVzW25hbWVdICE9PSB2ZXJzaW9uKSB7XG4gICAgb3ZlcnJpZGVzW25hbWVdID0gdmVyc2lvbjtcbiAgICBtYW5pZmVzdC5vdmVycmlkZXMgPSBvdmVycmlkZXM7XG4gICAgY2hhbmdlZCA9IHRydWU7XG4gIH1cbiAgZm9yIChjb25zdCBmaWVsZCBvZiBERVBFTkRFTkNZX0ZJRUxEUykge1xuICAgIGNvbnN0IGRlcHMgPSBkZXBlbmRlbmN5TWFwKG1hbmlmZXN0LCBmaWVsZCk7XG4gICAgaWYgKG5hbWUgaW4gZGVwcyAmJiBkZXBzW25hbWVdICE9PSB2ZXJzaW9uICYmIGlzUmVnaXN0cnlTcGVjaWZpZXIoZGVwc1tuYW1lXSA/PyBcIlwiKSkge1xuICAgICAgZGVwc1tuYW1lXSA9IHZlcnNpb247XG4gICAgICBtYW5pZmVzdFtmaWVsZF0gPSBkZXBzO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBjaGFuZ2VkO1xufVxuXG5mdW5jdGlvbiBuZXdlc3RGaXJzdCh2ZXJzaW9uczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbLi4udmVyc2lvbnNdLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PlxuICAgIHJpZ2h0LmxvY2FsZUNvbXBhcmUobGVmdCwgdW5kZWZpbmVkLCB7IG51bWVyaWM6IHRydWUsIHNlbnNpdGl2aXR5OiBcImJhc2VcIiB9KSxcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGluRm9yTWlzc2luZyhcbiAgbWlzc2luZzogc3RyaW5nLFxuICBtYW5pZmVzdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhY2thZ2VJbmZvOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPixcbiAgYXR0ZW1wdGVkOiBTZXQ8c3RyaW5nPixcbik6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGF2YWlsYWJsZSA9IGF3YWl0IHBhY2thZ2VJbmZvKG1pc3NpbmcpO1xuICBpZiAoYXZhaWxhYmxlKSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IG5leHRVbnVzZWRWZXJzaW9uKG1pc3NpbmcsIGF2YWlsYWJsZSwgYXR0ZW1wdGVkKTtcbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgYXR0ZW1wdGVkLmFkZChgJHttaXNzaW5nfUAke3ZlcnNpb259YCk7XG4gICAgICByZXR1cm4geyBuYW1lOiBtaXNzaW5nLCB2ZXJzaW9uIH07XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBwYXJlbnQgb2YgYXdhaXQgcGFyZW50UGFja2FnZXMobWlzc2luZywgbWFuaWZlc3QsIHBhY2thZ2VJbmZvKSkge1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhwYXJlbnQpO1xuICAgIGlmICghaW5mbykgY29udGludWU7XG4gICAgY29uc3QgdmVyc2lvbiA9IGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKG1pc3NpbmcsIGluZm8sIGF0dGVtcHRlZCk7XG4gICAgaWYgKCF2ZXJzaW9uKSBjb250aW51ZTtcbiAgICBhdHRlbXB0ZWQuYWRkKGAke3BhcmVudH1AJHt2ZXJzaW9ufWApO1xuICAgIHJldHVybiB7IG5hbWU6IHBhcmVudCwgdmVyc2lvbiB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIG5leHRVbnVzZWRWZXJzaW9uKFxuICBuYW1lOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcHJlZmVycmVkID0gaW5mby5sYXRlc3RcbiAgICA/IFtpbmZvLmxhdGVzdCwgLi4ubmV3ZXN0Rmlyc3QoaW5mby52ZXJzaW9ucyldXG4gICAgOiBuZXdlc3RGaXJzdChpbmZvLnZlcnNpb25zKTtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIHByZWZlcnJlZCkge1xuICAgIGlmICghYXR0ZW1wdGVkLmhhcyhgJHtuYW1lfUAke3ZlcnNpb259YCkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXBhdGlibGVQYXJlbnRWZXJzaW9uKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIGluZm86IFBhY2thZ2VJbmZvLFxuICBhdHRlbXB0ZWQ6IFNldDxzdHJpbmc+LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIG5ld2VzdEZpcnN0KGluZm8udmVyc2lvbnMpKSB7XG4gICAgaWYgKGF0dGVtcHRlZC5oYXMoYCR7aW5mby5uYW1lfUAke3ZlcnNpb259YCkpIGNvbnRpbnVlO1xuICAgIGlmICghKG1pc3NpbmcgaW4gKGluZm8uZGVwZW5kZW5jaWVzW3ZlcnNpb25dID8/IHt9KSkpIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcmVudFBhY2thZ2VzKFxuICBtaXNzaW5nOiBzdHJpbmcsXG4gIG1hbmlmZXN0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcGFja2FnZUluZm86IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+LFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRGVwZW5kZW5jaWVzKG1hbmlmZXN0KTtcbiAgaWYgKG1pc3NpbmcgaW4gZGVjbGFyZWQgJiYgaXNSZWdpc3RyeVNwZWNpZmllcihkZWNsYXJlZFttaXNzaW5nXSA/PyBcIlwiKSkgcmV0dXJuIFtdO1xuICBjb25zdCBwYXJlbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMoZGVjbGFyZWQpKSB7XG4gICAgaWYgKG5hbWUgPT09IG1pc3NpbmcgfHwgIWlzUmVnaXN0cnlTcGVjaWZpZXIoZGVjbGFyZWRbbmFtZV0gPz8gXCJcIikpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCBwYWNrYWdlSW5mbyhuYW1lKTtcbiAgICBpZiAoIWluZm8pIGNvbnRpbnVlO1xuICAgIGlmIChPYmplY3QudmFsdWVzKGluZm8uZGVwZW5kZW5jaWVzKS5zb21lKChtYXApID0+IG1pc3NpbmcgaW4gbWFwKSkgcGFyZW50cy5wdXNoKG5hbWUpO1xuICB9XG4gIHJldHVybiBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQYWNrYWdlSW5mb0xvb2t1cCgpOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+PigpO1xuICByZXR1cm4gKG5hbWUpID0+IHtcbiAgICBjb25zdCBjYWNoZWQgPSBjYWNoZS5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCkgcmV0dXJuIGNhY2hlZDtcbiAgICBjb25zdCBwZW5kaW5nID0gbG9hZFBhY2thZ2VJbmZvKG5hbWUpO1xuICAgIGNhY2hlLnNldChuYW1lLCBwZW5kaW5nKTtcbiAgICB2b2lkIHBlbmRpbmcudGhlbih1bmRlZmluZWQsICgpID0+IHtcbiAgICAgIGNhY2hlLmRlbGV0ZShuYW1lKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFBhY2thZ2VJbmZvKG5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFja2FnZUluZm8gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3Bhd24oXCJucG1cIiwgW1widmlld1wiLCBuYW1lLCBcIi0tanNvblwiXSwge1xuICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBlbnY6IHJlZ2lzdHJ5RW52KCksXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYWNrdW1lbnQgPSBqc29uLnBhcnNlKHJlc3VsdC5zdGRvdXQpO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZChwYWNrdW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB2ZXJzaW9ucyA9IHB1Ymxpc2hlZFZlcnNpb25zKHBhY2t1bWVudCk7XG4gIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9ucyxcbiAgICBsYXRlc3Q6IGxhdGVzdFRhZyhwYWNrdW1lbnQpID8/IHZlcnNpb25zLmF0KC0xKSxcbiAgICBkZXBlbmRlbmNpZXM6IHZlcnNpb25EZXBlbmRlbmNpZXMocGFja3VtZW50KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcHVibGlzaGVkVmVyc2lvbnMocGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGVvZiBwYWNrdW1lbnQudmVyc2lvbiA9PT0gXCJzdHJpbmdcIiAmJiAhcGFja3VtZW50LnZlcnNpb25zKSB7XG4gICAgcmV0dXJuIFtwYWNrdW1lbnQudmVyc2lvbl07XG4gIH1cbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmIChBcnJheS5pc0FycmF5KHZlcnNpb25zKSkge1xuICAgIHJldHVybiB2ZXJzaW9ucy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIik7XG4gIH1cbiAgaWYgKG9iamVjdC5pc1JlY29yZCh2ZXJzaW9ucykpIHJldHVybiBPYmplY3Qua2V5cyh2ZXJzaW9ucyk7XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gbGF0ZXN0VGFnKHBhY2t1bWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdzID0gcGFja3VtZW50W1wiZGlzdC10YWdzXCJdO1xuICBpZiAoIW9iamVjdC5pc1JlY29yZCh0YWdzKSB8fCB0eXBlb2YgdGFncy5sYXRlc3QgIT09IFwic3RyaW5nXCIpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0YWdzLmxhdGVzdDtcbn1cblxuZnVuY3Rpb24gdmVyc2lvbkRlcGVuZGVuY2llcyhcbiAgcGFja3VtZW50OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgY29uc3QgdmVyc2lvbnMgPSBwYWNrdW1lbnQudmVyc2lvbnM7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZlcnNpb25zKSkge1xuICAgIHJldHVybiB0eXBlb2YgcGFja3VtZW50LnZlcnNpb24gPT09IFwic3RyaW5nXCJcbiAgICAgID8geyBbcGFja3VtZW50LnZlcnNpb25dOiBzdHJpbmdNYXAocGFja3VtZW50LmRlcGVuZGVuY2llcykgfVxuICAgICAgOiB7fTtcbiAgfVxuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0ge307XG4gIGZvciAoY29uc3QgW3ZlcnNpb24sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2ZXJzaW9ucykpIHtcbiAgICBpZiAob2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgb3V0W3ZlcnNpb25dID0gc3RyaW5nTWFwKHZhbHVlLmRlcGVuZGVuY2llcyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZnVuY3Rpb24gc3RyaW5nTWFwKHZhbHVlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGlmICghb2JqZWN0LmlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbbmFtZSwgc3BlY10gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgaWYgKHR5cGVvZiBzcGVjID09PSBcInN0cmluZ1wiKSBvdXRbbmFtZV0gPSBzcGVjO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"typescript": "^5.9.3"
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@dbx-tools/core-rs": "^0.9.
|
|
30
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
29
|
+
"@dbx-tools/core-rs": "^0.9.21",
|
|
30
|
+
"@dbx-tools/shared-core": "^0.9.21",
|
|
31
31
|
"extract-zip": "^2.0.1",
|
|
32
32
|
"proper-lockfile": "^4.1.2",
|
|
33
33
|
"semver": "^7.7.3",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"./package.json": "./package.json"
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
|
-
"version": "0.9.
|
|
72
|
+
"version": "0.9.21",
|
|
73
73
|
"types": "./lib/index.d.ts",
|
|
74
74
|
"type": "module",
|
|
75
75
|
"exports": {
|
package/src/._bin.ts
ADDED
|
Binary file
|
|
Binary file
|
package/src/._bundle.ts
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/._exec.ts
ADDED
|
Binary file
|
|
Binary file
|
package/src/._file.ts
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/src/bin.ts
CHANGED
|
@@ -95,11 +95,6 @@ export interface BinUrlResolveContext {
|
|
|
95
95
|
export interface BinSource {
|
|
96
96
|
url: string;
|
|
97
97
|
sha256?: string;
|
|
98
|
-
/**
|
|
99
|
-
* Skip `--version` on this candidate. Use when the source already identified
|
|
100
|
-
* the requested version, such as `cargo install --version`.
|
|
101
|
-
*/
|
|
102
|
-
trustVersion?: boolean;
|
|
103
98
|
}
|
|
104
99
|
|
|
105
100
|
/** A download source resolved only when the executable is not already installed. */
|
|
@@ -400,13 +395,8 @@ export async function ensure(
|
|
|
400
395
|
logger.debug("resolved binary source", { name, from });
|
|
401
396
|
const selected = await selectedBin(destination, source, temp, options);
|
|
402
397
|
await chmod(selected, 0o755);
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
throw new Error(
|
|
406
|
-
source.trustVersion
|
|
407
|
-
? `selected binary is not executable: ${selected}`
|
|
408
|
-
: `selected binary has no acceptable version: ${selected}`,
|
|
409
|
-
);
|
|
398
|
+
if (!(await isValidBin(selected, options))) {
|
|
399
|
+
throw new Error(`selected binary has no acceptable version: ${selected}`);
|
|
410
400
|
}
|
|
411
401
|
|
|
412
402
|
await mkdir(destination.binDir, { recursive: true });
|
|
@@ -415,7 +405,7 @@ export async function ensure(
|
|
|
415
405
|
await chmod(staged, 0o755);
|
|
416
406
|
await rename(staged, destination.path);
|
|
417
407
|
staged = undefined;
|
|
418
|
-
if (!(await isValidBin(destination.path,
|
|
408
|
+
if (!(await isValidBin(destination.path, options))) {
|
|
419
409
|
throw new Error(`installed binary is invalid after rename: ${destination.path}`);
|
|
420
410
|
}
|
|
421
411
|
logger.info("installed binary", {
|