@ecodev/natural-editor 61.0.0 → 61.0.2
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.
- package/esm2022/lib/class-dialog/class-dialog.component.mjs +16 -18
- package/esm2022/lib/color-dialog/color-dialog.component.mjs +158 -160
- package/esm2022/lib/custom-css/custom-css.directive.mjs +8 -13
- package/esm2022/lib/editor/editor.component.mjs +44 -46
- package/esm2022/lib/id-dialog/id-dialog.component.mjs +16 -18
- package/esm2022/lib/link-dialog/link-dialog.component.mjs +15 -17
- package/esm2022/lib/utils/image.mjs +8 -9
- package/esm2022/lib/utils/items/item.mjs +14 -13
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/ecodev-natural-editor.mjs +261 -275
- package/fesm2022/ecodev-natural-editor.mjs.map +1 -1
- package/lib/class-dialog/class-dialog.component.d.ts +1 -2
- package/lib/color-dialog/color-dialog.component.d.ts +1 -2
- package/lib/custom-css/custom-css.directive.d.ts +0 -1
- package/lib/editor/editor.component.d.ts +5 -6
- package/lib/id-dialog/id-dialog.component.d.ts +1 -2
- package/lib/link-dialog/link-dialog.component.d.ts +1 -2
- package/lib/utils/image.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { Component, ElementRef, EventEmitter,
|
|
1
|
+
import { Component, ElementRef, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { NgControl } from '@angular/forms';
|
|
2
3
|
import { EditorView } from 'prosemirror-view';
|
|
3
4
|
import { EditorState, Plugin } from 'prosemirror-state';
|
|
4
5
|
import { DOMParser, DOMSerializer } from 'prosemirror-model';
|
|
5
6
|
import { DOCUMENT } from '@angular/common';
|
|
7
|
+
import { MatDialog } from '@angular/material/dialog';
|
|
6
8
|
import { goToNextCell, tableEditing } from 'prosemirror-tables';
|
|
7
9
|
import { keymap } from 'prosemirror-keymap';
|
|
8
10
|
import { ImagePlugin } from '../utils/image';
|
|
@@ -22,15 +24,12 @@ import { MatIconModule } from '@angular/material/icon';
|
|
|
22
24
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
23
25
|
import { MatButtonModule } from '@angular/material/button';
|
|
24
26
|
import * as i0 from "@angular/core";
|
|
25
|
-
import * as i1 from "@angular/
|
|
26
|
-
import * as i2 from "@angular/material/
|
|
27
|
-
import * as i3 from "
|
|
28
|
-
import * as i4 from "@angular/material/button";
|
|
29
|
-
import * as i5 from "@angular/material/
|
|
30
|
-
import * as i6 from "@angular/material/
|
|
31
|
-
import * as i7 from "@angular/material/button-toggle";
|
|
32
|
-
import * as i8 from "@angular/material/menu";
|
|
33
|
-
import * as i9 from "@angular/material/divider";
|
|
27
|
+
import * as i1 from "@angular/material/button";
|
|
28
|
+
import * as i2 from "@angular/material/tooltip";
|
|
29
|
+
import * as i3 from "@angular/material/icon";
|
|
30
|
+
import * as i4 from "@angular/material/button-toggle";
|
|
31
|
+
import * as i5 from "@angular/material/menu";
|
|
32
|
+
import * as i6 from "@angular/material/divider";
|
|
34
33
|
/**
|
|
35
34
|
* Prosemirror component
|
|
36
35
|
*
|
|
@@ -42,31 +41,37 @@ import * as i9 from "@angular/material/divider";
|
|
|
42
41
|
*/
|
|
43
42
|
// @dynamic
|
|
44
43
|
export class NaturalEditorComponent {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
44
|
+
ngControl = inject(NgControl, { optional: true, self: true });
|
|
45
|
+
document = inject(DOCUMENT);
|
|
46
|
+
dialog = inject(MatDialog);
|
|
47
|
+
imagePlugin = inject(ImagePlugin);
|
|
48
|
+
view = null;
|
|
49
|
+
editor;
|
|
50
|
+
contentChange = new EventEmitter();
|
|
51
|
+
/**
|
|
52
|
+
* Callback to upload an image.
|
|
53
|
+
*
|
|
54
|
+
* If given it will enable advanced schema, including image and tables.
|
|
55
|
+
* It must be given on initialization and cannot be changed later on.
|
|
56
|
+
*/
|
|
57
|
+
imageUploader = null;
|
|
58
|
+
schema = basicSchema;
|
|
59
|
+
/**
|
|
60
|
+
* Interface with ControlValueAccessor
|
|
61
|
+
* Notifies parent model / form controller
|
|
62
|
+
*/
|
|
63
|
+
onChange;
|
|
64
|
+
/**
|
|
65
|
+
* HTML string
|
|
66
|
+
*/
|
|
67
|
+
content = '';
|
|
68
|
+
menu = null;
|
|
69
|
+
/**
|
|
70
|
+
* If subscribed to, then the save button will be shown and click events forwarded
|
|
71
|
+
*/
|
|
72
|
+
save = new EventEmitter();
|
|
73
|
+
disabled = false;
|
|
74
|
+
constructor() {
|
|
70
75
|
if (this.ngControl !== null) {
|
|
71
76
|
this.ngControl.valueAccessor = this;
|
|
72
77
|
}
|
|
@@ -196,8 +201,8 @@ export class NaturalEditorComponent {
|
|
|
196
201
|
}
|
|
197
202
|
this.view.focus();
|
|
198
203
|
}
|
|
199
|
-
static
|
|
200
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NaturalEditorComponent, isStandalone: true, selector: "natural-editor", inputs: { imageUploader: "imageUploader" }, outputs: { contentChange: "contentChange", save: "save" }, providers: [ImagePlugin], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "@if (menu && !this.disabled) {\n <div class=\"menu-container\">\n <div class=\"menu\">\n @if (save.observed) {\n <button mat-icon-button (click)=\"save.emit()\" i18n-matTooltip matTooltip=\"Enregistrer\">\n <mat-icon fontIcon=\"save\" />\n </button>\n }\n <mat-button-toggle-group hideMultipleSelectionIndicator multiple>\n @if (menu.toggleStrong) {\n <mat-button-toggle\n [disabled]=\"menu.toggleStrong.disabled\"\n [checked]=\"menu.toggleStrong.active\"\n (click)=\"run($event, 'toggleStrong')\"\n i18n-matTooltip\n matTooltip=\"Gras\"\n >\n <mat-icon fontIcon=\"format_bold\" />\n </mat-button-toggle>\n }\n @if (menu.toggleEm) {\n <mat-button-toggle\n [disabled]=\"menu.toggleEm.disabled\"\n [checked]=\"menu.toggleEm.active\"\n (click)=\"run($event, 'toggleEm')\"\n i18n-matTooltip\n matTooltip=\"Italique\"\n >\n <mat-icon fontIcon=\"format_italic\" />\n </mat-button-toggle>\n }\n @if (menu.toggleCode) {\n <mat-button-toggle\n [disabled]=\"menu.toggleCode.disabled\"\n [checked]=\"menu.toggleCode.active\"\n (click)=\"run($event, 'toggleCode')\"\n i18n-matTooltip\n matTooltip=\"Code\"\n >\n <mat-icon fontIcon=\"code\" />\n </mat-button-toggle>\n }\n @if (menu.toggleLink) {\n <mat-button-toggle\n [disabled]=\"menu.toggleLink.disabled\"\n [checked]=\"menu.toggleLink.active\"\n (click)=\"run($event, 'toggleLink')\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer un lien...\"\n >\n <mat-icon fontIcon=\"insert_link\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button mat-button [matMenuTriggerFor]=\"blockMenu\">\n <span i18n>Type</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n <mat-menu #blockMenu=\"matMenu\">\n @if (menu.makeParagraph) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeParagraph.disabled\"\n (click)=\"run($event, 'makeParagraph')\"\n i18n\n >Paragraphe\n </button>\n }\n @if (menu.makeCodeBlock) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeCodeBlock.disabled\"\n (click)=\"run($event, 'makeCodeBlock')\"\n i18n\n >Code\n </button>\n }\n @if (menu.makeHead1) {\n <button mat-menu-item [disabled]=\"menu.makeHead1.disabled\" (click)=\"run($event, 'makeHead1')\" i18n\n >Titre 1\n </button>\n }\n @if (menu.makeHead2) {\n <button mat-menu-item [disabled]=\"menu.makeHead2.disabled\" (click)=\"run($event, 'makeHead2')\" i18n\n >Titre 2\n </button>\n }\n @if (menu.makeHead3) {\n <button mat-menu-item [disabled]=\"menu.makeHead3.disabled\" (click)=\"run($event, 'makeHead3')\" i18n\n >Titre 3\n </button>\n }\n @if (menu.makeHead4) {\n <button mat-menu-item [disabled]=\"menu.makeHead4.disabled\" (click)=\"run($event, 'makeHead4')\" i18n\n >Titre 4\n </button>\n }\n @if (menu.makeHead5) {\n <button mat-menu-item [disabled]=\"menu.makeHead5.disabled\" (click)=\"run($event, 'makeHead5')\" i18n\n >Titre 5\n </button>\n }\n @if (menu.makeHead6) {\n <button mat-menu-item [disabled]=\"menu.makeHead6.disabled\" (click)=\"run($event, 'makeHead6')\" i18n\n >Titre 6\n </button>\n }\n <mat-divider />\n @if (menu.blockClass) {\n <button mat-menu-item [disabled]=\"menu.blockClass.disabled\" (click)=\"run($event, 'blockClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.blockId) {\n <button i18n mat-menu-item [disabled]=\"menu.blockId.disabled\" (click)=\"run($event, 'blockId')\"\n >ID...\n </button>\n }\n </mat-menu>\n @if (menu.addColumnBefore) {\n <button mat-button [matMenuTriggerFor]=\"tableMenu\">\n <span i18n>Tableau</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n }\n <mat-menu #tableMenu=\"matMenu\">\n @if (menu.insertTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.insertTable.disabled\"\n (click)=\"run($event, 'insertTable')\"\n i18n\n >Ins\u00E9rer un tableau\n </button>\n }\n @if (menu.deleteTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteTable.disabled\"\n (click)=\"run($event, 'deleteTable')\"\n i18n\n >Supprimer le tableau\n </button>\n }\n @if (menu.mergeCells) {\n <button mat-menu-item [disabled]=\"menu.mergeCells.disabled\" (click)=\"run($event, 'mergeCells')\" i18n\n >Fusionner les cellules\n </button>\n }\n @if (menu.splitCell) {\n <button mat-menu-item [disabled]=\"menu.splitCell.disabled\" (click)=\"run($event, 'splitCell')\" i18n\n >Scinder les cellules\n </button>\n }\n @if (menu.cellBackgroundColor) {\n <button\n mat-menu-item\n [disabled]=\"menu.cellBackgroundColor.disabled\"\n (click)=\"run($event, 'cellBackgroundColor')\"\n i18n\n >Couleur de fond...\n </button>\n }\n @if (menu.tableClass) {\n <button mat-menu-item [disabled]=\"menu.tableClass.disabled\" (click)=\"run($event, 'tableClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.tableId) {\n <button i18n mat-menu-item [disabled]=\"menu.tableId.disabled\" (click)=\"run($event, 'tableId')\"\n >ID...\n </button>\n }\n <mat-divider />\n @if (menu.addColumnBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnBefore.disabled\"\n (click)=\"run($event, 'addColumnBefore')\"\n i18n\n >Ins\u00E9rer une colonne avant\n </button>\n }\n @if (menu.addColumnAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnAfter.disabled\"\n (click)=\"run($event, 'addColumnAfter')\"\n i18n\n >Ins\u00E9rer une colonne apr\u00E8s\n </button>\n }\n @if (menu.deleteColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteColumn.disabled\"\n (click)=\"run($event, 'deleteColumn')\"\n i18n\n >Supprimer la colonne\n </button>\n }\n <mat-divider />\n @if (menu.addRowBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowBefore.disabled\"\n (click)=\"run($event, 'addRowBefore')\"\n i18n\n >Ins\u00E9rer une ligne avant\n </button>\n }\n @if (menu.addRowAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowAfter.disabled\"\n (click)=\"run($event, 'addRowAfter')\"\n i18n\n >Ins\u00E9rer une ligne apr\u00E8s\n </button>\n }\n @if (menu.deleteRow) {\n <button mat-menu-item [disabled]=\"menu.deleteRow.disabled\" (click)=\"run($event, 'deleteRow')\" i18n\n >Supprimer la ligne\n </button>\n }\n <mat-divider />\n @if (menu.toggleHeaderColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderColumn.disabled\"\n (click)=\"run($event, 'toggleHeaderColumn')\"\n i18n\n >Ent\u00EAte de colonne\n </button>\n }\n @if (menu.toggleHeaderRow) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderRow.disabled\"\n (click)=\"run($event, 'toggleHeaderRow')\"\n i18n\n >Ent\u00EAte de ligne\n </button>\n }\n @if (menu.toggleHeaderCell) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderCell.disabled\"\n (click)=\"run($event, 'toggleHeaderCell')\"\n i18n\n >Ent\u00EAte de cellule\n </button>\n }\n </mat-menu>\n @if (imageUploader) {\n <button\n mat-icon-button\n naturalFileDrop\n [selectable]=\"true\"\n [broadcast]=\"false\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer une image\"\n (fileChange)=\"upload($event)\"\n >\n <mat-icon fontIcon=\"insert_photo\" />\n </button>\n }\n @if (menu.alignLeft) {\n <mat-button-toggle-group hideSingleSelectionIndicator>\n @if (menu.alignLeft) {\n <mat-button-toggle\n [disabled]=\"menu.alignLeft.disabled\"\n [checked]=\"menu.alignLeft.active\"\n (click)=\"run($event, 'alignLeft')\"\n i18n-matTooltip\n matTooltip=\"Aligner gauche\"\n >\n <mat-icon fontIcon=\"format_align_left\" />\n </mat-button-toggle>\n }\n @if (menu.alignCenter) {\n <mat-button-toggle\n [disabled]=\"menu.alignCenter.disabled\"\n [checked]=\"menu.alignCenter.active\"\n (click)=\"run($event, 'alignCenter')\"\n i18n-matTooltip\n matTooltip=\"Centrer\"\n >\n <mat-icon fontIcon=\"format_align_center\" />\n </mat-button-toggle>\n }\n @if (menu.alignRight) {\n <mat-button-toggle\n [disabled]=\"menu.alignRight.disabled\"\n [checked]=\"menu.alignRight.active\"\n (click)=\"run($event, 'alignRight')\"\n i18n-matTooltip\n matTooltip=\"Aligner droite\"\n >\n <mat-icon fontIcon=\"format_align_right\" />\n </mat-button-toggle>\n }\n @if (menu.alignJustify) {\n <mat-button-toggle\n [disabled]=\"menu.alignJustify.disabled\"\n [checked]=\"menu.alignJustify.active\"\n (click)=\"run($event, 'alignJustify')\"\n i18n-matTooltip\n matTooltip=\"Justifier\"\n >\n <mat-icon fontIcon=\"format_align_justify\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n }\n @if (menu.undo) {\n <button\n mat-icon-button\n [disabled]=\"menu.undo.disabled\"\n (click)=\"run($event, 'undo')\"\n i18n-matTooltip\n matTooltip=\"Annuler\"\n >\n <mat-icon fontIcon=\"undo\" />\n </button>\n }\n @if (menu.redo) {\n <button\n mat-icon-button\n [disabled]=\"menu.redo.disabled\"\n (click)=\"run($event, 'redo')\"\n i18n-matTooltip\n matTooltip=\"Refaire\"\n >\n <mat-icon fontIcon=\"redo\" />\n </button>\n }\n @if (menu.wrapBulletList && menu.wrapBulletList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBulletList.disabled\"\n (click)=\"run($event, 'wrapBulletList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 puce\"\n >\n <mat-icon fontIcon=\"format_list_bulleted\" />\n </button>\n }\n @if (menu.wrapOrderedList && menu.wrapOrderedList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapOrderedList.disabled\"\n (click)=\"run($event, 'wrapOrderedList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 num\u00E9ro\"\n >\n <mat-icon fontIcon=\"format_list_numbered\" />\n </button>\n }\n @if (menu.wrapBlockQuote && menu.wrapBlockQuote.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBlockQuote.disabled\"\n (click)=\"run($event, 'wrapBlockQuote')\"\n i18n-matTooltip\n matTooltip=\"Citation\"\n >\n <mat-icon fontIcon=\"format_quote\" />\n </button>\n }\n @if (menu.joinUp && menu.joinUp.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.joinUp.disabled\"\n (click)=\"run($event, 'joinUp')\"\n i18n-matTooltip\n matTooltip=\"Fusionner avec l'\u00E9l\u00E9ment du haut\"\n >\n <mat-icon fontIcon=\"move_up\" />\n </button>\n }\n @if (menu.lift && menu.lift.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.lift.disabled\"\n (click)=\"run($event, 'lift')\"\n i18n-matTooltip\n matTooltip=\"D\u00E9sindenter\"\n >\n <mat-icon fontIcon=\"format_indent_decrease\" />\n </button>\n }\n @if (menu.selectParentNode && menu.selectParentNode.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.selectParentNode.disabled\"\n (click)=\"run($event, 'selectParentNode')\"\n i18n-matTooltip\n matTooltip=\"S\u00E9lectionner l'\u00E9l\u00E9ment parent\"\n >\n <mat-icon fontIcon=\"select_all\" />\n </button>\n }\n </div>\n </div>\n}\n<div class=\"editor-container\" #editor></div>\n", styles: [".menu{display:flex;flex-wrap:wrap;border-bottom:1px solid;padding:10px 18px}.menu-container{position:sticky;top:-20px;z-index:999}::ng-deep .ProseMirror{position:relative}::ng-deep .ProseMirror{word-wrap:break-word;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid #8cf}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none;content:\"\"}::ng-deep .ProseMirror-gapcursor{display:none;position:absolute;pointer-events:none}::ng-deep .ProseMirror-gapcursor:after{display:block;position:absolute;top:-2px;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite;border-top:1px solid black;width:20px;content:\"\"}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror-example-setup-style hr{margin:1em 0;border:none;padding:2px 10px}::ng-deep .ProseMirror-example-setup-style hr:after{display:block;background-color:silver;height:1px;content:\"\";line-height:2px}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px}::ng-deep .ProseMirror blockquote{margin-right:0;margin-left:0;border-left:3px solid #eee;padding-left:1em}::ng-deep .ProseMirror-example-setup-style img{cursor:default}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror{outline:none;padding:4px 8px 4px 14px;line-height:1.2}::ng-deep .ProseMirror p{margin-bottom:1em}::ng-deep .ProseMirror .tableWrapper{overflow-x:auto}::ng-deep .ProseMirror table{border-collapse:collapse;width:100%;table-layout:fixed;overflow:hidden}::ng-deep .ProseMirror td,::ng-deep .ProseMirror th{position:relative;vertical-align:top;box-sizing:border-box}::ng-deep .ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;bottom:0;z-index:20;background-color:#adf;width:4px;pointer-events:none}::ng-deep .ProseMirror.resize-cursor{cursor:col-resize}::ng-deep .ProseMirror .selectedCell:after{position:absolute;inset:0;z-index:2;background:#c8c8ff66;pointer-events:none;content:\"\"}::ng-deep .ProseMirror table{margin:0}::ng-deep .ProseMirror th,::ng-deep .ProseMirror td{border:1px solid #ddd;padding:3px 5px;min-width:1em}::ng-deep .ProseMirror .tableWrapper{margin:1em 0}::ng-deep .ProseMirror th{font-weight:700;text-align:left}::ng-deep placeholder{display:block;animation:gradient 3s none infinite;background-size:500% 100%!important;width:50px;height:50px}@keyframes gradient{0%{background-position:100% 100%}to{background-position:0 0}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i7.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i7.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i9.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }] }); }
|
|
204
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
205
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NaturalEditorComponent, isStandalone: true, selector: "natural-editor", inputs: { imageUploader: "imageUploader" }, outputs: { contentChange: "contentChange", save: "save" }, providers: [ImagePlugin], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "@if (menu && !this.disabled) {\n <div class=\"menu-container\">\n <div class=\"menu\">\n @if (save.observed) {\n <button mat-icon-button (click)=\"save.emit()\" i18n-matTooltip matTooltip=\"Enregistrer\">\n <mat-icon fontIcon=\"save\" />\n </button>\n }\n <mat-button-toggle-group hideMultipleSelectionIndicator multiple>\n @if (menu.toggleStrong) {\n <mat-button-toggle\n [disabled]=\"menu.toggleStrong.disabled\"\n [checked]=\"menu.toggleStrong.active\"\n (click)=\"run($event, 'toggleStrong')\"\n i18n-matTooltip\n matTooltip=\"Gras\"\n >\n <mat-icon fontIcon=\"format_bold\" />\n </mat-button-toggle>\n }\n @if (menu.toggleEm) {\n <mat-button-toggle\n [disabled]=\"menu.toggleEm.disabled\"\n [checked]=\"menu.toggleEm.active\"\n (click)=\"run($event, 'toggleEm')\"\n i18n-matTooltip\n matTooltip=\"Italique\"\n >\n <mat-icon fontIcon=\"format_italic\" />\n </mat-button-toggle>\n }\n @if (menu.toggleCode) {\n <mat-button-toggle\n [disabled]=\"menu.toggleCode.disabled\"\n [checked]=\"menu.toggleCode.active\"\n (click)=\"run($event, 'toggleCode')\"\n i18n-matTooltip\n matTooltip=\"Code\"\n >\n <mat-icon fontIcon=\"code\" />\n </mat-button-toggle>\n }\n @if (menu.toggleLink) {\n <mat-button-toggle\n [disabled]=\"menu.toggleLink.disabled\"\n [checked]=\"menu.toggleLink.active\"\n (click)=\"run($event, 'toggleLink')\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer un lien...\"\n >\n <mat-icon fontIcon=\"insert_link\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button mat-button [matMenuTriggerFor]=\"blockMenu\">\n <span i18n>Type</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n <mat-menu #blockMenu=\"matMenu\">\n @if (menu.makeParagraph) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeParagraph.disabled\"\n (click)=\"run($event, 'makeParagraph')\"\n i18n\n >Paragraphe\n </button>\n }\n @if (menu.makeCodeBlock) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeCodeBlock.disabled\"\n (click)=\"run($event, 'makeCodeBlock')\"\n i18n\n >Code\n </button>\n }\n @if (menu.makeHead1) {\n <button mat-menu-item [disabled]=\"menu.makeHead1.disabled\" (click)=\"run($event, 'makeHead1')\" i18n\n >Titre 1\n </button>\n }\n @if (menu.makeHead2) {\n <button mat-menu-item [disabled]=\"menu.makeHead2.disabled\" (click)=\"run($event, 'makeHead2')\" i18n\n >Titre 2\n </button>\n }\n @if (menu.makeHead3) {\n <button mat-menu-item [disabled]=\"menu.makeHead3.disabled\" (click)=\"run($event, 'makeHead3')\" i18n\n >Titre 3\n </button>\n }\n @if (menu.makeHead4) {\n <button mat-menu-item [disabled]=\"menu.makeHead4.disabled\" (click)=\"run($event, 'makeHead4')\" i18n\n >Titre 4\n </button>\n }\n @if (menu.makeHead5) {\n <button mat-menu-item [disabled]=\"menu.makeHead5.disabled\" (click)=\"run($event, 'makeHead5')\" i18n\n >Titre 5\n </button>\n }\n @if (menu.makeHead6) {\n <button mat-menu-item [disabled]=\"menu.makeHead6.disabled\" (click)=\"run($event, 'makeHead6')\" i18n\n >Titre 6\n </button>\n }\n <mat-divider />\n @if (menu.blockClass) {\n <button mat-menu-item [disabled]=\"menu.blockClass.disabled\" (click)=\"run($event, 'blockClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.blockId) {\n <button i18n mat-menu-item [disabled]=\"menu.blockId.disabled\" (click)=\"run($event, 'blockId')\"\n >ID...\n </button>\n }\n </mat-menu>\n @if (menu.addColumnBefore) {\n <button mat-button [matMenuTriggerFor]=\"tableMenu\">\n <span i18n>Tableau</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n }\n <mat-menu #tableMenu=\"matMenu\">\n @if (menu.insertTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.insertTable.disabled\"\n (click)=\"run($event, 'insertTable')\"\n i18n\n >Ins\u00E9rer un tableau\n </button>\n }\n @if (menu.deleteTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteTable.disabled\"\n (click)=\"run($event, 'deleteTable')\"\n i18n\n >Supprimer le tableau\n </button>\n }\n @if (menu.mergeCells) {\n <button mat-menu-item [disabled]=\"menu.mergeCells.disabled\" (click)=\"run($event, 'mergeCells')\" i18n\n >Fusionner les cellules\n </button>\n }\n @if (menu.splitCell) {\n <button mat-menu-item [disabled]=\"menu.splitCell.disabled\" (click)=\"run($event, 'splitCell')\" i18n\n >Scinder les cellules\n </button>\n }\n @if (menu.cellBackgroundColor) {\n <button\n mat-menu-item\n [disabled]=\"menu.cellBackgroundColor.disabled\"\n (click)=\"run($event, 'cellBackgroundColor')\"\n i18n\n >Couleur de fond...\n </button>\n }\n @if (menu.tableClass) {\n <button mat-menu-item [disabled]=\"menu.tableClass.disabled\" (click)=\"run($event, 'tableClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.tableId) {\n <button i18n mat-menu-item [disabled]=\"menu.tableId.disabled\" (click)=\"run($event, 'tableId')\"\n >ID...\n </button>\n }\n <mat-divider />\n @if (menu.addColumnBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnBefore.disabled\"\n (click)=\"run($event, 'addColumnBefore')\"\n i18n\n >Ins\u00E9rer une colonne avant\n </button>\n }\n @if (menu.addColumnAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnAfter.disabled\"\n (click)=\"run($event, 'addColumnAfter')\"\n i18n\n >Ins\u00E9rer une colonne apr\u00E8s\n </button>\n }\n @if (menu.deleteColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteColumn.disabled\"\n (click)=\"run($event, 'deleteColumn')\"\n i18n\n >Supprimer la colonne\n </button>\n }\n <mat-divider />\n @if (menu.addRowBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowBefore.disabled\"\n (click)=\"run($event, 'addRowBefore')\"\n i18n\n >Ins\u00E9rer une ligne avant\n </button>\n }\n @if (menu.addRowAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowAfter.disabled\"\n (click)=\"run($event, 'addRowAfter')\"\n i18n\n >Ins\u00E9rer une ligne apr\u00E8s\n </button>\n }\n @if (menu.deleteRow) {\n <button mat-menu-item [disabled]=\"menu.deleteRow.disabled\" (click)=\"run($event, 'deleteRow')\" i18n\n >Supprimer la ligne\n </button>\n }\n <mat-divider />\n @if (menu.toggleHeaderColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderColumn.disabled\"\n (click)=\"run($event, 'toggleHeaderColumn')\"\n i18n\n >Ent\u00EAte de colonne\n </button>\n }\n @if (menu.toggleHeaderRow) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderRow.disabled\"\n (click)=\"run($event, 'toggleHeaderRow')\"\n i18n\n >Ent\u00EAte de ligne\n </button>\n }\n @if (menu.toggleHeaderCell) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderCell.disabled\"\n (click)=\"run($event, 'toggleHeaderCell')\"\n i18n\n >Ent\u00EAte de cellule\n </button>\n }\n </mat-menu>\n @if (imageUploader) {\n <button\n mat-icon-button\n naturalFileDrop\n [selectable]=\"true\"\n [broadcast]=\"false\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer une image\"\n (fileChange)=\"upload($event)\"\n >\n <mat-icon fontIcon=\"insert_photo\" />\n </button>\n }\n @if (menu.alignLeft) {\n <mat-button-toggle-group hideSingleSelectionIndicator>\n @if (menu.alignLeft) {\n <mat-button-toggle\n [disabled]=\"menu.alignLeft.disabled\"\n [checked]=\"menu.alignLeft.active\"\n (click)=\"run($event, 'alignLeft')\"\n i18n-matTooltip\n matTooltip=\"Aligner gauche\"\n >\n <mat-icon fontIcon=\"format_align_left\" />\n </mat-button-toggle>\n }\n @if (menu.alignCenter) {\n <mat-button-toggle\n [disabled]=\"menu.alignCenter.disabled\"\n [checked]=\"menu.alignCenter.active\"\n (click)=\"run($event, 'alignCenter')\"\n i18n-matTooltip\n matTooltip=\"Centrer\"\n >\n <mat-icon fontIcon=\"format_align_center\" />\n </mat-button-toggle>\n }\n @if (menu.alignRight) {\n <mat-button-toggle\n [disabled]=\"menu.alignRight.disabled\"\n [checked]=\"menu.alignRight.active\"\n (click)=\"run($event, 'alignRight')\"\n i18n-matTooltip\n matTooltip=\"Aligner droite\"\n >\n <mat-icon fontIcon=\"format_align_right\" />\n </mat-button-toggle>\n }\n @if (menu.alignJustify) {\n <mat-button-toggle\n [disabled]=\"menu.alignJustify.disabled\"\n [checked]=\"menu.alignJustify.active\"\n (click)=\"run($event, 'alignJustify')\"\n i18n-matTooltip\n matTooltip=\"Justifier\"\n >\n <mat-icon fontIcon=\"format_align_justify\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n }\n @if (menu.undo) {\n <button\n mat-icon-button\n [disabled]=\"menu.undo.disabled\"\n (click)=\"run($event, 'undo')\"\n i18n-matTooltip\n matTooltip=\"Annuler\"\n >\n <mat-icon fontIcon=\"undo\" />\n </button>\n }\n @if (menu.redo) {\n <button\n mat-icon-button\n [disabled]=\"menu.redo.disabled\"\n (click)=\"run($event, 'redo')\"\n i18n-matTooltip\n matTooltip=\"Refaire\"\n >\n <mat-icon fontIcon=\"redo\" />\n </button>\n }\n @if (menu.wrapBulletList && menu.wrapBulletList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBulletList.disabled\"\n (click)=\"run($event, 'wrapBulletList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 puce\"\n >\n <mat-icon fontIcon=\"format_list_bulleted\" />\n </button>\n }\n @if (menu.wrapOrderedList && menu.wrapOrderedList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapOrderedList.disabled\"\n (click)=\"run($event, 'wrapOrderedList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 num\u00E9ro\"\n >\n <mat-icon fontIcon=\"format_list_numbered\" />\n </button>\n }\n @if (menu.wrapBlockQuote && menu.wrapBlockQuote.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBlockQuote.disabled\"\n (click)=\"run($event, 'wrapBlockQuote')\"\n i18n-matTooltip\n matTooltip=\"Citation\"\n >\n <mat-icon fontIcon=\"format_quote\" />\n </button>\n }\n @if (menu.joinUp && menu.joinUp.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.joinUp.disabled\"\n (click)=\"run($event, 'joinUp')\"\n i18n-matTooltip\n matTooltip=\"Fusionner avec l'\u00E9l\u00E9ment du haut\"\n >\n <mat-icon fontIcon=\"move_up\" />\n </button>\n }\n @if (menu.lift && menu.lift.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.lift.disabled\"\n (click)=\"run($event, 'lift')\"\n i18n-matTooltip\n matTooltip=\"D\u00E9sindenter\"\n >\n <mat-icon fontIcon=\"format_indent_decrease\" />\n </button>\n }\n @if (menu.selectParentNode && menu.selectParentNode.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.selectParentNode.disabled\"\n (click)=\"run($event, 'selectParentNode')\"\n i18n-matTooltip\n matTooltip=\"S\u00E9lectionner l'\u00E9l\u00E9ment parent\"\n >\n <mat-icon fontIcon=\"select_all\" />\n </button>\n }\n </div>\n </div>\n}\n<div class=\"editor-container\" #editor></div>\n", styles: [".menu{display:flex;flex-wrap:wrap;border-bottom:1px solid;padding:10px 18px}.menu-container{position:sticky;top:-20px;z-index:999}::ng-deep .ProseMirror{position:relative}::ng-deep .ProseMirror{word-wrap:break-word;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid #8cf}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none;content:\"\"}::ng-deep .ProseMirror-gapcursor{display:none;position:absolute;pointer-events:none}::ng-deep .ProseMirror-gapcursor:after{display:block;position:absolute;top:-2px;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite;border-top:1px solid black;width:20px;content:\"\"}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror-example-setup-style hr{margin:1em 0;border:none;padding:2px 10px}::ng-deep .ProseMirror-example-setup-style hr:after{display:block;background-color:silver;height:1px;content:\"\";line-height:2px}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px}::ng-deep .ProseMirror blockquote{margin-right:0;margin-left:0;border-left:3px solid #eee;padding-left:1em}::ng-deep .ProseMirror-example-setup-style img{cursor:default}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror{outline:none;padding:4px 8px 4px 14px;line-height:1.2}::ng-deep .ProseMirror p{margin-bottom:1em}::ng-deep .ProseMirror .tableWrapper{overflow-x:auto}::ng-deep .ProseMirror table{border-collapse:collapse;width:100%;table-layout:fixed;overflow:hidden}::ng-deep .ProseMirror td,::ng-deep .ProseMirror th{position:relative;vertical-align:top;box-sizing:border-box}::ng-deep .ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;bottom:0;z-index:20;background-color:#adf;width:4px;pointer-events:none}::ng-deep .ProseMirror.resize-cursor{cursor:col-resize}::ng-deep .ProseMirror .selectedCell:after{position:absolute;inset:0;z-index:2;background:#c8c8ff66;pointer-events:none;content:\"\"}::ng-deep .ProseMirror table{margin:0}::ng-deep .ProseMirror th,::ng-deep .ProseMirror td{border:1px solid #ddd;padding:3px 5px;min-width:1em}::ng-deep .ProseMirror .tableWrapper{margin:1em 0}::ng-deep .ProseMirror th{font-weight:700;text-align:left}::ng-deep placeholder{display:block;animation:gradient 3s none infinite;background-size:500% 100%!important;width:50px;height:50px}@keyframes gradient{0%{background-position:100% 100%}to{background-position:0 0}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i5.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatDividerModule }, { kind: "component", type: i6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: NaturalFileDropDirective, selector: ":not([naturalFileSelect])[naturalFileDrop]", outputs: ["fileOver"] }] });
|
|
201
206
|
}
|
|
202
207
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NaturalEditorComponent, decorators: [{
|
|
203
208
|
type: Component,
|
|
@@ -210,14 +215,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImpor
|
|
|
210
215
|
MatDividerModule,
|
|
211
216
|
NaturalFileDropDirective,
|
|
212
217
|
], template: "@if (menu && !this.disabled) {\n <div class=\"menu-container\">\n <div class=\"menu\">\n @if (save.observed) {\n <button mat-icon-button (click)=\"save.emit()\" i18n-matTooltip matTooltip=\"Enregistrer\">\n <mat-icon fontIcon=\"save\" />\n </button>\n }\n <mat-button-toggle-group hideMultipleSelectionIndicator multiple>\n @if (menu.toggleStrong) {\n <mat-button-toggle\n [disabled]=\"menu.toggleStrong.disabled\"\n [checked]=\"menu.toggleStrong.active\"\n (click)=\"run($event, 'toggleStrong')\"\n i18n-matTooltip\n matTooltip=\"Gras\"\n >\n <mat-icon fontIcon=\"format_bold\" />\n </mat-button-toggle>\n }\n @if (menu.toggleEm) {\n <mat-button-toggle\n [disabled]=\"menu.toggleEm.disabled\"\n [checked]=\"menu.toggleEm.active\"\n (click)=\"run($event, 'toggleEm')\"\n i18n-matTooltip\n matTooltip=\"Italique\"\n >\n <mat-icon fontIcon=\"format_italic\" />\n </mat-button-toggle>\n }\n @if (menu.toggleCode) {\n <mat-button-toggle\n [disabled]=\"menu.toggleCode.disabled\"\n [checked]=\"menu.toggleCode.active\"\n (click)=\"run($event, 'toggleCode')\"\n i18n-matTooltip\n matTooltip=\"Code\"\n >\n <mat-icon fontIcon=\"code\" />\n </mat-button-toggle>\n }\n @if (menu.toggleLink) {\n <mat-button-toggle\n [disabled]=\"menu.toggleLink.disabled\"\n [checked]=\"menu.toggleLink.active\"\n (click)=\"run($event, 'toggleLink')\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer un lien...\"\n >\n <mat-icon fontIcon=\"insert_link\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n <button mat-button [matMenuTriggerFor]=\"blockMenu\">\n <span i18n>Type</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n <mat-menu #blockMenu=\"matMenu\">\n @if (menu.makeParagraph) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeParagraph.disabled\"\n (click)=\"run($event, 'makeParagraph')\"\n i18n\n >Paragraphe\n </button>\n }\n @if (menu.makeCodeBlock) {\n <button\n mat-menu-item\n [disabled]=\"menu.makeCodeBlock.disabled\"\n (click)=\"run($event, 'makeCodeBlock')\"\n i18n\n >Code\n </button>\n }\n @if (menu.makeHead1) {\n <button mat-menu-item [disabled]=\"menu.makeHead1.disabled\" (click)=\"run($event, 'makeHead1')\" i18n\n >Titre 1\n </button>\n }\n @if (menu.makeHead2) {\n <button mat-menu-item [disabled]=\"menu.makeHead2.disabled\" (click)=\"run($event, 'makeHead2')\" i18n\n >Titre 2\n </button>\n }\n @if (menu.makeHead3) {\n <button mat-menu-item [disabled]=\"menu.makeHead3.disabled\" (click)=\"run($event, 'makeHead3')\" i18n\n >Titre 3\n </button>\n }\n @if (menu.makeHead4) {\n <button mat-menu-item [disabled]=\"menu.makeHead4.disabled\" (click)=\"run($event, 'makeHead4')\" i18n\n >Titre 4\n </button>\n }\n @if (menu.makeHead5) {\n <button mat-menu-item [disabled]=\"menu.makeHead5.disabled\" (click)=\"run($event, 'makeHead5')\" i18n\n >Titre 5\n </button>\n }\n @if (menu.makeHead6) {\n <button mat-menu-item [disabled]=\"menu.makeHead6.disabled\" (click)=\"run($event, 'makeHead6')\" i18n\n >Titre 6\n </button>\n }\n <mat-divider />\n @if (menu.blockClass) {\n <button mat-menu-item [disabled]=\"menu.blockClass.disabled\" (click)=\"run($event, 'blockClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.blockId) {\n <button i18n mat-menu-item [disabled]=\"menu.blockId.disabled\" (click)=\"run($event, 'blockId')\"\n >ID...\n </button>\n }\n </mat-menu>\n @if (menu.addColumnBefore) {\n <button mat-button [matMenuTriggerFor]=\"tableMenu\">\n <span i18n>Tableau</span>\n <mat-icon fontIcon=\"arrow_drop_down\" />\n </button>\n }\n <mat-menu #tableMenu=\"matMenu\">\n @if (menu.insertTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.insertTable.disabled\"\n (click)=\"run($event, 'insertTable')\"\n i18n\n >Ins\u00E9rer un tableau\n </button>\n }\n @if (menu.deleteTable) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteTable.disabled\"\n (click)=\"run($event, 'deleteTable')\"\n i18n\n >Supprimer le tableau\n </button>\n }\n @if (menu.mergeCells) {\n <button mat-menu-item [disabled]=\"menu.mergeCells.disabled\" (click)=\"run($event, 'mergeCells')\" i18n\n >Fusionner les cellules\n </button>\n }\n @if (menu.splitCell) {\n <button mat-menu-item [disabled]=\"menu.splitCell.disabled\" (click)=\"run($event, 'splitCell')\" i18n\n >Scinder les cellules\n </button>\n }\n @if (menu.cellBackgroundColor) {\n <button\n mat-menu-item\n [disabled]=\"menu.cellBackgroundColor.disabled\"\n (click)=\"run($event, 'cellBackgroundColor')\"\n i18n\n >Couleur de fond...\n </button>\n }\n @if (menu.tableClass) {\n <button mat-menu-item [disabled]=\"menu.tableClass.disabled\" (click)=\"run($event, 'tableClass')\" i18n\n >Classe...\n </button>\n }\n @if (menu.tableId) {\n <button i18n mat-menu-item [disabled]=\"menu.tableId.disabled\" (click)=\"run($event, 'tableId')\"\n >ID...\n </button>\n }\n <mat-divider />\n @if (menu.addColumnBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnBefore.disabled\"\n (click)=\"run($event, 'addColumnBefore')\"\n i18n\n >Ins\u00E9rer une colonne avant\n </button>\n }\n @if (menu.addColumnAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addColumnAfter.disabled\"\n (click)=\"run($event, 'addColumnAfter')\"\n i18n\n >Ins\u00E9rer une colonne apr\u00E8s\n </button>\n }\n @if (menu.deleteColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.deleteColumn.disabled\"\n (click)=\"run($event, 'deleteColumn')\"\n i18n\n >Supprimer la colonne\n </button>\n }\n <mat-divider />\n @if (menu.addRowBefore) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowBefore.disabled\"\n (click)=\"run($event, 'addRowBefore')\"\n i18n\n >Ins\u00E9rer une ligne avant\n </button>\n }\n @if (menu.addRowAfter) {\n <button\n mat-menu-item\n [disabled]=\"menu.addRowAfter.disabled\"\n (click)=\"run($event, 'addRowAfter')\"\n i18n\n >Ins\u00E9rer une ligne apr\u00E8s\n </button>\n }\n @if (menu.deleteRow) {\n <button mat-menu-item [disabled]=\"menu.deleteRow.disabled\" (click)=\"run($event, 'deleteRow')\" i18n\n >Supprimer la ligne\n </button>\n }\n <mat-divider />\n @if (menu.toggleHeaderColumn) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderColumn.disabled\"\n (click)=\"run($event, 'toggleHeaderColumn')\"\n i18n\n >Ent\u00EAte de colonne\n </button>\n }\n @if (menu.toggleHeaderRow) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderRow.disabled\"\n (click)=\"run($event, 'toggleHeaderRow')\"\n i18n\n >Ent\u00EAte de ligne\n </button>\n }\n @if (menu.toggleHeaderCell) {\n <button\n mat-menu-item\n [disabled]=\"menu.toggleHeaderCell.disabled\"\n (click)=\"run($event, 'toggleHeaderCell')\"\n i18n\n >Ent\u00EAte de cellule\n </button>\n }\n </mat-menu>\n @if (imageUploader) {\n <button\n mat-icon-button\n naturalFileDrop\n [selectable]=\"true\"\n [broadcast]=\"false\"\n i18n-matTooltip\n matTooltip=\"Ins\u00E9rer une image\"\n (fileChange)=\"upload($event)\"\n >\n <mat-icon fontIcon=\"insert_photo\" />\n </button>\n }\n @if (menu.alignLeft) {\n <mat-button-toggle-group hideSingleSelectionIndicator>\n @if (menu.alignLeft) {\n <mat-button-toggle\n [disabled]=\"menu.alignLeft.disabled\"\n [checked]=\"menu.alignLeft.active\"\n (click)=\"run($event, 'alignLeft')\"\n i18n-matTooltip\n matTooltip=\"Aligner gauche\"\n >\n <mat-icon fontIcon=\"format_align_left\" />\n </mat-button-toggle>\n }\n @if (menu.alignCenter) {\n <mat-button-toggle\n [disabled]=\"menu.alignCenter.disabled\"\n [checked]=\"menu.alignCenter.active\"\n (click)=\"run($event, 'alignCenter')\"\n i18n-matTooltip\n matTooltip=\"Centrer\"\n >\n <mat-icon fontIcon=\"format_align_center\" />\n </mat-button-toggle>\n }\n @if (menu.alignRight) {\n <mat-button-toggle\n [disabled]=\"menu.alignRight.disabled\"\n [checked]=\"menu.alignRight.active\"\n (click)=\"run($event, 'alignRight')\"\n i18n-matTooltip\n matTooltip=\"Aligner droite\"\n >\n <mat-icon fontIcon=\"format_align_right\" />\n </mat-button-toggle>\n }\n @if (menu.alignJustify) {\n <mat-button-toggle\n [disabled]=\"menu.alignJustify.disabled\"\n [checked]=\"menu.alignJustify.active\"\n (click)=\"run($event, 'alignJustify')\"\n i18n-matTooltip\n matTooltip=\"Justifier\"\n >\n <mat-icon fontIcon=\"format_align_justify\" />\n </mat-button-toggle>\n }\n </mat-button-toggle-group>\n }\n @if (menu.undo) {\n <button\n mat-icon-button\n [disabled]=\"menu.undo.disabled\"\n (click)=\"run($event, 'undo')\"\n i18n-matTooltip\n matTooltip=\"Annuler\"\n >\n <mat-icon fontIcon=\"undo\" />\n </button>\n }\n @if (menu.redo) {\n <button\n mat-icon-button\n [disabled]=\"menu.redo.disabled\"\n (click)=\"run($event, 'redo')\"\n i18n-matTooltip\n matTooltip=\"Refaire\"\n >\n <mat-icon fontIcon=\"redo\" />\n </button>\n }\n @if (menu.wrapBulletList && menu.wrapBulletList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBulletList.disabled\"\n (click)=\"run($event, 'wrapBulletList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 puce\"\n >\n <mat-icon fontIcon=\"format_list_bulleted\" />\n </button>\n }\n @if (menu.wrapOrderedList && menu.wrapOrderedList.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapOrderedList.disabled\"\n (click)=\"run($event, 'wrapOrderedList')\"\n i18n-matTooltip\n matTooltip=\"Liste \u00E0 num\u00E9ro\"\n >\n <mat-icon fontIcon=\"format_list_numbered\" />\n </button>\n }\n @if (menu.wrapBlockQuote && menu.wrapBlockQuote.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.wrapBlockQuote.disabled\"\n (click)=\"run($event, 'wrapBlockQuote')\"\n i18n-matTooltip\n matTooltip=\"Citation\"\n >\n <mat-icon fontIcon=\"format_quote\" />\n </button>\n }\n @if (menu.joinUp && menu.joinUp.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.joinUp.disabled\"\n (click)=\"run($event, 'joinUp')\"\n i18n-matTooltip\n matTooltip=\"Fusionner avec l'\u00E9l\u00E9ment du haut\"\n >\n <mat-icon fontIcon=\"move_up\" />\n </button>\n }\n @if (menu.lift && menu.lift.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.lift.disabled\"\n (click)=\"run($event, 'lift')\"\n i18n-matTooltip\n matTooltip=\"D\u00E9sindenter\"\n >\n <mat-icon fontIcon=\"format_indent_decrease\" />\n </button>\n }\n @if (menu.selectParentNode && menu.selectParentNode.show) {\n <button\n mat-icon-button\n [disabled]=\"menu.selectParentNode.disabled\"\n (click)=\"run($event, 'selectParentNode')\"\n i18n-matTooltip\n matTooltip=\"S\u00E9lectionner l'\u00E9l\u00E9ment parent\"\n >\n <mat-icon fontIcon=\"select_all\" />\n </button>\n }\n </div>\n </div>\n}\n<div class=\"editor-container\" #editor></div>\n", styles: [".menu{display:flex;flex-wrap:wrap;border-bottom:1px solid;padding:10px 18px}.menu-container{position:sticky;top:-20px;z-index:999}::ng-deep .ProseMirror{position:relative}::ng-deep .ProseMirror{word-wrap:break-word;-webkit-font-variant-ligatures:none;font-variant-ligatures:none;white-space:pre-wrap}::ng-deep .ProseMirror pre{white-space:pre-wrap}::ng-deep .ProseMirror li{position:relative}::ng-deep .ProseMirror-hideselection *::selection{background:transparent}::ng-deep .ProseMirror-hideselection *::-moz-selection{background:transparent}::ng-deep .ProseMirror-hideselection{caret-color:transparent}::ng-deep .ProseMirror-selectednode{outline:2px solid #8cf}::ng-deep li.ProseMirror-selectednode{outline:none}::ng-deep li.ProseMirror-selectednode:after{position:absolute;inset:-2px -2px -2px -32px;border:2px solid #8cf;pointer-events:none;content:\"\"}::ng-deep .ProseMirror-gapcursor{display:none;position:absolute;pointer-events:none}::ng-deep .ProseMirror-gapcursor:after{display:block;position:absolute;top:-2px;animation:ProseMirror-cursor-blink 1.1s steps(2,start) infinite;border-top:1px solid black;width:20px;content:\"\"}@keyframes ProseMirror-cursor-blink{to{visibility:hidden}}::ng-deep .ProseMirror-focused .ProseMirror-gapcursor{display:block}::ng-deep .ProseMirror-example-setup-style hr{margin:1em 0;border:none;padding:2px 10px}::ng-deep .ProseMirror-example-setup-style hr:after{display:block;background-color:silver;height:1px;content:\"\";line-height:2px}::ng-deep .ProseMirror ul,::ng-deep .ProseMirror ol{padding-left:30px}::ng-deep .ProseMirror blockquote{margin-right:0;margin-left:0;border-left:3px solid #eee;padding-left:1em}::ng-deep .ProseMirror-example-setup-style img{cursor:default}::ng-deep .ProseMirror p:first-child,::ng-deep .ProseMirror h1:first-child,::ng-deep .ProseMirror h2:first-child,::ng-deep .ProseMirror h3:first-child,::ng-deep .ProseMirror h4:first-child,::ng-deep .ProseMirror h5:first-child,::ng-deep .ProseMirror h6:first-child{margin-top:10px}::ng-deep .ProseMirror{outline:none;padding:4px 8px 4px 14px;line-height:1.2}::ng-deep .ProseMirror p{margin-bottom:1em}::ng-deep .ProseMirror .tableWrapper{overflow-x:auto}::ng-deep .ProseMirror table{border-collapse:collapse;width:100%;table-layout:fixed;overflow:hidden}::ng-deep .ProseMirror td,::ng-deep .ProseMirror th{position:relative;vertical-align:top;box-sizing:border-box}::ng-deep .ProseMirror .column-resize-handle{position:absolute;top:0;right:-2px;bottom:0;z-index:20;background-color:#adf;width:4px;pointer-events:none}::ng-deep .ProseMirror.resize-cursor{cursor:col-resize}::ng-deep .ProseMirror .selectedCell:after{position:absolute;inset:0;z-index:2;background:#c8c8ff66;pointer-events:none;content:\"\"}::ng-deep .ProseMirror table{margin:0}::ng-deep .ProseMirror th,::ng-deep .ProseMirror td{border:1px solid #ddd;padding:3px 5px;min-width:1em}::ng-deep .ProseMirror .tableWrapper{margin:1em 0}::ng-deep .ProseMirror th{font-weight:700;text-align:left}::ng-deep placeholder{display:block;animation:gradient 3s none infinite;background-size:500% 100%!important;width:50px;height:50px}@keyframes gradient{0%{background-position:100% 100%}to{background-position:0 0}}\n"] }]
|
|
213
|
-
}], ctorParameters: () => [
|
|
214
|
-
type: Optional
|
|
215
|
-
}, {
|
|
216
|
-
type: Self
|
|
217
|
-
}] }, { type: Document, decorators: [{
|
|
218
|
-
type: Inject,
|
|
219
|
-
args: [DOCUMENT]
|
|
220
|
-
}] }, { type: i2.MatDialog }, { type: i3.ImagePlugin }], propDecorators: { editor: [{
|
|
218
|
+
}], ctorParameters: () => [], propDecorators: { editor: [{
|
|
221
219
|
type: ViewChild,
|
|
222
220
|
args: ['editor', { read: ElementRef, static: true }]
|
|
223
221
|
}], contentChange: [{
|
|
@@ -227,4 +225,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImpor
|
|
|
227
225
|
}], save: [{
|
|
228
226
|
type: Output
|
|
229
227
|
}] } });
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2VkaXRvci9lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixJQUFJLEVBQ0osU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFFLE1BQU0sRUFBYyxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxTQUFTLEVBQUUsYUFBYSxFQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFDbkUsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQWdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGNBQWMsRUFBRSxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRSxPQUFPLEVBQUMsY0FBYyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxVQUFV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Z0IsNFRBQ2hCLGFBQWEsbUxBQ2IscUJBQXFCLHNvQkFDckIsYUFBYSw2dkJBQ2IsZ0JBQWdCLG1JQUNoQix3QkFBd0I7OzJGQUduQixzQkFBc0I7a0JBaEJsQyxTQUFTOytCQUNJLGdCQUFnQixhQUdmLENBQUMsV0FBVyxDQUFDLGNBQ1osSUFBSSxXQUNQO3dCQUNMLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLHFCQUFxQjt3QkFDckIsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLHdCQUF3QjtxQkFDM0I7OzBCQXdDSSxRQUFROzswQkFBSSxJQUFJOzswQkFDaEIsTUFBTTsyQkFBQyxRQUFROzJGQXBDMkMsTUFBTTtzQkFBcEUsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRTNCLGFBQWE7c0JBQXRDLE1BQU07Z0JBUVMsYUFBYTtzQkFBNUIsS0FBSztnQkFvQm9CLElBQUk7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgU2VsZixcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0VkaXRvclZpZXd9IGZyb20gJ3Byb3NlbWlycm9yLXZpZXcnO1xuaW1wb3J0IHtFZGl0b3JTdGF0ZSwgUGx1Z2luLCBUcmFuc2FjdGlvbn0gZnJvbSAncHJvc2VtaXJyb3Itc3RhdGUnO1xuaW1wb3J0IHtET01QYXJzZXIsIERPTVNlcmlhbGl6ZXIsIFNjaGVtYX0gZnJvbSAncHJvc2VtaXJyb3ItbW9kZWwnO1xuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHtnb1RvTmV4dENlbGwsIHRhYmxlRWRpdGluZ30gZnJvbSAncHJvc2VtaXJyb3ItdGFibGVzJztcbmltcG9ydCB7a2V5bWFwfSBmcm9tICdwcm9zZW1pcnJvci1rZXltYXAnO1xuaW1wb3J0IHtJbWFnZVBsdWdpbiwgSW1hZ2VVcGxvYWRlcn0gZnJvbSAnLi4vdXRpbHMvaW1hZ2UnO1xuaW1wb3J0IHthZHZhbmNlZFNjaGVtYSwgYmFzaWNTY2hlbWF9IGZyb20gJy4uL3V0aWxzL3NjaGVtYS9zY2hlbWEnO1xuaW1wb3J0IHtidWlsZE1lbnVJdGVtcywgS2V5LCBNZW51SXRlbXN9IGZyb20gJy4uL3V0aWxzL21lbnUnO1xuaW1wb3J0IHtoaXN0b3J5fSBmcm9tICdwcm9zZW1pcnJvci1oaXN0b3J5JztcbmltcG9ydCB7YmFzZUtleW1hcH0gZnJvbSAncHJvc2VtaXJyb3ItY29tbWFuZHMnO1xuaW1wb3J0IHtkcm9wQ3Vyc29yfSBmcm9tICdwcm9zZW1pcnJvci1kcm9wY3Vyc29yJztcbmltcG9ydCB7Z2FwQ3Vyc29yfSBmcm9tICdwcm9zZW1pcnJvci1nYXBjdXJzb3InO1xuaW1wb3J0IHtidWlsZElucHV0UnVsZXN9IGZyb20gJy4uL3V0aWxzL2lucHV0cnVsZXMnO1xuaW1wb3J0IHtidWlsZEtleW1hcH0gZnJvbSAnLi4vdXRpbHMva2V5bWFwJztcbmltcG9ydCB7TmF0dXJhbEZpbGVEcm9wRGlyZWN0aXZlfSBmcm9tICdAZWNvZGV2L25hdHVyYWwnO1xuaW1wb3J0IHtNYXREaXZpZGVyTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaXZpZGVyJztcbmltcG9ydCB7TWF0TWVudU1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQge01hdEJ1dHRvblRvZ2dsZU1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZSc7XG5pbXBvcnQge01hdEljb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHtNYXRUb29sdGlwTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7TWF0QnV0dG9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuXG4vKipcbiAqIFByb3NlbWlycm9yIGNvbXBvbmVudFxuICpcbiAqIFVzYWdlIDpcbiAqXG4gKiBgYGBodG1sXG4gKiA8bmF0dXJhbC1lZGl0b3IgWyhuZ01vZGVsKV09XCJodG1sU3RyaW5nXCIgLz5cbiAqIGBgYFxuICovXG4vLyBAZHluYW1pY1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduYXR1cmFsLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuc2NzcycsXG4gICAgcHJvdmlkZXJzOiBbSW1hZ2VQbHVnaW5dLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsXG4gICAgICAgIE1hdEljb25Nb2R1bGUsXG4gICAgICAgIE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSxcbiAgICAgICAgTWF0TWVudU1vZHVsZSxcbiAgICAgICAgTWF0RGl2aWRlck1vZHVsZSxcbiAgICAgICAgTmF0dXJhbEZpbGVEcm9wRGlyZWN0aXZlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgdmlldzogRWRpdG9yVmlldyB8IG51bGwgPSBudWxsO1xuXG4gICAgQFZpZXdDaGlsZCgnZWRpdG9yJywge3JlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZX0pIHByaXZhdGUgZWRpdG9yITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IGNvbnRlbnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENhbGxiYWNrIHRvIHVwbG9hZCBhbiBpbWFnZS5cbiAgICAgKlxuICAgICAqIElmIGdpdmVuIGl0IHdpbGwgZW5hYmxlIGFkdmFuY2VkIHNjaGVtYSwgaW5jbHVkaW5nIGltYWdlIGFuZCB0YWJsZXMuXG4gICAgICogSXQgbXVzdCBiZSBnaXZlbiBvbiBpbml0aWFsaXphdGlvbiBhbmQgY2Fubm90IGJlIGNoYW5nZWQgbGF0ZXIgb24uXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGltYWdlVXBsb2FkZXI6IEltYWdlVXBsb2FkZXIgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgc2NoZW1hOiBTY2hlbWEgPSBiYXNpY1NjaGVtYTtcblxuICAgIC8qKlxuICAgICAqIEludGVyZmFjZSB3aXRoIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gICAgICogTm90aWZpZXMgcGFyZW50IG1vZGVsIC8gZm9ybSBjb250cm9sbGVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkNoYW5nZT86ICh2YWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEhUTUwgc3RyaW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb250ZW50ID0gJyc7XG5cbiAgICBwdWJsaWMgbWVudTogTWVudUl0ZW1zIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBJZiBzdWJzY3JpYmVkIHRvLCB0aGVuIHRoZSBzYXZlIGJ1dHRvbiB3aWxsIGJlIHNob3duIGFuZCBjbGljayBldmVudHMgZm9yd2FyZGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIHJlYWRvbmx5IG5nQ29udHJvbDogTmdDb250cm9sLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbWFnZVBsdWdpbjogSW1hZ2VQbHVnaW4sXG4gICAgKSB7XG4gICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvciA9IHRoaXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gdGhpcy5pbWFnZVVwbG9hZGVyID8gYWR2YW5jZWRTY2hlbWEgOiBiYXNpY1NjaGVtYTtcbiAgICAgICAgdGhpcy5tZW51ID0gYnVpbGRNZW51SXRlbXModGhpcy5zY2hlbWEsIHRoaXMuZGlhbG9nKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplciA9IERPTVNlcmlhbGl6ZXIuZnJvbVNjaGVtYSh0aGlzLnNjaGVtYSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jcmVhdGVTdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBFZGl0b3JWaWV3KHRoaXMuZWRpdG9yLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIGVkaXRhYmxlOiAoKSA9PiAhdGhpcy5kaXNhYmxlZCxcbiAgICAgICAgICAgIGRpc3BhdGNoVHJhbnNhY3Rpb246ICh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudmlldykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3U3RhdGUgPSB0aGlzLnZpZXcuc3RhdGUuYXBwbHkodHJhbnNhY3Rpb24pO1xuICAgICAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGVTdGF0ZShuZXdTdGF0ZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gZG9jIGludG8gSFRNTCBzdHJpbmdcbiAgICAgICAgICAgICAgICBjb25zdCBkb20gPSBzZXJpYWxpemVyLnNlcmlhbGl6ZUZyYWdtZW50KHRoaXMudmlldy5zdGF0ZS5kb2MgYXMgYW55KTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnXycpO1xuICAgICAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRvbSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gZWwuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQgPT09IG5ld0NvbnRlbnQgfHwgdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gZWwuaW5uZXJIVE1MO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDaGFuZ2UuZW1pdCh0aGlzLmNvbnRlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbCAhPT0gdGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSB2YWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuY3JlYXRlU3RhdGUoKTtcbiAgICAgICAgICAgIHRoaXMudmlldy51cGRhdGVTdGF0ZShzdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVN0YXRlKCk6IEVkaXRvclN0YXRlIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ18nKTtcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gJzxkaXY+JyArIHRoaXMuY29udGVudCArICc8L2Rpdj4nO1xuICAgICAgICBpZiAoIXRlbXBsYXRlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2hpbGQgb2YgdGVtcGxhdGUgZWxlbWVudCBjb3VsZCBub3QgYmUgY3JlYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VyID0gRE9NUGFyc2VyLmZyb21TY2hlbWEodGhpcy5zY2hlbWEpO1xuICAgICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2UodGVtcGxhdGUuZmlyc3RDaGlsZCk7XG5cbiAgICAgICAgcmV0dXJuIEVkaXRvclN0YXRlLmNyZWF0ZSh7XG4gICAgICAgICAgICBkb2M6IGRvYyxcbiAgICAgICAgICAgIHBsdWdpbnM6IHRoaXMuY3JlYXRlUGx1Z2lucygpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVBsdWdpbnMoKTogUGx1Z2luW10ge1xuICAgICAgICBjb25zdCBpc01hYyA9ICEhdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ubmF2aWdhdG9yLnBsYXRmb3JtLm1hdGNoKC9NYWMvKTtcblxuICAgICAgICBjb25zdCBwbHVnaW5zID0gW1xuICAgICAgICAgICAgYnVpbGRJbnB1dFJ1bGVzKHRoaXMuc2NoZW1hKSxcbiAgICAgICAgICAgIGtleW1hcChidWlsZEtleW1hcCh0aGlzLnNjaGVtYSwgaXNNYWMpKSxcbiAgICAgICAgICAgIGtleW1hcChiYXNlS2V5bWFwKSxcbiAgICAgICAgICAgIGRyb3BDdXJzb3IoKSxcbiAgICAgICAgICAgIGdhcEN1cnNvcigpLFxuICAgICAgICAgICAgaGlzdG9yeSgpLFxuICAgICAgICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge2NsYXNzOiAnUHJvc2VNaXJyb3ItZXhhbXBsZS1zZXR1cC1zdHlsZSd9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBQbHVnaW4oe1xuICAgICAgICAgICAgICAgIHZpZXc6ICgpID0+IHRoaXMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAodGhpcy5zY2hlbWEgPT09IGFkdmFuY2VkU2NoZW1hKSB7XG4gICAgICAgICAgICBwbHVnaW5zLnB1c2goXG4gICAgICAgICAgICAgICAgdGhpcy5pbWFnZVBsdWdpbi5wbHVnaW4sXG4gICAgICAgICAgICAgICAgdGFibGVFZGl0aW5nKCksXG4gICAgICAgICAgICAgICAga2V5bWFwKHtcbiAgICAgICAgICAgICAgICAgICAgVGFiOiBnb1RvTmV4dENlbGwoMSksXG4gICAgICAgICAgICAgICAgICAgICdTaGlmdC1UYWInOiBnb1RvTmV4dENlbGwoLTEpLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwbHVnaW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCBieSBQcm9zZW1pcnJvciB3aGVuZXZlciB0aGUgZWRpdG9yIHN0YXRlIGNoYW5nZXMuIFNvIHdlIHVwZGF0ZSBvdXIgbWVudSBzdGF0ZXMuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcgfHwgIXRoaXMubWVudSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIE9iamVjdC52YWx1ZXModGhpcy5tZW51KSkge1xuICAgICAgICAgICAgaXRlbS51cGRhdGUodGhpcy52aWV3LCB0aGlzLnZpZXcuc3RhdGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKCk6IHZvaWQge1xuICAgICAgICAvLyBub29wXG4gICAgfVxuXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudmlldy5kZXN0cm95KCk7XG4gICAgICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJ1bihldmVudDogRXZlbnQsIGtleTogS2V5KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aWV3IHx8ICF0aGlzLm1lbnUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1lbnVba2V5XTtcbiAgICAgICAgaWYgKCFpdGVtIHx8IGl0ZW0uZGlzYWJsZWQgfHwgIWl0ZW0uc2hvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaXRlbS5zcGVjLnJ1bih0aGlzLnZpZXcuc3RhdGUsIHRoaXMudmlldy5kaXNwYXRjaCwgdGhpcy52aWV3LCBldmVudCk7XG4gICAgICAgIHRoaXMudmlldy5mb2N1cygpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGxvYWQoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlldyB8fCAhdGhpcy5pbWFnZVVwbG9hZGVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy52aWV3LnN0YXRlLnNlbGVjdGlvbi4kZnJvbS5wYXJlbnQuaW5saW5lQ29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5pbWFnZVBsdWdpbi5zdGFydEltYWdlVXBsb2FkKHRoaXMudmlldywgZmlsZSwgdGhpcy5pbWFnZVVwbG9hZGVyLCB0aGlzLnNjaGVtYSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZpZXcuZm9jdXMoKTtcbiAgICB9XG59XG4iLCJAaWYgKG1lbnUgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICA8ZGl2IGNsYXNzPVwibWVudS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnVcIj5cbiAgICAgICAgICAgIEBpZiAoc2F2ZS5vYnNlcnZlZCkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzYXZlLmVtaXQoKVwiIGkxOG4tbWF0VG9vbHRpcCBtYXRUb29sdGlwPVwiRW5yZWdpc3RyZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2F2ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgaGlkZU11bHRpcGxlU2VsZWN0aW9uSW5kaWNhdG9yIG11bHRpcGxlPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVTdHJvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVTdHJvbmcuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS50b2dnbGVTdHJvbmcuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlU3Ryb25nJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiR3Jhc1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9ib2xkXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlRW0uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS50b2dnbGVFbS5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVFbScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkl0YWxpcXVlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2l0YWxpY1wiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlQ29kZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LnRvZ2dsZUNvZGUuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlQ29kZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJjb2RlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUxpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVMaW5rLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUudG9nZ2xlTGluay5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVMaW5rJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSW5zw6lyZXIgdW4gbGllbi4uLlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImluc2VydF9saW5rXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJibG9ja01lbnVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpMThuPlR5cGU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiYXJyb3dfZHJvcF9kb3duXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNibG9ja01lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUubWFrZVBhcmFncmFwaC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VQYXJhZ3JhcGgnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+UGFyYWdyYXBoZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VDb2RlQmxvY2spIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUubWFrZUNvZGVCbG9jay5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VDb2RlQmxvY2snKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+Q29kZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkMSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQxLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDEnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSAxXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQyKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDIuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkMicpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDMpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkMy5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQzJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgM1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkNCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQ0LmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDQnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSA0XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQ1KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDUuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkNScpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDYpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkNi5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQ2JylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgNlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmJsb2NrQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LmJsb2NrQ2xhc3MuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ2Jsb2NrQ2xhc3MnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5DbGFzc2UuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5ibG9ja0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaTE4biBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LmJsb2NrSWQuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ2Jsb2NrSWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+SUQuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIEBpZiAobWVudS5hZGRDb2x1bW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInRhYmxlTWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBpMThuPlRhYmxlYXU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImFycm93X2Ryb3BfZG93blwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8bWF0LW1lbnUgI3RhYmxlTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuaW5zZXJ0VGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuaW5zZXJ0VGFibGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdpbnNlcnRUYWJsZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5JbnPDqXJlciB1biB0YWJsZWF1XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuZGVsZXRlVGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuZGVsZXRlVGFibGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdkZWxldGVUYWJsZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5TdXBwcmltZXIgbGUgdGFibGVhdVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1lcmdlQ2VsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1lcmdlQ2VsbHMuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21lcmdlQ2VsbHMnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5GdXNpb25uZXIgbGVzIGNlbGx1bGVzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuc3BsaXRDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5zcGxpdENlbGwuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ3NwbGl0Q2VsbCcpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlNjaW5kZXIgbGVzIGNlbGx1bGVzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuY2VsbEJhY2tncm91bmRDb2xvcikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5jZWxsQmFja2dyb3VuZENvbG9yLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnY2VsbEJhY2tncm91bmRDb2xvcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5Db3VsZXVyIGRlIGZvbmQuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50YWJsZUNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS50YWJsZUNsYXNzLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0YWJsZUNsYXNzJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+Q2xhc3NlLi4uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudGFibGVJZCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGkxOG4gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS50YWJsZUlkLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0YWJsZUlkJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPklELi4uXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWRkQ29sdW1uQmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFkZENvbHVtbkJlZm9yZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FkZENvbHVtbkJlZm9yZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5JbnPDqXJlciB1bmUgY29sb25uZSBhdmFudFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmFkZENvbHVtbkFmdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFkZENvbHVtbkFmdGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWRkQ29sdW1uQWZ0ZXInKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5zw6lyZXIgdW5lIGNvbG9ubmUgYXByw6hzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuZGVsZXRlQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmRlbGV0ZUNvbHVtbi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2RlbGV0ZUNvbHVtbicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5TdXBwcmltZXIgbGEgY29sb25uZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmFkZFJvd0JlZm9yZSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hZGRSb3dCZWZvcmUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhZGRSb3dCZWZvcmUnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+SW5zw6lyZXIgdW5lIGxpZ25lIGF2YW50XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWRkUm93QWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWRkUm93QWZ0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhZGRSb3dBZnRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5JbnPDqXJlciB1bmUgbGlnbmUgYXByw6hzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuZGVsZXRlUm93KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5kZWxldGVSb3cuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ2RlbGV0ZVJvdycpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlN1cHByaW1lciBsYSBsaWduZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyIC8+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVIZWFkZXJDb2x1bW4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVIZWFkZXJDb2x1bW4nKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+RW50w6p0ZSBkZSBjb2xvbm5lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudG9nZ2xlSGVhZGVyUm93KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRvZ2dsZUhlYWRlclJvdy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RvZ2dsZUhlYWRlclJvdycpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5FbnTDqnRlIGRlIGxpZ25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudG9nZ2xlSGVhZGVyQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVIZWFkZXJDZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlSGVhZGVyQ2VsbCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5FbnTDqnRlIGRlIGNlbGx1bGVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICAgIEBpZiAoaW1hZ2VVcGxvYWRlcikge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG5hdHVyYWxGaWxlRHJvcFxuICAgICAgICAgICAgICAgICAgICBbc2VsZWN0YWJsZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW2Jyb2FkY2FzdF09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSW5zw6lyZXIgdW5lIGltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgKGZpbGVDaGFuZ2UpPVwidXBsb2FkKCRldmVudClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiaW5zZXJ0X3Bob3RvXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS5hbGlnbkxlZnQpIHtcbiAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAgaGlkZVNpbmdsZVNlbGVjdGlvbkluZGljYXRvcj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZW51LmFsaWduTGVmdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWxpZ25MZWZ0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LmFsaWduTGVmdC5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWxpZ25MZWZ0JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBbGlnbmVyIGdhdWNoZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2FsaWduX2xlZnRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWxpZ25DZW50ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFsaWduQ2VudGVyLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LmFsaWduQ2VudGVyLmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhbGlnbkNlbnRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ2VudHJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2FsaWduX2NlbnRlclwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWVudS5hbGlnblJpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hbGlnblJpZ2h0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LmFsaWduUmlnaHQuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FsaWduUmlnaHQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFsaWduZXIgZHJvaXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfYWxpZ25fcmlnaHRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWxpZ25KdXN0aWZ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hbGlnbkp1c3RpZnkuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUuYWxpZ25KdXN0aWZ5LmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhbGlnbkp1c3RpZnknKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkp1c3RpZmllclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2FsaWduX2p1c3RpZnlcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUudW5kbykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnVuZG8uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3VuZG8nKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQW5udWxlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJ1bmRvXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS5yZWRvKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUucmVkby5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAncmVkbycpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJSZWZhaXJlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInJlZG9cIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LndyYXBCdWxsZXRMaXN0ICYmIG1lbnUud3JhcEJ1bGxldExpc3Quc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LndyYXBCdWxsZXRMaXN0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd3cmFwQnVsbGV0TGlzdCcpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJMaXN0ZSDDoCBwdWNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9saXN0X2J1bGxldGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS53cmFwT3JkZXJlZExpc3QgJiYgbWVudS53cmFwT3JkZXJlZExpc3Quc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LndyYXBPcmRlcmVkTGlzdC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnd3JhcE9yZGVyZWRMaXN0JylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkxpc3RlIMOgIG51bcOpcm9cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2xpc3RfbnVtYmVyZWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LndyYXBCbG9ja1F1b3RlICYmIG1lbnUud3JhcEJsb2NrUXVvdGUuc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LndyYXBCbG9ja1F1b3RlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd3cmFwQmxvY2tRdW90ZScpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDaXRhdGlvblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfcXVvdGVcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LmpvaW5VcCAmJiBtZW51LmpvaW5VcC5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuam9pblVwLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdqb2luVXAnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRnVzaW9ubmVyIGF2ZWMgbCfDqWzDqW1lbnQgZHUgaGF1dFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJtb3ZlX3VwXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS5saWZ0ICYmIG1lbnUubGlmdC5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUubGlmdC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnbGlmdCcpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEw6lzaW5kZW50ZXJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2luZGVudF9kZWNyZWFzZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUuc2VsZWN0UGFyZW50Tm9kZSAmJiBtZW51LnNlbGVjdFBhcmVudE5vZGUuc2hvdykge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnNlbGVjdFBhcmVudE5vZGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3NlbGVjdFBhcmVudE5vZGUnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiU8OpbGVjdGlvbm5lciBsJ8OpbMOpbWVudCBwYXJlbnRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwic2VsZWN0X2FsbFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxufVxuPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIiAjZWRpdG9yPjwvZGl2PlxuIl19
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25hdHVyYWwtZWRpdG9yL3NyYy9saWIvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsLWVkaXRvci9zcmMvbGliL2VkaXRvci9lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkgsT0FBTyxFQUF1QixTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMvRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsU0FBUyxFQUFFLGFBQWEsRUFBUyxNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBZ0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFFLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBQyxjQUFjLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxxQkFBcUIs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QUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLENBQUM7dUdBM01RLHNCQUFzQjsyRkFBdEIsc0JBQXNCLG9LQVpwQixDQUFDLFdBQVcsQ0FBQyx1R0FvQkksVUFBVSwyQ0M1RDFDLHNsakJBdVpBLDhxR0Q1V1EsZUFBZSx3VUFDZixnQkFBZ0IsNFRBQ2hCLGFBQWEsbUxBQ2IscUJBQXFCLHNvQkFDckIsYUFBYSw2dkJBQ2IsZ0JBQWdCLG1JQUNoQix3QkFBd0I7OzJGQUduQixzQkFBc0I7a0JBaEJsQyxTQUFTOytCQUNJLGdCQUFnQixhQUdmLENBQUMsV0FBVyxDQUFDLGNBQ1osSUFBSSxXQUNQO3dCQUNMLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLHFCQUFxQjt3QkFDckIsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLHdCQUF3QjtxQkFDM0I7d0RBVThELE1BQU07c0JBQXBFLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUUzQixhQUFhO3NCQUF0QyxNQUFNO2dCQVFTLGFBQWE7c0JBQTVCLEtBQUs7Z0JBb0JvQixJQUFJO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtFZGl0b3JWaWV3fSBmcm9tICdwcm9zZW1pcnJvci12aWV3JztcbmltcG9ydCB7RWRpdG9yU3RhdGUsIFBsdWdpbiwgVHJhbnNhY3Rpb259IGZyb20gJ3Byb3NlbWlycm9yLXN0YXRlJztcbmltcG9ydCB7RE9NUGFyc2VyLCBET01TZXJpYWxpemVyLCBTY2hlbWF9IGZyb20gJ3Byb3NlbWlycm9yLW1vZGVsJztcbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7Z29Ub05leHRDZWxsLCB0YWJsZUVkaXRpbmd9IGZyb20gJ3Byb3NlbWlycm9yLXRhYmxlcyc7XG5pbXBvcnQge2tleW1hcH0gZnJvbSAncHJvc2VtaXJyb3Ita2V5bWFwJztcbmltcG9ydCB7SW1hZ2VQbHVnaW4sIEltYWdlVXBsb2FkZXJ9IGZyb20gJy4uL3V0aWxzL2ltYWdlJztcbmltcG9ydCB7YWR2YW5jZWRTY2hlbWEsIGJhc2ljU2NoZW1hfSBmcm9tICcuLi91dGlscy9zY2hlbWEvc2NoZW1hJztcbmltcG9ydCB7YnVpbGRNZW51SXRlbXMsIEtleSwgTWVudUl0ZW1zfSBmcm9tICcuLi91dGlscy9tZW51JztcbmltcG9ydCB7aGlzdG9yeX0gZnJvbSAncHJvc2VtaXJyb3ItaGlzdG9yeSc7XG5pbXBvcnQge2Jhc2VLZXltYXB9IGZyb20gJ3Byb3NlbWlycm9yLWNvbW1hbmRzJztcbmltcG9ydCB7ZHJvcEN1cnNvcn0gZnJvbSAncHJvc2VtaXJyb3ItZHJvcGN1cnNvcic7XG5pbXBvcnQge2dhcEN1cnNvcn0gZnJvbSAncHJvc2VtaXJyb3ItZ2FwY3Vyc29yJztcbmltcG9ydCB7YnVpbGRJbnB1dFJ1bGVzfSBmcm9tICcuLi91dGlscy9pbnB1dHJ1bGVzJztcbmltcG9ydCB7YnVpbGRLZXltYXB9IGZyb20gJy4uL3V0aWxzL2tleW1hcCc7XG5pbXBvcnQge05hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZX0gZnJvbSAnQGVjb2Rldi9uYXR1cmFsJztcbmltcG9ydCB7TWF0RGl2aWRlck1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGl2aWRlcic7XG5pbXBvcnQge01hdE1lbnVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuaW1wb3J0IHtNYXRCdXR0b25Ub2dnbGVNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbi10b2dnbGUnO1xuaW1wb3J0IHtNYXRJY29uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7TWF0VG9vbHRpcE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQge01hdEJ1dHRvbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcblxuLyoqXG4gKiBQcm9zZW1pcnJvciBjb21wb25lbnRcbiAqXG4gKiBVc2FnZSA6XG4gKlxuICogYGBgaHRtbFxuICogPG5hdHVyYWwtZWRpdG9yIFsobmdNb2RlbCldPVwiaHRtbFN0cmluZ1wiIC8+XG4gKiBgYGBcbiAqL1xuLy8gQGR5bmFtaWNcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmF0dXJhbC1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxuICAgIHByb3ZpZGVyczogW0ltYWdlUGx1Z2luXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgICAgIE1hdERpdmlkZXJNb2R1bGUsXG4gICAgICAgIE5hdHVyYWxGaWxlRHJvcERpcmVjdGl2ZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOYXR1cmFsRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5nQ29udHJvbCA9IGluamVjdChOZ0NvbnRyb2wsIHtvcHRpb25hbDogdHJ1ZSwgc2VsZjogdHJ1ZX0pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3Q8RG9jdW1lbnQ+KERPQ1VNRU5UKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW1hZ2VQbHVnaW4gPSBpbmplY3QoSW1hZ2VQbHVnaW4pO1xuXG4gICAgcHJpdmF0ZSB2aWV3OiBFZGl0b3JWaWV3IHwgbnVsbCA9IG51bGw7XG5cbiAgICBAVmlld0NoaWxkKCdlZGl0b3InLCB7cmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiB0cnVlfSkgcHJpdmF0ZSBlZGl0b3IhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgY29udGVudENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQ2FsbGJhY2sgdG8gdXBsb2FkIGFuIGltYWdlLlxuICAgICAqXG4gICAgICogSWYgZ2l2ZW4gaXQgd2lsbCBlbmFibGUgYWR2YW5jZWQgc2NoZW1hLCBpbmNsdWRpbmcgaW1hZ2UgYW5kIHRhYmxlcy5cbiAgICAgKiBJdCBtdXN0IGJlIGdpdmVuIG9uIGluaXRpYWxpemF0aW9uIGFuZCBjYW5ub3QgYmUgY2hhbmdlZCBsYXRlciBvbi5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgaW1hZ2VVcGxvYWRlcjogSW1hZ2VVcGxvYWRlciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBzY2hlbWE6IFNjaGVtYSA9IGJhc2ljU2NoZW1hO1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJmYWNlIHdpdGggQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgICAgKiBOb3RpZmllcyBwYXJlbnQgbW9kZWwgLyBmb3JtIGNvbnRyb2xsZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uQ2hhbmdlPzogKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuXG4gICAgLyoqXG4gICAgICogSFRNTCBzdHJpbmdcbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbnRlbnQgPSAnJztcblxuICAgIHB1YmxpYyBtZW51OiBNZW51SXRlbXMgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIElmIHN1YnNjcmliZWQgdG8sIHRoZW4gdGhlIHNhdmUgYnV0dG9uIHdpbGwgYmUgc2hvd24gYW5kIGNsaWNrIGV2ZW50cyBmb3J3YXJkZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zY2hlbWEgPSB0aGlzLmltYWdlVXBsb2FkZXIgPyBhZHZhbmNlZFNjaGVtYSA6IGJhc2ljU2NoZW1hO1xuICAgICAgICB0aGlzLm1lbnUgPSBidWlsZE1lbnVJdGVtcyh0aGlzLnNjaGVtYSwgdGhpcy5kaWFsb2cpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVyID0gRE9NU2VyaWFsaXplci5mcm9tU2NoZW1hKHRoaXMuc2NoZW1hKTtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmNyZWF0ZVN0YXRlKCk7XG5cbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IEVkaXRvclZpZXcodGhpcy5lZGl0b3IubmF0aXZlRWxlbWVudCwge1xuICAgICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgICAgZWRpdGFibGU6ICgpID0+ICF0aGlzLmRpc2FibGVkLFxuICAgICAgICAgICAgZGlzcGF0Y2hUcmFuc2FjdGlvbjogKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy52aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IHRoaXMudmlldy5zdGF0ZS5hcHBseSh0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcblxuICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBkb2MgaW50byBIVE1MIHN0cmluZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGRvbSA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplRnJhZ21lbnQodGhpcy52aWV3LnN0YXRlLmRvYyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdfJyk7XG4gICAgICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZG9tKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBlbC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCA9PT0gbmV3Q29udGVudCB8fCB0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBlbC5pbm5lckhUTUw7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGVudENoYW5nZS5lbWl0KHRoaXMuY29udGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVWYWx1ZSh2YWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsICE9PSB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudCA9IHZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXcgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5jcmVhdGVTdGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy52aWV3LnVwZGF0ZVN0YXRlKHN0YXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlU3RhdGUoKTogRWRpdG9yU3RhdGUge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnXycpO1xuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSAnPGRpdj4nICsgdGhpcy5jb250ZW50ICsgJzwvZGl2Pic7XG4gICAgICAgIGlmICghdGVtcGxhdGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjaGlsZCBvZiB0ZW1wbGF0ZSBlbGVtZW50IGNvdWxkIG5vdCBiZSBjcmVhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYXJzZXIgPSBET01QYXJzZXIuZnJvbVNjaGVtYSh0aGlzLnNjaGVtYSk7XG4gICAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZSh0ZW1wbGF0ZS5maXJzdENoaWxkKTtcblxuICAgICAgICByZXR1cm4gRWRpdG9yU3RhdGUuY3JlYXRlKHtcbiAgICAgICAgICAgIGRvYzogZG9jLFxuICAgICAgICAgICAgcGx1Z2luczogdGhpcy5jcmVhdGVQbHVnaW5zKCksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUGx1Z2lucygpOiBQbHVnaW5bXSB7XG4gICAgICAgIGNvbnN0IGlzTWFjID0gISF0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL01hYy8pO1xuXG4gICAgICAgIGNvbnN0IHBsdWdpbnMgPSBbXG4gICAgICAgICAgICBidWlsZElucHV0UnVsZXModGhpcy5zY2hlbWEpLFxuICAgICAgICAgICAga2V5bWFwKGJ1aWxkS2V5bWFwKHRoaXMuc2NoZW1hLCBpc01hYykpLFxuICAgICAgICAgICAga2V5bWFwKGJhc2VLZXltYXApLFxuICAgICAgICAgICAgZHJvcEN1cnNvcigpLFxuICAgICAgICAgICAgZ2FwQ3Vyc29yKCksXG4gICAgICAgICAgICBoaXN0b3J5KCksXG4gICAgICAgICAgICBuZXcgUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7Y2xhc3M6ICdQcm9zZU1pcnJvci1leGFtcGxlLXNldHVwLXN0eWxlJ30sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IFBsdWdpbih7XG4gICAgICAgICAgICAgICAgdmlldzogKCkgPT4gdGhpcyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdO1xuXG4gICAgICAgIGlmICh0aGlzLnNjaGVtYSA9PT0gYWR2YW5jZWRTY2hlbWEpIHtcbiAgICAgICAgICAgIHBsdWdpbnMucHVzaChcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlUGx1Z2luLnBsdWdpbixcbiAgICAgICAgICAgICAgICB0YWJsZUVkaXRpbmcoKSxcbiAgICAgICAgICAgICAgICBrZXltYXAoe1xuICAgICAgICAgICAgICAgICAgICBUYWI6IGdvVG9OZXh0Q2VsbCgxKSxcbiAgICAgICAgICAgICAgICAgICAgJ1NoaWZ0LVRhYic6IGdvVG9OZXh0Q2VsbCgtMSksXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBsdWdpbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbGVkIGJ5IFByb3NlbWlycm9yIHdoZW5ldmVyIHRoZSBlZGl0b3Igc3RhdGUgY2hhbmdlcy4gU28gd2UgdXBkYXRlIG91ciBtZW51IHN0YXRlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudmlldyB8fCAhdGhpcy5tZW51KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLm1lbnUpKSB7XG4gICAgICAgICAgICBpdGVtLnVwZGF0ZSh0aGlzLnZpZXcsIHRoaXMudmlldy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoKTogdm9pZCB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMudmlldykge1xuICAgICAgICAgICAgdGhpcy52aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMudmlldyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuKGV2ZW50OiBFdmVudCwga2V5OiBLZXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXcgfHwgIXRoaXMubWVudSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMubWVudVtrZXldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgaXRlbS5kaXNhYmxlZCB8fCAhaXRlbS5zaG93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpdGVtLnNwZWMucnVuKHRoaXMudmlldy5zdGF0ZSwgdGhpcy52aWV3LmRpc3BhdGNoLCB0aGlzLnZpZXcsIGV2ZW50KTtcbiAgICAgICAgdGhpcy52aWV3LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwbG9hZChmaWxlOiBGaWxlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy52aWV3IHx8ICF0aGlzLmltYWdlVXBsb2FkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnZpZXcuc3RhdGUuc2VsZWN0aW9uLiRmcm9tLnBhcmVudC5pbmxpbmVDb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmltYWdlUGx1Z2luLnN0YXJ0SW1hZ2VVcGxvYWQodGhpcy52aWV3LCBmaWxlLCB0aGlzLmltYWdlVXBsb2FkZXIsIHRoaXMuc2NoZW1hKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlldy5mb2N1cygpO1xuICAgIH1cbn1cbiIsIkBpZiAobWVudSAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgIDxkaXYgY2xhc3M9XCJtZW51LWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVudVwiPlxuICAgICAgICAgICAgQGlmIChzYXZlLm9ic2VydmVkKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNhdmUuZW1pdCgpXCIgaTE4bi1tYXRUb29sdGlwIG1hdFRvb2x0aXA9XCJFbnJlZ2lzdHJlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJzYXZlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBoaWRlTXVsdGlwbGVTZWxlY3Rpb25JbmRpY2F0b3IgbXVsdGlwbGU+XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZVN0cm9uZykge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRvZ2dsZVN0cm9uZy5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LnRvZ2dsZVN0cm9uZy5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVTdHJvbmcnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJHcmFzXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2JvbGRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudG9nZ2xlRW0pIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVFbS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJtZW51LnRvZ2dsZUVtLmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RvZ2dsZUVtJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSXRhbGlxdWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfaXRhbGljXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRvZ2dsZUNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS50b2dnbGVDb2RlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUudG9nZ2xlQ29kZS5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVDb2RlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImNvZGVcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudG9nZ2xlTGluaykge1xuICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRvZ2dsZUxpbmsuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS50b2dnbGVMaW5rLmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RvZ2dsZUxpbmsnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJJbnPDqXJlciB1biBsaWVuLi4uXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiaW5zZXJ0X2xpbmtcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImJsb2NrTWVudVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4+VHlwZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJhcnJvd19kcm9wX2Rvd25cIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2Jsb2NrTWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZVBhcmFncmFwaCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5tYWtlUGFyYWdyYXBoLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZVBhcmFncmFwaCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5QYXJhZ3JhcGhlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUNvZGVCbG9jaykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5tYWtlQ29kZUJsb2NrLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUNvZGVCbG9jaycpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5Db2RlXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQxKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDEuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkMScpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDFcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkMi5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQyJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgMlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkMykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQzLmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDMnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSAzXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWFrZUhlYWQ0KSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSBbZGlzYWJsZWRdPVwibWVudS5tYWtlSGVhZDQuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ21ha2VIZWFkNCcpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlRpdHJlIDRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5tYWtlSGVhZDUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51Lm1ha2VIZWFkNS5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWFrZUhlYWQ1JylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+VGl0cmUgNVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51Lm1ha2VIZWFkNikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWFrZUhlYWQ2LmRpc2FibGVkXCIgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdtYWtlSGVhZDYnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5UaXRyZSA2XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYmxvY2tDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUuYmxvY2tDbGFzcy5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnYmxvY2tDbGFzcycpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkNsYXNzZS4uLlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LmJsb2NrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBpMThuIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUuYmxvY2tJZC5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnYmxvY2tJZCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5JRC4uLlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgQGlmIChtZW51LmFkZENvbHVtbkJlZm9yZSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwidGFibGVNZW51XCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGkxOG4+VGFibGVhdTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiYXJyb3dfZHJvcF9kb3duXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxtYXQtbWVudSAjdGFibGVNZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5pbnNlcnRUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5pbnNlcnRUYWJsZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2luc2VydFRhYmxlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkluc8OpcmVyIHVuIHRhYmxlYXVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5kZWxldGVUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5kZWxldGVUYWJsZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2RlbGV0ZVRhYmxlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlN1cHByaW1lciBsZSB0YWJsZWF1XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUubWVyZ2VDZWxscykge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gW2Rpc2FibGVkXT1cIm1lbnUubWVyZ2VDZWxscy5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnbWVyZ2VDZWxscycpXCIgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkZ1c2lvbm5lciBsZXMgY2VsbHVsZXNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5zcGxpdENlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LnNwbGl0Q2VsbC5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnc3BsaXRDZWxsJylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+U2NpbmRlciBsZXMgY2VsbHVsZXNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5jZWxsQmFja2dyb3VuZENvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmNlbGxCYWNrZ3JvdW5kQ29sb3IuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdjZWxsQmFja2dyb3VuZENvbG9yJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkNvdWxldXIgZGUgZm9uZC4uLlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGlmIChtZW51LnRhYmxlQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LnRhYmxlQ2xhc3MuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RhYmxlQ2xhc3MnKVwiIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5DbGFzc2UuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50YWJsZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gaTE4biBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LnRhYmxlSWQuZGlzYWJsZWRcIiAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RhYmxlSWQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+SUQuLi5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxtYXQtZGl2aWRlciAvPlxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5hZGRDb2x1bW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWRkQ29sdW1uQmVmb3JlLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWRkQ29sdW1uQmVmb3JlJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkluc8OpcmVyIHVuZSBjb2xvbm5lIGF2YW50XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWRkQ29sdW1uQWZ0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWRkQ29sdW1uQWZ0ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhZGRDb2x1bW5BZnRlcicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5JbnPDqXJlciB1bmUgY29sb25uZSBhcHLDqHNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5kZWxldGVDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuZGVsZXRlQ29sdW1uLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnZGVsZXRlQ29sdW1uJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPlN1cHByaW1lciBsYSBjb2xvbm5lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWRkUm93QmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFkZFJvd0JlZm9yZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FkZFJvd0JlZm9yZScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5JbnPDqXJlciB1bmUgbGlnbmUgYXZhbnRcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5hZGRSb3dBZnRlcikge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hZGRSb3dBZnRlci5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FkZFJvd0FmdGVyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkluc8OpcmVyIHVuZSBsaWduZSBhcHLDqHNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS5kZWxldGVSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIFtkaXNhYmxlZF09XCJtZW51LmRlbGV0ZVJvdy5kaXNhYmxlZFwiIChjbGljayk9XCJydW4oJGV2ZW50LCAnZGVsZXRlUm93JylcIiBpMThuXG4gICAgICAgICAgICAgICAgICAgICAgICA+U3VwcHJpbWVyIGxhIGxpZ25lXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bWF0LWRpdmlkZXIgLz5cbiAgICAgICAgICAgICAgICBAaWYgKG1lbnUudG9nZ2xlSGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRvZ2dsZUhlYWRlckNvbHVtbi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3RvZ2dsZUhlYWRlckNvbHVtbicpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGkxOG5cbiAgICAgICAgICAgICAgICAgICAgICAgID5FbnTDqnRlIGRlIGNvbG9ubmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVIZWFkZXJSb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudG9nZ2xlSGVhZGVyUm93LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndG9nZ2xlSGVhZGVyUm93JylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkVudMOqdGUgZGUgbGlnbmVcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBpZiAobWVudS50b2dnbGVIZWFkZXJDZWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdC1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LnRvZ2dsZUhlYWRlckNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd0b2dnbGVIZWFkZXJDZWxsJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaTE4blxuICAgICAgICAgICAgICAgICAgICAgICAgPkVudMOqdGUgZGUgY2VsbHVsZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgQGlmIChpbWFnZVVwbG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgbmF0dXJhbEZpbGVEcm9wXG4gICAgICAgICAgICAgICAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICBbYnJvYWRjYXN0XT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJJbnPDqXJlciB1bmUgaW1hZ2VcIlxuICAgICAgICAgICAgICAgICAgICAoZmlsZUNoYW5nZSk9XCJ1cGxvYWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJpbnNlcnRfcGhvdG9cIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LmFsaWduTGVmdCkge1xuICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCBoaWRlU2luZ2xlU2VsZWN0aW9uSW5kaWNhdG9yPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1lbnUuYWxpZ25MZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5hbGlnbkxlZnQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUuYWxpZ25MZWZ0LmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdhbGlnbkxlZnQnKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkFsaWduZXIgZ2F1Y2hlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfYWxpZ25fbGVmdFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWVudS5hbGlnbkNlbnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuYWxpZ25DZW50ZXIuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUuYWxpZ25DZW50ZXIuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FsaWduQ2VudGVyJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJDZW50cmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfYWxpZ25fY2VudGVyXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtZW51LmFsaWduUmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFsaWduUmlnaHQuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1lbnUuYWxpZ25SaWdodC5hY3RpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnYWxpZ25SaWdodCcpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQWxpZ25lciBkcm9pdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9hbGlnbl9yaWdodFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBpZiAobWVudS5hbGlnbkp1c3RpZnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJtZW51LmFsaWduSnVzdGlmeS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibWVudS5hbGlnbkp1c3RpZnkuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2FsaWduSnVzdGlmeScpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiSnVzdGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfYWxpZ25fanVzdGlmeVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS51bmRvKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUudW5kby5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAndW5kbycpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBbm51bGVyXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cInVuZG9cIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LnJlZG8pIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5yZWRvLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdyZWRvJylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlJlZmFpcmVcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwicmVkb1wiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUud3JhcEJ1bGxldExpc3QgJiYgbWVudS53cmFwQnVsbGV0TGlzdC5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUud3JhcEJ1bGxldExpc3QuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3dyYXBCdWxsZXRMaXN0JylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkxpc3RlIMOgIHB1Y2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGZvbnRJY29uPVwiZm9ybWF0X2xpc3RfYnVsbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LndyYXBPcmRlcmVkTGlzdCAmJiBtZW51LndyYXBPcmRlcmVkTGlzdC5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUud3JhcE9yZGVyZWRMaXN0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICd3cmFwT3JkZXJlZExpc3QnKVwiXG4gICAgICAgICAgICAgICAgICAgIGkxOG4tbWF0VG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiTGlzdGUgw6AgbnVtw6lyb1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfbGlzdF9udW1iZXJlZFwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUud3JhcEJsb2NrUXVvdGUgJiYgbWVudS53cmFwQmxvY2tRdW90ZS5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUud3JhcEJsb2NrUXVvdGUuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ3dyYXBCbG9ja1F1b3RlJylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkNpdGF0aW9uXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cImZvcm1hdF9xdW90ZVwiIC8+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKG1lbnUuam9pblVwICYmIG1lbnUuam9pblVwLnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5qb2luVXAuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicnVuKCRldmVudCwgJ2pvaW5VcCcpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJGdXNpb25uZXIgYXZlYyBsJ8OpbMOpbWVudCBkdSBoYXV0XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBmb250SWNvbj1cIm1vdmVfdXBcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGlmIChtZW51LmxpZnQgJiYgbWVudS5saWZ0LnNob3cpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwibWVudS5saWZ0LmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJ1bigkZXZlbnQsICdsaWZ0JylcIlxuICAgICAgICAgICAgICAgICAgICBpMThuLW1hdFRvb2x0aXBcbiAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkTDqXNpbmRlbnRlclwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJmb3JtYXRfaW5kZW50X2RlY3JlYXNlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAobWVudS5zZWxlY3RQYXJlbnROb2RlICYmIG1lbnUuc2VsZWN0UGFyZW50Tm9kZS5zaG93KSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIm1lbnUuc2VsZWN0UGFyZW50Tm9kZS5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJydW4oJGV2ZW50LCAnc2VsZWN0UGFyZW50Tm9kZScpXCJcbiAgICAgICAgICAgICAgICAgICAgaTE4bi1tYXRUb29sdGlwXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJTw6lsZWN0aW9ubmVyIGwnw6lsw6ltZW50IHBhcmVudFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gZm9udEljb249XCJzZWxlY3RfYWxsXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG59XG48ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiICNlZGl0b3I+PC9kaXY+XG4iXX0=
|