@nlabs/arkhamjs 3.28.8 → 3.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -16,11 +16,20 @@
16
16
 
17
17
  ArkhamJS is a lightweight framework that can accommodate a project of any size, small or large. From small start-up ideas to large enterprise projects. A simple, flexible framework. Consisting of a singular state tree with a unidirectional data flow.
18
18
 
19
+ ### Universal Compatibility
20
+
21
+ ArkhamJS works seamlessly across all JavaScript environments:
22
+
23
+ - **React Web Applications** - Full React integration with hooks
24
+ - **React Native Applications** - Mobile state management with AsyncStorage
25
+ - **Node.js Applications** - Server-side state management
26
+ - **Vanilla JavaScript** - Works in any JavaScript environment
27
+
19
28
  ### Lightweight
20
29
 
21
30
  The framework is small. The bulk of your app should lay within your code, not the framework. While larger frameworks come with lots of "magic", they become very limited when new features arise within your project.
22
31
 
23
- ### Typescript
32
+ ### TypeScript
24
33
 
25
34
  Compatible with typescript. Definitions are included to support your Typescript project.
26
35
 
@@ -46,6 +55,214 @@ If you plan to persist data, you will need to add a storage to the framework:
46
55
  - React Native [@nlabs/arkhamjs-storage-native](https://github.com/nitrogenlabs/arkhamjs-storage-native)
47
56
  - NodeJS [@nlabs/arkhamjs-storage-node](https://github.com/nitrogenlabs/arkhamjs-storage-node)
48
57
 
58
+ ## Why Choose ArkhamJS?
59
+
60
+ ### 🎯 **The Perfect Middle Ground**
61
+
62
+ ArkhamJS bridges the gap between **simplicity** and **power**. Unlike other state management solutions that force you to choose between ease-of-use and functionality, ArkhamJS delivers both.
63
+
64
+ ### 📊 **Bundle Size Comparison**
65
+
66
+ | Library | Gzipped Size | Minified Size | Notes |
67
+ |---------|-------------|---------------|-------|
68
+ | **ArkhamJS** | **13.4 KB** | **40 KB** | Full-featured Flux implementation |
69
+ | Zustand | ~3.2 KB | ~8.5 KB | Minimal, no provider needed |
70
+ | Jotai | ~4.1 KB | ~11 KB | Atomic model, fine-grained |
71
+ | Redux Toolkit | ~14 KB | ~41 KB | Includes Redux core |
72
+ | MobX | ~7.5 KB | ~23 KB | Core only |
73
+ | Recoil | ~8.5 KB | ~25 KB | Facebook, atomic |
74
+
75
+ **ArkhamJS is competitively sized** while providing a complete Flux implementation with middleware support, devtools, and storage integration.
76
+
77
+ ### 🏗️ **State Management Patterns**
78
+
79
+ | Pattern | ArkhamJS | Redux Toolkit | Zustand | Jotai | Valtio |
80
+ |---------|----------|---------------|---------|-------|--------|
81
+ | **Immutable Updates** | ✅ Full | ✅ Full | ✅ Partial | ✅ Full | ❌ Mutable |
82
+ | **Event-Driven** | ✅ Native | ❌ Actions | ❌ Direct | ❌ Atoms | ❌ Proxy |
83
+ | **Middleware Support** | ✅ Built-in | ✅ Extensive | ⚠️ Limited | ❌ No | ❌ No |
84
+ | **DevTools** | ✅ Plugin | ✅ Built-in | ✅ Basic | ❌ No | ❌ No |
85
+ | **Storage Integration** | ✅ Built-in | ❌ External | ✅ Plugin | ❌ No | ❌ No |
86
+ | **TypeScript** | ✅ First-class | ✅ Excellent | ✅ Good | ✅ Built-in | ✅ Good |
87
+ | **Multi-Platform** | ✅ Universal | ❌ Web-only | ❌ Web-only | ❌ Web-only | ❌ Web-only |
88
+
89
+ ### 🚀 **Key Advantages**
90
+
91
+ #### **1. Event-Driven Architecture**
92
+
93
+ ```typescript
94
+ // ArkhamJS: Natural event-driven updates
95
+ Flux.dispatch({ type: 'ADD_USER', user });
96
+ Flux.on('ADD_USER', (action: { type: string; user: User }) => {
97
+ // Reactive component updates
98
+ });
99
+
100
+ // vs. Redux: Action/reducer pattern
101
+ dispatch(addUser(user));
102
+ // Components must manually subscribe to state changes
103
+ ```
104
+
105
+ **Why it matters:** Event-driven architecture makes your app more reactive and easier to debug. Components can listen to specific events rather than watching the entire state tree.
106
+
107
+ #### **2. Zero Boilerplate**
108
+
109
+ ```typescript
110
+ // ArkhamJS: Simple and direct
111
+ Flux.setState('user.name', 'John');
112
+ const userName: string = Flux.getState('user.name');
113
+
114
+ // vs. Redux Toolkit: More setup required
115
+ const userSlice = createSlice({
116
+ name: 'user',
117
+ initialState: { name: '' },
118
+ reducers: { setName: (state, action) => { state.name = action.payload; } }
119
+ });
120
+ dispatch(setName('John'));
121
+ const userName = useSelector((state: RootState) => state.user.name);
122
+ ```
123
+
124
+ **Why it matters:** Less code means faster development, fewer bugs, and easier maintenance.
125
+
126
+ #### **3. Built-in Middleware System**
127
+
128
+ ```typescript
129
+ // ArkhamJS: Plug-and-play middleware
130
+ Flux.addMiddleware([loggerMiddleware, devToolsMiddleware]);
131
+
132
+ // vs. Other libraries: Manual integration or external packages
133
+ ```
134
+
135
+ **Why it matters:** Middleware provides powerful extensibility for logging, debugging, persistence, and custom functionality without bloating your core bundle.
136
+
137
+ #### **4. Familiar Flux Pattern**
138
+
139
+ ```typescript
140
+ // ArkhamJS: Familiar Flux architecture with TypeScript
141
+ interface UserState {
142
+ users: User[];
143
+ }
144
+
145
+ const UserStore = {
146
+ name: 'user',
147
+ action: (type: string, data: any, state: UserState): UserState => {
148
+ switch (type) {
149
+ case 'ADD_USER':
150
+ return { ...state, users: [...state.users, data] };
151
+ default:
152
+ return state;
153
+ }
154
+ }
155
+ };
156
+ ```
157
+
158
+ **Why it matters:** Teams familiar with Redux/Flux can adopt ArkhamJS immediately without learning new patterns.
159
+
160
+ #### **5. Optimized Performance**
161
+
162
+ - **Tree-shaking enabled** for minimal bundle size
163
+ - **Selective re-renders** with state path subscriptions
164
+ - **Immutable updates** prevent unnecessary re-renders
165
+ - **Event-driven updates** only trigger relevant components
166
+
167
+ **Why it matters:** Better performance means faster apps and better user experience.
168
+
169
+ ### 🎯 **When to Choose ArkhamJS**
170
+
171
+ #### **✅ Perfect for:**
172
+
173
+ - **Teams familiar with Flux/Redux** - Same patterns, simpler API
174
+ - **Applications needing event-driven architecture** - Built-in pub/sub
175
+ - **Projects requiring middleware** - Logging, devtools, persistence
176
+ - **Teams wanting TypeScript support** - First-class TypeScript
177
+ - **Applications with complex state interactions** - Centralized state management
178
+ - **Projects needing storage integration** - Built-in browser/Node/native support
179
+ - **Multi-platform applications** - Same code across React, React Native, Node.js
180
+
181
+ #### **❌ Consider alternatives for:**
182
+
183
+ - **Applications needing atomic state** - Consider Jotai/Recoil
184
+ - **Teams wanting mutable state** - Consider Valtio
185
+ - **Applications requiring state machines** - Consider XState
186
+ - **Projects needing minimal bundle size** - Consider Zustand
187
+
188
+ ### 🔧 **Migration Benefits**
189
+
190
+ #### **From Redux:**
191
+
192
+ - **70% less boilerplate** code
193
+ - **Same familiar patterns** (actions, stores, middleware)
194
+ - **Better performance** with event-driven updates
195
+ - **Smaller bundle size** (13.4KB vs 14KB for Redux Toolkit)
196
+
197
+ #### **From Zustand:**
198
+
199
+ - **Built-in middleware support** (logging, devtools, persistence)
200
+ - **Event-driven architecture** for better reactivity
201
+ - **Familiar Flux patterns** for team consistency
202
+ - **Storage integration** out of the box
203
+
204
+ #### **From Context API:**
205
+
206
+ - **Better performance** with selective updates
207
+ - **Middleware support** for debugging and persistence
208
+ - **Predictable state management** with immutable updates
209
+ - **Event-driven architecture** for complex interactions
210
+
211
+ ### 📈 **Performance Comparison**
212
+
213
+ | Metric | ArkhamJS | Redux Toolkit | Zustand | Jotai |
214
+ |--------|----------|---------------|---------|-------|
215
+ | **Bundle Size** | 13.4 KB | 14 KB | 3.2 KB | 4.1 KB |
216
+ | **Setup Complexity** | Low | Medium | Very Low | Low |
217
+ | **Learning Curve** | Low | Medium | Very Low | Medium |
218
+ | **Middleware Support** | Excellent | Excellent | Limited | None |
219
+ | **Event-Driven** | Native | Manual | Manual | Manual |
220
+ | **TypeScript Support** | Excellent | Excellent | Good | Excellent |
221
+ | **Multi-Platform** | Universal | Web-only | Web-only | Web-only |
222
+
223
+ ### 🎉 **Getting Started**
224
+
225
+ ```typescript
226
+ import { Flux } from '@nlabs/arkhamjs';
227
+
228
+ // Type-safe store definition
229
+ interface UserState {
230
+ users: User[];
231
+ }
232
+
233
+ const UserStore = {
234
+ name: 'user',
235
+ action: (type: string, data: any, state: UserState): UserState => {
236
+ switch (type) {
237
+ case 'ADD_USER':
238
+ return { ...state, users: [...state.users, data] };
239
+ default:
240
+ return state;
241
+ }
242
+ }
243
+ };
244
+
245
+ // Simple setup
246
+ Flux.init({
247
+ name: 'my-app',
248
+ stores: [UserStore],
249
+ middleware: [loggerMiddleware]
250
+ });
251
+
252
+ // Dispatch actions
253
+ Flux.dispatch({ type: 'ADD_USER', user: { name: 'John' } });
254
+
255
+ // Listen to events
256
+ Flux.on('ADD_USER', (action: { type: string; user: User }) => {
257
+ console.log('User added:', action.user);
258
+ });
259
+
260
+ // Get state
261
+ const userName: string = Flux.getState('user.name');
262
+ ```
263
+
264
+ **Start building with ArkhamJS today and experience the perfect balance of simplicity and power!** 🚀
265
+
49
266
  ## Installation
50
267
 
51
268
  Using [npm](https://www.npmjs.com/):
@@ -3,12 +3,15 @@ import { FluxAction, FluxMiddlewareType, FluxOptions, FluxStore } from './Flux.t
3
3
  export declare class FluxFramework extends EventEmitter {
4
4
  static initFlux: boolean;
5
5
  isInit: boolean;
6
- pluginTypes: string[];
6
+ readonly pluginTypes: readonly string[];
7
7
  private state;
8
8
  private storeActions;
9
- private defaultOptions;
9
+ private readonly defaultOptions;
10
10
  private middleware;
11
11
  private options;
12
+ private stateCache;
13
+ private updateStorage;
14
+ private stateChanged;
12
15
  constructor();
13
16
  addMiddleware(middleware: FluxMiddlewareType[]): void;
14
17
  clearAppData(): Promise<boolean>;
@@ -17,21 +20,23 @@ export declare class FluxFramework extends EventEmitter {
17
20
  dispatch(action: FluxAction, silent?: boolean): Promise<FluxAction>;
18
21
  getOptions(): FluxOptions;
19
22
  getState(path?: string | string[], defaultValue?: any): any;
20
- getStore(name?: string): FluxStore;
23
+ getStore(name?: string): FluxStore | undefined;
21
24
  init(options?: FluxOptions, reset?: boolean): Promise<FluxFramework>;
22
25
  onInit(listener: (...args: any[]) => void): void;
23
26
  offInit(listener: (...args: any[]) => void): void;
24
27
  off(eventType: string, listener: (...args: any[]) => void): this;
25
28
  on(eventType: string, listener: (...args: any[]) => void): this;
26
- addStores(stores: any[]): Promise<object[]>;
29
+ addStores(stores: FluxStore[]): Promise<FluxStore[]>;
27
30
  removeMiddleware(names: string[]): void;
28
31
  reset(clearStorage?: boolean): Promise<void>;
29
32
  setState(path: string | string[], value: any): Promise<boolean>;
33
+ private processMiddleware;
34
+ private updateStoresState;
35
+ private getCachedStack;
30
36
  private addPlugin;
31
37
  private deregister;
32
38
  private register;
33
39
  private removePlugin;
34
- private updateStorage;
35
40
  private useStorage;
36
41
  }
37
42
  export declare const Flux: FluxFramework;
package/lib/Flux/Flux.js CHANGED
@@ -1,486 +1,5 @@
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
- static {
91
- this.initFlux = false;
92
- }
93
- /**
94
- * Add middleware to framework.
95
- *
96
- * @param {array} middleware An array of middleware to add to the framework.
97
- */
98
- addMiddleware(middleware) {
99
- middleware.forEach((middleObj) => {
100
- if (!!middleObj && (typeof middleObj === "function" || typeof middleObj === "object")) {
101
- const middleName = middleObj.name || "";
102
- if (!middleName) {
103
- throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");
104
- }
105
- this.pluginTypes.forEach((type) => {
106
- const method = middleObj[type];
107
- const plugin = { method, name: middleName };
108
- this.middleware[`${type}List`] = this.addPlugin(type, plugin);
109
- });
110
- } else {
111
- throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");
112
- }
113
- });
114
- }
115
- /**
116
- * Remove all app data from storage.
117
- *
118
- * @returns {Promise<boolean>} Whether app data was successfully removed.
119
- */
120
- clearAppData() {
121
- Object.keys(this.storeActions).forEach((storeName) => {
122
- const storeFn = this.storeActions[storeName];
123
- this.state[storeFn.name] = (0, import_cloneDeep.default)(storeFn.initialState);
124
- });
125
- const { name, storage } = this.options;
126
- if (storage?.setStorageData) {
127
- return storage.setStorageData(name, this.state);
128
- }
129
- return Promise.resolve(true);
130
- }
131
- /**
132
- * Remove all middleware.
133
- *
134
- * @returns {boolean} Whether middleware was successfully removed.
135
- */
136
- clearMiddleware() {
137
- Object.keys(this.middleware).forEach((pluginType) => {
138
- this.middleware[pluginType] = [];
139
- });
140
- return true;
141
- }
142
- /**
143
- * De-registers named stores.
144
- *
145
- * @param {array} storeNames An array of store names to remove from the framework.
146
- */
147
- removeStores(storeNames) {
148
- storeNames.forEach((name) => this.deregister(name));
149
- }
150
- /**
151
- * Dispatches an action to all stores.
152
- *
153
- * @param {object} action to dispatch to all the stores.
154
- * @param {boolean} silent To silence any events.
155
- * @returns {Promise} The promise is resolved when and if the app saves data to storage, returning
156
- * the action.
157
- */
158
- async dispatch(action, silent = false) {
159
- if (!action) {
160
- throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");
161
- }
162
- let clonedAction = (0, import_cloneDeep.default)(action);
163
- const startTime = Date.now();
164
- let stack = [];
165
- try {
166
- const stackProperty = "stackTraceLimit";
167
- const { stackTraceLimit } = Error;
168
- Error[stackProperty] = Infinity;
169
- stack = import_error_stack_parser.default.parse(new Error());
170
- Error[stackProperty] = stackTraceLimit;
171
- } catch (error) {
172
- }
173
- const options = (0, import_cloneDeep.default)(this.options);
174
- const appInfo = { duration: 0, options, stack };
175
- const { postDispatchList = [], preDispatchList = [] } = this.middleware;
176
- if (preDispatchList.length) {
177
- clonedAction = await Promise.all(
178
- preDispatchList.map(
179
- (plugin) => plugin.method(
180
- (0, import_cloneDeep.default)(clonedAction),
181
- (0, import_cloneDeep.default)(this.state),
182
- appInfo
183
- )
184
- )
185
- ).then(
186
- (actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)
187
- ).catch((error) => {
188
- throw error;
189
- });
190
- }
191
- const { type, ...data } = clonedAction;
192
- if (!type || type === "") {
193
- console.warn("ArkhamJS Warning: Flux.dispatch is missing an action type for the payload:", data);
194
- return Promise.resolve(clonedAction);
195
- }
196
- Object.keys(this.storeActions).forEach((storeName) => {
197
- const storeFn = this.storeActions[storeName];
198
- const state = (0, import_cloneDeep.default)(this.state[storeName]) || (0, import_cloneDeep.default)(storeFn.initialState) || {};
199
- this.state[storeName] = (0, import_cloneDeep.default)(storeFn.action(type, data, state)) || state;
200
- });
201
- const { storage } = this.options;
202
- if (storage && this.updateStorage) {
203
- try {
204
- await this.updateStorage();
205
- } catch (error) {
206
- }
207
- }
208
- const endTime = +/* @__PURE__ */ new Date();
209
- const duration = endTime - startTime;
210
- appInfo.duration = duration;
211
- if (postDispatchList.length) {
212
- clonedAction = await Promise.all(
213
- postDispatchList.map(
214
- async (plugin) => plugin.method((0, import_cloneDeep.default)(clonedAction), (0, import_cloneDeep.default)(this.state), appInfo)
215
- )
216
- ).then(
217
- (actions) => actions.reduce((updatedAction, action2) => (0, import_merge.default)(updatedAction, action2), clonedAction)
218
- ).catch((error) => {
219
- throw error;
220
- });
221
- }
222
- if (!silent) {
223
- this.emit(type, clonedAction);
224
- this.emit("arkhamjs", this.state);
225
- }
226
- return Promise.resolve(clonedAction);
227
- }
228
- /**
229
- * Get the current Flux options.
230
- *
231
- * @returns {FluxOptions} the Flux options object.
232
- */
233
- getOptions() {
234
- return this.options;
235
- }
236
- /**
237
- * Get the current state object.
238
- *
239
- * @param {string|array} [name] (optional) The name of the store for an object, otherwise it will return all store
240
- * objects. You can also use an array to specify a property path within the object.
241
- * @param {any} [defaultValue] (optional) A default value to return if null.
242
- * @returns {any} the state object or a property value within.
243
- */
244
- getState(path = "", defaultValue) {
245
- let storeValue;
246
- if (!path) {
247
- storeValue = this.state || {};
248
- } else {
249
- storeValue = (0, import_get.default)(path, this.state);
250
- }
251
- const value = storeValue ? (0, import_cloneDeep.default)(storeValue) : storeValue;
252
- return value === void 0 ? defaultValue : value;
253
- }
254
- /**
255
- * Get a store object registered with Flux.
256
- *
257
- * @param {string} name The name of the store.
258
- * @returns {FluxStore} the store object.
259
- */
260
- getStore(name = "") {
261
- return this.storeActions[name];
262
- }
263
- /**
264
- * Initialize and set configuration options.
265
- *
266
- * @param {object} options Configuration options.
267
- */
268
- async init(options = {}, reset = false) {
269
- if (reset) {
270
- this.isInit = false;
271
- this.reset(false);
272
- }
273
- const updatedOptions = { ...options };
274
- if (this.isInit) {
275
- updatedOptions.name = this.options.name;
276
- }
277
- this.options = { ...this.defaultOptions, ...updatedOptions };
278
- const { debug, middleware, name, stores } = this.options;
279
- try {
280
- await this.useStorage(name);
281
- } catch (error) {
282
- console.error("Arkham Error: There was an error while using storage.", name);
283
- throw error;
284
- }
285
- if (!!stores && stores.length) {
286
- try {
287
- await this.addStores(stores);
288
- } catch (error) {
289
- console.error("Arkham Error: There was an error while adding stores.", stores);
290
- throw error;
291
- }
292
- }
293
- if (!!middleware && middleware.length) {
294
- this.addMiddleware(middleware);
295
- }
296
- const windowProperty = "arkhamjs";
297
- if (debug) {
298
- window[windowProperty] = this;
299
- } else {
300
- delete window[windowProperty];
301
- }
302
- this.isInit = true;
303
- this.emit(import_ArkhamConstants.ArkhamConstants.INIT);
304
- return this;
305
- }
306
- /**
307
- * Adds an initialization listener.
308
- *
309
- * @param {function} [listener] The callback associated with the subscribed event.
310
- */
311
- onInit(listener) {
312
- this.on(import_ArkhamConstants.ArkhamConstants.INIT, listener);
313
- if (this.isInit) {
314
- listener();
315
- }
316
- }
317
- /**
318
- * Removes the initialization listener.
319
- *
320
- * @param {function} [listener] The callback associated with the subscribed event.
321
- */
322
- offInit(listener) {
323
- this.off(import_ArkhamConstants.ArkhamConstants.INIT, listener);
324
- }
325
- /**
326
- * Removes an event listener.
327
- *
328
- * @param {string} [eventType] Event to unsubscribe.
329
- * @param {function} [listener] The callback associated with the subscribed event.
330
- */
331
- off(eventType, listener) {
332
- return this.removeListener(eventType, listener);
333
- }
334
- /**
335
- * Adds an event listener.
336
- *
337
- * @param {string} [eventType] Event to subscribe.
338
- * @param {function} [listener] The callback associated with the subscribed event.
339
- */
340
- on(eventType, listener) {
341
- return this.addListener(eventType, listener);
342
- }
343
- /**
344
- * Registers new Stores.
345
- *
346
- * @param {array} stores Store class.
347
- * @returns {Promise<object[]>} the class object(s).
348
- */
349
- async addStores(stores) {
350
- const registeredStores = stores.map((store) => this.register(store));
351
- const { name, storage } = this.options;
352
- if (storage?.setStorageData) {
353
- try {
354
- await storage.setStorageData(name, this.state);
355
- } catch (error) {
356
- throw error;
357
- }
358
- }
359
- return registeredStores;
360
- }
361
- /**
362
- * Remove middleware from framework.
363
- *
364
- * @param {array} string middleware names to remove.
365
- * @returns {Promise<object[]>} the class object(s).
366
- */
367
- removeMiddleware(names) {
368
- names.forEach((name) => {
369
- this.pluginTypes.forEach((type) => {
370
- this.middleware[`${type}List`] = this.removePlugin(type, name);
371
- });
372
- });
373
- }
374
- /**
375
- * Reset framework.
376
- *
377
- * @param {array} string middleware names to remove.
378
- * @returns {Promise<object[]>} the class object(s).
379
- */
380
- async reset(clearStorage = true) {
381
- const { name, storage } = this.options;
382
- if (storage && clearStorage) {
383
- try {
384
- await storage.setStorageData(name, {});
385
- } catch (error) {
386
- throw error;
387
- }
388
- }
389
- this.middleware = {};
390
- this.options = { ...this.defaultOptions };
391
- this.state = {};
392
- this.storeActions = {};
393
- this.isInit = false;
394
- }
395
- /**
396
- * Sets the current state object.
397
- *
398
- * @param {string|array} [name] The name of the store to set. You can also use an array to specify a property path
399
- * within the object.
400
- * @param {any} [value] The value to set.
401
- */
402
- setState(path = "", value) {
403
- if (!!path) {
404
- this.state = (0, import_set.default)(path, (0, import_cloneDeep.default)(value), this.state);
405
- }
406
- const { storage } = this.options;
407
- if (storage && this.updateStorage) {
408
- return this.updateStorage();
409
- }
410
- return Promise.resolve(false);
411
- }
412
- addPlugin(type, plugin) {
413
- const list = this.middleware[`${type}List`] || [];
414
- const { method, name } = plugin;
415
- if (method && typeof method === "function") {
416
- const exists = !!list.filter((obj) => obj.name === name).length;
417
- if (!exists) {
418
- list.push({ method, name });
419
- }
420
- } else if (method !== void 0) {
421
- throw Error(`${plugin.name} middleware is not configured properly. Method is not a function.`);
422
- }
423
- return list;
424
- }
425
- deregister(name = "") {
426
- delete this.storeActions[name];
427
- delete this.state[name];
428
- }
429
- register(storeFn) {
430
- if (!storeFn) {
431
- throw Error("Store is undefined. Cannot register with Flux.");
432
- }
433
- const isFnc = typeof storeFn === "function";
434
- if (!isFnc) {
435
- throw Error(`${storeFn} is not a store function. Cannot register with Flux.`);
436
- }
437
- const { name } = storeFn;
438
- const initialState = storeFn();
439
- const storeAction = {
440
- action: storeFn,
441
- initialState: storeFn(),
442
- name
443
- };
444
- if (!(0, import_isEmpty.default)(name) && !this.storeActions[name]) {
445
- this.storeActions[name] = storeAction;
446
- if (!this.state[name]) {
447
- if (initialState) {
448
- this.state[name] = (0, import_cloneDeep.default)(initialState);
449
- } else {
450
- this.state[name] = {};
451
- }
452
- }
453
- }
454
- return this.storeActions[name];
455
- }
456
- removePlugin(type, name) {
457
- const list = this.middleware[`${type}List`] || [];
458
- return list.filter((obj) => obj.name !== name);
459
- }
460
- async useStorage(name) {
461
- const { storage, state, storageWait } = this.options;
462
- if (storage) {
463
- try {
464
- this.state = state || await storage.getStorageData(name) || {};
465
- this.updateStorage = (0, import_debounce.default)(
466
- () => storage.setStorageData(name, this.state),
467
- storageWait,
468
- { leading: true, trailing: true }
469
- );
470
- } catch (error) {
471
- console.error(`ArkhamJS Error: Using storage, "${name}".`);
472
- throw error;
473
- }
474
- } else {
475
- this.state = state || {};
476
- }
477
- return null;
478
- }
479
- }
480
- const Flux = new FluxFramework();
481
- // Annotate the CommonJS export names for ESM import in node:
482
- 0 && (module.exports = {
483
- Flux,
484
- FluxFramework
485
- });
486
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBFcnJvclN0YWNrUGFyc2VyIGZyb20gJ2Vycm9yLXN0YWNrLXBhcnNlcic7XG5pbXBvcnQge0V2ZW50RW1pdHRlcn0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdsb2Rhc2gvZGVib3VuY2UnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvZnAvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2ZwL2dldCc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvZnAvaXNFbXB0eSc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoL2ZwL21lcmdlJztcbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoL2ZwL3NldCc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuLyoqXG4gKiBGbHV4RnJhbWV3b3JrXG4gKiBAdHlwZSB7RXZlbnRFbWl0dGVyfVxuICovXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gUHVibGljIHByb3BlcnRpZXNcbiAgcGx1Z2luVHlwZXM6IHN0cmluZ1tdID0gWydwcmVEaXNwYXRjaCcsICdwb3N0RGlzcGF0Y2gnXTtcbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzXG4gIHByaXZhdGUgc3RhdGU6IGFueSA9IHt9O1xuICBwcml2YXRlIHN0b3JlQWN0aW9uczogYW55ID0ge307XG4gIHByaXZhdGUgZGVmYXVsdE9wdGlvbnM6IEZsdXhPcHRpb25zID0ge1xuICAgIG5hbWU6ICdhcmtoYW1qcycsXG4gICAgcm91dGVyVHlwZTogJ2Jyb3dzZXInLFxuICAgIHNjcm9sbFRvVG9wOiB0cnVlLFxuICAgIHN0YXRlOiBudWxsLFxuICAgIHN0b3JhZ2U6IG51bGwsXG4gICAgc3RvcmFnZVdhaXQ6IDMwMCxcbiAgICBzdG9yZXM6IFtdLFxuICAgIHRpdGxlOiAnQXJraGFtSlMnXG4gIH07XG4gIHByaXZhdGUgbWlkZGxld2FyZTogYW55ID0ge307XG4gIHByaXZhdGUgb3B0aW9uczogRmx1eE9wdGlvbnMgPSB0aGlzLmRlZmF1bHRPcHRpb25zO1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEZsdXguICBOb3RlIHRoYXQgdGhlIEZsdXggb2JqZWN0XG4gICAqIGlzIGEgU2luZ2xldG9uIHBhdHRlcm4sIHNvIG9ubHkgb25lIHNob3VsZCBldmVyIGV4aXN0LlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHRoaXMge0ZsdXhGcmFtZXdvcmt9XG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuYWRkTWlkZGxld2FyZSA9IHRoaXMuYWRkTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuYWRkU3RvcmVzID0gdGhpcy5hZGRTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyQXBwRGF0YSA9IHRoaXMuY2xlYXJBcHBEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5jbGVhck1pZGRsZXdhcmUgPSB0aGlzLmNsZWFyTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGVyZWdpc3RlciA9IHRoaXMuZGVyZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZGlzcGF0Y2ggPSB0aGlzLmRpc3BhdGNoLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRPcHRpb25zID0gdGhpcy5nZXRPcHRpb25zLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRTdGF0ZSA9IHRoaXMuZ2V0U3RhdGUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0b3JlID0gdGhpcy5nZXRTdG9yZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuaW5pdCA9IHRoaXMuaW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMub2ZmID0gdGhpcy5vZmYuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlZ2lzdGVyID0gdGhpcy5yZWdpc3Rlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlTWlkZGxld2FyZSA9IHRoaXMucmVtb3ZlTWlkZGxld2FyZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVtb3ZlU3RvcmVzID0gdGhpcy5yZW1vdmVTdG9yZXMuYmluZCh0aGlzKTtcbiAgICB0aGlzLnJlc2V0ID0gdGhpcy5yZXNldC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuc2V0U3RhdGUgPSB0aGlzLnNldFN0YXRlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBBZGQgbWlkZGxld2FyZSBwbHVnaW4gdHlwZXNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBtaWRkbGV3YXJlIHRvIGZyYW1ld29yay5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbWlkZGxld2FyZSBBbiBhcnJheSBvZiBtaWRkbGV3YXJlIHRvIGFkZCB0byB0aGUgZnJhbWV3b3JrLlxuICAgKi9cbiAgYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlOiBGbHV4TWlkZGxld2FyZVR5cGVbXSk6IHZvaWQge1xuICAgIG1pZGRsZXdhcmUuZm9yRWFjaCgobWlkZGxlT2JqOiBGbHV4TWlkZGxld2FyZVR5cGUpID0+IHtcbiAgICAgIC8vIE1ha2Ugc3VyZSBtaWRkbGV3YXJlIGlzIGVpdGhlciBhIGNsYXNzIG9yIG9iamVjdC5cbiAgICAgIGlmKCEhbWlkZGxlT2JqICYmICgodHlwZW9mIG1pZGRsZU9iaiA9PT0gJ2Z1bmN0aW9uJykgfHwgKHR5cGVvZiBtaWRkbGVPYmogPT09ICdvYmplY3QnKSkpIHtcbiAgICAgICAgY29uc3QgbWlkZGxlTmFtZTogc3RyaW5nID0gbWlkZGxlT2JqLm5hbWUgfHwgJyc7XG5cbiAgICAgICAgaWYoIW1pZGRsZU5hbWUpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3J0IG1pZGRsZXdhcmUgcGx1Z2lucyBmb3IgZWZmaWNpZW5jeVxuICAgICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgICBjb25zdCBwbHVnaW46IEZsdXhQbHVnaW5UeXBlID0ge21ldGhvZCwgbmFtZTogbWlkZGxlTmFtZX07XG4gICAgICAgICAgdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gdGhpcy5hZGRQbHVnaW4odHlwZSwgcGx1Z2luKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBhcHAgZGF0YSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGFwcCBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIGNsZWFyQXBwRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTZXQgYWxsIHN0b3JlIGRhdGEgdG8gaW5pdGlhbCBzdGF0ZVxuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIHRoaXMuc3RhdGVbc3RvcmVGbi5uYW1lXSA9IGNsb25lRGVlcChzdG9yZUZuLmluaXRpYWxTdGF0ZSk7XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHtuYW1lLCBzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2U/LnNldFN0b3JhZ2VEYXRhKSB7XG4gICAgICByZXR1cm4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgbWlkZGxld2FyZS5cbiAgICpcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgbWlkZGxld2FyZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAqL1xuICBjbGVhck1pZGRsZXdhcmUoKTogYm9vbGVhbiB7XG4gICAgLy8gU2V0IGFsbCBzdG9yZSBkYXRhIHRvIGluaXRpYWwgc3RhdGVcbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKHRoaXMubWlkZGxld2FyZSlcbiAgICAgIC5mb3JFYWNoKChwbHVnaW5UeXBlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5taWRkbGV3YXJlW3BsdWdpblR5cGVdID0gW107XG4gICAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlLXJlZ2lzdGVycyBuYW1lZCBzdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0b3JlTmFtZXMgQW4gYXJyYXkgb2Ygc3RvcmUgbmFtZXMgdG8gcmVtb3ZlIGZyb20gdGhlIGZyYW1ld29yay5cbiAgICovXG4gIHJlbW92ZVN0b3JlcyhzdG9yZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHN0b3JlTmFtZXMuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB0aGlzLmRlcmVnaXN0ZXIobmFtZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYW4gYWN0aW9uIHRvIGFsbCBzdG9yZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhY3Rpb24gdG8gZGlzcGF0Y2ggdG8gYWxsIHRoZSBzdG9yZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lsZW50IFRvIHNpbGVuY2UgYW55IGV2ZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHJlc29sdmVkIHdoZW4gYW5kIGlmIHRoZSBhcHAgc2F2ZXMgZGF0YSB0byBzdG9yYWdlLCByZXR1cm5pbmdcbiAgICogdGhlIGFjdGlvbi5cbiAgICovXG4gIGFzeW5jIGRpc3BhdGNoKGFjdGlvbjogRmx1eEFjdGlvbiwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhBY3Rpb24+IHtcbiAgICBpZighYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fya2hhbUpTIEVycm9yOiBGbHV4LmRpc3BhdGNoIHJlcXVpcmVzIGFuIGFjdGlvbi4nKTtcbiAgICB9XG5cbiAgICBsZXQgY2xvbmVkQWN0aW9uOiBGbHV4QWN0aW9uID0gY2xvbmVEZWVwKGFjdGlvbik7XG5cbiAgICAvLyBMb2cgZHVyYXRpb24gb2YgZGlzcGF0Y2hcbiAgICBjb25zdCBzdGFydFRpbWU6IG51bWJlciA9IERhdGUubm93KCk7XG5cbiAgICAvLyBHZXQgc3RhY2tcbiAgICBsZXQgc3RhY2sgPSBbXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFja1Byb3BlcnR5OiBzdHJpbmcgPSAnc3RhY2tUcmFjZUxpbWl0JztcbiAgICAgIGNvbnN0IHtzdGFja1RyYWNlTGltaXR9OiBhbnkgPSBFcnJvcjtcbiAgICAgIEVycm9yW3N0YWNrUHJvcGVydHldID0gSW5maW5pdHk7XG4gICAgICBzdGFjayA9IEVycm9yU3RhY2tQYXJzZXIucGFyc2UobmV3IEVycm9yKCkpO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBzdGFja1RyYWNlTGltaXQ7XG4gICAgfSBjYXRjaChlcnJvcikge31cblxuICAgIC8vIEdldCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9ucyA9IGNsb25lRGVlcCh0aGlzLm9wdGlvbnMpO1xuXG4gICAgLy8gQXBwIGluZm9cbiAgICBjb25zdCBhcHBJbmZvID0ge2R1cmF0aW9uOiAwLCBvcHRpb25zLCBzdGFja307XG5cbiAgICAvLyBBcHBseSBtaWRkbGV3YXJlIGJlZm9yZSB0aGUgYWN0aW9uIGlzIHByb2Nlc3NlZFxuICAgIGNvbnN0IHtwb3N0RGlzcGF0Y2hMaXN0ID0gW10sIHByZURpc3BhdGNoTGlzdCA9IFtdfSA9IHRoaXMubWlkZGxld2FyZTtcblxuICAgIGlmKHByZURpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IFByb21pc2VcbiAgICAgICAgLmFsbChcbiAgICAgICAgICBwcmVEaXNwYXRjaExpc3QubWFwKChwbHVnaW46IEZsdXhQbHVnaW5UeXBlKSA9PiBwbHVnaW4ubWV0aG9kKFxuICAgICAgICAgICAgY2xvbmVEZWVwKGNsb25lZEFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBjbG9uZWRBY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHt0eXBlLCAuLi5kYXRhfSA9IGNsb25lZEFjdGlvbjtcblxuICAgIC8vIFJlcXVpcmUgYSB0eXBlXG4gICAgaWYoIXR5cGUgfHwgdHlwZSA9PT0gJycpIHtcbiAgICAgIGNvbnNvbGUud2FybignQXJraGFtSlMgV2FybmluZzogRmx1eC5kaXNwYXRjaCBpcyBtaXNzaW5nIGFuIGFjdGlvbiB0eXBlIGZvciB0aGUgcGF5bG9hZDonLCBkYXRhKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGFuIGFjdGlvbiBjb21lcyBpbiwgaXQgbXVzdCBiZSBjb21wbGV0ZWx5IGhhbmRsZWQgYnkgYWxsIHN0b3Jlc1xuICAgIE9iamVjdFxuICAgICAgLmtleXModGhpcy5zdG9yZUFjdGlvbnMpXG4gICAgICAuZm9yRWFjaCgoc3RvcmVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICAgIGNvbnN0IHN0YXRlID0gY2xvbmVEZWVwKHRoaXMuc3RhdGVbc3RvcmVOYW1lXSkgfHwgY2xvbmVEZWVwKHN0b3JlRm4uaW5pdGlhbFN0YXRlKSB8fCB7fTtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZU5hbWVdID0gY2xvbmVEZWVwKHN0b3JlRm4uYWN0aW9uKHR5cGUsIGRhdGEsIHN0YXRlKSkgfHwgc3RhdGU7XG4gICAgICB9KTtcblxuICAgIC8vIFNhdmUgY2FjaGUgaW4gc3RvcmFnZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UgJiYgdGhpcy51cGRhdGVTdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVN0b3JhZ2UoKTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHt9XG4gICAgfVxuXG4gICAgY29uc3QgZW5kVGltZTogbnVtYmVyID0gKyhuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gZW5kVGltZSAtIHN0YXJ0VGltZTtcbiAgICBhcHBJbmZvLmR1cmF0aW9uID0gZHVyYXRpb247XG5cbiAgICBpZihwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgUHJvbWlzZVxuICAgICAgICAuYWxsKFxuICAgICAgICAgIHBvc3REaXNwYXRjaExpc3QubWFwKFxuICAgICAgICAgICAgYXN5bmMgKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+IHBsdWdpbi5tZXRob2QoY2xvbmVEZWVwKGNsb25lZEFjdGlvbiksIGNsb25lRGVlcCh0aGlzLnN0YXRlKSwgYXBwSW5mbylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgLnRoZW4oXG4gICAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgICBtZXJnZSh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pLCBjbG9uZWRBY3Rpb24pIGFzIEZsdXhBY3Rpb25cbiAgICAgICAgKVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZW1pdCh0eXBlLCBjbG9uZWRBY3Rpb24pO1xuICAgICAgdGhpcy5lbWl0KCdhcmtoYW1qcycsIHRoaXMuc3RhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY2xvbmVkQWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgRmx1eCBvcHRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Rmx1eE9wdGlvbnN9IHRoZSBGbHV4IG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIChvcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlIGZvciBhbiBvYmplY3QsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBhbGwgc3RvcmVcbiAgICogICBvYmplY3RzLiBZb3UgY2FuIGFsc28gdXNlIGFuIGFycmF5IHRvIHNwZWNpZnkgYSBwcm9wZXJ0eSBwYXRoIHdpdGhpbiB0aGUgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2FueX0gW2RlZmF1bHRWYWx1ZV0gKG9wdGlvbmFsKSBBIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIG51bGwuXG4gICAqIEByZXR1cm5zIHthbnl9IHRoZSBzdGF0ZSBvYmplY3Qgb3IgYSBwcm9wZXJ0eSB2YWx1ZSB3aXRoaW4uXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/KTogYW55IHtcbiAgICBsZXQgc3RvcmVWYWx1ZTtcblxuICAgIGlmKCFwYXRoKSB7XG4gICAgICBzdG9yZVZhbHVlID0gdGhpcy5zdGF0ZSB8fCB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RvcmVWYWx1ZSA9IGdldChwYXRoLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlVmFsdWUgPyBjbG9uZURlZXAoc3RvcmVWYWx1ZSkgOiBzdG9yZVZhbHVlO1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RvcmUuXG4gICAqIEByZXR1cm5zIHtGbHV4U3RvcmV9IHRoZSBzdG9yZSBvYmplY3QuXG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIGFzeW5jIGluaXQob3B0aW9uczogRmx1eE9wdGlvbnMgPSB7fSwgcmVzZXQ6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8Rmx1eEZyYW1ld29yaz4ge1xuICAgIC8vIFNob3VsZCByZXNldCBwcmV2aW91cyBwYXJhbXNcbiAgICBpZihyZXNldCkge1xuICAgICAgdGhpcy5pc0luaXQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCBvcHRpb25zXG4gICAgY29uc3QgdXBkYXRlZE9wdGlvbnMgPSB7Li4ub3B0aW9uc307XG5cbiAgICBpZih0aGlzLmlzSW5pdCkge1xuICAgICAgLy8gUmVtb3ZlIHRoZSBuYW1lIGZyb20gb3B0aW9ucyBpZiBhbHJlYWR5IGluaXRpYWxpemVkLCBvdGhlcndpc2UgdGhlIHJvb3QgYXBwIHdpbGwgbm90IGJlIGFibGUgdG8gYWNjZXNzXG4gICAgICAvLyB0aGUgc3RhdGUgdHJlZVxuICAgICAgdXBkYXRlZE9wdGlvbnMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zLCAuLi51cGRhdGVkT3B0aW9uc307XG4gICAgY29uc3Qge2RlYnVnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yZXN9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgLy8gVXBkYXRlIGRlZmF1bHQgc3RvcmVcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy51c2VTdG9yYWdlKG5hbWUpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZighIXN0b3JlcyAmJiBzdG9yZXMubGVuZ3RoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmFkZFN0b3JlcyhzdG9yZXMpO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmKCEhbWlkZGxld2FyZSAmJiBtaWRkbGV3YXJlLmxlbmd0aCkge1xuICAgICAgdGhpcy5hZGRNaWRkbGV3YXJlKG1pZGRsZXdhcmUpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpbmRvd1Byb3BlcnR5OiBzdHJpbmcgPSAnYXJraGFtanMnO1xuXG4gICAgaWYoZGVidWcpIHtcbiAgICAgIHdpbmRvd1t3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgd2luZG93W3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtsaXN0ZW5lcl0gVGhlIGNhbGxiYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Vic2NyaWJlZCBldmVudC5cbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYodGhpcy5pc0luaXQpIHtcbiAgICAgIGxpc3RlbmVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGluaXRpYWxpemF0aW9uIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbbGlzdGVuZXJdIFRoZSBjYWxsYmFjayBhc3NvY2lhdGVkIHdpdGggdGhlIHN1YnNjcmliZWQgZXZlbnQuXG4gICAqL1xuICBvZmZJbml0KGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9mZihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXZlbnRUeXBlXSBFdmVudCB0byB1bnN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb2ZmKGV2ZW50VHlwZTogc3RyaW5nLCBsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtldmVudFR5cGVdIEV2ZW50IHRvIHN1YnNjcmliZS5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2xpc3RlbmVyXSBUaGUgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzY3JpYmVkIGV2ZW50LlxuICAgKi9cbiAgb24oZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgbmV3IFN0b3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gc3RvcmVzIFN0b3JlIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3RbXT59IHRoZSBjbGFzcyBvYmplY3QocykuXG4gICAqL1xuICBhc3luYyBhZGRTdG9yZXMoc3RvcmVzOiBhbnlbXSk6IFByb21pc2U8b2JqZWN0W10+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkU3RvcmVzOiBGbHV4U3RvcmVbXSA9IHN0b3Jlcy5tYXAoKHN0b3JlOiBGbHV4U3RvcmUpID0+IHRoaXMucmVnaXN0ZXIoc3RvcmUpKTtcblxuICAgIC8vIFNhdmUgY2FjaGUgaW4gc2Vzc2lvbiBzdG9yYWdlXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYoc3RvcmFnZT8uc2V0U3RvcmFnZURhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBjbGFzc2VzXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmsuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IHN0cmluZyBtaWRkbGV3YXJlIG5hbWVzIHRvIHJlbW92ZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0W10+fSB0aGUgY2xhc3Mgb2JqZWN0KHMpLlxuICAgKi9cbiAgcmVtb3ZlTWlkZGxld2FyZShuYW1lczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBuYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlbW92ZSBtaWRkbGV3YXJlIHBsdWdpbnNcbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubWlkZGxld2FyZVtgJHt0eXBlfUxpc3RgXSA9IHRoaXMucmVtb3ZlUGx1Z2luKHR5cGUsIG5hbWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgZnJhbWV3b3JrLlxuICAgKlxuICAgKiBAcGFyYW0ge2FycmF5fSBzdHJpbmcgbWlkZGxld2FyZSBuYW1lcyB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdFtdPn0gdGhlIGNsYXNzIG9iamVjdChzKS5cbiAgICovXG4gIGFzeW5jIHJlc2V0KGNsZWFyU3RvcmFnZTogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBDbGVhciBwZXJzaXN0ZW50IGNhY2hlXG4gICAgaWYoc3RvcmFnZSAmJiBjbGVhclN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwge30pO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhciBhbGwgcHJvcGVydGllc1xuICAgIHRoaXMubWlkZGxld2FyZSA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IHsuLi50aGlzLmRlZmF1bHRPcHRpb25zfTtcbiAgICB0aGlzLnN0YXRlID0ge307XG4gICAgdGhpcy5zdG9yZUFjdGlvbnMgPSB7fTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc3RhdGUgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdG9yZSB0byBzZXQuIFlvdSBjYW4gYWxzbyB1c2UgYW4gYXJyYXkgdG8gc3BlY2lmeSBhIHByb3BlcnR5IHBhdGhcbiAgICogd2l0aGluIHRoZSBvYmplY3QuXG4gICAqIEBwYXJhbSB7YW55fSBbdmFsdWVdIFRoZSB2YWx1ZSB0byBzZXQuXG4gICAqL1xuICBzZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCEhcGF0aCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IHNldChwYXRoLCBjbG9uZURlZXAodmFsdWUpLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgcGVyc2lzdGVudCBjYWNoZVxuICAgIGNvbnN0IHtzdG9yYWdlfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGlmKHN0b3JhZ2UgJiYgdGhpcy51cGRhdGVTdG9yYWdlKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFBsdWdpbih0eXBlOiBzdHJpbmcsIHBsdWdpbjogRmx1eFBsdWdpblR5cGUpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuICAgIGNvbnN0IHttZXRob2QsIG5hbWV9ID0gcGx1Z2luO1xuXG4gICAgaWYobWV0aG9kICYmIHR5cGVvZiBtZXRob2QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIENoZWNrIGlmIHBsdWdpbiBhbHJlYWR5IGV4aXN0c1xuICAgICAgY29uc3QgZXhpc3RzOiBib29sZWFuID0gISFsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgPT09IG5hbWUpLmxlbmd0aDtcblxuICAgICAgLy8gRG8gbm90IGFkZCBkdXBsaWNhdGUgcGx1Z2luc1xuICAgICAgaWYoIWV4aXN0cykge1xuICAgICAgICBsaXN0LnB1c2goe21ldGhvZCwgbmFtZX0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihtZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7cGx1Z2luLm5hbWV9IG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIE1ldGhvZCBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGVyZWdpc3RlcihuYW1lOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5zdGF0ZVtuYW1lXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXIoc3RvcmVGbik6IEZsdXhTdG9yZSB7XG4gICAgaWYoIXN0b3JlRm4pIHtcbiAgICAgIHRocm93IEVycm9yKCdTdG9yZSBpcyB1bmRlZmluZWQuIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNGbmM6IGJvb2xlYW4gPSB0eXBlb2Ygc3RvcmVGbiA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIGlmKCFpc0ZuYykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7c3RvcmVGbn0gaXMgbm90IGEgc3RvcmUgZnVuY3Rpb24uIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguYCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHN0b3JlIG9iamVjdFxuICAgIGNvbnN0IHtuYW1lfSA9IHN0b3JlRm47XG4gICAgY29uc3QgaW5pdGlhbFN0YXRlOiBhbnkgPSBzdG9yZUZuKCk7XG4gICAgY29uc3Qgc3RvcmVBY3Rpb24gPSB7XG4gICAgICBhY3Rpb246IHN0b3JlRm4sXG4gICAgICBpbml0aWFsU3RhdGU6IHN0b3JlRm4oKSxcbiAgICAgIG5hbWVcbiAgICB9O1xuXG4gICAgaWYoIWlzRW1wdHkobmFtZSkgJiYgIXRoaXMuc3RvcmVBY3Rpb25zW25hbWVdKSB7XG4gICAgICAvLyBTYXZlIHN0b3JlIG9iamVjdFxuICAgICAgdGhpcy5zdG9yZUFjdGlvbnNbbmFtZV0gPSBzdG9yZUFjdGlvbjtcblxuICAgICAgLy8gR2V0IGRlZmF1bHQgdmFsdWVzXG4gICAgICBpZighdGhpcy5zdGF0ZVtuYW1lXSkge1xuICAgICAgICBpZihpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlW25hbWVdID0gY2xvbmVEZWVwKGluaXRpYWxTdGF0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHN0b3JlIGNsYXNzXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQbHVnaW4odHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuXG4gICAgLy8gcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgcGx1Z2luXG4gICAgcmV0dXJuIGxpc3QuZmlsdGVyKChvYmo6IEZsdXhQbHVnaW5UeXBlKSA9PiBvYmoubmFtZSAhPT0gbmFtZSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVN0b3JhZ2UgPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuXG4gIHByaXZhdGUgYXN5bmMgdXNlU3RvcmFnZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7c3RvcmFnZSwgc3RhdGUsIHN0b3JhZ2VXYWl0fSA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIENhY2hlXG4gICAgaWYoc3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IGF3YWl0IHN0b3JhZ2UuZ2V0U3RvcmFnZURhdGEobmFtZSkgfHwge307XG4gICAgICAgIHRoaXMudXBkYXRlU3RvcmFnZSA9IGRlYm91bmNlKFxuICAgICAgICAgICgpID0+IHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSksXG4gICAgICAgICAgc3RvcmFnZVdhaXQsXG4gICAgICAgICAge2xlYWRpbmc6IHRydWUsIHRyYWlsaW5nOiB0cnVlfVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBBcmtoYW1KUyBFcnJvcjogVXNpbmcgc3RvcmFnZSwgXCIke25hbWV9XCIuYCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXRlID0gc3RhdGUgfHwge307XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNv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SyxhQUFhLElBQUk7QUFBQSxFQUMvQjtBQUFBLEVBRVEsYUFBYSxNQUFjLE1BQWdDO0FBQ2pFLFVBQU0sT0FBTyxLQUFLLFdBQVcsR0FBRyxJQUFJLE1BQU0sS0FBSyxDQUFDO0FBR2hELFdBQU8sS0FBSyxPQUFPLENBQUMsUUFBd0IsSUFBSSxTQUFTLElBQUk7QUFBQSxFQUMvRDtBQUFBLEVBSUEsTUFBYyxXQUFXLE1BQTZCO0FBQ3BELFVBQU0sRUFBQyxTQUFTLE9BQU8sWUFBVyxJQUFJLEtBQUs7QUFHM0MsUUFBRyxTQUFTO0FBQ1YsVUFBSTtBQUNGLGFBQUssUUFBUSxTQUFTLE1BQU0sUUFBUSxlQUFlLElBQUksS0FBSyxDQUFDO0FBQzdELGFBQUssb0JBQWdCLGdCQUFBTztBQUFBLFVBQ25CLE1BQU0sUUFBUSxlQUFlLE1BQU0sS0FBSyxLQUFLO0FBQUEsVUFDN0M7QUFBQSxVQUNBLEVBQUMsU0FBUyxNQUFNLFVBQVUsS0FBSTtBQUFBLFFBQ2hDO0FBQUEsTUFDRixTQUFRLE9BQU87QUFDYixnQkFBUSxNQUFNLG1DQUFtQyxJQUFJLElBQUk7QUFDekQsY0FBTTtBQUFBLE1BQ1I7QUFBQSxJQUNGLE9BQU87QUFDTCxXQUFLLFFBQVEsU0FBUyxDQUFDO0FBQUEsSUFDekI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUNGO0FBRU8sTUFBTSxPQUFzQixJQUFJLGNBQWM7IiwKICAibmFtZXMiOiBbImNsb25lRGVlcCIsICJFcnJvclN0YWNrUGFyc2VyIiwgImFjdGlvbiIsICJtZXJnZSIsICJnZXQiLCAic2V0IiwgImlzRW1wdHkiLCAiZGVib3VuY2UiXQp9Cg==
1
+ /* ArkhamJS - Optimized Build */
2
+ var y=Object.defineProperty;var S=(c,h,t)=>h in c?y(c,h,{enumerable:!0,configurable:!0,writable:!0,value:t}):c[h]=t;var o=(c,h,t)=>S(c,typeof h!="symbol"?h+"":h,t);import{isEmpty as x}from"@nlabs/utils/checks/isEmpty";import{cloneDeep as l}from"@nlabs/utils/objects/clone";import{debounceCompact as v}from"@nlabs/utils/objects/debounce-compact";import{get as F}from"@nlabs/utils/objects/get";import{merge as A}from"@nlabs/utils/objects/merge";import{set as b}from"@nlabs/utils/objects/set";import{parseStack as E}from"@nlabs/utils/objects/stack-parser";import{EventEmitter as P}from"events";import{ArkhamConstants as g}from"../constants/ArkhamConstants";const u=new Map,T=100;class m extends P{constructor(){super();o(this,"isInit",!1);o(this,"pluginTypes",["preDispatch","postDispatch"]);o(this,"state",{});o(this,"storeActions",{});o(this,"defaultOptions",{name:"arkhamjs",routerType:"browser",scrollToTop:!0,state:null,storage:null,storageWait:300,stores:[],title:"ArkhamJS"});o(this,"middleware",{});o(this,"options",this.defaultOptions);o(this,"stateCache",new Map);o(this,"updateStorage",()=>Promise.resolve(!1));o(this,"stateChanged",!1);this.addMiddleware=this.addMiddleware.bind(this),this.addStores=this.addStores.bind(this),this.clearAppData=this.clearAppData.bind(this),this.clearMiddleware=this.clearMiddleware.bind(this),this.deregister=this.deregister.bind(this),this.dispatch=this.dispatch.bind(this),this.getOptions=this.getOptions.bind(this),this.getState=this.getState.bind(this),this.getStore=this.getStore.bind(this),this.init=this.init.bind(this),this.off=this.off.bind(this),this.register=this.register.bind(this),this.removeMiddleware=this.removeMiddleware.bind(this),this.removeStores=this.removeStores.bind(this),this.reset=this.reset.bind(this),this.setState=this.setState.bind(this),this.pluginTypes.forEach(t=>this.middleware[`${t}List`]=[])}addMiddleware(t){t.forEach(e=>{if(!e||typeof e!="function"&&typeof e!="object")throw Error("Unknown middleware is not configured properly. Cannot add to Flux.");const s=e.name||"";if(!s)throw Error("Unknown middleware is not configured properly. Requires name property. Cannot add to Flux.");this.middleware.preDispatchList?.find(r=>r.name===s)||this.middleware.postDispatchList?.find(r=>r.name===s)||this.pluginTypes.forEach(r=>{const a=e[r];if(a){const n={method:a,name:s};this.middleware[`${r}List`]=this.addPlugin(r,n)}})})}clearAppData(){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s];this.state[i.name]=i.initialState}),this.stateCache.clear(),this.stateChanged=!0;const{name:t,storage:e}=this.options;return e?.setStorageData?e.setStorageData(t,this.state):Promise.resolve(!0)}clearMiddleware(){return Object.keys(this.middleware).forEach(t=>{this.middleware[t]=[]}),!0}removeStores(t){t.forEach(e=>this.deregister(e))}async dispatch(t,e=!1){if(!t)throw new Error("ArkhamJS Error: Flux.dispatch requires an action.");const s=Date.now();let i=l(t),r=[];this.options.debug&&(r=this.getCachedStack());const a={duration:0,options:this.options,stack:r},{postDispatchList:n=[],preDispatchList:p=[]}=this.middleware;p.length&&(i=await this.processMiddleware(p,i,a));const{type:d,...f}=i;if(!d||d==="")return Promise.resolve(i);if(this.updateStoresState(d,f),this.stateChanged&&this.options.storage&&this.updateStorage)try{await this.updateStorage(),this.stateChanged=!1}catch{}const w=Date.now()-s;return a.duration=w,n.length&&(i=await this.processMiddleware(n,i,a)),e||(this.emit(d,i),this.emit("arkhamjs",this.state)),Promise.resolve(i)}getOptions(){return this.options}getState(t="",e){const s=Array.isArray(t)?t.join("."):t;if(this.stateCache.has(s))return this.stateCache.get(s);let i;t?i=F(this.state,t):i=this.state||{};const r=i&&l(i),a=r===void 0?e:r;return this.stateCache.set(s,a),a}getStore(t=""){return this.storeActions[t]}async init(t={},e=!1){e&&(this.isInit=!1,await this.reset(!1));const s={...t};this.isInit&&(s.name=this.options.name),this.options={...this.defaultOptions,...s};const{debug:i,middleware:r,name:a,stores:n}=this.options;try{await this.useStorage(a)}catch(d){throw d}if(n?.length)try{await this.addStores(n)}catch(d){throw d}r?.length&&this.addMiddleware(r);const p="arkhamjs";return i?window[p]=this:delete window[p],this.isInit=!0,this.emit(g.INIT),this}onInit(t){this.on(g.INIT,t),this.isInit&&t()}offInit(t){this.off(g.INIT,t)}off(t,e){return this.removeListener(t,e)}on(t,e){return this.addListener(t,e)}async addStores(t){const e=t.map(r=>this.register(r)),{name:s,storage:i}=this.options;if(i?.setStorageData)try{await i.setStorageData(s,this.state)}catch(r){throw r}return e}removeMiddleware(t){t.forEach(e=>{this.pluginTypes.forEach(s=>{this.middleware[`${s}List`]=this.removePlugin(s,e)})})}async reset(t=!0){const{name:e,storage:s}=this.options;if(s&&t)try{await s.setStorageData(e,{})}catch(i){throw i}this.middleware={},this.options={...this.defaultOptions},this.state={},this.storeActions={},this.stateCache.clear(),this.stateChanged=!1,this.isInit=!1,this.pluginTypes.forEach(i=>this.middleware[`${i}List`]=[])}setState(t="",e){if(t){this.state=b(t,l(e),this.state),this.stateChanged=!0;const s=Array.isArray(t)?t.join("."):t;this.stateCache.delete(s)}return this.options.storage&&this.updateStorage?this.updateStorage():Promise.resolve(!1)}async processMiddleware(t,e,s){return Promise.all(t.map(i=>i.method(l(e),l(this.state),s))).then(i=>i.reduce((r,a)=>A(r,a),e)).catch(i=>{throw i})}updateStoresState(t,e){Object.keys(this.storeActions).forEach(s=>{const i=this.storeActions[s],r=this.state[s]||i.initialState||{},a=i.action(t,e,r);a!==r&&(this.state[s]=l(a)||r,this.stateChanged=!0)})}getCachedStack(){const t=new Error().stack?.split(`
3
+ `)[2]||"";if(u.has(t))return u.get(t);let e=[];try{const s="stackTraceLimit",{stackTraceLimit:i}=Error;if(Error[s]=1/0,e=E(new Error),Error[s]=i,u.size>=T){const r=u.keys().next().value;u.delete(r)}u.set(t,e)}catch{}return e}addPlugin(t,e){const s=this.middleware[`${t}List`]||[],{method:i,name:r}=e;if(i&&typeof i=="function")s.some(n=>n.name===r)||s.push({method:i,name:r});else if(i!==void 0)throw Error(`${e.name} middleware is not configured properly. Method is not a function.`);return s}deregister(t=""){delete this.storeActions[t],delete this.state[t],this.stateCache.clear()}register(t){if(!t)throw Error("Store is undefined. Cannot register with Flux.");if(typeof t!="function")throw Error(`${t} is not a store function. Cannot register with Flux.`);const{name:e}=t,s=t(),i={action:t,initialState:s,name:e};return!x(e)&&!this.storeActions[e]&&(this.storeActions[e]=i,this.state[e]||(this.state[e]=s?l(s):{})),this.storeActions[e]}removePlugin(t,e){return(this.middleware[`${t}List`]||[]).filter(i=>i.name!==e)}async useStorage(t){const{storage:e,state:s,storageWait:i}=this.options;if(e)try{this.state=s||await e.getStorageData(t)||{},this.updateStorage=v(()=>e.setStorageData(t,this.state),i)}catch(r){throw r}else this.state=s||{}}}o(m,"initFlux",!1);const R=new m;export{R as Flux,m as FluxFramework};
4
+ /* End ArkhamJS */
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0ZsdXgvRmx1eC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7aXNFbXB0eX0gZnJvbSAnQG5sYWJzL3V0aWxzL2NoZWNrcy9pc0VtcHR5JztcbmltcG9ydCB7Y2xvbmVEZWVwfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9jbG9uZSc7XG5pbXBvcnQge2RlYm91bmNlQ29tcGFjdH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZGVib3VuY2UtY29tcGFjdCc7XG5pbXBvcnQge2dldH0gZnJvbSAnQG5sYWJzL3V0aWxzL29iamVjdHMvZ2V0JztcbmltcG9ydCB7bWVyZ2V9IGZyb20gJ0BubGFicy91dGlscy9vYmplY3RzL21lcmdlJztcbmltcG9ydCB7c2V0fSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zZXQnO1xuaW1wb3J0IHtwYXJzZVN0YWNrfSBmcm9tICdAbmxhYnMvdXRpbHMvb2JqZWN0cy9zdGFjay1wYXJzZXInO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5cbmltcG9ydCB7QXJraGFtQ29uc3RhbnRzfSBmcm9tICcuLi9jb25zdGFudHMvQXJraGFtQ29uc3RhbnRzJztcbmltcG9ydCB7Rmx1eEFjdGlvbiwgRmx1eE1pZGRsZXdhcmVUeXBlLCBGbHV4T3B0aW9ucywgRmx1eFBsdWdpblR5cGUsIEZsdXhTdG9yZX0gZnJvbSAnLi9GbHV4LnR5cGVzJztcblxuY29uc3QgU1RBQ0tfQ0FDSEUgPSBuZXcgTWFwPHN0cmluZywgYW55W10+KCk7XG5jb25zdCBTVEFDS19DQUNIRV9TSVpFID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgRmx1eEZyYW1ld29yayBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBpbml0Rmx1eDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc0luaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByZWFkb25seSBwbHVnaW5UeXBlczogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ3ByZURpc3BhdGNoJywgJ3Bvc3REaXNwYXRjaCddIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgc3RhdGU6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgcHJpdmF0ZSBzdG9yZUFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIEZsdXhTdG9yZT4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0T3B0aW9uczogRmx1eE9wdGlvbnMgPSB7XG4gICAgbmFtZTogJ2Fya2hhbWpzJyxcbiAgICByb3V0ZXJUeXBlOiAnYnJvd3NlcicsXG4gICAgc2Nyb2xsVG9Ub3A6IHRydWUsXG4gICAgc3RhdGU6IG51bGwsXG4gICAgc3RvcmFnZTogbnVsbCxcbiAgICBzdG9yYWdlV2FpdDogMzAwLFxuICAgIHN0b3JlczogW10sXG4gICAgdGl0bGU6ICdBcmtoYW1KUydcbiAgfTtcbiAgcHJpdmF0ZSBtaWRkbGV3YXJlOiBSZWNvcmQ8c3RyaW5nLCBGbHV4UGx1Z2luVHlwZVtdPiA9IHt9O1xuICBwcml2YXRlIG9wdGlvbnM6IEZsdXhPcHRpb25zID0gdGhpcy5kZWZhdWx0T3B0aW9ucztcblxuICBwcml2YXRlIHN0YXRlQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdG9yYWdlOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+ID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcblxuICBwcml2YXRlIHN0YXRlQ2hhbmdlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBCaW5kIG1ldGhvZHMgb25jZSBpbiBjb25zdHJ1Y3RvciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAgdGhpcy5hZGRNaWRkbGV3YXJlID0gdGhpcy5hZGRNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hZGRTdG9yZXMgPSB0aGlzLmFkZFN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuY2xlYXJBcHBEYXRhID0gdGhpcy5jbGVhckFwcERhdGEuYmluZCh0aGlzKTtcbiAgICB0aGlzLmNsZWFyTWlkZGxld2FyZSA9IHRoaXMuY2xlYXJNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kZXJlZ2lzdGVyID0gdGhpcy5kZXJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5kaXNwYXRjaCA9IHRoaXMuZGlzcGF0Y2guYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldFN0YXRlID0gdGhpcy5nZXRTdGF0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuZ2V0U3RvcmUgPSB0aGlzLmdldFN0b3JlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5pbml0ID0gdGhpcy5pbml0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5vZmYgPSB0aGlzLm9mZi5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXIgPSB0aGlzLnJlZ2lzdGVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVNaWRkbGV3YXJlID0gdGhpcy5yZW1vdmVNaWRkbGV3YXJlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5yZW1vdmVTdG9yZXMgPSB0aGlzLnJlbW92ZVN0b3Jlcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVzZXQgPSB0aGlzLnJlc2V0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdGF0ZSA9IHRoaXMuc2V0U3RhdGUuYmluZCh0aGlzKTtcblxuICAgIC8vIEluaXRpYWxpemUgbWlkZGxld2FyZSBsaXN0c1xuICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSBbXSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG1pZGRsZXdhcmUgdG8gZnJhbWV3b3JrIHdpdGggZHVwbGljYXRlIHByZXZlbnRpb25cbiAgICovXG4gIGFkZE1pZGRsZXdhcmUobWlkZGxld2FyZTogRmx1eE1pZGRsZXdhcmVUeXBlW10pOiB2b2lkIHtcbiAgICBtaWRkbGV3YXJlLmZvckVhY2goKG1pZGRsZU9iajogRmx1eE1pZGRsZXdhcmVUeXBlKSA9PiB7XG4gICAgICBpZiAoIW1pZGRsZU9iaiB8fCAodHlwZW9mIG1pZGRsZU9iaiAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWlkZGxlT2JqICE9PSAnb2JqZWN0JykpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gbWlkZGxld2FyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gQ2Fubm90IGFkZCB0byBGbHV4LicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtaWRkbGVOYW1lOiBzdHJpbmcgPSBtaWRkbGVPYmoubmFtZSB8fCAnJztcbiAgICAgIGlmICghbWlkZGxlTmFtZSkge1xuICAgICAgICB0aHJvdyBFcnJvcignVW5rbm93biBtaWRkbGV3YXJlIGlzIG5vdCBjb25maWd1cmVkIHByb3Blcmx5LiBSZXF1aXJlcyBuYW1lIHByb3BlcnR5LiBDYW5ub3QgYWRkIHRvIEZsdXguJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBtaWRkbGV3YXJlIHRvIHByZXZlbnQgZHVwbGljYXRlc1xuICAgICAgY29uc3QgZXhpc3RpbmdNaWRkbGV3YXJlID0gdGhpcy5taWRkbGV3YXJlLnByZURpc3BhdGNoTGlzdD8uZmluZChtID0+IG0ubmFtZSA9PT0gbWlkZGxlTmFtZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taWRkbGV3YXJlLnBvc3REaXNwYXRjaExpc3Q/LmZpbmQobSA9PiBtLm5hbWUgPT09IG1pZGRsZU5hbWUpO1xuXG4gICAgICBpZiAoZXhpc3RpbmdNaWRkbGV3YXJlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgTWlkZGxld2FyZSBcIiR7bWlkZGxlTmFtZX1cIiBhbHJlYWR5IGV4aXN0cy4gU2tpcHBpbmcgZHVwbGljYXRlLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGx1Z2luVHlwZXMuZm9yRWFjaCgodHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1ldGhvZCA9IG1pZGRsZU9ialt0eXBlXTtcbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgIGNvbnN0IHBsdWdpbjogRmx1eFBsdWdpblR5cGUgPSB7bWV0aG9kLCBuYW1lOiBtaWRkbGVOYW1lfTtcbiAgICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLmFkZFBsdWdpbih0eXBlLCBwbHVnaW4pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIGFwcCBkYXRhIGZyb20gc3RvcmFnZSB3aXRoIG9wdGltaXplZCBzdGF0ZSByZXNldFxuICAgKi9cbiAgY2xlYXJBcHBEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIC8vIFJlc2V0IHN0YXRlIHRvIGluaXRpYWwgdmFsdWVzIHdpdGhvdXQgY2xvbmluZ1xuICAgIE9iamVjdC5rZXlzKHRoaXMuc3RvcmVBY3Rpb25zKS5mb3JFYWNoKChzdG9yZU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3RvcmVGbiA9IHRoaXMuc3RvcmVBY3Rpb25zW3N0b3JlTmFtZV07XG4gICAgICB0aGlzLnN0YXRlW3N0b3JlRm4ubmFtZV0gPSBzdG9yZUZuLmluaXRpYWxTdGF0ZTtcbiAgICB9KTtcblxuICAgIC8vIENsZWFyIHN0YXRlIGNhY2hlXG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuICAgIGlmIChzdG9yYWdlPy5zZXRTdG9yYWdlRGF0YSkge1xuICAgICAgcmV0dXJuIHN0b3JhZ2Uuc2V0U3RvcmFnZURhdGEobmFtZSwgdGhpcy5zdGF0ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWxsIG1pZGRsZXdhcmUgd2l0aCBwcm9wZXIgY2xlYW51cFxuICAgKi9cbiAgY2xlYXJNaWRkbGV3YXJlKCk6IGJvb2xlYW4ge1xuICAgIE9iamVjdC5rZXlzKHRoaXMubWlkZGxld2FyZSkuZm9yRWFjaCgocGx1Z2luVHlwZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLm1pZGRsZXdhcmVbcGx1Z2luVHlwZV0gPSBbXTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZS1yZWdpc3RlcnMgbmFtZWQgc3RvcmVzIHdpdGggY2xlYW51cFxuICAgKi9cbiAgcmVtb3ZlU3RvcmVzKHN0b3JlTmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgc3RvcmVOYW1lcy5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHRoaXMuZGVyZWdpc3RlcihuYW1lKSk7XG4gIH1cblxuICAvKipcbiAgICogT3B0aW1pemVkIGRpc3BhdGNoIG1ldGhvZCB3aXRoIHJlZHVjZWQgY2xvbmluZyBhbmQgYmV0dGVyIHBlcmZvcm1hbmNlXG4gICAqL1xuICBhc3luYyBkaXNwYXRjaChhY3Rpb246IEZsdXhBY3Rpb24sIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxGbHV4QWN0aW9uPiB7XG4gICAgaWYgKCFhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJraGFtSlMgRXJyb3I6IEZsdXguZGlzcGF0Y2ggcmVxdWlyZXMgYW4gYWN0aW9uLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogT25seSBjbG9uZSBhY3Rpb24gb25jZVxuICAgIGxldCBjbG9uZWRBY3Rpb246IEZsdXhBY3Rpb24gPSBjbG9uZURlZXAoYWN0aW9uKTtcblxuICAgIC8vIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbjogT25seSBnZXQgc3RhY2sgdHJhY2UgaW4gZGVidWcgbW9kZVxuICAgIGxldCBzdGFjazogYW55W10gPSBbXTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICBzdGFjayA9IHRoaXMuZ2V0Q2FjaGVkU3RhY2soKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJbmZvID0ge1xuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgICBzdGFja1xuICAgIH07XG5cbiAgICAvLyBBcHBseSBwcmUtZGlzcGF0Y2ggbWlkZGxld2FyZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAgY29uc3Qge3Bvc3REaXNwYXRjaExpc3QgPSBbXSwgcHJlRGlzcGF0Y2hMaXN0ID0gW119ID0gdGhpcy5taWRkbGV3YXJlO1xuXG4gICAgaWYgKHByZURpc3BhdGNoTGlzdC5sZW5ndGgpIHtcbiAgICAgIGNsb25lZEFjdGlvbiA9IGF3YWl0IHRoaXMucHJvY2Vzc01pZGRsZXdhcmUocHJlRGlzcGF0Y2hMaXN0LCBjbG9uZWRBY3Rpb24sIGFwcEluZm8pO1xuICAgIH1cblxuICAgIGNvbnN0IHt0eXBlLCAuLi5kYXRhfSA9IGNsb25lZEFjdGlvbjtcblxuICAgIGlmICghdHlwZSB8fCB0eXBlID09PSAnJykge1xuICAgICAgY29uc29sZS53YXJuKCdBcmtoYW1KUyBXYXJuaW5nOiBGbHV4LmRpc3BhdGNoIGlzIG1pc3NpbmcgYW4gYWN0aW9uIHR5cGUgZm9yIHRoZSBwYXlsb2FkOicsIGRhdGEpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjbG9uZWRBY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIE9wdGltaXplZCBzdGF0ZSB1cGRhdGVzIC0gb25seSBjbG9uZSB3aGVuIG5lY2Vzc2FyeVxuICAgIHRoaXMudXBkYXRlU3RvcmVzU3RhdGUodHlwZSwgZGF0YSk7XG5cbiAgICAvLyBTYXZlIGNhY2hlIGluIHN0b3JhZ2Ugb25seSBpZiBzdGF0ZSBjaGFuZ2VkXG4gICAgaWYgKHRoaXMuc3RhdGVDaGFuZ2VkICYmIHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVTdG9yYWdlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yYWdlIHVwZGF0ZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uOiBudW1iZXIgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGFwcEluZm8uZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuICAgIC8vIEFwcGx5IHBvc3QtZGlzcGF0Y2ggbWlkZGxld2FyZVxuICAgIGlmIChwb3N0RGlzcGF0Y2hMaXN0Lmxlbmd0aCkge1xuICAgICAgY2xvbmVkQWN0aW9uID0gYXdhaXQgdGhpcy5wcm9jZXNzTWlkZGxld2FyZShwb3N0RGlzcGF0Y2hMaXN0LCBjbG9uZWRBY3Rpb24sIGFwcEluZm8pO1xuICAgIH1cblxuICAgIGlmICghc2lsZW50KSB7XG4gICAgICB0aGlzLmVtaXQodHlwZSwgY2xvbmVkQWN0aW9uKTtcbiAgICAgIHRoaXMuZW1pdCgnYXJraGFtanMnLCB0aGlzLnN0YXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNsb25lZEFjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IEZsdXggb3B0aW9uc1xuICAgKi9cbiAgZ2V0T3B0aW9ucygpOiBGbHV4T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBPcHRpbWl6ZWQgZ2V0U3RhdGUgd2l0aCBjYWNoaW5nXG4gICAqL1xuICBnZXRTdGF0ZShwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSA9ICcnLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICAgIGNvbnN0IHBhdGhLZXkgPSBBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aC5qb2luKCcuJykgOiBwYXRoO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZiAodGhpcy5zdGF0ZUNhY2hlLmhhcyhwYXRoS2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVDYWNoZS5nZXQocGF0aEtleSk7XG4gICAgfVxuXG4gICAgbGV0IHN0b3JlVmFsdWU6IGFueTtcbiAgICBpZiAoIXBhdGgpIHtcbiAgICAgIHN0b3JlVmFsdWUgPSB0aGlzLnN0YXRlIHx8IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZVZhbHVlID0gZ2V0KHRoaXMuc3RhdGUsIHBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gc3RvcmVWYWx1ZSA/IGNsb25lRGVlcChzdG9yZVZhbHVlKSA6IHN0b3JlVmFsdWU7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IGRlZmF1bHRWYWx1ZSA6IHZhbHVlO1xuXG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgIHRoaXMuc3RhdGVDYWNoZS5zZXQocGF0aEtleSwgcmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc3RvcmUgb2JqZWN0IHJlZ2lzdGVyZWQgd2l0aCBGbHV4XG4gICAqL1xuICBnZXRTdG9yZShuYW1lOiBzdHJpbmcgPSAnJyk6IEZsdXhTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW5kIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2l0aCB2YWxpZGF0aW9uXG4gICAqL1xuICBhc3luYyBpbml0KG9wdGlvbnM6IEZsdXhPcHRpb25zID0ge30sIHJlc2V0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEZsdXhGcmFtZXdvcms+IHtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMuaXNJbml0ID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLnJlc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVkT3B0aW9ucyA9IHsuLi5vcHRpb25zfTtcbiAgICBpZiAodGhpcy5pc0luaXQpIHtcbiAgICAgIHVwZGF0ZWRPcHRpb25zLm5hbWUgPSB0aGlzLm9wdGlvbnMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9ucywgLi4udXBkYXRlZE9wdGlvbnN9O1xuICAgIGNvbnN0IHtkZWJ1ZywgbWlkZGxld2FyZSwgbmFtZSwgc3RvcmVzfSA9IHRoaXMub3B0aW9ucztcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZVN0b3JhZ2UobmFtZSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Fya2hhbSBFcnJvcjogVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHVzaW5nIHN0b3JhZ2UuJywgbmFtZSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYWRkU3RvcmVzKHN0b3Jlcyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBcmtoYW0gRXJyb3I6IFRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBhZGRpbmcgc3RvcmVzLicsIHN0b3Jlcyk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtaWRkbGV3YXJlPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuYWRkTWlkZGxld2FyZShtaWRkbGV3YXJlKTtcbiAgICB9XG5cbiAgICBjb25zdCB3aW5kb3dQcm9wZXJ0eTogc3RyaW5nID0gJ2Fya2hhbWpzJztcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KVt3aW5kb3dQcm9wZXJ0eV0gPSB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgKHdpbmRvdyBhcyBhbnkpW3dpbmRvd1Byb3BlcnR5XTtcbiAgICB9XG5cbiAgICB0aGlzLmlzSW5pdCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KEFya2hhbUNvbnN0YW50cy5JTklUKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gaW5pdGlhbGl6YXRpb24gbGlzdGVuZXIgd2l0aCBpbW1lZGlhdGUgZXhlY3V0aW9uIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICovXG4gIG9uSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbihBcmtoYW1Db25zdGFudHMuSU5JVCwgbGlzdGVuZXIpO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0KSB7XG4gICAgICBsaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpbml0aWFsaXphdGlvbiBsaXN0ZW5lclxuICAgKi9cbiAgb2ZmSW5pdChsaXN0ZW5lcjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vZmYoQXJraGFtQ29uc3RhbnRzLklOSVQsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGxpc3RlbmVyOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQpOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqL1xuICBvbihldmVudFR5cGU6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBuZXcgU3RvcmVzIHdpdGggdmFsaWRhdGlvblxuICAgKi9cbiAgYXN5bmMgYWRkU3RvcmVzKHN0b3JlczogRmx1eFN0b3JlW10pOiBQcm9taXNlPEZsdXhTdG9yZVtdPiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZFN0b3JlczogRmx1eFN0b3JlW10gPSBzdG9yZXMubWFwKChzdG9yZTogRmx1eFN0b3JlKSA9PiB0aGlzLnJlZ2lzdGVyKHN0b3JlKSk7XG5cbiAgICBjb25zdCB7bmFtZSwgc3RvcmFnZX0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHN0b3JhZ2U/LnNldFN0b3JhZ2VEYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHRoaXMuc3RhdGUpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWRTdG9yZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1pZGRsZXdhcmUgZnJvbSBmcmFtZXdvcmtcbiAgICovXG4gIHJlbW92ZU1pZGRsZXdhcmUobmFtZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgbmFtZXMuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICB0aGlzLm1pZGRsZXdhcmVbYCR7dHlwZX1MaXN0YF0gPSB0aGlzLnJlbW92ZVBsdWdpbih0eXBlLCBuYW1lKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IGZyYW1ld29yayB3aXRoIHByb3BlciBjbGVhbnVwXG4gICAqL1xuICBhc3luYyByZXNldChjbGVhclN0b3JhZ2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qge25hbWUsIHN0b3JhZ2V9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHN0b3JhZ2UgJiYgY2xlYXJTdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzdG9yYWdlLnNldFN0b3JhZ2VEYXRhKG5hbWUsIHt9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsZWFyIGFsbCBwcm9wZXJ0aWVzIGFuZCBjYWNoZXNcbiAgICB0aGlzLm1pZGRsZXdhcmUgPSB7fTtcbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5kZWZhdWx0T3B0aW9uc307XG4gICAgdGhpcy5zdGF0ZSA9IHt9O1xuICAgIHRoaXMuc3RvcmVBY3Rpb25zID0ge307XG4gICAgdGhpcy5zdGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5pdCA9IGZhbHNlO1xuXG4gICAgLy8gUmVpbml0aWFsaXplIG1pZGRsZXdhcmUgbGlzdHNcbiAgICB0aGlzLnBsdWdpblR5cGVzLmZvckVhY2goKHR5cGU6IHN0cmluZykgPT4gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdID0gW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wdGltaXplZCBzZXRTdGF0ZSB3aXRoIGNoYW5nZSB0cmFja2luZ1xuICAgKi9cbiAgc2V0U3RhdGUocGF0aDogc3RyaW5nIHwgc3RyaW5nW10gPSAnJywgdmFsdWU6IGFueSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXRoKSB7XG4gICAgICB0aGlzLnN0YXRlID0gc2V0KHBhdGgsIGNsb25lRGVlcCh2YWx1ZSksIHRoaXMuc3RhdGUpO1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZWQgPSB0cnVlO1xuXG4gICAgICAvLyBDbGVhciByZWxldmFudCBjYWNoZSBlbnRyaWVzXG4gICAgICBjb25zdCBwYXRoS2V5ID0gQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGguam9pbignLicpIDogcGF0aDtcbiAgICAgIHRoaXMuc3RhdGVDYWNoZS5kZWxldGUocGF0aEtleSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zdG9yYWdlICYmIHRoaXMudXBkYXRlU3RvcmFnZSkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlU3RvcmFnZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuXG4gIC8qKlxuICAgKiBQcm9jZXNzIG1pZGRsZXdhcmUgd2l0aCBvcHRpbWl6ZWQgY2xvbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9jZXNzTWlkZGxld2FyZShcbiAgICBtaWRkbGV3YXJlTGlzdDogRmx1eFBsdWdpblR5cGVbXSxcbiAgICBhY3Rpb246IEZsdXhBY3Rpb24sXG4gICAgYXBwSW5mbzogYW55XG4gICk6IFByb21pc2U8Rmx1eEFjdGlvbj4ge1xuICAgIHJldHVybiBQcm9taXNlXG4gICAgICAuYWxsKFxuICAgICAgICBtaWRkbGV3YXJlTGlzdC5tYXAoKHBsdWdpbjogRmx1eFBsdWdpblR5cGUpID0+XG4gICAgICAgICAgcGx1Z2luLm1ldGhvZChjbG9uZURlZXAoYWN0aW9uKSwgY2xvbmVEZWVwKHRoaXMuc3RhdGUpLCBhcHBJbmZvKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAudGhlbihcbiAgICAgICAgKGFjdGlvbnMpID0+IGFjdGlvbnMucmVkdWNlKCh1cGRhdGVkQWN0aW9uLCBhY3Rpb24pID0+XG4gICAgICAgICAgbWVyZ2UodXBkYXRlZEFjdGlvbiwgYWN0aW9uKSwgYWN0aW9uKSBhcyBGbHV4QWN0aW9uXG4gICAgICApXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHN0b3JlcyBzdGF0ZSB3aXRoIG9wdGltaXplZCBjbG9uaW5nXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVN0b3Jlc1N0YXRlKHR5cGU6IHN0cmluZywgZGF0YTogYW55KTogdm9pZCB7XG4gICAgT2JqZWN0LmtleXModGhpcy5zdG9yZUFjdGlvbnMpLmZvckVhY2goKHN0b3JlTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBzdG9yZUZuID0gdGhpcy5zdG9yZUFjdGlvbnNbc3RvcmVOYW1lXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuc3RhdGVbc3RvcmVOYW1lXSB8fCBzdG9yZUZuLmluaXRpYWxTdGF0ZSB8fCB7fTtcblxuICAgICAgLy8gT25seSBjbG9uZSBpZiB0aGUgc3RhdGUgYWN0dWFsbHkgY2hhbmdlc1xuICAgICAgY29uc3QgbmV3U3RhdGUgPSBzdG9yZUZuLmFjdGlvbih0eXBlLCBkYXRhLCBjdXJyZW50U3RhdGUpO1xuICAgICAgaWYgKG5ld1N0YXRlICE9PSBjdXJyZW50U3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtzdG9yZU5hbWVdID0gY2xvbmVEZWVwKG5ld1N0YXRlKSB8fCBjdXJyZW50U3RhdGU7XG4gICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2FjaGVkIHN0YWNrIHRyYWNlIGZvciBwZXJmb3JtYW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDYWNoZWRTdGFjaygpOiBhbnlbXSB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBuZXcgRXJyb3IoKS5zdGFjaz8uc3BsaXQoJ1xcbicpWzJdIHx8ICcnO1xuXG4gICAgaWYgKFNUQUNLX0NBQ0hFLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiBTVEFDS19DQUNIRS5nZXQoY2FjaGVLZXkpITtcbiAgICB9XG5cbiAgICBsZXQgc3RhY2s6IGFueVtdID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcGVydHk6IHN0cmluZyA9ICdzdGFja1RyYWNlTGltaXQnO1xuICAgICAgY29uc3Qge3N0YWNrVHJhY2VMaW1pdH06IGFueSA9IEVycm9yO1xuICAgICAgRXJyb3Jbc3RhY2tQcm9wZXJ0eV0gPSBJbmZpbml0eTtcbiAgICAgIHN0YWNrID0gcGFyc2VTdGFjayhuZXcgRXJyb3IoKSk7XG4gICAgICBFcnJvcltzdGFja1Byb3BlcnR5XSA9IHN0YWNrVHJhY2VMaW1pdDtcblxuICAgICAgLy8gQ2FjaGUgdGhlIHJlc3VsdFxuICAgICAgaWYgKFNUQUNLX0NBQ0hFLnNpemUgPj0gU1RBQ0tfQ0FDSEVfU0laRSkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IFNUQUNLX0NBQ0hFLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgIFNUQUNLX0NBQ0hFLmRlbGV0ZShmaXJzdEtleSk7XG4gICAgICB9XG4gICAgICBTVEFDS19DQUNIRS5zZXQoY2FjaGVLZXksIHN0YWNrKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRmFsbGJhY2sgdG8gZW1wdHkgc3RhY2tcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhY2s7XG4gIH1cblxuICBwcml2YXRlIGFkZFBsdWdpbih0eXBlOiBzdHJpbmcsIHBsdWdpbjogRmx1eFBsdWdpblR5cGUpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuICAgIGNvbnN0IHttZXRob2QsIG5hbWV9ID0gcGx1Z2luO1xuXG4gICAgaWYgKG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBleGlzdHM6IGJvb2xlYW4gPSBsaXN0LnNvbWUoKG9iajogRmx1eFBsdWdpblR5cGUpID0+IG9iai5uYW1lID09PSBuYW1lKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGxpc3QucHVzaCh7bWV0aG9kLCBuYW1lfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtZXRob2QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7cGx1Z2luLm5hbWV9IG1pZGRsZXdhcmUgaXMgbm90IGNvbmZpZ3VyZWQgcHJvcGVybHkuIE1ldGhvZCBpcyBub3QgYSBmdW5jdGlvbi5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHByaXZhdGUgZGVyZWdpc3RlcihuYW1lOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIGRlbGV0ZSB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5zdGF0ZVtuYW1lXTtcbiAgICB0aGlzLnN0YXRlQ2FjaGUuY2xlYXIoKTsgLy8gQ2xlYXIgY2FjaGUgd2hlbiBzdG9yZXMgY2hhbmdlXG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyKHN0b3JlRm46IGFueSk6IEZsdXhTdG9yZSB7XG4gICAgaWYgKCFzdG9yZUZuKSB7XG4gICAgICB0aHJvdyBFcnJvcignU3RvcmUgaXMgdW5kZWZpbmVkLiBDYW5ub3QgcmVnaXN0ZXIgd2l0aCBGbHV4LicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RvcmVGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgRXJyb3IoYCR7c3RvcmVGbn0gaXMgbm90IGEgc3RvcmUgZnVuY3Rpb24uIENhbm5vdCByZWdpc3RlciB3aXRoIEZsdXguYCk7XG4gICAgfVxuXG4gICAgY29uc3Qge25hbWV9ID0gc3RvcmVGbjtcbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IGFueSA9IHN0b3JlRm4oKTtcbiAgICBjb25zdCBzdG9yZUFjdGlvbjogRmx1eFN0b3JlID0ge1xuICAgICAgYWN0aW9uOiBzdG9yZUZuLFxuICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgbmFtZVxuICAgIH07XG5cbiAgICBpZiAoIWlzRW1wdHkobmFtZSkgJiYgIXRoaXMuc3RvcmVBY3Rpb25zW25hbWVdKSB7XG4gICAgICB0aGlzLnN0b3JlQWN0aW9uc1tuYW1lXSA9IHN0b3JlQWN0aW9uO1xuXG4gICAgICBpZiAoIXRoaXMuc3RhdGVbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5zdGF0ZVtuYW1lXSA9IGluaXRpYWxTdGF0ZSA/IGNsb25lRGVlcChpbml0aWFsU3RhdGUpIDoge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3RvcmVBY3Rpb25zW25hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQbHVnaW4odHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiBGbHV4UGx1Z2luVHlwZVtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5taWRkbGV3YXJlW2Ake3R5cGV9TGlzdGBdIHx8IFtdO1xuICAgIHJldHVybiBsaXN0LmZpbHRlcigob2JqOiBGbHV4UGx1Z2luVHlwZSkgPT4gb2JqLm5hbWUgIT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1c2VTdG9yYWdlKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtzdG9yYWdlLCBzdGF0ZSwgc3RvcmFnZVdhaXR9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaWYgKHN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZSB8fCBhd2FpdCBzdG9yYWdlLmdldFN0b3JhZ2VEYXRhKG5hbWUpIHx8IHt9O1xuICAgICAgICB0aGlzLnVwZGF0ZVN0b3JhZ2UgPSBkZWJvdW5jZUNvbXBhY3QoXG4gICAgICAgICAgKCkgPT4gc3RvcmFnZS5zZXRTdG9yYWdlRGF0YShuYW1lLCB0aGlzLnN0YXRlKSxcbiAgICAgICAgICBzdG9yYWdlV2FpdFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgQXJraGFtSlMgRXJyb3I6IFVzaW5nIHN0b3JhZ2UsIFwiJHtuYW1lfVwiLmApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlIHx8IHt9O1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgRmx1eDogRmx1eEZyYW1ld29yayA9IG5ldyBGbHV4RnJhbWV3b3JrKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiO29LQUlBLE9BQVEsV0FBQUEsTUFBYyw4QkFDdEIsT0FBUSxhQUFBQyxNQUFnQiw2QkFDeEIsT0FBUSxtQkFBQUMsTUFBc0Isd0NBQzlCLE9BQVEsT0FBQUMsTUFBVSwyQkFDbEIsT0FBUSxTQUFBQyxNQUFZLDZCQUNwQixPQUFRLE9BQUFDLE1BQVUsMkJBQ2xCLE9BQVEsY0FBQUMsTUFBaUIsb0NBQ3pCLE9BQVEsZ0JBQUFDLE1BQW1CLFNBRTNCLE9BQVEsbUJBQUFDLE1BQXNCLCtCQUc5QixNQUFNQyxFQUFjLElBQUksSUFDbEJDLEVBQW1CLElBRWxCLE1BQU1DLFVBQXNCQyxDQUFhLENBMkI5QyxhQUFjLENBQ1osTUFBTSxFQTFCUkMsRUFBQSxjQUFrQixJQUVsQkEsRUFBQSxLQUFTLGNBQWlDLENBQUMsY0FBZSxjQUFjLEdBRXhFQSxFQUFBLEtBQVEsUUFBNkIsQ0FBQyxHQUN0Q0EsRUFBQSxLQUFRLGVBQTBDLENBQUMsR0FDbkRBLEVBQUEsS0FBaUIsaUJBQThCLENBQzdDLEtBQU0sV0FDTixXQUFZLFVB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TXRELEVBQVEsZUFBZUQsRUFBTSxLQUFLLEtBQUssRUFDN0NzRCxDQUNGLENBQ0YsT0FBUzNCLEVBQU8sQ0FFZCxNQUFNQSxDQUNSLE1BRUEsS0FBSyxNQUFRMEIsR0FBUyxDQUFDLENBRTNCLENBQ0YsQ0F4aEJFL0QsRUFEV0YsRUFDSixXQUFvQixJQTBoQnRCLE1BQU1vRSxFQUFzQixJQUFJcEUiLAogICJuYW1lcyI6IFsiaXNFbXB0eSIsICJjbG9uZURlZXAiLCAiZGVib3VuY2VDb21wYWN0IiwgImdldCIsICJtZXJnZSIsICJzZXQiLCAicGFyc2VTdGFjayIsICJFdmVudEVtaXR0ZXIiLCAiQXJraGFtQ29uc3RhbnRzIiwgIlNUQUNLX0NBQ0hFIiwgIlNUQUNLX0NBQ0hFX1NJWkUiLCAiRmx1eEZyYW1ld29yayIsICJFdmVudEVtaXR0ZXIiLCAiX19wdWJsaWNGaWVsZCIsICJ0eXBlIiwgIm1pZGRsZXdhcmUiLCAibWlkZGxlT2JqIiwgIm1pZGRsZU5hbWUiLCAibSIsICJtZXRob2QiLCAicGx1Z2luIiwgInN0b3JlTmFtZSIsICJzdG9yZUZuIiwgIm5hbWUiLCAic3RvcmFnZSIsICJwbHVnaW5UeXBlIiwgInN0b3JlTmFtZXMiLCAiYWN0aW9uIiwgInNpbGVudCIsICJzdGFydFRpbWUiLCAiY2xvbmVkQWN0aW9uIiwgImNsb25lRGVlcCIsICJzdGFjayIsICJhcHBJbmZvIiwgInBvc3REaXNwYXRjaExpc3QiLCAicHJlRGlzcGF0Y2hMaXN0IiwgImRhdGEiLCAiZHVyYXRpb24iLCAicGF0aCIsICJkZWZhdWx0VmFsdWUiLCAicGF0aEtleSIsICJzdG9yZVZhbHVlIiwgImdldCIsICJ2YWx1ZSIsICJyZXN1bHQiLCAib3B0aW9ucyIsICJyZXNldCIsICJ1cGRhdGVkT3B0aW9ucyIsICJkZWJ1ZyIsICJzdG9yZXMiLCAiZXJyb3IiLCAid2luZG93UHJvcGVydHkiLCAiQXJraGFtQ29uc3RhbnRzIiwgImxpc3RlbmVyIiwgImV2ZW50VHlwZSIsICJyZWdpc3RlcmVkU3RvcmVzIiwgInN0b3JlIiwgIm5hbWVzIiwgImNsZWFyU3RvcmFnZSIsICJzZXQiLCAibWlkZGxld2FyZUxpc3QiLCAiYWN0aW9ucyIsICJ1cGRhdGVkQWN0aW9uIiwgIm1lcmdlIiwgImN1cnJlbnRTdGF0ZSIsICJuZXdTdGF0ZSIsICJjYWNoZUtleSIsICJzdGFja1Byb3BlcnR5IiwgInN0YWNrVHJhY2VMaW1pdCIsICJwYXJzZVN0YWNrIiwgImZpcnN0S2V5IiwgImxpc3QiLCAib2JqIiwgImluaXRpYWxTdGF0ZSIsICJzdG9yZUFjdGlvbiIsICJpc0VtcHR5IiwgInN0YXRlIiwgInN0b3JhZ2VXYWl0IiwgImRlYm91bmNlQ29tcGFjdCIsICJGbHV4Il0KfQo=
@@ -1,16 +1,3 @@
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
1
+ /* ArkhamJS - Optimized Build */
2
+ /* End ArkhamJS */
3
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
@@ -1,47 +1,4 @@
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
- static {
25
- this.GO_BACK = "ARKHAM_GO_BACK";
26
- }
27
- static {
28
- this.GO_REPLACE = "ARKHAM_GO_REPLACE";
29
- }
30
- static {
31
- this.GOTO = "ARKHAM_GOTO";
32
- }
33
- static {
34
- this.INIT = "ARKHAM_INIT";
35
- }
36
- static {
37
- this.UPDATE_TITLE = "ARKHAM_UPDATE_TITLE";
38
- }
39
- static {
40
- this.UPDATE_VIEW = "ARKHAM_UPDATE_VIEW";
41
- }
42
- }
43
- // Annotate the CommonJS export names for ESM import in node:
44
- 0 && (module.exports = {
45
- ArkhamConstants
46
- });
47
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmV4cG9ydCBjbGFzcyBBcmtoYW1Db25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgR09fQkFDSzogc3RyaW5nID0gJ0FSS0hBTV9HT19CQUNLJztcbiAgc3RhdGljIHJlYWRvbmx5IEdPX1JFUExBQ0U6IHN0cmluZyA9ICdBUktIQU1fR09fUkVQTEFDRSc7XG4gIHN0YXRpYyByZWFkb25seSBHT1RPOiBzdHJpbmcgPSAnQVJLSEFNX0dPVE8nO1xuICBzdGF0aWMgcmVhZG9ubHkgSU5JVDogc3RyaW5nID0gJ0FSS0hBTV9JTklUJztcbiAgc3RhdGljIHJlYWRvbmx5IFVQREFURV9USVRMRTogc3RyaW5nID0gJ0FSS0hBTV9VUERBVEVfVElUTEUnO1xuICBzdGF0aWMgcmVhZG9ubHkgVVBEQVRFX1ZJRVc6IHN0cmluZyA9ICdBUktIQU1fVVBEQVRFX1ZJRVcnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS08sTUFBTSxnQkFBZ0I7QUFBQSxFQUMzQjtBQUFBLFNBQWdCLFVBQWtCO0FBQUE7QUFBQSxFQUNsQztBQUFBLFNBQWdCLGFBQXFCO0FBQUE7QUFBQSxFQUNyQztBQUFBLFNBQWdCLE9BQWU7QUFBQTtBQUFBLEVBQy9CO0FBQUEsU0FBZ0IsT0FBZTtBQUFBO0FBQUEsRUFDL0I7QUFBQSxTQUFnQixlQUF1QjtBQUFBO0FBQUEsRUFDdkM7QUFBQSxTQUFnQixjQUFzQjtBQUFBO0FBQ3hDOyIsCiAgIm5hbWVzIjogW10KfQo=
1
+ /* ArkhamJS - Optimized Build */
2
+ var t=Object.defineProperty;var r=(i,A,T)=>A in i?t(i,A,{enumerable:!0,configurable:!0,writable:!0,value:T}):i[A]=T;var _=(i,A,T)=>r(i,typeof A!="symbol"?A+"":A,T);class E{}_(E,"GO_BACK","ARKHAM_GO_BACK"),_(E,"GO_REPLACE","ARKHAM_GO_REPLACE"),_(E,"GOTO","ARKHAM_GOTO"),_(E,"INIT","ARKHAM_INIT"),_(E,"UPDATE_TITLE","ARKHAM_UPDATE_TITLE"),_(E,"UPDATE_VIEW","ARKHAM_UPDATE_VIEW");export{E as ArkhamConstants};
3
+ /* End ArkhamJS */
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnN0YW50cy9BcmtoYW1Db25zdGFudHMudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmV4cG9ydCBjbGFzcyBBcmtoYW1Db25zdGFudHMge1xuICBzdGF0aWMgcmVhZG9ubHkgR09fQkFDSzogc3RyaW5nID0gJ0FSS0hBTV9HT19CQUNLJztcbiAgc3RhdGljIHJlYWRvbmx5IEdPX1JFUExBQ0U6IHN0cmluZyA9ICdBUktIQU1fR09fUkVQTEFDRSc7XG4gIHN0YXRpYyByZWFkb25seSBHT1RPOiBzdHJpbmcgPSAnQVJLSEFNX0dPVE8nO1xuICBzdGF0aWMgcmVhZG9ubHkgSU5JVDogc3RyaW5nID0gJ0FSS0hBTV9JTklUJztcbiAgc3RhdGljIHJlYWRvbmx5IFVQREFURV9USVRMRTogc3RyaW5nID0gJ0FSS0hBTV9VUERBVEVfVElUTEUnO1xuICBzdGF0aWMgcmVhZG9ubHkgVVBEQVRFX1ZJRVc6IHN0cmluZyA9ICdBUktIQU1fVVBEQVRFX1ZJRVcnO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtvS0FLTyxNQUFNQSxDQUFnQixDQU83QixDQU5FQyxFQURXRCxFQUNLLFVBQWtCLGtCQUNsQ0MsRUFGV0QsRUFFSyxhQUFxQixxQkFDckNDLEVBSFdELEVBR0ssT0FBZSxlQUMvQkMsRUFKV0QsRUFJSyxPQUFlLGVBQy9CQyxFQUxXRCxFQUtLLGVBQXVCLHVCQUN2Q0MsRUFOV0QsRUFNSyxjQUFzQiIsCiAgIm5hbWVzIjogWyJBcmtoYW1Db25zdGFudHMiLCAiX19wdWJsaWNGaWVsZCJdCn0K
package/lib/index.js CHANGED
@@ -1,36 +1,4 @@
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 index_exports = {};
20
- __export(index_exports, {
21
- ArkhamConstants: () => import_ArkhamConstants.ArkhamConstants,
22
- Flux: () => import_Flux.Flux,
23
- FluxFramework: () => import_Flux.FluxFramework
24
- });
25
- module.exports = __toCommonJS(index_exports);
26
- var import_ArkhamConstants = require("./constants/ArkhamConstants");
27
- var import_Flux = require("./Flux/Flux");
28
- __reExport(index_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
- ...require("./Flux/Flux.types")
35
- });
36
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL0Fya2hhbUNvbnN0YW50cyc7XG5pbXBvcnQge0ZsdXgsIEZsdXhGcmFtZXdvcmt9IGZyb20gJy4vRmx1eC9GbHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9GbHV4L0ZsdXgudHlwZXMnO1xuZXhwb3J0IHtBcmtoYW1Db25zdGFudHMsIEZsdXgsIEZsdXhGcmFtZXdvcmt9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFJQSw2QkFBOEI7QUFDOUIsa0JBQWtDO0FBRWxDLDBCQUFjLDhCQVBkOyIsCiAgIm5hbWVzIjogW10KfQo=
1
+ /* ArkhamJS - Optimized Build */
2
+ import{ArkhamConstants as o}from"./constants/ArkhamConstants";import{Flux as t,FluxFramework as p}from"./Flux/Flux";export*from"./Flux/Flux.types";export{o as ArkhamConstants,t as Flux,p as FluxFramework};
3
+ /* End ArkhamJS */
4
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtBcmtoYW1Db25zdGFudHN9IGZyb20gJy4vY29uc3RhbnRzL0Fya2hhbUNvbnN0YW50cyc7XG5pbXBvcnQge0ZsdXgsIEZsdXhGcmFtZXdvcmt9IGZyb20gJy4vRmx1eC9GbHV4JztcblxuZXhwb3J0ICogZnJvbSAnLi9GbHV4L0ZsdXgudHlwZXMnO1xuZXhwb3J0IHtBcmtoYW1Db25zdGFudHMsIEZsdXgsIEZsdXhGcmFtZXdvcmt9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUlBLE9BQVEsbUJBQUFBLE1BQXNCLDhCQUM5QixPQUFRLFFBQUFDLEVBQU0saUJBQUFDLE1BQW9CLGNBRWxDLFdBQWMiLAogICJuYW1lcyI6IFsiQXJraGFtQ29uc3RhbnRzIiwgIkZsdXgiLCAiRmx1eEZyYW1ld29yayJdCn0K
package/package.json CHANGED
@@ -1,15 +1,34 @@
1
1
  {
2
2
  "name": "@nlabs/arkhamjs",
3
- "version": "3.28.8",
3
+ "version": "3.29.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
7
  "description": "Javascript Flux Library",
8
+ "type": "module",
9
+ "sideEffects": false,
8
10
  "license": "MIT",
9
11
  "main": "./index.js",
10
12
  "module": "./index.js",
11
13
  "browser": "./index.js",
12
14
  "types": "./lib/index.d.js",
15
+ "exports": {
16
+ ".": {
17
+ "import": "./index.js",
18
+ "require": "./index.js",
19
+ "types": "./lib/index.d.js"
20
+ },
21
+ "./Flux": {
22
+ "import": "./lib/Flux/Flux.js",
23
+ "require": "./lib/Flux/Flux.js",
24
+ "types": "./lib/Flux/Flux.d.ts"
25
+ },
26
+ "./constants": {
27
+ "import": "./lib/constants/ArkhamConstants.js",
28
+ "require": "./lib/constants/ArkhamConstants.js",
29
+ "types": "./lib/constants/ArkhamConstants.d.ts"
30
+ }
31
+ },
13
32
  "keywords": [
14
33
  "arkhamjs",
15
34
  "flux",
@@ -35,28 +54,25 @@
35
54
  "scripts": {
36
55
  "build": "lex compile --remove",
37
56
  "clean": "lex clean",
38
- "lint": "eslint ./src --ext .ts,.tsx",
57
+ "lint": "lex lint --fix",
39
58
  "prepublishOnly": "npm run build",
40
59
  "publish:major": "npm version major && npm publish",
41
60
  "publish:minor": "npm version minor && npm publish",
42
61
  "publish:patch": "npm version patch && npm publish",
43
62
  "pretest": "npm run lint",
44
63
  "test": "lex test",
45
- "update": "npm-check-updates --interactive"
64
+ "update": "lex update --interactive"
46
65
  },
47
66
  "dependencies": {
48
- "error-stack-parser": "^2.1.4",
49
- "events": "^3.3.0",
50
- "lodash": "^4.17.21"
67
+ "@nlabs/utils": "2.0.0",
68
+ "events": "^3.3.0"
51
69
  },
52
70
  "devDependencies": {
53
71
  "@types/events": "^3.0.3",
54
- "@types/jest": "^29.5.14",
55
- "@types/lodash": "^4.17.15",
56
- "@types/node": "^22.13.1",
57
- "eslint": "^9.19.0",
58
- "eslint-config-styleguidejs": "^3.2.1",
59
- "typescript": "^5.7.3"
72
+ "@types/jest": "^30.0.0",
73
+ "@types/node": "^24.0.10",
74
+ "esbuild": "^0.25.5",
75
+ "typescript": "^5.8.3"
60
76
  },
61
77
  "files": [
62
78
  "lib",