@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/bin/archive-demo-vault.mjs +8 -0
- package/bin/generate-coverage-badge.mjs +8 -0
- package/bundlers/esbuild-impl/feature-options/package.json +6 -0
- package/bundlers/obsidian-cli-reload/package.json +6 -0
- package/bundlers/obsidian-plugin-build/package.json +6 -0
- package/bundlers/obsidian-plugin-features/package.json +6 -0
- package/bundlers/obsidian-plugin-transforms/package.json +6 -0
- package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
- package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
- package/bundlers/parcel/package.json +6 -0
- package/bundlers/rollup/package.json +6 -0
- package/bundlers/rollup-compatible/package.json +6 -0
- package/bundlers/rollup-compatible-features/package.json +6 -0
- package/bundlers/vite/package.json +6 -0
- package/bundlers/webpack/package.json +6 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
- package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
- package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
- package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
- package/dist/lib/cjs/bundlers/index.cjs +39 -3
- package/dist/lib/cjs/bundlers/index.d.cts +12 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
- package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
- package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
- package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
- package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
- package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
- package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
- package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
- package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
- package/dist/lib/cjs/bundlers/vite.cjs +229 -0
- package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
- package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
- package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
- package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
- package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
- package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
- package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
- package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
- package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
- package/dist/lib/cjs/test-runners/index.cjs +18 -3
- package/dist/lib/cjs/test-runners/index.d.cts +5 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
- package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
- package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
- package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
- package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
- package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
- package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
- package/dist/lib/esm/bundlers/index.d.mts +12 -0
- package/dist/lib/esm/bundlers/index.mjs +26 -2
- package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
- package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
- package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
- package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
- package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
- package/dist/lib/esm/bundlers/parcel.mjs +361 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
- package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
- package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
- package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
- package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
- package/dist/lib/esm/bundlers/rollup.mjs +130 -0
- package/dist/lib/esm/bundlers/vite.d.mts +105 -0
- package/dist/lib/esm/bundlers/vite.mjs +144 -0
- package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
- package/dist/lib/esm/bundlers/webpack.mjs +259 -0
- package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
- package/dist/lib/esm/demo-vault-cli.mjs +23 -0
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
- package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
- package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
- package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
- package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
- package/dist/lib/esm/test-runners/index.d.mts +5 -0
- package/dist/lib/esm/test-runners/index.mjs +12 -2
- package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
- package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
- package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
- package/package.json +102 -4
- package/test-runners/coverage-badge/package.json +6 -0
- package/test-runners/coverage-badge-cli/package.json +6 -0
- package/test-runners/e2e-runner-support/package.json +6 -0
- package/test-runners/obsidian-test-runner/package.json +6 -0
- package/test-runners/wdio-obsidian/package.json +6 -0
- package/tsconfig/preact.json +7 -0
- package/tsconfig/react.json +7 -0
- package/tsconfig/solid.json +7 -0
- package/tsconfig/svelte.json +7 -0
- package/tsconfig/vue.json +7 -0
- package/types/styles.d.ts +32 -0
- package/types/wasm.d.ts +11 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function () {
|
|
6
|
+
function ensureBrowserProcess() {
|
|
7
|
+
const browserProcess = {
|
|
8
|
+
browser: true,
|
|
9
|
+
cwd() {
|
|
10
|
+
return "/";
|
|
11
|
+
},
|
|
12
|
+
env: {},
|
|
13
|
+
platform: "android"
|
|
14
|
+
};
|
|
15
|
+
const existingProcess = globalThis.process;
|
|
16
|
+
if (!existingProcess) {
|
|
17
|
+
globalThis.process = browserProcess;
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (existingProcess.versions?.node) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const existingProcessRecord = existingProcess;
|
|
24
|
+
for (const [key, value] of Object.entries(browserProcess)) {
|
|
25
|
+
existingProcessRecord[key] ??= value;
|
|
26
|
+
}
|
|
27
|
+
existingProcessRecord["browser"] = true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
ensureBrowserProcess();
|
|
31
|
+
})();
|
|
32
|
+
(function patchObsidianRequire() {
|
|
33
|
+
const originalRequire = require;
|
|
34
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
require = Object.assign(
|
|
39
|
+
(id) => requirePatched(id),
|
|
40
|
+
originalRequire,
|
|
41
|
+
{
|
|
42
|
+
__isPatched: true
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
function extractDefault(module) {
|
|
47
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
51
|
+
'@codemirror/autocomplete',
|
|
52
|
+
'@codemirror/collab',
|
|
53
|
+
'@codemirror/commands',
|
|
54
|
+
'@codemirror/language',
|
|
55
|
+
'@codemirror/lint',
|
|
56
|
+
'@codemirror/search',
|
|
57
|
+
'@codemirror/state',
|
|
58
|
+
'@codemirror/text',
|
|
59
|
+
'@codemirror/view',
|
|
60
|
+
'@lezer/common',
|
|
61
|
+
'@lezer/highlight',
|
|
62
|
+
'@lezer/lr',
|
|
63
|
+
'obsidian']
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
67
|
+
'@codemirror/closebrackets',
|
|
68
|
+
'@codemirror/comment',
|
|
69
|
+
'@codemirror/fold',
|
|
70
|
+
'@codemirror/gutter',
|
|
71
|
+
'@codemirror/highlight',
|
|
72
|
+
'@codemirror/history',
|
|
73
|
+
'@codemirror/matchbrackets',
|
|
74
|
+
'@codemirror/panel',
|
|
75
|
+
'@codemirror/rangeset',
|
|
76
|
+
'@codemirror/rectangular-selection',
|
|
77
|
+
'@codemirror/stream-parser',
|
|
78
|
+
'@codemirror/tooltip']
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
function requirePatched(id) {
|
|
82
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
83
|
+
return originalRequire?.(id);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
87
|
+
if (globalThis.app.isMobile) {
|
|
88
|
+
if (id === 'process' || id === 'node:process') {
|
|
89
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
90
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
91
|
+
|
|
92
|
+
return process;
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
const module = originalRequire?.(id);
|
|
96
|
+
if (module) {
|
|
97
|
+
return extractDefault(module);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
102
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
103
|
+
return {};
|
|
104
|
+
}
|
|
105
|
+
})();
|
|
106
|
+
|
|
107
|
+
"use strict";
|
|
108
|
+
var __defProp = Object.defineProperty;
|
|
109
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
110
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
111
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
112
|
+
var __export = (target, all) => {
|
|
113
|
+
for (var name in all)
|
|
114
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
115
|
+
};
|
|
116
|
+
var __copyProps = (to, from, except, desc) => {
|
|
117
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
118
|
+
for (let key of __getOwnPropNames(from))
|
|
119
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
120
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
121
|
+
}
|
|
122
|
+
return to;
|
|
123
|
+
};
|
|
124
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
125
|
+
var rollup_exports = {};
|
|
126
|
+
__export(rollup_exports, {
|
|
127
|
+
applyRollupInputDefaults: () => applyRollupInputDefaults,
|
|
128
|
+
applyRollupOutputDefaults: () => applyRollupOutputDefaults,
|
|
129
|
+
obsidianPluginRollup: () => obsidianPluginRollup
|
|
130
|
+
});
|
|
131
|
+
module.exports = __toCommonJS(rollup_exports);
|
|
132
|
+
var import_path = require('@mnaoumov/typescript-lib/path');
|
|
133
|
+
var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
|
|
134
|
+
var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
|
|
135
|
+
var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
|
|
136
|
+
var import_rollup_compatible_features = require('./rollup-compatible-features.cjs');
|
|
137
|
+
var import_rollup_compatible = require('./rollup-compatible.cjs');
|
|
138
|
+
function applyRollupInputDefaults(params) {
|
|
139
|
+
const { buildContext, inputOptions } = params;
|
|
140
|
+
const jsxImportSource = (0, import_obsidian_plugin_features.getJsxImportSource)(params.features?.framework);
|
|
141
|
+
return {
|
|
142
|
+
...inputOptions,
|
|
143
|
+
external: (0, import_rollup_compatible.combineExternal)(inputOptions.external),
|
|
144
|
+
input: inputOptions.input ?? buildContext.entryPoint,
|
|
145
|
+
...jsxImportSource !== void 0 && inputOptions.jsx === void 0 && { jsx: { jsxImportSource, mode: "automatic" } }
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
function applyRollupOutputDefaults(params) {
|
|
149
|
+
const { buildContext, outputOptions } = params;
|
|
150
|
+
const hasOutputLocation = outputOptions.file !== void 0 || outputOptions.dir !== void 0;
|
|
151
|
+
return {
|
|
152
|
+
...outputOptions,
|
|
153
|
+
banner: outputOptions.banner ?? (0, import_obsidian_plugin_build.getObsidianPluginBanner)("rollup"),
|
|
154
|
+
format: outputOptions.format ?? "cjs",
|
|
155
|
+
...!hasOutputLocation && { file: buildContext.mainJsPath },
|
|
156
|
+
// An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
|
|
157
|
+
inlineDynamicImports: outputOptions.inlineDynamicImports ?? true,
|
|
158
|
+
sourcemap: outputOptions.sourcemap ?? (!buildContext.isProductionBuild && "inline")
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function obsidianPluginRollup(options = {}) {
|
|
162
|
+
const state = {
|
|
163
|
+
buildContext: void 0,
|
|
164
|
+
isDistFolderCleaned: false
|
|
165
|
+
};
|
|
166
|
+
function getBuildContext() {
|
|
167
|
+
if (!state.buildContext) {
|
|
168
|
+
throw new Error("The obsidian-plugin rollup plugin has not resolved its build context: its `options` hook did not run.");
|
|
169
|
+
}
|
|
170
|
+
return state.buildContext;
|
|
171
|
+
}
|
|
172
|
+
const featurePlugin = (0, import_rollup_compatible_features.createRollupCompatibleFeaturePlugin)({
|
|
173
|
+
features: options,
|
|
174
|
+
isProductionBuild: () => getBuildContext().isProductionBuild,
|
|
175
|
+
shouldCompileStylesheets: true,
|
|
176
|
+
shouldReplaceDefines: true
|
|
177
|
+
});
|
|
178
|
+
const plugin = {
|
|
179
|
+
generateBundle: {
|
|
180
|
+
handler(_outputOptions, bundle) {
|
|
181
|
+
(0, import_rollup_compatible.renameCssAssets)(this, bundle);
|
|
182
|
+
},
|
|
183
|
+
order: "post"
|
|
184
|
+
},
|
|
185
|
+
name: "obsidian-plugin",
|
|
186
|
+
async options(inputOptions) {
|
|
187
|
+
const mode = options.mode ?? (this.meta.watchMode ? import_obsidian_plugin_build.BuildMode.Development : import_obsidian_plugin_build.BuildMode.Production);
|
|
188
|
+
state.buildContext = await (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)({ ...options, mode });
|
|
189
|
+
return applyRollupInputDefaults({ buildContext: state.buildContext, features: options, inputOptions });
|
|
190
|
+
},
|
|
191
|
+
outputOptions(outputOptions) {
|
|
192
|
+
return applyRollupOutputDefaults({ buildContext: getBuildContext(), outputOptions });
|
|
193
|
+
},
|
|
194
|
+
async renderStart(outputOptions) {
|
|
195
|
+
if (state.isDistFolderCleaned) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
state.isDistFolderCleaned = true;
|
|
199
|
+
await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(getOutputFolder(outputOptions));
|
|
200
|
+
},
|
|
201
|
+
async writeBundle(outputOptions) {
|
|
202
|
+
const buildContext = { ...getBuildContext(), distFolder: getOutputFolder(outputOptions) };
|
|
203
|
+
await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(buildContext);
|
|
204
|
+
await (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(buildContext);
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
return [plugin, featurePlugin, (0, import_rollup_compatible_features.createUnpluginVuePlugin)({ bundler: "rollup", features: options })];
|
|
208
|
+
}
|
|
209
|
+
function getOutputFolder(outputOptions) {
|
|
210
|
+
return outputOptions.dir ?? (0, import_path.dirname)(outputOptions.file ?? "");
|
|
211
|
+
}
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
applyRollupInputDefaults,
|
|
215
|
+
applyRollupOutputDefaults,
|
|
216
|
+
obsidianPluginRollup
|
|
217
|
+
});
|
|
218
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9yb2xsdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCByb2xsdXA6IGEgcm9sbHVwIHBsdWdpbiB0aGF0IGdpdmVzIGEgYnVpbGQgdGhlIHNhbWUgYG1haW4uanNgICtcbiAqIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlciBwcm9kdWNlcywgZGVwbG95cyBhIHdhdGNoIGJ1aWxkIGludG8gdGhlIHZhdWx0LFxuICogYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlIGNvbnN1bWVyJ3Mgb3duIGByb2xsdXAuY29uZmlnYCBsZWF2ZXMgdW5zZXQuXG4gKlxuICogYHJvbGx1cGAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBJbnB1dE9wdGlvbnMsXG4gIElucHV0UGx1Z2luT3B0aW9uLFxuICBOb3JtYWxpemVkT3V0cHV0T3B0aW9ucyxcbiAgT3V0cHV0T3B0aW9ucyxcbiAgUGx1Z2luXG59IGZyb20gJ3JvbGx1cCc7XG5cbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQsXG4gIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuXG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgeyBnZXRKc3hJbXBvcnRTb3VyY2UgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXBwbHlSb2xsdXBJbnB1dERlZmF1bHRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBseVJvbGx1cElucHV0RGVmYXVsdHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlcz86IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIGlucHV0IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dE9wdGlvbnM6IElucHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0c30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIG91dHB1dCBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0T3B0aW9uczogT3V0cHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgb2JzaWRpYW5QbHVnaW5Sb2xsdXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luUm9sbHVwT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIG1vZGUuIERlZmF1bHRzIHRvIHtAbGluayBCdWlsZE1vZGUuRGV2ZWxvcG1lbnR9IGluIHdhdGNoIG1vZGUgKGByb2xsdXAgLS13YXRjaGApIGFuZFxuICAgKiB7QGxpbmsgQnVpbGRNb2RlLlByb2R1Y3Rpb259IG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBCdWlsZE1vZGU7XG59XG5cbi8qKlxuICogVGhlIHN0YXRlIG9uZSB7QGxpbmsgb2JzaWRpYW5QbHVnaW5Sb2xsdXB9IGluc3RhbmNlIGtlZXBzIGFjcm9zcyB0aGUgaG9va3Mgb2YgYSBidWlsZCwgYW5kIGFjcm9zcyB0aGVcbiAqIHJlYnVpbGRzIG9mIGEgd2F0Y2guXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhblBsdWdpblJvbGx1cFN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWxscyBpbiB0aGUgcm9sbHVwIGlucHV0IG9wdGlvbnMgdGhlIGNvbnN1bWVyIGxlZnQgdW5zZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQXBwbHlSb2xsdXBJbnB1dERlZmF1bHRzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dCBvcHRpb25zIHdpdGggdGhlIHBsdWdpbidzIGRlZmF1bHRzIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJvbGx1cElucHV0RGVmYXVsdHMocGFyYW1zOiBBcHBseVJvbGx1cElucHV0RGVmYXVsdHNQYXJhbXMpOiBJbnB1dE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgaW5wdXRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGpzeEltcG9ydFNvdXJjZSA9IGdldEpzeEltcG9ydFNvdXJjZShwYXJhbXMuZmVhdHVyZXM/LmZyYW1ld29yayk7XG4gIHJldHVybiB7XG4gICAgLi4uaW5wdXRPcHRpb25zLFxuICAgIGV4dGVybmFsOiBjb21iaW5lRXh0ZXJuYWwoaW5wdXRPcHRpb25zLmV4dGVybmFsKSxcbiAgICBpbnB1dDogaW5wdXRPcHRpb25zLmlucHV0ID8/IGJ1aWxkQ29udGV4dC5lbnRyeVBvaW50LFxuICAgIC4uLihqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBpbnB1dE9wdGlvbnMuanN4ID09PSB1bmRlZmluZWQgJiYgeyBqc3g6IHsganN4SW1wb3J0U291cmNlLCBtb2RlOiAnYXV0b21hdGljJyB9IH0pXG4gIH07XG59XG5cbi8qKlxuICogRmlsbHMgaW4gdGhlIHJvbGx1cCBvdXRwdXQgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBcHBseVJvbGx1cE91dHB1dERlZmF1bHRzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgb3B0aW9ucyB3aXRoIHRoZSBwbHVnaW4ncyBkZWZhdWx0cyBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0cyhwYXJhbXM6IEFwcGx5Um9sbHVwT3V0cHV0RGVmYXVsdHNQYXJhbXMpOiBPdXRwdXRPcHRpb25zIHtcbiAgY29uc3QgeyBidWlsZENvbnRleHQsIG91dHB1dE9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgaGFzT3V0cHV0TG9jYXRpb24gPSBvdXRwdXRPcHRpb25zLmZpbGUgIT09IHVuZGVmaW5lZCB8fCBvdXRwdXRPcHRpb25zLmRpciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIC4uLm91dHB1dE9wdGlvbnMsXG4gICAgYmFubmVyOiBvdXRwdXRPcHRpb25zLmJhbm5lciA/PyBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncm9sbHVwJyksXG4gICAgZm9ybWF0OiBvdXRwdXRPcHRpb25zLmZvcm1hdCA/PyAnY2pzJyxcbiAgICAuLi4oIWhhc091dHB1dExvY2F0aW9uICYmIHsgZmlsZTogYnVpbGRDb250ZXh0Lm1haW5Kc1BhdGggfSksXG4gICAgLy8gQW4gT2JzaWRpYW4gcGx1Z2luIGlzIG9uZSBmaWxlOiB0aGUgbWFuaWZlc3QgbmFtZXMgYG1haW4uanNgIGFuZCBub3RoaW5nIGxvYWRzIGEgc2Vjb25kIGNodW5rLlxuICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiBvdXRwdXRPcHRpb25zLmlubGluZUR5bmFtaWNJbXBvcnRzID8/IHRydWUsXG4gICAgc291cmNlbWFwOiBvdXRwdXRPcHRpb25zLnNvdXJjZW1hcCA/PyAoIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiAnaW5saW5lJylcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm9sbHVwIHBsdWdpbiB0aGF0IGJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKlxuICogV2hhdCBpdCBkb2VzLCBlYWNoIG9ubHkgd2hlbiB0aGUgY29uc3VtZXIncyBjb25maWcgaGFzIG5vdCBzYWlkIG90aGVyd2lzZTpcbiAqXG4gKiAtIGBpbnB1dGAgaXMgYHNyYy9tYWluLnRzYC5cbiAqIC0gVGhlIG91dHB1dCBpcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgIGluIGBkaXN0L2J1aWxkYCAoYGRpc3QvZGV2YCBpbiB3YXRjaCBtb2RlKSwgd2l0aCBkeW5hbWljIGltcG9ydHNcbiAqICAgaW5saW5lZCwgdGhlIGdlbmVyYXRlZC1maWxlIGJhbm5lciwgYW5kIGFuIGlubGluZSBzb3VyY2UgbWFwIGluIGRldmVsb3BtZW50LlxuICpcbiAqIEFuZCBhbHdheXM6IE9ic2lkaWFuJ3Mgb3duIG1vZHVsZXMgKGBvYnNpZGlhbmAsIGBlbGVjdHJvbmAsIENvZGVNaXJyb3IsIExlemVyKSBhbmQgdGhlIE5vZGUgYnVpbHRpbnMgYXJlXG4gKiBleHRlcm5hbCBiZXNpZGUgdGhlIGNvbnN1bWVyJ3Mgb3duIGBleHRlcm5hbGAsIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGVtcHRpZWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSxcbiAqIGV2ZXJ5IGVtaXR0ZWQgQ1NTIGZpbGUgZW5kcyB1cCBpbiBgc3R5bGVzLmNzc2AsIGBtYW5pZmVzdC5qc29uYCAoYW5kIGluIGRldmVsb3BtZW50IGAuaG90cmVsb2FkYCkgaXNcbiAqIGNvcGllZCBiZXNpZGUgaXQsIGFuZCBhIGRldmVsb3BtZW50IGJ1aWxkIGlzIGRlcGxveWVkIGludG8gdGhlIHZhdWx0IG5hbWVkIGJ5IGBPQlNJRElBTl9DT05GSUdfRk9MREVSYC5cbiAqXG4gKiBUeXBlU2NyaXB0LCBkZXBlbmRlbmN5IHJlc29sdXRpb24gYW5kIG1pbmlmaWNhdGlvbiBzdGF5IHRoZSBjb25zdW1lcidzIGNob2ljZSBvZiByb2xsdXAgcGx1Z2lucywgYXMgdGhleSB3b3VsZCBiZVxuICogd2l0aG91dCB0aGlzIG9uZS4gVGhlIGJ1aWxkIGZlYXR1cmVzICh7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30pIGFyZSB0aGUgcGx1Z2luJ3M6XG4gKlxuICogLSBgZnJhbWV3b3JrOiAncmVhY3QnIHwgJ3ByZWFjdCdgIHNldHMgcm9sbHVwJ3MgYGpzeGAgb3B0aW9uIHRvIHRoZSBhdXRvbWF0aWMgcnVudGltZSAodW5sZXNzIHNldCksIGFuZCB0aGVcbiAqICAgVHlwZVNjcmlwdCBwbHVnaW4gcmVhZHMgdGhlIHNhbWUgZnJvbSB0aGUgdG9vbGtpdCdzIHRzY29uZmlnIHByZXNldC5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgcmVwbGFjZXMgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCAoYW5kIFZ1ZSdzIGZlYXR1cmUgZmxhZ3MpIGluIHRoZSBidW5kbGVkIGNvZGUuXG4gKiAtIGBzdHlsZXNgIGNvbXBpbGVzIGV2ZXJ5IHN0eWxlc2hlZXQgaXRzZWxmIChQb3N0Q1NTLCBUYWlsd2luZCwgQ1NTIG1vZHVsZXMpLCBzbyByb2xsdXAgbmVlZHMgbm8gQ1NTIHBsdWdpbjsgbGVhdmVcbiAqICAgaXQgb3V0LiBgc3R5bGVzOiB7fWAgY29tcGlsZXMgcGxhaW4gQ1NTLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5Sb2xsdXBPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByb2xsdXAgcGx1Z2lucywgd2hpY2ggcm9sbHVwIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5Sb2xsdXAob3B0aW9uczogT2JzaWRpYW5QbHVnaW5Sb2xsdXBPcHRpb25zID0ge30pOiBJbnB1dFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luUm9sbHVwU3RhdGUgPSB7XG4gICAgYnVpbGRDb250ZXh0OiB1bmRlZmluZWQsXG4gICAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogZmFsc2VcbiAgfTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gUm9sbHVwIGhvb2tzOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdCBhZ2FpbnN0IGEgcmVhbCByb2xsdXAgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiByb2xsdXAgcGx1Z2luIGhhcyBub3QgcmVzb2x2ZWQgaXRzIGJ1aWxkIGNvbnRleHQ6IGl0cyBgb3B0aW9uc2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogdHJ1ZSxcbiAgICBzaG91bGRSZXBsYWNlRGVmaW5lczogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBwbHVnaW46IFBsdWdpbiA9IHtcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcihfb3V0cHV0T3B0aW9ucywgYnVuZGxlKTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIG9wdGlvbnMoaW5wdXRPcHRpb25zKTogUHJvbWlzZTxJbnB1dE9wdGlvbnM+IHtcbiAgICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gKHRoaXMubWV0YS53YXRjaE1vZGUgPyBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgOiBCdWlsZE1vZGUuUHJvZHVjdGlvbik7XG4gICAgICBzdGF0ZS5idWlsZENvbnRleHQgPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQoeyAuLi5vcHRpb25zLCBtb2RlIH0pO1xuICAgICAgcmV0dXJuIGFwcGx5Um9sbHVwSW5wdXREZWZhdWx0cyh7IGJ1aWxkQ29udGV4dDogc3RhdGUuYnVpbGRDb250ZXh0LCBmZWF0dXJlczogb3B0aW9ucywgaW5wdXRPcHRpb25zIH0pO1xuICAgIH0sXG4gICAgb3V0cHV0T3B0aW9ucyhvdXRwdXRPcHRpb25zKTogT3V0cHV0T3B0aW9ucyB7XG4gICAgICByZXR1cm4gYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0cyh7IGJ1aWxkQ29udGV4dDogZ2V0QnVpbGRDb250ZXh0KCksIG91dHB1dE9wdGlvbnMgfSk7XG4gICAgfSxcbiAgICBhc3luYyByZW5kZXJTdGFydChvdXRwdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdGF0ZS5pc0Rpc3RGb2xkZXJDbGVhbmVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGdldE91dHB1dEZvbGRlcihvdXRwdXRPcHRpb25zKSk7XG4gICAgfSxcbiAgICBhc3luYyB3cml0ZUJ1bmRsZShvdXRwdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBidWlsZENvbnRleHQgPSB7IC4uLmdldEJ1aWxkQ29udGV4dCgpLCBkaXN0Rm9sZGVyOiBnZXRPdXRwdXRGb2xkZXIob3V0cHV0T3B0aW9ucykgfTtcbiAgICAgIGF3YWl0IGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dCk7XG4gICAgICBhd2FpdCBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlcihidWlsZENvbnRleHQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtwbHVnaW4sIGZlYXR1cmVQbHVnaW4gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICdyb2xsdXAnLCBmZWF0dXJlczogb3B0aW9ucyB9KSBhcyBQcm9taXNlPG51bGwgfCBQbHVnaW4+XTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFBhcnQgb2YgdGhlIHJvbGx1cCBob29rcyBhYm92ZS4gKi9cbmZ1bmN0aW9uIGdldE91dHB1dEZvbGRlcihvdXRwdXRPcHRpb25zOiBOb3JtYWxpemVkT3V0cHV0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLmRpciA/PyBkaXJuYW1lKG91dHB1dE9wdGlvbnMuZmlsZSA/PyAnJyk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/// <reference path="../library-references.d.cts" />
|
|
2
|
+
/**
|
|
3
|
+
* @file
|
|
4
|
+
*
|
|
5
|
+
* Builds an Obsidian plugin with rollup: a rollup plugin that gives a build the same `main.js` +
|
|
6
|
+
* `styles.css` + `manifest.json` layout the esbuild builder produces, deploys a watch build into the vault,
|
|
7
|
+
* and fills in only the options the consumer's own `rollup.config` leaves unset.
|
|
8
|
+
*
|
|
9
|
+
* `rollup` is an optional peer dependency and this module only imports its types, so a plugin built with
|
|
10
|
+
* esbuild installs nothing extra.
|
|
11
|
+
*/
|
|
12
|
+
import type { InputOptions, InputPluginOption, OutputOptions } from 'rollup' with { 'resolution-mode': 'import' };
|
|
13
|
+
import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.cjs';
|
|
14
|
+
import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.cjs';
|
|
15
|
+
import { BuildMode } from './obsidian-plugin-build.cjs';
|
|
16
|
+
/**
|
|
17
|
+
* Parameters for {@link applyRollupInputDefaults}.
|
|
18
|
+
*/
|
|
19
|
+
export interface ApplyRollupInputDefaultsParams {
|
|
20
|
+
/**
|
|
21
|
+
* The build context.
|
|
22
|
+
*/
|
|
23
|
+
readonly buildContext: ObsidianPluginBuildContext;
|
|
24
|
+
/**
|
|
25
|
+
* The build features.
|
|
26
|
+
*/
|
|
27
|
+
readonly features?: ObsidianPluginFeatureOptions;
|
|
28
|
+
/**
|
|
29
|
+
* The consumer's input options.
|
|
30
|
+
*/
|
|
31
|
+
readonly inputOptions: InputOptions;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parameters for {@link applyRollupOutputDefaults}.
|
|
35
|
+
*/
|
|
36
|
+
export interface ApplyRollupOutputDefaultsParams {
|
|
37
|
+
/**
|
|
38
|
+
* The build context.
|
|
39
|
+
*/
|
|
40
|
+
readonly buildContext: ObsidianPluginBuildContext;
|
|
41
|
+
/**
|
|
42
|
+
* The consumer's output options.
|
|
43
|
+
*/
|
|
44
|
+
readonly outputOptions: OutputOptions;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Options for {@link obsidianPluginRollup}.
|
|
48
|
+
*/
|
|
49
|
+
export interface ObsidianPluginRollupOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
|
|
50
|
+
/**
|
|
51
|
+
* The build mode. Defaults to {@link BuildMode.Development} in watch mode (`rollup --watch`) and
|
|
52
|
+
* {@link BuildMode.Production} otherwise.
|
|
53
|
+
*/
|
|
54
|
+
readonly mode?: BuildMode;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Fills in the rollup input options the consumer left unset.
|
|
58
|
+
*
|
|
59
|
+
* @param params - The {@link ApplyRollupInputDefaultsParams}.
|
|
60
|
+
* @returns The input options with the plugin's defaults applied.
|
|
61
|
+
*/
|
|
62
|
+
export declare function applyRollupInputDefaults(params: ApplyRollupInputDefaultsParams): InputOptions;
|
|
63
|
+
/**
|
|
64
|
+
* Fills in the rollup output options the consumer left unset.
|
|
65
|
+
*
|
|
66
|
+
* @param params - The {@link ApplyRollupOutputDefaultsParams}.
|
|
67
|
+
* @returns The output options with the plugin's defaults applied.
|
|
68
|
+
*/
|
|
69
|
+
export declare function applyRollupOutputDefaults(params: ApplyRollupOutputDefaultsParams): OutputOptions;
|
|
70
|
+
/**
|
|
71
|
+
* Creates a rollup plugin that builds an Obsidian plugin.
|
|
72
|
+
*
|
|
73
|
+
* What it does, each only when the consumer's config has not said otherwise:
|
|
74
|
+
*
|
|
75
|
+
* - `input` is `src/main.ts`.
|
|
76
|
+
* - The output is one CommonJS `main.js` in `dist/build` (`dist/dev` in watch mode), with dynamic imports
|
|
77
|
+
* inlined, the generated-file banner, and an inline source map in development.
|
|
78
|
+
*
|
|
79
|
+
* And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
|
|
80
|
+
* external beside the consumer's own `external`, the output folder is emptied before the first write,
|
|
81
|
+
* every emitted CSS file ends up in `styles.css`, `manifest.json` (and in development `.hotreload`) is
|
|
82
|
+
* copied beside it, and a development build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
|
|
83
|
+
*
|
|
84
|
+
* TypeScript, dependency resolution and minification stay the consumer's choice of rollup plugins, as they would be
|
|
85
|
+
* without this one. The build features ({@link ObsidianPluginFeatureOptions}) are the plugin's:
|
|
86
|
+
*
|
|
87
|
+
* - `framework: 'react' | 'preact'` sets rollup's `jsx` option to the automatic runtime (unless set), and the
|
|
88
|
+
* TypeScript plugin reads the same from the toolkit's tsconfig preset.
|
|
89
|
+
* - `framework: 'solid' | 'svelte'` compiles the components with the toolkit's shared transforms, and `'vue'` adds
|
|
90
|
+
* `unplugin-vue`.
|
|
91
|
+
* - Any framework replaces `process.env.NODE_ENV` (and Vue's feature flags) in the bundled code.
|
|
92
|
+
* - `styles` compiles every stylesheet itself (PostCSS, Tailwind, CSS modules), so rollup needs no CSS plugin; leave
|
|
93
|
+
* it out. `styles: {}` compiles plain CSS.
|
|
94
|
+
* - `wasm` imports a `.wasm` module as its bytes.
|
|
95
|
+
*
|
|
96
|
+
* @param options - The {@link ObsidianPluginRollupOptions}.
|
|
97
|
+
* @returns The rollup plugins, which rollup takes as one entry of its `plugins`.
|
|
98
|
+
*/
|
|
99
|
+
export declare function obsidianPluginRollup(options?: ObsidianPluginRollupOptions): InputPluginOption[];
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/*
|
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
|
4
|
+
*/
|
|
5
|
+
(function patchObsidianRequire() {
|
|
6
|
+
const originalRequire = require;
|
|
7
|
+
if (!originalRequire || originalRequire.__isPatched) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
require = Object.assign(
|
|
12
|
+
(id) => requirePatched(id),
|
|
13
|
+
originalRequire,
|
|
14
|
+
{
|
|
15
|
+
__isPatched: true
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
function extractDefault(module) {
|
|
20
|
+
return module && module.__esModule && 'default' in module ? module.default : module;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
24
|
+
'@codemirror/autocomplete',
|
|
25
|
+
'@codemirror/collab',
|
|
26
|
+
'@codemirror/commands',
|
|
27
|
+
'@codemirror/language',
|
|
28
|
+
'@codemirror/lint',
|
|
29
|
+
'@codemirror/search',
|
|
30
|
+
'@codemirror/state',
|
|
31
|
+
'@codemirror/text',
|
|
32
|
+
'@codemirror/view',
|
|
33
|
+
'@lezer/common',
|
|
34
|
+
'@lezer/highlight',
|
|
35
|
+
'@lezer/lr',
|
|
36
|
+
'obsidian']
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
|
|
40
|
+
'@codemirror/closebrackets',
|
|
41
|
+
'@codemirror/comment',
|
|
42
|
+
'@codemirror/fold',
|
|
43
|
+
'@codemirror/gutter',
|
|
44
|
+
'@codemirror/highlight',
|
|
45
|
+
'@codemirror/history',
|
|
46
|
+
'@codemirror/matchbrackets',
|
|
47
|
+
'@codemirror/panel',
|
|
48
|
+
'@codemirror/rangeset',
|
|
49
|
+
'@codemirror/rectangular-selection',
|
|
50
|
+
'@codemirror/stream-parser',
|
|
51
|
+
'@codemirror/tooltip']
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
function requirePatched(id) {
|
|
55
|
+
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
|
|
56
|
+
return originalRequire?.(id);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
|
|
60
|
+
if (globalThis.app.isMobile) {
|
|
61
|
+
if (id === 'process' || id === 'node:process') {
|
|
62
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
63
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
|
|
64
|
+
|
|
65
|
+
return process;
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
const module = originalRequire?.(id);
|
|
69
|
+
if (module) {
|
|
70
|
+
return extractDefault(module);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// eslint-disable-next-line no-console -- Valid usage.
|
|
75
|
+
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
|
|
76
|
+
return {};
|
|
77
|
+
}
|
|
78
|
+
})();
|
|
79
|
+
|
|
80
|
+
"use strict";
|
|
81
|
+
var __defProp = Object.defineProperty;
|
|
82
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
83
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
84
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
85
|
+
var __export = (target, all) => {
|
|
86
|
+
for (var name in all)
|
|
87
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
88
|
+
};
|
|
89
|
+
var __copyProps = (to, from, except, desc) => {
|
|
90
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
91
|
+
for (let key of __getOwnPropNames(from))
|
|
92
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
93
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
94
|
+
}
|
|
95
|
+
return to;
|
|
96
|
+
};
|
|
97
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
98
|
+
var vite_exports = {};
|
|
99
|
+
__export(vite_exports, {
|
|
100
|
+
getViteBuildMode: () => getViteBuildMode,
|
|
101
|
+
getViteConfigDefaults: () => getViteConfigDefaults,
|
|
102
|
+
getViteFeatureConfig: () => getViteFeatureConfig,
|
|
103
|
+
obsidianPluginVite: () => obsidianPluginVite
|
|
104
|
+
});
|
|
105
|
+
module.exports = __toCommonJS(vite_exports);
|
|
106
|
+
var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
|
|
107
|
+
var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
|
|
108
|
+
var import_obsidian_plugin_transforms = require('./obsidian-plugin-transforms.cjs');
|
|
109
|
+
var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
|
|
110
|
+
var import_rollup_compatible_features = require('./rollup-compatible-features.cjs');
|
|
111
|
+
var import_rollup_compatible = require('./rollup-compatible.cjs');
|
|
112
|
+
function getViteBuildMode(userConfig, env) {
|
|
113
|
+
return userConfig.build?.watch || env.mode === "development" ? import_obsidian_plugin_build.BuildMode.Development : import_obsidian_plugin_build.BuildMode.Production;
|
|
114
|
+
}
|
|
115
|
+
function getViteConfigDefaults(userConfig, buildContext) {
|
|
116
|
+
const build = userConfig.build ?? {};
|
|
117
|
+
const rolldownOptions = build.rolldownOptions ?? build.rollupOptions ?? {};
|
|
118
|
+
const output = Array.isArray(rolldownOptions.output) ? void 0 : rolldownOptions.output ?? {};
|
|
119
|
+
return {
|
|
120
|
+
build: {
|
|
121
|
+
// An Obsidian release ships `main.js` and `styles.css` and nothing else, so any asset emitted beside
|
|
122
|
+
// the bundle is a file the installed plugin looks for and does not find.
|
|
123
|
+
assetsInlineLimit: build.assetsInlineLimit ?? Number.MAX_SAFE_INTEGER,
|
|
124
|
+
// eslint-disable-next-line unicorn/name-replacements -- `emptyOutDir` is the name vite's config reads.
|
|
125
|
+
emptyOutDir: false,
|
|
126
|
+
lib: build.lib ?? {
|
|
127
|
+
cssFileName: "styles",
|
|
128
|
+
entry: buildContext.entryPoint,
|
|
129
|
+
fileName: () => "main.js",
|
|
130
|
+
formats: ["cjs"]
|
|
131
|
+
},
|
|
132
|
+
minify: build.minify ?? buildContext.isProductionBuild,
|
|
133
|
+
// eslint-disable-next-line unicorn/name-replacements -- `outDir` is the name vite's config reads.
|
|
134
|
+
outDir: buildContext.distFolder,
|
|
135
|
+
rolldownOptions: {
|
|
136
|
+
external: (0, import_rollup_compatible.combineExternal)(rolldownOptions.external),
|
|
137
|
+
...output !== void 0 && {
|
|
138
|
+
output: {
|
|
139
|
+
// `postBanner` rather than `banner`: it is added after minification, which strips an ordinary comment.
|
|
140
|
+
...output.banner === void 0 && output.postBanner === void 0 && { postBanner: (0, import_obsidian_plugin_build.getObsidianPluginBanner)("vite") },
|
|
141
|
+
// An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
|
|
142
|
+
// eslint-disable-next-line @typescript-eslint/no-deprecated -- A consumer's config may still set the deprecated option, which then wins.
|
|
143
|
+
...output.codeSplitting === void 0 && output.inlineDynamicImports === void 0 && { codeSplitting: false }
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
sourcemap: build.sourcemap ?? (!buildContext.isProductionBuild && "inline")
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function getViteFeatureConfig(params) {
|
|
152
|
+
const { features, isProductionBuild, postcssConfig, userConfig } = params;
|
|
153
|
+
const config = {};
|
|
154
|
+
const userDefine = userConfig.define ?? {};
|
|
155
|
+
const define = Object.fromEntries(
|
|
156
|
+
Object.entries((0, import_obsidian_plugin_features.getFrameworkDefines)({ framework: features.framework, isProductionBuild })).filter(([expression]) => !Object.hasOwn(userDefine, expression))
|
|
157
|
+
);
|
|
158
|
+
if (Object.keys(define).length > 0) {
|
|
159
|
+
config.define = define;
|
|
160
|
+
}
|
|
161
|
+
const jsxImportSource = (0, import_obsidian_plugin_features.getJsxImportSource)(features.framework);
|
|
162
|
+
if (jsxImportSource !== void 0 && userConfig.oxc !== false && userConfig.oxc?.jsx === void 0) {
|
|
163
|
+
config.oxc = { jsx: { development: !isProductionBuild, importSource: jsxImportSource, runtime: "automatic" } };
|
|
164
|
+
}
|
|
165
|
+
if (postcssConfig && postcssConfig.plugins.length > 0 && userConfig.css?.postcss === void 0) {
|
|
166
|
+
config.css = { postcss: { plugins: [...postcssConfig.plugins] } };
|
|
167
|
+
}
|
|
168
|
+
return config;
|
|
169
|
+
}
|
|
170
|
+
function obsidianPluginVite(options = {}) {
|
|
171
|
+
const state = {
|
|
172
|
+
buildContext: void 0,
|
|
173
|
+
isDistFolderCleaned: false
|
|
174
|
+
};
|
|
175
|
+
function getBuildContext() {
|
|
176
|
+
if (!state.buildContext) {
|
|
177
|
+
throw new Error("The obsidian-plugin vite plugin has not resolved its build context: its `config` hook did not run.");
|
|
178
|
+
}
|
|
179
|
+
return state.buildContext;
|
|
180
|
+
}
|
|
181
|
+
const featurePlugin = (0, import_rollup_compatible_features.createRollupCompatibleFeaturePlugin)({
|
|
182
|
+
features: options,
|
|
183
|
+
isProductionBuild: () => getBuildContext().isProductionBuild,
|
|
184
|
+
shouldCompileStylesheets: false,
|
|
185
|
+
shouldReplaceDefines: false
|
|
186
|
+
});
|
|
187
|
+
const plugin = {
|
|
188
|
+
apply: "build",
|
|
189
|
+
async config(userConfig, env) {
|
|
190
|
+
state.buildContext = await (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)({
|
|
191
|
+
...options,
|
|
192
|
+
...userConfig.build?.outDir !== void 0 && { distFolder: userConfig.build.outDir },
|
|
193
|
+
mode: options.mode ?? getViteBuildMode(userConfig, env)
|
|
194
|
+
});
|
|
195
|
+
const { isProductionBuild } = state.buildContext;
|
|
196
|
+
const postcssConfig = (0, import_obsidian_plugin_features.isPostcssNeeded)(options.styles) ? await (0, import_obsidian_plugin_transforms.loadPostcssConfig)({ isProductionBuild, styles: options.styles ?? {} }) : void 0;
|
|
197
|
+
const featureConfig = getViteFeatureConfig({ features: options, isProductionBuild, postcssConfig, userConfig });
|
|
198
|
+
const config = getViteConfigDefaults(userConfig, state.buildContext);
|
|
199
|
+
return { ...featureConfig, ...config };
|
|
200
|
+
},
|
|
201
|
+
generateBundle: {
|
|
202
|
+
handler(_outputOptions, bundle) {
|
|
203
|
+
(0, import_rollup_compatible.renameCssAssets)(this, bundle);
|
|
204
|
+
},
|
|
205
|
+
order: "post"
|
|
206
|
+
},
|
|
207
|
+
name: "obsidian-plugin",
|
|
208
|
+
async renderStart() {
|
|
209
|
+
if (state.isDistFolderCleaned) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
state.isDistFolderCleaned = true;
|
|
213
|
+
await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(getBuildContext().distFolder);
|
|
214
|
+
},
|
|
215
|
+
async writeBundle() {
|
|
216
|
+
await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(getBuildContext());
|
|
217
|
+
await (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(getBuildContext());
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
return [plugin, { ...featurePlugin, apply: "build" }, (0, import_rollup_compatible_features.createUnpluginVuePlugin)({ bundler: "vite", features: options })];
|
|
221
|
+
}
|
|
222
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
223
|
+
0 && (module.exports = {
|
|
224
|
+
getViteBuildMode,
|
|
225
|
+
getViteConfigDefaults,
|
|
226
|
+
getViteFeatureConfig,
|
|
227
|
+
obsidianPluginVite
|
|
228
|
+
});
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy92aXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggdml0ZTogYSB2aXRlIHBsdWdpbiB0aGF0IHR1cm5zIGB2aXRlIGJ1aWxkYCBpbnRvIGEgbGlicmFyeSBidWlsZCBvZlxuICogYHNyYy9tYWluLnRzYCB3aXRoIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlclxuICogcHJvZHVjZXMsIGRlcGxveXMgYSBgdml0ZSBidWlsZCAtLXdhdGNoYCBidWlsZCBpbnRvIHRoZSB2YXVsdCwgYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlXG4gKiBjb25zdW1lcidzIG93biBgdml0ZS5jb25maWdgIGxlYXZlcyB1bnNldC5cbiAqXG4gKiBgdml0ZWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgUGx1Z2luT3B0aW9uLFxuICBVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB0eXBlIHsgUG9zdGNzc0NvbmZpZyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBBc3NldEVtaXR0ZXIsXG4gIEJ1bmRsZU91dHB1dExpa2Vcbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS50cyc7XG5cbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGxvYWRQb3N0Y3NzQ29uZmlnIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0Vml0ZUZlYXR1cmVDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZpdGVGZWF0dXJlQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZWVkcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdGNzc0NvbmZpZzogUG9zdGNzc0NvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3Mgdml0ZSBjb25maWcuXG4gICAqL1xuICByZWFkb25seSB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYnNpZGlhblBsdWdpblZpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBtb2RlLiBEZWZhdWx0cyB0byB7QGxpbmsgQnVpbGRNb2RlLkRldmVsb3BtZW50fSBmb3IgYHZpdGUgYnVpbGQgLS13YXRjaGAgKG9yXG4gICAqIGAtLW1vZGUgZGV2ZWxvcG1lbnRgKSBhbmQge0BsaW5rIEJ1aWxkTW9kZS5Qcm9kdWN0aW9ufSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIFRoZSBzdGF0ZSBvbmUge0BsaW5rIG9ic2lkaWFuUGx1Z2luVml0ZX0gaW5zdGFuY2Uga2VlcHMgYWNyb3NzIHRoZSBob29rcyBvZiBhIGJ1aWxkLCBhbmQgYWNyb3NzIHRoZVxuICogcmVidWlsZHMgb2YgYSB3YXRjaC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHRoZSBidWlsZCBtb2RlIG9mIGEgdml0ZSBidWlsZCBmcm9tIHRoZSBjb25zdW1lcidzIGNvbmZpZzogZGV2ZWxvcG1lbnQgZm9yIGEgd2F0Y2ggYnVpbGQgb3IgZm9yXG4gKiBgLS1tb2RlIGRldmVsb3BtZW50YCwgcHJvZHVjdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHVzZXJDb25maWcgLSBUaGUgY29uc3VtZXIncyB2aXRlIGNvbmZpZy5cbiAqIEBwYXJhbSBlbnYgLSBUaGUgdml0ZSBjb25maWcgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpdGVCdWlsZE1vZGUodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBQaWNrPENvbmZpZ0VudiwgJ21vZGUnPik6IEJ1aWxkTW9kZSB7XG4gIHJldHVybiB1c2VyQ29uZmlnLmJ1aWxkPy53YXRjaCB8fCBlbnYubW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCA6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFydCBvZiB0aGUgdml0ZSBjb25maWcgdGhlIHBsdWdpbiBjb250cmlidXRlczogb25seSB0aGUgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gdXNlckNvbmZpZyAtIFRoZSBjb25zdW1lcidzIHZpdGUgY29uZmlnLlxuICogQHBhcmFtIGJ1aWxkQ29udGV4dCAtIFRoZSBidWlsZCBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUNvbmZpZ0RlZmF1bHRzKHVzZXJDb25maWc6IFVzZXJDb25maWcsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiBVc2VyQ29uZmlnIHtcbiAgY29uc3QgYnVpbGQgPSB1c2VyQ29uZmlnLmJ1aWxkID8/IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gQSBjb25zdW1lcidzIGNvbmZpZyBtYXkgc3RpbGwgdXNlIHRoZSBkZXByZWNhdGVkIGFsaWFzLCBhbmQgdml0ZSBzdGlsbCBob25vcnMgaXQuXG4gIGNvbnN0IHJvbGxkb3duT3B0aW9ucyA9IGJ1aWxkLnJvbGxkb3duT3B0aW9ucyA/PyBidWlsZC5yb2xsdXBPcHRpb25zID8/IHt9O1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHJvbGxkb3duT3B0aW9ucy5vdXRwdXQpID8gdW5kZWZpbmVkIDogcm9sbGRvd25PcHRpb25zLm91dHB1dCA/PyB7fTtcblxuICByZXR1cm4ge1xuICAgIGJ1aWxkOiB7XG4gICAgICAvLyBBbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UsIHNvIGFueSBhc3NldCBlbWl0dGVkIGJlc2lkZVxuICAgICAgLy8gdGhlIGJ1bmRsZSBpcyBhIGZpbGUgdGhlIGluc3RhbGxlZCBwbHVnaW4gbG9va3MgZm9yIGFuZCBkb2VzIG5vdCBmaW5kLlxuICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IGJ1aWxkLmFzc2V0c0lubGluZUxpbWl0ID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGVtcHR5T3V0RGlyYCBpcyB0aGUgbmFtZSB2aXRlJ3MgY29uZmlnIHJlYWRzLlxuICAgICAgZW1wdHlPdXREaXI6IGZhbHNlLFxuICAgICAgbGliOiBidWlsZC5saWIgPz8ge1xuICAgICAgICBjc3NGaWxlTmFtZTogJ3N0eWxlcycsXG4gICAgICAgIGVudHJ5OiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICAgICAgZmlsZU5hbWU6ICgpOiBzdHJpbmcgPT4gJ21haW4uanMnLFxuICAgICAgICBmb3JtYXRzOiBbJ2NqcyddXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBidWlsZC5taW5pZnkgPz8gYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG91dERpcmAgaXMgdGhlIG5hbWUgdml0ZSdzIGNvbmZpZyByZWFkcy5cbiAgICAgIG91dERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgZXh0ZXJuYWw6IGNvbWJpbmVFeHRlcm5hbChyb2xsZG93bk9wdGlvbnMuZXh0ZXJuYWwpLFxuICAgICAgICAuLi4ob3V0cHV0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgIG91dHB1dDoge1xuICAgICAgICAgICAgLy8gYHBvc3RCYW5uZXJgIHJhdGhlciB0aGFuIGBiYW5uZXJgOiBpdCBpcyBhZGRlZCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHN0cmlwcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICAgICAgICAgICAgLi4uKG91dHB1dC5iYW5uZXIgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQucG9zdEJhbm5lciA9PT0gdW5kZWZpbmVkICYmIHsgcG9zdEJhbm5lcjogZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3ZpdGUnKSB9KSxcbiAgICAgICAgICAgIC8vIEFuIE9ic2lkaWFuIHBsdWdpbiBpcyBvbmUgZmlsZTogdGhlIG1hbmlmZXN0IG5hbWVzIGBtYWluLmpzYCBhbmQgbm90aGluZyBsb2FkcyBhIHNlY29uZCBjaHVuay5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBBIGNvbnN1bWVyJ3MgY29uZmlnIG1heSBzdGlsbCBzZXQgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uLCB3aGljaCB0aGVuIHdpbnMuXG4gICAgICAgICAgICAuLi4ob3V0cHV0LmNvZGVTcGxpdHRpbmcgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQuaW5saW5lRHluYW1pY0ltcG9ydHMgPT09IHVuZGVmaW5lZCAmJiB7IGNvZGVTcGxpdHRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogYnVpbGQuc291cmNlbWFwID8/ICghYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUnKVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBhcnQgb2YgdGhlIHZpdGUgY29uZmlnIHRoZSBidWlsZCBmZWF0dXJlcyBjb250cmlidXRlLCBlYWNoIG9ubHkgd2hlcmUgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGxlZnQgaXRcbiAqIHVuc2V0OiB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoYGRlZmluZWApLCB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lIGZvciBSZWFjdCBhbmQgUHJlYWN0XG4gKiAoYG94Yy5qc3hgKSwgYW5kIHRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiAoYGNzcy5wb3N0Y3NzYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0Vml0ZUZlYXR1cmVDb25maWdQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUZlYXR1cmVDb25maWcocGFyYW1zOiBHZXRWaXRlRmVhdHVyZUNvbmZpZ1BhcmFtcyk6IFVzZXJDb25maWcge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9ID0gcGFyYW1zO1xuICBjb25zdCBjb25maWc6IFVzZXJDb25maWcgPSB7fTtcblxuICBjb25zdCB1c2VyRGVmaW5lID0gdXNlckNvbmZpZy5kZWZpbmUgPz8ge307XG4gIGNvbnN0IGRlZmluZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkIH0pKS5maWx0ZXIoKFtleHByZXNzaW9uXSkgPT4gIU9iamVjdC5oYXNPd24odXNlckRlZmluZSwgZXhwcmVzc2lvbikpXG4gICk7XG4gIGlmIChPYmplY3Qua2V5cyhkZWZpbmUpLmxlbmd0aCA+IDApIHtcbiAgICBjb25maWcuZGVmaW5lID0gZGVmaW5lO1xuICB9XG5cbiAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yayk7XG4gIGlmIChqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiB1c2VyQ29uZmlnLm94YyAhPT0gZmFsc2UgJiYgdXNlckNvbmZpZy5veGM/LmpzeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLm94YyA9IHsganN4OiB7IGRldmVsb3BtZW50OiAhaXNQcm9kdWN0aW9uQnVpbGQsIGltcG9ydFNvdXJjZToganN4SW1wb3J0U291cmNlLCBydW50aW1lOiAnYXV0b21hdGljJyB9IH07XG4gIH1cblxuICBpZiAocG9zdGNzc0NvbmZpZyAmJiBwb3N0Y3NzQ29uZmlnLnBsdWdpbnMubGVuZ3RoID4gMCAmJiB1c2VyQ29uZmlnLmNzcz8ucG9zdGNzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLmNzcyA9IHsgcG9zdGNzczogeyBwbHVnaW5zOiBbLi4ucG9zdGNzc0NvbmZpZy5wbHVnaW5zXSB9IH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdml0ZSBwbHVnaW4gdGhhdCBidWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIFdoYXQgaXQgZG9lcywgZWFjaCBvbmx5IHdoZW4gdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGhhcyBub3Qgc2FpZCBvdGhlcndpc2U6XG4gKlxuICogLSBgYnVpbGQubGliYCBidWlsZHMgYHNyYy9tYWluLnRzYCBhcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgLCB3aXRoIGl0cyBDU1MgaW4gYHN0eWxlcy5jc3NgLlxuICogLSBgYnVpbGQub3V0RGlyYCBpcyBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLlxuICogLSBgYnVpbGQubWluaWZ5YCBpcyBvbiBpbiBwcm9kdWN0aW9uIG9ubHksIGFuZCBgYnVpbGQuc291cmNlbWFwYCBpcyBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgb25seS5cbiAqIC0gRXZlcnkgYXNzZXQgaXMgaW5saW5lZCwgYmVjYXVzZSBhbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UuXG4gKiAtIER5bmFtaWMgaW1wb3J0cyBhcmUgaW5saW5lZCBpbnRvIGBtYWluLmpzYCwgYW5kIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgaXQuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsYCwgdGhlIG91dHB1dCBmb2xkZXIgaXMgZW1wdGllZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVcbiAqIChgYnVpbGQuZW1wdHlPdXREaXJgIGlzIHR1cm5lZCBvZmYsIHNpbmNlIHRoaXMgcGx1Z2luIGRvZXMgaXQpLCBldmVyeSBlbWl0dGVkIENTUyBmaWxlIGVuZHMgdXAgaW5cbiAqIGBzdHlsZXMuY3NzYCwgYG1hbmlmZXN0Lmpzb25gIChhbmQgaW4gZGV2ZWxvcG1lbnQgYC5ob3RyZWxvYWRgKSBpcyBjb3BpZWQgYmVzaWRlIGl0LCBhbmQgYSBkZXZlbG9wbWVudFxuICogYnVpbGQgaXMgZGVwbG95ZWQgaW50byB0aGUgdmF1bHQgbmFtZWQgYnkgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyAoe0BsaW5rIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnN9KTpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2Agc2V0cyBgb3hjLmpzeGAgdG8gdGhlIGF1dG9tYXRpYyBydW50aW1lICh1bmxlc3Mgc2V0KS5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgZGVmaW5lcyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIChhbmQgVnVlJ3MgZmVhdHVyZSBmbGFncyksIHdoaWNoIGEgbGlicmFyeSBidWlsZCBsZWF2ZXMgYWxvbmUuXG4gKiAtIGBzdHlsZXMucG9zdGNzc2AgYW5kIGBzdHlsZXMudGFpbHdpbmRgIHNldCBgY3NzLnBvc3Rjc3NgICh1bmxlc3Mgc2V0KTsgdml0ZSBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzb1xuICogICBgc3R5bGVzLmNzc01vZHVsZXNgIGNoYW5nZXMgbm90aGluZyBoZXJlLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5WaXRlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBUaGUgdml0ZSBwbHVnaW5zLCB3aGljaCB2aXRlIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5WaXRlKG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgPSB7fSk6IFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlID0ge1xuICAgIGJ1aWxkQ29udGV4dDogdW5kZWZpbmVkLFxuICAgIGlzRGlzdEZvbGRlckNsZWFuZWQ6IGZhbHNlXG4gIH07XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFZpdGUgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHZpdGUgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiB2aXRlIHBsdWdpbiBoYXMgbm90IHJlc29sdmVkIGl0cyBidWlsZCBjb250ZXh0OiBpdHMgYGNvbmZpZ2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogZmFsc2UsXG4gICAgc2hvdWxkUmVwbGFjZURlZmluZXM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0IHBsdWdpbiA9IHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBhc3luYyBjb25maWcodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBDb25maWdFbnYpOiBQcm9taXNlPFVzZXJDb25maWc+IHtcbiAgICAgIHN0YXRlLmJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLih1c2VyQ29uZmlnLmJ1aWxkPy5vdXREaXIgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3RGb2xkZXI6IHVzZXJDb25maWcuYnVpbGQub3V0RGlyIH0pLFxuICAgICAgICBtb2RlOiBvcHRpb25zLm1vZGUgPz8gZ2V0Vml0ZUJ1aWxkTW9kZSh1c2VyQ29uZmlnLCBlbnYpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgICAgIGNvbnN0IHBvc3Rjc3NDb25maWcgPSBpc1Bvc3Rjc3NOZWVkZWQob3B0aW9ucy5zdHlsZXMpXG4gICAgICAgID8gYXdhaXQgbG9hZFBvc3Rjc3NDb25maWcoeyBpc1Byb2R1Y3Rpb25CdWlsZCwgc3R5bGVzOiBvcHRpb25zLnN0eWxlcyA/PyB7fSB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZlYXR1cmVDb25maWcgPSBnZXRWaXRlRmVhdHVyZUNvbmZpZyh7IGZlYXR1cmVzOiBvcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9KTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGdldFZpdGVDb25maWdEZWZhdWx0cyh1c2VyQ29uZmlnLCBzdGF0ZS5idWlsZENvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgLi4uZmVhdHVyZUNvbmZpZywgLi4uY29uZmlnIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcih0aGlzOiBBc3NldEVtaXR0ZXIsIF9vdXRwdXRPcHRpb25zOiB1bmtub3duLCBidW5kbGU6IFJlY29yZDxzdHJpbmcsIEJ1bmRsZU91dHB1dExpa2U+KTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIHJlbmRlclN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKHN0YXRlLmlzRGlzdEZvbGRlckNsZWFuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IHRydWU7XG4gICAgICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihnZXRCdWlsZENvbnRleHQoKS5kaXN0Rm9sZGVyKTtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgIH1cbiAgfSBhcyBQbHVnaW47XG4gIHJldHVybiBbcGx1Z2luLCB7IC4uLmZlYXR1cmVQbHVnaW4sIGFwcGx5OiAnYnVpbGQnIH0gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICd2aXRlJywgZmVhdHVyZXM6IG9wdGlvbnMgfSkgYXMgUHJvbWlzZTxudWxsIHwgUGx1Z2luPl07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOEJBLG1DQU1PO0FBQ1Asc0NBSU87QUFDUCx3Q0FBa0M7QUFDbEMsZ0RBQThDO0FBQzlDLHdDQUdPO0FBQ1AsK0JBR087QUF1REEsU0FBUyxpQkFBaUIsWUFBd0IsS0FBeUM7QUFDaEcsU0FBTyxXQUFXLE9BQU8sU0FBUyxJQUFJLFNBQVMsZ0JBQWdCLHVDQUFVLGNBQWMsdUNBQVU7QUFDbkc7QUFTTyxTQUFTLHNCQUFzQixZQUF3QixjQUFzRDtBQUNsSCxRQUFNLFFBQVEsV0FBVyxTQUFTLENBQUM7QUFFbkMsUUFBTSxrQkFBa0IsTUFBTSxtQkFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxRQUFNLFNBQVMsTUFBTSxRQUFRLGdCQUFnQixNQUFNLElBQUksU0FBWSxnQkFBZ0IsVUFBVSxDQUFDO0FBRTlGLFNBQU87QUFBQSxJQUNMLE9BQU87QUFBQTtBQUFBO0FBQUEsTUFHTCxtQkFBbUIsTUFBTSxxQkFBcUIsT0FBTztBQUFBO0FBQUEsTUFFckQsYUFBYTtBQUFBLE1BQ2IsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNoQixhQUFhO0FBQUEsUUFDYixPQUFPLGFBQWE7QUFBQSxRQUNwQixVQUFVLE1BQWM7QUFBQSxRQUN4QixTQUFTLENBQUMsS0FBSztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxRQUFRLE1BQU0sVUFBVSxhQUFhO0FBQUE7QUFBQSxNQUVyQyxRQUFRLGFBQWE7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
|