@decohere/flux 0.0.1-dev.79 → 0.0.1-dev.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commonjs/src/ember.command.js +27 -0
- package/commonjs/src/ember.module.js +37 -0
- package/commonjs/src/hot-module-hooks.js +47 -0
- package/commonjs/src/hot-reload-server.js +160 -293
- package/commonjs/src/index.js +32 -33
- package/commonjs/src/serve.action.js +10 -94
- package/commonjs/src/serve.command.js +4 -36
- package/commonjs/src/serve.js +36 -0
- package/commonjs/src/workspace-serve.action.js +59 -0
- package/es6/src/ember.command.js +17 -0
- package/es6/src/ember.module.js +19 -0
- package/es6/src/hot-module-hooks.js +26 -0
- package/es6/src/hot-reload-server.js +117 -280
- package/es6/src/index.js +7 -6
- package/es6/src/serve.action.js +10 -92
- package/es6/src/serve.command.js +5 -37
- package/es6/src/serve.js +32 -0
- package/es6/src/workspace-serve.action.js +45 -0
- package/package.json +12 -8
- package/types/src/{flux.command.d.ts → ember.command.d.ts} +1 -1
- package/types/src/ember.module.d.ts +22 -0
- package/types/src/hot-module-hooks.d.ts +5 -0
- package/types/src/hot-reload-server.d.ts +22 -62
- package/types/src/index.d.ts +8 -8
- package/types/src/serve.action.d.ts +2 -17
- package/types/src/serve.command.d.ts +2 -7
- package/types/src/serve.d.ts +1 -0
- package/types/src/workspace-serve.action.d.ts +11 -0
- package/commonjs/src/deferred-script-runner.js +0 -58
- package/commonjs/src/flux.command.js +0 -29
- package/commonjs/src/flux.module.js +0 -38
- package/commonjs/src/rewrite-serve-specifier.js +0 -46
- package/commonjs/src/run.action.js +0 -71
- package/commonjs/src/run.command.js +0 -67
- package/commonjs/src/slice-serve.js +0 -132
- package/commonjs/src/source-module-loader.js +0 -216
- package/es6/src/deferred-script-runner.js +0 -48
- package/es6/src/flux.command.js +0 -19
- package/es6/src/flux.module.js +0 -28
- package/es6/src/rewrite-serve-specifier.js +0 -40
- package/es6/src/run.action.js +0 -58
- package/es6/src/run.command.js +0 -57
- package/es6/src/slice-serve.js +0 -107
- package/es6/src/source-module-loader.js +0 -160
- package/types/src/deferred-script-runner.d.ts +0 -18
- package/types/src/flux.module.d.ts +0 -16
- package/types/src/rewrite-serve-specifier.d.ts +0 -13
- package/types/src/run.action.d.ts +0 -17
- package/types/src/run.command.d.ts +0 -11
- package/types/src/slice-serve.d.ts +0 -52
- package/types/src/source-module-loader.d.ts +0 -49
|
@@ -2,316 +2,137 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
get DEFAULT_REBOOT_DEBOUNCE_MS () {
|
|
13
|
-
return DEFAULT_REBOOT_DEBOUNCE_MS;
|
|
14
|
-
},
|
|
15
|
-
get HotReloadServer () {
|
|
5
|
+
Object.defineProperty(exports, "HotReloadServer", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
16
8
|
return HotReloadServer;
|
|
17
|
-
},
|
|
18
|
-
get resolveRebootDebounceMs () {
|
|
19
|
-
return resolveRebootDebounceMs;
|
|
20
9
|
}
|
|
21
10
|
});
|
|
22
11
|
const _nodeevents = require("node:events");
|
|
23
12
|
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
24
13
|
const _io = require("@decohere/nexus/io");
|
|
25
14
|
const _system = require("@decohere/nexus/system");
|
|
26
|
-
const
|
|
27
|
-
const _sourcemoduleloader = require("./source-module-loader.js");
|
|
15
|
+
const _hotmodulehooks = require("./hot-module-hooks.js");
|
|
28
16
|
function _interop_require_default(obj) {
|
|
29
17
|
return obj && obj.__esModule ? obj : {
|
|
30
18
|
default: obj
|
|
31
19
|
};
|
|
32
20
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
21
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
22
|
+
if (typeof WeakMap !== "function") return null;
|
|
23
|
+
var cacheBabelInterop = new WeakMap();
|
|
24
|
+
var cacheNodeInterop = new WeakMap();
|
|
25
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
26
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
27
|
+
})(nodeInterop);
|
|
28
|
+
}
|
|
29
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
30
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
31
|
+
return obj;
|
|
32
|
+
}
|
|
33
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
34
|
+
return {
|
|
35
|
+
default: obj
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
39
|
+
if (cache && cache.has(obj)) {
|
|
40
|
+
return cache.get(obj);
|
|
41
|
+
}
|
|
42
|
+
var newObj = {
|
|
43
|
+
__proto__: null
|
|
44
|
+
};
|
|
45
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
46
|
+
for(var key in obj){
|
|
47
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
48
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
49
|
+
if (desc && (desc.get || desc.set)) {
|
|
50
|
+
Object.defineProperty(newObj, key, desc);
|
|
51
|
+
} else {
|
|
52
|
+
newObj[key] = obj[key];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
40
55
|
}
|
|
41
|
-
|
|
56
|
+
newObj.default = obj;
|
|
57
|
+
if (cache) {
|
|
58
|
+
cache.set(obj, newObj);
|
|
59
|
+
}
|
|
60
|
+
return newObj;
|
|
42
61
|
}
|
|
43
|
-
|
|
62
|
+
const currentFilePath = _io.io.fileUrlToPath(require("url").pathToFileURL(__filename).toString());
|
|
44
63
|
class HotReloadServer extends _nodeevents.EventEmitter {
|
|
45
|
-
|
|
46
|
-
logger = _scribe.scribe.logger(HotReloadServer.name);
|
|
47
|
-
loader = new _sourcemoduleloader.SourceModuleLoader();
|
|
64
|
+
logger;
|
|
48
65
|
disposed = false;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
66
|
+
entryModule;
|
|
67
|
+
entry;
|
|
68
|
+
sourceFiles = [];
|
|
52
69
|
moduleCache = new Map();
|
|
53
70
|
dependencies = new Map();
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
this.disposed = false;
|
|
64
|
-
this.dependencies.clear();
|
|
65
|
-
this.moduleCache.clear();
|
|
66
|
-
this.entries.clear();
|
|
67
|
-
this.pendingEntryReboots.clear();
|
|
68
|
-
this.pendingGraphPrune.clear();
|
|
69
|
-
this.rebootTail = Promise.resolve();
|
|
70
|
-
this.rebootInFlight = false;
|
|
71
|
-
this.rebootFollowUp = false;
|
|
72
|
-
this.rebootQueued = false;
|
|
73
|
-
this.bindScheduleReboot(resolveRebootDebounceMs(options.rebootDebounceMs));
|
|
74
|
-
const { buildConfig } = options;
|
|
75
|
-
await this.loader.configure({
|
|
76
|
-
buildConfig,
|
|
77
|
-
workspace: options.workspace,
|
|
78
|
-
versionFileUrl: (fileUrl)=>this.getCachedOrNew(fileUrl),
|
|
79
|
-
onResolved: this.onPostResolve
|
|
80
|
-
});
|
|
81
|
-
const workspace = this.requireWorkspace();
|
|
82
|
-
const selected = this.resolveProjects(buildConfig, options);
|
|
83
|
-
for (const project of selected){
|
|
84
|
-
const entryPath = _nodepath.default.resolve(project.getSourceEntryPath());
|
|
85
|
-
this.entries.set(entryPath, {
|
|
86
|
-
path: entryPath
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
this.loader.registerHooks();
|
|
71
|
+
watchers = [];
|
|
72
|
+
constructor(logger){
|
|
73
|
+
super();
|
|
74
|
+
this.logger = logger;
|
|
75
|
+
}
|
|
76
|
+
async start(entry, ...watchDirs) {
|
|
77
|
+
this.entryModule = entry;
|
|
78
|
+
this.sourceFiles = await this.getSourceFiles(watchDirs);
|
|
79
|
+
this.configureModuleHooks();
|
|
90
80
|
this.invalidateAllSourceFiles();
|
|
91
|
-
await
|
|
92
|
-
this.
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
await this.bootEntries([
|
|
97
|
-
...this.entries.keys()
|
|
98
|
-
]);
|
|
99
|
-
this.emit("start");
|
|
81
|
+
await this.watch(watchDirs);
|
|
82
|
+
this.logger.trace("Serving", entry);
|
|
83
|
+
this.logger.trace("Hot reload watching", watchDirs);
|
|
84
|
+
await this.bootEntry();
|
|
100
85
|
}
|
|
101
86
|
async dispose() {
|
|
102
87
|
if (this.disposed) return;
|
|
103
88
|
this.disposed = true;
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
106
|
-
|
|
107
|
-
await this.disposeEntries([
|
|
108
|
-
...this.entries.keys()
|
|
109
|
-
]);
|
|
110
|
-
this.loader.dispose();
|
|
111
|
-
}
|
|
112
|
-
async [Symbol.asyncDispose]() {
|
|
113
|
-
await this.dispose();
|
|
114
|
-
}
|
|
115
|
-
// ── Lifecycle ────────────────────────────────────────────────────────────
|
|
116
|
-
async bootEntries(entryPaths) {
|
|
117
|
-
await Promise.all(entryPaths.map((entryPath)=>this.bootEntry(entryPath)));
|
|
118
|
-
}
|
|
119
|
-
async bootEntry(entryPath) {
|
|
120
|
-
const state = this.entries.get(entryPath);
|
|
121
|
-
if (state == null) return;
|
|
122
|
-
try {
|
|
123
|
-
const mod = await this.loader.importEntry(entryPath);
|
|
124
|
-
state.module = mod?.default;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
state.module = undefined;
|
|
127
|
-
this.logger.error("There was an error booting the entry point. Your application may not function as expected", error);
|
|
89
|
+
(0, _hotmodulehooks.removeResolverHook)(this.onResolve);
|
|
90
|
+
for (const watcher of this.watchers){
|
|
91
|
+
watcher.close();
|
|
128
92
|
}
|
|
93
|
+
await this.disposeEntry();
|
|
129
94
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
this.scheduleReboot = (0, _system.debounce)(async ()=>{
|
|
133
|
-
if (this.disposed || gen !== this.rebootDebounceGen) return;
|
|
134
|
-
this.requestReboot();
|
|
135
|
-
}, delayMs);
|
|
95
|
+
removeSourceFiles(...sourceFiles) {
|
|
96
|
+
this.sourceFiles = this.sourceFiles.filter((sourceFile)=>!sourceFiles.includes(sourceFile));
|
|
136
97
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (this.rebootQueued) return;
|
|
144
|
-
this.rebootQueued = true;
|
|
145
|
-
this.rebootTail = this.rebootTail.then(()=>this.runReboot(), ()=>this.runReboot());
|
|
146
|
-
}
|
|
147
|
-
async runReboot() {
|
|
148
|
-
this.rebootQueued = false;
|
|
149
|
-
if (this.disposed) return;
|
|
150
|
-
this.rebootInFlight = true;
|
|
151
|
-
try {
|
|
152
|
-
do {
|
|
153
|
-
this.rebootFollowUp = false;
|
|
154
|
-
if (this.disposed) return;
|
|
155
|
-
const toReboot = this.pendingEntryReboots.size > 0 ? [
|
|
156
|
-
...this.pendingEntryReboots
|
|
157
|
-
] : [
|
|
158
|
-
...this.entries.keys()
|
|
159
|
-
];
|
|
160
|
-
this.pendingEntryReboots.clear();
|
|
161
|
-
// Drop reverse edges only when rebooting so later saves in the debounce
|
|
162
|
-
// window can still walk the graph and reset the quiet timer.
|
|
163
|
-
this.prunePendingDependencyEdges();
|
|
164
|
-
this.logger.trace(`Rebooting ${toReboot.length} entry module(s)`);
|
|
165
|
-
await this.disposeEntries(toReboot);
|
|
166
|
-
await this.bootEntries(toReboot);
|
|
167
|
-
this.emit("reboot");
|
|
168
|
-
}while (this.rebootFollowUp && !this.disposed)
|
|
169
|
-
} finally{
|
|
170
|
-
const needsFollowUp = this.rebootFollowUp && !this.disposed;
|
|
171
|
-
this.rebootFollowUp = false;
|
|
172
|
-
this.rebootInFlight = false;
|
|
173
|
-
if (needsFollowUp) this.requestReboot();
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
async disposeEntries(entryPaths) {
|
|
177
|
-
await Promise.all(entryPaths.map((entryPath)=>this.disposeEntry(entryPath)));
|
|
98
|
+
async getSourceFiles(dirs) {
|
|
99
|
+
const patterns = dirs.map((dir)=>`${dir}/**/*.js`);
|
|
100
|
+
const files = await _io.io.findFiles(patterns);
|
|
101
|
+
return files.map((f)=>f.fullPath);
|
|
178
102
|
}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
] : [
|
|
183
|
-
...this.entries.keys()
|
|
184
|
-
];
|
|
185
|
-
for (const p of paths){
|
|
186
|
-
const state = this.entries.get(p);
|
|
187
|
-
if (state == null) continue;
|
|
188
|
-
const entry = state.module;
|
|
189
|
-
state.module = undefined;
|
|
190
|
-
try {
|
|
191
|
-
await entry?.[Symbol.asyncDispose]();
|
|
192
|
-
} catch (error) {
|
|
193
|
-
this.logger.error("Entry asyncDispose failed", error);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
103
|
+
configureModuleHooks() {
|
|
104
|
+
(0, _hotmodulehooks.initModuleHooks)();
|
|
105
|
+
(0, _hotmodulehooks.addResolverHook)(this.onResolve);
|
|
196
106
|
}
|
|
197
|
-
|
|
198
|
-
requireWorkspace() {
|
|
199
|
-
const workspace = this.loader.getWorkspace();
|
|
200
|
-
if (workspace == null) {
|
|
201
|
-
throw new Error("SourceModuleLoader has no workspace after configure");
|
|
202
|
-
}
|
|
203
|
-
return workspace;
|
|
204
|
-
}
|
|
205
|
-
resolveProjects(buildConfig, options) {
|
|
206
|
-
const projects = this.loader.getWorkspace()?.getProjects(buildConfig) ?? [];
|
|
207
|
-
const names = options.projects != null && options.projects.length > 0 ? options.projects : options.project != null ? [
|
|
208
|
-
options.project
|
|
209
|
-
] : undefined;
|
|
210
|
-
if (names == null) {
|
|
211
|
-
const first = projects.at(0);
|
|
212
|
-
if (first == null) {
|
|
213
|
-
throw new Error(`No projects found for configuration: ${buildConfig}`);
|
|
214
|
-
}
|
|
215
|
-
return [
|
|
216
|
-
first
|
|
217
|
-
];
|
|
218
|
-
}
|
|
219
|
-
const selected = [];
|
|
220
|
-
for (const name of names){
|
|
221
|
-
const found = projects.find((p)=>p.name === name);
|
|
222
|
-
if (found == null) {
|
|
223
|
-
throw new Error(`Project "${name}" not found in workspace`);
|
|
224
|
-
}
|
|
225
|
-
selected.push(found);
|
|
226
|
-
}
|
|
227
|
-
return selected;
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Post-next dependency tracker: records which source files import which
|
|
231
|
-
* other source files so that reloadIfAffected can traverse the graph.
|
|
232
|
-
*/ onPostResolve = (result, parentUrl)=>{
|
|
107
|
+
onResolve = (result, parentUrl)=>{
|
|
233
108
|
const { url } = result;
|
|
234
109
|
const parentUrlClean = parentUrl.split("?")[0];
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
try {
|
|
238
|
-
const urlObj = new URL(url);
|
|
239
|
-
urlObj.search = "";
|
|
240
|
-
filePath = _io.io.fileUrlToPath(urlObj.toString());
|
|
241
|
-
} catch {
|
|
242
|
-
return;
|
|
243
|
-
}
|
|
244
|
-
try {
|
|
245
|
-
parentPath = _io.io.fileUrlToPath(parentUrlClean);
|
|
246
|
-
} catch {
|
|
247
|
-
parentPath = "";
|
|
248
|
-
}
|
|
249
|
-
const isSource = this.loader.hasSourceFile(filePath);
|
|
250
|
-
const parentIsSource = this.loader.hasSourceFile(parentPath);
|
|
110
|
+
const isSource = this.isSourceModule(url);
|
|
111
|
+
const parentIsSource = this.isSourceModule(parentUrlClean);
|
|
251
112
|
if (isSource || parentIsSource) {
|
|
252
|
-
this.trackDependency(
|
|
113
|
+
this.trackDependency(url, parentUrl);
|
|
253
114
|
}
|
|
254
|
-
|
|
255
|
-
// ── File watching ────────────────────────────────────────────────────────
|
|
256
|
-
onFileChange = (evt)=>{
|
|
257
|
-
const { file, eventName, project } = evt;
|
|
258
|
-
const fullPath = file.fullPath;
|
|
259
|
-
this.logger.trace(`File ${eventName}: ${fullPath}`);
|
|
260
|
-
if (eventName === _io.io.WatchEvents.unlink) {
|
|
261
|
-
this.loader.invalidateTranspile(fullPath);
|
|
262
|
-
this.moduleCache.set(fullPath, null);
|
|
115
|
+
if (!isSource) {
|
|
263
116
|
return;
|
|
264
117
|
}
|
|
265
|
-
|
|
266
|
-
if (project.isSourceFile(file)) {
|
|
267
|
-
this.loader.setSourceFile(fullPath, project);
|
|
268
|
-
this.moduleCache.set(fullPath, null);
|
|
269
|
-
this.reloadIfAffected(fullPath);
|
|
270
|
-
}
|
|
271
|
-
return;
|
|
272
|
-
}
|
|
273
|
-
// change
|
|
274
|
-
if (!project.isSourceFile(file)) return;
|
|
275
|
-
this.loader.invalidateTranspile(fullPath);
|
|
276
|
-
this.reloadIfAffected(fullPath);
|
|
118
|
+
result.url = this.getCachedOrNew(url);
|
|
277
119
|
};
|
|
278
|
-
|
|
279
|
-
const
|
|
280
|
-
|
|
281
|
-
...new Set([
|
|
282
|
-
...deps,
|
|
283
|
-
fullPath
|
|
284
|
-
])
|
|
285
|
-
];
|
|
286
|
-
const affectedEntries = [
|
|
287
|
-
...this.entries.keys()
|
|
288
|
-
].filter((entryPath)=>modules.includes(entryPath));
|
|
289
|
-
if (affectedEntries.length === 0) {
|
|
290
|
-
this.logger.trace(`Change in ${fullPath} does not affect entry — skipping reload`);
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
this.logger.trace(`Change in ${fullPath} affects ${modules.length} module(s) — scheduling reload`);
|
|
294
|
-
this.invalidateModuleCaches(...modules);
|
|
295
|
-
for (const module of modules){
|
|
296
|
-
this.pendingGraphPrune.add(module);
|
|
297
|
-
}
|
|
298
|
-
for (const entryPath of affectedEntries){
|
|
299
|
-
this.pendingEntryReboots.add(entryPath);
|
|
300
|
-
}
|
|
301
|
-
this.scheduleReboot();
|
|
302
|
-
return true;
|
|
120
|
+
isSourceModule(url) {
|
|
121
|
+
const path = _io.io.fileUrlToPath(url);
|
|
122
|
+
return this.sourceFiles.includes(path);
|
|
303
123
|
}
|
|
304
|
-
// ── Dependency graph ─────────────────────────────────────────────────────
|
|
305
124
|
getDependencyGraph(moduleId, parentModules = []) {
|
|
306
|
-
if (this.isSelf(moduleId))
|
|
125
|
+
if (this.isSelf(moduleId)) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
307
128
|
const moduleDeps = this.dependencies.get(moduleId) ?? [];
|
|
308
129
|
if (parentModules.includes(moduleId)) {
|
|
309
130
|
this.logger.error(`Circular reference detected: ${moduleId}`);
|
|
310
131
|
return [];
|
|
311
132
|
}
|
|
312
|
-
let subDeps =
|
|
133
|
+
let subDeps = Array.of();
|
|
313
134
|
for (const dep of moduleDeps){
|
|
314
|
-
if (!this.
|
|
135
|
+
if (!this.sourceFiles.includes(dep)) continue;
|
|
315
136
|
const subs = this.getDependencyGraph(dep, [
|
|
316
137
|
moduleId,
|
|
317
138
|
...parentModules
|
|
@@ -328,8 +149,9 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
328
149
|
])
|
|
329
150
|
];
|
|
330
151
|
}
|
|
331
|
-
trackDependency(
|
|
332
|
-
|
|
152
|
+
trackDependency(url, parentUrl) {
|
|
153
|
+
const filePath = _io.io.fileUrlToPath(url);
|
|
154
|
+
const parentPath = _io.io.fileUrlToPath(parentUrl.split("?")[0]);
|
|
333
155
|
const deps = this.dependencies.get(filePath) ?? [];
|
|
334
156
|
const updatedDeps = new Set([
|
|
335
157
|
...deps,
|
|
@@ -339,7 +161,6 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
339
161
|
...updatedDeps
|
|
340
162
|
]);
|
|
341
163
|
}
|
|
342
|
-
// ── Module cache ─────────────────────────────────────────────────────────
|
|
343
164
|
getCachedOrNew(moduleUrl) {
|
|
344
165
|
const filePath = _io.io.fileUrlToPath(moduleUrl);
|
|
345
166
|
const cached = this.moduleCache.get(filePath);
|
|
@@ -349,42 +170,88 @@ class HotReloadServer extends _nodeevents.EventEmitter {
|
|
|
349
170
|
}
|
|
350
171
|
versionModule(moduleUrl) {
|
|
351
172
|
const versionedUrl = new URL(moduleUrl);
|
|
352
|
-
versionedUrl.searchParams.set(
|
|
173
|
+
versionedUrl.searchParams.set("version", Date.now().toString());
|
|
353
174
|
return versionedUrl.toString();
|
|
354
175
|
}
|
|
355
|
-
|
|
356
|
-
for (const
|
|
357
|
-
|
|
358
|
-
|
|
176
|
+
watch = async (dirs)=>{
|
|
177
|
+
for (const dir of dirs){
|
|
178
|
+
const watcher = _io.io.watch(dir, {
|
|
179
|
+
include: [
|
|
180
|
+
"**/*.js"
|
|
181
|
+
],
|
|
182
|
+
ignoreInitial: true
|
|
183
|
+
});
|
|
184
|
+
watcher.on("add", this.onFileAdded).on("change", this.onSourceFileChanged).on("unlink", this.onFileDeleted);
|
|
185
|
+
this.watchers.push(watcher);
|
|
359
186
|
}
|
|
360
|
-
}
|
|
361
|
-
|
|
187
|
+
};
|
|
188
|
+
onFileAdded = async ({ fullPath })=>{
|
|
189
|
+
this.sourceFiles.push(fullPath);
|
|
190
|
+
this.moduleCache.set(fullPath, null);
|
|
191
|
+
this.reloadIfAffected(fullPath);
|
|
192
|
+
};
|
|
193
|
+
onSourceFileChanged = async ({ fullPath })=>{
|
|
194
|
+
if (!this.reloadIfAffected(fullPath)) {
|
|
195
|
+
this.logger.trace(`${fullPath} is not part of the current dependency graph. Not reloading entry.`);
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
onFileDeleted = async ({ fullPath })=>{
|
|
199
|
+
this.removeSourceFiles(fullPath);
|
|
200
|
+
};
|
|
201
|
+
reloadIfAffected(fullPath) {
|
|
202
|
+
const deps = this.getDependencyGraph(fullPath);
|
|
362
203
|
const modules = [
|
|
363
|
-
...
|
|
204
|
+
...new Set([
|
|
205
|
+
...deps,
|
|
206
|
+
fullPath
|
|
207
|
+
])
|
|
364
208
|
];
|
|
365
|
-
this.
|
|
366
|
-
|
|
209
|
+
if (!modules.includes(this.entryModule)) {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
this.invlidateModule(...modules);
|
|
213
|
+
this.disposeAndBoot();
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
isSelf(urlLike) {
|
|
217
|
+
return currentFilePath === _nodepath.default.resolve(_io.io.fileUrlToPath(urlLike));
|
|
367
218
|
}
|
|
368
|
-
|
|
219
|
+
invlidateModule(...modules) {
|
|
369
220
|
for (const module of modules){
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
221
|
+
this.moduleCache.set(module, null);
|
|
222
|
+
}
|
|
223
|
+
// Prune invalidated modules from all parent lists so stale relationships
|
|
224
|
+
// are cleared. The fresh boot rebuilds only what is actually imported.
|
|
225
|
+
for (const [child, parents] of this.dependencies){
|
|
226
|
+
const pruned = parents.filter((p)=>!modules.includes(p));
|
|
227
|
+
if (pruned.length === 0) {
|
|
228
|
+
this.dependencies.delete(child);
|
|
229
|
+
} else {
|
|
230
|
+
this.dependencies.set(child, pruned);
|
|
377
231
|
}
|
|
378
232
|
}
|
|
379
233
|
}
|
|
380
234
|
invalidateAllSourceFiles() {
|
|
381
|
-
for (const
|
|
382
|
-
this.moduleCache.set(
|
|
235
|
+
for (const file of this.sourceFiles){
|
|
236
|
+
this.moduleCache.set(file, null);
|
|
383
237
|
}
|
|
384
238
|
}
|
|
385
|
-
|
|
386
|
-
|
|
239
|
+
disposeAndBoot = (0, _system.debounce)(async ()=>{
|
|
240
|
+
await this.disposeEntry();
|
|
241
|
+
await this.bootEntry();
|
|
242
|
+
}, 250);
|
|
243
|
+
async disposeEntry() {
|
|
244
|
+
await this.entry?.[Symbol.asyncDispose]();
|
|
245
|
+
}
|
|
246
|
+
async bootEntry() {
|
|
247
|
+
try {
|
|
248
|
+
const version = this.versionModule(_io.io.pathToFileUrl(this.entryModule));
|
|
249
|
+
this.entry = (await Promise.resolve(version).then((p)=>/*#__PURE__*/ _interop_require_wildcard(require(p))))?.default;
|
|
250
|
+
this.emit("reboot");
|
|
251
|
+
} catch (error) {
|
|
252
|
+
this.logger.error(`There was an error booting the entry point. Your application may not function as expected`, error);
|
|
253
|
+
}
|
|
387
254
|
}
|
|
388
255
|
}
|
|
389
256
|
|
|
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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
|
|
257
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZsdXgvc3JjL2hvdC1yZWxvYWQtc2VydmVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gXCJub2RlOmV2ZW50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZlRm5PdXRwdXQgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgRmlsZSwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IExvZ2dlciB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBhZGRSZXNvbHZlckhvb2ssIGluaXRNb2R1bGVIb29rcywgcmVtb3ZlUmVzb2x2ZXJIb29rIH0gZnJvbSBcIi4vaG90LW1vZHVsZS1ob29rcy5qc1wiO1xuXG5jb25zdCBjdXJyZW50RmlsZVBhdGggPSBpby5maWxlVXJsVG9QYXRoKGltcG9ydC5tZXRhLnVybCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90UmVsb2FkU2VydmVyRXZlbnRzIHtcblx0cmVib290OiBbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEhvdFJlbG9hZFNlcnZlciBleHRlbmRzIEV2ZW50RW1pdHRlcjxIb3RSZWxvYWRTZXJ2ZXJFdmVudHM+IHtcblx0cHJpdmF0ZSByZWFkb25seSBsb2dnZXI6IExvZ2dlcjtcblx0cHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGVudHJ5TW9kdWxlOiBzdHJpbmc7XG5cdHByaXZhdGUgZW50cnk6IEFzeW5jRGlzcG9zYWJsZTtcblx0cHJpdmF0ZSBzb3VyY2VGaWxlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBtb2R1bGVDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigpO1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcblx0cHJpdmF0ZSB3YXRjaGVyczogUmV0dXJuVHlwZTx0eXBlb2YgaW8ud2F0Y2g+W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IobG9nZ2VyOiBMb2dnZXIpIHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMubG9nZ2VyID0gbG9nZ2VyO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHN0YXJ0KGVudHJ5OiBzdHJpbmcsIC4uLndhdGNoRGlyczogc3RyaW5nW10pIHtcblx0XHR0aGlzLmVudHJ5TW9kdWxlID0gZW50cnk7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0U291cmNlRmlsZXMod2F0Y2hEaXJzKTtcblx0XHR0aGlzLmNvbmZpZ3VyZU1vZHVsZUhvb2tzKCk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQWxsU291cmNlRmlsZXMoKTtcblx0XHRhd2FpdCB0aGlzLndhdGNoKHdhdGNoRGlycyk7XG5cdFx0dGhpcy5sb2dnZXIudHJhY2UoXCJTZXJ2aW5nXCIsIGVudHJ5KTtcblx0XHR0aGlzLmxvZ2dlci50cmFjZShcIkhvdCByZWxvYWQgd2F0Y2hpbmdcIiwgd2F0Y2hEaXJzKTtcblx0XHRhd2FpdCB0aGlzLmJvb3RFbnRyeSgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGRpc3Bvc2UoKSB7XG5cdFx0aWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcblx0XHR0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcblx0XHRyZW1vdmVSZXNvbHZlckhvb2sodGhpcy5vblJlc29sdmUpO1xuXHRcdGZvciAoY29uc3Qgd2F0Y2hlciBvZiB0aGlzLndhdGNoZXJzKSB7XG5cdFx0XHR3YXRjaGVyLmNsb3NlKCk7XG5cdFx0fVxuXHRcdGF3YWl0IHRoaXMuZGlzcG9zZUVudHJ5KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlbW92ZVNvdXJjZUZpbGVzKC4uLnNvdXJjZUZpbGVzOiBzdHJpbmdbXSkge1xuXHRcdHRoaXMuc291cmNlRmlsZXMgPSB0aGlzLnNvdXJjZUZpbGVzLmZpbHRlcihcblx0XHRcdChzb3VyY2VGaWxlKSA9PiAhc291cmNlRmlsZXMuaW5jbHVkZXMoc291cmNlRmlsZSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0U291cmNlRmlsZXMoZGlyczogc3RyaW5nW10pIHtcblx0XHRjb25zdCBwYXR0ZXJucyA9IGRpcnMubWFwKChkaXIpID0+IGAke2Rpcn0vKiovKi5qc2ApO1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgaW8uZmluZEZpbGVzKHBhdHRlcm5zKTtcblx0XHRyZXR1cm4gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgY29uZmlndXJlTW9kdWxlSG9va3MoKSB7XG5cdFx0aW5pdE1vZHVsZUhvb2tzKCk7XG5cdFx0YWRkUmVzb2x2ZXJIb29rKHRoaXMub25SZXNvbHZlKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNvbHZlID0gKHJlc3VsdDogUmVzb2x2ZUZuT3V0cHV0LCBwYXJlbnRVcmw6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHsgdXJsIH0gPSByZXN1bHQ7XG5cdFx0Y29uc3QgcGFyZW50VXJsQ2xlYW4gPSBwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdO1xuXHRcdGNvbnN0IGlzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZSh1cmwpO1xuXHRcdGNvbnN0IHBhcmVudElzU291cmNlID0gdGhpcy5pc1NvdXJjZU1vZHVsZShwYXJlbnRVcmxDbGVhbik7XG5cblx0XHRpZiAoaXNTb3VyY2UgfHwgcGFyZW50SXNTb3VyY2UpIHtcblx0XHRcdHRoaXMudHJhY2tEZXBlbmRlbmN5KHVybCwgcGFyZW50VXJsKTtcblx0XHR9XG5cblx0XHRpZiAoIWlzU291cmNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVzdWx0LnVybCA9IHRoaXMuZ2V0Q2FjaGVkT3JOZXcodXJsKTtcblx0fTtcblxuXHRwcml2YXRlIGlzU291cmNlTW9kdWxlKHVybDogc3RyaW5nKSB7XG5cdFx0Y29uc3QgcGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRyZXR1cm4gdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhwYXRoKTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUdyYXBoKG1vZHVsZUlkOiBzdHJpbmcsIHBhcmVudE1vZHVsZXM6IHN0cmluZ1tdID0gW10pIHtcblx0XHRpZiAodGhpcy5pc1NlbGYobW9kdWxlSWQpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbW9kdWxlRGVwcyA9IHRoaXMuZGVwZW5kZW5jaWVzLmdldChtb2R1bGVJZCkgPz8gW107XG5cdFx0aWYgKHBhcmVudE1vZHVsZXMuaW5jbHVkZXMobW9kdWxlSWQpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci5lcnJvcihgQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkOiAke21vZHVsZUlkfWApO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGxldCBzdWJEZXBzID0gQXJyYXkub2Y8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgZGVwIG9mIG1vZHVsZURlcHMpIHtcblx0XHRcdGlmICghdGhpcy5zb3VyY2VGaWxlcy5pbmNsdWRlcyhkZXApKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IHN1YnMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChkZXAsIFttb2R1bGVJZCwgLi4ucGFyZW50TW9kdWxlc10pO1xuXHRcdFx0c3ViRGVwcyA9IFsuLi5zdWJEZXBzLCAuLi5zdWJzXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gWy4uLm5ldyBTZXQoWy4uLm1vZHVsZURlcHMsIC4uLnN1YkRlcHNdKV07XG5cdH1cblxuXHRwcml2YXRlIHRyYWNrRGVwZW5kZW5jeSh1cmw6IHN0cmluZywgcGFyZW50VXJsOiBzdHJpbmcpIHtcblx0XHRjb25zdCBmaWxlUGF0aCA9IGlvLmZpbGVVcmxUb1BhdGgodXJsKTtcblx0XHRjb25zdCBwYXJlbnRQYXRoID0gaW8uZmlsZVVybFRvUGF0aChwYXJlbnRVcmwuc3BsaXQoXCI/XCIpWzBdKTtcblx0XHRjb25zdCBkZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblx0XHRjb25zdCB1cGRhdGVkRGVwcyA9IG5ldyBTZXQoWy4uLmRlcHMsIHBhcmVudFBhdGhdKTtcblx0XHR0aGlzLmRlcGVuZGVuY2llcy5zZXQoZmlsZVBhdGgsIFsuLi51cGRhdGVkRGVwc10pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDYWNoZWRPck5ldyhtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IGZpbGVQYXRoID0gaW8uZmlsZVVybFRvUGF0aChtb2R1bGVVcmwpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMubW9kdWxlQ2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRjb25zdCB2ZXJzaW9uZWQgPSBjYWNoZWQgPz8gdGhpcy52ZXJzaW9uTW9kdWxlKG1vZHVsZVVybCk7XG5cdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZVBhdGgsIHZlcnNpb25lZCk7XG5cdFx0cmV0dXJuIHZlcnNpb25lZDtcblx0fVxuXG5cdHByaXZhdGUgdmVyc2lvbk1vZHVsZShtb2R1bGVVcmw6IHN0cmluZykge1xuXHRcdGNvbnN0IHZlcnNpb25lZFVybCA9IG5ldyBVUkwobW9kdWxlVXJsKTtcblx0XHR2ZXJzaW9uZWRVcmwuc2VhcmNoUGFyYW1zLnNldChcInZlcnNpb25cIiwgRGF0ZS5ub3coKS50b1N0cmluZygpKTtcblx0XHRyZXR1cm4gdmVyc2lvbmVkVXJsLnRvU3RyaW5nKCk7XG5cdH1cblxuXHRwcml2YXRlIHdhdGNoID0gYXN5bmMgKGRpcnM6IHN0cmluZ1tdKSA9PiB7XG5cdFx0Zm9yIChjb25zdCBkaXIgb2YgZGlycykge1xuXHRcdFx0Y29uc3Qgd2F0Y2hlciA9IGlvLndhdGNoKGRpciwgeyBpbmNsdWRlOiBbXCIqKi8qLmpzXCJdLCBpZ25vcmVJbml0aWFsOiB0cnVlIH0pO1xuXHRcdFx0d2F0Y2hlclxuXHRcdFx0XHQub24oXCJhZGRcIiwgdGhpcy5vbkZpbGVBZGRlZClcblx0XHRcdFx0Lm9uKFwiY2hhbmdlXCIsIHRoaXMub25Tb3VyY2VGaWxlQ2hhbmdlZClcblx0XHRcdFx0Lm9uKFwidW5saW5rXCIsIHRoaXMub25GaWxlRGVsZXRlZCk7XG5cdFx0XHR0aGlzLndhdGNoZXJzLnB1c2god2F0Y2hlcik7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlQWRkZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0dGhpcy5zb3VyY2VGaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0XHR0aGlzLm1vZHVsZUNhY2hlLnNldChmdWxsUGF0aCwgbnVsbCk7XG5cdFx0dGhpcy5yZWxvYWRJZkFmZmVjdGVkKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIG9uU291cmNlRmlsZUNoYW5nZWQgPSBhc3luYyAoeyBmdWxsUGF0aCB9OiBGaWxlKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGgpKSB7XG5cdFx0XHR0aGlzLmxvZ2dlci50cmFjZShcblx0XHRcdFx0YCR7ZnVsbFBhdGh9IGlzIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kgZ3JhcGguIE5vdCByZWxvYWRpbmcgZW50cnkuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9O1xuXG5cdHByaXZhdGUgb25GaWxlRGVsZXRlZCA9IGFzeW5jICh7IGZ1bGxQYXRoIH06IEZpbGUpID0+IHtcblx0XHR0aGlzLnJlbW92ZVNvdXJjZUZpbGVzKGZ1bGxQYXRoKTtcblx0fTtcblxuXHRwcml2YXRlIHJlbG9hZElmQWZmZWN0ZWQoZnVsbFBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGRlcHMgPSB0aGlzLmdldERlcGVuZGVuY3lHcmFwaChmdWxsUGF0aCk7XG5cdFx0Y29uc3QgbW9kdWxlcyA9IFsuLi5uZXcgU2V0KFsuLi5kZXBzLCBmdWxsUGF0aF0pXTtcblxuXHRcdGlmICghbW9kdWxlcy5pbmNsdWRlcyh0aGlzLmVudHJ5TW9kdWxlKSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXMpO1xuXHRcdHRoaXMuZGlzcG9zZUFuZEJvb3QoKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgaXNTZWxmKHVybExpa2U6IHN0cmluZykge1xuXHRcdHJldHVybiBjdXJyZW50RmlsZVBhdGggPT09IHBhdGgucmVzb2x2ZShpby5maWxlVXJsVG9QYXRoKHVybExpa2UpKTtcblx0fVxuXG5cdHByaXZhdGUgaW52bGlkYXRlTW9kdWxlKC4uLm1vZHVsZXM6IHN0cmluZ1tdKSB7XG5cdFx0Zm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQobW9kdWxlLCBudWxsKTtcblx0XHR9XG5cdFx0Ly8gUHJ1bmUgaW52YWxpZGF0ZWQgbW9kdWxlcyBmcm9tIGFsbCBwYXJlbnQgbGlzdHMgc28gc3RhbGUgcmVsYXRpb25zaGlwc1xuXHRcdC8vIGFyZSBjbGVhcmVkLiBUaGUgZnJlc2ggYm9vdCByZWJ1aWxkcyBvbmx5IHdoYXQgaXMgYWN0dWFsbHkgaW1wb3J0ZWQuXG5cdFx0Zm9yIChjb25zdCBbY2hpbGQsIHBhcmVudHNdIG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG5cdFx0XHRjb25zdCBwcnVuZWQgPSBwYXJlbnRzLmZpbHRlcigocCkgPT4gIW1vZHVsZXMuaW5jbHVkZXMocCkpO1xuXHRcdFx0aWYgKHBydW5lZC5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0dGhpcy5kZXBlbmRlbmNpZXMuZGVsZXRlKGNoaWxkKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChjaGlsZCwgcHJ1bmVkKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGludmFsaWRhdGVBbGxTb3VyY2VGaWxlcygpIHtcblx0XHRmb3IgKGNvbnN0IGZpbGUgb2YgdGhpcy5zb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy5tb2R1bGVDYWNoZS5zZXQoZmlsZSwgbnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBkaXNwb3NlQW5kQm9vdCA9IGRlYm91bmNlKGFzeW5jICgpID0+IHtcblx0XHRhd2FpdCB0aGlzLmRpc3Bvc2VFbnRyeSgpO1xuXHRcdGF3YWl0IHRoaXMuYm9vdEVudHJ5KCk7XG5cdH0sIDI1MCk7XG5cblx0cHJpdmF0ZSBhc3luYyBkaXNwb3NlRW50cnkoKSB7XG5cdFx0YXdhaXQgdGhpcy5lbnRyeT8uW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGJvb3RFbnRyeSgpIHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdmVyc2lvbiA9IHRoaXMudmVyc2lvbk1vZHVsZShpby5wYXRoVG9GaWxlVXJsKHRoaXMuZW50cnlNb2R1bGUpKTtcblx0XHRcdHRoaXMuZW50cnkgPSAoYXdhaXQgaW1wb3J0KHZlcnNpb24pKT8uZGVmYXVsdDtcblx0XHRcdHRoaXMuZW1pdChcInJlYm9vdFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5sb2dnZXIuZXJyb3IoXG5cdFx0XHRcdGBUaGVyZSB3YXMgYW4gZXJyb3IgYm9vdGluZyB0aGUgZW50cnkgcG9pbnQuIFlvdXIgYXBwbGljYXRpb24gbWF5IG5vdCBmdW5jdGlvbiBhcyBleHBlY3RlZGAsXG5cdFx0XHRcdGVycm9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJIb3RSZWxvYWRTZXJ2ZXIiLCJjdXJyZW50RmlsZVBhdGgiLCJpbyIsImZpbGVVcmxUb1BhdGgiLCJFdmVudEVtaXR0ZXIiLCJsb2dnZXIiLCJkaXNwb3NlZCIsImVudHJ5TW9kdWxlIiwiZW50cnkiLCJzb3VyY2VGaWxlcyIsIm1vZHVsZUNhY2hlIiwiTWFwIiwiZGVwZW5kZW5jaWVzIiwid2F0Y2hlcnMiLCJzdGFydCIsIndhdGNoRGlycyIsImdldFNvdXJjZUZpbGVzIiwiY29uZmlndXJlTW9kdWxlSG9va3MiLCJpbnZhbGlkYXRlQWxsU291cmNlRmlsZXMiLCJ3YXRjaCIsInRyYWNlIiwiYm9vdEVudHJ5IiwiZGlzcG9zZSIsInJlbW92ZVJlc29sdmVySG9vayIsIm9uUmVzb2x2ZSIsIndhdGNoZXIiLCJjbG9zZSIsImRpc3Bvc2VFbnRyeSIsInJlbW92ZVNvdXJjZUZpbGVzIiwiZmlsdGVyIiwic291cmNlRmlsZSIsImluY2x1ZGVzIiwiZGlycyIsInBhdHRlcm5zIiwibWFwIiwiZGlyIiwiZmlsZXMiLCJmaW5kRmlsZXMiLCJmIiwiZnVsbFBhdGgiLCJpbml0TW9kdWxlSG9va3MiLCJhZGRSZXNvbHZlckhvb2siLCJyZXN1bHQiLCJwYXJlbnRVcmwiLCJ1cmwiLCJwYXJlbnRVcmxDbGVhbiIsInNwbGl0IiwiaXNTb3VyY2UiLCJpc1NvdXJjZU1vZHVsZSIsInBhcmVudElzU291cmNlIiwidHJhY2tEZXBlbmRlbmN5IiwiZ2V0Q2FjaGVkT3JOZXciLCJwYXRoIiwiZ2V0RGVwZW5kZW5jeUdyYXBoIiwibW9kdWxlSWQiLCJwYXJlbnRNb2R1bGVzIiwiaXNTZWxmIiwibW9kdWxlRGVwcyIsImdldCIsImVycm9yIiwic3ViRGVwcyIsIkFycmF5Iiwib2YiLCJkZXAiLCJzdWJzIiwiU2V0IiwiZmlsZVBhdGgiLCJwYXJlbnRQYXRoIiwiZGVwcyIsInVwZGF0ZWREZXBzIiwic2V0IiwibW9kdWxlVXJsIiwiY2FjaGVkIiwidmVyc2lvbmVkIiwidmVyc2lvbk1vZHVsZSIsInZlcnNpb25lZFVybCIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsImluY2x1ZGUiLCJpZ25vcmVJbml0aWFsIiwib24iLCJvbkZpbGVBZGRlZCIsIm9uU291cmNlRmlsZUNoYW5nZWQiLCJvbkZpbGVEZWxldGVkIiwicHVzaCIsInJlbG9hZElmQWZmZWN0ZWQiLCJtb2R1bGVzIiwiaW52bGlkYXRlTW9kdWxlIiwiZGlzcG9zZUFuZEJvb3QiLCJ1cmxMaWtlIiwicmVzb2x2ZSIsIm1vZHVsZSIsImNoaWxkIiwicGFyZW50cyIsInBydW5lZCIsInAiLCJsZW5ndGgiLCJkZWxldGUiLCJmaWxlIiwiZGVib3VuY2UiLCJTeW1ib2wiLCJhc3luY0Rpc3Bvc2UiLCJ2ZXJzaW9uIiwicGF0aFRvRmlsZVVybCIsImRlZmF1bHQiLCJlbWl0Il0sIm1hcHBpbmdzIjoiOzs7OytCQWNhQTs7O2VBQUFBOzs7NEJBZGdCO2lFQUVaO29CQUNhO3dCQUNMO2dDQUU0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFckUsTUFBTUMsa0JBQWtCQyxNQUFFLENBQUNDLGFBQWEsQ0FBQztBQU1sQyxNQUFNSCx3QkFBd0JJLHdCQUFZO0lBQy9CQyxPQUFlO0lBQ3hCQyxXQUFXLE1BQU07SUFDakJDLFlBQW9CO0lBQ3BCQyxNQUF1QjtJQUN2QkMsY0FBd0IsRUFBRSxDQUFDO0lBQzNCQyxjQUFjLElBQUlDLE1BQTZCO0lBQy9DQyxlQUFlLElBQUlELE1BQXdCO0lBQzNDRSxXQUEwQyxFQUFFLENBQUM7SUFFckQsWUFBbUJSLE1BQWMsQ0FBRTtRQUNsQyxLQUFLO1FBQ0wsSUFBSSxDQUFDQSxNQUFNLEdBQUdBO0lBQ2Y7SUFFQSxNQUFhUyxNQUFNTixLQUFhLEVBQUUsR0FBR08sU0FBbUIsRUFBRTtRQUN6RCxJQUFJLENBQUNSLFdBQVcsR0FBR0M7UUFDbkIsSUFBSSxDQUFDQyxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUNPLGNBQWMsQ0FBQ0Q7UUFDN0MsSUFBSSxDQUFDRSxvQkFBb0I7UUFDekIsSUFBSSxDQUFDQyx3QkFBd0I7UUFDN0IsTUFBTSxJQUFJLENBQUNDLEtBQUssQ0FBQ0o7UUFDakIsSUFBSSxDQUFDVixNQUFNLENBQUNlLEtBQUss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
|