@revxui/api-clients-ts 1.1.448 → 1.1.450
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 +2 -2
- package/api/dCOVideoSettingsController.service.d.ts +43 -12
- package/esm2020/api/dCOVideoSettingsController.service.mjs +136 -23
- package/esm2020/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.mjs +2 -0
- package/esm2020/model/apiResponseObjectListstring.mjs +13 -0
- package/esm2020/model/dcoVideoBrandGuidelineDTO.mjs +13 -0
- package/esm2020/model/dcoVideoGenerateSampleResponse.mjs +1 -1
- package/esm2020/model/inputStream.mjs +13 -0
- package/esm2020/model/modelFile.mjs +13 -0
- package/esm2020/model/models.mjs +10 -1
- package/esm2020/model/resource.mjs +2 -0
- package/esm2020/model/uRI.mjs +13 -0
- package/esm2020/model/uRL.mjs +2 -0
- package/esm2020/model/uRLStreamHandler.mjs +13 -0
- package/fesm2015/revxui-api-clients-ts.mjs +133 -20
- package/fesm2015/revxui-api-clients-ts.mjs.map +1 -1
- package/fesm2020/revxui-api-clients-ts.mjs +205 -20
- package/fesm2020/revxui-api-clients-ts.mjs.map +1 -1
- package/model/apiResponseObjectListDcoVideoBrandGuidelineDTO.d.ts +17 -0
- package/model/apiResponseObjectListstring.d.ts +16 -0
- package/model/dcoVideoBrandGuidelineDTO.d.ts +16 -0
- package/model/dcoVideoGenerateSampleResponse.d.ts +2 -0
- package/model/inputStream.d.ts +13 -0
- package/model/modelFile.d.ts +32 -0
- package/model/models.d.ts +9 -0
- package/model/resource.d.ts +24 -0
- package/model/uRI.d.ts +30 -0
- package/model/uRL.d.ts +27 -0
- package/model/uRLStreamHandler.d.ts +13 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
## @revxui/api-clients-ts@1.1.
|
|
1
|
+
## @revxui/api-clients-ts@1.1.450
|
|
2
2
|
|
|
3
3
|
### Building
|
|
4
4
|
|
|
@@ -19,7 +19,7 @@ Navigate to the folder of your consuming project and run one of next commands.
|
|
|
19
19
|
_published:_
|
|
20
20
|
|
|
21
21
|
```
|
|
22
|
-
npm install @revxui/api-clients-ts@1.1.
|
|
22
|
+
npm install @revxui/api-clients-ts@1.1.450 --save
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
_without publishing (not recommended):_
|
|
@@ -5,12 +5,12 @@ import { ApiResponseObjectDcoVideoGenerateSampleResponse } from '../model/apiRes
|
|
|
5
5
|
import { ApiResponseObjectDcoVideoGeneratedCountResponse } from '../model/apiResponseObjectDcoVideoGeneratedCountResponse';
|
|
6
6
|
import { ApiResponseObjectDcoVideoSamplesResponse } from '../model/apiResponseObjectDcoVideoSamplesResponse';
|
|
7
7
|
import { ApiResponseObjectDcoVideoSettingsDTO } from '../model/apiResponseObjectDcoVideoSettingsDTO';
|
|
8
|
+
import { ApiResponseObjectListDcoVideoBrandGuidelineDTO } from '../model/apiResponseObjectListDcoVideoBrandGuidelineDTO';
|
|
8
9
|
import { ApiResponseObjectListDcoVideoSettingsDTO } from '../model/apiResponseObjectListDcoVideoSettingsDTO';
|
|
9
10
|
import { ApiResponseObjectListDcoVideoTemplateDTO } from '../model/apiResponseObjectListDcoVideoTemplateDTO';
|
|
11
|
+
import { ApiResponseObjectListstring } from '../model/apiResponseObjectListstring';
|
|
10
12
|
import { DcoVideoActivateRequest } from '../model/dcoVideoActivateRequest';
|
|
11
13
|
import { DcoVideoGenerateSampleRequest } from '../model/dcoVideoGenerateSampleRequest';
|
|
12
|
-
import { DcoVideoSettingsCreateRequest } from '../model/dcoVideoSettingsCreateRequest';
|
|
13
|
-
import { DcoVideoSettingsUpdateRequest } from '../model/dcoVideoSettingsUpdateRequest';
|
|
14
14
|
import { Configuration } from '../configuration';
|
|
15
15
|
import * as i0 from "@angular/core";
|
|
16
16
|
export declare class DCOVideoSettingsControllerService {
|
|
@@ -38,16 +38,19 @@ export declare class DCOVideoSettingsControllerService {
|
|
|
38
38
|
activateSettingsUsingPOST(request: DcoVideoActivateRequest, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectDcoVideoActivateResponse>>;
|
|
39
39
|
/**
|
|
40
40
|
* Create a new DCO video settings configuration
|
|
41
|
-
*
|
|
42
|
-
* @param request DCO Video Settings creation request
|
|
41
|
+
* Multipart endpoint. Send the JSON body in the `request` part. Optionally attach binary files in the `file_PROMO_VIDEO`, `file_PROMO_BANNER`, or `file_BACKGROUND_IMAGE` parts. If both a CDN URL (in the JSON `assets[]`) and a file part are supplied for the same asset type, the file wins.
|
|
42
|
+
* @param request DCO Video Settings creation request (JSON)
|
|
43
|
+
* @param file_BACKGROUND_IMAGE Optional uploaded background image file
|
|
44
|
+
* @param file_PROMO_BANNER Optional uploaded promo banner file
|
|
45
|
+
* @param file_PROMO_VIDEO Optional uploaded promo video file
|
|
43
46
|
* @param reqId request id
|
|
44
47
|
* @param token Auth Token
|
|
45
48
|
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
|
|
46
49
|
* @param reportProgress flag to report request and response progress.
|
|
47
50
|
*/
|
|
48
|
-
createSettingsUsingPOST(request:
|
|
49
|
-
createSettingsUsingPOST(request:
|
|
50
|
-
createSettingsUsingPOST(request:
|
|
51
|
+
createSettingsUsingPOST(request: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiResponseObjectDcoVideoSettingsDTO>;
|
|
52
|
+
createSettingsUsingPOST(request: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiResponseObjectDcoVideoSettingsDTO>>;
|
|
53
|
+
createSettingsUsingPOST(request: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectDcoVideoSettingsDTO>>;
|
|
51
54
|
/**
|
|
52
55
|
* Generate a sample video for a DCO video settings configuration
|
|
53
56
|
*
|
|
@@ -60,6 +63,31 @@ export declare class DCOVideoSettingsControllerService {
|
|
|
60
63
|
generateSampleUsingPOST(request: DcoVideoGenerateSampleRequest, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiResponseObjectDcoVideoGenerateSampleResponse>;
|
|
61
64
|
generateSampleUsingPOST(request: DcoVideoGenerateSampleRequest, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiResponseObjectDcoVideoGenerateSampleResponse>>;
|
|
62
65
|
generateSampleUsingPOST(request: DcoVideoGenerateSampleRequest, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectDcoVideoGenerateSampleResponse>>;
|
|
66
|
+
/**
|
|
67
|
+
* Get all brand guidelines for a given advertiser
|
|
68
|
+
*
|
|
69
|
+
* @param advertiserId Advertiser ID
|
|
70
|
+
* @param includeInactive Include inactive brand guidelines (currently a no-op: AdvertiserLayoutVariables has no is_active column; reserved for forward compatibility)
|
|
71
|
+
* @param reqId request id
|
|
72
|
+
* @param token Auth Token
|
|
73
|
+
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
|
|
74
|
+
* @param reportProgress flag to report request and response progress.
|
|
75
|
+
*/
|
|
76
|
+
getBrandGuidelinesUsingGET(advertiserId: number, includeInactive?: boolean, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiResponseObjectListDcoVideoBrandGuidelineDTO>;
|
|
77
|
+
getBrandGuidelinesUsingGET(advertiserId: number, includeInactive?: boolean, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiResponseObjectListDcoVideoBrandGuidelineDTO>>;
|
|
78
|
+
getBrandGuidelinesUsingGET(advertiserId: number, includeInactive?: boolean, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectListDcoVideoBrandGuidelineDTO>>;
|
|
79
|
+
/**
|
|
80
|
+
* Get all distinct active feed keys for a given advertiser
|
|
81
|
+
*
|
|
82
|
+
* @param advertiserId Advertiser ID
|
|
83
|
+
* @param reqId request id
|
|
84
|
+
* @param token Auth Token
|
|
85
|
+
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
|
|
86
|
+
* @param reportProgress flag to report request and response progress.
|
|
87
|
+
*/
|
|
88
|
+
getFeedKeysUsingGET(advertiserId: number, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiResponseObjectListstring>;
|
|
89
|
+
getFeedKeysUsingGET(advertiserId: number, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiResponseObjectListstring>>;
|
|
90
|
+
getFeedKeysUsingGET(advertiserId: number, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectListstring>>;
|
|
63
91
|
/**
|
|
64
92
|
* Get generated video count and status for a DCO video settings configuration
|
|
65
93
|
*
|
|
@@ -118,19 +146,22 @@ export declare class DCOVideoSettingsControllerService {
|
|
|
118
146
|
getTemplatesUsingGET(advertiserId: number, hasBackgroundImage?: boolean, hasPromoBanner?: boolean, hasPromoVideo?: boolean, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectListDcoVideoTemplateDTO>>;
|
|
119
147
|
/**
|
|
120
148
|
* Update an existing DCO video settings configuration
|
|
121
|
-
*
|
|
149
|
+
* Multipart endpoint. Send the JSON body in the `request` part. Optionally attach binary files in the `file_PROMO_VIDEO`, `file_PROMO_BANNER`, or `file_BACKGROUND_IMAGE` parts. If both a CDN URL (in the JSON `assets[]`) and a file part are supplied for the same asset type, the file wins.
|
|
122
150
|
* @param id Settings configuration ID
|
|
123
|
-
* @param request DCO Video Settings update request
|
|
151
|
+
* @param request DCO Video Settings update request (JSON)
|
|
124
152
|
* @param async Run sample generation asynchronously
|
|
153
|
+
* @param file_BACKGROUND_IMAGE Optional uploaded background image file
|
|
154
|
+
* @param file_PROMO_BANNER Optional uploaded promo banner file
|
|
155
|
+
* @param file_PROMO_VIDEO Optional uploaded promo video file
|
|
125
156
|
* @param regenerateSample Whether to regenerate sample video after update
|
|
126
157
|
* @param reqId request id
|
|
127
158
|
* @param token Auth Token
|
|
128
159
|
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
|
|
129
160
|
* @param reportProgress flag to report request and response progress.
|
|
130
161
|
*/
|
|
131
|
-
updateSettingsUsingPOST(id: number, request:
|
|
132
|
-
updateSettingsUsingPOST(id: number, request:
|
|
133
|
-
updateSettingsUsingPOST(id: number, request:
|
|
162
|
+
updateSettingsUsingPOST(id: number, request: any, async?: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, regenerateSample?: any, reqId?: string, token?: string, observe?: 'body', reportProgress?: boolean): Observable<ApiResponseObjectDcoVideoSettingsDTO>;
|
|
163
|
+
updateSettingsUsingPOST(id: number, request: any, async?: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, regenerateSample?: any, reqId?: string, token?: string, observe?: 'response', reportProgress?: boolean): Observable<HttpResponse<ApiResponseObjectDcoVideoSettingsDTO>>;
|
|
164
|
+
updateSettingsUsingPOST(id: number, request: any, async?: any, file_BACKGROUND_IMAGE?: Blob, file_PROMO_BANNER?: Blob, file_PROMO_VIDEO?: Blob, regenerateSample?: any, reqId?: string, token?: string, observe?: 'events', reportProgress?: boolean): Observable<HttpEvent<ApiResponseObjectDcoVideoSettingsDTO>>;
|
|
134
165
|
static ɵfac: i0.ɵɵFactoryDeclaration<DCOVideoSettingsControllerService, [null, { optional: true; }, { optional: true; }]>;
|
|
135
166
|
static ɵprov: i0.ɵɵInjectableDeclaration<DCOVideoSettingsControllerService>;
|
|
136
167
|
}
|
|
@@ -79,7 +79,7 @@ export class DCOVideoSettingsControllerService {
|
|
|
79
79
|
reportProgress: reportProgress
|
|
80
80
|
});
|
|
81
81
|
}
|
|
82
|
-
createSettingsUsingPOST(request, reqId, token, observe = 'body', reportProgress = false) {
|
|
82
|
+
createSettingsUsingPOST(request, file_BACKGROUND_IMAGE, file_PROMO_BANNER, file_PROMO_VIDEO, reqId, token, observe = 'body', reportProgress = false) {
|
|
83
83
|
if (request === null || request === undefined) {
|
|
84
84
|
throw new Error('Required parameter request was null or undefined when calling createSettingsUsingPOST.');
|
|
85
85
|
}
|
|
@@ -100,13 +100,40 @@ export class DCOVideoSettingsControllerService {
|
|
|
100
100
|
}
|
|
101
101
|
// to determine the Content-Type header
|
|
102
102
|
const consumes = [
|
|
103
|
-
'
|
|
103
|
+
'multipart/form-data'
|
|
104
104
|
];
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
const canConsumeForm = this.canConsumeForm(consumes);
|
|
106
|
+
let formParams;
|
|
107
|
+
let useForm = false;
|
|
108
|
+
let convertFormParamsToString = false;
|
|
109
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
110
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
111
|
+
useForm = canConsumeForm;
|
|
112
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
113
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
114
|
+
useForm = canConsumeForm;
|
|
115
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
116
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
117
|
+
useForm = canConsumeForm;
|
|
118
|
+
if (useForm) {
|
|
119
|
+
formParams = new FormData();
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
formParams = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
|
|
123
|
+
}
|
|
124
|
+
if (file_BACKGROUND_IMAGE !== undefined) {
|
|
125
|
+
formParams = formParams.append('file_BACKGROUND_IMAGE', file_BACKGROUND_IMAGE) || formParams;
|
|
126
|
+
}
|
|
127
|
+
if (file_PROMO_BANNER !== undefined) {
|
|
128
|
+
formParams = formParams.append('file_PROMO_BANNER', file_PROMO_BANNER) || formParams;
|
|
129
|
+
}
|
|
130
|
+
if (file_PROMO_VIDEO !== undefined) {
|
|
131
|
+
formParams = formParams.append('file_PROMO_VIDEO', file_PROMO_VIDEO) || formParams;
|
|
132
|
+
}
|
|
133
|
+
if (request !== undefined) {
|
|
134
|
+
formParams = formParams.append('request', request) || formParams;
|
|
135
|
+
}
|
|
136
|
+
return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings`, convertFormParamsToString ? formParams.toString() : formParams, {
|
|
110
137
|
withCredentials: this.configuration.withCredentials,
|
|
111
138
|
headers: headers,
|
|
112
139
|
observe: observe,
|
|
@@ -147,6 +174,67 @@ export class DCOVideoSettingsControllerService {
|
|
|
147
174
|
reportProgress: reportProgress
|
|
148
175
|
});
|
|
149
176
|
}
|
|
177
|
+
getBrandGuidelinesUsingGET(advertiserId, includeInactive, reqId, token, observe = 'body', reportProgress = false) {
|
|
178
|
+
if (advertiserId === null || advertiserId === undefined) {
|
|
179
|
+
throw new Error('Required parameter advertiserId was null or undefined when calling getBrandGuidelinesUsingGET.');
|
|
180
|
+
}
|
|
181
|
+
let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
|
|
182
|
+
if (includeInactive !== undefined && includeInactive !== null) {
|
|
183
|
+
queryParameters = queryParameters.set('includeInactive', includeInactive);
|
|
184
|
+
}
|
|
185
|
+
let headers = this.defaultHeaders;
|
|
186
|
+
if (reqId !== undefined && reqId !== null) {
|
|
187
|
+
headers = headers.set('reqId', String(reqId));
|
|
188
|
+
}
|
|
189
|
+
if (token !== undefined && token !== null) {
|
|
190
|
+
headers = headers.set('token', String(token));
|
|
191
|
+
}
|
|
192
|
+
// to determine the Accept header
|
|
193
|
+
let httpHeaderAccepts = [
|
|
194
|
+
'application/json'
|
|
195
|
+
];
|
|
196
|
+
const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
197
|
+
if (httpHeaderAcceptSelected != undefined) {
|
|
198
|
+
headers = headers.set('Accept', httpHeaderAcceptSelected);
|
|
199
|
+
}
|
|
200
|
+
// to determine the Content-Type header
|
|
201
|
+
const consumes = [];
|
|
202
|
+
return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/advertiser/${encodeURIComponent(String(advertiserId))}/brand-guidelines`, {
|
|
203
|
+
params: queryParameters,
|
|
204
|
+
withCredentials: this.configuration.withCredentials,
|
|
205
|
+
headers: headers,
|
|
206
|
+
observe: observe,
|
|
207
|
+
reportProgress: reportProgress
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
getFeedKeysUsingGET(advertiserId, reqId, token, observe = 'body', reportProgress = false) {
|
|
211
|
+
if (advertiserId === null || advertiserId === undefined) {
|
|
212
|
+
throw new Error('Required parameter advertiserId was null or undefined when calling getFeedKeysUsingGET.');
|
|
213
|
+
}
|
|
214
|
+
let headers = this.defaultHeaders;
|
|
215
|
+
if (reqId !== undefined && reqId !== null) {
|
|
216
|
+
headers = headers.set('reqId', String(reqId));
|
|
217
|
+
}
|
|
218
|
+
if (token !== undefined && token !== null) {
|
|
219
|
+
headers = headers.set('token', String(token));
|
|
220
|
+
}
|
|
221
|
+
// to determine the Accept header
|
|
222
|
+
let httpHeaderAccepts = [
|
|
223
|
+
'application/json'
|
|
224
|
+
];
|
|
225
|
+
const httpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
|
|
226
|
+
if (httpHeaderAcceptSelected != undefined) {
|
|
227
|
+
headers = headers.set('Accept', httpHeaderAcceptSelected);
|
|
228
|
+
}
|
|
229
|
+
// to determine the Content-Type header
|
|
230
|
+
const consumes = [];
|
|
231
|
+
return this.httpClient.get(`${this.basePath}/v2/api/dcovideo/advertiser/${encodeURIComponent(String(advertiserId))}/feed-keys`, {
|
|
232
|
+
withCredentials: this.configuration.withCredentials,
|
|
233
|
+
headers: headers,
|
|
234
|
+
observe: observe,
|
|
235
|
+
reportProgress: reportProgress
|
|
236
|
+
});
|
|
237
|
+
}
|
|
150
238
|
getGeneratedVideoCountUsingGET(id, reqId, token, observe = 'body', reportProgress = false) {
|
|
151
239
|
if (id === null || id === undefined) {
|
|
152
240
|
throw new Error('Required parameter id was null or undefined when calling getGeneratedVideoCountUsingGET.');
|
|
@@ -292,20 +380,13 @@ export class DCOVideoSettingsControllerService {
|
|
|
292
380
|
reportProgress: reportProgress
|
|
293
381
|
});
|
|
294
382
|
}
|
|
295
|
-
updateSettingsUsingPOST(id, request, async, regenerateSample, reqId, token, observe = 'body', reportProgress = false) {
|
|
383
|
+
updateSettingsUsingPOST(id, request, async, file_BACKGROUND_IMAGE, file_PROMO_BANNER, file_PROMO_VIDEO, regenerateSample, reqId, token, observe = 'body', reportProgress = false) {
|
|
296
384
|
if (id === null || id === undefined) {
|
|
297
385
|
throw new Error('Required parameter id was null or undefined when calling updateSettingsUsingPOST.');
|
|
298
386
|
}
|
|
299
387
|
if (request === null || request === undefined) {
|
|
300
388
|
throw new Error('Required parameter request was null or undefined when calling updateSettingsUsingPOST.');
|
|
301
389
|
}
|
|
302
|
-
let queryParameters = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
|
|
303
|
-
if (async !== undefined && async !== null) {
|
|
304
|
-
queryParameters = queryParameters.set('async', async);
|
|
305
|
-
}
|
|
306
|
-
if (regenerateSample !== undefined && regenerateSample !== null) {
|
|
307
|
-
queryParameters = queryParameters.set('regenerateSample', regenerateSample);
|
|
308
|
-
}
|
|
309
390
|
let headers = this.defaultHeaders;
|
|
310
391
|
if (reqId !== undefined && reqId !== null) {
|
|
311
392
|
headers = headers.set('reqId', String(reqId));
|
|
@@ -323,14 +404,46 @@ export class DCOVideoSettingsControllerService {
|
|
|
323
404
|
}
|
|
324
405
|
// to determine the Content-Type header
|
|
325
406
|
const consumes = [
|
|
326
|
-
'
|
|
407
|
+
'multipart/form-data'
|
|
327
408
|
];
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
409
|
+
const canConsumeForm = this.canConsumeForm(consumes);
|
|
410
|
+
let formParams;
|
|
411
|
+
let useForm = false;
|
|
412
|
+
let convertFormParamsToString = false;
|
|
413
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
414
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
415
|
+
useForm = canConsumeForm;
|
|
416
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
417
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
418
|
+
useForm = canConsumeForm;
|
|
419
|
+
// use FormData to transmit files using content-type "multipart/form-data"
|
|
420
|
+
// see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
|
|
421
|
+
useForm = canConsumeForm;
|
|
422
|
+
if (useForm) {
|
|
423
|
+
formParams = new FormData();
|
|
424
|
+
}
|
|
425
|
+
else {
|
|
426
|
+
formParams = new HttpParams({ encoder: new CustomHttpUrlEncodingCodec() });
|
|
427
|
+
}
|
|
428
|
+
if (async !== undefined) {
|
|
429
|
+
formParams = formParams.append('async', async) || formParams;
|
|
430
|
+
}
|
|
431
|
+
if (file_BACKGROUND_IMAGE !== undefined) {
|
|
432
|
+
formParams = formParams.append('file_BACKGROUND_IMAGE', file_BACKGROUND_IMAGE) || formParams;
|
|
433
|
+
}
|
|
434
|
+
if (file_PROMO_BANNER !== undefined) {
|
|
435
|
+
formParams = formParams.append('file_PROMO_BANNER', file_PROMO_BANNER) || formParams;
|
|
436
|
+
}
|
|
437
|
+
if (file_PROMO_VIDEO !== undefined) {
|
|
438
|
+
formParams = formParams.append('file_PROMO_VIDEO', file_PROMO_VIDEO) || formParams;
|
|
439
|
+
}
|
|
440
|
+
if (regenerateSample !== undefined) {
|
|
441
|
+
formParams = formParams.append('regenerateSample', regenerateSample) || formParams;
|
|
442
|
+
}
|
|
443
|
+
if (request !== undefined) {
|
|
444
|
+
formParams = formParams.append('request', request) || formParams;
|
|
445
|
+
}
|
|
446
|
+
return this.httpClient.post(`${this.basePath}/v2/api/dcovideo/settings/${encodeURIComponent(String(id))}`, convertFormParamsToString ? formParams.toString() : formParams, {
|
|
334
447
|
withCredentials: this.configuration.withCredentials,
|
|
335
448
|
headers: headers,
|
|
336
449
|
observe: observe,
|
|
@@ -350,4 +463,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
350
463
|
}] }, { type: i2.Configuration, decorators: [{
|
|
351
464
|
type: Optional
|
|
352
465
|
}] }]; } });
|
|
353
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZENPVmlkZW9TZXR0aW5nc0NvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9kQ09WaWRlb1NldHRpbmdzQ29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVixNQUFnQyxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBNkIsWUFBWSxDQUFDO0FBZ0IvRSxPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUEwQyxrQkFBa0IsQ0FBQzs7OztBQUlyRixNQUFNLE9BQU8saUNBQWlDO0lBTTFDLFlBQXNCLFVBQXNCLEVBQWdDLFFBQWdCLEVBQWMsYUFBNEI7UUFBaEgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUpsQyxhQUFRLEdBQUcsZ0NBQWdDLENBQUM7UUFDL0MsbUJBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUd2QyxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLFFBQWtCO1FBQ3JDLE1BQU0sSUFBSSxHQUFH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QkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUFxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcGkgRG9jdW1lbnRhdGlvblxuICogQXBpIERvY3VtZW50YXRpb25cbiAqXG4gKiBPcGVuQVBJIHNwZWMgdmVyc2lvbjogMS4wXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IHRoZSBzd2FnZ2VyIGNvZGUgZ2VuZXJhdG9yIHByb2dyYW0uXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci1jb2RlZ2VuLmdpdFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlZENvdW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2FtcGxlc1Jlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NhbXBsZXNSZXNwb25zZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8gfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTyB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvU2V0dGluZ3NEVE8nO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTyB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8nO1xuaW1wb3J0IHsgRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9kY29WaWRlb0FjdGl2YXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2Rjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0JztcbmltcG9ydCB7IERjb1ZpZGVvU2V0dGluZ3NDcmVhdGVSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvZGNvVmlkZW9TZXR0aW5nc0NyZWF0ZVJlcXVlc3QnO1xuaW1wb3J0IHsgRGNvVmlkZW9TZXR0aW5nc1VwZGF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9kY29WaWRlb1NldHRpbmdzVXBkYXRlUmVxdWVzdCc7XG5cbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEQ09WaWRlb1NldHRpbmdzQ29udHJvbGxlclNlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vYXBpdjJzdGFnZTcuYXRvbWV4Lm5ldCc7XG4gICAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmcsIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKGJhc2VQYXRoKSB7XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGggfHwgY29uZmlndXJhdGlvbi5iYXNlUGF0aCB8fCB0aGlzLmJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvbnN1bWVzIHN0cmluZ1tdIG1pbWUtdHlwZXNcbiAgICAgKiBAcmV0dXJuIHRydWU6IGNvbnN1bWVzIGNvbnRhaW5zICdtdWx0aXBhcnQvZm9ybS1kYXRhJywgZmFsc2U6IG90aGVyd2lzZVxuICAgICAqL1xuICAgIHByaXZhdGUgY2FuQ29uc3VtZUZvcm0oY29uc3VtZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZvcm0gPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc7XG4gICAgICAgIGZvciAoY29uc3QgY29uc3VtZSBvZiBjb25zdW1lcykge1xuICAgICAgICAgICAgaWYgKGZvcm0gPT09IGNvbnN1bWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSBvciBkZWFjdGl2YXRlIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBBY3RpdmF0ZS9EZWFjdGl2YXRlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZT47XG4gICAgcHVibGljIGFjdGl2YXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlPj47XG4gICAgcHVibGljIGFjdGl2YXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBhY3RpdmF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvQWN0aXZhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsIHx8IHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjdGl2YXRlU2V0dGluZ3NVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy9hY3RpdmF0ZWAsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogXG4gICAgICogQHBhcmFtIHJlcXVlc3QgRENPIFZpZGVvIFNldHRpbmdzIGNyZWF0aW9uIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NDcmVhdGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPjtcbiAgICBwdWJsaWMgY3JlYXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9TZXR0aW5nc0NyZWF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzQ3JlYXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzQ3JlYXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAocmVxdWVzdCA9PT0gbnVsbCB8fCByZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5nc2AsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgYSBzYW1wbGUgdmlkZW8gZm9yIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBHZW5lcmF0ZSBzYW1wbGUgcmVxdWVzdFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVTYW1wbGVVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZT47XG4gICAgcHVibGljIGdlbmVyYXRlU2FtcGxlVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZW5lcmF0ZVNhbXBsZVVzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlPj47XG4gICAgcHVibGljIGdlbmVyYXRlU2FtcGxlVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsIHx8IHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdlbmVyYXRlU2FtcGxlVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvZ2VuZXJhdGUtc2FtcGxlYCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VuZXJhdGVkIHZpZGVvIGNvdW50IGFuZCBzdGF0dXMgZm9yIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaWQgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBJRFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9Db3VudFVzaW5nR0VUKGlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZT47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRHZW5lcmF0ZWRWaWRlb0NvdW50VXNpbmdHRVQoaWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9L2dlbmVyYXRlZC12aWRlby1jb3VudGAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VuZXJhdGVkIHZpZGVvIHNhbXBsZXMgZm9yIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaWQgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBJRFxuICAgICAqIEBwYXJhbSBwYWdlIFBhZ2UgbnVtYmVyICgwLWluZGV4ZWQpXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2UgKG1heCAxMDApXG4gICAgICogQHBhcmFtIHN0YXR1cyBGaWx0ZXIgYnkgc3RhdHVzOiBDT01QTEVURUQsIEZBSUxFRCwgUEVORElORywgYWxsXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9TYW1wbGVzVXNpbmdHRVQoaWQ6IG51bWJlciwgcGFnZT86IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHNpemU/OiBudW1iZXIsIHN0YXR1cz86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NhbXBsZXNSZXNwb25zZT47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvU2FtcGxlc1VzaW5nR0VUKGlkOiBudW1iZXIsIHBhZ2U/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBzdGF0dXM/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NhbXBsZXNSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRHZW5lcmF0ZWRWaWRlb1NhbXBsZXNVc2luZ0dFVChpZDogbnVtYmVyLCBwYWdlPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgc2l6ZT86IG51bWJlciwgc3RhdHVzPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2FtcGxlc1Jlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvU2FtcGxlc1VzaW5nR0VUKGlkOiBudW1iZXIsIHBhZ2U/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBzdGF0dXM/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRHZW5lcmF0ZWRWaWRlb1NhbXBsZXNVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgncGFnZScsIDxhbnk+cGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBzaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdzaXplJywgPGFueT5zaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdzdGF0dXMnLCA8YW55PnN0YXR1cyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TYW1wbGVzUmVzcG9uc2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKX0vZ2V0LWdlbmVyYXRlZC12aWRlby1zYW1wbGVzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgRENPIHZpZGVvIHNldHRpbmdzIGZvciBhbiBhZHZlcnRpc2VyXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGluY2x1ZGVBc3NldHMgSW5jbHVkZSBhc3NldHMgaW4gcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gaW5jbHVkZUluYWN0aXZlIEluY2x1ZGUgaW5hY3RpdmUgY29uZmlndXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTz47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBnZXRTZXR0aW5nc1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCBpbmNsdWRlQXNzZXRzPzogYm9vbGVhbiwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkID09PSBudWxsIHx8IGFkdmVydGlzZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBhZHZlcnRpc2VySWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRTZXR0aW5nc1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChpbmNsdWRlQXNzZXRzICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUFzc2V0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaW5jbHVkZUFzc2V0cycsIDxhbnk+aW5jbHVkZUFzc2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVJbmFjdGl2ZSAhPT0gdW5kZWZpbmVkICYmIGluY2x1ZGVJbmFjdGl2ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaW5jbHVkZUluYWN0aXZlJywgPGFueT5pbmNsdWRlSW5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFkdmVydGlzZXJJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXZhaWxhYmxlIERDTyB2aWRlbyB0ZW1wbGF0ZXMgZmlsdGVyZWQgYnkgYXNzZXQgYXZhaWxhYmlsaXR5XG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGhhc0JhY2tncm91bmRJbWFnZSBIYXMgYmFja2dyb3VuZCBpbWFnZSBhc3NldFxuICAgICAqIEBwYXJhbSBoYXNQcm9tb0Jhbm5lciBIYXMgcHJvbW8gYmFubmVyIGFzc2V0XG4gICAgICogQHBhcmFtIGhhc1Byb21vVmlkZW8gSGFzIHByb21vIHZpZGVvIGFzc2V0XG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTz4+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+PjtcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGhhc0JhY2tncm91bmRJbWFnZT86IGJvb2xlYW4sIGhhc1Byb21vQmFubmVyPzogYm9vbGVhbiwgaGFzUHJvbW9WaWRlbz86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VGVtcGxhdGVzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkICE9PSB1bmRlZmluZWQgJiYgYWR2ZXJ0aXNlcklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdhZHZlcnRpc2VySWQnLCA8YW55PmFkdmVydGlzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0JhY2tncm91bmRJbWFnZSAhPT0gdW5kZWZpbmVkICYmIGhhc0JhY2tncm91bmRJbWFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzQmFja2dyb3VuZEltYWdlJywgPGFueT5oYXNCYWNrZ3JvdW5kSW1hZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb0Jhbm5lciAhPT0gdW5kZWZpbmVkICYmIGhhc1Byb21vQmFubmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdoYXNQcm9tb0Jhbm5lcicsIDxhbnk+aGFzUHJvbW9CYW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb1ZpZGVvICE9PSB1bmRlZmluZWQgJiYgaGFzUHJvbW9WaWRlbyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzUHJvbW9WaWRlbycsIDxhbnk+aGFzUHJvbW9WaWRlbyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby90ZW1wbGF0ZXNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogXG4gICAgICogQHBhcmFtIGlkIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gSURcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBEQ08gVmlkZW8gU2V0dGluZ3MgdXBkYXRlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gYXN5bmMgUnVuIHNhbXBsZSBnZW5lcmF0aW9uIGFzeW5jaHJvbm91c2x5XG4gICAgICogQHBhcmFtIHJlZ2VuZXJhdGVTYW1wbGUgV2hldGhlciB0byByZWdlbmVyYXRlIHNhbXBsZSB2aWRlbyBhZnRlciB1cGRhdGVcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IERjb1ZpZGVvU2V0dGluZ3NVcGRhdGVSZXF1ZXN0LCBhc3luYz86IGJvb2xlYW4sIHJlZ2VuZXJhdGVTYW1wbGU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPjtcbiAgICBwdWJsaWMgdXBkYXRlU2V0dGluZ3NVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxdWVzdDogRGNvVmlkZW9TZXR0aW5nc1VwZGF0ZVJlcXVlc3QsIGFzeW5jPzogYm9vbGVhbiwgcmVnZW5lcmF0ZVNhbXBsZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzVXBkYXRlUmVxdWVzdCwgYXN5bmM/OiBib29sZWFuLCByZWdlbmVyYXRlU2FtcGxlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXF1ZXN0OiBEY29WaWRlb1NldHRpbmdzVXBkYXRlUmVxdWVzdCwgYXN5bmM/OiBib29sZWFuLCByZWdlbmVyYXRlU2FtcGxlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsIHx8IHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChhc3luYyAhPT0gdW5kZWZpbmVkICYmIGFzeW5jICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdhc3luYycsIDxhbnk+YXN5bmMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWdlbmVyYXRlU2FtcGxlICE9PSB1bmRlZmluZWQgJiYgcmVnZW5lcmF0ZVNhbXBsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgncmVnZW5lcmF0ZVNhbXBsZScsIDxhbnk+cmVnZW5lcmF0ZVNhbXBsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKX1gLFxuICAgICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxufVxuIl19
|
|
466
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZENPVmlkZW9TZXR0aW5nc0NvbnRyb2xsZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2FwaS9kQ09WaWRlb1NldHRpbmdzQ29udHJvbGxlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVixNQUFnQyxzQkFBc0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBNkIsWUFBWSxDQUFDO0FBZ0IvRSxPQUFPLEVBQUUsU0FBUyxFQUFzQixNQUEwQixjQUFjLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUEwQyxrQkFBa0IsQ0FBQzs7OztBQUlyRixNQUFNLE9BQU8saUNBQWlDO0lBTTFDLFlBQXNCLFVBQXNCLEVBQWdDLFFBQWdCLEVBQWMsYUFBNEI7UUFBaEgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUpsQyxhQUFRLEdBQUcsZ0NBQWdDLENBQUM7UUFDL0MsbUJBQWMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ25DLGtCQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztRQUd2QyxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDdkU7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssY0FBYyxDQUFDLFFBQWtCO1FBQ3JDLE1BQU0sSUFBSSxHQUFH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QU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7OytIQXBzQlEsaUNBQWlDLDRDQU11QixTQUFTO21JQU5qRSxpQ0FBaUM7NEZBQWpDLGlDQUFpQztrQkFEN0MsVUFBVTs7MEJBT3dDLFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFwaSBEb2N1bWVudGF0aW9uXG4gKiBBcGkgRG9jdW1lbnRhdGlvblxuICpcbiAqIE9wZW5BUEkgc3BlYyB2ZXJzaW9uOiAxLjBcbiAqIFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgdGhlIHN3YWdnZXIgY29kZSBnZW5lcmF0b3IgcHJvZ3JhbS5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zd2FnZ2VyLWFwaS9zd2FnZ2VyLWNvZGVnZW4uZ2l0XG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOm5vLXVudXNlZC12YXJpYWJsZSBtZW1iZXItb3JkZXJpbmcgKi9cblxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9ICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMsXG4gICAgICAgICBIdHRwUmVzcG9uc2UsIEh0dHBFdmVudCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMgfSAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TYW1wbGVzUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2FtcGxlc1Jlc3BvbnNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTyB9IGZyb20gJy4uL21vZGVsL2FwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb0JyYW5kR3VpZGVsaW5lRFRPIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9CcmFuZEd1aWRlbGluZURUTyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1RlbXBsYXRlRFRPIH0gZnJvbSAnLi4vbW9kZWwvYXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZU9iamVjdExpc3RzdHJpbmcgfSBmcm9tICcuLi9tb2RlbC9hcGlSZXNwb25zZU9iamVjdExpc3RzdHJpbmcnO1xuaW1wb3J0IHsgRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9kY29WaWRlb0FjdGl2YXRlUmVxdWVzdCc7XG5pbXBvcnQgeyBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2Rjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0JztcblxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERDT1ZpZGVvU2V0dGluZ3NDb250cm9sbGVyU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly9hcGl2MnN0YWdlNy5hdG9tZXgubmV0JztcbiAgICBwdWJsaWMgZGVmYXVsdEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcbiAgICBwdWJsaWMgY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZywgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoYmFzZVBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aCB8fCBjb25maWd1cmF0aW9uLmJhc2VQYXRoIHx8IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uc3VtZXMgc3RyaW5nW10gbWltZS10eXBlc1xuICAgICAqIEByZXR1cm4gdHJ1ZTogY29uc3VtZXMgY29udGFpbnMgJ211bHRpcGFydC9mb3JtLWRhdGEnLCBmYWxzZTogb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYW5Db25zdW1lRm9ybShjb25zdW1lczogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZm9ybSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJztcbiAgICAgICAgZm9yIChjb25zdCBjb25zdW1lIG9mIGNvbnN1bWVzKSB7XG4gICAgICAgICAgICBpZiAoZm9ybSA9PT0gY29uc3VtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgYSBEQ08gdmlkZW8gc2V0dGluZ3MgY29uZmlndXJhdGlvblxuICAgICAqIFxuICAgICAqIEBwYXJhbSByZXF1ZXN0IEFjdGl2YXRlL0RlYWN0aXZhdGUgcmVxdWVzdFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWN0aXZhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0FjdGl2YXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgYWN0aXZhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0FjdGl2YXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0FjdGl2YXRlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgYWN0aXZhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0FjdGl2YXRlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9BY3RpdmF0ZVJlc3BvbnNlPj47XG4gICAgcHVibGljIGFjdGl2YXRlU2V0dGluZ3NVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9BY3RpdmF0ZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgPT09IG51bGwgfHwgcmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWN0aXZhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvQWN0aXZhdGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2Rjb3ZpZGVvL3NldHRpbmdzL2FjdGl2YXRlYCxcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBNdWx0aXBhcnQgZW5kcG9pbnQuIFNlbmQgdGhlIEpTT04gYm9keSBpbiB0aGUgJiN4NjA7cmVxdWVzdCYjeDYwOyBwYXJ0LiBPcHRpb25hbGx5IGF0dGFjaCBiaW5hcnkgZmlsZXMgaW4gdGhlICYjeDYwO2ZpbGVfUFJPTU9fVklERU8mI3g2MDssICYjeDYwO2ZpbGVfUFJPTU9fQkFOTkVSJiN4NjA7LCBvciAmI3g2MDtmaWxlX0JBQ0tHUk9VTkRfSU1BR0UmI3g2MDsgcGFydHMuIElmIGJvdGggYSBDRE4gVVJMIChpbiB0aGUgSlNPTiAmI3g2MDthc3NldHNbXSYjeDYwOykgYW5kIGEgZmlsZSBwYXJ0IGFyZSBzdXBwbGllZCBmb3IgdGhlIHNhbWUgYXNzZXQgdHlwZSwgdGhlIGZpbGUgd2lucy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBEQ08gVmlkZW8gU2V0dGluZ3MgY3JlYXRpb24gcmVxdWVzdCAoSlNPTilcbiAgICAgKiBAcGFyYW0gZmlsZV9CQUNLR1JPVU5EX0lNQUdFIE9wdGlvbmFsIHVwbG9hZGVkIGJhY2tncm91bmQgaW1hZ2UgZmlsZVxuICAgICAqIEBwYXJhbSBmaWxlX1BST01PX0JBTk5FUiBPcHRpb25hbCB1cGxvYWRlZCBwcm9tbyBiYW5uZXIgZmlsZVxuICAgICAqIEBwYXJhbSBmaWxlX1BST01PX1ZJREVPIE9wdGlvbmFsIHVwbG9hZGVkIHByb21vIHZpZGVvIGZpbGVcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz47XG4gICAgcHVibGljIGNyZWF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIGNyZWF0ZVNldHRpbmdzVXNpbmdQT1NUKHJlcXVlc3Q6IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBjcmVhdGVTZXR0aW5nc1VzaW5nUE9TVChyZXF1ZXN0OiBhbnksIGZpbGVfQkFDS0dST1VORF9JTUFHRT86IEJsb2IsIGZpbGVfUFJPTU9fQkFOTkVSPzogQmxvYiwgZmlsZV9QUk9NT19WSURFTz86IEJsb2IsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgPT09IG51bGwgfHwgcmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlU2V0dGluZ3NVc2luZ1BPU1QuJyk7XG4gICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhJ1xuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IGNhbkNvbnN1bWVGb3JtID0gdGhpcy5jYW5Db25zdW1lRm9ybShjb25zdW1lcyk7XG5cbiAgICAgICAgbGV0IGZvcm1QYXJhbXM6IHsgYXBwZW5kKHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHwgSHR0cFBhcmFtczsgfTtcbiAgICAgICAgbGV0IHVzZUZvcm0gPSBmYWxzZTtcbiAgICAgICAgbGV0IGNvbnZlcnRGb3JtUGFyYW1zVG9TdHJpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gdXNlIEZvcm1EYXRhIHRvIHRyYW5zbWl0IGZpbGVzIHVzaW5nIGNvbnRlbnQtdHlwZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDAwNzk2OS9hcHBsaWNhdGlvbi14LXd3dy1mb3JtLXVybGVuY29kZWQtb3ItbXVsdGlwYXJ0LWZvcm0tZGF0YVxuICAgICAgICB1c2VGb3JtID0gY2FuQ29uc3VtZUZvcm07XG4gICAgICAgIC8vIHVzZSBGb3JtRGF0YSB0byB0cmFuc21pdCBmaWxlcyB1c2luZyBjb250ZW50LXR5cGUgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMDc5NjkvYXBwbGljYXRpb24teC13d3ctZm9ybS11cmxlbmNvZGVkLW9yLW11bHRpcGFydC1mb3JtLWRhdGFcbiAgICAgICAgdXNlRm9ybSA9IGNhbkNvbnN1bWVGb3JtO1xuICAgICAgICAvLyB1c2UgRm9ybURhdGEgdG8gdHJhbnNtaXQgZmlsZXMgdXNpbmcgY29udGVudC10eXBlIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG4gICAgICAgIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDA3OTY5L2FwcGxpY2F0aW9uLXgtd3d3LWZvcm0tdXJsZW5jb2RlZC1vci1tdWx0aXBhcnQtZm9ybS1kYXRhXG4gICAgICAgIHVzZUZvcm0gPSBjYW5Db25zdW1lRm9ybTtcbiAgICAgICAgaWYgKHVzZUZvcm0pIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogbmV3IEN1c3RvbUh0dHBVcmxFbmNvZGluZ0NvZGVjKCl9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWxlX0JBQ0tHUk9VTkRfSU1BR0UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX0JBQ0tHUk9VTkRfSU1BR0UnLCA8YW55PmZpbGVfQkFDS0dST1VORF9JTUFHRSkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZV9QUk9NT19CQU5ORVIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX1BST01PX0JBTk5FUicsIDxhbnk+ZmlsZV9QUk9NT19CQU5ORVIpIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVfUFJPTU9fVklERU8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX1BST01PX1ZJREVPJywgPGFueT5maWxlX1BST01PX1ZJREVPKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgncmVxdWVzdCcsIDxhbnk+cmVxdWVzdCkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5nc2AsXG4gICAgICAgICAgICBjb252ZXJ0Rm9ybVBhcmFtc1RvU3RyaW5nID8gZm9ybVBhcmFtcy50b1N0cmluZygpIDogZm9ybVBhcmFtcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIGEgc2FtcGxlIHZpZGVvIGZvciBhIERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogXG4gICAgICogQHBhcmFtIHJlcXVlc3QgR2VuZXJhdGUgc2FtcGxlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdlbmVyYXRlU2FtcGxlVXNpbmdQT1NUKHJlcXVlc3Q6IERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXF1ZXN0LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBnZW5lcmF0ZVNhbXBsZVVzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2VuZXJhdGVTYW1wbGVVc2luZ1BPU1QocmVxdWVzdDogRGNvVmlkZW9HZW5lcmF0ZVNhbXBsZVJlcXVlc3QsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZW5lcmF0ZVNhbXBsZVVzaW5nUE9TVChyZXF1ZXN0OiBEY29WaWRlb0dlbmVyYXRlU2FtcGxlUmVxdWVzdCwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAocmVxdWVzdCA9PT0gbnVsbCB8fCByZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZW5lcmF0ZVNhbXBsZVVzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVTYW1wbGVSZXNwb25zZT4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2Rjb3ZpZGVvL3NldHRpbmdzL2dlbmVyYXRlLXNhbXBsZWAsXG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBicmFuZCBndWlkZWxpbmVzIGZvciBhIGdpdmVuIGFkdmVydGlzZXJcbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gYWR2ZXJ0aXNlcklkIEFkdmVydGlzZXIgSURcbiAgICAgKiBAcGFyYW0gaW5jbHVkZUluYWN0aXZlIEluY2x1ZGUgaW5hY3RpdmUgYnJhbmQgZ3VpZGVsaW5lcyAoY3VycmVudGx5IGEgbm8tb3A6IEFkdmVydGlzZXJMYXlvdXRWYXJpYWJsZXMgaGFzIG5vIGlzX2FjdGl2ZSBjb2x1bW47IHJlc2VydmVkIGZvciBmb3J3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCcmFuZEd1aWRlbGluZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvQnJhbmRHdWlkZWxpbmVEVE8+O1xuICAgIHB1YmxpYyBnZXRCcmFuZEd1aWRlbGluZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9CcmFuZEd1aWRlbGluZURUTz4+O1xuICAgIHB1YmxpYyBnZXRCcmFuZEd1aWRlbGluZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvQnJhbmRHdWlkZWxpbmVEVE8+PjtcbiAgICBwdWJsaWMgZ2V0QnJhbmRHdWlkZWxpbmVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVJbmFjdGl2ZT86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QnJhbmRHdWlkZWxpbmVzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChpbmNsdWRlSW5hY3RpdmUgIT09IHVuZGVmaW5lZCAmJiBpbmNsdWRlSW5hY3RpdmUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1ldGVycyA9IHF1ZXJ5UGFyYW1ldGVycy5zZXQoJ2luY2x1ZGVJbmFjdGl2ZScsIDxhbnk+aW5jbHVkZUluYWN0aXZlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9CcmFuZEd1aWRlbGluZURUTz4oYCR7dGhpcy5iYXNlUGF0aH0vdjIvYXBpL2Rjb3ZpZGVvL2FkdmVydGlzZXIvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFkdmVydGlzZXJJZCkpfS9icmFuZC1ndWlkZWxpbmVzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgZGlzdGluY3QgYWN0aXZlIGZlZWQga2V5cyBmb3IgYSBnaXZlbiBhZHZlcnRpc2VyXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGZWVkS2V5c1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nPjtcbiAgICBwdWJsaWMgZ2V0RmVlZEtleXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nPj47XG4gICAgcHVibGljIGdldEZlZWRLZXlzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdExpc3RzdHJpbmc+PjtcbiAgICBwdWJsaWMgZ2V0RmVlZEtleXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkID09PSBudWxsIHx8IGFkdmVydGlzZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBhZHZlcnRpc2VySWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWVkS2V5c1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG4gICAgICAgIGxldCBoZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcbiAgICAgICAgaWYgKHJlcUlkICE9PSB1bmRlZmluZWQgJiYgcmVxSWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgncmVxSWQnLCBTdHJpbmcocmVxSWQpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCAmJiB0b2tlbiAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCd0b2tlbicsIFN0cmluZyh0b2tlbikpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgIGxldCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgaWYgKGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0c3RyaW5nPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vYWR2ZXJ0aXNlci8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoYWR2ZXJ0aXNlcklkKSl9L2ZlZWQta2V5c2AsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VuZXJhdGVkIHZpZGVvIGNvdW50IGFuZCBzdGF0dXMgZm9yIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaWQgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBJRFxuICAgICAqIEBwYXJhbSByZXFJZCByZXF1ZXN0IGlkXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9Db3VudFVzaW5nR0VUKGlkOiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZT47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvR2VuZXJhdGVkQ291bnRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRHZW5lcmF0ZWRWaWRlb0NvdW50VXNpbmdHRVQoaWQ6IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVChpZDogbnVtYmVyLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSApOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGlmIChpZCA9PT0gbnVsbCB8fCBpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBpZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEdlbmVyYXRlZFZpZGVvQ291bnRVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9HZW5lcmF0ZWRDb3VudFJlc3BvbnNlPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9L2dlbmVyYXRlZC12aWRlby1jb3VudGAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZ2VuZXJhdGVkIHZpZGVvIHNhbXBsZXMgZm9yIGEgRENPIHZpZGVvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gaWQgU2V0dGluZ3MgY29uZmlndXJhdGlvbiBJRFxuICAgICAqIEBwYXJhbSBwYWdlIFBhZ2UgbnVtYmVyICgwLWluZGV4ZWQpXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gc2l6ZSBOdW1iZXIgb2YgaXRlbXMgcGVyIHBhZ2UgKG1heCAxMDApXG4gICAgICogQHBhcmFtIHN0YXR1cyBGaWx0ZXIgYnkgc3RhdHVzOiBDT01QTEVURUQsIEZBSUxFRCwgUEVORElORywgYWxsXG4gICAgICogQHBhcmFtIHRva2VuIEF1dGggVG9rZW5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2VuZXJhdGVkVmlkZW9TYW1wbGVzVXNpbmdHRVQoaWQ6IG51bWJlciwgcGFnZT86IG51bWJlciwgcmVxSWQ/OiBzdHJpbmcsIHNpemU/OiBudW1iZXIsIHN0YXR1cz86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NhbXBsZXNSZXNwb25zZT47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvU2FtcGxlc1VzaW5nR0VUKGlkOiBudW1iZXIsIHBhZ2U/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBzdGF0dXM/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NhbXBsZXNSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRHZW5lcmF0ZWRWaWRlb1NhbXBsZXNVc2luZ0dFVChpZDogbnVtYmVyLCBwYWdlPzogbnVtYmVyLCByZXFJZD86IHN0cmluZywgc2l6ZT86IG51bWJlciwgc3RhdHVzPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2FtcGxlc1Jlc3BvbnNlPj47XG4gICAgcHVibGljIGdldEdlbmVyYXRlZFZpZGVvU2FtcGxlc1VzaW5nR0VUKGlkOiBudW1iZXIsIHBhZ2U/OiBudW1iZXIsIHJlcUlkPzogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBzdGF0dXM/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRHZW5lcmF0ZWRWaWRlb1NhbXBsZXNVc2luZ0dFVC4nKTtcbiAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgncGFnZScsIDxhbnk+cGFnZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBzaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdzaXplJywgPGFueT5zaXplKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdzdGF0dXMnLCA8YW55PnN0YXR1cyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0RGNvVmlkZW9TYW1wbGVzUmVzcG9uc2U+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby9zZXR0aW5ncy8ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaWQpKX0vZ2V0LWdlbmVyYXRlZC12aWRlby1zYW1wbGVzYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgRENPIHZpZGVvIHNldHRpbmdzIGZvciBhbiBhZHZlcnRpc2VyXG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGluY2x1ZGVBc3NldHMgSW5jbHVkZSBhc3NldHMgaW4gcmVzcG9uc2VcbiAgICAgKiBAcGFyYW0gaW5jbHVkZUluYWN0aXZlIEluY2x1ZGUgaW5hY3RpdmUgY29uZmlndXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gcmVxSWQgcmVxdWVzdCBpZFxuICAgICAqIEBwYXJhbSB0b2tlbiBBdXRoIFRva2VuXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTz47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIGdldFNldHRpbmdzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGluY2x1ZGVBc3NldHM/OiBib29sZWFuLCBpbmNsdWRlSW5hY3RpdmU/OiBib29sZWFuLCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9TZXR0aW5nc0RUTz4+O1xuICAgIHB1YmxpYyBnZXRTZXR0aW5nc1VzaW5nR0VUKGFkdmVydGlzZXJJZDogbnVtYmVyLCBpbmNsdWRlQXNzZXRzPzogYm9vbGVhbiwgaW5jbHVkZUluYWN0aXZlPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkID09PSBudWxsIHx8IGFkdmVydGlzZXJJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBhZHZlcnRpc2VySWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRTZXR0aW5nc1VzaW5nR0VULicpO1xuICAgICAgICB9XG5cblxuXG5cblxuICAgICAgICBsZXQgcXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IG5ldyBDdXN0b21IdHRwVXJsRW5jb2RpbmdDb2RlYygpfSk7XG4gICAgICAgIGlmIChpbmNsdWRlQXNzZXRzICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUFzc2V0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaW5jbHVkZUFzc2V0cycsIDxhbnk+aW5jbHVkZUFzc2V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVJbmFjdGl2ZSAhPT0gdW5kZWZpbmVkICYmIGluY2x1ZGVJbmFjdGl2ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaW5jbHVkZUluYWN0aXZlJywgPGFueT5pbmNsdWRlSW5hY3RpdmUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuICAgICAgICBpZiAocmVxSWQgIT09IHVuZGVmaW5lZCAmJiByZXFJZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdyZXFJZCcsIFN0cmluZyhyZXFJZCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbiAhPT0gdW5kZWZpbmVkICYmIHRva2VuICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3Rva2VuJywgU3RyaW5nKHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgbGV0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICBpZiAoaHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCBodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXNwb25zZU9iamVjdExpc3REY29WaWRlb1NldHRpbmdzRFRPPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGFkdmVydGlzZXJJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcGFyYW1zOiBxdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYXZhaWxhYmxlIERDTyB2aWRlbyB0ZW1wbGF0ZXMgZmlsdGVyZWQgYnkgYXNzZXQgYXZhaWxhYmlsaXR5XG4gICAgICogXG4gICAgICogQHBhcmFtIGFkdmVydGlzZXJJZCBBZHZlcnRpc2VyIElEXG4gICAgICogQHBhcmFtIGhhc0JhY2tncm91bmRJbWFnZSBIYXMgYmFja2dyb3VuZCBpbWFnZSBhc3NldFxuICAgICAqIEBwYXJhbSBoYXNQcm9tb0Jhbm5lciBIYXMgcHJvbW8gYmFubmVyIGFzc2V0XG4gICAgICogQHBhcmFtIGhhc1Byb21vVmlkZW8gSGFzIHByb21vIHZpZGVvIGFzc2V0XG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3RMaXN0RGNvVmlkZW9UZW1wbGF0ZURUTz4+O1xuICAgIHB1YmxpYyBnZXRUZW1wbGF0ZXNVc2luZ0dFVChhZHZlcnRpc2VySWQ6IG51bWJlciwgaGFzQmFja2dyb3VuZEltYWdlPzogYm9vbGVhbiwgaGFzUHJvbW9CYW5uZXI/OiBib29sZWFuLCBoYXNQcm9tb1ZpZGVvPzogYm9vbGVhbiwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+PjtcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGVzVXNpbmdHRVQoYWR2ZXJ0aXNlcklkOiBudW1iZXIsIGhhc0JhY2tncm91bmRJbWFnZT86IGJvb2xlYW4sIGhhc1Byb21vQmFubmVyPzogYm9vbGVhbiwgaGFzUHJvbW9WaWRlbz86IGJvb2xlYW4sIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlICk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICAgICAgaWYgKGFkdmVydGlzZXJJZCA9PT0gbnVsbCB8fCBhZHZlcnRpc2VySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWR2ZXJ0aXNlcklkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VGVtcGxhdGVzVXNpbmdHRVQuJyk7XG4gICAgICAgIH1cblxuXG5cblxuXG5cbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICBpZiAoYWR2ZXJ0aXNlcklkICE9PSB1bmRlZmluZWQgJiYgYWR2ZXJ0aXNlcklkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdhZHZlcnRpc2VySWQnLCA8YW55PmFkdmVydGlzZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhhc0JhY2tncm91bmRJbWFnZSAhPT0gdW5kZWZpbmVkICYmIGhhc0JhY2tncm91bmRJbWFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzQmFja2dyb3VuZEltYWdlJywgPGFueT5oYXNCYWNrZ3JvdW5kSW1hZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb0Jhbm5lciAhPT0gdW5kZWZpbmVkICYmIGhhc1Byb21vQmFubmVyICE9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSBxdWVyeVBhcmFtZXRlcnMuc2V0KCdoYXNQcm9tb0Jhbm5lcicsIDxhbnk+aGFzUHJvbW9CYW5uZXIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNQcm9tb1ZpZGVvICE9PSB1bmRlZmluZWQgJiYgaGFzUHJvbW9WaWRlbyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVlcnlQYXJhbWV0ZXJzID0gcXVlcnlQYXJhbWV0ZXJzLnNldCgnaGFzUHJvbW9WaWRlbycsIDxhbnk+aGFzUHJvbW9WaWRlbyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICBdO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZ2V0PEFwaVJlc3BvbnNlT2JqZWN0TGlzdERjb1ZpZGVvVGVtcGxhdGVEVE8+KGAke3RoaXMuYmFzZVBhdGh9L3YyL2FwaS9kY292aWRlby90ZW1wbGF0ZXNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHBhcmFtczogcXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGV4aXN0aW5nIERDTyB2aWRlbyBzZXR0aW5ncyBjb25maWd1cmF0aW9uXG4gICAgICogTXVsdGlwYXJ0IGVuZHBvaW50LiBTZW5kIHRoZSBKU09OIGJvZHkgaW4gdGhlICYjeDYwO3JlcXVlc3QmI3g2MDsgcGFydC4gT3B0aW9uYWxseSBhdHRhY2ggYmluYXJ5IGZpbGVzIGluIHRoZSAmI3g2MDtmaWxlX1BST01PX1ZJREVPJiN4NjA7LCAmI3g2MDtmaWxlX1BST01PX0JBTk5FUiYjeDYwOywgb3IgJiN4NjA7ZmlsZV9CQUNLR1JPVU5EX0lNQUdFJiN4NjA7IHBhcnRzLiBJZiBib3RoIGEgQ0ROIFVSTCAoaW4gdGhlIEpTT04gJiN4NjA7YXNzZXRzW10mI3g2MDspIGFuZCBhIGZpbGUgcGFydCBhcmUgc3VwcGxpZWQgZm9yIHRoZSBzYW1lIGFzc2V0IHR5cGUsIHRoZSBmaWxlIHdpbnMuXG4gICAgICogQHBhcmFtIGlkIFNldHRpbmdzIGNvbmZpZ3VyYXRpb24gSURcbiAgICAgKiBAcGFyYW0gcmVxdWVzdCBEQ08gVmlkZW8gU2V0dGluZ3MgdXBkYXRlIHJlcXVlc3QgKEpTT04pXG4gICAgICogQHBhcmFtIGFzeW5jIFJ1biBzYW1wbGUgZ2VuZXJhdGlvbiBhc3luY2hyb25vdXNseVxuICAgICAqIEBwYXJhbSBmaWxlX0JBQ0tHUk9VTkRfSU1BR0UgT3B0aW9uYWwgdXBsb2FkZWQgYmFja2dyb3VuZCBpbWFnZSBmaWxlXG4gICAgICogQHBhcmFtIGZpbGVfUFJPTU9fQkFOTkVSIE9wdGlvbmFsIHVwbG9hZGVkIHByb21vIGJhbm5lciBmaWxlXG4gICAgICogQHBhcmFtIGZpbGVfUFJPTU9fVklERU8gT3B0aW9uYWwgdXBsb2FkZWQgcHJvbW8gdmlkZW8gZmlsZVxuICAgICAqIEBwYXJhbSByZWdlbmVyYXRlU2FtcGxlIFdoZXRoZXIgdG8gcmVnZW5lcmF0ZSBzYW1wbGUgdmlkZW8gYWZ0ZXIgdXBkYXRlXG4gICAgICogQHBhcmFtIHJlcUlkIHJlcXVlc3QgaWRcbiAgICAgKiBAcGFyYW0gdG9rZW4gQXV0aCBUb2tlblxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVChpZDogbnVtYmVyLCByZXF1ZXN0OiBhbnksIGFzeW5jPzogYW55LCBmaWxlX0JBQ0tHUk9VTkRfSU1BR0U/OiBCbG9iLCBmaWxlX1BST01PX0JBTk5FUj86IEJsb2IsIGZpbGVfUFJPTU9fVklERU8/OiBCbG9iLCByZWdlbmVyYXRlU2FtcGxlPzogYW55LCByZXFJZD86IHN0cmluZywgdG9rZW4/OiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPjtcbiAgICBwdWJsaWMgdXBkYXRlU2V0dGluZ3NVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxdWVzdDogYW55LCBhc3luYz86IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVnZW5lcmF0ZVNhbXBsZT86IGFueSwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPj47XG4gICAgcHVibGljIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NUKGlkOiBudW1iZXIsIHJlcXVlc3Q6IGFueSwgYXN5bmM/OiBhbnksIGZpbGVfQkFDS0dST1VORF9JTUFHRT86IEJsb2IsIGZpbGVfUFJPTU9fQkFOTkVSPzogQmxvYiwgZmlsZV9QUk9NT19WSURFTz86IEJsb2IsIHJlZ2VuZXJhdGVTYW1wbGU/OiBhbnksIHJlcUlkPzogc3RyaW5nLCB0b2tlbj86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcGlSZXNwb25zZU9iamVjdERjb1ZpZGVvU2V0dGluZ3NEVE8+PjtcbiAgICBwdWJsaWMgdXBkYXRlU2V0dGluZ3NVc2luZ1BPU1QoaWQ6IG51bWJlciwgcmVxdWVzdDogYW55LCBhc3luYz86IGFueSwgZmlsZV9CQUNLR1JPVU5EX0lNQUdFPzogQmxvYiwgZmlsZV9QUk9NT19CQU5ORVI/OiBCbG9iLCBmaWxlX1BST01PX1ZJREVPPzogQmxvYiwgcmVnZW5lcmF0ZVNhbXBsZT86IGFueSwgcmVxSWQ/OiBzdHJpbmcsIHRva2VuPzogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgICAgICBpZiAoaWQgPT09IG51bGwgfHwgaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVTZXR0aW5nc1VzaW5nUE9TVC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsIHx8IHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVNldHRpbmdzVXNpbmdQT1NULicpO1xuICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuICAgICAgICBsZXQgaGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG4gICAgICAgIGlmIChyZXFJZCAhPT0gdW5kZWZpbmVkICYmIHJlcUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ3JlcUlkJywgU3RyaW5nKHJlcUlkKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRva2VuICE9PSB1bmRlZmluZWQgJiYgdG9rZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgndG9rZW4nLCBTdHJpbmcodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICBsZXQgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIGlmIChodHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsIGh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ211bHRpcGFydC9mb3JtLWRhdGEnXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgY2FuQ29uc3VtZUZvcm0gPSB0aGlzLmNhbkNvbnN1bWVGb3JtKGNvbnN1bWVzKTtcblxuICAgICAgICBsZXQgZm9ybVBhcmFtczogeyBhcHBlbmQocGFyYW06IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQgfCBIdHRwUGFyYW1zOyB9O1xuICAgICAgICBsZXQgdXNlRm9ybSA9IGZhbHNlO1xuICAgICAgICBsZXQgY29udmVydEZvcm1QYXJhbXNUb1N0cmluZyA9IGZhbHNlO1xuICAgICAgICAvLyB1c2UgRm9ybURhdGEgdG8gdHJhbnNtaXQgZmlsZXMgdXNpbmcgY29udGVudC10eXBlIFwibXVsdGlwYXJ0L2Zvcm0tZGF0YVwiXG4gICAgICAgIC8vIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MDA3OTY5L2FwcGxpY2F0aW9uLXgtd3d3LWZvcm0tdXJsZW5jb2RlZC1vci1tdWx0aXBhcnQtZm9ybS1kYXRhXG4gICAgICAgIHVzZUZvcm0gPSBjYW5Db25zdW1lRm9ybTtcbiAgICAgICAgLy8gdXNlIEZvcm1EYXRhIHRvIHRyYW5zbWl0IGZpbGVzIHVzaW5nIGNvbnRlbnQtdHlwZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIlxuICAgICAgICAvLyBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDAwNzk2OS9hcHBsaWNhdGlvbi14LXd3dy1mb3JtLXVybGVuY29kZWQtb3ItbXVsdGlwYXJ0LWZvcm0tZGF0YVxuICAgICAgICB1c2VGb3JtID0gY2FuQ29uc3VtZUZvcm07XG4gICAgICAgIC8vIHVzZSBGb3JtRGF0YSB0byB0cmFuc21pdCBmaWxlcyB1c2luZyBjb250ZW50LXR5cGUgXCJtdWx0aXBhcnQvZm9ybS1kYXRhXCJcbiAgICAgICAgLy8gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQwMDc5NjkvYXBwbGljYXRpb24teC13d3ctZm9ybS11cmxlbmNvZGVkLW9yLW11bHRpcGFydC1mb3JtLWRhdGFcbiAgICAgICAgdXNlRm9ybSA9IGNhbkNvbnN1bWVGb3JtO1xuICAgICAgICBpZiAodXNlRm9ybSkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiBuZXcgQ3VzdG9tSHR0cFVybEVuY29kaW5nQ29kZWMoKX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFzeW5jICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgnYXN5bmMnLCA8YW55PmFzeW5jKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWxlX0JBQ0tHUk9VTkRfSU1BR0UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX0JBQ0tHUk9VTkRfSU1BR0UnLCA8YW55PmZpbGVfQkFDS0dST1VORF9JTUFHRSkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsZV9QUk9NT19CQU5ORVIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX1BST01PX0JBTk5FUicsIDxhbnk+ZmlsZV9QUk9NT19CQU5ORVIpIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVfUFJPTU9fVklERU8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybVBhcmFtcyA9IGZvcm1QYXJhbXMuYXBwZW5kKCdmaWxlX1BST01PX1ZJREVPJywgPGFueT5maWxlX1BST01PX1ZJREVPKSB8fCBmb3JtUGFyYW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWdlbmVyYXRlU2FtcGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1QYXJhbXMgPSBmb3JtUGFyYW1zLmFwcGVuZCgncmVnZW5lcmF0ZVNhbXBsZScsIDxhbnk+cmVnZW5lcmF0ZVNhbXBsZSkgfHwgZm9ybVBhcmFtcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBmb3JtUGFyYW1zID0gZm9ybVBhcmFtcy5hcHBlbmQoJ3JlcXVlc3QnLCA8YW55PnJlcXVlc3QpIHx8IGZvcm1QYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzcG9uc2VPYmplY3REY29WaWRlb1NldHRpbmdzRFRPPihgJHt0aGlzLmJhc2VQYXRofS92Mi9hcGkvZGNvdmlkZW8vc2V0dGluZ3MvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGlkKSl9YCxcbiAgICAgICAgICAgIGNvbnZlcnRGb3JtUGFyYW1zVG9TdHJpbmcgPyBmb3JtUGFyYW1zLnRvU3RyaW5nKCkgOiBmb3JtUGFyYW1zLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iXX0=
|