@nlabs/metropolisjs 1.0.8 → 1.1.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.
@@ -2,13 +2,15 @@
2
2
  * Example of handling signup errors in MetropolisJS
3
3
  */
4
4
  import {FluxFramework} from '@nlabs/arkhamjs';
5
- import type {userActions} from '../src/actions/userActions/userActions';
6
- import {USER_CONSTANTS} from '../src/stores/userStore';
7
- import {createAction} from '../src/utils/actionFactory';
5
+
6
+ import {USER_CONSTANTS} from '../src/stores/userStore.js';
7
+ import {createAction} from '../src/utils/actionFactory.js';
8
+
9
+ import type {UserActions} from '../src/actions/userActions/userActions.js';
8
10
 
9
11
  // Create a flux instance and user actions
10
12
  const flux = new FluxFramework();
11
- const userActions = createAction('user', flux) as unknown as userActions;
13
+ const userActions = createAction('user', flux) as unknown as UserActions;
12
14
 
13
15
  /**
14
16
  * Example 1: Basic error handling with try/catch
@@ -18,9 +20,9 @@ const handleAddWithTryCatch = async (userData: any) => {
18
20
  const user = await userActions.addUser(userData);
19
21
  console.log('Add successful:', user);
20
22
  return {success: true, user};
21
- } catch (error) {
23
+ } catch(error) {
22
24
  console.error('Add failed:', error.message);
23
- return {success: false, error: error.message};
25
+ return {error: error.message, success: false};
24
26
  }
25
27
  };
26
28
 
@@ -31,25 +33,25 @@ const handleSignUpWithFlux = async (userData: any) => {
31
33
  // Set up a listener for signup success
32
34
  const onSignUpSuccess = (payload: any) => {
33
35
  console.log('Signup successful:', payload.user);
34
- flux.removeListener(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
35
- flux.removeListener(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
36
+ flux.off(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
37
+ flux.off(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
36
38
  };
37
39
 
38
40
  // Set up a listener for signup error
39
41
  const onSignUpError = (payload: any) => {
40
42
  console.error('Signup failed:', payload.error.message);
41
- flux.removeListener(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
42
- flux.removeListener(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
43
+ flux.off(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
44
+ flux.off(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
43
45
  };
44
46
 
45
47
  // Add listeners
46
- flux.addListener(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
47
- flux.addListener(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
48
+ flux.on(USER_CONSTANTS.SIGN_UP_SUCCESS, onSignUpSuccess);
49
+ flux.on(USER_CONSTANTS.SIGN_UP_ERROR, onSignUpError);
48
50
 
49
51
  // Attempt signup
50
52
  try {
51
53
  await userActions.signUp(userData);
52
- } catch (error) {
54
+ } catch(error) {
53
55
  // Error is already handled by the flux listener
54
56
  // This catch is just to prevent the error from propagating
55
57
  }
@@ -62,39 +64,38 @@ const handleSignUpWithValidation = async (userData: any) => {
62
64
  // Perform custom validation
63
65
  const errors: string[] = [];
64
66
 
65
- if (!userData.email || !userData.email.includes('@')) {
67
+ if(!userData.email || !userData.email.includes('@')) {
66
68
  errors.push('Invalid email format');
67
69
  }
68
70
 
69
- if (!userData.password || userData.password.length < 8) {
71
+ if(!userData.password || userData.password.length < 8) {
70
72
  errors.push('Password must be at least 8 characters');
71
73
  }
72
74
 
73
- if (!userData.username || userData.username.length < 3) {
75
+ if(!userData.username || userData.username.length < 3) {
74
76
  errors.push('Username must be at least 3 characters');
75
77
  }
76
78
 
77
79
  // If validation fails, return errors
78
- if (errors.length > 0) {
79
- return {success: false, errors};
80
+ if(errors.length > 0) {
81
+ return {errors, success: false};
80
82
  }
81
83
 
82
84
  // If validation passes, attempt signup
83
85
  try {
84
86
  const user = await userActions.signUp(userData);
85
87
  return {success: true, user};
86
- } catch (error) {
88
+ } catch(error) {
87
89
  // Handle specific error types
88
- if (error.message.includes('already exists')) {
89
- return {success: false, errors: ['Username or email already in use']};
90
+ if(error.message.includes('already exists')) {
91
+ return {errors: ['Username or email already in use'], success: false};
90
92
  }
91
93
 
92
- return {success: false, errors: [error.message]};
94
+ return {errors: [error.message], success: false};
93
95
  }
94
96
  };
95
97
 
96
98
  // Export examples
97
99
  export {
98
- handleSignUpWithFlux, handleSignUpWithTryCatch, handleSignUpWithValidation
100
+ handleAddWithTryCatch, handleSignUpWithFlux, handleSignUpWithValidation
99
101
  };
100
-
@@ -1,244 +1,160 @@
1
1
  # MetropolisJS Factory Pattern Guide
2
2
 
3
- ## Overview
3
+ MetropolisJS exposes typed factory functions for creating action families with an ArkhamJS `FluxFramework` instance. Use a direct creator when you need one known family, `createActions()` for a selected set, or `createAllActions()` when an integration genuinely needs every family.
4
4
 
5
- MetropolisJS has been refactored to use a **factory function pattern** for actions instead of class-based approaches. This provides better functional programming practices, improved testability, and enhanced flexibility through dependency injection.
5
+ ## Create One Action Family
6
6
 
7
- ## Key Benefits
8
-
9
- 1. **Functional Programming**: Pure functions instead of classes with side effects
10
- 2. **Better Testability**: Easier to mock and test individual functions
11
- 3. **Composability**: Actions can be easily combined and extended
12
- 4. **Dependency Injection**: Custom adapters can be injected and merged with defaults
13
- 5. **Backward Compatibility**: Legacy class wrappers maintain existing API compatibility
14
-
15
- ## Basic Usage
16
-
17
- ### Before (Class-based)
7
+ Use `createAction()` when the family is selected dynamically or when you want the consolidated factory API:
18
8
 
19
9
  ```typescript
20
- import {userActions} from '../actions/userActions';
10
+ import {createAction} from '@nlabs/metropolisjs';
21
11
 
22
- const userActions = new userActions(flux);
23
- const user = await userActions.add(userData);
12
+ const userActions = createAction('user', flux);
13
+ const user = await userActions.addUser({
14
+ email: 'ada@example.com',
15
+ username: 'ada'
16
+ });
24
17
  ```
25
18
 
26
- ### After (Factory Pattern)
19
+ The factory key determines the return type. In this example, `userActions` is inferred as `UserActions`; no cast or manual type annotation is required.
20
+
21
+ Direct creators provide the same action interface:
27
22
 
28
23
  ```typescript
29
- import {createUserActions} from '../actions/userActions';
24
+ import {createUserActions} from '@nlabs/metropolisjs';
30
25
 
31
26
  const userActions = createUserActions(flux);
32
- const user = await userActions.add(userData);
27
+ const user = await userActions.itemById('user-1');
33
28
  ```
34
29
 
35
- ## Advanced Usage with Custom Adapters
30
+ ## Create a Selected Set
36
31
 
37
- ### Custom Validation Adapter
32
+ `createActions()` returns an object whose keys and values are inferred from the requested tuple:
38
33
 
39
34
  ```typescript
40
- // Custom adapter that extends default behavior
41
- const customUserAdapter = (input: unknown, options?: UserAdapterOptions) => {
42
- // input is already validated by default adapter
43
- const user = input as any;
44
-
45
- // Add business-specific validation
46
- if (user.email && !user.email.includes('@company.com')) {
47
- throw new Error('Only company emails allowed');
48
- }
35
+ import {createActions} from '@nlabs/metropolisjs';
49
36
 
50
- // Add computed fields
51
- return {
52
- ...user,
53
- fullName: `${user.firstName || ''} ${user.lastName || ''}`.trim(),
54
- isAdmin: user.userAccess >= 3
55
- };
56
- };
37
+ const actions = createActions(['user', 'post', 'message'], flux);
57
38
 
58
- const userActions = createUserActions(flux, {
59
- userAdapter: customUserAdapter
39
+ const user = await actions.user.addUser({username: 'ada'});
40
+ const post = await actions.post.add({
41
+ content: 'Hello, Metropolis!',
42
+ userId: user.userId
60
43
  });
61
- ```
62
-
63
- ### Configuration-based Adapters
64
44
 
65
- ```typescript
66
- const userActions = createUserActions(flux, {
67
- userAdapterOptions: {
68
- strict: true,
69
- environment: 'production',
70
- customValidation: (input) => {
71
- // Additional validation logic
72
- return input;
73
- }
74
- }
45
+ await actions.message.sendMessage({
46
+ content: `Created post ${post.postId}`,
47
+ recipientId: user.userId
75
48
  });
76
49
  ```
77
50
 
78
- ### Runtime Adapter Updates
51
+ Only requested keys exist on the returned type. A call such as `actions.video` is therefore a TypeScript error unless `video` was included in the input tuple.
79
52
 
80
- ```typescript
81
- const userActions = createUserActions(flux);
53
+ ## Create Every Action Family
82
54
 
83
- // Update adapter at runtime
84
- userActions.updateUserAdapter(customUserAdapter);
55
+ `createAllActions()` returns the complete `ActionMap`:
85
56
 
86
- // Update options at runtime
87
- userActions.updateUserAdapterOptions({
88
- strict: true,
89
- environment: 'production'
90
- });
91
- ```
92
-
93
- ## Available Actions
94
-
95
- All action files now export factory functions:
96
-
97
- - `createUserActions(flux, options?)` - User management
98
- - `createPostActions(flux, options?)` - Post management
99
- - `createEventActions(flux, options?)` - Event management
100
- - `createMessageActions(flux, options?)` - Messaging
101
- - `createImageActions(flux, options?)` - Image handling
102
- - `createLocationActions(flux, options?)` - Location services
103
- - `createReactionActions(flux, options?)` - Reactions
104
- - `createTagActions(flux, options?)` - Tag management
105
- - `createWebsocketActions(flux)` - WebSocket connections
106
-
107
- ## Adapter Options Interface
57
+ ```typescript
58
+ import {createAllActions} from '@nlabs/metropolisjs';
108
59
 
109
- All adapters support the same options interface:
60
+ const actions = createAllActions(flux);
110
61
 
111
- ```typescript
112
- interface AdapterOptions {
113
- strict?: boolean; // Enable strict validation
114
- allowPartial?: boolean; // Allow partial data
115
- environment?: 'development' | 'production' | 'test';
116
- customValidation?: (input: unknown) => unknown;
117
- }
62
+ const user = await actions.user.itemById('user-1');
63
+ const posts = await actions.post.listByLatest();
118
64
  ```
119
65
 
120
- ## Migration Guide
66
+ Prefer `createAction()` or `createActions()` when only a few families are needed.
67
+
68
+ ## Custom Adapters
121
69
 
122
- ### Step 1: Update Imports
70
+ Factory options let an application add validation or transformation rules while retaining the standard action interface:
123
71
 
124
72
  ```typescript
125
- // Old
126
- import {userActions} from '../actions/userActions';
73
+ import {createUserActions, type User} from '@nlabs/metropolisjs';
127
74
 
128
- // New
129
- import {createUserActions} from '../actions/userActions';
130
- ```
75
+ const companyUserAdapter = (input: unknown): User => {
76
+ const user = input as User;
131
77
 
132
- ### Step 2: Update Instantiation
78
+ if(user.email && !user.email.endsWith('@company.com')) {
79
+ throw new Error('A company email is required');
80
+ }
133
81
 
134
- ```typescript
135
- // Old
136
- const userActions = new userActions(flux, customAdapter);
82
+ return {
83
+ ...user,
84
+ isAdmin: (user.userAccess || 0) >= 3
85
+ };
86
+ };
137
87
 
138
- // New
139
88
  const userActions = createUserActions(flux, {
140
- userAdapter: customAdapter
89
+ userAdapter: companyUserAdapter,
90
+ userAdapterOptions: {
91
+ environment: 'production',
92
+ strict: true
93
+ }
141
94
  });
142
95
  ```
143
96
 
144
- ### Step 3: Update useMetropolis Hook
145
-
146
- The `useMetropolis` hook has been updated to use the factory pattern:
97
+ Adapters can also be replaced at runtime:
147
98
 
148
99
  ```typescript
149
- // Old
150
- return useMemo(() => ({
151
- userActions: new userActions(flux, UserAdapter),
152
- postActions: new PostActions(flux, PostAdapter),
153
- // ...
154
- }), [flux, UserAdapter, PostAdapter]);
155
-
156
- // New
157
- return useMemo(() => ({
158
- userActions: createUserActions(flux, {
159
- userAdapter: UserAdapter
160
- }),
161
- postActions: createPostActions(flux, {
162
- postAdapter: PostAdapter
163
- }),
164
- // ...
165
- }), [flux, UserAdapter, PostAdapter]);
100
+ userActions.updateUserAdapter(companyUserAdapter);
101
+ userActions.updateUserAdapterOptions({strict: true});
166
102
  ```
167
103
 
168
- ## Backward Compatibility
104
+ ## Request Caching
169
105
 
170
- Legacy class wrappers are provided for backward compatibility:
106
+ Read actions that accept `ActionRequestOptions` can cache responses for a number of minutes:
171
107
 
172
108
  ```typescript
173
- // Still works
174
- import {userActionsClass} from '../actions/userActions';
175
- const userActions = new userActionsClass(flux, options);
109
+ const user = await userActions.itemById(
110
+ 'user-1',
111
+ ['email', 'username'],
112
+ {cacheTimeout: 5}
113
+ );
176
114
  ```
177
115
 
178
- ## Testing Examples
116
+ Mutations clear the related request caches after successful updates.
179
117
 
180
- ### Unit Testing Actions
118
+ ## Testing
119
+
120
+ Create actions with a test Flux instance and inject adapters when a test needs to observe validation:
181
121
 
182
122
  ```typescript
183
- import {createUserActions} from '../actions/userActions';
123
+ import {createUserActions, type UserActions} from '@nlabs/metropolisjs';
184
124
 
185
- describe('userActions', () => {
186
- let flux: FluxFramework;
187
- let userActions: userActions;
125
+ describe('user actions', () => {
126
+ let userActions: UserActions;
188
127
 
189
128
  beforeEach(() => {
190
- flux = createMockFlux();
191
- userActions = createUserActions(flux);
129
+ userActions = createUserActions(createMockFlux());
192
130
  });
193
131
 
194
- it('should add user with validation', async () => {
195
- const userData = {username: 'test', email: 'test@example.com'};
196
- const result = await userActions.add(userData);
197
- expect(result).toBeDefined();
132
+ it('creates a user', async () => {
133
+ const user = await userActions.addUser({
134
+ email: 'test@example.com',
135
+ username: 'test'
136
+ });
137
+
138
+ expect(user.userId).toBeDefined();
198
139
  });
199
140
  });
200
141
  ```
201
142
 
202
- ### Testing with Custom Adapters
143
+ The complete runnable examples are in [`examples/factory-pattern-usage.ts`](./examples/factory-pattern-usage.ts).
203
144
 
204
- ```typescript
205
- const mockAdapter = jest.fn((input) => ({
206
- ...input,
207
- validated: true
208
- }));
145
+ ## Development Checks
209
146
 
210
- const userActions = createUserActions(flux, {
211
- userAdapter: mockAdapter
212
- });
147
+ Run all source, test, lint-input, and example TypeScript configurations with:
213
148
 
214
- expect(mockAdapter).toHaveBeenCalled();
149
+ ```bash
150
+ npm run typecheck
215
151
  ```
216
152
 
217
- ## Best Practices
218
-
219
- 1. **Use Factory Functions**: Prefer `createXxxActions()` over class constructors
220
- 2. **Leverage Adapter Injection**: Use custom adapters for business logic
221
- 3. **Runtime Updates**: Use update methods for dynamic behavior changes
222
- 4. **Type Safety**: Always use TypeScript interfaces for better type checking
223
- 5. **Error Handling**: Custom adapters should throw meaningful errors
224
-
225
- ## Performance Considerations
153
+ Before publishing a change, run:
226
154
 
227
- - Factory functions are lightweight and create minimal overhead
228
- - Adapter validation is only performed when needed
229
- - Options are merged efficiently without deep cloning
230
- - Legacy wrappers have minimal performance impact
231
-
232
- ## Future Enhancements
233
-
234
- The factory pattern enables future enhancements:
235
-
236
- - **Middleware Support**: Chain multiple adapters
237
- - **Plugin System**: Load adapters dynamically
238
- - **Caching**: Cache validated results
239
- - **Async Adapters**: Support async validation logic
240
- - **Schema Evolution**: Handle multiple adapter versions
241
-
242
- ## Conclusion
243
-
244
- The factory pattern provides a more functional, testable, and flexible approach to action management in MetropolisJS. While maintaining backward compatibility, it opens up new possibilities for customization and extension.
155
+ ```bash
156
+ npm run lint
157
+ npm run typecheck
158
+ npm test
159
+ npm run build
160
+ ```
@@ -1,17 +1,8 @@
1
- /**
2
- * Copyright (c) 2025-Present, Nitrogen Labs, Inc.
3
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
- */
5
1
  import type { FluxFramework } from '@nlabs/arkhamjs';
2
+ import type { TranslationInputType } from '../../adapters/translationAdapter/translationAdapter.js';
6
3
  import type { TranslationType } from '../../stores/translationStore.js';
7
- import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
8
4
  import type { ActionRequestOptions } from '../../utils/requestCache.js';
9
- export interface TranslationInputType {
10
- readonly key: string;
11
- readonly locale: string;
12
- readonly value: string;
13
- readonly namespace?: string;
14
- }
5
+ import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
15
6
  export interface TranslationActionsOptions {
16
7
  translationAdapter?: (input: unknown, options?: BaseAdapterOptions) => any;
17
8
  translationAdapterOptions?: BaseAdapterOptions;
@@ -4,8 +4,8 @@
4
4
  */ import { TRANSLATION_CONSTANTS } from '../../stores/translationStore.js';
5
5
  import { appMutation, appQuery } from '../../utils/api.js';
6
6
  import { createBaseActions } from '../../utils/baseActionFactory.js';
7
- import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
8
7
  import { initI18n, updateI18nResources } from '../../utils/i18n.js';
8
+ import { clearCachedRequest, getCachedRequest, setCachedRequest } from '../../utils/requestCache.js';
9
9
  const DATA_TYPE = 'translations';
10
10
  const defaultTranslationValidator = (input, options)=>input;
11
11
  export const createTranslationActions = (flux, options)=>{
@@ -186,4 +186,4 @@ export const createTranslationActions = (flux, options)=>{
186
186
  };
187
187
  };
188
188
 
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy90cmFuc2xhdGlvbkFjdGlvbnMvdHJhbnNsYXRpb25BY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmltcG9ydCB7VFJBTlNMQVRJT05fQ09OU1RBTlRTfSBmcm9tICcuLi8uLi9zdG9yZXMvdHJhbnNsYXRpb25TdG9yZS5qcyc7XG5pbXBvcnQge2FwcE11dGF0aW9uLCBhcHBRdWVyeX0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcbmltcG9ydCB7Y3JlYXRlQmFzZUFjdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL2Jhc2VBY3Rpb25GYWN0b3J5LmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtUcmFuc2xhdGlvblR5cGV9IGZyb20gJy4uLy4uL3N0b3Jlcy90cmFuc2xhdGlvblN0b3JlLmpzJztcbmltcG9ydCB7aW5pdEkxOG4sIHVwZGF0ZUkxOG5SZXNvdXJjZXN9IGZyb20gJy4uLy4uL3V0aWxzL2kxOG4uanMnO1xuaW1wb3J0IHR5cGUge0Jhc2VBZGFwdGVyT3B0aW9uc30gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9yRmFjdG9yeS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5cbmNvbnN0IERBVEFfVFlQRSA9ICd0cmFuc2xhdGlvbnMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uSW5wdXRUeXBlIHtcbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxvY2FsZTogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25BY3Rpb25zT3B0aW9ucyB7XG4gIHRyYW5zbGF0aW9uQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEJhc2VBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICB0cmFuc2xhdGlvbkFkYXB0ZXJPcHRpb25zPzogQmFzZUFkYXB0ZXJPcHRpb25zO1xuICBhdXRvU3luY0kxOG4/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2xhdGlvbkFwaVJlc3VsdHNUeXBlID0ge1xuICB0cmFuc2xhdGlvbnM6IHtcbiAgICBhZGRUcmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uVHlwZVtdO1xuICAgIGdldFRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25UeXBlW107XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uQWN0aW9ucyB7XG4gIGFkZFRyYW5zbGF0aW9uczogKHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25JbnB1dFR5cGVbXSwgdHJhbnNsYXRpb25Qcm9wcz86IHN0cmluZ1tdLCByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zKSA9PiBQcm9taXNlPFRyYW5zbGF0aW9uVHlwZVtdPjtcbiAgZ2V0VHJhbnNsYXRpb246IChrZXk6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcbiAgZ2V0VHJhbnNsYXRpb25zOiAoXG4gICAga2V5czogc3RyaW5nW10sXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uUHJvcHM/OiBzdHJpbmdbXSxcbiAgICByZXF1ZXN0T3B0aW9ucz86IEFjdGlvblJlcXVlc3RPcHRpb25zXG4gICkgPT4gUHJvbWlzZTxUcmFuc2xhdGlvblR5cGVbXT47XG4gIGhhc1RyYW5zbGF0aW9uOiAoa2V5OiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIHByb2Nlc3NQZW5kaW5nVHJhbnNsYXRpb25zOiAobG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZywgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9ucykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcXVldWVUcmFuc2xhdGlvbktleTogKGtleTogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBzeW5jV2l0aEkxOG46ICgpID0+IHZvaWQ7XG4gIHVwZGF0ZVRyYW5zbGF0aW9uQWRhcHRlcjogKGFkYXB0ZXI6IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEJhc2VBZGFwdGVyT3B0aW9ucykgPT4gYW55KSA9PiB2b2lkO1xuICB1cGRhdGVUcmFuc2xhdGlvbkFkYXB0ZXJPcHRpb25zOiAob3B0aW9uczogQmFzZUFkYXB0ZXJPcHRpb25zKSA9PiB2b2lkO1xufVxuXG5jb25zdCBkZWZhdWx0VHJhbnNsYXRpb25WYWxpZGF0b3IgPSAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBCYXNlQWRhcHRlck9wdGlvbnMpID0+IGlucHV0IGFzIFRyYW5zbGF0aW9uSW5wdXRUeXBlO1xuXG5leHBvcnQgY29uc3QgY3JlYXRlVHJhbnNsYXRpb25BY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zPzogVHJhbnNsYXRpb25BY3Rpb25zT3B0aW9uc1xuKTogVHJhbnNsYXRpb25BY3Rpb25zID0+IHtcbiAgY29uc3QgdHJhbnNsYXRpb25CYXNlID0gY3JlYXRlQmFzZUFjdGlvbnMoZmx1eCwgZGVmYXVsdFRyYW5zbGF0aW9uVmFsaWRhdG9yLCB7XG4gICAgLi4uKG9wdGlvbnM/LnRyYW5zbGF0aW9uQWRhcHRlciAmJiB7YWRhcHRlcjogb3B0aW9ucy50cmFuc2xhdGlvbkFkYXB0ZXJ9KSxcbiAgICAuLi4ob3B0aW9ucz8udHJhbnNsYXRpb25BZGFwdGVyT3B0aW9ucyAmJiB7YWRhcHRlck9wdGlvbnM6IG9wdGlvbnMudHJhbnNsYXRpb25BZGFwdGVyT3B0aW9uc30pXG4gIH0pO1xuXG4gIGNvbnN0IHN5bmNXaXRoSTE4biA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGZsdXguZ2V0U3RhdGUoJ3RyYW5zbGF0aW9ucycpIGFzIGFueTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBzdGF0ZS50cmFuc2xhdGlvbnMgfHwge307XG5cbiAgICBpZihPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmKCFvcHRpb25zPy5hdXRvU3luY0kxOG4pIHtcbiAgICAgICAgaW5pdEkxOG4odHJhbnNsYXRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZUkxOG5SZXNvdXJjZXModHJhbnNsYXRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYWRkVHJhbnNsYXRpb25zID0gYXN5bmMgKFxuICAgIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25JbnB1dFR5cGVbXSxcbiAgICB0cmFuc2xhdGlvblByb3BzOiBzdHJpbmdbXSA9IFtdLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8VHJhbnNsYXRpb25UeXBlW10+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIHRyYW5zbGF0aW9uczoge1xuICAgICAgICAgIHR5cGU6ICdbVHJhbnNsYXRpb25JbnB1dCFdIScsXG4gICAgICAgICAgdmFsdWU6IHRyYW5zbGF0aW9ucy5tYXAoKHQpID0+IHRyYW5zbGF0aW9uQmFzZS52YWxpZGF0b3IodCkpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBUcmFuc2xhdGlvbkFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFkZFRyYW5zbGF0aW9ucyA9IGRhdGE/LnRyYW5zbGF0aW9ucz8uYWRkVHJhbnNsYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IGFkZFRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuQUREX1RSQU5TTEFUSU9OU19TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICBpZihvcHRpb25zPy5hdXRvU3luY0kxOG4pIHtcbiAgICAgICAgICBzeW5jV2l0aEkxOG4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGF3YWl0IGFwcE11dGF0aW9uPFRyYW5zbGF0aW9uVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2FkZFRyYW5zbGF0aW9ucycsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsna2V5JywgJ2xvY2FsZScsICd2YWx1ZScsICduYW1lc3BhY2UnLCAuLi50cmFuc2xhdGlvblByb3BzXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7ZXJyb3IsIHR5cGU6IFRSQU5TTEFUSU9OX0NPTlNUQU5UUy5BRERfVFJBTlNMQVRJT05TX0VSUk9SfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgY2xlYXJDYWNoZWRSZXF1ZXN0KGZsdXgsICd0cmFuc2xhdGlvbi5nZXRUcmFuc2xhdGlvbnMnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZ2V0VHJhbnNsYXRpb24gPSAoa2V5OiBzdHJpbmcsIGxvY2FsZTogc3RyaW5nLCBuYW1lc3BhY2U/OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IGZsdXguZ2V0U3RhdGUoJ3RyYW5zbGF0aW9ucycpIGFzIGFueTtcbiAgICBjb25zdCB0cmFuc2xhdGlvbktleSA9IG5hbWVzcGFjZSA/IGAke25hbWVzcGFjZX06JHtrZXl9OiR7bG9jYWxlfWAgOiBgJHtrZXl9OiR7bG9jYWxlfWA7XG4gICAgY29uc3QgdHJhbnNsYXRpb24gPSBzdGF0ZS50cmFuc2xhdGlvbnM/Llt0cmFuc2xhdGlvbktleV07XG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uPy52YWx1ZSB8fCBudWxsO1xuICB9O1xuXG4gIGNvbnN0IGdldFRyYW5zbGF0aW9ucyA9IGFzeW5jIChcbiAgICBrZXlzOiBzdHJpbmdbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFRyYW5zbGF0aW9uVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhY2hlZFJlc3VsdCA9IGdldENhY2hlZFJlcXVlc3Q8VHJhbnNsYXRpb25UeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAndHJhbnNsYXRpb24uZ2V0VHJhbnNsYXRpb25zJyxcbiAgICAgICAge2tleXMsIGxvY2FsZSwgbmFtZXNwYWNlLCB0cmFuc2xhdGlvblByb3BzfSxcbiAgICAgICAgcmVxdWVzdE9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIGlmKGNhY2hlZFJlc3VsdCkge1xuICAgICAgICByZXR1cm4gY2FjaGVkUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBxdWVyeVZhcmlhYmxlcyA9IHtcbiAgICAgICAga2V5czoge1xuICAgICAgICAgIHR5cGU6ICdbU3RyaW5nIV0hJyxcbiAgICAgICAgICB2YWx1ZToga2V5c1xuICAgICAgICB9LFxuICAgICAgICBsb2NhbGU6IHtcbiAgICAgICAgICB0eXBlOiAnU3RyaW5nIScsXG4gICAgICAgICAgdmFsdWU6IGxvY2FsZVxuICAgICAgICB9LFxuICAgICAgICAuLi4obmFtZXNwYWNlICYmIHtcbiAgICAgICAgICBuYW1lc3BhY2U6IHtcbiAgICAgICAgICAgIHR5cGU6ICdTdHJpbmcnLFxuICAgICAgICAgICAgdmFsdWU6IG5hbWVzcGFjZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uU3VjY2VzcyA9IChkYXRhOiBUcmFuc2xhdGlvbkFwaVJlc3VsdHNUeXBlKSA9PiB7XG4gICAgICAgIGNvbnN0IGdldFRyYW5zbGF0aW9ucyA9IGRhdGE/LnRyYW5zbGF0aW9ucz8uZ2V0VHJhbnNsYXRpb25zIHx8IFtdO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBmbHV4LmRpc3BhdGNoKHtcbiAgICAgICAgICB0cmFuc2xhdGlvbnM6IGdldFRyYW5zbGF0aW9ucyxcbiAgICAgICAgICB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuR0VUX1RSQU5TTEFUSU9OU19TVUNDRVNTXG4gICAgICAgIH0pO1xuICAgICAgICBpZihvcHRpb25zPy5hdXRvU3luY0kxOG4pIHtcbiAgICAgICAgICBzeW5jV2l0aEkxOG4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBwUXVlcnk8VHJhbnNsYXRpb25UeXBlW10+KFxuICAgICAgICBmbHV4LFxuICAgICAgICAnZ2V0VHJhbnNsYXRpb25zJyxcbiAgICAgICAgREFUQV9UWVBFLFxuICAgICAgICBxdWVyeVZhcmlhYmxlcyxcbiAgICAgICAgWydrZXknLCAnbG9jYWxlJywgJ3ZhbHVlJywgJ25hbWVzcGFjZScsIC4uLnRyYW5zbGF0aW9uUHJvcHNdLFxuICAgICAgICB7b25TdWNjZXNzfVxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHNldENhY2hlZFJlcXVlc3QoZmx1eCwgJ3RyYW5zbGF0aW9uLmdldFRyYW5zbGF0aW9ucycsIHtrZXlzLCBsb2NhbGUsIG5hbWVzcGFjZSwgdHJhbnNsYXRpb25Qcm9wc30sIHJlc3VsdCwgcmVxdWVzdE9wdGlvbnMpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuR0VUX1RSQU5TTEFUSU9OU19FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGhhc1RyYW5zbGF0aW9uID0gKGtleTogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBmbHV4LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKSBhcyBhbnk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25LZXkgPSBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9OiR7a2V5fToke2xvY2FsZX1gIDogYCR7a2V5fToke2xvY2FsZX1gO1xuICAgIHJldHVybiAhIXN0YXRlLnRyYW5zbGF0aW9ucz8uW3RyYW5zbGF0aW9uS2V5XTtcbiAgfTtcblxuICBjb25zdCBxdWV1ZVRyYW5zbGF0aW9uS2V5ID0gKGtleTogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25LZXkgPSBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9OiR7a2V5fToke2xvY2FsZX1gIDogYCR7a2V5fToke2xvY2FsZX1gO1xuICAgIGZsdXguZGlzcGF0Y2goe2tleTogdHJhbnNsYXRpb25LZXksIHR5cGU6IFRSQU5TTEFUSU9OX0NPTlNUQU5UUy5RVUVVRV9UUkFOU0xBVElPTl9LRVl9KTtcbiAgfTtcblxuICBjb25zdCBwcm9jZXNzUGVuZGluZ1RyYW5zbGF0aW9ucyA9IGFzeW5jIChcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBmbHV4LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKSBhcyBhbnk7XG4gICAgY29uc3QgcGVuZGluZ0tleXMgPSBBcnJheS5mcm9tKHN0YXRlLnBlbmRpbmdLZXlzIHx8IFtdKSBhcyBzdHJpbmdbXTtcblxuICAgIGlmKHBlbmRpbmdLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZsdXguZGlzcGF0Y2goe2lzUXVldWVpbmc6IHRydWUsIHR5cGU6IFRSQU5TTEFUSU9OX0NPTlNUQU5UUy5TRVRfUVVFVUVJTkdfU1RBVEV9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBrZXlzVG9GZXRjaCA9IHBlbmRpbmdLZXlzXG4gICAgICAgIC5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHMgPSBrZXkuc3BsaXQoJzonKTtcbiAgICAgICAgICBpZihuYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDMgPyBwYXJ0c1sxXSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDIgPyBwYXJ0c1swXSA6IG51bGw7XG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgIGlmKGtleXNUb0ZldGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgZ2V0VHJhbnNsYXRpb25zKGtleXNUb0ZldGNoLCBsb2NhbGUsIG5hbWVzcGFjZSwgW10sIHJlcXVlc3RPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZmx1eC5kaXNwYXRjaCh7aXNRdWV1ZWluZzogZmFsc2UsIHR5cGU6IFRSQU5TTEFUSU9OX0NPTlNUQU5UUy5TRVRfUVVFVUVJTkdfU1RBVEV9KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBhZGRUcmFuc2xhdGlvbnMsXG4gICAgZ2V0VHJhbnNsYXRpb24sXG4gICAgZ2V0VHJhbnNsYXRpb25zLFxuICAgIGhhc1RyYW5zbGF0aW9uLFxuICAgIHByb2Nlc3NQZW5kaW5nVHJhbnNsYXRpb25zLFxuICAgIHF1ZXVlVHJhbnNsYXRpb25LZXksXG4gICAgc3luY1dpdGhJMThuLFxuICAgIHVwZGF0ZVRyYW5zbGF0aW9uQWRhcHRlcjogdHJhbnNsYXRpb25CYXNlLnVwZGF0ZUFkYXB0ZXIsXG4gICAgdXBkYXRlVHJhbnNsYXRpb25BZGFwdGVyT3B0aW9uczogdHJhbnNsYXRpb25CYXNlLnVwZGF0ZU9wdGlvbnNcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsiVFJBTlNMQVRJT05fQ09OU1RBTlRTIiwiYXBwTXV0YXRpb24iLCJhcHBRdWVyeSIsImNyZWF0ZUJhc2VBY3Rpb25zIiwiY2xlYXJDYWNoZWRSZXF1ZXN0IiwiZ2V0Q2FjaGVkUmVxdWVzdCIsInNldENhY2hlZFJlcXVlc3QiLCJpbml0STE4biIsInVwZGF0ZUkxOG5SZXNvdXJjZXMiLCJEQVRBX1RZUEUiLCJkZWZhdWx0VHJhbnNsYXRpb25WYWxpZGF0b3IiLCJpbnB1dCIsIm9wdGlvbnMiLCJjcmVhdGVUcmFuc2xhdGlvbkFjdGlvbnMiLCJmbHV4IiwidHJhbnNsYXRpb25CYXNlIiwidHJhbnNsYXRpb25BZGFwdGVyIiwiYWRhcHRlciIsInRyYW5zbGF0aW9uQWRhcHRlck9wdGlvbnMiLCJhZGFwdGVyT3B0aW9ucyIsInN5bmNXaXRoSTE4biIsInN0YXRlIiwiZ2V0U3RhdGUiLCJ0cmFuc2xhdGlvbnMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwiYXV0b1N5bmNJMThuIiwiYWRkVHJhbnNsYXRpb25zIiwidHJhbnNsYXRpb25Qcm9wcyIsInJlcXVlc3RPcHRpb25zIiwicXVlcnlWYXJpYWJsZXMiLCJ0eXBlIiwidmFsdWUiLCJtYXAiLCJ0IiwidmFsaWRhdG9yIiwib25TdWNjZXNzIiwiZGF0YSIsInJlc3VsdCIsImRpc3BhdGNoIiwiQUREX1RSQU5TTEFUSU9OU19TVUNDRVNTIiwiZXJyb3IiLCJBRERfVFJBTlNMQVRJT05TX0VSUk9SIiwiZ2V0VHJhbnNsYXRpb24iLCJrZXkiLCJsb2NhbGUiLCJuYW1lc3BhY2UiLCJ0cmFuc2xhdGlvbktleSIsInRyYW5zbGF0aW9uIiwiZ2V0VHJhbnNsYXRpb25zIiwiY2FjaGVkUmVzdWx0IiwiR0VUX1RSQU5TTEFUSU9OU19TVUNDRVNTIiwiR0VUX1RSQU5TTEFUSU9OU19FUlJPUiIsImhhc1RyYW5zbGF0aW9uIiwicXVldWVUcmFuc2xhdGlvbktleSIsIlFVRVVFX1RSQU5TTEFUSU9OX0tFWSIsInByb2Nlc3NQZW5kaW5nVHJhbnNsYXRpb25zIiwicGVuZGluZ0tleXMiLCJBcnJheSIsImZyb20iLCJpc1F1ZXVlaW5nIiwiU0VUX1FVRVVFSU5HX1NUQVRFIiwia2V5c1RvRmV0Y2giLCJwYXJ0cyIsInNwbGl0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInVwZGF0ZVRyYW5zbGF0aW9uQWRhcHRlciIsInVwZGF0ZUFkYXB0ZXIiLCJ1cGRhdGVUcmFuc2xhdGlvbkFkYXB0ZXJPcHRpb25zIiwidXBkYXRlT3B0aW9ucyJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBRUQsU0FBUUEscUJBQXFCLFFBQU8sbUNB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
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy90cmFuc2xhdGlvbkFjdGlvbnMvdHJhbnNsYXRpb25BY3Rpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge1RSQU5TTEFUSU9OX0NPTlNUQU5UU30gZnJvbSAnLi4vLi4vc3RvcmVzL3RyYW5zbGF0aW9uU3RvcmUuanMnO1xuaW1wb3J0IHthcHBNdXRhdGlvbiwgYXBwUXVlcnl9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS5qcyc7XG5pbXBvcnQge2NyZWF0ZUJhc2VBY3Rpb25zfSBmcm9tICcuLi8uLi91dGlscy9iYXNlQWN0aW9uRmFjdG9yeS5qcyc7XG5pbXBvcnQge2luaXRJMThuLCB1cGRhdGVJMThuUmVzb3VyY2VzfSBmcm9tICcuLi8uLi91dGlscy9pMThuLmpzJztcbmltcG9ydCB7Y2xlYXJDYWNoZWRSZXF1ZXN0LCBnZXRDYWNoZWRSZXF1ZXN0LCBzZXRDYWNoZWRSZXF1ZXN0fSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0Q2FjaGUuanMnO1xuXG5pbXBvcnQgdHlwZSB7Rmx1eEZyYW1ld29ya30gZnJvbSAnQG5sYWJzL2Fya2hhbWpzJztcbmltcG9ydCB0eXBlIHtUcmFuc2xhdGlvbklucHV0VHlwZX0gZnJvbSAnLi4vLi4vYWRhcHRlcnMvdHJhbnNsYXRpb25BZGFwdGVyL3RyYW5zbGF0aW9uQWRhcHRlci5qcyc7XG5pbXBvcnQgdHlwZSB7VHJhbnNsYXRpb25UeXBlfSBmcm9tICcuLi8uLi9zdG9yZXMvdHJhbnNsYXRpb25TdG9yZS5qcyc7XG5pbXBvcnQgdHlwZSB7QWN0aW9uUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3RDYWNoZS5qcyc7XG5pbXBvcnQgdHlwZSB7QmFzZUFkYXB0ZXJPcHRpb25zfSBmcm9tICcuLi8uLi91dGlscy92YWxpZGF0b3JGYWN0b3J5LmpzJztcblxuY29uc3QgREFUQV9UWVBFID0gJ3RyYW5zbGF0aW9ucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNsYXRpb25BY3Rpb25zT3B0aW9ucyB7XG4gIHRyYW5zbGF0aW9uQWRhcHRlcj86IChpbnB1dDogdW5rbm93biwgb3B0aW9ucz86IEJhc2VBZGFwdGVyT3B0aW9ucykgPT4gYW55O1xuICB0cmFuc2xhdGlvbkFkYXB0ZXJPcHRpb25zPzogQmFzZUFkYXB0ZXJPcHRpb25zO1xuICBhdXRvU3luY0kxOG4/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2xhdGlvbkFwaVJlc3VsdHNUeXBlID0ge1xuICB0cmFuc2xhdGlvbnM6IHtcbiAgICBhZGRUcmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uVHlwZVtdO1xuICAgIGdldFRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25UeXBlW107XG4gIH07XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbGF0aW9uQWN0aW9ucyB7XG4gIGFkZFRyYW5zbGF0aW9uczogKFxuICAgIHRyYW5zbGF0aW9uczogVHJhbnNsYXRpb25JbnB1dFR5cGVbXSxcbiAgICB0cmFuc2xhdGlvblByb3BzPzogc3RyaW5nW10sXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8VHJhbnNsYXRpb25UeXBlW10+O1xuICBnZXRUcmFuc2xhdGlvbjogKGtleTogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRUcmFuc2xhdGlvbnM6IChcbiAgICBrZXlzOiBzdHJpbmdbXSxcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICAgdHJhbnNsYXRpb25Qcm9wcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RPcHRpb25zPzogQWN0aW9uUmVxdWVzdE9wdGlvbnNcbiAgKSA9PiBQcm9taXNlPFRyYW5zbGF0aW9uVHlwZVtdPjtcbiAgaGFzVHJhbnNsYXRpb246IChrZXk6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZykgPT4gYm9vbGVhbjtcbiAgcHJvY2Vzc1BlbmRpbmdUcmFuc2xhdGlvbnM6IChcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmcsXG4gICAgcmVxdWVzdE9wdGlvbnM/OiBBY3Rpb25SZXF1ZXN0T3B0aW9uc1xuICApID0+IFByb21pc2U8dm9pZD47XG4gIHF1ZXVlVHJhbnNsYXRpb25LZXk6IChrZXk6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgc3luY1dpdGhJMThuOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVUcmFuc2xhdGlvbkFkYXB0ZXI6IChhZGFwdGVyOiAoaW5wdXQ6IHVua25vd24sIG9wdGlvbnM/OiBCYXNlQWRhcHRlck9wdGlvbnMpID0+IGFueSkgPT4gdm9pZDtcbiAgdXBkYXRlVHJhbnNsYXRpb25BZGFwdGVyT3B0aW9uczogKG9wdGlvbnM6IEJhc2VBZGFwdGVyT3B0aW9ucykgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFRyYW5zbGF0aW9uVmFsaWRhdG9yID0gKGlucHV0OiB1bmtub3duLCBvcHRpb25zPzogQmFzZUFkYXB0ZXJPcHRpb25zKSA9PiBpbnB1dCBhcyBUcmFuc2xhdGlvbklucHV0VHlwZTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVRyYW5zbGF0aW9uQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9ucz86IFRyYW5zbGF0aW9uQWN0aW9uc09wdGlvbnNcbik6IFRyYW5zbGF0aW9uQWN0aW9ucyA9PiB7XG4gIGNvbnN0IHRyYW5zbGF0aW9uQmFzZSA9IGNyZWF0ZUJhc2VBY3Rpb25zKGZsdXgsIGRlZmF1bHRUcmFuc2xhdGlvblZhbGlkYXRvciwge1xuICAgIC4uLihvcHRpb25zPy50cmFuc2xhdGlvbkFkYXB0ZXIgJiYge2FkYXB0ZXI6IG9wdGlvbnMudHJhbnNsYXRpb25BZGFwdGVyfSksXG4gICAgLi4uKG9wdGlvbnM/LnRyYW5zbGF0aW9uQWRhcHRlck9wdGlvbnMgJiYge2FkYXB0ZXJPcHRpb25zOiBvcHRpb25zLnRyYW5zbGF0aW9uQWRhcHRlck9wdGlvbnN9KVxuICB9KTtcblxuICBjb25zdCBzeW5jV2l0aEkxOG4gPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBmbHV4LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKSBhcyBhbnk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gc3RhdGUudHJhbnNsYXRpb25zIHx8IHt9O1xuXG4gICAgaWYoT2JqZWN0LmtleXModHJhbnNsYXRpb25zKS5sZW5ndGggPiAwKSB7XG4gICAgICBpZighb3B0aW9ucz8uYXV0b1N5bmNJMThuKSB7XG4gICAgICAgIGluaXRJMThuKHRyYW5zbGF0aW9ucyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1cGRhdGVJMThuUmVzb3VyY2VzKHRyYW5zbGF0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFkZFRyYW5zbGF0aW9ucyA9IGFzeW5jIChcbiAgICB0cmFuc2xhdGlvbnM6IFRyYW5zbGF0aW9uSW5wdXRUeXBlW10sXG4gICAgdHJhbnNsYXRpb25Qcm9wczogc3RyaW5nW10gPSBbXSxcbiAgICByZXF1ZXN0T3B0aW9uczogQWN0aW9uUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBQcm9taXNlPFRyYW5zbGF0aW9uVHlwZVtdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHF1ZXJ5VmFyaWFibGVzID0ge1xuICAgICAgICB0cmFuc2xhdGlvbnM6IHtcbiAgICAgICAgICB0eXBlOiAnW1RyYW5zbGF0aW9uSW5wdXQhXSEnLFxuICAgICAgICAgIHZhbHVlOiB0cmFuc2xhdGlvbnMubWFwKCh0KSA9PiB0cmFuc2xhdGlvbkJhc2UudmFsaWRhdG9yKHQpKVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVHJhbnNsYXRpb25BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBhZGRUcmFuc2xhdGlvbnMgPSBkYXRhPy50cmFuc2xhdGlvbnM/LmFkZFRyYW5zbGF0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgdHJhbnNsYXRpb25zOiBhZGRUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgdHlwZTogVFJBTlNMQVRJT05fQ09OU1RBTlRTLkFERF9UUkFOU0xBVElPTlNfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgaWYob3B0aW9ucz8uYXV0b1N5bmNJMThuKSB7XG4gICAgICAgICAgc3luY1dpdGhJMThuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBhd2FpdCBhcHBNdXRhdGlvbjxUcmFuc2xhdGlvblR5cGVbXT4oXG4gICAgICAgIGZsdXgsXG4gICAgICAgICdhZGRUcmFuc2xhdGlvbnMnLFxuICAgICAgICBEQVRBX1RZUEUsXG4gICAgICAgIHF1ZXJ5VmFyaWFibGVzLFxuICAgICAgICBbJ2tleScsICdsb2NhbGUnLCAndmFsdWUnLCAnbmFtZXNwYWNlJywgLi4udHJhbnNsYXRpb25Qcm9wc10sXG4gICAgICAgIHtvblN1Y2Nlc3N9XG4gICAgICApO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2Vycm9yLCB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuQUREX1RSQU5TTEFUSU9OU19FUlJPUn0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IGNsZWFyQ2FjaGVkUmVxdWVzdChmbHV4LCAndHJhbnNsYXRpb24uZ2V0VHJhbnNsYXRpb25zJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGdldFRyYW5zbGF0aW9uID0gKGtleTogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgbmFtZXNwYWNlPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBmbHV4LmdldFN0YXRlKCd0cmFuc2xhdGlvbnMnKSBhcyBhbnk7XG4gICAgY29uc3QgdHJhbnNsYXRpb25LZXkgPSBuYW1lc3BhY2UgPyBgJHtuYW1lc3BhY2V9OiR7a2V5fToke2xvY2FsZX1gIDogYCR7a2V5fToke2xvY2FsZX1gO1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gc3RhdGUudHJhbnNsYXRpb25zPy5bdHJhbnNsYXRpb25LZXldO1xuICAgIHJldHVybiB0cmFuc2xhdGlvbj8udmFsdWUgfHwgbnVsbDtcbiAgfTtcblxuICBjb25zdCBnZXRUcmFuc2xhdGlvbnMgPSBhc3luYyAoXG4gICAga2V5czogc3RyaW5nW10sXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uUHJvcHM6IHN0cmluZ1tdID0gW10sXG4gICAgcmVxdWVzdE9wdGlvbnM6IEFjdGlvblJlcXVlc3RPcHRpb25zID0ge31cbiAgKTogUHJvbWlzZTxUcmFuc2xhdGlvblR5cGVbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZWRSZXN1bHQgPSBnZXRDYWNoZWRSZXF1ZXN0PFRyYW5zbGF0aW9uVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ3RyYW5zbGF0aW9uLmdldFRyYW5zbGF0aW9ucycsXG4gICAgICAgIHtrZXlzLCBsb2NhbGUsIG5hbWVzcGFjZSwgdHJhbnNsYXRpb25Qcm9wc30sXG4gICAgICAgIHJlcXVlc3RPcHRpb25zXG4gICAgICApO1xuXG4gICAgICBpZihjYWNoZWRSZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcXVlcnlWYXJpYWJsZXMgPSB7XG4gICAgICAgIGtleXM6IHtcbiAgICAgICAgICB0eXBlOiAnW1N0cmluZyFdIScsXG4gICAgICAgICAgdmFsdWU6IGtleXNcbiAgICAgICAgfSxcbiAgICAgICAgbG9jYWxlOiB7XG4gICAgICAgICAgdHlwZTogJ1N0cmluZyEnLFxuICAgICAgICAgIHZhbHVlOiBsb2NhbGVcbiAgICAgICAgfSxcbiAgICAgICAgLi4uKG5hbWVzcGFjZSAmJiB7XG4gICAgICAgICAgbmFtZXNwYWNlOiB7XG4gICAgICAgICAgICB0eXBlOiAnU3RyaW5nJyxcbiAgICAgICAgICAgIHZhbHVlOiBuYW1lc3BhY2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvblN1Y2Nlc3MgPSAoZGF0YTogVHJhbnNsYXRpb25BcGlSZXN1bHRzVHlwZSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRUcmFuc2xhdGlvbnMgPSBkYXRhPy50cmFuc2xhdGlvbnM/LmdldFRyYW5zbGF0aW9ucyB8fCBbXTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZmx1eC5kaXNwYXRjaCh7XG4gICAgICAgICAgdHJhbnNsYXRpb25zOiBnZXRUcmFuc2xhdGlvbnMsXG4gICAgICAgICAgdHlwZTogVFJBTlNMQVRJT05fQ09OU1RBTlRTLkdFVF9UUkFOU0xBVElPTlNfU1VDQ0VTU1xuICAgICAgICB9KTtcbiAgICAgICAgaWYob3B0aW9ucz8uYXV0b1N5bmNJMThuKSB7XG4gICAgICAgICAgc3luY1dpdGhJMThuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFwcFF1ZXJ5PFRyYW5zbGF0aW9uVHlwZVtdPihcbiAgICAgICAgZmx1eCxcbiAgICAgICAgJ2dldFRyYW5zbGF0aW9ucycsXG4gICAgICAgIERBVEFfVFlQRSxcbiAgICAgICAgcXVlcnlWYXJpYWJsZXMsXG4gICAgICAgIFsna2V5JywgJ2xvY2FsZScsICd2YWx1ZScsICduYW1lc3BhY2UnLCAuLi50cmFuc2xhdGlvblByb3BzXSxcbiAgICAgICAge29uU3VjY2Vzc31cbiAgICAgICk7XG5cbiAgICAgIHJldHVybiBhd2FpdCBzZXRDYWNoZWRSZXF1ZXN0KGZsdXgsICd0cmFuc2xhdGlvbi5nZXRUcmFuc2xhdGlvbnMnLCB7a2V5cywgbG9jYWxlLCBuYW1lc3BhY2UsIHRyYW5zbGF0aW9uUHJvcHN9LCByZXN1bHQsIHJlcXVlc3RPcHRpb25zKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBmbHV4LmRpc3BhdGNoKHtlcnJvciwgdHlwZTogVFJBTlNMQVRJT05fQ09OU1RBTlRTLkdFVF9UUkFOU0xBVElPTlNfRVJST1J9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBoYXNUcmFuc2xhdGlvbiA9IChrZXk6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZmx1eC5nZXRTdGF0ZSgndHJhbnNsYXRpb25zJykgYXMgYW55O1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5ID0gbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfToke2tleX06JHtsb2NhbGV9YCA6IGAke2tleX06JHtsb2NhbGV9YDtcbiAgICByZXR1cm4gISFzdGF0ZS50cmFuc2xhdGlvbnM/Llt0cmFuc2xhdGlvbktleV07XG4gIH07XG5cbiAgY29uc3QgcXVldWVUcmFuc2xhdGlvbktleSA9IChrZXk6IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIG5hbWVzcGFjZT86IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uS2V5ID0gbmFtZXNwYWNlID8gYCR7bmFtZXNwYWNlfToke2tleX06JHtsb2NhbGV9YCA6IGAke2tleX06JHtsb2NhbGV9YDtcbiAgICBmbHV4LmRpc3BhdGNoKHtrZXk6IHRyYW5zbGF0aW9uS2V5LCB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuUVVFVUVfVFJBTlNMQVRJT05fS0VZfSk7XG4gIH07XG5cbiAgY29uc3QgcHJvY2Vzc1BlbmRpbmdUcmFuc2xhdGlvbnMgPSBhc3luYyAoXG4gICAgbG9jYWxlOiBzdHJpbmcsXG4gICAgbmFtZXNwYWNlPzogc3RyaW5nLFxuICAgIHJlcXVlc3RPcHRpb25zOiBBY3Rpb25SZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGNvbnN0IHN0YXRlID0gZmx1eC5nZXRTdGF0ZSgndHJhbnNsYXRpb25zJykgYXMgYW55O1xuICAgIGNvbnN0IHBlbmRpbmdLZXlzID0gQXJyYXkuZnJvbShzdGF0ZS5wZW5kaW5nS2V5cyB8fCBbXSkgYXMgc3RyaW5nW107XG5cbiAgICBpZihwZW5kaW5nS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmbHV4LmRpc3BhdGNoKHtpc1F1ZXVlaW5nOiB0cnVlLCB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuU0VUX1FVRVVFSU5HX1NUQVRFfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qga2V5c1RvRmV0Y2ggPSBwZW5kaW5nS2V5c1xuICAgICAgICAubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0ga2V5LnNwbGl0KCc6Jyk7XG4gICAgICAgICAgaWYobmFtZXNwYWNlKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAzID8gcGFydHNbMV0gOiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAyID8gcGFydHNbMF0gOiBudWxsO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICBpZihrZXlzVG9GZXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IGdldFRyYW5zbGF0aW9ucyhrZXlzVG9GZXRjaCwgbG9jYWxlLCBuYW1lc3BhY2UsIFtdLCByZXF1ZXN0T3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGZsdXguZGlzcGF0Y2goe2lzUXVldWVpbmc6IGZhbHNlLCB0eXBlOiBUUkFOU0xBVElPTl9DT05TVEFOVFMuU0VUX1FVRVVFSU5HX1NUQVRFfSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgYWRkVHJhbnNsYXRpb25zLFxuICAgIGdldFRyYW5zbGF0aW9uLFxuICAgIGdldFRyYW5zbGF0aW9ucyxcbiAgICBoYXNUcmFuc2xhdGlvbixcbiAgICBwcm9jZXNzUGVuZGluZ1RyYW5zbGF0aW9ucyxcbiAgICBxdWV1ZVRyYW5zbGF0aW9uS2V5LFxuICAgIHN5bmNXaXRoSTE4bixcbiAgICB1cGRhdGVUcmFuc2xhdGlvbkFkYXB0ZXI6IHRyYW5zbGF0aW9uQmFzZS51cGRhdGVBZGFwdGVyLFxuICAgIHVwZGF0ZVRyYW5zbGF0aW9uQWRhcHRlck9wdGlvbnM6IHRyYW5zbGF0aW9uQmFzZS51cGRhdGVPcHRpb25zXG4gIH07XG59O1xuIl0sIm5hbWVzIjpbIlRSQU5TTEFUSU9OX0NPTlNUQU5UUyIsImFwcE11dGF0aW9uIiwiYXBwUXVlcnkiLCJjcmVhdGVCYXNlQWN0aW9ucyIsImluaXRJMThuIiwidXBkYXRlSTE4blJlc291cmNlcyIsImNsZWFyQ2FjaGVkUmVxdWVzdCIsImdldENhY2hlZFJlcXVlc3QiLCJzZXRDYWNoZWRSZXF1ZXN0IiwiREFUQV9UWVBFIiwiZGVmYXVsdFRyYW5zbGF0aW9uVmFsaWRhdG9yIiwiaW5wdXQiLCJvcHRpb25zIiwiY3JlYXRlVHJhbnNsYXRpb25BY3Rpb25zIiwiZmx1eCIsInRyYW5zbGF0aW9uQmFzZSIsInRyYW5zbGF0aW9uQWRhcHRlciIsImFkYXB0ZXIiLCJ0cmFuc2xhdGlvbkFkYXB0ZXJPcHRpb25zIiwiYWRhcHRlck9wdGlvbnMiLCJzeW5jV2l0aEkxOG4iLCJzdGF0ZSIsImdldFN0YXRlIiwidHJhbnNsYXRpb25zIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImF1dG9TeW5jSTE4biIsImFkZFRyYW5zbGF0aW9ucyIsInRyYW5zbGF0aW9uUHJvcHMiLCJyZXF1ZXN0T3B0aW9ucyIsInF1ZXJ5VmFyaWFibGVzIiwidHlwZSIsInZhbHVlIiwibWFwIiwidCIsInZhbGlkYXRvciIsIm9uU3VjY2VzcyIsImRhdGEiLCJyZXN1bHQiLCJkaXNwYXRjaCIsIkFERF9UUkFOU0xBVElPTlNfU1VDQ0VTUyIsImVycm9yIiwiQUREX1RSQU5TTEFUSU9OU19FUlJPUiIsImdldFRyYW5zbGF0aW9uIiwia2V5IiwibG9jYWxlIiwibmFtZXNwYWNlIiwidHJhbnNsYXRpb25LZXkiLCJ0cmFuc2xhdGlvbiIsImdldFRyYW5zbGF0aW9ucyIsImNhY2hlZFJlc3VsdCIsIkdFVF9UUkFOU0xBVElPTlNfU1VDQ0VTUyIsIkdFVF9UUkFOU0xBVElPTlNfRVJST1IiLCJoYXNUcmFuc2xhdGlvbiIsInF1ZXVlVHJhbnNsYXRpb25LZXkiLCJRVUVVRV9UUkFOU0xBVElPTl9LRVkiLCJwcm9jZXNzUGVuZGluZ1RyYW5zbGF0aW9ucyIsInBlbmRpbmdLZXlzIiwiQXJyYXkiLCJmcm9tIiwiaXNRdWV1ZWluZyIsIlNFVF9RVUVVRUlOR19TVEFURSIsImtleXNUb0ZldGNoIiwicGFydHMiLCJzcGxpdCIsImZpbHRlciIsIkJvb2xlYW4iLCJ1cGRhdGVUcmFuc2xhdGlvbkFkYXB0ZXIiLCJ1cGRhdGVBZGFwdGVyIiwidXBkYXRlVHJhbnNsYXRpb25BZGFwdGVyT3B0aW9ucyIsInVwZGF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLHFCQUFxQixRQUFPLG1DQUFtQztBQUN2RSxTQUFRQyxXQUFX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
@@ -1,8 +1,8 @@
1
1
  import type { FluxFramework } from '@nlabs/arkhamjs';
2
2
  import type { User } from '../../adapters/userAdapter/userAdapter.js';
3
3
  import type { SessionType } from '../../utils/api.js';
4
- import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
5
4
  import type { ActionRequestOptions } from '../../utils/requestCache.js';
5
+ import type { BaseAdapterOptions } from '../../utils/validatorFactory.js';
6
6
  export type UserAdapterOptions = BaseAdapterOptions;
7
7
  export interface UserActionsOptions {
8
8
  readonly userAdapter?: (input: unknown, options?: UserAdapterOptions) => any;
@@ -28,6 +28,8 @@ export interface UserApiResultsType {
28
28
  readonly activeCount?: number;
29
29
  readonly addUser?: Partial<User>;
30
30
  readonly confirmCode?: boolean;
31
+ readonly completeBillingSetupSession?: Partial<User>;
32
+ readonly createBillingSetupSession?: string;
31
33
  readonly deactivate?: Partial<User>;
32
34
  readonly forgotPassword?: boolean;
33
35
  readonly itemById?: Partial<User>;
@@ -46,7 +48,6 @@ export interface UserApiResultsType {
46
48
  readonly refreshSession?: SessionType;
47
49
  readonly remove?: Partial<User>;
48
50
  readonly resetPassword?: boolean;
49
- readonly saveBillingCard?: Partial<User>;
50
51
  readonly sendVerificationEmail?: boolean;
51
52
  readonly session?: Partial<User>;
52
53
  readonly signIn?: Partial<User>;
@@ -57,13 +58,15 @@ export interface UserApiResultsType {
57
58
  readonly updatePlan?: Partial<User>;
58
59
  };
59
60
  }
60
- export interface userActions {
61
+ export interface UserActions {
61
62
  addUser: (userInput: Partial<User>, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User>;
62
63
  confirmCode: (code: number, { type, value }: {
63
64
  type: 'email' | 'phone';
64
65
  value: string;
65
66
  }, requestOptions?: ActionRequestOptions) => Promise<boolean>;
66
67
  confirmSignUp: (code: string, type: 'email' | 'phone', requestOptions?: ActionRequestOptions) => Promise<boolean>;
68
+ completeBillingSetupSession: (sessionId: string, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User>;
69
+ createBillingSetupSession: (returnUrl: string, requestOptions?: ActionRequestOptions) => Promise<string>;
67
70
  currentAuthenticatedUser: (requestOptions?: ActionRequestOptions) => Promise<User>;
68
71
  list: (userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User[]>;
69
72
  listByConnection: (userId: string, from?: number, to?: number, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User[]>;
@@ -83,7 +86,6 @@ export interface userActions {
83
86
  search: (query: string, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User[]>;
84
87
  sendVerificationEmail: (email: string, emailOptions?: VerificationEmailOptions, requestOptions?: ActionRequestOptions) => Promise<boolean>;
85
88
  session: (userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User>;
86
- saveBillingCard: (card: Record<string, unknown>, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User>;
87
89
  signIn: (user: Partial<User>, expires?: number, requestOptions?: ActionRequestOptions) => Promise<SessionType>;
88
90
  signOut: (requestOptions?: ActionRequestOptions) => Promise<boolean>;
89
91
  signUp: (userInput: Partial<User>, userProps?: string[], requestOptions?: ActionRequestOptions) => Promise<User>;
@@ -93,4 +95,4 @@ export interface userActions {
93
95
  updateUserAdapter: (adapter: (input: unknown, options?: UserAdapterOptions) => any) => void;
94
96
  updateUserAdapterOptions: (options: UserAdapterOptions) => void;
95
97
  }
96
- export declare const createUserActions: (flux: FluxFramework, options?: UserActionsOptions) => userActions;
98
+ export declare const createUserActions: (flux: FluxFramework, options?: UserActionsOptions) => UserActions;