@nlabs/arkhamjs 3.26.0 → 3.26.2

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,38 @@
1
+ /// <reference types="node" />
2
+ import { EventEmitter } from 'events';
3
+ import { FluxAction, FluxMiddlewareType, FluxOptions, FluxStore } from './Flux.types';
4
+ export declare class FluxFramework extends EventEmitter {
5
+ static initFlux: boolean;
6
+ isInit: boolean;
7
+ pluginTypes: string[];
8
+ private state;
9
+ private storeActions;
10
+ private defaultOptions;
11
+ private middleware;
12
+ private options;
13
+ constructor();
14
+ addMiddleware(middleware: FluxMiddlewareType[]): void;
15
+ clearAppData(): Promise<boolean>;
16
+ clearMiddleware(): boolean;
17
+ removeStores(storeNames: string[]): void;
18
+ dispatch(action: FluxAction, silent?: boolean): Promise<FluxAction>;
19
+ getOptions(): FluxOptions;
20
+ getState(path?: string | string[], defaultValue?: any): any;
21
+ getStore(name?: string): FluxStore;
22
+ init(options?: FluxOptions, reset?: boolean): Promise<FluxFramework>;
23
+ onInit(listener: (...args: any[]) => void): void;
24
+ offInit(listener: (...args: any[]) => void): void;
25
+ off(eventType: string, listener: (...args: any[]) => void): this;
26
+ on(eventType: string, listener: (...args: any[]) => void): this;
27
+ addStores(stores: any[]): Promise<object[]>;
28
+ removeMiddleware(names: string[]): void;
29
+ reset(clearStorage?: boolean): Promise<void>;
30
+ setState(path: string | string[], value: any): Promise<boolean>;
31
+ private addPlugin;
32
+ private deregister;
33
+ private register;
34
+ private removePlugin;
35
+ private updateStorage;
36
+ private useStorage;
37
+ }
38
+ export declare const Flux: FluxFramework;
@@ -0,0 +1,484 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var Flux_exports = {};
29
+ __export(Flux_exports, {
30
+ Flux: () => Flux,
31
+ FluxFramework: () => FluxFramework
32
+ });
33
+ module.exports = __toCommonJS(Flux_exports);
34
+ var import_error_stack_parser = __toESM(require("error-stack-parser"));
35
+ var import_events = require("events");
36
+ var import_debounce = __toESM(require("lodash/debounce"));
37
+ var import_cloneDeep = __toESM(require("lodash/fp/cloneDeep"));
38
+ var import_get = __toESM(require("lodash/fp/get"));
39
+ var import_isEmpty = __toESM(require("lodash/fp/isEmpty"));
40
+ var import_merge = __toESM(require("lodash/fp/merge"));
41
+ var import_set = __toESM(require("lodash/fp/set"));
42
+ var import_ArkhamConstants = require("../constants/ArkhamConstants");
43
+ class FluxFramework extends import_events.EventEmitter {
44
+ /**
45
+ * Create a new instance of Flux. Note that the Flux object
46
+ * is a Singleton pattern, so only one should ever exist.
47
+ *
48
+ * @constructor
49
+ * @this {FluxFramework}
50
+ */
51
+ constructor() {
52
+ super();
53
+ this.isInit = false;
54
+ // Public properties
55
+ this.pluginTypes = ["preDispatch", "postDispatch"];
56
+ // Private properties
57
+ this.state = {};
58
+ this.storeActions = {};
59
+ this.defaultOptions = {
60
+ name: "arkhamjs",
61
+ routerType: "browser",
62
+ scrollToTop: true,
63
+ state: null,
64
+ storage: null,
65
+ storageWait: 300,
66
+ stores: [],
67
+ title: "ArkhamJS"
68
+ };
69
+ this.middleware = {};
70
+ this.options = this.defaultOptions;
71
+ this.updateStorage = () => Promise.resolve(false);
72
+ this.addMiddleware = this.addMiddleware.bind(this);
73
+ this.addStores = this.addStores.bind(this);
74
+ this.clearAppData = this.clearAppData.bind(this);
75
+ this.clearMiddleware = this.clearMiddleware.bind(this);
76
+ this.deregister = this.deregister.bind(this);
77
+ this.dispatch = this.dispatch.bind(this);
78
+ this.getOptions = this.getOptions.bind(this);
79
+ this.getState = this.getState.bind(this);
80
+ this.getStore = this.getStore.bind(this);
81
+ this.init = this.init.bind(this);
82
+ this.off = this.off.bind(this);
83
+ this.register = this.register.bind(this);
84
+ this.removeMiddleware = this.removeMiddleware.bind(this);
85
+ this.removeStores = this.removeStores.bind(this);
86
+ this.reset = this.reset.bind(this);
87
+ this.setState = this.setState.bind(this);
88
+ this.pluginTypes.forEach((type) => this.middleware[`${type}List`] = []);
89
+ }
90
+ /**
91
+ * Add middleware to framework.
92
+ *
93
+ * @param {array} middleware An array of middleware to add to the framework.
94
+ */
95
+ addMiddleware(middleware) {
96
+ middleware.forEach((middleObj) => {
97
+ if (!!middleObj && (typeof middleObj === "function" || typeof middleObj === "object")) {
98
+ const middleName = middleObj.name || "";
99
+ if (!middleName) {
100
+ throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");
101
+ }
102
+ this.pluginTypes.forEach((type) => {
103
+ const method = middleObj[type];
104
+ const plugin = { method, name: middleName };
105
+ this.middleware[`${type}List`] = this.addPlugin(type, plugin);
106
+ });
107
+ } else {
108
+ throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");
109
+ }
110
+ });
111
+ }
112
+ /**
113
+ * Remove all app data from storage.
114
+ *
115
+ * @returns {Promise<boolean>} Whether app data was successfully removed.
116
+ */
117
+ clearAppData() {
118
+ Object.keys(this.storeActions).forEach((storeName) => {
119
+ const storeFn = this.storeActions[storeName];
120
+ this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
121
+ });
122
+ const { name, storage } = this.options;
123
+ if (storage) {
124
+ return storage.setStorageData(name, this.state);
125
+ }
126
+ return Promise.resolve(true);
127
+ }
128
+ /**
129
+ * Remove all middleware.
130
+ *
131
+ * @returns {boolean} Whether middleware was successfully removed.
132
+ */
133
+ clearMiddleware() {
134
+ Object.keys(this.middleware).forEach((pluginType) => {
135
+ this.middleware[pluginType] = [];
136
+ });
137
+ return true;
138
+ }
139
+ /**
140
+ * De-registers named stores.
141
+ *
142
+ * @param {array} storeNames An array of store names to remove from the framework.
143
+ */
144
+ removeStores(storeNames) {
145
+ storeNames.forEach((name) => this.deregister(name));
146
+ }
147
+ /**
148
+ * Dispatches an action to all stores.
149
+ *
150
+ * @param {object} action to dispatch to all the stores.
151
+ * @param {boolean} silent To silence any events.
152
+ * @returns {Promise} The promise is resolved when and if the app saves data to storage, returning
153
+ * the action.
154
+ */
155
+ async dispatch(action, silent = false) {
156
+ if (!action) {
157
+ throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");
158
+ }
159
+ let clonedAction = (0, import_cloneDeep.default)(action);
160
+ const startTime = Date.now();
161
+ let stack = [];
162
+ try {
163
+ const stackProperty = "stackTraceLimit";
164
+ const { stackTraceLimit } = Error;
165
+ Error[stackProperty] = Infinity;
166
+ stack = import_error_stack_parser.default.parse(new Error());
167
+ Error[stackProperty] = stackTraceLimit;
168
+ } catch (error) {
169
+ }
170
+ const options = (0, import_cloneDeep.default)(this.options);
171
+ const appInfo = { duration: 0, options, stack };
172
+ const { postDispatchList = [], preDispatchList = [] } = this.middleware;
173
+ if (preDispatchList.length) {
174
+ clonedAction = await Promise.all(
175
+ preDispatchList.map(
176
+ (plugin) => plugin.method(
177
+ (0, import_cloneDeep.default)(clonedAction),
178
+ (0, import_cloneDeep.default)(this.state),
179
+ appInfo
180
+ )
181
+ )
182
+ ).then(
183
+ (actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)
184
+ ).catch((error) => {
185
+ throw error;
186
+ });
187
+ }
188
+ const { type, ...data } = clonedAction;
189
+ if (!type || type === "") {
190
+ console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
191
+ return Promise.resolve(clonedAction);
192
+ }
193
+ Object.keys(this.storeActions).forEach((storeName) => {
194
+ const storeFn = this.storeActions[storeName];
195
+ const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
196
+ this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
197
+ });
198
+ const { storage } = this.options;
199
+ if (storage) {
200
+ try {
201
+ await this.updateStorage();
202
+ } catch (error) {
203
+ }
204
+ }
205
+ const endTime = +/* @__PURE__ */ new Date();
206
+ const duration = endTime - startTime;
207
+ appInfo.duration = duration;
208
+ if (postDispatchList.length) {
209
+ clonedAction = await Promise.all(
210
+ postDispatchList.map(
211
+ async (plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo)
212
+ )
213
+ ).then(
214
+ (actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)
215
+ ).catch((error) => {
216
+ throw error;
217
+ });
218
+ }
219
+ if (!silent) {
220
+ this.emit(type, clonedAction);
221
+ this.emit("arkhamjs", this.state);
222
+ }
223
+ return Promise.resolve(clonedAction);
224
+ }
225
+ /**
226
+ * Get the current Flux options.
227
+ *
228
+ * @returns {FluxOptions} the Flux options object.
229
+ */
230
+ getOptions() {
231
+ return this.options;
232
+ }
233
+ /**
234
+ * Get the current state object.
235
+ *
236
+ * @param {string|array} [name] (optional) The name of the store for an object, otherwise it will return all store
237
+ * objects. You can also use an array to specify a property path within the object.
238
+ * @param {any} [defaultValue] (optional) A default value to return if null.
239
+ * @returns {any} the state object or a property value within.
240
+ */
241
+ getState(path = "", defaultValue) {
242
+ let storeValue;
243
+ if (!path) {
244
+ storeValue = this.state || {};
245
+ } else {
246
+ storeValue = (0, import_get.default)(path, this.state);
247
+ }
248
+ const value = storeValue ? (0, import_cloneDeep.default)(storeValue) : storeValue;
249
+ return value === void 0 ? defaultValue : value;
250
+ }
251
+ /**
252
+ * Get a store object registered with Flux.
253
+ *
254
+ * @param {string} name The name of the store.
255
+ * @returns {FluxStore} the store object.
256
+ */
257
+ getStore(name = "") {
258
+ return this.storeActions[name];
259
+ }
260
+ /**
261
+ * Initialize and set configuration options.
262
+ *
263
+ * @param {object} options Configuration options.
264
+ */
265
+ async init(options = {}, reset = false) {
266
+ if (reset) {
267
+ this.isInit = false;
268
+ this.reset(false);
269
+ }
270
+ const updatedOptions = { ...options };
271
+ if (this.isInit) {
272
+ updatedOptions.name = this.options.name;
273
+ }
274
+ this.options = { ...this.defaultOptions, ...updatedOptions };
275
+ const { debug, middleware, name, stores } = this.options;
276
+ try {
277
+ await this.useStorage(name);
278
+ } catch (error) {
279
+ console.error("Arkham Error: There was an error while using storage.", name);
280
+ throw error;
281
+ }
282
+ if (!!stores && stores.length) {
283
+ try {
284
+ await this.addStores(stores);
285
+ } catch (error) {
286
+ console.error("Arkham Error: There was an error while adding stores.", stores);
287
+ throw error;
288
+ }
289
+ }
290
+ if (!!middleware && middleware.length) {
291
+ this.addMiddleware(middleware);
292
+ }
293
+ const windowProperty = "arkhamjs";
294
+ if (debug) {
295
+ window[windowProperty] = this;
296
+ } else {
297
+ delete window[windowProperty];
298
+ }
299
+ this.isInit = true;
300
+ this.emit(import_ArkhamConstants.ArkhamConstants.INIT);
301
+ return this;
302
+ }
303
+ /**
304
+ * Adds an initialization listener.
305
+ *
306
+ * @param {function} [listener] The callback associated with the subscribed event.
307
+ */
308
+ onInit(listener) {
309
+ this.on(import_ArkhamConstants.ArkhamConstants.INIT, listener);
310
+ if (this.isInit) {
311
+ listener();
312
+ }
313
+ }
314
+ /**
315
+ * Removes the initialization listener.
316
+ *
317
+ * @param {function} [listener] The callback associated with the subscribed event.
318
+ */
319
+ offInit(listener) {
320
+ this.off(import_ArkhamConstants.ArkhamConstants.INIT, listener);
321
+ }
322
+ /**
323
+ * Removes an event listener.
324
+ *
325
+ * @param {string} [eventType] Event to unsubscribe.
326
+ * @param {function} [listener] The callback associated with the subscribed event.
327
+ */
328
+ off(eventType, listener) {
329
+ return this.removeListener(eventType, listener);
330
+ }
331
+ /**
332
+ * Adds an event listener.
333
+ *
334
+ * @param {string} [eventType] Event to subscribe.
335
+ * @param {function} [listener] The callback associated with the subscribed event.
336
+ */
337
+ on(eventType, listener) {
338
+ return this.addListener(eventType, listener);
339
+ }
340
+ /**
341
+ * Registers new Stores.
342
+ *
343
+ * @param {array} stores Store class.
344
+ * @returns {Promise<object[]>} the class object(s).
345
+ */
346
+ async addStores(stores) {
347
+ const registeredStores = stores.map((store) => this.register(store));
348
+ const { name, storage } = this.options;
349
+ if (storage) {
350
+ try {
351
+ await storage.setStorageData(name, this.state);
352
+ } catch (error) {
353
+ throw error;
354
+ }
355
+ }
356
+ return registeredStores;
357
+ }
358
+ /**
359
+ * Remove middleware from framework.
360
+ *
361
+ * @param {array} string middleware names to remove.
362
+ * @returns {Promise<object[]>} the class object(s).
363
+ */
364
+ removeMiddleware(names) {
365
+ names.forEach((name) => {
366
+ this.pluginTypes.forEach((type) => {
367
+ this.middleware[`${type}List`] = this.removePlugin(type, name);
368
+ });
369
+ });
370
+ }
371
+ /**
372
+ * Reset framework.
373
+ *
374
+ * @param {array} string middleware names to remove.
375
+ * @returns {Promise<object[]>} the class object(s).
376
+ */
377
+ async reset(clearStorage = true) {
378
+ const { name, storage } = this.options;
379
+ if (storage && clearStorage) {
380
+ try {
381
+ await storage.setStorageData(name, {});
382
+ } catch (error) {
383
+ throw error;
384
+ }
385
+ }
386
+ this.middleware = {};
387
+ this.options = { ...this.defaultOptions };
388
+ this.state = {};
389
+ this.storeActions = {};
390
+ this.isInit = false;
391
+ }
392
+ /**
393
+ * Sets the current state object.
394
+ *
395
+ * @param {string|array} [name] The name of the store to set. You can also use an array to specify a property path
396
+ * within the object.
397
+ * @param {any} [value] The value to set.
398
+ */
399
+ setState(path = "", value) {
400
+ if (!!path) {
401
+ this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
402
+ }
403
+ const { storage } = this.options;
404
+ if (storage) {
405
+ return this.updateStorage();
406
+ }
407
+ return Promise.resolve(false);
408
+ }
409
+ addPlugin(type, plugin) {
410
+ const list = this.middleware[`${type}List`] || [];
411
+ const { method, name } = plugin;
412
+ if (method && typeof method === "function") {
413
+ const exists = !!list.filter((obj) => obj.name === name).length;
414
+ if (!exists) {
415
+ list.push({ method, name });
416
+ }
417
+ } else if (method !== void 0) {
418
+ throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
419
+ }
420
+ return list;
421
+ }
422
+ deregister(name = "") {
423
+ delete this.storeActions[name];
424
+ delete this.state[name];
425
+ }
426
+ register(storeFn) {
427
+ if (!storeFn) {
428
+ throw Error("Store is undefined. Cannot register with Flux.");
429
+ }
430
+ const isFnc = typeof storeFn === "function";
431
+ if (!isFnc) {
432
+ throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
433
+ }
434
+ const { name } = storeFn;
435
+ const initialState = storeFn();
436
+ const storeAction = {
437
+ action: storeFn,
438
+ initialState: storeFn(),
439
+ name
440
+ };
441
+ if (!(0, import_isEmpty.default)(name) && !this.storeActions[name]) {
442
+ this.storeActions[name] = storeAction;
443
+ if (!this.state[name]) {
444
+ if (initialState) {
445
+ this.state[name] = (0, import_cloneDeep.default)(initialState);
446
+ } else {
447
+ this.state[name] = {};
448
+ }
449
+ }
450
+ }
451
+ return this.storeActions[name];
452
+ }
453
+ removePlugin(type, name) {
454
+ const list = this.middleware[`${type}List`] || [];
455
+ return list.filter((obj) => obj.name !== name);
456
+ }
457
+ async useStorage(name) {
458
+ const { storage, state, storageWait } = this.options;
459
+ if (storage) {
460
+ try {
461
+ this.state = state || await storage.getStorageData(name) || {};
462
+ this.updateStorage = (0, import_debounce.default)(
463
+ () => storage.setStorageData(name, this.state),
464
+ storageWait,
465
+ { leading: true, trailing: true }
466
+ );
467
+ } catch (error) {
468
+ console.error(`ArkhamJS Error: Using storage, "${name}".`);
469
+ throw error;
470
+ }
471
+ } else {
472
+ this.state = state || {};
473
+ }
474
+ return null;
475
+ }
476
+ }
477
+ FluxFramework.initFlux = false;
478
+ const Flux = new FluxFramework();
479
+ // Annotate the CommonJS export names for ESM import in node:
480
+ 0 && (module.exports = {
481
+ Flux,
482
+ FluxFramework
483
+ });
484
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBtaWRkbGV3YXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBtaWRkbGV3YXJlIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyTWlkZGxld2FyZSgpOiBib29sZWFuIHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5taWRkbGV3YXJlKVxuICAgICAgLmZvckVhY2goKHBsdWdpblR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogRGUtcmVnaXN0ZXJzIG5hbWVkIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVOYW1lcyBBbiBhcnJheSBvZiBzdG9yZSBuYW1lcyB0byByZW1vdmUgZnJvbSB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24gdG8gYWxsIHN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGFjdGlvbiB0byBkaXNwYXRjaCB0byBhbGwgdGhlIHN0b3Jlcy5cbiAgICogQHBhcmFtIHtib29sZWFufSBzaWxlbnQgVG8gc2lsZW5jZSBhbnkgZXZlbnRzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gVGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2hlbiBhbmQgaWYgdGhlIGFwcCBzYXZlcyBkYXRhIHRvIHN0b3JhZ2UsIHJldHVybmluZ1xuICAgKiB0aGUgYWN0aW9uLlxuICAgKi9cbiAgYXN5bmMgZGlzcGF0Y2goYWN0aW9uOiBGbHV4QWN0aW9uLCBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIGlmKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIExvZyBkdXJhdGlvbiBvZiBkaXNwYXRjaFxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIEdldCBzdGFja1xuICAgIGxldCBzdGFjayA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gRXJyb3JTdGFja1BhcnNlci5wYXJzZShuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcbiAgICB9IGNhdGNoKGVycm9yKSB7fVxuXG4gICAgLy8gR2V0IG9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gY2xvbmVEZWVwKHRoaXMub3B0aW9ucyk7XG5cbiAgICAvLyBBcHAgaW5mb1xuICAgIGNvbnN0IGFwcEluZm8gPSB7ZHVyYXRpb246IDAsIG9wdGlvbnMsIHN0YWNrfTtcblxuICAgIC8vIEFwcGx5IG1pZGRsZXdhcmUgYmVmb3JlIHRoZSBhY3Rpb24gaXMgcHJvY2Vzc2VkXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYocHJlRGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHByZURpc3BhdGNoTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoXG4gICAgICAgICAgICBjbG9uZURlZXAoY2xvbmVkQWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoYWN0aW9ucykgPT4gYWN0aW9ucy5yZWR1Y2UoKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbikgPT5cbiAgICAgICAgICAgIG1lcmdlKHVwZGF0ZWRBY3Rpb24sIGFjdGlvbiksIGNsb25lZEFjdGlvbikgYXMgRmx1eEFjdGlvblxuICAgICAgICApXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge3R5cGUsIC4uLmRhdGF9ID0gY2xvbmVkQWN0aW9uO1xuXG4gICAgLy8gUmVxdWlyZSBhIHR5cGVcbiAgICBpZighdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYW4gYWN0aW9uIGNvbWVzIGluLCBpdCBtdXN0IGJlIGNvbXBsZXRlbHkgaGFuZGxlZCBieSBhbGwgc3RvcmVzXG4gICAgT2JqZWN0XG4gICAgICAua2V5cyh0aGlzLnN0b3JlQWN0aW9ucylcbiAgICAgIC5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSBjbG9uZURlZXAodGhpcy5zdGF0ZVtzdG9yZU5hbWVdKSB8fCBjbG9uZURlZXAoc3RvcmVGbi5pbml0aWFsU3RhdGUpIHx8IHt9O1xuICAgICAgICB0aGlzLnN0YXRlW3N0b3JlTmFtZV0gPSBjbG9uZURlZXAoc3RvcmVGbi5hY3Rpb24odHlwZSwgZGF0YSwgc3RhdGUpKSB8fCBzdGF0ZTtcbiAgICAgIH0pO1xuXG4gICAgLy8gU2F2ZSBjYWNoZSBpbiBzdG9yYWdlXG4gICAgY29uc3Qge3N0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7fVxuICAgIH1cblxuICAgIGNvbnN0IGVuZFRpbWU6IG51bWJlciA9ICsobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZHVyYXRpb246IG51bWJlciA9IGVuZFRpbWUgLSBzdGFydFRpbWU7XG4gICAgYXBwSW5mby5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG4gICAgaWYocG9zdERpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwb3N0RGlzcGF0Y2hMaXN0Lm1hcChcbiAgICAgICAgICAgIGFzeW5jIChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKGNsb25lRGVlcChjbG9uZWRBY3Rpb24pLCBjbG9uZURlZXAodGhpcy5zdGF0ZSksIGFwcEluZm8pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgIChhY3Rpb25zKSA9PiBhY3Rpb25zLnJlZHVjZSgodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSA9PlxuICAgICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgY2xvbmVkQWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICAgIClcbiAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZighc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9ucy5cbiAgICpcbiAgICogQHJldHVybnMge0ZsdXhPcHRpb25zfSB0aGUgRmx1eCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGdldE9wdGlvbnMoKTogRmx1eE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IFtuYW1lXSAob3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSBmb3IgYW4gb2JqZWN0LCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYWxsIHN0b3JlXG4gICAqICAgb2JqZWN0cy4gWW91IGNhbiBhbHNvIHVzZSBhbiBhcnJheSB0byBzcGVjaWZ5IGEgcHJvcGVydHkgcGF0aCB3aXRoaW4gdGhlIG9iamVjdC5cbiAgICogQHBhcmFtIHthbnl9IFtkZWZhdWx0VmFsdWVdIChvcHRpb25hbCkgQSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBudWxsLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgc3RhdGUgb2JqZWN0IG9yIGEgcHJvcGVydHkgdmFsdWUgd2l0aGluLlxuICAgKi9cbiAgZ2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgZGVmYXVsdFZhbHVlPyk6IGFueSB7XG4gICAgbGV0IHN0b3JlVmFsdWU7XG5cbiAgICBpZighcGF0aCkge1xuICAgICAgc3RvcmVWYWx1ZSA9IHRoaXMuc3RhdGUgfHwge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlVmFsdWUgPSBnZXQocGF0aCwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZVZhbHVlID8gY2xvbmVEZWVwKHN0b3JlVmFsdWUpIDogc3RvcmVWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHN0b3JlIG9iamVjdCByZWdpc3RlcmVkIHdpdGggRmx1eC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Rmx1eFN0b3JlfSB0aGUgc3RvcmUgb2JqZWN0LlxuICAgKi9cbiAgZ2V0U3RvcmUobmFtZTogc3RyaW5nID0gJycpOiBGbHV4U3RvcmUge1xuICAgIHJldHVybiB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuZCBzZXQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICAvLyBTaG91bGQgcmVzZXQgcHJldmlvdXMgcGFyYW1zXG4gICAgaWYocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgb3B0aW9uc1xuICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0gey4uLm9wdGlvbnN9O1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgbmFtZSBmcm9tIG9wdGlvbnMgaWYgYWxyZWFkeSBpbml0aWFsaXplZCwgb3RoZXJ3aXNlIHRoZSByb290IGFwcCB3aWxsIG5vdCBiZSBhYmxlIHRvIGFjY2Vzc1xuICAgICAgLy8gdGhlIHN0YXRlIHRyZWVcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHN0b3JlXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudXNlU3RvcmFnZShuYW1lKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSB1c2luZyBzdG9yYWdlLicsIG5hbWUpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgaWYoISFzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5hZGRTdG9yZXMoc3RvcmVzKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQXJraGFtIEVycm9yOiBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgYWRkaW5nIHN0b3Jlcy4nLCBzdG9yZXMpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZighIW1pZGRsZXdhcmUgJiYgbWlkZGxld2FyZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcblxuICAgIGlmKGRlYnVnKSB7XG4gICAgICB3aW5kb3dbd2luZG93UHJvcGVydHldID0gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV07XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXQgPSB0cnVlO1xuICAgIHRoaXMuZW1pdChBcmtoYW1Db25zdGFudHMuSU5JVCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvbkluaXQobGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub24oQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcblxuICAgIGlmKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50VHlwZV0gRXZlbnQgdG8gdW5zdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9mZihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byBzdWJzY3JpYmUuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIG5ldyBTdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlcyBTdG9yZSBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogYW55W10pOiBQcm9taXNlPG9iamVjdFtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHNlc3Npb24gc3RvcmFnZVxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUGx1Z2luKHR5cGU6IHN0cmluZywgcGx1Z2luOiBGbHV4UGx1Z2luVHlwZSk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG4gICAgY29uc3Qge21ldGhvZCwgbmFtZX0gPSBwbHVnaW47XG5cbiAgICBpZihtZXRob2QgJiYgdHlwZW9mIG1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gQ2hlY2sgaWYgcGx1Z2luIGFscmVhZHkgZXhpc3RzXG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSAhIWxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSA9PT0gbmFtZSkubGVuZ3RoO1xuXG4gICAgICAvLyBEbyBub3QgYWRkIGR1cGxpY2F0ZSBwbHVnaW5zXG4gICAgICBpZighZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtwbHVnaW4ubmFtZX0gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gTWV0aG9kIGlzIG5vdCBhIGZ1bmN0aW9uLmApO1xuICAgIH1cblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBkZXJlZ2lzdGVyKG5hbWU6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnN0YXRlW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlcihzdG9yZUZuKTogRmx1eFN0b3JlIHtcbiAgICBpZighc3RvcmVGbikge1xuICAgICAgdGhyb3cgRXJyb3IoJ1N0b3JlIGlzIHVuZGVmaW5lZC4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZuYzogYm9vbGVhbiA9IHR5cGVvZiBzdG9yZUZuID09PSAnZnVuY3Rpb24nO1xuXG4gICAgaWYoIWlzRm5jKSB7XG4gICAgICB0aHJvdyBFcnJvcihgJHtzdG9yZUZufSBpcyBub3QgYSBzdG9yZSBmdW5jdGlvbi4gQ2Fubm90IHJlZ2lzdGVyIHdpdGggRmx1eC5gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3RvcmUgb2JqZWN0XG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbiA9IHtcbiAgICAgIGFjdGlvbjogc3RvcmVGbixcbiAgICAgIGluaXRpYWxTdGF0ZTogc3RvcmVGbigpLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZighaXNFbXB0eShuYW1lKSAmJiAhdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0pIHtcbiAgICAgIC8vIFNhdmUgc3RvcmUgb2JqZWN0XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXNcbiAgICAgIGlmKCF0aGlzLnN0YXRlW25hbWVdKSB7XG4gICAgICAgIGlmKGluaXRpYWxTdGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhdGVbbmFtZV0gPSBjbG9uZURlZXAoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc3RvcmUgY2xhc3NcbiAgICByZXR1cm4gdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV07XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsdWdpbih0eXBlOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IEZsdXhQbHVnaW5UeXBlW10ge1xuICAgIGNvbnN0IGxpc3QgPSB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gfHwgW107XG5cbiAgICAvLyByZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBwbHVnaW5cbiAgICByZXR1cm4gbGlzdC5maWx0ZXIoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lICE9PSBuYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcmFnZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gQ2FjaGVcbiAgICBpZihzdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwgYXdhaXQgc3RvcmFnZS5nZXRTdG9yYWdlRGF0YShuYW1lKSB8fCB7fTtcbiAgICAgICAgdGhpcy51cGRhdGVTdG9yYWdlID0gZGVib3VuY2UoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdCxcbiAgICAgICAgICB7bGVhZGluZzogdHJ1ZSwgdHJhaWxpbmc6IHRydWV9XG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFya2hhbUpTIEVycm9yOiBVc2luZyBzdG9yYWdlLCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7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O0FBQ3BELFVBQU0sRUFBQyxTQUFTLE9BQU8sWUFBVyxJQUFJLEtBQUs7QUFHM0MsUUFBRyxTQUFTO0FBQ1YsVUFBSTtBQUNGLGFBQUssUUFBUSxTQUFTLE1BQU0sUUFBUSxlQUFlLElBQUksS0FBSyxDQUFDO0FBQzdELGFBQUssb0JBQWdCLGdCQUFBTztBQUFBLFVBQ25CLE1BQU0sUUFBUSxlQUFlLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDN0M7QUFBQSxVQUNBLEVBQUMsU0FBUyxNQUFNLFVBQVUsS0FBSTtBQUFBLFFBQ2hDO0FBQUEsTUFDRixTQUFRLE9BQU47QUFDQSxnQkFBUSxNQUFNLG1DQUFtQyxRQUFRO0FBQ3pELGNBQU07QUFBQSxNQUNSO0FBQUEsSUFDRixPQUFPO0FBQ0wsV0FBSyxRQUFRLFNBQVMsQ0FBQztBQUFBLElBQ3pCO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQTVpQmEsY0FDSixXQUFvQjtBQTZpQnRCLE1BQU0sT0FBc0IsSUFBSSxjQUFjOyIsCiAgIm5hbWVzIjogWyJjbG9uZURlZXAiLCAiRXJyb3JTdGFja1BhcnNlciIsICJhY3Rpb24iLCAibWVyZ2UiLCAiZ2V0IiwgInNldCIsICJpc0VtcHR5IiwgImRlYm91bmNlIl0KfQo=
@@ -0,0 +1,47 @@
1
+ export interface FluxOptions {
2
+ readonly basename?: string;
3
+ readonly context?: object;
4
+ readonly debug?: boolean;
5
+ readonly getUserConfirmation?: () => void;
6
+ readonly hashType?: 'slash' | 'noslash' | 'hashbang';
7
+ readonly history?: object;
8
+ readonly initialEntries?: any[];
9
+ readonly initialIndex?: number;
10
+ readonly keyLength?: number;
11
+ readonly location?: string | object;
12
+ readonly middleware?: FluxMiddlewareType[];
13
+ readonly name?: string;
14
+ readonly routerType?: string;
15
+ readonly scrollToTop?: boolean;
16
+ readonly state?: any;
17
+ readonly storage?: FluxStorageType;
18
+ readonly storageWait?: number;
19
+ readonly stores?: any[];
20
+ readonly title?: string;
21
+ }
22
+ export interface FluxAction {
23
+ readonly [key: string]: any;
24
+ readonly type: string;
25
+ }
26
+ export interface FluxStorageType {
27
+ readonly getStorageData: (key: string) => Promise<any>;
28
+ readonly setStorageData: (key: string, value: any) => Promise<boolean>;
29
+ }
30
+ export interface FluxStore {
31
+ readonly action: (type: string, data: any, state: any) => any;
32
+ readonly name: string;
33
+ readonly initialState: any;
34
+ }
35
+ export type FluxPluginMethodType = (action: FluxAction, store: object, appData?: object) => Promise<FluxAction>;
36
+ export interface FluxMiddlewareType {
37
+ readonly name: string;
38
+ readonly preDispatch?: FluxPluginMethodType;
39
+ readonly postDispatch?: FluxPluginMethodType;
40
+ }
41
+ export interface FluxPluginType {
42
+ readonly name: string;
43
+ readonly method: FluxPluginMethodType;
44
+ }
45
+ export interface ErrorConstructor {
46
+ captureStackTrace(thisArg: any, func: any): void;
47
+ }
@@ -0,0 +1,16 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __copyProps = (to, from, except, desc) => {
6
+ if (from && typeof from === "object" || typeof from === "function") {
7
+ for (let key of __getOwnPropNames(from))
8
+ if (!__hasOwnProp.call(to, key) && key !== except)
9
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
10
+ }
11
+ return to;
12
+ };
13
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
14
+ var Flux_types_exports = {};
15
+ module.exports = __toCommonJS(Flux_types_exports);
16
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50eXBlcy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eE9wdGlvbnMge1xuICByZWFkb25seSBiYXNlbmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29udGV4dD86IG9iamVjdDtcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBnZXRVc2VyQ29uZmlybWF0aW9uPzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgaGFzaFR5cGU/OiAnc2xhc2gnIHwgJ25vc2xhc2gnIHwgJ2hhc2hiYW5nJztcbiAgcmVhZG9ubHkgaGlzdG9yeT86IG9iamVjdDtcbiAgcmVhZG9ubHkgaW5pdGlhbEVudHJpZXM/OiBhbnlbXTtcbiAgcmVhZG9ubHkgaW5pdGlhbEluZGV4PzogbnVtYmVyO1xuICByZWFkb25seSBrZXlMZW5ndGg/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGxvY2F0aW9uPzogc3RyaW5nIHwgb2JqZWN0O1xuICByZWFkb25seSBtaWRkbGV3YXJlPzogRmx1eE1pZGRsZXdhcmVUeXBlW107XG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdXRlclR5cGU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjcm9sbFRvVG9wPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc3RhdGU/OiBhbnk7XG4gIHJlYWRvbmx5IHN0b3JhZ2U/OiBGbHV4U3RvcmFnZVR5cGU7XG4gIHJlYWRvbmx5IHN0b3JhZ2VXYWl0PzogbnVtYmVyO1xuICByZWFkb25seSBzdG9yZXM/OiBhbnlbXTtcbiAgcmVhZG9ubHkgdGl0bGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eEFjdGlvbiB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IGFueTtcbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZsdXhTdG9yYWdlVHlwZSB7XG4gIHJlYWRvbmx5IGdldFN0b3JhZ2VEYXRhOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgcmVhZG9ubHkgc2V0U3RvcmFnZURhdGE6IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHV4U3RvcmUge1xuICByZWFkb25seSBhY3Rpb246ICh0eXBlOiBzdHJpbmcsIGRhdGE6IGFueSwgc3RhdGU6IGFueSkgPT4gYW55O1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogYW55O1xufVxuXG5leHBvcnQgdHlwZSBGbHV4UGx1Z2luTWV0aG9kVHlwZSA9IChhY3Rpb246IEZsdXhBY3Rpb24sIHN0b3JlOiBvYmplY3QsIGFwcERhdGE/OiBvYmplY3QpID0+IFByb21pc2U8Rmx1eEFjdGlvbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmx1eE1pZGRsZXdhcmVUeXBlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwcmVEaXNwYXRjaD86IEZsdXhQbHVnaW5NZXRob2RUeXBlO1xuICByZWFkb25seSBwb3N0RGlzcGF0Y2g/OiBGbHV4UGx1Z2luTWV0aG9kVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGbHV4UGx1Z2luVHlwZSB7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWV0aG9kOiBGbHV4UGx1Z2luTWV0aG9kVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFcnJvckNvbnN0cnVjdG9yIHtcbiAgY2FwdHVyZVN0YWNrVHJhY2UodGhpc0FyZzogYW55LCBmdW5jOiBhbnkpOiB2b2lkXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,8 @@
1
+ export declare class ArkhamConstants {
2
+ static readonly GO_BACK: string;
3
+ static readonly GO_REPLACE: string;
4
+ static readonly GOTO: string;
5
+ static readonly INIT: string;
6
+ static readonly UPDATE_TITLE: string;
7
+ static readonly UPDATE_VIEW: string;
8
+ }
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var ArkhamConstants_exports = {};
19
+ __export(ArkhamConstants_exports, {
20
+ ArkhamConstants: () => ArkhamConstants
21
+ });
22
+ module.exports = __toCommonJS(ArkhamConstants_exports);
23
+ class ArkhamConstants {
24
+ }
25
+ ArkhamConstants.GO_BACK = "ARKHAM_GO_BACK";
26
+ ArkhamConstants.GO_REPLACE = "ARKHAM_GO_REPLACE";
27
+ ArkhamConstants.GOTO = "ARKHAM_GOTO";
28
+ ArkhamConstants.INIT = "ARKHAM_INIT";
29
+ ArkhamConstants.UPDATE_TITLE = "ARKHAM_UPDATE_TITLE";
30
+ ArkhamConstants.UPDATE_VIEW = "ARKHAM_UPDATE_VIEW";
31
+ // Annotate the CommonJS export names for ESM import in node:
32
+ 0 && (module.exports = {
33
+ ArkhamConstants
34
+ });
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmV4cG9ydCBjbGFzcyBBcmtoYW1Db25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgR09fQkFDSzogc3RyaW5nID0gJ0FSS0hBTV9HT19CQUNLJztcbiAgc3RhdGljIHJlYWRvbmx5IEdPX1JFUExBQ0U6IHN0cmluZyA9ICdBUktIQU1fR09fUkVQTEFDRSc7XG4gIHN0YXRpYyByZWFkb25seSBHT1RPOiBzdHJpbmcgPSAnQVJLSEFNX0dPVE8nO1xuICBzdGF0aWMgcmVhZG9ubHkgSU5JVDogc3RyaW5nID0gJ0FSS0hBTV9JTklUJztcbiAgc3RhdGljIHJlYWRvbmx5IFVQREFURV9USVRMRTogc3RyaW5nID0gJ0FSS0hBTV9VUERBVEVfVElUTEUnO1xuICBzdGF0aWMgcmVhZG9ubHkgVVBEQVRFX1ZJRVc6IHN0cmluZyA9ICdBUktIQU1fVVBEQVRFX1ZJRVcnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS08sTUFBTSxnQkFBZ0I7QUFPN0I7QUFQYSxnQkFDSyxVQUFrQjtBQUR2QixnQkFFSyxhQUFxQjtBQUYxQixnQkFHSyxPQUFlO0FBSHBCLGdCQUlLLE9BQWU7QUFKcEIsZ0JBS0ssZUFBdUI7QUFMNUIsZ0JBTUssY0FBc0I7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/lib/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import { ArkhamConstants } from './constants/ArkhamConstants';
2
+ import { Flux, FluxFramework } from './Flux/Flux';
3
+ export * from './Flux/Flux.types';
4
+ export { ArkhamConstants, Flux, FluxFramework };
package/lib/index.js ADDED
@@ -0,0 +1,35 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var src_exports = {};
20
+ __export(src_exports, {
21
+ ArkhamConstants: () => import_ArkhamConstants.ArkhamConstants,
22
+ Flux: () => import_Flux.Flux,
23
+ FluxFramework: () => import_Flux.FluxFramework
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+ var import_ArkhamConstants = require("./constants/ArkhamConstants");
27
+ var import_Flux = require("./Flux/Flux");
28
+ __reExport(src_exports, require("./Flux/Flux.types"), module.exports);
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ ArkhamConstants,
32
+ Flux,
33
+ FluxFramework
34
+ });
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL0Fya2hhbUNvbnN0YW50cyc7XG5pbXBvcnQge0ZsdXgsIEZsdXhGcmFtZXdvcmt9IGZyb20gJy4vRmx1eC9GbHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9GbHV4L0ZsdXgudHlwZXMnO1xuZXhwb3J0IHtBcmtoYW1Db25zdGFudHMsIEZsdXgsIEZsdXhGcmFtZXdvcmt9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSw2QkFBOEI7QUFDOUIsa0JBQWtDO0FBRWxDLHdCQUFjLDhCQVBkOyIsCiAgIm5hbWVzIjogW10KfQo=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nlabs/arkhamjs",
3
- "version": "3.26.0",
3
+ "version": "3.26.2",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -45,18 +45,25 @@
45
45
  "update": "lex update -i"
46
46
  },
47
47
  "dependencies": {
48
- "error-stack-parser": "^2.0.7",
48
+ "error-stack-parser": "^2.1.4",
49
49
  "events": "^3.3.0",
50
50
  "lodash": "^4.17.21"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/events": "^3.0.0",
54
- "@types/jest": "^29.5.0",
55
- "@types/lodash": "^4.14.191",
56
- "@types/node": "^18.15.5",
57
- "eslint": "^8.36.0",
54
+ "@types/jest": "^29.5.1",
55
+ "@types/lodash": "^4.14.194",
56
+ "@types/node": "^20.2.1",
57
+ "eslint": "^8.40.0",
58
58
  "eslint-config-styleguidejs": "^3.2.1",
59
- "typescript": "^5.0.2"
59
+ "typescript": "^5.0.4"
60
60
  },
61
+ "files": [
62
+ "index.js",
63
+ "lib",
64
+ "LICENSE",
65
+ "package.json",
66
+ "README.md"
67
+ ],
61
68
  "gitHead": "fc371e1e28fe0ae35d40d29a217d5f0e990ec32a"
62
69
  }