@veloceapps/api 2.0.15 → 2.0.17
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/bundles/veloce-api.umd.js +227 -228
- package/bundles/veloce-api.umd.js.map +1 -1
- package/esm2015/lib/services/document-attachment-api.service.js +7 -6
- package/esm2015/lib/services/document-templates-api.service.js +143 -154
- package/esm2015/lib/services/quote-api.service.js +12 -1
- package/esm2015/lib/services/rules-api.service.js +2 -2
- package/fesm2015/veloce-api.js +190 -190
- package/fesm2015/veloce-api.js.map +1 -1
- package/lib/services/document-attachment-api.service.d.ts +1 -0
- package/lib/services/document-templates-api.service.d.ts +22 -16
- package/lib/services/quote-api.service.d.ts +1 -0
- package/package.json +1 -1
@@ -6,10 +6,11 @@ export class DocumentAttachmentApiService {
|
|
6
6
|
constructor(httpService, fileDownloadService) {
|
7
7
|
this.httpService = httpService;
|
8
8
|
this.fileDownloadService = fileDownloadService;
|
9
|
+
this.SERVICE_URL = '/attachments';
|
9
10
|
}
|
10
11
|
getAttachments(searchRequest) {
|
11
12
|
return this.httpService.api({
|
12
|
-
url:
|
13
|
+
url: `${this.SERVICE_URL}/search`,
|
13
14
|
method: 'post',
|
14
15
|
body: searchRequest,
|
15
16
|
});
|
@@ -23,7 +24,7 @@ export class DocumentAttachmentApiService {
|
|
23
24
|
type: 'application/json',
|
24
25
|
}));
|
25
26
|
return this.httpService.upload({
|
26
|
-
url:
|
27
|
+
url: `${this.SERVICE_URL}`,
|
27
28
|
body: formData,
|
28
29
|
method: 'post',
|
29
30
|
observe: reportProgress ? 'events' : undefined,
|
@@ -32,7 +33,7 @@ export class DocumentAttachmentApiService {
|
|
32
33
|
}
|
33
34
|
updateAttachment(id, attachment) {
|
34
35
|
return this.httpService.api({
|
35
|
-
url:
|
36
|
+
url: `${this.SERVICE_URL}/${id}`,
|
36
37
|
body: attachment,
|
37
38
|
method: 'put',
|
38
39
|
});
|
@@ -40,7 +41,7 @@ export class DocumentAttachmentApiService {
|
|
40
41
|
getAttachmentFile(id, isPreventDownload) {
|
41
42
|
return this.httpService
|
42
43
|
.api({
|
43
|
-
url:
|
44
|
+
url: `${this.SERVICE_URL}/${id}/file`,
|
44
45
|
responseType: isPreventDownload ? 'arraybuffer' : 'blob',
|
45
46
|
observe: isPreventDownload ? 'body' : 'response',
|
46
47
|
})
|
@@ -52,7 +53,7 @@ export class DocumentAttachmentApiService {
|
|
52
53
|
}
|
53
54
|
removeAttachment(id) {
|
54
55
|
return this.httpService.api({
|
55
|
-
url:
|
56
|
+
url: `${this.SERVICE_URL}/${id}`,
|
56
57
|
method: 'delete',
|
57
58
|
});
|
58
59
|
}
|
@@ -62,4 +63,4 @@ DocumentAttachmentApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "
|
|
62
63
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: DocumentAttachmentApiService, decorators: [{
|
63
64
|
type: Injectable
|
64
65
|
}], ctorParameters: function () { return [{ type: i1.BaseHttpService }, { type: i1.FileDownloadService }]; } });
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtYXR0YWNobWVudC1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYXBpL3NyYy9saWIvc2VydmljZXMvZG9jdW1lbnQtYXR0YWNobWVudC1hcGkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUTNDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUcxQyxNQUFNLE9BQU8sNEJBQTRCO0lBR3ZDLFlBQW9CLFdBQTRCLEVBQVUsbUJBQXdDO1FBQTlFLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUFVLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFGakYsZ0JBQVcsR0FBRyxjQUFjLENBQUM7SUFFdUQsQ0FBQztJQUV0RyxjQUFjLENBQUMsYUFBOEM7UUFDM0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUMxQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxTQUFTO1lBQ2pDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLGFBQWE7U0FDcEIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUNkLFVBQThCLEVBQzlCLElBQVcsRUFDWCxjQUF3QjtRQUV4QixNQUFNLFFBQVEsR0FBYSxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBRTFDLElBQUksSUFBSSxFQUFFO1lBQ1IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQztRQUVELFFBQVEsQ0FBQyxNQUFNLENBQ2IsWUFBWSxFQUNaLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFO1lBQ3JDLElBQUksRUFBRSxrQkFBa0I7U0FDekIsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzdCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDMUIsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUM5QyxjQUFjO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGdCQUFnQixDQUFDLEVBQVUsRUFBRSxVQUE4QjtRQUN6RCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQzFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO1lBQ2hDLElBQUksRUFBRSxVQUFVO1lBQ2hCLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQVUsRUFBRSxpQkFBMkI7UUFDdkQsT0FBTyxJQUFJLENBQUMsV0FBVzthQUNwQixHQUFHLENBQUM7WUFDSCxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsT0FBTztZQUNyQyxZQUFZLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUN4RCxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVTtTQUNqRCxDQUFDO2FBQ0QsSUFBSSxDQUNILEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNiLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwRDtRQUNILENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQ3pHLENBQUM7SUFDTixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBVTtRQUN6QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO1lBQzFCLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFO1lBQ2hDLE1BQU0sRUFBRSxRQUFRO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7OzBIQXRFVSw0QkFBNEI7OEhBQTVCLDRCQUE0Qjs0RkFBNUIsNEJBQTRCO2tCQUR4QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmFzZUh0dHBTZXJ2aWNlLFxuICBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICBUZW1wbGF0ZUF0dGFjaG1lbnQsXG4gIFRlbXBsYXRlQXR0YWNobWVudFNlYXJjaFJlcXVlc3QsXG59IGZyb20gJ0B2ZWxvY2UvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50QXR0YWNobWVudEFwaVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFNFUlZJQ0VfVVJMID0gJy9hdHRhY2htZW50cyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwU2VydmljZTogQmFzZUh0dHBTZXJ2aWNlLCBwcml2YXRlIGZpbGVEb3dubG9hZFNlcnZpY2U6IEZpbGVEb3dubG9hZFNlcnZpY2UpIHt9XG5cbiAgZ2V0QXR0YWNobWVudHMoc2VhcmNoUmVxdWVzdDogVGVtcGxhdGVBdHRhY2htZW50U2VhcmNoUmVxdWVzdCk6IE9ic2VydmFibGU8VGVtcGxhdGVBdHRhY2htZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS9zZWFyY2hgLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBib2R5OiBzZWFyY2hSZXF1ZXN0LFxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQXR0YWNobWVudChcbiAgICBhdHRhY2htZW50OiBUZW1wbGF0ZUF0dGFjaG1lbnQsXG4gICAgZmlsZT86IEZpbGUsXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxuICApOiBPYnNlcnZhYmxlPFRlbXBsYXRlQXR0YWNobWVudD4ge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgfVxuXG4gICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgJ2F0dGFjaG1lbnQnLFxuICAgICAgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGF0dGFjaG1lbnQpXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2UudXBsb2FkKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH1gLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIG9ic2VydmU6IHJlcG9ydFByb2dyZXNzID8gJ2V2ZW50cycgOiB1bmRlZmluZWQsXG4gICAgICByZXBvcnRQcm9ncmVzcyxcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUF0dGFjaG1lbnQoaWQ6IHN0cmluZywgYXR0YWNobWVudDogVGVtcGxhdGVBdHRhY2htZW50KTogT2JzZXJ2YWJsZTxUZW1wbGF0ZUF0dGFjaG1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwU2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfWAsXG4gICAgICBib2R5OiBhdHRhY2htZW50LFxuICAgICAgbWV0aG9kOiAncHV0JyxcbiAgICB9KTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRGaWxlKGlkOiBzdHJpbmcsIGlzUHJldmVudERvd25sb2FkPzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9L2ZpbGVgLFxuICAgICAgICByZXNwb25zZVR5cGU6IGlzUHJldmVudERvd25sb2FkID8gJ2FycmF5YnVmZmVyJyA6ICdibG9iJyxcbiAgICAgICAgb2JzZXJ2ZTogaXNQcmV2ZW50RG93bmxvYWQgPyAnYm9keScgOiAncmVzcG9uc2UnLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIGlmICghaXNQcmV2ZW50RG93bmxvYWQpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQocmVzcG9uc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiAoaXNQcmV2ZW50RG93bmxvYWQgPyBuZXcgQmxvYihbcmVzcG9uc2UuYm9keSB8fCByZXNwb25zZV0pIDogcmVzcG9uc2UuYm9keSB8fCByZXNwb25zZSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIHJlbW92ZUF0dGFjaG1lbnQoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmh0dHBTZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { CurrencyPipe } from '@angular/common';
|
2
2
|
import { Injectable } from '@angular/core';
|
3
|
-
import { DocxTemplater, QuoteDraft, StringUtils, } from '@veloce/core';
|
3
|
+
import { DocxTemplater, isLegacyDocumentTemplate, QuoteDraft, StringUtils, } from '@veloce/core';
|
4
4
|
import * as _ from 'lodash';
|
5
5
|
import * as moment_ from 'moment';
|
6
6
|
import { forkJoin, of, zip } from 'rxjs';
|
@@ -9,49 +9,58 @@ import * as i0 from "@angular/core";
|
|
9
9
|
import * as i1 from "@veloce/core";
|
10
10
|
import * as i2 from "./salesforce-api.service";
|
11
11
|
import * as i3 from "./document-attachment-api.service";
|
12
|
-
import * as i4 from "
|
12
|
+
import * as i4 from "./quote-api.service";
|
13
|
+
import * as i5 from "@angular/common/http";
|
13
14
|
const moment = moment_;
|
14
|
-
const mapSfQueryResult = (limit) => map((records) => {
|
15
|
-
if (!records.length) {
|
16
|
-
return { _result: 'No Records Found' };
|
17
|
-
}
|
18
|
-
if (limit === 1) {
|
19
|
-
return records[0];
|
20
|
-
}
|
21
|
-
return records;
|
22
|
-
});
|
23
|
-
const mapBooleanIfAplicable = (value) => {
|
24
|
-
if (value === 'true') {
|
25
|
-
return true;
|
26
|
-
}
|
27
|
-
if (value === 'false') {
|
28
|
-
return false;
|
29
|
-
}
|
30
|
-
return value;
|
31
|
-
};
|
32
15
|
export class DocumentTemplatesApiService {
|
33
|
-
constructor(service,
|
16
|
+
constructor(service, salesforceApiService, fileDownloadService, documentAttachmentService, quoteApiService, http) {
|
34
17
|
this.service = service;
|
35
|
-
this.
|
18
|
+
this.salesforceApiService = salesforceApiService;
|
36
19
|
this.fileDownloadService = fileDownloadService;
|
37
20
|
this.documentAttachmentService = documentAttachmentService;
|
21
|
+
this.quoteApiService = quoteApiService;
|
38
22
|
this.http = http;
|
39
|
-
this.
|
23
|
+
this.SERVICE_URL = '/templates';
|
24
|
+
this.DOC_GEN_URL_FALLBACK = 'https://dev-dp1.velocpq.com/docgen';
|
25
|
+
this.mapSfQueryResult = (limit) => map((records) => {
|
26
|
+
if (!records.length) {
|
27
|
+
return { _result: 'No Records Found' };
|
28
|
+
}
|
29
|
+
if (limit === 1) {
|
30
|
+
return records[0];
|
31
|
+
}
|
32
|
+
return records;
|
33
|
+
});
|
34
|
+
this.mapBooleanIfAplicable = (value) => {
|
35
|
+
if (value === 'true') {
|
36
|
+
return true;
|
37
|
+
}
|
38
|
+
if (value === 'false') {
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
return value;
|
42
|
+
};
|
40
43
|
if (window.VELO_DOCGEN_API) {
|
41
|
-
this.
|
44
|
+
this.DOC_GEN_URL = window.VELO_DOCGEN_API;
|
42
45
|
}
|
43
46
|
else {
|
44
|
-
console.log(`window.VELO_DOCGEN_API not set, will use fallback "${this.
|
45
|
-
this.
|
47
|
+
console.log(`window.VELO_DOCGEN_API not set, will use fallback "${this.DOC_GEN_URL_FALLBACK}"`);
|
48
|
+
this.DOC_GEN_URL = this.DOC_GEN_URL_FALLBACK;
|
46
49
|
}
|
47
50
|
}
|
48
51
|
getTemplates(tag) {
|
49
52
|
return this.service.api({
|
50
|
-
url:
|
53
|
+
url: `${this.SERVICE_URL}`,
|
51
54
|
method: 'get',
|
52
55
|
params: Object.assign({}, (tag && { tag })),
|
53
56
|
});
|
54
57
|
}
|
58
|
+
getTemplate(id) {
|
59
|
+
return this.service.api({
|
60
|
+
url: `${this.SERVICE_URL}/${id}`,
|
61
|
+
method: 'get',
|
62
|
+
});
|
63
|
+
}
|
55
64
|
upsertTemplate(template, file, reportProgress) {
|
56
65
|
const formData = new FormData();
|
57
66
|
if (file) {
|
@@ -60,8 +69,12 @@ export class DocumentTemplatesApiService {
|
|
60
69
|
formData.append('template', new Blob([JSON.stringify(template)], {
|
61
70
|
type: 'application/json',
|
62
71
|
}));
|
72
|
+
let url = `${this.SERVICE_URL}`;
|
73
|
+
if (template.id) {
|
74
|
+
url += `/${template.id}`;
|
75
|
+
}
|
63
76
|
return this.service.upload({
|
64
|
-
url
|
77
|
+
url,
|
65
78
|
body: formData,
|
66
79
|
method: template.id ? 'put' : 'post',
|
67
80
|
reportProgress,
|
@@ -69,19 +82,19 @@ export class DocumentTemplatesApiService {
|
|
69
82
|
}
|
70
83
|
removeTemplate(id) {
|
71
84
|
return this.service.api({
|
72
|
-
url:
|
85
|
+
url: `${this.SERVICE_URL}/${id}`,
|
73
86
|
method: 'delete',
|
74
87
|
});
|
75
88
|
}
|
76
89
|
restoreTemplate(id) {
|
77
90
|
return this.service.api({
|
78
|
-
url:
|
91
|
+
url: `${this.SERVICE_URL}/${id}/restore`,
|
79
92
|
method: 'patch',
|
80
93
|
});
|
81
94
|
}
|
82
95
|
cloneTemplate(id, propertiesToOverride = {}) {
|
83
96
|
return this.service.api({
|
84
|
-
url:
|
97
|
+
url: `${this.SERVICE_URL}/clone/${id}`,
|
85
98
|
method: 'post',
|
86
99
|
body: {
|
87
100
|
id,
|
@@ -89,15 +102,93 @@ export class DocumentTemplatesApiService {
|
|
89
102
|
},
|
90
103
|
});
|
91
104
|
}
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
105
|
+
getTemplateFile(id) {
|
106
|
+
return this.service.api({
|
107
|
+
method: 'get',
|
108
|
+
url: `${this.SERVICE_URL}/${id}/file`,
|
109
|
+
responseType: 'arraybuffer',
|
110
|
+
});
|
111
|
+
}
|
112
|
+
downloadTemplateFile(id) {
|
113
|
+
return this.service
|
114
|
+
.api({
|
115
|
+
url: `${this.SERVICE_URL}/${id}/file`,
|
116
|
+
responseType: 'blob',
|
117
|
+
observe: 'response',
|
118
|
+
})
|
119
|
+
.pipe(tap(response => {
|
120
|
+
this.fileDownloadService.processDownload(response);
|
121
|
+
}), map(response => response.body || response));
|
122
|
+
}
|
123
|
+
mergeDocuments(document, attachments) {
|
124
|
+
const body = new FormData();
|
125
|
+
attachments.forEach(attachment => {
|
126
|
+
body.append('attachments', new Blob([attachment]));
|
127
|
+
});
|
128
|
+
body.append('orderform', document);
|
129
|
+
return this.http.post(`${this.DOC_GEN_URL}/documents/merge`, body, {
|
130
|
+
responseType: 'arraybuffer',
|
131
|
+
});
|
132
|
+
}
|
133
|
+
getAttachments(searchRequest) {
|
134
|
+
return this.documentAttachmentService.getAttachments(searchRequest);
|
135
|
+
}
|
136
|
+
getAttachmentFile(id) {
|
137
|
+
return this.documentAttachmentService.getAttachmentFile(id);
|
138
|
+
}
|
139
|
+
createAttachment(attachment, file, reportProgress) {
|
140
|
+
return this.documentAttachmentService.createAttachment(attachment, file, reportProgress);
|
141
|
+
}
|
142
|
+
removeAttachment(id) {
|
143
|
+
return this.documentAttachmentService.removeAttachment(id);
|
144
|
+
}
|
145
|
+
generateDocumentData(template, object, params = {}) {
|
146
|
+
var _a;
|
147
|
+
if (isLegacyDocumentTemplate(template)) {
|
148
|
+
return this.generateDocumentDataLegacy(template, object, params);
|
98
149
|
}
|
99
|
-
const
|
100
|
-
|
150
|
+
const templateProperties = (_a = template.properties) === null || _a === void 0 ? void 0 : _a.reduce((acc, { name, value }) => (Object.assign(Object.assign({}, acc), { [name]: this.mapBooleanIfAplicable(value) })), {});
|
151
|
+
/*
|
152
|
+
Resolve quote and template properties for now
|
153
|
+
When procedures are ready, whey will replace template scripts.
|
154
|
+
|
155
|
+
TODO: run procedure to resolve document data
|
156
|
+
*/
|
157
|
+
return of(Object.assign(Object.assign({}, (typeof object === 'object' ? object : { object })), templateProperties));
|
158
|
+
}
|
159
|
+
generateDocument(template, object, params = {}) {
|
160
|
+
const documentData$ = this.generateDocumentData(template, object, Object.assign(Object.assign({}, params), { shouldPreventDownload: true }));
|
161
|
+
return zip(this.getTemplateFile(template.id), documentData$, this.resolveAttachments$(template)).pipe(switchMap(([templateFile, data, attachments]) => {
|
162
|
+
var _a, _b, _c, _d, _e, _f;
|
163
|
+
const document = DocxTemplater.generate(templateFile, data);
|
164
|
+
const properties = (_c = (_b = (_a = object === null || object === void 0 ? void 0 : object.context) === null || _a === void 0 ? void 0 : _a.properties) !== null && _b !== void 0 ? _b : object === null || object === void 0 ? void 0 : object.properties) !== null && _c !== void 0 ? _c : {};
|
165
|
+
const documentName = properties.Name || template.name;
|
166
|
+
const documentFormat = (_d = params.documentFormat) !== null && _d !== void 0 ? _d : (_f = (_e = template.properties) === null || _e === void 0 ? void 0 : _e.find(p => p.name === 'documentFormat')) === null || _f === void 0 ? void 0 : _f.value;
|
167
|
+
if (documentFormat === 'DOCX') {
|
168
|
+
this.fileDownloadService.processDownload(document, documentName);
|
169
|
+
return of(document);
|
170
|
+
}
|
171
|
+
return this.mergeDocuments(document, attachments).pipe(switchMap(pdf => {
|
172
|
+
if (params.attachToQuote && QuoteDraft.isQuote(object)) {
|
173
|
+
return this.quoteApiService
|
174
|
+
.attachDocument(object.quoteId, `${documentName}.pdf`, pdf)
|
175
|
+
.pipe(map(() => pdf));
|
176
|
+
}
|
177
|
+
return of(pdf);
|
178
|
+
}), map(pdf => {
|
179
|
+
const blob = new Blob([pdf]);
|
180
|
+
if (!params.shouldPreventDownload) {
|
181
|
+
this.fileDownloadService.processDownload(blob, `${documentName}.pdf`);
|
182
|
+
}
|
183
|
+
return blob;
|
184
|
+
}));
|
185
|
+
}));
|
186
|
+
}
|
187
|
+
generateDocumentDataLegacy(template, object, params = {}) {
|
188
|
+
var _a, _b, _c, _d;
|
189
|
+
const shouldPreventDownload = params.shouldPreventDownload;
|
190
|
+
const allQueries = [...((_a = template === null || template === void 0 ? void 0 : template.queries) !== null && _a !== void 0 ? _a : [])];
|
191
|
+
const properties = (_d = (_c = (_b = object === null || object === void 0 ? void 0 : object.context) === null || _b === void 0 ? void 0 : _b.properties) !== null && _c !== void 0 ? _c : object === null || object === void 0 ? void 0 : object.properties) !== null && _d !== void 0 ? _d : {};
|
101
192
|
const accountId = properties === null || properties === void 0 ? void 0 : properties.AccountId;
|
102
193
|
const userId = properties === null || properties === void 0 ? void 0 : properties.UserId;
|
103
194
|
if (accountId) {
|
@@ -119,9 +210,7 @@ export class DocumentTemplatesApiService {
|
|
119
210
|
});
|
120
211
|
}
|
121
212
|
const queries = allQueries.map(query => this.queryObject(query, { properties })) || [];
|
122
|
-
return forkJoin([...queries])
|
123
|
-
.pipe(defaultIfEmpty([]))
|
124
|
-
.pipe(map(results => {
|
213
|
+
return forkJoin([...queries]).pipe(defaultIfEmpty([]), map(results => {
|
125
214
|
var _a, _b, _c, _d;
|
126
215
|
const queriesResult = _.chain(results)
|
127
216
|
.reduce((acc, r) => {
|
@@ -132,7 +221,7 @@ export class DocumentTemplatesApiService {
|
|
132
221
|
}, {})
|
133
222
|
.value();
|
134
223
|
const templateProperties = ((template === null || template === void 0 ? void 0 : template.properties) || []).reduce((trunk, { name, value }) => {
|
135
|
-
return Object.assign(Object.assign({}, trunk), { [name]: mapBooleanIfAplicable(value) });
|
224
|
+
return Object.assign(Object.assign({}, trunk), { [name]: this.mapBooleanIfAplicable(value) });
|
136
225
|
}, {});
|
137
226
|
const data = Object.assign(Object.assign(Object.assign({}, (typeof object === 'object' ? object : { object })), queriesResult), templateProperties);
|
138
227
|
if (template.script && template.script.trim().length) {
|
@@ -156,113 +245,13 @@ export class DocumentTemplatesApiService {
|
|
156
245
|
return data;
|
157
246
|
}));
|
158
247
|
}
|
159
|
-
|
160
|
-
|
161
|
-
const {
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
generateDocumentNew(template, object, params = {}) {
|
167
|
-
const { attachToQuote, documentFormat, shouldPreventDownload } = params;
|
168
|
-
const file$ = this.service.api({
|
169
|
-
method: 'get',
|
170
|
-
url: `/templates/${template.id}/file`,
|
171
|
-
responseType: 'arraybuffer',
|
172
|
-
});
|
173
|
-
const attachmentIds = (template.attachments || []).map(({ id }) => id);
|
174
|
-
const attachments$ = attachmentIds.length
|
175
|
-
? attachmentIds.map(attachmentId => {
|
176
|
-
return this.documentAttachmentService.getAttachmentFile(attachmentId, true);
|
177
|
-
})
|
178
|
-
: [];
|
179
|
-
const data$ = this.generateDocumentData(template, object, Object.assign(Object.assign({}, params), { shouldPreventDownload: true }));
|
180
|
-
return zip(file$, data$, ...attachments$).pipe(switchMap(([file, data, ...attachments]) => {
|
181
|
-
var _a;
|
182
|
-
const d = DocxTemplater.generate(file, data);
|
183
|
-
const body = new FormData();
|
184
|
-
const properties = ((_a = object === null || object === void 0 ? void 0 : object.context) === null || _a === void 0 ? void 0 : _a.properties) || (object === null || object === void 0 ? void 0 : object.properties) || {};
|
185
|
-
const documentName = (properties === null || properties === void 0 ? void 0 : properties.Name) || template.name;
|
186
|
-
// TODO: special CATO case. Refactor for a more generic approach
|
187
|
-
if (documentFormat === 'DOCX') {
|
188
|
-
this.fileDownloadService.processDownload(d, documentName);
|
189
|
-
return of(d);
|
190
|
-
}
|
191
|
-
attachments.forEach((attachment) => {
|
192
|
-
body.append('attachments', new Blob([attachment]));
|
193
|
-
});
|
194
|
-
body.append('orderform', d);
|
195
|
-
return this.http
|
196
|
-
.post(`${this.docGenHost}/documents/merge`, body, {
|
197
|
-
responseType: 'arraybuffer',
|
198
|
-
})
|
199
|
-
.pipe(switchMap((pdf) => {
|
200
|
-
const blob = new Blob([pdf]);
|
201
|
-
if (!shouldPreventDownload) {
|
202
|
-
this.fileDownloadService.processDownload(blob, `${documentName}.pdf`);
|
203
|
-
}
|
204
|
-
if (attachToQuote && object instanceof QuoteDraft) {
|
205
|
-
const formData = new FormData();
|
206
|
-
formData.append('file', blob, `${documentName}.pdf`);
|
207
|
-
return this.http.post(`${window['VELO_API']}/services/quotes/${object.quoteId}/attach-document`, formData, {
|
208
|
-
responseType: 'arraybuffer',
|
209
|
-
headers: {
|
210
|
-
Authorization: window['VELO_KEY'],
|
211
|
-
},
|
212
|
-
});
|
213
|
-
}
|
214
|
-
return of(blob);
|
215
|
-
}));
|
216
|
-
}));
|
217
|
-
}
|
218
|
-
getAttachments(searchRequest) {
|
219
|
-
return this.documentAttachmentService.getAttachments(searchRequest);
|
220
|
-
}
|
221
|
-
getAttachmentFile(id) {
|
222
|
-
return this.documentAttachmentService.getAttachmentFile(id);
|
223
|
-
}
|
224
|
-
createAttachment(attachment, file, reportProgress) {
|
225
|
-
return this.documentAttachmentService.createAttachment(attachment, file, reportProgress);
|
226
|
-
}
|
227
|
-
removeAttachment(id) {
|
228
|
-
return this.documentAttachmentService.removeAttachment(id);
|
229
|
-
}
|
230
|
-
downloadTemplateFile(id) {
|
231
|
-
return this.service
|
232
|
-
.api({
|
233
|
-
url: `/templates/${id}/file`,
|
234
|
-
responseType: 'blob',
|
235
|
-
observe: 'response',
|
236
|
-
})
|
237
|
-
.pipe(tap(response => {
|
238
|
-
this.fileDownloadService.processDownload(response);
|
239
|
-
}), map(response => response.body || response));
|
240
|
-
}
|
241
|
-
generateWithBackendDocxTemplater({ template, quote, attachmentIds, params, }) {
|
242
|
-
const { shouldPreventDownload } = params;
|
243
|
-
const nonEmptyParams = Object.keys(params || {})
|
244
|
-
.filter(k => params[k] !== undefined)
|
245
|
-
.reduce((obj, key) => {
|
246
|
-
obj[key] = params[key];
|
247
|
-
return obj;
|
248
|
-
}, {});
|
249
|
-
return this.generate(`/templates/${template.id}/generate`, { quote, attachments: attachmentIds }, Boolean(shouldPreventDownload), 'blob', nonEmptyParams, false);
|
250
|
-
}
|
251
|
-
generate(url, body, shouldPreventDownload, responseType, params, isUpload, reportProgress) {
|
252
|
-
const requestOptions = {
|
253
|
-
method: 'post',
|
254
|
-
url,
|
255
|
-
body,
|
256
|
-
reportProgress,
|
257
|
-
responseType,
|
258
|
-
observe: shouldPreventDownload ? 'body' : 'response',
|
259
|
-
params,
|
260
|
-
};
|
261
|
-
return (isUpload ? this.service.upload(requestOptions) : this.service.api(requestOptions)).pipe(tap(response => {
|
262
|
-
if (!shouldPreventDownload) {
|
263
|
-
this.fileDownloadService.processDownload(response);
|
264
|
-
}
|
265
|
-
}));
|
248
|
+
resolveAttachments$(template) {
|
249
|
+
var _a, _b;
|
250
|
+
const attachmentIds = (_b = (_a = template.attachments) === null || _a === void 0 ? void 0 : _a.map(({ id }) => id).filter(Boolean)) !== null && _b !== void 0 ? _b : [];
|
251
|
+
if (!attachmentIds.length) {
|
252
|
+
return of([]);
|
253
|
+
}
|
254
|
+
return forkJoin(attachmentIds.map(id => this.documentAttachmentService.getAttachmentFile(id, true)));
|
266
255
|
}
|
267
256
|
queryObject({ objectName, resultObjectName, fields, statement }, { properties }) {
|
268
257
|
var _a;
|
@@ -277,12 +266,12 @@ export class DocumentTemplatesApiService {
|
|
277
266
|
}
|
278
267
|
const resolvedStatement = StringUtils.fillPlaceholders(statement, properties, /:\s*(\w[\w\d_.]+)/i);
|
279
268
|
const searchRequest = Object.assign({ skip: 0, count: limit, rawCondition: resolvedStatement }, ((fields === null || fields === void 0 ? void 0 : fields.length) && !!fields[0] && { fields }));
|
280
|
-
return this.
|
269
|
+
return this.salesforceApiService.query(searchRequest, objectName).pipe(this.mapSfQueryResult(limit), map(value => ({ [resultObjectName]: value })));
|
281
270
|
}
|
282
271
|
}
|
283
|
-
DocumentTemplatesApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: DocumentTemplatesApiService, deps: [{ token: i1.BaseHttpService }, { token: i2.SalesforceApiService }, { token: i1.FileDownloadService }, { token: i3.DocumentAttachmentApiService }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
272
|
+
DocumentTemplatesApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: DocumentTemplatesApiService, deps: [{ token: i1.BaseHttpService }, { token: i2.SalesforceApiService }, { token: i1.FileDownloadService }, { token: i3.DocumentAttachmentApiService }, { token: i4.QuoteApiService }, { token: i5.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
284
273
|
DocumentTemplatesApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: DocumentTemplatesApiService });
|
285
274
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: DocumentTemplatesApiService, decorators: [{
|
286
275
|
type: Injectable
|
287
|
-
}], ctorParameters: function () { return [{ type: i1.BaseHttpService }, { type: i2.SalesforceApiService }, { type: i1.FileDownloadService }, { type: i3.DocumentAttachmentApiService }, { type: i4.HttpClient }]; } });
|
288
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGVzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvc3JjL2xpYi9zZXJ2aWNlcy9kb2N1bWVudC10ZW1wbGF0ZXMtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUlMLGFBQWEsRUFHYixVQUFVLEVBRVYsV0FBVyxHQUtaLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQUlyRSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFHdkIsTUFBTSxnQkFBZ0IsR0FBRyxDQUFJLEtBQWEsRUFBRSxFQUFFLENBQzVDLEdBQUcsQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO0lBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ25CLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztLQUN4QztJQUVELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNmLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDLENBQUM7QUFFTCxNQUFNLHFCQUFxQixHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDOUMsSUFB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QVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFueVdpdGhQcm9wZXJ0aWVzLFxuICBCYXNlSHR0cFNlcnZpY2UsXG4gIERvY3VtZW50VGVtcGxhdGUsXG4gIERvY3hUZW1wbGF0ZXIsXG4gIEZpbGVEb3dubG9hZFNlcnZpY2UsXG4gIEh0dHBSZXF1ZXN0T3B0aW9ucyxcbiAgUXVvdGVEcmFmdCxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU3RyaW5nVXRpbHMsXG4gIFRlbXBsYXRlQXR0YWNobWVudCxcbiAgVGVtcGxhdGVBdHRhY2htZW50U2VhcmNoUmVxdWVzdCxcbiAgVGVtcGxhdGVRdWVyeSxcbiAgVmxXaW5kb3csXG59IGZyb20gJ0B2ZWxvY2UvY29yZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEb2N1bWVudEF0dGFjaG1lbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kb2N1bWVudC1hdHRhY2htZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbGVzZm9yY2VBcGlTZXJ2aWNlIH0gZnJvbSAnLi9zYWxlc2ZvcmNlLWFwaS5zZXJ2aWNlJztcblxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcbmRlY2xhcmUgY29uc3Qgd2luZG93OiBWbFdpbmRvdztcblxuY29uc3QgbWFwU2ZRdWVyeVJlc3VsdCA9IDxUPihsaW1pdDogbnVtYmVyKSA9PlxuICBtYXAoKHJlY29yZHM6IFRbXSkgPT4ge1xuICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IF9yZXN1bHQ6ICdObyBSZWNvcmRzIEZvdW5kJyB9O1xuICAgIH1cblxuICAgIGlmIChsaW1pdCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHJlY29yZHNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH0pO1xuXG5jb25zdCBtYXBCb29sZWFuSWZBcGxpY2FibGUgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50VGVtcGxhdGVzQXBpU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tEb2NHZW5Ib3N0ID0gJ2h0dHBzOi8vZGV2LWRwMS52ZWxvY3BxLmNvbS9kb2NnZW4nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRvY0dlbkhvc3Q7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogQmFzZUh0dHBTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2ZSZXBvOiBTYWxlc2ZvcmNlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIGZpbGVEb3dubG9hZFNlcnZpY2U6IEZpbGVEb3dubG9hZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlOiBEb2N1bWVudEF0dGFjaG1lbnRBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgKSB7XG4gICAgaWYgKHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEkpIHtcbiAgICAgIHRoaXMuZG9jR2VuSG9zdCA9IHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGB3aW5kb3cuVkVMT19ET0NHRU5fQVBJIG5vdCBzZXQsIHdpbGwgdXNlIGZhbGxiYWNrIFwiJHt0aGlzLmZhbGxiYWNrRG9jR2VuSG9zdH1cImApO1xuICAgICAgdGhpcy5kb2NHZW5Ib3N0ID0gdGhpcy5mYWxsYmFja0RvY0dlbkhvc3Q7XG4gICAgfVxuICB9XG5cbiAgZ2V0VGVtcGxhdGVzKHRhZz86IHN0cmluZyk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiAnL3RlbXBsYXRlcycsXG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIC4uLih0YWcgJiYgeyB0YWcgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgdXBzZXJ0VGVtcGxhdGUodGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsIGZpbGU/OiBGaWxlLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIGlmIChmaWxlKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIH1cbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAndGVtcGxhdGUnLFxuICAgICAgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKV0sIHtcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLnNlcnZpY2UudXBsb2FkKHtcbiAgICAgIHVybDogYC90ZW1wbGF0ZXNgICsgKCh0ZW1wbGF0ZS5pZCAmJiBgLyR7dGVtcGxhdGUuaWR9YCkgfHwgJycpLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6IHRlbXBsYXRlLmlkID8gJ3B1dCcgOiAncG9zdCcsXG4gICAgICByZXBvcnRQcm9ncmVzcyxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZVRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6ICcvdGVtcGxhdGVzLycgKyBpZCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlVGVtcGxhdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYC90ZW1wbGF0ZXMvJHtpZH0vcmVzdG9yZWAsXG4gICAgICBtZXRob2Q6ICdwYXRjaCcsXG4gICAgfSk7XG4gIH1cblxuICBjbG9uZVRlbXBsYXRlKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcGVydGllc1RvT3ZlcnJpZGU6IFBhcnRpYWw8RG9jdW1lbnRUZW1wbGF0ZT4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTx7IGNsb25lZFJlY29yZElkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogJy90ZW1wbGF0ZXMvY2xvbmUvJyArIGlkLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBib2R5OiB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wZXJ0aWVzVG9PdmVycmlkZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZURvY3VtZW50RGF0YShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM/OiB7IFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIHwgYm9vbGVhbiB9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNob3VsZFByZXZlbnREb3dubG9hZCA9IHBhcmFtcz8uc2hvdWxkUHJldmVudERvd25sb2FkO1xuICAgIGNvbnN0IHVzZUxvY2FsRGF0YUdlbmVyYXRpb24gPSB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ3VzZUxvY2FsRGF0YUdlbmVyYXRpb24nKT8udmFsdWU7XG5cbiAgICBpZiAoIXVzZUxvY2FsRGF0YUdlbmVyYXRpb24gJiYgb2JqZWN0IGluc3RhbmNlb2YgUXVvdGVEcmFmdCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUoXG4gICAgICAgICcvdGVtcGxhdGVzL2dlbmVyYXRlLWRhdGEnLFxuICAgICAgICB7IHRlbXBsYXRlLCBxdW90ZTogb2JqZWN0IH0sXG4gICAgICAgIHNob3VsZFByZXZlbnREb3dubG9hZCBhcyBib29sZWFuLFxuICAgICAgICBzaG91bGRQcmV2ZW50RG93bmxvYWQgPyAnanNvbicgOiAnYmxvYicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbFF1ZXJpZXMgPSBbLi4uKHRlbXBsYXRlPy5xdWVyaWVzID8/IFtdKV07XG4gICAgY29uc3QgcHJvcGVydGllcyA9IG9iamVjdD8uY29udGV4dD8ucHJvcGVydGllcyB8fCBvYmplY3Q/LnByb3BlcnRpZXMgfHwge307XG5cbiAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9wZXJ0aWVzPy5BY2NvdW50SWQ7XG4gICAgY29uc3QgdXNlcklkID0gcHJvcGVydGllcz8uVXNlcklkO1xuXG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgYWxsUXVlcmllcy5wdXNoKHtcbiAgICAgICAgcXVlcnlOYW1lOiAnUXVvdGVBY2NvdW50UXVlcnknLFxuICAgICAgICBvYmplY3ROYW1lOiAnQWNjb3VudCcsXG4gICAgICAgIHJlc3VsdE9iamVjdE5hbWU6ICdhY2NvdW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke2FjY291bnRJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBhbGxRdWVyaWVzLnB1c2goe1xuICAgICAgICBxdWVyeU5hbWU6ICdRdW90ZVVzZXJRdWVyeScsXG4gICAgICAgIG9iamVjdE5hbWU6ICdVc2VyJyxcbiAgICAgICAgcmVzdWx0T2JqZWN0TmFtZTogJ2FnZW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke3VzZXJJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBhbGxRdWVyaWVzLm1hcChxdWVyeSA9PiB0aGlzLnF1ZXJ5T2JqZWN0KHF1ZXJ5IGFzIFRlbXBsYXRlUXVlcnksIHsgcHJvcGVydGllcyB9KSkgfHwgW107XG5cbiAgICByZXR1cm4gZm9ya0pvaW4oWy4uLnF1ZXJpZXNdKVxuICAgICAgLnBpcGUoZGVmYXVsdElmRW1wdHkoW10gYXMgYW55W10pKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgICBjb25zdCBxdWVyaWVzUmVzdWx0ID0gXy5jaGFpbihyZXN1bHRzKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCByKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCAuLi5yIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgICAgfSwge30pXG4gICAgICAgICAgICAudmFsdWUoKTtcblxuICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9ICh0ZW1wbGF0ZT8ucHJvcGVydGllcyB8fCBbXSkucmVkdWNlKCh0cnVuaywgeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi50cnVuayxcbiAgICAgICAgICAgICAgW25hbWUgYXMgc3RyaW5nXTogbWFwQm9vbGVhbklmQXBsaWNhYmxlKHZhbHVlIGFzIGFueSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAuLi4odHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgPyBvYmplY3QgOiB7IG9iamVjdCB9KSxcbiAgICAgICAgICAgIC4uLnF1ZXJpZXNSZXN1bHQsXG4gICAgICAgICAgICAuLi50ZW1wbGF0ZVByb3BlcnRpZXMsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmICh0ZW1wbGF0ZS5zY3JpcHQgJiYgdGVtcGxhdGUuc2NyaXB0LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbmN5Rm9ybWF0ID0gdGVtcGxhdGUucHJvcGVydGllcz8uZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdjdXJyZW5jeUZvcm1hdCcpPy52YWx1ZSB8fCAnMS4yLTInO1xuICAgICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZGF0ZUZvcm1hdCcpPy52YWx1ZSB8fCAnRC9NTU0vWVlZWSc7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gbW9tZW50KHZhbHVlKS5mb3JtYXQoZGF0ZUZvcm1hdCkgOiB2YWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3RlbXBsYXRlLnNjcmlwdH1gKSgpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWREYXRhID0gdHJhbnNmb3JtKHtcbiAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgdXRpbHM6IHtcbiAgICAgICAgICAgICAgICBsb2Rhc2g6IF8sXG4gICAgICAgICAgICAgICAgY3VycmVuY3k6ICh2YWx1ZTogYW55KSA9PiBuZXcgQ3VycmVuY3lQaXBlKCdlbi1VUycpLnRyYW5zZm9ybSh2YWx1ZSwgJ1VTRCcsICdzeW1ib2wnLCBjdXJyZW5jeUZvcm1hdCksXG4gICAgICAgICAgICAgICAgZGF0ZTogZm9ybWF0RGF0ZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgVG9EYXk6IGZvcm1hdERhdGUoRGF0ZS5ub3coKSBhcyBhbnkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXNob3VsZFByZXZlbnREb3dubG9hZCkge1xuICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkRGF0YSldKTtcbiAgICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChibG9iLCAnZGF0YS5qc29uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgZ2VuZXJhdGVEb2N1bWVudChcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IHsgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBib29sZWFuIH0gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBhdHRhY2htZW50SWRzID0gKHRlbXBsYXRlLmF0dGFjaG1lbnRzIHx8IFtdKS5tYXAoKHsgaWQgfSkgPT4gaWQpLmZpbHRlcihCb29sZWFuKSBhcyBzdHJpbmdbXTtcbiAgICBjb25zdCB7IHNob3VsZFVzZUxvY2FsRG9jeFRlbXBsYXRlciB9ID0gcGFyYW1zO1xuXG4gICAgcmV0dXJuIHNob3VsZFVzZUxvY2FsRG9jeFRlbXBsYXRlciAmJiAhKG9iamVjdCBpbnN0YW5jZW9mIFF1b3RlRHJhZnQpXG4gICAgICA/IHRoaXMuZ2VuZXJhdGVEb2N1bWVudE5ldyh0ZW1wbGF0ZSwgb2JqZWN0LCBwYXJhbXMpXG4gICAgICA6IHRoaXMuZ2VuZXJhdGVXaXRoQmFja2VuZERvY3hUZW1wbGF0ZXIoeyB0ZW1wbGF0ZSwgcXVvdGU6IG9iamVjdCBhcyBRdW90ZURyYWZ0LCBhdHRhY2htZW50SWRzLCBwYXJhbXMgfSk7XG4gIH1cblxuICBnZW5lcmF0ZURvY3VtZW50TmV3KFxuICAgIHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlLFxuICAgIG9iamVjdDogYW55LFxuICAgIHBhcmFtczogeyBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHsgYXR0YWNoVG9RdW90ZSwgZG9jdW1lbnRGb3JtYXQsIHNob3VsZFByZXZlbnREb3dubG9hZCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZpbGUkID0gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdXJsOiBgL3RlbXBsYXRlcy8ke3RlbXBsYXRlLmlkfS9maWxlYCxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgICBjb25zdCBhdHRhY2htZW50SWRzID0gKHRlbXBsYXRlLmF0dGFjaG1lbnRzIHx8IFtdKS5tYXAoKHsgaWQgfSkgPT4gaWQpO1xuICAgIGNvbnN0IGF0dGFjaG1lbnRzJCA9IGF0dGFjaG1lbnRJZHMubGVuZ3RoXG4gICAgICA/IGF0dGFjaG1lbnRJZHMubWFwKGF0dGFjaG1lbnRJZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50RmlsZShhdHRhY2htZW50SWQgYXMgc3RyaW5nLCB0cnVlKTtcbiAgICAgICAgfSlcbiAgICAgIDogW107XG5cbiAgICBjb25zdCBkYXRhJCA9IHRoaXMuZ2VuZXJhdGVEb2N1bWVudERhdGEodGVtcGxhdGUsIG9iamVjdCwgeyAuLi5wYXJhbXMsIHNob3VsZFByZXZlbnREb3dubG9hZDogdHJ1ZSB9KTtcblxuICAgIHJldHVybiB6aXAoZmlsZSQsIGRhdGEkLCAuLi5hdHRhY2htZW50cyQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKFtmaWxlLCBkYXRhLCAuLi5hdHRhY2htZW50c10pID0+IHtcbiAgICAgICAgY29uc3QgZCA9IERvY3hUZW1wbGF0ZXIuZ2VuZXJhdGUoZmlsZSwgZGF0YSk7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IG9iamVjdD8uY29udGV4dD8ucHJvcGVydGllcyB8fCBvYmplY3Q/LnByb3BlcnRpZXMgfHwge307XG4gICAgICAgIGNvbnN0IGRvY3VtZW50TmFtZSA9IHByb3BlcnRpZXM/Lk5hbWUgfHwgdGVtcGxhdGUubmFtZTtcblxuICAgICAgICAvLyBUT0RPOiBzcGVjaWFsIENBVE8gY2FzZS4gUmVmYWN0b3IgZm9yIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoXG4gICAgICAgIGlmIChkb2N1bWVudEZvcm1hdCA9PT0gJ0RPQ1gnKSB7XG4gICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChkLCBkb2N1bWVudE5hbWUpO1xuXG4gICAgICAgICAgcmV0dXJuIG9mKGQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaCgoYXR0YWNobWVudDogQXJyYXlCdWZmZXIpID0+IHtcbiAgICAgICAgICBib2R5LmFwcGVuZCgnYXR0YWNobWVudHMnLCBuZXcgQmxvYihbYXR0YWNobWVudF0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYm9keS5hcHBlbmQoJ29yZGVyZm9ybScsIGQpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgICAgICAucG9zdChgJHt0aGlzLmRvY0dlbkhvc3R9L2RvY3VtZW50cy9tZXJnZWAsIGJvZHksIHtcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChwZGY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3BkZl0pO1xuXG4gICAgICAgICAgICAgIGlmICghc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChibG9iLCBgJHtkb2N1bWVudE5hbWV9LnBkZmApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKGF0dGFjaFRvUXVvdGUgJiYgb2JqZWN0IGluc3RhbmNlb2YgUXVvdGVEcmFmdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgYmxvYiwgYCR7ZG9jdW1lbnROYW1lfS5wZGZgKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChcbiAgICAgICAgICAgICAgICAgIGAke3dpbmRvd1snVkVMT19BUEknXX0vc2VydmljZXMvcXVvdGVzLyR7b2JqZWN0LnF1b3RlSWR9L2F0dGFjaC1kb2N1bWVudGAsXG4gICAgICAgICAgICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInIGFzIGFueSxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IHdpbmRvd1snVkVMT19LRVknXSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICByZXR1cm4gb2YoYmxvYik7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRzKHNlYXJjaFJlcXVlc3Q6IFRlbXBsYXRlQXR0YWNobWVudFNlYXJjaFJlcXVlc3QpOiBPYnNlcnZhYmxlPFRlbXBsYXRlQXR0YWNobWVudFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50cyhzZWFyY2hSZXF1ZXN0KTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRGaWxlKGlkOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuZ2V0QXR0YWNobWVudEZpbGUoaWQpO1xuICB9XG5cbiAgY3JlYXRlQXR0YWNobWVudChcbiAgICBhdHRhY2htZW50OiBUZW1wbGF0ZUF0dGFjaG1lbnQsXG4gICAgZmlsZT86IEZpbGUsXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxuICApOiBPYnNlcnZhYmxlPFRlbXBsYXRlQXR0YWNobWVudD4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50LCBmaWxlLCByZXBvcnRQcm9ncmVzcyk7XG4gIH1cblxuICByZW1vdmVBdHRhY2htZW50KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLnJlbW92ZUF0dGFjaG1lbnQoaWQpO1xuICB9XG5cbiAgZG93bmxvYWRUZW1wbGF0ZUZpbGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QmxvYj4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICB1cmw6IGAvdGVtcGxhdGVzLyR7aWR9L2ZpbGVgLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyxcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZFNlcnZpY2UucHJvY2Vzc0Rvd25sb2FkKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5IHx8IHJlc3BvbnNlKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlV2l0aEJhY2tlbmREb2N4VGVtcGxhdGVyKHtcbiAgICB0ZW1wbGF0ZSxcbiAgICBxdW90ZSxcbiAgICBhdHRhY2htZW50SWRzLFxuICAgIHBhcmFtcyxcbiAgfToge1xuICAgIHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlO1xuICAgIHF1b3RlOiBRdW90ZURyYWZ0O1xuICAgIGF0dGFjaG1lbnRJZHM6IHN0cmluZ1tdO1xuICAgIHBhcmFtczogeyBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IGJvb2xlYW4gfTtcbiAgfSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgeyBzaG91bGRQcmV2ZW50RG93bmxvYWQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBub25FbXB0eVBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtcyB8fCB7fSlcbiAgICAgIC5maWx0ZXIoayA9PiBwYXJhbXNba10gIT09IHVuZGVmaW5lZClcbiAgICAgIC5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgICB9LCB7fSk7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGUoXG4gICAgICBgL3RlbXBsYXRlcy8ke3RlbXBsYXRlLmlkfS9nZW5lcmF0ZWAsXG4gICAgICB7IHF1b3RlLCBhdHRhY2htZW50czogYXR0YWNobWVudElkcyB9LFxuICAgICAgQm9vbGVhbihzaG91bGRQcmV2ZW50RG93bmxvYWQpLFxuICAgICAgJ2Jsb2InLFxuICAgICAgbm9uRW1wdHlQYXJhbXMsXG4gICAgICBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZShcbiAgICB1cmw6IHN0cmluZyxcbiAgICBib2R5OiBhbnksXG4gICAgc2hvdWxkUHJldmVudERvd25sb2FkOiBib29sZWFuLFxuICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyB8ICdibG9iJyB8ICdqc29uJyB8ICd0ZXh0JyxcbiAgICBwYXJhbXM/OiB7IFtwYXJhbTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgaXNVcGxvYWQ/OiBib29sZWFuLFxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByZXF1ZXN0T3B0aW9uczogSHR0cFJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICB1cmwsXG4gICAgICBib2R5LFxuICAgICAgcmVwb3J0UHJvZ3Jlc3MsXG4gICAgICByZXNwb25zZVR5cGUsXG4gICAgICBvYnNlcnZlOiBzaG91bGRQcmV2ZW50RG93bmxvYWQgPyAoJ2JvZHknIGFzIGNvbnN0KSA6ICgncmVzcG9uc2UnIGFzIGNvbnN0KSxcbiAgICAgIHBhcmFtcyxcbiAgICB9O1xuICAgIHJldHVybiAoaXNVcGxvYWQgPyB0aGlzLnNlcnZpY2UudXBsb2FkKHJlcXVlc3RPcHRpb25zKSA6IHRoaXMuc2VydmljZS5hcGkocmVxdWVzdE9wdGlvbnMpKS5waXBlKFxuICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgaWYgKCFzaG91bGRQcmV2ZW50RG93bmxvYWQpIHtcbiAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZFNlcnZpY2UucHJvY2Vzc0Rvd25sb2FkKHJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcXVlcnlPYmplY3QoXG4gICAgeyBvYmplY3ROYW1lLCByZXN1bHRPYmplY3ROYW1lLCBmaWVsZHMsIHN0YXRlbWVudCB9OiBUZW1wbGF0ZVF1ZXJ5LFxuICAgIHsgcHJvcGVydGllcyB9OiBBbnlXaXRoUHJvcGVydGllcyxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBwYXR0ZXJuTGltaXQgPSAvKFxccypsaW1pdFxcc1xcZCopL2k7XG4gICAgbGV0IGxpbWl0ID0gMTtcbiAgICBpZiAocGF0dGVybkxpbWl0LnRlc3Qoc3RhdGVtZW50KSkge1xuICAgICAgY29uc3QgbGltaXRTdHIgPSBzdGF0ZW1lbnQ/Lm1hdGNoKHBhdHRlcm5MaW1pdCk/LlsxXS50cmltKCkuc3Vic3RyaW5nKDUpLnRyaW0oKTtcbiAgICAgIGlmIChsaW1pdFN0cikge1xuICAgICAgICBsaW1pdCA9IE51bWJlci5wYXJzZUludChsaW1pdFN0ciwgMTApO1xuICAgICAgfVxuICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UocGF0dGVybkxpbWl0LCAnJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRTdGF0ZW1lbnQgPSBTdHJpbmdVdGlscy5maWxsUGxhY2Vob2xkZXJzKHN0YXRlbWVudCwgcHJvcGVydGllcywgLzpcXHMqKFxcd1tcXHdcXGRfLl0rKS9pKTtcblxuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3QgPSB7XG4gICAgICBza2lwOiAwLFxuICAgICAgY291bnQ6IGxpbWl0LFxuICAgICAgcmF3Q29uZGl0aW9uOiByZXNvbHZlZFN0YXRlbWVudCxcbiAgICAgIC4uLihmaWVsZHM/Lmxlbmd0aCAmJiAhIWZpZWxkc1swXSAmJiB7IGZpZWxkcyB9KSxcbiAgICB9IGFzIFNlYXJjaFJlcXVlc3Q7XG5cbiAgICByZXR1cm4gdGhpcy5zZlJlcG8ucXVlcnkoc2VhcmNoUmVxdWVzdCwgb2JqZWN0TmFtZSkucGlwZShcbiAgICAgIG1hcFNmUXVlcnlSZXN1bHQobGltaXQpLFxuICAgICAgbWFwKHZhbHVlID0+ICh7IFtyZXN1bHRPYmplY3ROYW1lXTogdmFsdWUgfSkpLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
276
|
+
}], ctorParameters: function () { return [{ type: i1.BaseHttpService }, { type: i2.SalesforceApiService }, { type: i1.FileDownloadService }, { type: i3.DocumentAttachmentApiService }, { type: i4.QuoteApiService }, { type: i5.HttpClient }]; } });
|
277
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGVzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvc3JjL2xpYi9zZXJ2aWNlcy9kb2N1bWVudC10ZW1wbGF0ZXMtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUlMLGFBQWEsRUFFYix3QkFBd0IsRUFDeEIsVUFBVSxFQUVWLFdBQVcsR0FLWixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBS3JFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQVV2QixNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQ1UsT0FBd0IsRUFDeEIsb0JBQTBDLEVBQzFDLG1CQUF3QyxFQUN4Qyx5QkFBdUQsRUFDdkQsZUFBZ0MsRUFDaEMsSUFBZ0I7UUFMaEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBOEI7UUFDdkQsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFNBQUksR0FBSixJQUFJLENBQVk7UUFWVCxnQkFBVyxHQUFHLFlBQVksQ0FBQztRQUMzQix5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Q0FBQyxDQUM5QyxDQUFDO0lBQ0osQ0FBQzs7eUhBblhVLDJCQUEyQjs2SEFBM0IsMkJBQTJCOzRGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFueVdpdGhQcm9wZXJ0aWVzLFxuICBCYXNlSHR0cFNlcnZpY2UsXG4gIERvY3VtZW50VGVtcGxhdGUsXG4gIERvY3hUZW1wbGF0ZXIsXG4gIEZpbGVEb3dubG9hZFNlcnZpY2UsXG4gIGlzTGVnYWN5RG9jdW1lbnRUZW1wbGF0ZSxcbiAgUXVvdGVEcmFmdCxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU3RyaW5nVXRpbHMsXG4gIFRlbXBsYXRlQXR0YWNobWVudCxcbiAgVGVtcGxhdGVBdHRhY2htZW50U2VhcmNoUmVxdWVzdCxcbiAgVGVtcGxhdGVRdWVyeSxcbiAgVmxXaW5kb3csXG59IGZyb20gJ0B2ZWxvY2UvY29yZSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEb2N1bWVudEF0dGFjaG1lbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kb2N1bWVudC1hdHRhY2htZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFF1b3RlQXBpU2VydmljZSB9IGZyb20gJy4vcXVvdGUtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2FsZXNmb3JjZUFwaVNlcnZpY2UgfSBmcm9tICcuL3NhbGVzZm9yY2UtYXBpLnNlcnZpY2UnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRfO1xuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFZsV2luZG93O1xuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyB7XG4gIGF0dGFjaFRvUXVvdGU/OiBib29sZWFuO1xuICBkb2N1bWVudEZvcm1hdD86ICdET0NYJztcbiAgc2hvdWxkUHJldmVudERvd25sb2FkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50VGVtcGxhdGVzQXBpU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0VSVklDRV9VUkwgPSAnL3RlbXBsYXRlcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkxfRkFMTEJBQ0sgPSAnaHR0cHM6Ly9kZXYtZHAxLnZlbG9jcHEuY29tL2RvY2dlbic7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBCYXNlSHR0cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYWxlc2ZvcmNlQXBpU2VydmljZTogU2FsZXNmb3JjZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWxlRG93bmxvYWRTZXJ2aWNlOiBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRBdHRhY2htZW50U2VydmljZTogRG9jdW1lbnRBdHRhY2htZW50QXBpU2VydmljZSxcbiAgICBwcml2YXRlIHF1b3RlQXBpU2VydmljZTogUXVvdGVBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgKSB7XG4gICAgaWYgKHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEkpIHtcbiAgICAgIHRoaXMuRE9DX0dFTl9VUkwgPSB3aW5kb3cuVkVMT19ET0NHRU5fQVBJO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgd2luZG93LlZFTE9fRE9DR0VOX0FQSSBub3Qgc2V0LCB3aWxsIHVzZSBmYWxsYmFjayBcIiR7dGhpcy5ET0NfR0VOX1VSTF9GQUxMQkFDS31cImApO1xuICAgICAgdGhpcy5ET0NfR0VOX1VSTCA9IHRoaXMuRE9DX0dFTl9VUkxfRkFMTEJBQ0s7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFRlbXBsYXRlcyh0YWc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGVbXT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH1gLFxuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgIHBhcmFtczoge1xuICAgICAgICAuLi4odGFnICYmIHsgdGFnIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb2N1bWVudFRlbXBsYXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHVwc2VydFRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlLFxuICAgIGZpbGU/OiBGaWxlLFxuICAgIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxEb2N1bWVudFRlbXBsYXRlPiB7XG4gICAgY29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBpZiAoZmlsZSkge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZSwgZmlsZS5uYW1lKTtcbiAgICB9XG4gICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgJ3RlbXBsYXRlJyxcbiAgICAgIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh0ZW1wbGF0ZSldLCB7XG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBsZXQgdXJsID0gYCR7dGhpcy5TRVJWSUNFX1VSTH1gO1xuICAgIGlmICh0ZW1wbGF0ZS5pZCkge1xuICAgICAgdXJsICs9IGAvJHt0ZW1wbGF0ZS5pZH1gO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcnZpY2UudXBsb2FkKHtcbiAgICAgIHVybCxcbiAgICAgIGJvZHk6IGZvcm1EYXRhLFxuICAgICAgbWV0aG9kOiB0ZW1wbGF0ZS5pZCA/ICdwdXQnIDogJ3Bvc3QnLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3MsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlVGVtcGxhdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH1gLFxuICAgICAgbWV0aG9kOiAnZGVsZXRlJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZXN0b3JlVGVtcGxhdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH0vcmVzdG9yZWAsXG4gICAgICBtZXRob2Q6ICdwYXRjaCcsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvbmVUZW1wbGF0ZShcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BlcnRpZXNUb092ZXJyaWRlOiBQYXJ0aWFsPERvY3VtZW50VGVtcGxhdGU+ID0ge30sXG4gICk6IE9ic2VydmFibGU8eyBjbG9uZWRSZWNvcmRJZDogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9L2Nsb25lLyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgYm9keToge1xuICAgICAgICBpZCxcbiAgICAgICAgcHJvcGVydGllc1RvT3ZlcnJpZGUsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFRlbXBsYXRlRmlsZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9L2ZpbGVgLFxuICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkVGVtcGxhdGVGaWxlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlXG4gICAgICAuYXBpKHtcbiAgICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfS9maWxlYCxcbiAgICAgICAgcmVzcG9uc2VUeXBlOiAnYmxvYicsXG4gICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChyZXNwb25zZSA9PiB7XG4gICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChyZXNwb25zZSk7XG4gICAgICAgIH0pLFxuICAgICAgICBtYXAocmVzcG9uc2UgPT4gcmVzcG9uc2UuYm9keSB8fCByZXNwb25zZSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIG1lcmdlRG9jdW1lbnRzKGRvY3VtZW50OiBCbG9iLCBhdHRhY2htZW50czogQXJyYXlCdWZmZXJbXSk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCBib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgYm9keS5hcHBlbmQoJ2F0dGFjaG1lbnRzJywgbmV3IEJsb2IoW2F0dGFjaG1lbnRdKSk7XG4gICAgfSk7XG5cbiAgICBib2R5LmFwcGVuZCgnb3JkZXJmb3JtJywgZG9jdW1lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuRE9DX0dFTl9VUkx9L2RvY3VtZW50cy9tZXJnZWAsIGJvZHksIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRhY2htZW50cyhzZWFyY2hSZXF1ZXN0OiBUZW1wbGF0ZUF0dGFjaG1lbnRTZWFyY2hSZXF1ZXN0KTogT2JzZXJ2YWJsZTxUZW1wbGF0ZUF0dGFjaG1lbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuZ2V0QXR0YWNobWVudHMoc2VhcmNoUmVxdWVzdCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0YWNobWVudEZpbGUoaWQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50RmlsZShpZCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQXR0YWNobWVudChcbiAgICBhdHRhY2htZW50OiBUZW1wbGF0ZUF0dGFjaG1lbnQsXG4gICAgZmlsZT86IEZpbGUsXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxuICApOiBPYnNlcnZhYmxlPFRlbXBsYXRlQXR0YWNobWVudD4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50LCBmaWxlLCByZXBvcnRQcm9ncmVzcyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQXR0YWNobWVudChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5yZW1vdmVBdHRhY2htZW50KGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURvY3VtZW50RGF0YShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChpc0xlZ2FjeURvY3VtZW50VGVtcGxhdGUodGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeSh0ZW1wbGF0ZSwgb2JqZWN0LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LnJlZHVjZShcbiAgICAgIChhY2MsIHsgbmFtZSwgdmFsdWUgfSkgPT4gKHsgLi4uYWNjLCBbbmFtZV06IHRoaXMubWFwQm9vbGVhbklmQXBsaWNhYmxlKHZhbHVlKSB9KSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICAvKlxuICAgICAgUmVzb2x2ZSBxdW90ZSBhbmQgdGVtcGxhdGUgcHJvcGVydGllcyBmb3Igbm93XG4gICAgICBXaGVuIHByb2NlZHVyZXMgYXJlIHJlYWR5LCB3aGV5IHdpbGwgcmVwbGFjZSB0ZW1wbGF0ZSBzY3JpcHRzLlxuXG4gICAgICBUT0RPOiBydW4gcHJvY2VkdXJlIHRvIHJlc29sdmUgZG9jdW1lbnQgZGF0YVxuICAgICovXG4gICAgcmV0dXJuIG9mKHtcbiAgICAgIC4uLih0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyA/IG9iamVjdCA6IHsgb2JqZWN0IH0pLFxuICAgICAgLi4udGVtcGxhdGVQcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlRG9jdW1lbnQoXG4gICAgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcGFyYW1zOiBEb2N1bWVudEdlbmVyYXRpb25QYXJhbXMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgY29uc3QgZG9jdW1lbnREYXRhJCA9IHRoaXMuZ2VuZXJhdGVEb2N1bWVudERhdGEodGVtcGxhdGUsIG9iamVjdCwgeyAuLi5wYXJhbXMsIHNob3VsZFByZXZlbnREb3dubG9hZDogdHJ1ZSB9KTtcblxuICAgIHJldHVybiB6aXAodGhpcy5nZXRUZW1wbGF0ZUZpbGUodGVtcGxhdGUuaWQpLCBkb2N1bWVudERhdGEkLCB0aGlzLnJlc29sdmVBdHRhY2htZW50cyQodGVtcGxhdGUpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChbdGVtcGxhdGVGaWxlLCBkYXRhLCBhdHRhY2htZW50c10pID0+IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBEb2N4VGVtcGxhdGVyLmdlbmVyYXRlKHRlbXBsYXRlRmlsZSwgZGF0YSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXM6IF8uRGljdGlvbmFyeTxzdHJpbmc+ID0gb2JqZWN0Py5jb250ZXh0Py5wcm9wZXJ0aWVzID8/IG9iamVjdD8ucHJvcGVydGllcyA/PyB7fTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnROYW1lID0gcHJvcGVydGllcy5OYW1lIHx8IHRlbXBsYXRlLm5hbWU7XG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRGb3JtYXQgPVxuICAgICAgICAgIHBhcmFtcy5kb2N1bWVudEZvcm1hdCA/PyB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKHAgPT4gcC5uYW1lID09PSAnZG9jdW1lbnRGb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGlmIChkb2N1bWVudEZvcm1hdCA9PT0gJ0RPQ1gnKSB7XG4gICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChkb2N1bWVudCwgZG9jdW1lbnROYW1lKTtcblxuICAgICAgICAgIHJldHVybiBvZihkb2N1bWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJnZURvY3VtZW50cyhkb2N1bWVudCwgYXR0YWNobWVudHMpLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKHBkZiA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmF0dGFjaFRvUXVvdGUgJiYgUXVvdGVEcmFmdC5pc1F1b3RlKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVvdGVBcGlTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmF0dGFjaERvY3VtZW50KG9iamVjdC5xdW90ZUlkLCBgJHtkb2N1bWVudE5hbWV9LnBkZmAsIHBkZilcbiAgICAgICAgICAgICAgICAucGlwZShtYXAoKCkgPT4gcGRmKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBvZihwZGYpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcChwZGYgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtwZGZdKTtcblxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgYCR7ZG9jdW1lbnROYW1lfS5wZGZgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJsb2I7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNob3VsZFByZXZlbnREb3dubG9hZCA9IHBhcmFtcy5zaG91bGRQcmV2ZW50RG93bmxvYWQ7XG4gICAgY29uc3QgYWxsUXVlcmllczogVGVtcGxhdGVRdWVyeVtdID0gWy4uLih0ZW1wbGF0ZT8ucXVlcmllcyA/PyBbXSldO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IF8uRGljdGlvbmFyeTxzdHJpbmc+ID0gb2JqZWN0Py5jb250ZXh0Py5wcm9wZXJ0aWVzID8/IG9iamVjdD8ucHJvcGVydGllcyA/PyB7fTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9wZXJ0aWVzPy5BY2NvdW50SWQ7XG4gICAgY29uc3QgdXNlcklkID0gcHJvcGVydGllcz8uVXNlcklkO1xuXG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgYWxsUXVlcmllcy5wdXNoKHtcbiAgICAgICAgcXVlcnlOYW1lOiAnUXVvdGVBY2NvdW50UXVlcnknLFxuICAgICAgICBvYmplY3ROYW1lOiAnQWNjb3VudCcsXG4gICAgICAgIHJlc3VsdE9iamVjdE5hbWU6ICdhY2NvdW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke2FjY291bnRJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBhbGxRdWVyaWVzLnB1c2goe1xuICAgICAgICBxdWVyeU5hbWU6ICdRdW90ZVVzZXJRdWVyeScsXG4gICAgICAgIG9iamVjdE5hbWU6ICdVc2VyJyxcbiAgICAgICAgcmVzdWx0T2JqZWN0TmFtZTogJ2FnZW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke3VzZXJJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBhbGxRdWVyaWVzLm1hcChxdWVyeSA9PiB0aGlzLnF1ZXJ5T2JqZWN0KHF1ZXJ5LCB7IHByb3BlcnRpZXMgfSkpIHx8IFtdO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKFsuLi5xdWVyaWVzXSkucGlwZShcbiAgICAgIGRlZmF1bHRJZkVtcHR5KFtdIGFzIGFueVtdKSxcbiAgICAgIG1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgcXVlcmllc1Jlc3VsdCA9IF8uY2hhaW4ocmVzdWx0cylcbiAgICAgICAgICAucmVkdWNlKChhY2MsIHIpID0+IHtcbiAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4uciB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIC52YWx1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9ICh0ZW1wbGF0ZT8ucHJvcGVydGllcyB8fCBbXSkucmVkdWNlKCh0cnVuaywgeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW25hbWUgYXMgc3RyaW5nXTogdGhpcy5tYXBCb29sZWFuSWZBcGxpY2FibGUodmFsdWUgYXMgYW55KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAuLi4odHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgPyBvYmplY3QgOiB7IG9iamVjdCB9KSxcbiAgICAgICAgICAuLi5xdWVyaWVzUmVzdWx0LFxuICAgICAgICAgIC4uLnRlbXBsYXRlUHJvcGVydGllcyxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGVtcGxhdGUuc2NyaXB0ICYmIHRlbXBsYXRlLnNjcmlwdC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVuY3lGb3JtYXQgPSB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ2N1cnJlbmN5Rm9ybWF0Jyk/LnZhbHVlIHx8ICcxLjItMic7XG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZGF0ZUZvcm1hdCcpPy52YWx1ZSB8fCAnRC9NTU0vWVlZWSc7XG4gICAgICAgICAgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBtb21lbnQodmFsdWUpLmZvcm1hdChkYXRlRm9ybWF0KSA6IHZhbHVlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHt0ZW1wbGF0ZS5zY3JpcHR9YCkoKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm0oe1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIHV0aWxzOiB7XG4gICAgICAgICAgICAgIGxvZGFzaDogXyxcbiAgICAgICAgICAgICAgY3VycmVuY3k6ICh2YWx1ZTogYW55KSA9PiBuZXcgQ3VycmVuY3lQaXBlKCdlbi1VUycpLnRyYW5zZm9ybSh2YWx1ZSwgJ1VTRCcsICdzeW1ib2wnLCBjdXJyZW5jeUZvcm1hdCksXG4gICAgICAgICAgICAgIGRhdGU6IGZvcm1hdERhdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVG9EYXk6IGZvcm1hdERhdGUoRGF0ZS5ub3coKSBhcyBhbnkpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkRGF0YSldKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgJ2RhdGEuanNvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUF0dGFjaG1lbnRzJCh0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXJbXT4ge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRJZHMgPSAodGVtcGxhdGUuYXR0YWNobWVudHM/Lm1hcCgoeyBpZCB9KSA9PiBpZCkuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdKSA/PyBbXTtcblxuICAgIGlmICghYXR0YWNobWVudElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcmtKb2luKGF0dGFjaG1lbnRJZHMubWFwKGlkID0+IHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50RmlsZShpZCwgdHJ1ZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwU2ZRdWVyeVJlc3VsdCA9IDxUPihsaW1pdDogbnVtYmVyKSA9PlxuICAgIG1hcCgocmVjb3JkczogVFtdKSA9PiB7XG4gICAgICBpZiAoIXJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IF9yZXN1bHQ6ICdObyBSZWNvcmRzIEZvdW5kJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobGltaXQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZHNbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWNvcmRzO1xuICAgIH0pO1xuXG4gIHByaXZhdGUgbWFwQm9vbGVhbklmQXBsaWNhYmxlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHByaXZhdGUgcXVlcnlPYmplY3QoXG4gICAgeyBvYmplY3ROYW1lLCByZXN1bHRPYmplY3ROYW1lLCBmaWVsZHMsIHN0YXRlbWVudCB9OiBUZW1wbGF0ZVF1ZXJ5LFxuICAgIHsgcHJvcGVydGllcyB9OiBBbnlXaXRoUHJvcGVydGllcyxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBwYXR0ZXJuTGltaXQgPSAvKFxccypsaW1pdFxcc1xcZCopL2k7XG4gICAgbGV0IGxpbWl0ID0gMTtcbiAgICBpZiAocGF0dGVybkxpbWl0LnRlc3Qoc3RhdGVtZW50KSkge1xuICAgICAgY29uc3QgbGltaXRTdHIgPSBzdGF0ZW1lbnQ/Lm1hdGNoKHBhdHRlcm5MaW1pdCk/LlsxXS50cmltKCkuc3Vic3RyaW5nKDUpLnRyaW0oKTtcbiAgICAgIGlmIChsaW1pdFN0cikge1xuICAgICAgICBsaW1pdCA9IE51bWJlci5wYXJzZUludChsaW1pdFN0ciwgMTApO1xuICAgICAgfVxuICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50LnJlcGxhY2UocGF0dGVybkxpbWl0LCAnJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRTdGF0ZW1lbnQgPSBTdHJpbmdVdGlscy5maWxsUGxhY2Vob2xkZXJzKHN0YXRlbWVudCwgcHJvcGVydGllcywgLzpcXHMqKFxcd1tcXHdcXGRfLl0rKS9pKTtcblxuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3QgPSB7XG4gICAgICBza2lwOiAwLFxuICAgICAgY291bnQ6IGxpbWl0LFxuICAgICAgcmF3Q29uZGl0aW9uOiByZXNvbHZlZFN0YXRlbWVudCxcbiAgICAgIC4uLihmaWVsZHM/Lmxlbmd0aCAmJiAhIWZpZWxkc1swXSAmJiB7IGZpZWxkcyB9KSxcbiAgICB9IGFzIFNlYXJjaFJlcXVlc3Q7XG5cbiAgICByZXR1cm4gdGhpcy5zYWxlc2ZvcmNlQXBpU2VydmljZS5xdWVyeShzZWFyY2hSZXF1ZXN0LCBvYmplY3ROYW1lKS5waXBlKFxuICAgICAgdGhpcy5tYXBTZlF1ZXJ5UmVzdWx0KGxpbWl0KSxcbiAgICAgIG1hcCh2YWx1ZSA9PiAoeyBbcmVzdWx0T2JqZWN0TmFtZV06IHZhbHVlIH0pKSxcbiAgICApO1xuICB9XG59XG4iXX0=
|