mmhglobal-dynamicform 2.44.4 → 2.44.5

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.
@@ -348,9 +348,12 @@ export class ZtexteditorComponent extends InputFieldBase {
348
348
  }
349
349
  const listRange = this.findSelectedListRange();
350
350
  if (listRange) {
351
- const lines = this.getListItemLines(listRange.node);
352
- if (lines.length > 0) {
353
- this.replaceRangeWithHtml(listRange.from, listRange.to, this.linesToHardBreakParagraphHtml(lines));
351
+ if (!this.isListCommandActive(command)) {
352
+ return false;
353
+ }
354
+ const replacementHtml = this.buildSelectedListItemsParagraphHtml(listRange);
355
+ if (replacementHtml) {
356
+ this.replaceRangeWithHtml(listRange.from, listRange.to, replacementHtml);
354
357
  return true;
355
358
  }
356
359
  }
@@ -365,6 +368,53 @@ export class ZtexteditorComponent extends InputFieldBase {
365
368
  this.replaceRangeWithHtml(paragraphRange.from, paragraphRange.to, replacementHtml);
366
369
  return true;
367
370
  }
371
+ isListCommandActive(command) {
372
+ const selection = this.editor?.view?.state.selection;
373
+ const listNodeName = command === 'insertOrderedList' ? 'ordered_list' : 'bullet_list';
374
+ if (!selection) {
375
+ return false;
376
+ }
377
+ if (selection.empty) {
378
+ const activeList = this.findAncestorRange(['bullet_list', 'ordered_list']);
379
+ return activeList?.node?.type?.name === listNodeName;
380
+ }
381
+ const selectedRows = this.getSelectedTextBlockListTypes();
382
+ return selectedRows.length > 0 && selectedRows.every(row => row === listNodeName);
383
+ }
384
+ getSelectedTextBlockListTypes() {
385
+ const view = this.editor?.view;
386
+ const selection = view?.state.selection;
387
+ if (!view || !selection) {
388
+ return [];
389
+ }
390
+ const rows = [];
391
+ const seenPositions = new Set();
392
+ view.state.doc.descendants((node, pos) => {
393
+ const nodeFrom = pos;
394
+ const nodeTo = pos + node.nodeSize;
395
+ if (!node.isTextblock || seenPositions.has(pos) || nodeTo <= selection.from || nodeFrom >= selection.to) {
396
+ return true;
397
+ }
398
+ seenPositions.add(pos);
399
+ rows.push(this.findParentListTypeAtPosition(pos));
400
+ return true;
401
+ });
402
+ return rows;
403
+ }
404
+ findParentListTypeAtPosition(pos) {
405
+ const doc = this.editor?.view?.state.doc;
406
+ if (!doc) {
407
+ return null;
408
+ }
409
+ const resolvedPos = doc.resolve(pos);
410
+ for (let depth = resolvedPos.depth; depth > 0; depth--) {
411
+ const nodeName = resolvedPos.node(depth)?.type?.name;
412
+ if (nodeName === 'bullet_list' || nodeName === 'ordered_list') {
413
+ return nodeName;
414
+ }
415
+ }
416
+ return null;
417
+ }
368
418
  findAncestorRange(nodeNames) {
369
419
  const selection = this.editor?.view?.state.selection;
370
420
  if (!selection) {
@@ -486,15 +536,49 @@ export class ZtexteditorComponent extends InputFieldBase {
486
536
  lines.push(current);
487
537
  return lines;
488
538
  }
489
- getListItemLines(list) {
490
- const lines = [];
491
- list.forEach((listItem) => {
492
- const line = this.nodeToHardBreakText(listItem).trim();
493
- if (line) {
494
- lines.push(line);
539
+ buildSelectedListItemsParagraphHtml(listRange) {
540
+ const selection = this.editor?.view?.state.selection;
541
+ if (!selection) {
542
+ return null;
543
+ }
544
+ const listTag = listRange.node.type?.name === 'ordered_list' ? 'ol' : 'ul';
545
+ const htmlParts = [];
546
+ let pendingListItems = [];
547
+ let hasSelectedItem = false;
548
+ const flushPendingListItems = () => {
549
+ if (pendingListItems.length === 0) {
550
+ return;
551
+ }
552
+ htmlParts.push(`<${listTag}>${pendingListItems.join('')}</${listTag}>`);
553
+ pendingListItems = [];
554
+ };
555
+ listRange.node.forEach((listItem, offset) => {
556
+ const itemFrom = listRange.from + 1 + offset;
557
+ const itemTo = itemFrom + listItem.nodeSize;
558
+ const text = this.nodeToHardBreakText(listItem).trim();
559
+ if (!text) {
560
+ return;
561
+ }
562
+ if (this.isRangeSelected(itemFrom, itemTo)) {
563
+ hasSelectedItem = true;
564
+ flushPendingListItems();
565
+ htmlParts.push(this.linesToEditorParagraphHtml([text]));
566
+ return;
495
567
  }
568
+ pendingListItems.push(`<li>${this.escapeHtml(text)}</li>`);
496
569
  });
497
- return lines;
570
+ flushPendingListItems();
571
+ return hasSelectedItem ? htmlParts.join('') : null;
572
+ }
573
+ isRangeSelected(from, to) {
574
+ const selection = this.editor?.view?.state.selection;
575
+ if (!selection) {
576
+ return false;
577
+ }
578
+ if (selection.empty) {
579
+ return selection.from >= from && selection.from <= to;
580
+ }
581
+ return to > selection.from && from < selection.to;
498
582
  }
499
583
  nodeToHardBreakText(node) {
500
584
  let text = '';
@@ -525,6 +609,17 @@ export class ZtexteditorComponent extends InputFieldBase {
525
609
  linesToHardBreakParagraphHtml(lines) {
526
610
  return `<p>${lines.map(line => this.escapeHtml(line)).join('<br>')}</p>`;
527
611
  }
612
+ linesToParagraphHtml(lines) {
613
+ return lines
614
+ .map(line => line.trim() ? `<p>${this.escapeHtml(line)}</p>` : '<p><br></p>')
615
+ .join('');
616
+ }
617
+ linesToEditorParagraphHtml(lines) {
618
+ if (this.isParagraphEnterBehavior()) {
619
+ return this.linesToParagraphHtml(lines);
620
+ }
621
+ return this.linesToHardBreakParagraphHtml(lines);
622
+ }
528
623
  isParagraphEnterBehavior() {
529
624
  return this.data?.EnterKeyBehavior !== 'lineBreak';
530
625
  }
@@ -847,12 +942,12 @@ export class ZtexteditorComponent extends InputFieldBase {
847
942
  }
848
943
  }
849
944
  ZtexteditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, deps: [{ token: i1.ZComponentService }, { token: i2.FontAweSomeService }, { token: i3.DialogService }, { token: i2.AlertService }, { token: i2.CompressImageService }, { token: i2.ToastService }], target: i0.ɵɵFactoryTarget.Component });
850
- ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
945
+ ZtexteditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.3", type: ZtexteditorComponent, selector: "app-ztexteditor", viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true }], usesInheritance: true, ngImport: i0, template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"], components: [{ type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { type: i5.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { type: i6.EditorComponent, selector: "kendo-editor", inputs: ["value", "disabled", "readonly", "iframe", "applyToWord", "schema", "plugins", "placeholder", "preserveWhitespace", "pasteCleanupSettings", "resizable"], outputs: ["valueChange", "focus", "paste", "blur"] }, { type: i7.ToolBarComponent, selector: "kendo-toolbar", inputs: ["overflow", "resizable", "popupSettings", "tabindex", "tabIndex"], outputs: ["open", "close"], exportAs: ["kendoToolBar"] }, { type: i7.ToolBarButtonGroupComponent, selector: "kendo-toolbar-buttongroup", inputs: ["disabled", "selection", "width", "look"], exportAs: ["kendoToolBarButtonGroup"] }, { type: i7.ToolBarButtonComponent, selector: "kendo-toolbar-button", inputs: ["showText", "showIcon", "text", "style", "className", "title", "disabled", "toggleable", "look", "togglable", "selected", "fillMode", "themeColor", "icon", "iconClass", "imageUrl"], outputs: ["click", "pointerdown", "selectedChange"], exportAs: ["kendoToolBarButton"] }, { type: i6.EditorFormatComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFormat]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontSizeComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontSize]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorFontFamilyComponent, selector: "kendo-toolbar-dropdownlist[kendoEditorFontFamily]", inputs: ["data"], outputs: ["valueChange"] }, { type: i6.EditorColorPickerComponent, selector: "kendo-toolbar-colorpicker", inputs: ["value", "icon", "paletteSettings", "editorCommand", "disabled", "views", "view"] }, { type: i6.EditorInsertTableButtonComponent, selector: "kendo-editor-insert-table-button" }], directives: [{ type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.EditorUndoButtonDirective, selector: "kendo-toolbar-button[kendoEditorUndoButton]" }, { type: i6.EditorRedoButtonDirective, selector: "kendo-toolbar-button[kendoEditorRedoButton]" }, { type: i6.EditorBoldButtonDirective, selector: "kendo-toolbar-button[kendoEditorBoldButton]" }, { type: i6.EditorItalicButtonDirective, selector: "kendo-toolbar-button[kendoEditorItalicButton]" }, { type: i6.EditorUnderlineButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnderlineButton]" }, { type: i6.EditorStrikethroughButtonDirective, selector: "kendo-toolbar-button[kendoEditorStrikethroughButton]" }, { type: i6.EditorSubscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSubscriptButton]" }, { type: i6.EditorSuperscriptButtonDirective, selector: "kendo-toolbar-button[kendoEditorSuperscriptButton]" }, { type: i6.EditorAlignLeftButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignLeftButton]" }, { type: i6.EditorAlignCenterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignCenterButton]" }, { type: i6.EditorAlignRightButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignRightButton]" }, { type: i6.EditorAlignJustifyButtonDirective, selector: "kendo-toolbar-button[kendoEditorAlignJustifyButton]" }, { type: i6.EditorForeColorDirective, selector: "[kendoEditorForeColor]" }, { type: i6.EditorBackColorDirective, selector: "[kendoEditorBackColor]" }, { type: i6.EditorIndentButtonDirective, selector: "kendo-toolbar-button[kendoEditorIndentButton]" }, { type: i6.EditorOutdentButtonDirective, selector: "kendo-toolbar-button[kendoEditorOutdentButton]" }, { type: i6.EditorCreateLinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorCreateLinkButton]" }, { type: i6.EditorUnlinkButtonDirective, selector: "kendo-toolbar-button[kendoEditorUnlinkButton]" }, { type: i6.EditorAddColumnBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnBeforeButton]" }, { type: i6.EditorAddColumnAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddColumnAfterButton]" }, { type: i6.EditorAddRowBeforeButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowBeforeButton]" }, { type: i6.EditorAddRowAfterButtonDirective, selector: "kendo-toolbar-button[kendoEditorAddRowAfterButton]" }, { type: i6.EditorDeleteColumnButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteColumnButton]" }, { type: i6.EditorDeleteRowButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteRowButton]" }, { type: i6.EditorDeleteTableButtonDirective, selector: "kendo-toolbar-button[kendoEditorDeleteTableButton]" }, { type: i6.EditorInsertFileButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertFileButton]" }, { type: i6.EditorInsertImageButtonDirective, selector: "kendo-toolbar-button[kendoEditorInsertImageButton]" }, { type: i6.EditorViewSourceButtonDirective, selector: "kendo-toolbar-button[kendoEditorViewSourceButton]" }, { type: i6.EditorMergeCellsButtonDirective, selector: "kendo-toolbar-button[kendoEditorMergeCellsButton]" }, { type: i6.EditorSplitCellButtonDirective, selector: "kendo-toolbar-button[kendoEditorSplitCellButton]" }] });
851
946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZtexteditorComponent, decorators: [{
852
947
  type: Component,
853
- args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
948
+ args: [{ selector: 'app-ztexteditor', template: "\r\n\r\n<div [formGroup]=\"form\" class=\"ztexteditor-container e1tag-style\" [style]=\"componentProperties.style.style\" [ngClass]=\"data.Class\">\r\n <div class=\"col-lg-12 expand-btn-container\">\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"data.AllowEnlarge\" (click)=\"openPopup()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faExpandAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n <ion-button class=\"ion-activatable ripple-parent\" [style]=\"componentProperties.style.style4\" *ngIf=\"CloseEnlargeBtn\" (click)=\"onPopupClose()\" [id]=\"data.Value +'-popup-button'\">\r\n <fa-icon class=\"btn-icon\" [icon]=\"getFontAwesome('faCompressAlt', fontAweSomeService)\"></fa-icon>\r\n </ion-button>\r\n</div>\r\n <kendo-editor #editor\r\n [id]=\"data.Value\"\r\n [formControlName]=\"data.Value\"\r\n class=\"e1tag-style1\"\r\n [style]=\"componentProperties.style.style1\"\r\n [readonly]=\"(!!componentProperties.isReadOnlyField ? group[componentProperties.isReadOnlyField] : componentProperties.isReadOnly)\"\r\n (valueChange)=\"onChange($event)\"\r\n [resizable]=\"data.Resizable || false\"\r\n [plugins]=\"pluginsCallback\"\r\n [pasteCleanupSettings]=\"pasteCleanupSettings\"\r\n (paste)=\"onPaste($event)\"\r\n [iframe]=\"componentSettings.iframe\">\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'basic'\" class=\"e1tag-style2\"\r\n [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n <kendo-toolbar *ngIf=\"data.ToolBarStyle === 'full'\" class=\"e1tag-style2\" [style]=\"componentProperties.style.style2\">\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorUndoButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorRedoButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorBoldButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorItalicButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnderlineButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorStrikethroughButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorSubscriptButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSuperscriptButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAlignLeftButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignCenterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignRightButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAlignJustifyButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-dropdownlist kendoEditorFormat></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontSize></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-dropdownlist kendoEditorFontFamily></kendo-toolbar-dropdownlist>\r\n <kendo-toolbar-colorpicker kendoEditorForeColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-colorpicker kendoEditorBackColor view=\"gradient\"></kendo-toolbar-colorpicker>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button icon=\"list-unordered\" [selected]=\"isListCommandActive('insertUnorderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertUnorderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button icon=\"list-ordered\" [selected]=\"isListCommandActive('insertOrderedList')\" (mousedown)=\"$event.preventDefault()\" (pointerdown)=\"$event.preventDefault()\" (click)=\"applyList('insertOrderedList')\"></kendo-toolbar-button>\n <kendo-toolbar-button kendoEditorIndentButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorOutdentButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorCreateLinkButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorUnlinkButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-editor-insert-table-button></kendo-editor-insert-table-button>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorAddColumnBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddColumnAfterButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowBeforeButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorAddRowAfterButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorDeleteColumnButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteRowButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorDeleteTableButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorMergeCellsButton></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorSplitCellButton></kendo-toolbar-button>\r\n </kendo-toolbar-buttongroup>\r\n <kendo-toolbar-button kendoEditorInsertFileButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'default'\" kendoEditorInsertImageButton></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"data.ToolBarUploadImageMethod == 'explorer'\" icon=\"k-i-image k-i-photo\" (click)=\"openFileExplorer()\"></kendo-toolbar-button>\r\n <kendo-toolbar-button *ngIf=\"!!data.Compression\" [icon]=\"compressionToolbarIcon\" (click)=\"onOffCompressMode()\" [title]=\"compressionToolbarTitle\"></kendo-toolbar-button>\r\n <kendo-toolbar-button kendoEditorViewSourceButton></kendo-toolbar-button>\r\n </kendo-toolbar>\r\n </kendo-editor>\r\n <input style=\"display:none;\" type=\"file\" [id]=\"data.Value +'-upload-file'\" [name]=\"data.Value +'-upload-file'\" accept=\"image/*\" ngf-max-size=\"5MB\" (change)=\"uploadImage($event)\">\r\n</div>\r\n", styles: [".title{margin:20px 10px 5px;font-size:18px;font-weight:700}.expand-btn-container{text-align:right}.expand-btn-container ion-button{--background: rgba(var(--ion-color-primary-rgb),10%);--color:black;font-size:12px}\n"] }]
854
949
  }], ctorParameters: function () { return [{ type: i1.ZComponentService }, { type: i2.FontAweSomeService }, { type: i3.DialogService }, { type: i2.AlertService }, { type: i2.CompressImageService }, { type: i2.ToastService }]; }, propDecorators: { editor: [{
855
950
  type: ViewChild,
856
951
  args: ['editor']
857
952
  }] } });
858
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsSUFBSSxvQkFBb0IsRUFDakMsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1gsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qyw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxD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QUVELHNDQUFzQztJQUM5QixpQkFBaUIsQ0FBQyxJQUFVO1FBQ2xDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDVCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPO2FBQ1I7WUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztZQUN2RCxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztpSEE1Z0NVLG9CQUFvQjtxR0FBcEIsb0JBQW9CLGdMQ3ZDakMsczVVQTJJQTsyRkRwR2Esb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGlCQUFpQjs4UEFLQyxNQUFNO3NCQUFqQyxTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBFZGl0b3JDb21wb25lbnQsIEVkaXRvclBhc3RlRXZlbnQgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1lZGl0b3InO1xyXG5pbXBvcnQgeyBEaWFsb2dSZWYsIERpYWxvZ1NlcnZpY2UgfSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tYW5ndWxhci1kaWFsb2cnO1xyXG5pbXBvcnQge1xyXG4gIGNoYWluQ29tbWFuZHMsXHJcbiAgRE9NUGFyc2VyIGFzIFByb3NlTWlycm9yRE9NUGFyc2VyLFxyXG4gIGV4aXRDb2RlLFxyXG4gIGtleW1hcCxcclxuICBQbHVnaW4sXHJcbiAgc3BsaXRCbG9ja1xyXG59IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1lZGl0b3ItY29tbW9uJztcclxuXHJcbi8qKioqKioqKioqIFJ4SlMgKioqKioqKioqKi9cclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuXHJcbi8qKioqKioqKioqIENvbXBvbmVudCAmIFNlcnZpY2UgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW5wdXRGaWVsZEJhc2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2lucHV0ZmllbGRiYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFpDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvemNvbXBvbmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtcclxuICBBbGVydEJ1dHRvbixcclxuICBBbGVydFNlcnZpY2UsXHJcbiAgQ29tcHJlc3NJbWFnZVNlcnZpY2UsXHJcbiAgRm9udEF3ZVNvbWVTZXJ2aWNlLFxyXG4gIEltYWdlQ29tcHJlc3Npb25Db25maWcsXHJcbiAgVGV4dEVkaXRvclN5bWJvbE5vcm1hbGl6YXRpb25Db25maWcsXHJcbiAgVGV4dEVkaXRvclN5bWJvbFJlcGxhY2VtZW50LFxyXG4gIFRvYXN0U2VydmljZSxcclxuICBaQ29tcG9uZW50LFxyXG4gIFpDb21wb25lbnRIZWxwZXJcclxufSBmcm9tICdtbWhnbG9iYWwtemNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtenRleHRlZGl0b3InLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi96dGV4dGVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4venRleHRlZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgSW5wdXRGaWVsZEJhc2UgaW1wbGVtZW50cyBaQ29tcG9uZW50LCBPbkluaXQsIEFmdGVyVmlld0luaXQge1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIHB1YmxpYyBlZGl0b3IhOiBFZGl0b3JDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyBwYXN0ZUNsZWFudXBTZXR0aW5nczoge1xyXG4gICAgcmVtb3ZlTXNDbGFzc2VzOiBib29sZWFuO1xyXG4gICAgcmVtb3ZlTXNTdHlsZXM6IGJvb2xlYW47XHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogYm9vbGVhbjtcclxuICAgIFtrZXk6IHN0cmluZ106IGFueTtcclxuICB9ID0ge1xyXG4gICAgcmVtb3ZlTXNDbGFzc2VzOiBmYWxzZSxcclxuICAgIHJlbW92ZU1zU3R5bGVzOiBmYWxzZSxcclxuICAgIHJlbW92ZUludmFsaWRIVE1MOiBmYWxzZSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgY29tcG9uZW50U2V0dGluZ3M6IHsgaWZyYW1lOiBib29sZWFuOyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHtcclxuICAgIGlmcmFtZTogdHJ1ZSxcclxuICB9O1xyXG5cclxuICBwdWJsaWMgc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzOiBSZXF1aXJlZDxPbWl0PFRleHRFZGl0b3JTeW1ib2xOb3JtYWxpemF0aW9uQ29uZmlnLCAnQ3VzdG9tUmVwbGFjZW1lbnRzJz4+ICYge1xyXG4gICAgQ3VzdG9tUmVwbGFjZW1lbnRzOiBUZXh0RWRpdG9yU3ltYm9sUmVwbGFjZW1lbnRbXTtcclxuICB9ID0ge1xyXG4gICAgRW5hYmxlZDogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZUh0bWxFbnRpdGllczogdHJ1ZSxcclxuICAgIE5vcm1hbGl6ZURhc2g6IHRydWUsXHJcbiAgICBOb3JtYWxpemVRdW90ZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVTcGFjZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVFbGxpcHNpczogdHJ1ZSxcclxuICAgIEN1c3RvbVJlcGxhY2VtZW50czogW10sXHJcbiAgfTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luc0NhbGxiYWNrID0gKGRlZmF1bHRQbHVnaW5zOiBQbHVnaW5bXSk6IFBsdWdpbltdID0+IHtcbiAgICBpZiAodGhpcy5pc1BhcmFncmFwaEVudGVyQmVoYXZpb3IoKSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRQbHVnaW5zO1xuICAgIH1cblxuICAgIHJldHVybiBbdGhpcy5lbnRlckFzTGluZUJyZWFrUGx1Z2luKCksIC4uLmRlZmF1bHRQbHVnaW5zXTtcbiAgfTtcblxyXG4gIHB1YmxpYyBpc0NvbXByZXNzTW9kZU9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIENsb3NlRW5sYXJnZUJ0bjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgZGlhbG9nUmVmPzogRGlhbG9nUmVmO1xyXG5cclxuICBwcml2YXRlIG9yaWdpbmFsSW5saW5lU3R5bGU6IHN0cmluZyA9ICcnO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRW5hYmxlSWNvbjogc3RyaW5nID0gJ2staS16b29tLWJlc3QtZml0JztcclxuICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzaW9uRGlzYWJsZWRJY29uOiBzdHJpbmcgPSAnay1pLXpvb20tYWN0dWFsLXNpemUnO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRTZXJ2aWNlOiBaQ29tcG9uZW50U2VydmljZSxcclxuICAgIHB1YmxpYyByZWFkb25seSBmb250QXdlU29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbXByZXNzSW1hZ2U6IENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKGNvbXBvbmVudFNlcnZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluaXRpYWxpemUgY29tcG9uZW50IHN0YXRlIGFuZCBlZGl0b3IgY29uZmlndXJhdGlvbi4gKi9cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5zZXR1cElubmVyRmllbGQoKTtcclxuXHJcbiAgICAvLyBCYWNrd2FyZC1jb21wYXRpYmxlIGRlZmF1bHQ6IHdoZW4gbm90IHByb3ZpZGVkLCB1c2UgZXhwbG9yZXIuXHJcbiAgICB0aGlzLmRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID0gdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCB8fCAnZXhwbG9yZXInO1xyXG5cclxuICAgIHRoaXMuc2V0dXBQYXN0ZUNsZWFudXBTZXR0aW5ncygpO1xyXG4gICAgdGhpcy5zZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpO1xyXG4gICAgc3VwZXIuc2V0dXBDb21wb25lbnRTZXR0aW5ncyh0aGlzLmNvbXBvbmVudFNldHRpbmdzKTtcclxuICAgIHN1cGVyLmZvY3VzT25EZWZhdWx0KHRoaXMuZm9jdXMuYmluZCh0aGlzKSk7XHJcblxyXG4gICAgLy8gU2FmZSBjYXN0IHRvIGJvb2xlYW4uXHJcbiAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhIXRoaXMuZGF0YT8uQ29tcHJlc3Npb247XHJcbiAgfVxyXG5cclxuICAvKiogTm90aWZ5IGNvbXBvbmVudCBzZXJ2aWNlIG9uY2UgdmlldyBpcyByZWFkeS4gKi9cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRTZXJ2aWNlLmRlY3JlbWVudENvbXBvbmVudENvdW50ZXJGb3JGaWVsZCh0aGlzLmRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN5bmMgZWRpdG9yIGNvbnRlbnQgdG8gek1vZGVsIGFuZCB0cmlnZ2VyIGNvbmZpZ3VyZWQgY2hhbmdlIGhhbmRsZXIuICovXHJcbiAgcHVibGljIG9uQ2hhbmdlKHZhbHVlOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldFRvWk1vZGVsKHRoaXMuZGF0YS5WYWx1ZSwgdmFsdWUsIHRoaXMuZ3JvdXAsIHRoaXMuZGF0YSk7XHJcbiAgICB0aGlzLnRyaWdnZXJFdmVudCgnaW5wdXRmaWVsZC1vbkNoYW5nZScsIHRoaXMuZGF0YS5PbkNoYW5nZSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZSBwYXN0ZTogbm9ybWFsaXplIHBsYWluLXRleHQgc3BlY2lhbCBlbnRpdGllcywgdGhlbiBvcHRpb25hbGx5IGNvbXByZXNzIHBhc3RlZCBiYXNlNjQgaW1hZ2VzLiAqL1xyXG4gIHB1YmxpYyBhc3luYyBvblBhc3RlKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gUGFzdGUgZXZlbnQgaXMgdW5kZWZpbmVkLiBQYXN0ZSBpZ25vcmVkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tbW9uIEV4Y2VsL3BsYWluLXRleHQgaXNzdWU6IFwiJmFtcDtcIiBnZXRzIGluc2VydGVkIGxpdGVyYWxseSBjYXVzaW5nIFwiJmFtcDthbXA7XCIgaW4gSFRNTC5cclxuICAgIGNvbnN0IGlzSGFuZGxlZCA9IHRoaXMuaGFuZGxlQ29tbW9uU3ltYm9sVGFncyhlKTtcclxuICAgIGlmIChpc0hhbmRsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubm9ybWFsaXplUGFzdGVkSHRtbChlKTtcclxuXHJcbiAgICAvLyBDb21wcmVzcyBvbmx5IGlmIGVuYWJsZWQgYW5kIGJhc2U2NCBpbWFnZXMgZXhpc3QuXHJcbiAgICBhd2FpdCB0aGlzLmhhbmRsZUltYWdlQ29tcHJlc3Npb24oZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZiB0aGUgcGFzdGUgaXMgcGxhaW4gdGV4dCAobm8gSFRNTCB0YWdzIGFuZCBubyBpbWFnZXMpLCBub3JtYWxpemUgY29tbW9uIGVudGl0aWVzIGFuZCBpbnNlcnQgYXMgcmVhbCB0ZXh0LlxyXG4gICAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBldmVudCBpcyBoYW5kbGVkIGFuZCBkZWZhdWx0IHBhc3RlIGlzIHByZXZlbnRlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZTogRWRpdG9yUGFzdGVFdmVudCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGhhbmRsZSBwbGFpbi10ZXh0IG5vcm1hbGl6YXRpb24uJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGlwYm9hcmQgPSAoZS5vcmlnaW5hbEV2ZW50IGFzIENsaXBib2FyZEV2ZW50IHwgdW5kZWZpbmVkKT8uY2xpcGJvYXJkRGF0YTtcclxuICAgIGNvbnN0IHBsYWluVGV4dCA9IGNsaXBib2FyZD8uZ2V0RGF0YSgndGV4dC9wbGFpbicpID8/ICcnO1xyXG4gICAgY29uc3QgaHRtbFRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvaHRtbCcpID8/ICcnO1xyXG4gICAgY29uc3QgY2xlYW5lZEh0bWwgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG5cclxuICAgIGNvbnN0IGh0bWxIYXNJbWcgPSAvPGltZ1xcYi9pLnRlc3QoaHRtbFRleHQpO1xyXG4gICAgY29uc3QgY2xlYW5lZEhhc1RhZ3MgPSAvPFtePl0rPi8udGVzdChjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgLy8gSWYgcGFzdGUgaGFzIEhUTUwgdGFncyBvciBpbWFnZXMsIGRvIE5PVCBpbnRlcmZlcmUgKGxldCBLZW5kbyBoYW5kbGUgaXQpLlxyXG4gICAgaWYgKGh0bWxIYXNJbWcgfHwgY2xlYW5lZEhhc1RhZ3MpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZVBhc3RlZFRleHQocGxhaW5UZXh0IHx8IGNsZWFuZWRIdG1sKTtcclxuXHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmluc2VydFBsYWluVGV4dFdpdGhFZGl0b3JMaW5lQnJlYWtzKHRoaXMubm9ybWFsaXplTGluZUVuZGluZ3Mobm9ybWFsaXplZCkpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcclxcbnxcXHIvZywgJ1xcbicpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRQbGFpblRleHRXaXRoRWRpdG9yTGluZUJyZWFrcyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XHJcbiAgICBpZiAoIXZpZXcpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciB2aWV3IGlzIG5vdCByZWFkeS4gQ2Fubm90IGluc2VydCBwYXN0ZWQgdGV4dC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xyXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IHRoaXMucGxhaW5UZXh0VG9FZGl0b3JIdG1sKHZhbHVlKTtcclxuXHJcbiAgICBjb25zdCBzbGljZSA9IFByb3NlTWlycm9yRE9NUGFyc2VyLmZyb21TY2hlbWEodmlldy5zdGF0ZS5zY2hlbWEpLnBhcnNlU2xpY2UoY29udGFpbmVyKTtcclxuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uKHNsaWNlKS5zY3JvbGxJbnRvVmlldygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGxhaW5UZXh0VG9FZGl0b3JIdG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVzID0gdmFsdWUuc3BsaXQoJ1xcbicpO1xuXG4gICAgaWYgKHRoaXMuaXNQYXJhZ3JhcGhFbnRlckJlaGF2aW9yKCkpIHtcbiAgICAgIHJldHVybiBsaW5lc1xuICAgICAgICAubWFwKGxpbmUgPT4gbGluZS50cmltKCkgPyBgPHA+JHt0aGlzLmVzY2FwZUh0bWwobGluZSl9PC9wPmAgOiAnPHA+PGJyPjwvcD4nKVxuICAgICAgICAuam9pbignJyk7XG4gICAgfVxyXG5cclxuICAgIHJldHVybiBgPHA+JHtsaW5lcy5tYXAobGluZSA9PiB0aGlzLmVzY2FwZUh0bWwobGluZSkpLmpvaW4oJzxicj4nKX08L3A+YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAucmVwbGFjZUFsbCgnJicsICcmYW1wOycpXHJcbiAgICAgIC5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKVxyXG4gICAgICAucmVwbGFjZUFsbCgnPicsICcmZ3Q7JylcclxuICAgICAgLnJlcGxhY2VBbGwoJ1wiJywgJyZxdW90OycpXHJcbiAgICAgIC5yZXBsYWNlQWxsKFwiJ1wiLCAnJiMzOTsnKTtcclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgdGV4dCBub2RlcyBpbnNpZGUgcGFzdGVkIEhUTUwgd2l0aG91dCB0b3VjaGluZyB0YWdzLCBzdHlsZXMsIGxpbmtzLCBvciBpbWFnZSBhdHRyaWJ1dGVzLiAqL1xyXG4gIHByaXZhdGUgbm9ybWFsaXplUGFzdGVkSHRtbChlOiBFZGl0b3JQYXN0ZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNsZWFuZWQgPSBlLmNsZWFuZWRIdG1sID8/ICcnO1xyXG4gICAgaWYgKCFjbGVhbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZG9jOiBEb2N1bWVudDtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvYyA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoY2xlYW5lZCwgJ3RleHQvaHRtbCcpO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBGYWlsZWQgdG8gcGFyc2UgcGFzdGVkIEhUTUwgZm9yIHN5bWJvbCBub3JtYWxpemF0aW9uLiBQYXN0ZSB3aWxsIGNvbnRpbnVlLicsIGVycik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB3YWxrZXIgPSBkb2MuY3JlYXRlVHJlZVdhbGtlcihkb2MuYm9keSwgTm9kZUZpbHRlci5TSE9XX1RFWFQpO1xyXG4gICAgbGV0IG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgIHdoaWxlIChub2RlKSB7XHJcbiAgICAgIG5vZGUudGV4dENvbnRlbnQgPSB0aGlzLm5vcm1hbGl6ZVBhc3RlZFRleHQobm9kZS50ZXh0Q29udGVudCA/PyAnJyk7XHJcbiAgICAgIG5vZGUgPSB3YWxrZXIubmV4dE5vZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbW92ZUVtcHR5UGFyYWdyYXBocyhkb2MpO1xyXG5cclxuICAgIGUuY2xlYW5lZEh0bWwgPSBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZUVtcHR5UGFyYWdyYXBocyhkb2M6IERvY3VtZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBlbXB0eVBhcmFncmFwaHMgPSBBcnJheS5mcm9tKGRvYy5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJ3AnKSkuZmlsdGVyKHBhcmFncmFwaCA9PlxyXG4gICAgICB0aGlzLmlzRW1wdHlQYXJhZ3JhcGgocGFyYWdyYXBoKSxcclxuICAgICk7XHJcblxyXG4gICAgZW1wdHlQYXJhZ3JhcGhzLmZvckVhY2gocGFyYWdyYXBoID0+IHBhcmFncmFwaC5yZW1vdmUoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRW1wdHlQYXJhZ3JhcGgocGFyYWdyYXBoOiBIVE1MUGFyYWdyYXBoRWxlbWVudCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYWxsb3dlZEVtcHR5Tm9kZXMgPSBBcnJheS5mcm9tKHBhcmFncmFwaC5jaGlsZE5vZGVzKS5ldmVyeShub2RlID0+IHtcclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XHJcbiAgICAgICAgcmV0dXJuICEobm9kZS50ZXh0Q29udGVudCA/PyAnJykudHJpbSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdicic7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYWxsb3dlZEVtcHR5Tm9kZXMgJiYgIShwYXJhZ3JhcGgudGV4dENvbnRlbnQgPz8gJycpLnRyaW0oKTtcclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUga25vd24gcGFzdGUgc3ltYm9sIHZhcmlhbnRzIGZyb20gT2ZmaWNlL2VtYWlsIGNvbnRlbnQgaW50byBzdGFibGUgZGlzcGxheSBjaGFyYWN0ZXJzLiAqL1xyXG4gIHByaXZhdGUgbm9ybWFsaXplUGFzdGVkVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCB8fCAhdmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBub3JtYWxpemVkID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZUh0bWxFbnRpdGllcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxyXG4gICAgICAgIC5yZXBsYWNlQWxsKCcmYW1wOycsICcmJylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmx0OycsICc8JylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmd0OycsICc+JylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJnF1b3Q7JywgJ1wiJylcclxuICAgICAgICAucmVwbGFjZUFsbCgnJiMzOTsnLCBcIidcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZURhc2gpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvW1xcdTIwMTBcXHUyMDExXFx1MjAxMlxcdTIwMTNcXHUyMDE0XFx1MjIxMl0vZywgJy0nKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplUXVvdGVzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDE4XFx1MjAxOVxcdTIwMUFcXHUyMDFCXS9nLCBcIidcIilcclxuICAgICAgICAucmVwbGFjZSgvW1xcdTIwMUNcXHUyMDFEXFx1MjAxRVxcdTIwMUZdL2csICdcIicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVTcGFjZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvW1xcdTAwQTBcXHUyMDJGXFx1MjAwN10vZywgJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplRWxsaXBzaXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQucmVwbGFjZSgvXFx1MjAyNi9nLCAnLi4uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuYXBwbHlDdXN0b21TeW1ib2xSZXBsYWNlbWVudHMobm9ybWFsaXplZCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFwcGx5Q3VzdG9tU3ltYm9sUmVwbGFjZW1lbnRzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkN1c3RvbVJlcGxhY2VtZW50cy5yZWR1Y2UoKHJlc3VsdCwgcmVwbGFjZW1lbnQpID0+IHtcclxuICAgICAgaWYgKCFyZXBsYWNlbWVudD8uRnJvbSkge1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHJlcGxhY2VtZW50LklzUmVnZXgpIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQucmVwbGFjZShuZXcgUmVnRXhwKHJlcGxhY2VtZW50LkZyb20sIHJlcGxhY2VtZW50LkZsYWdzIHx8ICdnJyksIHJlcGxhY2VtZW50LlRvID8/ICcnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQucmVwbGFjZUFsbChyZXBsYWNlbWVudC5Gcm9tLCByZXBsYWNlbWVudC5UbyA/PyAnJyk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbnZhbGlkIGN1c3RvbSBzeW1ib2wgcmVwbGFjZW1lbnQgc2tpcHBlZC4nLCB7IHJlcGxhY2VtZW50LCBlcnIgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfVxyXG4gICAgfSwgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgY29tcHJlc3Npb24gaXMgZW5hYmxlZCBhbmQgY29tcHJlc3MgbW9kZSBpcyBPTiwgY29tcHJlc3MgYW55IHBhc3RlZCBiYXNlNjQgaW1hZ2VzIChkYXRhOmltYWdlLyopLlxyXG4gICAqIElNUE9SVEFOVDogbW9kaWZpZXMgZS5jbGVhbmVkSHRtbCAod2hhdCBnZXRzIHBhc3RlZCksIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVJbWFnZUNvbXByZXNzaW9uKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGNvbXByZXNzaW9uQ29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgaXNDb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG4gICAgaWYgKCFpc0NvbXByZXNzaW9uRW5hYmxlZCB8fCAhdGhpcy5pc0NvbXByZXNzTW9kZU9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGVhbmVkID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuICAgIGlmICghY2xlYW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRvYzogRG9jdW1lbnQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGNsZWFuZWQsICd0ZXh0L2h0bWwnKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHBhcnNlIHBhc3RlZCBIVE1MIGZvciBpbWFnZSBjb21wcmVzc2lvbi4gUGFzdGUgd2lsbCBjb250aW51ZS4nLCBlcnIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW1nRWxlbWVudHMgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKSlcclxuICAgICAgLm1hcChpbWcgPT4gaW1nIGFzIEhUTUxJbWFnZUVsZW1lbnQpXHJcbiAgICAgIC5maWx0ZXIoaW1nID0+IHR5cGVvZiBpbWc/LnNyYyA9PT0gJ3N0cmluZycgJiYgaW1nLnNyYy5zdGFydHNXaXRoKCdkYXRhOmltYWdlLycpKTtcclxuXHJcbiAgICBpZiAoaW1nRWxlbWVudHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmVmb3JlU2l6ZUJ5dGVzID0gMDtcclxuICAgIGxldCBhZnRlclNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgZmFpbGVkQ291bnQgPSAwO1xyXG5cclxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICBpbWdFbGVtZW50cy5tYXAoYXN5bmMgKGltZywgaW5kZXgpID0+IHtcclxuICAgICAgICBjb25zdCBzcmMgPSBpbWcuc3JjO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgZmlsZSA9IGF3YWl0IHRoaXMuYmFzZTY0VG9GaWxlKHNyYywgYHBhc3RlZC1pbWFnZS0ke2luZGV4fWApO1xyXG4gICAgICAgICAgYmVmb3JlU2l6ZUJ5dGVzICs9IGZpbGUuc2l6ZTtcclxuXHJcbiAgICAgICAgICBjb25zdCBjb21wcmVzc2VkID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKGZpbGUpO1xyXG4gICAgICAgICAgaWYgKCFjb21wcmVzc2VkKSB7XHJcbiAgICAgICAgICAgIGZhaWxlZENvdW50Kys7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBza2lwcGVkL2ZhaWxlZCBmb3IgcGFzdGVkIGltYWdlICMke2luZGV4ICsgMX0uYCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKGNvbXByZXNzZWQpO1xyXG4gICAgICAgICAgYWZ0ZXJTaXplQnl0ZXMgKz0gY29tcHJlc3NlZC5zaXplO1xyXG4gICAgICAgICAgaW1nLnNyYyA9IGJhc2U2NDtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGZhaWxlZENvdW50Kys7XHJcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gRXJyb3IgY29tcHJlc3NpbmcgcGFzdGVkIGltYWdlICMke2luZGV4ICsgMX0uYCwgZXJyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBIZWxwZnVsIGNvbnNvbGUgbG9ncyBmb3IgdHJvdWJsZXNob290aW5nLlxyXG4gICAgY29uc3QgYmVmb3JlS2IgPSAoYmVmb3JlU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuICAgIGNvbnN0IGFmdGVyS2IgPSAoYWZ0ZXJTaXplQnl0ZXMgLyAxMDI0KS50b0ZpeGVkKDIpO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBgW1p0ZXh0ZWRpdG9yXSBQYXN0ZWQgaW1hZ2UgY29tcHJlc3Npb24gY29tcGxldGVkLiBJbWFnZXM9JHtpbWdFbGVtZW50cy5sZW5ndGh9LCBGYWlsZWQ9JHtmYWlsZWRDb3VudH0sIEJlZm9yZT0ke2JlZm9yZUtifUtCLCBBZnRlcj0ke2FmdGVyS2J9S0JgLFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBNb2RpZnkgd2hhdCBnZXRzIHBhc3RlZCwgbm90IGVkaXRvci52YWx1ZS5cclxuICAgIGUuY2xlYW5lZEh0bWwgPSBkb2MuYm9keS5pbm5lckhUTUw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgY29tcHJlc3MgbW9kZSB2aWEgY29uZmlybWF0aW9uIGRpYWxvZy5cclxuICAgKi9cclxuICBwdWJsaWMgb25PZmZDb21wcmVzc01vZGUoKTogdm9pZCB7XHJcbiAgICBjb25zdCBoZWFkZXIgPSAnQ29uZmlybWF0aW9uJztcclxuICAgIGNvbnN0IGFjdGlvblRleHQgPSB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnZGlzYWJsZScgOiAnZW5hYmxlJztcclxuXHJcbiAgICAvLyBLZWVwIGV4aXN0aW5nIGJlaGF2aW9yOiB0b2dnbGluZyByZXNldHMgY29udGVudC5cclxuICAgIGNvbnN0IG1lc3NhZ2UgPVxyXG4gICAgICBgRG8geW91IHdhbnQgdG8gPGI+JHthY3Rpb25UZXh0fTwvYj4gaW1hZ2UgY29tcHJlc3Npb24gd2hlbiBpbnB1dCBjb250ZW50P2AgK1xyXG4gICAgICBgPGJyLz5Ob3RlOiBDbGljayBcIlllc1wiIHRoZSBjb250ZW50IHdpbGwgYmUgcmVzZXQgdG8gYmxhbmsuYDtcclxuXHJcbiAgICBjb25zdCBidXR0b25zID0ge1xyXG4gICAgICB5ZXM6IHsgdGV4dDogJ1llcycsIGNzc0NsYXNzOiAncHJpbWFyeScgfSBhcyBBbGVydEJ1dHRvbixcclxuICAgICAgbm86IHsgdGV4dDogJ05vJywgY3NzQ2xhc3M6ICdzZWNvbmRhcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlXHJcbiAgICAgIC5zaG93KGhlYWRlciwgbWVzc2FnZSwgW2J1dHRvbnMueWVzLCBidXR0b25zLm5vXSwgWydjb2wtNCddKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcGx5ID0+IHtcclxuICAgICAgICBpZiAocmVwbHkgIT09ICdZZXMnKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgICAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCB0b2dnbGUgY29tcHJlc3Npb24gbW9kZS4nKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVkaXRvci52YWx1ZSA9ICcnO1xyXG4gICAgICAgIHRoaXMuaXNDb21wcmVzc01vZGVPbiA9ICF0aGlzLmlzQ29tcHJlc3NNb2RlT247XHJcblxyXG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coXHJcbiAgICAgICAgICBgJHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyAnRW5hYmxlJyA6ICdEaXNhYmxlJ30gaW1hZ2UgY29tcHJlc3Npb24gc3VjY2Vzc2Z1bGx5LmAsXHJcbiAgICAgICAgICAndG9wJyxcclxuICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgMjUwMCxcclxuICAgICAgICAgICdzdWNjZXNzJyxcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29tcHJlc3Npb25Ub29sYmFySWNvbigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBrLWktaW1hZ2UgJHt0aGlzLmlzQ29tcHJlc3NNb2RlT24gPyB0aGlzLmNvbXByZXNzaW9uRGlzYWJsZWRJY29uIDogdGhpcy5jb21wcmVzc2lvbkVuYWJsZUljb259YDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY29tcHJlc3Npb25Ub29sYmFyVGl0bGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ0Rpc2FibGUnIDogJ0VuYWJsZSd9IGltYWdlIGNvbXByZXNzaW9uYDtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUxpc3QoY29tbWFuZDogJ2luc2VydFVub3JkZXJlZExpc3QnIHwgJ2luc2VydE9yZGVyZWRMaXN0Jyk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGFwcGx5IGxpc3QgZm9ybWF0dGluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b2dnbGVIYXJkQnJlYWtMaXN0KGNvbW1hbmQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWRpdG9yLmV4ZWMoY29tbWFuZCk7XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZUhhcmRCcmVha0xpc3QoY29tbWFuZDogJ2luc2VydFVub3JkZXJlZExpc3QnIHwgJ2luc2VydE9yZGVyZWRMaXN0Jyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmVkaXRvcj8udmlldztcbiAgICBpZiAoIXZpZXcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0UmFuZ2UgPSB0aGlzLmZpbmRTZWxlY3RlZExpc3RSYW5nZSgpO1xuICAgIGlmIChsaXN0UmFuZ2UpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5nZXRMaXN0SXRlbUxpbmVzKGxpc3RSYW5nZS5ub2RlKTtcbiAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMucmVwbGFjZVJhbmdlV2l0aEh0bWwobGlzdFJhbmdlLmZyb20sIGxpc3RSYW5nZS50bywgdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lcykpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhZ3JhcGhSYW5nZSA9IHRoaXMuZmluZFNlbGVjdGVkSGFyZEJyZWFrUGFyYWdyYXBoUmFuZ2UoKTtcbiAgICBpZiAoIXBhcmFncmFwaFJhbmdlIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhwYXJhZ3JhcGhSYW5nZS5ub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcGxhY2VtZW50SHRtbCA9IHRoaXMuYnVpbGRTZWxlY3RlZFBhcmFncmFwaExpc3RIdG1sKHBhcmFncmFwaFJhbmdlLCBjb21tYW5kKTtcbiAgICBpZiAoIXJlcGxhY2VtZW50SHRtbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVwbGFjZVJhbmdlV2l0aEh0bWwocGFyYWdyYXBoUmFuZ2UuZnJvbSwgcGFyYWdyYXBoUmFuZ2UudG8sIHJlcGxhY2VtZW50SHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbmNlc3RvclJhbmdlKG5vZGVOYW1lczogc3RyaW5nW10pOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkZXB0aCA9IHNlbGVjdGlvbi4kZnJvbS5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKSB7XG4gICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uLiRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgaWYgKG5vZGVOYW1lcy5pbmNsdWRlcyhub2RlLnR5cGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGZyb206IHNlbGVjdGlvbi4kZnJvbS5iZWZvcmUoZGVwdGgpLFxuICAgICAgICAgIHRvOiBzZWxlY3Rpb24uJGZyb20uYWZ0ZXIoZGVwdGgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXZpZXcgfHwgIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLmZpbmRBbmNlc3RvclJhbmdlKFsnYnVsbGV0X2xpc3QnLCAnb3JkZXJlZF9saXN0J10pO1xuICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgcmV0dXJuIGFuY2VzdG9yO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZExpc3Q6IHsgbm9kZTogYW55OyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHZpZXcuc3RhdGUuZG9jLm5vZGVzQmV0d2VlbihzZWxlY3Rpb24uZnJvbSwgc2VsZWN0aW9uLnRvLCAobm9kZTogYW55LCBwb3M6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkTGlzdCB8fCAhWydidWxsZXRfbGlzdCcsICdvcmRlcmVkX2xpc3QnXS5pbmNsdWRlcyhub2RlLnR5cGU/Lm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZExpc3QgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRIYXJkQnJlYWtQYXJhZ3JhcGhSYW5nZSgpOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghdmlldyB8fCAhc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZmluZEFuY2VzdG9yUmFuZ2UoWydwYXJhZ3JhcGgnXSk7XG4gICAgaWYgKGFuY2VzdG9yPy5ub2RlICYmIHRoaXMuaGFzSGFyZEJyZWFrKGFuY2VzdG9yLm5vZGUpKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdGVkUGFyYWdyYXBoOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB2aWV3LnN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oc2VsZWN0aW9uLmZyb20sIHNlbGVjdGlvbi50bywgKG5vZGU6IGFueSwgcG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZFBhcmFncmFwaCB8fCBub2RlLnR5cGU/Lm5hbWUgIT09ICdwYXJhZ3JhcGgnIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0ZWRQYXJhZ3JhcGggPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRQYXJhZ3JhcGg7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFncmFwaEhhcmRCcmVha0xpbmVzKHBhcmFncmFwaDogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVUb0hhcmRCcmVha1RleHQocGFyYWdyYXBoKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKVxuICAgICAgLmZpbHRlcihsaW5lID0+ICEhbGluZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0ZWRQYXJhZ3JhcGhMaXN0SHRtbChcbiAgICBwYXJhZ3JhcGhSYW5nZTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9LFxuICAgIGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yPy52aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5nZXRQYXJhZ3JhcGhMaW5lUmFuZ2VzKHBhcmFncmFwaFJhbmdlLm5vZGUsIHBhcmFncmFwaFJhbmdlLmZyb20pO1xuICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5maWx0ZXIobGluZSA9PiBsaW5lLnRleHQudHJpbSgpICYmIGxpbmUudG8gPiBzZWxlY3Rpb24uZnJvbSAmJiBsaW5lLmZyb20gPCBzZWxlY3Rpb24udG8pO1xuXG4gICAgaWYgKHNlbGVjdGVkTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFNlbGVjdGVkSW5kZXggPSBsaW5lcy5pbmRleE9mKHNlbGVjdGVkTGluZXNbMF0pO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEluZGV4ID0gbGluZXMuaW5kZXhPZihzZWxlY3RlZExpbmVzW3NlbGVjdGVkTGluZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGJlZm9yZUxpbmVzID0gbGluZXMuc2xpY2UoMCwgZmlyc3RTZWxlY3RlZEluZGV4KS5tYXAobGluZSA9PiBsaW5lLnRleHQpO1xuICAgIGNvbnN0IGFmdGVyTGluZXMgPSBsaW5lcy5zbGljZShsYXN0U2VsZWN0ZWRJbmRleCArIDEpLm1hcChsaW5lID0+IGxpbmUudGV4dCk7XG4gICAgY29uc3QgbGlzdFRhZyA9IGNvbW1hbmQgPT09ICdpbnNlcnRPcmRlcmVkTGlzdCcgPyAnb2wnIDogJ3VsJztcbiAgICBjb25zdCBsaXN0SHRtbCA9XG4gICAgICBgPCR7bGlzdFRhZ30+YCArXG4gICAgICBzZWxlY3RlZExpbmVzLm1hcChsaW5lID0+IGA8bGk+JHt0aGlzLmVzY2FwZUh0bWwobGluZS50ZXh0LnRyaW0oKSl9PC9saT5gKS5qb2luKCcnKSArXG4gICAgICBgPC8ke2xpc3RUYWd9PmA7XG5cbiAgICByZXR1cm4gW1xuICAgICAgYmVmb3JlTGluZXMubGVuZ3RoID8gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChiZWZvcmVMaW5lcykgOiAnJyxcbiAgICAgIGxpc3RIdG1sLFxuICAgICAgYWZ0ZXJMaW5lcy5sZW5ndGggPyB0aGlzLmxpbmVzVG9IYXJkQnJlYWtQYXJhZ3JhcGhIdG1sKGFmdGVyTGluZXMpIDogJycsXG4gICAgXS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYWdyYXBoTGluZVJhbmdlcyhwYXJhZ3JhcGg6IGFueSwgcGFyYWdyYXBoUG9zOiBudW1iZXIpOiBBcnJheTx7IHRleHQ6IHN0cmluZzsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBsaW5lczogQXJyYXk8eyB0ZXh0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0ge1xuICAgICAgdGV4dDogJycsXG4gICAgICBmcm9tOiBwYXJhZ3JhcGhQb3MgKyAxLFxuICAgICAgdG86IHBhcmFncmFwaFBvcyArIDEsXG4gICAgfTtcblxuICAgIHBhcmFncmFwaC5mb3JFYWNoKChjaGlsZDogYW55LCBvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgY2hpbGRGcm9tID0gcGFyYWdyYXBoUG9zICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGNoaWxkVG8gPSBjaGlsZEZyb20gKyBjaGlsZC5ub2RlU2l6ZTtcblxuICAgICAgaWYgKGNoaWxkLnR5cGU/Lm5hbWUgPT09ICdoYXJkX2JyZWFrJykge1xuICAgICAgICBjdXJyZW50LnRvID0gY2hpbGRGcm9tO1xuICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0ge1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIGZyb206IGNoaWxkVG8sXG4gICAgICAgICAgdG86IGNoaWxkVG8sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC50ZXh0ICs9IGNoaWxkLnRleHRDb250ZW50ID8/ICcnO1xuICAgICAgY3VycmVudC50byA9IGNoaWxkVG87XG4gICAgfSk7XG5cbiAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlzdEl0ZW1MaW5lcyhsaXN0OiBhbnkpOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBsaXN0LmZvckVhY2goKGxpc3RJdGVtOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLm5vZGVUb0hhcmRCcmVha1RleHQobGlzdEl0ZW0pLnRyaW0oKTtcbiAgICAgIGlmIChsaW5lKSB7XG4gICAgICAgIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG4gIH1cblxuICBwcml2YXRlIG5vZGVUb0hhcmRCcmVha1RleHQobm9kZTogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgdGV4dCA9ICcnO1xuXG4gICAgbm9kZS5kZXNjZW5kYW50cygoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgaWYgKGNoaWxkLnR5cGU/Lm5hbWUgPT09ICdoYXJkX2JyZWFrJykge1xuICAgICAgICB0ZXh0ICs9ICdcXG4nO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZC5pc1RleHQpIHtcbiAgICAgICAgdGV4dCArPSBjaGlsZC50ZXh0ID8/ICcnO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhcmRCcmVhayhub2RlOiBhbnkpOiBib29sZWFuIHtcbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcblxuICAgIG5vZGUuZGVzY2VuZGFudHMoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlPy5uYW1lID09PSAnaGFyZF9icmVhaycpIHtcbiAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAhZm91bmQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cblxuICBwcml2YXRlIGxpbmVzVG9IYXJkQnJlYWtQYXJhZ3JhcGhIdG1sKGxpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGA8cD4ke2xpbmVzLm1hcChsaW5lID0+IHRoaXMuZXNjYXBlSHRtbChsaW5lKSkuam9pbignPGJyPicpfTwvcD5gO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhcmFncmFwaEVudGVyQmVoYXZpb3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uRW50ZXJLZXlCZWhhdmlvciAhPT0gJ2xpbmVCcmVhayc7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VSYW5nZVdpdGhIdG1sKGZyb206IG51bWJlciwgdG86IG51bWJlciwgaHRtbDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xuICAgIGlmICghdmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGNvbnN0IGZyYWdtZW50ID0gUHJvc2VNaXJyb3JET01QYXJzZXIuZnJvbVNjaGVtYSh2aWV3LnN0YXRlLnNjaGVtYSkucGFyc2UoY29udGFpbmVyKS5jb250ZW50O1xuICAgIHZpZXcuZGlzcGF0Y2godmlldy5zdGF0ZS50ci5yZXBsYWNlV2l0aChmcm9tLCB0bywgZnJhZ21lbnQpLnNjcm9sbEludG9WaWV3KCkpO1xuICAgIHZpZXcuZm9jdXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW50ZXJBc0xpbmVCcmVha1BsdWdpbigpOiBQbHVnaW4ge1xuICAgIHJldHVybiBrZXltYXAoe1xuICAgICAgJ1NoaWZ0LUVudGVyJzogY2hhaW5Db21tYW5kcyhleGl0Q29kZSwgc3BsaXRCbG9jayksXG4gICAgICBFbnRlcjogY2hhaW5Db21tYW5kcyhleGl0Q29kZSwgKHN0YXRlLCBkaXNwYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBoYXJkQnJlYWsgPSBzdGF0ZS5zY2hlbWEubm9kZXMuaGFyZF9icmVhaztcbiAgICAgICAgaWYgKCFoYXJkQnJlYWsgfHwgIXN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xyXG4gICAgICAgICAgZGlzcGF0Y2goc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbldpdGgoaGFyZEJyZWFrLmNyZWF0ZSgpKS5zY3JvbGxJbnRvVmlldygpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jdXMgZWRpdG9yIGlmIGF2YWlsYWJsZS4gUmV0dXJucyB0cnVlIGlmIGZvY3VzIHN1Y2NlZWRlZC4gKi9cclxuICBwdWJsaWMgZm9jdXMoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcclxuICAgICAgdGhpcy5lZGl0b3IuZm9jdXMoKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWU6IHN0cmluZywgZm9udEF3ZXNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UpOiB1bmtub3duIHtcclxuICAgIGNvbnN0IGljb25OYW1lVmFsdWUgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoaWNvbk5hbWUsIHRoaXMuZ3JvdXApO1xyXG4gICAgaWYgKGljb25OYW1lVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9udEF3ZXNvbWUoaWNvbk5hbWVWYWx1ZSwgZm9udEF3ZXNvbWVTZXJ2aWNlKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpY29uTmFtZTtcclxuICB9XHJcblxyXG4gIC8qKiBNZXJnZSBLZW5kbyBwYXN0ZSBjbGVhbnVwIHNldHRpbmdzIGZyb20gUGFzdGVDbGVhbnVwU2V0dGluZ3MsIHdpdGggZGF0YS5PcHRpb25zIGtlcHQgYXMgYSBsZWdhY3kgZmFsbGJhY2suICovXHJcbiAgcHJpdmF0ZSBzZXR1cFBhc3RlQ2xlYW51cFNldHRpbmdzKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZGF0YT8uUGFzdGVDbGVhbnVwU2V0dGluZ3MgPz8gdGhpcy5kYXRhPy5PcHRpb25zO1xyXG4gICAgaWYgKCFvcHRpb25zKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cFZhbHVlKG9wdGlvbnMsIHRoaXMuZ3JvdXApO1xyXG4gICAgICBpZiAocmVzb2x2ZWQgJiYgdHlwZW9mIHJlc29sdmVkID09PSAnb2JqZWN0Jykge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgcmVzb2x2ZWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBQYXN0ZSBjbGVhbnVwIHNldHRpbmdzIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhbiBvYmplY3QuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgICByZXNvbHZlZCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0Jykge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFzdGVDbGVhbnVwU2V0dGluZ3MsIG9wdGlvbnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuc3VwcG9ydGVkIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgdHlwZS4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgdHlwZTogdHlwZW9mIG9wdGlvbnMsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXNvbHZlIG9wdGlvbmFsIHBhc3RlIHN5bWJvbCBub3JtYWxpemF0aW9uIHNldHRpbmdzIGZyb20gZmllbGQgY29uZmlnLiAqL1xyXG4gIHByaXZhdGUgc2V0dXBTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZGF0YT8uU3ltYm9sTm9ybWFsaXphdGlvbjtcclxuICAgIGlmIChzZXR0aW5ncyA9PT0gdW5kZWZpbmVkIHx8IHNldHRpbmdzID09PSBudWxsKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoc2V0dGluZ3MsIHRoaXMuZ3JvdXApO1xyXG4gICAgICB0aGlzLm1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHJlc29sdmVkKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3Moc2V0dGluZ3MpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5nczogdW5rbm93bik6IHZvaWQge1xyXG4gICAgaWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQgPSBzZXR0aW5ncztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghc2V0dGluZ3MgfHwgdHlwZW9mIHNldHRpbmdzICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHNldHRpbmdzKSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gU3ltYm9sTm9ybWFsaXphdGlvbiByZXNvbHZlZCB2YWx1ZSBpcyBub3QgYSBzdXBwb3J0ZWQgY29uZmlnLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICAgIHNldHRpbmdzLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIE9iamVjdC5hc3NpZ24odGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MsIHNldHRpbmdzKTtcclxuICAgIHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkN1c3RvbVJlcGxhY2VtZW50cyA9XHJcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzKVxyXG4gICAgICAgID8gdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzXHJcbiAgICAgICAgOiBbXTtcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gQ3VzdG9tIEltYWdlIFVwbG9hZCAvIEVubGFyZ2VcclxuXHJcbiAgLyoqIFRyaWdnZXIgaGlkZGVuIGZpbGUgaW5wdXQgY2xpY2sgZm9yIGltYWdlIHVwbG9hZC4gKi9cclxuICBwdWJsaWMgb3BlbkZpbGVFeHBsb3JlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkID0gYCR7dGhpcy5kYXRhLlZhbHVlfS11cGxvYWQtZmlsZWA7XHJcbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuXHJcbiAgICBpZiAoIWlucHV0KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgW1p0ZXh0ZWRpdG9yXSBVcGxvYWQgaW5wdXQgZWxlbWVudCBub3QgZm91bmQgKGlkPVwiJHtpZH1cIikuYCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW4gYW4gZW5sYXJnZWQgcG9wdXAgZWRpdG9yLiAqL1xyXG4gIHB1YmxpYyBvcGVuUG9wdXAoKTogdm9pZCB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3Qgb3BlbiBwb3B1cC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE9wZW4gZGlhbG9nXHJcbiAgICB0aGlzLmRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHtcclxuICAgICAgY29udGVudDogWnRleHRlZGl0b3JDb21wb25lbnQsXHJcbiAgICAgIHdpZHRoOiAnOTglJyxcclxuICAgICAgaGVpZ2h0OiAnOTclJyxcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IHBvcHVwQ29tcG9uZW50ID0gdGhpcy5kaWFsb2dSZWYuY29udGVudC5pbnN0YW5jZSBhcyBadGV4dGVkaXRvckNvbXBvbmVudDtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEgPSB0aGlzLmRhdGE7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kYXRhLkFsbG93RW5sYXJnZSA9IGZhbHNlO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWY7XHJcbiAgICBwb3B1cENvbXBvbmVudC5DbG9zZUVubGFyZ2VCdG4gPSB0cnVlO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcyA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcztcclxuXHJcbiAgICAvLyBQcmVzZXJ2ZSBzdHlsZSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiBjbG9zZS5cclxuICAgIHRoaXMub3JpZ2luYWxJbmxpbmVTdHlsZSA9IHRoaXMuY29tcG9uZW50UHJvcGVydGllcz8uc3R5bGU/LnN0eWxlMSA/PyAnJztcclxuICAgIGlmIChwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMSA9XHJcbiAgICAgICAgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID8/ICcnKSArXHJcbiAgICAgICAgYGhlaWdodDokeyh3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjgpLnRvU3RyaW5nKCl9cHhgO1xyXG4gICAgfVxyXG5cclxuICAgIHBvcHVwQ29tcG9uZW50Lmdyb3VwID0gdGhpcy5ncm91cDtcclxuICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFNldHRpbmdzID0gdGhpcy5jb21wb25lbnRTZXR0aW5ncztcclxuICAgIHBvcHVwQ29tcG9uZW50LmZvcm0gPSB0aGlzLmZvcm07XHJcblxyXG4gICAgLy8gUmVzdG9yZSBzdGF0ZSBhbmQgcHVzaCB2YWx1ZSBiYWNrIGludG8gZWRpdG9yIG9uIGNsb3NlLlxyXG4gICAgdGhpcy5kaWFsb2dSZWYucmVzdWx0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZGF0YS5BbGxvd0VubGFyZ2UgPSB0cnVlO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY29tcG9uZW50UHJvcGVydGllcz8uc3R5bGUpIHtcclxuICAgICAgICB0aGlzLmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID0gdGhpcy5vcmlnaW5hbElubGluZVN0eWxlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBQdWxsIGN1cnJlbnQgek1vZGVsIGludG8gZWRpdG9yIGFuZCB0cmlnZ2VyIG9uQ2hhbmdlIChleGlzdGluZyBiZWhhdmlvcikuXHJcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5ncm91cD8uek1vZGVsPy5bdGhpcy5kYXRhLlZhbHVlXTtcclxuICAgICAgZWRpdG9yLnZhbHVlID0gbmV3VmFsdWU7XHJcbiAgICAgIHRoaXMub25DaGFuZ2UobmV3VmFsdWUpO1xyXG4gICAgICB0aGlzLmZvY3VzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBDbG9zZSB0aGUgcG9wdXAgZWRpdG9yIGlmIG9wZW4uICovXHJcbiAgcHVibGljIG9uUG9wdXBDbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaWFsb2dSZWYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSA8aW5wdXQgdHlwZT1cImZpbGVcIj4gY2hhbmdlIGFuZCBpbnNlcnQgc2VsZWN0ZWQgaW1hZ2UgaW50byBlZGl0b3IuXHJcbiAgICogTk9URTogUHJlZmVyIHR5cGluZyBmaWxlSW5wdXQgYXMgRXZlbnQgZm9yIGJldHRlciBzYWZldHkuXHJcbiAgICovXHJcbiAgcHVibGljIHVwbG9hZEltYWdlKGZpbGVJbnB1dDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZmlsZUlucHV0Py50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XHJcbiAgICBjb25zdCBmaWxlID0gaW5wdXQ/LmZpbGVzPy5bMF07XHJcblxyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBObyBpbWFnZSBzZWxlY3RlZCBmb3IgdXBsb2FkLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdm9pZCB0aGlzLmluc2VydEltYWdlSW50b0VkaXRvcihmaWxlKTtcclxuICB9XHJcblxyXG4gIC8qKiBJbnNlcnQgaW1hZ2UgaW50byBlZGl0b3IsIG9wdGlvbmFsbHkgY29tcHJlc3NpbmcgZmlyc3QuICovXHJcbiAgcHJpdmF0ZSBhc3luYyBpbnNlcnRJbWFnZUludG9FZGl0b3IoZmlsZTogRmlsZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICBpZiAoIWVkaXRvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRWRpdG9yIGlzIG5vdCByZWFkeS4gQ2Fubm90IGluc2VydCBpbWFnZS4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB3b3JraW5nRmlsZTogRmlsZSB8IG51bGwgPSBmaWxlO1xyXG5cclxuICAgIGNvbnN0IGNvbXByZXNzaW9uQ29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgY29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuXHJcbiAgICBpZiAoY29tcHJlc3Npb25FbmFibGVkKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBiZWZvcmUgY29tcHJlc3Npb246ICR7KHdvcmtpbmdGaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcblxyXG4gICAgICB3b3JraW5nRmlsZSA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbih3b3JraW5nRmlsZSk7XHJcbiAgICAgIGlmICghd29ya2luZ0ZpbGUpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gZmFpbGVkLiBVcGxvYWQgaW1hZ2UgaW5zZXJ0aW9uIGFib3J0ZWQuJyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhgW1p0ZXh0ZWRpdG9yXSBVcGxvYWQgaW1hZ2UgYWZ0ZXIgY29tcHJlc3Npb246ICR7KHdvcmtpbmdGaWxlLnNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCYCk7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTCh3b3JraW5nRmlsZSk7XHJcbiAgICAgIGVkaXRvci5leGVjKCdpbnNlcnRJbWFnZScsIHsgc3JjOiBiYXNlNjQgfSk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byByZWFkIHVwbG9hZGVkIGltYWdlIGFzIGJhc2U2NC4nLCBlcnIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnQgYmFzZTY0IChkYXRhIFVSTCkgdG8gRmlsZS4gKi9cclxuICBwcml2YXRlIGFzeW5jIGJhc2U2NFRvRmlsZShiYXNlNjRTdHJpbmc6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8RmlsZT4ge1xyXG4gICAgLy8gVXNpbmcgZmV0Y2ggb24gZGF0YSBVUkwgaXMgc3VwcG9ydGVkIGJ5IG1vZGVybiBicm93c2Vyczsga2VlcCBleGlzdGluZyBsb2dpYy5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYmFzZTY0U3RyaW5nKTtcclxuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBGaWxlKFtibG9iXSwgZmlsZU5hbWUsIHtcclxuICAgICAgdHlwZTogYmxvYi50eXBlLFxyXG4gICAgICBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbXByZXNzIGFuIGltYWdlIGZpbGUgaWYgaXQgaXMgYW4gaW1hZ2UgYW5kIGFib3ZlIG1pbiB0aHJlc2hvbGQuXHJcbiAgICogUmV0dXJucyB0aGUgb3JpZ2luYWwgZmlsZSB3aGVuIGNvbXByZXNzaW9uIGlzIHNraXBwZWQsIGFuZCBudWxsIG9ubHkgd2hlbiBjb21wcmVzc2lvbiBmYWlscy5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGltYWdlQ29tcHJlc3Npb24oZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZSB8IG51bGw+IHtcclxuICAgIGlmICghZmlsZSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gaW1hZ2VDb21wcmVzc2lvbiBjYWxsZWQgd2l0aCBlbXB0eSBmaWxlLicpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZpbGUudHlwZSB8fCAhZmlsZS50eXBlLmluY2x1ZGVzKCdpbWFnZScpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTa2lwcGluZyBjb21wcmVzc2lvbjogZmlsZSBpcyBub3QgYW4gaW1hZ2UuJywgeyB0eXBlOiBmaWxlLnR5cGUgfSk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIC8vIENvbXByZXNzaW9uIG5vdCBjb25maWd1cmVkOyBrZWVwIHRoZSBvcmlnaW5hbCBmaWxlLlxyXG4gICAgICByZXR1cm4gZmlsZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpbWdDb25maWcgPSB0aGlzLmNvbXByZXNzaW9uQ29uZmlnSGFuZGxlcihjb25maWcpO1xyXG5cclxuICAgIC8vIElmIGZpbGUgaXMgYmVsb3cgdGhyZXNob2xkLCBrZWVwIHRoZSBvcmlnaW5hbCBmaWxlLlxyXG4gICAgaWYgKGZpbGUuc2l6ZSA8PSBpbWdDb25maWcuRmlsZVNpemVNaW5TaXplQnl0ZSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBgW1p0ZXh0ZWRpdG9yXSBTa2lwcGluZyBjb21wcmVzc2lvbjogZmlsZSBzaXplICR7KGZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0IgaXMgYmVsb3cgdGhyZXNob2xkICR7KGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlIC8gMTAyNCkudG9GaXhlZCgyKX1LQi5gLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gZmlsZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkJCA9IHRoaXMuY29tcHJlc3NJbWFnZS5jb21wcmVzcyhmaWxlLCBpbWdDb25maWcpO1xyXG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNvbXByZXNzZWQkKTtcclxuICAgICAgcmV0dXJuIGNvbXByZXNzZWRGaWxlID8/IG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIENvbXByZXNzaW9uIHNlcnZpY2UgdGhyZXcgYW4gZXJyb3IuJywgZXJyKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGltYWdlIGNvbXByZXNzaW9uIGNvbmZpZyBpbnRvIGJ5dGUtYmFzZWQgdGhyZXNob2xkcy4gKi9cclxuICBwcml2YXRlIGNvbXByZXNzaW9uQ29uZmlnSGFuZGxlcihpbWdDb25maWc6IEltYWdlQ29tcHJlc3Npb25Db25maWcpOiBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHtcclxuICAgIGlmICghaW1nQ29uZmlnKSB7XHJcbiAgICAgIC8vIERlZmVuc2l2ZTogc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNhbGxlciBjaGVja3MuXHJcbiAgICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1heFNpemUpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gdGhpcy5jb252ZXJ0U2l6ZVRvQnl0ZShpbWdDb25maWcuRmlsZVNpemVNaW5TaXplKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlID0gMDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW1nQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBzaXplIHN0cmluZyBsaWtlIFwiMTAwa2JcIiwgXCIxIE1CXCIsIFwiMmdiXCIgdG8gYnl0ZXMuXHJcbiAgICogSWYgbm8gdW5pdCBpcyBwcm92aWRlZCwgYnl0ZXMgYXJlIGFzc3VtZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb252ZXJ0U2l6ZVRvQnl0ZShzaXplU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgaWYgKCFzaXplU3RyaW5nIHx8IHR5cGVvZiBzaXplU3RyaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gY29udmVydFNpemVUb0J5dGUgcmVjZWl2ZWQgaW52YWxpZCBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBSZW1vdmUgYWxsIHNwYWNlcywgZS5nLiBcIjEgTUJcIiAtPiBcIjFNQlwiXHJcbiAgICBjb25zdCB0cmltbWVkID0gc2l6ZVN0cmluZy5yZXBsYWNlKC8gL2csICcnKS50cmltKCk7XHJcbiAgICBpZiAoIXRyaW1tZWQpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRXh0cmFjdCBudW1lcmljIHBhcnQgYW5kIHVuaXQgcGFydCAobGV0dGVycykuXHJcbiAgICAvLyBFeGFtcGxlOiBcIjEuNU1CXCIgPT4gbnVtYmVyPTEuNSwgdW5pdD1cIm1iXCJcclxuICAgIGNvbnN0IG1hdGNoID0gL14oWzAtOV0qXFwuP1swLTldKykoW2EtekEtWl0qKSQvLmV4ZWModHJpbW1lZCk7XHJcbiAgICBpZiAoIW1hdGNoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBVbmFibGUgdG8gcGFyc2Ugc2l6ZVN0cmluZy4gRGVmYXVsdGluZyB0byAwLicsIHsgc2l6ZVN0cmluZyB9KTtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbnVtZXJpYyA9IE51bWJlcihtYXRjaFsxXSk7XHJcbiAgICBjb25zdCB1bml0ID0gKG1hdGNoWzJdIHx8ICdiJykudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBpZiAoTnVtYmVyLmlzTmFOKG51bWVyaWMpIHx8IG51bWVyaWMgPCAwKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbnZhbGlkIG51bWVyaWMgc2l6ZSBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKHVuaXQpIHtcclxuICAgICAgY2FzZSAnYic6XHJcbiAgICAgIGNhc2UgJyc6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWM7XHJcbiAgICAgIGNhc2UgJ2tiJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ21iJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0O1xyXG4gICAgICBjYXNlICdnYic6XHJcbiAgICAgICAgcmV0dXJuIG51bWVyaWMgKiAxMDI0ICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVua25vd24gdW5pdCBpbiBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIGJ5dGVzLicsIHsgc2l6ZVN0cmluZywgdW5pdCB9KTtcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZWFkIGEgRmlsZSBhcyBiYXNlNjQgZGF0YSBVUkwuICovXHJcbiAgcHJpdmF0ZSByZWFkRmlsZUFzRGF0YVVSTChmaWxlOiBGaWxlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGlmICghZmlsZSkge1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZpbGUgaXMgcmVxdWlyZWQuJykpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcblxyXG4gICAgICByZWFkZXIub25sb2FkID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0IGFzIHN0cmluZyk7XHJcbiAgICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyAjZW5kcmVnaW9uXHJcbn1cclxuIiwiXHJcblxyXG48ZGl2IFtmb3JtR3JvdXBdPVwiZm9ybVwiIGNsYXNzPVwienRleHRlZGl0b3ItY29udGFpbmVyIGUxdGFnLXN0eWxlXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGVcIiBbbmdDbGFzc109XCJkYXRhLkNsYXNzXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC1sZy0xMiBleHBhbmQtYnRuLWNvbnRhaW5lclwiPlxyXG4gIDxpb24tYnV0dG9uICAgY2xhc3M9XCJpb24tYWN0aXZhdGFibGUgcmlwcGxlLXBhcmVudFwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlNFwiICpuZ0lmPVwiZGF0YS5BbGxvd0VubGFyZ2VcIiAoY2xpY2spPVwib3BlblBvcHVwKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUV4cGFuZEFsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG4gIDxpb24tYnV0dG9uICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJDbG9zZUVubGFyZ2VCdG5cIiAoY2xpY2spPVwib25Qb3B1cENsb3NlKClcIiAgW2lkXT1cImRhdGEuVmFsdWUgKyctcG9wdXAtYnV0dG9uJ1wiPlxyXG4gICAgPGZhLWljb24gY2xhc3M9XCJidG4taWNvblwiICBbaWNvbl09XCJnZXRGb250QXdlc29tZSgnZmFDb21wcmVzc0FsdCcsIGZvbnRBd2VTb21lU2VydmljZSlcIj48L2ZhLWljb24+XHJcbiAgPC9pb24tYnV0dG9uPlxyXG48L2Rpdj5cclxuICA8a2VuZG8tZWRpdG9yICNlZGl0b3JcclxuICAgICAgICAgICAgICAgIFtpZF09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiZGF0YS5WYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImUxdGFnLXN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTFcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIighIWNvbXBvbmVudFByb3BlcnRpZXMuaXNSZWFkT25seUZpZWxkID8gZ3JvdXBbY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGRdIDogY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5KVwiXHJcbiAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbcmVzaXphYmxlXT1cImRhdGEuUmVzaXphYmxlIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgIFtwbHVnaW5zXT1cInBsdWdpbnNDYWxsYmFja1wiXHJcbiAgICAgICAgICAgICAgICBbcGFzdGVDbGVhbnVwU2V0dGluZ3NdPVwicGFzdGVDbGVhbnVwU2V0dGluZ3NcIlxyXG4gICAgICAgICAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICBbaWZyYW1lXT1cImNvbXBvbmVudFNldHRpbmdzLmlmcmFtZVwiPlxyXG4gICAgPGtlbmRvLXRvb2xiYXIgKm5nSWY9XCJkYXRhLlRvb2xCYXJTdHlsZSA9PT0gJ2Jhc2ljJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCJcclxuICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb3JtYXQ+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udFNpemU+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udEZhbWlseT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckZvcmVDb2xvcj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yQmFja0NvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGljb249XCJsaXN0LXVub3JkZXJlZFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5kZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yT3V0ZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckNyZWF0ZUxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnZnVsbCdcIiBjbGFzcz1cImUxdGFnLXN0eWxlMlwiIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMlwiPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yUmVkb0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckJvbGRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJdGFsaWNCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmRlcmxpbmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdHJpa2V0aHJvdWdoQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3Vic2NyaXB0QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3VwZXJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkxlZnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkNlbnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduUmlnaHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBbGlnbkp1c3RpZnlCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb3JtYXQ+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udFNpemU+PC9rZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0IGtlbmRvRWRpdG9yRm9udEZhbWlseT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlciBrZW5kb0VkaXRvckZvcmVDb2xvciB2aWV3PVwiZ3JhZGllbnRcIj48L2tlbmRvLXRvb2xiYXItY29sb3JwaWNrZXI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yQmFja0NvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGljb249XCJsaXN0LXVub3JkZXJlZFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRPcmRlcmVkTGlzdCcpXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5kZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yT3V0ZGVudEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckNyZWF0ZUxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JVbmxpbmtCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tZWRpdG9yLWluc2VydC10YWJsZS1idXR0b24+PC9rZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQmVmb3JlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWRkQ29sdW1uQWZ0ZXJCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dCZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRSb3dBZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZUNvbHVtbkJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVJvd0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckRlbGV0ZVRhYmxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yTWVyZ2VDZWxsc0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclNwbGl0Q2VsbEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckluc2VydEZpbGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2RlZmF1bHQnXCIga2VuZG9FZGl0b3JJbnNlcnRJbWFnZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZXhwbG9yZXInXCIgaWNvbj1cImstaS1pbWFnZSBrLWktcGhvdG9cIiAoY2xpY2spPVwib3BlbkZpbGVFeHBsb3JlcigpXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiISFkYXRhLkNvbXByZXNzaW9uXCIgW2ljb25dPVwiY29tcHJlc3Npb25Ub29sYmFySWNvblwiIChjbGljayk9XCJvbk9mZkNvbXByZXNzTW9kZSgpXCIgW3RpdGxlXT1cImNvbXByZXNzaW9uVG9vbGJhclRpdGxlXCI+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yVmlld1NvdXJjZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgPC9rZW5kby10b29sYmFyPlxyXG4gIDwva2VuZG8tZWRpdG9yPlxyXG4gIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIiB0eXBlPVwiZmlsZVwiIFtpZF09XCJkYXRhLlZhbHVlICsnLXVwbG9hZC1maWxlJ1wiIFtuYW1lXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIG5nZi1tYXgtc2l6ZT1cIjVNQlwiIChjaGFuZ2UpPVwidXBsb2FkSW1hZ2UoJGV2ZW50KVwiPlxyXG48L2Rpdj5cclxuIl19
953
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoienRleHRlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvenRleHRlZGl0b3IvenRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0JBQStCO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQXlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsSUFBSSxvQkFBb0IsRUFDakMsUUFBUSxFQUNSLE1BQU0sRUFFTixVQUFVLEVBQ1gsTUFBTSwrQkFBK0IsQ0FBQztBQUV2Qyw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QywyQ0FBMkM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRXhFLE9BQU8sRUFVTCxnQkFBZ0IsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7Ozs7O0FBT3pCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxjQUFjO0lBZ0R0RCxZQUNrQixnQkFBbUMsRUFDbkMsa0JBQXNDLEVBQ3JDLGFBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLGFBQW1DLEVBQ25DLFlBQTBCO1FBRTNDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBUFIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQjtRQUNuQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3JDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdBQWIsYUFBYSxD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QUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1QsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDdkMsT0FBTzthQUNSO1lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRTNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFnQixDQUFDLENBQUM7WUFDdkQsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7aUhBcm9DVSxvQkFBb0I7cUdBQXBCLG9CQUFvQixnTEN2Q2pDLDBuVkEySUE7MkZEcEdhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxpQkFBaUI7OFBBS0MsTUFBTTtzQkFBakMsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqKioqKioqKiogQW5ndWxhciAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vKioqKioqKioqKiBQbHVnaW4gKioqKioqKioqKi9cclxuaW1wb3J0IHsgRWRpdG9yQ29tcG9uZW50LCBFZGl0b3JQYXN0ZUV2ZW50IH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZWRpdG9yJztcclxuaW1wb3J0IHsgRGlhbG9nUmVmLCBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQHByb2dyZXNzL2tlbmRvLWFuZ3VsYXItZGlhbG9nJztcclxuaW1wb3J0IHtcclxuICBjaGFpbkNvbW1hbmRzLFxyXG4gIERPTVBhcnNlciBhcyBQcm9zZU1pcnJvckRPTVBhcnNlcixcclxuICBleGl0Q29kZSxcclxuICBrZXltYXAsXHJcbiAgUGx1Z2luLFxyXG4gIHNwbGl0QmxvY2tcclxufSBmcm9tICdAcHJvZ3Jlc3Mva2VuZG8tZWRpdG9yLWNvbW1vbic7XHJcblxyXG4vKioqKioqKioqKiBSeEpTICoqKioqKioqKiovXHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7IElucHV0RmllbGRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9pbnB1dGZpZWxkYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBaQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3pjb21wb25lbnQuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sXHJcbiAgQWxlcnRTZXJ2aWNlLFxyXG4gIENvbXByZXNzSW1hZ2VTZXJ2aWNlLFxyXG4gIEZvbnRBd2VTb21lU2VydmljZSxcclxuICBJbWFnZUNvbXByZXNzaW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xOb3JtYWxpemF0aW9uQ29uZmlnLFxyXG4gIFRleHRFZGl0b3JTeW1ib2xSZXBsYWNlbWVudCxcclxuICBUb2FzdFNlcnZpY2UsXHJcbiAgWkNvbXBvbmVudCxcclxuICBaQ29tcG9uZW50SGVscGVyXHJcbn0gZnJvbSAnbW1oZ2xvYmFsLXpjb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXp0ZXh0ZWRpdG9yJyxcclxuICB0ZW1wbGF0ZVVybDogJy4venRleHRlZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3p0ZXh0ZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBadGV4dGVkaXRvckNvbXBvbmVudCBleHRlbmRzIElucHV0RmllbGRCYXNlIGltcGxlbWVudHMgWkNvbXBvbmVudCwgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcclxuICBAVmlld0NoaWxkKCdlZGl0b3InKSBwdWJsaWMgZWRpdG9yITogRWRpdG9yQ29tcG9uZW50O1xyXG5cclxuICBwdWJsaWMgcGFzdGVDbGVhbnVwU2V0dGluZ3M6IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogYm9vbGVhbjtcclxuICAgIHJlbW92ZU1zU3R5bGVzOiBib29sZWFuO1xyXG4gICAgcmVtb3ZlSW52YWxpZEhUTUw6IGJvb2xlYW47XHJcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XHJcbiAgfSA9IHtcclxuICAgIHJlbW92ZU1zQ2xhc3NlczogZmFsc2UsXHJcbiAgICByZW1vdmVNc1N0eWxlczogZmFsc2UsXHJcbiAgICByZW1vdmVJbnZhbGlkSFRNTDogZmFsc2UsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGNvbXBvbmVudFNldHRpbmdzOiB7IGlmcmFtZTogYm9vbGVhbjsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7XHJcbiAgICBpZnJhbWU6IHRydWUsXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5nczogUmVxdWlyZWQ8T21pdDxUZXh0RWRpdG9yU3ltYm9sTm9ybWFsaXphdGlvbkNvbmZpZywgJ0N1c3RvbVJlcGxhY2VtZW50cyc+PiAmIHtcclxuICAgIEN1c3RvbVJlcGxhY2VtZW50czogVGV4dEVkaXRvclN5bWJvbFJlcGxhY2VtZW50W107XHJcbiAgfSA9IHtcclxuICAgIEVuYWJsZWQ6IHRydWUsXHJcbiAgICBOb3JtYWxpemVIdG1sRW50aXRpZXM6IHRydWUsXHJcbiAgICBOb3JtYWxpemVEYXNoOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplUXVvdGVzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplU3BhY2VzOiB0cnVlLFxyXG4gICAgTm9ybWFsaXplRWxsaXBzaXM6IHRydWUsXHJcbiAgICBDdXN0b21SZXBsYWNlbWVudHM6IFtdLFxyXG4gIH07XG5cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbnNDYWxsYmFjayA9IChkZWZhdWx0UGx1Z2luczogUGx1Z2luW10pOiBQbHVnaW5bXSA9PiB7XG4gICAgaWYgKHRoaXMuaXNQYXJhZ3JhcGhFbnRlckJlaGF2aW9yKCkpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0UGx1Z2lucztcbiAgICB9XG5cbiAgICByZXR1cm4gW3RoaXMuZW50ZXJBc0xpbmVCcmVha1BsdWdpbigpLCAuLi5kZWZhdWx0UGx1Z2luc107XG4gIH07XG5cclxuICBwdWJsaWMgaXNDb21wcmVzc01vZGVPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBDbG9zZUVubGFyZ2VCdG46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGRpYWxvZ1JlZj86IERpYWxvZ1JlZjtcclxuXHJcbiAgcHJpdmF0ZSBvcmlnaW5hbElubGluZVN0eWxlOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkVuYWJsZUljb246IHN0cmluZyA9ICdrLWktem9vbS1iZXN0LWZpdCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc2lvbkRpc2FibGVkSWNvbjogc3RyaW5nID0gJ2staS16b29tLWFjdHVhbC1zaXplJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50U2VydmljZTogWkNvbXBvbmVudFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9udEF3ZVNvbWVTZXJ2aWNlOiBGb250QXdlU29tZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2U6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21wcmVzc0ltYWdlOiBDb21wcmVzc0ltYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgKSB7XHJcbiAgICBzdXBlcihjb21wb25lbnRTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIC8qKiBJbml0aWFsaXplIGNvbXBvbmVudCBzdGF0ZSBhbmQgZWRpdG9yIGNvbmZpZ3VyYXRpb24uICovXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0dXBJbm5lckZpZWxkKCk7XHJcblxyXG4gICAgLy8gQmFja3dhcmQtY29tcGF0aWJsZSBkZWZhdWx0OiB3aGVuIG5vdCBwcm92aWRlZCwgdXNlIGV4cGxvcmVyLlxyXG4gICAgdGhpcy5kYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9IHRoaXMuZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgfHwgJ2V4cGxvcmVyJztcclxuXHJcbiAgICB0aGlzLnNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTtcclxuICAgIHRoaXMuc2V0dXBTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MoKTtcclxuICAgIHN1cGVyLnNldHVwQ29tcG9uZW50U2V0dGluZ3ModGhpcy5jb21wb25lbnRTZXR0aW5ncyk7XHJcbiAgICBzdXBlci5mb2N1c09uRGVmYXVsdCh0aGlzLmZvY3VzLmJpbmQodGhpcykpO1xyXG5cclxuICAgIC8vIFNhZmUgY2FzdCB0byBib29sZWFuLlxyXG4gICAgdGhpcy5pc0NvbXByZXNzTW9kZU9uID0gISF0aGlzLmRhdGE/LkNvbXByZXNzaW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5vdGlmeSBjb21wb25lbnQgc2VydmljZSBvbmNlIHZpZXcgaXMgcmVhZHkuICovXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY29tcG9uZW50U2VydmljZS5kZWNyZW1lbnRDb21wb25lbnRDb3VudGVyRm9yRmllbGQodGhpcy5kYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBTeW5jIGVkaXRvciBjb250ZW50IHRvIHpNb2RlbCBhbmQgdHJpZ2dlciBjb25maWd1cmVkIGNoYW5nZSBoYW5kbGVyLiAqL1xyXG4gIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZTogdW5rbm93bik6IHZvaWQge1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRUb1pNb2RlbCh0aGlzLmRhdGEuVmFsdWUsIHZhbHVlLCB0aGlzLmdyb3VwLCB0aGlzLmRhdGEpO1xyXG4gICAgdGhpcy50cmlnZ2VyRXZlbnQoJ2lucHV0ZmllbGQtb25DaGFuZ2UnLCB0aGlzLmRhdGEuT25DaGFuZ2UsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kbGUgcGFzdGU6IG5vcm1hbGl6ZSBwbGFpbi10ZXh0IHNwZWNpYWwgZW50aXRpZXMsIHRoZW4gb3B0aW9uYWxseSBjb21wcmVzcyBwYXN0ZWQgYmFzZTY0IGltYWdlcy4gKi9cclxuICBwdWJsaWMgYXN5bmMgb25QYXN0ZShlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGV2ZW50IGlzIHVuZGVmaW5lZC4gUGFzdGUgaWdub3JlZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENvbW1vbiBFeGNlbC9wbGFpbi10ZXh0IGlzc3VlOiBcIiZhbXA7XCIgZ2V0cyBpbnNlcnRlZCBsaXRlcmFsbHkgY2F1c2luZyBcIiZhbXA7YW1wO1wiIGluIEhUTUwuXHJcbiAgICBjb25zdCBpc0hhbmRsZWQgPSB0aGlzLmhhbmRsZUNvbW1vblN5bWJvbFRhZ3MoZSk7XHJcbiAgICBpZiAoaXNIYW5kbGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm5vcm1hbGl6ZVBhc3RlZEh0bWwoZSk7XHJcblxyXG4gICAgLy8gQ29tcHJlc3Mgb25seSBpZiBlbmFibGVkIGFuZCBiYXNlNjQgaW1hZ2VzIGV4aXN0LlxyXG4gICAgYXdhaXQgdGhpcy5oYW5kbGVJbWFnZUNvbXByZXNzaW9uKGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSWYgdGhlIHBhc3RlIGlzIHBsYWluIHRleHQgKG5vIEhUTUwgdGFncyBhbmQgbm8gaW1hZ2VzKSwgbm9ybWFsaXplIGNvbW1vbiBlbnRpdGllcyBhbmQgaW5zZXJ0IGFzIHJlYWwgdGV4dC5cclxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZXZlbnQgaXMgaGFuZGxlZCBhbmQgZGVmYXVsdCBwYXN0ZSBpcyBwcmV2ZW50ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb21tb25TeW1ib2xUYWdzKGU6IEVkaXRvclBhc3RlRXZlbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBoYW5kbGUgcGxhaW4tdGV4dCBub3JtYWxpemF0aW9uLicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xpcGJvYXJkID0gKGUub3JpZ2luYWxFdmVudCBhcyBDbGlwYm9hcmRFdmVudCB8IHVuZGVmaW5lZCk/LmNsaXBib2FyZERhdGE7XHJcbiAgICBjb25zdCBwbGFpblRleHQgPSBjbGlwYm9hcmQ/LmdldERhdGEoJ3RleHQvcGxhaW4nKSA/PyAnJztcclxuICAgIGNvbnN0IGh0bWxUZXh0ID0gY2xpcGJvYXJkPy5nZXREYXRhKCd0ZXh0L2h0bWwnKSA/PyAnJztcclxuICAgIGNvbnN0IGNsZWFuZWRIdG1sID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuXHJcbiAgICBjb25zdCBodG1sSGFzSW1nID0gLzxpbWdcXGIvaS50ZXN0KGh0bWxUZXh0KTtcclxuICAgIGNvbnN0IGNsZWFuZWRIYXNUYWdzID0gLzxbXj5dKz4vLnRlc3QoY2xlYW5lZEh0bWwpO1xyXG5cclxuICAgIC8vIElmIHBhc3RlIGhhcyBIVE1MIHRhZ3Mgb3IgaW1hZ2VzLCBkbyBOT1QgaW50ZXJmZXJlIChsZXQgS2VuZG8gaGFuZGxlIGl0KS5cclxuICAgIGlmIChodG1sSGFzSW1nIHx8IGNsZWFuZWRIYXNUYWdzKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KHBsYWluVGV4dCB8fCBjbGVhbmVkSHRtbCk7XHJcblxyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5pbnNlcnRQbGFpblRleHRXaXRoRWRpdG9yTGluZUJyZWFrcyh0aGlzLm5vcm1hbGl6ZUxpbmVFbmRpbmdzKG5vcm1hbGl6ZWQpKTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub3JtYWxpemVMaW5lRW5kaW5ncyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5zZXJ0UGxhaW5UZXh0V2l0aEVkaXRvckxpbmVCcmVha3ModmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xyXG4gICAgaWYgKCF2aWV3KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgdmlldyBpcyBub3QgcmVhZHkuIENhbm5vdCBpbnNlcnQgcGFzdGVkIHRleHQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcclxuICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSB0aGlzLnBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZSk7XHJcblxyXG4gICAgY29uc3Qgc2xpY2UgPSBQcm9zZU1pcnJvckRPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKS5wYXJzZVNsaWNlKGNvbnRhaW5lcik7XHJcbiAgICB2aWV3LmRpc3BhdGNoKHZpZXcuc3RhdGUudHIucmVwbGFjZVNlbGVjdGlvbihzbGljZSkuc2Nyb2xsSW50b1ZpZXcoKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBsYWluVGV4dFRvRWRpdG9ySHRtbCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBsaW5lcyA9IHZhbHVlLnNwbGl0KCdcXG4nKTtcblxuICAgIGlmICh0aGlzLmlzUGFyYWdyYXBoRW50ZXJCZWhhdmlvcigpKSB7XG4gICAgICByZXR1cm4gbGluZXNcbiAgICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpID8gYDxwPiR7dGhpcy5lc2NhcGVIdG1sKGxpbmUpfTwvcD5gIDogJzxwPjxicj48L3A+JylcbiAgICAgICAgLmpvaW4oJycpO1xuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYDxwPiR7bGluZXMubWFwKGxpbmUgPT4gdGhpcy5lc2NhcGVIdG1sKGxpbmUpKS5qb2luKCc8YnI+Jyl9PC9wPmA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdmFsdWVcclxuICAgICAgLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKVxyXG4gICAgICAucmVwbGFjZUFsbCgnPCcsICcmbHQ7JylcclxuICAgICAgLnJlcGxhY2VBbGwoJz4nLCAnJmd0OycpXHJcbiAgICAgIC5yZXBsYWNlQWxsKCdcIicsICcmcXVvdDsnKVxyXG4gICAgICAucmVwbGFjZUFsbChcIidcIiwgJyYjMzk7Jyk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIHRleHQgbm9kZXMgaW5zaWRlIHBhc3RlZCBIVE1MIHdpdGhvdXQgdG91Y2hpbmcgdGFncywgc3R5bGVzLCBsaW5rcywgb3IgaW1hZ2UgYXR0cmlidXRlcy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZEh0bWwoZTogRWRpdG9yUGFzdGVFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjbGVhbmVkID0gZS5jbGVhbmVkSHRtbCA/PyAnJztcclxuICAgIGlmICghY2xlYW5lZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGRvYzogRG9jdW1lbnQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBkb2MgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGNsZWFuZWQsICd0ZXh0L2h0bWwnKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHBhcnNlIHBhc3RlZCBIVE1MIGZvciBzeW1ib2wgbm9ybWFsaXphdGlvbi4gUGFzdGUgd2lsbCBjb250aW51ZS4nLCBlcnIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgd2Fsa2VyID0gZG9jLmNyZWF0ZVRyZWVXYWxrZXIoZG9jLmJvZHksIE5vZGVGaWx0ZXIuU0hPV19URVhUKTtcclxuICAgIGxldCBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB3aGlsZSAobm9kZSkge1xyXG4gICAgICBub2RlLnRleHRDb250ZW50ID0gdGhpcy5ub3JtYWxpemVQYXN0ZWRUZXh0KG5vZGUudGV4dENvbnRlbnQgPz8gJycpO1xyXG4gICAgICBub2RlID0gd2Fsa2VyLm5leHROb2RlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jKTtcclxuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVFbXB0eVBhcmFncmFwaHMoZG9jOiBEb2N1bWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgZW1wdHlQYXJhZ3JhcGhzID0gQXJyYXkuZnJvbShkb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKCdwJykpLmZpbHRlcihwYXJhZ3JhcGggPT5cclxuICAgICAgdGhpcy5pc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaCksXHJcbiAgICApO1xyXG5cclxuICAgIGVtcHR5UGFyYWdyYXBocy5mb3JFYWNoKHBhcmFncmFwaCA9PiBwYXJhZ3JhcGgucmVtb3ZlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc0VtcHR5UGFyYWdyYXBoKHBhcmFncmFwaDogSFRNTFBhcmFncmFwaEVsZW1lbnQpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGFsbG93ZWRFbXB0eU5vZGVzID0gQXJyYXkuZnJvbShwYXJhZ3JhcGguY2hpbGROb2RlcykuZXZlcnkobm9kZSA9PiB7XHJcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xyXG4gICAgICAgIHJldHVybiAhKG5vZGUudGV4dENvbnRlbnQgPz8gJycpLnRyaW0oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBlbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgcmV0dXJuIGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYnInO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGFsbG93ZWRFbXB0eU5vZGVzICYmICEocGFyYWdyYXBoLnRleHRDb250ZW50ID8/ICcnKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICAvKiogTm9ybWFsaXplIGtub3duIHBhc3RlIHN5bWJvbCB2YXJpYW50cyBmcm9tIE9mZmljZS9lbWFpbCBjb250ZW50IGludG8gc3RhYmxlIGRpc3BsYXkgY2hhcmFjdGVycy4gKi9cclxuICBwcml2YXRlIG5vcm1hbGl6ZVBhc3RlZFRleHQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLkVuYWJsZWQgfHwgIXZhbHVlKSB7XHJcbiAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgbm9ybWFsaXplZCA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVIdG1sRW50aXRpZXMpIHtcclxuICAgICAgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZWRcclxuICAgICAgICAucmVwbGFjZUFsbCgnJmFtcDsnLCAnJicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZsdDsnLCAnPCcpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZndDsnLCAnPicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyZxdW90OycsICdcIicpXHJcbiAgICAgICAgLnJlcGxhY2VBbGwoJyYjMzk7JywgXCInXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5Ob3JtYWxpemVEYXNoKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUyMDEwXFx1MjAxMVxcdTIwMTJcXHUyMDEzXFx1MjAxNFxcdTIyMTJdL2csICctJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZVF1b3Rlcykge1xyXG4gICAgICBub3JtYWxpemVkID0gbm9ybWFsaXplZFxyXG4gICAgICAgIC5yZXBsYWNlKC9bXFx1MjAxOFxcdTIwMTlcXHUyMDFBXFx1MjAxQl0vZywgXCInXCIpXHJcbiAgICAgICAgLnJlcGxhY2UoL1tcXHUyMDFDXFx1MjAxRFxcdTIwMUVcXHUyMDFGXS9nLCAnXCInKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuTm9ybWFsaXplU3BhY2VzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1tcXHUwMEEwXFx1MjAyRlxcdTIwMDddL2csICcgJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzLk5vcm1hbGl6ZUVsbGlwc2lzKSB7XHJcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnJlcGxhY2UoL1xcdTIwMjYvZywgJy4uLicpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmFwcGx5Q3VzdG9tU3ltYm9sUmVwbGFjZW1lbnRzKG5vcm1hbGl6ZWQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBseUN1c3RvbVN5bWJvbFJlcGxhY2VtZW50cyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMucmVkdWNlKChyZXN1bHQsIHJlcGxhY2VtZW50KSA9PiB7XHJcbiAgICAgIGlmICghcmVwbGFjZW1lbnQ/LkZyb20pIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXBsYWNlbWVudC5Jc1JlZ2V4KSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2UobmV3IFJlZ0V4cChyZXBsYWNlbWVudC5Gcm9tLCByZXBsYWNlbWVudC5GbGFncyB8fCAnZycpLCByZXBsYWNlbWVudC5UbyA/PyAnJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0LnJlcGxhY2VBbGwocmVwbGFjZW1lbnQuRnJvbSwgcmVwbGFjZW1lbnQuVG8gPz8gJycpO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gSW52YWxpZCBjdXN0b20gc3ltYm9sIHJlcGxhY2VtZW50IHNraXBwZWQuJywgeyByZXBsYWNlbWVudCwgZXJyIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH0sIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQgYW5kIGNvbXByZXNzIG1vZGUgaXMgT04sIGNvbXByZXNzIGFueSBwYXN0ZWQgYmFzZTY0IGltYWdlcyAoZGF0YTppbWFnZS8qKS5cclxuICAgKiBJTVBPUlRBTlQ6IG1vZGlmaWVzIGUuY2xlYW5lZEh0bWwgKHdoYXQgZ2V0cyBwYXN0ZWQpLCBub3QgZWRpdG9yLnZhbHVlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlSW1hZ2VDb21wcmVzc2lvbihlOiBFZGl0b3JQYXN0ZUV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkNvbmZpZyA9IHRoaXMuZGF0YT8uQ29tcHJlc3Npb24gYXMgSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGlzQ29tcHJlc3Npb25FbmFibGVkID0gISFjb21wcmVzc2lvbkNvbmZpZztcclxuICAgIGlmICghaXNDb21wcmVzc2lvbkVuYWJsZWQgfHwgIXRoaXMuaXNDb21wcmVzc01vZGVPbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY2xlYW5lZCA9IGUuY2xlYW5lZEh0bWwgPz8gJyc7XHJcbiAgICBpZiAoIWNsZWFuZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkb2M6IERvY3VtZW50O1xyXG4gICAgdHJ5IHtcclxuICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhjbGVhbmVkLCAndGV4dC9odG1sJyk7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEZhaWxlZCB0byBwYXJzZSBwYXN0ZWQgSFRNTCBmb3IgaW1hZ2UgY29tcHJlc3Npb24uIFBhc3RlIHdpbGwgY29udGludWUuJywgZXJyKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0VsZW1lbnRzID0gQXJyYXkuZnJvbShkb2MucXVlcnlTZWxlY3RvckFsbCgnaW1nJykpXHJcbiAgICAgIC5tYXAoaW1nID0+IGltZyBhcyBIVE1MSW1hZ2VFbGVtZW50KVxyXG4gICAgICAuZmlsdGVyKGltZyA9PiB0eXBlb2YgaW1nPy5zcmMgPT09ICdzdHJpbmcnICYmIGltZy5zcmMuc3RhcnRzV2l0aCgnZGF0YTppbWFnZS8nKSk7XHJcblxyXG4gICAgaWYgKGltZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGJlZm9yZVNpemVCeXRlcyA9IDA7XHJcbiAgICBsZXQgYWZ0ZXJTaXplQnl0ZXMgPSAwO1xyXG4gICAgbGV0IGZhaWxlZENvdW50ID0gMDtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgaW1nRWxlbWVudHMubWFwKGFzeW5jIChpbWcsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3JjID0gaW1nLnNyYztcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLmJhc2U2NFRvRmlsZShzcmMsIGBwYXN0ZWQtaW1hZ2UtJHtpbmRleH1gKTtcclxuICAgICAgICAgIGJlZm9yZVNpemVCeXRlcyArPSBmaWxlLnNpemU7XHJcblxyXG4gICAgICAgICAgY29uc3QgY29tcHJlc3NlZCA9IGF3YWl0IHRoaXMuaW1hZ2VDb21wcmVzc2lvbihmaWxlKTtcclxuICAgICAgICAgIGlmICghY29tcHJlc3NlZCkge1xyXG4gICAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFtadGV4dGVkaXRvcl0gSW1hZ2UgY29tcHJlc3Npb24gc2tpcHBlZC9mYWlsZWQgZm9yIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmApO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgY29uc3QgYmFzZTY0ID0gYXdhaXQgdGhpcy5yZWFkRmlsZUFzRGF0YVVSTChjb21wcmVzc2VkKTtcclxuICAgICAgICAgIGFmdGVyU2l6ZUJ5dGVzICs9IGNvbXByZXNzZWQuc2l6ZTtcclxuICAgICAgICAgIGltZy5zcmMgPSBiYXNlNjQ7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICBmYWlsZWRDb3VudCsrO1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIEVycm9yIGNvbXByZXNzaW5nIHBhc3RlZCBpbWFnZSAjJHtpbmRleCArIDF9LmAsIGVycik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICk7XHJcblxyXG4gICAgLy8gSGVscGZ1bCBjb25zb2xlIGxvZ3MgZm9yIHRyb3VibGVzaG9vdGluZy5cclxuICAgIGNvbnN0IGJlZm9yZUtiID0gKGJlZm9yZVNpemVCeXRlcyAvIDEwMjQpLnRvRml4ZWQoMik7XHJcbiAgICBjb25zdCBhZnRlcktiID0gKGFmdGVyU2l6ZUJ5dGVzIC8gMTAyNCkudG9GaXhlZCgyKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYFtadGV4dGVkaXRvcl0gUGFzdGVkIGltYWdlIGNvbXByZXNzaW9uIGNvbXBsZXRlZC4gSW1hZ2VzPSR7aW1nRWxlbWVudHMubGVuZ3RofSwgRmFpbGVkPSR7ZmFpbGVkQ291bnR9LCBCZWZvcmU9JHtiZWZvcmVLYn1LQiwgQWZ0ZXI9JHthZnRlcktifUtCYCxcclxuICAgICk7XHJcblxyXG4gICAgLy8gTW9kaWZ5IHdoYXQgZ2V0cyBwYXN0ZWQsIG5vdCBlZGl0b3IudmFsdWUuXHJcbiAgICBlLmNsZWFuZWRIdG1sID0gZG9jLmJvZHkuaW5uZXJIVE1MO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVG9nZ2xlIGNvbXByZXNzIG1vZGUgdmlhIGNvbmZpcm1hdGlvbiBkaWFsb2cuXHJcbiAgICovXHJcbiAgcHVibGljIG9uT2ZmQ29tcHJlc3NNb2RlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaGVhZGVyID0gJ0NvbmZpcm1hdGlvbic7XHJcbiAgICBjb25zdCBhY3Rpb25UZXh0ID0gdGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ2Rpc2FibGUnIDogJ2VuYWJsZSc7XHJcblxyXG4gICAgLy8gS2VlcCBleGlzdGluZyBiZWhhdmlvcjogdG9nZ2xpbmcgcmVzZXRzIGNvbnRlbnQuXHJcbiAgICBjb25zdCBtZXNzYWdlID1cclxuICAgICAgYERvIHlvdSB3YW50IHRvIDxiPiR7YWN0aW9uVGV4dH08L2I+IGltYWdlIGNvbXByZXNzaW9uIHdoZW4gaW5wdXQgY29udGVudD9gICtcclxuICAgICAgYDxici8+Tm90ZTogQ2xpY2sgXCJZZXNcIiB0aGUgY29udGVudCB3aWxsIGJlIHJlc2V0IHRvIGJsYW5rLmA7XHJcblxyXG4gICAgY29uc3QgYnV0dG9ucyA9IHtcclxuICAgICAgeWVzOiB7IHRleHQ6ICdZZXMnLCBjc3NDbGFzczogJ3ByaW1hcnknIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgIG5vOiB7IHRleHQ6ICdObycsIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZVxyXG4gICAgICAuc2hvdyhoZWFkZXIsIG1lc3NhZ2UsIFtidXR0b25zLnllcywgYnV0dG9ucy5ub10sIFsnY29sLTQnXSlcclxuICAgICAgLnN1YnNjcmliZShyZXBseSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5ICE9PSAnWWVzJykge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XHJcbiAgICAgICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgdG9nZ2xlIGNvbXByZXNzaW9uIG1vZGUuJyk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlZGl0b3IudmFsdWUgPSAnJztcclxuICAgICAgICB0aGlzLmlzQ29tcHJlc3NNb2RlT24gPSAhdGhpcy5pc0NvbXByZXNzTW9kZU9uO1xyXG5cclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KFxyXG4gICAgICAgICAgYCR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gJ0VuYWJsZScgOiAnRGlzYWJsZSd9IGltYWdlIGNvbXByZXNzaW9uIHN1Y2Nlc3NmdWxseS5gLFxyXG4gICAgICAgICAgJ3RvcCcsXHJcbiAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgIDI1MDAsXHJcbiAgICAgICAgICAnc3VjY2VzcycsXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhckljb24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBgay1pLWltYWdlICR7dGhpcy5pc0NvbXByZXNzTW9kZU9uID8gdGhpcy5jb21wcmVzc2lvbkRpc2FibGVkSWNvbiA6IHRoaXMuY29tcHJlc3Npb25FbmFibGVJY29ufWA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGNvbXByZXNzaW9uVG9vbGJhclRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuaXNDb21wcmVzc01vZGVPbiA/ICdEaXNhYmxlJyA6ICdFbmFibGUnfSBpbWFnZSBjb21wcmVzc2lvbmA7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikge1xuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBhcHBseSBsaXN0IGZvcm1hdHRpbmcuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9nZ2xlSGFyZEJyZWFrTGlzdChjb21tYW5kKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVkaXRvci5leGVjKGNvbW1hbmQpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVIYXJkQnJlYWtMaXN0KGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcpOiBib29sZWFuIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbGlzdFJhbmdlID0gdGhpcy5maW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTtcbiAgICBpZiAobGlzdFJhbmdlKSB7XG4gICAgICBpZiAoIXRoaXMuaXNMaXN0Q29tbWFuZEFjdGl2ZShjb21tYW5kKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50SHRtbCA9IHRoaXMuYnVpbGRTZWxlY3RlZExpc3RJdGVtc1BhcmFncmFwaEh0bWwobGlzdFJhbmdlKTtcbiAgICAgIGlmIChyZXBsYWNlbWVudEh0bWwpIHtcbiAgICAgICAgdGhpcy5yZXBsYWNlUmFuZ2VXaXRoSHRtbChsaXN0UmFuZ2UuZnJvbSwgbGlzdFJhbmdlLnRvLCByZXBsYWNlbWVudEh0bWwpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhZ3JhcGhSYW5nZSA9IHRoaXMuZmluZFNlbGVjdGVkSGFyZEJyZWFrUGFyYWdyYXBoUmFuZ2UoKTtcbiAgICBpZiAoIXBhcmFncmFwaFJhbmdlIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhwYXJhZ3JhcGhSYW5nZS5ub2RlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcGxhY2VtZW50SHRtbCA9IHRoaXMuYnVpbGRTZWxlY3RlZFBhcmFncmFwaExpc3RIdG1sKHBhcmFncmFwaFJhbmdlLCBjb21tYW5kKTtcbiAgICBpZiAoIXJlcGxhY2VtZW50SHRtbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVwbGFjZVJhbmdlV2l0aEh0bWwocGFyYWdyYXBoUmFuZ2UuZnJvbSwgcGFyYWdyYXBoUmFuZ2UudG8sIHJlcGxhY2VtZW50SHRtbCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgaXNMaXN0Q29tbWFuZEFjdGl2ZShjb21tYW5kOiAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcgfCAnaW5zZXJ0T3JkZXJlZExpc3QnKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3I/LnZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBjb25zdCBsaXN0Tm9kZU5hbWUgPSBjb21tYW5kID09PSAnaW5zZXJ0T3JkZXJlZExpc3QnID8gJ29yZGVyZWRfbGlzdCcgOiAnYnVsbGV0X2xpc3QnO1xuXG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICBjb25zdCBhY3RpdmVMaXN0ID0gdGhpcy5maW5kQW5jZXN0b3JSYW5nZShbJ2J1bGxldF9saXN0JywgJ29yZGVyZWRfbGlzdCddKTtcbiAgICAgIHJldHVybiBhY3RpdmVMaXN0Py5ub2RlPy50eXBlPy5uYW1lID09PSBsaXN0Tm9kZU5hbWU7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5nZXRTZWxlY3RlZFRleHRCbG9ja0xpc3RUeXBlcygpO1xuICAgIHJldHVybiBzZWxlY3RlZFJvd3MubGVuZ3RoID4gMCAmJiBzZWxlY3RlZFJvd3MuZXZlcnkocm93ID0+IHJvdyA9PT0gbGlzdE5vZGVOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRUZXh0QmxvY2tMaXN0VHlwZXMoKTogQXJyYXk8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLmVkaXRvcj8udmlldztcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB2aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCF2aWV3IHx8ICFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzOiBBcnJheTxzdHJpbmcgfCBudWxsPiA9IFtdO1xuICAgIGNvbnN0IHNlZW5Qb3NpdGlvbnMgPSBuZXcgU2V0PG51bWJlcj4oKTtcblxuICAgIHZpZXcuc3RhdGUuZG9jLmRlc2NlbmRhbnRzKChub2RlOiBhbnksIHBvczogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBub2RlRnJvbSA9IHBvcztcbiAgICAgIGNvbnN0IG5vZGVUbyA9IHBvcyArIG5vZGUubm9kZVNpemU7XG4gICAgICBpZiAoIW5vZGUuaXNUZXh0YmxvY2sgfHwgc2VlblBvc2l0aW9ucy5oYXMocG9zKSB8fCBub2RlVG8gPD0gc2VsZWN0aW9uLmZyb20gfHwgbm9kZUZyb20gPj0gc2VsZWN0aW9uLnRvKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuUG9zaXRpb25zLmFkZChwb3MpO1xuICAgICAgcm93cy5wdXNoKHRoaXMuZmluZFBhcmVudExpc3RUeXBlQXRQb3NpdGlvbihwb3MpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJlbnRMaXN0VHlwZUF0UG9zaXRpb24ocG9zOiBudW1iZXIpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkb2MgPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuZG9jO1xuICAgIGlmICghZG9jKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZXNvbHZlZFBvcyA9IGRvYy5yZXNvbHZlKHBvcyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSByZXNvbHZlZFBvcy5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKSB7XG4gICAgICBjb25zdCBub2RlTmFtZSA9IHJlc29sdmVkUG9zLm5vZGUoZGVwdGgpPy50eXBlPy5uYW1lO1xuICAgICAgaWYgKG5vZGVOYW1lID09PSAnYnVsbGV0X2xpc3QnIHx8IG5vZGVOYW1lID09PSAnb3JkZXJlZF9saXN0Jykge1xuICAgICAgICByZXR1cm4gbm9kZU5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGZpbmRBbmNlc3RvclJhbmdlKG5vZGVOYW1lczogc3RyaW5nW10pOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBkZXB0aCA9IHNlbGVjdGlvbi4kZnJvbS5kZXB0aDsgZGVwdGggPiAwOyBkZXB0aC0tKSB7XG4gICAgICBjb25zdCBub2RlID0gc2VsZWN0aW9uLiRmcm9tLm5vZGUoZGVwdGgpO1xuICAgICAgaWYgKG5vZGVOYW1lcy5pbmNsdWRlcyhub2RlLnR5cGUubmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIGZyb206IHNlbGVjdGlvbi4kZnJvbS5iZWZvcmUoZGVwdGgpLFxuICAgICAgICAgIHRvOiBzZWxlY3Rpb24uJGZyb20uYWZ0ZXIoZGVwdGgpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRMaXN0UmFuZ2UoKTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9IHwgbnVsbCB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuZWRpdG9yPy52aWV3O1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHZpZXc/LnN0YXRlLnNlbGVjdGlvbjtcbiAgICBpZiAoIXZpZXcgfHwgIXNlbGVjdGlvbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYW5jZXN0b3IgPSB0aGlzLmZpbmRBbmNlc3RvclJhbmdlKFsnYnVsbGV0X2xpc3QnLCAnb3JkZXJlZF9saXN0J10pO1xuICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgcmV0dXJuIGFuY2VzdG9yO1xuICAgIH1cblxuICAgIGxldCBzZWxlY3RlZExpc3Q6IHsgbm9kZTogYW55OyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xuICAgIHZpZXcuc3RhdGUuZG9jLm5vZGVzQmV0d2VlbihzZWxlY3Rpb24uZnJvbSwgc2VsZWN0aW9uLnRvLCAobm9kZTogYW55LCBwb3M6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKHNlbGVjdGVkTGlzdCB8fCAhWydidWxsZXRfbGlzdCcsICdvcmRlcmVkX2xpc3QnXS5pbmNsdWRlcyhub2RlLnR5cGU/Lm5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZWxlY3RlZExpc3QgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRMaXN0O1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU2VsZWN0ZWRIYXJkQnJlYWtQYXJhZ3JhcGhSYW5nZSgpOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghdmlldyB8fCAhc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZmluZEFuY2VzdG9yUmFuZ2UoWydwYXJhZ3JhcGgnXSk7XG4gICAgaWYgKGFuY2VzdG9yPy5ub2RlICYmIHRoaXMuaGFzSGFyZEJyZWFrKGFuY2VzdG9yLm5vZGUpKSB7XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuXG4gICAgbGV0IHNlbGVjdGVkUGFyYWdyYXBoOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICB2aWV3LnN0YXRlLmRvYy5ub2Rlc0JldHdlZW4oc2VsZWN0aW9uLmZyb20sIHNlbGVjdGlvbi50bywgKG5vZGU6IGFueSwgcG9zOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChzZWxlY3RlZFBhcmFncmFwaCB8fCBub2RlLnR5cGU/Lm5hbWUgIT09ICdwYXJhZ3JhcGgnIHx8ICF0aGlzLmhhc0hhcmRCcmVhayhub2RlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2VsZWN0ZWRQYXJhZ3JhcGggPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZyb206IHBvcyxcbiAgICAgICAgdG86IHBvcyArIG5vZGUubm9kZVNpemUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRQYXJhZ3JhcGg7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFncmFwaEhhcmRCcmVha0xpbmVzKHBhcmFncmFwaDogYW55KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm5vZGVUb0hhcmRCcmVha1RleHQocGFyYWdyYXBoKVxuICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKVxuICAgICAgLmZpbHRlcihsaW5lID0+ICEhbGluZSk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0ZWRQYXJhZ3JhcGhMaXN0SHRtbChcbiAgICBwYXJhZ3JhcGhSYW5nZTogeyBub2RlOiBhbnk7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9LFxuICAgIGNvbW1hbmQ6ICdpbnNlcnRVbm9yZGVyZWRMaXN0JyB8ICdpbnNlcnRPcmRlcmVkTGlzdCcsXG4gICk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yPy52aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5nZXRQYXJhZ3JhcGhMaW5lUmFuZ2VzKHBhcmFncmFwaFJhbmdlLm5vZGUsIHBhcmFncmFwaFJhbmdlLmZyb20pO1xuICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5maWx0ZXIobGluZSA9PiBsaW5lLnRleHQudHJpbSgpICYmIGxpbmUudG8gPiBzZWxlY3Rpb24uZnJvbSAmJiBsaW5lLmZyb20gPCBzZWxlY3Rpb24udG8pO1xuXG4gICAgaWYgKHNlbGVjdGVkTGluZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJzdFNlbGVjdGVkSW5kZXggPSBsaW5lcy5pbmRleE9mKHNlbGVjdGVkTGluZXNbMF0pO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZEluZGV4ID0gbGluZXMuaW5kZXhPZihzZWxlY3RlZExpbmVzW3NlbGVjdGVkTGluZXMubGVuZ3RoIC0gMV0pO1xuICAgIGNvbnN0IGJlZm9yZUxpbmVzID0gbGluZXMuc2xpY2UoMCwgZmlyc3RTZWxlY3RlZEluZGV4KS5tYXAobGluZSA9PiBsaW5lLnRleHQpO1xuICAgIGNvbnN0IGFmdGVyTGluZXMgPSBsaW5lcy5zbGljZShsYXN0U2VsZWN0ZWRJbmRleCArIDEpLm1hcChsaW5lID0+IGxpbmUudGV4dCk7XG4gICAgY29uc3QgbGlzdFRhZyA9IGNvbW1hbmQgPT09ICdpbnNlcnRPcmRlcmVkTGlzdCcgPyAnb2wnIDogJ3VsJztcbiAgICBjb25zdCBsaXN0SHRtbCA9XG4gICAgICBgPCR7bGlzdFRhZ30+YCArXG4gICAgICBzZWxlY3RlZExpbmVzLm1hcChsaW5lID0+IGA8bGk+JHt0aGlzLmVzY2FwZUh0bWwobGluZS50ZXh0LnRyaW0oKSl9PC9saT5gKS5qb2luKCcnKSArXG4gICAgICBgPC8ke2xpc3RUYWd9PmA7XG5cbiAgICByZXR1cm4gW1xuICAgICAgYmVmb3JlTGluZXMubGVuZ3RoID8gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChiZWZvcmVMaW5lcykgOiAnJyxcbiAgICAgIGxpc3RIdG1sLFxuICAgICAgYWZ0ZXJMaW5lcy5sZW5ndGggPyB0aGlzLmxpbmVzVG9IYXJkQnJlYWtQYXJhZ3JhcGhIdG1sKGFmdGVyTGluZXMpIDogJycsXG4gICAgXS5qb2luKCcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYWdyYXBoTGluZVJhbmdlcyhwYXJhZ3JhcGg6IGFueSwgcGFyYWdyYXBoUG9zOiBudW1iZXIpOiBBcnJheTx7IHRleHQ6IHN0cmluZzsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBsaW5lczogQXJyYXk8eyB0ZXh0OiBzdHJpbmc7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9PiA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0ge1xuICAgICAgdGV4dDogJycsXG4gICAgICBmcm9tOiBwYXJhZ3JhcGhQb3MgKyAxLFxuICAgICAgdG86IHBhcmFncmFwaFBvcyArIDEsXG4gICAgfTtcblxuICAgIHBhcmFncmFwaC5mb3JFYWNoKChjaGlsZDogYW55LCBvZmZzZXQ6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgY2hpbGRGcm9tID0gcGFyYWdyYXBoUG9zICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGNoaWxkVG8gPSBjaGlsZEZyb20gKyBjaGlsZC5ub2RlU2l6ZTtcblxuICAgICAgaWYgKGNoaWxkLnR5cGU/Lm5hbWUgPT09ICdoYXJkX2JyZWFrJykge1xuICAgICAgICBjdXJyZW50LnRvID0gY2hpbGRGcm9tO1xuICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICBjdXJyZW50ID0ge1xuICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgIGZyb206IGNoaWxkVG8sXG4gICAgICAgICAgdG86IGNoaWxkVG8sXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudC50ZXh0ICs9IGNoaWxkLnRleHRDb250ZW50ID8/ICcnO1xuICAgICAgY3VycmVudC50byA9IGNoaWxkVG87XG4gICAgfSk7XG5cbiAgICBsaW5lcy5wdXNoKGN1cnJlbnQpO1xuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZWxlY3RlZExpc3RJdGVtc1BhcmFncmFwaEh0bWwobGlzdFJhbmdlOiB7IG5vZGU6IGFueTsgZnJvbTogbnVtYmVyOyB0bzogbnVtYmVyIH0pOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmVkaXRvcj8udmlldz8uc3RhdGUuc2VsZWN0aW9uO1xuICAgIGlmICghc2VsZWN0aW9uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBsaXN0VGFnID0gbGlzdFJhbmdlLm5vZGUudHlwZT8ubmFtZSA9PT0gJ29yZGVyZWRfbGlzdCcgPyAnb2wnIDogJ3VsJztcbiAgICBjb25zdCBodG1sUGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IHBlbmRpbmdMaXN0SXRlbXM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGhhc1NlbGVjdGVkSXRlbSA9IGZhbHNlO1xuXG4gICAgY29uc3QgZmx1c2hQZW5kaW5nTGlzdEl0ZW1zID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHBlbmRpbmdMaXN0SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaHRtbFBhcnRzLnB1c2goYDwke2xpc3RUYWd9PiR7cGVuZGluZ0xpc3RJdGVtcy5qb2luKCcnKX08LyR7bGlzdFRhZ30+YCk7XG4gICAgICBwZW5kaW5nTGlzdEl0ZW1zID0gW107XG4gICAgfTtcblxuICAgIGxpc3RSYW5nZS5ub2RlLmZvckVhY2goKGxpc3RJdGVtOiBhbnksIG9mZnNldDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBpdGVtRnJvbSA9IGxpc3RSYW5nZS5mcm9tICsgMSArIG9mZnNldDtcbiAgICAgIGNvbnN0IGl0ZW1UbyA9IGl0ZW1Gcm9tICsgbGlzdEl0ZW0ubm9kZVNpemU7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5ub2RlVG9IYXJkQnJlYWtUZXh0KGxpc3RJdGVtKS50cmltKCk7XG5cbiAgICAgIGlmICghdGV4dCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmlzUmFuZ2VTZWxlY3RlZChpdGVtRnJvbSwgaXRlbVRvKSkge1xuICAgICAgICBoYXNTZWxlY3RlZEl0ZW0gPSB0cnVlO1xuICAgICAgICBmbHVzaFBlbmRpbmdMaXN0SXRlbXMoKTtcbiAgICAgICAgaHRtbFBhcnRzLnB1c2godGhpcy5saW5lc1RvRWRpdG9yUGFyYWdyYXBoSHRtbChbdGV4dF0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nTGlzdEl0ZW1zLnB1c2goYDxsaT4ke3RoaXMuZXNjYXBlSHRtbCh0ZXh0KX08L2xpPmApO1xuICAgIH0pO1xuXG4gICAgZmx1c2hQZW5kaW5nTGlzdEl0ZW1zKCk7XG5cbiAgICByZXR1cm4gaGFzU2VsZWN0ZWRJdGVtID8gaHRtbFBhcnRzLmpvaW4oJycpIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSYW5nZVNlbGVjdGVkKGZyb206IG51bWJlciwgdG86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuZWRpdG9yPy52aWV3Py5zdGF0ZS5zZWxlY3Rpb247XG4gICAgaWYgKCFzZWxlY3Rpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoc2VsZWN0aW9uLmVtcHR5KSB7XG4gICAgICByZXR1cm4gc2VsZWN0aW9uLmZyb20gPj0gZnJvbSAmJiBzZWxlY3Rpb24uZnJvbSA8PSB0bztcbiAgICB9XG5cbiAgICByZXR1cm4gdG8gPiBzZWxlY3Rpb24uZnJvbSAmJiBmcm9tIDwgc2VsZWN0aW9uLnRvO1xuICB9XG5cbiAgcHJpdmF0ZSBub2RlVG9IYXJkQnJlYWtUZXh0KG5vZGU6IGFueSk6IHN0cmluZyB7XG4gICAgbGV0IHRleHQgPSAnJztcblxuICAgIG5vZGUuZGVzY2VuZGFudHMoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC50eXBlPy5uYW1lID09PSAnaGFyZF9icmVhaycpIHtcbiAgICAgICAgdGV4dCArPSAnXFxuJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQuaXNUZXh0KSB7XG4gICAgICAgIHRleHQgKz0gY2hpbGQudGV4dCA/PyAnJztcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNIYXJkQnJlYWsobm9kZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGZvdW5kID0gZmFsc2U7XG5cbiAgICBub2RlLmRlc2NlbmRhbnRzKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQudHlwZT8ubmFtZSA9PT0gJ2hhcmRfYnJlYWsnKSB7XG4gICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gIWZvdW5kO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZvdW5kO1xuICB9XG5cbiAgcHJpdmF0ZSBsaW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBgPHA+JHtsaW5lcy5tYXAobGluZSA9PiB0aGlzLmVzY2FwZUh0bWwobGluZSkpLmpvaW4oJzxicj4nKX08L3A+YDtcbiAgfVxuXG4gIHByaXZhdGUgbGluZXNUb1BhcmFncmFwaEh0bWwobGluZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbGluZXNcbiAgICAgIC5tYXAobGluZSA9PiBsaW5lLnRyaW0oKSA/IGA8cD4ke3RoaXMuZXNjYXBlSHRtbChsaW5lKX08L3A+YCA6ICc8cD48YnI+PC9wPicpXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICBwcml2YXRlIGxpbmVzVG9FZGl0b3JQYXJhZ3JhcGhIdG1sKGxpbmVzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXJhZ3JhcGhFbnRlckJlaGF2aW9yKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxpbmVzVG9QYXJhZ3JhcGhIdG1sKGxpbmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5saW5lc1RvSGFyZEJyZWFrUGFyYWdyYXBoSHRtbChsaW5lcyk7XG4gIH1cblxuICBwcml2YXRlIGlzUGFyYWdyYXBoRW50ZXJCZWhhdmlvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5FbnRlcktleUJlaGF2aW9yICE9PSAnbGluZUJyZWFrJztcbiAgfVxuXG4gIHByaXZhdGUgcmVwbGFjZVJhbmdlV2l0aEh0bWwoZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyLCBodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5lZGl0b3I/LnZpZXc7XG4gICAgaWYgKCF2aWV3KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBQcm9zZU1pcnJvckRPTVBhcnNlci5mcm9tU2NoZW1hKHZpZXcuc3RhdGUuc2NoZW1hKS5wYXJzZShjb250YWluZXIpLmNvbnRlbnQ7XG4gICAgdmlldy5kaXNwYXRjaCh2aWV3LnN0YXRlLnRyLnJlcGxhY2VXaXRoKGZyb20sIHRvLCBmcmFnbWVudCkuc2Nyb2xsSW50b1ZpZXcoKSk7XG4gICAgdmlldy5mb2N1cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnRlckFzTGluZUJyZWFrUGx1Z2luKCk6IFBsdWdpbiB7XG4gICAgcmV0dXJuIGtleW1hcCh7XG4gICAgICAnU2hpZnQtRW50ZXInOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCBzcGxpdEJsb2NrKSxcbiAgICAgIEVudGVyOiBjaGFpbkNvbW1hbmRzKGV4aXRDb2RlLCAoc3RhdGUsIGRpc3BhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhcmRCcmVhayA9IHN0YXRlLnNjaGVtYS5ub2Rlcy5oYXJkX2JyZWFrO1xuICAgICAgICBpZiAoIWhhcmRCcmVhayB8fCAhc3RhdGUuc2VsZWN0aW9uLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGRpc3BhdGNoKSB7XHJcbiAgICAgICAgICBkaXNwYXRjaChzdGF0ZS50ci5yZXBsYWNlU2VsZWN0aW9uV2l0aChoYXJkQnJlYWsuY3JlYXRlKCkpLnNjcm9sbEludG9WaWV3KCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBGb2N1cyBlZGl0b3IgaWYgYXZhaWxhYmxlLiBSZXR1cm5zIHRydWUgaWYgZm9jdXMgc3VjY2VlZGVkLiAqL1xyXG4gIHB1YmxpYyBmb2N1cygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmVkaXRvcikge1xyXG4gICAgICB0aGlzLmVkaXRvci5mb2N1cygpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRGb250QXdlc29tZShpY29uTmFtZTogc3RyaW5nLCBmb250QXdlc29tZVNlcnZpY2U6IEZvbnRBd2VTb21lU2VydmljZSk6IHVua25vd24ge1xyXG4gICAgY29uc3QgaWNvbk5hbWVWYWx1ZSA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShpY29uTmFtZSwgdGhpcy5ncm91cCk7XHJcbiAgICBpZiAoaWNvbk5hbWVWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gWkNvbXBvbmVudEhlbHBlci5nZXRGb250QXdlc29tZShpY29uTmFtZVZhbHVlLCBmb250QXdlc29tZVNlcnZpY2UpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGljb25OYW1lO1xyXG4gIH1cclxuXHJcbiAgLyoqIE1lcmdlIEtlbmRvIHBhc3RlIGNsZWFudXAgc2V0dGluZ3MgZnJvbSBQYXN0ZUNsZWFudXBTZXR0aW5ncywgd2l0aCBkYXRhLk9wdGlvbnMga2VwdCBhcyBhIGxlZ2FjeSBmYWxsYmFjay4gKi9cclxuICBwcml2YXRlIHNldHVwUGFzdGVDbGVhbnVwU2V0dGluZ3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5kYXRhPy5QYXN0ZUNsZWFudXBTZXR0aW5ncyA/PyB0aGlzLmRhdGE/Lk9wdGlvbnM7XHJcbiAgICBpZiAoIW9wdGlvbnMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUob3B0aW9ucywgdGhpcy5ncm91cCk7XHJcbiAgICAgIGlmIChyZXNvbHZlZCAmJiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBhc3RlQ2xlYW51cFNldHRpbmdzLCByZXNvbHZlZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFBhc3RlIGNsZWFudXAgc2V0dGluZ3MgcmVzb2x2ZWQgdmFsdWUgaXMgbm90IGFuIG9iamVjdC4gU2V0dGluZ3MgdW5jaGFuZ2VkLicsIHtcclxuICAgICAgICAgIHJlc29sdmVkLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5wYXN0ZUNsZWFudXBTZXR0aW5ncywgb3B0aW9ucyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5zdXBwb3J0ZWQgcGFzdGUgY2xlYW51cCBzZXR0aW5ncyB0eXBlLiBTZXR0aW5ncyB1bmNoYW5nZWQuJywge1xyXG4gICAgICB0eXBlOiB0eXBlb2Ygb3B0aW9ucyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlc29sdmUgb3B0aW9uYWwgcGFzdGUgc3ltYm9sIG5vcm1hbGl6YXRpb24gc2V0dGluZ3MgZnJvbSBmaWVsZCBjb25maWcuICovXHJcbiAgcHJpdmF0ZSBzZXR1cFN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5kYXRhPy5TeW1ib2xOb3JtYWxpemF0aW9uO1xyXG4gICAgaWYgKHNldHRpbmdzID09PSB1bmRlZmluZWQgfHwgc2V0dGluZ3MgPT09IG51bGwpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2Ygc2V0dGluZ3MgPT09ICdib29sZWFuJykge1xyXG4gICAgICB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5FbmFibGVkID0gc2V0dGluZ3M7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnc3RyaW5nJykge1xyXG4gICAgICBjb25zdCByZXNvbHZlZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShzZXR0aW5ncywgdGhpcy5ncm91cCk7XHJcbiAgICAgIHRoaXMubWVyZ2VTeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MocmVzb2x2ZWQpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZXJnZVN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncyhzZXR0aW5ncyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlU3ltYm9sTm9ybWFsaXphdGlvblNldHRpbmdzKHNldHRpbmdzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZW9mIHNldHRpbmdzID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuRW5hYmxlZCA9IHNldHRpbmdzO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFzZXR0aW5ncyB8fCB0eXBlb2Ygc2V0dGluZ3MgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoc2V0dGluZ3MpKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBTeW1ib2xOb3JtYWxpemF0aW9uIHJlc29sdmVkIHZhbHVlIGlzIG5vdCBhIHN1cHBvcnRlZCBjb25maWcuIFNldHRpbmdzIHVuY2hhbmdlZC4nLCB7XHJcbiAgICAgICAgc2V0dGluZ3MsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncywgc2V0dGluZ3MpO1xyXG4gICAgdGhpcy5zeW1ib2xOb3JtYWxpemF0aW9uU2V0dGluZ3MuQ3VzdG9tUmVwbGFjZW1lbnRzID1cclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHMpXHJcbiAgICAgICAgPyB0aGlzLnN5bWJvbE5vcm1hbGl6YXRpb25TZXR0aW5ncy5DdXN0b21SZXBsYWNlbWVudHNcclxuICAgICAgICA6IFtdO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBDdXN0b20gSW1hZ2UgVXBsb2FkIC8gRW5sYXJnZVxyXG5cclxuICAvKiogVHJpZ2dlciBoaWRkZW4gZmlsZSBpbnB1dCBjbGljayBmb3IgaW1hZ2UgdXBsb2FkLiAqL1xyXG4gIHB1YmxpYyBvcGVuRmlsZUV4cGxvcmVyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBgJHt0aGlzLmRhdGEuVmFsdWV9LXVwbG9hZC1maWxlYDtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAgIGlmICghaW5wdXQpIHtcclxuICAgICAgY29uc29sZS53YXJuKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbnB1dCBlbGVtZW50IG5vdCBmb3VuZCAoaWQ9XCIke2lkfVwiKS5gKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlucHV0LmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbiBhbiBlbmxhcmdlZCBwb3B1cCBlZGl0b3IuICovXHJcbiAgcHVibGljIG9wZW5Qb3B1cCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xyXG4gICAgaWYgKCFlZGl0b3IpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEVkaXRvciBpcyBub3QgcmVhZHkuIENhbm5vdCBvcGVuIHBvcHVwLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT3BlbiBkaWFsb2dcclxuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICBjb250ZW50OiBadGV4dGVkaXRvckNvbXBvbmVudCxcclxuICAgICAgd2lkdGg6ICc5OCUnLFxyXG4gICAgICBoZWlnaHQ6ICc5NyUnLFxyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgcG9wdXBDb21wb25lbnQgPSB0aGlzLmRpYWxvZ1JlZi5jb250ZW50Lmluc3RhbmNlIGFzIFp0ZXh0ZWRpdG9yQ29tcG9uZW50O1xyXG4gICAgcG9wdXBDb21wb25lbnQuZGF0YSA9IHRoaXMuZGF0YTtcclxuICAgIHBvcHVwQ29tcG9uZW50LmRhdGEuQWxsb3dFbmxhcmdlID0gZmFsc2U7XHJcbiAgICBwb3B1cENvbXBvbmVudC5kaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZjtcclxuICAgIHBvcHVwQ29tcG9uZW50LkNsb3NlRW5sYXJnZUJ0biA9IHRydWU7XHJcbiAgICBwb3B1cENvbXBvbmVudC5jb21wb25lbnRQcm9wZXJ0aWVzID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzO1xyXG5cclxuICAgIC8vIFByZXNlcnZlIHN0eWxlIHNvIHdlIGNhbiByZXN0b3JlIGl0IG9uIGNsb3NlLlxyXG4gICAgdGhpcy5vcmlnaW5hbElubGluZVN0eWxlID0gdGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZT8uc3R5bGUxID8/ICcnO1xyXG4gICAgaWYgKHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXM/LnN0eWxlKSB7XHJcbiAgICAgIHBvcHVwQ29tcG9uZW50LmNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUxID1cclxuICAgICAgICAocG9wdXBDb21wb25lbnQuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPz8gJycpICtcclxuICAgICAgICBgaGVpZ2h0OiR7KHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCkudG9TdHJpbmcoKX1weGA7XHJcbiAgICB9XHJcblxyXG4gICAgcG9wdXBDb21wb25lbnQuZ3JvdXAgPSB0aGlzLmdyb3VwO1xyXG4gICAgcG9wdXBDb21wb25lbnQuY29tcG9uZW50U2V0dGluZ3MgPSB0aGlzLmNvbXBvbmVudFNldHRpbmdzO1xyXG4gICAgcG9wdXBDb21wb25lbnQuZm9ybSA9IHRoaXMuZm9ybTtcclxuXHJcbiAgICAvLyBSZXN0b3JlIHN0YXRlIGFuZCBwdXNoIHZhbHVlIGJhY2sgaW50byBlZGl0b3Igb24gY2xvc2UuXHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5yZXN1bHQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5kYXRhLkFsbG93RW5sYXJnZSA9IHRydWU7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb21wb25lbnRQcm9wZXJ0aWVzPy5zdHlsZSkge1xyXG4gICAgICAgIHRoaXMuY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTEgPSB0aGlzLm9yaWdpbmFsSW5saW5lU3R5bGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIFB1bGwgY3VycmVudCB6TW9kZWwgaW50byBlZGl0b3IgYW5kIHRyaWdnZXIgb25DaGFuZ2UgKGV4aXN0aW5nIGJlaGF2aW9yKS5cclxuICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmdyb3VwPy56TW9kZWw/Llt0aGlzLmRhdGEuVmFsdWVdO1xyXG4gICAgICBlZGl0b3IudmFsdWUgPSBuZXdWYWx1ZTtcclxuICAgICAgdGhpcy5vbkNoYW5nZShuZXdWYWx1ZSk7XHJcbiAgICAgIHRoaXMuZm9jdXMoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIENsb3NlIHRoZSBwb3B1cCBlZGl0b3IgaWYgb3Blbi4gKi9cclxuICBwdWJsaWMgb25Qb3B1cENsb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpYWxvZ1JlZikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIDxpbnB1dCB0eXBlPVwiZmlsZVwiPiBjaGFuZ2UgYW5kIGluc2VydCBzZWxlY3RlZCBpbWFnZSBpbnRvIGVkaXRvci5cclxuICAgKiBOT1RFOiBQcmVmZXIgdHlwaW5nIGZpbGVJbnB1dCBhcyBFdmVudCBmb3IgYmV0dGVyIHNhZmV0eS5cclxuICAgKi9cclxuICBwdWJsaWMgdXBsb2FkSW1hZ2UoZmlsZUlucHV0OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBmaWxlSW5wdXQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcclxuICAgIGNvbnN0IGZpbGUgPSBpbnB1dD8uZmlsZXM/LlswXTtcclxuXHJcbiAgICBpZiAoIWZpbGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIE5vIGltYWdlIHNlbGVjdGVkIGZvciB1cGxvYWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB2b2lkIHRoaXMuaW5zZXJ0SW1hZ2VJbnRvRWRpdG9yKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEluc2VydCBpbWFnZSBpbnRvIGVkaXRvciwgb3B0aW9uYWxseSBjb21wcmVzc2luZyBmaXJzdC4gKi9cclxuICBwcml2YXRlIGFzeW5jIGluc2VydEltYWdlSW50b0VkaXRvcihmaWxlOiBGaWxlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcclxuICAgIGlmICghZWRpdG9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBFZGl0b3IgaXMgbm90IHJlYWR5LiBDYW5ub3QgaW5zZXJ0IGltYWdlLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHdvcmtpbmdGaWxlOiBGaWxlIHwgbnVsbCA9IGZpbGU7XHJcblxyXG4gICAgY29uc3QgY29tcHJlc3Npb25Db25maWcgPSB0aGlzLmRhdGE/LkNvbXByZXNzaW9uIGFzIEltYWdlQ29tcHJlc3Npb25Db25maWcgfCB1bmRlZmluZWQ7XHJcbiAgICBjb25zdCBjb21wcmVzc2lvbkVuYWJsZWQgPSAhIWNvbXByZXNzaW9uQ29uZmlnO1xyXG5cclxuICAgIGlmIChjb21wcmVzc2lvbkVuYWJsZWQpIHtcclxuICAgICAgY29uc29sZS5sb2coYFtadGV4dGVkaXRvcl0gVXBsb2FkIGltYWdlIGJlZm9yZSBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuXHJcbiAgICAgIHdvcmtpbmdGaWxlID0gYXdhaXQgdGhpcy5pbWFnZUNvbXByZXNzaW9uKHdvcmtpbmdGaWxlKTtcclxuICAgICAgaWYgKCF3b3JraW5nRmlsZSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBJbWFnZSBjb21wcmVzc2lvbiBmYWlsZWQuIFVwbG9hZCBpbWFnZSBpbnNlcnRpb24gYWJvcnRlZC4nKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKGBbWnRleHRlZGl0b3JdIFVwbG9hZCBpbWFnZSBhZnRlciBjb21wcmVzc2lvbjogJHsod29ya2luZ0ZpbGUuc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9S0JgKTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnJlYWRGaWxlQXNEYXRhVVJMKHdvcmtpbmdGaWxlKTtcclxuICAgICAgZWRpdG9yLmV4ZWMoJ2luc2VydEltYWdlJywgeyBzcmM6IGJhc2U2NCB9KTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gRmFpbGVkIHRvIHJlYWQgdXBsb2FkZWQgaW1hZ2UgYXMgYmFzZTY0LicsIGVycik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ29udmVydCBiYXNlNjQgKGRhdGEgVVJMKSB0byBGaWxlLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYmFzZTY0VG9GaWxlKGJhc2U2NFN0cmluZzogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaWxlPiB7XHJcbiAgICAvLyBVc2luZyBmZXRjaCBvbiBkYXRhIFVSTCBpcyBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzOyBrZWVwIGV4aXN0aW5nIGxvZ2ljLlxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChiYXNlNjRTdHJpbmcpO1xyXG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHJlc3BvbnNlLmJsb2IoKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge1xyXG4gICAgICB0eXBlOiBibG9iLnR5cGUsXHJcbiAgICAgIGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29tcHJlc3MgYW4gaW1hZ2UgZmlsZSBpZiBpdCBpcyBhbiBpbWFnZSBhbmQgYWJvdmUgbWluIHRocmVzaG9sZC5cclxuICAgKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBmaWxlIHdoZW4gY29tcHJlc3Npb24gaXMgc2tpcHBlZCwgYW5kIG51bGwgb25seSB3aGVuIGNvbXByZXNzaW9uIGZhaWxzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgaW1hZ2VDb21wcmVzc2lvbihmaWxlOiBGaWxlKTogUHJvbWlzZTxGaWxlIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBpbWFnZUNvbXByZXNzaW9uIGNhbGxlZCB3aXRoIGVtcHR5IGZpbGUuJyk7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghZmlsZS50eXBlIHx8ICFmaWxlLnR5cGUuaW5jbHVkZXMoJ2ltYWdlJykpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIGlzIG5vdCBhbiBpbWFnZS4nLCB7IHR5cGU6IGZpbGUudHlwZSB9KTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5kYXRhPy5Db21wcmVzc2lvbiBhcyBJbWFnZUNvbXByZXNzaW9uQ29uZmlnIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKCFjb25maWcpIHtcclxuICAgICAgLy8gQ29tcHJlc3Npb24gbm90IGNvbmZpZ3VyZWQ7IGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGltZ0NvbmZpZyA9IHRoaXMuY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGNvbmZpZyk7XHJcblxyXG4gICAgLy8gSWYgZmlsZSBpcyBiZWxvdyB0aHJlc2hvbGQsIGtlZXAgdGhlIG9yaWdpbmFsIGZpbGUuXHJcbiAgICBpZiAoZmlsZS5zaXplIDw9IGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemVCeXRlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBbWnRleHRlZGl0b3JdIFNraXBwaW5nIGNvbXByZXNzaW9uOiBmaWxlIHNpemUgJHsoZmlsZS5zaXplIC8gMTAyNCkudG9GaXhlZCgyKX1LQiBpcyBiZWxvdyB0aHJlc2hvbGQgJHsoaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgLyAxMDI0KS50b0ZpeGVkKDIpfUtCLmAsXHJcbiAgICAgICk7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWQkID0gdGhpcy5jb21wcmVzc0ltYWdlLmNvbXByZXNzKGZpbGUsIGltZ0NvbmZpZyk7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY29tcHJlc3NlZCQpO1xyXG4gICAgICByZXR1cm4gY29tcHJlc3NlZEZpbGUgPz8gbnVsbDtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gQ29tcHJlc3Npb24gc2VydmljZSB0aHJldyBhbiBlcnJvci4nLCBlcnIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBOb3JtYWxpemUgaW1hZ2UgY29tcHJlc3Npb24gY29uZmlnIGludG8gYnl0ZS1iYXNlZCB0aHJlc2hvbGRzLiAqL1xyXG4gIHByaXZhdGUgY29tcHJlc3Npb25Db25maWdIYW5kbGVyKGltZ0NvbmZpZzogSW1hZ2VDb21wcmVzc2lvbkNvbmZpZyk6IEltYWdlQ29tcHJlc3Npb25Db25maWcge1xyXG4gICAgaWYgKCFpbWdDb25maWcpIHtcclxuICAgICAgLy8gRGVmZW5zaXZlOiBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2UgY2FsbGVyIGNoZWNrcy5cclxuICAgICAgcmV0dXJuIGltZ0NvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSkge1xyXG4gICAgICBpbWdDb25maWcuRmlsZVNpemVNYXhTaXplQnl0ZSA9IHRoaXMuY29udmVydFNpemVUb0J5dGUoaW1nQ29uZmlnLkZpbGVTaXplTWF4U2l6ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSB0aGlzLmNvbnZlcnRTaXplVG9CeXRlKGltZ0NvbmZpZy5GaWxlU2l6ZU1pblNpemUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaW1nQ29uZmlnLkZpbGVTaXplTWluU2l6ZUJ5dGUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbWdDb25maWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIGxpa2UgXCIxMDBrYlwiLCBcIjEgTUJcIiwgXCIyZ2JcIiB0byBieXRlcy5cclxuICAgKiBJZiBubyB1bml0IGlzIHByb3ZpZGVkLCBieXRlcyBhcmUgYXNzdW1lZC5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRTaXplVG9CeXRlKHNpemVTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XHJcbiAgICBpZiAoIXNpemVTdHJpbmcgfHwgdHlwZW9mIHNpemVTdHJpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybignW1p0ZXh0ZWRpdG9yXSBjb252ZXJ0U2l6ZVRvQnl0ZSByZWNlaXZlZCBpbnZhbGlkIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJlbW92ZSBhbGwgc3BhY2VzLCBlLmcuIFwiMSBNQlwiIC0+IFwiMU1CXCJcclxuICAgIGNvbnN0IHRyaW1tZWQgPSBzaXplU3RyaW5nLnJlcGxhY2UoLyAvZywgJycpLnRyaW0oKTtcclxuICAgIGlmICghdHJpbW1lZCkge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFeHRyYWN0IG51bWVyaWMgcGFydCBhbmQgdW5pdCBwYXJ0IChsZXR0ZXJzKS5cclxuICAgIC8vIEV4YW1wbGU6IFwiMS41TUJcIiA9PiBudW1iZXI9MS41LCB1bml0PVwibWJcIlxyXG4gICAgY29uc3QgbWF0Y2ggPSAvXihbMC05XSpcXC4/WzAtOV0rKShbYS16QS1aXSopJC8uZXhlYyh0cmltbWVkKTtcclxuICAgIGlmICghbWF0Y2gpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIFVuYWJsZSB0byBwYXJzZSBzaXplU3RyaW5nLiBEZWZhdWx0aW5nIHRvIDAuJywgeyBzaXplU3RyaW5nIH0pO1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBudW1lcmljID0gTnVtYmVyKG1hdGNoWzFdKTtcclxuICAgIGNvbnN0IHVuaXQgPSAobWF0Y2hbMl0gfHwgJ2InKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIGlmIChOdW1iZXIuaXNOYU4obnVtZXJpYykgfHwgbnVtZXJpYyA8IDApIHtcclxuICAgICAgY29uc29sZS53YXJuKCdbWnRleHRlZGl0b3JdIEludmFsaWQgbnVtZXJpYyBzaXplIGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gMC4nLCB7IHNpemVTdHJpbmcgfSk7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaCAodW5pdCkge1xyXG4gICAgICBjYXNlICdiJzpcclxuICAgICAgY2FzZSAnJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYztcclxuICAgICAgY2FzZSAna2InOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNDtcclxuICAgICAgY2FzZSAnbWInOlxyXG4gICAgICAgIHJldHVybiBudW1lcmljICogMTAyNCAqIDEwMjQ7XHJcbiAgICAgIGNhc2UgJ2diJzpcclxuICAgICAgICByZXR1cm4gbnVtZXJpYyAqIDEwMjQgKiAxMDI0ICogMTAyNDtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tadGV4dGVkaXRvcl0gVW5rbm93biB1bml0IGluIHNpemVTdHJpbmcuIERlZmF1bHRpbmcgdG8gYnl0ZXMuJywgeyBzaXplU3RyaW5nLCB1bml0IH0pO1xyXG4gICAgICAgIHJldHVybiBudW1lcmljO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlYWQgYSBGaWxlIGFzIGJhc2U2NCBkYXRhIFVSTC4gKi9cclxuICBwcml2YXRlIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgaWYgKCFmaWxlKSB7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignRmlsZSBpcyByZXF1aXJlZC4nKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuXHJcbiAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSAoZXJyb3IpID0+IHJlamVjdChlcnJvcik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vICNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuXHJcbjxkaXYgW2Zvcm1Hcm91cF09XCJmb3JtXCIgY2xhc3M9XCJ6dGV4dGVkaXRvci1jb250YWluZXIgZTF0YWctc3R5bGVcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZVwiIFtuZ0NsYXNzXT1cImRhdGEuQ2xhc3NcIj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLWxnLTEyIGV4cGFuZC1idG4tY29udGFpbmVyXCI+XHJcbiAgPGlvbi1idXR0b24gICBjbGFzcz1cImlvbi1hY3RpdmF0YWJsZSByaXBwbGUtcGFyZW50XCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGU0XCIgKm5nSWY9XCJkYXRhLkFsbG93RW5sYXJnZVwiIChjbGljayk9XCJvcGVuUG9wdXAoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgW2ljb25dPVwiZ2V0Rm9udEF3ZXNvbWUoJ2ZhRXhwYW5kQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbiAgPGlvbi1idXR0b24gIGNsYXNzPVwiaW9uLWFjdGl2YXRhYmxlIHJpcHBsZS1wYXJlbnRcIiBbc3R5bGVdPVwiY29tcG9uZW50UHJvcGVydGllcy5zdHlsZS5zdHlsZTRcIiAqbmdJZj1cIkNsb3NlRW5sYXJnZUJ0blwiIChjbGljayk9XCJvblBvcHVwQ2xvc2UoKVwiICBbaWRdPVwiZGF0YS5WYWx1ZSArJy1wb3B1cC1idXR0b24nXCI+XHJcbiAgICA8ZmEtaWNvbiBjbGFzcz1cImJ0bi1pY29uXCIgIFtpY29uXT1cImdldEZvbnRBd2Vzb21lKCdmYUNvbXByZXNzQWx0JywgZm9udEF3ZVNvbWVTZXJ2aWNlKVwiPjwvZmEtaWNvbj5cclxuICA8L2lvbi1idXR0b24+XHJcbjwvZGl2PlxyXG4gIDxrZW5kby1lZGl0b3IgI2VkaXRvclxyXG4gICAgICAgICAgICAgICAgW2lkXT1cImRhdGEuVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkYXRhLlZhbHVlXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZTF0YWctc3R5bGUxXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZV09XCJjb21wb25lbnRQcm9wZXJ0aWVzLnN0eWxlLnN0eWxlMVwiXHJcbiAgICAgICAgICAgICAgICBbcmVhZG9ubHldPVwiKCEhY29tcG9uZW50UHJvcGVydGllcy5pc1JlYWRPbmx5RmllbGQgPyBncm91cFtjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHlGaWVsZF0gOiBjb21wb25lbnRQcm9wZXJ0aWVzLmlzUmVhZE9ubHkpXCJcclxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtyZXNpemFibGVdPVwiZGF0YS5SZXNpemFibGUgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BsdWdpbnNdPVwicGx1Z2luc0NhbGxiYWNrXCJcclxuICAgICAgICAgICAgICAgIFtwYXN0ZUNsZWFudXBTZXR0aW5nc109XCJwYXN0ZUNsZWFudXBTZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAocGFzdGUpPVwib25QYXN0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIFtpZnJhbWVdPVwiY29tcG9uZW50U2V0dGluZ3MuaWZyYW1lXCI+XHJcbiAgICA8a2VuZG8tdG9vbGJhciAqbmdJZj1cImRhdGEuVG9vbEJhclN0eWxlID09PSAnYmFzaWMnXCIgY2xhc3M9XCJlMXRhZy1zdHlsZTJcIlxyXG4gICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3I+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgW3NlbGVjdGVkXT1cImlzTGlzdENvbW1hbmRBY3RpdmUoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIFtzZWxlY3RlZF09XCJpc0xpc3RDb21tYW5kQWN0aXZlKCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbnNlcnRGaWxlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdkZWZhdWx0J1wiIGtlbmRvRWRpdG9ySW5zZXJ0SW1hZ2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uICpuZ0lmPVwiZGF0YS5Ub29sQmFyVXBsb2FkSW1hZ2VNZXRob2QgPT0gJ2V4cGxvcmVyJ1wiIGljb249XCJrLWktaW1hZ2Ugay1pLXBob3RvXCIgKGNsaWNrKT1cIm9wZW5GaWxlRXhwbG9yZXIoKVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cIiEhZGF0YS5Db21wcmVzc2lvblwiIFtpY29uXT1cImNvbXByZXNzaW9uVG9vbGJhckljb25cIiAoY2xpY2spPVwib25PZmZDb21wcmVzc01vZGUoKVwiIFt0aXRsZV09XCJjb21wcmVzc2lvblRvb2xiYXJUaXRsZVwiPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclZpZXdTb3VyY2VCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgIDwva2VuZG8tdG9vbGJhcj5cclxuICAgIDxrZW5kby10b29sYmFyICpuZ0lmPVwiZGF0YS5Ub29sQmFyU3R5bGUgPT09ICdmdWxsJ1wiIGNsYXNzPVwiZTF0YWctc3R5bGUyXCIgW3N0eWxlXT1cImNvbXBvbmVudFByb3BlcnRpZXMuc3R5bGUuc3R5bGUyXCI+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZG9CdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JSZWRvQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQm9sZEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckl0YWxpY0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVuZGVybGluZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclN0cmlrZXRocm91Z2hCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdWJzY3JpcHRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JTdXBlcnNjcmlwdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduTGVmdEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduQ2VudGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQWxpZ25SaWdodEJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFsaWduSnVzdGlmeUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWRyb3Bkb3dubGlzdCBrZW5kb0VkaXRvckZvcm1hdD48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250U2l6ZT48L2tlbmRvLXRvb2xiYXItZHJvcGRvd25saXN0PlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Qga2VuZG9FZGl0b3JGb250RmFtaWx5Pjwva2VuZG8tdG9vbGJhci1kcm9wZG93bmxpc3Q+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWNvbG9ycGlja2VyIGtlbmRvRWRpdG9yRm9yZUNvbG9yIHZpZXc9XCJncmFkaWVudFwiPjwva2VuZG8tdG9vbGJhci1jb2xvcnBpY2tlcj5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItY29sb3JwaWNrZXIga2VuZG9FZGl0b3JCYWNrQ29sb3Igdmlldz1cImdyYWRpZW50XCI+PC9rZW5kby10b29sYmFyLWNvbG9ycGlja2VyPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3QtdW5vcmRlcmVkXCIgW3NlbGVjdGVkXT1cImlzTGlzdENvbW1hbmRBY3RpdmUoJ2luc2VydFVub3JkZXJlZExpc3QnKVwiIChtb3VzZWRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAocG9pbnRlcmRvd24pPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAoY2xpY2spPVwiYXBwbHlMaXN0KCdpbnNlcnRVbm9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gaWNvbj1cImxpc3Qtb3JkZXJlZFwiIFtzZWxlY3RlZF09XCJpc0xpc3RDb21tYW5kQWN0aXZlKCdpbnNlcnRPcmRlcmVkTGlzdCcpXCIgKG1vdXNlZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChwb2ludGVyZG93bik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIChjbGljayk9XCJhcHBseUxpc3QoJ2luc2VydE9yZGVyZWRMaXN0JylcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JJbmRlbnRCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JPdXRkZW50QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yQ3JlYXRlTGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvclVubGlua0J1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8L2tlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgIDxrZW5kby1lZGl0b3ItaW5zZXJ0LXRhYmxlLWJ1dHRvbj48L2tlbmRvLWVkaXRvci1pbnNlcnQtdGFibGUtYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5CZWZvcmVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JBZGRDb2x1bW5BZnRlckJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0JlZm9yZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiBrZW5kb0VkaXRvckFkZFJvd0FmdGVyQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uZ3JvdXA+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlQ29sdW1uQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlUm93QnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yRGVsZXRlVGFibGVCdXR0b24+PC9rZW5kby10b29sYmFyLWJ1dHRvbj5cclxuICAgICAgPC9rZW5kby10b29sYmFyLWJ1dHRvbmdyb3VwPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JNZXJnZUNlbGxzQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9yU3BsaXRDZWxsQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDwva2VuZG8tdG9vbGJhci1idXR0b25ncm91cD5cclxuICAgICAgPGtlbmRvLXRvb2xiYXItYnV0dG9uIGtlbmRvRWRpdG9ySW5zZXJ0RmlsZUJ1dHRvbj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCJkYXRhLlRvb2xCYXJVcGxvYWRJbWFnZU1ldGhvZCA9PSAnZGVmYXVsdCdcIiBrZW5kb0VkaXRvckluc2VydEltYWdlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICAgIDxrZW5kby10b29sYmFyLWJ1dHRvbiAqbmdJZj1cImRhdGEuVG9vbEJhclVwbG9hZEltYWdlTWV0aG9kID09ICdleHBsb3JlcidcIiBpY29uPVwiay1pLWltYWdlIGstaS1waG90b1wiIChjbGljayk9XCJvcGVuRmlsZUV4cGxvcmVyKClcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24gKm5nSWY9XCIhIWRhdGEuQ29tcHJlc3Npb25cIiBbaWNvbl09XCJjb21wcmVzc2lvblRvb2xiYXJJY29uXCIgKGNsaWNrKT1cIm9uT2ZmQ29tcHJlc3NNb2RlKClcIiBbdGl0bGVdPVwiY29tcHJlc3Npb25Ub29sYmFyVGl0bGVcIj48L2tlbmRvLXRvb2xiYXItYnV0dG9uPlxyXG4gICAgICA8a2VuZG8tdG9vbGJhci1idXR0b24ga2VuZG9FZGl0b3JWaWV3U291cmNlQnV0dG9uPjwva2VuZG8tdG9vbGJhci1idXR0b24+XHJcbiAgICA8L2tlbmRvLXRvb2xiYXI+XHJcbiAgPC9rZW5kby1lZGl0b3I+XHJcbiAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTpub25lO1wiIHR5cGU9XCJmaWxlXCIgW2lkXT1cImRhdGEuVmFsdWUgKyctdXBsb2FkLWZpbGUnXCIgW25hbWVdPVwiZGF0YS5WYWx1ZSArJy11cGxvYWQtZmlsZSdcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgbmdmLW1heC1zaXplPVwiNU1CXCIgKGNoYW5nZSk9XCJ1cGxvYWRJbWFnZSgkZXZlbnQpXCI+XHJcbjwvZGl2PlxyXG4iXX0=