@nlabs/metropolisjs 1.0.7 → 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.
- package/CHANGELOG.md +7 -0
- package/README.md +128 -42
- package/docs/ACTIONS.md +116 -3
- package/docs/assets/metropolisjs-logo.png +0 -0
- package/docs/assets/metropolisjs-mark.svg +7 -0
- package/examples/crud-usage.tsx +1 -1
- package/examples/factory-pattern-usage.ts +85 -78
- package/examples/signup-error-handling.ts +25 -24
- package/factoryPatternGuide.md +90 -174
- package/lib/actions/awsRumActions/awsRumActions.d.ts +8 -1
- package/lib/actions/awsRumActions/awsRumActions.js +9 -5
- package/lib/actions/translationActions/translationActions.d.ts +2 -11
- package/lib/actions/translationActions/translationActions.js +2 -2
- package/lib/actions/userActions/userActions.d.ts +7 -5
- package/lib/actions/userActions/userActions.js +111 -64
- package/lib/index.d.ts +4 -9
- package/lib/index.js +19 -10
- package/lib/stores/tagStore.d.ts +1 -0
- package/lib/stores/tagStore.js +1 -1
- package/lib/stores/userStore.d.ts +1 -0
- package/lib/stores/userStore.js +2 -1
- package/lib/utils/actionFactory.d.ts +52 -6
- package/lib/utils/actionFactory.js +8 -6
- package/lib/utils/api.d.ts +7 -0
- package/lib/utils/api.js +18 -1
- package/lib/utils/baseActionFactory.d.ts +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/session.d.ts +1 -1
- package/package.json +16 -14
- package/tsconfig.examples.json +23 -0
package/factoryPatternGuide.md
CHANGED
|
@@ -1,244 +1,160 @@
|
|
|
1
1
|
# MetropolisJS Factory Pattern Guide
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
5
|
+
## Create One Action Family
|
|
6
6
|
|
|
7
|
-
|
|
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 {
|
|
10
|
+
import {createAction} from '@nlabs/metropolisjs';
|
|
21
11
|
|
|
22
|
-
const userActions =
|
|
23
|
-
const user = await userActions.
|
|
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
|
-
|
|
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 '
|
|
24
|
+
import {createUserActions} from '@nlabs/metropolisjs';
|
|
30
25
|
|
|
31
26
|
const userActions = createUserActions(flux);
|
|
32
|
-
const user = await userActions.
|
|
27
|
+
const user = await userActions.itemById('user-1');
|
|
33
28
|
```
|
|
34
29
|
|
|
35
|
-
##
|
|
30
|
+
## Create a Selected Set
|
|
36
31
|
|
|
37
|
-
|
|
32
|
+
`createActions()` returns an object whose keys and values are inferred from the requested tuple:
|
|
38
33
|
|
|
39
34
|
```typescript
|
|
40
|
-
|
|
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
|
-
|
|
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
|
|
59
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
-
const userActions = createUserActions(flux);
|
|
53
|
+
## Create Every Action Family
|
|
82
54
|
|
|
83
|
-
|
|
84
|
-
userActions.updateUserAdapter(customUserAdapter);
|
|
55
|
+
`createAllActions()` returns the complete `ActionMap`:
|
|
85
56
|
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
60
|
+
const actions = createAllActions(flux);
|
|
110
61
|
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
66
|
+
Prefer `createAction()` or `createActions()` when only a few families are needed.
|
|
67
|
+
|
|
68
|
+
## Custom Adapters
|
|
121
69
|
|
|
122
|
-
|
|
70
|
+
Factory options let an application add validation or transformation rules while retaining the standard action interface:
|
|
123
71
|
|
|
124
72
|
```typescript
|
|
125
|
-
|
|
126
|
-
import {userActions} from '../actions/userActions';
|
|
73
|
+
import {createUserActions, type User} from '@nlabs/metropolisjs';
|
|
127
74
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
```
|
|
75
|
+
const companyUserAdapter = (input: unknown): User => {
|
|
76
|
+
const user = input as User;
|
|
131
77
|
|
|
132
|
-
|
|
78
|
+
if(user.email && !user.email.endsWith('@company.com')) {
|
|
79
|
+
throw new Error('A company email is required');
|
|
80
|
+
}
|
|
133
81
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
82
|
+
return {
|
|
83
|
+
...user,
|
|
84
|
+
isAdmin: (user.userAccess || 0) >= 3
|
|
85
|
+
};
|
|
86
|
+
};
|
|
137
87
|
|
|
138
|
-
// New
|
|
139
88
|
const userActions = createUserActions(flux, {
|
|
140
|
-
userAdapter:
|
|
89
|
+
userAdapter: companyUserAdapter,
|
|
90
|
+
userAdapterOptions: {
|
|
91
|
+
environment: 'production',
|
|
92
|
+
strict: true
|
|
93
|
+
}
|
|
141
94
|
});
|
|
142
95
|
```
|
|
143
96
|
|
|
144
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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
|
-
##
|
|
104
|
+
## Request Caching
|
|
169
105
|
|
|
170
|
-
|
|
106
|
+
Read actions that accept `ActionRequestOptions` can cache responses for a number of minutes:
|
|
171
107
|
|
|
172
108
|
```typescript
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
109
|
+
const user = await userActions.itemById(
|
|
110
|
+
'user-1',
|
|
111
|
+
['email', 'username'],
|
|
112
|
+
{cacheTimeout: 5}
|
|
113
|
+
);
|
|
176
114
|
```
|
|
177
115
|
|
|
178
|
-
|
|
116
|
+
Mutations clear the related request caches after successful updates.
|
|
179
117
|
|
|
180
|
-
|
|
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 '
|
|
123
|
+
import {createUserActions, type UserActions} from '@nlabs/metropolisjs';
|
|
184
124
|
|
|
185
|
-
describe('
|
|
186
|
-
let
|
|
187
|
-
let userActions: userActions;
|
|
125
|
+
describe('user actions', () => {
|
|
126
|
+
let userActions: UserActions;
|
|
188
127
|
|
|
189
128
|
beforeEach(() => {
|
|
190
|
-
|
|
191
|
-
userActions = createUserActions(flux);
|
|
129
|
+
userActions = createUserActions(createMockFlux());
|
|
192
130
|
});
|
|
193
131
|
|
|
194
|
-
it('
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
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
|
-
|
|
143
|
+
The complete runnable examples are in [`examples/factory-pattern-usage.ts`](./examples/factory-pattern-usage.ts).
|
|
203
144
|
|
|
204
|
-
|
|
205
|
-
const mockAdapter = jest.fn((input) => ({
|
|
206
|
-
...input,
|
|
207
|
-
validated: true
|
|
208
|
-
}));
|
|
145
|
+
## Development Checks
|
|
209
146
|
|
|
210
|
-
|
|
211
|
-
userAdapter: mockAdapter
|
|
212
|
-
});
|
|
147
|
+
Run all source, test, lint-input, and example TypeScript configurations with:
|
|
213
148
|
|
|
214
|
-
|
|
149
|
+
```bash
|
|
150
|
+
npm run typecheck
|
|
215
151
|
```
|
|
216
152
|
|
|
217
|
-
|
|
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
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
+
```
|
|
@@ -28,7 +28,14 @@ export interface AwsRumActionsOptions {
|
|
|
28
28
|
}
|
|
29
29
|
export interface AwsRumActions {
|
|
30
30
|
readonly destroy: () => Promise<void>;
|
|
31
|
-
readonly flush: () => Promise<void>;
|
|
31
|
+
readonly flush: (options?: AwsRumFlushOptions) => Promise<void>;
|
|
32
32
|
readonly track: (event: AwsRumTrackInput) => void;
|
|
33
33
|
}
|
|
34
|
+
export interface AwsRumFlushOptions {
|
|
35
|
+
/**
|
|
36
|
+
* Prefer navigator.sendBeacon for terminal delivery. Falls back to the
|
|
37
|
+
* standard RUM request when the Beacon API cannot accept the batch.
|
|
38
|
+
*/
|
|
39
|
+
readonly useBeacon?: boolean;
|
|
40
|
+
}
|
|
34
41
|
export declare const createAwsRumActions: (flux: FluxFramework, options?: AwsRumActionsOptions) => AwsRumActions;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Copyright (c) 2026-Present, Nitrogen Labs, Inc.
|
|
3
3
|
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
|
|
4
|
-
*/ import { rumRequest } from '../../utils/api.js';
|
|
4
|
+
*/ import { rumBeaconRequest, rumRequest } from '../../utils/api.js';
|
|
5
5
|
export const AWS_RUM_CONSTANTS = {
|
|
6
6
|
TRACK_ERROR: 'AWS_RUM_TRACK_ERROR',
|
|
7
7
|
TRACK_QUEUED: 'AWS_RUM_TRACK_QUEUED',
|
|
@@ -125,7 +125,7 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
125
125
|
seenEvents.delete(oldestFingerprint);
|
|
126
126
|
}
|
|
127
127
|
};
|
|
128
|
-
const flush = async ()=>{
|
|
128
|
+
const flush = async ({ useBeacon = false } = {})=>{
|
|
129
129
|
if (flushPromise) {
|
|
130
130
|
return flushPromise;
|
|
131
131
|
}
|
|
@@ -145,10 +145,14 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
145
145
|
for(let index = 0; index < events.length; index += MAX_BATCH_SIZE){
|
|
146
146
|
const batchEvents = events.slice(index, index + MAX_BATCH_SIZE);
|
|
147
147
|
try {
|
|
148
|
-
|
|
148
|
+
const batch = {
|
|
149
149
|
analyticsId,
|
|
150
150
|
events: batchEvents
|
|
151
|
-
}
|
|
151
|
+
};
|
|
152
|
+
const sentByBeacon = useBeacon && rumBeaconRequest(flux, batch);
|
|
153
|
+
if (!sentByBeacon) {
|
|
154
|
+
await rumRequest(flux, batch);
|
|
155
|
+
}
|
|
152
156
|
await flux.dispatch({
|
|
153
157
|
analyticsId,
|
|
154
158
|
events: batchEvents,
|
|
@@ -224,4 +228,4 @@ export const createAwsRumActions = (flux, options = {})=>{
|
|
|
224
228
|
};
|
|
225
229
|
};
|
|
226
230
|
|
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hd3NSdW1BY3Rpb25zL2F3c1J1bUFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cnVtUmVxdWVzdH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5cbmV4cG9ydCBjb25zdCBBV1NfUlVNX0NPTlNUQU5UUyA9IHtcbiAgVFJBQ0tfRVJST1I6ICdBV1NfUlVNX1RSQUNLX0VSUk9SJyxcbiAgVFJBQ0tfUVVFVUVEOiAnQVdTX1JVTV9UUkFDS19RVUVVRUQnLFxuICBUUkFDS19TVUNDRVNTOiAnQVdTX1JVTV9UUkFDS19TVUNDRVNTJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQXdzUnVtRXZlbnRUeXBlID0gJ2NsaWNrJyB8ICdwYWdlX3ZpZXcnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIEF3c1J1bVByb3BlcnR5ID0gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+O1xuICByZWFkb25seSB0eXBlOiBBd3NSdW1FdmVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtRXZlbnQgZXh0ZW5kcyBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICByZWFkb25seSBqb3VybmV5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSBhbmFseXRpY3NJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVib3VuY2VNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGVkdXBlTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICByZWFkb25seSByZXNwZWN0UHJpdmFjeVNpZ25hbHM/OiBib29sZWFuO1xuICByZWFkb25seSB0aHJvdHRsZU1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUFjdGlvbnMge1xuICByZWFkb25seSBkZXN0cm95OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBmbHVzaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcmVhZG9ubHkgdHJhY2s6IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCkgPT4gdm9pZDtcbn1cblxuY29uc3QgREVGQVVMVF9ERUJPVU5DRV9NUyA9IDI1MDtcbmNvbnN0IERFRkFVTFRfREVEVVBFX01TID0gMTAwMDtcbmNvbnN0IERFRkFVTFRfVEhST1RUTEVfTVMgPSAxMDAwO1xuY29uc3QgTUFYX0JBVENIX1NJWkUgPSA1MDtcbmNvbnN0IE1BWF9QUk9QRVJUSUVTID0gMjA7XG5jb25zdCBNQVhfU0VFTl9FVkVOVFMgPSA1MDA7XG5jb25zdCBCTE9DS0VEX1BST1BFUlRZX0tFWVMgPSBuZXcgU2V0KFtcbiAgJ2FjY291bnRpZCcsXG4gICdhZGRyZXNzJyxcbiAgJ2VtYWlsJyxcbiAgJ2ZpcnN0bmFtZScsXG4gICdmdWxsbmFtZScsXG4gICdnZW9sb2NhdGlvbicsXG4gICdpcCcsXG4gICdpcGFkZHJlc3MnLFxuICAnbGFzdG5hbWUnLFxuICAnbGF0aXR1ZGUnLFxuICAnbG9uZ2l0dWRlJyxcbiAgJ25hbWUnLFxuICAncGhvbmUnLFxuICAncmVmZXJyZXInLFxuICAndG9rZW4nLFxuICAndXNlcmFnZW50JyxcbiAgJ3VzZXJpZCdcbl0pO1xuY29uc3QgRU1BSUxfUEFUVEVSTiA9IC9cXGJbXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rXFxiL2k7XG5cbmludGVyZmFjZSBQcml2YWN5TmF2aWdhdG9yIGV4dGVuZHMgTmF2aWdhdG9yIHtcbiAgcmVhZG9ubHkgZ2xvYmFsUHJpdmFjeUNvbnRyb2w/OiBib29sZWFuO1xufVxuXG5jb25zdCBjcmVhdGVJZCA9ICgpOiBzdHJpbmcgPT4ge1xuICBpZih0eXBlb2YgZ2xvYmFsVGhpcy5jcnlwdG8/LnJhbmRvbVVVSUQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsVGhpcy5jcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgcmV0dXJuIGAke0RhdGUubm93KCkudG9TdHJpbmcoMzYpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XG59O1xuXG5jb25zdCBub3JtYWxpemVUZXh0ID0gKHZhbHVlOiB1bmtub3duLCBtYXhMZW5ndGg6IG51bWJlcik6IHN0cmluZyA9PlxuICBTdHJpbmcodmFsdWUgfHwgJycpLnRyaW0oKS5zbGljZSgwLCBtYXhMZW5ndGgpO1xuXG5jb25zdCBub3JtYWxpemVQcm9wZXJ0eUtleSA9ICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nID0+XG4gIHZhbHVlLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvW15hLXowLTldL2csICcnKTtcblxuY29uc3Qgc2FuaXRpemVQcm9wZXJ0aWVzID0gKFxuICBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4gPSB7fVxuKTogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+ID0+IE9iamVjdC5lbnRyaWVzKHByb3BlcnRpZXMpXG4gIC5zbGljZSgwLCBNQVhfUFJPUEVSVElFUylcbiAgLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4+KChyZXN1bHQsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGNvbnN0IHByb3BlcnR5S2V5ID0gbm9ybWFsaXplVGV4dChrZXksIDY0KTtcbiAgICBjb25zdCBub3JtYWxpemVkUHJvcGVydHlLZXkgPSBub3JtYWxpemVQcm9wZXJ0eUtleShwcm9wZXJ0eUtleSk7XG5cbiAgICBpZihcbiAgICAgICFwcm9wZXJ0eUtleSB8fFxuICAgICAgQkxPQ0tFRF9QUk9QRVJUWV9LRVlTLmhhcyhub3JtYWxpemVkUHJvcGVydHlLZXkpIHx8XG4gICAgICAhWydib29sZWFuJywgJ251bWJlcicsICdzdHJpbmcnXS5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRleHRWYWx1ZSA9IG5vcm1hbGl6ZVRleHQodmFsdWUsIDI1Nik7XG5cbiAgICAgIGlmKHRleHRWYWx1ZSAmJiAhRU1BSUxfUEFUVEVSTi50ZXN0KHRleHRWYWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IHRleHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5S2V5XSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIHt9KTtcblxuY29uc3Qgc2FuaXRpemVFdmVudCA9IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCk6IEF3c1J1bVRyYWNrSW5wdXQgfCBudWxsID0+IHtcbiAgY29uc3QgbmFtZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQubmFtZSwgMTI4KTtcbiAgY29uc3QgdHlwZSA9IG5vcm1hbGl6ZVRleHQoZXZlbnQudHlwZSwgNjQpO1xuXG4gIGlmKCFuYW1lIHx8ICF0eXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwYXRoID0gbm9ybWFsaXplVGV4dChldmVudC5wYXRoLCAyNTYpLnNwbGl0KCc/JylbMF0uc3BsaXQoJyMnKVswXTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgLi4uKHBhdGggPyB7cGF0aH0gOiB7fSksXG4gICAgcHJvcGVydGllczogc2FuaXRpemVQcm9wZXJ0aWVzKGV2ZW50LnByb3BlcnRpZXMpLFxuICAgIHR5cGVcbiAgfTtcbn07XG5cbmNvbnN0IGV2ZW50RmluZ2VycHJpbnQgPSAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmVudHJpZXMoZXZlbnQucHJvcGVydGllcyB8fCB7fSkuc29ydCgoW2xlZnRdLCBbcmlnaHRdKSA9PiBsZWZ0LmxvY2FsZUNvbXBhcmUocmlnaHQpKTtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtldmVudC50eXBlLCBldmVudC5uYW1lLCBldmVudC5wYXRoIHx8ICcnLCBwcm9wZXJ0aWVzXSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQXdzUnVtQWN0aW9ucyA9IChcbiAgZmx1eDogRmx1eEZyYW1ld29yayxcbiAgb3B0aW9uczogQXdzUnVtQWN0aW9uc09wdGlvbnMgPSB7fVxuKTogQXdzUnVtQWN0aW9ucyA9PiB7XG4gIGNvbnN0IGFuYWx5dGljc0lkID0gbm9ybWFsaXplVGV4dChvcHRpb25zLmFuYWx5dGljc0lkLCAxMjgpO1xuICBjb25zdCBkZWJvdW5jZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5kZWJvdW5jZU1zID8/IERFRkFVTFRfREVCT1VOQ0VfTVMpO1xuICBjb25zdCBkZWR1cGVNcyA9IE1hdGgubWF4KDAsIG9wdGlvbnMuZGVkdXBlTXMgPz8gREVGQVVMVF9ERURVUEVfTVMpO1xuICBjb25zdCBlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkICE9PSBmYWxzZTtcbiAgY29uc3QgcmVzcGVjdFByaXZhY3lTaWduYWxzID0gb3B0aW9ucy5yZXNwZWN0UHJpdmFjeVNpZ25hbHMgIT09IGZhbHNlO1xuICBjb25zdCB0aHJvdHRsZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy50aHJvdHRsZU1zID8/IERFRkFVTFRfVEhST1RUTEVfTVMpO1xuICBjb25zdCBqb3VybmV5SWQgPSBjcmVhdGVJZCgpO1xuICBjb25zdCBwZW5kaW5nRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIEF3c1J1bUV2ZW50PigpO1xuICBjb25zdCBzZWVuRXZlbnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgbGV0IGZsdXNoUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3RGbHVzaEF0ID0gMDtcbiAgbGV0IHNlcXVlbmNlID0gMDtcbiAgbGV0IHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBoYXNQcml2YWN5U2lnbmFsID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmKCFyZXNwZWN0UHJpdmFjeVNpZ25hbHMgfHwgdHlwZW9mIGdsb2JhbFRoaXMubmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG5hdmlnYXRvclN0YXRlID0gZ2xvYmFsVGhpcy5uYXZpZ2F0b3IgYXMgUHJpdmFjeU5hdmlnYXRvcjtcblxuICAgIHJldHVybiBuYXZpZ2F0b3JTdGF0ZS5kb05vdFRyYWNrID09PSAnMScgfHwgbmF2aWdhdG9yU3RhdGUuZ2xvYmFsUHJpdmFjeUNvbnRyb2wgPT09IHRydWU7XG4gIH07XG5cbiAgY29uc3QgcHJ1bmVTZWVuRXZlbnRzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmKHNlZW5FdmVudHMuc2l6ZSA8PSBNQVhfU0VFTl9FVkVOVFMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXRvZmYgPSBEYXRlLm5vdygpIC0gZGVkdXBlTXM7XG4gICAgc2VlbkV2ZW50cy5mb3JFYWNoKCh0aW1lc3RhbXAsIGZpbmdlcnByaW50KSA9PiB7XG4gICAgICBpZih0aW1lc3RhbXAgPCBjdXRvZmYpIHtcbiAgICAgICAgc2VlbkV2ZW50cy5kZWxldGUoZmluZ2VycHJpbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgd2hpbGUoc2VlbkV2ZW50cy5zaXplID4gTUFYX1NFRU5fRVZFTlRTKSB7XG4gICAgICBjb25zdCBvbGRlc3RGaW5nZXJwcmludCA9IHNlZW5FdmVudHMua2V5cygpLm5leHQoKS52YWx1ZTtcblxuICAgICAgaWYoIW9sZGVzdEZpbmdlcnByaW50KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzZWVuRXZlbnRzLmRlbGV0ZShvbGRlc3RGaW5nZXJwcmludCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZsdXNoID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKGZsdXNoUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIGZsdXNoUHJvbWlzZTtcbiAgICB9XG5cbiAgICBpZighZW5hYmxlZCB8fCAhYW5hbHl0aWNzSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpIHx8IHBlbmRpbmdFdmVudHMuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnRzID0gWy4uLnBlbmRpbmdFdmVudHMudmFsdWVzKCldO1xuICAgIHBlbmRpbmdFdmVudHMuY2xlYXIoKTtcbiAgICBsYXN0Rmx1c2hBdCA9IERhdGUubm93KCk7XG5cbiAgICBmbHVzaFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnRzLmxlbmd0aDsgaW5kZXggKz0gTUFYX0JBVENIX1NJWkUpIHtcbiAgICAgICAgY29uc3QgYmF0Y2hFdmVudHMgPSBldmVudHMuc2xpY2UoaW5kZXgsIGluZGV4ICsgTUFYX0JBVENIX1NJWkUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgcnVtUmVxdWVzdChmbHV4LCB7YW5hbHl0aWNzSWQsIGV2ZW50czogYmF0Y2hFdmVudHN9KTtcbiAgICAgICAgICBhd2FpdCBmbHV4LmRpc3BhdGNoKHthbmFseXRpY3NJZCwgZXZlbnRzOiBiYXRjaEV2ZW50cywgdHlwZTogQVdTX1JVTV9DT05TVEFOVFMuVFJBQ0tfU1VDQ0VTU30pO1xuICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgZXZlbnRzLnNsaWNlKGluZGV4KS5mb3JFYWNoKChldmVudCkgPT4gcGVuZGluZ0V2ZW50cy5zZXQoZXZlbnRGaW5nZXJwcmludChldmVudCksIGV2ZW50KSk7XG4gICAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YW5hbHl0aWNzSWQsIGVycm9yLCBldmVudHM6IGJhdGNoRXZlbnRzLCB0eXBlOiBBV1NfUlVNX0NPTlNUQU5UUy5UUkFDS19FUlJPUn0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgZmx1c2hQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gZmx1c2hQcm9taXNlO1xuICB9O1xuXG4gIGNvbnN0IHNjaGVkdWxlRmx1c2ggPSAoKTogdm9pZCA9PiB7XG4gICAgaWYodGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgfVxuXG4gICAgY29uc3QgdGhyb3R0bGVSZW1haW5pbmcgPSBNYXRoLm1heCgwLCB0aHJvdHRsZU1zIC0gKERhdGUubm93KCkgLSBsYXN0Rmx1c2hBdCkpO1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIGZsdXNoKCksIE1hdGgubWF4KGRlYm91bmNlTXMsIHRocm90dGxlUmVtYWluaW5nKSk7XG4gIH07XG5cbiAgY29uc3QgdHJhY2sgPSAoaW5wdXQ6IEF3c1J1bVRyYWNrSW5wdXQpOiB2b2lkID0+IHtcbiAgICBpZighZW5hYmxlZCB8fCAhYW5hbHl0aWNzSWQgfHwgaGFzUHJpdmFjeVNpZ25hbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSBzYW5pdGl6ZUV2ZW50KGlucHV0KTtcblxuICAgIGlmKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gZXZlbnRGaW5nZXJwcmludChldmVudCk7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBsYXN0U2VlbkF0ID0gc2VlbkV2ZW50cy5nZXQoZmluZ2VycHJpbnQpIHx8IDA7XG5cbiAgICBpZihzZWVuRXZlbnRzLmhhcyhmaW5nZXJwcmludCkgJiYgbm93IC0gbGFzdFNlZW5BdCA8IGRlZHVwZU1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VlbkV2ZW50cy5zZXQoZmluZ2VycHJpbnQsIG5vdyk7XG4gICAgcHJ1bmVTZWVuRXZlbnRzKCk7XG4gICAgc2VxdWVuY2UgKz0gMTtcblxuICAgIGNvbnN0IHF1ZXVlZEV2ZW50OiBBd3NSdW1FdmVudCA9IHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgZXZlbnRJZDogY3JlYXRlSWQoKSxcbiAgICAgIGpvdXJuZXlJZCxcbiAgICAgIHNlcXVlbmNlLFxuICAgICAgdGltZXN0YW1wOiBub3dcbiAgICB9O1xuXG4gICAgcGVuZGluZ0V2ZW50cy5zZXQoZmluZ2VycHJpbnQsIHF1ZXVlZEV2ZW50KTtcbiAgICB2b2lkIGZsdXguZGlzcGF0Y2goe2FuYWx5dGljc0lkLCBldmVudDogcXVldWVkRXZlbnQsIHR5cGU6IEFXU19SVU1fQ09OU1RBTlRTLlRSQUNLX1FVRVVFRH0pO1xuICAgIHNjaGVkdWxlRmx1c2goKTtcbiAgfTtcblxuICBjb25zdCBkZXN0cm95ID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgdGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgYXdhaXQgZmx1c2goKTtcbiAgICBzZWVuRXZlbnRzLmNsZWFyKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtkZXN0cm95LCBmbHVzaCwgdHJhY2t9O1xufTtcbiJdLCJuYW1lcyI6WyJydW1SZXF1ZXN0IiwiQVdTX1JVTV9DT05TVEFOVFMiLCJUUkFDS19FUlJPUiIsIlRSQUNLX1FVRVVFRCIsIlRSQUNLX1NVQ0NFU1MiLCJERUZBVUxUX0RFQk9VTkNFX01TIiwiREVGQVVMVF9ERURVUEVfTVMiLCJERUZBVUxUX1RIUk9UVExFX01TIiwiTUFYX0JBVENIX1NJWkUiLCJNQVhfUFJPUEVSVElFUyIsIk1BWF9TRUVOX0VWRU5UUyIsIkJMT0NLRURfUFJPUEVSVFlfS0VZUyIsIlNldCIsIkVNQUlMX1BBVFRFUk4iLCJjcmVhdGVJZCIsImdsb2JhbFRoaXMiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiTWF0aCIsInJhbmRvbSIsInNsaWNlIiwibm9ybWFsaXplVGV4dCIsInZhbHVlIiwibWF4TGVuZ3RoIiwiU3RyaW5nIiwidHJpbSIsIm5vcm1hbGl6ZVByb3BlcnR5S2V5IiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwic2FuaXRpemVQcm9wZXJ0aWVzIiwicHJvcGVydGllcyIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJyZXN1bHQiLCJrZXkiLCJwcm9wZXJ0eUtleSIsIm5vcm1hbGl6ZWRQcm9wZXJ0eUtleSIsImhhcyIsImluY2x1ZGVzIiwidGV4dFZhbHVlIiwidGVzdCIsIk51bWJlciIsImlzRmluaXRlIiwic2FuaXRpemVFdmVudCIsImV2ZW50IiwibmFtZSIsInR5cGUiLCJwYXRoIiwic3BsaXQiLCJldmVudEZpbmdlcnByaW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImxvY2FsZUNvbXBhcmUiLCJKU09OIiwic3RyaW5naWZ5IiwiY3JlYXRlQXdzUnVtQWN0aW9ucyIsImZsdXgiLCJvcHRpb25zIiwiYW5hbHl0aWNzSWQiLCJkZWJvdW5jZU1zIiwibWF4IiwiZGVkdXBlTXMiLCJlbmFibGVkIiwicmVzcGVjdFByaXZhY3lTaWduYWxzIiwidGhyb3R0bGVNcyIsImpvdXJuZXlJZCIsInBlbmRpbmdFdmVudHMiLCJNYXAiLCJzZWVuRXZlbnRzIiwiZmx1c2hQcm9taXNlIiwibGFzdEZsdXNoQXQiLCJzZXF1ZW5jZSIsInRpbWVyIiwiaGFzUHJpdmFjeVNpZ25hbCIsIm5hdmlnYXRvciIsIm5hdmlnYXRvclN0YXRlIiwiZG9Ob3RUcmFjayIsImdsb2JhbFByaXZhY3lDb250cm9sIiwicHJ1bmVTZWVuRXZlbnRzIiwic2l6ZSIsImN1dG9mZiIsImZvckVhY2giLCJ0aW1lc3RhbXAiLCJmaW5nZXJwcmludCIsImRlbGV0ZSIsIm9sZGVzdEZpbmdlcnByaW50Iiwia2V5cyIsIm5leHQiLCJmbHVzaCIsImNsZWFyVGltZW91dCIsInVuZGVmaW5lZCIsImV2ZW50cyIsInZhbHVlcyIsImNsZWFyIiwiaW5kZXgiLCJsZW5ndGgiLCJiYXRjaEV2ZW50cyIsImRpc3BhdGNoIiwiZXJyb3IiLCJzZXQiLCJmaW5hbGx5Iiwic2NoZWR1bGVGbHVzaCIsInRocm90dGxlUmVtYWluaW5nIiwic2V0VGltZW91dCIsInRyYWNrIiwiaW5wdXQiLCJsYXN0U2VlbkF0IiwiZ2V0IiwicXVldWVkRXZlbnQiLCJldmVudElkIiwiZGVzdHJveSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsVUFBVSxRQUFPLHFCQUFxQjtBQUk5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
|
|
231
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L21ldHJvcG9saXNqcy9zcmMvYWN0aW9ucy9hd3NSdW1BY3Rpb25zL2F3c1J1bUFjdGlvbnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjYtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7cnVtQmVhY29uUmVxdWVzdCwgcnVtUmVxdWVzdH0gZnJvbSAnLi4vLi4vdXRpbHMvYXBpLmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmt9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5cbmV4cG9ydCBjb25zdCBBV1NfUlVNX0NPTlNUQU5UUyA9IHtcbiAgVFJBQ0tfRVJST1I6ICdBV1NfUlVNX1RSQUNLX0VSUk9SJyxcbiAgVFJBQ0tfUVVFVUVEOiAnQVdTX1JVTV9UUkFDS19RVUVVRUQnLFxuICBUUkFDS19TVUNDRVNTOiAnQVdTX1JVTV9UUkFDS19TVUNDRVNTJ1xufSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgQXdzUnVtRXZlbnRUeXBlID0gJ2NsaWNrJyB8ICdwYWdlX3ZpZXcnIHwgKHN0cmluZyAmIHt9KTtcbmV4cG9ydCB0eXBlIEF3c1J1bVByb3BlcnR5ID0gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgQXdzUnVtUHJvcGVydHk+O1xuICByZWFkb25seSB0eXBlOiBBd3NSdW1FdmVudFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtRXZlbnQgZXh0ZW5kcyBBd3NSdW1UcmFja0lucHV0IHtcbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICByZWFkb25seSBqb3VybmV5SWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2VxdWVuY2U6IG51bWJlcjtcbiAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtQWN0aW9uc09wdGlvbnMge1xuICByZWFkb25seSBhbmFseXRpY3NJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVib3VuY2VNcz86IG51bWJlcjtcbiAgcmVhZG9ubHkgZGVkdXBlTXM/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVuYWJsZWQ/OiBib29sZWFuO1xuICByZWFkb25seSByZXNwZWN0UHJpdmFjeVNpZ25hbHM/OiBib29sZWFuO1xuICByZWFkb25seSB0aHJvdHRsZU1zPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF3c1J1bUFjdGlvbnMge1xuICByZWFkb25seSBkZXN0cm95OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICByZWFkb25seSBmbHVzaDogKG9wdGlvbnM/OiBBd3NSdW1GbHVzaE9wdGlvbnMpID0+IFByb21pc2U8dm9pZD47XG4gIHJlYWRvbmx5IHRyYWNrOiAoZXZlbnQ6IEF3c1J1bVRyYWNrSW5wdXQpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXdzUnVtRmx1c2hPcHRpb25zIHtcbiAgLyoqXG4gICAqIFByZWZlciBuYXZpZ2F0b3Iuc2VuZEJlYWNvbiBmb3IgdGVybWluYWwgZGVsaXZlcnkuIEZhbGxzIGJhY2sgdG8gdGhlXG4gICAqIHN0YW5kYXJkIFJVTSByZXF1ZXN0IHdoZW4gdGhlIEJlYWNvbiBBUEkgY2Fubm90IGFjY2VwdCB0aGUgYmF0Y2guXG4gICAqL1xuICByZWFkb25seSB1c2VCZWFjb24/OiBib29sZWFuO1xufVxuXG5jb25zdCBERUZBVUxUX0RFQk9VTkNFX01TID0gMjUwO1xuY29uc3QgREVGQVVMVF9ERURVUEVfTVMgPSAxMDAwO1xuY29uc3QgREVGQVVMVF9USFJPVFRMRV9NUyA9IDEwMDA7XG5jb25zdCBNQVhfQkFUQ0hfU0laRSA9IDUwO1xuY29uc3QgTUFYX1BST1BFUlRJRVMgPSAyMDtcbmNvbnN0IE1BWF9TRUVOX0VWRU5UUyA9IDUwMDtcbmNvbnN0IEJMT0NLRURfUFJPUEVSVFlfS0VZUyA9IG5ldyBTZXQoW1xuICAnYWNjb3VudGlkJyxcbiAgJ2FkZHJlc3MnLFxuICAnZW1haWwnLFxuICAnZmlyc3RuYW1lJyxcbiAgJ2Z1bGxuYW1lJyxcbiAgJ2dlb2xvY2F0aW9uJyxcbiAgJ2lwJyxcbiAgJ2lwYWRkcmVzcycsXG4gICdsYXN0bmFtZScsXG4gICdsYXRpdHVkZScsXG4gICdsb25naXR1ZGUnLFxuICAnbmFtZScsXG4gICdwaG9uZScsXG4gICdyZWZlcnJlcicsXG4gICd0b2tlbicsXG4gICd1c2VyYWdlbnQnLFxuICAndXNlcmlkJ1xuXSk7XG5jb25zdCBFTUFJTF9QQVRURVJOID0gL1xcYlteXFxzQF0rQFteXFxzQF0rXFwuW15cXHNAXStcXGIvaTtcblxuaW50ZXJmYWNlIFByaXZhY3lOYXZpZ2F0b3IgZXh0ZW5kcyBOYXZpZ2F0b3Ige1xuICByZWFkb25seSBnbG9iYWxQcml2YWN5Q29udHJvbD86IGJvb2xlYW47XG59XG5cbmNvbnN0IGNyZWF0ZUlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGlmKHR5cGVvZiBnbG9iYWxUaGlzLmNyeXB0bz8ucmFuZG9tVVVJRCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBnbG9iYWxUaGlzLmNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICByZXR1cm4gYCR7RGF0ZS5ub3coKS50b1N0cmluZygzNil9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbn07XG5cbmNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodmFsdWU6IHVua25vd24sIG1heExlbmd0aDogbnVtYmVyKTogc3RyaW5nID0+XG4gIFN0cmluZyh2YWx1ZSB8fCAnJykudHJpbSgpLnNsaWNlKDAsIG1heExlbmd0aCk7XG5cbmNvbnN0IG5vcm1hbGl6ZVByb3BlcnR5S2V5ID0gKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgdmFsdWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0vZywgJycpO1xuXG5jb25zdCBzYW5pdGl6ZVByb3BlcnRpZXMgPSAoXG4gIHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIEF3c1J1bVByb3BlcnR5PiA9IHt9XG4pOiBSZWNvcmQ8c3RyaW5nLCBBd3NSdW1Qcm9wZXJ0eT4gPT4gT2JqZWN0LmVudHJpZXMocHJvcGVydGllcylcbiAgLnNsaWNlKDAsIE1BWF9QUk9QRVJUSUVTKVxuICAucmVkdWNlPFJlY29yZDxzdHJpbmcsIEF3c1J1bVByb3BlcnR5Pj4oKHJlc3VsdCwgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgY29uc3QgcHJvcGVydHlLZXkgPSBub3JtYWxpemVUZXh0KGtleSwgNjQpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQcm9wZXJ0eUtleSA9IG5vcm1hbGl6ZVByb3BlcnR5S2V5KHByb3BlcnR5S2V5KTtcblxuICAgIGlmKFxuICAgICAgIXByb3BlcnR5S2V5IHx8XG4gICAgICBCTE9DS0VEX1BST1BFUlRZX0tFWVMuaGFzKG5vcm1hbGl6ZWRQcm9wZXJ0eUtleSkgfHxcbiAgICAgICFbJ2Jvb2xlYW4nLCAnbnVtYmVyJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgaWYodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgdGV4dFZhbHVlID0gbm9ybWFsaXplVGV4dCh2YWx1ZSwgMjU2KTtcblxuICAgICAgaWYodGV4dFZhbHVlICYmICFFTUFJTF9QQVRURVJOLnRlc3QodGV4dFZhbHVlKSkge1xuICAgICAgICByZXN1bHRbcHJvcGVydHlLZXldID0gdGV4dFZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyB8fCBOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG4gICAgICByZXN1bHRbcHJvcGVydHlLZXldID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwge30pO1xuXG5jb25zdCBzYW5pdGl6ZUV2ZW50ID0gKGV2ZW50OiBBd3NSdW1UcmFja0lucHV0KTogQXdzUnVtVHJhY2tJbnB1dCB8IG51bGwgPT4ge1xuICBjb25zdCBuYW1lID0gbm9ybWFsaXplVGV4dChldmVudC5uYW1lLCAxMjgpO1xuICBjb25zdCB0eXBlID0gbm9ybWFsaXplVGV4dChldmVudC50eXBlLCA2NCk7XG5cbiAgaWYoIW5hbWUgfHwgIXR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhdGggPSBub3JtYWxpemVUZXh0KGV2ZW50LnBhdGgsIDI1Nikuc3BsaXQoJz8nKVswXS5zcGxpdCgnIycpWzBdO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICAuLi4ocGF0aCA/IHtwYXRofSA6IHt9KSxcbiAgICBwcm9wZXJ0aWVzOiBzYW5pdGl6ZVByb3BlcnRpZXMoZXZlbnQucHJvcGVydGllcyksXG4gICAgdHlwZVxuICB9O1xufTtcblxuY29uc3QgZXZlbnRGaW5nZXJwcmludCA9IChldmVudDogQXdzUnVtVHJhY2tJbnB1dCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBPYmplY3QuZW50cmllcyhldmVudC5wcm9wZXJ0aWVzIHx8IHt9KS5zb3J0KChbbGVmdF0sIFtyaWdodF0pID0+IGxlZnQubG9jYWxlQ29tcGFyZShyaWdodCkpO1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW2V2ZW50LnR5cGUsIGV2ZW50Lm5hbWUsIGV2ZW50LnBhdGggfHwgJycsIHByb3BlcnRpZXNdKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVBd3NSdW1BY3Rpb25zID0gKFxuICBmbHV4OiBGbHV4RnJhbWV3b3JrLFxuICBvcHRpb25zOiBBd3NSdW1BY3Rpb25zT3B0aW9ucyA9IHt9XG4pOiBBd3NSdW1BY3Rpb25zID0+IHtcbiAgY29uc3QgYW5hbHl0aWNzSWQgPSBub3JtYWxpemVUZXh0KG9wdGlvbnMuYW5hbHl0aWNzSWQsIDEyOCk7XG4gIGNvbnN0IGRlYm91bmNlTXMgPSBNYXRoLm1heCgwLCBvcHRpb25zLmRlYm91bmNlTXMgPz8gREVGQVVMVF9ERUJPVU5DRV9NUyk7XG4gIGNvbnN0IGRlZHVwZU1zID0gTWF0aC5tYXgoMCwgb3B0aW9ucy5kZWR1cGVNcyA/PyBERUZBVUxUX0RFRFVQRV9NUyk7XG4gIGNvbnN0IGVuYWJsZWQgPSBvcHRpb25zLmVuYWJsZWQgIT09IGZhbHNlO1xuICBjb25zdCByZXNwZWN0UHJpdmFjeVNpZ25hbHMgPSBvcHRpb25zLnJlc3BlY3RQcml2YWN5U2lnbmFscyAhPT0gZmFsc2U7XG4gIGNvbnN0IHRocm90dGxlTXMgPSBNYXRoLm1heCgwLCBvcHRpb25zLnRocm90dGxlTXMgPz8gREVGQVVMVF9USFJPVFRMRV9NUyk7XG4gIGNvbnN0IGpvdXJuZXlJZCA9IGNyZWF0ZUlkKCk7XG4gIGNvbnN0IHBlbmRpbmdFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgQXdzUnVtRXZlbnQ+KCk7XG4gIGNvbnN0IHNlZW5FdmVudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBsZXQgZmx1c2hQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdEZsdXNoQXQgPSAwO1xuICBsZXQgc2VxdWVuY2UgPSAwO1xuICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhhc1ByaXZhY3lTaWduYWwgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgaWYoIXJlc3BlY3RQcml2YWN5U2lnbmFscyB8fCB0eXBlb2YgZ2xvYmFsVGhpcy5uYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmF2aWdhdG9yU3RhdGUgPSBnbG9iYWxUaGlzLm5hdmlnYXRvciBhcyBQcml2YWN5TmF2aWdhdG9yO1xuXG4gICAgcmV0dXJuIG5hdmlnYXRvclN0YXRlLmRvTm90VHJhY2sgPT09ICcxJyB8fCBuYXZpZ2F0b3JTdGF0ZS5nbG9iYWxQcml2YWN5Q29udHJvbCA9PT0gdHJ1ZTtcbiAgfTtcblxuICBjb25zdCBwcnVuZVNlZW5FdmVudHMgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYoc2VlbkV2ZW50cy5zaXplIDw9IE1BWF9TRUVOX0VWRU5UUykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1dG9mZiA9IERhdGUubm93KCkgLSBkZWR1cGVNcztcbiAgICBzZWVuRXZlbnRzLmZvckVhY2goKHRpbWVzdGFtcCwgZmluZ2VycHJpbnQpID0+IHtcbiAgICAgIGlmKHRpbWVzdGFtcCA8IGN1dG9mZikge1xuICAgICAgICBzZWVuRXZlbnRzLmRlbGV0ZShmaW5nZXJwcmludCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB3aGlsZShzZWVuRXZlbnRzLnNpemUgPiBNQVhfU0VFTl9FVkVOVFMpIHtcbiAgICAgIGNvbnN0IG9sZGVzdEZpbmdlcnByaW50ID0gc2VlbkV2ZW50cy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuXG4gICAgICBpZighb2xkZXN0RmluZ2VycHJpbnQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHNlZW5FdmVudHMuZGVsZXRlKG9sZGVzdEZpbmdlcnByaW50KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZmx1c2ggPSBhc3luYyAoe3VzZUJlYWNvbiA9IGZhbHNlfTogQXdzUnVtRmx1c2hPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZihmbHVzaFByb21pc2UpIHtcbiAgICAgIHJldHVybiBmbHVzaFByb21pc2U7XG4gICAgfVxuXG4gICAgaWYoIWVuYWJsZWQgfHwgIWFuYWx5dGljc0lkIHx8IGhhc1ByaXZhY3lTaWduYWwoKSB8fCBwZW5kaW5nRXZlbnRzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZih0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50cyA9IFsuLi5wZW5kaW5nRXZlbnRzLnZhbHVlcygpXTtcbiAgICBwZW5kaW5nRXZlbnRzLmNsZWFyKCk7XG4gICAgbGFzdEZsdXNoQXQgPSBEYXRlLm5vdygpO1xuXG4gICAgZmx1c2hQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGZvcihsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV2ZW50cy5sZW5ndGg7IGluZGV4ICs9IE1BWF9CQVRDSF9TSVpFKSB7XG4gICAgICAgIGNvbnN0IGJhdGNoRXZlbnRzID0gZXZlbnRzLnNsaWNlKGluZGV4LCBpbmRleCArIE1BWF9CQVRDSF9TSVpFKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJhdGNoID0ge2FuYWx5dGljc0lkLCBldmVudHM6IGJhdGNoRXZlbnRzfTtcbiAgICAgICAgICBjb25zdCBzZW50QnlCZWFjb24gPSB1c2VCZWFjb24gJiYgcnVtQmVhY29uUmVxdWVzdChmbHV4LCBiYXRjaCk7XG5cbiAgICAgICAgICBpZighc2VudEJ5QmVhY29uKSB7XG4gICAgICAgICAgICBhd2FpdCBydW1SZXF1ZXN0KGZsdXgsIGJhdGNoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgZmx1eC5kaXNwYXRjaCh7YW5hbHl0aWNzSWQsIGV2ZW50czogYmF0Y2hFdmVudHMsIHR5cGU6IEFXU19SVU1fQ09OU1RBTlRTLlRSQUNLX1NVQ0NFU1N9KTtcbiAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgIGV2ZW50cy5zbGljZShpbmRleCkuZm9yRWFjaCgoZXZlbnQpID0+IHBlbmRpbmdFdmVudHMuc2V0KGV2ZW50RmluZ2VycHJpbnQoZXZlbnQpLCBldmVudCkpO1xuICAgICAgICAgIGF3YWl0IGZsdXguZGlzcGF0Y2goe2FuYWx5dGljc0lkLCBlcnJvciwgZXZlbnRzOiBiYXRjaEV2ZW50cywgdHlwZTogQVdTX1JVTV9DT05TVEFOVFMuVFJBQ0tfRVJST1J9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGZsdXNoUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIGZsdXNoUHJvbWlzZTtcbiAgfTtcblxuICBjb25zdCBzY2hlZHVsZUZsdXNoID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmKHRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IHRocm90dGxlUmVtYWluaW5nID0gTWF0aC5tYXgoMCwgdGhyb3R0bGVNcyAtIChEYXRlLm5vdygpIC0gbGFzdEZsdXNoQXQpKTtcbiAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdm9pZCBmbHVzaCgpLCBNYXRoLm1heChkZWJvdW5jZU1zLCB0aHJvdHRsZVJlbWFpbmluZykpO1xuICB9O1xuXG4gIGNvbnN0IHRyYWNrID0gKGlucHV0OiBBd3NSdW1UcmFja0lucHV0KTogdm9pZCA9PiB7XG4gICAgaWYoIWVuYWJsZWQgfHwgIWFuYWx5dGljc0lkIHx8IGhhc1ByaXZhY3lTaWduYWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50ID0gc2FuaXRpemVFdmVudChpbnB1dCk7XG5cbiAgICBpZighZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5nZXJwcmludCA9IGV2ZW50RmluZ2VycHJpbnQoZXZlbnQpO1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgbGFzdFNlZW5BdCA9IHNlZW5FdmVudHMuZ2V0KGZpbmdlcnByaW50KSB8fCAwO1xuXG4gICAgaWYoc2VlbkV2ZW50cy5oYXMoZmluZ2VycHJpbnQpICYmIG5vdyAtIGxhc3RTZWVuQXQgPCBkZWR1cGVNcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNlZW5FdmVudHMuc2V0KGZpbmdlcnByaW50LCBub3cpO1xuICAgIHBydW5lU2VlbkV2ZW50cygpO1xuICAgIHNlcXVlbmNlICs9IDE7XG5cbiAgICBjb25zdCBxdWV1ZWRFdmVudDogQXdzUnVtRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGV2ZW50SWQ6IGNyZWF0ZUlkKCksXG4gICAgICBqb3VybmV5SWQsXG4gICAgICBzZXF1ZW5jZSxcbiAgICAgIHRpbWVzdGFtcDogbm93XG4gICAgfTtcblxuICAgIHBlbmRpbmdFdmVudHMuc2V0KGZpbmdlcnByaW50LCBxdWV1ZWRFdmVudCk7XG4gICAgdm9pZCBmbHV4LmRpc3BhdGNoKHthbmFseXRpY3NJZCwgZXZlbnQ6IHF1ZXVlZEV2ZW50LCB0eXBlOiBBV1NfUlVNX0NPTlNUQU5UUy5UUkFDS19RVUVVRUR9KTtcbiAgICBzY2hlZHVsZUZsdXNoKCk7XG4gIH07XG5cbiAgY29uc3QgZGVzdHJveSA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBpZih0aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgIHRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGF3YWl0IGZsdXNoKCk7XG4gICAgc2VlbkV2ZW50cy5jbGVhcigpO1xuICB9O1xuXG4gIHJldHVybiB7ZGVzdHJveSwgZmx1c2gsIHRyYWNrfTtcbn07XG4iXSwibmFtZXMiOlsicnVtQmVhY29uUmVxdWVzdCIsInJ1bVJlcXVlc3QiLCJBV1NfUlVNX0NPTlNUQU5UUyIsIlRSQUNLX0VSUk9SIiwiVFJBQ0tfUVVFVUVEIiwiVFJBQ0tfU1VDQ0VTUyIsIkRFRkFVTFRfREVCT1VOQ0VfTVMiLCJERUZBVUxUX0RFRFVQRV9NUyIsIkRFRkFVTFRfVEhST1RUTEVfTVMiLCJNQVhfQkFUQ0hfU0laRSIsIk1BWF9QUk9QRVJUSUVTIiwiTUFYX1NFRU5fRVZFTlRTIiwiQkxPQ0tFRF9QUk9QRVJUWV9LRVlTIiwiU2V0IiwiRU1BSUxfUEFUVEVSTiIsImNyZWF0ZUlkIiwiZ2xvYmFsVGhpcyIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJEYXRlIiwibm93IiwidG9TdHJpbmciLCJNYXRoIiwicmFuZG9tIiwic2xpY2UiLCJub3JtYWxpemVUZXh0IiwidmFsdWUiLCJtYXhMZW5ndGgiLCJTdHJpbmciLCJ0cmltIiwibm9ybWFsaXplUHJvcGVydHlLZXkiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJzYW5pdGl6ZVByb3BlcnRpZXMiLCJwcm9wZXJ0aWVzIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsInJlc3VsdCIsImtleSIsInByb3BlcnR5S2V5Iiwibm9ybWFsaXplZFByb3BlcnR5S2V5IiwiaGFzIiwiaW5jbHVkZXMiLCJ0ZXh0VmFsdWUiLCJ0ZXN0IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJzYW5pdGl6ZUV2ZW50IiwiZXZlbnQiLCJuYW1lIiwidHlwZSIsInBhdGgiLCJzcGxpdCIsImV2ZW50RmluZ2VycHJpbnQiLCJzb3J0IiwibGVmdCIsInJpZ2h0IiwibG9jYWxlQ29tcGFyZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJjcmVhdGVBd3NSdW1BY3Rpb25zIiwiZmx1eCIsIm9wdGlvbnMiLCJhbmFseXRpY3NJZCIsImRlYm91bmNlTXMiLCJtYXgiLCJkZWR1cGVNcyIsImVuYWJsZWQiLCJyZXNwZWN0UHJpdmFjeVNpZ25hbHMiLCJ0aHJvdHRsZU1zIiwiam91cm5leUlkIiwicGVuZGluZ0V2ZW50cyIsIk1hcCIsInNlZW5FdmVudHMiLCJmbHVzaFByb21pc2UiLCJsYXN0Rmx1c2hBdCIsInNlcXVlbmNlIiwidGltZXIiLCJoYXNQcml2YWN5U2lnbmFsIiwibmF2aWdhdG9yIiwibmF2aWdhdG9yU3RhdGUiLCJkb05vdFRyYWNrIiwiZ2xvYmFsUHJpdmFjeUNvbnRyb2wiLCJwcnVuZVNlZW5FdmVudHMiLCJzaXplIiwiY3V0b2ZmIiwiZm9yRWFjaCIsInRpbWVzdGFtcCIsImZpbmdlcnByaW50IiwiZGVsZXRlIiwib2xkZXN0RmluZ2VycHJpbnQiLCJrZXlzIiwibmV4dCIsImZsdXNoIiwidXNlQmVhY29uIiwiY2xlYXJUaW1lb3V0IiwidW5kZWZpbmVkIiwiZXZlbnRzIiwidmFsdWVzIiwiY2xlYXIiLCJpbmRleCIsImxlbmd0aCIsImJhdGNoRXZlbnRzIiwiYmF0Y2giLCJzZW50QnlCZWFjb24iLCJkaXNwYXRjaCIsImVycm9yIiwic2V0IiwiZmluYWxseSIsInNjaGVkdWxlRmx1c2giLCJ0aHJvdHRsZVJlbWFpbmluZyIsInNldFRpbWVvdXQiLCJ0cmFjayIsImlucHV0IiwibGFzdFNlZW5BdCIsImdldCIsInF1ZXVlZEV2ZW50IiwiZXZlbnRJZCIsImRlc3Ryb3kiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGdCQUFnQixFQUFFQyxVQUFVLFFBQU8scUJBQXFCO0FBSWhFLE9BQU8sTUFBTUMsb0JBQW9CO0lBQy9CQyxhQUFhO0lBQ2JDLGNBQWM7SUFDZEMsZUFBZTtBQUNqQixFQUFXO0FBMENYLE1BQU1DLHNCQUFzQjtBQUM1QixNQUFNQyxvQkFBb0I7QUFDMUIsTUFBTUMsc0JBQXNCO0FBQzVCLE1BQU1DLGlCQUFpQjtBQUN2QixNQUFNQyxpQkFBaUI7QUFDdkIsTUFBTUMsa0JBQWtCO0FBQ3hCLE1BQU1DLHdCQUF3QixJQUFJQyxJQUFJO0lBQ3BDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7Q0FDRDtBQUNELE1BQU1DLGdCQUFnQjtBQU10QixNQUFNQyxXQUFXO0lBQ2YsSUFBRyxPQUFP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
|
|
@@ -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
|
-
|
|
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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
|