ng2-rest 16.444.4 → 16.444.6
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 +135 -135
- package/assets/shared/shared_folder_info.txt +1 -1
- package/browser/README.md +24 -24
- package/browser/esm2022/lib/models.mjs +1 -1
- package/browser/fesm2022/ng2-rest.mjs.map +1 -1
- package/browser/lib/models.d.ts +1 -1
- package/client/README.md +24 -24
- package/client/esm2022/lib/models.mjs +1 -1
- package/client/fesm2022/ng2-rest.mjs.map +1 -1
- package/client/lib/models.d.ts +1 -1
- package/client/package.json +25 -24
- package/firedev.jsonc +43 -43
- package/lib/build-info._auto-generated_.d.ts +1 -0
- package/lib/build-info._auto-generated_.js +5 -0
- package/lib/build-info._auto-generated_.js.map +1 -0
- package/lib/models.d.ts +1 -1
- package/package.json +4 -4
- package/tmp-environment.json +29 -28
- package/websql/README.md +24 -24
- package/websql/esm2022/lib/models.mjs +1 -1
- package/websql/fesm2022/ng2-rest.mjs.map +1 -1
- package/websql/lib/models.d.ts +1 -1
package/README.md
CHANGED
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
|
|
2
|
-
## ng2-rest ##
|
|
3
|
-
|
|
4
|
-
Robust isomorphic REST framework for browser (Angular, React etc.) and backend (NodeJS) JavaScript/TypeScript apps.
|
|
5
|
-
|
|
6
|
-
Features:
|
|
7
|
-
- Compatible with Angular (2+) (newest 13,14 also...) , React, Vue , NodeJS (works everywhere)
|
|
8
|
-
- Compatible with RxJS operators (exhaustMap, switchMap, request cancelation etc.)
|
|
9
|
-
- Based on [axios](https://axios-http.com/) => excellent alternative to Angular's [HttpClient](https://angular.io/api/common/http/HttpClient)
|
|
10
|
-
- JSONP api request handling
|
|
11
|
-
- Transfer class instance from server to client and back
|
|
12
|
-
- Elegant way of dealing with REST api ( *similar to ExpressJS routes definitions* )
|
|
13
|
-
|
|
14
|
-
(more documentation soon... )
|
|
15
|
-
|
|
16
|
-
To install this package run:
|
|
17
|
-
|
|
18
|
-
npm install ng2-rest --save
|
|
19
|
-
|
|
20
|
-
Import Resource class:
|
|
21
|
-
```ts
|
|
22
|
-
import { Resource } from 'ng2-rest/browser';
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Resource
|
|
26
|
-
========
|
|
27
|
-
|
|
28
|
-
Fit you existing API (not only REST) into new fluent objects with **Resource**
|
|
29
|
-
class observables. Use power of **async** in new angular templates;
|
|
30
|
-
|
|
31
|
-
**template.html**
|
|
32
|
-
```html
|
|
33
|
-
Users:
|
|
34
|
-
<ul *ngIf="model.allUsers() | async; else loader; let users" >
|
|
35
|
-
|
|
36
|
-
<li *ngFor="let user of users">
|
|
37
|
-
{{user.id}} {{user.fullName()}}
|
|
38
|
-
<br>
|
|
39
|
-
<input type="name" [(NgModel)]="user.name" >
|
|
40
|
-
<button (click)="model.update(user)" > Update </button>
|
|
41
|
-
</li>
|
|
42
|
-
|
|
43
|
-
</ul>
|
|
44
|
-
|
|
45
|
-
<ng-template #loader> loading users... </ng-template>
|
|
46
|
-
|
|
47
|
-
```
|
|
48
|
-
**component.ts**
|
|
49
|
-
```ts
|
|
50
|
-
class User {
|
|
51
|
-
name: string;
|
|
52
|
-
surname: string;
|
|
53
|
-
id: number;
|
|
54
|
-
|
|
55
|
-
fullName() {
|
|
56
|
-
return `Surname: ${this.surname}, Name: ${this.name}`;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Express.js style url endpoint model
|
|
61
|
-
// you can ommit "<User>" part is you don't wanna see response interface
|
|
62
|
-
// also you can ommit third argument ",User" is you don't wanna
|
|
63
|
-
// map response object to User class objects
|
|
64
|
-
const rest = Resource.create<User>("http://yourbackend.com/api","users/:id",{'':User} )
|
|
65
|
-
|
|
66
|
-
class UserComponent {
|
|
67
|
-
|
|
68
|
-
// Prepare your beautiful interface
|
|
69
|
-
model = {
|
|
70
|
-
allUsers: () => rest.model()
|
|
71
|
-
.array
|
|
72
|
-
.get()
|
|
73
|
-
.observable // Observable resposne (useful for Angular 2+ html templates)
|
|
74
|
-
.pipe( map({ body } => body.json) ) // get all users, body.json => User[]
|
|
75
|
-
|
|
76
|
-
userBy: (id) => rest.model({id})
|
|
77
|
-
.get() // Promise response by default
|
|
78
|
-
.then({ body } => console.log(body.json)) // get user by id, body.json => User
|
|
79
|
-
|
|
80
|
-
update: async (user:User) =>{
|
|
81
|
-
try {
|
|
82
|
-
await rest.model({id:user.id}).put(user) // Promise response by default
|
|
83
|
-
|
|
84
|
-
alert('Update sucess')
|
|
85
|
-
} catch(e) {
|
|
86
|
-
alert(e)
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
constructor() { }
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
Specification
|
|
97
|
-
============
|
|
98
|
-
Example **UrlParams[]** :
|
|
99
|
-
`[ { sort: true },{ filter: 'id,5' }, { filter: 'name,test' } ]`
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
| Name | Parameters | Description |
|
|
103
|
-
| :---: | --- | ---: |
|
|
104
|
-
| **.array.** | get,post,put,head,delete,jsonp | for everything, but with arrays |
|
|
105
|
-
| **get** | `UrlParams[] ` | get model by parameters |
|
|
106
|
-
| **post** | `model, UrlParams[] ` | post object model |
|
|
107
|
-
| **put** | `model, UrlParams[]` | put object model |
|
|
108
|
-
| **head** | `model, UrlParams[]` | get head for model |
|
|
109
|
-
| **delete** | `UrlParams[]` | remove object by params |
|
|
110
|
-
| **jsonp** | `UrlParams[]` | get jsonp data |
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
# Production mode
|
|
115
|
-
===
|
|
116
|
-
Nice things to do in production mode:
|
|
117
|
-
|
|
118
|
-
**1. Disable warnings.**
|
|
119
|
-
|
|
120
|
-
If you don't wanna see warning, disable it like this:
|
|
121
|
-
```ts
|
|
122
|
-
if (environment.production) {
|
|
123
|
-
Resource.enableWarnings = false;
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
# Angular 2+ ngZone
|
|
128
|
-
If you are using Angular 2+ you need to do this in your root **app.component**:
|
|
129
|
-
```ts
|
|
130
|
-
constructor(zone:NgZone) {
|
|
131
|
-
Resource.initAngularNgZone(zone)
|
|
132
|
-
}
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
|
|
1
|
+
|
|
2
|
+
## ng2-rest ##
|
|
3
|
+
|
|
4
|
+
Robust isomorphic REST framework for browser (Angular, React etc.) and backend (NodeJS) JavaScript/TypeScript apps.
|
|
5
|
+
|
|
6
|
+
Features:
|
|
7
|
+
- Compatible with Angular (2+) (newest 13,14 also...) , React, Vue , NodeJS (works everywhere)
|
|
8
|
+
- Compatible with RxJS operators (exhaustMap, switchMap, request cancelation etc.)
|
|
9
|
+
- Based on [axios](https://axios-http.com/) => excellent alternative to Angular's [HttpClient](https://angular.io/api/common/http/HttpClient)
|
|
10
|
+
- JSONP api request handling
|
|
11
|
+
- Transfer class instance from server to client and back
|
|
12
|
+
- Elegant way of dealing with REST api ( *similar to ExpressJS routes definitions* )
|
|
13
|
+
|
|
14
|
+
(more documentation soon... )
|
|
15
|
+
|
|
16
|
+
To install this package run:
|
|
17
|
+
|
|
18
|
+
npm install ng2-rest --save
|
|
19
|
+
|
|
20
|
+
Import Resource class:
|
|
21
|
+
```ts
|
|
22
|
+
import { Resource } from 'ng2-rest/browser';
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Resource
|
|
26
|
+
========
|
|
27
|
+
|
|
28
|
+
Fit you existing API (not only REST) into new fluent objects with **Resource**
|
|
29
|
+
class observables. Use power of **async** in new angular templates;
|
|
30
|
+
|
|
31
|
+
**template.html**
|
|
32
|
+
```html
|
|
33
|
+
Users:
|
|
34
|
+
<ul *ngIf="model.allUsers() | async; else loader; let users" >
|
|
35
|
+
|
|
36
|
+
<li *ngFor="let user of users">
|
|
37
|
+
{{user.id}} {{user.fullName()}}
|
|
38
|
+
<br>
|
|
39
|
+
<input type="name" [(NgModel)]="user.name" >
|
|
40
|
+
<button (click)="model.update(user)" > Update </button>
|
|
41
|
+
</li>
|
|
42
|
+
|
|
43
|
+
</ul>
|
|
44
|
+
|
|
45
|
+
<ng-template #loader> loading users... </ng-template>
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
**component.ts**
|
|
49
|
+
```ts
|
|
50
|
+
class User {
|
|
51
|
+
name: string;
|
|
52
|
+
surname: string;
|
|
53
|
+
id: number;
|
|
54
|
+
|
|
55
|
+
fullName() {
|
|
56
|
+
return `Surname: ${this.surname}, Name: ${this.name}`;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Express.js style url endpoint model
|
|
61
|
+
// you can ommit "<User>" part is you don't wanna see response interface
|
|
62
|
+
// also you can ommit third argument ",User" is you don't wanna
|
|
63
|
+
// map response object to User class objects
|
|
64
|
+
const rest = Resource.create<User>("http://yourbackend.com/api","users/:id",{'':User} )
|
|
65
|
+
|
|
66
|
+
class UserComponent {
|
|
67
|
+
|
|
68
|
+
// Prepare your beautiful interface
|
|
69
|
+
model = {
|
|
70
|
+
allUsers: () => rest.model()
|
|
71
|
+
.array
|
|
72
|
+
.get()
|
|
73
|
+
.observable // Observable resposne (useful for Angular 2+ html templates)
|
|
74
|
+
.pipe( map({ body } => body.json) ) // get all users, body.json => User[]
|
|
75
|
+
|
|
76
|
+
userBy: (id) => rest.model({id})
|
|
77
|
+
.get() // Promise response by default
|
|
78
|
+
.then({ body } => console.log(body.json)) // get user by id, body.json => User
|
|
79
|
+
|
|
80
|
+
update: async (user:User) =>{
|
|
81
|
+
try {
|
|
82
|
+
await rest.model({id:user.id}).put(user) // Promise response by default
|
|
83
|
+
|
|
84
|
+
alert('Update sucess')
|
|
85
|
+
} catch(e) {
|
|
86
|
+
alert(e)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
constructor() { }
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Specification
|
|
97
|
+
============
|
|
98
|
+
Example **UrlParams[]** :
|
|
99
|
+
`[ { sort: true },{ filter: 'id,5' }, { filter: 'name,test' } ]`
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
| Name | Parameters | Description |
|
|
103
|
+
| :---: | --- | ---: |
|
|
104
|
+
| **.array.** | get,post,put,head,delete,jsonp | for everything, but with arrays |
|
|
105
|
+
| **get** | `UrlParams[] ` | get model by parameters |
|
|
106
|
+
| **post** | `model, UrlParams[] ` | post object model |
|
|
107
|
+
| **put** | `model, UrlParams[]` | put object model |
|
|
108
|
+
| **head** | `model, UrlParams[]` | get head for model |
|
|
109
|
+
| **delete** | `UrlParams[]` | remove object by params |
|
|
110
|
+
| **jsonp** | `UrlParams[]` | get jsonp data |
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
# Production mode
|
|
115
|
+
===
|
|
116
|
+
Nice things to do in production mode:
|
|
117
|
+
|
|
118
|
+
**1. Disable warnings.**
|
|
119
|
+
|
|
120
|
+
If you don't wanna see warning, disable it like this:
|
|
121
|
+
```ts
|
|
122
|
+
if (environment.production) {
|
|
123
|
+
Resource.enableWarnings = false;
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
# Angular 2+ ngZone
|
|
128
|
+
If you are using Angular 2+ you need to do this in your root **app.component**:
|
|
129
|
+
```ts
|
|
130
|
+
constructor(zone:NgZone) {
|
|
131
|
+
Resource.initAngularNgZone(zone)
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
THIS FILE IS GENERATED. THIS FILE IS GENERATED. THIS FILE IS GENERATED.
|
|
2
2
|
|
|
3
|
-
Assets from this folder are being shipped with this npm package (ng2-rest@16.444.
|
|
3
|
+
Assets from this folder are being shipped with this npm package (ng2-rest@16.444.6)
|
|
4
4
|
created from this project.
|
|
5
5
|
|
|
6
6
|
THIS FILE IS GENERATED.THIS FILE IS GENERATED. THIS FILE IS GENERATED.
|
package/browser/README.md
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
# MyLib
|
|
2
|
-
|
|
3
|
-
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
|
|
4
|
-
|
|
5
|
-
## Code scaffolding
|
|
6
|
-
|
|
7
|
-
Run `ng generate component component-name --project my-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project my-lib`.
|
|
8
|
-
> Note: Don't forget to add `--project my-lib` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
-
|
|
10
|
-
## Build
|
|
11
|
-
|
|
12
|
-
Run `ng build my-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
-
|
|
14
|
-
## Publishing
|
|
15
|
-
|
|
16
|
-
After building your library with `ng build my-lib`, go to the dist folder `cd dist/my-lib` and run `npm publish`.
|
|
17
|
-
|
|
18
|
-
## Running unit tests
|
|
19
|
-
|
|
20
|
-
Run `ng test my-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
-
|
|
22
|
-
## Further help
|
|
23
|
-
|
|
24
|
-
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
1
|
+
# MyLib
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 13.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project my-lib` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project my-lib`.
|
|
8
|
+
> Note: Don't forget to add `--project my-lib` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build my-lib` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build my-lib`, go to the dist folder `cd dist/my-lib` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test my-lib` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -169,4 +169,4 @@ export var Models;
|
|
|
169
169
|
})(Models || (Models = {}));
|
|
170
170
|
;
|
|
171
171
|
({}); // @--end-of-file-for-module=ng2-rest lib/models.ts
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3QvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxNQUFNLElBQUksYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLEtBQUs7QUFDTCxLQUFLO0FBSUwsTUFBTSxLQUFXLE1BQU0sQ0E0VHRCO0FBNVRELFdBQWlCLE1BQU07SUFJUCxtQkFBWSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDMUMsa0JBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLGtCQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQTBHdEQsRUFBRSxDQUFDO0lBRUgsTUFBc0IsUUFBUTtRQUNsQixNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzVCLElBQUk7b0JBQ0YsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RCO2dCQUFDLE9B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ZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvYnJvd3Nlcic7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IFJlc3QgfSBmcm9tICcuL3Jlc3QuY2xhc3MnO1xuaW1wb3J0IHsgQ29va2llIH0gZnJvbSAnLi9jb29raWUnO1xuaW1wb3J0IHsgTWFwcGluZyB9IGZyb20gJy4vbWFwcGluZyc7XG5pbXBvcnQgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgTW9kZWxzIGFzIEhlbHBlcnNNb2RlbHMgfSBmcm9tICd0eXBlc2NyaXB0LWNsYXNzLWhlbHBlcnMvYnJvd3Nlcic7XG5pbXBvcnQgeyBKU09OMTAsIENpcmMgfSBmcm9tICdqc29uMTAvYnJvd3Nlcic7XG5pbXBvcnQgeyBSZXF1ZXN0Q2FjaGUgfSBmcm9tICcuL3JlcXVlc3QtY2FjaGUnO1xuaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgQ29yZU1vZGVscyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuLyogKi9cbi8qICovXG4gIFxuXG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZWxzIHtcbiAgZXhwb3J0IGltcG9ydCBIdHRwTWV0aG9kID0gQ29yZU1vZGVscy5IdHRwTWV0aG9kO1xuICBleHBvcnQgaW1wb3J0IFBhcmFtVHlwZSA9IENvcmVNb2RlbHMuUGFyYW1UeXBlO1xuXG4gIGV4cG9ydCBpbXBvcnQgTWV0aG9kQ29uZmlnID0gSGVscGVyc01vZGVscy5NZXRob2RDb25maWc7XG4gIGV4cG9ydCBpbXBvcnQgQ2xhc3NDb25maWcgPSBIZWxwZXJzTW9kZWxzLkNsYXNzQ29uZmlnO1xuICBleHBvcnQgaW1wb3J0IFBhcmFtQ29uZmlnID0gSGVscGVyc01vZGVscy5QYXJhbUNvbmZpZztcblxuICBleHBvcnQgaW50ZXJmYWNlIEhhbmRsZVJlc3VsdE9wdGlvbnMge1xuICAgIHJlczogTW9kZWxzLk1vY2tSZXNwb25zZTtcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kO1xuICAgIGpvYmlkPzogbnVtYmVyO1xuICAgIGlzQXJyYXk/OiBib29sZWFuO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBIYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucyB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZDtcblxuICAgIGJvZHk6IGFueTtcbiAgICBpc0FycmF5OiBib29sZWFuO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgQmFja2VuZEVycm9yID0ge1xuICAgIG1zZz86IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZ1tdO1xuICAgIGRhdGE6IGFueTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNZXRhUmVxdWVzdCA9IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ6IHN0cmluZztcbiAgICBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZztcbiAgICBjaXJjdWxhcjogQ2lyY1tdO1xuICB9O1xuICBleHBvcnQgdHlwZSBIdHRwQ29kZSA9IDIwMCB8IDQwMCB8IDQwMSB8IDQwNCB8IDUwMDtcblxuICBleHBvcnQgdHlwZSBQcm9taXNlT2JzZXJ2YWJsZU1peDxUPiA9IFByb21pc2U8VD4gJiB7XG4gICAgY2FjaGU/OiBSZXF1ZXN0Q2FjaGU7XG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNZXRob2RXaXRob3V0Qm9keTxFLCBULCBSID0gUHJvbWlzZU9ic2VydmFibGVNaXg8RT4+ID0gKFxuICAgIHBhcmFtcz86IFVybFBhcmFtc1tdLFxuICAgIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbixcbiAgKSA9PiBSO1xuICBleHBvcnQgdHlwZSBNZXRob2RXaXRoQm9keTxFLCBULCBSID0gUHJvbWlzZU9ic2VydmFibGVNaXg8RT4+ID0gKFxuICAgIGl0ZW0/OiBULFxuICAgIHBhcmFtcz86IFVybFBhcmFtc1tdLFxuICAgIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbixcbiAgKSA9PiBSO1xuICBleHBvcnQgdHlwZSBSZXBsYXlEYXRhID0ge1xuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcbiAgICBkYXRhOiB7IHVybDogc3RyaW5nOyBib2R5OiBzdHJpbmc7IGhlYWRlcnM6IFJlc3RIZWFkZXJzOyBpc0FycmF5OiBib29sZWFuIH07XG4gICAgLyoqXG4gICAgICogam9iaWRcbiAgICAgKi9cbiAgICBpZDogbnVtYmVyO1xuICB9O1xuICBleHBvcnQgdHlwZSBSZXFQYXJhbXMgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0aG9kOiBDb3JlTW9kZWxzLkh0dHBNZXRob2Q7XG4gICAgaGVhZGVycz86IFJlc3RIZWFkZXJzO1xuICAgIGJvZHk/OiBhbnk7XG4gICAgam9iaWQ6IG51bWJlcjtcbiAgICBpc0FycmF5OiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VNb2RlbDxBLCBUQT4ge1xuICAgIG1vZGVsOiAocGF0aE1vZGVscz86IE9iamVjdCwgcmVzcG9uc2VPYmplY3RUeXBlPzogRnVuY3Rpb24pID0+IFJlc3Q8QSwgVEE+O1xuICAgIHJlcGxheTogKG1ldGhvZDogQ29yZU1vZGVscy5IdHRwTWV0aG9kKSA9PiB2b2lkO1xuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBOZzJSZXN0TWV0aG9kczxFLCBUPiB7XG4gICAgZ2V0OiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgICBwb3N0OiBNZXRob2RXaXRoQm9keTxFLCBUPjtcbiAgICBwdXQ6IE1ldGhvZFdpdGhCb2R5PEUsIFQ+O1xuICAgIHBhdGNoOiBNZXRob2RXaXRoQm9keTxFLCBUPjtcbiAgICBoZWFkOiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgICBkZWxldGU6IE1ldGhvZFdpdGhvdXRCb2R5PEUsIFQ+O1xuICAgIGpzb25wOiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIE1vY2tDb250cm9sbGVyID0gKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG1ldGhvZDogQ29yZU1vZGVscy5IdHRwTWV0aG9kLFxuICAgIGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICBib2R5PzogYW55LFxuICApID0+IE1vY2tSZXNwb25zZTtcblxuICBleHBvcnQgdHlwZSBNb2NrSHR0cCA9IE1vY2tSZXNwb25zZSB8IE1vY2tDb250cm9sbGVyO1xuXG4gIGV4cG9ydCBpbnRlcmZhY2UgRm5NZXRob2RzSHR0cDxULCBUQT5cbiAgICBleHRlbmRzIE5nMlJlc3RNZXRob2RzPEh0dHBSZXNwb25zZTxUPiwgVD4ge1xuICAgIGFycmF5OiBOZzJSZXN0TWV0aG9kczxIdHRwUmVzcG9uc2U8VEE+LCBUQT47XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIEZuTWV0aG9kc0h0dHBXaXRoTW9jazxULCBUQT5cbiAgICBleHRlbmRzIE5nMlJlc3RNZXRob2RzPEh0dHBSZXNwb25zZTxUPiwgVD4ge1xuICAgIGFycmF5OiBOZzJSZXN0TWV0aG9kczxIdHRwUmVzcG9uc2U8VEE+LCBUQT47XG4gICAgbW9jayhtb2NrOiBNb2NrSHR0cCwgY29kZTogSHR0cENvZGUpOiBGbk1ldGhvZHNIdHRwPFQsIFRBPjtcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgTmVzdGVkUGFyYW1zIHtcbiAgICBbcGFyYW1zOiBzdHJpbmddOiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFVybFBhcmFtcyB7XG4gICAgW3VybE1vZGVsTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IFJlZ0V4cCB8IE9iamVjdDtcbiAgICByZWdleD86IFJlZ0V4cDtcbiAgfVxuICBbXTtcblxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJvZHkge1xuICAgIHByb3RlY3RlZCB0b0pTT04oZGF0YSwgaXNKU09OQXJyYXkgPSBmYWxzZSkge1xuICAgICAgbGV0IHIgPSBpc0pTT05BcnJheSA/IFtdIDoge307XG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByIGFzIGFueTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgSHR0cEJvZHk8VD4gZXh0ZW5kcyBCYXNlQm9keSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlc3BvbnNlVGV4dDogc3RyaW5nIHwgQmxvYixcbiAgICAgIHByaXZhdGUgaXNBcnJheSA9IGZhbHNlLFxuICAgICAgcHJpdmF0ZSBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZyxcbiAgICAgIHByaXZhdGUgY2lyY3VsYXI6IENpcmNbXSxcbiAgICApIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBibG9iKCk6IEJsb2Ige1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VUZXh0IGFzIEJsb2I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBib29sZWFuVmFsdWUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNCbG9iKHRoaXMucmVzcG9uc2VUZXh0KSkge1xuICAgICAgICByZXR1cm4gWydvaycsICd0cnVlJ10uaW5jbHVkZXMoKHRoaXMucmVzcG9uc2VUZXh0IGFzIHN0cmluZykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWVyaWNWYWx1ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzQmxvYih0aGlzLnJlc3BvbnNlVGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLnJlc3BvbnNlVGV4dD8udHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJhd0pzb24oKTogUGFydGlhbDxUPiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNCbG9iKHRoaXMucmVzcG9uc2VUZXh0KSkge1xuICAgICAgICBsZXQgcmVzID0gdGhpcy50b0pTT04odGhpcy5yZXNwb25zZVRleHQsIHRoaXMuaXNBcnJheSk7XG4gICAgICAgIGlmICh0aGlzLmNpcmN1bGFyICYmIEFycmF5LmlzQXJyYXkodGhpcy5jaXJjdWxhcikpIHtcbiAgICAgICAgICByZXMgPSBKU09OMTAucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSwgdGhpcy5jaXJjdWxhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQganNvbigpOiBUIHtcblxuICAgICAgY29uc3QgaXNCbG9iID0gSGVscGVycy5pc0Jsb2IodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgaWYgKGlzQmxvYikge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW50aXR5ICYmIHR5cGVvZiB0aGlzLmVudGl0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHkoKTsgLy8gQExBU1RcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVudGl0eSAmJiB0eXBlb2YgdGhpcy5lbnRpdHkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTih0aGlzLnJlc3BvbnNlVGV4dCwgdGhpcy5pc0FycmF5KTtcbiAgICAgICAgcmV0dXJuIE1hcHBpbmcuZW5jb2RlKGpzb24sIHRoaXMuZW50aXR5LCB0aGlzLmNpcmN1bGFyKSBhcyBhbnk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzID0gdGhpcy50b0pTT04odGhpcy5yZXNwb25zZVRleHQsIHRoaXMuaXNBcnJheSk7XG4gICAgICBpZiAodGhpcy5jaXJjdWxhciAmJiBBcnJheS5pc0FycmF5KHRoaXMuY2lyY3VsYXIpKSB7XG4gICAgICAgIHJlcyA9IEpTT04xMC5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdW5kZWZpbmVkIHdoZW4gYmxvYlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzQmxvYih0aGlzLnJlc3BvbnNlVGV4dCkpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJlc3BvbnNlVGV4dCBhcyBzdHJpbmcpXG4gICAgICAgICAgLnJlcGxhY2UoL15cXFwiLywgJycpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcXCIkLywgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBFcnJvckJvZHkgZXh0ZW5kcyBCYXNlQm9keSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhKSB7XG4gICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQganNvbigpOiBPYmplY3Qge1xuICAgICAgcmV0dXJuIHRoaXMudG9KU09OKHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZXNwb25zZTxUPiB7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBjb29raWVzID0gQ29va2llLkluc3RhbmNlO1xuXG4gICAgcHVibGljIGdldCBjb29raWVzKCkge1xuICAgICAgcmV0dXJuIEJhc2VSZXNwb25zZS5jb29raWVzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHB1YmxpYyByZXNwb25zZVRleHQ/OiBzdHJpbmcgfCBCbG9iLFxuICAgICAgcHVibGljIHJlYWRvbmx5IGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNDb2RlPzogSHR0cENvZGUgfCBudW1iZXIsXG4gICAgICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlLFxuICAgICkge31cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBIdHRwUmVzcG9uc2U8VD4gZXh0ZW5kcyBCYXNlUmVzcG9uc2U8VD4ge1xuICAgIHB1YmxpYyBib2R5PzogSHR0cEJvZHk8VD47XG5cblxuXG5cbiAgICBycTogUmVxdWVzdENhY2hlO1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgcHVibGljIHNvdXJjZVJlcXVlc3Q6IE1vZGVscy5IYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucyxcbiAgICAgIHB1YmxpYyByZXNwb25zZVRleHQ/OiBzdHJpbmcgfCBCbG9iLFxuICAgICAgcHVibGljIGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICAgIHB1YmxpYyBzdGF0dXNDb2RlPzogSHR0cENvZGUgfCBudW1iZXIsXG4gICAgICBwdWJsaWMgZW50aXR5PzogTWFwcGluZy5NYXBwaW5nIHwgRnVuY3Rpb24sXG4gICAgICBwdWJsaWMgY2lyY3VsYXI/OiBDaXJjW10sXG4gICAgICBwdWJsaWMgam9iaWQ/OiBudW1iZXIsXG4gICAgICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlLFxuICAgICkge1xuXG5cblxuICAgICAgc3VwZXIocmVzcG9uc2VUZXh0LCBoZWFkZXJzLCBzdGF0dXNDb2RlLCBpc0FycmF5KTtcblxuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuZW50aXR5ID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgIGxldCBlbnRpdHlKU09OID0gdGhpcy5oZWFkZXJzLmdldEFsbCh0aGlzLmVudGl0eSk7XG4gICAgICAgIGlmICghIWVudGl0eUpTT04pIHtcbiAgICAgICAgICB0aGlzLmVudGl0eSA9IEpTT04ucGFyc2UoZW50aXR5SlNPTi5qb2luKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY2lyY3VsYXIgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgbGV0IGNpcmN1cmFsSlNPTiA9IHRoaXMuaGVhZGVycy5nZXRBbGwodGhpcy5jaXJjdWxhcik7XG4gICAgICAgIGlmICghIWNpcmN1cmFsSlNPTikge1xuICAgICAgICAgIHRoaXMuY2lyY3VsYXIgPSBKU09OLnBhcnNlKGNpcmN1cmFsSlNPTi5qb2luKCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmJvZHkgPSBuZXcgSHR0cEJvZHkoXG4gICAgICAgIHRoaXMucmVzcG9uc2VUZXh0LFxuICAgICAgICB0aGlzLmlzQXJyYXksXG4gICAgICAgIHRoaXMuZW50aXR5LFxuICAgICAgICB0aGlzLmNpcmN1bGFyLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuXG4gICAgZ2V0IGNhY2hlKCkge1xuICAgICAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5ycSkpIHtcbiAgICAgICAgdGhpcy5ycSA9IG5ldyBSZXF1ZXN0Q2FjaGUodGhpcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJlcXVlc3RDYWNoZSh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgSHR0cFJlc3BvbnNlRXJyb3IgZXh0ZW5kcyBCYXNlUmVzcG9uc2U8YW55PiB7XG4gICAgcHJpdmF0ZSBib2R5OiBFcnJvckJvZHk7XG5cblxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgcmVzcG9uc2VUZXh0Pzogc3RyaW5nLFxuICAgICAgaGVhZGVycz86IFJlc3RIZWFkZXJzLFxuICAgICAgc3RhdHVzQ29kZT86IEh0dHBDb2RlIHwgbnVtYmVyLFxuICAgICAgcHVibGljIGpvYmlkPzogbnVtYmVyLFxuICAgICkge1xuICAgICAgc3VwZXIocmVzcG9uc2VUZXh0LCBoZWFkZXJzLCBzdGF0dXNDb2RlKTtcbiAgICAgIHRoaXMuYm9keSA9IG5ldyBFcnJvckJvZHkocmVzcG9uc2VUZXh0KTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIE1vY2tSZXNwb25zZSB7XG4gICAgZGF0YT86IGFueTtcbiAgICBjb2RlPzogSHR0cENvZGU7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG4gICAgaGVhZGVycz86IFJlc3RIZWFkZXJzO1xuICAgIGpvYmlkPzogbnVtYmVyO1xuICAgIGlzQXJyYXk6IGJvb2xlYW47XG4gIH1cblxuICBleHBvcnQgdHlwZSBSZXNwb25zZVR5cGVBeGlvcyA9XG4gICAgfCAnYmxvYidcbiAgICB8ICd0ZXh0J1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPW5nMi1yZXN0IGxpYi9tb2RlbHMudHMiXX0=
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3QvbmcyLXJlc3QvcHJvamVjdHMvbmcyLXJlc3Qvc3JjL2xpYi9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNsQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxNQUFNLElBQUksYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFckMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLEtBQUs7QUFDTCxLQUFLO0FBSUwsTUFBTSxLQUFXLE1BQU0sQ0E0VHRCO0FBNVRELFdBQWlCLE1BQU07SUFJUCxtQkFBWSxHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDMUMsa0JBQVcsR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLGtCQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztJQTBHdEQsRUFBRSxDQUFDO0lBRUgsTUFBc0IsUUFBUTtRQUNsQixNQUFNLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxLQUFLO1lBQ3hDLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQzVCLElBQUk7b0JBQ0YsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3RCO2dCQUFDLE9B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ZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTG9nLCBMZXZlbCB9IGZyb20gJ25nMi1sb2dnZXIvYnJvd3Nlcic7XG5pbXBvcnQgeyBSZXN0SGVhZGVycyB9IGZyb20gJy4vcmVzdC1oZWFkZXJzJztcbmltcG9ydCB7IFJlc3QgfSBmcm9tICcuL3Jlc3QuY2xhc3MnO1xuaW1wb3J0IHsgQ29va2llIH0gZnJvbSAnLi9jb29raWUnO1xuaW1wb3J0IHsgTWFwcGluZyB9IGZyb20gJy4vbWFwcGluZyc7XG5pbXBvcnQgeyBBeGlvc1Jlc3BvbnNlIH0gZnJvbSAnYXhpb3MnO1xuaW1wb3J0IHsgTW9kZWxzIGFzIEhlbHBlcnNNb2RlbHMgfSBmcm9tICd0eXBlc2NyaXB0LWNsYXNzLWhlbHBlcnMvYnJvd3Nlcic7XG5pbXBvcnQgeyBKU09OMTAsIENpcmMgfSBmcm9tICdqc29uMTAvYnJvd3Nlcic7XG5pbXBvcnQgeyBSZXF1ZXN0Q2FjaGUgfSBmcm9tICcuL3JlcXVlc3QtY2FjaGUnO1xuaW1wb3J0IHsgXyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgQ29yZU1vZGVscyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuaW1wb3J0IHsgSGVscGVycyB9IGZyb20gJ3RucC1jb3JlL2Jyb3dzZXInO1xuLyogKi9cbi8qICovXG4gIFxuXG5cbmV4cG9ydCBuYW1lc3BhY2UgTW9kZWxzIHtcbiAgZXhwb3J0IGltcG9ydCBIdHRwTWV0aG9kID0gQ29yZU1vZGVscy5IdHRwTWV0aG9kO1xuICBleHBvcnQgaW1wb3J0IFBhcmFtVHlwZSA9IENvcmVNb2RlbHMuUGFyYW1UeXBlO1xuXG4gIGV4cG9ydCBpbXBvcnQgTWV0aG9kQ29uZmlnID0gSGVscGVyc01vZGVscy5NZXRob2RDb25maWc7XG4gIGV4cG9ydCBpbXBvcnQgQ2xhc3NDb25maWcgPSBIZWxwZXJzTW9kZWxzLkNsYXNzQ29uZmlnO1xuICBleHBvcnQgaW1wb3J0IFBhcmFtQ29uZmlnID0gSGVscGVyc01vZGVscy5QYXJhbUNvbmZpZztcblxuICBleHBvcnQgaW50ZXJmYWNlIEhhbmRsZVJlc3VsdE9wdGlvbnMge1xuICAgIHJlczogTW9kZWxzLk1vY2tSZXNwb25zZTtcbiAgICBtZXRob2Q6IE1vZGVscy5IdHRwTWV0aG9kO1xuICAgIGpvYmlkPzogbnVtYmVyO1xuICAgIGlzQXJyYXk/OiBib29sZWFuO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBIYW5kbGVSZXN1bHRTb3VyY2VSZXF1ZXN0T3B0aW9ucyB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0aG9kOiBNb2RlbHMuSHR0cE1ldGhvZDtcblxuICAgIGJvZHk6IGFueTtcbiAgICBpc0FycmF5OiBib29sZWFuO1xuICB9XG5cbiAgZXhwb3J0IHR5cGUgQmFja2VuZEVycm9yID0ge1xuICAgIG1zZz86IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZ1tdO1xuICAgIGRhdGE6IGFueTtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNZXRhUmVxdWVzdCA9IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZW5kcG9pbnQ6IHN0cmluZztcbiAgICBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZztcbiAgICBjaXJjdWxhcjogQ2lyY1tdO1xuICB9O1xuICBleHBvcnQgdHlwZSBIdHRwQ29kZSA9IDIwMCB8IDQwMCB8IDQwMSB8IDQwNCB8IDUwMDtcblxuICBleHBvcnQgdHlwZSBQcm9taXNlT2JzZXJ2YWJsZU1peDxUPiA9IFByb21pc2U8VD4gJiB7XG4gICAgY2FjaGU/OiBSZXF1ZXN0Q2FjaGU7XG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxUPjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBNZXRob2RXaXRob3V0Qm9keTxFLCBULCBSID0gUHJvbWlzZU9ic2VydmFibGVNaXg8RT4+ID0gKFxuICAgIHBhcmFtcz86IFVybFBhcmFtc1tdLFxuICAgIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbixcbiAgKSA9PiBSO1xuICBleHBvcnQgdHlwZSBNZXRob2RXaXRoQm9keTxFLCBULCBSID0gUHJvbWlzZU9ic2VydmFibGVNaXg8RT4+ID0gKFxuICAgIGl0ZW0/OiBULFxuICAgIHBhcmFtcz86IFVybFBhcmFtc1tdLFxuICAgIGRvTm90U2VyaWFsaXplUGFyYW1zPzogYm9vbGVhbixcbiAgKSA9PiBSO1xuICBleHBvcnQgdHlwZSBSZXBsYXlEYXRhID0ge1xuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcbiAgICBkYXRhOiB7IHVybDogc3RyaW5nOyBib2R5OiBzdHJpbmc7IGhlYWRlcnM6IFJlc3RIZWFkZXJzOyBpc0FycmF5OiBib29sZWFuIH07XG4gICAgLyoqXG4gICAgICogam9iaWRcbiAgICAgKi9cbiAgICBpZDogbnVtYmVyO1xuICB9O1xuICBleHBvcnQgdHlwZSBSZXFQYXJhbXMgPSB7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgbWV0aG9kOiBDb3JlTW9kZWxzLkh0dHBNZXRob2Q7XG4gICAgaGVhZGVycz86IFJlc3RIZWFkZXJzO1xuICAgIGJvZHk/OiBhbnk7XG4gICAgam9iaWQ6IG51bWJlcjtcbiAgICBpc0FycmF5OiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VNb2RlbDxBLCBUQT4ge1xuICAgIG1vZGVsOiAocGF0aE1vZGVscz86IE9iamVjdCwgcmVzcG9uc2VPYmplY3RUeXBlPzogRnVuY3Rpb24pID0+IFJlc3Q8QSwgVEE+O1xuICAgIHJlcGxheTogKG1ldGhvZDogQ29yZU1vZGVscy5IdHRwTWV0aG9kKSA9PiB2b2lkO1xuICAgIGhlYWRlcnM6IFJlc3RIZWFkZXJzO1xuICB9XG5cbiAgZXhwb3J0IGludGVyZmFjZSBOZzJSZXN0TWV0aG9kczxFLCBUPiB7XG4gICAgZ2V0OiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgICBwb3N0OiBNZXRob2RXaXRoQm9keTxFLCBUPjtcbiAgICBwdXQ6IE1ldGhvZFdpdGhCb2R5PEUsIFQ+O1xuICAgIHBhdGNoOiBNZXRob2RXaXRoQm9keTxFLCBUPjtcbiAgICBoZWFkOiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgICBkZWxldGU6IE1ldGhvZFdpdGhvdXRCb2R5PEUsIFQ+O1xuICAgIGpzb25wOiBNZXRob2RXaXRob3V0Qm9keTxFLCBUPjtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIE1vY2tDb250cm9sbGVyID0gKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG1ldGhvZDogQ29yZU1vZGVscy5IdHRwTWV0aG9kLFxuICAgIGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICBib2R5PzogYW55LFxuICApID0+IE1vY2tSZXNwb25zZTtcblxuICBleHBvcnQgdHlwZSBNb2NrSHR0cCA9IE1vY2tSZXNwb25zZSB8IE1vY2tDb250cm9sbGVyO1xuXG4gIGV4cG9ydCBpbnRlcmZhY2UgRm5NZXRob2RzSHR0cDxULCBUQT5cbiAgICBleHRlbmRzIE5nMlJlc3RNZXRob2RzPEh0dHBSZXNwb25zZTxUPiwgVD4ge1xuICAgIGFycmF5OiBOZzJSZXN0TWV0aG9kczxIdHRwUmVzcG9uc2U8VEE+LCBUQT47XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIEZuTWV0aG9kc0h0dHBXaXRoTW9jazxULCBUQT5cbiAgICBleHRlbmRzIE5nMlJlc3RNZXRob2RzPEh0dHBSZXNwb25zZTxUPiwgVD4ge1xuICAgIGFycmF5OiBOZzJSZXN0TWV0aG9kczxIdHRwUmVzcG9uc2U8VEE+LCBUQT47XG4gICAgbW9jayhtb2NrOiBNb2NrSHR0cCwgY29kZTogSHR0cENvZGUpOiBGbk1ldGhvZHNIdHRwPFQsIFRBPjtcbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgTmVzdGVkUGFyYW1zIHtcbiAgICBbcGFyYW1zOiBzdHJpbmddOiBzdHJpbmc7XG4gIH1cblxuICBleHBvcnQgaW50ZXJmYWNlIFVybFBhcmFtcyB7XG4gICAgW3VybE1vZGVsTmFtZTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IFJlZ0V4cCB8IE9iamVjdDtcbiAgICByZWdleD86IFJlZ0V4cDtcbiAgfVxuICBbXTtcblxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJvZHkge1xuICAgIHByb3RlY3RlZCB0b0pTT04oZGF0YSwgaXNKU09OQXJyYXkgPSBmYWxzZSkge1xuICAgICAgbGV0IHIgPSBpc0pTT05BcnJheSA/IFtdIDoge307XG4gICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgciA9IEpTT04ucGFyc2UoZGF0YSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByIGFzIGFueTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgSHR0cEJvZHk8VD4gZXh0ZW5kcyBCYXNlQm9keSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHJlc3BvbnNlVGV4dDogc3RyaW5nIHwgQmxvYixcbiAgICAgIHByaXZhdGUgaXNBcnJheSA9IGZhbHNlLFxuICAgICAgcHJpdmF0ZSBlbnRpdHk6IE1hcHBpbmcuTWFwcGluZyxcbiAgICAgIHByaXZhdGUgY2lyY3VsYXI6IENpcmNbXSxcbiAgICApIHtcbiAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBibG9iKCk6IEJsb2Ige1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VUZXh0IGFzIEJsb2I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBib29sZWFuVmFsdWUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNCbG9iKHRoaXMucmVzcG9uc2VUZXh0KSkge1xuICAgICAgICByZXR1cm4gWydvaycsICd0cnVlJ10uaW5jbHVkZXMoKHRoaXMucmVzcG9uc2VUZXh0IGFzIHN0cmluZykudHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG51bWVyaWNWYWx1ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzQmxvYih0aGlzLnJlc3BvbnNlVGV4dCkpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcih0aGlzLnJlc3BvbnNlVGV4dD8udHJpbSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJhd0pzb24oKTogUGFydGlhbDxUPiB7XG4gICAgICBpZiAoIUhlbHBlcnMuaXNCbG9iKHRoaXMucmVzcG9uc2VUZXh0KSkge1xuICAgICAgICBsZXQgcmVzID0gdGhpcy50b0pTT04odGhpcy5yZXNwb25zZVRleHQsIHRoaXMuaXNBcnJheSk7XG4gICAgICAgIGlmICh0aGlzLmNpcmN1bGFyICYmIEFycmF5LmlzQXJyYXkodGhpcy5jaXJjdWxhcikpIHtcbiAgICAgICAgICByZXMgPSBKU09OMTAucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSwgdGhpcy5jaXJjdWxhcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQganNvbigpOiBUIHtcblxuICAgICAgY29uc3QgaXNCbG9iID0gSGVscGVycy5pc0Jsb2IodGhpcy5yZXNwb25zZVRleHQpO1xuICAgICAgaWYgKGlzQmxvYikge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZW50aXR5ICYmIHR5cGVvZiB0aGlzLmVudGl0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdGhpcy5lbnRpdHkoKTsgLy8gQExBU1RcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmVudGl0eSAmJiB0eXBlb2YgdGhpcy5lbnRpdHkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTih0aGlzLnJlc3BvbnNlVGV4dCwgdGhpcy5pc0FycmF5KTtcbiAgICAgICAgcmV0dXJuIE1hcHBpbmcuZW5jb2RlKGpzb24sIHRoaXMuZW50aXR5LCB0aGlzLmNpcmN1bGFyKSBhcyBhbnk7XG4gICAgICB9XG4gICAgICBsZXQgcmVzID0gdGhpcy50b0pTT04odGhpcy5yZXNwb25zZVRleHQsIHRoaXMuaXNBcnJheSk7XG4gICAgICBpZiAodGhpcy5jaXJjdWxhciAmJiBBcnJheS5pc0FycmF5KHRoaXMuY2lyY3VsYXIpKSB7XG4gICAgICAgIHJlcyA9IEpTT04xMC5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpLCB0aGlzLmNpcmN1bGFyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdW5kZWZpbmVkIHdoZW4gYmxvYlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdGV4dCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKCFIZWxwZXJzLmlzQmxvYih0aGlzLnJlc3BvbnNlVGV4dCkpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnJlc3BvbnNlVGV4dCBhcyBzdHJpbmcpXG4gICAgICAgICAgLnJlcGxhY2UoL15cXFwiLywgJycpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcXCIkLywgJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBFcnJvckJvZHkgZXh0ZW5kcyBCYXNlQm9keSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkYXRhKSB7XG4gICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQganNvbigpOiBPYmplY3Qge1xuICAgICAgcmV0dXJuIHRoaXMudG9KU09OKHRoaXMuZGF0YSk7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgdGV4dCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGE7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VSZXNwb25zZTxUPiB7XG4gICAgcHJvdGVjdGVkIHN0YXRpYyByZWFkb25seSBjb29raWVzID0gQ29va2llLkluc3RhbmNlO1xuXG4gICAgcHVibGljIGdldCBjb29raWVzKCkge1xuICAgICAgcmV0dXJuIEJhc2VSZXNwb25zZS5jb29raWVzO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHB1YmxpYyByZXNwb25zZVRleHQ/OiBzdHJpbmcgfCBCbG9iLFxuICAgICAgcHVibGljIHJlYWRvbmx5IGhlYWRlcnM/OiBSZXN0SGVhZGVycyxcbiAgICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXNDb2RlPzogSHR0cENvZGUgfCBudW1iZXIsXG4gICAgICBwdWJsaWMgaXNBcnJheSA9IGZhbHNlLFxuICAgICkge31cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBIdHRwUmVzcG9uc2U8VD4gZXh0ZW5kcyBCYXNlUmVzcG9uc2U8VD4ge1xuICAgIHB1YmxpYyBib2R5OiBIdHRwQm9keTxUPjtcblxuXG5cblxuICAgIHJxOiBSZXF1ZXN0Q2FjaGU7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgc291cmNlUmVxdWVzdDogTW9kZWxzLkhhbmRsZVJlc3VsdFNvdXJjZVJlcXVlc3RPcHRpb25zLFxuICAgICAgcHVibGljIHJlc3BvbnNlVGV4dD86IHN0cmluZyB8IEJsb2IsXG4gICAgICBwdWJsaWMgaGVhZGVycz86IFJlc3RIZWFkZXJzLFxuICAgICAgcHVibGljIHN0YXR1c0NvZGU/OiBIdHRwQ29kZSB8IG51bWJlcixcbiAgICAgIHB1YmxpYyBlbnRpdHk/OiBNYXBwaW5nLk1hcHBpbmcgfCBGdW5jdGlvbixcbiAgICAgIHB1YmxpYyBjaXJjdWxhcj86IENpcmNbXSxcbiAgICAgIHB1YmxpYyBqb2JpZD86IG51bWJlcixcbiAgICAgIHB1YmxpYyBpc0FycmF5ID0gZmFsc2UsXG4gICAgKSB7XG5cblxuXG4gICAgICBzdXBlcihyZXNwb25zZVRleHQsIGhlYWRlcnMsIHN0YXR1c0NvZGUsIGlzQXJyYXkpO1xuXG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCgpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5lbnRpdHkgPT09ICdzdHJpbmcnKSB7XG5cbiAgICAgICAgbGV0IGVudGl0eUpTT04gPSB0aGlzLmhlYWRlcnMuZ2V0QWxsKHRoaXMuZW50aXR5KTtcbiAgICAgICAgaWYgKCEhZW50aXR5SlNPTikge1xuICAgICAgICAgIHRoaXMuZW50aXR5ID0gSlNPTi5wYXJzZShlbnRpdHlKU09OLmpvaW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jaXJjdWxhciA9PT0gJ3N0cmluZycpIHtcblxuICAgICAgICBsZXQgY2lyY3VyYWxKU09OID0gdGhpcy5oZWFkZXJzLmdldEFsbCh0aGlzLmNpcmN1bGFyKTtcbiAgICAgICAgaWYgKCEhY2lyY3VyYWxKU09OKSB7XG4gICAgICAgICAgdGhpcy5jaXJjdWxhciA9IEpTT04ucGFyc2UoY2lyY3VyYWxKU09OLmpvaW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuYm9keSA9IG5ldyBIdHRwQm9keShcbiAgICAgICAgdGhpcy5yZXNwb25zZVRleHQsXG4gICAgICAgIHRoaXMuaXNBcnJheSxcbiAgICAgICAgdGhpcy5lbnRpdHksXG4gICAgICAgIHRoaXMuY2lyY3VsYXIsXG4gICAgICApIGFzIGFueTtcbiAgICB9XG5cbiAgICBnZXQgY2FjaGUoKSB7XG4gICAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLnJxKSkge1xuICAgICAgICB0aGlzLnJxID0gbmV3IFJlcXVlc3RDYWNoZSh0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVxdWVzdENhY2hlKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBIdHRwUmVzcG9uc2VFcnJvciBleHRlbmRzIEJhc2VSZXNwb25zZTxhbnk+IHtcbiAgICBwcml2YXRlIGJvZHk6IEVycm9yQm9keTtcblxuXG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcsXG4gICAgICByZXNwb25zZVRleHQ/OiBzdHJpbmcsXG4gICAgICBoZWFkZXJzPzogUmVzdEhlYWRlcnMsXG4gICAgICBzdGF0dXNDb2RlPzogSHR0cENvZGUgfCBudW1iZXIsXG4gICAgICBwdWJsaWMgam9iaWQ/OiBudW1iZXIsXG4gICAgKSB7XG4gICAgICBzdXBlcihyZXNwb25zZVRleHQsIGhlYWRlcnMsIHN0YXR1c0NvZGUpO1xuICAgICAgdGhpcy5ib2R5ID0gbmV3IEVycm9yQm9keShyZXNwb25zZVRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBpbnRlcmZhY2UgTW9ja1Jlc3BvbnNlIHtcbiAgICBkYXRhPzogYW55O1xuICAgIGNvZGU/OiBIdHRwQ29kZTtcbiAgICBlcnJvcj86IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVzdEhlYWRlcnM7XG4gICAgam9iaWQ/OiBudW1iZXI7XG4gICAgaXNBcnJheTogYm9vbGVhbjtcbiAgfVxuXG4gIGV4cG9ydCB0eXBlIFJlc3BvbnNlVHlwZUF4aW9zID1cbiAgICB8ICdibG9iJ1xuICAgIHwgJ3RleHQnXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gIFxufVxuXG4gOyh7fSk7IC8vIEAtLWVuZC1vZi1maWxlLWZvci1tb2R1bGU9bmcyLXJlc3QgbGliL21vZGVscy50cyJdfQ==
|