@veloceapps/api 9.0.0-13 → 9.0.0-15

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.
@@ -1,6 +1,6 @@
1
1
  import { CurrencyPipe } from '@angular/common';
2
2
  import { Injectable } from '@angular/core';
3
- import { DocxTemplater, isLegacyDocumentTemplate, StringUtils, } from '@veloceapps/core';
3
+ import { DocxTemplater, isLegacyDocumentTemplate, QuoteDraft, StringUtils, } from '@veloceapps/core';
4
4
  import * as _ from 'lodash';
5
5
  import moment from 'moment';
6
6
  import { forkJoin, of, zip } from 'rxjs';
@@ -133,23 +133,27 @@ export class DocumentTemplatesApiService {
133
133
  responseType: 'arraybuffer',
134
134
  });
135
135
  }
136
- generateDocumentRequest(document, attachments, quoteId, isAsync) {
137
- const formData = new FormData();
138
- attachments.forEach(attachment => {
139
- formData.append('attachments', new Blob([attachment]));
140
- });
141
- formData.append('orderform', document);
136
+ generateDocumentV2(body, quoteId, isAsync) {
142
137
  const params = {};
143
138
  if (isAsync) {
144
139
  params['async'] = 'true';
145
140
  }
146
- return this.service.upload({
141
+ return this.service
142
+ .api({
147
143
  method: 'post',
148
144
  url: `/docgen/${quoteId}/generate`,
149
- body: formData,
145
+ body,
150
146
  params,
151
147
  responseType: 'arraybuffer',
152
- });
148
+ })
149
+ .pipe(map(pdf => {
150
+ const blob = new Blob([pdf]);
151
+ const documentName = body.parameters['documentName'] ?? 'Veloce Proposal';
152
+ if (!isAsync) {
153
+ this.fileDownloadService.processDownload(blob, `${documentName}.${body.documentFormat.toLowerCase()}`);
154
+ }
155
+ return blob;
156
+ }));
153
157
  }
154
158
  getAttachments(searchRequest) {
155
159
  return this.documentAttachmentService.getAttachments(searchRequest);
@@ -179,7 +183,10 @@ export class DocumentTemplatesApiService {
179
183
  ...templateProperties,
180
184
  });
181
185
  }
182
- generateDocument(template, object, params = {}, quoteId, isAsync) {
186
+ /**
187
+ * @deprecated
188
+ */
189
+ generateDocument(template, object, params = {}) {
183
190
  const documentData$ = this.generateDocumentData(template, object, { ...params, shouldPreventDownload: true });
184
191
  return zip(this.getTemplateFile(template.id), documentData$, this.resolveAttachments$(template)).pipe(switchMap(([templateFile, data, attachments]) => {
185
192
  const document = DocxTemplater.generate(templateFile, data);
@@ -192,9 +199,22 @@ export class DocumentTemplatesApiService {
192
199
  this.fileDownloadService.processDownload(document, documentName);
193
200
  return of(document);
194
201
  }
195
- return this.generateDocumentRequest(document, attachments, quoteId, isAsync).pipe(map(pdf => {
202
+ return this.mergeDocuments(document, attachments).pipe(switchMap(pdf => {
203
+ if (params.attachToQuote && QuoteDraft.isQuote(object)) {
204
+ const file = new File([pdf], `${documentName}.pdf`);
205
+ return this.documentAttachmentService
206
+ .createAttachment({
207
+ linkedEntityId: object.quoteId,
208
+ fileName: documentName,
209
+ fileExtension: 'pdf',
210
+ tags: this.DOCGEN_TAG,
211
+ }, file)
212
+ .pipe(map(() => pdf));
213
+ }
214
+ return of(pdf);
215
+ }), map(pdf => {
196
216
  const blob = new Blob([pdf]);
197
- if (!isAsync && !params.shouldPreventDownload) {
217
+ if (!params.shouldPreventDownload) {
198
218
  this.fileDownloadService.processDownload(blob, `${documentName}.pdf`);
199
219
  }
200
220
  return blob;
@@ -305,4 +325,4 @@ DocumentTemplatesApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "1
305
325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DocumentTemplatesApiService, decorators: [{
306
326
  type: Injectable
307
327
  }], ctorParameters: function () { return [{ type: i1.BaseHttpService }, { type: i2.SalesforceApiService }, { type: i1.FileDownloadService }, { type: i3.DocumentAttachmentApiService }, { type: i4.HttpClient }]; } });
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGVzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvc3JjL2xpYi9zZXJ2aWNlcy9kb2N1bWVudC10ZW1wbGF0ZXMtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUtMLGFBQWEsRUFFYix3QkFBd0IsRUFFeEIsV0FBVyxHQUlaLE1BQU0sa0JBQWtCLENBQUM7QUFDMUIsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQWFyRSxNQUFNLE9BQU8sMkJBQTJCO0lBTXRDLFlBQ1UsT0FBd0IsRUFDeEIsb0JBQTBDLEVBQzFDLG1CQUF3QyxFQUN4Qyx5QkFBdUQsRUFDdkQsSUFBZ0I7UUFKaEIsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUMxQyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBOEI7UUFDdkQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVZULGdCQUFXLEdBQUcsWUFBWSxDQUFDO1FBQzVCLGVBQVUsR0FBRyxRQUFRLENBQUM7UUFDckIseUJBQW9CLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxTQUFTLENBQUM7UUFtVjVELHFCQUFnQixHQUFH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QUUsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUNoQyxDQUFDO1FBRW5CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUNwRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQzVCLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUM5QyxDQUFDO0lBQ0osQ0FBQzs7d0hBNVlVLDJCQUEyQjs0SEFBM0IsMkJBQTJCOzJGQUEzQiwyQkFBMkI7a0JBRHZDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDdXJyZW5jeVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIEFueVdpdGhQcm9wZXJ0aWVzLFxuICBBdHRhY2htZW50LFxuICBCYXNlSHR0cFNlcnZpY2UsXG4gIERvY3VtZW50VGVtcGxhdGUsXG4gIERvY3hUZW1wbGF0ZXIsXG4gIEZpbGVEb3dubG9hZFNlcnZpY2UsXG4gIGlzTGVnYWN5RG9jdW1lbnRUZW1wbGF0ZSxcbiAgU2VhcmNoUmVxdWVzdCxcbiAgU3RyaW5nVXRpbHMsXG4gIFRlbXBsYXRlQXR0YWNobWVudFNlYXJjaFJlcXVlc3QsXG4gIFRlbXBsYXRlUXVlcnksXG4gIFZsV2luZG93LFxufSBmcm9tICdAdmVsb2NlYXBwcy9jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IERpY3Rpb25hcnkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mLCB6aXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlZmF1bHRJZkVtcHR5LCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRG9jdW1lbnRBdHRhY2htZW50QXBpU2VydmljZSB9IGZyb20gJy4vZG9jdW1lbnQtYXR0YWNobWVudC1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBTYWxlc2ZvcmNlQXBpU2VydmljZSB9IGZyb20gJy4vc2FsZXNmb3JjZS1hcGkuc2VydmljZSc7XG5cbmRlY2xhcmUgY29uc3Qgd2luZG93OiBWbFdpbmRvdztcblxuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudEdlbmVyYXRpb25QYXJhbXMge1xuICBhdHRhY2hUb1F1b3RlPzogYm9vbGVhbjtcbiAgZG9jdW1lbnRGb3JtYXQ/OiAnRE9DWCc7XG4gIHNob3VsZFByZXZlbnREb3dubG9hZD86IGJvb2xlYW47XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEb2N1bWVudFRlbXBsYXRlc0FwaVNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IFNFUlZJQ0VfVVJMID0gJy90ZW1wbGF0ZXMnO1xuICBwdWJsaWMgcmVhZG9ubHkgRE9DR0VOX1RBRyA9ICdkb2NnZW4nO1xuICBwcml2YXRlIHJlYWRvbmx5IERPQ19HRU5fVVJMX0ZBTExCQUNLID0gYCR7d2luZG93LlZFTE9fQVBJfS9kb2NnZW5gO1xuICBwcml2YXRlIHJlYWRvbmx5IERPQ19HRU5fVVJMO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2VydmljZTogQmFzZUh0dHBTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FsZXNmb3JjZUFwaVNlcnZpY2U6IFNhbGVzZm9yY2VBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsZURvd25sb2FkU2VydmljZTogRmlsZURvd25sb2FkU2VydmljZSxcbiAgICBwcml2YXRlIGRvY3VtZW50QXR0YWNobWVudFNlcnZpY2U6IERvY3VtZW50QXR0YWNobWVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICApIHtcbiAgICBpZiAod2luZG93LlZFTE9fRE9DR0VOX0FQSSkge1xuICAgICAgdGhpcy5ET0NfR0VOX1VSTCA9IHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGB3aW5kb3cuVkVMT19ET0NHRU5fQVBJIG5vdCBzZXQsIHdpbGwgdXNlIGZhbGxiYWNrIFwiJHt0aGlzLkRPQ19HRU5fVVJMX0ZBTExCQUNLfVwiYCk7XG4gICAgICB0aGlzLkRPQ19HRU5fVVJMID0gdGhpcy5ET0NfR0VOX1VSTF9GQUxMQkFDSztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VGVtcGxhdGVzKHRhZz86IHN0cmluZyk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfWAsXG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIC4uLih0YWcgJiYgeyB0YWcgfSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdXBzZXJ0VGVtcGxhdGUoXG4gICAgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsXG4gICAgZmlsZT86IEZpbGUsXG4gICAgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLFxuICApOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICBjb25zdCBmb3JtRGF0YTogRm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIGlmIChmaWxlKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xuICAgIH1cbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICAndGVtcGxhdGUnLFxuICAgICAgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHRlbXBsYXRlKV0sIHtcbiAgICAgICAgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGxldCB1cmwgPSBgJHt0aGlzLlNFUlZJQ0VfVVJMfWA7XG4gICAgaWYgKHRlbXBsYXRlLmlkKSB7XG4gICAgICB1cmwgKz0gYC8ke3RlbXBsYXRlLmlkfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS51cGxvYWQoe1xuICAgICAgdXJsLFxuICAgICAgYm9keTogZm9ybURhdGEsXG4gICAgICBtZXRob2Q6IHRlbXBsYXRlLmlkID8gJ3B1dCcgOiAncG9zdCcsXG4gICAgICByZXBvcnRQcm9ncmVzcyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVUZW1wbGF0ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb2N1bWVudFRlbXBsYXRlPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdkZWxldGUnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc3RvcmVUZW1wbGF0ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfS9yZXN0b3JlYCxcbiAgICAgIG1ldGhvZDogJ3BhdGNoJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZVRlbXBsYXRlKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcGVydGllc1RvT3ZlcnJpZGU6IFBhcnRpYWw8RG9jdW1lbnRUZW1wbGF0ZT4gPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTx7IGNsb25lZFJlY29yZElkOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vY2xvbmUvJHtpZH1gLFxuICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICBib2R5OiB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm9wZXJ0aWVzVG9PdmVycmlkZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGVtcGxhdGVGaWxlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH0vZmlsZWAsXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRUZW1wbGF0ZUZpbGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QmxvYj4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VcbiAgICAgIC5hcGkoe1xuICAgICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9L2ZpbGVgLFxuICAgICAgICByZXNwb25zZVR5cGU6ICdibG9iJyxcbiAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZFNlcnZpY2UucHJvY2Vzc0Rvd25sb2FkKHJlc3BvbnNlKTtcbiAgICAgICAgfSksXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiByZXNwb25zZS5ib2R5IHx8IHJlc3BvbnNlKSxcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBtZXJnZURvY3VtZW50cyhkb2N1bWVudDogQmxvYiwgYXR0YWNobWVudHM6IEFycmF5QnVmZmVyW10pOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XG4gICAgY29uc3QgYm9keSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgIGJvZHkuYXBwZW5kKCdhdHRhY2htZW50cycsIG5ldyBCbG9iKFthdHRhY2htZW50XSkpO1xuICAgIH0pO1xuXG4gICAgYm9keS5hcHBlbmQoJ29yZGVyZm9ybScsIGRvY3VtZW50KTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLkRPQ19HRU5fVVJMfS9kb2N1bWVudHMvbWVyZ2VgLCBib2R5LCB7XG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVEb2N1bWVudFJlcXVlc3QoXG4gICAgZG9jdW1lbnQ6IEJsb2IsXG4gICAgYXR0YWNobWVudHM6IEFycmF5QnVmZmVyW10sXG4gICAgcXVvdGVJZDogc3RyaW5nLFxuICAgIGlzQXN5bmM/OiBib29sZWFuLFxuICApOiBPYnNlcnZhYmxlPEFycmF5QnVmZmVyPiB7XG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2F0dGFjaG1lbnRzJywgbmV3IEJsb2IoW2F0dGFjaG1lbnRdKSk7XG4gICAgfSk7XG5cbiAgICBmb3JtRGF0YS5hcHBlbmQoJ29yZGVyZm9ybScsIGRvY3VtZW50KTtcblxuICAgIGNvbnN0IHBhcmFtczogRGljdGlvbmFyeTxzdHJpbmc+ID0ge307XG4gICAgaWYgKGlzQXN5bmMpIHtcbiAgICAgIHBhcmFtc1snYXN5bmMnXSA9ICd0cnVlJztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnVwbG9hZCh7XG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIHVybDogYC9kb2NnZW4vJHtxdW90ZUlkfS9nZW5lcmF0ZWAsXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRhY2htZW50cyhzZWFyY2hSZXF1ZXN0OiBUZW1wbGF0ZUF0dGFjaG1lbnRTZWFyY2hSZXF1ZXN0KTogT2JzZXJ2YWJsZTxBdHRhY2htZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLmdldEF0dGFjaG1lbnRzKHNlYXJjaFJlcXVlc3QpO1xuICB9XG5cbiAgcHVibGljIGdldEF0dGFjaG1lbnRGaWxlKGlkOiBzdHJpbmcpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuZ2V0QXR0YWNobWVudEZpbGUoaWQpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUF0dGFjaG1lbnQoYXR0YWNobWVudDogQXR0YWNobWVudCwgZmlsZT86IEZpbGUsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbik6IE9ic2VydmFibGU8QXR0YWNobWVudD4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50LCBmaWxlLCByZXBvcnRQcm9ncmVzcyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQXR0YWNobWVudChpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5yZW1vdmVBdHRhY2htZW50KGlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURvY3VtZW50RGF0YShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmIChpc0xlZ2FjeURvY3VtZW50VGVtcGxhdGUodGVtcGxhdGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeSh0ZW1wbGF0ZSwgb2JqZWN0LCBwYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LnJlZHVjZShcbiAgICAgIChhY2MsIHsgbmFtZSwgdmFsdWUgfSkgPT4gKHsgLi4uYWNjLCBbbmFtZV06IHRoaXMubWFwQm9vbGVhbklmQXBsaWNhYmxlKHZhbHVlKSB9KSxcbiAgICAgIHt9LFxuICAgICk7XG5cbiAgICAvKlxuICAgICAgUmVzb2x2ZSBxdW90ZSBhbmQgdGVtcGxhdGUgcHJvcGVydGllcyBmb3Igbm93XG4gICAgICBXaGVuIHByb2NlZHVyZXMgYXJlIHJlYWR5LCB3aGV5IHdpbGwgcmVwbGFjZSB0ZW1wbGF0ZSBzY3JpcHRzLlxuXG4gICAgICBUT0RPOiBydW4gcHJvY2VkdXJlIHRvIHJlc29sdmUgZG9jdW1lbnQgZGF0YVxuICAgICovXG4gICAgcmV0dXJuIG9mKHtcbiAgICAgIC4uLih0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyA/IG9iamVjdCA6IHsgb2JqZWN0IH0pLFxuICAgICAgLi4udGVtcGxhdGVQcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlRG9jdW1lbnQoXG4gICAgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcGFyYW1zOiBEb2N1bWVudEdlbmVyYXRpb25QYXJhbXMgPSB7fSxcbiAgICBxdW90ZUlkOiBzdHJpbmcsXG4gICAgaXNBc3luYz86IGJvb2xlYW4sXG4gICk6IE9ic2VydmFibGU8QmxvYj4ge1xuICAgIGNvbnN0IGRvY3VtZW50RGF0YSQgPSB0aGlzLmdlbmVyYXRlRG9jdW1lbnREYXRhKHRlbXBsYXRlLCBvYmplY3QsIHsgLi4ucGFyYW1zLCBzaG91bGRQcmV2ZW50RG93bmxvYWQ6IHRydWUgfSk7XG5cbiAgICByZXR1cm4gemlwKHRoaXMuZ2V0VGVtcGxhdGVGaWxlKHRlbXBsYXRlLmlkKSwgZG9jdW1lbnREYXRhJCwgdGhpcy5yZXNvbHZlQXR0YWNobWVudHMkKHRlbXBsYXRlKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW3RlbXBsYXRlRmlsZSwgZGF0YSwgYXR0YWNobWVudHNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gRG9jeFRlbXBsYXRlci5nZW5lcmF0ZSh0ZW1wbGF0ZUZpbGUsIGRhdGEpO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzOiBfLkRpY3Rpb25hcnk8c3RyaW5nPiA9IG9iamVjdD8uY29udGV4dD8ucHJvcGVydGllcyA/PyBvYmplY3Q/LnByb3BlcnRpZXMgPz8ge307XG4gICAgICAgIGNvbnN0IGRvY3VtZW50TmFtZSA9XG4gICAgICAgICAgdGVtcGxhdGUucHJvcGVydGllcz8uZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdkb2N1bWVudE5hbWUnKT8udmFsdWUgfHxcbiAgICAgICAgICBwcm9wZXJ0aWVzWydOYW1lJ10gfHxcbiAgICAgICAgICB0ZW1wbGF0ZS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Rm9ybWF0ID1cbiAgICAgICAgICBwYXJhbXMuZG9jdW1lbnRGb3JtYXQgPz8gdGVtcGxhdGUucHJvcGVydGllcz8uZmluZChwID0+IHAubmFtZSA9PT0gJ2RvY3VtZW50Rm9ybWF0Jyk/LnZhbHVlO1xuICAgICAgICBpZiAoZG9jdW1lbnRGb3JtYXQgPT09ICdET0NYJykge1xuICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoZG9jdW1lbnQsIGRvY3VtZW50TmFtZSk7XG5cbiAgICAgICAgICByZXR1cm4gb2YoZG9jdW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEb2N1bWVudFJlcXVlc3QoZG9jdW1lbnQsIGF0dGFjaG1lbnRzLCBxdW90ZUlkLCBpc0FzeW5jKS5waXBlKFxuICAgICAgICAgIG1hcChwZGYgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtwZGZdKTtcblxuICAgICAgICAgICAgaWYgKCFpc0FzeW5jICYmICFwYXJhbXMuc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgYCR7ZG9jdW1lbnROYW1lfS5wZGZgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGJsb2I7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZURvY3VtZW50RGF0YUxlZ2FjeShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBvYmplY3Q6IGFueSxcbiAgICBwYXJhbXM6IERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyA9IHt9LFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHNob3VsZFByZXZlbnREb3dubG9hZCA9IHBhcmFtcy5zaG91bGRQcmV2ZW50RG93bmxvYWQ7XG4gICAgY29uc3QgYWxsUXVlcmllczogVGVtcGxhdGVRdWVyeVtdID0gWy4uLih0ZW1wbGF0ZT8ucXVlcmllcyA/PyBbXSldO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IF8uRGljdGlvbmFyeTxzdHJpbmc+ID0gb2JqZWN0Py5jb250ZXh0Py5wcm9wZXJ0aWVzID8/IG9iamVjdD8ucHJvcGVydGllcyA/PyB7fTtcbiAgICBjb25zdCBhY2NvdW50SWQgPSBwcm9wZXJ0aWVzPy5bJ0FjY291bnRJZCddO1xuICAgIGNvbnN0IHVzZXJJZCA9IHByb3BlcnRpZXM/LlsnVXNlcklkJ107XG5cbiAgICBpZiAoYWNjb3VudElkKSB7XG4gICAgICBhbGxRdWVyaWVzLnB1c2goe1xuICAgICAgICBxdWVyeU5hbWU6ICdRdW90ZUFjY291bnRRdWVyeScsXG4gICAgICAgIG9iamVjdE5hbWU6ICdBY2NvdW50JyxcbiAgICAgICAgcmVzdWx0T2JqZWN0TmFtZTogJ2FjY291bnQnLFxuICAgICAgICBzdGF0ZW1lbnQ6IGBJZCA9JyR7YWNjb3VudElkfSdgLFxuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh1c2VySWQpIHtcbiAgICAgIGFsbFF1ZXJpZXMucHVzaCh7XG4gICAgICAgIHF1ZXJ5TmFtZTogJ1F1b3RlVXNlclF1ZXJ5JyxcbiAgICAgICAgb2JqZWN0TmFtZTogJ1VzZXInLFxuICAgICAgICByZXN1bHRPYmplY3ROYW1lOiAnYWdlbnQnLFxuICAgICAgICBzdGF0ZW1lbnQ6IGBJZCA9JyR7dXNlcklkfSdgLFxuICAgICAgICBmaWVsZHM6IFtdLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcmllcyA9IGFsbFF1ZXJpZXMubWFwKHF1ZXJ5ID0+IHRoaXMucXVlcnlPYmplY3QocXVlcnksIHsgcHJvcGVydGllcyB9KSkgfHwgW107XG5cbiAgICByZXR1cm4gZm9ya0pvaW4oWy4uLnF1ZXJpZXNdKS5waXBlKFxuICAgICAgZGVmYXVsdElmRW1wdHkoW10gYXMgYW55W10pLFxuICAgICAgbWFwKHJlc3VsdHMgPT4ge1xuICAgICAgICBjb25zdCBxdWVyaWVzUmVzdWx0ID0gXy5jaGFpbihyZXN1bHRzKVxuICAgICAgICAgIC5yZWR1Y2UoKGFjYywgcikgPT4ge1xuICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYWNjLCAuLi5yIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pXG4gICAgICAgICAgLnZhbHVlKCk7XG5cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQcm9wZXJ0aWVzID0gKHRlbXBsYXRlPy5wcm9wZXJ0aWVzIHx8IFtdKS5yZWR1Y2UoKHRydW5rLCB7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4udHJ1bmssXG4gICAgICAgICAgICBbbmFtZSBhcyBzdHJpbmddOiB0aGlzLm1hcEJvb2xlYW5JZkFwbGljYWJsZSh2YWx1ZSBhcyBhbnkpLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgIC4uLih0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyA/IG9iamVjdCA6IHsgb2JqZWN0IH0pLFxuICAgICAgICAgIC4uLnF1ZXJpZXNSZXN1bHQsXG4gICAgICAgICAgLi4udGVtcGxhdGVQcm9wZXJ0aWVzLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5zY3JpcHQgJiYgdGVtcGxhdGUuc2NyaXB0LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW5jeUZvcm1hdCA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnY3VycmVuY3lGb3JtYXQnKT8udmFsdWUgfHwgJzEuMi0yJztcbiAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0ID0gdGVtcGxhdGUucHJvcGVydGllcz8uZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdkYXRlRm9ybWF0Jyk/LnZhbHVlIHx8ICdEL01NTS9ZWVlZJztcbiAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG1vbWVudCh2YWx1ZSkuZm9ybWF0KGRhdGVGb3JtYXQpIDogdmFsdWU7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke3RlbXBsYXRlLnNjcmlwdH1gKSgpO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRyYW5zZm9ybSh7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgdXRpbHM6IHtcbiAgICAgICAgICAgICAgbG9kYXNoOiBfLFxuICAgICAgICAgICAgICBjdXJyZW5jeTogKHZhbHVlOiBhbnkpID0+IG5ldyBDdXJyZW5jeVBpcGUoJ2VuLVVTJykudHJhbnNmb3JtKHZhbHVlLCAnVVNEJywgJ3N5bWJvbCcsIGN1cnJlbmN5Rm9ybWF0KSxcbiAgICAgICAgICAgICAgZGF0ZTogZm9ybWF0RGF0ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBUb0RheTogZm9ybWF0RGF0ZShEYXRlLm5vdygpIGFzIGFueSksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKCFzaG91bGRQcmV2ZW50RG93bmxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodHJhbnNmb3JtZWREYXRhKV0pO1xuICAgICAgICAgICAgdGhpcy5maWxlRG93bmxvYWRTZXJ2aWNlLnByb2Nlc3NEb3dubG9hZChibG9iLCAnZGF0YS5qc29uJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lZERhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQXR0YWNobWVudHMkKHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlKTogT2JzZXJ2YWJsZTxBcnJheUJ1ZmZlcltdPiB7XG4gICAgY29uc3QgYXR0YWNobWVudElkcyA9ICh0ZW1wbGF0ZS5hdHRhY2htZW50cz8ubWFwKCh7IGlkIH0pID0+IGlkKS5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW10pID8/IFtdO1xuXG4gICAgaWYgKCFhdHRhY2htZW50SWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm9ya0pvaW4oYXR0YWNobWVudElkcy5tYXAoaWQgPT4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLmdldEF0dGFjaG1lbnRGaWxlKGlkLCB0cnVlKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBTZlF1ZXJ5UmVzdWx0ID0gPFQ+KGxpbWl0OiBudW1iZXIpID0+XG4gICAgbWFwKChyZWNvcmRzOiBUW10pID0+IHtcbiAgICAgIGlmICghcmVjb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHsgX3Jlc3VsdDogJ05vIFJlY29yZHMgRm91bmQnIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChsaW1pdCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gcmVjb3Jkc1swXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZHM7XG4gICAgfSk7XG5cbiAgcHJpdmF0ZSBtYXBCb29sZWFuSWZBcGxpY2FibGUgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcHJpdmF0ZSBxdWVyeU9iamVjdChcbiAgICB7IG9iamVjdE5hbWUsIHJlc3VsdE9iamVjdE5hbWUsIGZpZWxkcywgc3RhdGVtZW50IH06IFRlbXBsYXRlUXVlcnksXG4gICAgeyBwcm9wZXJ0aWVzIH06IEFueVdpdGhQcm9wZXJ0aWVzLFxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHBhdHRlcm5MaW1pdCA9IC8oXFxzKmxpbWl0XFxzXFxkKikvaTtcbiAgICBsZXQgbGltaXQgPSAxO1xuICAgIGlmIChzdGF0ZW1lbnQgJiYgcGF0dGVybkxpbWl0LnRlc3Qoc3RhdGVtZW50KSkge1xuICAgICAgY29uc3QgbGltaXRTdHIgPSBzdGF0ZW1lbnQ/Lm1hdGNoKHBhdHRlcm5MaW1pdCk/LlsxXT8udHJpbSgpLnN1YnN0cmluZyg1KS50cmltKCk7XG4gICAgICBpZiAobGltaXRTdHIpIHtcbiAgICAgICAgbGltaXQgPSBOdW1iZXIucGFyc2VJbnQobGltaXRTdHIsIDEwKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudC5yZXBsYWNlKHBhdHRlcm5MaW1pdCwgJycpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkU3RhdGVtZW50ID0gc3RhdGVtZW50XG4gICAgICA/IFN0cmluZ1V0aWxzLmZpbGxQbGFjZWhvbGRlcnMoc3RhdGVtZW50LCBwcm9wZXJ0aWVzLCAvOlxccyooXFx3W1xcd1xcZF8uXSspL2kpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3QgPSB7XG4gICAgICBza2lwOiAwLFxuICAgICAgY291bnQ6IGxpbWl0LFxuICAgICAgcmF3Q29uZGl0aW9uOiByZXNvbHZlZFN0YXRlbWVudCxcbiAgICAgIC4uLihmaWVsZHM/Lmxlbmd0aCAmJiAhIWZpZWxkc1swXSAmJiB7IGZpZWxkcyB9KSxcbiAgICB9IGFzIFNlYXJjaFJlcXVlc3Q7XG5cbiAgICByZXR1cm4gdGhpcy5zYWxlc2ZvcmNlQXBpU2VydmljZS5xdWVyeShzZWFyY2hSZXF1ZXN0LCBvYmplY3ROYW1lKS5waXBlKFxuICAgICAgdGhpcy5tYXBTZlF1ZXJ5UmVzdWx0KGxpbWl0KSxcbiAgICAgIG1hcCh2YWx1ZSA9PiAoeyBbcmVzdWx0T2JqZWN0TmFtZV06IHZhbHVlIH0pKSxcbiAgICApO1xuICB9XG59XG4iXX0=
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQtdGVtcGxhdGVzLWFwaS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hcGkvc3JjL2xpYi9zZXJ2aWNlcy9kb2N1bWVudC10ZW1wbGF0ZXMtYXBpLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUtMLGFBQWEsRUFHYix3QkFBd0IsRUFDeEIsVUFBVSxFQUVWLFdBQVcsR0FJWixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFhckUsTUFBTSxPQUFPLDJCQUEyQjtJQU10QyxZQUNVLE9BQXdCLEVBQ3hCLG9CQUEwQyxFQUMxQyxtQkFBd0MsRUFDeEMseUJBQXVELEVBQ3ZELElBQWdCO1FBSmhCLFlBQU8sR0FBUCxPQUFPLENBQWlCO1FBQ3hCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyw4QkFBeUIsR0FBekIseUJBQXlCLENBQThCO1FBQ3ZELFNBQUksR0FBSixJQUFJLENBQVk7UUFWVCxnQkFBVyxHQUFHLFlBQVksQ0FBQztRQUM1QixlQUFVLEdBQUcsUUFBUSxDQUFDO1FBQ3JCLHlCQUFvQixHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsU0FBUyxDQUFDO1FBdVc1RCxx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OlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge1xuICBBbnlXaXRoUHJvcGVydGllcyxcbiAgQXR0YWNobWVudCxcbiAgQmFzZUh0dHBTZXJ2aWNlLFxuICBEb2N1bWVudFRlbXBsYXRlLFxuICBEb2N4VGVtcGxhdGVyLFxuICBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICBHZW5lcmF0ZURvY3VtZW50UGF5bG9hZCxcbiAgaXNMZWdhY3lEb2N1bWVudFRlbXBsYXRlLFxuICBRdW90ZURyYWZ0LFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTdHJpbmdVdGlscyxcbiAgVGVtcGxhdGVBdHRhY2htZW50U2VhcmNoUmVxdWVzdCxcbiAgVGVtcGxhdGVRdWVyeSxcbiAgVmxXaW5kb3csXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2NvcmUnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YsIHppcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIG1hcCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEb2N1bWVudEF0dGFjaG1lbnRBcGlTZXJ2aWNlIH0gZnJvbSAnLi9kb2N1bWVudC1hdHRhY2htZW50LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFNhbGVzZm9yY2VBcGlTZXJ2aWNlIH0gZnJvbSAnLi9zYWxlc2ZvcmNlLWFwaS5zZXJ2aWNlJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFZsV2luZG93O1xuXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50R2VuZXJhdGlvblBhcmFtcyB7XG4gIGF0dGFjaFRvUXVvdGU/OiBib29sZWFuO1xuICBkb2N1bWVudEZvcm1hdD86ICdET0NYJztcbiAgc2hvdWxkUHJldmVudERvd25sb2FkPzogYm9vbGVhbjtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY3VtZW50VGVtcGxhdGVzQXBpU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0VSVklDRV9VUkwgPSAnL3RlbXBsYXRlcyc7XG4gIHB1YmxpYyByZWFkb25seSBET0NHRU5fVEFHID0gJ2RvY2dlbic7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkxfRkFMTEJBQ0sgPSBgJHt3aW5kb3cuVkVMT19BUEl9L2RvY2dlbmA7XG4gIHByaXZhdGUgcmVhZG9ubHkgRE9DX0dFTl9VUkw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBCYXNlSHR0cFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzYWxlc2ZvcmNlQXBpU2VydmljZTogU2FsZXNmb3JjZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmaWxlRG93bmxvYWRTZXJ2aWNlOiBGaWxlRG93bmxvYWRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRBdHRhY2htZW50U2VydmljZTogRG9jdW1lbnRBdHRhY2htZW50QXBpU2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICkge1xuICAgIGlmICh3aW5kb3cuVkVMT19ET0NHRU5fQVBJKSB7XG4gICAgICB0aGlzLkRPQ19HRU5fVVJMID0gd2luZG93LlZFTE9fRE9DR0VOX0FQSTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coYHdpbmRvdy5WRUxPX0RPQ0dFTl9BUEkgbm90IHNldCwgd2lsbCB1c2UgZmFsbGJhY2sgXCIke3RoaXMuRE9DX0dFTl9VUkxfRkFMTEJBQ0t9XCJgKTtcbiAgICAgIHRoaXMuRE9DX0dFTl9VUkwgPSB0aGlzLkRPQ19HRU5fVVJMX0ZBTExCQUNLO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZXModGFnPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxEb2N1bWVudFRlbXBsYXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9YCxcbiAgICAgIG1ldGhvZDogJ2dldCcsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgLi4uKHRhZyAmJiB7IHRhZyB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VGVtcGxhdGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZT4ge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuYXBpKHtcbiAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH1gLFxuICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cHNlcnRUZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSxcbiAgICBmaWxlPzogRmlsZSxcbiAgICByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sXG4gICk6IE9ic2VydmFibGU8RG9jdW1lbnRUZW1wbGF0ZT4ge1xuICAgIGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuXG4gICAgaWYgKGZpbGUpIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XG4gICAgfVxuICAgIGZvcm1EYXRhLmFwcGVuZChcbiAgICAgICd0ZW1wbGF0ZScsXG4gICAgICBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkodGVtcGxhdGUpXSwge1xuICAgICAgICB0eXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgbGV0IHVybCA9IGAke3RoaXMuU0VSVklDRV9VUkx9YDtcbiAgICBpZiAodGVtcGxhdGUuaWQpIHtcbiAgICAgIHVybCArPSBgLyR7dGVtcGxhdGUuaWR9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLnVwbG9hZCh7XG4gICAgICB1cmwsXG4gICAgICBib2R5OiBmb3JtRGF0YSxcbiAgICAgIG1ldGhvZDogdGVtcGxhdGUuaWQgPyAncHV0JyA6ICdwb3N0JyxcbiAgICAgIHJlcG9ydFByb2dyZXNzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZVRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPERvY3VtZW50VGVtcGxhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9YCxcbiAgICAgIG1ldGhvZDogJ2RlbGV0ZScsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVzdG9yZVRlbXBsYXRlKGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICB1cmw6IGAke3RoaXMuU0VSVklDRV9VUkx9LyR7aWR9L3Jlc3RvcmVgLFxuICAgICAgbWV0aG9kOiAncGF0Y2gnLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNsb25lVGVtcGxhdGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wZXJ0aWVzVG9PdmVycmlkZTogUGFydGlhbDxEb2N1bWVudFRlbXBsYXRlPiA9IHt9LFxuICApOiBPYnNlcnZhYmxlPHsgY2xvbmVkUmVjb3JkSWQ6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZS5hcGkoe1xuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS9jbG9uZS8ke2lkfWAsXG4gICAgICBtZXRob2Q6ICdwb3N0JyxcbiAgICAgIGJvZHk6IHtcbiAgICAgICAgaWQsXG4gICAgICAgIHByb3BlcnRpZXNUb092ZXJyaWRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUZW1wbGF0ZUZpbGUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmFwaSh7XG4gICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgdXJsOiBgJHt0aGlzLlNFUlZJQ0VfVVJMfS8ke2lkfS9maWxlYCxcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZFRlbXBsYXRlRmlsZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxCbG9iPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIHVybDogYCR7dGhpcy5TRVJWSUNFX1VSTH0vJHtpZH0vZmlsZWAsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAocmVzcG9uc2UgPT4ge1xuICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQocmVzcG9uc2UpO1xuICAgICAgICB9KSxcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLmJvZHkgfHwgcmVzcG9uc2UpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHVibGljIG1lcmdlRG9jdW1lbnRzKGRvY3VtZW50OiBCbG9iLCBhdHRhY2htZW50czogQXJyYXlCdWZmZXJbXSk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXI+IHtcbiAgICBjb25zdCBib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgYm9keS5hcHBlbmQoJ2F0dGFjaG1lbnRzJywgbmV3IEJsb2IoW2F0dGFjaG1lbnRdKSk7XG4gICAgfSk7XG5cbiAgICBib2R5LmFwcGVuZCgnb3JkZXJmb3JtJywgZG9jdW1lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMuRE9DX0dFTl9VUkx9L2RvY3VtZW50cy9tZXJnZWAsIGJvZHksIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZW5lcmF0ZURvY3VtZW50VjIoYm9keTogR2VuZXJhdGVEb2N1bWVudFBheWxvYWQsIHF1b3RlSWQ6IHN0cmluZywgaXNBc3luYz86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPEJsb2I+IHtcbiAgICBjb25zdCBwYXJhbXM6IERpY3Rpb25hcnk8c3RyaW5nPiA9IHt9O1xuICAgIGlmIChpc0FzeW5jKSB7XG4gICAgICBwYXJhbXNbJ2FzeW5jJ10gPSAndHJ1ZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZVxuICAgICAgLmFwaSh7XG4gICAgICAgIG1ldGhvZDogJ3Bvc3QnLFxuICAgICAgICB1cmw6IGAvZG9jZ2VuLyR7cXVvdGVJZH0vZ2VuZXJhdGVgLFxuICAgICAgICBib2R5LFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcbiAgICAgIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKHBkZiA9PiB7XG4gICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtwZGZdKTtcblxuICAgICAgICAgIGNvbnN0IGRvY3VtZW50TmFtZSA9IGJvZHkucGFyYW1ldGVyc1snZG9jdW1lbnROYW1lJ10gPz8gJ1ZlbG9jZSBQcm9wb3NhbCc7XG5cbiAgICAgICAgICBpZiAoIWlzQXN5bmMpIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgYCR7ZG9jdW1lbnROYW1lfS4ke2JvZHkuZG9jdW1lbnRGb3JtYXQudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYmxvYjtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEF0dGFjaG1lbnRzKHNlYXJjaFJlcXVlc3Q6IFRlbXBsYXRlQXR0YWNobWVudFNlYXJjaFJlcXVlc3QpOiBPYnNlcnZhYmxlPEF0dGFjaG1lbnRbXT4ge1xuICAgIHJldHVybiB0aGlzLmRvY3VtZW50QXR0YWNobWVudFNlcnZpY2UuZ2V0QXR0YWNobWVudHMoc2VhcmNoUmVxdWVzdCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0YWNobWVudEZpbGUoaWQ6IHN0cmluZyk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50RmlsZShpZCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQXR0YWNobWVudChhdHRhY2htZW50OiBBdHRhY2htZW50LCBmaWxlPzogRmlsZSwgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxBdHRhY2htZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5jcmVhdGVBdHRhY2htZW50KGF0dGFjaG1lbnQsIGZpbGUsIHJlcG9ydFByb2dyZXNzKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVBdHRhY2htZW50KGlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5kb2N1bWVudEF0dGFjaG1lbnRTZXJ2aWNlLnJlbW92ZUF0dGFjaG1lbnQoaWQpO1xuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlRG9jdW1lbnREYXRhKFxuICAgIHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlLFxuICAgIG9iamVjdDogYW55LFxuICAgIHBhcmFtczogRG9jdW1lbnRHZW5lcmF0aW9uUGFyYW1zID0ge30sXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKGlzTGVnYWN5RG9jdW1lbnRUZW1wbGF0ZSh0ZW1wbGF0ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlRG9jdW1lbnREYXRhTGVnYWN5KHRlbXBsYXRlLCBvYmplY3QsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGVQcm9wZXJ0aWVzID0gdGVtcGxhdGUucHJvcGVydGllcz8ucmVkdWNlKFxuICAgICAgKGFjYywgeyBuYW1lLCB2YWx1ZSB9KSA9PiAoeyAuLi5hY2MsIFtuYW1lXTogdGhpcy5tYXBCb29sZWFuSWZBcGxpY2FibGUodmFsdWUpIH0pLFxuICAgICAge30sXG4gICAgKTtcblxuICAgIC8qXG4gICAgICBSZXNvbHZlIHF1b3RlIGFuZCB0ZW1wbGF0ZSBwcm9wZXJ0aWVzIGZvciBub3dcbiAgICAgIFdoZW4gcHJvY2VkdXJlcyBhcmUgcmVhZHksIHdoZXkgd2lsbCByZXBsYWNlIHRlbXBsYXRlIHNjcmlwdHMuXG5cbiAgICAgIFRPRE86IHJ1biBwcm9jZWR1cmUgdG8gcmVzb2x2ZSBkb2N1bWVudCBkYXRhXG4gICAgKi9cbiAgICByZXR1cm4gb2Yoe1xuICAgICAgLi4uKHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnID8gb2JqZWN0IDogeyBvYmplY3QgfSksXG4gICAgICAuLi50ZW1wbGF0ZVByb3BlcnRpZXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZURvY3VtZW50KFxuICAgIHRlbXBsYXRlOiBEb2N1bWVudFRlbXBsYXRlLFxuICAgIG9iamVjdDogYW55LFxuICAgIHBhcmFtczogRG9jdW1lbnRHZW5lcmF0aW9uUGFyYW1zID0ge30sXG4gICk6IE9ic2VydmFibGU8QmxvYj4ge1xuICAgIGNvbnN0IGRvY3VtZW50RGF0YSQgPSB0aGlzLmdlbmVyYXRlRG9jdW1lbnREYXRhKHRlbXBsYXRlLCBvYmplY3QsIHsgLi4ucGFyYW1zLCBzaG91bGRQcmV2ZW50RG93bmxvYWQ6IHRydWUgfSk7XG5cbiAgICByZXR1cm4gemlwKHRoaXMuZ2V0VGVtcGxhdGVGaWxlKHRlbXBsYXRlLmlkKSwgZG9jdW1lbnREYXRhJCwgdGhpcy5yZXNvbHZlQXR0YWNobWVudHMkKHRlbXBsYXRlKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoW3RlbXBsYXRlRmlsZSwgZGF0YSwgYXR0YWNobWVudHNdKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gRG9jeFRlbXBsYXRlci5nZW5lcmF0ZSh0ZW1wbGF0ZUZpbGUsIGRhdGEpO1xuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzOiBfLkRpY3Rpb25hcnk8c3RyaW5nPiA9IG9iamVjdD8uY29udGV4dD8ucHJvcGVydGllcyA/PyBvYmplY3Q/LnByb3BlcnRpZXMgPz8ge307XG4gICAgICAgIGNvbnN0IGRvY3VtZW50TmFtZSA9XG4gICAgICAgICAgdGVtcGxhdGUucHJvcGVydGllcz8uZmluZCgoeyBuYW1lIH0pID0+IG5hbWUgPT09ICdkb2N1bWVudE5hbWUnKT8udmFsdWUgfHxcbiAgICAgICAgICBwcm9wZXJ0aWVzWydOYW1lJ10gfHxcbiAgICAgICAgICB0ZW1wbGF0ZS5uYW1lO1xuXG4gICAgICAgIGNvbnN0IGRvY3VtZW50Rm9ybWF0ID1cbiAgICAgICAgICBwYXJhbXMuZG9jdW1lbnRGb3JtYXQgPz8gdGVtcGxhdGUucHJvcGVydGllcz8uZmluZChwID0+IHAubmFtZSA9PT0gJ2RvY3VtZW50Rm9ybWF0Jyk/LnZhbHVlO1xuICAgICAgICBpZiAoZG9jdW1lbnRGb3JtYXQgPT09ICdET0NYJykge1xuICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoZG9jdW1lbnQsIGRvY3VtZW50TmFtZSk7XG5cbiAgICAgICAgICByZXR1cm4gb2YoZG9jdW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMubWVyZ2VEb2N1bWVudHMoZG9jdW1lbnQsIGF0dGFjaG1lbnRzKS5waXBlKFxuICAgICAgICAgIHN3aXRjaE1hcChwZGYgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtcy5hdHRhY2hUb1F1b3RlICYmIFF1b3RlRHJhZnQuaXNRdW90ZShvYmplY3QpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbcGRmXSwgYCR7ZG9jdW1lbnROYW1lfS5wZGZgKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZVxuICAgICAgICAgICAgICAgIC5jcmVhdGVBdHRhY2htZW50KFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsaW5rZWRFbnRpdHlJZDogb2JqZWN0LnF1b3RlSWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lOiBkb2N1bWVudE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVFeHRlbnNpb246ICdwZGYnLFxuICAgICAgICAgICAgICAgICAgICB0YWdzOiB0aGlzLkRPQ0dFTl9UQUcsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnBpcGUobWFwKCgpID0+IHBkZikpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb2YocGRmKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAocGRmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbcGRmXSk7XG5cbiAgICAgICAgICAgIGlmICghcGFyYW1zLnNob3VsZFByZXZlbnREb3dubG9hZCkge1xuICAgICAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZFNlcnZpY2UucHJvY2Vzc0Rvd25sb2FkKGJsb2IsIGAke2RvY3VtZW50TmFtZX0ucGRmYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBibG9iO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVEb2N1bWVudERhdGFMZWdhY3koXG4gICAgdGVtcGxhdGU6IERvY3VtZW50VGVtcGxhdGUsXG4gICAgb2JqZWN0OiBhbnksXG4gICAgcGFyYW1zOiBEb2N1bWVudEdlbmVyYXRpb25QYXJhbXMgPSB7fSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBzaG91bGRQcmV2ZW50RG93bmxvYWQgPSBwYXJhbXMuc2hvdWxkUHJldmVudERvd25sb2FkO1xuICAgIGNvbnN0IGFsbFF1ZXJpZXM6IFRlbXBsYXRlUXVlcnlbXSA9IFsuLi4odGVtcGxhdGU/LnF1ZXJpZXMgPz8gW10pXTtcbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBfLkRpY3Rpb25hcnk8c3RyaW5nPiA9IG9iamVjdD8uY29udGV4dD8ucHJvcGVydGllcyA/PyBvYmplY3Q/LnByb3BlcnRpZXMgPz8ge307XG4gICAgY29uc3QgYWNjb3VudElkID0gcHJvcGVydGllcz8uWydBY2NvdW50SWQnXTtcbiAgICBjb25zdCB1c2VySWQgPSBwcm9wZXJ0aWVzPy5bJ1VzZXJJZCddO1xuXG4gICAgaWYgKGFjY291bnRJZCkge1xuICAgICAgYWxsUXVlcmllcy5wdXNoKHtcbiAgICAgICAgcXVlcnlOYW1lOiAnUXVvdGVBY2NvdW50UXVlcnknLFxuICAgICAgICBvYmplY3ROYW1lOiAnQWNjb3VudCcsXG4gICAgICAgIHJlc3VsdE9iamVjdE5hbWU6ICdhY2NvdW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke2FjY291bnRJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodXNlcklkKSB7XG4gICAgICBhbGxRdWVyaWVzLnB1c2goe1xuICAgICAgICBxdWVyeU5hbWU6ICdRdW90ZVVzZXJRdWVyeScsXG4gICAgICAgIG9iamVjdE5hbWU6ICdVc2VyJyxcbiAgICAgICAgcmVzdWx0T2JqZWN0TmFtZTogJ2FnZW50JyxcbiAgICAgICAgc3RhdGVtZW50OiBgSWQgPScke3VzZXJJZH0nYCxcbiAgICAgICAgZmllbGRzOiBbXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJpZXMgPSBhbGxRdWVyaWVzLm1hcChxdWVyeSA9PiB0aGlzLnF1ZXJ5T2JqZWN0KHF1ZXJ5LCB7IHByb3BlcnRpZXMgfSkpIHx8IFtdO1xuXG4gICAgcmV0dXJuIGZvcmtKb2luKFsuLi5xdWVyaWVzXSkucGlwZShcbiAgICAgIGRlZmF1bHRJZkVtcHR5KFtdIGFzIGFueVtdKSxcbiAgICAgIG1hcChyZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgcXVlcmllc1Jlc3VsdCA9IF8uY2hhaW4ocmVzdWx0cylcbiAgICAgICAgICAucmVkdWNlKChhY2MsIHIpID0+IHtcbiAgICAgICAgICAgIGlmIChyKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmFjYywgLi4uciB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9KVxuICAgICAgICAgIC52YWx1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlUHJvcGVydGllcyA9ICh0ZW1wbGF0ZT8ucHJvcGVydGllcyB8fCBbXSkucmVkdWNlKCh0cnVuaywgeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW25hbWUgYXMgc3RyaW5nXTogdGhpcy5tYXBCb29sZWFuSWZBcGxpY2FibGUodmFsdWUgYXMgYW55KSxcbiAgICAgICAgICB9O1xuICAgICAgICB9LCB7fSk7XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAuLi4odHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgPyBvYmplY3QgOiB7IG9iamVjdCB9KSxcbiAgICAgICAgICAuLi5xdWVyaWVzUmVzdWx0LFxuICAgICAgICAgIC4uLnRlbXBsYXRlUHJvcGVydGllcyxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodGVtcGxhdGUuc2NyaXB0ICYmIHRlbXBsYXRlLnNjcmlwdC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVuY3lGb3JtYXQgPSB0ZW1wbGF0ZS5wcm9wZXJ0aWVzPy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gJ2N1cnJlbmN5Rm9ybWF0Jyk/LnZhbHVlIHx8ICcxLjItMic7XG4gICAgICAgICAgY29uc3QgZGF0ZUZvcm1hdCA9IHRlbXBsYXRlLnByb3BlcnRpZXM/LmZpbmQoKHsgbmFtZSB9KSA9PiBuYW1lID09PSAnZGF0ZUZvcm1hdCcpPy52YWx1ZSB8fCAnRC9NTU0vWVlZWSc7XG4gICAgICAgICAgY29uc3QgZm9ybWF0RGF0ZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBtb21lbnQodmFsdWUpLmZvcm1hdChkYXRlRm9ybWF0KSA6IHZhbHVlO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHt0ZW1wbGF0ZS5zY3JpcHR9YCkoKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm0oe1xuICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgIHV0aWxzOiB7XG4gICAgICAgICAgICAgIGxvZGFzaDogXyxcbiAgICAgICAgICAgICAgY3VycmVuY3k6ICh2YWx1ZTogYW55KSA9PiBuZXcgQ3VycmVuY3lQaXBlKCdlbi1VUycpLnRyYW5zZm9ybSh2YWx1ZSwgJ1VTRCcsICdzeW1ib2wnLCBjdXJyZW5jeUZvcm1hdCksXG4gICAgICAgICAgICAgIGRhdGU6IGZvcm1hdERhdGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgVG9EYXk6IGZvcm1hdERhdGUoRGF0ZS5ub3coKSBhcyBhbnkpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICghc2hvdWxkUHJldmVudERvd25sb2FkKSB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHRyYW5zZm9ybWVkRGF0YSldKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZURvd25sb2FkU2VydmljZS5wcm9jZXNzRG93bmxvYWQoYmxvYiwgJ2RhdGEuanNvbicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUF0dGFjaG1lbnRzJCh0ZW1wbGF0ZTogRG9jdW1lbnRUZW1wbGF0ZSk6IE9ic2VydmFibGU8QXJyYXlCdWZmZXJbXT4ge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRJZHMgPSAodGVtcGxhdGUuYXR0YWNobWVudHM/Lm1hcCgoeyBpZCB9KSA9PiBpZCkuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdKSA/PyBbXTtcblxuICAgIGlmICghYXR0YWNobWVudElkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBvZihbXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcmtKb2luKGF0dGFjaG1lbnRJZHMubWFwKGlkID0+IHRoaXMuZG9jdW1lbnRBdHRhY2htZW50U2VydmljZS5nZXRBdHRhY2htZW50RmlsZShpZCwgdHJ1ZSkpKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwU2ZRdWVyeVJlc3VsdCA9IDxUPihsaW1pdDogbnVtYmVyKSA9PlxuICAgIG1hcCgocmVjb3JkczogVFtdKSA9PiB7XG4gICAgICBpZiAoIXJlY29yZHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB7IF9yZXN1bHQ6ICdObyBSZWNvcmRzIEZvdW5kJyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobGltaXQgPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZHNbMF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWNvcmRzO1xuICAgIH0pO1xuXG4gIHByaXZhdGUgbWFwQm9vbGVhbklmQXBsaWNhYmxlID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHByaXZhdGUgcXVlcnlPYmplY3QoXG4gICAgeyBvYmplY3ROYW1lLCByZXN1bHRPYmplY3ROYW1lLCBmaWVsZHMsIHN0YXRlbWVudCB9OiBUZW1wbGF0ZVF1ZXJ5LFxuICAgIHsgcHJvcGVydGllcyB9OiBBbnlXaXRoUHJvcGVydGllcyxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBwYXR0ZXJuTGltaXQgPSAvKFxccypsaW1pdFxcc1xcZCopL2k7XG4gICAgbGV0IGxpbWl0ID0gMTtcbiAgICBpZiAoc3RhdGVtZW50ICYmIHBhdHRlcm5MaW1pdC50ZXN0KHN0YXRlbWVudCkpIHtcbiAgICAgIGNvbnN0IGxpbWl0U3RyID0gc3RhdGVtZW50Py5tYXRjaChwYXR0ZXJuTGltaXQpPy5bMV0/LnRyaW0oKS5zdWJzdHJpbmcoNSkudHJpbSgpO1xuICAgICAgaWYgKGxpbWl0U3RyKSB7XG4gICAgICAgIGxpbWl0ID0gTnVtYmVyLnBhcnNlSW50KGxpbWl0U3RyLCAxMCk7XG4gICAgICB9XG4gICAgICBzdGF0ZW1lbnQgPSBzdGF0ZW1lbnQucmVwbGFjZShwYXR0ZXJuTGltaXQsICcnKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFN0YXRlbWVudCA9IHN0YXRlbWVudFxuICAgICAgPyBTdHJpbmdVdGlscy5maWxsUGxhY2Vob2xkZXJzKHN0YXRlbWVudCwgcHJvcGVydGllcywgLzpcXHMqKFxcd1tcXHdcXGRfLl0rKS9pKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzZWFyY2hSZXF1ZXN0ID0ge1xuICAgICAgc2tpcDogMCxcbiAgICAgIGNvdW50OiBsaW1pdCxcbiAgICAgIHJhd0NvbmRpdGlvbjogcmVzb2x2ZWRTdGF0ZW1lbnQsXG4gICAgICAuLi4oZmllbGRzPy5sZW5ndGggJiYgISFmaWVsZHNbMF0gJiYgeyBmaWVsZHMgfSksXG4gICAgfSBhcyBTZWFyY2hSZXF1ZXN0O1xuXG4gICAgcmV0dXJuIHRoaXMuc2FsZXNmb3JjZUFwaVNlcnZpY2UucXVlcnkoc2VhcmNoUmVxdWVzdCwgb2JqZWN0TmFtZSkucGlwZShcbiAgICAgIHRoaXMubWFwU2ZRdWVyeVJlc3VsdChsaW1pdCksXG4gICAgICBtYXAodmFsdWUgPT4gKHsgW3Jlc3VsdE9iamVjdE5hbWVdOiB2YWx1ZSB9KSksXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -3,7 +3,7 @@ import { HttpParams, HttpHeaders, HttpErrorResponse, HttpClientModule } from '@a
3
3
  import * as i0 from '@angular/core';
4
4
  import { Injectable, NgModule } from '@angular/core';
5
5
  import * as i1 from '@veloceapps/core';
6
- import { uiDefinitionFromDTO, ConfigurationContextMode, isLegacyDocumentTemplate, DocxTemplater, StringUtils, Expression, toLatestFlow, isDefined, Operator, isApexError, isCanvasError, ModelTranslatorUtils, ProductModelsContainer, ModelUtils, EntityUtil, RuleGroupTypes, parseJsonSafely, uiDefinitionToDTO, BaseHttpService, XrayService } from '@veloceapps/core';
6
+ import { uiDefinitionFromDTO, ConfigurationContextMode, isLegacyDocumentTemplate, DocxTemplater, QuoteDraft, StringUtils, Expression, toLatestFlow, isDefined, Operator, isApexError, isCanvasError, ModelTranslatorUtils, ProductModelsContainer, ModelUtils, EntityUtil, RuleGroupTypes, parseJsonSafely, uiDefinitionToDTO, BaseHttpService, XrayService } from '@veloceapps/core';
7
7
  import { noop, throwError, of, zip, forkJoin, map as map$1, from, catchError as catchError$1, switchMap as switchMap$1 } from 'rxjs';
8
8
  import { map, catchError, tap, switchMap, defaultIfEmpty } from 'rxjs/operators';
9
9
  import * as i1$2 from 'primeng/api';
@@ -884,23 +884,28 @@ class DocumentTemplatesApiService {
884
884
  responseType: 'arraybuffer',
885
885
  });
886
886
  }
887
- generateDocumentRequest(document, attachments, quoteId, isAsync) {
888
- const formData = new FormData();
889
- attachments.forEach(attachment => {
890
- formData.append('attachments', new Blob([attachment]));
891
- });
892
- formData.append('orderform', document);
887
+ generateDocumentV2(body, quoteId, isAsync) {
893
888
  const params = {};
894
889
  if (isAsync) {
895
890
  params['async'] = 'true';
896
891
  }
897
- return this.service.upload({
892
+ return this.service
893
+ .api({
898
894
  method: 'post',
899
895
  url: `/docgen/${quoteId}/generate`,
900
- body: formData,
896
+ body,
901
897
  params,
902
898
  responseType: 'arraybuffer',
903
- });
899
+ })
900
+ .pipe(map(pdf => {
901
+ var _a;
902
+ const blob = new Blob([pdf]);
903
+ const documentName = (_a = body.parameters['documentName']) !== null && _a !== void 0 ? _a : 'Veloce Proposal';
904
+ if (!isAsync) {
905
+ this.fileDownloadService.processDownload(blob, `${documentName}.${body.documentFormat.toLowerCase()}`);
906
+ }
907
+ return blob;
908
+ }));
904
909
  }
905
910
  getAttachments(searchRequest) {
906
911
  return this.documentAttachmentService.getAttachments(searchRequest);
@@ -928,7 +933,10 @@ class DocumentTemplatesApiService {
928
933
  */
929
934
  return of(Object.assign(Object.assign({}, (typeof object === 'object' ? object : { object })), templateProperties));
930
935
  }
931
- generateDocument(template, object, params = {}, quoteId, isAsync) {
936
+ /**
937
+ * @deprecated
938
+ */
939
+ generateDocument(template, object, params = {}) {
932
940
  const documentData$ = this.generateDocumentData(template, object, Object.assign(Object.assign({}, params), { shouldPreventDownload: true }));
933
941
  return zip(this.getTemplateFile(template.id), documentData$, this.resolveAttachments$(template)).pipe(switchMap(([templateFile, data, attachments]) => {
934
942
  var _a, _b, _c, _d, _e, _f, _g, _h;
@@ -942,9 +950,22 @@ class DocumentTemplatesApiService {
942
950
  this.fileDownloadService.processDownload(document, documentName);
943
951
  return of(document);
944
952
  }
945
- return this.generateDocumentRequest(document, attachments, quoteId, isAsync).pipe(map(pdf => {
953
+ return this.mergeDocuments(document, attachments).pipe(switchMap(pdf => {
954
+ if (params.attachToQuote && QuoteDraft.isQuote(object)) {
955
+ const file = new File([pdf], `${documentName}.pdf`);
956
+ return this.documentAttachmentService
957
+ .createAttachment({
958
+ linkedEntityId: object.quoteId,
959
+ fileName: documentName,
960
+ fileExtension: 'pdf',
961
+ tags: this.DOCGEN_TAG,
962
+ }, file)
963
+ .pipe(map(() => pdf));
964
+ }
965
+ return of(pdf);
966
+ }), map(pdf => {
946
967
  const blob = new Blob([pdf]);
947
- if (!isAsync && !params.shouldPreventDownload) {
968
+ if (!params.shouldPreventDownload) {
948
969
  this.fileDownloadService.processDownload(blob, `${documentName}.pdf`);
949
970
  }
950
971
  return blob;