@decohere/flux 0.0.1-dev.81 → 0.0.1-dev.83

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.
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "flux", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return flux;
9
+ }
10
+ });
11
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
12
+ const _hotreloadserver = require("./hot-reload-server.js");
13
+ const _sourcemoduleloader = require("./source-module-loader.js");
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ /** Process-level one-shot loader so a second `run()` reconfigures instead of stacking hooks. */ const runLoader = new _sourcemoduleloader.SourceModuleLoader();
20
+ async function run(entry, options = {}) {
21
+ const trimmed = entry.trim();
22
+ if (trimmed == null || trimmed === "") {
23
+ throw new Error("flux.run requires an entry file path");
24
+ }
25
+ const absoluteEntry = _nodepath.default.resolve(trimmed);
26
+ await runLoader.configure({
27
+ workspace: options.workspace,
28
+ buildConfig: options.configuration ?? "debug"
29
+ });
30
+ runLoader.registerHooks();
31
+ process.argv = [
32
+ process.execPath,
33
+ absoluteEntry,
34
+ ...options.args ?? []
35
+ ];
36
+ return runLoader.importEntry(absoluteEntry);
37
+ }
38
+ async function serve(options = {}) {
39
+ const server = new _hotreloadserver.HotReloadServer();
40
+ await server.start({
41
+ buildConfig: options.configuration ?? "debug",
42
+ project: options.project,
43
+ projects: options.projects,
44
+ workspace: options.workspace,
45
+ rebootDebounceMs: options.rebootDebounceMs
46
+ });
47
+ return server;
48
+ }
49
+ function dispose() {
50
+ runLoader.dispose();
51
+ }
52
+ const flux = {
53
+ run,
54
+ serve,
55
+ dispose
56
+ };
57
+
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBGbHV4UnVuT3B0aW9ucyA9IHtcblx0LyoqIE1lc2gvRm9yZ2UgY29uZmlndXJhdGlvbiBuYW1lLiBEZWZhdWx0cyB0byBgZGVidWdgIChgLS1jb25maWd1cmF0aW9uYCkuICovXG5cdGNvbmZpZ3VyYXRpb24/OiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0ZWFkIG9mIGBXb3Jrc3BhY2VGYWN0b3J5YC5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIHNraXAgZmlsZXN5c3RlbSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59O1xuXG5leHBvcnQgdHlwZSBGbHV4U2VydmVPcHRpb25zID0ge1xuXHQvKiogTWVzaC9Gb3JnZSBjb25maWd1cmF0aW9uIG5hbWUuIERlZmF1bHRzIHRvIGBkZWJ1Z2AgKGAtLWNvbmZpZ3VyYXRpb25gKS4gKi9cblx0Y29uZmlndXJhdGlvbj86IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBNdWx0aXBsZSBGbHV4IGFwcCBwYWNrYWdlIG5hbWVzIHRvIGJvb3QgaW4gb25lIHByb2Nlc3MgKGRpcmVjdG9yeSBzbGljZSkuXG5cdCAqIFdoZW4gc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIge0BsaW5rIHByb2plY3R9LlxuXHQgKi9cblx0cHJvamVjdHM/OiByZWFkb25seSBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGVhZCBvZiBgV29ya3NwYWNlRmFjdG9yeWAuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBza2lwIGZpbGVzeXN0ZW0gZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbi8qKiBQcm9jZXNzLWxldmVsIG9uZS1zaG90IGxvYWRlciBzbyBhIHNlY29uZCBgcnVuKClgIHJlY29uZmlndXJlcyBpbnN0ZWFkIG9mIHN0YWNraW5nIGhvb2tzLiAqL1xuY29uc3QgcnVuTG9hZGVyID0gbmV3IFNvdXJjZU1vZHVsZUxvYWRlcigpO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oZW50cnk6IHN0cmluZywgb3B0aW9uczogRmx1eFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCB0cmltbWVkID0gZW50cnkudHJpbSgpO1xuXHRpZiAodHJpbW1lZCA9PSBudWxsIHx8IHRyaW1tZWQgPT09IFwiXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4LnJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdH1cblxuXHRjb25zdCBhYnNvbHV0ZUVudHJ5ID0gcGF0aC5yZXNvbHZlKHRyaW1tZWQpO1xuXHRhd2FpdCBydW5Mb2FkZXIuY29uZmlndXJlKHtcblx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gPz8gXCJkZWJ1Z1wiLFxuXHR9KTtcblx0cnVuTG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0cHJvY2Vzcy5hcmd2ID0gW3Byb2Nlc3MuZXhlY1BhdGgsIGFic29sdXRlRW50cnksIC4uLihvcHRpb25zLmFyZ3MgPz8gW10pXTtcblx0cmV0dXJuIHJ1bkxvYWRlci5pbXBvcnRFbnRyeShhYnNvbHV0ZUVudHJ5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VydmUob3B0aW9uczogRmx1eFNlcnZlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxIb3RSZWxvYWRTZXJ2ZXI+IHtcblx0Y29uc3Qgc2VydmVyID0gbmV3IEhvdFJlbG9hZFNlcnZlcigpO1xuXHRhd2FpdCBzZXJ2ZXIuc3RhcnQoe1xuXHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gPz8gXCJkZWJ1Z1wiLFxuXHRcdHByb2plY3Q6IG9wdGlvbnMucHJvamVjdCxcblx0XHRwcm9qZWN0czogb3B0aW9ucy5wcm9qZWN0cyxcblx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdHJlYm9vdERlYm91bmNlTXM6IG9wdGlvbnMucmVib290RGVib3VuY2VNcyxcblx0fSk7XG5cdHJldHVybiBzZXJ2ZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG5cdHJ1bkxvYWRlci5kaXNwb3NlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBmbHV4ID0geyBydW4sIHNlcnZlLCBkaXNwb3NlIH07XG4iXSwibmFtZXMiOlsiZmx1eCIsInJ1bkxvYWRlciIsIlNvdXJjZU1vZHVsZUxvYWRlciIsInJ1biIsImVudHJ5Iiwib3B0aW9ucyIsInRyaW1tZWQiLCJ0cmltIiwiRXJyb3IiLCJhYnNvbHV0ZUVudHJ5IiwicGF0aCIsInJlc29sdmUiLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWdpc3Rlckhvb2tzIiwicHJvY2VzcyIsImFyZ3YiLCJleGVjUGF0aCIsImFyZ3MiLCJpbXBvcnRFbnRyeSIsInNlcnZlIiwic2VydmVyIiwiSG90UmVsb2FkU2VydmVyIiwic3RhcnQiLCJwcm9qZWN0IiwicHJvamVjdHMiLCJyZWJvb3REZWJvdW5jZU1zIiwiZGlzcG9zZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwRWFBOzs7ZUFBQUE7OztpRUExRUk7aUNBRWU7b0NBQ0c7Ozs7OztBQW9DbkMsOEZBQThGLEdBQzlGLE1BQU1DLFlBQVksSUFBSUMsc0NBQWtCO0FBRXhDLGVBQWVDLElBQUlDLEtBQWEsRUFBRUMsVUFBMEIsQ0FBQyxDQUFDO0lBQzdELE1BQU1DLFVBQVVGLE1BQU1HLElBQUk7SUFDMUIsSUFBSUQsV0FBVyxRQUFRQSxZQUFZLElBQUk7UUFDdEMsTUFBTSxJQUFJRSxNQUFNO0lBQ2pCO0lBRUEsTUFBTUMsZ0JBQWdCQyxpQkFBSSxDQUFDQyxPQUFPLENBQUNMO0lBQ25DLE1BQU1MLFVBQVVXLFNBQVMsQ0FBQztRQUN6QkMsV0FBV1IsUUFBUVEsU0FBUztRQUM1QkMsYUFBYVQsUUFBUVUsYUFBYSxJQUFJO0lBQ3ZDO0lBQ0FkLFVBQVVlLGFBQWE7SUFDdkJDLFFBQVFDLElBQUksR0FBRztRQUFDRCxRQUFRRSxRQUFRO1FBQUVWO1dBQW1CSixRQUFRZSxJQUFJLElBQUksRUFBRTtLQUFFO0lBQ3pFLE9BQU9uQixVQUFVb0IsV0FBVyxDQUFDWjtBQUM5QjtBQUVBLGVBQWVhLE1BQU1qQixVQUE0QixDQUFDLENBQUM7SUFDbEQsTUFBTWtCLFNBQVMsSUFBSUMsZ0NBQWU7SUFDbEMsTUFBTUQsT0FBT0UsS0FBSyxDQUFDO1FBQ2xCWCxhQUFhVCxRQUFRVSxhQUFhLElBQUk7UUFDdENXLFNBQVNyQixRQUFRcUIsT0FBTztRQUN4QkMsVUFBVXRCLFFBQVFzQixRQUFRO1FBQzFCZCxXQUFXUixRQUFRUSxTQUFTO1FBQzVCZSxrQkFBa0J2QixRQUFRdUIsZ0JBQWdCO0lBQzNDO0lBQ0EsT0FBT0w7QUFDUjtBQUVBLFNBQVNNO0lBQ1I1QixVQUFVNEIsT0FBTztBQUNsQjtBQUVPLE1BQU03QixPQUFPO0lBQUVHO0lBQUttQjtJQUFPTztBQUFRIn0=
@@ -15,7 +15,6 @@ const _fluxcommand = require("./flux.command.js");
15
15
  const _hotreloadserver = require("./hot-reload-server.js");
16
16
  const _runaction = require("./run.action.js");
17
17
  const _serveaction = require("./serve.action.js");
18
- const _sourcemoduleloader = require("./source-module-loader.js");
19
18
  class FluxModule extends _cli.ModuleManifest {
20
19
  id = "flux";
21
20
  command = _fluxcommand.FluxCommand;
@@ -24,7 +23,6 @@ class FluxModule extends _cli.ModuleManifest {
24
23
  run: _runaction.RunAction
25
24
  };
26
25
  registerServices(builder) {
27
- builder.registerSingleton(_sourcemoduleloader.SourceModuleLoader);
28
26
  builder.registerSingleton(_hotreloadserver.HotReloadServer);
29
27
  builder.registerSingleton(_deferredscriptrunner.DeferredScriptRunner);
30
28
  }
@@ -35,4 +33,4 @@ class FluxModule extends _cli.ModuleManifest {
35
33
  }
36
34
  }
37
35
 
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG5pbXBvcnQgeyBGbHV4Q29tbWFuZCB9IGZyb20gXCIuL2ZsdXguY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRmx1eE1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJmbHV4XCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gRmx1eENvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBTZXJ2ZUFjdGlvbixcblx0XHRydW46IFJ1bkFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlcyhidWlsZGVyOiBDb250YWluZXJCdWlsZGVyKSB7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihTb3VyY2VNb2R1bGVMb2FkZXIpO1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oSG90UmVsb2FkU2VydmVyKTtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKERlZmVycmVkU2NyaXB0UnVubmVyKTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMpIHtcblx0XHRyZXR1cm4gV29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyBjb25maWdGaWxlOiBvcHRpb25zLmNvbmZpZ0ZpbGUgfSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJGbHV4TW9kdWxlIiwiTW9kdWxlTWFuaWZlc3QiLCJpZCIsImNvbW1hbmQiLCJGbHV4Q29tbWFuZCIsImFjdGlvbnMiLCJzZXJ2ZSIsIlNlcnZlQWN0aW9uIiwicnVuIiwiUnVuQWN0aW9uIiwicmVnaXN0ZXJTZXJ2aWNlcyIsImJ1aWxkZXIiLCJyZWdpc3RlclNpbmdsZXRvbiIsIlNvdXJjZU1vZHVsZUxvYWRlciIsIkhvdFJlbG9hZFNlcnZlciIsIkRlZmVycmVkU2NyaXB0UnVubmVyIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsIldvcmtzcGFjZUZhY3RvcnkiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiOzs7OytCQVdhQTs7O2VBQUFBOzs7c0JBWG9CO3FCQUVGO3NDQUVNOzZCQUNUO2lDQUNJOzJCQUNOOzZCQUNFO29DQUNPO0FBRTVCLE1BQU1BLG1CQUFtQkMsbUJBQWM7SUFDN0JDLEtBQUssT0FBTztJQUNaQyxVQUFVQyx3QkFBVyxDQUFDO0lBQ3RCQyxVQUFVO1FBQ3pCQyxPQUFPQyx3QkFBVztRQUNsQkMsS0FBS0Msb0JBQVM7SUFDZixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUNDLHNDQUFrQjtRQUM1Q0YsUUFBUUMsaUJBQWlCLENBQUNFLGdDQUFlO1FBQ3pDSCxRQUFRQyxpQkFBaUIsQ0FBQ0csMENBQW9CO0lBQy9DO0lBRWdCQyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT0Msc0JBQWdCLENBQUNDLE1BQU0sQ0FBQztZQUFFQyxZQUFZSCxRQUFRRyxVQUFVO1FBQUM7SUFDakU7QUFDRCJ9
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG5pbXBvcnQgeyBGbHV4Q29tbWFuZCB9IGZyb20gXCIuL2ZsdXguY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBGbHV4TW9kdWxlIGV4dGVuZHMgTW9kdWxlTWFuaWZlc3Qge1xuXHRwdWJsaWMgcmVhZG9ubHkgaWQgPSBcImZsdXhcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBGbHV4Q29tbWFuZDtcblx0cHVibGljIHJlYWRvbmx5IGFjdGlvbnMgPSB7XG5cdFx0c2VydmU6IFNlcnZlQWN0aW9uLFxuXHRcdHJ1bjogUnVuQWN0aW9uLFxuXHR9O1xuXG5cdHB1YmxpYyByZWdpc3RlclNlcnZpY2VzKGJ1aWxkZXI6IENvbnRhaW5lckJ1aWxkZXIpIHtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKEhvdFJlbG9hZFNlcnZlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihEZWZlcnJlZFNjcmlwdFJ1bm5lcik7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0cmV0dXJuIFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgY29uZmlnRmlsZTogb3B0aW9ucy5jb25maWdGaWxlIH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiRmx1eE1vZHVsZSIsIk1vZHVsZU1hbmlmZXN0IiwiaWQiLCJjb21tYW5kIiwiRmx1eENvbW1hbmQiLCJhY3Rpb25zIiwic2VydmUiLCJTZXJ2ZUFjdGlvbiIsInJ1biIsIlJ1bkFjdGlvbiIsInJlZ2lzdGVyU2VydmljZXMiLCJidWlsZGVyIiwicmVnaXN0ZXJTaW5nbGV0b24iLCJIb3RSZWxvYWRTZXJ2ZXIiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsImNyZWF0ZVdvcmtzcGFjZSIsIm9wdGlvbnMiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiY3JlYXRlIiwiY29uZmlnRmlsZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFVYUE7OztlQUFBQTs7O3NCQVZvQjtxQkFFRjtzQ0FFTTs2QkFDVDtpQ0FDSTsyQkFDTjs2QkFDRTtBQUVyQixNQUFNQSxtQkFBbUJDLG1CQUFjO0lBQzdCQyxLQUFLLE9BQU87SUFDWkMsVUFBVUMsd0JBQVcsQ0FBQztJQUN0QkMsVUFBVTtRQUN6QkMsT0FBT0Msd0JBQVc7UUFDbEJDLEtBQUtDLG9CQUFTO0lBQ2YsRUFBRTtJQUVLQyxpQkFBaUJDLE9BQXlCLEVBQUU7UUFDbERBLFFBQVFDLGlCQUFpQixDQUFDQyxnQ0FBZTtRQUN6Q0YsUUFBUUMsaUJBQWlCLENBQUNFLDBDQUFvQjtJQUMvQztJQUVnQkMsZ0JBQWdCQyxPQUFnQyxFQUFFO1FBQ2pFLE9BQU9DLHNCQUFnQixDQUFDQyxNQUFNLENBQUM7WUFBRUMsWUFBWUgsUUFBUUcsVUFBVTtRQUFDO0lBQ2pFO0FBQ0QifQ==
@@ -15,6 +15,12 @@ _export(exports, {
15
15
  get HotReloadServer () {
16
16
  return HotReloadServer;
17
17
  },
18
+ get formatFluxRebootReady () {
19
+ return formatFluxRebootReady;
20
+ },
21
+ get formatFluxRebootStart () {
22
+ return formatFluxRebootStart;
23
+ },
18
24
  get resolveRebootDebounceMs () {
19
25
  return resolveRebootDebounceMs;
20
26
  }
@@ -33,6 +39,7 @@ function _interop_require_default(obj) {
33
39
  const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
34
40
  const VERSION_URL_PARAM = "version";
35
41
  const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
42
+ /** How many triggering paths to print on the info banner before `+N`. */ const MAX_REBOOT_TRIGGER_PATHS = 4;
36
43
  function resolveRebootDebounceMs(value) {
37
44
  const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
38
45
  if (!Number.isFinite(delay) || delay < 0) {
@@ -40,6 +47,34 @@ function resolveRebootDebounceMs(value) {
40
47
  }
41
48
  return delay;
42
49
  }
50
+ function formatTriggerList(triggers) {
51
+ if (triggers.length === 0) return undefined;
52
+ if (triggers.length <= MAX_REBOOT_TRIGGER_PATHS) return triggers.join(", ");
53
+ return `${triggers.slice(0, MAX_REBOOT_TRIGGER_PATHS).join(", ")}, +${triggers.length - MAX_REBOOT_TRIGGER_PATHS}`;
54
+ }
55
+ const BANNER_RULE = "═".repeat(56);
56
+ function wrapFluxBanner(title, details) {
57
+ const body = details.map((line)=>` ${line}`).join("\n");
58
+ return `\n${BANNER_RULE}\n ${title}\n${body}\n${BANNER_RULE}\n`;
59
+ }
60
+ function formatFluxRebootStart(labels, triggers = []) {
61
+ const who = labels.join(", ") || "entry";
62
+ const files = formatTriggerList(triggers);
63
+ const details = files == null ? [
64
+ who
65
+ ] : [
66
+ who,
67
+ files
68
+ ];
69
+ return wrapFluxBanner("FLUX REBOOT", details);
70
+ }
71
+ function formatFluxRebootReady(labels, elapsedMs) {
72
+ const who = labels.join(", ") || "entry";
73
+ return wrapFluxBanner("FLUX READY", [
74
+ who,
75
+ `${Math.max(0, Math.round(elapsedMs))}ms`
76
+ ]);
77
+ }
43
78
  /** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
44
79
  class HotReloadServer extends _nodeevents.EventEmitter {
45
80
  // ── State ────────────────────────────────────────────────────────────────
@@ -48,6 +83,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
48
83
  disposed = false;
49
84
  /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
50
85
  pendingEntryReboots = new Set();
86
+ /** Source paths that scheduled the next reboot (cleared when that reboot starts). */ pendingTriggers = new Set();
51
87
  watchSubscription;
52
88
  moduleCache = new Map();
53
89
  dependencies = new Map();
@@ -65,6 +101,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
65
101
  this.moduleCache.clear();
66
102
  this.entries.clear();
67
103
  this.pendingEntryReboots.clear();
104
+ this.pendingTriggers.clear();
68
105
  this.pendingGraphPrune.clear();
69
106
  this.rebootTail = Promise.resolve();
70
107
  this.rebootInFlight = false;
@@ -83,7 +120,8 @@ class HotReloadServer extends _nodeevents.EventEmitter {
83
120
  for (const project of selected){
84
121
  const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
85
122
  this.entries.set(entryPath, {
86
- path: entryPath
123
+ path: entryPath,
124
+ label: project.name
87
125
  });
88
126
  }
89
127
  this.loader.registerHooks();
@@ -161,9 +199,13 @@ class HotReloadServer extends _nodeevents.EventEmitter {
161
199
  // Drop reverse edges only when rebooting so later saves in the debounce
162
200
  // window can still walk the graph and reset the quiet timer.
163
201
  this.prunePendingDependencyEdges();
164
- this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
202
+ const startedAt = Date.now();
203
+ const labels = this.labelsFor(toReboot);
204
+ const triggers = this.takeTriggers();
205
+ this.logger.info(formatFluxRebootStart(labels, triggers));
165
206
  await this.disposeEntries(toReboot);
166
207
  await this.bootEntries(toReboot);
208
+ this.logger.info(formatFluxRebootReady(labels, Date.now() - startedAt));
167
209
  this.emit("reboot");
168
210
  }while (this.rebootFollowUp && !this.disposed)
169
211
  } finally{
@@ -298,6 +340,7 @@ class HotReloadServer extends _nodeevents.EventEmitter {
298
340
  for (const entryPath of affectedEntries){
299
341
  this.pendingEntryReboots.add(entryPath);
300
342
  }
343
+ this.pendingTriggers.add(fullPath);
301
344
  this.scheduleReboot();
302
345
  return true;
303
346
  }
@@ -385,6 +428,26 @@ class HotReloadServer extends _nodeevents.EventEmitter {
385
428
  isSelf(filePath) {
386
429
  return currentFilePath === _nodepath.default.resolve(filePath);
387
430
  }
431
+ labelsFor(entryPaths) {
432
+ return entryPaths.map((entryPath)=>this.entries.get(entryPath)?.label ?? _nodepath.default.basename(entryPath));
433
+ }
434
+ takeTriggers() {
435
+ const triggers = [
436
+ ...this.pendingTriggers
437
+ ].map((fullPath)=>this.formatTrigger(fullPath));
438
+ this.pendingTriggers.clear();
439
+ return triggers;
440
+ }
441
+ formatTrigger(fullPath) {
442
+ const root = this.loader.getWorkspace()?.rootDir;
443
+ if (root != null) {
444
+ const rel = _nodepath.default.relative(_nodepath.default.resolve(root), fullPath);
445
+ if (rel !== "" && !rel.startsWith("..") && !_nodepath.default.isAbsolute(rel)) {
446
+ return rel.replaceAll("\\", "/");
447
+ }
448
+ }
449
+ return _nodepath.default.basename(fullPath);
450
+ }
388
451
  }
389
452
 
390
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJWRVJTSU9OX1VSTF9QQVJBTSIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkV2ZW50RW1pdHRlciIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJsb2FkZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwicGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsIm1hcCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBYWFBO2VBQUFBOztRQTBDQUM7ZUFBQUE7O1FBeENHQztlQUFBQTs7OzRCQWZhO2lFQUVaO29CQUVFO3dCQUNNO3dCQUNXO29DQUVEOzs7Ozs7QUFFbkMsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQUN6QyxNQUFNQyxvQkFBb0I7QUFFbkIsTUFBTU4sNkJBQTZCO0FBRW5DLFNBQVNFLHdCQUF3QkssS0FBeUI7SUFDaEUsTUFBTUMsUUFBUUQsU0FBU1A7SUFDdkIsSUFBSSxDQUFDUyxPQUFPQyxRQUFRLENBQUNGLFVBQVVBLFFBQVEsR0FBRztRQUN6QyxNQUFNLElBQUlHLE1BQU0sQ0FBQyxvREFBb0QsRUFBRUMsT0FBT0wsUUFBUTtJQUN2RjtJQUNBLE9BQU9DO0FB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
453
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG4vKiogSG93IG1hbnkgdHJpZ2dlcmluZyBwYXRocyB0byBwcmludCBvbiB0aGUgaW5mbyBiYW5uZXIgYmVmb3JlIGArTmAuICovXG5jb25zdCBNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMgPSA0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcmlnZ2VyTGlzdCh0cmlnZ2VyczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoIDw9IE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykgcmV0dXJuIHRyaWdnZXJzLmpvaW4oXCIsIFwiKTtcblx0cmV0dXJuIGAke3RyaWdnZXJzLnNsaWNlKDAsIE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykuam9pbihcIiwgXCIpfSwgKyR7dHJpZ2dlcnMubGVuZ3RoIC0gTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTfWA7XG59XG5cbmNvbnN0IEJBTk5FUl9SVUxFID0gXCLilZBcIi5yZXBlYXQoNTYpO1xuXG5mdW5jdGlvbiB3cmFwRmx1eEJhbm5lcih0aXRsZTogc3RyaW5nLCBkZXRhaWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGJvZHkgPSBkZXRhaWxzLm1hcCgobGluZSkgPT4gYCAgJHtsaW5lfWApLmpvaW4oXCJcXG5cIik7XG5cdHJldHVybiBgXFxuJHtCQU5ORVJfUlVMRX1cXG4gICR7dGl0bGV9XFxuJHtib2R5fVxcbiR7QkFOTkVSX1JVTEV9XFxuYDtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIHN0YXJ0IGJsb2NrIOKAlCBrZWVwIGBmbHV4IHJlYm9vdGAgaW4gdGhlIHRleHQgc28gb3BlcmF0b3JzIGNhbiBzZWFyY2ggdGhlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290U3RhcnQoXG5cdGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10sXG5cdHRyaWdnZXJzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgd2hvID0gbGFiZWxzLmpvaW4oXCIsIFwiKSB8fCBcImVudHJ5XCI7XG5cdGNvbnN0IGZpbGVzID0gZm9ybWF0VHJpZ2dlckxpc3QodHJpZ2dlcnMpO1xuXHRjb25zdCBkZXRhaWxzID0gZmlsZXMgPT0gbnVsbCA/IFt3aG9dIDogW3dobywgZmlsZXNdO1xuXHRyZXR1cm4gd3JhcEZsdXhCYW5uZXIoXCJGTFVYIFJFQk9PVFwiLCBkZXRhaWxzKTtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIGZpbmlzaCBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290UmVhZHkobGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSwgZWxhcHNlZE1zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCB3aG8gPSBsYWJlbHMuam9pbihcIiwgXCIpIHx8IFwiZW50cnlcIjtcblx0cmV0dXJuIHdyYXBGbHV4QmFubmVyKFwiRkxVWCBSRUFEWVwiLCBbd2hvLCBgJHtNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGVsYXBzZWRNcykpfW1zYF0pO1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXIgPSBuZXcgU291cmNlTW9kdWxlTG9hZGVyKCk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0LyoqIEFic29sdXRlIGVudHJ5IHBhdGhzIGN1cnJlbnRseSBzZXJ2ZWQgKG9uZSBvciBtb3JlIEZsdXggYXBwcykuICovXG5cdHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeVN0YXRlPigpO1xuXHRwcml2YXRlIHBlbmRpbmdFbnRyeVJlYm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0LyoqIFNvdXJjZSBwYXRocyB0aGF0IHNjaGVkdWxlZCB0aGUgbmV4dCByZWJvb3QgKGNsZWFyZWQgd2hlbiB0aGF0IHJlYm9vdCBzdGFydHMpLiAqL1xuXHRwcml2YXRlIHBlbmRpbmdUcmlnZ2VycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ1RyaWdnZXJzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0YnVpbGRDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0b25SZXNvbHZlZDogdGhpcy5vblBvc3RSZXNvbHZlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5yZXF1aXJlV29ya3NwYWNlKCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZywgb3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHNlbGVjdGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0XHR0aGlzLmVudHJpZXMuc2V0KGVudHJ5UGF0aCwgeyBwYXRoOiBlbnRyeVBhdGgsIGxhYmVsOiBwcm9qZWN0Lm5hbWUgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7ZW50cnkucGF0aH1gKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMubG9hZGVyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1vZCA9IChhd2FpdCB0aGlzLmxvYWRlci5pbXBvcnRFbnRyeShlbnRyeVBhdGgpKSBhcyB7XG5cdFx0XHRcdGRlZmF1bHQ/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdFx0XHR9O1xuXHRcdFx0c3RhdGUubW9kdWxlID0gbW9kPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kU2NoZWR1bGVSZWJvb3QoZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZ2VuID0gKyt0aGlzLnJlYm9vdERlYm91bmNlR2VuO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5kaXNwb3NlZCB8fCBnZW4gIT09IHRoaXMucmVib290RGVib3VuY2VHZW4pIHJldHVybjtcblx0XHRcdHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH0sIGRlbGF5TXMpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXF1ZXN0UmVib290KCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0aWYgKHRoaXMucmVib290SW5GbGlnaHQpIHtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5yZWJvb3RRdWV1ZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gdGhpcy5yZWJvb3RUYWlsLnRoZW4oXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSB0cnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgdG9SZWJvb3QgPVxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5zaXplID4gMFxuXHRcdFx0XHRcdFx0PyBbLi4udGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzXVxuXHRcdFx0XHRcdFx0OiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdFx0XHQvLyBEcm9wIHJldmVyc2UgZWRnZXMgb25seSB3aGVuIHJlYm9vdGluZyBzbyBsYXRlciBzYXZlcyBpbiB0aGUgZGVib3VuY2Vcblx0XHRcdFx0Ly8gd2luZG93IGNhbiBzdGlsbCB3YWxrIHRoZSBncmFwaCBhbmQgcmVzZXQgdGhlIHF1aWV0IHRpbWVyLlxuXHRcdFx0XHR0aGlzLnBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpO1xuXHRcdFx0XHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVsc0Zvcih0b1JlYm9vdCk7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJzID0gdGhpcy50YWtlVHJpZ2dlcnMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyhmb3JtYXRGbHV4UmVib290U3RhcnQobGFiZWxzLCB0cmlnZ2VycykpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8oZm9ybWF0Rmx1eFJlYm9vdFJlYWR5KGxhYmVscywgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCkpO1xuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZWJvb3RcIik7XG5cdFx0XHR9IHdoaWxlICh0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y29uc3QgbmVlZHNGb2xsb3dVcCA9IHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQ7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0XHRpZiAobmVlZHNGb2xsb3dVcCkgdGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuZGlzcG9zZUVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KGVudHJ5UGF0aD86IHN0cmluZykge1xuXHRcdGNvbnN0IHBhdGhzID0gZW50cnlQYXRoICE9IG51bGwgPyBbZW50cnlQYXRoXSA6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcblx0XHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChwKTtcblx0XHRcdGlmIChzdGF0ZSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gc3RhdGUubW9kdWxlO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXCJFbnRyeSBhc3luY0Rpc3Bvc2UgZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSByZXF1aXJlV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB7XG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk7XG5cdFx0aWYgKHdvcmtzcGFjZSA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2VNb2R1bGVMb2FkZXIgaGFzIG5vIHdvcmtzcGFjZSBhZnRlciBjb25maWd1cmVcIik7XG5cdFx0fVxuXHRcdHJldHVybiB3b3Jrc3BhY2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZzogc3RyaW5nLCBvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvamVjdFtdIHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgbmFtZXMgPVxuXHRcdFx0b3B0aW9ucy5wcm9qZWN0cyAhPSBudWxsICYmIG9wdGlvbnMucHJvamVjdHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG9wdGlvbnMucHJvamVjdHNcblx0XHRcdFx0OiBvcHRpb25zLnByb2plY3QgIT0gbnVsbFxuXHRcdFx0XHRcdD8gW29wdGlvbnMucHJvamVjdF1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuYW1lcyA9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb2plY3RzLmF0KDApO1xuXHRcdFx0aWYgKGZpcnN0ID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbZmlyc3RdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdGVkOiBQcm9qZWN0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxlY3RlZC5wdXNoKGZvdW5kKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMubG9hZGVyLnNldFNvdXJjZUZpbGUoZnVsbFBhdGgsIHByb2plY3QpO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuYWRkKG1vZHVsZSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5hZGQoZnVsbFBhdGgpO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpIHtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMucGVuZGluZ0dyYXBoUHJ1bmVdO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlcyk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIHRoZXNlIG1vZHVsZXMgYXMgcGFyZW50cyBzbyBib290IGNhbiByZWJ1aWxkIGVkZ2VzIHdpdGhvdXQgc3RhbGUgaW1wb3J0ZXJzLiAqL1xuXHRwcml2YXRlIHBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkID0gcGFyZW50cy5maWx0ZXIoKHApID0+IHAgIT09IG1vZHVsZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5kZWxldGUoa2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoa2V5LCBmaWx0ZXJlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMubG9hZGVyLnNvdXJjZUZpbGVQYXRocygpKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGxhYmVsc0ZvcihlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gZW50cnlQYXRocy5tYXAoXG5cdFx0XHQoZW50cnlQYXRoKSA9PiB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk/LmxhYmVsID8/IHBhdGguYmFzZW5hbWUoZW50cnlQYXRoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB0YWtlVHJpZ2dlcnMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gWy4uLnRoaXMucGVuZGluZ1RyaWdnZXJzXS5tYXAoKGZ1bGxQYXRoKSA9PiB0aGlzLmZvcm1hdFRyaWdnZXIoZnVsbFBhdGgpKTtcblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5jbGVhcigpO1xuXHRcdHJldHVybiB0cmlnZ2Vycztcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0VHJpZ2dlcihmdWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LnJvb3REaXI7XG5cdFx0aWYgKHJvb3QgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUocm9vdCksIGZ1bGxQYXRoKTtcblx0XHRcdGlmIChyZWwgIT09IFwiXCIgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKSB7XG5cdFx0XHRcdHJldHVybiByZWwucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGF0aC5iYXNlbmFtZShmdWxsUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUyIsIkhvdFJlbG9hZFNlcnZlciIsImZvcm1hdEZsdXhSZWJvb3RSZWFkeSIsImZvcm1hdEZsdXhSZWJvb3RTdGFydCIsInJlc29sdmVSZWJvb3REZWJvdW5jZU1zIiwiY3VycmVudEZpbGVQYXRoIiwiaW8iLCJmaWxlVXJsVG9QYXRoIiwiVkVSU0lPTl9VUkxfUEFSQU0iLCJNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMiLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsImZvcm1hdFRyaWdnZXJMaXN0IiwidHJpZ2dlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwic2xpY2UiLCJCQU5ORVJfUlVMRSIsInJlcGVhdCIsIndyYXBGbHV4QmFubmVyIiwidGl0bGUiLCJkZXRhaWxzIiwiYm9keSIsIm1hcCIsImxpbmUiLCJsYWJlbHMiLCJ3aG8iLCJmaWxlcyIsImVsYXBzZWRNcyIsIk1hdGgiLCJtYXgiLCJyb3VuZCIsIm1vZHVsZVZlcnNpb25TZXEiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJzY3JpYmUiLCJuYW1lIiwibG9hZGVyIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiZGlzcG9zZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsInBlbmRpbmdUcmlnZ2VycyIsIndhdGNoU3Vic2NyaXB0aW9uIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJwZW5kaW5nR3JhcGhQcnVuZSIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwiYnVpbGRDb25maWciLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsIm9uUmVzb2x2ZWQiLCJvblBvc3RSZXNvbHZlIiwicmVxdWlyZVdvcmtzcGFjZSIsInNlbGVjdGVkIiwicmVzb2x2ZVByb2plY3RzIiwicHJvamVjdCIsImVudHJ5UGF0aCIsInBhdGgiLCJnZXRTb3VyY2VFbnRyeVBhdGgiLCJzZXQiLCJsYWJlbCIsInJlZ2lzdGVySG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJvbkZpbGVDaGFuZ2UiLCJlbnRyeSIsInZhbHVlcyIsInRyYWNlIiwiYm9vdEVudHJpZXMiLCJrZXlzIiwiZW1pdCIsImRpc3Bvc2UiLCJ1bnN1YnNjcmliZSIsImRpc3Bvc2VFbnRyaWVzIiwiU3ltYm9sIiwiYXN5bmNEaXNwb3NlIiwiZW50cnlQYXRocyIsImFsbCIsImJvb3RFbnRyeSIsInN0YXRlIiwiZ2V0IiwibW9kIiwiaW1wb3J0RW50cnkiLCJtb2R1bGUiLCJkZWZhdWx0IiwiZXJyb3IiLCJkZWxheU1zIiwiZ2VuIiwiZGVib3VuY2UiLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsInN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJsYWJlbHNGb3IiLCJ0YWtlVHJpZ2dlcnMiLCJpbmZvIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImdldFdvcmtzcGFjZSIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwicmVzdWx0IiwicGFyZW50VXJsIiwidXJsIiwicGFyZW50VXJsQ2xlYW4iLCJzcGxpdCIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJoYXNTb3VyY2VGaWxlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJldnQiLCJmaWxlIiwiZXZlbnROYW1lIiwiZnVsbFBhdGgiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImludmFsaWRhdGVUcmFuc3BpbGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJzZXRTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwicHJ1bmVEZXBlbmRlbmN5UGFyZW50cyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyIsImJhc2VuYW1lIiwiZm9ybWF0VHJpZ2dlciIsInJvb3QiLCJyb290RGlyIiwicmVsIiwicmVsYXRpdmUi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
@@ -30,6 +30,9 @@ _export(exports, {
30
30
  get classifySliceProjects () {
31
31
  return _sliceserve.classifySliceProjects;
32
32
  },
33
+ get flux () {
34
+ return _flux.flux;
35
+ },
33
36
  get normalizeSlicePrefix () {
34
37
  return _sliceserve.normalizeSlicePrefix;
35
38
  },
@@ -44,9 +47,10 @@ _export(exports, {
44
47
  }
45
48
  });
46
49
  const _deferredscriptrunner = require("./deferred-script-runner.js");
50
+ const _flux = require("./flux.js");
47
51
  const _fluxmodule = require("./flux.module.js");
48
52
  const _hotreloadserver = require("./hot-reload-server.js");
49
53
  const _sliceserve = require("./slice-serve.js");
50
54
  const _sourcemoduleloader = require("./source-module-loader.js");
51
55
 
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9ydW4uYWN0aW9uLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbmV4cG9ydCB0eXBlIHsgU291cmNlTW9kdWxlTG9hZGVyT3B0aW9ucyB9IGZyb20gXCIuL3NvdXJjZS1tb2R1bGUtbG9hZGVyLmpzXCI7XG5leHBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuIl0sIm5hbWVzIjpbIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiRGVmZXJyZWRTY3JpcHRSdW5uZXIiLCJGbHV4TW9kdWxlIiwiSG90UmVsb2FkU2VydmVyIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiY2xhc3NpZnlTbGljZVByb2plY3QiLCJjbGFzc2lmeVNsaWNlUHJvamVjdHMiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInByb2plY3RzSW5TbGljZSIsInByb2plY3RzSW5TbGljZXMiLCJyZXNvbHZlRGVmZXJTY3JpcHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBR1NBO2VBQUFBLDJDQUEwQjs7UUFIMUJDO2VBQUFBLDBDQUFvQjs7UUFDcEJDO2VBQUFBLHNCQUFVOztRQUVrQkM7ZUFBQUEsZ0NBQWU7O1FBZTNDQztlQUFBQSxzQ0FBa0I7O1FBVjFCQztlQUFBQSxnQ0FBb0I7O1FBQ3BCQztlQUFBQSxpQ0FBcUI7O1FBQ3JCQztlQUFBQSxnQ0FBb0I7O1FBQ3BCQztlQUFBQSwyQkFBZTs7UUFDZkM7ZUFBQUEsNEJBQWdCOztRQUNoQkM7ZUFBQUEsOEJBQWtCOzs7c0NBYmtCOzRCQUNWO2lDQUVpQzs0QkFhckQ7b0NBRTRCIn0=
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHR5cGUgeyBGbHV4UnVuT3B0aW9ucywgRmx1eFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL2ZsdXguanNcIjtcbmV4cG9ydCB7IGZsdXggfSBmcm9tIFwiLi9mbHV4LmpzXCI7XG5leHBvcnQgeyBGbHV4TW9kdWxlIH0gZnJvbSBcIi4vZmx1eC5tb2R1bGUuanNcIjtcbmV4cG9ydCB0eXBlIHsgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgeyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUywgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgUnVuT3B0aW9ucyB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQge1xuXHR0eXBlIENsYXNzaWZpZWRTbGljZSxcblx0Y2xhc3NpZnlTbGljZVByb2plY3QsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0cyxcblx0bm9ybWFsaXplU2xpY2VQcmVmaXgsXG5cdHByb2plY3RzSW5TbGljZSxcblx0cHJvamVjdHNJblNsaWNlcyxcblx0cmVzb2x2ZURlZmVyU2NyaXB0LFxuXHR0eXBlIFNsaWNlS2luZCxcblx0dHlwZSBTbGljZVByb2plY3RWaWV3LFxufSBmcm9tIFwiLi9zbGljZS1zZXJ2ZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBTb3VyY2VNb2R1bGVMb2FkZXJPcHRpb25zIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcbmV4cG9ydCB7IFNvdXJjZU1vZHVsZUxvYWRlciB9IGZyb20gXCIuL3NvdXJjZS1tb2R1bGUtbG9hZGVyLmpzXCI7XG4iXSwibmFtZXMiOlsiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkZsdXhNb2R1bGUiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJjbGFzc2lmeVNsaWNlUHJvamVjdCIsImNsYXNzaWZ5U2xpY2VQcm9qZWN0cyIsImZsdXgiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInByb2plY3RzSW5TbGljZSIsInByb2plY3RzSW5TbGljZXMiLCJyZXNvbHZlRGVmZXJTY3JpcHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBS1NBO2VBQUFBLDJDQUEwQjs7UUFMMUJDO2VBQUFBLDBDQUFvQjs7UUFHcEJDO2VBQUFBLHNCQUFVOztRQUVrQkM7ZUFBQUEsZ0NBQWU7O1FBZTNDQztlQUFBQSxzQ0FBa0I7O1FBVjFCQztlQUFBQSxnQ0FBb0I7O1FBQ3BCQztlQUFBQSxpQ0FBcUI7O1FBVGJDO2VBQUFBLFVBQUk7O1FBVVpDO2VBQUFBLGdDQUFvQjs7UUFDcEJDO2VBQUFBLDJCQUFlOztRQUNmQztlQUFBQSw0QkFBZ0I7O1FBQ2hCQztlQUFBQSw4QkFBa0I7OztzQ0Fma0I7c0JBRWhCOzRCQUNNO2lDQUVpQzs0QkFhckQ7b0NBRTRCIn0=
@@ -8,17 +8,11 @@ Object.defineProperty(exports, "RunAction", {
8
8
  return RunAction;
9
9
  }
10
10
  });
11
- const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
12
11
  const _decorators = require("@decohere/crucible/decorators");
13
12
  const _mesh = require("@decohere/mesh");
14
13
  const _cli = require("@decohere/nexus/cli");
15
14
  const _scribe = require("@decohere/scribe");
16
- const _sourcemoduleloader = require("./source-module-loader.js");
17
- function _interop_require_default(obj) {
18
- return obj && obj.__esModule ? obj : {
19
- default: obj
20
- };
21
- }
15
+ const _flux = require("./flux.js");
22
16
  function _ts_decorate(decorators, target, key, desc) {
23
17
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
24
18
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -29,33 +23,18 @@ function _ts_metadata(k, v) {
29
23
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
30
24
  }
31
25
  class RunAction {
32
- loader;
33
26
  workspace;
34
27
  logger = _scribe.scribe.logger(RunAction.name);
35
- constructor(loader, workspace){
36
- this.loader = loader;
28
+ constructor(workspace){
37
29
  this.workspace = workspace;
38
30
  }
39
31
  async run(options) {
40
- const entry = options.entry?.trim();
41
- if (entry == null || entry === "") {
42
- throw new Error("flux run requires an entry file path");
43
- }
44
- const absoluteEntry = _nodepath.default.resolve(entry);
45
- const passthrough = options.args ?? [];
46
- await this.loader.configure({
47
- workspace: this.workspace,
48
- buildConfig: options.configuration
32
+ this.logger.trace(`Running ${options.entry}`);
33
+ await _flux.flux.run(options.entry, {
34
+ configuration: options.configuration,
35
+ args: options.args,
36
+ workspace: this.workspace
49
37
  });
50
- this.loader.registerHooks();
51
- // Bin-style entries (forge.ts, flux.ts) read process.argv.slice(2).
52
- process.argv = [
53
- process.execPath,
54
- absoluteEntry,
55
- ...passthrough
56
- ];
57
- this.logger.trace(`Running ${absoluteEntry}`);
58
- await this.loader.importEntry(absoluteEntry);
59
38
  return _cli.ActionResponse.Success(RunAction.name);
60
39
  }
61
40
  }
@@ -63,9 +42,8 @@ RunAction = _ts_decorate([
63
42
  (0, _decorators.injectable)(),
64
43
  _ts_metadata("design:type", Function),
65
44
  _ts_metadata("design:paramtypes", [
66
- typeof _sourcemoduleloader.SourceModuleLoader === "undefined" ? Object : _sourcemoduleloader.SourceModuleLoader,
67
45
  typeof _mesh.Workspace === "undefined" ? Object : _mesh.Workspace
68
46
  ])
69
47
  ], RunAction);
70
48
 
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXI6IFNvdXJjZU1vZHVsZUxvYWRlcixcblx0XHRwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHQpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBSdW5PcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGNvbnN0IGVudHJ5ID0gb3B0aW9ucy5lbnRyeT8udHJpbSgpO1xuXHRcdGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5ID09PSBcIlwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4IHJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWJzb2x1dGVFbnRyeSA9IHBhdGgucmVzb2x2ZShlbnRyeSk7XG5cdFx0Y29uc3QgcGFzc3Rocm91Z2ggPSBvcHRpb25zLmFyZ3MgPz8gW107XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXG5cdFx0Ly8gQmluLXN0eWxlIGVudHJpZXMgKGZvcmdlLnRzLCBmbHV4LnRzKSByZWFkIHByb2Nlc3MuYXJndi5zbGljZSgyKS5cblx0XHRwcm9jZXNzLmFyZ3YgPSBbcHJvY2Vzcy5leGVjUGF0aCwgYWJzb2x1dGVFbnRyeSwgLi4ucGFzc3Rocm91Z2hdO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHthYnNvbHV0ZUVudHJ5fWApO1xuXHRcdGF3YWl0IHRoaXMubG9hZGVyLmltcG9ydEVudHJ5KGFic29sdXRlRW50cnkpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFJ1bkFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlJ1bkFjdGlvbiIsImxvZ2dlciIsInNjcmliZSIsIm5hbWUiLCJsb2FkZXIiLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwiZW50cnkiLCJ0cmltIiwiRXJyb3IiLCJhYnNvbHV0ZUVudHJ5IiwicGF0aCIsInJlc29sdmUiLCJwYXNzdGhyb3VnaCIsImFyZ3MiLCJjb25maWd1cmUiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWdpc3Rlckhvb2tzIiwicHJvY2VzcyIsImFyZ3YiLCJleGVjUGF0aCIsInRyYWNlIiwiaW1wb3J0RW50cnkiLCJBY3Rpb25SZXNwb25zZSIsIlN1Y2Nlc3MiXSwibWFwcGluZ3MiOiI7Ozs7K0JBa0JhQTs7O2VBQUFBOzs7aUVBbEJJOzRCQUNVO3NCQUVEO3FCQUNrQjt3QkFDUjtvQ0FFRDs7Ozs7Ozs7Ozs7Ozs7O0FBVzVCLE1BQU1BOzs7SUFDS0MsU0FBaUJDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDRCxVQUFVRyxJQUFJLEVBQUU7SUFFaEUsWUFDQyxBQUFpQkMsTUFBMEIsRUFDM0MsQUFBaUJDLFNBQW9CLENBQ3BDO2FBRmdCRCxTQUFBQTthQUNBQyxZQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBbUIsRUFBMkI7UUFDOUQsTUFBTUMsUUFBUUQsUUFBUUMsS0FBSyxFQUFFQztRQUM3QixJQUFJRCxTQUFTLFFBQVFBLFVBQVUsSUFBSTtZQUNsQyxNQUFNLElBQUlFLE1BQU07UUFDakI7UUFFQSxNQUFNQyxnQkFBZ0JDLGlCQUFJLENBQUNDLE9BQU8sQ0FBQ0w7UUFDbkMsTUFBTU0sY0FBY1AsUUFBUVEsSUFBSSxJQUFJLEVBQUU7UUFFdEMsTUFBTSxJQUFJLENBQUNYLE1BQU0sQ0FBQ1ksU0FBUyxDQUFDO1lBQzNCWCxXQUFXLElBQUksQ0FBQ0EsU0FBUztZQUN6QlksYUFBYVYsUUFBUVcsYUFBYTtRQUNuQztRQUNBLElBQUksQ0FBQ2QsTUFBTSxDQUFDZSxhQUFhO1FBRXpCLG9FQUFvRTtRQUNwRUMsUUFBUUMsSUFBSSxHQUFHO1lBQUNELFFBQVFFLFFBQVE7WUFBRVg7ZUFBa0JHO1NBQVk7UUFFaEUsSUFBSSxDQUFDYixNQUFNLENBQUNzQixLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUVaLGVBQWU7UUFDNUMsTUFBTSxJQUFJLENBQUNQLE1BQU0sQ0FBQ29CLFdBQVcsQ0FBQ2I7UUFDOUIsT0FBT2MsbUJBQWMsQ0FBQ0MsT0FBTyxDQUFDMUIsVUFBVUcsSUFBSTtJQUM3QztBQUNEIn0=
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBmbHV4IH0gZnJvbSBcIi4vZmx1eC5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHtvcHRpb25zLmVudHJ5fWApO1xuXHRcdGF3YWl0IGZsdXgucnVuKG9wdGlvbnMuZW50cnksIHtcblx0XHRcdGNvbmZpZ3VyYXRpb246IG9wdGlvbnMuY29uZmlndXJhdGlvbixcblx0XHRcdGFyZ3M6IG9wdGlvbnMuYXJncyxcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoUnVuQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiUnVuQWN0aW9uIiwibG9nZ2VyIiwic2NyaWJlIiwibmFtZSIsIndvcmtzcGFjZSIsInJ1biIsIm9wdGlvbnMiLCJ0cmFjZSIsImVudHJ5IiwiZmx1eCIsImNvbmZpZ3VyYXRpb24iLCJhcmdzIiwiQWN0aW9uUmVzcG9uc2UiLCJTdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7OytCQWdCYUE7OztlQUFBQTs7OzRCQWhCYztzQkFFRDtxQkFDa0I7d0JBQ1I7c0JBQ2Y7Ozs7Ozs7Ozs7QUFXZCxNQUFNQTs7SUFDS0MsU0FBaUJDLGNBQU0sQ0FBQ0QsTUFBTSxDQUFDRCxVQUFVRyxJQUFJLEVBQUU7SUFFaEUsWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQW1CLEVBQTJCO1FBQzlELElBQUksQ0FBQ0wsTUFBTSxDQUFDTSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUVELFFBQVFFLEtBQUssRUFBRTtRQUM1QyxNQUFNQyxVQUFJLENBQUNKLEdBQUcsQ0FBQ0MsUUFBUUUsS0FBSyxFQUFFO1lBQzdCRSxlQUFlSixRQUFRSSxhQUFhO1lBQ3BDQyxNQUFNTCxRQUFRSyxJQUFJO1lBQ2xCUCxXQUFXLElBQUksQ0FBQ0EsU0FBUztRQUMxQjtRQUNBLE9BQU9RLG1CQUFjLENBQUNDLE9BQU8sQ0FBQ2IsVUFBVUcsSUFBSTtJQUM3QztBQUNEIn0=
@@ -0,0 +1,43 @@
1
+ import path from "node:path";
2
+ import { HotReloadServer } from "./hot-reload-server.js";
3
+ import { SourceModuleLoader } from "./source-module-loader.js";
4
+ /** Process-level one-shot loader so a second `run()` reconfigures instead of stacking hooks. */ const runLoader = new SourceModuleLoader();
5
+ async function run(entry, options = {}) {
6
+ const trimmed = entry.trim();
7
+ if (trimmed == null || trimmed === "") {
8
+ throw new Error("flux.run requires an entry file path");
9
+ }
10
+ const absoluteEntry = path.resolve(trimmed);
11
+ await runLoader.configure({
12
+ workspace: options.workspace,
13
+ buildConfig: options.configuration ?? "debug"
14
+ });
15
+ runLoader.registerHooks();
16
+ process.argv = [
17
+ process.execPath,
18
+ absoluteEntry,
19
+ ...options.args ?? []
20
+ ];
21
+ return runLoader.importEntry(absoluteEntry);
22
+ }
23
+ async function serve(options = {}) {
24
+ const server = new HotReloadServer();
25
+ await server.start({
26
+ buildConfig: options.configuration ?? "debug",
27
+ project: options.project,
28
+ projects: options.projects,
29
+ workspace: options.workspace,
30
+ rebootDebounceMs: options.rebootDebounceMs
31
+ });
32
+ return server;
33
+ }
34
+ function dispose() {
35
+ runLoader.dispose();
36
+ }
37
+ export const flux = {
38
+ run,
39
+ serve,
40
+ dispose
41
+ };
42
+
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBGbHV4UnVuT3B0aW9ucyA9IHtcblx0LyoqIE1lc2gvRm9yZ2UgY29uZmlndXJhdGlvbiBuYW1lLiBEZWZhdWx0cyB0byBgZGVidWdgIChgLS1jb25maWd1cmF0aW9uYCkuICovXG5cdGNvbmZpZ3VyYXRpb24/OiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0ZWFkIG9mIGBXb3Jrc3BhY2VGYWN0b3J5YC5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIHNraXAgZmlsZXN5c3RlbSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG59O1xuXG5leHBvcnQgdHlwZSBGbHV4U2VydmVPcHRpb25zID0ge1xuXHQvKiogTWVzaC9Gb3JnZSBjb25maWd1cmF0aW9uIG5hbWUuIERlZmF1bHRzIHRvIGBkZWJ1Z2AgKGAtLWNvbmZpZ3VyYXRpb25gKS4gKi9cblx0Y29uZmlndXJhdGlvbj86IHN0cmluZztcblx0LyoqIE5hbWUgb2YgdGhlIHByb2plY3QgdG8gc2VydmUuIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2UuICovXG5cdHByb2plY3Q/OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBNdWx0aXBsZSBGbHV4IGFwcCBwYWNrYWdlIG5hbWVzIHRvIGJvb3QgaW4gb25lIHByb2Nlc3MgKGRpcmVjdG9yeSBzbGljZSkuXG5cdCAqIFdoZW4gc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIge0BsaW5rIHByb2plY3R9LlxuXHQgKi9cblx0cHJvamVjdHM/OiByZWFkb25seSBzdHJpbmdbXTtcblx0LyoqXG5cdCAqIFByZS1idWlsdCBXb3Jrc3BhY2UgaW5zdGVhZCBvZiBgV29ya3NwYWNlRmFjdG9yeWAuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBza2lwIGZpbGVzeXN0ZW0gZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn07XG5cbi8qKiBQcm9jZXNzLWxldmVsIG9uZS1zaG90IGxvYWRlciBzbyBhIHNlY29uZCBgcnVuKClgIHJlY29uZmlndXJlcyBpbnN0ZWFkIG9mIHN0YWNraW5nIGhvb2tzLiAqL1xuY29uc3QgcnVuTG9hZGVyID0gbmV3IFNvdXJjZU1vZHVsZUxvYWRlcigpO1xuXG5hc3luYyBmdW5jdGlvbiBydW4oZW50cnk6IHN0cmluZywgb3B0aW9uczogRmx1eFJ1bk9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRjb25zdCB0cmltbWVkID0gZW50cnkudHJpbSgpO1xuXHRpZiAodHJpbW1lZCA9PSBudWxsIHx8IHRyaW1tZWQgPT09IFwiXCIpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4LnJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdH1cblxuXHRjb25zdCBhYnNvbHV0ZUVudHJ5ID0gcGF0aC5yZXNvbHZlKHRyaW1tZWQpO1xuXHRhd2FpdCBydW5Mb2FkZXIuY29uZmlndXJlKHtcblx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gPz8gXCJkZWJ1Z1wiLFxuXHR9KTtcblx0cnVuTG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0cHJvY2Vzcy5hcmd2ID0gW3Byb2Nlc3MuZXhlY1BhdGgsIGFic29sdXRlRW50cnksIC4uLihvcHRpb25zLmFyZ3MgPz8gW10pXTtcblx0cmV0dXJuIHJ1bkxvYWRlci5pbXBvcnRFbnRyeShhYnNvbHV0ZUVudHJ5KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VydmUob3B0aW9uczogRmx1eFNlcnZlT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxIb3RSZWxvYWRTZXJ2ZXI+IHtcblx0Y29uc3Qgc2VydmVyID0gbmV3IEhvdFJlbG9hZFNlcnZlcigpO1xuXHRhd2FpdCBzZXJ2ZXIuc3RhcnQoe1xuXHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24gPz8gXCJkZWJ1Z1wiLFxuXHRcdHByb2plY3Q6IG9wdGlvbnMucHJvamVjdCxcblx0XHRwcm9qZWN0czogb3B0aW9ucy5wcm9qZWN0cyxcblx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdHJlYm9vdERlYm91bmNlTXM6IG9wdGlvbnMucmVib290RGVib3VuY2VNcyxcblx0fSk7XG5cdHJldHVybiBzZXJ2ZXI7XG59XG5cbmZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG5cdHJ1bkxvYWRlci5kaXNwb3NlKCk7XG59XG5cbmV4cG9ydCBjb25zdCBmbHV4ID0geyBydW4sIHNlcnZlLCBkaXNwb3NlIH07XG4iXSwibmFtZXMiOlsicGF0aCIsIkhvdFJlbG9hZFNlcnZlciIsIlNvdXJjZU1vZHVsZUxvYWRlciIsInJ1bkxvYWRlciIsInJ1biIsImVudHJ5Iiwib3B0aW9ucyIsInRyaW1tZWQiLCJ0cmltIiwiRXJyb3IiLCJhYnNvbHV0ZUVudHJ5IiwicmVzb2x2ZSIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsImJ1aWxkQ29uZmlnIiwiY29uZmlndXJhdGlvbiIsInJlZ2lzdGVySG9va3MiLCJwcm9jZXNzIiwiYXJndiIsImV4ZWNQYXRoIiwiYXJncyIsImltcG9ydEVudHJ5Iiwic2VydmUiLCJzZXJ2ZXIiLCJzdGFydCIsInByb2plY3QiLCJwcm9qZWN0cyIsInJlYm9vdERlYm91bmNlTXMiLCJkaXNwb3NlIiwiZmx1eCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsVUFBVSxZQUFZO0FBRTdCLFNBQVNDLGVBQWUsUUFBUSx5QkFBeUI7QUFDekQsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBb0MvRCw4RkFBOEYsR0FDOUYsTUFBTUMsWUFBWSxJQUFJRDtBQUV0QixlQUFlRSxJQUFJQyxLQUFhLEVBQUVDLFVBQTBCLENBQUMsQ0FBQztJQUM3RCxNQUFNQyxVQUFVRixNQUFNRyxJQUFJO0lBQzFCLElBQUlELFdBQVcsUUFBUUEsWUFBWSxJQUFJO1FBQ3RDLE1BQU0sSUFBSUUsTUFBTTtJQUNqQjtJQUVBLE1BQU1DLGdCQUFnQlYsS0FBS1csT0FBTyxDQUFDSjtJQUNuQyxNQUFNSixVQUFVUyxTQUFTLENBQUM7UUFDekJDLFdBQVdQLFFBQVFPLFNBQVM7UUFDNUJDLGFBQWFSLFFBQVFTLGFBQWEsSUFBSTtJQUN2QztJQUNBWixVQUFVYSxhQUFhO0lBQ3ZCQyxRQUFRQyxJQUFJLEdBQUc7UUFBQ0QsUUFBUUUsUUFBUTtRQUFFVDtXQUFtQkosUUFBUWMsSUFBSSxJQUFJLEVBQUU7S0FBRTtJQUN6RSxPQUFPakIsVUFBVWtCLFdBQVcsQ0FBQ1g7QUFDOUI7QUFFQSxlQUFlWSxNQUFNaEIsVUFBNEIsQ0FBQyxDQUFDO0lBQ2xELE1BQU1pQixTQUFTLElBQUl0QjtJQUNuQixNQUFNc0IsT0FBT0MsS0FBSyxDQUFDO1FBQ2xCVixhQUFhUixRQUFRUyxhQUFhLElBQUk7UUFDdENVLFNBQVNuQixRQUFRbUIsT0FBTztRQUN4QkMsVUFBVXBCLFFBQVFvQixRQUFRO1FBQzFCYixXQUFXUCxRQUFRTyxTQUFTO1FBQzVCYyxrQkFBa0JyQixRQUFRcUIsZ0JBQWdCO0lBQzNDO0lBQ0EsT0FBT0o7QUFDUjtBQUVBLFNBQVNLO0lBQ1J6QixVQUFVeUIsT0FBTztBQUNsQjtBQUVBLE9BQU8sTUFBTUMsT0FBTztJQUFFekI7SUFBS2tCO0lBQU9NO0FBQVEsRUFBRSJ9
@@ -5,7 +5,6 @@ import { FluxCommand } from "./flux.command.js";
5
5
  import { HotReloadServer } from "./hot-reload-server.js";
6
6
  import { RunAction } from "./run.action.js";
7
7
  import { ServeAction } from "./serve.action.js";
8
- import { SourceModuleLoader } from "./source-module-loader.js";
9
8
  export class FluxModule extends ModuleManifest {
10
9
  id = "flux";
11
10
  command = FluxCommand;
@@ -14,7 +13,6 @@ export class FluxModule extends ModuleManifest {
14
13
  run: RunAction
15
14
  };
16
15
  registerServices(builder) {
17
- builder.registerSingleton(SourceModuleLoader);
18
16
  builder.registerSingleton(HotReloadServer);
19
17
  builder.registerSingleton(DeferredScriptRunner);
20
18
  }
@@ -25,4 +23,4 @@ export class FluxModule extends ModuleManifest {
25
23
  }
26
24
  }
27
25
 
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG5pbXBvcnQgeyBGbHV4Q29tbWFuZCB9IGZyb20gXCIuL2ZsdXguY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRmx1eE1vZHVsZSBleHRlbmRzIE1vZHVsZU1hbmlmZXN0IHtcblx0cHVibGljIHJlYWRvbmx5IGlkID0gXCJmbHV4XCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gRmx1eENvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdHNlcnZlOiBTZXJ2ZUFjdGlvbixcblx0XHRydW46IFJ1bkFjdGlvbixcblx0fTtcblxuXHRwdWJsaWMgcmVnaXN0ZXJTZXJ2aWNlcyhidWlsZGVyOiBDb250YWluZXJCdWlsZGVyKSB7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihTb3VyY2VNb2R1bGVMb2FkZXIpO1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oSG90UmVsb2FkU2VydmVyKTtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKERlZmVycmVkU2NyaXB0UnVubmVyKTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBjcmVhdGVXb3Jrc3BhY2Uob3B0aW9uczogV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMpIHtcblx0XHRyZXR1cm4gV29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoeyBjb25maWdGaWxlOiBvcHRpb25zLmNvbmZpZ0ZpbGUgfSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXb3Jrc3BhY2VGYWN0b3J5IiwiTW9kdWxlTWFuaWZlc3QiLCJEZWZlcnJlZFNjcmlwdFJ1bm5lciIsIkZsdXhDb21tYW5kIiwiSG90UmVsb2FkU2VydmVyIiwiUnVuQWN0aW9uIiwiU2VydmVBY3Rpb24iLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJGbHV4TW9kdWxlIiwiaWQiLCJjb21tYW5kIiwiYWN0aW9ucyIsInNlcnZlIiwicnVuIiwicmVnaXN0ZXJTZXJ2aWNlcyIsImJ1aWxkZXIiLCJyZWdpc3RlclNpbmdsZXRvbiIsImNyZWF0ZVdvcmtzcGFjZSIsIm9wdGlvbnMiLCJjcmVhdGUiLCJjb25maWdGaWxlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSxpQkFBaUI7QUFFbEQsU0FBU0MsY0FBYyxRQUFRLHNCQUFzQjtBQUVyRCxTQUFTQyxvQkFBb0IsUUFBUSw4QkFBOEI7QUFDbkUsU0FBU0MsV0FBVyxRQUFRLG9CQUFvQjtBQUNoRCxTQUFTQyxlQUFlLFFBQVEseUJBQXlCO0FBQ3pELFNBQVNDLFNBQVMsUUFBUSxrQkFBa0I7QUFDNUMsU0FBU0MsV0FBVyxRQUFRLG9CQUFvQjtBQUNoRCxTQUFTQyxrQkFBa0IsUUFBUSw0QkFBNEI7QUFFL0QsT0FBTyxNQUFNQyxtQkFBbUJQO0lBQ2ZRLEtBQUssT0FBTztJQUNaQyxVQUFVUCxZQUFZO0lBQ3RCUSxVQUFVO1FBQ3pCQyxPQUFPTjtRQUNQTyxLQUFLUjtJQUNOLEVBQUU7SUFFS1MsaUJBQWlCQyxPQUF5QixFQUFFO1FBQ2xEQSxRQUFRQyxpQkFBaUIsQ0FBQ1Q7UUFDMUJRLFFBQVFDLGlCQUFpQixDQUFDWjtRQUMxQlcsUUFBUUMsaUJBQWlCLENBQUNkO0lBQzNCO0lBRWdCZSxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDakUsT0FBT2xCLGlCQUFpQm1CLE1BQU0sQ0FBQztZQUFFQyxZQUFZRixRQUFRRSxVQUFVO1FBQUM7SUFDakU7QUFDRCJ9
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2ZsdXgubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0IHsgRGVmZXJyZWRTY3JpcHRSdW5uZXIgfSBmcm9tIFwiLi9kZWZlcnJlZC1zY3JpcHQtcnVubmVyLmpzXCI7XG5pbXBvcnQgeyBGbHV4Q29tbWFuZCB9IGZyb20gXCIuL2ZsdXguY29tbWFuZC5qc1wiO1xuaW1wb3J0IHsgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmltcG9ydCB7IFJ1bkFjdGlvbiB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmltcG9ydCB7IFNlcnZlQWN0aW9uIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBGbHV4TW9kdWxlIGV4dGVuZHMgTW9kdWxlTWFuaWZlc3Qge1xuXHRwdWJsaWMgcmVhZG9ubHkgaWQgPSBcImZsdXhcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBGbHV4Q29tbWFuZDtcblx0cHVibGljIHJlYWRvbmx5IGFjdGlvbnMgPSB7XG5cdFx0c2VydmU6IFNlcnZlQWN0aW9uLFxuXHRcdHJ1bjogUnVuQWN0aW9uLFxuXHR9O1xuXG5cdHB1YmxpYyByZWdpc3RlclNlcnZpY2VzKGJ1aWxkZXI6IENvbnRhaW5lckJ1aWxkZXIpIHtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKEhvdFJlbG9hZFNlcnZlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihEZWZlcnJlZFNjcmlwdFJ1bm5lcik7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0cmV0dXJuIFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHsgY29uZmlnRmlsZTogb3B0aW9ucy5jb25maWdGaWxlIH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV29ya3NwYWNlRmFjdG9yeSIsIk1vZHVsZU1hbmlmZXN0IiwiRGVmZXJyZWRTY3JpcHRSdW5uZXIiLCJGbHV4Q29tbWFuZCIsIkhvdFJlbG9hZFNlcnZlciIsIlJ1bkFjdGlvbiIsIlNlcnZlQWN0aW9uIiwiRmx1eE1vZHVsZSIsImlkIiwiY29tbWFuZCIsImFjdGlvbnMiLCJzZXJ2ZSIsInJ1biIsInJlZ2lzdGVyU2VydmljZXMiLCJidWlsZGVyIiwicmVnaXN0ZXJTaW5nbGV0b24iLCJjcmVhdGVXb3Jrc3BhY2UiLCJvcHRpb25zIiwiY3JlYXRlIiwiY29uZmlnRmlsZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBRWxELFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFFckQsU0FBU0Msb0JBQW9CLFFBQVEsOEJBQThCO0FBQ25FLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFDaEQsU0FBU0MsZUFBZSxRQUFRLHlCQUF5QjtBQUN6RCxTQUFTQyxTQUFTLFFBQVEsa0JBQWtCO0FBQzVDLFNBQVNDLFdBQVcsUUFBUSxvQkFBb0I7QUFFaEQsT0FBTyxNQUFNQyxtQkFBbUJOO0lBQ2ZPLEtBQUssT0FBTztJQUNaQyxVQUFVTixZQUFZO0lBQ3RCTyxVQUFVO1FBQ3pCQyxPQUFPTDtRQUNQTSxLQUFLUDtJQUNOLEVBQUU7SUFFS1EsaUJBQWlCQyxPQUF5QixFQUFFO1FBQ2xEQSxRQUFRQyxpQkFBaUIsQ0FBQ1g7UUFDMUJVLFFBQVFDLGlCQUFpQixDQUFDYjtJQUMzQjtJQUVnQmMsZ0JBQWdCQyxPQUFnQyxFQUFFO1FBQ2pFLE9BQU9qQixpQkFBaUJrQixNQUFNLENBQUM7WUFBRUMsWUFBWUYsUUFBUUUsVUFBVTtRQUFDO0lBQ2pFO0FBQ0QifQ==
@@ -7,6 +7,7 @@ import { SourceModuleLoader } from "./source-module-loader.js";
7
7
  const currentFilePath = io.fileUrlToPath(import.meta.url);
8
8
  const VERSION_URL_PARAM = "version";
9
9
  /** Default quiet window before a file-change reboot. */ export const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
10
+ /** How many triggering paths to print on the info banner before `+N`. */ const MAX_REBOOT_TRIGGER_PATHS = 4;
10
11
  export function resolveRebootDebounceMs(value) {
11
12
  const delay = value ?? DEFAULT_REBOOT_DEBOUNCE_MS;
12
13
  if (!Number.isFinite(delay) || delay < 0) {
@@ -14,6 +15,34 @@ export function resolveRebootDebounceMs(value) {
14
15
  }
15
16
  return delay;
16
17
  }
18
+ function formatTriggerList(triggers) {
19
+ if (triggers.length === 0) return undefined;
20
+ if (triggers.length <= MAX_REBOOT_TRIGGER_PATHS) return triggers.join(", ");
21
+ return `${triggers.slice(0, MAX_REBOOT_TRIGGER_PATHS).join(", ")}, +${triggers.length - MAX_REBOOT_TRIGGER_PATHS}`;
22
+ }
23
+ const BANNER_RULE = "═".repeat(56);
24
+ function wrapFluxBanner(title, details) {
25
+ const body = details.map((line)=>` ${line}`).join("\n");
26
+ return `\n${BANNER_RULE}\n ${title}\n${body}\n${BANNER_RULE}\n`;
27
+ }
28
+ /** Info-level HMR start block — keep `flux reboot` in the text so operators can search the buffer. */ export function formatFluxRebootStart(labels, triggers = []) {
29
+ const who = labels.join(", ") || "entry";
30
+ const files = formatTriggerList(triggers);
31
+ const details = files == null ? [
32
+ who
33
+ ] : [
34
+ who,
35
+ files
36
+ ];
37
+ return wrapFluxBanner("FLUX REBOOT", details);
38
+ }
39
+ /** Info-level HMR finish block. */ export function formatFluxRebootReady(labels, elapsedMs) {
40
+ const who = labels.join(", ") || "entry";
41
+ return wrapFluxBanner("FLUX READY", [
42
+ who,
43
+ `${Math.max(0, Math.round(elapsedMs))}ms`
44
+ ]);
45
+ }
17
46
  /** Process-wide: Node's ESM cache is process-global, including across HotReloadServer instances. */ let moduleVersionSeq = 0;
18
47
  export class HotReloadServer extends EventEmitter {
19
48
  // ── State ────────────────────────────────────────────────────────────────
@@ -22,6 +51,7 @@ export class HotReloadServer extends EventEmitter {
22
51
  disposed = false;
23
52
  /** Absolute entry paths currently served (one or more Flux apps). */ entries = new Map();
24
53
  pendingEntryReboots = new Set();
54
+ /** Source paths that scheduled the next reboot (cleared when that reboot starts). */ pendingTriggers = new Set();
25
55
  watchSubscription;
26
56
  moduleCache = new Map();
27
57
  dependencies = new Map();
@@ -39,6 +69,7 @@ export class HotReloadServer extends EventEmitter {
39
69
  this.moduleCache.clear();
40
70
  this.entries.clear();
41
71
  this.pendingEntryReboots.clear();
72
+ this.pendingTriggers.clear();
42
73
  this.pendingGraphPrune.clear();
43
74
  this.rebootTail = Promise.resolve();
44
75
  this.rebootInFlight = false;
@@ -57,7 +88,8 @@ export class HotReloadServer extends EventEmitter {
57
88
  for (const project of selected){
58
89
  const entryPath = path.resolve(project.getSourceEntryPath());
59
90
  this.entries.set(entryPath, {
60
- path: entryPath
91
+ path: entryPath,
92
+ label: project.name
61
93
  });
62
94
  }
63
95
  this.loader.registerHooks();
@@ -135,9 +167,13 @@ export class HotReloadServer extends EventEmitter {
135
167
  // Drop reverse edges only when rebooting so later saves in the debounce
136
168
  // window can still walk the graph and reset the quiet timer.
137
169
  this.prunePendingDependencyEdges();
138
- this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
170
+ const startedAt = Date.now();
171
+ const labels = this.labelsFor(toReboot);
172
+ const triggers = this.takeTriggers();
173
+ this.logger.info(formatFluxRebootStart(labels, triggers));
139
174
  await this.disposeEntries(toReboot);
140
175
  await this.bootEntries(toReboot);
176
+ this.logger.info(formatFluxRebootReady(labels, Date.now() - startedAt));
141
177
  this.emit("reboot");
142
178
  }while (this.rebootFollowUp && !this.disposed)
143
179
  } finally{
@@ -272,6 +308,7 @@ export class HotReloadServer extends EventEmitter {
272
308
  for (const entryPath of affectedEntries){
273
309
  this.pendingEntryReboots.add(entryPath);
274
310
  }
311
+ this.pendingTriggers.add(fullPath);
275
312
  this.scheduleReboot();
276
313
  return true;
277
314
  }
@@ -359,6 +396,26 @@ export class HotReloadServer extends EventEmitter {
359
396
  isSelf(filePath) {
360
397
  return currentFilePath === path.resolve(filePath);
361
398
  }
399
+ labelsFor(entryPaths) {
400
+ return entryPaths.map((entryPath)=>this.entries.get(entryPath)?.label ?? path.basename(entryPath));
401
+ }
402
+ takeTriggers() {
403
+ const triggers = [
404
+ ...this.pendingTriggers
405
+ ].map((fullPath)=>this.formatTrigger(fullPath));
406
+ this.pendingTriggers.clear();
407
+ return triggers;
408
+ }
409
+ formatTrigger(fullPath) {
410
+ const root = this.loader.getWorkspace()?.rootDir;
411
+ if (root != null) {
412
+ const rel = path.relative(path.resolve(root), fullPath);
413
+ if (rel !== "" && !rel.startsWith("..") && !path.isAbsolute(rel)) {
414
+ return rel.replaceAll("\\", "/");
415
+ }
416
+ }
417
+ return path.basename(fullPath);
418
+ }
362
419
  }
363
420
 
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVib290RGVib3VuY2VNcyh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcblx0Y29uc3QgZGVsYXkgPSB2YWx1ZSA/PyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUztcblx0aWYgKCFOdW1iZXIuaXNGaW5pdGUoZGVsYXkpIHx8IGRlbGF5IDwgMCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgcmVib290RGVib3VuY2VNcyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlciwgZ290ICR7U3RyaW5nKHZhbHVlKX1gKTtcblx0fVxuXHRyZXR1cm4gZGVsYXk7XG59XG5cbi8qKiBQcm9jZXNzLXdpZGU6IE5vZGUncyBFU00gY2FjaGUgaXMgcHJvY2Vzcy1nbG9iYWwsIGluY2x1ZGluZyBhY3Jvc3MgSG90UmVsb2FkU2VydmVyIGluc3RhbmNlcy4gKi9cbmxldCBtb2R1bGVWZXJzaW9uU2VxID0gMDtcblxuZXhwb3J0IGludGVyZmFjZSBIb3RSZWxvYWRTZXJ2ZXJFdmVudHMge1xuXHRzdGFydDogW107XG5cdHJlYm9vdDogW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB7XG5cdC8qKiBCdWlsZCBjb25maWd1cmF0aW9uIG5hbWUuICovXG5cdGJ1aWxkQ29uZmlnOiBzdHJpbmc7XG5cdC8qKiBOYW1lIG9mIHRoZSBwcm9qZWN0IHRvIHNlcnZlLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcHJvamVjdCBpbiB0aGUgd29ya3NwYWNlLiAqL1xuXHRwcm9qZWN0Pzogc3RyaW5nO1xuXHQvKipcblx0ICogTXVsdGlwbGUgRmx1eCBhcHAgcGFja2FnZSBuYW1lcyB0byBib290IGluIG9uZSBwcm9jZXNzIChkaXJlY3Rvcnkgc2xpY2UpLlxuXHQgKiBXaGVuIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHtAbGluayBwcm9qZWN0fS5cblx0ICovXG5cdHByb2plY3RzPzogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKlxuXHQgKiBQcmUtYnVpbHQgV29ya3NwYWNlIGluc3RhbmNlIHRvIHVzZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgV29ya3NwYWNlRmFjdG9yeS5cblx0ICogVXNlZnVsIGluIHRlc3RzIHRvIGJ5cGFzcyBmaWxlc3lzdGVtLWJhc2VkIHdvcmtzcGFjZSBkaXNjb3ZlcnkuXG5cdCAqL1xuXHR3b3Jrc3BhY2U/OiBXb3Jrc3BhY2U7XG5cdC8qKlxuXHQgKiBRdWlldCB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIHRoZSBsYXN0IGFmZmVjdGluZyBzYXZlIGJlZm9yZSBhIHJlYm9vdC5cblx0ICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TfS4gUmFpc2UgdGhpcyBmb3IgYWdlbnQgc2F2ZSB0cmFpbnMuXG5cdCAqL1xuXHRyZWJvb3REZWJvdW5jZU1zPzogbnVtYmVyO1xufVxuXG50eXBlIEVudHJ5U3RhdGUgPSB7IHBhdGg6IHN0cmluZzsgbW9kdWxlPzogQXN5bmNEaXNwb3NhYmxlIH07XG5cbmV4cG9ydCBjbGFzcyBIb3RSZWxvYWRTZXJ2ZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXI8SG90UmVsb2FkU2VydmVyRXZlbnRzPiB7XG5cdC8vIOKUgOKUgCBTdGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlciA9IHNjcmliZS5sb2dnZXIoSG90UmVsb2FkU2VydmVyLm5hbWUpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGxvYWRlciA9IG5ldyBTb3VyY2VNb2R1bGVMb2FkZXIoKTtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHQvKiogQWJzb2x1dGUgZW50cnkgcGF0aHMgY3VycmVudGx5IHNlcnZlZCAob25lIG9yIG1vcmUgRmx1eCBhcHBzKS4gKi9cblx0cHJpdmF0ZSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIEVudHJ5U3RhdGU+KCk7XG5cdHByaXZhdGUgcGVuZGluZ0VudHJ5UmVib290cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnJlYm9vdFRhaWwgPSBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0dGhpcy5iaW5kU2NoZWR1bGVSZWJvb3QocmVzb2x2ZVJlYm9vdERlYm91bmNlTXMob3B0aW9ucy5yZWJvb3REZWJvdW5jZU1zKSk7XG5cblx0XHRjb25zdCB7IGJ1aWxkQ29uZmlnIH0gPSBvcHRpb25zO1xuXG5cdFx0YXdhaXQgdGhpcy5sb2FkZXIuY29uZmlndXJlKHtcblx0XHRcdGJ1aWxkQ29uZmlnLFxuXHRcdFx0d29ya3NwYWNlOiBvcHRpb25zLndvcmtzcGFjZSxcblx0XHRcdHZlcnNpb25GaWxlVXJsOiAoZmlsZVVybCkgPT4gdGhpcy5nZXRDYWNoZWRPck5ldyhmaWxlVXJsKSxcblx0XHRcdG9uUmVzb2x2ZWQ6IHRoaXMub25Qb3N0UmVzb2x2ZSxcblx0XHR9KTtcblxuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMucmVxdWlyZVdvcmtzcGFjZSgpO1xuXHRcdGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWcsIG9wdGlvbnMpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBzZWxlY3RlZCkge1xuXHRcdFx0Y29uc3QgZW50cnlQYXRoID0gcGF0aC5yZXNvbHZlKHByb2plY3QuZ2V0U291cmNlRW50cnlQYXRoKCkpO1xuXHRcdFx0dGhpcy5lbnRyaWVzLnNldChlbnRyeVBhdGgsIHsgcGF0aDogZW50cnlQYXRoIH0pO1xuXHRcdH1cblxuXHRcdHRoaXMubG9hZGVyLnJlZ2lzdGVySG9va3MoKTtcblx0XHR0aGlzLmludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpO1xuXG5cdFx0YXdhaXQgd29ya3NwYWNlLndhdGNoKGJ1aWxkQ29uZmlnKTtcblx0XHR0aGlzLndhdGNoU3Vic2NyaXB0aW9uID0gd29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKHRoaXMub25GaWxlQ2hhbmdlKTtcblxuXHRcdGZvciAoY29uc3QgZW50cnkgb2YgdGhpcy5lbnRyaWVzLnZhbHVlcygpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShgU2VydmluZyAke2VudHJ5LnBhdGh9YCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmVtaXQoXCJzdGFydFwiKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBkaXNwb3NlKCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0dGhpcy5kaXNwb3NlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3REZWJvdW5jZUdlbiArPSAxO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG5cdFx0YXdhaXQgdGhpcy5yZWJvb3RUYWlsO1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXMoWy4uLnRoaXMuZW50cmllcy5rZXlzKCldKTtcblx0XHR0aGlzLmxvYWRlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuXHR9XG5cblx0Ly8g4pSA4pSAIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyaWVzKGVudHJ5UGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG5cdFx0YXdhaXQgUHJvbWlzZS5hbGwoZW50cnlQYXRocy5tYXAoKGVudHJ5UGF0aCkgPT4gdGhpcy5ib290RW50cnkoZW50cnlQYXRoKSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBib290RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcblx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQoZW50cnlQYXRoKTtcblx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBtb2QgPSAoYXdhaXQgdGhpcy5sb2FkZXIuaW1wb3J0RW50cnkoZW50cnlQYXRoKSkgYXMge1xuXHRcdFx0XHRkZWZhdWx0PzogQXN5bmNEaXNwb3NhYmxlO1xuXHRcdFx0fTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IG1vZD8uZGVmYXVsdDtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdFwiVGhlcmUgd2FzIGFuIGVycm9yIGJvb3RpbmcgdGhlIGVudHJ5IHBvaW50LiBZb3VyIGFwcGxpY2F0aW9uIG1heSBub3QgZnVuY3Rpb24gYXMgZXhwZWN0ZWRcIixcblx0XHRcdFx0ZXJyb3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYmluZFNjaGVkdWxlUmVib290KGRlbGF5TXM6IG51bWJlcikge1xuXHRcdGNvbnN0IGdlbiA9ICsrdGhpcy5yZWJvb3REZWJvdW5jZUdlbjtcblx0XHR0aGlzLnNjaGVkdWxlUmVib290ID0gZGVib3VuY2UoYXN5bmMgKCkgPT4ge1xuXHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQgfHwgZ2VuICE9PSB0aGlzLnJlYm9vdERlYm91bmNlR2VuKSByZXR1cm47XG5cdFx0XHR0aGlzLnJlcXVlc3RSZWJvb3QoKTtcblx0XHR9LCBkZWxheU1zKTtcblx0fVxuXG5cdHByaXZhdGUgcmVxdWVzdFJlYm9vdCgpIHtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdGlmICh0aGlzLnJlYm9vdEluRmxpZ2h0KSB7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gdHJ1ZTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0aWYgKHRoaXMucmVib290UXVldWVkKSByZXR1cm47XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSB0cnVlO1xuXHRcdHRoaXMucmVib290VGFpbCA9IHRoaXMucmVib290VGFpbC50aGVuKFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHRcdCgpID0+IHRoaXMucnVuUmVib290KCksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuUmVib290KCkge1xuXHRcdHRoaXMucmVib290UXVldWVkID0gZmFsc2U7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gdHJ1ZTtcblx0XHR0cnkge1xuXHRcdFx0ZG8ge1xuXHRcdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0XHRcdGNvbnN0IHRvUmVib290ID1cblx0XHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuc2l6ZSA+IDBcblx0XHRcdFx0XHRcdD8gWy4uLnRoaXMucGVuZGluZ0VudHJ5UmVib290c11cblx0XHRcdFx0XHRcdDogWy4uLnRoaXMuZW50cmllcy5rZXlzKCldO1xuXHRcdFx0XHR0aGlzLnBlbmRpbmdFbnRyeVJlYm9vdHMuY2xlYXIoKTtcblx0XHRcdFx0Ly8gRHJvcCByZXZlcnNlIGVkZ2VzIG9ubHkgd2hlbiByZWJvb3Rpbmcgc28gbGF0ZXIgc2F2ZXMgaW4gdGhlIGRlYm91bmNlXG5cdFx0XHRcdC8vIHdpbmRvdyBjYW4gc3RpbGwgd2FsayB0aGUgZ3JhcGggYW5kIHJlc2V0IHRoZSBxdWlldCB0aW1lci5cblx0XHRcdFx0dGhpcy5wcnVuZVBlbmRpbmdEZXBlbmRlbmN5RWRnZXMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJlYm9vdGluZyAke3RvUmVib290Lmxlbmd0aH0gZW50cnkgbW9kdWxlKHMpYCk7XG5cdFx0XHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJpZXModG9SZWJvb3QpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0dGhpcy5lbWl0KFwicmVib290XCIpO1xuXHRcdFx0fSB3aGlsZSAodGhpcy5yZWJvb3RGb2xsb3dVcCAmJiAhdGhpcy5kaXNwb3NlZCk7XG5cdFx0fSBmaW5hbGx5IHtcblx0XHRcdGNvbnN0IG5lZWRzRm9sbG93VXAgPSB0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkO1xuXHRcdFx0dGhpcy5yZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZWJvb3RJbkZsaWdodCA9IGZhbHNlO1xuXHRcdFx0aWYgKG5lZWRzRm9sbG93VXApIHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmRpc3Bvc2VFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGRpc3Bvc2VFbnRyeShlbnRyeVBhdGg/OiBzdHJpbmcpIHtcblx0XHRjb25zdCBwYXRocyA9IGVudHJ5UGF0aCAhPSBudWxsID8gW2VudHJ5UGF0aF0gOiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0Zm9yIChjb25zdCBwIG9mIHBhdGhzKSB7XG5cdFx0XHRjb25zdCBzdGF0ZSA9IHRoaXMuZW50cmllcy5nZXQocCk7XG5cdFx0XHRpZiAoc3RhdGUgPT0gbnVsbCkgY29udGludWU7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHN0YXRlLm1vZHVsZTtcblx0XHRcdHN0YXRlLm1vZHVsZSA9IHVuZGVmaW5lZDtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGVudHJ5Py5bU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKFwiRW50cnkgYXN5bmNEaXNwb3NlIGZhaWxlZFwiLCBlcnJvcik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8g4pSA4pSAIFNldHVwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgcmVxdWlyZVdvcmtzcGFjZSgpOiBXb3Jrc3BhY2Uge1xuXHRcdGNvbnN0IHdvcmtzcGFjZSA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpO1xuXHRcdGlmICh3b3Jrc3BhY2UgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiU291cmNlTW9kdWxlTG9hZGVyIGhhcyBubyB3b3Jrc3BhY2UgYWZ0ZXIgY29uZmlndXJlXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gd29ya3NwYWNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlUHJvamVjdHMoYnVpbGRDb25maWc6IHN0cmluZywgb3B0aW9uczogSG90UmVsb2FkU2VydmVyT3B0aW9ucyk6IFByb2plY3RbXSB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLmxvYWRlci5nZXRXb3Jrc3BhY2UoKT8uZ2V0UHJvamVjdHMoYnVpbGRDb25maWcpID8/IFtdO1xuXHRcdGNvbnN0IG5hbWVzID1cblx0XHRcdG9wdGlvbnMucHJvamVjdHMgIT0gbnVsbCAmJiBvcHRpb25zLnByb2plY3RzLmxlbmd0aCA+IDBcblx0XHRcdFx0PyBvcHRpb25zLnByb2plY3RzXG5cdFx0XHRcdDogb3B0aW9ucy5wcm9qZWN0ICE9IG51bGxcblx0XHRcdFx0XHQ/IFtvcHRpb25zLnByb2plY3RdXG5cdFx0XHRcdFx0OiB1bmRlZmluZWQ7XG5cblx0XHRpZiAobmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgZmlyc3QgPSBwcm9qZWN0cy5hdCgwKTtcblx0XHRcdGlmIChmaXJzdCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gcHJvamVjdHMgZm91bmQgZm9yIGNvbmZpZ3VyYXRpb246ICR7YnVpbGRDb25maWd9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gW2ZpcnN0XTtcblx0XHR9XG5cblx0XHRjb25zdCBzZWxlY3RlZDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG5cdFx0XHRjb25zdCBmb3VuZCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG5cdFx0XHRpZiAoZm91bmQgPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFByb2plY3QgXCIke25hbWV9XCIgbm90IGZvdW5kIGluIHdvcmtzcGFjZWApO1xuXHRcdFx0fVxuXHRcdFx0c2VsZWN0ZWQucHVzaChmb3VuZCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBQb3N0LW5leHQgZGVwZW5kZW5jeSB0cmFja2VyOiByZWNvcmRzIHdoaWNoIHNvdXJjZSBmaWxlcyBpbXBvcnQgd2hpY2hcblx0ICogb3RoZXIgc291cmNlIGZpbGVzIHNvIHRoYXQgcmVsb2FkSWZBZmZlY3RlZCBjYW4gdHJhdmVyc2UgdGhlIGdyYXBoLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBvc3RSZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXG5cdFx0bGV0IGZpbGVQYXRoOiBzdHJpbmc7XG5cdFx0bGV0IHBhcmVudFBhdGg6IHN0cmluZztcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cdFx0XHR1cmxPYmouc2VhcmNoID0gXCJcIjtcblx0XHRcdGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aCh1cmxPYmoudG9TdHJpbmcoKSk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHBhcmVudFBhdGggPSBpby5maWxlVXJsVG9QYXRoKHBhcmVudFVybENsZWFuKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHBhcmVudFBhdGggPSBcIlwiO1xuXHRcdH1cblxuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShmaWxlUGF0aCk7XG5cdFx0Y29uc3QgcGFyZW50SXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKHBhcmVudFBhdGgpO1xuXG5cdFx0aWYgKGlzU291cmNlIHx8IHBhcmVudElzU291cmNlKSB7XG5cdFx0XHR0aGlzLnRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aCwgcGFyZW50UGF0aCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8vIOKUgOKUgCBGaWxlIHdhdGNoaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgb25GaWxlQ2hhbmdlID0gKGV2dDogUHJvamVjdEZpbGVFdmVudCkgPT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgZXZlbnROYW1lLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0Y29uc3QgZnVsbFBhdGggPSBmaWxlLmZ1bGxQYXRoO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYEZpbGUgJHtldmVudE5hbWV9OiAke2Z1bGxQYXRofWApO1xuXG5cdFx0aWYgKGV2ZW50TmFtZSA9PT0gaW8uV2F0Y2hFdmVudHMudW5saW5rKSB7XG5cdFx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZ1bGxQYXRoLCBudWxsKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy5hZGQpIHtcblx0XHRcdGlmIChwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0XHR0aGlzLmxvYWRlci5zZXRTb3VyY2VGaWxlKGZ1bGxQYXRoLCBwcm9qZWN0KTtcblx0XHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGNoYW5nZVxuXHRcdGlmICghcHJvamVjdC5pc1NvdXJjZUZpbGUoZmlsZSkpIHJldHVybjtcblx0XHR0aGlzLmxvYWRlci5pbnZhbGlkYXRlVHJhbnNwaWxlKGZ1bGxQYXRoKTtcblx0XHR0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZGVwcyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGZ1bGxQYXRoKTtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLm5ldyBTZXQoWy4uLmRlcHMsIGZ1bGxQYXRoXSldO1xuXHRcdGNvbnN0IGFmZmVjdGVkRW50cmllcyA9IFsuLi50aGlzLmVudHJpZXMua2V5cygpXS5maWx0ZXIoKGVudHJ5UGF0aCkgPT5cblx0XHRcdG1vZHVsZXMuaW5jbHVkZXMoZW50cnlQYXRoKSxcblx0XHQpO1xuXG5cdFx0aWYgKGFmZmVjdGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gZG9lcyBub3QgYWZmZWN0IGVudHJ5IOKAlCBza2lwcGluZyByZWxvYWRgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdGBDaGFuZ2UgaW4gJHtmdWxsUGF0aH0gYWZmZWN0cyAke21vZHVsZXMubGVuZ3RofSBtb2R1bGUocykg4oCUIHNjaGVkdWxpbmcgcmVsb2FkYCxcblx0XHQpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyguLi5tb2R1bGVzKTtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdHcmFwaFBydW5lLmFkZChtb2R1bGUpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGVudHJ5UGF0aCBvZiBhZmZlY3RlZEVudHJpZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5hZGQoZW50cnlQYXRoKTtcblx0XHR9XG5cdFx0dGhpcy5zY2hlZHVsZVJlYm9vdCgpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8g4pSA4pSAIERlcGVuZGVuY3kgZ3JhcGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5R3JhcGgobW9kdWxlSWQ6IHN0cmluZywgcGFyZW50TW9kdWxlczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSByZXR1cm4gW107XG5cblx0XHRjb25zdCBtb2R1bGVEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KG1vZHVsZUlkKSA/PyBbXTtcblx0XHRpZiAocGFyZW50TW9kdWxlcy5pbmNsdWRlcyhtb2R1bGVJZCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLmVycm9yKGBDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQ6ICR7bW9kdWxlSWR9YCk7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0bGV0IHN1YkRlcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkZXAgb2YgbW9kdWxlRGVwcykge1xuXHRcdFx0aWYgKCF0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGRlcCkpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3Qgc3VicyA9IHRoaXMuZ2V0RGVwZW5kZW5jeUdyYXBoKGRlcCwgW21vZHVsZUlkLCAuLi5wYXJlbnRNb2R1bGVzXSk7XG5cdFx0XHRzdWJEZXBzID0gWy4uLnN1YkRlcHMsIC4uLnN1YnNdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbLi4ubmV3IFNldChbLi4ubW9kdWxlRGVwcywgLi4uc3ViRGVwc10pXTtcblx0fVxuXG5cdHByaXZhdGUgdHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoOiBzdHJpbmcsIHBhcmVudFBhdGg6IHN0cmluZykge1xuXHRcdGlmICghcGFyZW50UGF0aCkgcmV0dXJuO1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoZmlsZVBhdGgpID8/IFtdO1xuXHRcdGNvbnN0IHVwZGF0ZWREZXBzID0gbmV3IFNldChbLi4uZGVwcywgcGFyZW50UGF0aF0pO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChmaWxlUGF0aCwgWy4uLnVwZGF0ZWREZXBzXSk7XG5cdH1cblxuXHQvLyDilIDilIAgTW9kdWxlIGNhY2hlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0Q2FjaGVkT3JOZXcobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgobW9kdWxlVXJsKTtcblx0XHRjb25zdCBjYWNoZWQgPSB0aGlzLm1vZHVsZUNhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0Y29uc3QgdmVyc2lvbmVkID0gY2FjaGVkID8/IHRoaXMudmVyc2lvbk1vZHVsZShtb2R1bGVVcmwpO1xuXHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCB2ZXJzaW9uZWQpO1xuXHRcdHJldHVybiB2ZXJzaW9uZWQ7XG5cdH1cblxuXHRwcml2YXRlIHZlcnNpb25Nb2R1bGUobW9kdWxlVXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCB2ZXJzaW9uZWRVcmwgPSBuZXcgVVJMKG1vZHVsZVVybCk7XG5cdFx0dmVyc2lvbmVkVXJsLnNlYXJjaFBhcmFtcy5zZXQoVkVSU0lPTl9VUkxfUEFSQU0sIFN0cmluZygrK21vZHVsZVZlcnNpb25TZXEpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVNb2R1bGVDYWNoZXMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChtb2R1bGUsIG51bGwpO1xuXHRcdFx0dGhpcy5sb2FkZXIuaW52YWxpZGF0ZVRyYW5zcGlsZShtb2R1bGUpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcHJ1bmVQZW5kaW5nRGVwZW5kZW5jeUVkZ2VzKCkge1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4udGhpcy5wZW5kaW5nR3JhcGhQcnVuZV07XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzKTtcblx0fVxuXG5cdC8qKiBSZW1vdmUgdGhlc2UgbW9kdWxlcyBhcyBwYXJlbnRzIHNvIGJvb3QgY2FuIHJlYnVpbGQgZWRnZXMgd2l0aG91dCBzdGFsZSBpbXBvcnRlcnMuICovXG5cdHByaXZhdGUgcHJ1bmVEZXBlbmRlbmN5UGFyZW50cyguLi5tb2R1bGVzOiBzdHJpbmdbXSkge1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdGZvciAoY29uc3QgW2tleSwgcGFyZW50c10gb2YgdGhpcy5kZXBlbmRlbmNpZXMpIHtcblx0XHRcdFx0Y29uc3QgZmlsdGVyZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbW9kdWxlKTtcblx0XHRcdFx0aWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLmRlbGV0ZShrZXkpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChrZXksIGZpbHRlcmVkKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCkge1xuXHRcdGZvciAoY29uc3QgZmlsZVBhdGggb2YgdGhpcy5sb2FkZXIuc291cmNlRmlsZVBhdGhzKCkpIHtcblx0XHRcdHRoaXMubW9kdWxlQ2FjaGUuc2V0KGZpbGVQYXRoLCBudWxsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGlzU2VsZihmaWxlUGF0aDogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIGN1cnJlbnRGaWxlUGF0aCA9PT0gcGF0aC5yZXNvbHZlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkV2ZW50RW1pdHRlciIsInBhdGgiLCJpbyIsImRlYm91bmNlIiwic2NyaWJlIiwiU291cmNlTW9kdWxlTG9hZGVyIiwiY3VycmVudEZpbGVQYXRoIiwiZmlsZVVybFRvUGF0aCIsInVybCIsIlZFUlNJT05fVVJMX1BBUkFNIiwiREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMiLCJyZXNvbHZlUmVib290RGVib3VuY2VNcyIsInZhbHVlIiwiZGVsYXkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsIkVycm9yIiwiU3RyaW5nIiwibW9kdWxlVmVyc2lvblNlcSIsIkhvdFJlbG9hZFNlcnZlciIsImxvZ2dlciIsIm5hbWUiLCJsb2FkZXIiLCJkaXNwb3NlZCIsImVudHJpZXMiLCJNYXAiLCJwZW5kaW5nRW50cnlSZWJvb3RzIiwiU2V0Iiwid2F0Y2hTdWJzY3JpcHRpb24iLCJtb2R1bGVDYWNoZSIsImRlcGVuZGVuY2llcyIsInJlYm9vdFRhaWwiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlYm9vdERlYm91bmNlR2VuIiwicmVib290SW5GbGlnaHQiLCJyZWJvb3RGb2xsb3dVcCIsInJlYm9vdFF1ZXVlZCIsInBlbmRpbmdHcmFwaFBydW5lIiwic2NoZWR1bGVSZWJvb3QiLCJzdGFydCIsIm9wdGlvbnMiLCJjbGVhciIsImJpbmRTY2hlZHVsZVJlYm9vdCIsInJlYm9vdERlYm91bmNlTXMiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyZSIsIndvcmtzcGFjZSIsInZlcnNpb25GaWxlVXJsIiwiZmlsZVVybCIsImdldENhY2hlZE9yTmV3Iiwib25SZXNvbHZlZCIsIm9uUG9zdFJlc29sdmUiLCJyZXF1aXJlV29ya3NwYWNlIiwic2VsZWN0ZWQiLCJyZXNvbHZlUHJvamVjdHMiLCJwcm9qZWN0IiwiZW50cnlQYXRoIiwiZ2V0U291cmNlRW50cnlQYXRoIiwic2V0IiwicmVnaXN0ZXJIb29rcyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsImVudHJ5IiwidmFsdWVzIiwidHJhY2UiLCJib290RW50cmllcyIsImtleXMiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiZGlzcG9zZUVudHJpZXMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJlbnRyeVBhdGhzIiwiYWxsIiwibWFwIiwiYm9vdEVudHJ5Iiwic3RhdGUiLCJnZXQiLCJtb2QiLCJpbXBvcnRFbnRyeSIsIm1vZHVsZSIsImRlZmF1bHQiLCJlcnJvciIsInVuZGVmaW5lZCIsImRlbGF5TXMiLCJnZW4iLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsImxlbmd0aCIsIm5lZWRzRm9sbG93VXAiLCJkaXNwb3NlRW50cnkiLCJwYXRocyIsInAiLCJnZXRXb3Jrc3BhY2UiLCJwcm9qZWN0cyIsImdldFByb2plY3RzIiwibmFtZXMiLCJmaXJzdCIsImF0IiwiZm91bmQiLCJmaW5kIiwicHVzaCIsInJlc3VsdCIsInBhcmVudFVybCIsInBhcmVudFVybENsZWFuIiwic3BsaXQiLCJmaWxlUGF0aCIsInBhcmVudFBhdGgiLCJ1cmxPYmoiLCJVUkwiLCJzZWFyY2giLCJ0b1N0cmluZyIsImlzU291cmNlIiwiaGFzU291cmNlRmlsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZXZ0IiwiZmlsZSIsImV2ZW50TmFtZSIsImZ1bGxQYXRoIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJpbnZhbGlkYXRlVHJhbnNwaWxlIiwiYWRkIiwiaXNTb3VyY2VGaWxlIiwic2V0U291cmNlRmlsZSIsInJlbG9hZElmQWZmZWN0ZWQiLCJkZXBzIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlcyIsImFmZmVjdGVkRW50cmllcyIsImZpbHRlciIsImluY2x1ZGVzIiwiaW52YWxpZGF0ZU1vZHVsZUNhY2hlcyIsIm1vZHVsZUlkIiwicGFyZW50TW9kdWxlcyIsImlzU2VsZiIsIm1vZHVsZURlcHMiLCJzdWJEZXBzIiwiZGVwIiwic3VicyIsInVwZGF0ZWREZXBzIiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsInNlYXJjaFBhcmFtcyIsInBydW5lRGVwZW5kZW5jeVBhcmVudHMiLCJrZXkiLCJwYXJlbnRzIiwiZmlsdGVyZWQiLCJkZWxldGUiLCJzb3VyY2VGaWxlUGF0aHMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFlBQVksUUFBUSxjQUFjO0FBRTNDLE9BQU9DLFVBQVUsWUFBWTtBQUU3QixTQUFTQyxFQUFFLFFBQVEscUJBQXFCO0FBQ3hDLFNBQVNDLFFBQVEsUUFBUSx5QkFBeUI7QUFDbEQsU0FBc0JDLE1BQU0sUUFBUSxtQkFBbUI7QUFFdkQsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBRS9ELE1BQU1DLGtCQUFrQkosR0FBR0ssYUFBYSxDQUFDLFlBQVlDLEdBQUc7QUFDeEQsTUFBTUMsb0JBQW9CO0FBQzFCLHNEQUFzRCxHQUN0RCxPQUFPLE1BQU1DLDZCQUE2QixJQUFJO0FBRTlDLE9BQU8sU0FBU0Msd0JBQXdCQyxLQUF5QjtJQUNoRSxNQUFNQyxRQUFRRCxTQUFTRjtJQUN2QixJQUFJLENB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
421
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCwgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9zeXN0ZW1cIjtcbmltcG9ydCB7IHR5cGUgTG9nZ2VyLCBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHR5cGUgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU291cmNlTW9kdWxlTG9hZGVyIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcblxuY29uc3QgY3VycmVudEZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChpbXBvcnQubWV0YS51cmwpO1xuY29uc3QgVkVSU0lPTl9VUkxfUEFSQU0gPSBcInZlcnNpb25cIjtcbi8qKiBEZWZhdWx0IHF1aWV0IHdpbmRvdyBiZWZvcmUgYSBmaWxlLWNoYW5nZSByZWJvb3QuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMgPSAyNTA7XG4vKiogSG93IG1hbnkgdHJpZ2dlcmluZyBwYXRocyB0byBwcmludCBvbiB0aGUgaW5mbyBiYW5uZXIgYmVmb3JlIGArTmAuICovXG5jb25zdCBNQVhfUkVCT09UX1RSSUdHRVJfUEFUSFMgPSA0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlYm9vdERlYm91bmNlTXModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG5cdGNvbnN0IGRlbGF5ID0gdmFsdWUgPz8gREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVM7XG5cdGlmICghTnVtYmVyLmlzRmluaXRlKGRlbGF5KSB8fCBkZWxheSA8IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYHJlYm9vdERlYm91bmNlTXMgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIGdvdCAke1N0cmluZyh2YWx1ZSl9YCk7XG5cdH1cblx0cmV0dXJuIGRlbGF5O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUcmlnZ2VyTGlzdCh0cmlnZ2VyczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRpZiAodHJpZ2dlcnMubGVuZ3RoIDw9IE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykgcmV0dXJuIHRyaWdnZXJzLmpvaW4oXCIsIFwiKTtcblx0cmV0dXJuIGAke3RyaWdnZXJzLnNsaWNlKDAsIE1BWF9SRUJPT1RfVFJJR0dFUl9QQVRIUykuam9pbihcIiwgXCIpfSwgKyR7dHJpZ2dlcnMubGVuZ3RoIC0gTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTfWA7XG59XG5cbmNvbnN0IEJBTk5FUl9SVUxFID0gXCLilZBcIi5yZXBlYXQoNTYpO1xuXG5mdW5jdGlvbiB3cmFwRmx1eEJhbm5lcih0aXRsZTogc3RyaW5nLCBkZXRhaWxzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGNvbnN0IGJvZHkgPSBkZXRhaWxzLm1hcCgobGluZSkgPT4gYCAgJHtsaW5lfWApLmpvaW4oXCJcXG5cIik7XG5cdHJldHVybiBgXFxuJHtCQU5ORVJfUlVMRX1cXG4gICR7dGl0bGV9XFxuJHtib2R5fVxcbiR7QkFOTkVSX1JVTEV9XFxuYDtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIHN0YXJ0IGJsb2NrIOKAlCBrZWVwIGBmbHV4IHJlYm9vdGAgaW4gdGhlIHRleHQgc28gb3BlcmF0b3JzIGNhbiBzZWFyY2ggdGhlIGJ1ZmZlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290U3RhcnQoXG5cdGxhYmVsczogcmVhZG9ubHkgc3RyaW5nW10sXG5cdHRyaWdnZXJzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogc3RyaW5nIHtcblx0Y29uc3Qgd2hvID0gbGFiZWxzLmpvaW4oXCIsIFwiKSB8fCBcImVudHJ5XCI7XG5cdGNvbnN0IGZpbGVzID0gZm9ybWF0VHJpZ2dlckxpc3QodHJpZ2dlcnMpO1xuXHRjb25zdCBkZXRhaWxzID0gZmlsZXMgPT0gbnVsbCA/IFt3aG9dIDogW3dobywgZmlsZXNdO1xuXHRyZXR1cm4gd3JhcEZsdXhCYW5uZXIoXCJGTFVYIFJFQk9PVFwiLCBkZXRhaWxzKTtcbn1cblxuLyoqIEluZm8tbGV2ZWwgSE1SIGZpbmlzaCBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRGbHV4UmVib290UmVhZHkobGFiZWxzOiByZWFkb25seSBzdHJpbmdbXSwgZWxhcHNlZE1zOiBudW1iZXIpOiBzdHJpbmcge1xuXHRjb25zdCB3aG8gPSBsYWJlbHMuam9pbihcIiwgXCIpIHx8IFwiZW50cnlcIjtcblx0cmV0dXJuIHdyYXBGbHV4QmFubmVyKFwiRkxVWCBSRUFEWVwiLCBbd2hvLCBgJHtNYXRoLm1heCgwLCBNYXRoLnJvdW5kKGVsYXBzZWRNcykpfW1zYF0pO1xufVxuXG4vKiogUHJvY2Vzcy13aWRlOiBOb2RlJ3MgRVNNIGNhY2hlIGlzIHByb2Nlc3MtZ2xvYmFsLCBpbmNsdWRpbmcgYWNyb3NzIEhvdFJlbG9hZFNlcnZlciBpbnN0YW5jZXMuICovXG5sZXQgbW9kdWxlVmVyc2lvblNlcSA9IDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0c3RhcnQ6IFtdO1xuXHRyZWJvb3Q6IFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdFJlbG9hZFNlcnZlck9wdGlvbnMge1xuXHQvKiogQnVpbGQgY29uZmlndXJhdGlvbiBuYW1lLiAqL1xuXHRidWlsZENvbmZpZzogc3RyaW5nO1xuXHQvKiogTmFtZSBvZiB0aGUgcHJvamVjdCB0byBzZXJ2ZS4gRGVmYXVsdHMgdG8gdGhlIGZpcnN0IHByb2plY3QgaW4gdGhlIHdvcmtzcGFjZS4gKi9cblx0cHJvamVjdD86IHN0cmluZztcblx0LyoqXG5cdCAqIE11bHRpcGxlIEZsdXggYXBwIHBhY2thZ2UgbmFtZXMgdG8gYm9vdCBpbiBvbmUgcHJvY2VzcyAoZGlyZWN0b3J5IHNsaWNlKS5cblx0ICogV2hlbiBzZXQsIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB7QGxpbmsgcHJvamVjdH0uXG5cdCAqL1xuXHRwcm9qZWN0cz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKipcblx0ICogUHJlLWJ1aWx0IFdvcmtzcGFjZSBpbnN0YW5jZSB0byB1c2UgaW5zdGVhZCBvZiBydW5uaW5nIFdvcmtzcGFjZUZhY3RvcnkuXG5cdCAqIFVzZWZ1bCBpbiB0ZXN0cyB0byBieXBhc3MgZmlsZXN5c3RlbS1iYXNlZCB3b3Jrc3BhY2UgZGlzY292ZXJ5LlxuXHQgKi9cblx0d29ya3NwYWNlPzogV29ya3NwYWNlO1xuXHQvKipcblx0ICogUXVpZXQgd2luZG93IGluIG1pbGxpc2Vjb25kcyBhZnRlciB0aGUgbGFzdCBhZmZlY3Rpbmcgc2F2ZSBiZWZvcmUgYSByZWJvb3QuXG5cdCAqIERlZmF1bHRzIHRvIHtAbGluayBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NU30uIFJhaXNlIHRoaXMgZm9yIGFnZW50IHNhdmUgdHJhaW5zLlxuXHQgKi9cblx0cmVib290RGVib3VuY2VNcz86IG51bWJlcjtcbn1cblxudHlwZSBFbnRyeVN0YXRlID0geyBwYXRoOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmc7IG1vZHVsZT86IEFzeW5jRGlzcG9zYWJsZSB9O1xuXG5leHBvcnQgY2xhc3MgSG90UmVsb2FkU2VydmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyPEhvdFJlbG9hZFNlcnZlckV2ZW50cz4ge1xuXHQvLyDilIDilIAgU3RhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKEhvdFJlbG9hZFNlcnZlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXIgPSBuZXcgU291cmNlTW9kdWxlTG9hZGVyKCk7XG5cdHByaXZhdGUgZGlzcG9zZWQgPSBmYWxzZTtcblx0LyoqIEFic29sdXRlIGVudHJ5IHBhdGhzIGN1cnJlbnRseSBzZXJ2ZWQgKG9uZSBvciBtb3JlIEZsdXggYXBwcykuICovXG5cdHByaXZhdGUgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBFbnRyeVN0YXRlPigpO1xuXHRwcml2YXRlIHBlbmRpbmdFbnRyeVJlYm9vdHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0LyoqIFNvdXJjZSBwYXRocyB0aGF0IHNjaGVkdWxlZCB0aGUgbmV4dCByZWJvb3QgKGNsZWFyZWQgd2hlbiB0aGF0IHJlYm9vdCBzdGFydHMpLiAqL1xuXHRwcml2YXRlIHBlbmRpbmdUcmlnZ2VycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRwcml2YXRlIHdhdGNoU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXHRwcml2YXRlIG1vZHVsZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KCk7XG5cdHByaXZhdGUgZGVwZW5kZW5jaWVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXHRwcml2YXRlIHJlYm9vdFRhaWw6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblx0cHJpdmF0ZSByZWJvb3REZWJvdW5jZUdlbiA9IDA7XG5cdHByaXZhdGUgcmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0cHJpdmF0ZSByZWJvb3RGb2xsb3dVcCA9IGZhbHNlO1xuXHRwcml2YXRlIHJlYm9vdFF1ZXVlZCA9IGZhbHNlO1xuXHQvKiogTW9kdWxlcyB3aG9zZSByZXZlcnNlLWdyYXBoIGVkZ2VzIGFyZSBwcnVuZWQgYXQgcmVib290LCBub3Qgb24gc2NoZWR1bGUuICovXG5cdHByaXZhdGUgcGVuZGluZ0dyYXBoUHJ1bmUgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0cHJpdmF0ZSBzY2hlZHVsZVJlYm9vdDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG5cdC8vIOKUgOKUgCBQdWJsaWMgQVBJIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBhc3luYyBzdGFydChvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKSB7XG5cdFx0dGhpcy5kaXNwb3NlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5jbGVhcigpO1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdHRoaXMucGVuZGluZ1RyaWdnZXJzLmNsZWFyKCk7XG5cdFx0dGhpcy5wZW5kaW5nR3JhcGhQcnVuZS5jbGVhcigpO1xuXHRcdHRoaXMucmVib290VGFpbCA9IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSBmYWxzZTtcblx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHR0aGlzLmJpbmRTY2hlZHVsZVJlYm9vdChyZXNvbHZlUmVib290RGVib3VuY2VNcyhvcHRpb25zLnJlYm9vdERlYm91bmNlTXMpKTtcblxuXHRcdGNvbnN0IHsgYnVpbGRDb25maWcgfSA9IG9wdGlvbnM7XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0YnVpbGRDb25maWcsXG5cdFx0XHR3b3Jrc3BhY2U6IG9wdGlvbnMud29ya3NwYWNlLFxuXHRcdFx0dmVyc2lvbkZpbGVVcmw6IChmaWxlVXJsKSA9PiB0aGlzLmdldENhY2hlZE9yTmV3KGZpbGVVcmwpLFxuXHRcdFx0b25SZXNvbHZlZDogdGhpcy5vblBvc3RSZXNvbHZlLFxuXHRcdH0pO1xuXG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5yZXF1aXJlV29ya3NwYWNlKCk7XG5cdFx0Y29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZywgb3B0aW9ucyk7XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHNlbGVjdGVkKSB7XG5cdFx0XHRjb25zdCBlbnRyeVBhdGggPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRTb3VyY2VFbnRyeVBhdGgoKSk7XG5cdFx0XHR0aGlzLmVudHJpZXMuc2V0KGVudHJ5UGF0aCwgeyBwYXRoOiBlbnRyeVBhdGgsIGxhYmVsOiBwcm9qZWN0Lm5hbWUgfSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUFsbFNvdXJjZUZpbGVzKCk7XG5cblx0XHRhd2FpdCB3b3Jrc3BhY2Uud2F0Y2goYnVpbGRDb25maWcpO1xuXHRcdHRoaXMud2F0Y2hTdWJzY3JpcHRpb24gPSB3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUodGhpcy5vbkZpbGVDaGFuZ2UpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeSBvZiB0aGlzLmVudHJpZXMudmFsdWVzKCkpIHtcblx0XHRcdHRoaXMubG9nZ2VyLnRyYWNlKGBTZXJ2aW5nICR7ZW50cnkucGF0aH1gKTtcblx0XHR9XG5cdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMuZW1pdChcInN0YXJ0XCIpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHR0aGlzLnJlYm9vdERlYm91bmNlR2VuICs9IDE7XG5cdFx0dGhpcy53YXRjaFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcblx0XHRhd2FpdCB0aGlzLnJlYm9vdFRhaWw7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlRW50cmllcyhbLi4udGhpcy5lbnRyaWVzLmtleXMoKV0pO1xuXHRcdHRoaXMubG9hZGVyLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG5cdFx0YXdhaXQgdGhpcy5kaXNwb3NlKCk7XG5cdH1cblxuXHQvLyDilIDilIAgTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgYXN5bmMgYm9vdEVudHJpZXMoZW50cnlQYXRoczogcmVhZG9ubHkgc3RyaW5nW10pIHtcblx0XHRhd2FpdCBQcm9taXNlLmFsbChlbnRyeVBhdGhzLm1hcCgoZW50cnlQYXRoKSA9PiB0aGlzLmJvb3RFbnRyeShlbnRyeVBhdGgpKSk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeShlbnRyeVBhdGg6IHN0cmluZykge1xuXHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChlbnRyeVBhdGgpO1xuXHRcdGlmIChzdGF0ZSA9PSBudWxsKSByZXR1cm47XG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IG1vZCA9IChhd2FpdCB0aGlzLmxvYWRlci5pbXBvcnRFbnRyeShlbnRyeVBhdGgpKSBhcyB7XG5cdFx0XHRcdGRlZmF1bHQ/OiBBc3luY0Rpc3Bvc2FibGU7XG5cdFx0XHR9O1xuXHRcdFx0c3RhdGUubW9kdWxlID0gbW9kPy5kZWZhdWx0O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRzdGF0ZS5tb2R1bGUgPSB1bmRlZmluZWQ7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihcblx0XHRcdFx0XCJUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZFwiLFxuXHRcdFx0XHRlcnJvcixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBiaW5kU2NoZWR1bGVSZWJvb3QoZGVsYXlNczogbnVtYmVyKSB7XG5cdFx0Y29uc3QgZ2VuID0gKyt0aGlzLnJlYm9vdERlYm91bmNlR2VuO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QgPSBkZWJvdW5jZShhc3luYyAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5kaXNwb3NlZCB8fCBnZW4gIT09IHRoaXMucmVib290RGVib3VuY2VHZW4pIHJldHVybjtcblx0XHRcdHRoaXMucmVxdWVzdFJlYm9vdCgpO1xuXHRcdH0sIGRlbGF5TXMpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXF1ZXN0UmVib290KCkge1xuXHRcdGlmICh0aGlzLmRpc3Bvc2VkKSByZXR1cm47XG5cdFx0aWYgKHRoaXMucmVib290SW5GbGlnaHQpIHtcblx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSB0cnVlO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAodGhpcy5yZWJvb3RRdWV1ZWQpIHJldHVybjtcblx0XHR0aGlzLnJlYm9vdFF1ZXVlZCA9IHRydWU7XG5cdFx0dGhpcy5yZWJvb3RUYWlsID0gdGhpcy5yZWJvb3RUYWlsLnRoZW4oXG5cdFx0XHQoKSA9PiB0aGlzLnJ1blJlYm9vdCgpLFxuXHRcdFx0KCkgPT4gdGhpcy5ydW5SZWJvb3QoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBydW5SZWJvb3QoKSB7XG5cdFx0dGhpcy5yZWJvb3RRdWV1ZWQgPSBmYWxzZTtcblx0XHRpZiAodGhpcy5kaXNwb3NlZCkgcmV0dXJuO1xuXHRcdHRoaXMucmVib290SW5GbGlnaHQgPSB0cnVlO1xuXHRcdHRyeSB7XG5cdFx0XHRkbyB7XG5cdFx0XHRcdHRoaXMucmVib290Rm9sbG93VXAgPSBmYWxzZTtcblx0XHRcdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHRcdFx0Y29uc3QgdG9SZWJvb3QgPVxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5zaXplID4gMFxuXHRcdFx0XHRcdFx0PyBbLi4udGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzXVxuXHRcdFx0XHRcdFx0OiBbLi4udGhpcy5lbnRyaWVzLmtleXMoKV07XG5cdFx0XHRcdHRoaXMucGVuZGluZ0VudHJ5UmVib290cy5jbGVhcigpO1xuXHRcdFx0XHQvLyBEcm9wIHJldmVyc2UgZWRnZXMgb25seSB3aGVuIHJlYm9vdGluZyBzbyBsYXRlciBzYXZlcyBpbiB0aGUgZGVib3VuY2Vcblx0XHRcdFx0Ly8gd2luZG93IGNhbiBzdGlsbCB3YWxrIHRoZSBncmFwaCBhbmQgcmVzZXQgdGhlIHF1aWV0IHRpbWVyLlxuXHRcdFx0XHR0aGlzLnBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpO1xuXHRcdFx0XHRjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuXHRcdFx0XHRjb25zdCBsYWJlbHMgPSB0aGlzLmxhYmVsc0Zvcih0b1JlYm9vdCk7XG5cdFx0XHRcdGNvbnN0IHRyaWdnZXJzID0gdGhpcy50YWtlVHJpZ2dlcnMoKTtcblx0XHRcdFx0dGhpcy5sb2dnZXIuaW5mbyhmb3JtYXRGbHV4UmVib290U3RhcnQobGFiZWxzLCB0cmlnZ2VycykpO1xuXHRcdFx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyaWVzKHRvUmVib290KTtcblx0XHRcdFx0YXdhaXQgdGhpcy5ib290RW50cmllcyh0b1JlYm9vdCk7XG5cdFx0XHRcdHRoaXMubG9nZ2VyLmluZm8oZm9ybWF0Rmx1eFJlYm9vdFJlYWR5KGxhYmVscywgRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCkpO1xuXHRcdFx0XHR0aGlzLmVtaXQoXCJyZWJvb3RcIik7XG5cdFx0XHR9IHdoaWxlICh0aGlzLnJlYm9vdEZvbGxvd1VwICYmICF0aGlzLmRpc3Bvc2VkKTtcblx0XHR9IGZpbmFsbHkge1xuXHRcdFx0Y29uc3QgbmVlZHNGb2xsb3dVcCA9IHRoaXMucmVib290Rm9sbG93VXAgJiYgIXRoaXMuZGlzcG9zZWQ7XG5cdFx0XHR0aGlzLnJlYm9vdEZvbGxvd1VwID0gZmFsc2U7XG5cdFx0XHR0aGlzLnJlYm9vdEluRmxpZ2h0ID0gZmFsc2U7XG5cdFx0XHRpZiAobmVlZHNGb2xsb3dVcCkgdGhpcy5yZXF1ZXN0UmVib290KCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cmllcyhlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSkge1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKGVudHJ5UGF0aHMubWFwKChlbnRyeVBhdGgpID0+IHRoaXMuZGlzcG9zZUVudHJ5KGVudHJ5UGF0aCkpKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZGlzcG9zZUVudHJ5KGVudHJ5UGF0aD86IHN0cmluZykge1xuXHRcdGNvbnN0IHBhdGhzID0gZW50cnlQYXRoICE9IG51bGwgPyBbZW50cnlQYXRoXSA6IFsuLi50aGlzLmVudHJpZXMua2V5cygpXTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgcGF0aHMpIHtcblx0XHRcdGNvbnN0IHN0YXRlID0gdGhpcy5lbnRyaWVzLmdldChwKTtcblx0XHRcdGlmIChzdGF0ZSA9PSBudWxsKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGVudHJ5ID0gc3RhdGUubW9kdWxlO1xuXHRcdFx0c3RhdGUubW9kdWxlID0gdW5kZWZpbmVkO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgZW50cnk/LltTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXCJFbnRyeSBhc3luY0Rpc3Bvc2UgZmFpbGVkXCIsIGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyDilIDilIAgU2V0dXAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSByZXF1aXJlV29ya3NwYWNlKCk6IFdvcmtzcGFjZSB7XG5cdFx0Y29uc3Qgd29ya3NwYWNlID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk7XG5cdFx0aWYgKHdvcmtzcGFjZSA9PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJTb3VyY2VNb2R1bGVMb2FkZXIgaGFzIG5vIHdvcmtzcGFjZSBhZnRlciBjb25maWd1cmVcIik7XG5cdFx0fVxuXHRcdHJldHVybiB3b3Jrc3BhY2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQcm9qZWN0cyhidWlsZENvbmZpZzogc3RyaW5nLCBvcHRpb25zOiBIb3RSZWxvYWRTZXJ2ZXJPcHRpb25zKTogUHJvamVjdFtdIHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMubG9hZGVyLmdldFdvcmtzcGFjZSgpPy5nZXRQcm9qZWN0cyhidWlsZENvbmZpZykgPz8gW107XG5cdFx0Y29uc3QgbmFtZXMgPVxuXHRcdFx0b3B0aW9ucy5wcm9qZWN0cyAhPSBudWxsICYmIG9wdGlvbnMucHJvamVjdHMubGVuZ3RoID4gMFxuXHRcdFx0XHQ/IG9wdGlvbnMucHJvamVjdHNcblx0XHRcdFx0OiBvcHRpb25zLnByb2plY3QgIT0gbnVsbFxuXHRcdFx0XHRcdD8gW29wdGlvbnMucHJvamVjdF1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblxuXHRcdGlmIChuYW1lcyA9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBmaXJzdCA9IHByb2plY3RzLmF0KDApO1xuXHRcdFx0aWYgKGZpcnN0ID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbjogJHtidWlsZENvbmZpZ31gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBbZmlyc3RdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHNlbGVjdGVkOiBQcm9qZWN0W10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gcHJvamVjdHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBuYW1lKTtcblx0XHRcdGlmIChmb3VuZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgUHJvamVjdCBcIiR7bmFtZX1cIiBub3QgZm91bmQgaW4gd29ya3NwYWNlYCk7XG5cdFx0XHR9XG5cdFx0XHRzZWxlY3RlZC5wdXNoKGZvdW5kKTtcblx0XHR9XG5cdFx0cmV0dXJuIHNlbGVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBvc3QtbmV4dCBkZXBlbmRlbmN5IHRyYWNrZXI6IHJlY29yZHMgd2hpY2ggc291cmNlIGZpbGVzIGltcG9ydCB3aGljaFxuXHQgKiBvdGhlciBzb3VyY2UgZmlsZXMgc28gdGhhdCByZWxvYWRJZkFmZmVjdGVkIGNhbiB0cmF2ZXJzZSB0aGUgZ3JhcGguXG5cdCAqL1xuXHRwcml2YXRlIG9uUG9zdFJlc29sdmUgPSAocmVzdWx0OiBSZXNvbHZlRm5PdXRwdXQsIHBhcmVudFVybDogc3RyaW5nKSA9PiB7XG5cdFx0Y29uc3QgeyB1cmwgfSA9IHJlc3VsdDtcblx0XHRjb25zdCBwYXJlbnRVcmxDbGVhbiA9IHBhcmVudFVybC5zcGxpdChcIj9cIilbMF07XG5cblx0XHRsZXQgZmlsZVBhdGg6IHN0cmluZztcblx0XHRsZXQgcGFyZW50UGF0aDogc3RyaW5nO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblx0XHRcdHVybE9iai5zZWFyY2ggPSBcIlwiO1xuXHRcdFx0ZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKHVybE9iai50b1N0cmluZygpKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0cGFyZW50UGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgocGFyZW50VXJsQ2xlYW4pO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cGFyZW50UGF0aCA9IFwiXCI7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXNTb3VyY2UgPSB0aGlzLmxvYWRlci5oYXNTb3VyY2VGaWxlKGZpbGVQYXRoKTtcblx0XHRjb25zdCBwYXJlbnRJc1NvdXJjZSA9IHRoaXMubG9hZGVyLmhhc1NvdXJjZUZpbGUocGFyZW50UGF0aCk7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KGZpbGVQYXRoLCBwYXJlbnRQYXRoKTtcblx0XHR9XG5cdH07XG5cblx0Ly8g4pSA4pSAIEZpbGUgd2F0Y2hpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cblx0cHJpdmF0ZSBvbkZpbGVDaGFuZ2UgPSAoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KSA9PiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBldmVudE5hbWUsIHByb2plY3QgfSA9IGV2dDtcblx0XHRjb25zdCBmdWxsUGF0aCA9IGZpbGUuZnVsbFBhdGg7XG5cblx0XHR0aGlzLmxvZ2dlci50cmFjZShgRmlsZSAke2V2ZW50TmFtZX06ICR7ZnVsbFBhdGh9YCk7XG5cblx0XHRpZiAoZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZnVsbFBhdGgsIG51bGwpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLmFkZCkge1xuXHRcdFx0aWYgKHByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRcdHRoaXMubG9hZGVyLnNldFNvdXJjZUZpbGUoZnVsbFBhdGgsIHByb2plY3QpO1xuXHRcdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0XHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gY2hhbmdlXG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkgcmV0dXJuO1xuXHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUoZnVsbFBhdGgpO1xuXHRcdHRoaXMucmVsb2FkSWZBZmZlY3RlZChmdWxsUGF0aCk7XG5cdH07XG5cblx0cHJpdmF0ZSByZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5nZXREZXBlbmRlbmN5R3JhcGgoZnVsbFBhdGgpO1xuXHRcdGNvbnN0IG1vZHVsZXMgPSBbLi4ubmV3IFNldChbLi4uZGVwcywgZnVsbFBhdGhdKV07XG5cdFx0Y29uc3QgYWZmZWN0ZWRFbnRyaWVzID0gWy4uLnRoaXMuZW50cmllcy5rZXlzKCldLmZpbHRlcigoZW50cnlQYXRoKSA9PlxuXHRcdFx0bW9kdWxlcy5pbmNsdWRlcyhlbnRyeVBhdGgpLFxuXHRcdCk7XG5cblx0XHRpZiAoYWZmZWN0ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhpcy5sb2dnZXIudHJhY2UoYENoYW5nZSBpbiAke2Z1bGxQYXRofSBkb2VzIG5vdCBhZmZlY3QgZW50cnkg4oCUIHNraXBwaW5nIHJlbG9hZGApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMubG9nZ2VyLnRyYWNlKFxuXHRcdFx0YENoYW5nZSBpbiAke2Z1bGxQYXRofSBhZmZlY3RzICR7bW9kdWxlcy5sZW5ndGh9IG1vZHVsZShzKSDigJQgc2NoZWR1bGluZyByZWxvYWRgLFxuXHRcdCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXMpO1xuXHRcdGZvciAoY29uc3QgbW9kdWxlIG9mIG1vZHVsZXMpIHtcblx0XHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuYWRkKG1vZHVsZSk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgZW50cnlQYXRoIG9mIGFmZmVjdGVkRW50cmllcykge1xuXHRcdFx0dGhpcy5wZW5kaW5nRW50cnlSZWJvb3RzLmFkZChlbnRyeVBhdGgpO1xuXHRcdH1cblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5hZGQoZnVsbFBhdGgpO1xuXHRcdHRoaXMuc2NoZWR1bGVSZWJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBEZXBlbmRlbmN5IGdyYXBoIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG5cdFx0aWYgKHRoaXMuaXNTZWxmKG1vZHVsZUlkKSkgcmV0dXJuIFtdO1xuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5sb2FkZXIuaGFzU291cmNlRmlsZShkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeShmaWxlUGF0aDogc3RyaW5nLCBwYXJlbnRQYXRoOiBzdHJpbmcpIHtcblx0XHRpZiAoIXBhcmVudFBhdGgpIHJldHVybjtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0Ly8g4pSA4pSAIE1vZHVsZSBjYWNoZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuXHRwcml2YXRlIGdldENhY2hlZE9yTmV3KG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKG1vZHVsZVVybCk7XG5cdFx0Y29uc3QgY2FjaGVkID0gdGhpcy5tb2R1bGVDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGNvbnN0IHZlcnNpb25lZCA9IGNhY2hlZCA/PyB0aGlzLnZlcnNpb25Nb2R1bGUobW9kdWxlVXJsKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgdmVyc2lvbmVkKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSB2ZXJzaW9uTW9kdWxlKG1vZHVsZVVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgdmVyc2lvbmVkVXJsID0gbmV3IFVSTChtb2R1bGVVcmwpO1xuXHRcdHZlcnNpb25lZFVybC5zZWFyY2hQYXJhbXMuc2V0KFZFUlNJT05fVVJMX1BBUkFNLCBTdHJpbmcoKyttb2R1bGVWZXJzaW9uU2VxKSk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZFVybC50b1N0cmluZygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHRcdHRoaXMubG9hZGVyLmludmFsaWRhdGVUcmFuc3BpbGUobW9kdWxlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcygpIHtcblx0XHRjb25zdCBtb2R1bGVzID0gWy4uLnRoaXMucGVuZGluZ0dyYXBoUHJ1bmVdO1xuXHRcdHRoaXMucGVuZGluZ0dyYXBoUHJ1bmUuY2xlYXIoKTtcblx0XHR0aGlzLnBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlcyk7XG5cdH1cblxuXHQvKiogUmVtb3ZlIHRoZXNlIG1vZHVsZXMgYXMgcGFyZW50cyBzbyBib290IGNhbiByZWJ1aWxkIGVkZ2VzIHdpdGhvdXQgc3RhbGUgaW1wb3J0ZXJzLiAqL1xuXHRwcml2YXRlIHBydW5lRGVwZW5kZW5jeVBhcmVudHMoLi4ubW9kdWxlczogc3RyaW5nW10pIHtcblx0XHRmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtrZXksIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRcdGNvbnN0IGZpbHRlcmVkID0gcGFyZW50cy5maWx0ZXIoKHApID0+IHAgIT09IG1vZHVsZSk7XG5cdFx0XHRcdGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5kZWxldGUoa2V5KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoa2V5LCBmaWx0ZXJlZCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHRoaXMubG9hZGVyLnNvdXJjZUZpbGVQYXRocygpKSB7XG5cdFx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmaWxlUGF0aCwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpc1NlbGYoZmlsZVBhdGg6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShmaWxlUGF0aCk7XG5cdH1cblxuXHRwcml2YXRlIGxhYmVsc0ZvcihlbnRyeVBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gZW50cnlQYXRocy5tYXAoXG5cdFx0XHQoZW50cnlQYXRoKSA9PiB0aGlzLmVudHJpZXMuZ2V0KGVudHJ5UGF0aCk/LmxhYmVsID8/IHBhdGguYmFzZW5hbWUoZW50cnlQYXRoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB0YWtlVHJpZ2dlcnMoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IHRyaWdnZXJzID0gWy4uLnRoaXMucGVuZGluZ1RyaWdnZXJzXS5tYXAoKGZ1bGxQYXRoKSA9PiB0aGlzLmZvcm1hdFRyaWdnZXIoZnVsbFBhdGgpKTtcblx0XHR0aGlzLnBlbmRpbmdUcmlnZ2Vycy5jbGVhcigpO1xuXHRcdHJldHVybiB0cmlnZ2Vycztcblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0VHJpZ2dlcihmdWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCByb290ID0gdGhpcy5sb2FkZXIuZ2V0V29ya3NwYWNlKCk/LnJvb3REaXI7XG5cdFx0aWYgKHJvb3QgIT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcmVsID0gcGF0aC5yZWxhdGl2ZShwYXRoLnJlc29sdmUocm9vdCksIGZ1bGxQYXRoKTtcblx0XHRcdGlmIChyZWwgIT09IFwiXCIgJiYgIXJlbC5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWwpKSB7XG5cdFx0XHRcdHJldHVybiByZWwucmVwbGFjZUFsbChcIlxcXFxcIiwgXCIvXCIpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcGF0aC5iYXNlbmFtZShmdWxsUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJFdmVudEVtaXR0ZXIiLCJwYXRoIiwiaW8iLCJkZWJvdW5jZSIsInNjcmliZSIsIlNvdXJjZU1vZHVsZUxvYWRlciIsImN1cnJlbnRGaWxlUGF0aCIsImZpbGVVcmxUb1BhdGgiLCJ1cmwiLCJWRVJTSU9OX1VSTF9QQVJBTSIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiTUFYX1JFQk9PVF9UUklHR0VSX1BBVEhTIiwicmVzb2x2ZVJlYm9vdERlYm91bmNlTXMiLCJ2YWx1ZSIsImRlbGF5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN0cmluZyIsImZvcm1hdFRyaWdnZXJMaXN0IiwidHJpZ2dlcnMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJqb2luIiwic2xpY2UiLCJCQU5ORVJfUlVMRSIsInJlcGVhdCIsIndyYXBGbHV4QmFubmVyIiwidGl0bGUiLCJkZXRhaWxzIiwiYm9keSIsIm1hcCIsImxpbmUiLCJmb3JtYXRGbHV4UmVib290U3RhcnQiLCJsYWJlbHMiLCJ3aG8iLCJmaWxlcyIsImZvcm1hdEZsdXhSZWJvb3RSZWFkeSIsImVsYXBzZWRNcyIsIk1hdGgiLCJtYXgiLCJyb3VuZCIsIm1vZHVsZVZlcnNpb25TZXEiLCJIb3RSZWxvYWRTZXJ2ZXIiLCJsb2dnZXIiLCJuYW1lIiwibG9hZGVyIiwiZGlzcG9zZWQiLCJlbnRyaWVzIiwiTWFwIiwicGVuZGluZ0VudHJ5UmVib290cyIsIlNldCIsInBlbmRpbmdUcmlnZ2VycyIsIndhdGNoU3Vic2NyaXB0aW9uIiwibW9kdWxlQ2FjaGUiLCJkZXBlbmRlbmNpZXMiLCJyZWJvb3RUYWlsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWJvb3REZWJvdW5jZUdlbiIsInJlYm9vdEluRmxpZ2h0IiwicmVib290Rm9sbG93VXAiLCJyZWJvb3RRdWV1ZWQiLCJwZW5kaW5nR3JhcGhQcnVuZSIsInNjaGVkdWxlUmVib290Iiwic3RhcnQiLCJvcHRpb25zIiwiY2xlYXIiLCJiaW5kU2NoZWR1bGVSZWJvb3QiLCJyZWJvb3REZWJvdW5jZU1zIiwiYnVpbGRDb25maWciLCJjb25maWd1cmUiLCJ3b3Jrc3BhY2UiLCJ2ZXJzaW9uRmlsZVVybCIsImZpbGVVcmwiLCJnZXRDYWNoZWRPck5ldyIsIm9uUmVzb2x2ZWQiLCJvblBvc3RSZXNvbHZlIiwicmVxdWlyZVdvcmtzcGFjZSIsInNlbGVjdGVkIiwicmVzb2x2ZVByb2plY3RzIiwicHJvamVjdCIsImVudHJ5UGF0aCIsImdldFNvdXJjZUVudHJ5UGF0aCIsInNldCIsImxhYmVsIiwicmVnaXN0ZXJIb29rcyIsImludmFsaWRhdGVBbGxTb3VyY2VGaWxlcyIsIndhdGNoIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsIm9uRmlsZUNoYW5nZSIsImVudHJ5IiwidmFsdWVzIiwidHJhY2UiLCJib290RW50cmllcyIsImtleXMiLCJlbWl0IiwiZGlzcG9zZSIsInVuc3Vic2NyaWJlIiwiZGlzcG9zZUVudHJpZXMiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJlbnRyeVBhdGhzIiwiYWxsIiwiYm9vdEVudHJ5Iiwic3RhdGUiLCJnZXQiLCJtb2QiLCJpbXBvcnRFbnRyeSIsIm1vZHVsZSIsImRlZmF1bHQiLCJlcnJvciIsImRlbGF5TXMiLCJnZW4iLCJyZXF1ZXN0UmVib290IiwidGhlbiIsInJ1blJlYm9vdCIsInRvUmVib290Iiwic2l6ZSIsInBydW5lUGVuZGluZ0RlcGVuZGVuY3lFZGdlcyIsInN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJsYWJlbHNGb3IiLCJ0YWtlVHJpZ2dlcnMiLCJpbmZvIiwibmVlZHNGb2xsb3dVcCIsImRpc3Bvc2VFbnRyeSIsInBhdGhzIiwicCIsImdldFdvcmtzcGFjZSIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJuYW1lcyIsImZpcnN0IiwiYXQiLCJmb3VuZCIsImZpbmQiLCJwdXNoIiwicmVzdWx0IiwicGFyZW50VXJsIiwicGFyZW50VXJsQ2xlYW4iLCJzcGxpdCIsImZpbGVQYXRoIiwicGFyZW50UGF0aCIsInVybE9iaiIsIlVSTCIsInNlYXJjaCIsInRvU3RyaW5nIiwiaXNTb3VyY2UiLCJoYXNTb3VyY2VGaWxlIiwicGFyZW50SXNTb3VyY2UiLCJ0cmFja0RlcGVuZGVuY3kiLCJldnQiLCJmaWxlIiwiZXZlbnROYW1lIiwiZnVsbFBhdGgiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImludmFsaWRhdGVUcmFuc3BpbGUiLCJhZGQiLCJpc1NvdXJjZUZpbGUiLCJzZXRTb3VyY2VGaWxlIiwicmVsb2FkSWZBZmZlY3RlZCIsImRlcHMiLCJnZXREZXBlbmRlbmN5R3JhcGgiLCJtb2R1bGVzIiwiYWZmZWN0ZWRFbnRyaWVzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJpbnZhbGlkYXRlTW9kdWxlQ2FjaGVzIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsInN1YkRlcHMiLCJkZXAiLCJzdWJzIiwidXBkYXRlZERlcHMiLCJtb2R1bGVVcmwiLCJjYWNoZWQiLCJ2ZXJzaW9uZWQiLCJ2ZXJzaW9uTW9kdWxlIiwidmVyc2lvbmVkVXJsIiwic2VhcmNoUGFyYW1zIiwicHJ1bmVEZXBlbmRlbmN5UGFyZW50cyIsImtleSIsInBhcmVudHMiLCJmaWx0ZXJlZCIsImRlbGV0ZSIsInNvdXJjZUZpbGVQYXRocyIsImJhc2VuYW1lIiwiZm9ybWF0VHJpZ2dlciIsInJvb3QiLCJyb290RGlyIiwicmVsIiwicmVsYXRpdmUi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
package/es6/src/index.js CHANGED
@@ -1,7 +1,8 @@
1
1
  export { DeferredScriptRunner } from "./deferred-script-runner.js";
2
+ export { flux } from "./flux.js";
2
3
  export { FluxModule } from "./flux.module.js";
3
4
  export { DEFAULT_REBOOT_DEBOUNCE_MS, HotReloadServer } from "./hot-reload-server.js";
4
5
  export { classifySliceProject, classifySliceProjects, normalizeSlicePrefix, projectsInSlice, projectsInSlices, resolveDeferScript } from "./slice-serve.js";
5
6
  export { SourceModuleLoader } from "./source-module-loader.js";
6
7
 
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHsgRmx1eE1vZHVsZSB9IGZyb20gXCIuL2ZsdXgubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEhvdFJlbG9hZFNlcnZlck9wdGlvbnMgfSBmcm9tIFwiLi9ob3QtcmVsb2FkLXNlcnZlci5qc1wiO1xuZXhwb3J0IHsgREVGQVVMVF9SRUJPT1RfREVCT1VOQ0VfTVMsIEhvdFJlbG9hZFNlcnZlciB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgdHlwZSB7IFJ1bk9wdGlvbnMgfSBmcm9tIFwiLi9ydW4uYWN0aW9uLmpzXCI7XG5leHBvcnQgdHlwZSB7IFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL3NlcnZlLmFjdGlvbi5qc1wiO1xuZXhwb3J0IHtcblx0dHlwZSBDbGFzc2lmaWVkU2xpY2UsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0LFxuXHRjbGFzc2lmeVNsaWNlUHJvamVjdHMsXG5cdG5vcm1hbGl6ZVNsaWNlUHJlZml4LFxuXHRwcm9qZWN0c0luU2xpY2UsXG5cdHByb2plY3RzSW5TbGljZXMsXG5cdHJlc29sdmVEZWZlclNjcmlwdCxcblx0dHlwZSBTbGljZUtpbmQsXG5cdHR5cGUgU2xpY2VQcm9qZWN0Vmlldyxcbn0gZnJvbSBcIi4vc2xpY2Utc2VydmUuanNcIjtcbmV4cG9ydCB0eXBlIHsgU291cmNlTW9kdWxlTG9hZGVyT3B0aW9ucyB9IGZyb20gXCIuL3NvdXJjZS1tb2R1bGUtbG9hZGVyLmpzXCI7XG5leHBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuIl0sIm5hbWVzIjpbIkRlZmVycmVkU2NyaXB0UnVubmVyIiwiRmx1eE1vZHVsZSIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwiY2xhc3NpZnlTbGljZVByb2plY3QiLCJjbGFzc2lmeVNsaWNlUHJvamVjdHMiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInByb2plY3RzSW5TbGljZSIsInByb2plY3RzSW5TbGljZXMiLCJyZXNvbHZlRGVmZXJTY3JpcHQiLCJTb3VyY2VNb2R1bGVMb2FkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLG9CQUFvQixRQUFRLDhCQUE4QjtBQUNuRSxTQUFTQyxVQUFVLFFBQVEsbUJBQW1CO0FBRTlDLFNBQVNDLDBCQUEwQixFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBR3JGLFNBRUNDLG9CQUFvQixFQUNwQkMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsUUFHWixtQkFBbUI7QUFFMUIsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCIn0=
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IERlZmVycmVkU2NyaXB0UnVubmVyIH0gZnJvbSBcIi4vZGVmZXJyZWQtc2NyaXB0LXJ1bm5lci5qc1wiO1xuZXhwb3J0IHR5cGUgeyBGbHV4UnVuT3B0aW9ucywgRmx1eFNlcnZlT3B0aW9ucyB9IGZyb20gXCIuL2ZsdXguanNcIjtcbmV4cG9ydCB7IGZsdXggfSBmcm9tIFwiLi9mbHV4LmpzXCI7XG5leHBvcnQgeyBGbHV4TW9kdWxlIH0gZnJvbSBcIi4vZmx1eC5tb2R1bGUuanNcIjtcbmV4cG9ydCB0eXBlIHsgSG90UmVsb2FkU2VydmVyT3B0aW9ucyB9IGZyb20gXCIuL2hvdC1yZWxvYWQtc2VydmVyLmpzXCI7XG5leHBvcnQgeyBERUZBVUxUX1JFQk9PVF9ERUJPVU5DRV9NUywgSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vaG90LXJlbG9hZC1zZXJ2ZXIuanNcIjtcbmV4cG9ydCB0eXBlIHsgUnVuT3B0aW9ucyB9IGZyb20gXCIuL3J1bi5hY3Rpb24uanNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmUuYWN0aW9uLmpzXCI7XG5leHBvcnQge1xuXHR0eXBlIENsYXNzaWZpZWRTbGljZSxcblx0Y2xhc3NpZnlTbGljZVByb2plY3QsXG5cdGNsYXNzaWZ5U2xpY2VQcm9qZWN0cyxcblx0bm9ybWFsaXplU2xpY2VQcmVmaXgsXG5cdHByb2plY3RzSW5TbGljZSxcblx0cHJvamVjdHNJblNsaWNlcyxcblx0cmVzb2x2ZURlZmVyU2NyaXB0LFxuXHR0eXBlIFNsaWNlS2luZCxcblx0dHlwZSBTbGljZVByb2plY3RWaWV3LFxufSBmcm9tIFwiLi9zbGljZS1zZXJ2ZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBTb3VyY2VNb2R1bGVMb2FkZXJPcHRpb25zIH0gZnJvbSBcIi4vc291cmNlLW1vZHVsZS1sb2FkZXIuanNcIjtcbmV4cG9ydCB7IFNvdXJjZU1vZHVsZUxvYWRlciB9IGZyb20gXCIuL3NvdXJjZS1tb2R1bGUtbG9hZGVyLmpzXCI7XG4iXSwibmFtZXMiOlsiRGVmZXJyZWRTY3JpcHRSdW5uZXIiLCJmbHV4IiwiRmx1eE1vZHVsZSIsIkRFRkFVTFRfUkVCT09UX0RFQk9VTkNFX01TIiwiSG90UmVsb2FkU2VydmVyIiwiY2xhc3NpZnlTbGljZVByb2plY3QiLCJjbGFzc2lmeVNsaWNlUHJvamVjdHMiLCJub3JtYWxpemVTbGljZVByZWZpeCIsInByb2plY3RzSW5TbGljZSIsInByb2plY3RzSW5TbGljZXMiLCJyZXNvbHZlRGVmZXJTY3JpcHQiLCJTb3VyY2VNb2R1bGVMb2FkZXIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLG9CQUFvQixRQUFRLDhCQUE4QjtBQUVuRSxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQUNqQyxTQUFTQyxVQUFVLFFBQVEsbUJBQW1CO0FBRTlDLFNBQVNDLDBCQUEwQixFQUFFQyxlQUFlLFFBQVEseUJBQXlCO0FBR3JGLFNBRUNDLG9CQUFvQixFQUNwQkMscUJBQXFCLEVBQ3JCQyxvQkFBb0IsRUFDcEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsUUFHWixtQkFBbUI7QUFFMUIsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCIn0=
@@ -7,42 +7,25 @@ function _ts_decorate(decorators, target, key, desc) {
7
7
  function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
- import path from "node:path";
11
10
  import { injectable } from "@decohere/crucible/decorators";
12
11
  // biome-ignore lint/style/useImportType: <DI>
13
12
  import { Workspace } from "@decohere/mesh";
14
13
  import { ActionResponse } from "@decohere/nexus/cli";
15
14
  import { scribe } from "@decohere/scribe";
16
- // biome-ignore lint/style/useImportType: <DI>
17
- import { SourceModuleLoader } from "./source-module-loader.js";
15
+ import { flux } from "./flux.js";
18
16
  export class RunAction {
19
- loader;
20
17
  workspace;
21
18
  logger = scribe.logger(RunAction.name);
22
- constructor(loader, workspace){
23
- this.loader = loader;
19
+ constructor(workspace){
24
20
  this.workspace = workspace;
25
21
  }
26
22
  async run(options) {
27
- const entry = options.entry?.trim();
28
- if (entry == null || entry === "") {
29
- throw new Error("flux run requires an entry file path");
30
- }
31
- const absoluteEntry = path.resolve(entry);
32
- const passthrough = options.args ?? [];
33
- await this.loader.configure({
34
- workspace: this.workspace,
35
- buildConfig: options.configuration
23
+ this.logger.trace(`Running ${options.entry}`);
24
+ await flux.run(options.entry, {
25
+ configuration: options.configuration,
26
+ args: options.args,
27
+ workspace: this.workspace
36
28
  });
37
- this.loader.registerHooks();
38
- // Bin-style entries (forge.ts, flux.ts) read process.argv.slice(2).
39
- process.argv = [
40
- process.execPath,
41
- absoluteEntry,
42
- ...passthrough
43
- ];
44
- this.logger.trace(`Running ${absoluteEntry}`);
45
- await this.loader.importEntry(absoluteEntry);
46
29
  return ActionResponse.Success(RunAction.name);
47
30
  }
48
31
  }
@@ -50,9 +33,8 @@ RunAction = _ts_decorate([
50
33
  injectable(),
51
34
  _ts_metadata("design:type", Function),
52
35
  _ts_metadata("design:paramtypes", [
53
- typeof SourceModuleLoader === "undefined" ? Object : SourceModuleLoader,
54
36
  typeof Workspace === "undefined" ? Object : Workspace
55
37
  ])
56
38
  ], RunAction);
57
39
 
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBTb3VyY2VNb2R1bGVMb2FkZXIgfSBmcm9tIFwiLi9zb3VyY2UtbW9kdWxlLWxvYWRlci5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHJpdmF0ZSByZWFkb25seSBsb2FkZXI6IFNvdXJjZU1vZHVsZUxvYWRlcixcblx0XHRwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHQpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBSdW5PcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZT4ge1xuXHRcdGNvbnN0IGVudHJ5ID0gb3B0aW9ucy5lbnRyeT8udHJpbSgpO1xuXHRcdGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5ID09PSBcIlwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJmbHV4IHJ1biByZXF1aXJlcyBhbiBlbnRyeSBmaWxlIHBhdGhcIik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWJzb2x1dGVFbnRyeSA9IHBhdGgucmVzb2x2ZShlbnRyeSk7XG5cdFx0Y29uc3QgcGFzc3Rocm91Z2ggPSBvcHRpb25zLmFyZ3MgPz8gW107XG5cblx0XHRhd2FpdCB0aGlzLmxvYWRlci5jb25maWd1cmUoe1xuXHRcdFx0d29ya3NwYWNlOiB0aGlzLndvcmtzcGFjZSxcblx0XHRcdGJ1aWxkQ29uZmlnOiBvcHRpb25zLmNvbmZpZ3VyYXRpb24sXG5cdFx0fSk7XG5cdFx0dGhpcy5sb2FkZXIucmVnaXN0ZXJIb29rcygpO1xuXG5cdFx0Ly8gQmluLXN0eWxlIGVudHJpZXMgKGZvcmdlLnRzLCBmbHV4LnRzKSByZWFkIHByb2Nlc3MuYXJndi5zbGljZSgyKS5cblx0XHRwcm9jZXNzLmFyZ3YgPSBbcHJvY2Vzcy5leGVjUGF0aCwgYWJzb2x1dGVFbnRyeSwgLi4ucGFzc3Rocm91Z2hdO1xuXG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHthYnNvbHV0ZUVudHJ5fWApO1xuXHRcdGF3YWl0IHRoaXMubG9hZGVyLmltcG9ydEVudHJ5KGFic29sdXRlRW50cnkpO1xuXHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFJ1bkFjdGlvbi5uYW1lKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJTb3VyY2VNb2R1bGVMb2FkZXIiLCJSdW5BY3Rpb24iLCJsb2dnZXIiLCJuYW1lIiwibG9hZGVyIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsImVudHJ5IiwidHJpbSIsIkVycm9yIiwiYWJzb2x1dGVFbnRyeSIsInJlc29sdmUiLCJwYXNzdGhyb3VnaCIsImFyZ3MiLCJjb25maWd1cmUiLCJidWlsZENvbmZpZyIsImNvbmZpZ3VyYXRpb24iLCJyZWdpc3Rlckhvb2tzIiwicHJvY2VzcyIsImFyZ3YiLCJleGVjUGF0aCIsInRyYWNlIiwiaW1wb3J0RW50cnkiLCJTdWNjZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFDN0IsU0FBU0MsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUMzQyxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCw4Q0FBOEM7QUFDOUMsU0FBU0Msa0JBQWtCLFFBQVEsNEJBQTRCO0FBVy9ELE9BQU8sTUFBTUM7OztJQUNLQyxTQUFpQkgsT0FBT0csTUFBTSxDQUFDRCxVQUFVRSxJQUFJLEVBQUU7SUFFaEUsWUFDQyxBQUFpQkMsTUFBMEIsRUFDM0MsQUFBaUJDLFNBQW9CLENBQ3BDO2FBRmdCRCxTQUFBQTthQUNBQyxZQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBbUIsRUFBMkI7UUFDOUQsTUFBTUMsUUFBUUQsUUFBUUMsS0FBSyxFQUFFQztRQUM3QixJQUFJRCxTQUFTLFFBQVFBLFVBQVUsSUFBSTtZQUNsQyxNQUFNLElBQUlFLE1BQU07UUFDakI7UUFFQSxNQUFNQyxnQkFBZ0JoQixLQUFLaUIsT0FBTyxDQUFDSjtRQUNuQyxNQUFNSyxjQUFjTixRQUFRTyxJQUFJLElBQUksRUFBRTtRQUV0QyxNQUFNLElBQUksQ0FBQ1YsTUFBTSxDQUFDVyxTQUFTLENBQUM7WUFDM0JWLFdBQVcsSUFBSSxDQUFDQSxTQUFTO1lBQ3pCVyxhQUFhVCxRQUFRVSxhQUFhO1FBQ25DO1FBQ0EsSUFBSSxDQUFDYixNQUFNLENBQUNjLGFBQWE7UUFFekIsb0VBQW9FO1FBQ3BFQyxRQUFRQyxJQUFJLEdBQUc7WUFBQ0QsUUFBUUUsUUFBUTtZQUFFVjtlQUFrQkU7U0FBWTtRQUVoRSxJQUFJLENBQUNYLE1BQU0sQ0FBQ29CLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRVgsZUFBZTtRQUM1QyxNQUFNLElBQUksQ0FBQ1AsTUFBTSxDQUFDbUIsV0FBVyxDQUFDWjtRQUM5QixPQUFPYixlQUFlMEIsT0FBTyxDQUFDdkIsVUFBVUUsSUFBSTtJQUM3QztBQUNEIn0=
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL3J1bi5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEFjdGlvbiwgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgdHlwZSBMb2dnZXIsIHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBmbHV4IH0gZnJvbSBcIi4vZmx1eC5qc1wiO1xuXG5leHBvcnQgdHlwZSBSdW5PcHRpb25zID0ge1xuXHQvKiogQWJzb2x1dGUgb3IgY3dkLXJlbGF0aXZlIHBhdGggdG8gYSBgLnRzYCBlbnRyeSBmaWxlLiAqL1xuXHRlbnRyeTogc3RyaW5nO1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBBcmd1bWVudHMgZm9yd2FyZGVkIHRvIHRoZSBlbnRyeSAoYmluLXN0eWxlIGBwcm9jZXNzLmFyZ3Yuc2xpY2UoMilgKS4gKi9cblx0YXJncz86IHN0cmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bkFjdGlvbiBpbXBsZW1lbnRzIEFjdGlvbjxSdW5PcHRpb25zPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBMb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFJ1bkFjdGlvbi5uYW1lKTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFJ1bk9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoYFJ1bm5pbmcgJHtvcHRpb25zLmVudHJ5fWApO1xuXHRcdGF3YWl0IGZsdXgucnVuKG9wdGlvbnMuZW50cnksIHtcblx0XHRcdGNvbmZpZ3VyYXRpb246IG9wdGlvbnMuY29uZmlndXJhdGlvbixcblx0XHRcdGFyZ3M6IG9wdGlvbnMuYXJncyxcblx0XHRcdHdvcmtzcGFjZTogdGhpcy53b3Jrc3BhY2UsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoUnVuQWN0aW9uLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIldvcmtzcGFjZSIsIkFjdGlvblJlc3BvbnNlIiwic2NyaWJlIiwiZmx1eCIsIlJ1bkFjdGlvbiIsImxvZ2dlciIsIm5hbWUiLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwidHJhY2UiLCJlbnRyeSIsImNvbmZpZ3VyYXRpb24iLCJhcmdzIiwiU3VjY2VzcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUMzQyxTQUFzQkMsY0FBYyxRQUFRLHNCQUFzQjtBQUNsRSxTQUFzQkMsTUFBTSxRQUFRLG1CQUFtQjtBQUN2RCxTQUFTQyxJQUFJLFFBQVEsWUFBWTtBQVdqQyxPQUFPLE1BQU1DOztJQUNLQyxTQUFpQkgsT0FBT0csTUFBTSxDQUFDRCxVQUFVRSxJQUFJLEVBQUU7SUFFaEUsWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQW1CLEVBQTJCO1FBQzlELElBQUksQ0FBQ0osTUFBTSxDQUFDSyxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUVELFFBQVFFLEtBQUssRUFBRTtRQUM1QyxNQUFNUixLQUFLSyxHQUFHLENBQUNDLFFBQVFFLEtBQUssRUFBRTtZQUM3QkMsZUFBZUgsUUFBUUcsYUFBYTtZQUNwQ0MsTUFBTUosUUFBUUksSUFBSTtZQUNsQk4sV0FBVyxJQUFJLENBQUNBLFNBQVM7UUFDMUI7UUFDQSxPQUFPTixlQUFlYSxPQUFPLENBQUNWLFVBQVVFLElBQUk7SUFDN0M7QUFDRCJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decohere/flux",
3
- "version": "0.0.1-dev.81",
3
+ "version": "0.0.1-dev.83",
4
4
  "description": "Hot module reload server for Node.js ESM applications",
5
5
  "keywords": [
6
6
  "typescript",
@@ -25,11 +25,11 @@
25
25
  "test": "echo \"Error: no test specified\" && exit 1"
26
26
  },
27
27
  "dependencies": {
28
- "@decohere/crucible": "0.0.1-dev.81",
29
- "@decohere/forge": "0.0.1-dev.81",
30
- "@decohere/mesh": "0.0.1-dev.81",
31
- "@decohere/nexus": "0.0.1-dev.81",
32
- "@decohere/scribe": "0.0.1-dev.81",
28
+ "@decohere/crucible": "0.0.1-dev.83",
29
+ "@decohere/forge": "0.0.1-dev.83",
30
+ "@decohere/mesh": "0.0.1-dev.83",
31
+ "@decohere/nexus": "0.0.1-dev.83",
32
+ "@decohere/scribe": "0.0.1-dev.83",
33
33
  "commander": "^13.1.0",
34
34
  "rxjs": "^7.8.2"
35
35
  },
@@ -0,0 +1,43 @@
1
+ import type { Workspace } from "@decohere/mesh";
2
+ import { HotReloadServer } from "./hot-reload-server.js";
3
+ export type FluxRunOptions = {
4
+ /** Mesh/Forge configuration name. Defaults to `debug` (`--configuration`). */
5
+ configuration?: string;
6
+ /** Arguments forwarded to the entry (bin-style `process.argv.slice(2)`). */
7
+ args?: string[];
8
+ /**
9
+ * Pre-built Workspace instead of `WorkspaceFactory`.
10
+ * Useful in tests to skip filesystem discovery.
11
+ */
12
+ workspace?: Workspace;
13
+ };
14
+ export type FluxServeOptions = {
15
+ /** Mesh/Forge configuration name. Defaults to `debug` (`--configuration`). */
16
+ configuration?: string;
17
+ /** Name of the project to serve. Defaults to the first project in the workspace. */
18
+ project?: string;
19
+ /**
20
+ * Multiple Flux app package names to boot in one process (directory slice).
21
+ * When set, takes precedence over {@link project}.
22
+ */
23
+ projects?: readonly string[];
24
+ /**
25
+ * Pre-built Workspace instead of `WorkspaceFactory`.
26
+ * Useful in tests to skip filesystem discovery.
27
+ */
28
+ workspace?: Workspace;
29
+ /**
30
+ * Quiet window in milliseconds after the last affecting save before a reboot.
31
+ * Raise this for agent save trains.
32
+ */
33
+ rebootDebounceMs?: number;
34
+ };
35
+ declare function run(entry: string, options?: FluxRunOptions): Promise<unknown>;
36
+ declare function serve(options?: FluxServeOptions): Promise<HotReloadServer>;
37
+ declare function dispose(): void;
38
+ export declare const flux: {
39
+ run: typeof run;
40
+ serve: typeof serve;
41
+ dispose: typeof dispose;
42
+ };
43
+ export {};
@@ -3,6 +3,10 @@ import type { Workspace } from "@decohere/mesh";
3
3
  /** Default quiet window before a file-change reboot. */
4
4
  export declare const DEFAULT_REBOOT_DEBOUNCE_MS = 250;
5
5
  export declare function resolveRebootDebounceMs(value: number | undefined): number;
6
+ /** Info-level HMR start block — keep `flux reboot` in the text so operators can search the buffer. */
7
+ export declare function formatFluxRebootStart(labels: readonly string[], triggers?: readonly string[]): string;
8
+ /** Info-level HMR finish block. */
9
+ export declare function formatFluxRebootReady(labels: readonly string[], elapsedMs: number): string;
6
10
  export interface HotReloadServerEvents {
7
11
  start: [];
8
12
  reboot: [];
@@ -35,6 +39,8 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
35
39
  /** Absolute entry paths currently served (one or more Flux apps). */
36
40
  private entries;
37
41
  private pendingEntryReboots;
42
+ /** Source paths that scheduled the next reboot (cleared when that reboot starts). */
43
+ private pendingTriggers;
38
44
  private watchSubscription?;
39
45
  private moduleCache;
40
46
  private dependencies;
@@ -75,4 +81,7 @@ export declare class HotReloadServer extends EventEmitter<HotReloadServerEvents>
75
81
  private pruneDependencyParents;
76
82
  private invalidateAllSourceFiles;
77
83
  private isSelf;
84
+ private labelsFor;
85
+ private takeTriggers;
86
+ private formatTrigger;
78
87
  }
@@ -1,4 +1,6 @@
1
1
  export { DeferredScriptRunner } from "./deferred-script-runner.js";
2
+ export type { FluxRunOptions, FluxServeOptions } from "./flux.js";
3
+ export { flux } from "./flux.js";
2
4
  export { FluxModule } from "./flux.module.js";
3
5
  export type { HotReloadServerOptions } from "./hot-reload-server.js";
4
6
  export { DEFAULT_REBOOT_DEBOUNCE_MS, HotReloadServer } from "./hot-reload-server.js";
@@ -1,6 +1,5 @@
1
1
  import { Workspace } from "@decohere/mesh";
2
2
  import { type Action, ActionResponse } from "@decohere/nexus/cli";
3
- import { SourceModuleLoader } from "./source-module-loader.js";
4
3
  export type RunOptions = {
5
4
  /** Absolute or cwd-relative path to a `.ts` entry file. */
6
5
  entry: string;
@@ -9,9 +8,8 @@ export type RunOptions = {
9
8
  args?: string[];
10
9
  };
11
10
  export declare class RunAction implements Action<RunOptions> {
12
- private readonly loader;
13
11
  private readonly workspace;
14
12
  private readonly logger;
15
- constructor(loader: SourceModuleLoader, workspace: Workspace);
13
+ constructor(workspace: Workspace);
16
14
  run(options: RunOptions): Promise<ActionResponse>;
17
15
  }