@veloceapps/api 11.0.0-0 → 11.0.0-2
Sign up to get free protection for your applications and to get access to all the features.
- package/esm2020/index.mjs +1 -2
- package/esm2020/lib/api.module.mjs +4 -7
- package/esm2020/lib/services/document-attachment-api.service.mjs +1 -1
- package/esm2020/lib/services/flows-api.service.mjs +4 -3
- package/esm2020/lib/services/product-model-api.service.mjs +2 -16
- package/esm2020/lib/services/quote-api.service.mjs +2 -13
- package/esm2020/lib/services/salesforce-api.service.mjs +1 -8
- package/esm2020/lib/types/attachment.types.mjs +2 -0
- package/esm2020/lib/types/org-info.types.mjs +1 -1
- package/fesm2015/veloceapps-api.mjs +312 -644
- package/fesm2015/veloceapps-api.mjs.map +1 -1
- package/fesm2020/veloceapps-api.mjs +308 -653
- package/fesm2020/veloceapps-api.mjs.map +1 -1
- package/index.d.ts +0 -1
- package/lib/services/document-attachment-api.service.d.ts +2 -1
- package/lib/services/product-model-api.service.d.ts +1 -7
- package/lib/services/quote-api.service.d.ts +1 -5
- package/lib/services/salesforce-api.service.d.ts +0 -4
- package/lib/types/attachment.types.d.ts +4 -0
- package/lib/types/org-info.types.d.ts +0 -2
- package/package.json +1 -1
- package/esm2020/lib/services/document-templates-api.service.mjs +0 -323
- package/lib/services/document-templates-api.service.d.ts +0 -48
package/index.d.ts
CHANGED
@@ -10,7 +10,6 @@ export { ContextApiService } from './lib/services/context-api.service';
|
|
10
10
|
export { ContractedPriceApiService } from './lib/services/contracted-price-api.service';
|
11
11
|
export { DeltaApiService } from './lib/services/delta-api.service';
|
12
12
|
export { DocumentAttachmentApiService } from './lib/services/document-attachment-api.service';
|
13
|
-
export { DocumentTemplatesApiService } from './lib/services/document-templates-api.service';
|
14
13
|
export { EndpointsApiService } from './lib/services/endpoints-api.service';
|
15
14
|
export { FlowStateApiService } from './lib/services/flow-state-api';
|
16
15
|
export { FlowsApiService } from './lib/services/flows-api.service';
|
@@ -1,5 +1,6 @@
|
|
1
|
-
import { Attachment, BaseHttpService, FileDownloadService
|
1
|
+
import { Attachment, BaseHttpService, FileDownloadService } from '@veloceapps/core';
|
2
2
|
import { Observable } from 'rxjs';
|
3
|
+
import { TemplateAttachmentSearchRequest } from '../types/attachment.types';
|
3
4
|
import * as i0 from "@angular/core";
|
4
5
|
export declare class DocumentAttachmentApiService {
|
5
6
|
private httpService;
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { BaseHttpService, ModelReleaseRequest, PmlConfigurationMode, ProductModel,
|
1
|
+
import { BaseHttpService, ModelReleaseRequest, PmlConfigurationMode, ProductModel, ProductModelVersion } from '@veloceapps/core';
|
2
2
|
import { Observable } from 'rxjs';
|
3
3
|
import * as i0 from "@angular/core";
|
4
4
|
export declare class ProductModelApiService {
|
@@ -13,12 +13,6 @@ export declare class ProductModelApiService {
|
|
13
13
|
getModel(id: string, version?: string): Observable<ProductModel>;
|
14
14
|
getModels(skipCount: number, searchText: string): Observable<ProductModel[]>;
|
15
15
|
getLinkedModels(id: string, version?: string): Observable<ProductModel[]>;
|
16
|
-
/**
|
17
|
-
*
|
18
|
-
* @deprecated
|
19
|
-
* Will be removed in next major release
|
20
|
-
*/
|
21
|
-
load(id: string, version?: string): Observable<ProductModelsContainer>;
|
22
16
|
getPML(modelId: string, version?: string): Observable<any>;
|
23
17
|
savePML(modelId: string, pml: string, comment: string): Observable<any>;
|
24
18
|
generateProducts(modelId: string): Observable<ProductModel>;
|
@@ -8,11 +8,7 @@ export declare class QuoteApiService {
|
|
8
8
|
private readonly SERVICE_URL;
|
9
9
|
constructor(httpService: BaseHttpService);
|
10
10
|
/**
|
11
|
-
*
|
12
|
-
*/
|
13
|
-
getQuoteDraft(objectId: string, params?: Dictionary<string>, errorHandler?: (error: any) => void): Observable<QuoteDraft>;
|
14
|
-
/**
|
15
|
-
* Comparing to deprecated `getQuoteDraft` this endpoint doesn't include orders and assets
|
11
|
+
* This endpoint doesn't include orders and assets
|
16
12
|
* @param objectId quoteId | accountId | opportunityId | orderId
|
17
13
|
* @param params Query params
|
18
14
|
* @param options Request options
|
@@ -13,10 +13,6 @@ export declare class SalesforceApiService {
|
|
13
13
|
}, options?: HttpRequestConfigurableOptions): Observable<{
|
14
14
|
searchRecords: T[];
|
15
15
|
}>;
|
16
|
-
/**
|
17
|
-
* @deprecated
|
18
|
-
*/
|
19
|
-
describe(objectName: string, fieldName?: string, options?: HttpRequestConfigurableOptions): Observable<SalesforceField[]>;
|
20
16
|
describeObject(objectName: string, options?: HttpRequestConfigurableOptions): Observable<SalesforceField[]>;
|
21
17
|
describeField(objectName: string, fieldName: string, options?: HttpRequestConfigurableOptions): Observable<SalesforceField>;
|
22
18
|
describe2<T>(objectName: string, fields: string[], options?: HttpRequestConfigurableOptions): Observable<T>;
|
@@ -7,7 +7,6 @@ export interface OrgInfo {
|
|
7
7
|
OrgID: string;
|
8
8
|
BackendURL: string;
|
9
9
|
FrontendURL: string;
|
10
|
-
DocgenURL: string;
|
11
10
|
StudioURL: string;
|
12
11
|
IntegrationURL: string;
|
13
12
|
ShoppingCartURL: string;
|
@@ -15,7 +14,6 @@ export interface OrgInfo {
|
|
15
14
|
DefaultDataURL: string;
|
16
15
|
BackendVersion: string;
|
17
16
|
FrontendVersion: string;
|
18
|
-
DocgenVersion: string;
|
19
17
|
StudioVersion: string;
|
20
18
|
IntegrationVersion: string;
|
21
19
|
ShoppingCartVersion: string;
|
package/package.json
CHANGED
@@ -1,323 +0,0 @@
|
|
1
|
-
import { CurrencyPipe } from '@angular/common';
|
2
|
-
import { Injectable } from '@angular/core';
|
3
|
-
import { DocxTemplater, isLegacyDocumentTemplate, QuoteDraft, StringUtils, } from '@veloceapps/core';
|
4
|
-
import * as _ from 'lodash';
|
5
|
-
import moment from 'moment';
|
6
|
-
import { forkJoin, of, zip } from 'rxjs';
|
7
|
-
import { defaultIfEmpty, map, switchMap, tap } from 'rxjs/operators';
|
8
|
-
import * as i0 from "@angular/core";
|
9
|
-
import * as i1 from "@veloceapps/core";
|
10
|
-
import * as i2 from "./salesforce-api.service";
|
11
|
-
import * as i3 from "./document-attachment-api.service";
|
12
|
-
import * as i4 from "@angular/common/http";
|
13
|
-
export class DocumentTemplatesApiService {
|
14
|
-
constructor(service, salesforceApiService, fileDownloadService, documentAttachmentService, http) {
|
15
|
-
this.service = service;
|
16
|
-
this.salesforceApiService = salesforceApiService;
|
17
|
-
this.fileDownloadService = fileDownloadService;
|
18
|
-
this.documentAttachmentService = documentAttachmentService;
|
19
|
-
this.http = http;
|
20
|
-
this.SERVICE_URL = '/templates';
|
21
|
-
this.DOCGEN_TAG = 'docgen';
|
22
|
-
this.DOC_GEN_URL_FALLBACK = `${window.VELO_API}/docgen`;
|
23
|
-
this.mapSfQueryResult = (limit) => map((records) => {
|
24
|
-
if (!records.length) {
|
25
|
-
return { _result: 'No Records Found' };
|
26
|
-
}
|
27
|
-
if (limit === 1) {
|
28
|
-
return records[0];
|
29
|
-
}
|
30
|
-
return records;
|
31
|
-
});
|
32
|
-
this.mapBooleanIfAplicable = (value) => {
|
33
|
-
if (value === 'true') {
|
34
|
-
return true;
|
35
|
-
}
|
36
|
-
if (value === 'false') {
|
37
|
-
return false;
|
38
|
-
}
|
39
|
-
return value;
|
40
|
-
};
|
41
|
-
if (window.VELO_DOCGEN_API) {
|
42
|
-
this.DOC_GEN_URL = window.VELO_DOCGEN_API;
|
43
|
-
}
|
44
|
-
else {
|
45
|
-
console.log(`window.VELO_DOCGEN_API not set, will use fallback "${this.DOC_GEN_URL_FALLBACK}"`);
|
46
|
-
this.DOC_GEN_URL = this.DOC_GEN_URL_FALLBACK;
|
47
|
-
}
|
48
|
-
}
|
49
|
-
getTemplates(tag) {
|
50
|
-
return this.service.api({
|
51
|
-
url: `${this.SERVICE_URL}`,
|
52
|
-
method: 'get',
|
53
|
-
params: {
|
54
|
-
...(tag && { tag }),
|
55
|
-
},
|
56
|
-
});
|
57
|
-
}
|
58
|
-
getTemplate(id) {
|
59
|
-
return this.service.api({
|
60
|
-
url: `${this.SERVICE_URL}/${id}`,
|
61
|
-
method: 'get',
|
62
|
-
});
|
63
|
-
}
|
64
|
-
upsertTemplate(template, file, reportProgress) {
|
65
|
-
const formData = new FormData();
|
66
|
-
if (file) {
|
67
|
-
formData.append('file', file, file.name);
|
68
|
-
}
|
69
|
-
formData.append('template', new Blob([JSON.stringify(template)], {
|
70
|
-
type: 'application/json',
|
71
|
-
}));
|
72
|
-
let url = `${this.SERVICE_URL}`;
|
73
|
-
if (template.id) {
|
74
|
-
url += `/${template.id}`;
|
75
|
-
}
|
76
|
-
return this.service.upload({
|
77
|
-
url,
|
78
|
-
body: formData,
|
79
|
-
method: template.id ? 'put' : 'post',
|
80
|
-
reportProgress,
|
81
|
-
});
|
82
|
-
}
|
83
|
-
removeTemplate(id) {
|
84
|
-
return this.service.api({
|
85
|
-
url: `${this.SERVICE_URL}/${id}`,
|
86
|
-
method: 'delete',
|
87
|
-
});
|
88
|
-
}
|
89
|
-
restoreTemplate(id) {
|
90
|
-
return this.service.api({
|
91
|
-
url: `${this.SERVICE_URL}/${id}/restore`,
|
92
|
-
method: 'patch',
|
93
|
-
});
|
94
|
-
}
|
95
|
-
cloneTemplate(id, propertiesToOverride = {}) {
|
96
|
-
return this.service.api({
|
97
|
-
url: `${this.SERVICE_URL}/clone/${id}`,
|
98
|
-
method: 'post',
|
99
|
-
body: {
|
100
|
-
id,
|
101
|
-
propertiesToOverride,
|
102
|
-
},
|
103
|
-
});
|
104
|
-
}
|
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
|
-
generateDocumentV2(body, quoteId, isAsync) {
|
134
|
-
body['docgenURL'] = window.VELO_DOCGEN_API ?? '';
|
135
|
-
const params = {};
|
136
|
-
if (isAsync) {
|
137
|
-
params['async'] = 'true';
|
138
|
-
}
|
139
|
-
return this.service
|
140
|
-
.api({
|
141
|
-
method: 'post',
|
142
|
-
url: `/docgen/${quoteId}/generate`,
|
143
|
-
body,
|
144
|
-
params,
|
145
|
-
responseType: 'arraybuffer',
|
146
|
-
})
|
147
|
-
.pipe(map(pdf => {
|
148
|
-
const blob = new Blob([pdf]);
|
149
|
-
const documentName = body.parameters['documentName'] ?? 'Veloce Proposal';
|
150
|
-
if (!isAsync) {
|
151
|
-
this.fileDownloadService.processDownload(blob, `${documentName}.${body.documentFormat.toLowerCase()}`);
|
152
|
-
}
|
153
|
-
return blob;
|
154
|
-
}));
|
155
|
-
}
|
156
|
-
getAttachments(searchRequest) {
|
157
|
-
return this.documentAttachmentService.getAttachments(searchRequest);
|
158
|
-
}
|
159
|
-
getAttachmentFile(id) {
|
160
|
-
return this.documentAttachmentService.getAttachmentFile(id);
|
161
|
-
}
|
162
|
-
createAttachment(attachment, file, reportProgress) {
|
163
|
-
return this.documentAttachmentService.createAttachment(attachment, file, reportProgress);
|
164
|
-
}
|
165
|
-
removeAttachment(id) {
|
166
|
-
return this.documentAttachmentService.removeAttachment(id);
|
167
|
-
}
|
168
|
-
generateDocumentData(template, object, params = {}) {
|
169
|
-
if (isLegacyDocumentTemplate(template)) {
|
170
|
-
return this.generateDocumentDataLegacy(template, object, params);
|
171
|
-
}
|
172
|
-
const templateProperties = template.properties?.reduce((acc, { name, value }) => ({ ...acc, [name]: this.mapBooleanIfAplicable(value) }), {});
|
173
|
-
/*
|
174
|
-
Resolve quote and template properties for now
|
175
|
-
When procedures are ready, whey will replace template scripts.
|
176
|
-
|
177
|
-
TODO: run procedure to resolve document data
|
178
|
-
*/
|
179
|
-
return of({
|
180
|
-
...(typeof object === 'object' ? object : { object }),
|
181
|
-
...templateProperties,
|
182
|
-
});
|
183
|
-
}
|
184
|
-
generateDocument(template, object, params = {}) {
|
185
|
-
const documentData$ = this.generateDocumentData(template, object, { ...params, shouldPreventDownload: true });
|
186
|
-
return zip(this.getTemplateFile(template.id), documentData$, this.resolveAttachments$(template)).pipe(switchMap(([templateFile, data, attachments]) => {
|
187
|
-
const document = DocxTemplater.generate(templateFile, data);
|
188
|
-
const properties = object?.context?.properties ?? object?.properties ?? {};
|
189
|
-
const documentName = template.properties?.find(({ name }) => name === 'documentName')?.value ||
|
190
|
-
properties['Name'] ||
|
191
|
-
template.name;
|
192
|
-
const documentFormat = params.documentFormat ?? template.properties?.find(p => p.name === 'documentFormat')?.value;
|
193
|
-
if (documentFormat === 'DOCX') {
|
194
|
-
this.fileDownloadService.processDownload(document, documentName);
|
195
|
-
return of(document);
|
196
|
-
}
|
197
|
-
return this.mergeDocuments(document, attachments).pipe(switchMap(pdf => {
|
198
|
-
if (params.attachToQuote && QuoteDraft.isQuote(object)) {
|
199
|
-
const file = new File([pdf], `${documentName}.pdf`);
|
200
|
-
return this.documentAttachmentService
|
201
|
-
.createAttachment({
|
202
|
-
linkedEntityId: object.quoteId,
|
203
|
-
fileName: documentName,
|
204
|
-
fileExtension: 'pdf',
|
205
|
-
tags: this.DOCGEN_TAG,
|
206
|
-
}, file)
|
207
|
-
.pipe(map(() => pdf));
|
208
|
-
}
|
209
|
-
return of(pdf);
|
210
|
-
}), map(pdf => {
|
211
|
-
const blob = new Blob([pdf]);
|
212
|
-
if (!params.shouldPreventDownload) {
|
213
|
-
this.fileDownloadService.processDownload(blob, `${documentName}.pdf`);
|
214
|
-
}
|
215
|
-
return blob;
|
216
|
-
}));
|
217
|
-
}));
|
218
|
-
}
|
219
|
-
generateDocumentDataLegacy(template, object, params = {}) {
|
220
|
-
const shouldPreventDownload = params.shouldPreventDownload;
|
221
|
-
const allQueries = [...(template?.queries ?? [])];
|
222
|
-
const properties = object?.context?.properties ?? object?.properties ?? {};
|
223
|
-
const accountId = properties?.['AccountId'];
|
224
|
-
const userId = properties?.['UserId'];
|
225
|
-
if (accountId) {
|
226
|
-
allQueries.push({
|
227
|
-
queryName: 'QuoteAccountQuery',
|
228
|
-
objectName: 'Account',
|
229
|
-
resultObjectName: 'account',
|
230
|
-
statement: `Id ='${accountId}'`,
|
231
|
-
fields: [],
|
232
|
-
});
|
233
|
-
}
|
234
|
-
if (userId) {
|
235
|
-
allQueries.push({
|
236
|
-
queryName: 'QuoteUserQuery',
|
237
|
-
objectName: 'User',
|
238
|
-
resultObjectName: 'agent',
|
239
|
-
statement: `Id ='${userId}'`,
|
240
|
-
fields: [],
|
241
|
-
});
|
242
|
-
}
|
243
|
-
const queries = allQueries.map(query => this.queryObject(query, { properties })) || [];
|
244
|
-
return forkJoin([...queries]).pipe(defaultIfEmpty([]), map(results => {
|
245
|
-
const queriesResult = _.chain(results)
|
246
|
-
.reduce((acc, r) => {
|
247
|
-
if (r) {
|
248
|
-
return { ...acc, ...r };
|
249
|
-
}
|
250
|
-
return acc;
|
251
|
-
}, {})
|
252
|
-
.value();
|
253
|
-
const templateProperties = (template?.properties || []).reduce((trunk, { name, value }) => {
|
254
|
-
return {
|
255
|
-
...trunk,
|
256
|
-
[name]: this.mapBooleanIfAplicable(value),
|
257
|
-
};
|
258
|
-
}, {});
|
259
|
-
const data = {
|
260
|
-
...(typeof object === 'object' ? object : { object }),
|
261
|
-
...queriesResult,
|
262
|
-
...templateProperties,
|
263
|
-
};
|
264
|
-
if (template.script && template.script.trim().length) {
|
265
|
-
const currencyFormat = template.properties?.find(({ name }) => name === 'currencyFormat')?.value || '1.2-2';
|
266
|
-
const dateFormat = template.properties?.find(({ name }) => name === 'dateFormat')?.value || 'D/MMM/YYYY';
|
267
|
-
const formatDate = (value) => {
|
268
|
-
return value ? moment(value).format(dateFormat) : value;
|
269
|
-
};
|
270
|
-
const transform = new Function(`return ${template.script}`)();
|
271
|
-
const transformedData = transform({
|
272
|
-
...data,
|
273
|
-
utils: {
|
274
|
-
lodash: _,
|
275
|
-
currency: (value) => new CurrencyPipe('en-US').transform(value, 'USD', 'symbol', currencyFormat),
|
276
|
-
date: formatDate,
|
277
|
-
},
|
278
|
-
ToDay: formatDate(Date.now()),
|
279
|
-
});
|
280
|
-
if (!shouldPreventDownload) {
|
281
|
-
const blob = new Blob([JSON.stringify(transformedData)]);
|
282
|
-
this.fileDownloadService.processDownload(blob, 'data.json');
|
283
|
-
}
|
284
|
-
return transformedData;
|
285
|
-
}
|
286
|
-
return data;
|
287
|
-
}));
|
288
|
-
}
|
289
|
-
resolveAttachments$(template) {
|
290
|
-
const attachmentIds = template.attachments?.map(({ id }) => id).filter(Boolean) ?? [];
|
291
|
-
if (!attachmentIds.length) {
|
292
|
-
return of([]);
|
293
|
-
}
|
294
|
-
return forkJoin(attachmentIds.map(id => this.documentAttachmentService.getAttachmentFile(id, true)));
|
295
|
-
}
|
296
|
-
queryObject({ objectName, resultObjectName, fields, statement }, { properties }) {
|
297
|
-
const patternLimit = /(\s*limit\s\d*)/i;
|
298
|
-
let limit = 1;
|
299
|
-
if (statement && patternLimit.test(statement)) {
|
300
|
-
const limitStr = statement?.match(patternLimit)?.[1]?.trim().substring(5).trim();
|
301
|
-
if (limitStr) {
|
302
|
-
limit = Number.parseInt(limitStr, 10);
|
303
|
-
}
|
304
|
-
statement = statement.replace(patternLimit, '');
|
305
|
-
}
|
306
|
-
const resolvedStatement = statement
|
307
|
-
? StringUtils.fillPlaceholders(statement, properties, /:\s*(\w[\w\d_.]+)/i)
|
308
|
-
: undefined;
|
309
|
-
const searchRequest = {
|
310
|
-
skip: 0,
|
311
|
-
count: limit,
|
312
|
-
rawCondition: resolvedStatement,
|
313
|
-
...(fields?.length && !!fields[0] && { fields }),
|
314
|
-
};
|
315
|
-
return this.salesforceApiService.query(searchRequest, objectName).pipe(this.mapSfQueryResult(limit), map(value => ({ [resultObjectName]: value })));
|
316
|
-
}
|
317
|
-
}
|
318
|
-
DocumentTemplatesApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DocumentTemplatesApiService, deps: [{ token: i1.BaseHttpService }, { token: i2.SalesforceApiService }, { token: i1.FileDownloadService }, { token: i3.DocumentAttachmentApiService }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
319
|
-
DocumentTemplatesApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DocumentTemplatesApiService });
|
320
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DocumentTemplatesApiService, decorators: [{
|
321
|
-
type: Injectable
|
322
|
-
}], ctorParameters: function () { return [{ type: i1.BaseHttpService }, { type: i2.SalesforceApiService }, { type: i1.FileDownloadService }, { type: i3.DocumentAttachmentApiService }, { type: i4.HttpClient }]; } });
|
323
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGVzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvc3JjL2xpYi9zZXJ2aWNlcy9kb2N1bWVudC10ZW1wbGF0ZXMtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUtMLGFBQWEsRUFHYix3QkFBd0IsRUFDeEIsVUFBVSxFQUVWLFdBQVcsR0FJWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFhckUsTUFBTSxPQUFPLDJCQUEyQjtJQU10QyxZQUNVLE9BQXdCLEVBQ3hCLG9CQUEwQyxFQUMxQyxtQkFBd0MsRUFDeEMseUJBQXVELEVBQ3ZELElBQWdCO1FBSmhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyw4QkFBeUIsR0FBekIseUJBQXlCLENBQThCO1FBQ3ZELFNBQUksR0FBSixJQUFJLENBQVk7UUFWVCxnQkFBVyxHQUFHLFlBQVksQ0FBQztRQUM1QixlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLHlCQUFvQixHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsU0FBUyxDQUFDO1FBbVc1RCxx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M0IsMkJBQTJCO2tCQUR2QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBBbnlXaXRoUHJvcGVydGllcyxcbiAgQXR0YWNobWVudCxcbiAgQmFzZUh0dHBTZXJ2aWNlLFxuICBEb2N1bWVudFRlbXBsYXRlLFxuICBEb2N4VGVtcGxhdGVyLFxuICBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICBHZW5lcmF0ZURvY3VtZW50UGF5bG9hZCxcbiAgaXNMZWdhY3lEb2N1bWVudFRlbXBsYXRlLFxuICBRdW90ZURyYWZ0LFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTdHJpbmdVdGlscyxcbiAgVGVtcGxhdGVBdHRhY2htZW50U2VhcmNoUmVxdWVzdCxcbiAgVGVtcGxhdGVRdWVyeSxcbiAgVmxXaW5kb3csXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEb2N1bWVudEF0dGFjaG1lbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kb2N1bWVudC1hdHRhY2htZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbGVzZm9yY2VBcGlTZXJ2aWNlIH0gZnJvbSAnLi9zYWxlc2ZvcmNlLWFwaS5zZXJ2aWNlJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFZsV2luZG93O1xuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyB7XG4gIGF0dGFjaFRvUXVvdGU/OiBib29sZWFuO1xuICBkb2N1bWVudEZvcm1hdD86ICdET0NYJztcbiAgc2hvdWxkUHJldmVudERvd25sb2FkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50VGVtcGxhdGVzQXBpU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0VSVklDRV9VUkwgPSAnL3RlbXBsYXRlcyc7XG4gIHB1YmxpYyByZWFkb25seSBET0NHRU5fVEFHID0gJ2RvY2dlbic7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkxfRkFMTEJBQ0sgPSBgJHt3aW5kb3cuVkVMT19BUEl9L2RvY2dlbmA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBCYXNlSHR0cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYWxlc2ZvcmNlQXBpU2VydmljZTogU2FsZXNmb3JjZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWxlRG93bmxvYWRTZXJ2aWNlOiBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRBdHRhY2htZW50U2VydmljZTogRG9jdW1lbnRBdHRhY2htZW50QXBpU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICkge1xuICAgIGlmICh3aW5kb3cuVkVMT19ET0NHRU5fQVBJKSB7XG4gICAgICB0aGlzLkRPQ19HRU5fVVJMID0gd2luZG93LlZFTE9fRE9DR0VOX0FQSTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEkgbm90IHNldCwgd2lsbCB1c2UgZmFsbGJhY2sgXCIke3RoaXMuRE9DX0dFTl9VUkxfRkFMTEJBQ0t9XCJgKTtcbiAgICAgIHRoaXMuRE9DX0dFTl9VUkwgPSB0aGlzLkRPQ19HRU5fVVJMX0ZBTExCQUNLO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZXModGFnPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb2N1bWVudFRlbXBsYXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9YCxcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgLi4uKHRhZyAmJiB7IHRhZyB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGVtcGxhdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH1gLFxuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cHNlcnRUZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBmaWxlPzogRmlsZSxcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXG4gICk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgfVxuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICd0ZW1wbGF0ZScsXG4gICAgICBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUpXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgbGV0IHVybCA9IGAke3RoaXMuU0VSVklDRV9VUkx9YDtcbiAgICBpZiAodGVtcGxhdGUuaWQpIHtcbiAgICAgIHVybCArPSBgLyR7dGVtcGxhdGUuaWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnVwbG9hZCh7XG4gICAgICB1cmwsXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogdGVtcGxhdGUuaWQgPyAncHV0JyA6ICdwb3N0JyxcbiAgICAgIHJlcG9ydFByb2dyZXNzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZVRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9L3Jlc3RvcmVgLFxuICAgICAgbWV0aG9kOiAncGF0Y2gnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb25lVGVtcGxhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzVG9PdmVycmlkZTogUGFydGlhbDxEb2N1bWVudFRlbXBsYXRlPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPHsgY2xvbmVkUmVjb3JkSWQ6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS9jbG9uZS8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BlcnRpZXNUb092ZXJyaWRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZUZpbGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfS9maWxlYCxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZFRlbXBsYXRlRmlsZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH0vZmlsZWAsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJvZHkgfHwgcmVzcG9uc2UpLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZURvY3VtZW50cyhkb2N1bWVudDogQmxvYiwgYXR0YWNobWVudHM6IEFycmF5QnVmZmVyW10pOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XG4gICAgY29uc3QgYm9keSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgIGJvZHkuYXBwZW5kKCdhdHRhY2htZW50cycsIG5ldyBCbG9iKFthdHRhY2htZW50XSkpO1xuICAgIH0pO1xuXG4gICAgYm9keS5hcHBlbmQoJ29yZGVyZm9ybScsIGRvY3VtZW50KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLkRPQ19HRU5fVVJMfS9kb2N1bWVudHMvbWVyZ2VgLCBib2R5LCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVEb2N1bWVudFYyKGJvZHk6IEdlbmVyYXRlRG9jdW1lbnRQYXlsb2FkLCBxdW90ZUlkOiBzdHJpbmcsIGlzQXN5bmM/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgYm9keVsnZG9jZ2VuVVJMJ10gPSB3aW5kb3cuVkVMT19ET0NHRU5fQVBJID8/ICcnO1xuXG4gICAgY29uc3QgcGFyYW1zOiBEaWN0aW9uYXJ5PHN0cmluZz4gPSB7fTtcbiAgICBpZiAoaXNBc3luYykge1xuICAgICAgcGFyYW1zWydhc3luYyddID0gJ3RydWUnO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgICAgdXJsOiBgL2RvY2dlbi8ke3F1b3RlSWR9L2dlbmVyYXRlYCxcbiAgICAgICAgYm9keSxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgICB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcChwZGYgPT4ge1xuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcGRmXSk7XG5cbiAgICAgICAgICBjb25zdCBkb2N1bWVudE5hbWUgPSBib2R5LnBhcmFtZXRlcnNbJ2RvY3VtZW50TmFtZSddID8/ICdWZWxvY2UgUHJvcG9zYWwnO1xuXG4gICAgICAgICAgaWYgKCFpc0FzeW5jKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZFNlcnZpY2UucHJvY2Vzc0Rvd25sb2FkKGJsb2IsIGAke2RvY3VtZW50TmFtZX0uJHtib2R5LmRvY3VtZW50Rm9ybWF0LnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGJsb2I7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRhY2htZW50cyhzZWFyY2hSZXF1ZXN0OiBUZW1wbGF0ZUF0dGFjaG1lbnRTZWFyY2hSZXF1ZXN0KTogT2JzZXJ2YWJsZTxBdHRhY2htZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLmdldEF0dGFjaG1lbnRzKHNlYXJjaFJlcXVlc3QpO1xuICB9XG5cbiAgcHVibGljIGdldEF0dGFjaG1lbnRGaWxlKGlkOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuZ2V0QXR0YWNobWVudEZpbGUoaWQpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCwgZmlsZT86IEZpbGUsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXR0YWNobWVudD4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50LCBmaWxlLCByZXBvcnRQcm9ncmVzcyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQXR0YWNobWVudChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5yZW1vdmVBdHRhY2htZW50KGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURvY3VtZW50RGF0YShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChpc0xlZ2FjeURvY3VtZW50VGVtcGxhdGUodGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeSh0ZW1wbGF0ZSwgb2JqZWN0LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LnJlZHVjZShcbiAgICAgIChhY2MsIHsgbmFtZSwgdmFsdWUgfSkgPT4gKHsgLi4uYWNjLCBbbmFtZV06IHRoaXMubWFwQm9vbGVhbklmQXBsaWNhYmxlKHZhbHVlKSB9KSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICAvKlxuICAgICAgUmVzb2x2ZSBxdW90ZSBhbmQgdGVtcGxhdGUgcHJvcGVydGllcyBmb3Igbm93XG4gICAgICBXaGVuIHByb2NlZHVyZXMgYXJlIHJlYWR5LCB3aGV5IHdpbGwgcmVwbGFjZSB0ZW1wbGF0ZSBzY3JpcHRzLlxuXG4gICAgICBUT0RPOiBydW4gcHJvY2VkdXJlIHRvIHJlc29sdmUgZG9jdW1lbnQgZGF0YVxuICAgICovXG4gICAgcmV0dXJuIG9mKHtcbiAgICAgIC4uLih0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyA/IG9iamVjdCA6IHsgb2JqZWN0IH0pLFxuICAgICAgLi4udGVtcGxhdGVQcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlRG9jdW1lbnQoXG4gICAgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcGFyYW1zOiBEb2N1bWVudEdlbmVyYXRpb25QYXJhbXMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgY29uc3QgZG9jdW1lbnREYXRhJCA9IHRoaXMuZ2VuZXJhdGVEb2N1bWVudERhdGEodGVtcGxhdGUsIG9iamVjdCwgeyAuLi5wYXJhbXMsIHNob3VsZFByZXZlbnREb3dubG9hZDogdHJ1ZSB9KTtcblxuICAgIHJldHVybiB6aXAodGhpcy5nZXRUZW1wbGF0ZUZpbGUodGVtcGxhdGUuaWQpLCBkb2N1bWVudERhdGEkLCB0aGlzLnJlc29sdmVBdHRhY2htZW50cyQodGVtcGxhdGUpKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChbdGVtcGxhdGVGaWxlLCBkYXRhLCBhdHRhY2htZW50c10pID0+IHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBEb2N4VGVtcGxhdGVyLmdlbmVyYXRlKHRlbXBsYXRlRmlsZSwgZGF0YSk7XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXM6IF8uRGljdGlvbmFyeTxzdHJpbmc+ID0gb2JqZWN0Py5jb250ZXh0Py5wcm9wZXJ0aWVzID8/IG9iamVjdD8ucHJvcGVydGllcyA/PyB7fTtcbiAgICAgICAgY29uc3QgZG9jdW1lbnROYW1lID1cbiAgICAgICAgICB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ2RvY3VtZW50TmFtZScpPy52YWx1ZSB8fFxuICAgICAgICAgIHByb3BlcnRpZXNbJ05hbWUnXSB8fFxuICAgICAgICAgIHRlbXBsYXRlLm5hbWU7XG5cbiAgICAgICAgY29uc3QgZG9jdW1lbnRGb3JtYXQgPVxuICAgICAgICAgIHBhcmFtcy5kb2N1bWVudEZvcm1hdCA/PyB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKHAgPT4gcC5uYW1lID09PSAnZG9jdW1lbnRGb3JtYXQnKT8udmFsdWU7XG4gICAgICAgIGlmIChkb2N1bWVudEZvcm1hdCA9PT0gJ0RPQ1gnKSB7XG4gICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChkb2N1bWVudCwgZG9jdW1lbnROYW1lKTtcblxuICAgICAgICAgIHJldHVybiBvZihkb2N1bWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5tZXJnZURvY3VtZW50cyhkb2N1bWVudCwgYXR0YWNobWVudHMpLnBpcGUoXG4gICAgICAgICAgc3dpdGNoTWFwKHBkZiA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW1zLmF0dGFjaFRvUXVvdGUgJiYgUXVvdGVEcmFmdC5pc1F1b3RlKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFtwZGZdLCBgJHtkb2N1bWVudE5hbWV9LnBkZmApO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmNyZWF0ZUF0dGFjaG1lbnQoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtlZEVudGl0eUlkOiBvYmplY3QucXVvdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IGRvY3VtZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUV4dGVuc2lvbjogJ3BkZicsXG4gICAgICAgICAgICAgICAgICAgIHRhZ3M6IHRoaXMuRE9DR0VOX1RBRyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucGlwZShtYXAoKCkgPT4gcGRmKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBvZihwZGYpO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIG1hcChwZGYgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtwZGZdKTtcblxuICAgICAgICAgICAgaWYgKCFwYXJhbXMuc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgYCR7ZG9jdW1lbnROYW1lfS5wZGZgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJsb2I7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNob3VsZFByZXZlbnREb3dubG9hZCA9IHBhcmFtcy5zaG91bGRQcmV2ZW50RG93bmxvYWQ7XG4gICAgY29uc3QgYWxsUXVlcmllczogVGVtcGxhdGVRdWVyeVtdID0gWy4uLih0ZW1wbGF0ZT8ucXVlcmllcyA/PyBbXSldO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IF8uRGljdGlvbmFyeTxzdHJpbmc+ID0gb2JqZWN0Py5jb250ZXh0Py5wcm9wZXJ0aWVzID8/IG9iamVjdD8ucHJvcGVydGllcyA/PyB7fTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9wZXJ0aWVzPy5bJ0FjY291bnRJZCddO1xuICAgIGNvbnN0IHVzZXJJZCA9IHByb3BlcnRpZXM/LlsnVXNlcklkJ107XG5cbiAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICBhbGxRdWVyaWVzLnB1c2goe1xuICAgICAgICBxdWVyeU5hbWU6ICdRdW90ZUFjY291bnRRdWVyeScsXG4gICAgICAgIG9iamVjdE5hbWU6ICdBY2NvdW50JyxcbiAgICAgICAgcmVzdWx0T2JqZWN0TmFtZTogJ2FjY291bnQnLFxuICAgICAgICBzdGF0ZW1lbnQ6IGBJZCA9JyR7YWNjb3VudElkfSdgLFxuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGFsbFF1ZXJpZXMucHVzaCh7XG4gICAgICAgIHF1ZXJ5TmFtZTogJ1F1b3RlVXNlclF1ZXJ5JyxcbiAgICAgICAgb2JqZWN0TmFtZTogJ1VzZXInLFxuICAgICAgICByZXN1bHRPYmplY3ROYW1lOiAnYWdlbnQnLFxuICAgICAgICBzdGF0ZW1lbnQ6IGBJZCA9JyR7dXNlcklkfSdgLFxuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcmllcyA9IGFsbFF1ZXJpZXMubWFwKHF1ZXJ5ID0+IHRoaXMucXVlcnlPYmplY3QocXVlcnksIHsgcHJvcGVydGllcyB9KSkgfHwgW107XG5cbiAgICByZXR1cm4gZm9ya0pvaW4oWy4uLnF1ZXJpZXNdKS5waXBlKFxuICAgICAgZGVmYXVsdElmRW1wdHkoW10gYXMgYW55W10pLFxuICAgICAgbWFwKHJlc3VsdHMgPT4ge1xuICAgICAgICBjb25zdCBxdWVyaWVzUmVzdWx0ID0gXy5jaGFpbihyZXN1bHRzKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgcikgPT4ge1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCAuLi5yIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pXG4gICAgICAgICAgLnZhbHVlKCk7XG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQcm9wZXJ0aWVzID0gKHRlbXBsYXRlPy5wcm9wZXJ0aWVzIHx8IFtdKS5yZWR1Y2UoKHRydW5rLCB7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJ1bmssXG4gICAgICAgICAgICBbbmFtZSBhcyBzdHJpbmddOiB0aGlzLm1hcEJvb2xlYW5JZkFwbGljYWJsZSh2YWx1ZSBhcyBhbnkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgIC4uLih0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyA/IG9iamVjdCA6IHsgb2JqZWN0IH0pLFxuICAgICAgICAgIC4uLnF1ZXJpZXNSZXN1bHQsXG4gICAgICAgICAgLi4udGVtcGxhdGVQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5zY3JpcHQgJiYgdGVtcGxhdGUuc2NyaXB0LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeUZvcm1hdCA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnY3VycmVuY3lGb3JtYXQnKT8udmFsdWUgfHwgJzEuMi0yJztcbiAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gdGVtcGxhdGUucHJvcGVydGllcz8uZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdkYXRlRm9ybWF0Jyk/LnZhbHVlIHx8ICdEL01NTS9ZWVlZJztcbiAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG1vbWVudCh2YWx1ZSkuZm9ybWF0KGRhdGVGb3JtYXQpIDogdmFsdWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3RlbXBsYXRlLnNjcmlwdH1gKSgpO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRyYW5zZm9ybSh7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdXRpbHM6IHtcbiAgICAgICAgICAgICAgbG9kYXNoOiBfLFxuICAgICAgICAgICAgICBjdXJyZW5jeTogKHZhbHVlOiBhbnkpID0+IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLVVTJykudHJhbnNmb3JtKHZhbHVlLCAnVVNEJywgJ3N5bWJvbCcsIGN1cnJlbmN5Rm9ybWF0KSxcbiAgICAgICAgICAgICAgZGF0ZTogZm9ybWF0RGF0ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUb0RheTogZm9ybWF0RGF0ZShEYXRlLm5vdygpIGFzIGFueSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFzaG91bGRQcmV2ZW50RG93bmxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodHJhbnNmb3JtZWREYXRhKV0pO1xuICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChibG9iLCAnZGF0YS5qc29uJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQXR0YWNobWVudHMkKHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcltdPiB7XG4gICAgY29uc3QgYXR0YWNobWVudElkcyA9ICh0ZW1wbGF0ZS5hdHRhY2htZW50cz8ubWFwKCh7IGlkIH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10pID8/IFtdO1xuXG4gICAgaWYgKCFhdHRhY2htZW50SWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ya0pvaW4oYXR0YWNobWVudElkcy5tYXAoaWQgPT4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLmdldEF0dGFjaG1lbnRGaWxlKGlkLCB0cnVlKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBTZlF1ZXJ5UmVzdWx0ID0gPFQ+KGxpbWl0OiBudW1iZXIpID0+XG4gICAgbWFwKChyZWNvcmRzOiBUW10pID0+IHtcbiAgICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgX3Jlc3VsdDogJ05vIFJlY29yZHMgRm91bmQnIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW1pdCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcmVjb3Jkc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZHM7XG4gICAgfSk7XG5cbiAgcHJpdmF0ZSBtYXBCb29sZWFuSWZBcGxpY2FibGUgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcHJpdmF0ZSBxdWVyeU9iamVjdChcbiAgICB7IG9iamVjdE5hbWUsIHJlc3VsdE9iamVjdE5hbWUsIGZpZWxkcywgc3RhdGVtZW50IH06IFRlbXBsYXRlUXVlcnksXG4gICAgeyBwcm9wZXJ0aWVzIH06IEFueVdpdGhQcm9wZXJ0aWVzLFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHBhdHRlcm5MaW1pdCA9IC8oXFxzKmxpbWl0XFxzXFxkKikvaTtcbiAgICBsZXQgbGltaXQgPSAxO1xuICAgIGlmIChzdGF0ZW1lbnQgJiYgcGF0dGVybkxpbWl0LnRlc3Qoc3RhdGVtZW50KSkge1xuICAgICAgY29uc3QgbGltaXRTdHIgPSBzdGF0ZW1lbnQ/Lm1hdGNoKHBhdHRlcm5MaW1pdCk/LlsxXT8udHJpbSgpLnN1YnN0cmluZyg1KS50cmltKCk7XG4gICAgICBpZiAobGltaXRTdHIpIHtcbiAgICAgICAgbGltaXQgPSBOdW1iZXIucGFyc2VJbnQobGltaXRTdHIsIDEwKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKHBhdHRlcm5MaW1pdCwgJycpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3RhdGVtZW50ID0gc3RhdGVtZW50XG4gICAgICA/IFN0cmluZ1V0aWxzLmZpbGxQbGFjZWhvbGRlcnMoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLCAvOlxccyooXFx3W1xcd1xcZF8uXSspL2kpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3QgPSB7XG4gICAgICBza2lwOiAwLFxuICAgICAgY291bnQ6IGxpbWl0LFxuICAgICAgcmF3Q29uZGl0aW9uOiByZXNvbHZlZFN0YXRlbWVudCxcbiAgICAgIC4uLihmaWVsZHM/Lmxlbmd0aCAmJiAhIWZpZWxkc1swXSAmJiB7IGZpZWxkcyB9KSxcbiAgICB9IGFzIFNlYXJjaFJlcXVlc3Q7XG5cbiAgICByZXR1cm4gdGhpcy5zYWxlc2ZvcmNlQXBpU2VydmljZS5xdWVyeShzZWFyY2hSZXF1ZXN0LCBvYmplY3ROYW1lKS5waXBlKFxuICAgICAgdGhpcy5tYXBTZlF1ZXJ5UmVzdWx0KGxpbWl0KSxcbiAgICAgIG1hcCh2YWx1ZSA9PiAoeyBbcmVzdWx0T2JqZWN0TmFtZV06IHZhbHVlIH0pKSxcbiAgICApO1xuICB9XG59XG4iXX0=
|
@@ -1,48 +0,0 @@
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
2
|
-
import { Attachment, BaseHttpService, DocumentTemplate, FileDownloadService, GenerateDocumentPayload, TemplateAttachmentSearchRequest } from '@veloceapps/core';
|
3
|
-
import { Observable } from 'rxjs';
|
4
|
-
import { DocumentAttachmentApiService } from './document-attachment-api.service';
|
5
|
-
import { SalesforceApiService } from './salesforce-api.service';
|
6
|
-
import * as i0 from "@angular/core";
|
7
|
-
export interface DocumentGenerationParams {
|
8
|
-
attachToQuote?: boolean;
|
9
|
-
documentFormat?: 'DOCX';
|
10
|
-
shouldPreventDownload?: boolean;
|
11
|
-
}
|
12
|
-
export declare class DocumentTemplatesApiService {
|
13
|
-
private service;
|
14
|
-
private salesforceApiService;
|
15
|
-
private fileDownloadService;
|
16
|
-
private documentAttachmentService;
|
17
|
-
private http;
|
18
|
-
private readonly SERVICE_URL;
|
19
|
-
readonly DOCGEN_TAG = "docgen";
|
20
|
-
private readonly DOC_GEN_URL_FALLBACK;
|
21
|
-
private readonly DOC_GEN_URL;
|
22
|
-
constructor(service: BaseHttpService, salesforceApiService: SalesforceApiService, fileDownloadService: FileDownloadService, documentAttachmentService: DocumentAttachmentApiService, http: HttpClient);
|
23
|
-
getTemplates(tag?: string): Observable<DocumentTemplate[]>;
|
24
|
-
getTemplate(id: string): Observable<DocumentTemplate>;
|
25
|
-
upsertTemplate(template: DocumentTemplate, file?: File, reportProgress?: boolean): Observable<DocumentTemplate>;
|
26
|
-
removeTemplate(id: string): Observable<DocumentTemplate>;
|
27
|
-
restoreTemplate(id: string): Observable<void>;
|
28
|
-
cloneTemplate(id: string, propertiesToOverride?: Partial<DocumentTemplate>): Observable<{
|
29
|
-
clonedRecordId: string;
|
30
|
-
}>;
|
31
|
-
getTemplateFile(id: string): Observable<ArrayBuffer>;
|
32
|
-
downloadTemplateFile(id: string): Observable<Blob>;
|
33
|
-
mergeDocuments(document: Blob, attachments: ArrayBuffer[]): Observable<ArrayBuffer>;
|
34
|
-
generateDocumentV2(body: GenerateDocumentPayload, quoteId: string, isAsync?: boolean): Observable<Blob>;
|
35
|
-
getAttachments(searchRequest: TemplateAttachmentSearchRequest): Observable<Attachment[]>;
|
36
|
-
getAttachmentFile(id: string): any;
|
37
|
-
createAttachment(attachment: Attachment, file?: File, reportProgress?: boolean): Observable<Attachment>;
|
38
|
-
removeAttachment(id: string): Observable<unknown>;
|
39
|
-
generateDocumentData(template: DocumentTemplate, object: any, params?: DocumentGenerationParams): Observable<any>;
|
40
|
-
generateDocument(template: DocumentTemplate, object: any, params?: DocumentGenerationParams): Observable<Blob>;
|
41
|
-
private generateDocumentDataLegacy;
|
42
|
-
private resolveAttachments$;
|
43
|
-
private mapSfQueryResult;
|
44
|
-
private mapBooleanIfAplicable;
|
45
|
-
private queryObject;
|
46
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<DocumentTemplatesApiService, never>;
|
47
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<DocumentTemplatesApiService>;
|
48
|
-
}
|