uitec-ng-upload-order 1.0.13 → 1.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,16 +1,18 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild } from "@angular/core";
2
- import { FilePondComponent, } from "ngx-filepond";
3
- import { Lightbox } from 'ngx-lightbox';
2
+ import { FilePondComponent } from "ngx-filepond";
3
+ import { Lightbox } from "ngx-lightbox";
4
4
  import { Observable } from "rxjs";
5
+ import { UntypedFormGroup } from "@angular/forms";
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "ngx-lightbox";
7
- import * as i2 from "ngx-filepond";
8
+ import * as i2 from "@angular/common";
9
+ import * as i3 from "ngx-filepond";
8
10
  export class UiUploadOrderComponent {
9
11
  constructor(_lightbox) {
10
12
  this._lightbox = _lightbox;
11
13
  this.multiple = true;
12
14
  this.reorder = true;
13
- this.maxFiles = 6;
15
+ this.maxFiles = 10;
14
16
  this.lightBox = true;
15
17
  this.instantUpload = true;
16
18
  this.onRemove = new EventEmitter();
@@ -23,8 +25,10 @@ export class UiUploadOrderComponent {
23
25
  this.onSelected = new EventEmitter();
24
26
  this.noFilesAdded = new EventEmitter();
25
27
  this.onUploadError = new EventEmitter();
28
+ // public pondFiles: FilePondOptions["files"] = [];
26
29
  this.pondFiles = [];
27
30
  this.album = [];
31
+ this.pondFilesInitialized = false;
28
32
  }
29
33
  ngOnInit() {
30
34
  this.pondOptions = {
@@ -32,7 +36,7 @@ export class UiUploadOrderComponent {
32
36
  labelIdle: 'Arraste seus arquivos ou <span class="filepond--label-action">clique aqui</span> para selecionar.',
33
37
  allowReorder: this.reorder,
34
38
  maxFiles: this.maxFiles,
35
- acceptedFileTypes: ['image/*'],
39
+ acceptedFileTypes: ["image/*"],
36
40
  instantUpload: this.instantUpload,
37
41
  allowProcess: this.instantUpload,
38
42
  dropValidation: true,
@@ -43,10 +47,10 @@ export class UiUploadOrderComponent {
43
47
  <g mask="url(#mask0_37067_34146)">
44
48
  <path d="M4.43 13.5263C4.09228 13.5263 3.80317 13.406 3.56267 13.1655C3.32217 12.925 3.20193 12.6359 3.20193 12.2982V4.31574C3.02795 4.31574 2.88212 4.25689 2.76443 4.1392C2.64674 4.02151 2.58789 3.87568 2.58789 3.7017C2.58789 3.52773 2.64674 3.38189 2.76443 3.2642C2.88212 3.14651 3.02795 3.08767 3.20193 3.08767H5.65807C5.65807 2.91369 5.71691 2.76786 5.8346 2.65017C5.95229 2.53248 6.09812 2.47363 6.2721 2.47363H8.72824C8.90222 2.47363 9.04805 2.53248 9.16574 2.65017C9.28343 2.76786 9.34228 2.91369 9.34228 3.08767H11.7984C11.9724 3.08767 12.1182 3.14651 12.2359 3.2642C12.3536 3.38189 12.4125 3.52773 12.4125 3.7017C12.4125 3.87568 12.3536 4.02151 12.2359 4.1392C12.1182 4.25689 11.9724 4.31574 11.7984 4.31574V12.2982C11.7984 12.6359 11.6782 12.925 11.4377 13.1655C11.1972 13.406 10.9081 13.5263 10.5703 13.5263H4.43ZM4.43 4.31574V12.2982H10.5703V4.31574H4.43ZM7.50017 9.16662L8.66684 10.3333C8.78965 10.4459 8.93548 10.5021 9.10434 10.5021C9.2732 10.5021 9.41391 10.4459 9.52649 10.3333C9.64929 10.2105 9.7107 10.0646 9.7107 9.89578C9.7107 9.72692 9.64929 9.58621 9.52649 9.47363L8.35982 8.30697L9.52649 7.1403C9.64929 7.01749 9.7107 6.87166 9.7107 6.7028C9.7107 6.53394 9.64929 6.39322 9.52649 6.28065C9.41391 6.15784 9.2732 6.09644 9.10434 6.09644C8.93548 6.09644 8.78965 6.15784 8.66684 6.28065L7.50017 7.44732L6.3335 6.28065C6.22093 6.15784 6.08022 6.09644 5.91136 6.09644C5.7425 6.09644 5.59666 6.15784 5.47386 6.28065C5.36128 6.39322 5.305 6.53394 5.305 6.7028C5.305 6.87166 5.36128 7.01749 5.47386 7.1403L6.64052 8.30697L5.47386 9.47363C5.36128 9.58621 5.305 9.72692 5.305 9.89578C5.305 10.0646 5.36128 10.2105 5.47386 10.3333C5.59666 10.4459 5.7425 10.5021 5.91136 10.5021C6.08022 10.5021 6.22093 10.4459 6.3335 10.3333L7.50017 9.16662Z" fill="white"/>
45
49
  </g></svg>`,
46
- styleButtonRemoveItemPosition: 'right',
47
- imageResizeMode: 'contain',
48
- styleItemPanelAspectRatio: '0.75',
49
- itemInsertLocation: 'after',
50
+ styleButtonRemoveItemPosition: "right",
51
+ imageResizeMode: "contain",
52
+ styleItemPanelAspectRatio: "0.75",
53
+ itemInsertLocation: "after",
50
54
  credits: false,
51
55
  server: {
52
56
  process: (fieldName, file, metadata, load, error, progress, abort, transfer, options) => {
@@ -55,7 +59,7 @@ export class UiUploadOrderComponent {
55
59
  const formData = new FormData();
56
60
  formData.append(fieldName, file, file.name);
57
61
  const request = new XMLHttpRequest();
58
- request.open('POST', this.url);
62
+ request.open("POST", this.url);
59
63
  // Should call the progress method to update the progress to 100% before calling load
60
64
  // Setting computable to false switches the loading indicator to infinite mode
61
65
  request.upload.onprogress = (e) => {
@@ -67,11 +71,26 @@ export class UiUploadOrderComponent {
67
71
  request.onload = function () {
68
72
  if (request.status >= 200 && request.status < 300) {
69
73
  // the load method accepts either a string (id) or an object
70
- load(request.responseText);
74
+ // load(request.responseText);
75
+ try {
76
+ // Extrai o nome do arquivo do array
77
+ const response = JSON.parse(request.responseText);
78
+ if (Array.isArray(response) && response.length > 0) {
79
+ const serverId = response[0];
80
+ load(serverId);
81
+ }
82
+ else {
83
+ error("Resposta do servidor inválida: nome do arquivo não encontrado");
84
+ }
85
+ }
86
+ catch (e) {
87
+ console.error("Erro ao processar resposta do servidor:", e);
88
+ error("Erro ao processar resposta do servidor");
89
+ }
71
90
  }
72
91
  else {
73
92
  // Can call the error method if something is wrong, should exit after
74
- error('oh no');
93
+ error("oh no");
75
94
  }
76
95
  };
77
96
  request.send(formData);
@@ -86,28 +105,75 @@ export class UiUploadOrderComponent {
86
105
  };
87
106
  },
88
107
  load: (source, load, error, progress, abort, headers) => {
89
- var myRequest = new Request(source);
90
- fetch(myRequest).then(response => {
91
- response.arrayBuffer().then(buffer => {
92
- const contentType = response.headers.get('content-type');
93
- // Get the file extension from the source URL
94
- const fileExtension = source.split('.').pop();
95
- // Map file extensions to MIME types
108
+ const myRequest = new Request(source);
109
+ fetch(myRequest)
110
+ .then((response) => {
111
+ if (!response.ok) {
112
+ console.error("Erro ao carregar imagem:", response.status);
113
+ error("Erro ao carregar a imagem");
114
+ return;
115
+ }
116
+ response.arrayBuffer().then((buffer) => {
117
+ const contentType = response.headers.get("content-type");
118
+ const fileExtension = source.split(".").pop();
96
119
  const mimeTypeMap = {
97
- 'webp': 'image/webp',
98
- 'jpg': 'image/jpeg',
99
- 'jpeg': 'image/jpeg',
100
- 'png': 'image/png',
101
- // Add other supported image types as needed
120
+ webp: "image/webp",
121
+ jpg: "image/jpeg",
122
+ jpeg: "image/jpeg",
123
+ png: "image/png",
102
124
  };
103
- const fileType = mimeTypeMap[fileExtension] || contentType || 'application/octet-stream';
125
+ const fileType = mimeTypeMap[fileExtension] || contentType || "application/octet-stream";
104
126
  const myBlob = new Blob([buffer], { type: fileType });
105
127
  load(myBlob);
106
128
  });
107
- }).catch(error => {
108
- console.log('ERROR: ', error);
129
+ })
130
+ .catch((err) => {
131
+ console.error("Erro no server.load:", err);
132
+ error("Erro ao carregar a imagem");
109
133
  });
110
134
  },
135
+ remove: (source, load, error) => {
136
+ const fileName = source.split("/").pop();
137
+ const request = new XMLHttpRequest();
138
+ request.open("POST", `${this.deleteUrl}${encodeURIComponent(fileName)}`);
139
+ request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
140
+ request.onload = function () {
141
+ if (request.status >= 200 && request.status < 300) {
142
+ load();
143
+ this.onRemove.emit(fileName);
144
+ }
145
+ else {
146
+ error(`Erro ao remover o arquivo: ${request.statusText}`);
147
+ }
148
+ }.bind(this);
149
+ const body = ``;
150
+ request.onerror = function () {
151
+ console.error("Erro de rede ao tentar remover o arquivo");
152
+ error("Erro de rede ao tentar remover o arquivo");
153
+ };
154
+ request.send(body);
155
+ },
156
+ revert: (uniqueFileId, load, error) => {
157
+ if (!uniqueFileId) {
158
+ error("Nome do arquivo não fornecido");
159
+ return;
160
+ }
161
+ const request = new XMLHttpRequest();
162
+ const fullUrl = `${this.deleteUrl}${encodeURIComponent(uniqueFileId)}`;
163
+ request.open("POST", fullUrl);
164
+ request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
165
+ request.onload = () => {
166
+ if (request.status >= 200 && request.status < 300) {
167
+ load();
168
+ this.onRemove.emit(uniqueFileId);
169
+ }
170
+ else {
171
+ error(`Erro ao reverter o upload: ${request.statusText}`);
172
+ }
173
+ };
174
+ request.onerror = () => error("Erro de rede ao tentar reverter o upload");
175
+ request.send("");
176
+ },
111
177
  },
112
178
  };
113
179
  if (!this.instantUpload) {
@@ -120,7 +186,7 @@ export class UiUploadOrderComponent {
120
186
  return {
121
187
  source: item,
122
188
  options: {
123
- type: 'local',
189
+ type: "local",
124
190
  },
125
191
  };
126
192
  });
@@ -139,15 +205,14 @@ export class UiUploadOrderComponent {
139
205
  this.pond = event.pond;
140
206
  }
141
207
  pondHandleAddFile(event) {
142
- const formattedName = event.file?.serverId?.replace(/["\[\]]/g, '');
143
- this.onAdded.emit(formattedName);
208
+ this.onAdded.emit(event);
144
209
  }
145
210
  //Só funciona quando não tem arquivos iniciais
146
211
  pondHandleAllFilesAdded(event) {
147
212
  const filesList = [];
148
213
  const files = event.pond.getFiles();
149
214
  files.forEach((file) => {
150
- let formattedName = file.serverId?.replace(/["\[\]]/g, '');
215
+ let formattedName = file.serverId?.replace(/["\[\]]/g, "");
151
216
  filesList.push(formattedName);
152
217
  });
153
218
  this.onAllAdded.emit(filesList);
@@ -162,10 +227,10 @@ export class UiUploadOrderComponent {
162
227
  pondHandleRemove(event) {
163
228
  let fileName;
164
229
  if (event.file.source instanceof File) {
165
- fileName = event.file.serverId?.replace(/["\[\]]/g, '');
230
+ fileName = event.file.serverId;
166
231
  }
167
232
  else {
168
- fileName = event.file?.filename;
233
+ fileName = event.file.source.includes("/") ? event.file.source.split("/").pop() : event.file.source;
169
234
  }
170
235
  this.onRemove.emit(fileName);
171
236
  }
@@ -173,7 +238,7 @@ export class UiUploadOrderComponent {
173
238
  this.fillAlbum(event.items, true);
174
239
  let itemsList = event.items.map((item) => {
175
240
  if (item.source instanceof File) {
176
- return item.serverId.replace(/["\[\]]/g, '');
241
+ return item.serverId.replace(/["\[\]]/g, "");
177
242
  }
178
243
  else {
179
244
  return item.filename;
@@ -187,7 +252,11 @@ export class UiUploadOrderComponent {
187
252
  }
188
253
  }
189
254
  openLightBox(fileName) {
190
- let index = this.album.map(function (e) { return e.caption; }).indexOf(fileName);
255
+ let index = this.album
256
+ .map(function (e) {
257
+ return e.caption;
258
+ })
259
+ .indexOf(fileName);
191
260
  this._lightbox.open(this.album, index);
192
261
  }
193
262
  async fillAlbum(files, reOrder) {
@@ -203,7 +272,7 @@ export class UiUploadOrderComponent {
203
272
  return {
204
273
  src: fileUrl,
205
274
  caption: file.filenameWithoutExtension,
206
- thumb: ''
275
+ thumb: "",
207
276
  };
208
277
  }));
209
278
  this.album = preAlbum;
@@ -224,16 +293,29 @@ export class UiUploadOrderComponent {
224
293
  const files = this.pond.getFiles();
225
294
  files.length > 0 ? this.pond.processFiles() : this.noFilesAdded.emit();
226
295
  }
296
+ isErrorMessage() {
297
+ let control = this.form?.get(this.controlName);
298
+ if (control?.errors?.required && (!this.pond || this.pond.getFiles().length === 0)) {
299
+ return "Obrigatório";
300
+ }
301
+ return null;
302
+ }
227
303
  }
228
304
  UiUploadOrderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiUploadOrderComponent, deps: [{ token: i1.Lightbox }], target: i0.ɵɵFactoryTarget.Component });
229
- UiUploadOrderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UiUploadOrderComponent, selector: "ui-upload-order", inputs: { uploadObservable: "uploadObservable", url: "url", initialFiles: "initialFiles", multiple: "multiple", reorder: "reorder", maxFiles: "maxFiles", transparent: "transparent", lightBox: "lightBox", instantUpload: "instantUpload" }, outputs: { onRemove: "onRemove", onAdded: "onAdded", onAllAdded: "onAllAdded", onActivate: "onActivate", onInit: "onInit", onMaxReached: "onMaxReached", onReOrder: "onReOrder", onSelected: "onSelected", noFilesAdded: "noFilesAdded", onUploadError: "onUploadError" }, viewQueries: [{ propertyName: "myPond", first: true, predicate: ["myPond"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- app.component.html -->\r\n<file-pond #myPond name='UploadForm[imagem][]' [class.file-pont-transparent]=\"transparent\" [options]=\"pondOptions\"\r\n (oninit)=\"pondHandleInit($event)\" [files]=\"pondFiles\" (onupdatefiles)=\"pondHandleUpdate($event)\"\r\n (onactivatefile)=\"pondHandleActivateFile($event)\" (onremovefile)=\"pondHandleRemove($event)\"\r\n (onreorderfiles)=\"onReorderFiles($event)\" (onwarning)=\"warning($event)\"\r\n (onprocessfiles)=\"pondHandleAllFilesAdded($event)\" (onprocessfile)=\"pondHandleAddFile($event)\"\r\n (onerror)=\"pondHandleError()\" />", styles: [":host ::ng-deep .filepond--list-scroller{width:calc(100% - 25px);margin:auto;padding-bottom:20px}:host ::ng-deep .filepond--drop-label{color:#555;justify-content:flex-start;margin-left:20px}:host ::ng-deep .filepond--label-action{color:var(--theme-default);text-decoration-color:var(--theme-default)}:host ::ng-deep .filepond--panel-root{background-color:#fff;border:1.5px solid rgba(173,181,189,.5019607843);border-style:dashed;height:12%}:host ::ng-deep .filepond--image-preview-overlay{display:none}:host ::ng-deep .filepond--file-action-button{background-color:var(--theme-secondary);display:none}:host ::ng-deep .file-pont-transparent .filepond--image-preview,:host ::ng-deep .file-pont-transparent .filepond--item-panel{background:transparent!important}:host ::ng-deep .file-pont-transparent .filepond--file-info{display:none}:host ::ng-deep .file-pont-transparent .filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:none}:host ::ng-deep .filepond--file:hover .filepond--file-action-button{display:block}@media (max-width: 800px){:host ::ng-deep .filepond--panel-root{height:5%}}@media (max-width: 480px){:host ::ng-deep .filepond--panel-root{height:2%}}::ng-deep .dark-only .filepond--panel-root{background:transparent!important}::ng-deep .dark-only .filepond--drop-label{color:#ffffffb3}@media (min-width: 30em){:host ::ng-deep .filepond--item{width:calc(40% - .5em)}}@media (min-width: 50em){:host ::ng-deep .filepond--item{width:calc(25% - 7px)}}\n"], dependencies: [{ kind: "component", type: i2.FilePondComponent, selector: "file-pond", inputs: ["options", "files"], outputs: ["oninit", "onwarning", "onerror", "oninitfile", "onactivatefile", "onaddfilestart", "onaddfileprogress", "onaddfile", "onprocessfilestart", "onprocessfileprogress", "onprocessfileabort", "onprocessfilerevert", "onprocessfile", "onprocessfiles", "onremovefile", "onpreparefile", "onupdatefiles", "onreorderfiles"] }] });
305
+ UiUploadOrderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UiUploadOrderComponent, selector: "ui-upload-order", inputs: { uploadObservable: "uploadObservable", form: "form", controlName: "controlName", url: "url", deleteUrl: "deleteUrl", initialFiles: "initialFiles", multiple: "multiple", reorder: "reorder", maxFiles: "maxFiles", transparent: "transparent", lightBox: "lightBox", instantUpload: "instantUpload" }, outputs: { onRemove: "onRemove", onAdded: "onAdded", onAllAdded: "onAllAdded", onActivate: "onActivate", onInit: "onInit", onMaxReached: "onMaxReached", onReOrder: "onReOrder", onSelected: "onSelected", noFilesAdded: "noFilesAdded", onUploadError: "onUploadError" }, viewQueries: [{ propertyName: "myPond", first: true, predicate: ["myPond"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<!-- app.component.html -->\r\n<div class=\"position-relative\" [class.upload-invalid]=\"isErrorMessage()\">\r\n <file-pond #myPond name='UploadForm[imagem][]' [class.file-pont-transparent]=\"transparent\" [options]=\"pondOptions\"\r\n (oninit)=\"pondHandleInit($event)\" [files]=\"pondFiles\" (onupdatefiles)=\"pondHandleUpdate($event)\"\r\n (onactivatefile)=\"pondHandleActivateFile($event)\"\r\n (onreorderfiles)=\"onReorderFiles($event)\" (onwarning)=\"warning($event)\"\r\n (onprocessfiles)=\"pondHandleAllFilesAdded($event)\" (onprocessfile)=\"pondHandleAddFile($event)\"\r\n (onerror)=\"pondHandleError()\" />\r\n\r\n <div class=\"invalid-tooltip\" [class]=\"'tooltip-' + errorPosition\" [class.touched]=\"control?.touched\"\r\n *ngIf=\"isErrorMessage()\">\r\n {{isErrorMessage()}}\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep .filepond--list-scroller{width:calc(100% - 25px);margin:auto;padding-bottom:20px}:host ::ng-deep .filepond--drop-label{color:#555;justify-content:flex-start;margin-left:20px}:host ::ng-deep .filepond--label-action{color:var(--theme-default);text-decoration-color:var(--theme-default)}:host ::ng-deep .filepond--panel-root{background-color:#fff;border:1.5px solid rgba(173,181,189,.5019607843);border-style:dashed;height:12%}:host ::ng-deep .filepond--image-preview-overlay{display:none}:host ::ng-deep .filepond--file-action-button{background-color:var(--theme-secondary);display:none}:host ::ng-deep .file-pont-transparent .filepond--image-preview,:host ::ng-deep .file-pont-transparent .filepond--item-panel{background:transparent!important}:host ::ng-deep .file-pont-transparent .filepond--file-info{display:none}:host ::ng-deep .file-pont-transparent .filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:none}:host ::ng-deep .filepond--file:hover .filepond--file-action-button{display:block}@media (max-width: 800px){:host ::ng-deep .filepond--panel-root{height:5%}}@media (max-width: 480px){:host ::ng-deep .filepond--panel-root{height:2%}}::ng-deep .ng-submitted .upload-invalid .filepond--panel-root{border-color:#fc4438}::ng-deep .ng-submitted .upload-invalid .invalid-tooltip{display:block;transform:translate(-50%,-50%);top:0;right:0}::ng-deep .dark-only .filepond--panel-root{background:transparent!important}::ng-deep .dark-only .filepond--drop-label{color:#ffffffb3}@media (min-width: 30em){:host ::ng-deep .filepond--item{width:calc(40% - .5em)}}@media (min-width: 50em){:host ::ng-deep .filepond--item{width:calc(25% - 7px)}}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FilePondComponent, selector: "file-pond", inputs: ["options", "files"], outputs: ["oninit", "onwarning", "onerror", "oninitfile", "onactivatefile", "onaddfilestart", "onaddfileprogress", "onaddfile", "onprocessfilestart", "onprocessfileprogress", "onprocessfileabort", "onprocessfilerevert", "onprocessfile", "onprocessfiles", "onremovefile", "onpreparefile", "onupdatefiles", "onreorderfiles"] }] });
230
306
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiUploadOrderComponent, decorators: [{
231
307
  type: Component,
232
- args: [{ selector: 'ui-upload-order', template: "<!-- app.component.html -->\r\n<file-pond #myPond name='UploadForm[imagem][]' [class.file-pont-transparent]=\"transparent\" [options]=\"pondOptions\"\r\n (oninit)=\"pondHandleInit($event)\" [files]=\"pondFiles\" (onupdatefiles)=\"pondHandleUpdate($event)\"\r\n (onactivatefile)=\"pondHandleActivateFile($event)\" (onremovefile)=\"pondHandleRemove($event)\"\r\n (onreorderfiles)=\"onReorderFiles($event)\" (onwarning)=\"warning($event)\"\r\n (onprocessfiles)=\"pondHandleAllFilesAdded($event)\" (onprocessfile)=\"pondHandleAddFile($event)\"\r\n (onerror)=\"pondHandleError()\" />", styles: [":host ::ng-deep .filepond--list-scroller{width:calc(100% - 25px);margin:auto;padding-bottom:20px}:host ::ng-deep .filepond--drop-label{color:#555;justify-content:flex-start;margin-left:20px}:host ::ng-deep .filepond--label-action{color:var(--theme-default);text-decoration-color:var(--theme-default)}:host ::ng-deep .filepond--panel-root{background-color:#fff;border:1.5px solid rgba(173,181,189,.5019607843);border-style:dashed;height:12%}:host ::ng-deep .filepond--image-preview-overlay{display:none}:host ::ng-deep .filepond--file-action-button{background-color:var(--theme-secondary);display:none}:host ::ng-deep .file-pont-transparent .filepond--image-preview,:host ::ng-deep .file-pont-transparent .filepond--item-panel{background:transparent!important}:host ::ng-deep .file-pont-transparent .filepond--file-info{display:none}:host ::ng-deep .file-pont-transparent .filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:none}:host ::ng-deep .filepond--file:hover .filepond--file-action-button{display:block}@media (max-width: 800px){:host ::ng-deep .filepond--panel-root{height:5%}}@media (max-width: 480px){:host ::ng-deep .filepond--panel-root{height:2%}}::ng-deep .dark-only .filepond--panel-root{background:transparent!important}::ng-deep .dark-only .filepond--drop-label{color:#ffffffb3}@media (min-width: 30em){:host ::ng-deep .filepond--item{width:calc(40% - .5em)}}@media (min-width: 50em){:host ::ng-deep .filepond--item{width:calc(25% - 7px)}}\n"] }]
308
+ args: [{ selector: "ui-upload-order", template: "<!-- app.component.html -->\r\n<div class=\"position-relative\" [class.upload-invalid]=\"isErrorMessage()\">\r\n <file-pond #myPond name='UploadForm[imagem][]' [class.file-pont-transparent]=\"transparent\" [options]=\"pondOptions\"\r\n (oninit)=\"pondHandleInit($event)\" [files]=\"pondFiles\" (onupdatefiles)=\"pondHandleUpdate($event)\"\r\n (onactivatefile)=\"pondHandleActivateFile($event)\"\r\n (onreorderfiles)=\"onReorderFiles($event)\" (onwarning)=\"warning($event)\"\r\n (onprocessfiles)=\"pondHandleAllFilesAdded($event)\" (onprocessfile)=\"pondHandleAddFile($event)\"\r\n (onerror)=\"pondHandleError()\" />\r\n\r\n <div class=\"invalid-tooltip\" [class]=\"'tooltip-' + errorPosition\" [class.touched]=\"control?.touched\"\r\n *ngIf=\"isErrorMessage()\">\r\n {{isErrorMessage()}}\r\n </div>\r\n</div>\r\n", styles: [":host ::ng-deep .filepond--list-scroller{width:calc(100% - 25px);margin:auto;padding-bottom:20px}:host ::ng-deep .filepond--drop-label{color:#555;justify-content:flex-start;margin-left:20px}:host ::ng-deep .filepond--label-action{color:var(--theme-default);text-decoration-color:var(--theme-default)}:host ::ng-deep .filepond--panel-root{background-color:#fff;border:1.5px solid rgba(173,181,189,.5019607843);border-style:dashed;height:12%}:host ::ng-deep .filepond--image-preview-overlay{display:none}:host ::ng-deep .filepond--file-action-button{background-color:var(--theme-secondary);display:none}:host ::ng-deep .file-pont-transparent .filepond--image-preview,:host ::ng-deep .file-pont-transparent .filepond--item-panel{background:transparent!important}:host ::ng-deep .file-pont-transparent .filepond--file-info{display:none}:host ::ng-deep .file-pont-transparent .filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:none}:host ::ng-deep .filepond--file:hover .filepond--file-action-button{display:block}@media (max-width: 800px){:host ::ng-deep .filepond--panel-root{height:5%}}@media (max-width: 480px){:host ::ng-deep .filepond--panel-root{height:2%}}::ng-deep .ng-submitted .upload-invalid .filepond--panel-root{border-color:#fc4438}::ng-deep .ng-submitted .upload-invalid .invalid-tooltip{display:block;transform:translate(-50%,-50%);top:0;right:0}::ng-deep .dark-only .filepond--panel-root{background:transparent!important}::ng-deep .dark-only .filepond--drop-label{color:#ffffffb3}@media (min-width: 30em){:host ::ng-deep .filepond--item{width:calc(40% - .5em)}}@media (min-width: 50em){:host ::ng-deep .filepond--item{width:calc(25% - 7px)}}\n"] }]
233
309
  }], ctorParameters: function () { return [{ type: i1.Lightbox }]; }, propDecorators: { uploadObservable: [{
234
310
  type: Input
311
+ }], form: [{
312
+ type: Input
313
+ }], controlName: [{
314
+ type: Input
235
315
  }], url: [{
236
316
  type: Input
317
+ }], deleteUrl: [{
318
+ type: Input
237
319
  }], initialFiles: [{
238
320
  type: Input
239
321
  }], multiple: [{
@@ -272,4 +354,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
272
354
  type: ViewChild,
273
355
  args: ["myPond"]
274
356
  }] } });
275
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktdXBsb2FkLW9yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXVwbG9hZC1vcmRlci9zcmMvbGliL3VpLXVwbG9hZC1vcmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS11cGxvYWQtb3JkZXIvc3JjL2xpYi91aS11cGxvYWQtb3JkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxpQkFBaUIsR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUVsRCxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBT2hELE1BQU0sT0FBTyxzQkFBc0I7SUEwQi9CLFlBQW9CLFNBQW1CO1FBQW5CLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFwQjlCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixhQUFRLEdBQVcsQ0FBQyxDQUFDO1FBRXJCLGFBQVEsR0FBWSxJQUFJLENBQUM7UUFDekIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFN0IsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDdEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDckMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFZLENBQUM7UUFDMUMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFnQixDQUFDO1FBQzlDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUN0RCxpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDMUMsY0FBUyxHQUFH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WG5DLG1sQkFNb0M7NEZES3ZCLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDSSxpQkFBaUI7K0ZBS2xCLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFHRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csTUFBTTtzQkFBZixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFFYyxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgRmlsZVBvbmRDb21wb25lbnQsIH0gZnJvbSBcIm5neC1maWxlcG9uZFwiO1xyXG5pbXBvcnQgeyBGaWxlUG9uZCwgRmlsZVBvbmRGaWxlLCBGaWxlUG9uZE9wdGlvbnMgfSBmcm9tIFwiZmlsZXBvbmRcIjtcclxuaW1wb3J0IHsgSUFsYnVtLCBMaWdodGJveCB9IGZyb20gJ25neC1saWdodGJveCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndWktdXBsb2FkLW9yZGVyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91aS11cGxvYWQtb3JkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdWktdXBsb2FkLW9yZGVyLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFVpVXBsb2FkT3JkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIHVwbG9hZE9ic2VydmFibGU6IE9ic2VydmFibGU8dm9pZD47XHJcbiAgICBwcml2YXRlIGV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uXHJcblxyXG4gICAgQElucHV0KCkgdXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBpbml0aWFsRmlsZXM6IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcmVvcmRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBtYXhGaWxlczogbnVtYmVyID0gNjtcclxuICAgIEBJbnB1dCgpIHRyYW5zcGFyZW50OiBib29sZWFuO1xyXG4gICAgQElucHV0KCkgbGlnaHRCb3g6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgaW5zdGFudFVwbG9hZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgQE91dHB1dCgpIG9uUmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25BZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWxsQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWN0aXZhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVQb25kRmlsZT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkluaXQgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVQb25kT3B0aW9uc1tcImZpbGVzXCJdPigpO1xyXG4gICAgQE91dHB1dCgpIG9uTWF4UmVhY2hlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gICAgQE91dHB1dCgpIG9uUmVPcmRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVBvbmRGaWxlW10+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25TZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG5vRmlsZXNBZGRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gICAgQE91dHB1dCgpIG9uVXBsb2FkRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKFwibXlQb25kXCIpIG15UG9uZDogRmlsZVBvbmRDb21wb25lbnQ7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfbGlnaHRib3g6IExpZ2h0Ym94KSB7IH1cclxuXHJcbiAgICBwdWJsaWMgcG9uZDogRmlsZVBvbmQ7XHJcbiAgICBwdWJsaWMgcG9uZE9wdGlvbnM6IEZpbGVQb25kT3B0aW9ucztcclxuICAgIHB1YmxpYyBwb25kRmlsZXM6IEZpbGVQb25kT3B0aW9uc1tcImZpbGVzXCJdID0gW107XHJcbiAgICBwdWJsaWMgYWxidW06IElBbGJ1bVtdID0gW107XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wb25kT3B0aW9ucyA9IHtcclxuICAgICAgICAgICAgYWxsb3dNdWx0aXBsZTogdGhpcy5tdWx0aXBsZSxcclxuICAgICAgICAgICAgbGFiZWxJZGxlOiAnQXJyYXN0ZSBzZXVzIGFycXVpdm9zIG91IDxzcGFuIGNsYXNzPVwiZmlsZXBvbmQtLWxhYmVsLWFjdGlvblwiPmNsaXF1ZSBhcXVpPC9zcGFuPiBwYXJhIHNlbGVjaW9uYXIuJyxcclxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyOiB0aGlzLnJlb3JkZXIsXHJcbiAgICAgICAgICAgIG1heEZpbGVzOiB0aGlzLm1heEZpbGVzLFxyXG4gICAgICAgICAgICBhY2NlcHRlZEZpbGVUeXBlczogWydpbWFnZS8qJ10sXHJcbiAgICAgICAgICAgIGluc3RhbnRVcGxvYWQ6IHRoaXMuaW5zdGFudFVwbG9hZCxcclxuICAgICAgICAgICAgYWxsb3dQcm9jZXNzOiB0aGlzLmluc3RhbnRVcGxvYWQsXHJcbiAgICAgICAgICAgIGRyb3BWYWxpZGF0aW9uOiB0cnVlLFxyXG4gICAgICAgICAgICBpY29uUmVtb3ZlOiBgPHN2ZyB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE1IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxtYXNrIGlkPVwibWFzazBfMzcwNjdfMzQxNDZcIiBzdHlsZT1cIm1hc2stdHlwZTphbHBoYVwiIG1hc2tVbml0cz1cInVzZXJTcGFjZU9uVXNlXCIgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNlwiPlxyXG4gICAgICAgICAgICA8cmVjdCB4PVwiMC4xMzA4NTlcIiB5PVwiMC42MzE1OTJcIiB3aWR0aD1cIjE0LjczNjhcIiBoZWlnaHQ9XCIxNC43MzY4XCIgZmlsbD1cIiNEOUQ5RDlcIi8+XHJcbiAgICAgICAgICAgIDwvbWFzaz5cclxuICAgICAgICAgICAgPGcgbWFzaz1cInVybCgjbWFzazBfMzcwNjdfMzQxNDYpXCI+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNNC40MyAxMy41MjYzQzQuMDkyMjggMTMuNTI2MyAzLjgwMzE3IDEzLjQwNiAzLjU2MjY3IDEzLjE2NTVDMy4zMjIxNyAxMi45MjUgMy4yMDE5MyAxMi42MzU5IDMuMjAxOTMgMTIuMjk4MlY0LjMxNTc0QzMuMDI3OTUgNC4zMTU3NCAyLjg4MjEyIDQuMjU2ODkgMi43NjQ0MyA0LjEzOTJDMi42NDY3NCA0LjAyMTUxIDIuNTg3ODkgMy44NzU2OCAyLjU4Nzg5IDMuNzAxN0MyLjU4Nzg5IDMuNTI3NzMgMi42NDY3NCAzLjM4MTg5IDIuNzY0NDMgMy4yNjQyQzIuODgyMTIgMy4xNDY1MSAzLjAyNzk1IDMuMDg3NjcgMy4yMDE5MyAzLjA4NzY3SDUuNjU4MDdDNS42NTgwNyAyLjkxMzY5IDUuNzE2OTEgMi43Njc4NiA1LjgzNDYgMi42NTAxN0M1Ljk1MjI5IDIuNTMyNDggNi4wOTgxMiAyLjQ3MzYzIDYuMjcyMSAyLjQ3MzYzSDguNzI4MjRDOC45MDIyMiAyLjQ3MzYzIDkuMDQ4MDUgMi41MzI0OCA5LjE2NTc0IDIuNjUwMTdDOS4yODM0MyAyLjc2Nzg2IDkuMzQyMjggMi45MTM2OSA5LjM0MjI4IDMuMDg3NjdIMTEuNzk4NEMxMS45NzI0IDMuMDg3NjcgMTIuMTE4MiAzLjE0NjUxIDEyLjIzNTkgMy4yNjQyQzEyLjM1MzYgMy4zODE4OSAxMi40MTI1IDMuNTI3NzMgMTIuNDEyNSAzLjcwMTdDMTIuNDEyNSAzLjg3NTY4IDEyLjM1MzYgNC4wMjE1MSAxMi4yMzU5IDQuMTM5MkMxMi4xMTgyIDQuMjU2ODkgMTEuOTcyNCA0LjMxNTc0IDExLjc5ODQgNC4zMTU3NFYxMi4yOTgyQzExLjc5ODQgMTIuNjM1OSAxMS42NzgyIDEyLjkyNSAxMS40Mzc3IDEzLjE2NTVDMTEuMTk3MiAxMy40MDYgMTAuOTA4MSAxMy41MjYzIDEwLjU3MDMgMTMuNTI2M0g0LjQzWk00LjQzIDQuMzE1NzRWMTIuMjk4MkgxMC41NzAzVjQuMzE1NzRINC40M1pNNy41MDAxNyA5LjE2NjYyTDguNjY2ODQgMTAuMzMzM0M4Ljc4OTY1IDEwLjQ0NTkgOC45MzU0OCAxMC41MDIxIDkuMTA0MzQgMTAuNTAyMUM5LjI3MzIgMTAuNTAyMSA5LjQxMzkxIDEwLjQ0NTkgOS41MjY0OSAxMC4zMzMzQzkuNjQ5MjkgMTAuMjEwNSA5LjcxMDcgMTAuMDY0NiA5LjcxMDcgOS44OTU3OEM5LjcxMDcgOS43MjY5MiA5LjY0OTI5IDkuNTg2MjEgOS41MjY0OSA5LjQ3MzYzTDguMzU5ODIgOC4zMDY5N0w5LjUyNjQ5IDcuMTQwM0M5LjY0OTI5IDcuMDE3NDkgOS43MTA3IDYuODcxNjYgOS43MTA3IDYuNzAyOEM5LjcxMDcgNi41MzM5NCA5LjY0OTI5IDYuMzkzMjIgOS41MjY0OSA2LjI4MDY1QzkuNDEzOTEgNi4xNTc4NCA5LjI3MzIgNi4wOTY0NCA5LjEwNDM0IDYuMDk2NDRDOC45MzU0OCA2LjA5NjQ0IDguNzg5NjUgNi4xNTc4NCA4LjY2Njg0IDYuMjgwNjVMNy41MDAxNyA3LjQ0NzMyTDYuMzMzNSA2LjI4MDY1QzYuMjIwOTMgNi4xNTc4NCA2LjA4MDIyIDYuMDk2NDQgNS45MTEzNiA2LjA5NjQ0QzUuNzQyNSA2LjA5NjQ0IDUuNTk2NjYgNi4xNTc4NCA1LjQ3Mzg2IDYuMjgwNjVDNS4zNjEyOCA2LjM5MzIyIDUuMzA1IDYuNTMzOTQgNS4zMDUgNi43MDI4QzUuMzA1IDYuODcxNjYgNS4zNjEyOCA3LjAxNzQ5IDUuNDczODYgNy4xNDAzTDYuNjQwNTIgOC4zMDY5N0w1LjQ3Mzg2IDkuNDczNjNDNS4zNjEyOCA5LjU4NjIxIDUuMzA1IDkuNzI2OTIgNS4zMDUgOS44OTU3OEM1LjMwNSAxMC4wNjQ2IDUuMzYxMjggMTAuMjEwNSA1LjQ3Mzg2IDEwLjMzMzNDNS41OTY2NiAxMC40NDU5IDUuNzQyNSAxMC41MDIxIDUuOTExMzYgMTAuNTAyMUM2LjA4MDIyIDEwLjUwMjEgNi4yMjA5MyAxMC40NDU5IDYuMzMzNSAxMC4zMzMzTDcuNTAwMTcgOS4xNjY2MlpcIiBmaWxsPVwid2hpdGVcIi8+XHJcbiAgICAgICAgICAgIDwvZz48L3N2Zz5gLFxyXG4gICAgICAgICAgICBzdHlsZUJ1dHRvblJlbW92ZUl0ZW1Qb3NpdGlvbjogJ3JpZ2h0JyxcclxuICAgICAgICAgICAgaW1hZ2VSZXNpemVNb2RlOiAnY29udGFpbicsXHJcbiAgICAgICAgICAgIHN0eWxlSXRlbVBhbmVsQXNwZWN0UmF0aW86ICcwLjc1JyxcclxuICAgICAgICAgICAgaXRlbUluc2VydExvY2F0aW9uOiAnYWZ0ZXInLFxyXG4gICAgICAgICAgICBjcmVkaXRzOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VydmVyOiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzOiAoZmllbGROYW1lLCBmaWxlLCBtZXRhZGF0YSwgbG9hZCwgZXJyb3IsIHByb2dyZXNzLCBhYm9ydCwgdHJhbnNmZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZE5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBpcyB0aGUgYWN0dWFsIGZpbGUgb2JqZWN0IHRvIHNlbmRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZE5hbWUsIGZpbGUsIGZpbGUubmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCB0aGlzLnVybCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBjYWxsIHRoZSBwcm9ncmVzcyBtZXRob2QgdG8gdXBkYXRlIHRoZSBwcm9ncmVzcyB0byAxMDAlIGJlZm9yZSBjYWxsaW5nIGxvYWRcclxuICAgICAgICAgICAgICAgICAgICAvLyBTZXR0aW5nIGNvbXB1dGFibGUgdG8gZmFsc2Ugc3dpdGNoZXMgdGhlIGxvYWRpbmcgaW5kaWNhdG9yIHRvIGluZmluaXRlIG1vZGVcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnVwbG9hZC5vbnByb2dyZXNzID0gKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MoZS5sZW5ndGhDb21wdXRhYmxlLCBlLmxvYWRlZCwgZS50b3RhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGNhbGwgdGhlIGxvYWQgbWV0aG9kIHdoZW4gZG9uZSBhbmQgcGFzcyB0aGUgcmV0dXJuZWQgc2VydmVyIGZpbGUgaWRcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNlcnZlciBmaWxlIGlkIGlzIHRoZW4gdXNlZCBsYXRlciBvbiB3aGVuIHJldmVydGluZyBvciByZXN0b3JpbmcgYSBmaWxlXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gc28geW91ciBzZXJ2ZXIga25vd3Mgd2hpY2ggZmlsZSB0byByZXR1cm4gd2l0aG91dCBleHBvc2luZyB0aGF0IGluZm8gdG8gdGhlIGNsaWVudFxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPj0gMjAwICYmIHJlcXVlc3Quc3RhdHVzIDwgMzAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZCBtZXRob2QgYWNjZXB0cyBlaXRoZXIgYSBzdHJpbmcgKGlkKSBvciBhbiBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQocmVxdWVzdC5yZXNwb25zZVRleHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGNhbGwgdGhlIGVycm9yIG1ldGhvZCBpZiBzb21ldGhpbmcgaXMgd3JvbmcsIHNob3VsZCBleGl0IGFmdGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcignb2ggbm8nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChmb3JtRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBleHBvc2UgYW4gYWJvcnQgbWV0aG9kIHNvIHRoZSByZXF1ZXN0IGNhbiBiZSBjYW5jZWxsZWRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBlbnRlcmVkIGlmIHRoZSB1c2VyIGhhcyB0YXBwZWQgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRmlsZVBvbmQga25vdyB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjYW5jZWxsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBsb2FkOiAoc291cmNlLCBsb2FkLCBlcnJvciwgcHJvZ3Jlc3MsIGFib3J0LCBoZWFkZXJzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIG15UmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2gobXlSZXF1ZXN0KS50aGVuKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlsZSBleHRlbnNpb24gZnJvbSB0aGUgc291cmNlIFVSTFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IHNvdXJjZS5zcGxpdCgnLicpLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFwIGZpbGUgZXh0ZW5zaW9ucyB0byBNSU1FIHR5cGVzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW1lVHlwZU1hcCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2VicCc6ICdpbWFnZS93ZWJwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnanBnJzogJ2ltYWdlL2pwZWcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqcGVnJzogJ2ltYWdlL2pwZWcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbmcnOiAnaW1hZ2UvcG5nJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgb3RoZXIgc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFzIG5lZWRlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVUeXBlID0gbWltZVR5cGVNYXBbZmlsZUV4dGVuc2lvbl0gfHwgY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXlCbG9iID0gbmV3IEJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogZmlsZVR5cGUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkKG15QmxvYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW50VXBsb2FkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzU3Vic2NyaXB0aW9uID0gdGhpcy51cGxvYWRPYnNlcnZhYmxlLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwbG9hZEZpbGVzKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pbml0aWFsRmlsZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5wb25kRmlsZXMgPSB0aGlzLmluaXRpYWxGaWxlcy5tYXAoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGl0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbG9jYWwnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbnRVcGxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUVycm9yKCkge1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRFcnJvci5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUluaXQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25Jbml0LmVtaXQodGhpcy5wb25kRmlsZXMpXHJcblxyXG4gICAgICAgIHRoaXMucG9uZCA9IGV2ZW50LnBvbmQ7XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUFkZEZpbGUoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZE5hbWUgPSBldmVudC5maWxlPy5zZXJ2ZXJJZD8ucmVwbGFjZSgvW1wiXFxbXFxdXS9nLCAnJyk7XHJcbiAgICAgICAgdGhpcy5vbkFkZGVkLmVtaXQoZm9ybWF0dGVkTmFtZSlcclxuICAgIH1cclxuXHJcbiAgICAvL1PDsyBmdW5jaW9uYSBxdWFuZG8gbsOjbyB0ZW0gYXJxdWl2b3MgaW5pY2lhaXNcclxuICAgIHBvbmRIYW5kbGVBbGxGaWxlc0FkZGVkKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBmaWxlc0xpc3Q6IHN0cmluZ1tdID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBldmVudC5wb25kLmdldEZpbGVzKCk7XHJcblxyXG4gICAgICAgIGZpbGVzLmZvckVhY2goKGZpbGU6IEZpbGVQb25kRmlsZSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZm9ybWF0dGVkTmFtZSA9IGZpbGUuc2VydmVySWQ/LnJlcGxhY2UoL1tcIlxcW1xcXV0vZywgJycpO1xyXG4gICAgICAgICAgICBmaWxlc0xpc3QucHVzaChmb3JtYXR0ZWROYW1lKTtcclxuXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMub25BbGxBZGRlZC5lbWl0KGZpbGVzTGlzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUFjdGl2YXRlRmlsZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5vbkFjdGl2YXRlLmVtaXQoZXZlbnQpO1xyXG4gICAgICAgIHRoaXMubGlnaHRCb3ggJiYgdGhpcy5vcGVuTGlnaHRCb3goZXZlbnQuZmlsZS5maWxlbmFtZVdpdGhvdXRFeHRlbnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHBvbmRIYW5kbGVVcGRhdGUoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMuZmlsbEFsYnVtKGV2ZW50Lml0ZW1zKVxyXG4gICAgfVxyXG5cclxuICAgIHBvbmRIYW5kbGVSZW1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGlmIChldmVudC5maWxlLnNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSBldmVudC5maWxlLnNlcnZlcklkPy5yZXBsYWNlKC9bXCJcXFtcXF1dL2csICcnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBmaWxlTmFtZSA9IGV2ZW50LmZpbGU/LmZpbGVuYW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5vblJlbW92ZS5lbWl0KGZpbGVOYW1lKVxyXG4gICAgfVxyXG5cclxuICAgIG9uUmVvcmRlckZpbGVzKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmZpbGxBbGJ1bShldmVudC5pdGVtcywgdHJ1ZSlcclxuICAgICAgICBsZXQgaXRlbXNMaXN0ID0gZXZlbnQuaXRlbXMubWFwKChpdGVtOiBGaWxlUG9uZEZpbGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uc291cmNlIGluc3RhbmNlb2YgRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uc2VydmVySWQucmVwbGFjZSgvW1wiXFxbXFxdXS9nLCAnJyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5maWxlbmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLm9uUmVPcmRlci5lbWl0KGl0ZW1zTGlzdClcclxuICAgIH1cclxuXHJcbiAgICB3YXJuaW5nKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoZXZlbnQuZXJyb3IuY29kZSA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25NYXhSZWFjaGVkLmVtaXQoYExpbWl0ZSBkZSBBcnF1aXZvcyBhdGluZ2lkby4gVm9jw6ogcG9kZSBpbnNlcmlyIHVtIHRvdGFsIGRlICR7dGhpcy5tYXhGaWxlc30gYXJxdWl2b3MuYClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkxpZ2h0Qm94KGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmFsYnVtLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5jYXB0aW9uOyB9KS5pbmRleE9mKGZpbGVOYW1lKTtcclxuICAgICAgICB0aGlzLl9saWdodGJveC5vcGVuKHRoaXMuYWxidW0sIGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmaWxsQWxidW0oZmlsZXM6IFtdLCByZU9yZGVyPzogYm9vbGVhbikge1xyXG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggIT09IHRoaXMuYWxidW0ubGVuZ3RoIHx8IHJlT3JkZXIpIHtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByZUFsYnVtID0gYXdhaXQgUHJvbWlzZS5hbGwoZmlsZXMubWFwKGFzeW5jIChmaWxlOiBGaWxlUG9uZEZpbGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBmaWxlVXJsOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGZpbGUuc291cmNlIGluc3RhbmNlb2YgRmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbGVVcmwgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXN5bmMoZmlsZS5zb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxlVXJsID0gZmlsZS5zb3VyY2UudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNyYzogZmlsZVVybCxcclxuICAgICAgICAgICAgICAgICAgICBjYXB0aW9uOiBmaWxlLmZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbixcclxuICAgICAgICAgICAgICAgICAgICB0aHVtYjogJydcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWxidW0gPSBwcmVBbGJ1bTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZEZpbGVBc3luYyhmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVXJsID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBkYXRhVXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVVcmwpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwbG9hZEZpbGVzKCkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5wb25kLmdldEZpbGVzKCk7XHJcbiAgICAgICAgZmlsZXMubGVuZ3RoID4gMCA/IHRoaXMucG9uZC5wcm9jZXNzRmlsZXMoKSA6IHRoaXMubm9GaWxlc0FkZGVkLmVtaXQoKTtcclxuICAgIH1cclxufVxyXG4iLCI8IS0tIGFwcC5jb21wb25lbnQuaHRtbCAtLT5cclxuPGZpbGUtcG9uZCAjbXlQb25kIG5hbWU9J1VwbG9hZEZvcm1baW1hZ2VtXVtdJyBbY2xhc3MuZmlsZS1wb250LXRyYW5zcGFyZW50XT1cInRyYW5zcGFyZW50XCIgW29wdGlvbnNdPVwicG9uZE9wdGlvbnNcIlxyXG4gICAgKG9uaW5pdCk9XCJwb25kSGFuZGxlSW5pdCgkZXZlbnQpXCIgW2ZpbGVzXT1cInBvbmRGaWxlc1wiIChvbnVwZGF0ZWZpbGVzKT1cInBvbmRIYW5kbGVVcGRhdGUoJGV2ZW50KVwiXHJcbiAgICAob25hY3RpdmF0ZWZpbGUpPVwicG9uZEhhbmRsZUFjdGl2YXRlRmlsZSgkZXZlbnQpXCIgKG9ucmVtb3ZlZmlsZSk9XCJwb25kSGFuZGxlUmVtb3ZlKCRldmVudClcIlxyXG4gICAgKG9ucmVvcmRlcmZpbGVzKT1cIm9uUmVvcmRlckZpbGVzKCRldmVudClcIiAob253YXJuaW5nKT1cIndhcm5pbmcoJGV2ZW50KVwiXHJcbiAgICAob25wcm9jZXNzZmlsZXMpPVwicG9uZEhhbmRsZUFsbEZpbGVzQWRkZWQoJGV2ZW50KVwiIChvbnByb2Nlc3NmaWxlKT1cInBvbmRIYW5kbGVBZGRGaWxlKCRldmVudClcIlxyXG4gICAgKG9uZXJyb3IpPVwicG9uZEhhbmRsZUVycm9yKClcIiAvPiJdfQ==
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktdXBsb2FkLW9yZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXVwbG9hZC1vcmRlci9zcmMvbGliL3VpLXVwbG9hZC1vcmRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy91aS11cGxvYWQtb3JkZXIvc3JjL2xpYi91aS11cGxvYWQtb3JkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFnQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRCxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQVFsRCxNQUFNLE9BQU8sc0JBQXNCO0lBOEIvQixZQUFvQixTQUFtQjtRQUFuQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBcEI5QixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFDeEIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUV0QixhQUFRLEdBQVksSUFBSSxDQUFDO1FBQ3pCLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBRTdCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3RDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3JDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBQzFDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztRQUM5QyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQTRCLENBQUM7UUFDdEQs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O2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUVjLE1BQU07c0JBQTFCLFNBQVM7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGaWxlUG9uZENvbXBvbmVudCB9IGZyb20gXCJuZ3gtZmlsZXBvbmRcIjtcclxuaW1wb3J0IHsgRmlsZVBvbmQsIEZpbGVQb25kRmlsZSwgRmlsZVBvbmRJbml0aWFsRmlsZSwgRmlsZVBvbmRPcHRpb25zIH0gZnJvbSBcImZpbGVwb25kXCI7XHJcbmltcG9ydCB7IElBbGJ1bSwgTGlnaHRib3ggfSBmcm9tIFwibmd4LWxpZ2h0Ym94XCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHsgbG9nIH0gZnJvbSBcImNvbnNvbGVcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6IFwidWktdXBsb2FkLW9yZGVyXCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCIuL3VpLXVwbG9hZC1vcmRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgc3R5bGVVcmxzOiBbXCIuL3VpLXVwbG9hZC1vcmRlci5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVpVXBsb2FkT3JkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICAgIEBJbnB1dCgpIHVwbG9hZE9ic2VydmFibGU6IE9ic2VydmFibGU8dm9pZD47XHJcbiAgICBwcml2YXRlIGV2ZW50c1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgICBASW5wdXQoKSBjb250cm9sTmFtZTogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIHVybDogc3RyaW5nO1xyXG4gICAgQElucHV0KCkgZGVsZXRlVXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSBpbml0aWFsRmlsZXM6IHN0cmluZ1tdO1xyXG4gICAgQElucHV0KCkgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcmVvcmRlcjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBtYXhGaWxlczogbnVtYmVyID0gMTA7XHJcbiAgICBASW5wdXQoKSB0cmFuc3BhcmVudDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIGxpZ2h0Qm94OiBib29sZWFuID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIGluc3RhbnRVcGxvYWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIEBPdXRwdXQoKSBvblJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gICAgQE91dHB1dCgpIG9uQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFsbEFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmdbXT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbkFjdGl2YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlUG9uZEZpbGU+KCk7XHJcbiAgICBAT3V0cHV0KCkgb25Jbml0ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlUG9uZE9wdGlvbnNbXCJmaWxlc1wiXT4oKTtcclxuICAgIEBPdXRwdXQoKSBvbk1heFJlYWNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgIEBPdXRwdXQoKSBvblJlT3JkZXIgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVQb25kRmlsZVtdPigpO1xyXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBub0ZpbGVzQWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAgIEBPdXRwdXQoKSBvblVwbG9hZEVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcIm15UG9uZFwiKSBteVBvbmQ6IEZpbGVQb25kQ29tcG9uZW50O1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xpZ2h0Ym94OiBMaWdodGJveCkge31cclxuXHJcbiAgICBwdWJsaWMgcG9uZDogRmlsZVBvbmQ7XHJcbiAgICBwdWJsaWMgcG9uZE9wdGlvbnM6IEZpbGVQb25kT3B0aW9ucztcclxuICAgIC8vIHB1YmxpYyBwb25kRmlsZXM6IEZpbGVQb25kT3B0aW9uc1tcImZpbGVzXCJdID0gW107XHJcbiAgICBwdWJsaWMgcG9uZEZpbGVzOiBGaWxlUG9uZEluaXRpYWxGaWxlW10gPSBbXTtcclxuICAgIHB1YmxpYyBhbGJ1bTogSUFsYnVtW10gPSBbXTtcclxuICAgIHB1YmxpYyBwb25kRmlsZXNJbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucG9uZE9wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIGFsbG93TXVsdGlwbGU6IHRoaXMubXVsdGlwbGUsXHJcbiAgICAgICAgICAgIGxhYmVsSWRsZTpcclxuICAgICAgICAgICAgICAgICdBcnJhc3RlIHNldXMgYXJxdWl2b3Mgb3UgPHNwYW4gY2xhc3M9XCJmaWxlcG9uZC0tbGFiZWwtYWN0aW9uXCI+Y2xpcXVlIGFxdWk8L3NwYW4+IHBhcmEgc2VsZWNpb25hci4nLFxyXG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXI6IHRoaXMucmVvcmRlcixcclxuICAgICAgICAgICAgbWF4RmlsZXM6IHRoaXMubWF4RmlsZXMsXHJcbiAgICAgICAgICAgIGFjY2VwdGVkRmlsZVR5cGVzOiBbXCJpbWFnZS8qXCJdLFxyXG4gICAgICAgICAgICBpbnN0YW50VXBsb2FkOiB0aGlzLmluc3RhbnRVcGxvYWQsXHJcbiAgICAgICAgICAgIGFsbG93UHJvY2VzczogdGhpcy5pbnN0YW50VXBsb2FkLFxyXG4gICAgICAgICAgICBkcm9wVmFsaWRhdGlvbjogdHJ1ZSxcclxuICAgICAgICAgICAgaWNvblJlbW92ZTogYDxzdmcgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNSAxNlwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8bWFzayBpZD1cIm1hc2swXzM3MDY3XzM0MTQ2XCIgc3R5bGU9XCJtYXNrLXR5cGU6YWxwaGFcIiBtYXNrVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiIHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTZcIj5cclxuICAgICAgICAgICAgPHJlY3QgeD1cIjAuMTMwODU5XCIgeT1cIjAuNjMxNTkyXCIgd2lkdGg9XCIxNC43MzY4XCIgaGVpZ2h0PVwiMTQuNzM2OFwiIGZpbGw9XCIjRDlEOUQ5XCIvPlxyXG4gICAgICAgICAgICA8L21hc2s+XHJcbiAgICAgICAgICAgIDxnIG1hc2s9XCJ1cmwoI21hc2swXzM3MDY3XzM0MTQ2KVwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTQuNDMgMTMuNTI2M0M0LjA5MjI4IDEzLjUyNjMgMy44MDMxNyAxMy40MDYgMy41NjI2NyAxMy4xNjU1QzMuMzIyMTcgMTIuOTI1IDMuMjAxOTMgMTIuNjM1OSAzLjIwMTkzIDEyLjI5ODJWNC4zMTU3NEMzLjAyNzk1IDQuMzE1NzQgMi44ODIxMiA0LjI1Njg5IDIuNzY0NDMgNC4xMzkyQzIuNjQ2NzQgNC4wMjE1MSAyLjU4Nzg5IDMuODc1NjggMi41ODc4OSAzLjcwMTdDMi41ODc4OSAzLjUyNzczIDIuNjQ2NzQgMy4zODE4OSAyLjc2NDQzIDMuMjY0MkMyLjg4MjEyIDMuMTQ2NTEgMy4wMjc5NSAzLjA4NzY3IDMuMjAxOTMgMy4wODc2N0g1LjY1ODA3QzUuNjU4MDcgMi45MTM2OSA1LjcxNjkxIDIuNzY3ODYgNS44MzQ2IDIuNjUwMTdDNS45NTIyOSAyLjUzMjQ4IDYuMDk4MTIgMi40NzM2MyA2LjI3MjEgMi40NzM2M0g4LjcyODI0QzguOTAyMjIgMi40NzM2MyA5LjA0ODA1IDIuNTMyNDggOS4xNjU3NCAyLjY1MDE3QzkuMjgzNDMgMi43Njc4NiA5LjM0MjI4IDIuOTEzNjkgOS4zNDIyOCAzLjA4NzY3SDExLjc5ODRDMTEuOTcyNCAzLjA4NzY3IDEyLjExODIgMy4xNDY1MSAxMi4yMzU5IDMuMjY0MkMxMi4zNTM2IDMuMzgxODkgMTIuNDEyNSAzLjUyNzczIDEyLjQxMjUgMy43MDE3QzEyLjQxMjUgMy44NzU2OCAxMi4zNTM2IDQuMDIxNTEgMTIuMjM1OSA0LjEzOTJDMTIuMTE4MiA0LjI1Njg5IDExLjk3MjQgNC4zMTU3NCAxMS43OTg0IDQuMzE1NzRWMTIuMjk4MkMxMS43OTg0IDEyLjYzNTkgMTEuNjc4MiAxMi45MjUgMTEuNDM3NyAxMy4xNjU1QzExLjE5NzIgMTMuNDA2IDEwLjkwODEgMTMuNTI2MyAxMC41NzAzIDEzLjUyNjNINC40M1pNNC40MyA0LjMxNTc0VjEyLjI5ODJIMTAuNTcwM1Y0LjMxNTc0SDQuNDNaTTcuNTAwMTcgOS4xNjY2Mkw4LjY2Njg0IDEwLjMzMzNDOC43ODk2NSAxMC40NDU5IDguOTM1NDggMTAuNTAyMSA5LjEwNDM0IDEwLjUwMjFDOS4yNzMyIDEwLjUwMjEgOS40MTM5MSAxMC40NDU5IDkuNTI2NDkgMTAuMzMzM0M5LjY0OTI5IDEwLjIxMDUgOS43MTA3IDEwLjA2NDYgOS43MTA3IDkuODk1NzhDOS43MTA3IDkuNzI2OTIgOS42NDkyOSA5LjU4NjIxIDkuNTI2NDkgOS40NzM2M0w4LjM1OTgyIDguMzA2OTdMOS41MjY0OSA3LjE0MDNDOS42NDkyOSA3LjAxNzQ5IDkuNzEwNyA2Ljg3MTY2IDkuNzEwNyA2LjcwMjhDOS43MTA3IDYuNTMzOTQgOS42NDkyOSA2LjM5MzIyIDkuNTI2NDkgNi4yODA2NUM5LjQxMzkxIDYuMTU3ODQgOS4yNzMyIDYuMDk2NDQgOS4xMDQzNCA2LjA5NjQ0QzguOTM1NDggNi4wOTY0NCA4Ljc4OTY1IDYuMTU3ODQgOC42NjY4NCA2LjI4MDY1TDcuNTAwMTcgNy40NDczMkw2LjMzMzUgNi4yODA2NUM2LjIyMDkzIDYuMTU3ODQgNi4wODAyMiA2LjA5NjQ0IDUuOTExMzYgNi4wOTY0NEM1Ljc0MjUgNi4wOTY0NCA1LjU5NjY2IDYuMTU3ODQgNS40NzM4NiA2LjI4MDY1QzUuMzYxMjggNi4zOTMyMiA1LjMwNSA2LjUzMzk0IDUuMzA1IDYuNzAyOEM1LjMwNSA2Ljg3MTY2IDUuMzYxMjggNy4wMTc0OSA1LjQ3Mzg2IDcuMTQwM0w2LjY0MDUyIDguMzA2OTdMNS40NzM4NiA5LjQ3MzYzQzUuMzYxMjggOS41ODYyMSA1LjMwNSA5LjcyNjkyIDUuMzA1IDkuODk1NzhDNS4zMDUgMTAuMDY0NiA1LjM2MTI4IDEwLjIxMDUgNS40NzM4NiAxMC4zMzMzQzUuNTk2NjYgMTAuNDQ1OSA1Ljc0MjUgMTAuNTAyMSA1LjkxMTM2IDEwLjUwMjFDNi4wODAyMiAxMC41MDIxIDYuMjIwOTMgMTAuNDQ1OSA2LjMzMzUgMTAuMzMzM0w3LjUwMDE3IDkuMTY2NjJaXCIgZmlsbD1cIndoaXRlXCIvPlxyXG4gICAgICAgICAgICA8L2c+PC9zdmc+YCxcclxuICAgICAgICAgICAgc3R5bGVCdXR0b25SZW1vdmVJdGVtUG9zaXRpb246IFwicmlnaHRcIixcclxuICAgICAgICAgICAgaW1hZ2VSZXNpemVNb2RlOiBcImNvbnRhaW5cIixcclxuICAgICAgICAgICAgc3R5bGVJdGVtUGFuZWxBc3BlY3RSYXRpbzogXCIwLjc1XCIsXHJcbiAgICAgICAgICAgIGl0ZW1JbnNlcnRMb2NhdGlvbjogXCJhZnRlclwiLFxyXG4gICAgICAgICAgICBjcmVkaXRzOiBmYWxzZSxcclxuICAgICAgICAgICAgc2VydmVyOiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzOiAoZmllbGROYW1lLCBmaWxlLCBtZXRhZGF0YSwgbG9hZCwgZXJyb3IsIHByb2dyZXNzLCBhYm9ydCwgdHJhbnNmZXIsIG9wdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBmaWVsZE5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBpcyB0aGUgYWN0dWFsIGZpbGUgb2JqZWN0IHRvIHNlbmRcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChmaWVsZE5hbWUsIGZpbGUsIGZpbGUubmFtZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9wZW4oXCJQT1NUXCIsIHRoaXMudXJsKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdWxkIGNhbGwgdGhlIHByb2dyZXNzIG1ldGhvZCB0byB1cGRhdGUgdGhlIHByb2dyZXNzIHRvIDEwMCUgYmVmb3JlIGNhbGxpbmcgbG9hZFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgY29tcHV0YWJsZSB0byBmYWxzZSBzd2l0Y2hlcyB0aGUgbG9hZGluZyBpbmRpY2F0b3IgdG8gaW5maW5pdGUgbW9kZVxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QudXBsb2FkLm9ucHJvZ3Jlc3MgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcyhlLmxlbmd0aENvbXB1dGFibGUsIGUubG9hZGVkLCBlLnRvdGFsKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgY2FsbCB0aGUgbG9hZCBtZXRob2Qgd2hlbiBkb25lIGFuZCBwYXNzIHRoZSByZXR1cm5lZCBzZXJ2ZXIgZmlsZSBpZFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2VydmVyIGZpbGUgaWQgaXMgdGhlbiB1c2VkIGxhdGVyIG9uIHdoZW4gcmV2ZXJ0aW5nIG9yIHJlc3RvcmluZyBhIGZpbGVcclxuICAgICAgICAgICAgICAgICAgICAvLyBzbyB5b3VyIHNlcnZlciBrbm93cyB3aGljaCBmaWxlIHRvIHJldHVybiB3aXRob3V0IGV4cG9zaW5nIHRoYXQgaW5mbyB0byB0aGUgY2xpZW50XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsb2FkIG1ldGhvZCBhY2NlcHRzIGVpdGhlciBhIHN0cmluZyAoaWQpIG9yIGFuIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZChyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhaSBvIG5vbWUgZG8gYXJxdWl2byBkbyBhcnJheVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzcG9uc2UpICYmIHJlc3BvbnNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VydmVySWQgPSByZXNwb25zZVswXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZChzZXJ2ZXJJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJSZXNwb3N0YSBkbyBzZXJ2aWRvciBpbnbDoWxpZGE6IG5vbWUgZG8gYXJxdWl2byBuw6NvIGVuY29udHJhZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvIGFvIHByb2Nlc3NhciByZXNwb3N0YSBkbyBzZXJ2aWRvcjpcIiwgZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJFcnJvIGFvIHByb2Nlc3NhciByZXNwb3N0YSBkbyBzZXJ2aWRvclwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbiBjYWxsIHRoZSBlcnJvciBtZXRob2QgaWYgc29tZXRoaW5nIGlzIHdyb25nLCBzaG91bGQgZXhpdCBhZnRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJvaCBub1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChmb3JtRGF0YSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBleHBvc2UgYW4gYWJvcnQgbWV0aG9kIHNvIHRoZSByZXF1ZXN0IGNhbiBiZSBjYW5jZWxsZWRcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhYm9ydDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBlbnRlcmVkIGlmIHRoZSB1c2VyIGhhcyB0YXBwZWQgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWJvcnQoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRmlsZVBvbmQga25vdyB0aGUgcmVxdWVzdCBoYXMgYmVlbiBjYW5jZWxsZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0sXHJcblxyXG4gICAgICAgICAgICAgICAgbG9hZDogKHNvdXJjZSwgbG9hZCwgZXJyb3IsIHByb2dyZXNzLCBhYm9ydCwgaGVhZGVycykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG15UmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZmV0Y2gobXlSZXF1ZXN0KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJybyBhbyBjYXJyZWdhciBpbWFnZW06XCIsIHJlc3BvbnNlLnN0YXR1cyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJFcnJvIGFvIGNhcnJlZ2FyIGEgaW1hZ2VtXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmFycmF5QnVmZmVyKCkudGhlbigoYnVmZmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gc291cmNlLnNwbGl0KFwiLlwiKS5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW1lVHlwZU1hcCA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VicDogXCJpbWFnZS93ZWJwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZzogXCJpbWFnZS9qcGVnXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWc6IFwiaW1hZ2UvanBlZ1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmc6IFwiaW1hZ2UvcG5nXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlVHlwZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlTWFwW2ZpbGVFeHRlbnNpb25dIHx8IGNvbnRlbnRUeXBlIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG15QmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6IGZpbGVUeXBlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQobXlCbG9iKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm8gbm8gc2VydmVyLmxvYWQ6XCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihcIkVycm8gYW8gY2FycmVnYXIgYSBpbWFnZW1cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIHJlbW92ZTogKHNvdXJjZSwgbG9hZCwgZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IHNvdXJjZS5zcGxpdChcIi9cIikucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qub3BlbihcIlBPU1RcIiwgYCR7dGhpcy5kZWxldGVVcmx9JHtlbmNvZGVVUklDb21wb25lbnQoZmlsZU5hbWUpfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25SZW1vdmUuZW1pdChmaWxlTmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihgRXJybyBhbyByZW1vdmVyIG8gYXJxdWl2bzogJHtyZXF1ZXN0LnN0YXR1c1RleHR9YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBgYDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJybyBkZSByZWRlIGFvIHRlbnRhciByZW1vdmVyIG8gYXJxdWl2b1wiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJFcnJvIGRlIHJlZGUgYW8gdGVudGFyIHJlbW92ZXIgbyBhcnF1aXZvXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VuZChib2R5KTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICByZXZlcnQ6ICh1bmlxdWVGaWxlSWQsIGxvYWQsIGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF1bmlxdWVGaWxlSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoXCJOb21lIGRvIGFycXVpdm8gbsOjbyBmb3JuZWNpZG9cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxVcmwgPSBgJHt0aGlzLmRlbGV0ZVVybH0ke2VuY29kZVVSSUNvbXBvbmVudCh1bmlxdWVGaWxlSWQpfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vcGVuKFwiUE9TVFwiLCBmdWxsVXJsKTtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA+PSAyMDAgJiYgcmVxdWVzdC5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25SZW1vdmUuZW1pdCh1bmlxdWVGaWxlSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoYEVycm8gYW8gcmV2ZXJ0ZXIgbyB1cGxvYWQ6ICR7cmVxdWVzdC5zdGF0dXNUZXh0fWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiBlcnJvcihcIkVycm8gZGUgcmVkZSBhbyB0ZW50YXIgcmV2ZXJ0ZXIgbyB1cGxvYWRcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZW5kKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFudFVwbG9hZCkge1xyXG4gICAgICAgICAgICB0aGlzLmV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMudXBsb2FkT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGxvYWRGaWxlcygpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbEZpbGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9uZEZpbGVzID0gdGhpcy5pbml0aWFsRmlsZXMubWFwKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBpdGVtLFxyXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsb2NhbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbnRVcGxvYWQpIHtcclxuICAgICAgICAgICAgdGhpcy5ldmVudHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUVycm9yKCkge1xyXG4gICAgICAgIHRoaXMub25VcGxvYWRFcnJvci5lbWl0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZUluaXQoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIHRoaXMub25Jbml0LmVtaXQodGhpcy5wb25kRmlsZXMpO1xyXG5cclxuICAgICAgICB0aGlzLnBvbmQgPSBldmVudC5wb25kO1xyXG4gICAgfVxyXG5cclxuICAgIHBvbmRIYW5kbGVBZGRGaWxlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uQWRkZWQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy9Tw7MgZnVuY2lvbmEgcXVhbmRvIG7Do28gdGVtIGFycXVpdm9zIGluaWNpYWlzXHJcbiAgICBwb25kSGFuZGxlQWxsRmlsZXNBZGRlZChldmVudDogYW55KSB7XHJcbiAgICAgICAgY29uc3QgZmlsZXNMaXN0OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZXZlbnQucG9uZC5nZXRGaWxlcygpO1xyXG5cclxuICAgICAgICBmaWxlcy5mb3JFYWNoKChmaWxlOiBGaWxlUG9uZEZpbGUpID0+IHtcclxuICAgICAgICAgICAgbGV0IGZvcm1hdHRlZE5hbWUgPSBmaWxlLnNlcnZlcklkPy5yZXBsYWNlKC9bXCJcXFtcXF1dL2csIFwiXCIpO1xyXG4gICAgICAgICAgICBmaWxlc0xpc3QucHVzaChmb3JtYXR0ZWROYW1lKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFsbEFkZGVkLmVtaXQoZmlsZXNMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICBwb25kSGFuZGxlQWN0aXZhdGVGaWxlKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLm9uQWN0aXZhdGUuZW1pdChldmVudCk7XHJcbiAgICAgICAgdGhpcy5saWdodEJveCAmJiB0aGlzLm9wZW5MaWdodEJveChldmVudC5maWxlLmZpbGVuYW1lV2l0aG91dEV4dGVuc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcG9uZEhhbmRsZVVwZGF0ZShldmVudDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5maWxsQWxidW0oZXZlbnQuaXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHBvbmRIYW5kbGVSZW1vdmUoZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWxlTmFtZTogc3RyaW5nO1xyXG4gICAgICAgIGlmIChldmVudC5maWxlLnNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgICAgICAgZmlsZU5hbWUgPSBldmVudC5maWxlLnNlcnZlcklkO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGZpbGVOYW1lID0gZXZlbnQuZmlsZS5zb3VyY2UuaW5jbHVkZXMoXCIvXCIpID8gZXZlbnQuZmlsZS5zb3VyY2Uuc3BsaXQoXCIvXCIpLnBvcCgpIDogZXZlbnQuZmlsZS5zb3VyY2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm9uUmVtb3ZlLmVtaXQoZmlsZU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uUmVvcmRlckZpbGVzKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmZpbGxBbGJ1bShldmVudC5pdGVtcywgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IGl0ZW1zTGlzdCA9IGV2ZW50Lml0ZW1zLm1hcCgoaXRlbTogRmlsZVBvbmRGaWxlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnNlcnZlcklkLnJlcGxhY2UoL1tcIlxcW1xcXV0vZywgXCJcIik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5maWxlbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub25SZU9yZGVyLmVtaXQoaXRlbXNMaXN0KTtcclxuICAgIH1cclxuXHJcbiAgICB3YXJuaW5nKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoZXZlbnQuZXJyb3IuY29kZSA9PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25NYXhSZWFjaGVkLmVtaXQoXHJcbiAgICAgICAgICAgICAgICBgTGltaXRlIGRlIEFycXVpdm9zIGF0aW5naWRvLiBWb2PDqiBwb2RlIGluc2VyaXIgdW0gdG90YWwgZGUgJHt0aGlzLm1heEZpbGVzfSBhcnF1aXZvcy5gXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5MaWdodEJveChmaWxlTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5hbGJ1bVxyXG4gICAgICAgICAgICAubWFwKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5jYXB0aW9uO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuaW5kZXhPZihmaWxlTmFtZSk7XHJcbiAgICAgICAgdGhpcy5fbGlnaHRib3gub3Blbih0aGlzLmFsYnVtLCBpbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmlsbEFsYnVtKGZpbGVzOiBbXSwgcmVPcmRlcj86IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAoZmlsZXMubGVuZ3RoICE9PSB0aGlzLmFsYnVtLmxlbmd0aCB8fCByZU9yZGVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByZUFsYnVtID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICBmaWxlcy5tYXAoYXN5bmMgKGZpbGU6IEZpbGVQb25kRmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWxlVXJsOiBzdHJpbmc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnNvdXJjZSBpbnN0YW5jZW9mIEZpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVybCA9IGF3YWl0IHRoaXMucmVhZEZpbGVBc3luYyhmaWxlLnNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVVybCA9IGZpbGUuc291cmNlLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM6IGZpbGVVcmwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb246IGZpbGUuZmlsZW5hbWVXaXRob3V0RXh0ZW5zaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHVtYjogXCJcIixcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWxidW0gPSBwcmVBbGJ1bTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVhZEZpbGVBc3luYyhmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhVXJsID0gcmVhZGVyLnJlc3VsdDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVVcmwgPSBkYXRhVXJsLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVVcmwpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwbG9hZEZpbGVzKCkge1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gdGhpcy5wb25kLmdldEZpbGVzKCk7XHJcbiAgICAgICAgZmlsZXMubGVuZ3RoID4gMCA/IHRoaXMucG9uZC5wcm9jZXNzRmlsZXMoKSA6IHRoaXMubm9GaWxlc0FkZGVkLmVtaXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpc0Vycm9yTWVzc2FnZSgpIHtcclxuICAgICAgICBsZXQgY29udHJvbCA9IHRoaXMuZm9ybT8uZ2V0KHRoaXMuY29udHJvbE5hbWUpO1xyXG5cclxuICAgICAgICBpZiAoY29udHJvbD8uZXJyb3JzPy5yZXF1aXJlZCAmJiAoIXRoaXMucG9uZCB8fCB0aGlzLnBvbmQuZ2V0RmlsZXMoKS5sZW5ndGggPT09IDApKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIk9icmlnYXTDs3Jpb1wiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4iLCI8IS0tIGFwcC5jb21wb25lbnQuaHRtbCAtLT5cclxuPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgW2NsYXNzLnVwbG9hZC1pbnZhbGlkXT1cImlzRXJyb3JNZXNzYWdlKClcIj5cclxuICAgIDxmaWxlLXBvbmQgI215UG9uZCBuYW1lPSdVcGxvYWRGb3JtW2ltYWdlbV1bXScgW2NsYXNzLmZpbGUtcG9udC10cmFuc3BhcmVudF09XCJ0cmFuc3BhcmVudFwiIFtvcHRpb25zXT1cInBvbmRPcHRpb25zXCJcclxuICAgICAgICAob25pbml0KT1cInBvbmRIYW5kbGVJbml0KCRldmVudClcIiBbZmlsZXNdPVwicG9uZEZpbGVzXCIgKG9udXBkYXRlZmlsZXMpPVwicG9uZEhhbmRsZVVwZGF0ZSgkZXZlbnQpXCJcclxuICAgICAgICAob25hY3RpdmF0ZWZpbGUpPVwicG9uZEhhbmRsZUFjdGl2YXRlRmlsZSgkZXZlbnQpXCJcclxuICAgICAgICAob25yZW9yZGVyZmlsZXMpPVwib25SZW9yZGVyRmlsZXMoJGV2ZW50KVwiIChvbndhcm5pbmcpPVwid2FybmluZygkZXZlbnQpXCJcclxuICAgICAgICAob25wcm9jZXNzZmlsZXMpPVwicG9uZEhhbmRsZUFsbEZpbGVzQWRkZWQoJGV2ZW50KVwiIChvbnByb2Nlc3NmaWxlKT1cInBvbmRIYW5kbGVBZGRGaWxlKCRldmVudClcIlxyXG4gICAgICAgIChvbmVycm9yKT1cInBvbmRIYW5kbGVFcnJvcigpXCIgLz5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC10b29sdGlwXCIgW2NsYXNzXT1cIid0b29sdGlwLScgKyBlcnJvclBvc2l0aW9uXCIgW2NsYXNzLnRvdWNoZWRdPVwiY29udHJvbD8udG91Y2hlZFwiXHJcbiAgICAgICAgKm5nSWY9XCJpc0Vycm9yTWVzc2FnZSgpXCI+XHJcbiAgICAgICAge3tpc0Vycm9yTWVzc2FnZSgpfX1cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19