@ngrdt/router 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,54 +1,255 @@
1
1
  # @ngrdt/router
2
2
 
3
+ Main use for this package is to define routes and their parameters in one place in app. It is recommended to define special `routes` module in every app using `@ngrdt/router` where all `RdtRoute` objects are defined using `RdtRouteBuilder`. Individual application modules then import these objects, define Angular routes and provide implementation details such as which component is rendered, state, guards, etc.
4
+
5
+ This approach ensures that each route is defined exactly once and can be easily edited if necessary. `@ngrdt/router` also provides set of useful tools to help you with common routing tasks.
6
+
3
7
  ### Instalation
4
8
 
5
9
  `npm install @ngrdt/router`
6
10
 
7
- ### Define Route
11
+ ## Basic usage
12
+
13
+ ### Application routes file
14
+
15
+ Create special `nx` library (not `NgModule`) for instance `@example-app/routes`. In this library you will create file called `routes.ts` and in it individual `RdtRoute` objects like so:
16
+
17
+ ```typescript
18
+ export const DASHBOARD_ITEM_ROUTE = new RdtRouteBuilder()
19
+ .setName('Dashboard item')
20
+ .setPath(':id')
21
+ .setParam('id', 'number')
22
+ .build();
23
+
24
+ export const DASHBOARD_ROUTE = new RdtRouteBuilder()
25
+ .setName('Dashboard')
26
+ .setPath('dashboard')
27
+ .setChildren(DASHBOARD_ITEM_ROUTE)
28
+ .build();
29
+
30
+ export const SETTINGS_ROUTE = new RdtRouteBuilder()
31
+ .setName('Settings')
32
+ .setPath('settings')
33
+ .setCanBeEntered(() =>
34
+ inject(ExampleAppPermissionService).hasPermission('SETTINGS_ACCESS')
35
+ )
36
+ .build();
37
+ ```
38
+
39
+ This file should only contain imports to interfaces used by `RdtRouteBuilder` as template parameter. No component, ngModule or guards such as `CanActivateFn` should be imported here. This approach will save you later headache with circular dependency.
40
+
41
+ `RdtRouterService` needs to be aware of all routes defined therefore you must provide it in your `ApplicationConfig` like so:
42
+
43
+ ```typescript
44
+ import { RDT_ROUTES_PROVIDER, RdtRoute } from '@ngrdt/router';
45
+ import * as ALL_ROUTES_OBJ from './rdt-routes';
46
+ const ALL_ROUTES = Object.values(ALL_ROUTES_OBJ) as RdtRoute[];
47
+
48
+ export const appConfig: ApplicationConfig = {
49
+ providers: [
50
+ {
51
+ provide: RDT_ROUTES_PROVIDER,
52
+ useValue: ALL_ROUTES,
53
+ },
54
+ ]
55
+ }
56
+ ```
57
+
58
+ ### Angular routes files
8
59
 
9
- ```javascript
10
- export const COOL_ROUTE = new RdtRouteBuilder()
11
- .setName('Cool Route')
12
- .setPath('cool-route')
13
- .setCanBeEntered(() => inject(MockPermissionService).hasPermission('COOL_ACCESS'))
60
+ Now you have to bind `RdtRoute` objects to individual modules, components, states, effects, guards and other implementation details. Instead of defining routes directly you import `RdtRoute` from `@example-app/routes` and then define `routes.ts` like so:
61
+
62
+ ```typescript
63
+ export const routes: Route[] = [
64
+ DASHBOARD_ROUTE.toAngularRoute()
65
+ .setComponent(DashboardComponent)
66
+ .setChildren(
67
+ DASHBOARD_ITEM_ROUTE.toAngularRoute()
68
+ .setComponent(DashboardItemComponent)
69
+ .addCanDeactivate(preventDataLossGuardFn)
70
+ .build()
71
+ )
72
+ .build(),
73
+ ]
74
+ ```
75
+
76
+ This array is then used as in regular Angular project. Note that child routes must be added as children here as well.
77
+
78
+
79
+ ### Child routes and parameters
80
+
81
+ You may nest child routes and also create routes with typed parameters to link them with particular type.
82
+
83
+ For instance lets say there's a route displaying users which has a child route to display more information about a single user. By providing `User` type to `RdtRouteBuilder` and defining types of parameters we can use `RdtRoute` object to parse path to extract parameters.
84
+
85
+ ```typescript
86
+ interface User {
87
+ userId: number;
88
+ name: string;
89
+ }
90
+
91
+ export const USER_DETAIL_ROUTE = new RdtRouteBuilder<User>()
92
+ .setName('User detail')
93
+ .setPath(':userId/:name')
94
+ .setParam('userId', 'number')
95
+ .setParam('name', 'string')
14
96
  .build();
97
+
98
+ export const USER_LIST_ROUTE = new RdtRouteBuilder()
99
+ .setName('Users')
100
+ .setPath('users')
101
+ .setChildren(USER_DETAIL_ROUTE)
102
+ .build();
103
+ ```
104
+
105
+ Then we navigate to user detail like so:
106
+
107
+ ```typescript
108
+ const params: Partial<User> = {
109
+ userId: 123,
110
+ name: 'Josef',
111
+ };
112
+
113
+ inject(RdtRouterService).navigate(USER_DETAIL_ROUTE, params);
114
+ ```
115
+
116
+ `RdtRouterService` is aware of the type so you can use it to parse absolute path into `User` object. Route knows `userId` is `number` so it will parse it. If parameter is missing or is of wrong type, then `parseAbsoluteUrl` returns `null`. Return value is a wrapper object with `get(route: RdtRoute)` method to get parsed parameters of given route or its parents.
117
+
118
+
119
+ ```typescript
120
+ const user: User = USER_DETAIL_ROUTE
121
+ .parse('/users/123/Josef')
122
+ .get(USER_DETAIL_ROUTE);
15
123
  ```
16
124
 
17
- ### Define Child Route
125
+ ### More parameter examples
126
+
127
+ #### Static parameters
128
+
129
+ Imagine your app contains list of users and each user has set of tasks. The routes are defined as follows:
130
+
131
+ ```typescript
132
+ interface User {
133
+ userId: number,
134
+ name: string,
135
+ address: string,
136
+ tasks: Task[]
137
+ }
138
+
139
+ interface Task {
140
+ taskId: number,
141
+ description: string
142
+ }
143
+
144
+
145
+ export const TASK_DETAIL_ROUTE = new RdtRouteBuilder<Task>()
146
+ .setName('Task detail')
147
+ .setPath('task/:taskId')
148
+ .setParam('taskId', 'number')
149
+ .build();
18
150
 
19
- ```javascript
20
- export const COOL_ROUTE_CHILD = new RdtRouteBuilder()
21
- .setName('Cool Route child')
22
- .setPath(':coolId')
23
- .setCanBeEntered(() => inject(MockPermissionService).hasPermission('COOL_CHILD_ACCESS'))
151
+ export const USER_DETAIL_ROUTE = new RdtRouteBuilder<User>()
152
+ .setName('User detail')
153
+ .setPath(':userId')
154
+ .setParam('userId', 'number')
155
+ .setChildren(TASK_DETAIL_ROUTE)
24
156
  .build();
25
157
 
26
- PARENT_ROUTE.setChildren(COOL_ROUTE_CHILD);
158
+ export const USER_LIST_ROUTE = new RdtRouteBuilder()
159
+ .setName('Users')
160
+ .setPath('user')
161
+ .setChildren(USER_DETAIL_ROUTE)
162
+ .build();
163
+ ```
164
+
165
+ This translates into path `/user/:userId/task/:taskId` for task detail route.
166
+
167
+ Now inside `UserDetailComponent` there's a for loop rendering individual tasks and you want to have links to them. You cannot use directly:
168
+
169
+ ```html
170
+ <button [rdtRouterLink]="TASK_DETAIL_ROUTE" [params]="task"></button>
27
171
  ```
172
+ Because task does not specify `userId`. For this you must provide static parameters for every parent route - `User` for `USER_DETAIL_ROUTE` in this case:
28
173
 
29
- ### Define Angular Route
174
+ ```typescript
175
+ @Input()
176
+ user!: User;
30
177
 
31
- ```javascript
32
- // Create angular route
33
- COOL_ROUTE.toAngularRoute().setComponent(RouteLevel1Component).build();
178
+ taskRoute!: RdtRoute<Task>;
179
+
180
+ ngOnInit() {
181
+ this.taskRoute = TASK_DETAIL_ROUTE.withStaticParams(USER_DETAIL_ROUTE, this.user);
182
+ }
183
+ ```
184
+ Method `withStaticParams()` returns clone of `TASK_DETAIL_ROUTE` and all of its parent routes while fixing parameters. You can chain calling `withStaticParams` with itself or other method calls.
34
185
 
35
- // Get information of route
36
- COOL_ROUTE.name;
186
+ ```html
187
+ <button [rdtRouterLink]="taskRoute" [params]="task"></button>
37
188
  ```
38
189
 
39
- ### Use It in template
190
+ ## Ecosystem
191
+
192
+ ### RdtRouterLink
193
+
194
+ `RdtRouterLink` is equivalent of `RouterLink` in Angular. It supports basically the same functionality, but adds type safety. `RdtRouterLink` will be disabled if `canBeEntered` of its route returns `false`.
195
+
196
+ ```typescript
197
+ readonly userRoute = USER_DETAIL_ROUTE;
198
+ readonly user$ = inject(UserService).getUser$();
199
+ ```
40
200
 
41
201
  ```html
42
- <button [rdtRouterLink]="COOL_ROUTE" [params]="{ coolId: 123 }">Go to Level 2</button>
202
+ <button
203
+ [rdtRouterLink]="userRoute"
204
+ [params]="user$ | async"
205
+ target="_blank">
206
+ Link to user
207
+ </button>
43
208
  ```
44
209
 
45
- ### See other cool features like
210
+ ### RdtMenu
46
211
 
47
- ```javascript
48
- private readonly rdtRouter: RdtRouterService = inject(RdtRouterService);
212
+ `RdtRoute` can be passed directly into `RdtMenuItem`. If `canBeEntered` returns `false`, then the item won't be visible. This is useful to hide items user has no permission for.
49
213
 
50
- rdtRouter.navigate(...);
51
- rdtRouter.parseAbsoluteUrl(...);
52
- rdtRouter.navigateBack(...);
53
- ...
214
+ Method `withStaticParams` lets us provide parameters for given `RdtRoute`, because `RdtMenuItem` does not accept route parameters.
215
+
216
+ ```typescript
217
+ public getMenuItems(): RdtMenuItem[] {
218
+ const user: Partial<User> = {
219
+ userId: 123,
220
+ name: 'Josef'
221
+ };
222
+
223
+ return [
224
+ {
225
+ label: 'All users',
226
+ routerLink: USER_LIST_ROUTE
227
+ },
228
+ {
229
+ label: 'Josef',
230
+ routerLink: USER_DETAIL_ROUTE.withStaticParams(user)
231
+ }
232
+ ];
233
+ }
54
234
  ```
235
+
236
+ ### RdtAngularRoute
237
+
238
+ `RdtAngularRoute` is a container class for `RdtRoute` which functionally does two things: verifies that routes were defined correctly and enables you to provide guards, effects, component or module. Don't forget to call `build()` for it to generate Angular `Route`.
239
+
240
+ ### RdtRouterService
241
+
242
+ `RdtRouterService` has similar features as Angular `Router`.
243
+
244
+ #### `parseAbsoluteUrl()`
245
+ Method will parse absolute path, recognize `RdtRoute` and parse its parameters. If no parameter is provided, then window location is used.
246
+
247
+ #### `navigateBack()`
248
+
249
+ Will push parent route to navigation stack. Function works anywhere in the app unlike similar Angular-based solution using `ActivatedRoute`.
250
+
251
+ Hitting native browser back button will take you back forward. In case you want true back function, use `inject(Location).back()` which removes from navigation stack, but can potentially take you outside of the app or close browser window.
252
+
253
+ #### `previousUrl` and `currentUrl`
254
+
255
+ Cached sync values of previous and current path values. For example `/dashboard` or `/user/123/task/xyz`.
@@ -1,6 +1,7 @@
1
+ import { runInInjectionContext } from '@angular/core';
1
2
  import { RdtStringUtils } from '@ngrdt/utils';
2
3
  import { RdtAngularRoute } from './rdt-angular-route';
3
- import { runInInjectionContext } from '@angular/core';
4
+ import { RdtReadonlyParameters } from './utils';
4
5
  export function ALWAYS_TRUE() {
5
6
  return true;
6
7
  }
@@ -19,30 +20,60 @@ export class RdtRoute {
19
20
  _entryDisabled = false;
20
21
  _canBeEntered = ALWAYS_TRUE;
21
22
  _absoluteRegex;
23
+ /**
24
+ * Map of parameters and their types.
25
+ */
22
26
  get paramMap() {
23
27
  return this._paramMap;
24
28
  }
29
+ /**
30
+ * Human readable name for display in breadcrumbs, title, etc.
31
+ */
25
32
  get name() {
26
33
  return this._name;
27
34
  }
35
+ /**
36
+ * Path of the route relative to parent route.
37
+ */
28
38
  get path() {
29
39
  return this._path;
30
40
  }
41
+ /**
42
+ * Parent route.
43
+ */
31
44
  get parent() {
32
45
  return this._parent;
33
46
  }
47
+ /**
48
+ * Child routes.
49
+ */
34
50
  get children() {
35
51
  return this._children;
36
52
  }
53
+ /**
54
+ * Absolute path of parent route or '/' if there is no parent.
55
+ * Hostname excluded.
56
+ */
37
57
  get basePath() {
38
58
  return this._parent ? this._parent.absolutePath : '/';
39
59
  }
60
+ /**
61
+ * Absolute path of the route. Hostname excluded.
62
+ */
40
63
  get absolutePath() {
41
64
  return RdtStringUtils.joinPaths(this.basePath, this._path);
42
65
  }
66
+ /**
67
+ * Regular expression route path relative to parent route.
68
+ * Hostname excluded.
69
+ */
43
70
  get regex() {
44
71
  return this._regex;
45
72
  }
73
+ /**
74
+ * Regular expression to match only this route (not children
75
+ * or parent routes). Hostname excluded.
76
+ */
46
77
  get absoluteRegex() {
47
78
  if (this._absoluteRegex) {
48
79
  return this._absoluteRegex;
@@ -57,30 +88,57 @@ export class RdtRoute {
57
88
  }
58
89
  return this._absoluteRegex;
59
90
  }
91
+ /**
92
+ * Denotes disabled route entry.
93
+ * If true, route should have no NgModule
94
+ * or component and only serves as virtual module
95
+ * for breadcrumb.
96
+ */
60
97
  get entryDisabled() {
61
98
  return this._entryDisabled;
62
99
  }
100
+ /**
101
+ * Statically set state params used when navigating to this instance.
102
+ */
63
103
  get stateParams() {
64
104
  return this._stateParams;
65
105
  }
106
+ /**
107
+ * Statically set query params used when navigating to this instance.
108
+ */
66
109
  get queryParams() {
67
110
  return this._queryParams;
68
111
  }
112
+ /**
113
+ * @param url Absolute path to test.
114
+ * @returns True if url matches this route.
115
+ */
69
116
  testUrl(url) {
70
117
  return this.absoluteRegex.test(url);
71
118
  }
119
+ /**
120
+ * Statically set parameters used when navigating to this instance.
121
+ */
72
122
  get staticParams() {
73
123
  return { ...this._staticParams };
74
124
  }
75
125
  get hasCanBeEnteredGuard() {
76
126
  return this._canBeEntered !== ALWAYS_TRUE;
77
127
  }
128
+ /**
129
+ * Meta guard that is used by [rdtRouterLink] and RdtMenu
130
+ * to determine if route can be entered.
131
+ * @param injector Environment or custom injector.
132
+ * @returns True if route can be entered.
133
+ */
78
134
  canBeEntered(injector) {
79
135
  return injector
80
136
  ? runInInjectionContext(injector, this._canBeEntered)
81
137
  : this._canBeEntered();
82
138
  }
83
- // Extracts url parameters from absolute url.
139
+ /**
140
+ * Extracts url parameters from absolute path for this path and each parent.
141
+ */
84
142
  parseAbsoluteUrl(url) {
85
143
  const reg = this.absoluteRegex;
86
144
  if (!reg.test(url)) {
@@ -89,7 +147,13 @@ export class RdtRoute {
89
147
  const matches = reg.exec(url);
90
148
  if (matches) {
91
149
  const values = matches.slice(1).reverse();
92
- return this.fill(values);
150
+ const obj = this.fill(values);
151
+ if (obj) {
152
+ return new RdtReadonlyParameters(obj);
153
+ }
154
+ else {
155
+ return null;
156
+ }
93
157
  }
94
158
  else {
95
159
  return null;
@@ -113,6 +177,12 @@ export class RdtRoute {
113
177
  }
114
178
  return res;
115
179
  }
180
+ /**
181
+ * Fills parameters in path with values from paramMap.
182
+ * Use withStaticParams() beforehand in case parent paths contain parameters.
183
+ * @param paramMap Must contain all parameters for this route.
184
+ * @returns Absolute path.
185
+ */
116
186
  createAbsoluteUrl(paramMap = this._staticParams) {
117
187
  if (!this._parent) {
118
188
  return this.createUrl(this.absolutePath, paramMap);
@@ -144,17 +214,23 @@ export class RdtRoute {
144
214
  }
145
215
  return new RdtAngularRoute(this);
146
216
  }
147
- // Provides static mapping for parameter names tableName -> urlName.
148
- // Returns new instance of RdtRoute<T> that is clone of
149
- // this route and its parents (NOT children).
217
+ /**
218
+ * Provides static mapping for parameter names tableName -> urlName.
219
+ * Returns new instance of RdtRoute<T> that is clone of
220
+ * this route and its parents (NOT children).
221
+ * @returns Clone of this route with mapped parameter names.
222
+ */
150
223
  withParamMappings(mappings) {
151
224
  const clone = this.clone();
152
225
  clone.paramMappings = mappings;
153
226
  return clone;
154
227
  }
155
- // Sets selected parameters for itself and parents.
156
- // Returns new instance of RdtRoute<T> that is clone of
157
- // this route and its parents (NOT children).
228
+ /**
229
+ * Sets parameters for itself or parents.
230
+ * Returns new instance of RdtRoute<T> that is clone of
231
+ * this route and its parents (NOT children).
232
+ * @returns Clone of this route with static parameters set.
233
+ */
158
234
  withStaticParams(param1, param2) {
159
235
  const clone = this.clone();
160
236
  if (param2) {
@@ -182,8 +258,9 @@ export class RdtRoute {
182
258
  clone._stateParams = { ...stateParams };
183
259
  return clone;
184
260
  }
185
- // Returns Partial of object that only contains properties
186
- // necessary to create this route.
261
+ /**
262
+ * @returns Partial of object that only contains properties necessary to create this route.
263
+ */
187
264
  extractRouteParams(row) {
188
265
  const res = {};
189
266
  this.orderedParams.forEach((param) => {
@@ -195,8 +272,10 @@ export class RdtRoute {
195
272
  });
196
273
  return res;
197
274
  }
198
- // Returns new instance of RdtRoute<T> that is clone of
199
- // this route and its parents (NOT children).
275
+ /**
276
+ * @returns New instance of RdtRoute<T> that is clone of
277
+ * this route and its parents (NOT children).
278
+ */
200
279
  clone() {
201
280
  const clone = new RdtRoute();
202
281
  clone._name = this._name;
@@ -211,4 +290,4 @@ export class RdtRoute {
211
290
  return clone;
212
291
  }
213
292
  }
214
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3JkdC1yb3V0ZS9yZHQtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUc5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFZLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE1BQU0sVUFBVSxXQUFXO0lBQ3pCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sT0FBTyxRQUFRO0lBQ1QsYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUM3QixTQUFTLEdBQW9CLEVBQUUsQ0FBQztJQUNoQyxNQUFNLENBQVU7SUFDaEIsYUFBYSxHQUFtQixFQUFFLENBQUM7SUFDbkMsYUFBYSxHQUFlLEVBQUUsQ0FBQztJQUMvQixZQUFZLEdBQVcsRUFBRSxDQUFDO0lBQzFCLFlBQVksR0FBVyxFQUFFLENBQUM7SUFFMUIsS0FBSyxDQUFVO0lBQ2YsS0FBSyxDQUFVO0lBQ2YsT0FBTyxHQUFvQixJQUFJLENBQUM7SUFDaEMsU0FBUyxHQUFlLEVBQUUsQ0FBQztJQUMzQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGFBQWEsR0FBa0IsV0FBVyxDQUFDO0lBRTdDLGNBQWMsQ0FBVTtJQUVoQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJ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R0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCw2Q0FBNkM7SUFDN0MsS0FBSztRQUNILE1BQU0sS0FBSyxHQUFHLElBQUksUUFBUSxFQUFLLENBQUM7UUFDaEMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUM7UUFDOUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxLQUFLLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDOUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3hDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLEtBQUssQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN6QyxLQUFLLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZHRTdHJpbmdVdGlscyB9IGZyb20gJ0BuZ3JkdC91dGlscyc7XHJcbmltcG9ydCB7IFN0YXRpY1JvdXRlUGFyYW1zLCBQYXJhbU1hcHBpbmcsIFBhcmFtVHlwZU1hcCB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBSZHRBbmd1bGFyUm91dGUgfSBmcm9tICcuL3JkdC1hbmd1bGFyLXJvdXRlJztcclxuaW1wb3J0IHsgSW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIEFMV0FZU19UUlVFKCkge1xyXG4gIHJldHVybiB0cnVlO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmR0Um91dGU8VCBleHRlbmRzIG9iamVjdCA9IGFueT4ge1xyXG4gIHByb3RlY3RlZCBvcmRlcmVkUGFyYW1zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHByb3RlY3RlZCBfcGFyYW1NYXA6IFBhcmFtVHlwZU1hcDxUPiA9IHt9O1xyXG4gIHByb3RlY3RlZCBfcmVnZXghOiBSZWdFeHA7XHJcbiAgcHJvdGVjdGVkIHBhcmFtTWFwcGluZ3M6IFBhcmFtTWFwcGluZ1tdID0gW107XHJcbiAgcHJvdGVjdGVkIF9zdGF0aWNQYXJhbXM6IFBhcnRpYWw8VD4gPSB7fTtcclxuICBwcm90ZWN0ZWQgX3F1ZXJ5UGFyYW1zOiBQYXJhbXMgPSB7fTtcclxuICBwcm90ZWN0ZWQgX3N0YXRlUGFyYW1zOiBQYXJhbXMgPSB7fTtcclxuXHJcbiAgcHJvdGVjdGVkIF9uYW1lITogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfcGF0aCE6IHN0cmluZztcclxuICBwcm90ZWN0ZWQgX3BhcmVudDogUmR0Um91dGUgfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgX2NoaWxkcmVuOiBSZHRSb3V0ZVtdID0gW107XHJcbiAgcHJvdGVjdGVkIF9lbnRyeURpc2FibGVkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIF9jYW5CZUVudGVyZWQ6ICgpID0+IGJvb2xlYW4gPSBBTFdBWVNfVFJVRTtcclxuXHJcbiAgcHJpdmF0ZSBfYWJzb2x1dGVSZWdleD86IFJlZ0V4cDtcclxuXHJcbiAgZ2V0IHBhcmFtTWFwKCk6IFJlYWRvbmx5PFBhcmFtVHlwZU1hcDxUPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtTWFwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBwYXRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhdGg7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFyZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcclxuICB9XHJcblxyXG4gIGdldCBjaGlsZHJlbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbjtcclxuICB9XHJcblxyXG4gIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IHRoaXMuX3BhcmVudC5hYnNvbHV0ZVBhdGggOiAnLyc7XHJcbiAgfVxyXG5cclxuICBnZXQgYWJzb2x1dGVQYXRoKCkge1xyXG4gICAgcmV0dXJuIFJkdFN0cmluZ1V0aWxzLmpvaW5QYXRocyh0aGlzLmJhc2VQYXRoLCB0aGlzLl9wYXRoKTtcclxuICB9XHJcblxyXG4gIGdldCByZWdleCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWdleDtcclxuICB9XHJcblxyXG4gIGdldCBhYnNvbHV0ZVJlZ2V4KCk6IFJlZ0V4cCB7XHJcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVSZWdleCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYWJzb2x1dGVSZWdleDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fcGFyZW50KSB7XHJcbiAgICAgIC8vIFJlbW92ZSBpbml0aWFsIF4gYW5kIGVuZGluZyAkXHJcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX3BhcmVudC5hYnNvbHV0ZVJlZ2V4LnNvdXJjZS5zbGljZSgxLCAtMSk7XHJcbiAgICAgIHRoaXMuX2Fic29sdXRlUmVnZXggPSBuZXcgUmVnRXhwKFxyXG4gICAgICAgICdeJyArIFJkdFN0cmluZ1V0aWxzLmpvaW5QYXRocyhwYXJlbnQsIHRoaXMuX3JlZ2V4LnNvdXJjZSkgKyAnJCdcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2Fic29sdXRlUmVnZXggPSBuZXcgUmVnRXhwKFxyXG4gICAgICAgICdeJyArIFJkdFN0cmluZ1V0aWxzLmpvaW5QYXRocygnLycsIHRoaXMuX3JlZ2V4LnNvdXJjZSkgKyAnJCdcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVJlZ2V4O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGVudHJ5RGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW50cnlEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIGdldCBzdGF0ZVBhcmFtcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZVBhcmFtcztcclxuICB9XHJcblxyXG4gIGdldCBxdWVyeVBhcmFtcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtcztcclxuICB9XHJcblxyXG4gIHRlc3RVcmwodXJsOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmFic29sdXRlUmVnZXgudGVzdCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHN0YXRpY1BhcmFtcygpIHtcclxuICAgIHJldHVybiB7IC4uLnRoaXMuX3N0YXRpY1BhcmFtcyB9O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0NhbkJlRW50ZXJlZEd1YXJkKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NhbkJlRW50ZXJlZCAhPT0gQUxXQVlTX1RSVUU7XHJcbiAgfVxyXG5cclxuICBjYW5CZUVudGVyZWQoaW5qZWN0b3I/OiBJbmplY3Rvcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGluamVjdG9yXHJcbiAgICAgID8gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCB0aGlzLl9jYW5CZUVudGVyZWQpXHJcbiAgICAgIDogdGhpcy5fY2FuQmVFbnRlcmVkKCk7XHJcbiAgfVxyXG5cclxuICAvLyBFeHRyYWN0cyB1cmwgcGFyYW1ldGVycyBmcm9tIGFic29sdXRlIHVybC5cclxuICBwYXJzZUFic29sdXRlVXJsKHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwge1xyXG4gICAgY29uc3QgcmVnID0gdGhpcy5hYnNvbHV0ZVJlZ2V4O1xyXG4gICAgaWYgKCFyZWcudGVzdCh1cmwpKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3QgbWF0Y2hlcyA9IHJlZy5leGVjKHVybCk7XHJcbiAgICBpZiAobWF0Y2hlcykge1xyXG4gICAgICBjb25zdCB2YWx1ZXMgPSBtYXRjaGVzLnNsaWNlKDEpLnJldmVyc2UoKTtcclxuICAgICAgcmV0dXJuIHRoaXMuZmlsbCh2YWx1ZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGwodmFsdWVzOiBzdHJpbmdbXSwgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pIHtcclxuICAgIGNvbnN0IHBhcmFtczogeyBba2V5IGluIGtleW9mIFRdPzogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fTtcclxuICAgIGNvbnN0IHJldmVyc2VkUGFyYW1zID0gdGhpcy5vcmRlcmVkUGFyYW1zLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXZlcnNlZFBhcmFtcy5sZW5ndGggJiYgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSByZXZlcnNlZFBhcmFtc1tpXSBhcyBrZXlvZiBUO1xyXG4gICAgICBjb25zdCBtYXBwZWRLZXkgPVxyXG4gICAgICAgIHRoaXMucGFyYW1NYXBwaW5ncy5maW5kKChtKSA9PiBtLnVybE5hbWUgPT09IGtleSk/LnRhYmxlTmFtZSA/PyBrZXk7XHJcbiAgICAgIGxldCB2YWw6IHN0cmluZyB8IG51bWJlciA9IHZhbHVlc1tpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYXJhbU1hcFtrZXldID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHZhbCA9IHBhcnNlSW50KHZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zW21hcHBlZEtleSBhcyBrZXlvZiBUXSA9IHZhbDtcclxuICAgIH1cclxuICAgIHJlc1t0aGlzLmFic29sdXRlUGF0aF0gPSBwYXJhbXM7XHJcblxyXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiByZXZlcnNlZFBhcmFtcy5sZW5ndGggJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudC5maWxsKHZhbHVlcy5zbGljZShyZXZlcnNlZFBhcmFtcy5sZW5ndGgpLCByZXMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGNyZWF0ZUFic29sdXRlVXJsKHBhcmFtTWFwOiBQYXJ0aWFsPFQ+ID0gdGhpcy5fc3RhdGljUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVybCh0aGlzLmFic29sdXRlUGF0aCwgcGFyYW1NYXApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFJkdFN0cmluZ1V0aWxzLmpvaW5QYXRocyhcclxuICAgICAgICB0aGlzLl9wYXJlbnQuY3JlYXRlQWJzb2x1dGVVcmwoKSxcclxuICAgICAgICB0aGlzLmNyZWF0ZVJlbGF0aXZlVXJsKHBhcmFtTWFwKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlUmVsYXRpdmVVcmwocGFyYW1NYXA6IFBhcnRpYWw8VD4gPSB0aGlzLl9zdGF0aWNQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVVybCh0aGlzLnBhdGgsIHBhcmFtTWFwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVXJsKHBhdGg6IHN0cmluZywgcGFyYW1NYXA6IFBhcnRpYWw8VD4pIHtcclxuICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9wYXJhbU1hcCk7XHJcbiAgICBwYXJhbU5hbWVzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xyXG4gICAgY29uc3QgZXh0ZW5kZWRQYXJhbU1hcDogYW55ID0geyAuLi5wYXJhbU1hcCB9O1xyXG5cclxuICAgIHRoaXMucGFyYW1NYXBwaW5ncy5mb3JFYWNoKChtYXBwaW5nKSA9PiB7XHJcbiAgICAgIGlmIChtYXBwaW5nLnRhYmxlTmFtZSBpbiBwYXJhbU1hcCkge1xyXG4gICAgICAgIGV4dGVuZGVkUGFyYW1NYXBbbWFwcGluZy51cmxOYW1lXSA9IChwYXJhbU1hcCBhcyBhbnkpW1xyXG4gICAgICAgICAgbWFwcGluZy50YWJsZU5hbWVcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwYXJhbU5hbWVzLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoYDoke3BhcmFtfWAsIGAke2V4dGVuZGVkUGFyYW1NYXBbcGFyYW0gYXMga2V5b2YgVF19YCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcblxyXG4gIHRvQW5ndWxhclJvdXRlKCkge1xyXG4gICAgaWYgKCF0aGlzLl9yZWdleCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGZpcnN0IGNhbGwgLmJ1aWxkKCkgb24gcm91dGUhJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJkdEFuZ3VsYXJSb3V0ZTxUPih0aGlzKTtcclxuICB9XHJcblxyXG4gIC8vIFByb3ZpZGVzIHN0YXRpYyBtYXBwaW5nIGZvciBwYXJhbWV0ZXIgbmFtZXMgdGFibGVOYW1lIC0+IHVybE5hbWUuXHJcbiAgLy8gUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgUmR0Um91dGU8VD4gdGhhdCBpcyBjbG9uZSBvZlxyXG4gIC8vIHRoaXMgcm91dGUgYW5kIGl0cyBwYXJlbnRzIChOT1QgY2hpbGRyZW4pLlxyXG4gIHdpdGhQYXJhbU1hcHBpbmdzKG1hcHBpbmdzOiBQYXJhbU1hcHBpbmdbXSkge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5wYXJhbU1hcHBpbmdzID0gbWFwcGluZ3M7XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICB3aXRoU3RhdGljUGFyYW1zKHBhcmFtczogVCk6IFJkdFJvdXRlPFQ+O1xyXG4gIHdpdGhTdGF0aWNQYXJhbXM8VDIgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gICAgcm91dGU6IFJkdFJvdXRlPFQ+LFxyXG4gICAgcGFyYW1zOiBUMlxyXG4gICk6IFJkdFJvdXRlPFQ+O1xyXG5cclxuICAvLyBTZXRzIHNlbGVjdGVkIHBhcmFtZXRlcnMgZm9yIGl0c2VsZiBhbmQgcGFyZW50cy5cclxuICAvLyBSZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBSZHRSb3V0ZTxUPiB0aGF0IGlzIGNsb25lIG9mXHJcbiAgLy8gdGhpcyByb3V0ZSBhbmQgaXRzIHBhcmVudHMgKE5PVCBjaGlsZHJlbikuXHJcbiAgd2l0aFN0YXRpY1BhcmFtczxUMiBleHRlbmRzIG9iamVjdD4ocGFyYW0xOiBSZHRSb3V0ZTxUMj4gfCBULCBwYXJhbTI/OiBUMikge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcblxyXG4gICAgaWYgKHBhcmFtMikge1xyXG4gICAgICBjb25zdCByb3V0ZUFic1BhdGggPSAocGFyYW0xIGFzIFJkdFJvdXRlPFQyPikuYWJzb2x1dGVQYXRoO1xyXG4gICAgICBsZXQgY3VycmVudDogUmR0Um91dGUgfCBudWxsID0gY2xvbmU7XHJcblxyXG4gICAgICB3aGlsZSAoY3VycmVudCkge1xyXG4gICAgICAgIGlmIChjdXJyZW50LmFic29sdXRlUGF0aCA9PT0gcm91dGVBYnNQYXRoKSB7XHJcbiAgICAgICAgICBjdXJyZW50Ll9zdGF0aWNQYXJhbXMgPSBwYXJhbTI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Ll9wYXJlbnQ7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNsb25lLl9zdGF0aWNQYXJhbXMgPSBwYXJhbTEgYXMgVDtcclxuICAgIH1cclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIHdpdGhRdWVyeVBhcmFtcyhxdWVyeVBhcmFtczogUGFyYW1zKSB7XHJcbiAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcclxuICAgIGNsb25lLl9xdWVyeVBhcmFtcyA9IHsgLi4ucXVlcnlQYXJhbXMgfTtcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIHdpdGhTdGF0ZVBhcmFtcyhzdGF0ZVBhcmFtczogUGFyYW1zKSB7XHJcbiAgICBjb25zdCBjbG9uZSA9IHRoaXMuY2xvbmUoKTtcclxuICAgIGNsb25lLl9zdGF0ZVBhcmFtcyA9IHsgLi4uc3RhdGVQYXJhbXMgfTtcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcblxyXG4gIC8vIFJldHVybnMgUGFydGlhbCBvZiBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIHByb3BlcnRpZXNcclxuICAvLyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoaXMgcm91dGUuXHJcbiAgZXh0cmFjdFJvdXRlUGFyYW1zKHJvdzogVCk6IFBhcnRpYWw8VD4ge1xyXG4gICAgY29uc3QgcmVzOiBQYXJ0aWFsPFQ+ID0ge307XHJcblxyXG4gICAgdGhpcy5vcmRlcmVkUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLnBhcmFtTWFwcGluZ3MuZmluZCgobSkgPT4gbS51cmxOYW1lID09PSBwYXJhbSk7XHJcbiAgICAgIGNvbnN0IG1hcHBlZFBhcmFtID0gKG1hcHBpbmc/LnRhYmxlTmFtZSA/PyBwYXJhbSkgYXMga2V5b2YgVDtcclxuICAgICAgaWYgKG1hcHBlZFBhcmFtIGluIHJvdykge1xyXG4gICAgICAgIHJlc1ttYXBwZWRQYXJhbV0gPSByb3dbbWFwcGVkUGFyYW1dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgUmR0Um91dGU8VD4gdGhhdCBpcyBjbG9uZSBvZlxyXG4gIC8vIHRoaXMgcm91dGUgYW5kIGl0cyBwYXJlbnRzIChOT1QgY2hpbGRyZW4pLlxyXG4gIGNsb25lKCkge1xyXG4gICAgY29uc3QgY2xvbmUgPSBuZXcgUmR0Um91dGU8VD4oKTtcclxuICAgIGNsb25lLl9uYW1lID0gdGhpcy5fbmFtZTtcclxuICAgIGNsb25lLl9wYXJlbnQgPSB0aGlzLl9wYXJlbnQ/LmNsb25lKCkgPz8gbnVsbDtcclxuICAgIGNsb25lLl9wYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgY2xvbmUuX2VudHJ5RGlzYWJsZWQgPSB0aGlzLl9lbnRyeURpc2FibGVkO1xyXG4gICAgY2xvbmUub3JkZXJlZFBhcmFtcyA9IFsuLi50aGlzLm9yZGVyZWRQYXJhbXNdO1xyXG4gICAgY2xvbmUuX3BhcmFtTWFwID0geyAuLi50aGlzLl9wYXJhbU1hcCB9O1xyXG4gICAgY2xvbmUuX3JlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLl9yZWdleCk7XHJcbiAgICBjbG9uZS5wYXJhbU1hcHBpbmdzID0gdGhpcy5wYXJhbU1hcHBpbmdzO1xyXG4gICAgY2xvbmUuX3N0YXRpY1BhcmFtcyA9IHRoaXMuX3N0YXRpY1BhcmFtcztcclxuICAgIHJldHVybiBjbG9uZTtcclxuICB9XHJcbn1cclxuIl19
293
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vQG5ncmR0L3JvdXRlci9zcmMvbGliL3JkdC1yb3V0ZS9yZHQtcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFZLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDOUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBOEIscUJBQXFCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFNUUsTUFBTSxVQUFVLFdBQVc7SUFDekIsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxPQUFPLFFBQVE7SUFDVCxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQzdCLFNBQVMsR0FBb0IsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBVTtJQUNoQixhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUNuQyxhQUFhLEdBQWUsRUFBRSxDQUFDO0lBQy9CLFlBQVksR0FBVyxFQUFFLENBQUM7SUFDMUIsWUFBWSxHQUFXLEVBQUUsQ0FBQztJQUUxQixLQUFLLENBQVU7SUFDZixLQUFLLENBQVU7SUFDZixPQUFPLEdBQW9CLElBQUksQ0FBQztJQUNoQyxTQUFTLEdBQWUsRUFBRSxDQUFDO0lBQzNCLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDdkIsYUFBYSxHQUFrQixXQUFXLENBQUM7SUFFN0MsY0FBYyxDQUFVO0lBRWhDOztPQUVHO0lBQ0gsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxL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QUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBSZHRTdHJpbmdVdGlscyB9IGZyb20gJ0BuZ3JkdC91dGlscyc7XHJcbmltcG9ydCB7IFJkdEFuZ3VsYXJSb3V0ZSB9IGZyb20gJy4vcmR0LWFuZ3VsYXItcm91dGUnO1xyXG5pbXBvcnQgeyBQYXJhbU1hcHBpbmcsIFBhcmFtVHlwZU1hcCwgUmR0UmVhZG9ubHlQYXJhbWV0ZXJzIH0gZnJvbSAnLi91dGlscyc7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gQUxXQVlTX1RSVUUoKSB7XHJcbiAgcmV0dXJuIHRydWU7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZHRSb3V0ZTxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PiB7XHJcbiAgcHJvdGVjdGVkIG9yZGVyZWRQYXJhbXM6IHN0cmluZ1tdID0gW107XHJcbiAgcHJvdGVjdGVkIF9wYXJhbU1hcDogUGFyYW1UeXBlTWFwPFQ+ID0ge307XHJcbiAgcHJvdGVjdGVkIF9yZWdleCE6IFJlZ0V4cDtcclxuICBwcm90ZWN0ZWQgcGFyYW1NYXBwaW5nczogUGFyYW1NYXBwaW5nW10gPSBbXTtcclxuICBwcm90ZWN0ZWQgX3N0YXRpY1BhcmFtczogUGFydGlhbDxUPiA9IHt9O1xyXG4gIHByb3RlY3RlZCBfcXVlcnlQYXJhbXM6IFBhcmFtcyA9IHt9O1xyXG4gIHByb3RlY3RlZCBfc3RhdGVQYXJhbXM6IFBhcmFtcyA9IHt9O1xyXG5cclxuICBwcm90ZWN0ZWQgX25hbWUhOiBzdHJpbmc7XHJcbiAgcHJvdGVjdGVkIF9wYXRoITogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBfcGFyZW50OiBSZHRSb3V0ZSB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCBfY2hpbGRyZW46IFJkdFJvdXRlW10gPSBbXTtcclxuICBwcm90ZWN0ZWQgX2VudHJ5RGlzYWJsZWQgPSBmYWxzZTtcclxuICBwcm90ZWN0ZWQgX2NhbkJlRW50ZXJlZDogKCkgPT4gYm9vbGVhbiA9IEFMV0FZU19UUlVFO1xyXG5cclxuICBwcml2YXRlIF9hYnNvbHV0ZVJlZ2V4PzogUmVnRXhwO1xyXG5cclxuICAvKipcclxuICAgKiBNYXAgb2YgcGFyYW1ldGVycyBhbmQgdGhlaXIgdHlwZXMuXHJcbiAgICovXHJcbiAgZ2V0IHBhcmFtTWFwKCk6IFJlYWRvbmx5PFBhcmFtVHlwZU1hcDxUPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtTWFwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSHVtYW4gcmVhZGFibGUgbmFtZSBmb3IgZGlzcGxheSBpbiBicmVhZGNydW1icywgdGl0bGUsIGV0Yy5cclxuICAgKi9cclxuICBnZXQgbmFtZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9uYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCBvZiB0aGUgcm91dGUgcmVsYXRpdmUgdG8gcGFyZW50IHJvdXRlLlxyXG4gICAqL1xyXG4gIGdldCBwYXRoKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhdGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJlbnQgcm91dGUuXHJcbiAgICovXHJcbiAgZ2V0IHBhcmVudCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGlsZCByb3V0ZXMuXHJcbiAgICovXHJcbiAgZ2V0IGNoaWxkcmVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJzb2x1dGUgcGF0aCBvZiBwYXJlbnQgcm91dGUgb3IgJy8nIGlmIHRoZXJlIGlzIG5vIHBhcmVudC5cclxuICAgKiBIb3N0bmFtZSBleGNsdWRlZC5cclxuICAgKi9cclxuICBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuYWJzb2x1dGVQYXRoIDogJy8nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJzb2x1dGUgcGF0aCBvZiB0aGUgcm91dGUuIEhvc3RuYW1lIGV4Y2x1ZGVkLlxyXG4gICAqL1xyXG4gIGdldCBhYnNvbHV0ZVBhdGgoKSB7XHJcbiAgICByZXR1cm4gUmR0U3RyaW5nVXRpbHMuam9pblBhdGhzKHRoaXMuYmFzZVBhdGgsIHRoaXMuX3BhdGgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVndWxhciBleHByZXNzaW9uIHJvdXRlIHBhdGggcmVsYXRpdmUgdG8gcGFyZW50IHJvdXRlLlxyXG4gICAqIEhvc3RuYW1lIGV4Y2x1ZGVkLlxyXG4gICAqL1xyXG4gIGdldCByZWdleCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9yZWdleDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBvbmx5IHRoaXMgcm91dGUgKG5vdCBjaGlsZHJlblxyXG4gICAqIG9yIHBhcmVudCByb3V0ZXMpLiBIb3N0bmFtZSBleGNsdWRlZC5cclxuICAgKi9cclxuICBnZXQgYWJzb2x1dGVSZWdleCgpOiBSZWdFeHAge1xyXG4gICAgaWYgKHRoaXMuX2Fic29sdXRlUmVnZXgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2Fic29sdXRlUmVnZXg7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX3BhcmVudCkge1xyXG4gICAgICAvLyBSZW1vdmUgaW5pdGlhbCBeIGFuZCBlbmRpbmcgJFxyXG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnQuYWJzb2x1dGVSZWdleC5zb3VyY2Uuc2xpY2UoMSwgLTEpO1xyXG4gICAgICB0aGlzLl9hYnNvbHV0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgICAgICAnXicgKyBSZHRTdHJpbmdVdGlscy5qb2luUGF0aHMocGFyZW50LCB0aGlzLl9yZWdleC5zb3VyY2UpICsgJyQnXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9hYnNvbHV0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChcclxuICAgICAgICAnXicgKyBSZHRTdHJpbmdVdGlscy5qb2luUGF0aHMoJy8nLCB0aGlzLl9yZWdleC5zb3VyY2UpICsgJyQnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fYWJzb2x1dGVSZWdleDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbm90ZXMgZGlzYWJsZWQgcm91dGUgZW50cnkuXHJcbiAgICogSWYgdHJ1ZSwgcm91dGUgc2hvdWxkIGhhdmUgbm8gTmdNb2R1bGVcclxuICAgKiBvciBjb21wb25lbnQgYW5kIG9ubHkgc2VydmVzIGFzIHZpcnR1YWwgbW9kdWxlXHJcbiAgICogZm9yIGJyZWFkY3J1bWIuXHJcbiAgICovXHJcbiAgZ2V0IGVudHJ5RGlzYWJsZWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW50cnlEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXRpY2FsbHkgc2V0IHN0YXRlIHBhcmFtcyB1c2VkIHdoZW4gbmF2aWdhdGluZyB0byB0aGlzIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGdldCBzdGF0ZVBhcmFtcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9zdGF0ZVBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXRpY2FsbHkgc2V0IHF1ZXJ5IHBhcmFtcyB1c2VkIHdoZW4gbmF2aWdhdGluZyB0byB0aGlzIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIGdldCBxdWVyeVBhcmFtcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9xdWVyeVBhcmFtcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwYXJhbSB1cmwgQWJzb2x1dGUgcGF0aCB0byB0ZXN0LlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdXJsIG1hdGNoZXMgdGhpcyByb3V0ZS5cclxuICAgKi9cclxuICB0ZXN0VXJsKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hYnNvbHV0ZVJlZ2V4LnRlc3QodXJsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXRpY2FsbHkgc2V0IHBhcmFtZXRlcnMgdXNlZCB3aGVuIG5hdmlnYXRpbmcgdG8gdGhpcyBpbnN0YW5jZS5cclxuICAgKi9cclxuICBnZXQgc3RhdGljUGFyYW1zKCkge1xyXG4gICAgcmV0dXJuIHsgLi4udGhpcy5fc3RhdGljUGFyYW1zIH07XHJcbiAgfVxyXG5cclxuICBnZXQgaGFzQ2FuQmVFbnRlcmVkR3VhcmQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2FuQmVFbnRlcmVkICE9PSBBTFdBWVNfVFJVRTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGEgZ3VhcmQgdGhhdCBpcyB1c2VkIGJ5IFtyZHRSb3V0ZXJMaW5rXSBhbmQgUmR0TWVudVxyXG4gICAqIHRvIGRldGVybWluZSBpZiByb3V0ZSBjYW4gYmUgZW50ZXJlZC5cclxuICAgKiBAcGFyYW0gaW5qZWN0b3IgRW52aXJvbm1lbnQgb3IgY3VzdG9tIGluamVjdG9yLlxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgcm91dGUgY2FuIGJlIGVudGVyZWQuXHJcbiAgICovXHJcbiAgY2FuQmVFbnRlcmVkKGluamVjdG9yPzogSW5qZWN0b3IpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbmplY3RvclxyXG4gICAgICA/IHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgdGhpcy5fY2FuQmVFbnRlcmVkKVxyXG4gICAgICA6IHRoaXMuX2NhbkJlRW50ZXJlZCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXh0cmFjdHMgdXJsIHBhcmFtZXRlcnMgZnJvbSBhYnNvbHV0ZSBwYXRoIGZvciB0aGlzIHBhdGggYW5kIGVhY2ggcGFyZW50LlxyXG4gICAqL1xyXG4gIHBhcnNlQWJzb2x1dGVVcmwodXJsOiBzdHJpbmcpOiBSZHRSZWFkb25seVBhcmFtZXRlcnMgfCBudWxsIHtcclxuICAgIGNvbnN0IHJlZyA9IHRoaXMuYWJzb2x1dGVSZWdleDtcclxuICAgIGlmICghcmVnLnRlc3QodXJsKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IG1hdGNoZXMgPSByZWcuZXhlYyh1cmwpO1xyXG4gICAgaWYgKG1hdGNoZXMpIHtcclxuICAgICAgY29uc3QgdmFsdWVzID0gbWF0Y2hlcy5zbGljZSgxKS5yZXZlcnNlKCk7XHJcbiAgICAgIGNvbnN0IG9iaiA9IHRoaXMuZmlsbCh2YWx1ZXMpO1xyXG4gICAgICBpZiAob2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZHRSZWFkb25seVBhcmFtZXRlcnMob2JqKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpbGwodmFsdWVzOiBzdHJpbmdbXSwgcmVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pIHtcclxuICAgIGNvbnN0IHBhcmFtczogeyBba2V5IGluIGtleW9mIFRdPzogc3RyaW5nIHwgbnVtYmVyIH0gPSB7fTtcclxuICAgIGNvbnN0IHJldmVyc2VkUGFyYW1zID0gdGhpcy5vcmRlcmVkUGFyYW1zLnNsaWNlKCkucmV2ZXJzZSgpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXZlcnNlZFBhcmFtcy5sZW5ndGggJiYgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBjb25zdCBrZXkgPSByZXZlcnNlZFBhcmFtc1tpXSBhcyBrZXlvZiBUO1xyXG4gICAgICBjb25zdCBtYXBwZWRLZXkgPVxyXG4gICAgICAgIHRoaXMucGFyYW1NYXBwaW5ncy5maW5kKChtKSA9PiBtLnVybE5hbWUgPT09IGtleSk/LnRhYmxlTmFtZSA/PyBrZXk7XHJcbiAgICAgIGxldCB2YWw6IHN0cmluZyB8IG51bWJlciA9IHZhbHVlc1tpXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9wYXJhbU1hcFtrZXldID09PSAnbnVtYmVyJykge1xyXG4gICAgICAgIHZhbCA9IHBhcnNlSW50KHZhbCk7XHJcbiAgICAgIH1cclxuICAgICAgcGFyYW1zW21hcHBlZEtleSBhcyBrZXlvZiBUXSA9IHZhbDtcclxuICAgIH1cclxuICAgIHJlc1t0aGlzLmFic29sdXRlUGF0aF0gPSBwYXJhbXM7XHJcblxyXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPiByZXZlcnNlZFBhcmFtcy5sZW5ndGggJiYgdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgIHRoaXMuX3BhcmVudC5maWxsKHZhbHVlcy5zbGljZShyZXZlcnNlZFBhcmFtcy5sZW5ndGgpLCByZXMpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpbGxzIHBhcmFtZXRlcnMgaW4gcGF0aCB3aXRoIHZhbHVlcyBmcm9tIHBhcmFtTWFwLlxyXG4gICAqIFVzZSB3aXRoU3RhdGljUGFyYW1zKCkgYmVmb3JlaGFuZCBpbiBjYXNlIHBhcmVudCBwYXRocyBjb250YWluIHBhcmFtZXRlcnMuXHJcbiAgICogQHBhcmFtIHBhcmFtTWFwIE11c3QgY29udGFpbiBhbGwgcGFyYW1ldGVycyBmb3IgdGhpcyByb3V0ZS5cclxuICAgKiBAcmV0dXJucyBBYnNvbHV0ZSBwYXRoLlxyXG4gICAqL1xyXG4gIGNyZWF0ZUFic29sdXRlVXJsKHBhcmFtTWFwOiBQYXJ0aWFsPFQ+ID0gdGhpcy5fc3RhdGljUGFyYW1zKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVVybCh0aGlzLmFic29sdXRlUGF0aCwgcGFyYW1NYXApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFJkdFN0cmluZ1V0aWxzLmpvaW5QYXRocyhcclxuICAgICAgICB0aGlzLl9wYXJlbnQuY3JlYXRlQWJzb2x1dGVVcmwoKSxcclxuICAgICAgICB0aGlzLmNyZWF0ZVJlbGF0aXZlVXJsKHBhcmFtTWFwKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY3JlYXRlUmVsYXRpdmVVcmwocGFyYW1NYXA6IFBhcnRpYWw8VD4gPSB0aGlzLl9zdGF0aWNQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZVVybCh0aGlzLnBhdGgsIHBhcmFtTWFwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlVXJsKHBhdGg6IHN0cmluZywgcGFyYW1NYXA6IFBhcnRpYWw8VD4pIHtcclxuICAgIGNvbnN0IHBhcmFtTmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLl9wYXJhbU1hcCk7XHJcbiAgICBwYXJhbU5hbWVzLnNvcnQoKGEsIGIpID0+IGIubGVuZ3RoIC0gYS5sZW5ndGgpO1xyXG4gICAgY29uc3QgZXh0ZW5kZWRQYXJhbU1hcDogYW55ID0geyAuLi5wYXJhbU1hcCB9O1xyXG5cclxuICAgIHRoaXMucGFyYW1NYXBwaW5ncy5mb3JFYWNoKChtYXBwaW5nKSA9PiB7XHJcbiAgICAgIGlmIChtYXBwaW5nLnRhYmxlTmFtZSBpbiBwYXJhbU1hcCkge1xyXG4gICAgICAgIGV4dGVuZGVkUGFyYW1NYXBbbWFwcGluZy51cmxOYW1lXSA9IChwYXJhbU1hcCBhcyBhbnkpW1xyXG4gICAgICAgICAgbWFwcGluZy50YWJsZU5hbWVcclxuICAgICAgICBdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBwYXJhbU5hbWVzLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoYDoke3BhcmFtfWAsIGAke2V4dGVuZGVkUGFyYW1NYXBbcGFyYW0gYXMga2V5b2YgVF19YCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcGF0aDtcclxuICB9XHJcblxyXG4gIHRvQW5ndWxhclJvdXRlKCkge1xyXG4gICAgaWYgKCF0aGlzLl9yZWdleCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBoYXZlIHRvIGZpcnN0IGNhbGwgLmJ1aWxkKCkgb24gcm91dGUhJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFJkdEFuZ3VsYXJSb3V0ZTxUPih0aGlzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb3ZpZGVzIHN0YXRpYyBtYXBwaW5nIGZvciBwYXJhbWV0ZXIgbmFtZXMgdGFibGVOYW1lIC0+IHVybE5hbWUuXHJcbiAgICogUmV0dXJucyBuZXcgaW5zdGFuY2Ugb2YgUmR0Um91dGU8VD4gdGhhdCBpcyBjbG9uZSBvZlxyXG4gICAqIHRoaXMgcm91dGUgYW5kIGl0cyBwYXJlbnRzIChOT1QgY2hpbGRyZW4pLlxyXG4gICAqIEByZXR1cm5zIENsb25lIG9mIHRoaXMgcm91dGUgd2l0aCBtYXBwZWQgcGFyYW1ldGVyIG5hbWVzLlxyXG4gICAqL1xyXG4gIHdpdGhQYXJhbU1hcHBpbmdzKG1hcHBpbmdzOiBQYXJhbU1hcHBpbmdbXSkge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5wYXJhbU1hcHBpbmdzID0gbWFwcGluZ3M7XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHN0YXRpYyBwYXJhbWV0ZXJzIGZvciB0aGlzIHJvdXRlLlxyXG4gICAqIEBwYXJhbSBwYXJhbXMgU3RhdGljIHBhcmFtZXRlcnMgZm9yIHRoaXMgcm91dGUuXHJcbiAgICogQHJldHVybnMgQ2xvbmUgb2YgdGhpcyB3aXRoIHN0YXRpYyBwYXJhbWV0ZXJzIHNldC5cclxuICAgKi9cclxuICB3aXRoU3RhdGljUGFyYW1zKHBhcmFtczogVCk6IFJkdFJvdXRlPFQ+O1xyXG4gIHdpdGhTdGF0aWNQYXJhbXM8VDIgZXh0ZW5kcyBvYmplY3Q+KFxyXG4gICAgcm91dGU6IFJkdFJvdXRlPFQ+LFxyXG4gICAgcGFyYW1zOiBUMlxyXG4gICk6IFJkdFJvdXRlPFQ+O1xyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHBhcmFtZXRlcnMgZm9yIGl0c2VsZiBvciBwYXJlbnRzLlxyXG4gICAqIFJldHVybnMgbmV3IGluc3RhbmNlIG9mIFJkdFJvdXRlPFQ+IHRoYXQgaXMgY2xvbmUgb2ZcclxuICAgKiB0aGlzIHJvdXRlIGFuZCBpdHMgcGFyZW50cyAoTk9UIGNoaWxkcmVuKS5cclxuICAgKiBAcmV0dXJucyBDbG9uZSBvZiB0aGlzIHJvdXRlIHdpdGggc3RhdGljIHBhcmFtZXRlcnMgc2V0LlxyXG4gICAqL1xyXG4gIHdpdGhTdGF0aWNQYXJhbXM8VDIgZXh0ZW5kcyBvYmplY3Q+KHBhcmFtMTogUmR0Um91dGU8VDI+IHwgVCwgcGFyYW0yPzogVDIpIHtcclxuICAgIGNvbnN0IGNsb25lID0gdGhpcy5jbG9uZSgpO1xyXG5cclxuICAgIGlmIChwYXJhbTIpIHtcclxuICAgICAgY29uc3Qgcm91dGVBYnNQYXRoID0gKHBhcmFtMSBhcyBSZHRSb3V0ZTxUMj4pLmFic29sdXRlUGF0aDtcclxuICAgICAgbGV0IGN1cnJlbnQ6IFJkdFJvdXRlIHwgbnVsbCA9IGNsb25lO1xyXG5cclxuICAgICAgd2hpbGUgKGN1cnJlbnQpIHtcclxuICAgICAgICBpZiAoY3VycmVudC5hYnNvbHV0ZVBhdGggPT09IHJvdXRlQWJzUGF0aCkge1xyXG4gICAgICAgICAgY3VycmVudC5fc3RhdGljUGFyYW1zID0gcGFyYW0yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50O1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjbG9uZS5fc3RhdGljUGFyYW1zID0gcGFyYW0xIGFzIFQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICB3aXRoUXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFBhcmFtcykge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5fcXVlcnlQYXJhbXMgPSB7IC4uLnF1ZXJ5UGFyYW1zIH07XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICB3aXRoU3RhdGVQYXJhbXMoc3RhdGVQYXJhbXM6IFBhcmFtcykge1xyXG4gICAgY29uc3QgY2xvbmUgPSB0aGlzLmNsb25lKCk7XHJcbiAgICBjbG9uZS5fc3RhdGVQYXJhbXMgPSB7IC4uLnN0YXRlUGFyYW1zIH07XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcmV0dXJucyBQYXJ0aWFsIG9mIG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMgcHJvcGVydGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoaXMgcm91dGUuXHJcbiAgICovXHJcbiAgZXh0cmFjdFJvdXRlUGFyYW1zKHJvdzogVCk6IFBhcnRpYWw8VD4ge1xyXG4gICAgY29uc3QgcmVzOiBQYXJ0aWFsPFQ+ID0ge307XHJcblxyXG4gICAgdGhpcy5vcmRlcmVkUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hcHBpbmcgPSB0aGlzLnBhcmFtTWFwcGluZ3MuZmluZCgobSkgPT4gbS51cmxOYW1lID09PSBwYXJhbSk7XHJcbiAgICAgIGNvbnN0IG1hcHBlZFBhcmFtID0gKG1hcHBpbmc/LnRhYmxlTmFtZSA/PyBwYXJhbSkgYXMga2V5b2YgVDtcclxuICAgICAgaWYgKG1hcHBlZFBhcmFtIGluIHJvdykge1xyXG4gICAgICAgIHJlc1ttYXBwZWRQYXJhbV0gPSByb3dbbWFwcGVkUGFyYW1dO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gcmVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJldHVybnMgTmV3IGluc3RhbmNlIG9mIFJkdFJvdXRlPFQ+IHRoYXQgaXMgY2xvbmUgb2ZcclxuICAgKiB0aGlzIHJvdXRlIGFuZCBpdHMgcGFyZW50cyAoTk9UIGNoaWxkcmVuKS5cclxuICAgKi9cclxuICBjbG9uZSgpIHtcclxuICAgIGNvbnN0IGNsb25lID0gbmV3IFJkdFJvdXRlPFQ+KCk7XHJcbiAgICBjbG9uZS5fbmFtZSA9IHRoaXMuX25hbWU7XHJcbiAgICBjbG9uZS5fcGFyZW50ID0gdGhpcy5fcGFyZW50Py5jbG9uZSgpID8/IG51bGw7XHJcbiAgICBjbG9uZS5fcGF0aCA9IHRoaXMucGF0aDtcclxuICAgIGNsb25lLl9lbnRyeURpc2FibGVkID0gdGhpcy5fZW50cnlEaXNhYmxlZDtcclxuICAgIGNsb25lLm9yZGVyZWRQYXJhbXMgPSBbLi4udGhpcy5vcmRlcmVkUGFyYW1zXTtcclxuICAgIGNsb25lLl9wYXJhbU1hcCA9IHsgLi4udGhpcy5fcGFyYW1NYXAgfTtcclxuICAgIGNsb25lLl9yZWdleCA9IG5ldyBSZWdFeHAodGhpcy5fcmVnZXgpO1xyXG4gICAgY2xvbmUucGFyYW1NYXBwaW5ncyA9IHRoaXMucGFyYW1NYXBwaW5ncztcclxuICAgIGNsb25lLl9zdGF0aWNQYXJhbXMgPSB0aGlzLl9zdGF0aWNQYXJhbXM7XHJcbiAgICByZXR1cm4gY2xvbmU7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,2 +1,15 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvcm91dGVyL3NyYy9saWIvcmR0LXJvdXRlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZHRSb3V0ZSB9IGZyb20gJy4vcmR0LXJvdXRlJztcclxuXHJcbmV4cG9ydCB0eXBlIFBhcmFtVHlwZU1hcDxUPiA9IHtcclxuICBba2V5IGluIGtleW9mIFRdPzogJ3N0cmluZycgfCAnbnVtYmVyJztcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1NYXBwaW5nIHtcclxuICB1cmxOYW1lOiBzdHJpbmc7XHJcbiAgdGFibGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljUm91dGVQYXJhbXMge1xyXG4gIFthYnNvbHV0ZVBhdGg6IHN0cmluZ106IG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmR0UmVkaXJlY3RSZXR1cm5UeXBlID0gc3RyaW5nIHwgdm9pZCB8IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB0eXBlIFJkdFJlZGlyZWN0Rm4gPSAoXHJcbiAgY3VycmVudFBhdGg6IHN0cmluZyxcclxuICB0YXJnZXRQYXRoOiBzdHJpbmcsXHJcbiAgdGFyZ2V0Um91dGU6IFJkdFJvdXRlXHJcbikgPT4gUmR0UmVkaXJlY3RSZXR1cm5UeXBlO1xyXG4iXX0=
1
+ export class RdtReadonlyParameters {
2
+ params;
3
+ constructor(params = {}) {
4
+ this.params = params;
5
+ }
6
+ get(route) {
7
+ return this.params[route.absolutePath] ?? null;
8
+ }
9
+ }
10
+ export class RdtParameters extends RdtReadonlyParameters {
11
+ set(route, params) {
12
+ this.params[route.absolutePath] = params;
13
+ }
14
+ }
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvcm91dGVyL3NyYy9saWIvcmR0LXJvdXRlL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVCQSxNQUFNLE9BQU8scUJBQXFCO0lBQ0Q7SUFBL0IsWUFBK0IsU0FBNEIsRUFBRTtRQUE5QixXQUFNLEdBQU4sTUFBTSxDQUF3QjtJQUFHLENBQUM7SUFFakUsR0FBRyxDQUFtQixLQUFrQjtRQUN0QyxPQUFRLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBZ0IsSUFBSSxJQUFJLENBQUM7SUFDakUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGFBQWMsU0FBUSxxQkFBcUI7SUFDdEQsR0FBRyxDQUFtQixLQUFrQixFQUFFLE1BQWtCO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZHRSb3V0ZSB9IGZyb20gJy4vcmR0LXJvdXRlJztcclxuXHJcbmV4cG9ydCB0eXBlIFBhcmFtVHlwZU1hcDxUPiA9IHtcclxuICBba2V5IGluIGtleW9mIFRdPzogJ3N0cmluZycgfCAnbnVtYmVyJztcclxufTtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1NYXBwaW5nIHtcclxuICB1cmxOYW1lOiBzdHJpbmc7XHJcbiAgdGFibGVOYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGljUm91dGVQYXJhbXMge1xyXG4gIFthYnNvbHV0ZVBhdGg6IHN0cmluZ106IG9iamVjdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgUmR0UmVkaXJlY3RSZXR1cm5UeXBlID0gc3RyaW5nIHwgdm9pZCB8IHVuZGVmaW5lZDtcclxuXHJcbmV4cG9ydCB0eXBlIFJkdFJlZGlyZWN0Rm4gPSAoXHJcbiAgY3VycmVudFBhdGg6IHN0cmluZyxcclxuICB0YXJnZXRQYXRoOiBzdHJpbmcsXHJcbiAgdGFyZ2V0Um91dGU6IFJkdFJvdXRlXHJcbikgPT4gUmR0UmVkaXJlY3RSZXR1cm5UeXBlO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJkdFJlYWRvbmx5UGFyYW1ldGVycyB7XHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IHBhcmFtczogU3RhdGljUm91dGVQYXJhbXMgPSB7fSkge31cclxuXHJcbiAgZ2V0PFQgZXh0ZW5kcyBvYmplY3Q+KHJvdXRlOiBSZHRSb3V0ZTxUPik6IFBhcnRpYWw8VD4gfCBudWxsIHtcclxuICAgIHJldHVybiAodGhpcy5wYXJhbXNbcm91dGUuYWJzb2x1dGVQYXRoXSBhcyBQYXJ0aWFsPFQ+KSA/PyBudWxsO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFJkdFBhcmFtZXRlcnMgZXh0ZW5kcyBSZHRSZWFkb25seVBhcmFtZXRlcnMge1xyXG4gIHNldDxUIGV4dGVuZHMgb2JqZWN0Pihyb3V0ZTogUmR0Um91dGU8VD4sIHBhcmFtczogUGFydGlhbDxUPikge1xyXG4gICAgdGhpcy5wYXJhbXNbcm91dGUuYWJzb2x1dGVQYXRoXSA9IHBhcmFtcztcclxuICB9XHJcbn1cclxuIl19