@decaf-ts/cli 0.3.2 → 0.3.6
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.md +21 -157
- package/README.md +157 -2
- package/dist/cli.cjs +143 -62
- package/dist/cli.esm.cjs +143 -62
- package/lib/CliWrapper.cjs +93 -21
- package/lib/CliWrapper.d.ts +88 -16
- package/lib/bin/cli.cjs +17 -9
- package/lib/bin/cli.d.ts +15 -7
- package/lib/constants.cjs +5 -5
- package/lib/constants.d.ts +4 -4
- package/lib/demo/cli-module.cjs +26 -18
- package/lib/demo/cli-module.d.ts +25 -17
- package/lib/esm/CliWrapper.d.ts +88 -16
- package/lib/esm/CliWrapper.js +95 -23
- package/lib/esm/bin/cli.d.ts +15 -7
- package/lib/esm/bin/cli.js +17 -9
- package/lib/esm/constants.d.ts +4 -4
- package/lib/esm/constants.js +5 -5
- package/lib/esm/demo/cli-module.d.ts +25 -17
- package/lib/esm/demo/cli-module.js +26 -18
- package/lib/esm/index.d.ts +5 -18
- package/lib/esm/index.js +7 -20
- package/lib/esm/types.d.ts +6 -3
- package/lib/esm/types.js +1 -1
- package/lib/esm/utils.d.ts +39 -18
- package/lib/esm/utils.js +42 -20
- package/lib/index.cjs +6 -19
- package/lib/index.d.ts +5 -18
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +6 -3
- package/lib/utils.cjs +42 -20
- package/lib/utils.d.ts +39 -18
- package/package.json +3 -2
package/dist/cli.cjs
CHANGED
|
@@ -5,25 +5,35 @@
|
|
|
5
5
|
})(this, (function (exports, commander, fs, path) { 'use strict';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* @description The
|
|
9
|
-
* a single
|
|
8
|
+
* @description The filename that identifies Decaf CLI modules
|
|
9
|
+
* @summary The standard filename for CLI module files where each library must export a single CliModule function
|
|
10
10
|
*
|
|
11
|
-
* @
|
|
12
|
-
* @memberOf module:CLI
|
|
11
|
+
* @const CLI_FILE_NAME
|
|
12
|
+
* @memberOf module:CLI
|
|
13
13
|
*/
|
|
14
14
|
const CLI_FILE_NAME = "cli-module";
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* @description
|
|
17
|
+
* @description Utility class for CLI operations
|
|
18
|
+
* @summary A static utility class that provides methods for loading modules, retrieving package information, and initializing CLI commands
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // Initialize a Command object with package information
|
|
22
|
+
* const command = new Command();
|
|
23
|
+
* CLIUtils.initialize(command, './path/to/package');
|
|
24
|
+
*
|
|
25
|
+
* // Load a CLI module from a file
|
|
26
|
+
* const module = await CLIUtils.loadFromFile('./path/to/cli-module.js');
|
|
18
27
|
*
|
|
19
28
|
* @class CLIUtils
|
|
20
|
-
* @static
|
|
21
29
|
*/
|
|
22
30
|
class CLIUtils {
|
|
23
31
|
/**
|
|
24
|
-
* @description Dynamically imports a
|
|
25
|
-
* @
|
|
26
|
-
*
|
|
32
|
+
* @description Dynamically imports a module file
|
|
33
|
+
* @summary Loads a JavaScript file and returns it as a CliModule, handling both ESM and CommonJS formats
|
|
34
|
+
*
|
|
35
|
+
* @param {string} path The file path to the module to load
|
|
36
|
+
* @return {Promise<CliModule>} A promise that resolves to the loaded CliModule
|
|
27
37
|
*/
|
|
28
38
|
static async loadFromFile(path) {
|
|
29
39
|
try {
|
|
@@ -34,11 +44,12 @@
|
|
|
34
44
|
}
|
|
35
45
|
}
|
|
36
46
|
/**
|
|
37
|
-
* @description
|
|
38
|
-
* @summary
|
|
47
|
+
* @description Normalizes module imports to handle both ESM and CommonJS formats
|
|
48
|
+
* @summary Properly imports JavaScript files regardless of their module format by handling the ESM wrapper for CommonJS modules
|
|
39
49
|
*
|
|
40
|
-
* @
|
|
41
|
-
* @param {Promise} importPromise
|
|
50
|
+
* @template T The type of the imported module
|
|
51
|
+
* @param {Promise<T>} importPromise The promise returned by the dynamic import
|
|
52
|
+
* @return {Promise<T>} A promise that resolves to the normalized module
|
|
42
53
|
* @private
|
|
43
54
|
*/
|
|
44
55
|
static async normalizeImport(importPromise) {
|
|
@@ -46,10 +57,12 @@
|
|
|
46
57
|
return importPromise.then((m) => (m.default || m));
|
|
47
58
|
}
|
|
48
59
|
/**
|
|
49
|
-
* @description
|
|
60
|
+
* @description Initializes a Command object with package information
|
|
61
|
+
* @summary Sets up a Commander Command object with the package name, description, and version from the package.json file
|
|
50
62
|
*
|
|
51
|
-
* @param {Command} command
|
|
52
|
-
* @param {string} [basePath] defaults to the current working directory
|
|
63
|
+
* @param {Command} command The Command object to initialize
|
|
64
|
+
* @param {string} [basePath] The base path where the package.json file is located, defaults to the current working directory
|
|
65
|
+
* @return {void}
|
|
53
66
|
*/
|
|
54
67
|
static initialize(command, basePath) {
|
|
55
68
|
const name = CLIUtils.packageName(basePath);
|
|
@@ -59,9 +72,11 @@
|
|
|
59
72
|
.version(CLIUtils.packageVersion(basePath));
|
|
60
73
|
}
|
|
61
74
|
/**
|
|
62
|
-
* @description
|
|
75
|
+
* @description Retrieves and parses the package.json file
|
|
76
|
+
* @summary Reads the package.json file from the specified path and parses it into a JavaScript object
|
|
63
77
|
*
|
|
64
|
-
* @param {string} basePath
|
|
78
|
+
* @param {string} basePath The base path where the package.json file is located
|
|
79
|
+
* @return {Record<string, unknown>} The parsed package.json content as an object
|
|
65
80
|
* @private
|
|
66
81
|
*/
|
|
67
82
|
static getPackage(basePath) {
|
|
@@ -73,27 +88,42 @@
|
|
|
73
88
|
}
|
|
74
89
|
}
|
|
75
90
|
/**
|
|
76
|
-
* @description
|
|
77
|
-
* @
|
|
91
|
+
* @description Returns the version from package.json
|
|
92
|
+
* @summary Retrieves the version field from the package.json file at the specified path
|
|
93
|
+
*
|
|
94
|
+
* @param {string} basePath The base path where the package.json file is located
|
|
95
|
+
* @return {string} The package version string
|
|
78
96
|
*/
|
|
79
97
|
static packageVersion(basePath) {
|
|
80
98
|
return CLIUtils.getPackage(basePath)["version"];
|
|
81
99
|
}
|
|
82
100
|
/**
|
|
83
|
-
* @description
|
|
84
|
-
* @
|
|
101
|
+
* @description Returns the name from package.json
|
|
102
|
+
* @summary Retrieves the name field from the package.json file at the specified path and extracts the package name without the scope
|
|
103
|
+
*
|
|
104
|
+
* @param {string} basePath The base path where the package.json file is located
|
|
105
|
+
* @return {string} The package name without the scope (e.g., "cli" from "@decaf-ts/cli")
|
|
85
106
|
*/
|
|
86
107
|
static packageName(basePath) {
|
|
87
|
-
|
|
108
|
+
const name = CLIUtils.getPackage(basePath)["name"].split("/");
|
|
109
|
+
return name[name.length - 1];
|
|
88
110
|
}
|
|
89
111
|
}
|
|
90
112
|
|
|
91
113
|
/**
|
|
92
|
-
* @
|
|
93
|
-
* @
|
|
114
|
+
* @description Utility class to handle CLI functionality from all Decaf modules
|
|
115
|
+
* @summary This class provides a wrapper around Commander.js to handle CLI commands from different Decaf modules.
|
|
116
|
+
* It crawls the filesystem to find CLI modules, loads them, and registers their commands.
|
|
94
117
|
*
|
|
95
|
-
* @param {string} [
|
|
96
|
-
* @param {
|
|
118
|
+
* @param {string} [basePath] The base path to look for modules in. Defaults to `./`
|
|
119
|
+
* @param {number} [crawlLevels] Number of folder levels to crawl to find modules from the basePath. Defaults to 4
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* // Create a new CLI wrapper and run it with custom options
|
|
123
|
+
* const cli = new CliWrapper('./src', 2);
|
|
124
|
+
* cli.run(process.argv).then(() => {
|
|
125
|
+
* console.log('CLI commands executed successfully');
|
|
126
|
+
* });
|
|
97
127
|
*
|
|
98
128
|
* @class CliWrapper
|
|
99
129
|
*/
|
|
@@ -102,26 +132,47 @@
|
|
|
102
132
|
this.basePath = basePath;
|
|
103
133
|
this.crawlLevels = crawlLevels;
|
|
104
134
|
this.modules = {};
|
|
135
|
+
this.rootPath = path.resolve(__dirname, "..");
|
|
105
136
|
}
|
|
106
137
|
/**
|
|
107
|
-
* @description Retrieves and initializes the
|
|
138
|
+
* @description Retrieves and initializes the Commander Command object
|
|
139
|
+
* @summary Lazy-loads the Command object, initializing it with the package name, description, and version
|
|
140
|
+
* @return {Command} The initialized Command object
|
|
108
141
|
* @private
|
|
109
142
|
*/
|
|
110
143
|
get command() {
|
|
111
144
|
if (!this._command) {
|
|
112
145
|
this._command = new commander.Command();
|
|
113
|
-
CLIUtils.initialize(this._command, this.
|
|
146
|
+
CLIUtils.initialize(this._command, this.rootPath);
|
|
114
147
|
}
|
|
115
148
|
return this._command;
|
|
116
149
|
}
|
|
117
150
|
/**
|
|
118
|
-
* @description
|
|
151
|
+
* @description Loads and registers a module from a file
|
|
152
|
+
* @summary Dynamically imports a CLI module from the specified file path, initializes it, and registers it in the modules collection
|
|
119
153
|
*
|
|
120
|
-
* @param {string} filePath
|
|
121
|
-
* @param {string} rootPath
|
|
122
|
-
* @return {string} the module name
|
|
154
|
+
* @param {string} filePath Path to the module file to load
|
|
155
|
+
* @param {string} rootPath Repository root path to find the package.json
|
|
156
|
+
* @return {Promise<string>} A promise that resolves to the module name
|
|
123
157
|
*
|
|
124
158
|
* @private
|
|
159
|
+
* @mermaid
|
|
160
|
+
* sequenceDiagram
|
|
161
|
+
* participant CliWrapper
|
|
162
|
+
* participant CLIUtils
|
|
163
|
+
* participant Module
|
|
164
|
+
*
|
|
165
|
+
* CliWrapper->>CLIUtils: loadFromFile(filePath)
|
|
166
|
+
* CLIUtils-->>CliWrapper: module
|
|
167
|
+
* CliWrapper->>CliWrapper: Get module name
|
|
168
|
+
* CliWrapper->>Command: new Command()
|
|
169
|
+
* Command-->>CliWrapper: cmd
|
|
170
|
+
* CliWrapper->>CLIUtils: initialize(cmd, path.dirname(rootPath))
|
|
171
|
+
* CliWrapper->>Module: module()
|
|
172
|
+
* Note over CliWrapper,Module: Handle Promise if needed
|
|
173
|
+
* Module-->>CliWrapper: Command instance
|
|
174
|
+
* CliWrapper->>CliWrapper: Store in modules[name]
|
|
175
|
+
* CliWrapper-->>CliWrapper: Return name
|
|
125
176
|
*/
|
|
126
177
|
async load(filePath, rootPath) {
|
|
127
178
|
let name;
|
|
@@ -129,7 +180,7 @@
|
|
|
129
180
|
const module = await CLIUtils.loadFromFile(filePath);
|
|
130
181
|
name = module.name;
|
|
131
182
|
const cmd = new commander.Command();
|
|
132
|
-
CLIUtils.initialize(cmd,
|
|
183
|
+
CLIUtils.initialize(cmd, rootPath);
|
|
133
184
|
let m = module();
|
|
134
185
|
if (m instanceof Promise)
|
|
135
186
|
m = await m;
|
|
@@ -141,12 +192,36 @@
|
|
|
141
192
|
return name;
|
|
142
193
|
}
|
|
143
194
|
/**
|
|
144
|
-
* @description
|
|
145
|
-
*
|
|
195
|
+
* @description Finds and loads all CLI modules in the basePath
|
|
196
|
+
* @summary Uses the crawl method to find all CLI modules in the specified base path,
|
|
197
|
+
* then loads and registers each module as a subcommand
|
|
198
|
+
*
|
|
199
|
+
* @return {Promise<void>} A promise that resolves when all modules are loaded
|
|
200
|
+
*
|
|
146
201
|
* @private
|
|
202
|
+
* @mermaid
|
|
203
|
+
* sequenceDiagram
|
|
204
|
+
* participant CliWrapper
|
|
205
|
+
* participant Filesystem
|
|
206
|
+
* participant Module
|
|
207
|
+
*
|
|
208
|
+
* CliWrapper->>Filesystem: Join basePath with cwd
|
|
209
|
+
* CliWrapper->>CliWrapper: crawl(basePath, crawlLevels)
|
|
210
|
+
* CliWrapper-->>CliWrapper: modules[]
|
|
211
|
+
* loop For each module
|
|
212
|
+
* alt Not @decaf-ts/cli
|
|
213
|
+
* CliWrapper->>CliWrapper: load(module, cwd)
|
|
214
|
+
* CliWrapper-->>CliWrapper: name
|
|
215
|
+
* CliWrapper->>CliWrapper: Check if command exists
|
|
216
|
+
* alt Command doesn't exist
|
|
217
|
+
* CliWrapper->>Command: command(name).addCommand(modules[name])
|
|
218
|
+
* end
|
|
219
|
+
* end
|
|
220
|
+
* end
|
|
221
|
+
* CliWrapper->>Console: Log loaded modules
|
|
147
222
|
*/
|
|
148
223
|
async boot() {
|
|
149
|
-
const basePath = path.
|
|
224
|
+
const basePath = path.resolve(this.rootPath, this.basePath);
|
|
150
225
|
const modules = this.crawl(basePath, this.crawlLevels);
|
|
151
226
|
for (const module of modules) {
|
|
152
227
|
if (module.includes("@decaf-ts/cli")) {
|
|
@@ -154,7 +229,7 @@
|
|
|
154
229
|
}
|
|
155
230
|
let name;
|
|
156
231
|
try {
|
|
157
|
-
name = await this.load(module,
|
|
232
|
+
name = await this.load(module, this.rootPath);
|
|
158
233
|
}
|
|
159
234
|
catch (e) {
|
|
160
235
|
console.error(e);
|
|
@@ -173,9 +248,13 @@
|
|
|
173
248
|
.join("\n")}`);
|
|
174
249
|
}
|
|
175
250
|
/**
|
|
176
|
-
* @description
|
|
177
|
-
* @
|
|
178
|
-
*
|
|
251
|
+
* @description Recursively searches for CLI module files in the directory structure
|
|
252
|
+
* @summary Crawls the basePath up to the specified number of folder levels to find files named according to CLI_FILE_NAME
|
|
253
|
+
*
|
|
254
|
+
* @param {string} basePath The absolute base path to start searching in
|
|
255
|
+
* @param {number} [levels=2] The maximum number of directory levels to crawl
|
|
256
|
+
* @return {string[]} An array of file paths to CLI modules
|
|
257
|
+
*
|
|
179
258
|
* @private
|
|
180
259
|
*/
|
|
181
260
|
crawl(basePath, levels = 2) {
|
|
@@ -193,9 +272,24 @@
|
|
|
193
272
|
}, []);
|
|
194
273
|
}
|
|
195
274
|
/**
|
|
196
|
-
* @description
|
|
275
|
+
* @description Executes the CLI with the provided arguments
|
|
276
|
+
* @summary Boots the CLI by loading all modules, then parses and executes the command specified in the arguments
|
|
277
|
+
*
|
|
278
|
+
* @param {string[]} [args=process.argv] Command line arguments to parse and execute
|
|
279
|
+
* @return {Promise<void>} A promise that resolves when the command execution is complete
|
|
197
280
|
*
|
|
198
|
-
* @
|
|
281
|
+
* @mermaid
|
|
282
|
+
* sequenceDiagram
|
|
283
|
+
* participant Client
|
|
284
|
+
* participant CliWrapper
|
|
285
|
+
* participant Command
|
|
286
|
+
*
|
|
287
|
+
* Client->>CliWrapper: run(args)
|
|
288
|
+
* CliWrapper->>CliWrapper: boot()
|
|
289
|
+
* Note over CliWrapper: Loads all modules
|
|
290
|
+
* CliWrapper->>Command: parseAsync(args)
|
|
291
|
+
* Command-->>CliWrapper: result
|
|
292
|
+
* CliWrapper-->>Client: result
|
|
199
293
|
*/
|
|
200
294
|
async run(args = process.argv) {
|
|
201
295
|
await this.boot();
|
|
@@ -206,7 +300,8 @@
|
|
|
206
300
|
/**
|
|
207
301
|
* @description Decaf-ts' CLI module
|
|
208
302
|
* @summary This file will crawl the current working directory for files called {@link CLI_FILE_NAME}
|
|
209
|
-
* within the @decaf-ts namespace and load
|
|
303
|
+
* within the @decaf-ts namespace and load them as subcommands. It serves as the main entry point
|
|
304
|
+
* for the CLI functionality, exporting the CliWrapper class and VERSION constant.
|
|
210
305
|
*
|
|
211
306
|
* @example
|
|
212
307
|
* run module command - $ npx decaf <module name> <module command> ...<module command options>
|
|
@@ -217,29 +312,15 @@
|
|
|
217
312
|
* @module CLI
|
|
218
313
|
*/
|
|
219
314
|
/**
|
|
220
|
-
* @description
|
|
221
|
-
* @summary
|
|
222
|
-
* within the @decaf-ts namespace and load then as subcommands
|
|
223
|
-
*
|
|
224
|
-
* @example
|
|
225
|
-
* run module command - $ npx decaf <module name> <module command> ...<module command options>
|
|
226
|
-
* get module help - $ npx decaf help <module name>;
|
|
227
|
-
* list imported modules - $ npx decaf list;
|
|
228
|
-
* get cli help - $ npx decaf help;
|
|
229
|
-
*
|
|
230
|
-
* @namespace cli
|
|
231
|
-
* @memberOf module:CLI
|
|
232
|
-
*/
|
|
233
|
-
/**
|
|
234
|
-
* @summary stores the current package version
|
|
235
|
-
* @description this is how you should document a constant
|
|
315
|
+
* @description Stores the current package version
|
|
316
|
+
* @summary A constant that holds the version string of the package, which is replaced during build
|
|
236
317
|
* @const VERSION
|
|
237
318
|
* @memberOf module:CLI
|
|
238
319
|
*/
|
|
239
|
-
const VERSION = "0.3.
|
|
320
|
+
const VERSION = "0.3.6";
|
|
240
321
|
|
|
241
322
|
exports.CliWrapper = CliWrapper;
|
|
242
323
|
exports.VERSION = VERSION;
|
|
243
324
|
|
|
244
325
|
}));
|
|
245
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9DbGlXcmFwcGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIGZvciBkZWNhZiBjbGkgbW9kdWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnRcbiAqIGEgc2luZ2xlIHtAbGluayBDbGlNb2R1bGV9XG4gKlxuICogQGNvbnN0YW50XG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSS5jbGlcbiAqL1xuZXhwb3J0IGNvbnN0IENMSV9GSUxFX05BTUUgPSBcImNsaS1tb2R1bGVcIjtcbiIsImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IHsgQ2xpTW9kdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gdXRpbCBjbGFzcyB0byByZXRyaWV2ZSB2ZXJzaW9ucyBhbmQgb3RoZXIgaW5mb3JtYXRpb25cbiAqXG4gKiBAY2xhc3MgQ0xJVXRpbHNcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0IGNsYXNzIENMSVV0aWxzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEeW5hbWljYWxseSBpbXBvcnRzIGEgY2pzIGZpbGUgaW50byBhIGRlY2FmIG1vZHVsZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbG9hZEZyb21GaWxlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Q2xpTW9kdWxlPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBDTElVdGlscy5ub3JtYWxpemVJbXBvcnQoaW1wb3J0KHBhdGgpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbG9hZCBmcm9tICR7cGF0aH06ICR7ZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogZX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gYWxsb3dzIHNhZmUgZHluYW1pYyBpbXBvcnRzXG4gICAqIEBzdW1tYXJ5IHByb3BlcnR5IGltcG9ydHMgSlMgZmlsZXMgcmVnYXJkbGVzcyBvZiBlc20gc3RhdHVzXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVFxuICAgKiBAcGFyYW0ge1Byb21pc2V9IGltcG9ydFByb21pc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBub3JtYWxpemVJbXBvcnQ8VD4oaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKFxuICAgICAgKG06IHVua25vd24pID0+ICgobSBhcyB7IGRlZmF1bHQ6IFQgfSkuZGVmYXVsdCB8fCBtKSBhcyBUXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gaW5pdGlhbGl6ZXMgdGhlIENsaSBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShjb21tYW5kOiBDb21tYW5kLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IENMSVV0aWxzLnBhY2thZ2VOYW1lKGJhc2VQYXRoKTtcbiAgICBjb21tYW5kXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGBSdW5zICR7bmFtZX0gcmVsYXRlZCBjb21tYW5kc2ApXG4gICAgICAudmVyc2lvbihDTElVdGlscy5wYWNrYWdlVmVyc2lvbihiYXNlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRQYWNrYWdlKGJhc2VQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKGJhc2VQYXRoLCBcInBhY2thZ2UuanNvblwiKSwgXCJ1dGY4XCIpXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlYWQgdmVyc2lvbiBmcm9tICR7YmFzZVBhdGh9OiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwYWNrYWdlIHZlcnNpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF0gZGVmYXVsdHMgdG8gY3VycmVudCB3b3JraW5nIGRpclxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VWZXJzaW9uKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBDTElVdGlscy5nZXRQYWNrYWdlKGJhc2VQYXRoKVtcInZlcnNpb25cIl0gYXMgc3RyaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiByZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlUGF0aF0gZGVmYXVsdHMgdG8gY3VycmVudCB3b3JraW5nIGRpclxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpWzFdO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENMSV9GSUxFX05BTUUgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENMSVV0aWxzIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAc3VtbWFyeSBVdGlsIGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAZGVzY3JpcHRpb24gQ0xJIGhhbmRsZXIgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VwYXRoXSB0aGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIGRlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY3Jhd2xMZXZlbHNdIGZvbGRlcnMgdG8gY3Jhd2wgdG8gZmluZCBtb2R1bGVzIGZyb20gdGhlIGJhc2VQYXRoLiBkZWZhdWx0cyB0byA0XG4gKlxuICogQGNsYXNzIENsaVdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENsaVdyYXBwZXIge1xuICBwcml2YXRlIF9jb21tYW5kPzogQ29tbWFuZDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYmFzZVBhdGg6IHN0cmluZyA9IFwiLi9cIixcbiAgICBwcml2YXRlIGNyYXdsTGV2ZWxzID0gNFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSB7QGxpbmsgQ29tbWFuZH0gb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldCBjb21tYW5kKCkge1xuICAgIGlmICghdGhpcy5fY29tbWFuZCkge1xuICAgICAgdGhpcy5fY29tbWFuZCA9IG5ldyBDb21tYW5kKCk7XG4gICAgICBDTElVdGlscy5pbml0aWFsaXplKHRoaXMuX2NvbW1hbmQsIHRoaXMuYmFzZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tbWFuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gbG9hZHMgYW5kIHJlZ2lzdGVycyBtb2R1bGUgZnJvbSBhIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIHBhdGggdG8gbG9vayBmb3IgbW9kdWxlc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGggcmVwbyByb290IHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvblxuICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkKGZpbGVQYXRoOiBzdHJpbmcsIHJvb3RQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBuYW1lO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoZmlsZVBhdGgpO1xuICAgICAgbmFtZSA9IG1vZHVsZS5uYW1lO1xuICAgICAgY29uc3QgY21kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUoY21kLCBwYXRoLmRpcm5hbWUocm9vdFBhdGgpKTtcbiAgICAgIGxldCBtID0gbW9kdWxlKCk7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIFByb21pc2UpIG0gPSBhd2FpdCBtO1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gbTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtuYW1lIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBmaW5kcyBhbGwgdGhlIGNsaSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aCB2aWEge0BsaW5rIENsaVdyYXBwZXIuY3Jhd2x9XG4gICAqIGFuZCBsb2FkcyB0aGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGJvb3QoKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgdGhpcy5iYXNlUGF0aCk7XG4gICAgY29uc3QgbW9kdWxlcyA9IHRoaXMuY3Jhd2woYmFzZVBhdGgsIHRoaXMuY3Jhd2xMZXZlbHMpO1xuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcbiAgICAgIGlmIChtb2R1bGUuaW5jbHVkZXMoXCJAZGVjYWYtdHMvY2xpXCIpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IG5hbWU6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIG5hbWUgPSBhd2FpdCB0aGlzLmxvYWQobW9kdWxlLCBwcm9jZXNzLmN3ZCgpKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMuY29tbWFuZC5jb21tYW5kcy5maW5kKFxuICAgICAgICAgIChjKSA9PiAoYyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW1wiX25hbWVcIl0gPT09IG5hbWVcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29tbWFuZC5jb21tYW5kKG5hbWUpLmFkZENvbW1hbmQodGhpcy5tb2R1bGVzW25hbWVdKTtcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc29sZS5sb2coXG4gICAgICBgbG9hZGVkIG1vZHVsZXM6XFxuJHtPYmplY3Qua2V5cyh0aGlzLm1vZHVsZXMpXG4gICAgICAgIC5tYXAoKGspID0+IGAtICR7a31gKVxuICAgICAgICAuam9pbihcIlxcblwiKX1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gY3Jhd2xzIHRoZSBiYXNlUGF0aCB1cCBmb3IgJ2xldmVscycgZm9sZGVycyB0byBmaW5kIGEgbW9kdWxlLGVnIGEge0BsaW5rIENMSV9GSUxFX05BTUV9IG5hbWVkIGZpbGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIHRoZSByZWxhdGl2ZSBiYXNlIGJhdGNoIHRvIHN0YXJ0IHNlYXJjaGluZyBpblxuICAgKiBAcGFyYW0ge251bWJlcn0gW2xldmVsc10gdGhlIG1heCBudW1iZXIgb2YgbGV2ZWxzIHRvIGNyYXdsLiBkZWZhdWx0cyB0byAyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGNyYXdsKGJhc2VQYXRoOiBzdHJpbmcsIGxldmVsczogbnVtYmVyID0gMikge1xuICAgIGlmIChsZXZlbHMgPD0gMCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBmcy5yZWFkZGlyU3luYyhiYXNlUGF0aCkucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGZpbGUpID0+IHtcbiAgICAgIGZpbGUgPSBwYXRoLmpvaW4oYmFzZVBhdGgsIGZpbGUpO1xuICAgICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgYWNjdW0ucHVzaCguLi50aGlzLmNyYXdsKGZpbGUsIGxldmVscyAtIDEpKTtcbiAgICAgIH0gZWxzZSBpZiAoZmlsZS5tYXRjaChuZXcgUmVnRXhwKGAke0NMSV9GSUxFX05BTUV9LltjbV0/anMkYCwgXCJnbVwiKSkpIHtcbiAgICAgICAgYWNjdW0ucHVzaChmaWxlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIHJ1bnMgdGhlIGdpdmVuIGNvbW1hbmRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3NdIGFyZ3MgdG8gcnVuLiBkZWZhdWx0cyB0byBwcm9jZXNzLmFyZ3ZcbiAgICovXG4gIGFzeW5jIHJ1bihhcmdzOiBzdHJpbmdbXSA9IHByb2Nlc3MuYXJndikge1xuICAgIGF3YWl0IHRoaXMuYm9vdCgpO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmQucGFyc2VBc3luYyhhcmdzKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQ2xpV3JhcHBlclwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNhZi10cycgQ0xJIG1vZHVsZVxuICogQHN1bW1hcnkgVGhpcyBmaWxlIHdpbGwgY3Jhd2wgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZm9yIGZpbGVzIGNhbGxlZCB7QGxpbmsgQ0xJX0ZJTEVfTkFNRX1cbiAqIHdpdGhpbiB0aGUgQGRlY2FmLXRzIG5hbWVzcGFjZSBhbmQgbG9hZCB0aGVuIGFzIHN1YmNvbW1hbmRzXG4gKlxuICogQGV4YW1wbGVcbiAqIHJ1biBtb2R1bGUgY29tbWFuZCAgICAgLSAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBnZXQgbW9kdWxlIGhlbHAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+O1xuICogbGlzdCBpbXBvcnRlZCBtb2R1bGVzICAtICQgbnB4IGRlY2FmIGxpc3Q7XG4gKiBnZXQgY2xpIGhlbHAgICAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscDtcbiAqXG4gKiBAbW9kdWxlIENMSVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY2FmLXRzJyBDTEkgbmFtZXNwYWNlXG4gKiBAc3VtbWFyeSBUaGlzIGZpbGUgd2lsbCBjcmF3bCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgY2FsbGVkIHtAbGluayBDTElfRklMRV9OQU1FfVxuICogd2l0aGluIHRoZSBAZGVjYWYtdHMgbmFtZXNwYWNlIGFuZCBsb2FkIHRoZW4gYXMgc3ViY29tbWFuZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogcnVuIG1vZHVsZSBjb21tYW5kICAgICAtICQgbnB4IGRlY2FmIDxtb2R1bGUgbmFtZT4gPG1vZHVsZSBjb21tYW5kPiAuLi48bW9kdWxlIGNvbW1hbmQgb3B0aW9ucz5cbiAqIGdldCBtb2R1bGUgaGVscCAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwIDxtb2R1bGUgbmFtZT47XG4gKiBsaXN0IGltcG9ydGVkIG1vZHVsZXMgIC0gJCBucHggZGVjYWYgbGlzdDtcbiAqIGdldCBjbGkgaGVscCAgICAgICAgICAgLSAkIG5weCBkZWNhZiBoZWxwO1xuICpcbiAqIEBuYW1lc3BhY2UgY2xpXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkNMSVxuICovXG5cbi8qKlxuICogQHN1bW1hcnkgc3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvblxuICogQGRlc2NyaXB0aW9uIHRoaXMgaXMgaG93IHlvdSBzaG91bGQgZG9jdW1lbnQgYSBjb25zdGFudFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUdBOzs7Ozs7SUFNRztJQUNJLE1BQU0sYUFBYSxHQUFHLFlBQVk7O0lDTHpDOzs7OztJQUtHO1VBQ1UsUUFBUSxDQUFBO0lBQ25COzs7O0lBSUc7SUFDSCxJQUFBLGFBQWEsWUFBWSxDQUFDLElBQVksRUFBQTtJQUNwQyxRQUFBLElBQUk7Z0JBQ0YsT0FBTyxRQUFRLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7O1lBQzdDLE9BQU8sQ0FBVSxFQUFFO2dCQUNuQixNQUFNLElBQUksS0FBSyxDQUNiLENBQUEsb0JBQUEsRUFBdUIsSUFBSSxDQUFLLEVBQUEsRUFBQSxDQUFDLFlBQVksS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFFLENBQUEsQ0FDckU7OztJQUlMOzs7Ozs7O0lBT0c7SUFDSCxJQUFBLGFBQWEsZUFBZSxDQUFJLGFBQXlCLEVBQUE7O0lBRXZELFFBQUEsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUN2QixDQUFDLENBQVUsTUFBTyxDQUFvQixDQUFDLE9BQU8sSUFBSSxDQUFDLENBQU0sQ0FDMUQ7O0lBR0g7Ozs7O0lBS0c7SUFDSCxJQUFBLE9BQU8sVUFBVSxDQUFDLE9BQWdCLEVBQUUsUUFBZ0IsRUFBQTtZQUNsRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUMzQztpQkFDRyxJQUFJLENBQUMsSUFBSTtJQUNULGFBQUEsV0FBVyxDQUFDLENBQUEsS0FBQSxFQUFRLElBQUksQ0FBQSxpQkFBQSxDQUFtQjtpQkFDM0MsT0FBTyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7O0lBRy9DOzs7OztJQUtHO1FBQ0ssT0FB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
|
|
326
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9DbGlXcmFwcGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFRoZSBmaWxlbmFtZSB0aGF0IGlkZW50aWZpZXMgRGVjYWYgQ0xJIG1vZHVsZXNcbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBmaWxlbmFtZSBmb3IgQ0xJIG1vZHVsZSBmaWxlcyB3aGVyZSBlYWNoIGxpYnJhcnkgbXVzdCBleHBvcnQgYSBzaW5nbGUgQ2xpTW9kdWxlIGZ1bmN0aW9uXG4gKlxuICogQGNvbnN0IENMSV9GSUxFX05BTUVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBDTElfRklMRV9OQU1FID0gXCJjbGktbW9kdWxlXCI7XG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCJjb21tYW5kZXJcIjtcbmltcG9ydCB7IENsaU1vZHVsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgY2xhc3MgZm9yIENMSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBBIHN0YXRpYyB1dGlsaXR5IGNsYXNzIHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgbG9hZGluZyBtb2R1bGVzLCByZXRyaWV2aW5nIHBhY2thZ2UgaW5mb3JtYXRpb24sIGFuZCBpbml0aWFsaXppbmcgQ0xJIGNvbW1hbmRzXG4gKiBcbiAqIEBleGFtcGxlXG4gKiAvLyBJbml0aWFsaXplIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gKiBjb25zdCBjb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAqIENMSVV0aWxzLmluaXRpYWxpemUoY29tbWFuZCwgJy4vcGF0aC90by9wYWNrYWdlJyk7XG4gKiBcbiAqIC8vIExvYWQgYSBDTEkgbW9kdWxlIGZyb20gYSBmaWxlXG4gKiBjb25zdCBtb2R1bGUgPSBhd2FpdCBDTElVdGlscy5sb2FkRnJvbUZpbGUoJy4vcGF0aC90by9jbGktbW9kdWxlLmpzJyk7XG4gKiBcbiAqIEBjbGFzcyBDTElVdGlsc1xuICovXG5leHBvcnQgY2xhc3MgQ0xJVXRpbHMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIER5bmFtaWNhbGx5IGltcG9ydHMgYSBtb2R1bGUgZmlsZVxuICAgKiBAc3VtbWFyeSBMb2FkcyBhIEphdmFTY3JpcHQgZmlsZSBhbmQgcmV0dXJucyBpdCBhcyBhIENsaU1vZHVsZSwgaGFuZGxpbmcgYm90aCBFU00gYW5kIENvbW1vbkpTIGZvcm1hdHNcbiAgICogXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBmaWxlIHBhdGggdG8gdGhlIG1vZHVsZSB0byBsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Q2xpTW9kdWxlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxvYWRlZCBDbGlNb2R1bGVcbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkRnJvbUZpbGUocGF0aDogc3RyaW5nKTogUHJvbWlzZTxDbGlNb2R1bGU+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIENMSVV0aWxzLm5vcm1hbGl6ZUltcG9ydChpbXBvcnQocGF0aCkpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byBsb2FkIGZyb20gJHtwYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBOb3JtYWxpemVzIG1vZHVsZSBpbXBvcnRzIHRvIGhhbmRsZSBib3RoIEVTTSBhbmQgQ29tbW9uSlMgZm9ybWF0c1xuICAgKiBAc3VtbWFyeSBQcm9wZXJseSBpbXBvcnRzIEphdmFTY3JpcHQgZmlsZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBtb2R1bGUgZm9ybWF0IGJ5IGhhbmRsaW5nIHRoZSBFU00gd3JhcHBlciBmb3IgQ29tbW9uSlMgbW9kdWxlc1xuICAgKlxuICAgKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW1wb3J0ZWQgbW9kdWxlXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxUPn0gaW1wb3J0UHJvbWlzZSBUaGUgcHJvbWlzZSByZXR1cm5lZCBieSB0aGUgZHluYW1pYyBpbXBvcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxUPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5vcm1hbGl6ZWQgbW9kdWxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgbm9ybWFsaXplSW1wb3J0PFQ+KGltcG9ydFByb21pc2U6IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAvLyBDb21tb25KUydzIGBtb2R1bGUuZXhwb3J0c2AgaXMgd3JhcHBlZCBhcyBgZGVmYXVsdGAgaW4gRVNNb2R1bGUuXG4gICAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbihcbiAgICAgIChtOiB1bmtub3duKSA9PiAoKG0gYXMgeyBkZWZhdWx0OiBUIH0pLmRlZmF1bHQgfHwgbSkgYXMgVFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgQ29tbWFuZCBvYmplY3Qgd2l0aCBwYWNrYWdlIGluZm9ybWF0aW9uXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgYSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3Qgd2l0aCB0aGUgcGFja2FnZSBuYW1lLCBkZXNjcmlwdGlvbiwgYW5kIHZlcnNpb24gZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kIFRoZSBDb21tYW5kIG9iamVjdCB0byBpbml0aWFsaXplXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZVBhdGhdIFRoZSBiYXNlIHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQsIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShjb21tYW5kOiBDb21tYW5kLCBiYXNlUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3QgbmFtZSA9IENMSVV0aWxzLnBhY2thZ2VOYW1lKGJhc2VQYXRoKTtcbiAgICBjb21tYW5kXG4gICAgICAubmFtZShuYW1lKVxuICAgICAgLmRlc2NyaXB0aW9uKGBSdW5zICR7bmFtZX0gcmVsYXRlZCBjb21tYW5kc2ApXG4gICAgICAudmVyc2lvbihDTElVdGlscy5wYWNrYWdlVmVyc2lvbihiYXNlUGF0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGVcbiAgICogQHN1bW1hcnkgUmVhZHMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBwYXJzZXMgaXQgaW50byBhIEphdmFTY3JpcHQgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUaGUgcGFyc2VkIHBhY2thZ2UuanNvbiBjb250ZW50IGFzIGFuIG9iamVjdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UGFja2FnZShiYXNlUGF0aDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihiYXNlUGF0aCwgXCJwYWNrYWdlLmpzb25cIiksIFwidXRmOFwiKVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZWFkIHZlcnNpb24gZnJvbSAke2Jhc2VQYXRofTogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgdmVyc2lvbiBzdHJpbmdcbiAgICovXG4gIHN0YXRpYyBwYWNrYWdlVmVyc2lvbihiYXNlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJ2ZXJzaW9uXCJdIGFzIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB0aGUgbmFtZSBmcm9tIHBhY2thZ2UuanNvblxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWUgZmllbGQgZnJvbSB0aGUgcGFja2FnZS5qc29uIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCBleHRyYWN0cyB0aGUgcGFja2FnZSBuYW1lIHdpdGhvdXQgdGhlIHNjb3BlXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlUGF0aCBUaGUgYmFzZSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhY2thZ2UgbmFtZSB3aXRob3V0IHRoZSBzY29wZSAoZS5nLiwgXCJjbGlcIiBmcm9tIFwiQGRlY2FmLXRzL2NsaVwiKVxuICAgKi9cbiAgc3RhdGljIHBhY2thZ2VOYW1lKGJhc2VQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSAoQ0xJVXRpbHMuZ2V0UGFja2FnZShiYXNlUGF0aClbXCJuYW1lXCJdIGFzIHN0cmluZykuc3BsaXQoXCIvXCIpO1xuICAgIHJldHVybiBuYW1lW25hbWUubGVuZ3RoIC0gMV07XG4gIH1cbn1cbiIsImltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ0xJX0ZJTEVfTkFNRSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ0xJVXRpbHMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGNsYXNzIHRvIGhhbmRsZSBDTEkgZnVuY3Rpb25hbGl0eSBmcm9tIGFsbCBEZWNhZiBtb2R1bGVzXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgQ29tbWFuZGVyLmpzIHRvIGhhbmRsZSBDTEkgY29tbWFuZHMgZnJvbSBkaWZmZXJlbnQgRGVjYWYgbW9kdWxlcy5cbiAqIEl0IGNyYXdscyB0aGUgZmlsZXN5c3RlbSB0byBmaW5kIENMSSBtb2R1bGVzLCBsb2FkcyB0aGVtLCBhbmQgcmVnaXN0ZXJzIHRoZWlyIGNvbW1hbmRzLlxuICogXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VQYXRoXSBUaGUgYmFzZSBwYXRoIHRvIGxvb2sgZm9yIG1vZHVsZXMgaW4uIERlZmF1bHRzIHRvIGAuL2BcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY3Jhd2xMZXZlbHNdIE51bWJlciBvZiBmb2xkZXIgbGV2ZWxzIHRvIGNyYXdsIHRvIGZpbmQgbW9kdWxlcyBmcm9tIHRoZSBiYXNlUGF0aC4gRGVmYXVsdHMgdG8gNFxuICogXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IENMSSB3cmFwcGVyIGFuZCBydW4gaXQgd2l0aCBjdXN0b20gb3B0aW9uc1xuICogY29uc3QgY2xpID0gbmV3IENsaVdyYXBwZXIoJy4vc3JjJywgMik7XG4gKiBjbGkucnVuKHByb2Nlc3MuYXJndikudGhlbigoKSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdDTEkgY29tbWFuZHMgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gKiB9KTtcbiAqIFxuICogQGNsYXNzIENsaVdyYXBwZXJcbiAqL1xuZXhwb3J0IGNsYXNzIENsaVdyYXBwZXIge1xuICBwcml2YXRlIF9jb21tYW5kPzogQ29tbWFuZDtcbiAgcHJpdmF0ZSBtb2R1bGVzOiBSZWNvcmQ8c3RyaW5nLCBDb21tYW5kPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJvb3RQYXRoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBiYXNlUGF0aDogc3RyaW5nID0gXCIuL1wiLFxuICAgIHByaXZhdGUgY3Jhd2xMZXZlbHMgPSA0XG4gICkge1xuICAgIHRoaXMucm9vdFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCBcIi4uXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBDb21tYW5kZXIgQ29tbWFuZCBvYmplY3RcbiAgICogQHN1bW1hcnkgTGF6eS1sb2FkcyB0aGUgQ29tbWFuZCBvYmplY3QsIGluaXRpYWxpemluZyBpdCB3aXRoIHRoZSBwYWNrYWdlIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgdmVyc2lvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBUaGUgaW5pdGlhbGl6ZWQgQ29tbWFuZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZ2V0IGNvbW1hbmQoKSB7XG4gICAgaWYgKCF0aGlzLl9jb21tYW5kKSB7XG4gICAgICB0aGlzLl9jb21tYW5kID0gbmV3IENvbW1hbmQoKTtcbiAgICAgIENMSVV0aWxzLmluaXRpYWxpemUodGhpcy5fY29tbWFuZCwgdGhpcy5yb290UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb21tYW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2FkcyBhbmQgcmVnaXN0ZXJzIGEgbW9kdWxlIGZyb20gYSBmaWxlXG4gICAqIEBzdW1tYXJ5IER5bmFtaWNhbGx5IGltcG9ydHMgYSBDTEkgbW9kdWxlIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIHBhdGgsIGluaXRpYWxpemVzIGl0LCBhbmQgcmVnaXN0ZXJzIGl0IGluIHRoZSBtb2R1bGVzIGNvbGxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVQYXRoIFBhdGggdG8gdGhlIG1vZHVsZSBmaWxlIHRvIGxvYWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoIFJlcG9zaXRvcnkgcm9vdCBwYXRoIHRvIGZpbmQgdGhlIHBhY2thZ2UuanNvblxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBtb2R1bGUgbmFtZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGlXcmFwcGVyXG4gICAqICAgcGFydGljaXBhbnQgQ0xJVXRpbHNcbiAgICogICBwYXJ0aWNpcGFudCBNb2R1bGVcbiAgICogICBcbiAgICogICBDbGlXcmFwcGVyLT4+Q0xJVXRpbHM6IGxvYWRGcm9tRmlsZShmaWxlUGF0aClcbiAgICogICBDTElVdGlscy0tPj5DbGlXcmFwcGVyOiBtb2R1bGVcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogR2V0IG1vZHVsZSBuYW1lXG4gICAqICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IG5ldyBDb21tYW5kKClcbiAgICogICBDb21tYW5kLS0+PkNsaVdyYXBwZXI6IGNtZFxuICAgKiAgIENsaVdyYXBwZXItPj5DTElVdGlsczogaW5pdGlhbGl6ZShjbWQsIHBhdGguZGlybmFtZShyb290UGF0aCkpXG4gICAqICAgQ2xpV3JhcHBlci0+Pk1vZHVsZTogbW9kdWxlKClcbiAgICogICBOb3RlIG92ZXIgQ2xpV3JhcHBlcixNb2R1bGU6IEhhbmRsZSBQcm9taXNlIGlmIG5lZWRlZFxuICAgKiAgIE1vZHVsZS0tPj5DbGlXcmFwcGVyOiBDb21tYW5kIGluc3RhbmNlXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IFN0b3JlIGluIG1vZHVsZXNbbmFtZV1cbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaVdyYXBwZXI6IFJldHVybiBuYW1lXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWQoZmlsZVBhdGg6IHN0cmluZywgcm9vdFBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IG5hbWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IENMSVV0aWxzLmxvYWRGcm9tRmlsZShmaWxlUGF0aCk7XG4gICAgICBuYW1lID0gbW9kdWxlLm5hbWU7XG4gICAgICBjb25zdCBjbWQgPSBuZXcgQ29tbWFuZCgpO1xuICAgICAgQ0xJVXRpbHMuaW5pdGlhbGl6ZShjbWQsIHJvb3RQYXRoKTtcbiAgICAgIGxldCBtID0gbW9kdWxlKCk7XG4gICAgICBpZiAobSBpbnN0YW5jZW9mIFByb21pc2UpIG0gPSBhd2FpdCBtO1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gbTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gbG9hZCBtb2R1bGUgJHtuYW1lIHx8IFwidW5uYW1lZFwifSB1bmRlciAke2ZpbGVQYXRofTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGaW5kcyBhbmQgbG9hZHMgYWxsIENMSSBtb2R1bGVzIGluIHRoZSBiYXNlUGF0aFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBjcmF3bCBtZXRob2QgdG8gZmluZCBhbGwgQ0xJIG1vZHVsZXMgaW4gdGhlIHNwZWNpZmllZCBiYXNlIHBhdGgsIFxuICAgKiB0aGVuIGxvYWRzIGFuZCByZWdpc3RlcnMgZWFjaCBtb2R1bGUgYXMgYSBzdWJjb21tYW5kXG4gICAqIFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBtb2R1bGVzIGFyZSBsb2FkZWRcbiAgICogXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBGaWxlc3lzdGVtXG4gICAqICAgcGFydGljaXBhbnQgTW9kdWxlXG4gICAqICAgXG4gICAqICAgQ2xpV3JhcHBlci0+PkZpbGVzeXN0ZW06IEpvaW4gYmFzZVBhdGggd2l0aCBjd2RcbiAgICogICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogY3Jhd2woYmFzZVBhdGgsIGNyYXdsTGV2ZWxzKVxuICAgKiAgIENsaVdyYXBwZXItLT4+Q2xpV3JhcHBlcjogbW9kdWxlc1tdXG4gICAqICAgbG9vcCBGb3IgZWFjaCBtb2R1bGVcbiAgICogICAgIGFsdCBOb3QgQGRlY2FmLXRzL2NsaVxuICAgKiAgICAgICBDbGlXcmFwcGVyLT4+Q2xpV3JhcHBlcjogbG9hZChtb2R1bGUsIGN3ZClcbiAgICogICAgICAgQ2xpV3JhcHBlci0tPj5DbGlXcmFwcGVyOiBuYW1lXG4gICAqICAgICAgIENsaVdyYXBwZXItPj5DbGlXcmFwcGVyOiBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgKiAgICAgICBhbHQgQ29tbWFuZCBkb2Vzbid0IGV4aXN0XG4gICAqICAgICAgICAgQ2xpV3JhcHBlci0+PkNvbW1hbmQ6IGNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZChtb2R1bGVzW25hbWVdKVxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIENsaVdyYXBwZXItPj5Db25zb2xlOiBMb2cgbG9hZGVkIG1vZHVsZXNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYm9vdCgpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGgucmVzb2x2ZSh0aGlzLnJvb3RQYXRoLCB0aGlzLmJhc2VQYXRoKTtcbiAgICBjb25zdCBtb2R1bGVzID0gdGhpcy5jcmF3bChiYXNlUGF0aCwgdGhpcy5jcmF3bExldmVscyk7XG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuICAgICAgaWYgKG1vZHVsZS5pbmNsdWRlcyhcIkBkZWNhZi10cy9jbGlcIikpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbmFtZSA9IGF3YWl0IHRoaXMubG9hZChtb2R1bGUsIHRoaXMucm9vdFBhdGgpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAhdGhpcy5jb21tYW5kLmNvbW1hbmRzLmZpbmQoXG4gICAgICAgICAgKGMpID0+IChjIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPilbXCJfbmFtZVwiXSA9PT0gbmFtZVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5jb21tYW5kLmNvbW1hbmQobmFtZSkuYWRkQ29tbWFuZCh0aGlzLm1vZHVsZXNbbmFtZV0pO1xuICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBsb2FkZWQgbW9kdWxlczpcXG4ke09iamVjdC5rZXlzKHRoaXMubW9kdWxlcylcbiAgICAgICAgLm1hcCgoaykgPT4gYC0gJHtrfWApXG4gICAgICAgIC5qb2luKFwiXFxuXCIpfWBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgQ0xJIG1vZHVsZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZVxuICAgKiBAc3VtbWFyeSBDcmF3bHMgdGhlIGJhc2VQYXRoIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGZvbGRlciBsZXZlbHMgdG8gZmluZCBmaWxlcyBuYW1lZCBhY2NvcmRpbmcgdG8gQ0xJX0ZJTEVfTkFNRVxuICAgKiBcbiAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VQYXRoIFRoZSBhYnNvbHV0ZSBiYXNlIHBhdGggdG8gc3RhcnQgc2VhcmNoaW5nIGluXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGV2ZWxzPTJdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaXJlY3RvcnkgbGV2ZWxzIHRvIGNyYXdsXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBmaWxlIHBhdGhzIHRvIENMSSBtb2R1bGVzXG4gICAqIFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjcmF3bChiYXNlUGF0aDogc3RyaW5nLCBsZXZlbHM6IG51bWJlciA9IDIpIHtcbiAgICBpZiAobGV2ZWxzIDw9IDApIHJldHVybiBbXTtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoYmFzZVBhdGgpLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBmaWxlKSA9PiB7XG4gICAgICBmaWxlID0gcGF0aC5qb2luKGJhc2VQYXRoLCBmaWxlKTtcbiAgICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goLi4udGhpcy5jcmF3bChmaWxlLCBsZXZlbHMgLSAxKSk7XG4gICAgICB9IGVsc2UgaWYgKGZpbGUubWF0Y2gobmV3IFJlZ0V4cChgJHtDTElfRklMRV9OQU1FfS5bY21dP2pzJGAsIFwiZ21cIikpKSB7XG4gICAgICAgIGFjY3VtLnB1c2goZmlsZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgQ0xJIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50c1xuICAgKiBAc3VtbWFyeSBCb290cyB0aGUgQ0xJIGJ5IGxvYWRpbmcgYWxsIG1vZHVsZXMsIHRoZW4gcGFyc2VzIGFuZCBleGVjdXRlcyB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gdGhlIGFyZ3VtZW50c1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncz1wcm9jZXNzLmFyZ3ZdIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gcGFyc2UgYW5kIGV4ZWN1dGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBleGVjdXRpb24gaXMgY29tcGxldGVcbiAgICogXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IENsaVdyYXBwZXJcbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgXG4gICAqICAgQ2xpZW50LT4+Q2xpV3JhcHBlcjogcnVuKGFyZ3MpXG4gICAqICAgQ2xpV3JhcHBlci0+PkNsaVdyYXBwZXI6IGJvb3QoKVxuICAgKiAgIE5vdGUgb3ZlciBDbGlXcmFwcGVyOiBMb2FkcyBhbGwgbW9kdWxlc1xuICAgKiAgIENsaVdyYXBwZXItPj5Db21tYW5kOiBwYXJzZUFzeW5jKGFyZ3MpXG4gICAqICAgQ29tbWFuZC0tPj5DbGlXcmFwcGVyOiByZXN1bHRcbiAgICogICBDbGlXcmFwcGVyLS0+PkNsaWVudDogcmVzdWx0XG4gICAqL1xuICBhc3luYyBydW4oYXJnczogc3RyaW5nW10gPSBwcm9jZXNzLmFyZ3YpIHtcbiAgICBhd2FpdCB0aGlzLmJvb3QoKTtcbiAgICByZXR1cm4gdGhpcy5jb21tYW5kLnBhcnNlQXN5bmMoYXJncyk7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL0NsaVdyYXBwZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjYWYtdHMnIENMSSBtb2R1bGVcbiAqIEBzdW1tYXJ5IFRoaXMgZmlsZSB3aWxsIGNyYXdsIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGZvciBmaWxlcyBjYWxsZWQge0BsaW5rIENMSV9GSUxFX05BTUV9XG4gKiB3aXRoaW4gdGhlIEBkZWNhZi10cyBuYW1lc3BhY2UgYW5kIGxvYWQgdGhlbSBhcyBzdWJjb21tYW5kcy4gSXQgc2VydmVzIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50XG4gKiBmb3IgdGhlIENMSSBmdW5jdGlvbmFsaXR5LCBleHBvcnRpbmcgdGhlIENsaVdyYXBwZXIgY2xhc3MgYW5kIFZFUlNJT04gY29uc3RhbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIHJ1biBtb2R1bGUgY29tbWFuZCAgICAgLSAkIG5weCBkZWNhZiA8bW9kdWxlIG5hbWU+IDxtb2R1bGUgY29tbWFuZD4gLi4uPG1vZHVsZSBjb21tYW5kIG9wdGlvbnM+XG4gKiBnZXQgbW9kdWxlIGhlbHAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscCA8bW9kdWxlIG5hbWU+O1xuICogbGlzdCBpbXBvcnRlZCBtb2R1bGVzICAtICQgbnB4IGRlY2FmIGxpc3Q7XG4gKiBnZXQgY2xpIGhlbHAgICAgICAgICAgIC0gJCBucHggZGVjYWYgaGVscDtcbiAqXG4gKiBAbW9kdWxlIENMSVxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBzdW1tYXJ5IEEgY29uc3RhbnQgdGhhdCBob2xkcyB0aGUgdmVyc2lvbiBzdHJpbmcgb2YgdGhlIHBhY2thZ2UsIHdoaWNoIGlzIHJlcGxhY2VkIGR1cmluZyBidWlsZFxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6Q0xJXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmQiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUdBOzs7Ozs7SUFNRztJQUNJLE1BQU0sYUFBYSxHQUFHLFlBQVk7O0lDTHpDOzs7Ozs7Ozs7Ozs7O0lBYUc7VUFDVSxRQUFRLENBQUE7SUFDbkI7Ozs7OztJQU1HO0lBQ0gsSUFBQSxhQUFhLFlBQVksQ0FBQyxJQUFZLEVBQUE7SUFDcEMsUUFBQSxJQUFJO2dCQUNGLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDOztZQUM3QyxPQUFPLENBQVUsRUFBRTtnQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FDYixDQUFBLG9CQUFBLEVBQXVCLElBQUksQ0FBSyxFQUFBLEVBQUEsQ0FBQyxZQUFZLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBRSxDQUFBLENBQ3JFOzs7SUFJTDs7Ozs7Ozs7SUFRRztJQUNILElBQUEsYUFBYSxlQUFlLENBQUksYUFBeUIsRUFBQTs7SUFFdkQsUUFBQSxPQUFPLGFBQWEsQ0FBQyxJ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
|