@libs-ui/components-inputs-quill 0.2.336-1 → 0.2.338-0

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.
@@ -14,9 +14,8 @@ import { LibsUiComponentsScrollOverlayDirective } from '@libs-ui/components-scro
14
14
  import { LibsUiComponentsSkeletonComponent } from '@libs-ui/components-skeleton';
15
15
  import { LibsUiDynamicComponentService } from '@libs-ui/services-dynamic-component';
16
16
  import { LibsUiNotificationService } from '@libs-ui/services-notification';
17
- import { ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_LENGTH, ERROR_MESSAGE_MIN_LENGTH, get, getLabelBySizeFile, isNil, patternUrl, set, UtilsKeyCodeConstant, xssFilter } from '@libs-ui/utils';
17
+ import { isNearWhite, ERROR_MESSAGE_EMPTY_VALID, ERROR_MESSAGE_MAX_LENGTH, ERROR_MESSAGE_MIN_LENGTH, get, getLabelBySizeFile, isNil, patternUrl, patterProtocolUrl, set, UtilsKeyCodeConstant, xssFilter } from '@libs-ui/utils';
18
18
  import { TranslateModule, TranslateService } from '@ngx-translate/core';
19
- import Quill from 'quill';
20
19
  import Quill2x, { Delta } from 'quill2x';
21
20
  import { fromEvent, lastValueFrom, timer } from 'rxjs';
22
21
  import { LibsUiComponentsInputsQuillLinkComponent } from './link/link.component';
@@ -27,6 +26,7 @@ import * as i0 from "@angular/core";
27
26
  import * as i1 from "@ngx-translate/core";
28
27
  export class LibsUiComponentsInputsQuill2xComponent {
29
28
  //region Private
29
+ isPaste = signal(false);
30
30
  quill;
31
31
  addEditLinkComponentRef = signal(undefined);
32
32
  uploadImageComponentRef = signal(undefined);
@@ -46,7 +46,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
46
46
  //region Protected
47
47
  borderColor = computed(() => (this.messageError() && this.showErrorBorder() ? ' !border-[var(--libs-ui-color-border-error,#ee2d41)] ' : '!border-[#e5e7eb] '));
48
48
  containerClass = computed(() => `quill-container flex flex-col h-full w-full ${get(this.quillCustomConfig(), 'classContainer') || ''}`);
49
- containerToolbarClass = computed(() => `border-t border-l border-r ${this.borderColor()}rounded-t-[4px] ${this.readonly() ? ' libs-ui-readonly-background cursor-default pointer-events-none ' : ' '} ${get(this.quillCustomConfig(), 'toolbar.classCustomContainerToolbar') || ''} ${get(this.quillCustomConfig(), 'toolbar.positionFixed') ? ' fixed ' : ' '}`);
49
+ containerToolbarClass = computed(() => `border-t border-l border-r ${this.ignoreShowBorderErrorToolbar() ? '!border-[#e5e7eb] ' : this.borderColor()}rounded-t-[4px] ${this.readonly() ? ' libs-ui-readonly-background cursor-default pointer-events-none ' : ' '} ${get(this.quillCustomConfig(), 'toolbar.classCustomContainerToolbar') || ''} ${get(this.quillCustomConfig(), 'toolbar.positionFixed') ? ' fixed ' : ' '}`);
50
50
  containerEditorClass = computed(() => `h-full !border ${this.borderColor()} !rounded-b-[4px] ${this.readonly() ? ' libs-ui-readonly-background ' : ' '} ${get(this.quillCustomConfig(), 'editor.classCustomContainerEditor') || ''} ${get(this.quillCustomConfig(), 'toolbar.positionFixed') ? ' rounded-t-[4px] ' : ' '}`);
51
51
  showButtonMoreToolbar = computed(() => this.toolbarOptionsConfig().some((item) => item.display === false));
52
52
  displaySkeletonToolbar = computed(() => this.toolbarOptionsConfig().every((item) => item.display === undefined));
@@ -61,6 +61,8 @@ export class LibsUiComponentsInputsQuill2xComponent {
61
61
  iconAlignSelectedComputed = computed(() => get(this.alignSelected(), 'item.icon'));
62
62
  colorSelected = signal(undefined);
63
63
  backgroundSelected = signal(undefined);
64
+ listCheckboxSelected = signal(false);
65
+ adjustSelected = signal(undefined);
64
66
  messageError = signal('');
65
67
  fontSize = signal({ value: 14 });
66
68
  link = signal(linkDefault());
@@ -86,6 +88,9 @@ export class LibsUiComponentsInputsQuill2xComponent {
86
88
  resizeImagePlugin = input();
87
89
  fontSizeDefault = input(14, { transform: (value) => value ?? 14 });
88
90
  heightEditorContentDefault = input();
91
+ minHeightEditorContentDefault = input();
92
+ maxHeightEditorContentDefault = input();
93
+ removeNearWhiteColorsOnPaste = input(true);
89
94
  resize = input('none', { transform: (value) => value ?? 'none' });
90
95
  autoFocus = input();
91
96
  focusBottom = input();
@@ -94,6 +99,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
94
99
  validMaxLength = input();
95
100
  showErrorLabel = input(true, { transform: (val) => val ?? true });
96
101
  showErrorBorder = input(true);
102
+ ignoreShowBorderErrorToolbar = input();
97
103
  //endregion
98
104
  //region Outputs
99
105
  outShowPopupEditLink = output();
@@ -129,14 +135,28 @@ export class LibsUiComponentsInputsQuill2xComponent {
129
135
  }
130
136
  });
131
137
  effect(() => {
138
+ const elementEditor = this.quillBodyContainer().nativeElement.getElementsByClassName('ql-editor')?.[0];
132
139
  if (this.heightEditorContentDefault()) {
133
140
  untracked(() => {
134
- const elementEditor = this.quillBodyContainer().nativeElement.getElementsByClassName('ql-editor')?.[0];
135
141
  if (elementEditor) {
136
142
  elementEditor.style.height = `${this.heightEditorContentDefault()}px`;
137
143
  }
138
144
  });
139
145
  }
146
+ if (this.minHeightEditorContentDefault()) {
147
+ untracked(() => {
148
+ if (elementEditor) {
149
+ elementEditor.style.minHeight = `${this.minHeightEditorContentDefault()}px`;
150
+ }
151
+ });
152
+ }
153
+ if (this.maxHeightEditorContentDefault()) {
154
+ untracked(() => {
155
+ if (elementEditor) {
156
+ elementEditor.style.maxHeight = `${this.maxHeightEditorContentDefault()}px`;
157
+ }
158
+ });
159
+ }
140
160
  });
141
161
  }
142
162
  async ngOnInit() {
@@ -173,7 +193,36 @@ export class LibsUiComponentsInputsQuill2xComponent {
173
193
  : undefined,
174
194
  table: true,
175
195
  clipboard: {
176
- matchers: [[Node.TEXT_NODE, (node) => new Delta().insert(node.data)]],
196
+ matchers: [
197
+ [Node.TEXT_NODE, (node) => new Delta().insert(node.data)],
198
+ this.removeNearWhiteColorsOnPaste()
199
+ ? [
200
+ Node.ELEMENT_NODE,
201
+ (node, delta) => {
202
+ const style = node.getAttribute('style');
203
+ if (style && this.isPaste()) {
204
+ const newOps = delta.ops.map((op) => {
205
+ if (op.attributes) {
206
+ const newAttrs = { ...op.attributes };
207
+ const color = newAttrs.color;
208
+ const background = newAttrs.background;
209
+ if (color && isNearWhite(color)) {
210
+ delete newAttrs.color;
211
+ }
212
+ if (background && isNearWhite(background)) {
213
+ delete newAttrs.background;
214
+ }
215
+ return { ...op, attributes: Object.keys(newAttrs).length ? newAttrs : undefined };
216
+ }
217
+ return op;
218
+ });
219
+ return new Delta(newOps);
220
+ }
221
+ return delta;
222
+ },
223
+ ]
224
+ : [],
225
+ ],
177
226
  },
178
227
  keyboard: {
179
228
  bindings: {
@@ -207,7 +256,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
207
256
  .subscribe(() => this.calculatorToolbar(true));
208
257
  this.handlerTextChange();
209
258
  this.handlerSelectionChange();
210
- this.handlerPaste();
259
+ this.quill?.root.addEventListener('paste', this.handlerPaste, true);
211
260
  this.outFunctionsControl.emit(this.FunctionsControl);
212
261
  await this.setContent(this.item()[this.fieldBind()]);
213
262
  this.setStyleForContent();
@@ -278,7 +327,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
278
327
  dataLink: link,
279
328
  callback: async (linkEdit) => {
280
329
  if (link instanceof Object && link.url) {
281
- this.quill?.deleteText(link.range.index, link.range.length, Quill.sources.USER);
330
+ this.quill?.deleteText(link.range.index, link.range.length, Quill2x.sources.USER);
282
331
  this.quill?.insertText(link.range.index, linkEdit.title, 'link', linkEdit.link);
283
332
  return;
284
333
  }
@@ -355,12 +404,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
355
404
  this.outFocus.emit();
356
405
  return;
357
406
  }
358
- const format = this.quill?.getFormat();
359
- if (format) {
360
- this.setFontSizeSelected(format);
361
- this.setFontSelected(format);
362
- this.setColorSelected(format);
363
- }
407
+ const format = this.updateStateToolbarByFormatInCursor();
364
408
  this.outSelectionChange.emit({
365
409
  quill: this.quill,
366
410
  range,
@@ -412,29 +456,28 @@ export class LibsUiComponentsInputsQuill2xComponent {
412
456
  }
413
457
  });
414
458
  }
415
- handlerPaste() {
416
- set(this.quill, 'root.onpaste', async (event) => {
417
- if (!event || !event.clipboardData) {
418
- return;
419
- }
420
- const files = event.clipboardData.files;
421
- if (!files.length) {
422
- if (event.clipboardData.getData('text')) {
423
- this.scrollToSelectionWithElementScrollHeightAuto();
424
- }
425
- return;
426
- }
427
- event.preventDefault();
428
- await this.uploadImagesAndInsert(files);
429
- });
430
- }
459
+ handlerPaste = async (event) => {
460
+ this.isPaste.set(true);
461
+ setTimeout(() => this.isPaste.set(false), 0);
462
+ if (!event || !event.clipboardData) {
463
+ return;
464
+ }
465
+ const files = event.clipboardData.files;
466
+ if (!files.length) {
467
+ return;
468
+ }
469
+ event.preventDefault();
470
+ await this.uploadImagesAndInsert(files);
471
+ };
431
472
  handlerTextChange() {
432
- this.quill?.on('text-change', (event) => {
473
+ this.quill?.on('text-change', (event, _, source) => {
433
474
  this.outTextChange.emit({
434
475
  quill: this.quill,
435
476
  delta: event,
436
477
  });
437
478
  setTimeout(() => {
479
+ this.detectLink(source);
480
+ this.updateStateToolbarByFormatInCursor();
438
481
  if (event?.ops[1]?.insert === '\n') {
439
482
  const range = { index: event?.ops[0].retain };
440
483
  const currentLeaf = this.quill?.getLeaf(range.index)[0];
@@ -453,6 +496,23 @@ export class LibsUiComponentsInputsQuill2xComponent {
453
496
  });
454
497
  }
455
498
  //endregion
499
+ updateStateToolbarByFormatInCursor() {
500
+ try {
501
+ const format = this.quill?.getFormat();
502
+ if (format) {
503
+ this.setFontSizeSelected(format);
504
+ this.setFontSelected(format);
505
+ this.setColorSelected(format);
506
+ this.listCheckboxSelected.set(format?.list === 'unchecked' || format?.list === 'checked');
507
+ this.adjustSelected.set(format?.align);
508
+ }
509
+ return format;
510
+ }
511
+ catch (error) {
512
+ console.log(error);
513
+ return undefined;
514
+ }
515
+ }
456
516
  async validate() {
457
517
  this.messageError.set('');
458
518
  const validRequired = this.validRequired();
@@ -643,7 +703,6 @@ export class LibsUiComponentsInputsQuill2xComponent {
643
703
  }
644
704
  this.insertImage(link, indexInsert);
645
705
  });
646
- this.scrollToSelectionWithElementScrollHeightAuto(indexInsert);
647
706
  }
648
707
  catch (error) {
649
708
  console.error(error);
@@ -653,21 +712,6 @@ export class LibsUiComponentsInputsQuill2xComponent {
653
712
  }
654
713
  return;
655
714
  }
656
- scrollToSelectionWithElementScrollHeightAuto(index) {
657
- // clearTimeout(this.timeoutScrollToSelectionWithElementScrollHeightAuto());
658
- // if (!this.elementScrollHeightAuto()) {
659
- // return;
660
- // }
661
- // this.timeoutScrollToSelectionWithElementScrollHeightAuto.set(
662
- // setTimeout(() => {
663
- // index = index ?? this.quill?.getSelection(true).index;
664
- // if (!isNil(index)) {
665
- // const bounds = this.quill?.getBounds(index, 1);
666
- // this.elementScrollHeightAuto()?.scrollTo(0, (bounds?.top || 0) - 20);
667
- // }
668
- // }, 100)
669
- // );
670
- }
671
715
  async insertImage(content, index) {
672
716
  const selection = index ?? this.quill?.getSelection(true).index;
673
717
  if (!isNil(selection)) {
@@ -686,10 +730,13 @@ export class LibsUiComponentsInputsQuill2xComponent {
686
730
  const selection = this.quill?.getSelection(true);
687
731
  const indexInsert = index ?? selection?.index;
688
732
  if (selection?.length) {
689
- this.quill?.deleteText(selection.index, selection.length, Quill.sources.USER);
733
+ this.quill?.deleteText(selection.index, selection.length, Quill2x.sources.USER);
690
734
  }
691
735
  if (!isNil(indexInsert)) {
692
- this.quill?.insertText(indexInsert, text, 'link', url);
736
+ this.quill?.insertText(indexInsert, text, {
737
+ link: url,
738
+ color: false,
739
+ });
693
740
  }
694
741
  }
695
742
  handleShowUploadLink(event) {
@@ -704,7 +751,7 @@ export class LibsUiComponentsInputsQuill2xComponent {
704
751
  this.addEditLinkComponentRef()?.setInput('ignoreCommunicateMicroEvent', this.ignoreCommunicateMicroEventPopup());
705
752
  instance?.outSaveLink.subscribe((item) => {
706
753
  if (data instanceof Object && data.url) {
707
- this.quill?.deleteText(data.range.index, data.range.length, Quill.sources.USER);
754
+ this.quill?.deleteText(data.range.index, data.range.length, Quill2x.sources.USER);
708
755
  this.quill?.insertText(data.range.index, item.title, 'link', item.link);
709
756
  return;
710
757
  }
@@ -718,12 +765,16 @@ export class LibsUiComponentsInputsQuill2xComponent {
718
765
  if (!range) {
719
766
  return;
720
767
  }
721
- const cursorPos = range.index;
768
+ const indexSubtract = this.quill?.getText(range.index - 1, 1)?.includes('@') ? 0 : 1;
769
+ const cursorPos = range.index - indexSubtract;
722
770
  const startPosInsert = cursorPos - event.lengthKey;
723
- this.quill?.deleteText(startPosInsert, event.lengthKey, Quill.sources.USER);
724
- this.quill?.insertEmbed(startPosInsert, 'mention', event.data, Quill.sources.USER);
771
+ this.quill?.deleteText(startPosInsert, event.lengthKey, Quill2x.sources.SILENT);
772
+ this.quill?.insertEmbed(startPosInsert, 'mention', event.data, Quill2x.sources.SILENT);
725
773
  this.insertText(' ', startPosInsert + 1);
726
- this.quill?.setSelection(startPosInsert + 2, 0, Quill.sources.USER);
774
+ if (indexSubtract) {
775
+ this.quill?.deleteText(startPosInsert + 3, 1, Quill2x.sources.SILENT);
776
+ }
777
+ this.quill?.setSelection(startPosInsert + 2, 0, Quill2x.sources.SILENT);
727
778
  }
728
779
  updateValueByRootQuillHtml() {
729
780
  const html = this.removeUnwantedPart(this.quill?.root.innerHTML || '');
@@ -750,12 +801,48 @@ export class LibsUiComponentsInputsQuill2xComponent {
750
801
  .replace(/<div><br><\/div>/gi, '')
751
802
  .replace(/[\u200B-\u200D\uFEFF]/g, '');
752
803
  }
804
+ detectLink(source) {
805
+ if (source !== 'user') {
806
+ return;
807
+ }
808
+ const fullText = this.quill?.getText();
809
+ const indexes = this.getIndexUrlMatch(fullText || '');
810
+ if (isNil(fullText) || !indexes.length) {
811
+ return;
812
+ }
813
+ indexes.forEach((item) => {
814
+ const textSelection = this.quill?.getText(item.start, item.end - item.start);
815
+ if (!textSelection) {
816
+ return;
817
+ }
818
+ const indexof = textSelection.search(patterProtocolUrl());
819
+ if (indexof < 0) {
820
+ return;
821
+ }
822
+ this.quill?.formatText(item.start + indexof, item.text.length, { link: item.text, color: false }, Quill2x.sources.SILENT);
823
+ });
824
+ }
825
+ getIndexUrlMatch(fullText) {
826
+ const textMatch = fullText.match(new RegExp(patternUrl().toString().replace('/^', '').replace('$/', ''), 'ig'));
827
+ const indexes = [];
828
+ let index = 0;
829
+ textMatch?.forEach((text) => {
830
+ const indexOfTextMatch = fullText.indexOf(text, index);
831
+ const indexPreCharacter = indexOfTextMatch - 1;
832
+ index = indexOfTextMatch + text.length;
833
+ if (indexOfTextMatch < 0 || !new RegExp(/^[\s]|^[\t]|^[\n]/).test(fullText[indexPreCharacter] || '')) {
834
+ return;
835
+ }
836
+ indexes.push({ start: indexOfTextMatch, end: indexOfTextMatch + text.length, text, preCharacter: fullText[indexPreCharacter] });
837
+ });
838
+ return indexes;
839
+ }
753
840
  focus() {
754
841
  if (this.focusBottom()) {
755
- this.quill?.setSelection(this.quill.root.innerHTML.length, 0, Quill.sources.SILENT);
842
+ this.quill?.setSelection(this.quill.root.innerHTML.length, 0, Quill2x.sources.SILENT);
756
843
  return;
757
844
  }
758
- this.quill?.setSelection(0, 0, Quill.sources.SILENT);
845
+ this.quill?.setSelection(0, 0, Quill2x.sources.SILENT);
759
846
  }
760
847
  //endregion
761
848
  ngOnDestroy() {
@@ -763,9 +850,10 @@ export class LibsUiComponentsInputsQuill2xComponent {
763
850
  clearTimeout(this.timerCalculatorToolbar());
764
851
  this.dynamicComponentService.remove(this.addEditLinkComponentRef());
765
852
  this.dynamicComponentService.remove(this.uploadImageComponentRef());
853
+ this.quill?.root.removeEventListener('paste', this.handlerPaste, true);
766
854
  }
767
855
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuill2xComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
768
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsQuill2xComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill2x", inputs: { uploadImageConfig: { classPropertyName: "uploadImageConfig", publicName: "uploadImageConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, blotsRegister: { classPropertyName: "blotsRegister", publicName: "blotsRegister", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, quillCustomConfig: { classPropertyName: "quillCustomConfig", publicName: "quillCustomConfig", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldBind: { classPropertyName: "fieldBind", publicName: "fieldBind", isSignal: true, isRequired: true, transformFunction: null }, autoUpdateValueWhenTextChange: { classPropertyName: "autoUpdateValueWhenTextChange", publicName: "autoUpdateValueWhenTextChange", isSignal: true, isRequired: false, transformFunction: null }, dataConfigMention: { classPropertyName: "dataConfigMention", publicName: "dataConfigMention", isSignal: true, isRequired: false, transformFunction: null }, templateToolBarPersonalize: { classPropertyName: "templateToolBarPersonalize", publicName: "templateToolBarPersonalize", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopupEditLink: { classPropertyName: "ignoreShowPopupEditLink", publicName: "ignoreShowPopupEditLink", isSignal: true, isRequired: false, transformFunction: null }, ignoreCommunicateMicroEventPopup: { classPropertyName: "ignoreCommunicateMicroEventPopup", publicName: "ignoreCommunicateMicroEventPopup", isSignal: true, isRequired: false, transformFunction: null }, handlersExpand: { classPropertyName: "handlersExpand", publicName: "handlersExpand", isSignal: true, isRequired: false, transformFunction: null }, resizeImagePlugin: { classPropertyName: "resizeImagePlugin", publicName: "resizeImagePlugin", isSignal: true, isRequired: false, transformFunction: null }, fontSizeDefault: { classPropertyName: "fontSizeDefault", publicName: "fontSizeDefault", isSignal: true, isRequired: false, transformFunction: null }, heightEditorContentDefault: { classPropertyName: "heightEditorContentDefault", publicName: "heightEditorContentDefault", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, focusBottom: { classPropertyName: "focusBottom", publicName: "focusBottom", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, showErrorLabel: { classPropertyName: "showErrorLabel", publicName: "showErrorLabel", isSignal: true, isRequired: false, transformFunction: null }, showErrorBorder: { classPropertyName: "showErrorBorder", publicName: "showErrorBorder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outShowPopupEditLink: "outShowPopupEditLink", outMessageError: "outMessageError", outBlur: "outBlur", outFocus: "outFocus", outChange: "outChange", outSelectionChange: "outSelectionChange", outTextChange: "outTextChange", outContextMenu: "outContextMenu", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "htmlContainer", first: true, predicate: ["htmlContainer"], descendants: true, isSignal: true }, { propertyName: "quillBodyContainer", first: true, predicate: ["snowContainer"], descendants: true, isSignal: true }, { propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true, isSignal: true }, { propertyName: "inputLinkRef", first: true, predicate: ["inputLinkRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #htmlContainer\n [class]=\"containerClass()\"\n [style.--resize]=\"resize()\">\n @if (label(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n\n <div\n #toolbarContainer\n class=\"relative h-[44px]\"\n [ngStyle]=\"quillCustomConfig()?.toolbar?.()?.styles?.() || {}\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\" />\n </div>\n <div\n #snowContainer\n LibsUiComponentsScrollOverlayDirective\n LibsUiComponentsInputsMentionDirective\n [options]=\"{ ignoreTransparentScrollBarColorDefault: resize() !== 'none' }\"\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"\n [class]=\"containerEditorClass()\"></div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\">{{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbarTemplate>\n <div\n [class]=\"containerToolbarClass()\"\n #toolbarItems>\n @if (displaySkeletonToolbar()) {\n <libs_ui-components-skeleton\n class=\"w-full h-full\"\n [config]=\"{\n rows: [\n {\n item: { classIncludeItem: '!rounded-none' },\n },\n ],\n }\" />\n }\n <div class=\"ql-formats items-center px-[16px] py-[4px] !flex\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"!option.display\"\n [class.flex]=\"option.display\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n <div class=\"relative\">\n @if (showButtonMoreToolbar()) {\n <libs_ui-components-buttons-button\n [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div\n [class.hidden]=\"!showMoreAction()\"\n class=\"absolute bg-[#ffffff] shadow-[0px_4px_16px_0px_rgba(0,20,51,0.10)] z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"option.display !== false\"\n [class.flex]=\"option.display === false\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #itemToolbarTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_undo', zIndex: zIndex() }\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_redo', zIndex: zIndex() }\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[132px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px]\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'header') {\n <div\n class=\"relative w-[138px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigHeader()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectHeader($event)\">\n @if (headerSelected(); as headerSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelHeaderSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\" {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid\n #inputSizeRef\n [dataType]=\"'int'\"\n [(item)]=\"fontSize\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly() || loadingUploadImage()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outChangeValueByButtonUpDown)=\"handlerValueChangeFontSize()\"\n (outFocusAndBlur)=\"handlerValueChangeFontSize($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_text_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n [applyNow]=\"false\"\n (outColorChange)=\"handlerSetFormat('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-text-active]=\"!!colorSelected()\"\n [style.--color-selected]=\"colorSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_background_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"false\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n (outColorChange)=\"handlerSetFormat('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-background-active]=\"!!backgroundSelected()\"\n [style.--background-selected]=\"backgroundSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_weight_bold', zIndex: zIndex() }\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_style_italic', zIndex: zIndex() }\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_decoration_underline', zIndex: zIndex() }\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_line_through', zIndex: zIndex() }\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'script.sub') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_sub', zIndex: zIndex() }\"\n class=\"ql-script\"\n value=\"sub\"></button>\n </div>\n }\n @if (option.type === 'script.super') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_super', zIndex: zIndex() }\"\n class=\"ql-script\"\n value=\"super\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_adjust', zIndex: zIndex() }\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: { mode: 'start', distance: 0 }, paddingLeftItem: false }\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"zIndex() + 1\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_increase', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_decrease', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'direction') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_direction', zIndex: zIndex() }\"\n class=\"ql-direction\"\n value=\"rtl\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_bulleted', zIndex: zIndex() }\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'listChecked') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-check\"\n value=\"check\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_quote', zIndex: zIndex() }\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_insert_link', zIndex: zIndex() }\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_unlink', zIndex: zIndex() }\"\n class=\"ql-unLink\"\n (click)=\"handlerUnlink($event)\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_image', zIndex: zIndex() }\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'video') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_video', zIndex: zIndex() }\"\n class=\"ql-video\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji\n [zIndex]=\"zIndex()\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerInsertEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'table') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_table', zIndex: zIndex() }\"\n class=\"ql-table\"></button>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover\n #inputLinkRef\n [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{ template: viewLink, whiteTheme: true, ignoreArrow: true, zIndex: zIndex() }\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div\n class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: link().url, zIndex: zIndex() + 1 }\">\n {{ link().url }}\n </div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEditLink($event)\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host ::ng-deep .quill-container .ql-container{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400}:host ::ng-deep .quill-container .ql-container .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;height:auto;min-height:100%;resize:var(--resize)}:host ::ng-deep .quill-container .ql-container .ql-editor ol li:before{content:\"\"!important}:host ::ng-deep .quill-container .ql-container .ql-blank:before{font-style:normal!important;font-size:12px!important;color:#9ca2ad!important;font-family:var(--libs-ui-font-family-name),arial!important}:host ::ng-deep .quill-container .ql-active span:before{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-active .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-script :hover .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-toolbar{padding:0!important;border:none!important}:host ::ng-deep .quill-container .ql-toolbar button{padding:0!important;height:16px!important;width:16px!important}:host ::ng-deep .quill-container .ql-tooltip{display:none!important}:host ::ng-deep .quill-container #editor-resizer .toolbar{top:0!important;left:0!important;transform:none!important;font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;font-size:12px}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-text-active{color:var(--color-selected)!important}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-background-active{color:var(--background-selected)!important}:host ::ng-deep .selected-cell{background-color:#0096ff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsEmojiComponent, selector: "libs_ui-components-emoji", inputs: ["configPopover", "isNgContent", "zIndex", "modePopoverPosition", "classPopup", "classInclude", "classIconInclude"], outputs: ["outEventEmoji", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsSelectColorComponent, selector: "libs_ui-components-buttons-select_color", inputs: ["zIndex", "customOptions", "externalContent", "direction", "button", "applyNow"], outputs: ["zIndexChange", "outColorChange", "outColorChangeMultipleType"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "directive", type: LibsUiComponentsInputsMentionDirective, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: ["timeDelayInit", "mentionConfig", "mentionListTemplate"], outputs: ["outSearchTerm", "outItemSelected", "outToggle", "outInsertMention", "outFunctionControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
856
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsQuill2xComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill2x", inputs: { uploadImageConfig: { classPropertyName: "uploadImageConfig", publicName: "uploadImageConfig", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, blotsRegister: { classPropertyName: "blotsRegister", publicName: "blotsRegister", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, quillCustomConfig: { classPropertyName: "quillCustomConfig", publicName: "quillCustomConfig", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, fieldBind: { classPropertyName: "fieldBind", publicName: "fieldBind", isSignal: true, isRequired: true, transformFunction: null }, autoUpdateValueWhenTextChange: { classPropertyName: "autoUpdateValueWhenTextChange", publicName: "autoUpdateValueWhenTextChange", isSignal: true, isRequired: false, transformFunction: null }, dataConfigMention: { classPropertyName: "dataConfigMention", publicName: "dataConfigMention", isSignal: true, isRequired: false, transformFunction: null }, templateToolBarPersonalize: { classPropertyName: "templateToolBarPersonalize", publicName: "templateToolBarPersonalize", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowPopupEditLink: { classPropertyName: "ignoreShowPopupEditLink", publicName: "ignoreShowPopupEditLink", isSignal: true, isRequired: false, transformFunction: null }, ignoreCommunicateMicroEventPopup: { classPropertyName: "ignoreCommunicateMicroEventPopup", publicName: "ignoreCommunicateMicroEventPopup", isSignal: true, isRequired: false, transformFunction: null }, handlersExpand: { classPropertyName: "handlersExpand", publicName: "handlersExpand", isSignal: true, isRequired: false, transformFunction: null }, resizeImagePlugin: { classPropertyName: "resizeImagePlugin", publicName: "resizeImagePlugin", isSignal: true, isRequired: false, transformFunction: null }, fontSizeDefault: { classPropertyName: "fontSizeDefault", publicName: "fontSizeDefault", isSignal: true, isRequired: false, transformFunction: null }, heightEditorContentDefault: { classPropertyName: "heightEditorContentDefault", publicName: "heightEditorContentDefault", isSignal: true, isRequired: false, transformFunction: null }, minHeightEditorContentDefault: { classPropertyName: "minHeightEditorContentDefault", publicName: "minHeightEditorContentDefault", isSignal: true, isRequired: false, transformFunction: null }, maxHeightEditorContentDefault: { classPropertyName: "maxHeightEditorContentDefault", publicName: "maxHeightEditorContentDefault", isSignal: true, isRequired: false, transformFunction: null }, removeNearWhiteColorsOnPaste: { classPropertyName: "removeNearWhiteColorsOnPaste", publicName: "removeNearWhiteColorsOnPaste", isSignal: true, isRequired: false, transformFunction: null }, resize: { classPropertyName: "resize", publicName: "resize", isSignal: true, isRequired: false, transformFunction: null }, autoFocus: { classPropertyName: "autoFocus", publicName: "autoFocus", isSignal: true, isRequired: false, transformFunction: null }, focusBottom: { classPropertyName: "focusBottom", publicName: "focusBottom", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null }, validMinLength: { classPropertyName: "validMinLength", publicName: "validMinLength", isSignal: true, isRequired: false, transformFunction: null }, validMaxLength: { classPropertyName: "validMaxLength", publicName: "validMaxLength", isSignal: true, isRequired: false, transformFunction: null }, showErrorLabel: { classPropertyName: "showErrorLabel", publicName: "showErrorLabel", isSignal: true, isRequired: false, transformFunction: null }, showErrorBorder: { classPropertyName: "showErrorBorder", publicName: "showErrorBorder", isSignal: true, isRequired: false, transformFunction: null }, ignoreShowBorderErrorToolbar: { classPropertyName: "ignoreShowBorderErrorToolbar", publicName: "ignoreShowBorderErrorToolbar", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", outShowPopupEditLink: "outShowPopupEditLink", outMessageError: "outMessageError", outBlur: "outBlur", outFocus: "outFocus", outChange: "outChange", outSelectionChange: "outSelectionChange", outTextChange: "outTextChange", outContextMenu: "outContextMenu", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "htmlContainer", first: true, predicate: ["htmlContainer"], descendants: true, isSignal: true }, { propertyName: "quillBodyContainer", first: true, predicate: ["snowContainer"], descendants: true, isSignal: true }, { propertyName: "toolbarContainer", first: true, predicate: ["toolbarContainer"], descendants: true, isSignal: true }, { propertyName: "inputLinkRef", first: true, predicate: ["inputLinkRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #htmlContainer\n [class]=\"containerClass()\"\n [style.--resize]=\"resize()\">\n @if (label(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n\n <div\n #toolbarContainer\n class=\"relative h-[44px]\"\n [ngStyle]=\"quillCustomConfig()?.toolbar?.()?.styles?.() || {}\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\" />\n </div>\n <div\n #snowContainer\n LibsUiComponentsScrollOverlayDirective\n LibsUiComponentsInputsMentionDirective\n [options]=\"{ ignoreTransparentScrollBarColorDefault: resize() !== 'none' }\"\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"\n [class]=\"containerEditorClass()\"></div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\">{{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbarTemplate>\n <div\n [class]=\"containerToolbarClass()\"\n #toolbarItems>\n @if (displaySkeletonToolbar()) {\n <libs_ui-components-skeleton\n class=\"w-full h-full\"\n [config]=\"{\n rows: [\n {\n item: { classIncludeItem: '!rounded-none' },\n },\n ],\n }\" />\n }\n <div class=\"ql-formats items-center px-[16px] py-[4px] !flex\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"!option.display\"\n [class.flex]=\"option.display\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n <div class=\"relative\">\n @if (showButtonMoreToolbar()) {\n <libs_ui-components-buttons-button\n [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div\n [class.hidden]=\"!showMoreAction()\"\n class=\"absolute bg-[#ffffff] shadow-[0px_4px_16px_0px_rgba(0,20,51,0.10)] z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"option.display !== false\"\n [class.flex]=\"option.display === false\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #itemToolbarTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_undo', zIndex: zIndex() }\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_redo', zIndex: zIndex() }\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[132px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px]\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'header') {\n <div\n class=\"relative w-[138px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [popoverCustomConfig]=\"{ widthByParent: false, width: 200, classInclude: 'h-[254px]', classIncludeOverlayBody: 'h-full', position: { mode: 'start', distance: -8 } }\"\n [listConfig]=\"listConfigHeader()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"-1\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectHeader($event)\">\n @if (headerSelected(); as headerSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelHeaderSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\" {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid\n #inputSizeRef\n [dataType]=\"'int'\"\n [(item)]=\"fontSize\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly() || loadingUploadImage()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outChangeValueByButtonUpDown)=\"handlerValueChangeFontSize()\"\n (outFocusAndBlur)=\"handlerValueChangeFontSize($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_text_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n [applyNow]=\"false\"\n (outColorChange)=\"handlerSetFormat('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-text-active]=\"!!colorSelected()\"\n [style.--color-selected]=\"colorSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_background_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"false\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n (outColorChange)=\"handlerSetFormat('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-background-active]=\"!!backgroundSelected()\"\n [style.--background-selected]=\"backgroundSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_weight_bold', zIndex: zIndex() }\"\n class=\"ql-bold !flex\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_style_italic', zIndex: zIndex() }\"\n class=\"ql-italic !flex\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_decoration_underline', zIndex: zIndex() }\"\n class=\"ql-underline !flex\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_line_through', zIndex: zIndex() }\"\n class=\"ql-strike !flex\"></button>\n </div>\n }\n @if (option.type === 'script.sub') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_sub', zIndex: zIndex() }\"\n class=\"ql-script flex\"\n value=\"sub\"></button>\n </div>\n }\n @if (option.type === 'script.super') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_super', zIndex: zIndex() }\"\n class=\"ql-script flex\"\n value=\"super\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_adjust', zIndex: zIndex() }\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: { mode: 'start', distance: 0 }, paddingLeftItem: false }\"\n [listHasButtonUnSelectOption]=\"false\"\n [zIndex]=\"zIndex() + 1\"\n [listKeySelected]=\"adjustSelected()\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i\n [class]=\"iconAlignSelectedComputed()\"\n [class.text-[var(--libs-ui-color-light-1)]]=\"adjustSelected() !== undefined\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_increase', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_decrease', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'direction') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_direction', zIndex: zIndex() }\"\n class=\"ql-direction\"\n value=\"rtl\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_bulleted', zIndex: zIndex() }\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'listChecked') {\n <div\n [class]=\"option.classInclude || 'mx-[8px]'\"\n [class.ql-active]=\"listCheckboxSelected()\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-check\"\n value=\"check\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_quote', zIndex: zIndex() }\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_insert_link', zIndex: zIndex() }\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_unlink', zIndex: zIndex() }\"\n class=\"ql-unLink\"\n (click)=\"handlerUnlink($event)\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_image', zIndex: zIndex() }\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'video') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_video', zIndex: zIndex() }\"\n class=\"ql-video\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji\n [zIndex]=\"zIndex()\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerInsertEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'table') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_table', zIndex: zIndex() }\"\n class=\"ql-table\"></button>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover\n #inputLinkRef\n [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{ template: viewLink, whiteTheme: true, ignoreArrow: true, zIndex: zIndex() }\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div\n class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: link().url, zIndex: zIndex() + 1 }\">\n {{ link().url }}\n </div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEditLink($event)\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host ::ng-deep .quill-container .ql-container{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400}:host ::ng-deep .quill-container .ql-container .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;height:auto;min-height:100%;resize:var(--resize)}:host ::ng-deep .quill-container .ql-container .ql-editor ol li:before{content:\"\"!important}:host ::ng-deep .quill-container .ql-container .ql-blank:before{font-style:normal!important;font-size:12px!important;color:#9ca2ad!important;font-family:var(--libs-ui-font-family-name),arial!important}:host ::ng-deep .quill-container .ql-active span:before{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-active .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-script :hover .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-toolbar{padding:0!important;border:none!important}:host ::ng-deep .quill-container .ql-toolbar button{padding:0!important;height:16px!important;width:16px!important}:host ::ng-deep .quill-container .ql-tooltip{display:none!important}:host ::ng-deep .quill-container #editor-resizer .toolbar{top:0!important;left:0!important;transform:none!important;font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;font-size:12px}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-text-active{color:var(--color-selected)!important}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-background-active{color:var(--background-selected)!important}:host ::ng-deep .quill-container .ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}:host ::ng-deep .selected-cell{background-color:#0096ff4d}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LibsUiComponentsDropdownComponent, selector: "libs_ui-components-dropdown", inputs: ["useXssFilter", "popoverElementRefCustom", "classInclude", "ignoreStopPropagationEvent", "flagMouse", "flagMouseContent", "popoverCustomConfig", "isNgContent", "zIndex", "convertItemSelected", "getPopoverItemSelected", "httpRequestDetailItemById", "lengthKeys", "textDisplayWhenNoSelect", "textDisplayWhenMultiSelect", "classIncludeTextDisplayWhenNoSelect", "fieldLabel", "fieldGetLabel", "labelPopoverConfig", "labelPopoverFullWidth", "hasContentUnitRight", "listSearchNoDataTemplateRef", "fieldGetImage", "imageSize", "typeShape", "fieldGetIcon", "fieldGetTextAvatar", "fieldGetColorAvatar", "classAvatarInclude", "getLastTextAfterSpace", "linkImageError", "showError", "showBorderError", "disable", "readonly", "labelConfig", "disableLabel", "listSearchConfig", "isSearchOnline", "listHiddenInputSearch", "listSearchPadding", "listKeySearch", "listDividerClassInclude", "listConfig", "listButtonsOther", "listHasButtonUnSelectOption", "listClickExactly", "listBackgroundCustom", "listMaxItemShow", "listKeySelected", "listMultiKeySelected", "listKeysDisable", "listKeysHidden", "validRequired", "validMaxItemSelected", "changeValidUndefinedResetError", "allowSelectItemMultiple", "focusInputSearch", "onlyEmitDataWhenReset", "resetKeyWhenSelectAllKey", "listConfigHasDivider", "classIncludeIcon", "classIncludeContent", "listIgnoreClassDisableDefaultWhenUseKeysDisableItem", "tabKeyActive", "tabsConfig", "ignoreBorderBottom"], outputs: ["flagMouseChange", "flagMouseContentChange", "lengthKeysChange", "showBorderErrorChange", "listKeySelectedChange", "listMultiKeySelectedChange", "tabKeyActiveChange", "outSelectKey", "outSelectMultiKey", "outFunctionsControl", "outValidEvent", "outChangStageFlagMouse", "outDataChange", "outClickButtonOther", "outShowList", "outChangeTabKeyActive"] }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsSkeletonComponent, selector: "libs_ui-components-skeleton", inputs: ["config"] }, { kind: "directive", type: LibsUiComponentsScrollOverlayDirective, selector: "[LibsUiComponentsScrollOverlayDirective]", inputs: ["debugMode", "ignoreInit", "classContainer", "options", "elementCheckScrollX", "elementCheckScrollY", "elementScroll"], outputs: ["outScroll", "outScrollX", "outScrollY", "outScrollTop", "outScrollBottom"] }, { kind: "component", type: LibsUiComponentsEmojiComponent, selector: "libs_ui-components-emoji", inputs: ["configPopover", "isNgContent", "zIndex", "modePopoverPosition", "classPopup", "classInclude", "classIconInclude"], outputs: ["outEventEmoji", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsButtonsSelectColorComponent, selector: "libs_ui-components-buttons-select_color", inputs: ["zIndex", "customOptions", "externalContent", "direction", "button", "applyNow"], outputs: ["zIndexChange", "outColorChange", "outColorChangeMultipleType"] }, { kind: "component", type: LibsUiComponentsLabelComponent, selector: "libs_ui-components-label", inputs: ["iconPopoverClass", "classInclude", "labelLeft", "labelLeftClass", "labelLeftBehindToggleButton", "popover", "required", "buttonsLeft", "disableButtonsLeft", "buttonsRight", "disableButtonsRight", "labelRight", "labelRightClass", "labelRightRequired", "hasToggle", "toggleSize", "toggleActive", "toggleDisable", "description", "descriptionClass", "buttonsDescription", "disableButtonsDescription", "buttonsDescriptionContainerClass", "onlyShowCount", "zIndexPopover", "timerDestroyPopover", "count", "limitLength"], outputs: ["outClickButton", "outSwitchEvent", "outLabelRightClick", "outLabelLeftClick"] }, { kind: "directive", type: LibsUiComponentsInputsMentionDirective, selector: "[LibsUiComponentsInputsMentionDirective]", inputs: ["timeDelayInit", "mentionConfig", "mentionListTemplate"], outputs: ["outSearchTerm", "outItemSelected", "outToggle", "outInsertMention", "outFunctionControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
769
857
  }
770
858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuill2xComponent, decorators: [{
771
859
  type: Component,
@@ -783,6 +871,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
783
871
  LibsUiComponentsButtonsSelectColorComponent,
784
872
  LibsUiComponentsLabelComponent,
785
873
  LibsUiComponentsInputsMentionDirective,
786
- ], template: "<div\n #htmlContainer\n [class]=\"containerClass()\"\n [style.--resize]=\"resize()\">\n @if (label(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n\n <div\n #toolbarContainer\n class=\"relative h-[44px]\"\n [ngStyle]=\"quillCustomConfig()?.toolbar?.()?.styles?.() || {}\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\" />\n </div>\n <div\n #snowContainer\n LibsUiComponentsScrollOverlayDirective\n LibsUiComponentsInputsMentionDirective\n [options]=\"{ ignoreTransparentScrollBarColorDefault: resize() !== 'none' }\"\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"\n [class]=\"containerEditorClass()\"></div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\">{{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbarTemplate>\n <div\n [class]=\"containerToolbarClass()\"\n #toolbarItems>\n @if (displaySkeletonToolbar()) {\n <libs_ui-components-skeleton\n class=\"w-full h-full\"\n [config]=\"{\n rows: [\n {\n item: { classIncludeItem: '!rounded-none' },\n },\n ],\n }\" />\n }\n <div class=\"ql-formats items-center px-[16px] py-[4px] !flex\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"!option.display\"\n [class.flex]=\"option.display\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n <div class=\"relative\">\n @if (showButtonMoreToolbar()) {\n <libs_ui-components-buttons-button\n [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div\n [class.hidden]=\"!showMoreAction()\"\n class=\"absolute bg-[#ffffff] shadow-[0px_4px_16px_0px_rgba(0,20,51,0.10)] z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"option.display !== false\"\n [class.flex]=\"option.display === false\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #itemToolbarTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_undo', zIndex: zIndex() }\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_redo', zIndex: zIndex() }\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[132px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px]\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'header') {\n <div\n class=\"relative w-[138px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigHeader()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectHeader($event)\">\n @if (headerSelected(); as headerSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelHeaderSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\" {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid\n #inputSizeRef\n [dataType]=\"'int'\"\n [(item)]=\"fontSize\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly() || loadingUploadImage()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outChangeValueByButtonUpDown)=\"handlerValueChangeFontSize()\"\n (outFocusAndBlur)=\"handlerValueChangeFontSize($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_text_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n [applyNow]=\"false\"\n (outColorChange)=\"handlerSetFormat('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-text-active]=\"!!colorSelected()\"\n [style.--color-selected]=\"colorSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_background_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"false\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n (outColorChange)=\"handlerSetFormat('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-background-active]=\"!!backgroundSelected()\"\n [style.--background-selected]=\"backgroundSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_weight_bold', zIndex: zIndex() }\"\n class=\"ql-bold\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_style_italic', zIndex: zIndex() }\"\n class=\"ql-italic\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_decoration_underline', zIndex: zIndex() }\"\n class=\"ql-underline\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_line_through', zIndex: zIndex() }\"\n class=\"ql-strike\"></button>\n </div>\n }\n @if (option.type === 'script.sub') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_sub', zIndex: zIndex() }\"\n class=\"ql-script\"\n value=\"sub\"></button>\n </div>\n }\n @if (option.type === 'script.super') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_super', zIndex: zIndex() }\"\n class=\"ql-script\"\n value=\"super\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_adjust', zIndex: zIndex() }\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: { mode: 'start', distance: 0 }, paddingLeftItem: false }\"\n [listHasButtonUnSelectOption]=\"false\"\n [listMaxItemShow]=\"8\"\n [zIndex]=\"zIndex() + 1\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i [class]=\"iconAlignSelectedComputed()\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_increase', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_decrease', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'direction') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_direction', zIndex: zIndex() }\"\n class=\"ql-direction\"\n value=\"rtl\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_bulleted', zIndex: zIndex() }\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'listChecked') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-check\"\n value=\"check\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_quote', zIndex: zIndex() }\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_insert_link', zIndex: zIndex() }\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_unlink', zIndex: zIndex() }\"\n class=\"ql-unLink\"\n (click)=\"handlerUnlink($event)\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_image', zIndex: zIndex() }\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'video') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_video', zIndex: zIndex() }\"\n class=\"ql-video\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji\n [zIndex]=\"zIndex()\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerInsertEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'table') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_table', zIndex: zIndex() }\"\n class=\"ql-table\"></button>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover\n #inputLinkRef\n [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{ template: viewLink, whiteTheme: true, ignoreArrow: true, zIndex: zIndex() }\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div\n class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: link().url, zIndex: zIndex() + 1 }\">\n {{ link().url }}\n </div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEditLink($event)\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host ::ng-deep .quill-container .ql-container{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400}:host ::ng-deep .quill-container .ql-container .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;height:auto;min-height:100%;resize:var(--resize)}:host ::ng-deep .quill-container .ql-container .ql-editor ol li:before{content:\"\"!important}:host ::ng-deep .quill-container .ql-container .ql-blank:before{font-style:normal!important;font-size:12px!important;color:#9ca2ad!important;font-family:var(--libs-ui-font-family-name),arial!important}:host ::ng-deep .quill-container .ql-active span:before{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-active .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-script :hover .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-toolbar{padding:0!important;border:none!important}:host ::ng-deep .quill-container .ql-toolbar button{padding:0!important;height:16px!important;width:16px!important}:host ::ng-deep .quill-container .ql-tooltip{display:none!important}:host ::ng-deep .quill-container #editor-resizer .toolbar{top:0!important;left:0!important;transform:none!important;font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;font-size:12px}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-text-active{color:var(--color-selected)!important}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-background-active{color:var(--background-selected)!important}:host ::ng-deep .selected-cell{background-color:#0096ff4d}\n"] }]
874
+ ], template: "<div\n #htmlContainer\n [class]=\"containerClass()\"\n [style.--resize]=\"resize()\">\n @if (label(); as label) {\n <libs_ui-components-label\n [classInclude]=\"label.classInclude\"\n [required]=\"label.required\"\n [labelLeft]=\"label.labelLeft\" />\n }\n\n <div\n #toolbarContainer\n class=\"relative h-[44px]\"\n [ngStyle]=\"quillCustomConfig()?.toolbar?.()?.styles?.() || {}\">\n <ng-container *ngTemplateOutlet=\"toolbarTemplate\" />\n </div>\n <div\n #snowContainer\n LibsUiComponentsScrollOverlayDirective\n LibsUiComponentsInputsMentionDirective\n [options]=\"{ ignoreTransparentScrollBarColorDefault: resize() !== 'none' }\"\n [mentionConfig]=\"dataConfigMention()\"\n (outToggle)=\"handleToggleMention($event)\"\n (outInsertMention)=\"handlerInsertMention($event)\"\n [class]=\"containerEditorClass()\"></div>\n @if (messageError() && showErrorLabel()) {\n <div class=\"flex items-center mt-[8px]\">\n <span class=\"text-[#ff5454] libs-ui-font-h7r\">{{ messageError() | translate }}</span>\n </div>\n }\n</div>\n\n<ng-template #toolbarTemplate>\n <div\n [class]=\"containerToolbarClass()\"\n #toolbarItems>\n @if (displaySkeletonToolbar()) {\n <libs_ui-components-skeleton\n class=\"w-full h-full\"\n [config]=\"{\n rows: [\n {\n item: { classIncludeItem: '!rounded-none' },\n },\n ],\n }\" />\n }\n <div class=\"ql-formats items-center px-[16px] py-[4px] !flex\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"!option.display\"\n [class.flex]=\"option.display\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n <div class=\"relative\">\n @if (showButtonMoreToolbar()) {\n <libs_ui-components-buttons-button\n [type]=\"showMoreAction() ? 'button-secondary' : 'button-third'\"\n [iconOnlyType]=\"true\"\n [classInclude]=\"'!p-[1px] !h-[20px] ml-[8px]'\"\n [classIconLeft]=\"'libs-ui-icon-move-right rotate-90'\"\n (outClick)=\"handlerChangeShowMoreAction($event)\" />\n }\n <!-- Build toolbar khi click xem th\u00EAm-->\n <div\n [class.hidden]=\"!showMoreAction()\"\n class=\"absolute bg-[#ffffff] shadow-[0px_4px_16px_0px_rgba(0,20,51,0.10)] z-[1] flex items-center pl-[8px] pr-[16px] py-[4px] rounded-[8px] top-[31px] right-[0px]\">\n @for (option of toolbarOptionsConfig(); track option) {\n <div\n class=\"items-center\"\n [class.hidden]=\"option.display !== false\"\n [class.flex]=\"option.display === false\">\n <ng-container *ngTemplateOutlet=\"itemToolbarTemplate; context: { option, $index, $last }\" />\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template\n #itemToolbarTemplate\n let-$index=\"$index\"\n let-$last=\"$last\"\n let-option=\"option\">\n @if (option.type === 'undo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_undo', zIndex: zIndex() }\"\n class=\"ql-undo\"></button>\n </div>\n }\n @if (option.type === 'redo') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_redo', zIndex: zIndex() }\"\n class=\"ql-redo\"></button>\n </div>\n }\n @if (option.type === 'fontFamily') {\n <div\n class=\"relative w-[132px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigFont()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectFont($event)\">\n @if (fontSelected(); as fontSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px]\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelFontSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'header') {\n <div\n class=\"relative w-[138px] h-full rounded-[4px] libs-ui-border-general {{ option.classInclude || 'mx-[8px]' }}\"\n [class.bg-white]=\"!readonly() && !loadingUploadImage()\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [popoverCustomConfig]=\"{ widthByParent: false, width: 200, classInclude: 'h-[254px]', classIncludeOverlayBody: 'h-full', position: { mode: 'start', distance: -8 } }\"\n [listConfig]=\"listConfigHeader()\"\n [listHasButtonUnSelectOption]=\"false\"\n [listHiddenInputSearch]=\"true\"\n [readonly]=\"readonly()\"\n [listMaxItemShow]=\"-1\"\n [zIndex]=\"1250\"\n (outSelectKey)=\"handleSelectHeader($event)\">\n @if (headerSelected(); as headerSelected) {\n <div class=\"flex items-center cursor-pointer py-[7px] libs-ui-font-h5r pl-[16px] pr-[40px] {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover\n [type]=\"'text'\"\n [ignoreStopPropagationEvent]=\"true\"\n [config]=\"{ zIndex: zIndex() }\">\n {{ labelHeaderSelectedComputed() }}\n </libs_ui-components-popover>\n <i class=\"libs-ui-icon-move-right rotate-90 absolute right-[12px] text-[#6a7383] text-[16px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </div>\n }\n @if (option.type === 'fontSize') {\n <div class=\" {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-inputs-valid\n #inputSizeRef\n [dataType]=\"'int'\"\n [(item)]=\"fontSize\"\n [fieldNameBind]=\"'value'\"\n [valueUpDownNumber]=\"1\"\n [maxValueNumber]=\"72\"\n [minValueNumber]=\"8\"\n [readonly]=\"readonly() || loadingUploadImage()\"\n [classContainerInput]=\"'w-[72px] h-[32px]'\"\n (outChangeValueByButtonUpDown)=\"handlerValueChangeFontSize()\"\n (outFocusAndBlur)=\"handlerValueChangeFontSize($event)\" />\n </div>\n }\n @if (option.type === 'color') {\n <div class=\"ql-color ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_text_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n [applyNow]=\"false\"\n (outColorChange)=\"handlerSetFormat('color', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-text libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-text-active]=\"!!colorSelected()\"\n [style.--color-selected]=\"colorSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'background') {\n <div class=\"ql-background ql-picker ql-color-picker !flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_background_color', zIndex: zIndex() }\">\n <libs_ui-components-buttons-select_color\n [zIndex]=\"zIndex()\"\n [direction]=\"'top'\"\n [externalContent]=\"true\"\n [applyNow]=\"false\"\n [customOptions]=\"{\n showAlpha: true,\n }\"\n (outColorChange)=\"handlerSetFormat('background', $event)\">\n <div\n class=\"libs-ui-icon-editor-color-background libs-ui-buttons-select-color text-[#6a7383] text-[16px] hover:text-[var(--libs-ui-color-light-1)]\"\n [class.libs-ui-icon-editor-color-background-active]=\"!!backgroundSelected()\"\n [style.--background-selected]=\"backgroundSelected()\"></div>\n </libs_ui-components-buttons-select_color>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'bold') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_weight_bold', zIndex: zIndex() }\"\n class=\"ql-bold !flex\"></button>\n </div>\n }\n @if (option.type === 'italic') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_font_style_italic', zIndex: zIndex() }\"\n class=\"ql-italic !flex\"></button>\n </div>\n }\n @if (option.type === 'underline') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_decoration_underline', zIndex: zIndex() }\"\n class=\"ql-underline !flex\"></button>\n </div>\n }\n @if (option.type === 'strikeThrough') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_text_line_through', zIndex: zIndex() }\"\n class=\"ql-strike !flex\"></button>\n </div>\n }\n @if (option.type === 'script.sub') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_sub', zIndex: zIndex() }\"\n class=\"ql-script flex\"\n value=\"sub\"></button>\n </div>\n }\n @if (option.type === 'script.super') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_script_super', zIndex: zIndex() }\"\n class=\"ql-script flex\"\n value=\"super\"></button>\n </div>\n }\n @if (option.type === 'adjust') {\n <div class=\"relative !flex items-center ql-align ql-picker ql-icon-picker !w-max {{ option.classInclude || 'mx-[8px]' }}\">\n <libs_ui-components-popover [config]=\"{ content: 'i18n_adjust', zIndex: zIndex() }\">\n <libs_ui-components-dropdown\n [isNgContent]=\"true\"\n [ignoreStopPropagationEvent]=\"true\"\n [labelPopoverFullWidth]=\"true\"\n [listConfig]=\"listConfigAlign()\"\n [listHiddenInputSearch]=\"true\"\n [popoverCustomConfig]=\"{ ignoreArrow: true, classInclude: '!w-[32px] overflow-hidden !py-[4px]', position: { mode: 'start', distance: 0 }, paddingLeftItem: false }\"\n [listHasButtonUnSelectOption]=\"false\"\n [zIndex]=\"zIndex() + 1\"\n [listKeySelected]=\"adjustSelected()\"\n (outSelectKey)=\"handleSelectAlign($event)\">\n @if (alignSelected(); as alignSelected) {\n <div class=\"flex items-center cursor-pointer\">\n <i\n [class]=\"iconAlignSelectedComputed()\"\n [class.text-[var(--libs-ui-color-light-1)]]=\"adjustSelected() !== undefined\"></i>\n <i class=\"libs-ui-icon-move-right rotate-90 text-[#6a7383] text-[16px] ml-[4px]\"></i>\n </div>\n }\n </libs_ui-components-dropdown>\n </libs_ui-components-popover>\n </div>\n }\n @if (option.type === 'indentIncrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_increase', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"+1\"></button>\n </div>\n }\n @if (option.type === 'indentDecrease') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_indent_decrease', zIndex: zIndex() }\"\n class=\"ql-indent\"\n value=\"-1\"></button>\n </div>\n }\n @if (option.type === 'direction') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_direction', zIndex: zIndex() }\"\n class=\"ql-direction\"\n value=\"rtl\"></button>\n </div>\n }\n @if (option.type === 'listBulleted') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_bulleted', zIndex: zIndex() }\"\n class=\"ql-list ql-bullet\"\n value=\"bullet\"></button>\n </div>\n }\n @if (option.type === 'listNumbered') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-ordered\"\n value=\"ordered\"></button>\n </div>\n }\n @if (option.type === 'listChecked') {\n <div\n [class]=\"option.classInclude || 'mx-[8px]'\"\n [class.ql-active]=\"listCheckboxSelected()\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_list_numbered', zIndex: zIndex() }\"\n class=\"ql-list ql-check\"\n value=\"check\"></button>\n </div>\n }\n @if (option.type === 'personalize' && templateToolBarPersonalize(); as templateToolBarPersonalize) {\n <div class=\"flex items-center {{ option.classInclude || 'mx-[8px]' }}\">\n <ng-container *ngTemplateOutlet=\"templateToolBarPersonalize\"></ng-container>\n </div>\n }\n @if (option.type === 'blockquote') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_quote', zIndex: zIndex() }\"\n class=\"ql-blockquote\"></button>\n </div>\n }\n @if (option.type === 'link') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_insert_link', zIndex: zIndex() }\"\n class=\"ql-link\"></button>\n </div>\n }\n @if (option.type === 'unLink') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_unlink', zIndex: zIndex() }\"\n class=\"ql-unLink\"\n (click)=\"handlerUnlink($event)\"></button>\n </div>\n }\n @if (option.type === 'image') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_image', zIndex: zIndex() }\"\n class=\"ql-image\"></button>\n </div>\n }\n @if (option.type === 'video') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_video', zIndex: zIndex() }\"\n class=\"ql-video\"></button>\n </div>\n }\n @if (option.type === 'emoji') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <libs_ui-components-emoji\n [zIndex]=\"zIndex()\"\n [isNgContent]=\"true\"\n (outEventEmoji)=\"handlerInsertEmoji($event)\">\n <button class=\"ql-emoji\"></button>\n </libs_ui-components-emoji>\n </div>\n }\n @if (option.type === 'table') {\n <div [class]=\"option.classInclude || 'mx-[8px]'\">\n <button\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: 'i18n_table', zIndex: zIndex() }\"\n class=\"ql-table\"></button>\n </div>\n }\n @if (option.type === 'line') {\n <div class=\"w-[1px] h-[16px] libs-ui-border-right-general\"></div>\n }\n</ng-template>\n\n<libs_ui-components-popover\n #inputLinkRef\n [mode]=\"'click'\"\n [ignoreHiddenPopoverContentWhenMouseLeave]=\"true\"\n [config]=\"{ template: viewLink, whiteTheme: true, ignoreArrow: true, zIndex: zIndex() }\"\n (outEvent)=\"handlerPopoverEvent($event)\" />\n\n<ng-template #viewLink>\n <div class=\"flex justify-between items-center px-[16px] py-[8px] rounded-[8px]\">\n <div\n class=\"w-full min-w-0 libs-ui-font-h5r\"\n [type]=\"'text'\"\n LibsUiComponentsPopoverDirective\n [config]=\"{ content: link().url, zIndex: zIndex() + 1 }\">\n {{ link().url }}\n </div>\n <div class=\"flex items-center ml-[16px]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-edit-line'\"\n [classInclude]=\"'!p-0'\"\n (outClick)=\"handlerEditLink($event)\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [classInclude]=\"'!p-0 ml-[12px]'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-link-broken'\"\n (outClick)=\"handlerUnlink($event)\" />\n </div>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";:host ::ng-deep .quill-container .ql-container{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400}:host ::ng-deep .quill-container .ql-container .ql-editor{font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;height:auto;min-height:100%;resize:var(--resize)}:host ::ng-deep .quill-container .ql-container .ql-editor ol li:before{content:\"\"!important}:host ::ng-deep .quill-container .ql-container .ql-blank:before{font-style:normal!important;font-size:12px!important;color:#9ca2ad!important;font-family:var(--libs-ui-font-family-name),arial!important}:host ::ng-deep .quill-container .ql-active span:before{color:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-active .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-script :hover .ql-fill{fill:var(--libs-ui-color-light-1)!important}:host ::ng-deep .quill-container .ql-toolbar{padding:0!important;border:none!important}:host ::ng-deep .quill-container .ql-toolbar button{padding:0!important;height:16px!important;width:16px!important}:host ::ng-deep .quill-container .ql-tooltip{display:none!important}:host ::ng-deep .quill-container #editor-resizer .toolbar{top:0!important;left:0!important;transform:none!important;font-family:var(--libs-ui-font-family-name),\"Arial\"!important;font-weight:400;font-size:12px}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-text-active{color:var(--color-selected)!important}:host ::ng-deep .quill-container .libs-ui-icon-editor-color-background-active{color:var(--background-selected)!important}:host ::ng-deep .quill-container .ql-snow .ql-picker{font-size:12px!important;height:32px;float:none;width:auto}:host ::ng-deep .selected-cell{background-color:#0096ff4d}\n"] }]
787
875
  }], ctorParameters: () => [] });
788
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwyeC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3F1aWxsL3NyYy9xdWlsbDJ4LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcXVpbGwvc3JjL3F1aWxsMnguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFnQixRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUMxUCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsMkNBQTJDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RyxPQUFPLEVBQWtCLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEYsT0FBTyxFQUFrQyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVILE9BQU8sRUFBZ0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRixPQUFPLEVBQUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcs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QUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVc7SUFFWCxXQUFXO1FBQ1QsWUFBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDdEMsWUFBWSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO3dHQTd6QlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0MsNnJKQ3JEbkQsODNpQkF1Y0EsZ3VERGphSSxPQUFPLDBFQUNQLGVBQWUsNEZBQ2YsZ0JBQWdCLG9KQUNoQixpQ0FBaUMsaTFEQUNqQyxzQ0FBc0Msc2pCQUN0QyxpQ0FBaUMsNEZBQ2pDLHNDQUFzQyw2U0FDdEMsOEJBQThCLHFQQUM5QixnQ0FBZ0Msb2dCQUNoQyxvQ0FBb0MsczFEQUNwQywyQ0FBMkMsMFBBQzNDLDhCQUE4Qiw0cUJBQzlCLHNDQUFzQzs7NEZBRzdCLHNDQUFzQztrQkF2QmxELFNBQVM7K0JBRUUsbUNBQW1DLGNBQ2pDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUd0Qzt3QkFDUCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixpQ0FBaUM7d0JBQ2pDLHNDQUFzQzt3QkFDdEMsaUNBQWlDO3dCQUNqQyxzQ0FBc0M7d0JBQ3RDLDhCQUE4Qjt3QkFDOUIsZ0NBQWdDO3dCQUNoQyxvQ0FBb0M7d0JBQ3BDLDJDQUEyQzt3QkFDM0MsOEJBQThCO3dCQUM5QixzQ0FBc0M7cUJBQ3ZDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25EZXN0cm95LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCBUZW1wbGF0ZVJlZiwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIFdyaXRhYmxlU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTZWxlY3RDb2xvckNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3QtY29sb3InO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtZW1vamknO1xuaW1wb3J0IHsgSUZvY3VzQW5kQmx1ckV2ZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtaW5wdXQnO1xuaW1wb3J0IHsgSU1lbnRpb25Db25maWcsIElNZW50aW9uSW5zZXJ0LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLW1lbnRpb24nO1xuaW1wb3J0IHsgSVZhbGlkTGVuZ3RoLCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgSUxhYmVsLCBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxhYmVsJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCwgVFlQRV9QT1BPVkVSX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1zY3JvbGwtb3ZlcmxheSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLXNrZWxldG9uJztcbmltcG9ydCB7IFRZUEVfT0JKRUNULCBUWVBFX1RFTVBMQVRFX1JFRiB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1keW5hbWljLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IEVSUk9SX01FU1NBR0VfRU1QVFlfVkFMSUQsIEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCwgRVJST1JfTUVTU0FHRV9NSU5fTEVOR1RILCBnZXQsIGdldExhYmVsQnlTaXplRmlsZSwgaXNOaWwsIHBhdHRlcm5VcmwsIHNldCwgVXRpbHNLZXlDb2RlQ29uc3RhbnQsIHhzc0ZpbHRlciB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IFF1aWxsLCB7IFN0cmluZ01hcCB9IGZyb20gJ3F1aWxsJztcbmltcG9ydCBRdWlsbDJ4LCB7IERlbHRhLCBFbWl0dGVyU291cmNlLCBSYW5nZSB9IGZyb20gJ3F1aWxsMngnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBsYXN0VmFsdWVGcm9tLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVFlQRV9NT0RFX0JBUl9DT05GSUdfT1BUSU9OIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3F1aWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUXVpbGwyeEJsb3RSZWdpc3RlciwgSVF1aWxsMnhDdXN0b21Db25maWcsIElRdWlsbDJ4RnVuY3Rpb25Db250cm9sRXZlbnQsIElRdWlsbDJ4TGluaywgSVF1aWxsMnhTZWxlY3Rpb25DaGFuZ2UsIElRdWlsbDJ4VGV4dENoYW5nZSwgSVF1aWxsMnhUb29sYmFyQ29uZmlnLCBJUXVpbGwyeFVwbG9hZEltYWdlQ29uZmlnIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3F1aWxsMnguaW50ZXJmYWNlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbExpbmtDb21wb25lbnQgfSBmcm9tICcuL2xpbmsvbGluay5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsVXBsb2FkSW1hZ2VDb21wb25lbnQgfSBmcm9tICcuL3VwbG9hZC1pbWFnZS91cGxvYWQtaW1hZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IGxpbmtEZWZhdWx0LCBsaXN0Q29uZmlnQWxpZ24sIGxpc3RDb25maWdGb250LCBsaXN0Q29uZmlnSGVhZGVyLCBsaXN0Rm9udCwgdG9vbEJhck9wdGlvbnMsIHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gJy4vdXRpbHMvcXVpbGwuZGVmaW5lJztcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHRNZW51T3B0aW9uVGFibGUsIGNyZWF0ZVRhYmxlU2VsZWN0b3IsIGVuYWJsZVRhYmxlU2VsZWN0aW9uLCBnZXRBbGxUYWJsZXNXaXRoU3BhbiwgcmVnaXN0ZXJRdWlsbDJ4IH0gZnJvbSAnLi91dGlscy9xdWlsbDJ4LmRlZmluZSc7XG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXF1aWxsMngnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL3F1aWxsMnguY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vcXVpbGwyeC5jb21wb25lbnQuc2NzcycsXG4gIGltcG9ydHM6IFtcbiAgICBOZ1N0eWxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzU2tlbGV0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1Njcm9sbE92ZXJsYXlEaXJlY3RpdmUsXG4gICAgTGlic1VpQ29tcG9uZW50c0Vtb2ppQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzQnV0dG9uc1NlbGVjdENvbG9yQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNMYWJlbENvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzTWVudGlvbkRpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsMnhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8vcmVnaW9uIFByaXZhdGVcbiAgcHJpdmF0ZSBxdWlsbD86IFF1aWxsMng7XG4gIHByaXZhdGUgYWRkRWRpdExpbmtDb21wb25lbnRSZWYgPSBzaWduYWw8Q29tcG9uZW50UmVmPExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbExpbmtDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHVwbG9hZEltYWdlQ29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudD4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgaGFuZGxlcnMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgKC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IHZvaWQ+Pih7XG4gICAgbGluazogdGhpcy5oYW5kbGVTaG93VXBsb2FkTGluay5iaW5kKHRoaXMpLFxuICAgIHVuZG86IHRoaXMuaGFuZGxlVW5kby5iaW5kKHRoaXMpLFxuICAgIHJlZG86IHRoaXMuaGFuZGxlUmVkby5iaW5kKHRoaXMpLFxuICAgIHRhYmxlOiB0aGlzLmhhbmRsZVRhYmxlLmJpbmQodGhpcyksXG4gICAgaW1hZ2U6IHRoaXMuaGFuZGxlclNob3dVcGxvYWRJbWFnZS5iaW5kKHRoaXMpLFxuICB9KTtcbiAgcHJpdmF0ZSB0aW1lclNldEZvbnRTaXplID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0aW1lckNhbGN1bGF0b3JUb29sYmFyID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0b3RhbFJlY2FsbENhbGN1bGF0b3JUb29sYmFyID0gc2lnbmFsPG51bWJlcj4oMCk7XG4gIHByaXZhdGUgaXNDYWxjdWxhdG9yVG9vbGJhclN1Y2Nlc3MgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHNob3dNZW50aW9uID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgLy9lbmRyZWdpb25cblxuICAvL3JlZ2lvbiBQcm90ZWN0ZWRcbiAgcHJvdGVjdGVkIGJvcmRlckNvbG9yID0gY29tcHV0ZWQ8c3RyaW5nPigoKSA9PiAodGhpcy5tZXNzYWdlRXJyb3IoKSAmJiB0aGlzLnNob3dFcnJvckJvcmRlcigpID8gJyAhYm9yZGVyLVt2YXIoLS1saWJzLXVpLWNvbG9yLWJvcmRlci1lcnJvciwjZWUyZDQxKV0gJyA6ICchYm9yZGVyLVsjZTVlN2ViXSAnKSk7XG4gIHByb3RlY3RlZCBjb250YWluZXJDbGFzcyA9IGNvbXB1dGVkKCgpID0+IGBxdWlsbC1jb250YWluZXIgZmxleCBmbGV4LWNvbCBoLWZ1bGwgdy1mdWxsICR7Z2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ2NsYXNzQ29udGFpbmVyJykgfHwgJyd9YCk7XG4gIHByb3RlY3RlZCBjb250YWluZXJUb29sYmFyQ2xhc3MgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgYGJvcmRlci10IGJvcmRlci1sIGJvcmRlci1yICR7dGhpcy5ib3JkZXJDb2xvcigpfXJvdW5kZWQtdC1bNHB4XSAke3RoaXMucmVhZG9ubHkoKSA/ICcgbGlicy11aS1yZWFkb25seS1iYWNrZ3JvdW5kIGN1cnNvci1kZWZhdWx0IHBvaW50ZXItZXZlbnRzLW5vbmUgICcgOiAnICd9ICR7Z2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ3Rvb2xiYXIuY2xhc3NDdXN0b21Db250YWluZXJUb29sYmFyJykgfHwgJyd9ICR7Z2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ3Rvb2xiYXIucG9zaXRpb25GaXhlZCcpID8gJyBmaXhlZCAnIDogJyAnfWBcbiAgKTtcbiAgcHJvdGVjdGVkIGNvbnRhaW5lckVkaXRvckNsYXNzID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIGBoLWZ1bGwgIWJvcmRlciAke3RoaXMuYm9yZGVyQ29sb3IoKX0gIXJvdW5kZWQtYi1bNHB4XSAke3RoaXMucmVhZG9ubHkoKSA/ICcgbGlicy11aS1yZWFkb25seS1iYWNrZ3JvdW5kICcgOiAnICd9ICR7Z2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ2VkaXRvci5jbGFzc0N1c3RvbUNvbnRhaW5lckVkaXRvcicpIHx8ICcnfSAke2dldCh0aGlzLnF1aWxsQ3VzdG9tQ29uZmlnKCkgYXMgSVF1aWxsMnhDdXN0b21Db25maWcsICd0b29sYmFyLnBvc2l0aW9uRml4ZWQnKSA/ICcgcm91bmRlZC10LVs0cHhdICcgOiAnICd9YFxuICApO1xuXG4gIHByb3RlY3RlZCBzaG93QnV0dG9uTW9yZVRvb2xiYXIgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnKCkuc29tZSgoaXRlbSkgPT4gaXRlbS5kaXNwbGF5ID09PSBmYWxzZSkpO1xuICBwcm90ZWN0ZWQgZGlzcGxheVNrZWxldG9uVG9vbGJhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcoKS5ldmVyeSgoaXRlbSkgPT4gaXRlbS5kaXNwbGF5ID09PSB1bmRlZmluZWQpKTtcblxuICBwcm90ZWN0ZWQgbGFiZWxGb250U2VsZWN0ZWRDb21wdXRlZCA9IGNvbXB1dGVkKCgpID0+IGdldDx1bmtub3duPih0aGlzLmZvbnRTZWxlY3RlZCgpLCAnaXRlbS5sYWJlbCcpIHx8ICdTYW5zIFNlcmlmJyk7XG4gIHByb3RlY3RlZCBmb250U2VsZWN0ZWQgPSBzaWduYWw8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnRm9udCA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGxpc3RDb25maWdGb250KCkpO1xuXG4gIHByb3RlY3RlZCBsaXN0Q29uZmlnSGVhZGVyID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4obGlzdENvbmZpZ0hlYWRlcigpKTtcbiAgcHJvdGVjdGVkIGhlYWRlclNlbGVjdGVkID0gc2lnbmFsPElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGFiZWxIZWFkZXJTZWxlY3RlZENvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gZ2V0PHVua25vd24+KHRoaXMuaGVhZGVyU2VsZWN0ZWQoKSwgJ2l0ZW0ubGFiZWwnKSB8fCAnTm9ybWFsJyk7XG5cbiAgcHJvdGVjdGVkIGxpc3RDb25maWdBbGlnbiA9IHNpZ25hbDxJTGlzdENvbmZpZ0l0ZW0+KGxpc3RDb25maWdBbGlnbigpKTtcbiAgcHJvdGVjdGVkIGFsaWduU2VsZWN0ZWQgPSBzaWduYWw8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpY29uQWxpZ25TZWxlY3RlZENvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gZ2V0KHRoaXMuYWxpZ25TZWxlY3RlZCgpIGFzIHVua25vd24sICdpdGVtLmljb24nKSk7XG5cbiAgcHJvdGVjdGVkIGNvbG9yU2VsZWN0ZWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgYmFja2dyb3VuZFNlbGVjdGVkID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgbWVzc2FnZUVycm9yID0gc2lnbmFsPHN0cmluZz4oJycpO1xuICBwcm90ZWN0ZWQgZm9udFNpemUgPSBzaWduYWw8eyB2YWx1ZTogbnVtYmVyIH0+KHsgdmFsdWU6IDE0IH0pO1xuICBwcm90ZWN0ZWQgbGluayA9IHNpZ25hbDxJUXVpbGwyeExpbms+KGxpbmtEZWZhdWx0KCkpO1xuXG4gIHByb3RlY3RlZCBzaG93TW9yZUFjdGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCB0b29sYmFyT3B0aW9uc0NvbmZpZzogV3JpdGFibGVTaWduYWw8QXJyYXk8SVF1aWxsMnhUb29sYmFyQ29uZmlnPj4gPSBzaWduYWwoW10pO1xuXG4gIHByb3RlY3RlZCBsb2FkaW5nVXBsb2FkSW1hZ2UgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB1cGxvYWRJbWFnZUNvbmZpZyA9IGlucHV0PElRdWlsbDJ4VXBsb2FkSW1hZ2VDb25maWcsIElRdWlsbDJ4VXBsb2FkSW1hZ2VDb25maWcgfCB1bmRlZmluZWQ+KHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCgpLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCB1cGxvYWRJbWFnZUNvbmZpZ0RlZmF1bHQoKSB9KTtcblxuICAvL3JlZ2lvbiBJbnB1dHNcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2kxOG5faW1wb3J0X2NvbnRlbnQnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnaTE4bl9pbXBvcnRfY29udGVudCcgfSk7XG4gIHJlYWRvbmx5IGJsb3RzUmVnaXN0ZXIgPSBpbnB1dDxBcnJheTxJUXVpbGwyeEJsb3RSZWdpc3Rlcj4+KCk7XG4gIHJlYWRvbmx5IHJlYWRvbmx5ID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBxdWlsbEN1c3RvbUNvbmZpZyA9IGlucHV0PElRdWlsbDJ4Q3VzdG9tQ29uZmlnPigpO1xuXG4gIHJlYWRvbmx5IGxhYmVsID0gaW5wdXQ8SUxhYmVsIHwgdW5kZWZpbmVkPigpO1xuICByZWFkb25seSBpdGVtID0gbW9kZWwucmVxdWlyZWQ8VFlQRV9PQkpFQ1Q+KCk7XG4gIHJlYWRvbmx5IGZpZWxkQmluZCA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgYXV0b1VwZGF0ZVZhbHVlV2hlblRleHRDaGFuZ2UgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGRhdGFDb25maWdNZW50aW9uID0gaW5wdXQ8SU1lbnRpb25Db25maWc+KCk7XG4gIHJlYWRvbmx5IHRlbXBsYXRlVG9vbEJhclBlcnNvbmFsaXplID0gaW5wdXQ8VGVtcGxhdGVSZWY8VFlQRV9URU1QTEFURV9SRUY+PigpO1xuXG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxMjUwLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAxMjUwIH0pO1xuICByZWFkb25seSBpZ25vcmVTaG93UG9wdXBFZGl0TGluayA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUNvbW11bmljYXRlTWljcm9FdmVudFBvcHVwID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaGFuZGxlcnNFeHBhbmQgPSBpbnB1dDxBcnJheTx7IHRpdGxlOiBzdHJpbmc7IGFjdGlvbjogKCkgPT4gdm9pZCB9Pj4oKTtcbiAgcmVhZG9ubHkgcmVzaXplSW1hZ2VQbHVnaW4gPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IGZvbnRTaXplRGVmYXVsdCA9IGlucHV0PG51bWJlciwgbnVtYmVyIHwgdW5kZWZpbmVkPigxNCwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gMTQgfSk7XG4gIHJlYWRvbmx5IGhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSByZXNpemUgPSBpbnB1dDwndmVydGljYWwnIHwgJ25vbmUnLCAndmVydGljYWwnIHwgJ25vbmUnIHwgdW5kZWZpbmVkPignbm9uZScsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/ICdub25lJyB9KTtcbiAgcmVhZG9ubHkgYXV0b0ZvY3VzID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgZm9jdXNCb3R0b20gPSBpbnB1dDxib29sZWFuPigpO1xuXG4gIHJlYWRvbmx5IHZhbGlkUmVxdWlyZWQgPSBpbnB1dDxJVmFsaWRSZXF1aXJlZD4oKTtcbiAgcmVhZG9ubHkgdmFsaWRNaW5MZW5ndGggPSBpbnB1dDxJVmFsaWRMZW5ndGg+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWF4TGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSBzaG93RXJyb3JMYWJlbCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsKSA9PiB2YWwgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yQm9yZGVyID0gaW5wdXQ8Ym9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSk7XG5cbiAgLy9lbmRyZWdpb25cblxuICAvL3JlZ2lvbiBPdXRwdXRzXG4gIHJlYWRvbmx5IG91dFNob3dQb3B1cEVkaXRMaW5rID0gb3V0cHV0PHtcbiAgICBkYXRhTGluazogSVF1aWxsMnhMaW5rO1xuICAgIGNhbGxiYWNrOiAobGlua0VkaXQ6IHsgdGl0bGU6IHN0cmluZzsgbGluazogc3RyaW5nIH0pID0+IFByb21pc2U8dm9pZD47XG4gIH0+KCk7XG4gIHJlYWRvbmx5IG91dE1lc3NhZ2VFcnJvciA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IG91dEJsdXIgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0Rm9jdXMgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0U2VsZWN0aW9uQ2hhbmdlID0gb3V0cHV0PElRdWlsbDJ4U2VsZWN0aW9uQ2hhbmdlPigpO1xuICByZWFkb25seSBvdXRUZXh0Q2hhbmdlID0gb3V0cHV0PElRdWlsbDJ4VGV4dENoYW5nZT4oKTtcbiAgcmVhZG9ubHkgb3V0Q29udGV4dE1lbnUgPSBvdXRwdXQ8TW91c2VFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25zQ29udHJvbCA9IG91dHB1dDxJUXVpbGwyeEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuICAvL2VuZHJlZ2lvblxuXG4gIC8vcmVnaW9uIFZpZXdDaGlsZFxuICBwcml2YXRlIHJlYWRvbmx5IGh0bWxDb250YWluZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdodG1sQ29udGFpbmVyJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcXVpbGxCb2R5Q29udGFpbmVyID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+Pignc25vd0NvbnRhaW5lcicpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvb2xiYXJDb250YWluZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCd0b29sYmFyQ29udGFpbmVyJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRMaW5rUmVmID0gdmlld0NoaWxkLnJlcXVpcmVkPExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50PignaW5wdXRMaW5rUmVmJyk7XG4gIC8vZW5kcmVnaW9uXG5cbiAgLy9yZWdpb24gSW5qZWN0XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtaWNDb21wb25lbnRTZXJ2aWNlID0gaW5qZWN0KExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlKTtcbiAgLy9lbmRyZWdpb25cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZm9udFNpemVEZWZhdWx0KCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmZvbnRTaXplLnNldCh7IHZhbHVlOiB0aGlzLmZvbnRTaXplRGVmYXVsdCgpIH0pO1xuICAgICAgICAgIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlRm9udFNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRFZGl0b3IgPSB0aGlzLnF1aWxsQm9keUNvbnRhaW5lcigpLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtZWRpdG9yJyk/LlswXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICBpZiAoZWxlbWVudEVkaXRvcikge1xuICAgICAgICAgICAgZWxlbWVudEVkaXRvci5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0KCl9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ3Rvb2xiYXIudHlwZScsICdkZWZhdWx0JykgYXMgVFlQRV9NT0RFX0JBUl9DT05GSUdfT1BUSU9OO1xuICAgIGNvbnN0IGhhc0ljb25JbWFnZSA9IHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5zaG93SWNvbiA/PyBmYWxzZTtcbiAgICBjb25zdCBoYXNJY29uUGVyc29uYWxpemUgPSAhIXRoaXMudGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUoKTtcbiAgICB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnLnNldChnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAndG9vbGJhci5vcHRpb25zJywgdG9vbEJhck9wdGlvbnModHlwZSwgaGFzSWNvbkltYWdlLCBoYXNJY29uUGVyc29uYWxpemUpKSk7XG5cbiAgICB0aGlzLmNhbGN1bGF0b3JUb29sYmFyKCk7XG4gICAgcmVnaXN0ZXJRdWlsbDJ4KCk7XG4gICAgdGhpcy5ibG90c1JlZ2lzdGVyKCk/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIFF1aWxsMngucmVnaXN0ZXIoaXRlbS5jb21wb25lbnQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVIYW5kbGVyRnVuY3Rpb24oKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgdGhlbWU6ICdzbm93JyxcbiAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRoaXMucGxhY2Vob2xkZXIoKSksXG4gICAgICByZWFkT25seTogdGhpcy5yZWFkb25seSgpLFxuICAgICAgbW9kdWxlczoge1xuICAgICAgICB0b29sYmFyOiB7XG4gICAgICAgICAgY29udGFpbmVyOiB0aGlzLnRvb2xiYXJDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIGhhbmRsZXJzOiB0aGlzLmhhbmRsZXJzKCksXG4gICAgICAgIH0sXG4gICAgICAgIHJlc2l6ZTogdGhpcy5yZXNpemVJbWFnZVBsdWdpbigpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGxvY2FsZToge1xuICAgICAgICAgICAgICAgIGFsdFRpcDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9rZWVwX2FsdF9rZXlfdG9fY2hhbmdlX3RoZV9yYXRpb193aGVuX2NoYW5naW5nX3RoZV9zaXplJyksXG4gICAgICAgICAgICAgICAgaW5wdXRUaXA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5fcHJlc3NfZW50ZXJfdG9fY29uZmlybScpLFxuICAgICAgICAgICAgICAgIGZsb2F0TGVmdDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9sZWZ0X2FsaWduJyksXG4gICAgICAgICAgICAgICAgZmxvYXRSaWdodDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9yaWdodF9hbGlnbicpLFxuICAgICAgICAgICAgICAgIGNlbnRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9jZW50ZXJfYWxpZ24nKSxcbiAgICAgICAgICAgICAgICByZXN0b3JlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX3Jlc3RvcmVfdG9fZGVmYXVsdCcpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB0YWJsZTogdHJ1ZSxcbiAgICAgICAgY2xpcGJvYXJkOiB7XG4gICAgICAgICAgbWF0Y2hlcnM6IFtbTm9kZS5URVhUX05PREUsIChub2RlOiB7IGRhdGE6IHN0cmluZyB9KSA9PiBuZXcgRGVsdGEoKS5pbnNlcnQobm9kZS5kYXRhKV1dLFxuICAgICAgICB9LFxuICAgICAgICBrZXlib2FyZDoge1xuICAgICAgICAgIGJpbmRpbmdzOiB7XG4gICAgICAgICAgICBiYWNrc3BhY2U6IHtcbiAgICAgICAgICAgICAga2V5OiBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IChyYW5nZTogUmFuZ2UpID0+IHRoaXMubm9QcmV2ZW50RW1iZWREZWxldGlvbihyYW5nZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICAgIGtleTogVXRpbHNLZXlDb2RlQ29uc3RhbnQuREVMRVRFLFxuICAgICAgICAgICAgICBoYW5kbGVyOiAocmFuZ2U6IFJhbmdlKSA9PiB0aGlzLm5vUHJldmVudEVtYmVkRGVsZXRpb24ocmFuZ2UpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgICAgIGtleTogMTMsXG4gICAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+ICh0aGlzLnNob3dNZW50aW9uKCkgPyBmYWxzZSA6IHRydWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgZGVsYXk6IDIwMDAsXG4gICAgICAgICAgbWF4U3RhY2s6IDUwMCxcbiAgICAgICAgICB1c2VyT25seTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSBhcyBjb25zdDtcblxuICAgIHRoaXMucXVpbGwgPSBuZXcgUXVpbGwyeCh0aGlzLnF1aWxsQm9keUNvbnRhaW5lcigpLm5hdGl2ZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCk/Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHRoaXMub3V0Q29udGV4dE1lbnUuZW1pdChlKSk7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jYWxjdWxhdG9yVG9vbGJhcih0cnVlKSk7XG4gICAgdGhpcy5oYW5kbGVyVGV4dENoYW5nZSgpO1xuICAgIHRoaXMuaGFuZGxlclNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIHRoaXMuaGFuZGxlclBhc3RlKCk7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICBhd2FpdCB0aGlzLnNldENvbnRlbnQodGhpcy5pdGVtKClbdGhpcy5maWVsZEJpbmQoKV0gYXMgc3RyaW5nKTtcbiAgICB0aGlzLnNldFN0eWxlRm9yQ29udGVudCgpO1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cygpKSB7XG4gICAgICB0aW1lcigxMDAwKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvY3VzKCkpO1xuICAgIH1cbiAgICBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlKHRoaXMucXVpbGwgYXMgUXVpbGwyeCwgdGhpcy50cmFuc2xhdGUpO1xuICAgIGVuYWJsZVRhYmxlU2VsZWN0aW9uKHRoaXMucXVpbGwucm9vdCk7XG4gICAgZ2V0QWxsVGFibGVzV2l0aFNwYW4odGhpcy5xdWlsbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVF1aWxsMnhGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1aWxsOiAoKSA9PiB0aGlzLnF1aWxsIGFzIFF1aWxsMngsXG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSxcbiAgICAgIHJlZnJlc2hJdGVtVmFsdWU6IHRoaXMudXBkYXRlVmFsdWVCeVJvb3RRdWlsbEh0bWwuYmluZCh0aGlzKSxcbiAgICAgIHNldENvbnRlbnQ6IHRoaXMuc2V0Q29udGVudC5iaW5kKHRoaXMpLFxuICAgICAgaW5zZXJ0VGV4dDogdGhpcy5pbnNlcnRUZXh0LmJpbmQodGhpcyksXG4gICAgICBpbnNlcnRMaW5rOiB0aGlzLmluc2VydExpbmsuYmluZCh0aGlzKSxcbiAgICAgIGluc2VydEltYWdlOiB0aGlzLmluc2VydEltYWdlLmJpbmQodGhpcyksXG4gICAgICBzZXRGb250U2l6ZTogYXN5bmMgKHNpemU6IG51bWJlcikgPT4gdGhpcy5xdWlsbD8uZm9ybWF0KCdzaXplJywgYCR7c2l6ZX1weGApLFxuICAgICAgc2V0Q29sb3I6IGFzeW5jIChjb2xvcjogc3RyaW5nKSA9PiB0aGlzLnF1aWxsPy5mb3JtYXQoJ2NvbG9yJywgY29sb3IpLFxuICAgICAgc2V0QmFja2dyb3VuZDogYXN5bmMgKGNvbG9yOiBzdHJpbmcpID0+IHRoaXMucXVpbGw/LmZvcm1hdCgnYmFja2dyb3VuZCcsIGNvbG9yKSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogYXN5bmMgKG1lc3NhZ2U6IHN0cmluZykgPT4gdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KG1lc3NhZ2UpLFxuICAgICAgcmVDYWxjdWxhdG9yVG9vbGJhcjogYXN5bmMgKCkgPT4gdGhpcy5jYWxjdWxhdG9yVG9vbGJhcih0cnVlKSxcbiAgICB9O1xuICB9XG5cbiAgLy9yZWdpb24gaGFuZGxlciBFdmVudCBIVE1MXG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTaG93TW9yZUFjdGlvbihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNob3dNb3JlQWN0aW9uLnVwZGF0ZSgoc2hvd01vcmVBY3Rpb24pID0+ICFzaG93TW9yZUFjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU2VsZWN0Rm9udChldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmZvbnRTZWxlY3RlZC5zZXQoZXZlbnQpO1xuICAgIHRoaXMucXVpbGw/LmZvcm1hdCgnZm9udCcsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3RIZWFkZXIoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5oZWFkZXJTZWxlY3RlZC5zZXQoZXZlbnQpO1xuICAgIHRoaXMucXVpbGw/LmZvcm1hdCgnaGVhZGVyJywgZXZlbnQ/LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJWYWx1ZUNoYW5nZUZvbnRTaXplKGV2ZW50PzogSUZvY3VzQW5kQmx1ckV2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudD8ubmFtZSA9PT0gJ2JsdXInKSB7XG4gICAgICB0aGlzLnF1aWxsPy5mb3JtYXQoJ3NpemUnLCBgJHt0aGlzLmZvbnRTaXplKCkudmFsdWV9cHhgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU2VsZWN0QWxpZ24oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hbGlnblNlbGVjdGVkLnNldChldmVudCk7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0KCdhbGlnbicsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2V0Rm9ybWF0KHR5cGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0KHR5cGUsIGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnNlcnRFbW9qaShlbW9qaTogdW5rbm93bikge1xuICAgIHRoaXMuaW5zZXJ0VGV4dChlbW9qaSBhcyBzdHJpbmcsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclVubGluayhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5saW5rKCk7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0VGV4dChsaW5rLnJhbmdlLmluZGV4LCBsaW5rLnJhbmdlLmxlbmd0aCwgeyBsaW5rOiBmYWxzZSB9KTtcbiAgICB0aGlzLmlucHV0TGlua1JlZigpLkZ1bmN0aW9uc0NvbnRyb2w/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVkaXRMaW5rKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmxpbmsoKTtcbiAgICBpZiAodGhpcy5pZ25vcmVTaG93UG9wdXBFZGl0TGluaygpKSB7XG4gICAgICB0aGlzLm91dFNob3dQb3B1cEVkaXRMaW5rLmVtaXQoe1xuICAgICAgICBkYXRhTGluazogbGluayxcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jIChsaW5rRWRpdDogeyB0aXRsZTogc3RyaW5nOyBsaW5rOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChsaW5rIGluc3RhbmNlb2YgT2JqZWN0ICYmIGxpbmsudXJsKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWxsPy5kZWxldGVUZXh0KGxpbmsucmFuZ2UuaW5kZXgsIGxpbmsucmFuZ2UubGVuZ3RoLCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICAgICAgICAgICAgdGhpcy5xdWlsbD8uaW5zZXJ0VGV4dChsaW5rLnJhbmdlLmluZGV4LCBsaW5rRWRpdC50aXRsZSwgJ2xpbmsnLCBsaW5rRWRpdC5saW5rKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbnNlcnRMaW5rKGxpbmtFZGl0LnRpdGxlLCBsaW5rRWRpdC5saW5rKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZVNob3dVcGxvYWRMaW5rKGxpbmspO1xuICAgIHRoaXMuaW5wdXRMaW5rUmVmKCkuRnVuY3Rpb25zQ29udHJvbD8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVUb2dnbGVNZW50aW9uKHNob3c6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNob3dNZW50aW9uLnNldChzaG93KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVySW5zZXJ0TWVudGlvbihkYXRhOiBJTWVudGlvbkluc2VydCkge1xuICAgIHRoaXMuaW5zZXJ0TWVudGlvbihkYXRhKTtcbiAgfVxuXG4gIC8vZW5kcmVnaW9uXG5cbiAgLy9yZWdpb24gUHJpdmF0ZSBNZXRob2RcblxuICAvL3JlZ2lvbiBRdWlsbCBNZXRob2RzXG4gIHByaXZhdGUgaGFuZGxlVGFibGUoKSB7XG4gICAgY29uc3QgYnV0dG9uID0gdGhpcy5odG1sQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yPy4oJ2J1dHRvbi5xbC10YWJsZScpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBjcmVhdGVUYWJsZVNlbGVjdG9yKHRoaXMucXVpbGwgYXMgUXVpbGwyeCwgYnV0dG9uLCB0aGlzLnRyYW5zbGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVVuZG8oKSB7XG4gICAgdGhpcy5xdWlsbD8uaGlzdG9yeT8udW5kbygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZWRvKCkge1xuICAgIHRoaXMucXVpbGw/Lmhpc3Rvcnk/LnJlZG8oKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNob3dVcGxvYWRJbWFnZSgpIHtcbiAgICBpZiAodGhpcy51cGxvYWRJbWFnZUNvbmZpZygpLm1vZGVDdXN0b20pIHtcbiAgICAgIHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsVXBsb2FkSW1hZ2VDb21wb25lbnQpKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpPy5pbnN0YW5jZTtcbiAgICAgIHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ3VwbG9hZEltYWdlQ29uZmlnJywgdGhpcy51cGxvYWRJbWFnZUNvbmZpZygpKTtcbiAgICAgIHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ2lnbm9yZUNvbW11bmljYXRlTWljcm9FdmVudCcsIHRoaXMuaWdub3JlQ29tbXVuaWNhdGVNaWNyb0V2ZW50UG9wdXAoKSk7XG4gICAgICBpbnN0YW5jZT8ub3V0Q2xvc2Uuc3Vic2NyaWJlKChsaW5rOiBzdHJpbmcgfCB2b2lkKSA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKSk7XG4gICAgICAgIGlmIChsaW5rKSB7XG4gICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShsaW5rKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsICdmaWxlJyk7XG4gICAgaW5wdXQuc2V0QXR0cmlidXRlKCdhY2NlcHQnLCAnaW1hZ2UvKicpO1xuICAgIGlucHV0LmNsaWNrKCk7XG4gICAgaW5wdXQub25jaGFuZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlc0FuZEluc2VydChpbnB1dD8uZmlsZXMpO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydFRleHQoY29udGVudDogc3RyaW5nLCBpbmRleD86IG51bWJlciwgZm9jdXNMYXN0VmFsdWVJbnNlcnQ/OiBib29sZWFuKSB7XG4gICAgaW5kZXggPSBpbmRleCA/PyB0aGlzLnF1aWxsPy5nZXRTZWxlY3Rpb24odHJ1ZSkuaW5kZXg7XG4gICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAgIHRoaXMucXVpbGw/Lmluc2VydFRleHQoaW5kZXgsIGNvbnRlbnQsIFF1aWxsMnguc291cmNlcy5VU0VSKTtcbiAgICAgIGlmIChmb2N1c0xhc3RWYWx1ZUluc2VydCkge1xuICAgICAgICBhd2FpdCBsYXN0VmFsdWVGcm9tKHRpbWVyKDApKTtcbiAgICAgICAgdGhpcy5xdWlsbD8uc2V0U2VsZWN0aW9uKGluZGV4ICsgY29udGVudC5sZW5ndGgsIDAsIFF1aWxsMnguc291cmNlcy5VU0VSKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZXJTZWxlY3Rpb25DaGFuZ2UoKSB7XG4gICAgdGhpcy5xdWlsbD8ub24oJ3NlbGVjdGlvbi1jaGFuZ2UnLCAocmFuZ2U6IFJhbmdlLCBvbGRSYW5nZTogUmFuZ2UsIHNvdXJjZTogRW1pdHRlclNvdXJjZSkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZG9ubHkoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmFuZ2UgPT09IG51bGwgJiYgb2xkUmFuZ2UgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRCbHVyLmVtaXQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhbmdlICE9PSBudWxsICYmIG9sZFJhbmdlID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMub3V0Rm9jdXMuZW1pdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLnF1aWxsPy5nZXRGb3JtYXQoKTtcblxuICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLnNldEZvbnRTaXplU2VsZWN0ZWQoZm9ybWF0KTtcbiAgICAgICAgdGhpcy5zZXRGb250U2VsZWN0ZWQoZm9ybWF0KTtcbiAgICAgICAgdGhpcy5zZXRDb2xvclNlbGVjdGVkKGZvcm1hdCk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dFNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgcXVpbGw6IHRoaXMucXVpbGwgYXMgUXVpbGwyeCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG9sZFJhbmdlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCB8fCAhZm9ybWF0Py5saW5rIHx8IHNvdXJjZSAhPT0gJ3VzZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBhbmNob3JOb2RlID0gc2VsZWN0aW9uPy5hbmNob3JOb2RlO1xuICAgICAgbGV0IGxpbmtOb2RlID0gYW5jaG9yTm9kZSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgIHdoaWxlIChsaW5rTm9kZSAmJiBsaW5rTm9kZS50YWdOYW1lICE9PSAnQScpIHtcbiAgICAgICAgbGlua05vZGUgPSBsaW5rTm9kZS5wYXJlbnROb2RlIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpbmtOb2RlIHx8IGxpbmtOb2RlLnRhZ05hbWUgIT09ICdBJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmtUZXh0ID0gbGlua05vZGUuaW5uZXJUZXh0O1xuICAgICAgY29uc3QgbGlua3NJbmRpY2VzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBsZXQgaW5kZXhSZXR1cm46IG51bWJlciB8IHVuZGVmaW5lZCA9IC0xO1xuICAgICAgd2hpbGUgKCFpc05pbChpbmRleFJldHVybikgJiYgaW5kZXhSZXR1cm4gPCByYW5nZS5pbmRleCkge1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMucXVpbGw/LmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgbGlua0luZGV4ID0gdGV4dENvbnRlbnQ/LmluZGV4T2YobGlua1RleHQsIGxpbmtzSW5kaWNlcy5sZW5ndGggPiAwID8gbGlua3NJbmRpY2VzW2xpbmtzSW5kaWNlcy5sZW5ndGggLSAxXSArIGxpbmtUZXh0Lmxlbmd0aCA6IDApO1xuICAgICAgICBpZiAoIWlzTmlsKGxpbmtJbmRleCkpIHtcbiAgICAgICAgICBpZiAobGlua0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlua3NJbmRpY2VzLnB1c2gobGlua0luZGV4KTtcbiAgICAgICAgICAgIGluZGV4UmV0dXJuID0gbGlua0luZGV4ICsgbGlua1RleHQubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGlua0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgaW5kZXhSZXR1cm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGlua3NJbmRpY2VzICYmIGxpbmtzSW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VJbmRleCA9IGxpbmtzSW5kaWNlc1tsaW5rc0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGNvdW50SW1hZ2UgPSB0aGlzLmFkanVzdEluZGV4Rm9ySW1hZ2VzKHJhbmdlSW5kZXgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxpbmsuc2V0KHtcbiAgICAgICAgICAgIHRpdGxlOiBsaW5rVGV4dCxcbiAgICAgICAgICAgIHVybDogbGlua05vZGUuaHJlZixcbiAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgIGluZGV4OiByYW5nZUluZGV4ICsgY291bnRJbWFnZSxcbiAgICAgICAgICAgICAgbGVuZ3RoOiBsaW5rVGV4dC5sZW5ndGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuaW5wdXRMaW5rUmVmKCkuRnVuY3Rpb25zQ29udHJvbD8uc2hvd1BvcG92ZXIobGlua05vZGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclBhc3RlKCkge1xuICAgIHNldDx1bmtub3duPih0aGlzLnF1aWxsLCAncm9vdC5vbnBhc3RlJywgYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudCB8fCAhZXZlbnQuY2xpcGJvYXJkRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXM7XG4gICAgICBpZiAoIWZpbGVzLmxlbmd0aCkge1xuICAgICAgICBpZiAoZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0JykpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0aW9uV2l0aEVsZW1lbnRTY3JvbGxIZWlnaHRBdXRvKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VzQW5kSW5zZXJ0KGZpbGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclRleHRDaGFuZ2UoKSB7XG4gICAgdGhpcy5xdWlsbD8ub24oJ3RleHQtY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLm91dFRleHRDaGFuZ2UuZW1pdCh7XG4gICAgICAgIHF1aWxsOiB0aGlzLnF1aWxsIGFzIFF1aWxsMngsXG4gICAgICAgIGRlbHRhOiBldmVudCxcbiAgICAgIH0pO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChldmVudD8ub3BzWzFdPy5pbnNlcnQgPT09ICdcXG4nKSB7XG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSB7IGluZGV4OiBldmVudD8ub3BzWzBdLnJldGFpbiBhcyBudW1iZXIgfTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TGVhZiA9IHRoaXMucXVpbGw/LmdldExlYWYocmFuZ2UuaW5kZXgpWzBdIGFzIGFueTtcbiAgICAgICAgICBjb25zdCBuZXh0TGVhZiA9IHRoaXMucXVpbGw/LmdldExlYWYocmFuZ2UuaW5kZXggKyAxKVswXSBhcyBhbnk7XG4gICAgICAgICAgdGhpcy5xdWlsbD8uaW5zZXJ0RW1iZWQocmFuZ2UuaW5kZXgsICdicmVhaycsIHRydWUsICd1c2VyJyk7XG4gICAgICAgICAgaWYgKG5leHRMZWFmID09PSBudWxsIHx8IGN1cnJlbnRMZWFmLnBhcmVudCAhPT0gbmV4dExlYWYucGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLnF1aWxsPy5pbnNlcnRFbWJlZChyYW5nZS5pbmRleCwgJ2JyZWFrJywgdHJ1ZSwgJ3VzZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5xdWlsbD8uc2V0U2VsZWN0aW9uKChyYW5nZS5pbmRleCB8fCAwKSArIDEsIDAsIFF1aWxsMnguc291cmNlcy5TSUxFTlQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghdGhpcy5hdXRvVXBkYXRlVmFsdWVXaGVuVGV4dENoYW5nZSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlVmFsdWVCeVJvb3RRdWlsbEh0bWwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vZW5kcmVnaW9uXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KCcnKTtcbiAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbSgpO1xuICAgIGNvbnN0IGZpZWxkTmFtZUJpbmQgPSB0aGlzLmZpZWxkQmluZCgpO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0PHVua25vd24+KGl0ZW0sIGZpZWxkTmFtZUJpbmQpO1xuICAgIGlmICh2YWxpZFJlcXVpcmVkICYmIHZhbGlkUmVxdWlyZWQuaXNSZXF1aXJlZCAmJiAhdGhpcy5yZWFkb25seSgpICYmIHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1ibGFuaycpLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHZhbGlkUmVxdWlyZWQubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEKTtcbiAgICAgIHRoaXMub3V0TWVzc2FnZUVycm9yLmVtaXQodGhpcy5tZXNzYWdlRXJyb3IoKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkTWluTGVuZ3RoID0gdGhpcy52YWxpZE1pbkxlbmd0aCgpO1xuICAgIGlmICh2YWxpZE1pbkxlbmd0aCAmJiBmaWVsZE5hbWVCaW5kICYmIHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPCB2YWxpZE1pbkxlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1pbkxlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUlOX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZE1heExlbmd0aCA9IHRoaXMudmFsaWRNYXhMZW5ndGgoKTtcbiAgICBpZiAodmFsaWRNYXhMZW5ndGggJiYgZmllbGROYW1lQmluZCAmJiB2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gdGhpcy52YWxpZE1heExlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1heExlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVIYW5kbGVyRnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaGFuZGxlcnNFeHBhbmQgPSB0aGlzLmhhbmRsZXJzRXhwYW5kKCk7XG5cbiAgICBpZiAoaGFuZGxlcnNFeHBhbmQgJiYgaGFuZGxlcnNFeHBhbmQubGVuZ3RoKSB7XG4gICAgICBoYW5kbGVyc0V4cGFuZC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnRpdGxlICYmIGVsZW1lbnQuYWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVycy51cGRhdGUoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIFtlbGVtZW50LnRpdGxlXTogZWxlbWVudC5hY3Rpb24gfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vUHJldmVudEVtYmVkRGVsZXRpb24ocmFuZ2U6IFJhbmdlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnF1aWxsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVsdGEgPSB0aGlzLnF1aWxsPy5nZXRDb250ZW50cyhyYW5nZS5pbmRleCwgMSk7XG5cbiAgICBpZiAoZGVsdGE/Lm9wcy5zb21lKChvcHRpb24pID0+IHRoaXMuYmxvdHNSZWdpc3RlcigpPy5maW5kKChpdGVtKSA9PiBnZXQob3B0aW9uLmluc2VydCwgaXRlbS5jb21wb25lbnRbJ2Jsb3ROYW1lJ10pICYmIGl0ZW0uaWdub3JlRGVsZXRlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gTmfEg24ga2jDtG5nIGNobyBRdWlsbCB44butIGzDvSB4w7NhXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldEZvbnRTaXplU2VsZWN0ZWQoZm9ybWF0OiBTdHJpbmdNYXApIHtcbiAgICBjb25zdCBmb250U2l6ZSA9IGZvcm1hdD8uc2l6ZT8udG9TdHJpbmcoKT8ucmVwbGFjZSgncHgnLCAnJyk7XG4gICAgaWYgKGlzTmFOKHBhcnNlRmxvYXQoZm9udFNpemUpKSkge1xuICAgICAgdGhpcy5mb250U2l6ZS5zZXQoeyB2YWx1ZTogdGhpcy5mb250U2l6ZURlZmF1bHQoKSB9KTtcbiAgICAgIC8vIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlRm9udFNpemUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb250U2l6ZS5zZXQoeyB2YWx1ZTogcGFyc2VGbG9hdChmb250U2l6ZSkgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldEZvbnRTZWxlY3RlZChmb3JtYXQ6IFN0cmluZ01hcCkge1xuICAgIGNvbnN0IGZvbnQgPSBsaXN0Rm9udCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBmb3JtYXQuZm9udCk7XG4gICAgaWYgKCFmb250KSB7XG4gICAgICB0aGlzLmZvbnRTZWxlY3RlZC5zZXQoeyBrZXk6ICcnLCBpdGVtOiBsaXN0Rm9udCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSAnJykgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9udFNlbGVjdGVkLnNldCh7IGtleTogZm9ybWF0LmZvbnQsIGl0ZW06IGZvbnQgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbG9yU2VsZWN0ZWQoZm9ybWF0OiBTdHJpbmdNYXApIHtcbiAgICB0aGlzLmNvbG9yU2VsZWN0ZWQuc2V0KGZvcm1hdD8uY29sb3IpO1xuICAgIHRoaXMuYmFja2dyb3VuZFNlbGVjdGVkLnNldChmb3JtYXQ/LmJhY2tncm91bmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjYWxjdWxhdG9yVG9vbGJhcihyZXNldFRvdGFsUmVjYWxsPzogYm9vbGVhbikge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyQ2FsY3VsYXRvclRvb2xiYXIoKSk7XG4gICAgaWYgKHJlc2V0VG90YWxSZWNhbGwpIHtcbiAgICAgIHRoaXMudG90YWxSZWNhbGxDYWxjdWxhdG9yVG9vbGJhci5zZXQoMCk7XG4gICAgfVxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICBjb25zdCB0b29sYmFyV2lkdGggPSB0aGlzLnRvb2xiYXJDb250YWluZXIoKS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDA7XG4gICAgbGV0IHRvdGFsV2lkdGggPSA4NDtcbiAgICBpZiAoIXRoaXMuaXNDYWxjdWxhdG9yVG9vbGJhclN1Y2Nlc3MoKSAmJiB0aGlzLnRvdGFsUmVjYWxsQ2FsY3VsYXRvclRvb2xiYXIoKSA8IDEwICYmIHRvb2xiYXJXaWR0aCA8IGdldCh0aGlzLnF1aWxsQ3VzdG9tQ29uZmlnKCkgYXMgSVF1aWxsMnhDdXN0b21Db25maWcsICd0b29sYmFyLmxlc3NXaWR0aFRvb2xiYXJSZWNhbGxDYWxjdWxhdG9yJywgdG90YWxXaWR0aCkpIHtcbiAgICAgIHRoaXMudG90YWxSZWNhbGxDYWxjdWxhdG9yVG9vbGJhci51cGRhdGUoKHZhbCkgPT4gdmFsICsgMSk7XG4gICAgICB0aGlzLnRpbWVyQ2FsY3VsYXRvclRvb2xiYXIuc2V0KFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0b3JUb29sYmFyKCk7XG4gICAgICAgIH0sIDI1MClcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0NhbGN1bGF0b3JUb29sYmFyU3VjY2Vzcy5zZXQodHJ1ZSk7XG4gICAgdGhpcy50b29sYmFyT3B0aW9uc0NvbmZpZy51cGRhdGUoKGNvbmZpZ3MpID0+IHtcbiAgICAgIGNvbmZpZ3MuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgaXRlbS5kaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgdG90YWxXaWR0aCArPSBpdGVtLndpZHRoO1xuICAgICAgICBpZiAoaXRlbS50eXBlID09PSAnbGluZScpIHtcbiAgICAgICAgICBjb25zdCBuZXh0SXRlbVdpZHRoID0gdG90YWxXaWR0aCArIHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcoKVsraW5kZXggKyAxXS53aWR0aDtcbiAgICAgICAgICBjb25zdCBwcmVJdGVtID0gdGhpcy50b29sYmFyT3B0aW9uc0NvbmZpZygpWytpbmRleCAtIDFdO1xuICAgICAgICAgIGlmIChuZXh0SXRlbVdpZHRoID4gdG9vbGJhcldpZHRoICYmIHByZUl0ZW0uZGlzcGxheSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgaXRlbS5kaXNwbGF5ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodG90YWxXaWR0aCA+IHRvb2xiYXJXaWR0aCkge1xuICAgICAgICAgIGl0ZW0uZGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gWy4uLmNvbmZpZ3NdO1xuICAgIH0pO1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U3R5bGVGb3JDb250ZW50KCkge1xuICAgIGNvbnN0IHN0eWxlQXJyYXkgPSBbXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtQXJpYWwnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBBcmlhbCcgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1zYW5zLXNlcmlmJywgc3R5bGU6ICdmb250LWZhbWlseTogc2Fucy1zZXJpZicgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1zZXJpZicsIHN0eWxlOiAnZm9udC1mYW1pbHk6IHNlcmlmJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LW1vbm9zcGFjZScsIHN0eWxlOiAnZm9udC1mYW1pbHk6IG1vbm9zcGFjZScgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1IZWx2ZXRpY2EnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLmxpYnMtdWktcXVpbGwtZm9ybWF0LWltYWdlJywgc3R5bGU6ICdtYXgtd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bycsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcubGlicy11aS1xdWlsbC1tZW50aW9uJywgc3R5bGU6ICdmb250LXdlaWdodDogNjAwOy1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7LXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7IGNvbG9yOiAjNzIzOUVBJywgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9LFxuICAgICAgeyBzZWxlY3RvcjogJ2Jsb2NrcXVvdGUnLCBzdHlsZTogJ2JvcmRlci1sZWZ0OiA0cHggc29saWQgI2NjYzsgbWFyZ2luLWJvdHRvbTogNXB4OyBtYXJnaW4tdG9wOiA1cHg7IHBhZGRpbmctbGVmdDogMTZweCcsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSxcbiAgICBdO1xuICAgIHRoaXMuYmxvdHNSZWdpc3RlcigpPy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBzdHlsZUFycmF5LnB1c2goeyBzZWxlY3RvcjogYC4ke2l0ZW0uY2xhc3NOYW1lfWAsIHN0eWxlOiBpdGVtLnN0eWxlLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0pO1xuICAgIH0pO1xuICAgIHN0eWxlQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLnF1aWxsPy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoaXRlbS5zZWxlY3Rvcik7XG4gICAgICBlbGVtZW50cz8uZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vdmVycmlkZVN0eWxlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgaXRlbS5zdHlsZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeGJ1ZyBpc3N1ZTogaHR0cHM6Ly9hZG1pbi1jdi5tb2Jpby52bi9pc3N1ZXMvNDkwOTJcbiAgICAgICAgbGV0IHN0eWxlRXhpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgaWYgKHN0eWxlRXhpc3QpIHtcbiAgICAgICAgICBbJ2ZvbnQtZmFtaWx5OiBBcmlhbCcsICdmb250LWZhbWlseTogc2Fucy1zZXJpZicsICdmb250LWZhbWlseTogc2VyaWYnLCAnZm9udC1mYW1pbHk6IG1vbm9zcGFjZScsICdmb250LWZhbWlseTogSGVsdmV0aWNhJ10uZm9yRWFjaCgoZm9udCkgPT4ge1xuICAgICAgICAgICAgc3R5bGVFeGlzdCA9IChzdHlsZUV4aXN0Py5pbmNsdWRlcyhgJHtmb250fTtgKSA/IHN0eWxlRXhpc3Q/LnJlcGxhY2UoYCR7Zm9udH07YCwgJycpIDogc3R5bGVFeGlzdD8ucmVwbGFjZShmb250LCAnJykpIGFzIHN0cmluZztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZUV4aXN0ID8gYCR7c3R5bGVFeGlzdH0ke3N0eWxlRXhpc3Rbc3R5bGVFeGlzdC5sZW5ndGggLSAxXSA9PT0gJzsnID8gJycgOiAnOyd9JHtpdGVtLnN0eWxlfTtgIDogaXRlbS5zdHlsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0Q29udGVudChjb250ZW50OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucXVpbGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY29udGVudFhzc0ZpbHRlciA9IGF3YWl0IHhzc0ZpbHRlcih0aGlzLnJlbW92ZVVud2FudGVkUGFydChjb250ZW50IHx8ICcnKSk7XG4gICAgdGhpcy5xdWlsbC5jbGlwYm9hcmQuZGFuZ2Vyb3VzbHlQYXN0ZUhUTUwoY29udGVudFhzc0ZpbHRlcik7XG4gIH1cblxuICBwcml2YXRlIGFkanVzdEluZGV4Rm9ySW1hZ2VzKGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5xdWlsbD8ucm9vdDtcbiAgICBsZXQgaW1hZ2VDb3VudCA9IDA7XG4gICAgbGV0IGFkanVzdGVkSW5kZXggPSAwO1xuICAgIGNvbnN0IGFkanVzdFRleHRJbmRleCA9IChub2RlOiBOb2RlKSA9PiB7XG4gICAgICBpZiAoYWRqdXN0ZWRJbmRleCA+IGluZGV4KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICBhZGp1c3RlZEluZGV4ICs9IG5vZGUudGV4dENvbnRlbnQ/Lmxlbmd0aCB8fCAwO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZS5ub2RlTmFtZSA9PT0gJ0lNRycpIHtcbiAgICAgICAgaWYgKGFkanVzdGVkSW5kZXggPD0gaW5kZXgpIHtcbiAgICAgICAgICBpbWFnZUNvdW50Kys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKS5mb3JFYWNoKGFkanVzdFRleHRJbmRleCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBhZGp1c3RUZXh0SW5kZXgoY29udGVudCBhcyBOb2RlKTtcbiAgICByZXR1cm4gaW1hZ2VDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBsb2FkSW1hZ2VzQW5kSW5zZXJ0KGZpbGVzPzogRmlsZUxpc3QgfCBudWxsKSB7XG4gICAgaWYgKCFmaWxlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtYXhJbWFnZVNpemUgPSB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCk/Lm1heEltYWdlU2l6ZSB8fCA1ICogMTAyNCAqIDEwMjQ7XG4gICAgY29uc3QgaW1hZ2VzID0gQXJyYXkuZnJvbShmaWxlcykuZmlsdGVyKChmaWxlKSA9PiBmaWxlICYmIGZpbGUudHlwZS5zcGxpdCgnLycpWzBdID09PSAnaW1hZ2UnICYmICghdGhpcy51cGxvYWRJbWFnZUNvbmZpZygpLm1heEltYWdlU2l6ZSB8fCBmaWxlLnNpemUgPD0gbWF4SW1hZ2VTaXplKSk7XG4gICAgaWYgKCFpbWFnZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dFdhcm5pbmcodGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9ub3RlX3VwbG9hZF9pbWFnZV92b2x1bWUnLCB7IHZhbHVlOiBnZXRMYWJlbEJ5U2l6ZUZpbGUobWF4SW1hZ2VTaXplKSB9KSwgeyB0aW1lUmVtb3ZlOiA4MDAwIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5sb2FkaW5nVXBsb2FkSW1hZ2Uuc2V0KHRydWUpO1xuICAgICAgY29uc3QgaW5kZXhJbnNlcnQgPSB0aGlzLnF1aWxsPy5nZXRTZWxlY3Rpb24odHJ1ZSkuaW5kZXg7XG4gICAgICBjb25zdCBsaW5rcyA9IGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5mdW5jdGlvblVwbG9hZEltYWdlPy4oaW1hZ2VzKTtcbiAgICAgIGlmICghbGlua3M/Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsaW5rcy5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgIGlmICghbGluayB8fCAodGhpcy51cGxvYWRJbWFnZUNvbmZpZygpLm9ubHlBY2NlcHRJbWFnZUh0dHBzTGluayAmJiAobGluayBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8ICFuZXcgUmVnRXhwKHBhdHRlcm5VcmwoKSkudGVzdChsaW5rKSkpKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UobGluayBhcyBzdHJpbmcsIGluZGV4SW5zZXJ0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zY3JvbGxUb1NlbGVjdGlvbldpdGhFbGVtZW50U2Nyb2xsSGVpZ2h0QXV0byhpbmRleEluc2VydCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmdVcGxvYWRJbWFnZS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0aW9uV2l0aEVsZW1lbnRTY3JvbGxIZWlnaHRBdXRvKGluZGV4PzogbnVtYmVyKSB7XG4gICAgLy8gY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dFNjcm9sbFRvU2VsZWN0aW9uV2l0aEVsZW1lbnRTY3JvbGxIZWlnaHRBdXRvKCkpO1xuICAgIC8vIGlmICghdGhpcy5lbGVtZW50U2Nyb2xsSGVpZ2h0QXV0bygpKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIC8vIHRoaXMudGltZW91dFNjcm9sbFRvU2VsZWN0aW9uV2l0aEVsZW1lbnRTY3JvbGxIZWlnaHRBdXRvLnNldChcbiAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgICBpbmRleCA9IGluZGV4ID8/IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICAvLyAgICAgaWYgKCFpc05pbChpbmRleCkpIHtcbiAgICAvLyAgICAgICBjb25zdCBib3VuZHMgPSB0aGlzLnF1aWxsPy5nZXRCb3VuZHMoaW5kZXgsIDEpO1xuICAgIC8vICAgICAgIHRoaXMuZWxlbWVudFNjcm9sbEhlaWdodEF1dG8oKT8uc2Nyb2xsVG8oMCwgKGJvdW5kcz8udG9wIHx8IDApIC0gMjApO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LCAxMDApXG4gICAgLy8gKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0SW1hZ2UoY29udGVudDogc3RyaW5nLCBpbmRleD86IG51bWJlcikge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGluZGV4ID8/IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICBpZiAoIWlzTmlsKHNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMucXVpbGw/Lmluc2VydEVtYmVkKHNlbGVjdGlvbiwgJ2ltYWdlJywgY29udGVudCk7XG4gICAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uICsgMSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGV2ZW50ID09PSAncmVtb3ZlJykge1xuICAgICAgICB0aGlzLmxpbmsuc2V0KGxpbmtEZWZhdWx0KCkpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydExpbmsodGV4dDogc3RyaW5nLCB1cmw6IHN0cmluZywgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsPy5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgY29uc3QgaW5kZXhJbnNlcnQgPSBpbmRleCA/PyBzZWxlY3Rpb24/LmluZGV4O1xuICAgIGlmIChzZWxlY3Rpb24/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5xdWlsbD8uZGVsZXRlVGV4dChzZWxlY3Rpb24uaW5kZXgsIHNlbGVjdGlvbi5sZW5ndGgsIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gICAgfVxuICAgIGlmICghaXNOaWwoaW5kZXhJbnNlcnQpKSB7XG4gICAgICB0aGlzLnF1aWxsPy5pbnNlcnRUZXh0KGluZGV4SW5zZXJ0LCB0ZXh0LCAnbGluaycsIHVybCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTaG93VXBsb2FkTGluayhldmVudDogdW5rbm93bikge1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYuc2V0KHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsTGlua0NvbXBvbmVudCkpO1xuICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5pbnN0YW5jZTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsPy5nZXRTZWxlY3Rpb24oKTtcbiAgICBjb25zdCB0ZXh0U2VsZWN0ZWQgPSBzZWxlY3Rpb24/Lmxlbmd0aCA/IHRoaXMucXVpbGw/LmdldFRleHQoc2VsZWN0aW9uPy5pbmRleCwgc2VsZWN0aW9uPy5sZW5ndGgpIDogJyc7XG4gICAgY29uc3QgZGF0YSA9IGV2ZW50IGFzIElRdWlsbDJ4TGluayB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCd6SW5kZXgnLCB0aGlzLnpJbmRleCgpKTtcbiAgICB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCd0aXRsZScsIGRhdGE/LnRpdGxlIHx8IHRleHRTZWxlY3RlZCk7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgnbGluaycsIGRhdGE/LnVybCB8fCAnJyk7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgnaWdub3JlQ29tbXVuaWNhdGVNaWNyb0V2ZW50JywgdGhpcy5pZ25vcmVDb21tdW5pY2F0ZU1pY3JvRXZlbnRQb3B1cCgpKTtcbiAgICBpbnN0YW5jZT8ub3V0U2F2ZUxpbmsuc3Vic2NyaWJlKChpdGVtOiB7IHRpdGxlOiBzdHJpbmc7IGxpbms6IHN0cmluZyB9KSA9PiB7XG4gICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCAmJiBkYXRhLnVybCkge1xuICAgICAgICB0aGlzLnF1aWxsPy5kZWxldGVUZXh0KGRhdGEucmFuZ2UuaW5kZXgsIGRhdGEucmFuZ2UubGVuZ3RoLCBRdWlsbC5zb3VyY2VzLlVTRVIpO1xuICAgICAgICB0aGlzLnF1aWxsPy5pbnNlcnRUZXh0KGRhdGEucmFuZ2UuaW5kZXgsIGl0ZW0udGl0bGUsICdsaW5rJywgaXRlbS5saW5rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5pbnNlcnRMaW5rKGl0ZW0udGl0bGUsIGl0ZW0ubGluayk7XG4gICAgfSk7XG4gICAgaW5zdGFuY2U/Lm91dENsb3NlLnN1YnNjcmliZSgoKSA9PiB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpKTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLmFkZFRvQm9keSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnNlcnRNZW50aW9uKGV2ZW50OiBJTWVudGlvbkluc2VydCkge1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5xdWlsbD8uZ2V0U2VsZWN0aW9uKCk7XG4gICAgaWYgKCFyYW5nZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXJzb3JQb3MgPSByYW5nZS5pbmRleDtcbiAgICBjb25zdCBzdGFydFBvc0luc2VydCA9IGN1cnNvclBvcyAtIGV2ZW50Lmxlbmd0aEtleTtcbiAgICB0aGlzLnF1aWxsPy5kZWxldGVUZXh0KHN0YXJ0UG9zSW5zZXJ0LCBldmVudC5sZW5ndGhLZXksIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gICAgdGhpcy5xdWlsbD8uaW5zZXJ0RW1iZWQoc3RhcnRQb3NJbnNlcnQsICdtZW50aW9uJywgZXZlbnQuZGF0YSwgUXVpbGwuc291cmNlcy5VU0VSKTtcbiAgICB0aGlzLmluc2VydFRleHQoJyAnLCBzdGFydFBvc0luc2VydCArIDEpO1xuICAgIHRoaXMucXVpbGw/LnNldFNlbGVjdGlvbihzdGFydFBvc0luc2VydCArIDIsIDAsIFF1aWxsLnNvdXJjZXMuVVNFUik7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZhbHVlQnlSb290UXVpbGxIdG1sKCkge1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLnJlbW92ZVVud2FudGVkUGFydCh0aGlzLnF1aWxsPy5yb290LmlubmVySFRNTCB8fCAnJyk7XG4gICAgaWYgKCF0aGlzLnF1aWxsPy5yb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKS5sZW5ndGggJiYgIXRoaXMucXVpbGw/LmdldFRleHQoKSkge1xuICAgICAgc2V0PHVua25vd24+KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkQmluZCgpLCAnJyk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLm91dENoYW5nZS5lbWl0KGdldDx1bmtub3duPih0aGlzLml0ZW0sIHRoaXMuZmllbGRCaW5kKCkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJ0SW5uZXJIVE1MQW5kU2V0VmFsdWUoaHRtbCk7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoZ2V0PHVua25vd24+KHRoaXMuaXRlbSwgdGhpcy5maWVsZEJpbmQoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SW5uZXJIVE1MQW5kU2V0VmFsdWUoaHRtbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRTdHlsZUZvckNvbnRlbnQoKTtcbiAgICBzZXQ8dW5rbm93bj4odGhpcy5pdGVtKCksIHRoaXMuZmllbGRCaW5kKCksIGh0bWwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVVbndhbnRlZFBhcnQoaHRtbDogc3RyaW5nKSB7XG4gICAgaWYgKCFodG1sKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBodG1sXG4gICAgICAucmVwbGFjZSgvXlxccyo8cD48YnI+PFxcL3A+LywgJycpXG4gICAgICAucmVwbGFjZSgvPGRpdj48YnI+PFxcL2Rpdj4vZ2ksICcnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUyMDBCLVxcdTIwMERcXHVGRUZGXS9nLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzKCkge1xuICAgIGlmICh0aGlzLmZvY3VzQm90dG9tKCkpIHtcbiAgICAgIHRoaXMucXVpbGw/LnNldFNlbGVjdGlvbih0aGlzLnF1aWxsLnJvb3QuaW5uZXJIVE1MLmxlbmd0aCwgMCwgUXVpbGwuc291cmNlcy5TSUxFTlQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24oMCwgMCwgUXVpbGwuc291cmNlcy5TSUxFTlQpO1xuICB9XG5cbiAgLy9lbmRyZWdpb25cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lclNldEZvbnRTaXplKCkpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyQ2FsY3VsYXRvclRvb2xiYXIoKSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpKTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCkpO1xuICB9XG59XG4iLCI8ZGl2XG4gICNodG1sQ29udGFpbmVyXG4gIFtjbGFzc109XCJjb250YWluZXJDbGFzcygpXCJcbiAgW3N0eWxlLi0tcmVzaXplXT1cInJlc2l6ZSgpXCI+XG4gIEBpZiAobGFiZWwoKTsgYXMgbGFiZWwpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWxhYmVsXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cImxhYmVsLmNsYXNzSW5jbHVkZVwiXG4gICAgICBbcmVxdWlyZWRdPVwibGFiZWwucmVxdWlyZWRcIlxuICAgICAgW2xhYmVsTGVmdF09XCJsYWJlbC5sYWJlbExlZnRcIiAvPlxuICB9XG5cbiAgPGRpdlxuICAgICN0b29sYmFyQ29udGFpbmVyXG4gICAgY2xhc3M9XCJyZWxhdGl2ZSBoLVs0NHB4XVwiXG4gICAgW25nU3R5bGVdPVwicXVpbGxDdXN0b21Db25maWcoKT8udG9vbGJhcj8uKCk/LnN0eWxlcz8uKCkgfHwge31cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidG9vbGJhclRlbXBsYXRlXCIgLz5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICAjc25vd0NvbnRhaW5lclxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25EaXJlY3RpdmVcbiAgICBbb3B0aW9uc109XCJ7IGlnbm9yZVRyYW5zcGFyZW50U2Nyb2xsQmFyQ29sb3JEZWZhdWx0OiByZXNpemUoKSAhPT0gJ25vbmUnIH1cIlxuICAgIFttZW50aW9uQ29uZmlnXT1cImRhdGFDb25maWdNZW50aW9uKClcIlxuICAgIChvdXRUb2dnbGUpPVwiaGFuZGxlVG9nZ2xlTWVudGlvbigkZXZlbnQpXCJcbiAgICAob3V0SW5zZXJ0TWVudGlvbik9XCJoYW5kbGVySW5zZXJ0TWVudGlvbigkZXZlbnQpXCJcbiAgICBbY2xhc3NdPVwiY29udGFpbmVyRWRpdG9yQ2xhc3MoKVwiPjwvZGl2PlxuICBAaWYgKG1lc3NhZ2VFcnJvcigpICYmIHNob3dFcnJvckxhYmVsKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbXQtWzhweF1cIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1bI2ZmNTQ1NF0gbGlicy11aS1mb250LWg3clwiPnt7IG1lc3NhZ2VFcnJvcigpIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0b29sYmFyVGVtcGxhdGU+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiY29udGFpbmVyVG9vbGJhckNsYXNzKClcIlxuICAgICN0b29sYmFySXRlbXM+XG4gICAgQGlmIChkaXNwbGF5U2tlbGV0b25Ub29sYmFyKCkpIHtcbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtc2tlbGV0b25cbiAgICAgICAgY2xhc3M9XCJ3LWZ1bGwgaC1mdWxsXCJcbiAgICAgICAgW2NvbmZpZ109XCJ7XG4gICAgICAgICAgcm93czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpdGVtOiB7IGNsYXNzSW5jbHVkZUl0ZW06ICchcm91bmRlZC1ub25lJyB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XCIgLz5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInFsLWZvcm1hdHMgaXRlbXMtY2VudGVyIHB4LVsxNnB4XSBweS1bNHB4XSAhZmxleFwiPlxuICAgICAgQGZvciAob3B0aW9uIG9mIHRvb2xiYXJPcHRpb25zQ29uZmlnKCk7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwiIW9wdGlvbi5kaXNwbGF5XCJcbiAgICAgICAgICBbY2xhc3MuZmxleF09XCJvcHRpb24uZGlzcGxheVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVG9vbGJhclRlbXBsYXRlOyBjb250ZXh0OiB7IG9wdGlvbiwgJGluZGV4LCAkbGFzdCB9XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8ZGl2IGNsYXNzPVwicmVsYXRpdmVcIj5cbiAgICAgICAgQGlmIChzaG93QnV0dG9uTW9yZVRvb2xiYXIoKSkge1xuICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICAgIFt0eXBlXT1cInNob3dNb3JlQWN0aW9uKCkgPyAnYnV0dG9uLXNlY29uZGFyeScgOiAnYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtWzFweF0gIWgtWzIwcHhdIG1sLVs4cHhdJ1wiXG4gICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwJ1wiXG4gICAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNoYW5nZVNob3dNb3JlQWN0aW9uKCRldmVudClcIiAvPlxuICAgICAgICB9XG4gICAgICAgIDwhLS0gQnVpbGQgdG9vbGJhciBraGkgY2xpY2sgeGVtIHRow6ptLS0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFzaG93TW9yZUFjdGlvbigpXCJcbiAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGJnLVsjZmZmZmZmXSBzaGFkb3ctWzBweF80cHhfMTZweF8wcHhfcmdiYSgwLDIwLDUxLDAuMTApXSB6LVsxXSBmbGV4IGl0ZW1zLWNlbnRlciBwbC1bOHB4XSBwci1bMTZweF0gcHktWzRweF0gcm91bmRlZC1bOHB4XSB0b3AtWzMxcHhdIHJpZ2h0LVswcHhdXCI+XG4gICAgICAgICAgQGZvciAob3B0aW9uIG9mIHRvb2xiYXJPcHRpb25zQ29uZmlnKCk7IHRyYWNrIG9wdGlvbikge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIml0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgIFtjbGFzcy5oaWRkZW5dPVwib3B0aW9uLmRpc3BsYXkgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmZsZXhdPVwib3B0aW9uLmRpc3BsYXkgPT09IGZhbHNlXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtVG9vbGJhclRlbXBsYXRlOyBjb250ZXh0OiB7IG9wdGlvbiwgJGluZGV4LCAkbGFzdCB9XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGVcbiAgI2l0ZW1Ub29sYmFyVGVtcGxhdGVcbiAgbGV0LSRpbmRleD1cIiRpbmRleFwiXG4gIGxldC0kbGFzdD1cIiRsYXN0XCJcbiAgbGV0LW9wdGlvbj1cIm9wdGlvblwiPlxuICBAaWYgKG9wdGlvbi50eXBlID09PSAndW5kbycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3VuZG8nLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXVuZG9cIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAncmVkbycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3JlZG8nLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXJlZG9cIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZm9udEZhbWlseScpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctWzEzMnB4XSBoLWZ1bGwgcm91bmRlZC1bNHB4XSBsaWJzLXVpLWJvcmRlci1nZW5lcmFsIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiXG4gICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIXJlYWRvbmx5KCkgJiYgIWxvYWRpbmdVcGxvYWRJbWFnZSgpXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW2xhYmVsUG9wb3ZlckZ1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0ZvbnQoKVwiXG4gICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICBbbGlzdEhpZGRlbklucHV0U2VhcmNoXT1cInRydWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkoKVwiXG4gICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiOFwiXG4gICAgICAgIFt6SW5kZXhdPVwiMTI1MFwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlU2VsZWN0Rm9udCgkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoZm9udFNlbGVjdGVkKCk7IGFzIGZvbnRTZWxlY3RlZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBweS1bN3B4XSBsaWJzLXVpLWZvbnQtaDVyIHBsLVsxNnB4XSBwci1bNDBweF1cIj5cbiAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAgICAgICAgICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICBbaWdub3JlU3RvcFByb3BhZ2F0aW9uRXZlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwieyB6SW5kZXg6IHpJbmRleCgpIH1cIj5cbiAgICAgICAgICAgICAge3sgbGFiZWxGb250U2VsZWN0ZWRDb21wdXRlZCgpIH19XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgYWJzb2x1dGUgcmlnaHQtWzEycHhdIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaGVhZGVyJykge1xuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwicmVsYXRpdmUgdy1bMTM4cHhdIGgtZnVsbCByb3VuZGVkLVs0cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCJcbiAgICAgIFtjbGFzcy5iZy13aGl0ZV09XCIhcmVhZG9ubHkoKSAmJiAhbG9hZGluZ1VwbG9hZEltYWdlKClcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbbGFiZWxQb3BvdmVyRnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBbbGlzdENvbmZpZ109XCJsaXN0Q29uZmlnSGVhZGVyKClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjhcIlxuICAgICAgICBbekluZGV4XT1cIjEyNTBcIlxuICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZVNlbGVjdEhlYWRlcigkZXZlbnQpXCI+XG4gICAgICAgIEBpZiAoaGVhZGVyU2VsZWN0ZWQoKTsgYXMgaGVhZGVyU2VsZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgcHktWzdweF0gbGlicy11aS1mb250LWg1ciBwbC1bMTZweF0gcHItWzQwcHhdIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyXG4gICAgICAgICAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgIFtpZ25vcmVTdG9wUHJvcGFnYXRpb25FdmVudF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgW2NvbmZpZ109XCJ7IHpJbmRleDogekluZGV4KCkgfVwiPlxuICAgICAgICAgICAgICB7eyBsYWJlbEhlYWRlclNlbGVjdGVkQ29tcHV0ZWQoKSB9fVxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIGFic29sdXRlIHJpZ2h0LVsxMnB4XSB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2ZvbnRTaXplJykge1xuICAgIDxkaXYgY2xhc3M9XCIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy12YWxpZFxuICAgICAgICAjaW5wdXRTaXplUmVmXG4gICAgICAgIFtkYXRhVHlwZV09XCInaW50J1wiXG4gICAgICAgIFsoaXRlbSldPVwiZm9udFNpemVcIlxuICAgICAgICBbZmllbGROYW1lQmluZF09XCIndmFsdWUnXCJcbiAgICAgICAgW3ZhbHVlVXBEb3duTnVtYmVyXT1cIjFcIlxuICAgICAgICBbbWF4VmFsdWVOdW1iZXJdPVwiNzJcIlxuICAgICAgICBbbWluVmFsdWVOdW1iZXJdPVwiOFwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpIHx8IGxvYWRpbmdVcGxvYWRJbWFnZSgpXCJcbiAgICAgICAgW2NsYXNzQ29udGFpbmVySW5wdXRdPVwiJ3ctWzcycHhdIGgtWzMycHhdJ1wiXG4gICAgICAgIChvdXRDaGFuZ2VWYWx1ZUJ5QnV0dG9uVXBEb3duKT1cImhhbmRsZXJWYWx1ZUNoYW5nZUZvbnRTaXplKClcIlxuICAgICAgICAob3V0Rm9jdXNBbmRCbHVyKT1cImhhbmRsZXJWYWx1ZUNoYW5nZUZvbnRTaXplKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdjb2xvcicpIHtcbiAgICA8ZGl2IGNsYXNzPVwicWwtY29sb3IgcWwtcGlja2VyIHFsLWNvbG9yLXBpY2tlciAhZmxleCBpdGVtcy1jZW50ZXIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXIgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3RleHRfY29sb3InLCB6SW5kZXg6IHpJbmRleCgpIH1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNlbGVjdF9jb2xvclxuICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICAgIFtkaXJlY3Rpb25dPVwiJ3RvcCdcIlxuICAgICAgICAgIFtleHRlcm5hbENvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2N1c3RvbU9wdGlvbnNdPVwie1xuICAgICAgICAgICAgc2hvd0FscGhhOiB0cnVlLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIFthcHBseU5vd109XCJmYWxzZVwiXG4gICAgICAgICAgKG91dENvbG9yQ2hhbmdlKT1cImhhbmRsZXJTZXRGb3JtYXQoJ2NvbG9yJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWVkaXRvci1jb2xvci10ZXh0IGxpYnMtdWktYnV0dG9ucy1zZWxlY3QtY29sb3IgdGV4dC1bIzZhNzM4M10gdGV4dC1bMTZweF0gaG92ZXI6dGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0xKV1cIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1lZGl0b3ItY29sb3ItdGV4dC1hY3RpdmVdPVwiISFjb2xvclNlbGVjdGVkKClcIlxuICAgICAgICAgICAgW3N0eWxlLi0tY29sb3Itc2VsZWN0ZWRdPVwiY29sb3JTZWxlY3RlZCgpXCI+PC9kaXY+XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYmFja2dyb3VuZCcpIHtcbiAgICA8ZGl2IGNsYXNzPVwicWwtYmFja2dyb3VuZCBxbC1waWNrZXIgcWwtY29sb3ItcGlja2VyICFmbGV4IGl0ZW1zLWNlbnRlciB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fYmFja2dyb3VuZF9jb2xvcicsIHpJbmRleDogekluZGV4KCkgfVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yXG4gICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCIndG9wJ1wiXG4gICAgICAgICAgW2V4dGVybmFsQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbYXBwbHlOb3ddPVwiZmFsc2VcIlxuICAgICAgICAgIFtjdXN0b21PcHRpb25zXT1cIntcbiAgICAgICAgICAgIHNob3dBbHBoYTogdHJ1ZSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob3V0Q29sb3JDaGFuZ2UpPVwiaGFuZGxlclNldEZvcm1hdCgnYmFja2dyb3VuZCcsICRldmVudClcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImxpYnMtdWktaWNvbi1lZGl0b3ItY29sb3ItYmFja2dyb3VuZCBsaWJzLXVpLWJ1dHRvbnMtc2VsZWN0LWNvbG9yIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdIGhvdmVyOnRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItbGlnaHQtMSldXCJcbiAgICAgICAgICAgIFtjbGFzcy5saWJzLXVpLWljb24tZWRpdG9yLWNvbG9yLWJhY2tncm91bmQtYWN0aXZlXT1cIiEhYmFja2dyb3VuZFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgW3N0eWxlLi0tYmFja2dyb3VuZC1zZWxlY3RlZF09XCJiYWNrZ3JvdW5kU2VsZWN0ZWQoKVwiPjwvZGl2PlxuICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1idXR0b25zLXNlbGVjdF9jb2xvcj5cbiAgICAgIDwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2JvbGQnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9mb250X3dlaWdodF9ib2xkJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1ib2xkXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2l0YWxpYycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2ZvbnRfc3R5bGVfaXRhbGljJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1pdGFsaWNcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAndW5kZXJsaW5lJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fdGV4dF9kZWNvcmF0aW9uX3VuZGVybGluZScsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtdW5kZXJsaW5lXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3N0cmlrZVRocm91Z2gnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl90ZXh0X2xpbmVfdGhyb3VnaCcsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtc3RyaWtlXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3NjcmlwdC5zdWInKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9zY3JpcHRfc3ViJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1zY3JpcHRcIlxuICAgICAgICB2YWx1ZT1cInN1YlwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdzY3JpcHQuc3VwZXInKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9zY3JpcHRfc3VwZXInLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXNjcmlwdFwiXG4gICAgICAgIHZhbHVlPVwic3VwZXJcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYWRqdXN0Jykge1xuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSAhZmxleCBpdGVtcy1jZW50ZXIgcWwtYWxpZ24gcWwtcGlja2VyIHFsLWljb24tcGlja2VyICF3LW1heCB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fYWRqdXN0JywgekluZGV4OiB6SW5kZXgoKSB9XCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIlxuICAgICAgICAgIFtsYWJlbFBvcG92ZXJGdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0FsaWduKClcIlxuICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwieyBpZ25vcmVBcnJvdzogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzMycHhdIG92ZXJmbG93LWhpZGRlbiAhcHktWzRweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9LCBwYWRkaW5nTGVmdEl0ZW06IGZhbHNlIH1cIlxuICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFtsaXN0TWF4SXRlbVNob3ddPVwiOFwiXG4gICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKSArIDFcIlxuICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlU2VsZWN0QWxpZ24oJGV2ZW50KVwiPlxuICAgICAgICAgIEBpZiAoYWxpZ25TZWxlY3RlZCgpOyBhcyBhbGlnblNlbGVjdGVkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cImljb25BbGlnblNlbGVjdGVkQ29tcHV0ZWQoKVwiPjwvaT5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgdGV4dC1bIzZhNzM4M10gdGV4dC1bMTZweF0gbWwtWzRweF1cIj48L2k+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaW5kZW50SW5jcmVhc2UnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9pbmRlbnRfaW5jcmVhc2UnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWluZGVudFwiXG4gICAgICAgIHZhbHVlPVwiKzFcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaW5kZW50RGVjcmVhc2UnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9pbmRlbnRfZGVjcmVhc2UnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWluZGVudFwiXG4gICAgICAgIHZhbHVlPVwiLTFcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZGlyZWN0aW9uJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fZGlyZWN0aW9uJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1kaXJlY3Rpb25cIlxuICAgICAgICB2YWx1ZT1cInJ0bFwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdsaXN0QnVsbGV0ZWQnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9saXN0X2J1bGxldGVkJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saXN0IHFsLWJ1bGxldFwiXG4gICAgICAgIHZhbHVlPVwiYnVsbGV0XCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpc3ROdW1iZXJlZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2xpc3RfbnVtYmVyZWQnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWxpc3QgcWwtb3JkZXJlZFwiXG4gICAgICAgIHZhbHVlPVwib3JkZXJlZFwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdsaXN0Q2hlY2tlZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2xpc3RfbnVtYmVyZWQnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWxpc3QgcWwtY2hlY2tcIlxuICAgICAgICB2YWx1ZT1cImNoZWNrXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3BlcnNvbmFsaXplJyAmJiB0ZW1wbGF0ZVRvb2xCYXJQZXJzb25hbGl6ZSgpOyBhcyB0ZW1wbGF0ZVRvb2xCYXJQZXJzb25hbGl6ZSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVRvb2xCYXJQZXJzb25hbGl6ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdibG9ja3F1b3RlJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fcXVvdGUnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWJsb2NrcXVvdGVcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGluaycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2luc2VydF9saW5rJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saW5rXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3VuTGluaycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3VubGluaycsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtdW5MaW5rXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZXJVbmxpbmsoJGV2ZW50KVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbWFnZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2ltYWdlJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1pbWFnZVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICd2aWRlbycpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3ZpZGVvJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC12aWRlb1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdlbW9qaScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZW1vamlcbiAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgKG91dEV2ZW50RW1vamkpPVwiaGFuZGxlckluc2VydEVtb2ppKCRldmVudClcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInFsLWVtb2ppXCI+PC9idXR0b24+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1lbW9qaT5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAndGFibGUnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl90YWJsZScsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtdGFibGVcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGluZScpIHtcbiAgICA8ZGl2IGNsYXNzPVwidy1bMXB4XSBoLVsxNnB4XSBsaWJzLXVpLWJvcmRlci1yaWdodC1nZW5lcmFsXCI+PC9kaXY+XG4gIH1cbjwvbmctdGVtcGxhdGU+XG5cbjxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlclxuICAjaW5wdXRMaW5rUmVmXG4gIFttb2RlXT1cIidjbGljaydcIlxuICBbaWdub3JlSGlkZGVuUG9wb3ZlckNvbnRlbnRXaGVuTW91c2VMZWF2ZV09XCJ0cnVlXCJcbiAgW2NvbmZpZ109XCJ7IHRlbXBsYXRlOiB2aWV3TGluaywgd2hpdGVUaGVtZTogdHJ1ZSwgaWdub3JlQXJyb3c6IHRydWUsIHpJbmRleDogekluZGV4KCkgfVwiXG4gIChvdXRFdmVudCk9XCJoYW5kbGVyUG9wb3ZlckV2ZW50KCRldmVudClcIiAvPlxuXG48bmctdGVtcGxhdGUgI3ZpZXdMaW5rPlxuICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIHB4LVsxNnB4XSBweS1bOHB4XSByb3VuZGVkLVs4cHhdXCI+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJ3LWZ1bGwgbWluLXctMCBsaWJzLXVpLWZvbnQtaDVyXCJcbiAgICAgIFt0eXBlXT1cIid0ZXh0J1wiXG4gICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6IGxpbmsoKS51cmwsIHpJbmRleDogekluZGV4KCkgKyAxIH1cIj5cbiAgICAgIHt7IGxpbmsoKS51cmwgfX1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgbWwtWzE2cHhdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1wcmltYXJ5J1wiXG4gICAgICAgIFtpY29uT25seVR5cGVdPVwidHJ1ZVwiXG4gICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZWRpdC1saW5lJ1wiXG4gICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAnXCJcbiAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJFZGl0TGluaygkZXZlbnQpXCIgLz5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLWN1c3RvbSdcIlxuICAgICAgICBbYnV0dG9uQ3VzdG9tXT1cIntcbiAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgIHRleHQ6ICcjMDcxNjMxJyxcbiAgICAgICAgICAgIHRleHRfaG92ZXI6ICcjZWUyZDQxJyxcbiAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICB0ZXh0X2Rpc2FibGU6ICcwNzE2MzEnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcm9vdENvbG9yOiAnIzA3MTYzMScsXG4gICAgICAgIH1cIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wIG1sLVsxMnB4XSdcIlxuICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWxpbmstYnJva2VuJ1wiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyVW5saW5rKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
876
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwyeC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3F1aWxsL3NyYy9xdWlsbDJ4LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcXVpbGwvc3JjL3F1aWxsMnguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdURBQXVEO0FBQ3ZELE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFnQixRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsU0FBUyxFQUFrQixNQUFNLGVBQWUsQ0FBQztBQUMxUCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUUsMkNBQTJDLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUN2RyxPQUFPLEVBQWtCLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEYsT0FBTyxFQUFrQyxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVILE9BQU8sRUFBZ0Msb0NBQW9DLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0SCxPQUFPLEVBQVUsOEJBQThCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVuRixPQUFPLEVBQUUsZ0NBQWdDLEVBQXNCLE1BQU0sNkJBQTZCLENBQUM7QUFDbkcs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Q0FBc0MsNlNBQ3RDLDhCQUE4QixxUEFDOUIsZ0NBQWdDLG9nQkFDaEMsb0NBQW9DLHMxREFDcEMsMkNBQTJDLDBQQUMzQyw4QkFBOEIsNHFCQUM5QixzQ0FBc0M7OzRGQUc3QixzQ0FBc0M7a0JBdkJsRCxTQUFTOytCQUVFLG1DQUFtQyxjQUNqQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FHdEM7d0JBQ1AsT0FBTzt3QkFDUCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsaUNBQWlDO3dCQUNqQyxzQ0FBc0M7d0JBQ3RDLGlDQUFpQzt3QkFDakMsc0NBQXNDO3dCQUN0Qyw4QkFBOEI7d0JBQzlCLGdDQUFnQzt3QkFDaEMsb0NBQW9DO3dCQUNwQywyQ0FBMkM7d0JBQzNDLDhCQUE4Qjt3QkFDOUIsc0NBQXNDO3FCQUN2QyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IE5nU3R5bGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbXBvbmVudFJlZiwgY29tcHV0ZWQsIERlc3Ryb3lSZWYsIGVmZmVjdCwgRWxlbWVudFJlZiwgaW5qZWN0LCBpbnB1dCwgbW9kZWwsIE9uRGVzdHJveSwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIHVudHJhY2tlZCwgdmlld0NoaWxkLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zU2VsZWN0Q29sb3JDb21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0LWNvbG9yJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWVtb2ppJztcbmltcG9ydCB7IElGb2N1c0FuZEJsdXJFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLWlucHV0JztcbmltcG9ydCB7IElNZW50aW9uQ29uZmlnLCBJTWVudGlvbkluc2VydCwgTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25EaXJlY3RpdmUgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWlucHV0cy1tZW50aW9uJztcbmltcG9ydCB7IElWYWxpZExlbmd0aCwgSVZhbGlkUmVxdWlyZWQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNWYWxpZENvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtaW5wdXRzLXZhbGlkJztcbmltcG9ydCB7IElMYWJlbCwgTGlic1VpQ29tcG9uZW50c0xhYmVsQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1sYWJlbCc7XG5pbXBvcnQgeyBJTGlzdENvbmZpZ0l0ZW0gfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWxpc3QnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIFRZUEVfUE9QT1ZFUl9FVkVOVCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtcG9wb3Zlcic7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtc2Nyb2xsLW92ZXJsYXknO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1za2VsZXRvbic7XG5pbXBvcnQgeyBUWVBFX09CSkVDVCwgVFlQRV9URU1QTEFURV9SRUYgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IExpYnNVaUR5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtZHluYW1pYy1jb21wb25lbnQnO1xuaW1wb3J0IHsgTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJ0BsaWJzLXVpL3NlcnZpY2VzLW5vdGlmaWNhdGlvbic7XG5pbXBvcnQgeyBpc05lYXJXaGl0ZSwgRVJST1JfTUVTU0FHRV9FTVBUWV9WQUxJRCwgRVJST1JfTUVTU0FHRV9NQVhfTEVOR1RILCBFUlJPUl9NRVNTQUdFX01JTl9MRU5HVEgsIGdldCwgZ2V0TGFiZWxCeVNpemVGaWxlLCBpc05pbCwgcGF0dGVyblVybCwgcGF0dGVyUHJvdG9jb2xVcmwsIHNldCwgVXRpbHNLZXlDb2RlQ29uc3RhbnQsIHhzc0ZpbHRlciB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQgUXVpbGwyeCwgeyBEZWx0YSwgRW1pdHRlclNvdXJjZSwgUmFuZ2UgfSBmcm9tICdxdWlsbDJ4JztcbmltcG9ydCB7IGZyb21FdmVudCwgbGFzdFZhbHVlRnJvbSwgdGltZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRZUEVfTU9ERV9CQVJfQ09ORklHX09QVElPTiB9IGZyb20gJy4vaW50ZXJmYWNlcy9xdWlsbC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSVF1aWxsMnhCbG90UmVnaXN0ZXIsIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCBJUXVpbGwyeEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJUXVpbGwyeExpbmssIElRdWlsbDJ4U2VsZWN0aW9uQ2hhbmdlLCBJUXVpbGwyeFRleHRDaGFuZ2UsIElRdWlsbDJ4VG9vbGJhckNvbmZpZywgSVF1aWxsMnhVcGxvYWRJbWFnZUNvbmZpZyB9IGZyb20gJy4vaW50ZXJmYWNlcy9xdWlsbDJ4LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi9saW5rL2xpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbFVwbG9hZEltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi91cGxvYWQtaW1hZ2UvdXBsb2FkLWltYWdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBsaW5rRGVmYXVsdCwgbGlzdENvbmZpZ0FsaWduLCBsaXN0Q29uZmlnRm9udCwgbGlzdENvbmZpZ0hlYWRlciwgbGlzdEZvbnQsIHRvb2xCYXJPcHRpb25zLCB1cGxvYWRJbWFnZUNvbmZpZ0RlZmF1bHQgfSBmcm9tICcuL3V0aWxzL3F1aWxsLmRlZmluZSc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlLCBjcmVhdGVUYWJsZVNlbGVjdG9yLCBlbmFibGVUYWJsZVNlbGVjdGlvbiwgZ2V0QWxsVGFibGVzV2l0aFNwYW4sIHJlZ2lzdGVyUXVpbGwyeCB9IGZyb20gJy4vdXRpbHMvcXVpbGwyeC5kZWZpbmUnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbDJ4JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWlsbDJ4LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3F1aWxsMnguY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbXG4gICAgTmdTdHlsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c1NrZWxldG9uQ29tcG9uZW50LFxuICAgIExpYnNVaUNvbXBvbmVudHNTY3JvbGxPdmVybGF5RGlyZWN0aXZlLFxuICAgIExpYnNVaUNvbXBvbmVudHNFbW9qaUNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzSW5wdXRzVmFsaWRDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNTZWxlY3RDb2xvckNvbXBvbmVudCxcbiAgICBMaWJzVWlDb21wb25lbnRzTGFiZWxDb21wb25lbnQsXG4gICAgTGlic1VpQ29tcG9uZW50c0lucHV0c01lbnRpb25EaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNJbnB1dHNRdWlsbDJ4Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvL3JlZ2lvbiBQcml2YXRlXG4gIHByaXZhdGUgaXNQYXN0ZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcXVpbGw/OiBRdWlsbDJ4O1xuICBwcml2YXRlIGFkZEVkaXRMaW5rQ29tcG9uZW50UmVmID0gc2lnbmFsPENvbXBvbmVudFJlZjxMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50PiB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB1cGxvYWRJbWFnZUNvbXBvbmVudFJlZiA9IHNpZ25hbDxDb21wb25lbnRSZWY8TGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsVXBsb2FkSW1hZ2VDb21wb25lbnQ+IHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGhhbmRsZXJzID0gc2lnbmFsPFJlY29yZDxzdHJpbmcsICguLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiB2b2lkPj4oe1xuICAgIGxpbms6IHRoaXMuaGFuZGxlU2hvd1VwbG9hZExpbmsuYmluZCh0aGlzKSxcbiAgICB1bmRvOiB0aGlzLmhhbmRsZVVuZG8uYmluZCh0aGlzKSxcbiAgICByZWRvOiB0aGlzLmhhbmRsZVJlZG8uYmluZCh0aGlzKSxcbiAgICB0YWJsZTogdGhpcy5oYW5kbGVUYWJsZS5iaW5kKHRoaXMpLFxuICAgIGltYWdlOiB0aGlzLmhhbmRsZXJTaG93VXBsb2FkSW1hZ2UuYmluZCh0aGlzKSxcbiAgfSk7XG4gIHByaXZhdGUgdGltZXJTZXRGb250U2l6ZSA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdGltZXJDYWxjdWxhdG9yVG9vbGJhciA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdG90YWxSZWNhbGxDYWxjdWxhdG9yVG9vbGJhciA9IHNpZ25hbDxudW1iZXI+KDApO1xuICBwcml2YXRlIGlzQ2FsY3VsYXRvclRvb2xiYXJTdWNjZXNzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBzaG93TWVudGlvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIC8vZW5kcmVnaW9uXG5cbiAgLy9yZWdpb24gUHJvdGVjdGVkXG4gIHByb3RlY3RlZCBib3JkZXJDb2xvciA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4gKHRoaXMubWVzc2FnZUVycm9yKCkgJiYgdGhpcy5zaG93RXJyb3JCb3JkZXIoKSA/ICcgIWJvcmRlci1bdmFyKC0tbGlicy11aS1jb2xvci1ib3JkZXItZXJyb3IsI2VlMmQ0MSldICcgOiAnIWJvcmRlci1bI2U1ZTdlYl0gJykpO1xuICBwcm90ZWN0ZWQgY29udGFpbmVyQ2xhc3MgPSBjb21wdXRlZCgoKSA9PiBgcXVpbGwtY29udGFpbmVyIGZsZXggZmxleC1jb2wgaC1mdWxsIHctZnVsbCAke2dldCh0aGlzLnF1aWxsQ3VzdG9tQ29uZmlnKCkgYXMgSVF1aWxsMnhDdXN0b21Db25maWcsICdjbGFzc0NvbnRhaW5lcicpIHx8ICcnfWApO1xuICBwcm90ZWN0ZWQgY29udGFpbmVyVG9vbGJhckNsYXNzID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIGBib3JkZXItdCBib3JkZXItbCBib3JkZXItciAke3RoaXMuaWdub3JlU2hvd0JvcmRlckVycm9yVG9vbGJhcigpID8gJyFib3JkZXItWyNlNWU3ZWJdICcgOiB0aGlzLmJvcmRlckNvbG9yKCl9cm91bmRlZC10LVs0cHhdICR7dGhpcy5yZWFkb25seSgpID8gJyBsaWJzLXVpLXJlYWRvbmx5LWJhY2tncm91bmQgY3Vyc29yLWRlZmF1bHQgcG9pbnRlci1ldmVudHMtbm9uZSAgJyA6ICcgJ30gJHtnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAndG9vbGJhci5jbGFzc0N1c3RvbUNvbnRhaW5lclRvb2xiYXInKSB8fCAnJ30gJHtnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAndG9vbGJhci5wb3NpdGlvbkZpeGVkJykgPyAnIGZpeGVkICcgOiAnICd9YFxuICApO1xuICBwcm90ZWN0ZWQgY29udGFpbmVyRWRpdG9yQ2xhc3MgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgYGgtZnVsbCAhYm9yZGVyICR7dGhpcy5ib3JkZXJDb2xvcigpfSAhcm91bmRlZC1iLVs0cHhdICR7dGhpcy5yZWFkb25seSgpID8gJyBsaWJzLXVpLXJlYWRvbmx5LWJhY2tncm91bmQgJyA6ICcgJ30gJHtnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAnZWRpdG9yLmNsYXNzQ3VzdG9tQ29udGFpbmVyRWRpdG9yJykgfHwgJyd9ICR7Z2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ3Rvb2xiYXIucG9zaXRpb25GaXhlZCcpID8gJyByb3VuZGVkLXQtWzRweF0gJyA6ICcgJ31gXG4gICk7XG5cbiAgcHJvdGVjdGVkIHNob3dCdXR0b25Nb3JlVG9vbGJhciA9IGNvbXB1dGVkKCgpID0+IHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcoKS5zb21lKChpdGVtKSA9PiBpdGVtLmRpc3BsYXkgPT09IGZhbHNlKSk7XG4gIHByb3RlY3RlZCBkaXNwbGF5U2tlbGV0b25Ub29sYmFyID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50b29sYmFyT3B0aW9uc0NvbmZpZygpLmV2ZXJ5KChpdGVtKSA9PiBpdGVtLmRpc3BsYXkgPT09IHVuZGVmaW5lZCkpO1xuXG4gIHByb3RlY3RlZCBsYWJlbEZvbnRTZWxlY3RlZENvbXB1dGVkID0gY29tcHV0ZWQoKCkgPT4gZ2V0PHVua25vd24+KHRoaXMuZm9udFNlbGVjdGVkKCksICdpdGVtLmxhYmVsJykgfHwgJ1NhbnMgU2VyaWYnKTtcbiAgcHJvdGVjdGVkIGZvbnRTZWxlY3RlZCA9IHNpZ25hbDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGxpc3RDb25maWdGb250ID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4obGlzdENvbmZpZ0ZvbnQoKSk7XG5cbiAgcHJvdGVjdGVkIGxpc3RDb25maWdIZWFkZXIgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtPihsaXN0Q29uZmlnSGVhZGVyKCkpO1xuICBwcm90ZWN0ZWQgaGVhZGVyU2VsZWN0ZWQgPSBzaWduYWw8SUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBsYWJlbEhlYWRlclNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiBnZXQ8dW5rbm93bj4odGhpcy5oZWFkZXJTZWxlY3RlZCgpLCAnaXRlbS5sYWJlbCcpIHx8ICdOb3JtYWwnKTtcblxuICBwcm90ZWN0ZWQgbGlzdENvbmZpZ0FsaWduID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4obGlzdENvbmZpZ0FsaWduKCkpO1xuICBwcm90ZWN0ZWQgYWxpZ25TZWxlY3RlZCA9IHNpZ25hbDxJRW1pdFNlbGVjdEtleSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGljb25BbGlnblNlbGVjdGVkQ29tcHV0ZWQgPSBjb21wdXRlZCgoKSA9PiBnZXQodGhpcy5hbGlnblNlbGVjdGVkKCkgYXMgdW5rbm93biwgJ2l0ZW0uaWNvbicpKTtcblxuICBwcm90ZWN0ZWQgY29sb3JTZWxlY3RlZCA9IHNpZ25hbDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBiYWNrZ3JvdW5kU2VsZWN0ZWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBwcm90ZWN0ZWQgbGlzdENoZWNrYm94U2VsZWN0ZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcm90ZWN0ZWQgYWRqdXN0U2VsZWN0ZWQgPSBzaWduYWw8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBtZXNzYWdlRXJyb3IgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gIHByb3RlY3RlZCBmb250U2l6ZSA9IHNpZ25hbDx7IHZhbHVlOiBudW1iZXIgfT4oeyB2YWx1ZTogMTQgfSk7XG4gIHByb3RlY3RlZCBsaW5rID0gc2lnbmFsPElRdWlsbDJ4TGluaz4obGlua0RlZmF1bHQoKSk7XG5cbiAgcHJvdGVjdGVkIHNob3dNb3JlQWN0aW9uID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIHRvb2xiYXJPcHRpb25zQ29uZmlnOiBXcml0YWJsZVNpZ25hbDxBcnJheTxJUXVpbGwyeFRvb2xiYXJDb25maWc+PiA9IHNpZ25hbChbXSk7XG5cbiAgcHJvdGVjdGVkIGxvYWRpbmdVcGxvYWRJbWFnZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHJlYWRvbmx5IHVwbG9hZEltYWdlQ29uZmlnID0gaW5wdXQ8SVF1aWxsMnhVcGxvYWRJbWFnZUNvbmZpZywgSVF1aWxsMnhVcGxvYWRJbWFnZUNvbmZpZyB8IHVuZGVmaW5lZD4odXBsb2FkSW1hZ2VDb25maWdEZWZhdWx0KCksIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8IHVwbG9hZEltYWdlQ29uZmlnRGVmYXVsdCgpIH0pO1xuXG4gIC8vcmVnaW9uIElucHV0c1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignaTE4bl9pbXBvcnRfY29udGVudCcsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlIHx8ICdpMThuX2ltcG9ydF9jb250ZW50JyB9KTtcbiAgcmVhZG9ubHkgYmxvdHNSZWdpc3RlciA9IGlucHV0PEFycmF5PElRdWlsbDJ4QmxvdFJlZ2lzdGVyPj4oKTtcbiAgcmVhZG9ubHkgcmVhZG9ubHkgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IHF1aWxsQ3VzdG9tQ29uZmlnID0gaW5wdXQ8SVF1aWxsMnhDdXN0b21Db25maWc+KCk7XG5cbiAgcmVhZG9ubHkgbGFiZWwgPSBpbnB1dDxJTGFiZWwgfCB1bmRlZmluZWQ+KCk7XG4gIHJlYWRvbmx5IGl0ZW0gPSBtb2RlbC5yZXF1aXJlZDxUWVBFX09CSkVDVD4oKTtcbiAgcmVhZG9ubHkgZmllbGRCaW5kID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuICByZWFkb25seSBhdXRvVXBkYXRlVmFsdWVXaGVuVGV4dENoYW5nZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IHRydWUgfSk7XG5cbiAgcmVhZG9ubHkgZGF0YUNvbmZpZ01lbnRpb24gPSBpbnB1dDxJTWVudGlvbkNvbmZpZz4oKTtcbiAgcmVhZG9ubHkgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxUWVBFX1RFTVBMQVRFX1JFRj4+KCk7XG5cbiAgcmVhZG9ubHkgekluZGV4ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDEyNTAsIHsgdHJhbnNmb3JtOiAodmFsdWUpID0+IHZhbHVlID8/IDEyNTAgfSk7XG4gIHJlYWRvbmx5IGlnbm9yZVNob3dQb3B1cEVkaXRMaW5rID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQ29tbXVuaWNhdGVNaWNyb0V2ZW50UG9wdXAgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBoYW5kbGVyc0V4cGFuZCA9IGlucHV0PEFycmF5PHsgdGl0bGU6IHN0cmluZzsgYWN0aW9uOiAoKSA9PiB2b2lkIH0+PigpO1xuICByZWFkb25seSByZXNpemVJbWFnZVBsdWdpbiA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgZm9udFNpemVEZWZhdWx0ID0gaW5wdXQ8bnVtYmVyLCBudW1iZXIgfCB1bmRlZmluZWQ+KDE0LCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAxNCB9KTtcbiAgcmVhZG9ubHkgaGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1pbkhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0ID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBtYXhIZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdCA9IGlucHV0PG51bWJlcj4oKTtcblxuICByZWFkb25seSByZW1vdmVOZWFyV2hpdGVDb2xvcnNPblBhc3RlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcmVhZG9ubHkgcmVzaXplID0gaW5wdXQ8J3ZlcnRpY2FsJyB8ICdub25lJywgJ3ZlcnRpY2FsJyB8ICdub25lJyB8IHVuZGVmaW5lZD4oJ25vbmUnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSA/PyAnbm9uZScgfSk7XG4gIHJlYWRvbmx5IGF1dG9Gb2N1cyA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGZvY3VzQm90dG9tID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICByZWFkb25seSB2YWxpZFJlcXVpcmVkID0gaW5wdXQ8SVZhbGlkUmVxdWlyZWQ+KCk7XG4gIHJlYWRvbmx5IHZhbGlkTWluTGVuZ3RoID0gaW5wdXQ8SVZhbGlkTGVuZ3RoPigpO1xuICByZWFkb25seSB2YWxpZE1heExlbmd0aCA9IGlucHV0PElWYWxpZExlbmd0aD4oKTtcbiAgcmVhZG9ubHkgc2hvd0Vycm9yTGFiZWwgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogKHZhbCkgPT4gdmFsID8/IHRydWUgfSk7XG4gIHJlYWRvbmx5IHNob3dFcnJvckJvcmRlciA9IGlucHV0PGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUpO1xuICByZWFkb25seSBpZ25vcmVTaG93Qm9yZGVyRXJyb3JUb29sYmFyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvL2VuZHJlZ2lvblxuXG4gIC8vcmVnaW9uIE91dHB1dHNcbiAgcmVhZG9ubHkgb3V0U2hvd1BvcHVwRWRpdExpbmsgPSBvdXRwdXQ8e1xuICAgIGRhdGFMaW5rOiBJUXVpbGwyeExpbms7XG4gICAgY2FsbGJhY2s6IChsaW5rRWRpdDogeyB0aXRsZTogc3RyaW5nOyBsaW5rOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfT4oKTtcbiAgcmVhZG9ubHkgb3V0TWVzc2FnZUVycm9yID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgb3V0Qmx1ciA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRGb2N1cyA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBvdXRDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSBvdXRTZWxlY3Rpb25DaGFuZ2UgPSBvdXRwdXQ8SVF1aWxsMnhTZWxlY3Rpb25DaGFuZ2U+KCk7XG4gIHJlYWRvbmx5IG91dFRleHRDaGFuZ2UgPSBvdXRwdXQ8SVF1aWxsMnhUZXh0Q2hhbmdlPigpO1xuICByZWFkb25seSBvdXRDb250ZXh0TWVudSA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElRdWlsbDJ4RnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG4gIC8vZW5kcmVnaW9uXG5cbiAgLy9yZWdpb24gVmlld0NoaWxkXG4gIHByaXZhdGUgcmVhZG9ubHkgaHRtbENvbnRhaW5lciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2h0bWxDb250YWluZXInKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlsbEJvZHlDb250YWluZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdzbm93Q29udGFpbmVyJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckNvbnRhaW5lciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ3Rvb2xiYXJDb250YWluZXInKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dExpbmtSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8TGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQ+KCdpbnB1dExpbmtSZWYnKTtcbiAgLy9lbmRyZWdpb25cblxuICAvL3JlZ2lvbiBJbmplY3RcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vdGlmaWNhdGlvblNlcnZpY2UgPSBpbmplY3QoTGlic1VpTm90aWZpY2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY0NvbXBvbmVudFNlcnZpY2UgPSBpbmplY3QoTGlic1VpRHluYW1pY0NvbXBvbmVudFNlcnZpY2UpO1xuICAvL2VuZHJlZ2lvblxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5mb250U2l6ZURlZmF1bHQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9udFNpemUuc2V0KHsgdmFsdWU6IHRoaXMuZm9udFNpemVEZWZhdWx0KCkgfSk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVyVmFsdWVDaGFuZ2VGb250U2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50RWRpdG9yID0gdGhpcy5xdWlsbEJvZHlDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3FsLWVkaXRvcicpPy5bMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5oZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdCgpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgaWYgKGVsZW1lbnRFZGl0b3IpIHtcbiAgICAgICAgICAgIGVsZW1lbnRFZGl0b3Iuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5oZWlnaHRFZGl0b3JDb250ZW50RGVmYXVsdCgpfXB4YDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubWluSGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQoKSkge1xuICAgICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50RWRpdG9yKSB7XG4gICAgICAgICAgICBlbGVtZW50RWRpdG9yLnN0eWxlLm1pbkhlaWdodCA9IGAke3RoaXMubWluSGVpZ2h0RWRpdG9yQ29udGVudERlZmF1bHQoKX1weGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm1heEhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0KCkpIHtcbiAgICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgICBpZiAoZWxlbWVudEVkaXRvcikge1xuICAgICAgICAgICAgZWxlbWVudEVkaXRvci5zdHlsZS5tYXhIZWlnaHQgPSBgJHt0aGlzLm1heEhlaWdodEVkaXRvckNvbnRlbnREZWZhdWx0KCl9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCB0eXBlID0gZ2V0KHRoaXMucXVpbGxDdXN0b21Db25maWcoKSBhcyBJUXVpbGwyeEN1c3RvbUNvbmZpZywgJ3Rvb2xiYXIudHlwZScsICdkZWZhdWx0JykgYXMgVFlQRV9NT0RFX0JBUl9DT05GSUdfT1BUSU9OO1xuICAgIGNvbnN0IGhhc0ljb25JbWFnZSA9IHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5zaG93SWNvbiA/PyBmYWxzZTtcbiAgICBjb25zdCBoYXNJY29uUGVyc29uYWxpemUgPSAhIXRoaXMudGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUoKTtcbiAgICB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnLnNldChnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAndG9vbGJhci5vcHRpb25zJywgdG9vbEJhck9wdGlvbnModHlwZSwgaGFzSWNvbkltYWdlLCBoYXNJY29uUGVyc29uYWxpemUpKSk7XG5cbiAgICB0aGlzLmNhbGN1bGF0b3JUb29sYmFyKCk7XG4gICAgcmVnaXN0ZXJRdWlsbDJ4KCk7XG4gICAgdGhpcy5ibG90c1JlZ2lzdGVyKCk/LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIFF1aWxsMngucmVnaXN0ZXIoaXRlbS5jb21wb25lbnQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVIYW5kbGVyRnVuY3Rpb24oKTtcblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICB0aGVtZTogJ3Nub3cnLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodGhpcy5wbGFjZWhvbGRlcigpKSxcbiAgICAgIHJlYWRPbmx5OiB0aGlzLnJlYWRvbmx5KCksXG4gICAgICBtb2R1bGVzOiB7XG4gICAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgICBjb250YWluZXI6IHRoaXMudG9vbGJhckNvbnRhaW5lcigpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgaGFuZGxlcnM6IHRoaXMuaGFuZGxlcnMoKSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzaXplOiB0aGlzLnJlc2l6ZUltYWdlUGx1Z2luKClcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbG9jYWxlOiB7XG4gICAgICAgICAgICAgICAgYWx0VGlwOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX2tlZXBfYWx0X2tleV90b19jaGFuZ2VfdGhlX3JhdGlvX3doZW5fY2hhbmdpbmdfdGhlX3NpemUnKSxcbiAgICAgICAgICAgICAgICBpbnB1dFRpcDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnaTE4bl9wcmVzc19lbnRlcl90b19jb25maXJtJyksXG4gICAgICAgICAgICAgICAgZmxvYXRMZWZ0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX2xlZnRfYWxpZ24nKSxcbiAgICAgICAgICAgICAgICBmbG9hdFJpZ2h0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX3JpZ2h0X2FsaWduJyksXG4gICAgICAgICAgICAgICAgY2VudGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdpMThuX2NlbnRlcl9hbGlnbicpLFxuICAgICAgICAgICAgICAgIHJlc3RvcmU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5fcmVzdG9yZV90b19kZWZhdWx0JyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHRhYmxlOiB0cnVlLFxuICAgICAgICBjbGlwYm9hcmQ6IHtcbiAgICAgICAgICBtYXRjaGVyczogW1xuICAgICAgICAgICAgW05vZGUuVEVYVF9OT0RFLCAobm9kZTogeyBkYXRhOiBzdHJpbmcgfSkgPT4gbmV3IERlbHRhKCkuaW5zZXJ0KG5vZGUuZGF0YSldLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVOZWFyV2hpdGVDb2xvcnNPblBhc3RlKClcbiAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICBOb2RlLkVMRU1FTlRfTk9ERSxcbiAgICAgICAgICAgICAgICAgIChub2RlOiBIVE1MRWxlbWVudCwgZGVsdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGUgJiYgdGhpcy5pc1Bhc3RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdPcHMgPSBkZWx0YS5vcHMubWFwKChvcDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdBdHRycyA9IHsgLi4ub3AuYXR0cmlidXRlcyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IG5ld0F0dHJzLmNvbG9yIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZCA9IG5ld0F0dHJzLmJhY2tncm91bmQgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvciAmJiBpc05lYXJXaGl0ZShjb2xvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmV3QXR0cnMuY29sb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFja2dyb3VuZCAmJiBpc05lYXJXaGl0ZShiYWNrZ3JvdW5kKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdBdHRycy5iYWNrZ3JvdW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ub3AsIGF0dHJpYnV0ZXM6IE9iamVjdC5rZXlzKG5ld0F0dHJzKS5sZW5ndGggPyBuZXdBdHRycyA6IHVuZGVmaW5lZCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWx0YShuZXdPcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWx0YTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIGtleWJvYXJkOiB7XG4gICAgICAgICAgYmluZGluZ3M6IHtcbiAgICAgICAgICAgIGJhY2tzcGFjZToge1xuICAgICAgICAgICAgICBrZXk6IFV0aWxzS2V5Q29kZUNvbnN0YW50LkJBQ0tTUEFDRSxcbiAgICAgICAgICAgICAgaGFuZGxlcjogKHJhbmdlOiBSYW5nZSkgPT4gdGhpcy5ub1ByZXZlbnRFbWJlZERlbGV0aW9uKHJhbmdlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZWxldGU6IHtcbiAgICAgICAgICAgICAga2V5OiBVdGlsc0tleUNvZGVDb25zdGFudC5ERUxFVEUsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IChyYW5nZTogUmFuZ2UpID0+IHRoaXMubm9QcmV2ZW50RW1iZWREZWxldGlvbihyYW5nZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW50ZXI6IHtcbiAgICAgICAgICAgICAga2V5OiAxMyxcbiAgICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4gKHRoaXMuc2hvd01lbnRpb24oKSA/IGZhbHNlIDogdHJ1ZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBkZWxheTogMjAwMCxcbiAgICAgICAgICBtYXhTdGFjazogNTAwLFxuICAgICAgICAgIHVzZXJPbmx5OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgdGhpcy5xdWlsbCA9IG5ldyBRdWlsbDJ4KHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCkubmF0aXZlRWxlbWVudCwgb3B0aW9ucyk7XG4gICAgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCk/Lm5hdGl2ZUVsZW1lbnQsICdjb250ZXh0bWVudScpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKGUpID0+IHRoaXMub3V0Q29udGV4dE1lbnUuZW1pdChlKSk7XG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jYWxjdWxhdG9yVG9vbGJhcih0cnVlKSk7XG4gICAgdGhpcy5oYW5kbGVyVGV4dENoYW5nZSgpO1xuICAgIHRoaXMuaGFuZGxlclNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIHRoaXMucXVpbGw/LnJvb3QuYWRkRXZlbnRMaXN0ZW5lcigncGFzdGUnLCB0aGlzLmhhbmRsZXJQYXN0ZSwgdHJ1ZSk7XG4gICAgdGhpcy5vdXRGdW5jdGlvbnNDb250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICBhd2FpdCB0aGlzLnNldENvbnRlbnQodGhpcy5pdGVtKClbdGhpcy5maWVsZEJpbmQoKV0gYXMgc3RyaW5nKTtcbiAgICB0aGlzLnNldFN0eWxlRm9yQ29udGVudCgpO1xuICAgIGlmICh0aGlzLmF1dG9Gb2N1cygpKSB7XG4gICAgICB0aW1lcigxMDAwKVxuICAgICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLmZvY3VzKCkpO1xuICAgIH1cbiAgICBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlKHRoaXMucXVpbGwgYXMgUXVpbGwyeCwgdGhpcy50cmFuc2xhdGUpO1xuICAgIGVuYWJsZVRhYmxlU2VsZWN0aW9uKHRoaXMucXVpbGwucm9vdCk7XG4gICAgZ2V0QWxsVGFibGVzV2l0aFNwYW4odGhpcy5xdWlsbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSVF1aWxsMnhGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1aWxsOiAoKSA9PiB0aGlzLnF1aWxsIGFzIFF1aWxsMngsXG4gICAgICBjaGVja0lzVmFsaWQ6IHRoaXMudmFsaWRhdGUuYmluZCh0aGlzKSxcbiAgICAgIHJlZnJlc2hJdGVtVmFsdWU6IHRoaXMudXBkYXRlVmFsdWVCeVJvb3RRdWlsbEh0bWwuYmluZCh0aGlzKSxcbiAgICAgIHNldENvbnRlbnQ6IHRoaXMuc2V0Q29udGVudC5iaW5kKHRoaXMpLFxuICAgICAgaW5zZXJ0VGV4dDogdGhpcy5pbnNlcnRUZXh0LmJpbmQodGhpcyksXG4gICAgICBpbnNlcnRMaW5rOiB0aGlzLmluc2VydExpbmsuYmluZCh0aGlzKSxcbiAgICAgIGluc2VydEltYWdlOiB0aGlzLmluc2VydEltYWdlLmJpbmQodGhpcyksXG4gICAgICBzZXRGb250U2l6ZTogYXN5bmMgKHNpemU6IG51bWJlcikgPT4gdGhpcy5xdWlsbD8uZm9ybWF0KCdzaXplJywgYCR7c2l6ZX1weGApLFxuICAgICAgc2V0Q29sb3I6IGFzeW5jIChjb2xvcjogc3RyaW5nKSA9PiB0aGlzLnF1aWxsPy5mb3JtYXQoJ2NvbG9yJywgY29sb3IpLFxuICAgICAgc2V0QmFja2dyb3VuZDogYXN5bmMgKGNvbG9yOiBzdHJpbmcpID0+IHRoaXMucXVpbGw/LmZvcm1hdCgnYmFja2dyb3VuZCcsIGNvbG9yKSxcbiAgICAgIHNldE1lc3NhZ2VFcnJvcjogYXN5bmMgKG1lc3NhZ2U6IHN0cmluZykgPT4gdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KG1lc3NhZ2UpLFxuICAgICAgcmVDYWxjdWxhdG9yVG9vbGJhcjogYXN5bmMgKCkgPT4gdGhpcy5jYWxjdWxhdG9yVG9vbGJhcih0cnVlKSxcbiAgICB9O1xuICB9XG5cbiAgLy9yZWdpb24gaGFuZGxlciBFdmVudCBIVE1MXG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VTaG93TW9yZUFjdGlvbihldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNob3dNb3JlQWN0aW9uLnVwZGF0ZSgoc2hvd01vcmVBY3Rpb24pID0+ICFzaG93TW9yZUFjdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU2VsZWN0Rm9udChldmVudDogSUVtaXRTZWxlY3RLZXkgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmZvbnRTZWxlY3RlZC5zZXQoZXZlbnQpO1xuICAgIHRoaXMucXVpbGw/LmZvcm1hdCgnZm9udCcsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3RIZWFkZXIoZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5oZWFkZXJTZWxlY3RlZC5zZXQoZXZlbnQpO1xuICAgIHRoaXMucXVpbGw/LmZvcm1hdCgnaGVhZGVyJywgZXZlbnQ/LmtleSBhcyBzdHJpbmcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJWYWx1ZUNoYW5nZUZvbnRTaXplKGV2ZW50PzogSUZvY3VzQW5kQmx1ckV2ZW50KSB7XG4gICAgaWYgKCFldmVudCB8fCBldmVudD8ubmFtZSA9PT0gJ2JsdXInKSB7XG4gICAgICB0aGlzLnF1aWxsPy5mb3JtYXQoJ3NpemUnLCBgJHt0aGlzLmZvbnRTaXplKCkudmFsdWV9cHhgKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlU2VsZWN0QWxpZ24oZXZlbnQ6IElFbWl0U2VsZWN0S2V5IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hbGlnblNlbGVjdGVkLnNldChldmVudCk7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0KCdhbGlnbicsIGV2ZW50Py5rZXkgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2V0Rm9ybWF0KHR5cGU6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0KHR5cGUsIGRhdGEpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnNlcnRFbW9qaShlbW9qaTogdW5rbm93bikge1xuICAgIHRoaXMuaW5zZXJ0VGV4dChlbW9qaSBhcyBzdHJpbmcsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclVubGluayhldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBsaW5rID0gdGhpcy5saW5rKCk7XG4gICAgdGhpcy5xdWlsbD8uZm9ybWF0VGV4dChsaW5rLnJhbmdlLmluZGV4LCBsaW5rLnJhbmdlLmxlbmd0aCwgeyBsaW5rOiBmYWxzZSB9KTtcbiAgICB0aGlzLmlucHV0TGlua1JlZigpLkZ1bmN0aW9uc0NvbnRyb2w/LnJlbW92ZVBvcG92ZXJPdmVybGF5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckVkaXRMaW5rKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmxpbmsoKTtcbiAgICBpZiAodGhpcy5pZ25vcmVTaG93UG9wdXBFZGl0TGluaygpKSB7XG4gICAgICB0aGlzLm91dFNob3dQb3B1cEVkaXRMaW5rLmVtaXQoe1xuICAgICAgICBkYXRhTGluazogbGluayxcbiAgICAgICAgY2FsbGJhY2s6IGFzeW5jIChsaW5rRWRpdDogeyB0aXRsZTogc3RyaW5nOyBsaW5rOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChsaW5rIGluc3RhbmNlb2YgT2JqZWN0ICYmIGxpbmsudXJsKSB7XG4gICAgICAgICAgICB0aGlzLnF1aWxsPy5kZWxldGVUZXh0KGxpbmsucmFuZ2UuaW5kZXgsIGxpbmsucmFuZ2UubGVuZ3RoLCBRdWlsbDJ4LnNvdXJjZXMuVVNFUik7XG4gICAgICAgICAgICB0aGlzLnF1aWxsPy5pbnNlcnRUZXh0KGxpbmsucmFuZ2UuaW5kZXgsIGxpbmtFZGl0LnRpdGxlLCAnbGluaycsIGxpbmtFZGl0LmxpbmspO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluc2VydExpbmsobGlua0VkaXQudGl0bGUsIGxpbmtFZGl0LmxpbmspO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaGFuZGxlU2hvd1VwbG9hZExpbmsobGluayk7XG4gICAgdGhpcy5pbnB1dExpbmtSZWYoKS5GdW5jdGlvbnNDb250cm9sPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZVRvZ2dsZU1lbnRpb24oc2hvdzogYm9vbGVhbikge1xuICAgIHRoaXMuc2hvd01lbnRpb24uc2V0KHNob3cpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJJbnNlcnRNZW50aW9uKGRhdGE6IElNZW50aW9uSW5zZXJ0KSB7XG4gICAgdGhpcy5pbnNlcnRNZW50aW9uKGRhdGEpO1xuICB9XG5cbiAgLy9lbmRyZWdpb25cblxuICAvL3JlZ2lvbiBQcml2YXRlIE1ldGhvZFxuXG4gIC8vcmVnaW9uIFF1aWxsIE1ldGhvZHNcbiAgcHJpdmF0ZSBoYW5kbGVUYWJsZSgpIHtcbiAgICBjb25zdCBidXR0b24gPSB0aGlzLmh0bWxDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I/LignYnV0dG9uLnFsLXRhYmxlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGNyZWF0ZVRhYmxlU2VsZWN0b3IodGhpcy5xdWlsbCBhcyBRdWlsbDJ4LCBidXR0b24sIHRoaXMudHJhbnNsYXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVW5kbygpIHtcbiAgICB0aGlzLnF1aWxsPy5oaXN0b3J5Py51bmRvKCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlZG8oKSB7XG4gICAgdGhpcy5xdWlsbD8uaGlzdG9yeT8ucmVkbygpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVyU2hvd1VwbG9hZEltYWdlKCkge1xuICAgIGlmICh0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkubW9kZUN1c3RvbSkge1xuICAgICAgdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZi5zZXQodGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudCkpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLnVwbG9hZEltYWdlQ29tcG9uZW50UmVmKCk/Lmluc3RhbmNlO1xuICAgICAgdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgndXBsb2FkSW1hZ2VDb25maWcnLCB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkpO1xuICAgICAgdGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpPy5zZXRJbnB1dCgnaWdub3JlQ29tbXVuaWNhdGVNaWNyb0V2ZW50JywgdGhpcy5pZ25vcmVDb21tdW5pY2F0ZU1pY3JvRXZlbnRQb3B1cCgpKTtcbiAgICAgIGluc3RhbmNlPy5vdXRDbG9zZS5zdWJzY3JpYmUoKGxpbms6IHN0cmluZyB8IHZvaWQpID0+IHtcbiAgICAgICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy51cGxvYWRJbWFnZUNvbXBvbmVudFJlZigpKTtcbiAgICAgICAgaWYgKGxpbmspIHtcbiAgICAgICAgICB0aGlzLmluc2VydEltYWdlKGxpbmspO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UuYWRkVG9Cb2R5KHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2ZpbGUnKTtcbiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ2FjY2VwdCcsICdpbWFnZS8qJyk7XG4gICAgaW5wdXQuY2xpY2soKTtcbiAgICBpbnB1dC5vbmNoYW5nZSA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudXBsb2FkSW1hZ2VzQW5kSW5zZXJ0KGlucHV0Py5maWxlcyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0VGV4dChjb250ZW50OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyLCBmb2N1c0xhc3RWYWx1ZUluc2VydD86IGJvb2xlYW4pIHtcbiAgICBpbmRleCA9IGluZGV4ID8/IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICBpZiAoIWlzTmlsKGluZGV4KSkge1xuICAgICAgdGhpcy5xdWlsbD8uaW5zZXJ0VGV4dChpbmRleCwgY29udGVudCwgUXVpbGwyeC5zb3VyY2VzLlVTRVIpO1xuICAgICAgaWYgKGZvY3VzTGFzdFZhbHVlSW5zZXJ0KSB7XG4gICAgICAgIGF3YWl0IGxhc3RWYWx1ZUZyb20odGltZXIoMCkpO1xuICAgICAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24oaW5kZXggKyBjb250ZW50Lmxlbmd0aCwgMCwgUXVpbGwyeC5zb3VyY2VzLlVTRVIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclNlbGVjdGlvbkNoYW5nZSgpIHtcbiAgICB0aGlzLnF1aWxsPy5vbignc2VsZWN0aW9uLWNoYW5nZScsIChyYW5nZTogUmFuZ2UsIG9sZFJhbmdlOiBSYW5nZSwgc291cmNlOiBFbWl0dGVyU291cmNlKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZWFkb25seSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5nZSA9PT0gbnVsbCAmJiBvbGRSYW5nZSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm91dEJsdXIuZW1pdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmFuZ2UgIT09IG51bGwgJiYgb2xkUmFuZ2UgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRGb2N1cy5lbWl0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0ID0gdGhpcy51cGRhdGVTdGF0ZVRvb2xiYXJCeUZvcm1hdEluQ3Vyc29yKCk7XG4gICAgICB0aGlzLm91dFNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgcXVpbGw6IHRoaXMucXVpbGwgYXMgUXVpbGwyeCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIG9sZFJhbmdlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJhbmdlLmxlbmd0aCAhPT0gMCB8fCAhZm9ybWF0Py5saW5rIHx8IHNvdXJjZSAhPT0gJ3VzZXInKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICBjb25zdCBhbmNob3JOb2RlID0gc2VsZWN0aW9uPy5hbmNob3JOb2RlO1xuICAgICAgbGV0IGxpbmtOb2RlID0gYW5jaG9yTm9kZSBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICAgIHdoaWxlIChsaW5rTm9kZSAmJiBsaW5rTm9kZS50YWdOYW1lICE9PSAnQScpIHtcbiAgICAgICAgbGlua05vZGUgPSBsaW5rTm9kZS5wYXJlbnROb2RlIGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpbmtOb2RlIHx8IGxpbmtOb2RlLnRhZ05hbWUgIT09ICdBJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmtUZXh0ID0gbGlua05vZGUuaW5uZXJUZXh0O1xuICAgICAgY29uc3QgbGlua3NJbmRpY2VzOiBBcnJheTxudW1iZXI+ID0gW107XG4gICAgICBsZXQgaW5kZXhSZXR1cm46IG51bWJlciB8IHVuZGVmaW5lZCA9IC0xO1xuICAgICAgd2hpbGUgKCFpc05pbChpbmRleFJldHVybikgJiYgaW5kZXhSZXR1cm4gPCByYW5nZS5pbmRleCkge1xuICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IHRoaXMucXVpbGw/LmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgbGlua0luZGV4ID0gdGV4dENvbnRlbnQ/LmluZGV4T2YobGlua1RleHQsIGxpbmtzSW5kaWNlcy5sZW5ndGggPiAwID8gbGlua3NJbmRpY2VzW2xpbmtzSW5kaWNlcy5sZW5ndGggLSAxXSArIGxpbmtUZXh0Lmxlbmd0aCA6IDApO1xuICAgICAgICBpZiAoIWlzTmlsKGxpbmtJbmRleCkpIHtcbiAgICAgICAgICBpZiAobGlua0luZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGlua3NJbmRpY2VzLnB1c2gobGlua0luZGV4KTtcbiAgICAgICAgICAgIGluZGV4UmV0dXJuID0gbGlua0luZGV4ICsgbGlua1RleHQubGVuZ3RoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobGlua0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgaW5kZXhSZXR1cm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGlua3NJbmRpY2VzICYmIGxpbmtzSW5kaWNlcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgcmFuZ2VJbmRleCA9IGxpbmtzSW5kaWNlc1tsaW5rc0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IGNvdW50SW1hZ2UgPSB0aGlzLmFkanVzdEluZGV4Rm9ySW1hZ2VzKHJhbmdlSW5kZXgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxpbmsuc2V0KHtcbiAgICAgICAgICAgIHRpdGxlOiBsaW5rVGV4dCxcbiAgICAgICAgICAgIHVybDogbGlua05vZGUuaHJlZixcbiAgICAgICAgICAgIHJhbmdlOiB7XG4gICAgICAgICAgICAgIGluZGV4OiByYW5nZUluZGV4ICsgY291bnRJbWFnZSxcbiAgICAgICAgICAgICAgbGVuZ3RoOiBsaW5rVGV4dC5sZW5ndGgsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuaW5wdXRMaW5rUmVmKCkuRnVuY3Rpb25zQ29udHJvbD8uc2hvd1BvcG92ZXIobGlua05vZGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlclBhc3RlID0gYXN5bmMgKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuICAgIHRoaXMuaXNQYXN0ZS5zZXQodHJ1ZSk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlzUGFzdGUuc2V0KGZhbHNlKSwgMCk7XG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQuY2xpcGJvYXJkRGF0YSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmNsaXBib2FyZERhdGEuZmlsZXM7XG4gICAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBhd2FpdCB0aGlzLnVwbG9hZEltYWdlc0FuZEluc2VydChmaWxlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVyVGV4dENoYW5nZSgpIHtcbiAgICB0aGlzLnF1aWxsPy5vbigndGV4dC1jaGFuZ2UnLCAoZXZlbnQsIF8sIHNvdXJjZSkgPT4ge1xuICAgICAgdGhpcy5vdXRUZXh0Q2hhbmdlLmVtaXQoe1xuICAgICAgICBxdWlsbDogdGhpcy5xdWlsbCBhcyBRdWlsbDJ4LFxuICAgICAgICBkZWx0YTogZXZlbnQsXG4gICAgICB9KTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGV0ZWN0TGluayhzb3VyY2UpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlVG9vbGJhckJ5Rm9ybWF0SW5DdXJzb3IoKTtcblxuICAgICAgICBpZiAoZXZlbnQ/Lm9wc1sxXT8uaW5zZXJ0ID09PSAnXFxuJykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0geyBpbmRleDogZXZlbnQ/Lm9wc1swXS5yZXRhaW4gYXMgbnVtYmVyIH07XG4gICAgICAgICAgY29uc3QgY3VycmVudExlYWYgPSB0aGlzLnF1aWxsPy5nZXRMZWFmKHJhbmdlLmluZGV4KVswXSBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgbmV4dExlYWYgPSB0aGlzLnF1aWxsPy5nZXRMZWFmKHJhbmdlLmluZGV4ICsgMSlbMF0gYXMgYW55O1xuICAgICAgICAgIHRoaXMucXVpbGw/Lmluc2VydEVtYmVkKHJhbmdlLmluZGV4LCAnYnJlYWsnLCB0cnVlLCAndXNlcicpO1xuICAgICAgICAgIGlmIChuZXh0TGVhZiA9PT0gbnVsbCB8fCBjdXJyZW50TGVhZi5wYXJlbnQgIT09IG5leHRMZWFmLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5xdWlsbD8uaW5zZXJ0RW1iZWQocmFuZ2UuaW5kZXgsICdicmVhaycsIHRydWUsICd1c2VyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucXVpbGw/LnNldFNlbGVjdGlvbigocmFuZ2UuaW5kZXggfHwgMCkgKyAxLCAwLCBRdWlsbDJ4LnNvdXJjZXMuU0lMRU5UKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoIXRoaXMuYXV0b1VwZGF0ZVZhbHVlV2hlblRleHRDaGFuZ2UoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZVZhbHVlQnlSb290UXVpbGxIdG1sKCk7XG4gICAgfSk7XG4gIH1cblxuICAvL2VuZHJlZ2lvblxuXG4gIHByaXZhdGUgdXBkYXRlU3RhdGVUb29sYmFyQnlGb3JtYXRJbkN1cnNvcigpOiB7IFtmb3JtYXQ6IHN0cmluZ106IHVua25vd24gfSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZvcm1hdCA9IHRoaXMucXVpbGw/LmdldEZvcm1hdCgpO1xuICAgICAgaWYgKGZvcm1hdCkge1xuICAgICAgICB0aGlzLnNldEZvbnRTaXplU2VsZWN0ZWQoZm9ybWF0KTtcbiAgICAgICAgdGhpcy5zZXRGb250U2VsZWN0ZWQoZm9ybWF0KTtcbiAgICAgICAgdGhpcy5zZXRDb2xvclNlbGVjdGVkKGZvcm1hdCk7XG4gICAgICAgIHRoaXMubGlzdENoZWNrYm94U2VsZWN0ZWQuc2V0KGZvcm1hdD8ubGlzdCA9PT0gJ3VuY2hlY2tlZCcgfHwgZm9ybWF0Py5saXN0ID09PSAnY2hlY2tlZCcpO1xuICAgICAgICB0aGlzLmFkanVzdFNlbGVjdGVkLnNldChmb3JtYXQ/LmFsaWduIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KCcnKTtcbiAgICBjb25zdCB2YWxpZFJlcXVpcmVkID0gdGhpcy52YWxpZFJlcXVpcmVkKCk7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbSgpO1xuICAgIGNvbnN0IGZpZWxkTmFtZUJpbmQgPSB0aGlzLmZpZWxkQmluZCgpO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0PHVua25vd24+KGl0ZW0sIGZpZWxkTmFtZUJpbmQpO1xuICAgIGlmICh2YWxpZFJlcXVpcmVkICYmIHZhbGlkUmVxdWlyZWQuaXNSZXF1aXJlZCAmJiAhdGhpcy5yZWFkb25seSgpICYmIHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1ibGFuaycpLmxlbmd0aCkge1xuICAgICAgdGhpcy5tZXNzYWdlRXJyb3Iuc2V0KHZhbGlkUmVxdWlyZWQubWVzc2FnZSB8fCBFUlJPUl9NRVNTQUdFX0VNUFRZX1ZBTElEKTtcbiAgICAgIHRoaXMub3V0TWVzc2FnZUVycm9yLmVtaXQodGhpcy5tZXNzYWdlRXJyb3IoKSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkTWluTGVuZ3RoID0gdGhpcy52YWxpZE1pbkxlbmd0aCgpO1xuICAgIGlmICh2YWxpZE1pbkxlbmd0aCAmJiBmaWVsZE5hbWVCaW5kICYmIHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPCB2YWxpZE1pbkxlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1pbkxlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUlOX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB2YWxpZE1heExlbmd0aCA9IHRoaXMudmFsaWRNYXhMZW5ndGgoKTtcbiAgICBpZiAodmFsaWRNYXhMZW5ndGggJiYgZmllbGROYW1lQmluZCAmJiB2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gdGhpcy52YWxpZE1heExlbmd0aC5sZW5ndGgpIHtcbiAgICAgIHRoaXMubWVzc2FnZUVycm9yLnNldCh2YWxpZE1heExlbmd0aC5tZXNzYWdlIHx8IEVSUk9SX01FU1NBR0VfTUFYX0xFTkdUSCk7XG4gICAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm91dE1lc3NhZ2VFcnJvci5lbWl0KHRoaXMubWVzc2FnZUVycm9yKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVIYW5kbGVyRnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaGFuZGxlcnNFeHBhbmQgPSB0aGlzLmhhbmRsZXJzRXhwYW5kKCk7XG5cbiAgICBpZiAoaGFuZGxlcnNFeHBhbmQgJiYgaGFuZGxlcnNFeHBhbmQubGVuZ3RoKSB7XG4gICAgICBoYW5kbGVyc0V4cGFuZC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50LnRpdGxlICYmIGVsZW1lbnQuYWN0aW9uKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVycy51cGRhdGUoKGl0ZW0pID0+ICh7IC4uLml0ZW0sIFtlbGVtZW50LnRpdGxlXTogZWxlbWVudC5hY3Rpb24gfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vUHJldmVudEVtYmVkRGVsZXRpb24ocmFuZ2U6IFJhbmdlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnF1aWxsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVsdGEgPSB0aGlzLnF1aWxsPy5nZXRDb250ZW50cyhyYW5nZS5pbmRleCwgMSk7XG5cbiAgICBpZiAoZGVsdGE/Lm9wcy5zb21lKChvcHRpb24pID0+IHRoaXMuYmxvdHNSZWdpc3RlcigpPy5maW5kKChpdGVtKSA9PiBnZXQob3B0aW9uLmluc2VydCwgaXRlbS5jb21wb25lbnRbJ2Jsb3ROYW1lJ10pICYmIGl0ZW0uaWdub3JlRGVsZXRlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gTmfEg24ga2jDtG5nIGNobyBRdWlsbCB44butIGzDvSB4w7NhXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldEZvbnRTaXplU2VsZWN0ZWQoZm9ybWF0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZvbnRTaXplID0gZm9ybWF0Py5zaXplPy50b1N0cmluZygpPy5yZXBsYWNlKCdweCcsICcnKTtcbiAgICBpZiAoaXNOYU4ocGFyc2VGbG9hdChmb250U2l6ZSBhcyBzdHJpbmcpKSkge1xuICAgICAgdGhpcy5mb250U2l6ZS5zZXQoeyB2YWx1ZTogdGhpcy5mb250U2l6ZURlZmF1bHQoKSB9KTtcbiAgICAgIC8vIHRoaXMuaGFuZGxlclZhbHVlQ2hhbmdlRm9udFNpemUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb250U2l6ZS5zZXQoeyB2YWx1ZTogcGFyc2VGbG9hdChmb250U2l6ZSBhcyBzdHJpbmcpIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRGb250U2VsZWN0ZWQoZm9ybWF0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGNvbnN0IGZvbnQgPSBsaXN0Rm9udCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSBmb3JtYXQuZm9udCk7XG4gICAgaWYgKCFmb250KSB7XG4gICAgICB0aGlzLmZvbnRTZWxlY3RlZC5zZXQoeyBrZXk6ICcnLCBpdGVtOiBsaXN0Rm9udCgpLmZpbmQoKGl0ZW0pID0+IGl0ZW0ua2V5ID09PSAnJykgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZm9udFNlbGVjdGVkLnNldCh7IGtleTogZm9ybWF0LmZvbnQsIGl0ZW06IGZvbnQgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbG9yU2VsZWN0ZWQoZm9ybWF0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIHRoaXMuY29sb3JTZWxlY3RlZC5zZXQoZm9ybWF0Py5jb2xvciBhcyBzdHJpbmcpO1xuICAgIHRoaXMuYmFja2dyb3VuZFNlbGVjdGVkLnNldChmb3JtYXQ/LmJhY2tncm91bmQgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsY3VsYXRvclRvb2xiYXIocmVzZXRUb3RhbFJlY2FsbD86IGJvb2xlYW4pIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lckNhbGN1bGF0b3JUb29sYmFyKCkpO1xuICAgIGlmIChyZXNldFRvdGFsUmVjYWxsKSB7XG4gICAgICB0aGlzLnRvdGFsUmVjYWxsQ2FsY3VsYXRvclRvb2xiYXIuc2V0KDApO1xuICAgIH1cbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgY29uc3QgdG9vbGJhcldpZHRoID0gdGhpcy50b29sYmFyQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAwO1xuICAgIGxldCB0b3RhbFdpZHRoID0gODQ7XG4gICAgaWYgKCF0aGlzLmlzQ2FsY3VsYXRvclRvb2xiYXJTdWNjZXNzKCkgJiYgdGhpcy50b3RhbFJlY2FsbENhbGN1bGF0b3JUb29sYmFyKCkgPCAxMCAmJiB0b29sYmFyV2lkdGggPCBnZXQodGhpcy5xdWlsbEN1c3RvbUNvbmZpZygpIGFzIElRdWlsbDJ4Q3VzdG9tQ29uZmlnLCAndG9vbGJhci5sZXNzV2lkdGhUb29sYmFyUmVjYWxsQ2FsY3VsYXRvcicsIHRvdGFsV2lkdGgpKSB7XG4gICAgICB0aGlzLnRvdGFsUmVjYWxsQ2FsY3VsYXRvclRvb2xiYXIudXBkYXRlKCh2YWwpID0+IHZhbCArIDEpO1xuICAgICAgdGhpcy50aW1lckNhbGN1bGF0b3JUb29sYmFyLnNldChcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYWxjdWxhdG9yVG9vbGJhcigpO1xuICAgICAgICB9LCAyNTApXG4gICAgICApO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNDYWxjdWxhdG9yVG9vbGJhclN1Y2Nlc3Muc2V0KHRydWUpO1xuICAgIHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcudXBkYXRlKChjb25maWdzKSA9PiB7XG4gICAgICBjb25maWdzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIGl0ZW0uZGlzcGxheSA9IHRydWU7XG4gICAgICAgIHRvdGFsV2lkdGggKz0gaXRlbS53aWR0aDtcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgY29uc3QgbmV4dEl0ZW1XaWR0aCA9IHRvdGFsV2lkdGggKyB0aGlzLnRvb2xiYXJPcHRpb25zQ29uZmlnKClbK2luZGV4ICsgMV0ud2lkdGg7XG4gICAgICAgICAgY29uc3QgcHJlSXRlbSA9IHRoaXMudG9vbGJhck9wdGlvbnNDb25maWcoKVsraW5kZXggLSAxXTtcbiAgICAgICAgICBpZiAobmV4dEl0ZW1XaWR0aCA+IHRvb2xiYXJXaWR0aCAmJiBwcmVJdGVtLmRpc3BsYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGl0ZW0uZGlzcGxheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdGFsV2lkdGggPiB0b29sYmFyV2lkdGgpIHtcbiAgICAgICAgICBpdGVtLmRpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFsuLi5jb25maWdzXTtcbiAgICB9KTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNldFN0eWxlRm9yQ29udGVudCgpIHtcbiAgICBjb25zdCBzdHlsZUFycmF5ID0gW1xuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LUFyaWFsJywgc3R5bGU6ICdmb250LWZhbWlseTogQXJpYWwnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2Fucy1zZXJpZicsIHN0eWxlOiAnZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2VyaWYnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBzZXJpZicgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1tb25vc3BhY2UnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBtb25vc3BhY2UnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtSGVsdmV0aWNhJywgc3R5bGU6ICdmb250LWZhbWlseTogSGVsdmV0aWNhJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5saWJzLXVpLXF1aWxsLWZvcm1hdC1pbWFnZScsIHN0eWxlOiAnbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG8nLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLmxpYnMtdWktcXVpbGwtbWVudGlvbicsIHN0eWxlOiAnZm9udC13ZWlnaHQ6IDYwMDstbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyBjb2xvcjogIzcyMzlFQScsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICdibG9ja3F1b3RlJywgc3R5bGU6ICdib3JkZXItbGVmdDogNHB4IHNvbGlkICNjY2M7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLWxlZnQ6IDE2cHgnLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgXTtcbiAgICB0aGlzLmJsb3RzUmVnaXN0ZXIoKT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3R5bGVBcnJheS5wdXNoKHsgc2VsZWN0b3I6IGAuJHtpdGVtLmNsYXNzTmFtZX1gLCBzdHlsZTogaXRlbS5zdHlsZSwgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBzdHlsZUFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5xdWlsbD8ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKGl0ZW0uc2VsZWN0b3IpO1xuICAgICAgZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ub3ZlcnJpZGVTdHlsZSkge1xuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsIGl0ZW0uc3R5bGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaXhidWcgaXNzdWU6IGh0dHBzOi8vYWRtaW4tY3YubW9iaW8udm4vaXNzdWVzLzQ5MDkyXG4gICAgICAgIGxldCBzdHlsZUV4aXN0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgIGlmIChzdHlsZUV4aXN0KSB7XG4gICAgICAgICAgWydmb250LWZhbWlseTogQXJpYWwnLCAnZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYnLCAnZm9udC1mYW1pbHk6IHNlcmlmJywgJ2ZvbnQtZmFtaWx5OiBtb25vc3BhY2UnLCAnZm9udC1mYW1pbHk6IEhlbHZldGljYSddLmZvckVhY2goKGZvbnQpID0+IHtcbiAgICAgICAgICAgIHN0eWxlRXhpc3QgPSAoc3R5bGVFeGlzdD8uaW5jbHVkZXMoYCR7Zm9udH07YCkgPyBzdHlsZUV4aXN0Py5yZXBsYWNlKGAke2ZvbnR9O2AsICcnKSA6IHN0eWxlRXhpc3Q/LnJlcGxhY2UoZm9udCwgJycpKSBhcyBzdHJpbmc7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgc3R5bGVFeGlzdCA/IGAke3N0eWxlRXhpc3R9JHtzdHlsZUV4aXN0W3N0eWxlRXhpc3QubGVuZ3RoIC0gMV0gPT09ICc7JyA/ICcnIDogJzsnfSR7aXRlbS5zdHlsZX07YCA6IGl0ZW0uc3R5bGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldENvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnF1aWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbnRlbnRYc3NGaWx0ZXIgPSBhd2FpdCB4c3NGaWx0ZXIodGhpcy5yZW1vdmVVbndhbnRlZFBhcnQoY29udGVudCB8fCAnJykpO1xuICAgIHRoaXMucXVpbGwuY2xpcGJvYXJkLmRhbmdlcm91c2x5UGFzdGVIVE1MKGNvbnRlbnRYc3NGaWx0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RJbmRleEZvckltYWdlcyhpbmRleDogbnVtYmVyKSB7XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMucXVpbGw/LnJvb3Q7XG4gICAgbGV0IGltYWdlQ291bnQgPSAwO1xuICAgIGxldCBhZGp1c3RlZEluZGV4ID0gMDtcbiAgICBjb25zdCBhZGp1c3RUZXh0SW5kZXggPSAobm9kZTogTm9kZSkgPT4ge1xuICAgICAgaWYgKGFkanVzdGVkSW5kZXggPiBpbmRleCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgYWRqdXN0ZWRJbmRleCArPSBub2RlLnRleHRDb250ZW50Py5sZW5ndGggfHwgMDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIG5vZGUubm9kZU5hbWUgPT09ICdJTUcnKSB7XG4gICAgICAgIGlmIChhZGp1c3RlZEluZGV4IDw9IGluZGV4KSB7XG4gICAgICAgICAgaW1hZ2VDb3VudCsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2RlcykuZm9yRWFjaChhZGp1c3RUZXh0SW5kZXgpO1xuICAgICAgfVxuICAgIH07XG4gICAgYWRqdXN0VGV4dEluZGV4KGNvbnRlbnQgYXMgTm9kZSk7XG4gICAgcmV0dXJuIGltYWdlQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwbG9hZEltYWdlc0FuZEluc2VydChmaWxlcz86IEZpbGVMaXN0IHwgbnVsbCkge1xuICAgIGlmICghZmlsZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWF4SW1hZ2VTaXplID0gdGhpcy51cGxvYWRJbWFnZUNvbmZpZygpPy5tYXhJbWFnZVNpemUgfHwgNSAqIDEwMjQgKiAxMDI0O1xuICAgIGNvbnN0IGltYWdlcyA9IEFycmF5LmZyb20oZmlsZXMpLmZpbHRlcigoZmlsZSkgPT4gZmlsZSAmJiBmaWxlLnR5cGUuc3BsaXQoJy8nKVswXSA9PT0gJ2ltYWdlJyAmJiAoIXRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5tYXhJbWFnZVNpemUgfHwgZmlsZS5zaXplIDw9IG1heEltYWdlU2l6ZSkpO1xuICAgIGlmICghaW1hZ2VzLmxlbmd0aCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dDb21wVHlwZVRleHRXYXJuaW5nKHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2kxOG5fbm90ZV91cGxvYWRfaW1hZ2Vfdm9sdW1lJywgeyB2YWx1ZTogZ2V0TGFiZWxCeVNpemVGaWxlKG1heEltYWdlU2l6ZSkgfSksIHsgdGltZVJlbW92ZTogODAwMCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMubG9hZGluZ1VwbG9hZEltYWdlLnNldCh0cnVlKTtcbiAgICAgIGNvbnN0IGluZGV4SW5zZXJ0ID0gdGhpcy5xdWlsbD8uZ2V0U2VsZWN0aW9uKHRydWUpLmluZGV4O1xuICAgICAgY29uc3QgbGlua3MgPSBhd2FpdCB0aGlzLnVwbG9hZEltYWdlQ29uZmlnKCkuZnVuY3Rpb25VcGxvYWRJbWFnZT8uKGltYWdlcyk7XG4gICAgICBpZiAoIWxpbmtzPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGlua3MuZm9yRWFjaCgobGluaykgPT4ge1xuICAgICAgICBpZiAoIWxpbmsgfHwgKHRoaXMudXBsb2FkSW1hZ2VDb25maWcoKS5vbmx5QWNjZXB0SW1hZ2VIdHRwc0xpbmsgJiYgKGxpbmsgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCAhbmV3IFJlZ0V4cChwYXR0ZXJuVXJsKCkpLnRlc3QobGluaykpKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluc2VydEltYWdlKGxpbmsgYXMgc3RyaW5nLCBpbmRleEluc2VydCk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZ1VwbG9hZEltYWdlLnNldChmYWxzZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5zZXJ0SW1hZ2UoY29udGVudDogc3RyaW5nLCBpbmRleD86IG51bWJlcikge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGluZGV4ID8/IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbih0cnVlKS5pbmRleDtcbiAgICBpZiAoIWlzTmlsKHNlbGVjdGlvbikpIHtcbiAgICAgIHRoaXMucXVpbGw/Lmluc2VydEVtYmVkKHNlbGVjdGlvbiwgJ2ltYWdlJywgY29udGVudCk7XG4gICAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uICsgMSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJQb3BvdmVyRXZlbnQoZXZlbnQ6IFRZUEVfUE9QT1ZFUl9FVkVOVCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGV2ZW50ID09PSAncmVtb3ZlJykge1xuICAgICAgICB0aGlzLmxpbmsuc2V0KGxpbmtEZWZhdWx0KCkpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluc2VydExpbmsodGV4dDogc3RyaW5nLCB1cmw6IHN0cmluZywgaW5kZXg/OiBudW1iZXIpIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLnF1aWxsPy5nZXRTZWxlY3Rpb24odHJ1ZSk7XG4gICAgY29uc3QgaW5kZXhJbnNlcnQgPSBpbmRleCA/PyBzZWxlY3Rpb24/LmluZGV4O1xuICAgIGlmIChzZWxlY3Rpb24/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5xdWlsbD8uZGVsZXRlVGV4dChzZWxlY3Rpb24uaW5kZXgsIHNlbGVjdGlvbi5sZW5ndGgsIFF1aWxsMnguc291cmNlcy5VU0VSKTtcbiAgICB9XG4gICAgaWYgKCFpc05pbChpbmRleEluc2VydCkpIHtcbiAgICAgIHRoaXMucXVpbGw/Lmluc2VydFRleHQoaW5kZXhJbnNlcnQsIHRleHQsIHtcbiAgICAgICAgbGluazogdXJsLFxuICAgICAgICBjb2xvcjogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNob3dVcGxvYWRMaW5rKGV2ZW50OiB1bmtub3duKSB7XG4gICAgdGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZi5zZXQodGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxMaW5rQ29tcG9uZW50KSk7XG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/Lmluc3RhbmNlO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHRleHRTZWxlY3RlZCA9IHNlbGVjdGlvbj8ubGVuZ3RoID8gdGhpcy5xdWlsbD8uZ2V0VGV4dChzZWxlY3Rpb24/LmluZGV4LCBzZWxlY3Rpb24/Lmxlbmd0aCkgOiAnJztcbiAgICBjb25zdCBkYXRhID0gZXZlbnQgYXMgSVF1aWxsMnhMaW5rIHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ3pJbmRleCcsIHRoaXMuekluZGV4KCkpO1xuICAgIHRoaXMuYWRkRWRpdExpbmtDb21wb25lbnRSZWYoKT8uc2V0SW5wdXQoJ3RpdGxlJywgZGF0YT8udGl0bGUgfHwgdGV4dFNlbGVjdGVkKTtcbiAgICB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCdsaW5rJywgZGF0YT8udXJsIHx8ICcnKTtcbiAgICB0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCk/LnNldElucHV0KCdpZ25vcmVDb21tdW5pY2F0ZU1pY3JvRXZlbnQnLCB0aGlzLmlnbm9yZUNvbW11bmljYXRlTWljcm9FdmVudFBvcHVwKCkpO1xuICAgIGluc3RhbmNlPy5vdXRTYXZlTGluay5zdWJzY3JpYmUoKGl0ZW06IHsgdGl0bGU6IHN0cmluZzsgbGluazogc3RyaW5nIH0pID0+IHtcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0ICYmIGRhdGEudXJsKSB7XG4gICAgICAgIHRoaXMucXVpbGw/LmRlbGV0ZVRleHQoZGF0YS5yYW5nZS5pbmRleCwgZGF0YS5yYW5nZS5sZW5ndGgsIFF1aWxsMnguc291cmNlcy5VU0VSKTtcbiAgICAgICAgdGhpcy5xdWlsbD8uaW5zZXJ0VGV4dChkYXRhLnJhbmdlLmluZGV4LCBpdGVtLnRpdGxlLCAnbGluaycsIGl0ZW0ubGluayk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5zZXJ0TGluayhpdGVtLnRpdGxlLCBpdGVtLmxpbmspO1xuICAgIH0pO1xuICAgIGluc3RhbmNlPy5vdXRDbG9zZS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5yZW1vdmUodGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpKSk7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50U2VydmljZS5hZGRUb0JvZHkodGhpcy5hZGRFZGl0TGlua0NvbXBvbmVudFJlZigpKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0TWVudGlvbihldmVudDogSU1lbnRpb25JbnNlcnQpIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMucXVpbGw/LmdldFNlbGVjdGlvbigpO1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5kZXhTdWJ0cmFjdCA9IHRoaXMucXVpbGw/LmdldFRleHQocmFuZ2UuaW5kZXggLSAxLCAxKT8uaW5jbHVkZXMoJ0AnKSA/IDAgOiAxO1xuICAgIGNvbnN0IGN1cnNvclBvcyA9IHJhbmdlLmluZGV4IC0gaW5kZXhTdWJ0cmFjdDtcbiAgICBjb25zdCBzdGFydFBvc0luc2VydCA9IGN1cnNvclBvcyAtIGV2ZW50Lmxlbmd0aEtleTtcbiAgICB0aGlzLnF1aWxsPy5kZWxldGVUZXh0KHN0YXJ0UG9zSW5zZXJ0LCBldmVudC5sZW5ndGhLZXksIFF1aWxsMnguc291cmNlcy5TSUxFTlQpO1xuICAgIHRoaXMucXVpbGw/Lmluc2VydEVtYmVkKHN0YXJ0UG9zSW5zZXJ0LCAnbWVudGlvbicsIGV2ZW50LmRhdGEsIFF1aWxsMnguc291cmNlcy5TSUxFTlQpO1xuICAgIHRoaXMuaW5zZXJ0VGV4dCgnICcsIHN0YXJ0UG9zSW5zZXJ0ICsgMSk7XG4gICAgaWYgKGluZGV4U3VidHJhY3QpIHtcbiAgICAgIHRoaXMucXVpbGw/LmRlbGV0ZVRleHQoc3RhcnRQb3NJbnNlcnQgKyAzLCAxLCBRdWlsbDJ4LnNvdXJjZXMuU0lMRU5UKTtcbiAgICB9XG4gICAgdGhpcy5xdWlsbD8uc2V0U2VsZWN0aW9uKHN0YXJ0UG9zSW5zZXJ0ICsgMiwgMCwgUXVpbGwyeC5zb3VyY2VzLlNJTEVOVCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVZhbHVlQnlSb290UXVpbGxIdG1sKCkge1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLnJlbW92ZVVud2FudGVkUGFydCh0aGlzLnF1aWxsPy5yb290LmlubmVySFRNTCB8fCAnJyk7XG4gICAgaWYgKCF0aGlzLnF1aWxsPy5yb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKS5sZW5ndGggJiYgIXRoaXMucXVpbGw/LmdldFRleHQoKSkge1xuICAgICAgc2V0PHVua25vd24+KHRoaXMuaXRlbSgpLCB0aGlzLmZpZWxkQmluZCgpLCAnJyk7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLm91dENoYW5nZS5lbWl0KGdldDx1bmtub3duPih0aGlzLml0ZW0sIHRoaXMuZmllbGRCaW5kKCkpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jb252ZXJ0SW5uZXJIVE1MQW5kU2V0VmFsdWUoaHRtbCk7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoZ2V0PHVua25vd24+KHRoaXMuaXRlbSwgdGhpcy5maWVsZEJpbmQoKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SW5uZXJIVE1MQW5kU2V0VmFsdWUoaHRtbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRTdHlsZUZvckNvbnRlbnQoKTtcbiAgICBzZXQ8dW5rbm93bj4odGhpcy5pdGVtKCksIHRoaXMuZmllbGRCaW5kKCksIGh0bWwpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVVbndhbnRlZFBhcnQoaHRtbDogc3RyaW5nKSB7XG4gICAgaWYgKCFodG1sKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBodG1sXG4gICAgICAucmVwbGFjZSgvXlxccyo8cD48YnI+PFxcL3A+LywgJycpXG4gICAgICAucmVwbGFjZSgvPGRpdj48YnI+PFxcL2Rpdj4vZ2ksICcnKVxuICAgICAgLnJlcGxhY2UoL1tcXHUyMDBCLVxcdTIwMERcXHVGRUZGXS9nLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIGRldGVjdExpbmsoc291cmNlOiBFbWl0dGVyU291cmNlKSB7XG4gICAgaWYgKHNvdXJjZSAhPT0gJ3VzZXInKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZ1bGxUZXh0ID0gdGhpcy5xdWlsbD8uZ2V0VGV4dCgpO1xuICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLmdldEluZGV4VXJsTWF0Y2goZnVsbFRleHQgfHwgJycpO1xuICAgIGlmIChpc05pbChmdWxsVGV4dCkgfHwgIWluZGV4ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluZGV4ZXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdGV4dFNlbGVjdGlvbiA9IHRoaXMucXVpbGw/LmdldFRleHQoaXRlbS5zdGFydCwgaXRlbS5lbmQgLSBpdGVtLnN0YXJ0KTtcbiAgICAgIGlmICghdGV4dFNlbGVjdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleG9mID0gdGV4dFNlbGVjdGlvbi5zZWFyY2gocGF0dGVyUHJvdG9jb2xVcmwoKSk7XG4gICAgICBpZiAoaW5kZXhvZiA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5xdWlsbD8uZm9ybWF0VGV4dChpdGVtLnN0YXJ0ICsgaW5kZXhvZiwgaXRlbS50ZXh0Lmxlbmd0aCwgeyBsaW5rOiBpdGVtLnRleHQsIGNvbG9yOiBmYWxzZSB9LCBRdWlsbDJ4LnNvdXJjZXMuU0lMRU5UKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5kZXhVcmxNYXRjaChmdWxsVGV4dDogc3RyaW5nKTogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgdGV4dDogc3RyaW5nIH0+IHtcbiAgICBjb25zdCB0ZXh0TWF0Y2ggPSBmdWxsVGV4dC5tYXRjaChuZXcgUmVnRXhwKHBhdHRlcm5VcmwoKS50b1N0cmluZygpLnJlcGxhY2UoJy9eJywgJycpLnJlcGxhY2UoJyQvJywgJycpLCAnaWcnKSk7XG4gICAgY29uc3QgaW5kZXhlczogQXJyYXk8eyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcjsgdGV4dDogc3RyaW5nOyBwcmVDaGFyYWN0ZXI6IHN0cmluZyB9PiA9IFtdO1xuICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICB0ZXh0TWF0Y2g/LmZvckVhY2goKHRleHQpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4T2ZUZXh0TWF0Y2ggPSBmdWxsVGV4dC5pbmRleE9mKHRleHQsIGluZGV4KTtcbiAgICAgIGNvbnN0IGluZGV4UHJlQ2hhcmFjdGVyID0gaW5kZXhPZlRleHRNYXRjaCAtIDE7XG4gICAgICBpbmRleCA9IGluZGV4T2ZUZXh0TWF0Y2ggKyB0ZXh0Lmxlbmd0aDtcbiAgICAgIGlmIChpbmRleE9mVGV4dE1hdGNoIDwgMCB8fCAhbmV3IFJlZ0V4cCgvXltcXHNdfF5bXFx0XXxeW1xcbl0vKS50ZXN0KGZ1bGxUZXh0W2luZGV4UHJlQ2hhcmFjdGVyXSB8fCAnJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXhlcy5wdXNoKHsgc3RhcnQ6IGluZGV4T2ZUZXh0TWF0Y2gsIGVuZDogaW5kZXhPZlRleHRNYXRjaCArIHRleHQubGVuZ3RoLCB0ZXh0LCBwcmVDaGFyYWN0ZXI6IGZ1bGxUZXh0W2luZGV4UHJlQ2hhcmFjdGVyXSB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBpbmRleGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1cygpIHtcbiAgICBpZiAodGhpcy5mb2N1c0JvdHRvbSgpKSB7XG4gICAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24odGhpcy5xdWlsbC5yb290LmlubmVySFRNTC5sZW5ndGgsIDAsIFF1aWxsMnguc291cmNlcy5TSUxFTlQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnF1aWxsPy5zZXRTZWxlY3Rpb24oMCwgMCwgUXVpbGwyeC5zb3VyY2VzLlNJTEVOVCk7XG4gIH1cblxuICAvL2VuZHJlZ2lvblxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyU2V0Rm9udFNpemUoKSk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXJDYWxjdWxhdG9yVG9vbGJhcigpKTtcbiAgICB0aGlzLmR5bmFtaWNDb21wb25lbnRTZXJ2aWNlLnJlbW92ZSh0aGlzLmFkZEVkaXRMaW5rQ29tcG9uZW50UmVmKCkpO1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudFNlcnZpY2UucmVtb3ZlKHRoaXMudXBsb2FkSW1hZ2VDb21wb25lbnRSZWYoKSk7XG4gICAgdGhpcy5xdWlsbD8ucm9vdC5yZW1vdmVFdmVudExpc3RlbmVyKCdwYXN0ZScsIHRoaXMuaGFuZGxlclBhc3RlLCB0cnVlKTtcbiAgfVxufVxuIiwiPGRpdlxuICAjaHRtbENvbnRhaW5lclxuICBbY2xhc3NdPVwiY29udGFpbmVyQ2xhc3MoKVwiXG4gIFtzdHlsZS4tLXJlc2l6ZV09XCJyZXNpemUoKVwiPlxuICBAaWYgKGxhYmVsKCk7IGFzIGxhYmVsKSB7XG4gICAgPGxpYnNfdWktY29tcG9uZW50cy1sYWJlbFxuICAgICAgW2NsYXNzSW5jbHVkZV09XCJsYWJlbC5jbGFzc0luY2x1ZGVcIlxuICAgICAgW3JlcXVpcmVkXT1cImxhYmVsLnJlcXVpcmVkXCJcbiAgICAgIFtsYWJlbExlZnRdPVwibGFiZWwubGFiZWxMZWZ0XCIgLz5cbiAgfVxuXG4gIDxkaXZcbiAgICAjdG9vbGJhckNvbnRhaW5lclxuICAgIGNsYXNzPVwicmVsYXRpdmUgaC1bNDRweF1cIlxuICAgIFtuZ1N0eWxlXT1cInF1aWxsQ3VzdG9tQ29uZmlnKCk/LnRvb2xiYXI/LigpPy5zdHlsZXM/LigpIHx8IHt9XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRvb2xiYXJUZW1wbGF0ZVwiIC8+XG4gIDwvZGl2PlxuICA8ZGl2XG4gICAgI3Nub3dDb250YWluZXJcbiAgICBMaWJzVWlDb21wb25lbnRzU2Nyb2xsT3ZlcmxheURpcmVjdGl2ZVxuICAgIExpYnNVaUNvbXBvbmVudHNJbnB1dHNNZW50aW9uRGlyZWN0aXZlXG4gICAgW29wdGlvbnNdPVwieyBpZ25vcmVUcmFuc3BhcmVudFNjcm9sbEJhckNvbG9yRGVmYXVsdDogcmVzaXplKCkgIT09ICdub25lJyB9XCJcbiAgICBbbWVudGlvbkNvbmZpZ109XCJkYXRhQ29uZmlnTWVudGlvbigpXCJcbiAgICAob3V0VG9nZ2xlKT1cImhhbmRsZVRvZ2dsZU1lbnRpb24oJGV2ZW50KVwiXG4gICAgKG91dEluc2VydE1lbnRpb24pPVwiaGFuZGxlckluc2VydE1lbnRpb24oJGV2ZW50KVwiXG4gICAgW2NsYXNzXT1cImNvbnRhaW5lckVkaXRvckNsYXNzKClcIj48L2Rpdj5cbiAgQGlmIChtZXNzYWdlRXJyb3IoKSAmJiBzaG93RXJyb3JMYWJlbCgpKSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG10LVs4cHhdXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInRleHQtWyNmZjU0NTRdIGxpYnMtdWktZm9udC1oN3JcIj57eyBtZXNzYWdlRXJyb3IoKSB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjdG9vbGJhclRlbXBsYXRlPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cImNvbnRhaW5lclRvb2xiYXJDbGFzcygpXCJcbiAgICAjdG9vbGJhckl0ZW1zPlxuICAgIEBpZiAoZGlzcGxheVNrZWxldG9uVG9vbGJhcigpKSB7XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLXNrZWxldG9uXG4gICAgICAgIGNsYXNzPVwidy1mdWxsIGgtZnVsbFwiXG4gICAgICAgIFtjb25maWddPVwie1xuICAgICAgICAgIHJvd3M6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgaXRlbTogeyBjbGFzc0luY2x1ZGVJdGVtOiAnIXJvdW5kZWQtbm9uZScgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVwiIC8+XG4gICAgfVxuICAgIDxkaXYgY2xhc3M9XCJxbC1mb3JtYXRzIGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzRweF0gIWZsZXhcIj5cbiAgICAgIEBmb3IgKG9wdGlvbiBvZiB0b29sYmFyT3B0aW9uc0NvbmZpZygpOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiFvcHRpb24uZGlzcGxheVwiXG4gICAgICAgICAgW2NsYXNzLmZsZXhdPVwib3B0aW9uLmRpc3BsYXlcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRvb2xiYXJUZW1wbGF0ZTsgY29udGV4dDogeyBvcHRpb24sICRpbmRleCwgJGxhc3QgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlXCI+XG4gICAgICAgIEBpZiAoc2hvd0J1dHRvbk1vcmVUb29sYmFyKCkpIHtcbiAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgICBbdHlwZV09XCJzaG93TW9yZUFjdGlvbigpID8gJ2J1dHRvbi1zZWNvbmRhcnknIDogJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLVsxcHhdICFoLVsyMHB4XSBtbC1bOHB4XSdcIlxuICAgICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCdcIlxuICAgICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDaGFuZ2VTaG93TW9yZUFjdGlvbigkZXZlbnQpXCIgLz5cbiAgICAgICAgfVxuICAgICAgICA8IS0tIEJ1aWxkIHRvb2xiYXIga2hpIGNsaWNrIHhlbSB0aMOqbS0tPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhc2hvd01vcmVBY3Rpb24oKVwiXG4gICAgICAgICAgY2xhc3M9XCJhYnNvbHV0ZSBiZy1bI2ZmZmZmZl0gc2hhZG93LVswcHhfNHB4XzE2cHhfMHB4X3JnYmEoMCwyMCw1MSwwLjEwKV0gei1bMV0gZmxleCBpdGVtcy1jZW50ZXIgcGwtWzhweF0gcHItWzE2cHhdIHB5LVs0cHhdIHJvdW5kZWQtWzhweF0gdG9wLVszMXB4XSByaWdodC1bMHB4XVwiPlxuICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiB0b29sYmFyT3B0aW9uc0NvbmZpZygpOyB0cmFjayBvcHRpb24pIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIm9wdGlvbi5kaXNwbGF5ICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIFtjbGFzcy5mbGV4XT1cIm9wdGlvbi5kaXNwbGF5ID09PSBmYWxzZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbVRvb2xiYXJUZW1wbGF0ZTsgY29udGV4dDogeyBvcHRpb24sICRpbmRleCwgJGxhc3QgfVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNpdGVtVG9vbGJhclRlbXBsYXRlXG4gIGxldC0kaW5kZXg9XCIkaW5kZXhcIlxuICBsZXQtJGxhc3Q9XCIkbGFzdFwiXG4gIGxldC1vcHRpb249XCJvcHRpb25cIj5cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3VuZG8nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl91bmRvJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC11bmRvXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3JlZG8nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9yZWRvJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1yZWRvXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2ZvbnRGYW1pbHknKSB7XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJyZWxhdGl2ZSB3LVsxMzJweF0gaC1mdWxsIHJvdW5kZWQtWzRweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIlxuICAgICAgW2NsYXNzLmJnLXdoaXRlXT1cIiFyZWFkb25seSgpICYmICFsb2FkaW5nVXBsb2FkSW1hZ2UoKVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtsYWJlbFBvcG92ZXJGdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImxpc3RDb25maWdGb250KClcIlxuICAgICAgICBbbGlzdEhhc0J1dHRvblVuU2VsZWN0T3B0aW9uXT1cImZhbHNlXCJcbiAgICAgICAgW2xpc3RIaWRkZW5JbnB1dFNlYXJjaF09XCJ0cnVlXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuICAgICAgICBbekluZGV4XT1cIjEyNTBcIlxuICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZVNlbGVjdEZvbnQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGZvbnRTZWxlY3RlZCgpOyBhcyBmb250U2VsZWN0ZWQpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXIgcHktWzdweF0gbGlicy11aS1mb250LWg1ciBwbC1bMTZweF0gcHItWzQwcHhdXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgekluZGV4OiB6SW5kZXgoKSB9XCI+XG4gICAgICAgICAgICAgIHt7IGxhYmVsRm9udFNlbGVjdGVkQ29tcHV0ZWQoKSB9fVxuICAgICAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwIGFic29sdXRlIHJpZ2h0LVsxMnB4XSB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XVwiPjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2hlYWRlcicpIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInJlbGF0aXZlIHctWzEzOHB4XSBoLWZ1bGwgcm91bmRlZC1bNHB4XSBsaWJzLXVpLWJvcmRlci1nZW5lcmFsIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiXG4gICAgICBbY2xhc3MuYmctd2hpdGVdPVwiIXJlYWRvbmx5KCkgJiYgIWxvYWRpbmdVcGxvYWRJbWFnZSgpXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIFtpc05nQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgW2xhYmVsUG9wb3ZlckZ1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwieyB3aWR0aEJ5UGFyZW50OiBmYWxzZSwgd2lkdGg6IDIwMCwgY2xhc3NJbmNsdWRlOiAnaC1bMjU0cHhdJywgY2xhc3NJbmNsdWRlT3ZlcmxheUJvZHk6ICdoLWZ1bGwnLCBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogLTggfSB9XCJcbiAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0hlYWRlcigpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seSgpXCJcbiAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCItMVwiXG4gICAgICAgIFt6SW5kZXhdPVwiMTI1MFwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlU2VsZWN0SGVhZGVyKCRldmVudClcIj5cbiAgICAgICAgQGlmIChoZWFkZXJTZWxlY3RlZCgpOyBhcyBoZWFkZXJTZWxlY3RlZCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBweS1bN3B4XSBsaWJzLXVpLWZvbnQtaDVyIHBsLVsxNnB4XSBwci1bNDBweF0ge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgICAgICAgICAgICAgW3R5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIlxuICAgICAgICAgICAgICBbY29uZmlnXT1cInsgekluZGV4OiB6SW5kZXgoKSB9XCI+XG4gICAgICAgICAgICAgIHt7IGxhYmVsSGVhZGVyU2VsZWN0ZWRDb21wdXRlZCgpIH19XG4gICAgICAgICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAgYWJzb2x1dGUgcmlnaHQtWzEycHhdIHRleHQtWyM2YTczODNdIHRleHQtWzE2cHhdXCI+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZm9udFNpemUnKSB7XG4gICAgPGRpdiBjbGFzcz1cIiB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICNpbnB1dFNpemVSZWZcbiAgICAgICAgW2RhdGFUeXBlXT1cIidpbnQnXCJcbiAgICAgICAgWyhpdGVtKV09XCJmb250U2l6ZVwiXG4gICAgICAgIFtmaWVsZE5hbWVCaW5kXT1cIid2YWx1ZSdcIlxuICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwiMVwiXG4gICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCI3MlwiXG4gICAgICAgIFttaW5WYWx1ZU51bWJlcl09XCI4XCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5KCkgfHwgbG9hZGluZ1VwbG9hZEltYWdlKClcIlxuICAgICAgICBbY2xhc3NDb250YWluZXJJbnB1dF09XCIndy1bNzJweF0gaC1bMzJweF0nXCJcbiAgICAgICAgKG91dENoYW5nZVZhbHVlQnlCdXR0b25VcERvd24pPVwiaGFuZGxlclZhbHVlQ2hhbmdlRm9udFNpemUoKVwiXG4gICAgICAgIChvdXRGb2N1c0FuZEJsdXIpPVwiaGFuZGxlclZhbHVlQ2hhbmdlRm9udFNpemUoJGV2ZW50KVwiIC8+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2NvbG9yJykge1xuICAgIDxkaXYgY2xhc3M9XCJxbC1jb2xvciBxbC1waWNrZXIgcWwtY29sb3ItcGlja2VyICFmbGV4IGl0ZW1zLWNlbnRlciB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fdGV4dF9jb2xvcicsIHpJbmRleDogekluZGV4KCkgfVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yXG4gICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgW2RpcmVjdGlvbl09XCIndG9wJ1wiXG4gICAgICAgICAgW2V4dGVybmFsQ29udGVudF09XCJ0cnVlXCJcbiAgICAgICAgICBbY3VzdG9tT3B0aW9uc109XCJ7XG4gICAgICAgICAgICBzaG93QWxwaGE6IHRydWUsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW2FwcGx5Tm93XT1cImZhbHNlXCJcbiAgICAgICAgICAob3V0Q29sb3JDaGFuZ2UpPVwiaGFuZGxlclNldEZvcm1hdCgnY29sb3InLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJsaWJzLXVpLWljb24tZWRpdG9yLWNvbG9yLXRleHQgbGlicy11aS1idXR0b25zLXNlbGVjdC1jb2xvciB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XSBob3Zlcjp0ZXh0LVt2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEpXVwiXG4gICAgICAgICAgICBbY2xhc3MubGlicy11aS1pY29uLWVkaXRvci1jb2xvci10ZXh0LWFjdGl2ZV09XCIhIWNvbG9yU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICBbc3R5bGUuLS1jb2xvci1zZWxlY3RlZF09XCJjb2xvclNlbGVjdGVkKClcIj48L2Rpdj5cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3RfY29sb3I+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdiYWNrZ3JvdW5kJykge1xuICAgIDxkaXYgY2xhc3M9XCJxbC1iYWNrZ3JvdW5kIHFsLXBpY2tlciBxbC1jb2xvci1waWNrZXIgIWZsZXggaXRlbXMtY2VudGVyIHt7IG9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJyB9fVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9iYWNrZ3JvdW5kX2NvbG9yJywgekluZGV4OiB6SW5kZXgoKSB9XCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1zZWxlY3RfY29sb3JcbiAgICAgICAgICBbekluZGV4XT1cInpJbmRleCgpXCJcbiAgICAgICAgICBbZGlyZWN0aW9uXT1cIid0b3AnXCJcbiAgICAgICAgICBbZXh0ZXJuYWxDb250ZW50XT1cInRydWVcIlxuICAgICAgICAgIFthcHBseU5vd109XCJmYWxzZVwiXG4gICAgICAgICAgW2N1c3RvbU9wdGlvbnNdPVwie1xuICAgICAgICAgICAgc2hvd0FscGhhOiB0cnVlLFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvdXRDb2xvckNoYW5nZSk9XCJoYW5kbGVyU2V0Rm9ybWF0KCdiYWNrZ3JvdW5kJywgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibGlicy11aS1pY29uLWVkaXRvci1jb2xvci1iYWNrZ3JvdW5kIGxpYnMtdWktYnV0dG9ucy1zZWxlY3QtY29sb3IgdGV4dC1bIzZhNzM4M10gdGV4dC1bMTZweF0gaG92ZXI6dGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0xKV1cIlxuICAgICAgICAgICAgW2NsYXNzLmxpYnMtdWktaWNvbi1lZGl0b3ItY29sb3ItYmFja2dyb3VuZC1hY3RpdmVdPVwiISFiYWNrZ3JvdW5kU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICBbc3R5bGUuLS1iYWNrZ3JvdW5kLXNlbGVjdGVkXT1cImJhY2tncm91bmRTZWxlY3RlZCgpXCI+PC9kaXY+XG4gICAgICAgIDwvbGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtc2VsZWN0X2NvbG9yPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtcG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYm9sZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2ZvbnRfd2VpZ2h0X2JvbGQnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWJvbGQgIWZsZXhcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaXRhbGljJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fZm9udF9zdHlsZV9pdGFsaWMnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWl0YWxpYyAhZmxleFwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICd1bmRlcmxpbmUnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl90ZXh0X2RlY29yYXRpb25fdW5kZXJsaW5lJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC11bmRlcmxpbmUgIWZsZXhcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnc3RyaWtlVGhyb3VnaCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3RleHRfbGluZV90aHJvdWdoJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1zdHJpa2UgIWZsZXhcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnc2NyaXB0LnN1YicpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3NjcmlwdF9zdWInLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXNjcmlwdCBmbGV4XCJcbiAgICAgICAgdmFsdWU9XCJzdWJcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnc2NyaXB0LnN1cGVyJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fc2NyaXB0X3N1cGVyJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1zY3JpcHQgZmxleFwiXG4gICAgICAgIHZhbHVlPVwic3VwZXJcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYWRqdXN0Jykge1xuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSAhZmxleCBpdGVtcy1jZW50ZXIgcWwtYWxpZ24gcWwtcGlja2VyIHFsLWljb24tcGlja2VyICF3LW1heCB7eyBvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XScgfX1cIj5cbiAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtcG9wb3ZlciBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fYWRqdXN0JywgekluZGV4OiB6SW5kZXgoKSB9XCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd25cbiAgICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2lnbm9yZVN0b3BQcm9wYWdhdGlvbkV2ZW50XT1cInRydWVcIlxuICAgICAgICAgIFtsYWJlbFBvcG92ZXJGdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgW2xpc3RDb25maWddPVwibGlzdENvbmZpZ0FsaWduKClcIlxuICAgICAgICAgIFtsaXN0SGlkZGVuSW5wdXRTZWFyY2hdPVwidHJ1ZVwiXG4gICAgICAgICAgW3BvcG92ZXJDdXN0b21Db25maWddPVwieyBpZ25vcmVBcnJvdzogdHJ1ZSwgY2xhc3NJbmNsdWRlOiAnIXctWzMycHhdIG92ZXJmbG93LWhpZGRlbiAhcHktWzRweF0nLCBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9LCBwYWRkaW5nTGVmdEl0ZW06IGZhbHNlIH1cIlxuICAgICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAgIFt6SW5kZXhdPVwiekluZGV4KCkgKyAxXCJcbiAgICAgICAgICBbbGlzdEtleVNlbGVjdGVkXT1cImFkanVzdFNlbGVjdGVkKClcIlxuICAgICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlU2VsZWN0QWxpZ24oJGV2ZW50KVwiPlxuICAgICAgICAgIEBpZiAoYWxpZ25TZWxlY3RlZCgpOyBhcyBhbGlnblNlbGVjdGVkKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaWNvbkFsaWduU2VsZWN0ZWRDb21wdXRlZCgpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MudGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0xKV1dPVwiYWRqdXN0U2VsZWN0ZWQoKSAhPT0gdW5kZWZpbmVkXCI+PC9pPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCB0ZXh0LVsjNmE3MzgzXSB0ZXh0LVsxNnB4XSBtbC1bNHB4XVwiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbmRlbnRJbmNyZWFzZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2luZGVudF9pbmNyZWFzZScsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaW5kZW50XCJcbiAgICAgICAgdmFsdWU9XCIrMVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdpbmRlbnREZWNyZWFzZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2luZGVudF9kZWNyZWFzZScsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaW5kZW50XCJcbiAgICAgICAgdmFsdWU9XCItMVwiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdkaXJlY3Rpb24nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9kaXJlY3Rpb24nLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWRpcmVjdGlvblwiXG4gICAgICAgIHZhbHVlPVwicnRsXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpc3RCdWxsZXRlZCcpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX2xpc3RfYnVsbGV0ZWQnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLWxpc3QgcWwtYnVsbGV0XCJcbiAgICAgICAgdmFsdWU9XCJidWxsZXRcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnbGlzdE51bWJlcmVkJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fbGlzdF9udW1iZXJlZCcsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtbGlzdCBxbC1vcmRlcmVkXCJcbiAgICAgICAgdmFsdWU9XCJvcmRlcmVkXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpc3RDaGVja2VkJykge1xuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIlxuICAgICAgW2NsYXNzLnFsLWFjdGl2ZV09XCJsaXN0Q2hlY2tib3hTZWxlY3RlZCgpXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9saXN0X251bWJlcmVkJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1saXN0IHFsLWNoZWNrXCJcbiAgICAgICAgdmFsdWU9XCJjaGVja1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICdwZXJzb25hbGl6ZScgJiYgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUoKTsgYXMgdGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemUpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIge3sgb3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nIH19XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVUb29sQmFyUGVyc29uYWxpemVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnYmxvY2txdW90ZScpIHtcbiAgICA8ZGl2IFtjbGFzc109XCJvcHRpb24uY2xhc3NJbmNsdWRlIHx8ICdteC1bOHB4XSdcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgICAgW2NvbmZpZ109XCJ7IGNvbnRlbnQ6ICdpMThuX3F1b3RlJywgekluZGV4OiB6SW5kZXgoKSB9XCJcbiAgICAgICAgY2xhc3M9XCJxbC1ibG9ja3F1b3RlXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpbmsnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9pbnNlcnRfbGluaycsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtbGlua1wiPjwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAob3B0aW9uLnR5cGUgPT09ICd1bkxpbmsnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl91bmxpbmsnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXVuTGlua1wiXG4gICAgICAgIChjbGljayk9XCJoYW5kbGVyVW5saW5rKCRldmVudClcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnaW1hZ2UnKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl9pbWFnZScsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtaW1hZ2VcIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAndmlkZW8nKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyRGlyZWN0aXZlXG4gICAgICAgIFtjb25maWddPVwieyBjb250ZW50OiAnaTE4bl92aWRlbycsIHpJbmRleDogekluZGV4KCkgfVwiXG4gICAgICAgIGNsYXNzPVwicWwtdmlkZW9cIj48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKG9wdGlvbi50eXBlID09PSAnZW1vamknKSB7XG4gICAgPGRpdiBbY2xhc3NdPVwib3B0aW9uLmNsYXNzSW5jbHVkZSB8fCAnbXgtWzhweF0nXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWVtb2ppXG4gICAgICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIChvdXRFdmVudEVtb2ppKT1cImhhbmRsZXJJbnNlcnRFbW9qaSgkZXZlbnQpXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJxbC1lbW9qaVwiPjwvYnV0dG9uPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZW1vamk+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ3RhYmxlJykge1xuICAgIDxkaXYgW2NsYXNzXT1cIm9wdGlvbi5jbGFzc0luY2x1ZGUgfHwgJ214LVs4cHhdJ1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBMaWJzVWlDb21wb25lbnRzUG9wb3ZlckRpcmVjdGl2ZVxuICAgICAgICBbY29uZmlnXT1cInsgY29udGVudDogJ2kxOG5fdGFibGUnLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAgICAgICBjbGFzcz1cInFsLXRhYmxlXCI+PC9idXR0b24+XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChvcHRpb24udHlwZSA9PT0gJ2xpbmUnKSB7XG4gICAgPGRpdiBjbGFzcz1cInctWzFweF0gaC1bMTZweF0gbGlicy11aS1ib3JkZXItcmlnaHQtZ2VuZXJhbFwiPjwvZGl2PlxuICB9XG48L25nLXRlbXBsYXRlPlxuXG48bGlic191aS1jb21wb25lbnRzLXBvcG92ZXJcbiAgI2lucHV0TGlua1JlZlxuICBbbW9kZV09XCInY2xpY2snXCJcbiAgW2lnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmVdPVwidHJ1ZVwiXG4gIFtjb25maWddPVwieyB0ZW1wbGF0ZTogdmlld0xpbmssIHdoaXRlVGhlbWU6IHRydWUsIGlnbm9yZUFycm93OiB0cnVlLCB6SW5kZXg6IHpJbmRleCgpIH1cIlxuICAob3V0RXZlbnQpPVwiaGFuZGxlclBvcG92ZXJFdmVudCgkZXZlbnQpXCIgLz5cblxuPG5nLXRlbXBsYXRlICN2aWV3TGluaz5cbiAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBweC1bMTZweF0gcHktWzhweF0gcm91bmRlZC1bOHB4XVwiPlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwidy1mdWxsIG1pbi13LTAgbGlicy11aS1mb250LWg1clwiXG4gICAgICBbdHlwZV09XCIndGV4dCdcIlxuICAgICAgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJEaXJlY3RpdmVcbiAgICAgIFtjb25maWddPVwieyBjb250ZW50OiBsaW5rKCkudXJsLCB6SW5kZXg6IHpJbmRleCgpICsgMSB9XCI+XG4gICAgICB7eyBsaW5rKCkudXJsIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIG1sLVsxNnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWVkaXQtbGluZSdcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC0wJ1wiXG4gICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyRWRpdExpbmsoJGV2ZW50KVwiIC8+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay1jdXN0b20nXCJcbiAgICAgICAgW2J1dHRvbkN1c3RvbV09XCJ7XG4gICAgICAgICAgY29uZmlnU3RlcENvbG9yOiB7XG4gICAgICAgICAgICB0ZXh0OiAnIzA3MTYzMScsXG4gICAgICAgICAgICB0ZXh0X2hvdmVyOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICB0ZXh0X2FjdGl2ZTogJyNlZTJkNDEnLFxuICAgICAgICAgICAgdGV4dF9kaXNhYmxlOiAnMDcxNjMxJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvb3RDb2xvcjogJyMwNzE2MzEnLFxuICAgICAgICB9XCJcbiAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXAtMCBtbC1bMTJweF0nXCJcbiAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1saW5rLWJyb2tlbidcIlxuICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlclVubGluaygkZXZlbnQpXCIgLz5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19