UNPKG

@mdefy/ngx-markdown-editor

Version:

An Angular Markdown Editor in WYSIWYG style with extensive functionality, high customizability and an integrated material theme.

523 lines 56.6 kB
import { Injectable } from '@angular/core'; export class ToolbarService { constructor() { /** * The default toolbar setup. */ this.DEFAULT_TOOLBAR = [ 'setHeadingLevel', 'toggleHeadingLevel', 'increaseHeadingLevel', 'decreaseHeadingLevel', 'toggleBold', 'toggleItalic', 'toggleStrikethrough', '|', 'toggleUnorderedList', 'toggleOrderedList', 'toggleCheckList', '|', 'toggleQuote', 'toggleInlineCode', 'insertCodeBlock', '|', 'insertLink', 'insertImageLink', 'insertTable', 'insertHorizontalRule', '|', 'toggleRichTextMode', 'formatContent', '|', 'downloadAsFile', 'importFromFile', '|', 'togglePreview', 'toggleSideBySidePreview', '|', 'undo', 'redo', '|', 'openMarkdownGuide', ]; } /** * The default configurations of all items */ get DEFAULT_ITEMS() { return this._defaultItems; } /** * Returns the default configuration of the item with the specified name. * Returns `undefined`, if no item with the specified name can be found. */ getDefaultItem(itemName) { return this.DEFAULT_ITEMS.find((i) => i.name === itemName); } /** * Defines the default toolbar items. * Cannot be done statically as the actions depend on the `MarkdownEditorComponent` instance. */ defineDefaultItems(ngxMde) { const defaultItems = [ { name: 'setHeadingLevel', action: (level) => ngxMde.mde.setHeadingLevel(level), shortcut: 'Shift-Ctrl-Alt-H', isActive: () => { if (!ngxMde.mde.hasTokenAtCursorPos('header')) return 0; const token = ngxMde.mde.cm.getTokenAt(ngxMde.mde.getCursorPos()); return token.state.base.header; }, tooltip: 'Set Heading Level', icon: { format: 'svgString', iconName: 'format_heading', svgHtmlString: FORMAT_HEADING, }, disableOnPreview: true, }, { name: 'toggleHeadingLevel', action: () => ngxMde.mde.increaseHeadingLevel(), tooltip: 'Heading', shortcut: 'Alt-H', icon: { format: 'svgString', iconName: 'format_heading', svgHtmlString: FORMAT_HEADING, }, disableOnPreview: true, }, { name: 'increaseHeadingLevel', action: () => ngxMde.mde.increaseHeadingLevel(), tooltip: 'Smaller Heading', icon: { format: 'svgString', iconName: 'format_heading_decrease', svgHtmlString: FORMAT_HEADING_SMALLER, }, disableOnPreview: true, }, { name: 'decreaseHeadingLevel', action: () => ngxMde.mde.decreaseHeadingLevel(), tooltip: 'Bigger Heading', icon: { format: 'svgString', iconName: 'format_heading_increase', svgHtmlString: FORMAT_HEADING_BIGGER, }, disableOnPreview: true, }, { name: 'toggleBold', action: () => ngxMde.mde.toggleBold(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('strong'), tooltip: 'Toggle Bold', icon: { format: 'material', iconName: 'format_bold', }, disableOnPreview: true, }, { name: 'toggleItalic', action: () => ngxMde.mde.toggleItalic(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('em'), tooltip: 'Toggle Italic', icon: { format: 'material', iconName: 'format_italic', }, disableOnPreview: true, }, { name: 'toggleStrikethrough', action: () => ngxMde.mde.toggleStrikethrough(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('strikethrough'), tooltip: 'Toggle Strikethrough', icon: { format: 'material', iconName: 'format_strikethrough', }, disableOnPreview: true, }, { name: 'toggleUnorderedList', action: () => ngxMde.mde.toggleUnorderedList(), isActive: () => this.isListTypeActive(ngxMde, 'unordered'), tooltip: 'Toggle Unordered List', icon: { format: 'material', iconName: 'format_list_bulleted', }, disableOnPreview: true, }, { name: 'toggleOrderedList', action: () => ngxMde.mde.toggleOrderedList(), isActive: () => this.isListTypeActive(ngxMde, 'ordered'), tooltip: 'Toggle Ordered List', icon: { format: 'material', iconName: 'format_list_numbered', }, disableOnPreview: true, }, { name: 'toggleCheckList', action: () => ngxMde.mde.toggleCheckList(), isActive: () => this.isListTypeActive(ngxMde, 'check'), tooltip: 'Toggle Checklist', icon: { format: 'material', iconName: 'check_box', }, disableOnPreview: true, }, { name: 'toggleQuote', action: () => ngxMde.mde.toggleQuote(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('quote'), tooltip: 'Toggle Quotation', icon: { format: 'material', iconName: 'format_quote', }, disableOnPreview: true, }, { name: 'toggleInlineCode', action: () => ngxMde.mde.toggleInlineCode(), isActive: () => this.isCodeTypeActive(ngxMde, 'inline'), tooltip: 'Toggle Inline Code', icon: { format: 'material', iconName: 'code', }, disableOnPreview: true, }, { name: 'insertCodeBlock', action: () => ngxMde.mde.insertCodeBlock(), isActive: () => this.isCodeTypeActive(ngxMde, 'block'), tooltip: 'Insert Code Block', icon: { format: 'svgString', iconName: 'file_code', svgHtmlString: FILE_CODE, }, disableOnPreview: true, }, { name: 'insertLink', action: () => ngxMde.mde.insertLink(), isActive: () => (ngxMde.mde.hasTokenAtCursorPos('link-text') || ngxMde.mde.hasTokenAtCursorPos('link')) && !ngxMde.mde.hasTokenAtCursorPos('image'), tooltip: 'Insert Link', icon: { format: 'material', iconName: 'insert_link', }, disableOnPreview: true, }, { name: 'insertImageLink', action: () => ngxMde.mde.insertImageLink(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('image'), tooltip: 'Insert Image Link', icon: { format: 'material', iconName: 'image', }, disableOnPreview: true, }, { name: 'insertTable', action: () => ngxMde.mde.insertTable(), tooltip: 'Insert Table', icon: { format: 'material', iconName: 'table_chart', }, disableOnPreview: true, }, { name: 'insertHorizontalRule', action: () => ngxMde.mde.insertHorizontalRule(), isActive: () => ngxMde.mde.hasTokenAtCursorPos('hr'), tooltip: 'Insert Horizontal Rule', icon: { format: 'material', iconName: 'horizontal_rule', }, disableOnPreview: true, }, { name: 'toggleRichTextMode', action: () => ngxMde.mde.toggleRichTextMode(), isActive: () => { const mode = ngxMde.mde.cm.getOption('mode'); return mode === 'gfm' || mode.name === 'gfm'; }, tooltip: 'Toggle Rich-Text Mode', icon: { format: 'material', iconName: 'highlight', }, disableOnPreview: true, }, { name: 'formatContent', action: () => ngxMde.mde.formatContent(), tooltip: 'Format Content', icon: { format: 'material', iconName: 'format_paint', }, disableOnPreview: true, }, { name: 'downloadAsFile', action: () => ngxMde.mde.downloadAsFile(), tooltip: 'Download As File', icon: { format: 'material', iconName: 'get_app', }, disableOnPreview: true, }, { name: 'importFromFile', action: () => ngxMde.mde.importFromFile(), tooltip: 'Import From File', icon: { format: 'svgString', iconName: 'upload', svgHtmlString: UPLOAD, }, disableOnPreview: true, }, { name: 'togglePreview', action: () => ngxMde.togglePreview(), shortcut: 'Alt-P', isActive: () => ngxMde.showPreview, tooltip: 'Toggle Preview', icon: { format: 'material', iconName: 'preview', }, disableOnPreview: false, }, { name: 'toggleSideBySidePreview', action: () => ngxMde.toggleSideBySidePreview(), shortcut: 'Shift-Alt-P', isActive: () => ngxMde.showSideBySidePreview, tooltip: 'Toggle Side-by-Side Preview', icon: { format: 'svgString', iconName: 'column', svgHtmlString: COLUMN, }, disableOnPreview: false, }, { name: 'undo', action: () => ngxMde.mde.undo(), tooltip: 'Undo', icon: { format: 'material', iconName: 'undo', }, disableOnPreview: true, }, { name: 'redo', action: () => ngxMde.mde.redo(), shortcut: 'Ctrl-S', tooltip: 'Redo', icon: { format: 'material', iconName: 'redo', }, disableOnPreview: true, }, { name: 'openMarkdownGuide', action: () => ngxMde.mde.openMarkdownGuide(), tooltip: 'Open Markdown Guide', icon: { format: 'material', iconName: 'help', }, disableOnPreview: false, }, // Normalize separator item to reduce type complexity in template. // Effectively, only the `name` property is needed. { name: '|', action: () => { }, tooltip: '', icon: { format: 'material', iconName: '' }, disableOnPreview: false, }, ]; this._defaultItems = defaultItems; } isListTypeActive(ngxMde, listType) { const isList = ngxMde.mde.hasTokenAtCursorPos('list'); if (!isList) return false; const selections = ngxMde.mde.cm.listSelections(); let isListType = false; if (selections === null || selections === void 0 ? void 0 : selections.length) { const lineNumber = selections[selections.length - 1].from().line; isListType = ngxMde.mde.getListTypeOfLine(lineNumber) === listType; } return isListType; } isCodeTypeActive(ngxMde, codeType) { const isCode = ngxMde.mde.hasTokenAtCursorPos('code'); if (!isCode) return false; const token = ngxMde.mde.cm.getTokenAt(ngxMde.mde.getCursorPos()); if (codeType === 'block') { return token.state.overlay.codeBlock; } else { return token.state.overlay.code; } } } ToolbarService.decorators = [ { type: Injectable } ]; /* eslint-disable max-len */ const COLUMN = ` <!-- Icon from Font Awesome: https://fontawesome.com/icons/columns?style=solid; License: https://fontawesome.com/license --> <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="columns" class="svg-inline--fa fa-columns fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" licenseUrl="https://fontawesome.com/license" > <path fill="currentColor" d="M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z" ></path> </svg> `; const FILE_CODE = ` <!-- Icon from Font Awesome: https://fontawesome.com/icons/file-code?style=solid; License: https://fontawesome.com/license --> <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="file-code" class="svg-inline--fa fa-file-code fa-w-12" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" licenseUrl="https://fontawesome.com/license" > <path fill="currentColor" d="M384 121.941V128H256V0h6.059c6.365 0 12.47 2.529 16.971 7.029l97.941 97.941A24.005 24.005 0 0 1 384 121.941zM248 160c-13.2 0-24-10.8-24-24V0H24C10.745 0 0 10.745 0 24v464c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24V160H248zM123.206 400.505a5.4 5.4 0 0 1-7.633.246l-64.866-60.812a5.4 5.4 0 0 1 0-7.879l64.866-60.812a5.4 5.4 0 0 1 7.633.246l19.579 20.885a5.4 5.4 0 0 1-.372 7.747L101.65 336l40.763 35.874a5.4 5.4 0 0 1 .372 7.747l-19.579 20.884zm51.295 50.479l-27.453-7.97a5.402 5.402 0 0 1-3.681-6.692l61.44-211.626a5.402 5.402 0 0 1 6.692-3.681l27.452 7.97a5.4 5.4 0 0 1 3.68 6.692l-61.44 211.626a5.397 5.397 0 0 1-6.69 3.681zm160.792-111.045l-64.866 60.812a5.4 5.4 0 0 1-7.633-.246l-19.58-20.885a5.4 5.4 0 0 1 .372-7.747L284.35 336l-40.763-35.874a5.4 5.4 0 0 1-.372-7.747l19.58-20.885a5.4 5.4 0 0 1 7.633-.246l64.866 60.812a5.4 5.4 0 0 1-.001 7.879z" ></path> </svg> `; const FORMAT_HEADING = ` <!-- Icon from Font Awesome: https://fontawesome.com/icons/heading?style=solid; License: https://fontawesome.com/license --> <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="heading" class="svg-inline--fa fa-heading fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 512 512" licenseUrl="https://fontawesome.com/license" > <path fill="currentColor" d="M448 96v320h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H320a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V288H160v128h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H32a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V96H32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16h-32v128h192V96h-32a16 16 0 0 1-16-16V48a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16z" ></path> </svg> `; const FORMAT_HEADING_BIGGER = ` <!-- Icon from Font Awesome: https://fontawesome.com/icons/heading?style=solid; License: https://fontawesome.com/license --> <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="heading" class="svg-inline--fa fa-heading fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 720 720" licenseUrl="https://fontawesome.com/license" > <path fill="currentColor" d="M448 200v320h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H320a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V392H160v128h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H32a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V200H32a16 16 0 0 1-16-16V152a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16h-32v128h192V200h-32a16 16 0 0 1-16-16V152a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16z" ></path> <path fill="currentColor" d="M620 285 l87 150 h-174 z" ></path> </svg> `; const FORMAT_HEADING_SMALLER = ` <!-- Icon from Font Awesome: https://fontawesome.com/icons/heading?style=solid; License: https://fontawesome.com/license --> <svg aria-hidden="true" focusable="false" data-prefix="fas" data-icon="heading" class="svg-inline--fa fa-heading fa-w-16" role="img" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 720 720" licenseUrl="https://fontawesome.com/license" > <path fill="currentColor" d="M448 200v320h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H320a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V392H160v128h32a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16H32a16 16 0 0 1-16-16v-32a16 16 0 0 1 16-16h32V200H32a16 16 0 0 1-16-16V152a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16h-32v128h192V200h-32a16 16 0 0 1-16-16V152a16 16 0 0 1 16-16h160a16 16 0 0 1 16 16v32a16 16 0 0 1-16 16z" ></path> <path fill="currentColor" d="M620 435 l87 -150 h-174 z" ></path> </svg> `; const UPLOAD = ` <svg focusable="false" data-icon="upload" role="img" xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="2 2 20 20" > <path d="M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z" /> </svg> `; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGJhci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW1hcmtkb3duLWVkaXRvci9zcmMvbGliL3NlcnZpY2VzL3Rvb2xiYXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTNDLE1BQU0sT0FBTyxjQUFjO0lBRDNCO1FBV0U7O1dBRUc7UUFDYSxvQkFBZSxHQUFzQjtZQUNuRCxpQkFBaUI7WUFDakIsb0JBQW9CO1lBQ3BCLHNCQUFzQjtZQUN0QixzQkFBc0I7WUFDdEIsWUFBWTtZQUNaLGNBQWM7WUFDZCxxQkFBcUI7WUFDckIsR0FBRztZQUNILHFCQUFxQjtZQUNyQixtQkFBbUI7WUFDbkIsaUJBQWlCO1lBQ2pCLEdBQUc7WUFDSCxhQUFhO1lBQ2Isa0JBQWtCO1lBQ2xCLGlCQUFpQjtZQUNqQixHQUFHO1lBQ0gsWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2Isc0JBQXNCO1lBQ3RCLEdBQUc7WUFDSCxvQkFBb0I7WUFDcEIsZUFBZTtZQUNmLEdBQUc7WUFDSCxnQkFBZ0I7WUFDaEIsZ0JBQWdCO1lBQ2hCLEdBQUc7WUFDSCxlQUFlO1lBQ2YseUJBQXlCO1lBQ3pCLEdBQUc7WUFDSCxNQUFNO1lBQ04sTUFBTTtZQUNOLEdBQUc7WUFDSCxtQkFBbUI7U0FDcEIsQ0FBQztJQWtXSixDQUFDO0lBL1lDOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBMENEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxRQUFnQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFF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TUFBK0IsRUFBRSxRQUE0QjtRQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFMUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztRQUNsRSxJQUFJLFFBQVEsS0FBSyxPQUFPLEVBQUU7WUFDeEIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7U0FDdEM7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQzs7O1lBbFpGLFVBQVU7O0FBcVpYLDRCQUE0QjtBQUM1QixNQUFNLE1BQU0sR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JkLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JqQixDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBb0J0QixDQUFDO0FBRUYsTUFBTSxxQkFBcUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0I3QixDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBd0I5QixDQUFDO0FBRUYsTUFBTSxNQUFNLEdBQUc7Ozs7Ozs7Ozs7OztDQVlkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXJrZG93bkVkaXRvciB9IGZyb20gJ0BtZGVmeS9tYXJrZG93bi1lZGl0b3ItY29yZSc7XG5pbXBvcnQgeyBNYXJrZG93bkVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC9tYXJrZG93bi1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IFRvb2xiYXJJdGVtTmFtZSwgVG9vbGJhckl0ZW1Ob3JtYWxpemVkIH0gZnJvbSAnLi4vdHlwZXMvdG9vbGJhcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUb29sYmFyU2VydmljZSB7XG4gIHByaXZhdGUgX2RlZmF1bHRJdGVtczogVG9vbGJhckl0ZW1Ob3JtYWxpemVkW107XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIG9mIGFsbCBpdGVtc1xuICAgKi9cbiAgcHVibGljIGdldCBERUZBVUxUX0lURU1TKCk6IFRvb2xiYXJJdGVtTm9ybWFsaXplZFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHRvb2xiYXIgc2V0dXAuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9UT09MQkFSOiBUb29sYmFySXRlbU5hbWVbXSA9IFtcbiAgICAnc2V0SGVhZGluZ0xldmVsJyxcbiAgICAndG9nZ2xlSGVhZGluZ0xldmVsJyxcbiAgICAnaW5jcmVhc2VIZWFkaW5nTGV2ZWwnLFxuICAgICdkZWNyZWFzZUhlYWRpbmdMZXZlbCcsXG4gICAgJ3RvZ2dsZUJvbGQnLFxuICAgICd0b2dnbGVJdGFsaWMnLFxuICAgICd0b2dnbGVTdHJpa2V0aHJvdWdoJyxcbiAgICAnfCcsXG4gICAgJ3RvZ2dsZVVub3JkZXJlZExpc3QnLFxuICAgICd0b2dnbGVPcmRlcmVkTGlzdCcsXG4gICAgJ3RvZ2dsZUNoZWNrTGlzdCcsXG4gICAgJ3wnLFxuICAgICd0b2dnbGVRdW90ZScsXG4gICAgJ3RvZ2dsZUlubGluZUNvZGUnLFxuICAgICdpbnNlcnRDb2RlQmxvY2snLFxuICAgICd8JyxcbiAgICAnaW5zZXJ0TGluaycsXG4gICAgJ2luc2VydEltYWdlTGluaycsXG4gICAgJ2luc2VydFRhYmxlJyxcbiAgICAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLFxuICAgICd8JyxcbiAgICAndG9nZ2xlUmljaFRleHRNb2RlJyxcbiAgICAnZm9ybWF0Q29udGVudCcsXG4gICAgJ3wnLFxuICAgICdkb3dubG9hZEFzRmlsZScsXG4gICAgJ2ltcG9ydEZyb21GaWxlJyxcbiAgICAnfCcsXG4gICAgJ3RvZ2dsZVByZXZpZXcnLFxuICAgICd0b2dnbGVTaWRlQnlTaWRlUHJldmlldycsXG4gICAgJ3wnLFxuICAgICd1bmRvJyxcbiAgICAncmVkbycsXG4gICAgJ3wnLFxuICAgICdvcGVuTWFya2Rvd25HdWlkZScsXG4gIF07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvZiB0aGUgaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS5cbiAgICogUmV0dXJucyBgdW5kZWZpbmVkYCwgaWYgbm8gaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGVmYXVsdEl0ZW0oaXRlbU5hbWU6IHN0cmluZyk6IFRvb2xiYXJJdGVtTm9ybWFsaXplZCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuREVGQVVMVF9JVEVNUy5maW5kKChpKSA9PiBpLm5hbWUgPT09IGl0ZW1OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBkZWZhdWx0IHRvb2xiYXIgaXRlbXMuXG4gICAqIENhbm5vdCBiZSBkb25lIHN0YXRpY2FsbHkgYXMgdGhlIGFjdGlvbnMgZGVwZW5kIG9uIHRoZSBgTWFya2Rvd25FZGl0b3JDb21wb25lbnRgIGluc3RhbmNlLlxuICAgKi9cbiAgcHVibGljIGRlZmluZURlZmF1bHRJdGVtcyhuZ3hNZGU6IE1hcmtkb3duRWRpdG9yQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdEl0ZW1zOiBUb29sYmFySXRlbU5vcm1hbGl6ZWRbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3NldEhlYWRpbmdMZXZlbCcsXG4gICAgICAgIGFjdGlvbjogKGxldmVsOiAwIHwgMSB8IDIgfCAzIHwgNCB8IDUgfCA2KSA9PiBuZ3hNZGUubWRlLnNldEhlYWRpbmdMZXZlbChsZXZlbCksXG4gICAgICAgIHNob3J0Y3V0OiAnU2hpZnQtQ3RybC1BbHQtSCcsXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFuZ3hNZGUubWRlLmhhc1Rva2VuQXRDdXJzb3JQb3MoJ2hlYWRlcicpKSByZXR1cm4gMDtcbiAgICAgICAgICBjb25zdCB0b2tlbiA9IG5neE1kZS5tZGUuY20uZ2V0VG9rZW5BdChuZ3hNZGUubWRlLmdldEN1cnNvclBvcygpKTtcbiAgICAgICAgICByZXR1cm4gdG9rZW4uc3RhdGUuYmFzZS5oZWFkZXIgYXMgbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB0b29sdGlwOiAnU2V0IEhlYWRpbmcgTGV2ZWwnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnc3ZnU3RyaW5nJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2Zvcm1hdF9oZWFkaW5nJyxcbiAgICAgICAgICBzdmdIdG1sU3RyaW5nOiBGT1JNQVRfSEVBRElORyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b2dnbGVIZWFkaW5nTGV2ZWwnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5jcmVhc2VIZWFkaW5nTGV2ZWwoKSxcbiAgICAgICAgdG9vbHRpcDogJ0hlYWRpbmcnLFxuICAgICAgICBzaG9ydGN1dDogJ0FsdC1IJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ3N2Z1N0cmluZycsXG4gICAgICAgICAgaWNvbk5hbWU6ICdmb3JtYXRfaGVhZGluZycsXG4gICAgICAgICAgc3ZnSHRtbFN0cmluZzogRk9STUFUX0hFQURJTkcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW5jcmVhc2VIZWFkaW5nTGV2ZWwnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5jcmVhc2VIZWFkaW5nTGV2ZWwoKSxcbiAgICAgICAgdG9vbHRpcDogJ1NtYWxsZXIgSGVhZGluZycsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdzdmdTdHJpbmcnLFxuICAgICAgICAgIGljb25OYW1lOiAnZm9ybWF0X2hlYWRpbmdfZGVjcmVhc2UnLFxuICAgICAgICAgIHN2Z0h0bWxTdHJpbmc6IEZPUk1BVF9IRUFESU5HX1NNQUxMRVIsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZGVjcmVhc2VIZWFkaW5nTGV2ZWwnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuZGVjcmVhc2VIZWFkaW5nTGV2ZWwoKSxcbiAgICAgICAgdG9vbHRpcDogJ0JpZ2dlciBIZWFkaW5nJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ3N2Z1N0cmluZycsXG4gICAgICAgICAgaWNvbk5hbWU6ICdmb3JtYXRfaGVhZGluZ19pbmNyZWFzZScsXG4gICAgICAgICAgc3ZnSHRtbFN0cmluZzogRk9STUFUX0hFQURJTkdfQklHR0VSLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvZ2dsZUJvbGQnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUudG9nZ2xlQm9sZCgpLFxuICAgICAgICBpc0FjdGl2ZTogKCkgPT4gbmd4TWRlLm1kZS5oYXNUb2tlbkF0Q3Vyc29yUG9zKCdzdHJvbmcnKSxcbiAgICAgICAgdG9vbHRpcDogJ1RvZ2dsZSBCb2xkJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2Zvcm1hdF9ib2xkJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b2dnbGVJdGFsaWMnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUudG9nZ2xlSXRhbGljKCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiBuZ3hNZGUubWRlLmhhc1Rva2VuQXRDdXJzb3JQb3MoJ2VtJyksXG4gICAgICAgIHRvb2x0aXA6ICdUb2dnbGUgSXRhbGljJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2Zvcm1hdF9pdGFsaWMnLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvZ2dsZVN0cmlrZXRocm91Z2gnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUudG9nZ2xlU3RyaWtldGhyb3VnaCgpLFxuICAgICAgICBpc0FjdGl2ZTogKCkgPT4gbmd4TWRlLm1kZS5oYXNUb2tlbkF0Q3Vyc29yUG9zKCdzdHJpa2V0aHJvdWdoJyksXG4gICAgICAgIHRvb2x0aXA6ICdUb2dnbGUgU3RyaWtldGhyb3VnaCcsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdtYXRlcmlhbCcsXG4gICAgICAgICAgaWNvbk5hbWU6ICdmb3JtYXRfc3RyaWtldGhyb3VnaCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndG9nZ2xlVW5vcmRlcmVkTGlzdCcsXG4gICAgICAgIGFjdGlvbjogKCkgPT4gbmd4TWRlLm1kZS50b2dnbGVVbm9yZGVyZWRMaXN0KCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmlzTGlzdFR5cGVBY3RpdmUobmd4TWRlLCAndW5vcmRlcmVkJyksXG4gICAgICAgIHRvb2x0aXA6ICdUb2dnbGUgVW5vcmRlcmVkIExpc3QnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAnZm9ybWF0X2xpc3RfYnVsbGV0ZWQnLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvZ2dsZU9yZGVyZWRMaXN0JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLnRvZ2dsZU9yZGVyZWRMaXN0KCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmlzTGlzdFR5cGVBY3RpdmUobmd4TWRlLCAnb3JkZXJlZCcpLFxuICAgICAgICB0b29sdGlwOiAnVG9nZ2xlIE9yZGVyZWQgTGlzdCcsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdtYXRlcmlhbCcsXG4gICAgICAgICAgaWNvbk5hbWU6ICdmb3JtYXRfbGlzdF9udW1iZXJlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndG9nZ2xlQ2hlY2tMaXN0JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLnRvZ2dsZUNoZWNrTGlzdCgpLFxuICAgICAgICBpc0FjdGl2ZTogKCkgPT4gdGhpcy5pc0xpc3RUeXBlQWN0aXZlKG5neE1kZSwgJ2NoZWNrJyksXG4gICAgICAgIHRvb2x0aXA6ICdUb2dnbGUgQ2hlY2tsaXN0JyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2NoZWNrX2JveCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndG9nZ2xlUXVvdGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUudG9nZ2xlUXVvdGUoKSxcbiAgICAgICAgaXNBY3RpdmU6ICgpID0+IG5neE1kZS5tZGUuaGFzVG9rZW5BdEN1cnNvclBvcygncXVvdGUnKSxcbiAgICAgICAgdG9vbHRpcDogJ1RvZ2dsZSBRdW90YXRpb24nLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAnZm9ybWF0X3F1b3RlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b2dnbGVJbmxpbmVDb2RlJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLnRvZ2dsZUlubGluZUNvZGUoKSxcbiAgICAgICAgaXNBY3RpdmU6ICgpID0+IHRoaXMuaXNDb2RlVHlwZUFjdGl2ZShuZ3hNZGUsICdpbmxpbmUnKSxcbiAgICAgICAgdG9vbHRpcDogJ1RvZ2dsZSBJbmxpbmUgQ29kZScsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdtYXRlcmlhbCcsXG4gICAgICAgICAgaWNvbk5hbWU6ICdjb2RlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbnNlcnRDb2RlQmxvY2snLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5zZXJ0Q29kZUJsb2NrKCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiB0aGlzLmlzQ29kZVR5cGVBY3RpdmUobmd4TWRlLCAnYmxvY2snKSxcbiAgICAgICAgdG9vbHRpcDogJ0luc2VydCBDb2RlIEJsb2NrJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ3N2Z1N0cmluZycsXG4gICAgICAgICAgaWNvbk5hbWU6ICdmaWxlX2NvZGUnLFxuICAgICAgICAgIHN2Z0h0bWxTdHJpbmc6IEZJTEVfQ09ERSxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbnNlcnRMaW5rJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLmluc2VydExpbmsoKSxcbiAgICAgICAgaXNBY3RpdmU6ICgpID0+XG4gICAgICAgICAgKG5neE1kZS5tZGUuaGFzVG9rZW5BdEN1cnNvclBvcygnbGluay10ZXh0JykgfHwgbmd4TWRlLm1kZS5oYXNUb2tlbkF0Q3Vyc29yUG9zKCdsaW5rJykpICYmXG4gICAgICAgICAgIW5neE1kZS5tZGUuaGFzVG9rZW5BdEN1cnNvclBvcygnaW1hZ2UnKSxcbiAgICAgICAgdG9vbHRpcDogJ0luc2VydCBMaW5rJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2luc2VydF9saW5rJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdpbnNlcnRJbWFnZUxpbmsnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5zZXJ0SW1hZ2VMaW5rKCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiBuZ3hNZGUubWRlLmhhc1Rva2VuQXRDdXJzb3JQb3MoJ2ltYWdlJyksXG4gICAgICAgIHRvb2x0aXA6ICdJbnNlcnQgSW1hZ2UgTGluaycsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdtYXRlcmlhbCcsXG4gICAgICAgICAgaWNvbk5hbWU6ICdpbWFnZScsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW5zZXJ0VGFibGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5zZXJ0VGFibGUoKSxcbiAgICAgICAgdG9vbHRpcDogJ0luc2VydCBUYWJsZScsXG4gICAgICAgIGljb246IHtcbiAgICAgICAgICBmb3JtYXQ6ICdtYXRlcmlhbCcsXG4gICAgICAgICAgaWNvbk5hbWU6ICd0YWJsZV9jaGFydCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW5zZXJ0SG9yaXpvbnRhbFJ1bGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW5zZXJ0SG9yaXpvbnRhbFJ1bGUoKSxcbiAgICAgICAgaXNBY3RpdmU6ICgpID0+IG5neE1kZS5tZGUuaGFzVG9rZW5BdEN1cnNvclBvcygnaHInKSxcbiAgICAgICAgdG9vbHRpcDogJ0luc2VydCBIb3Jpem9udGFsIFJ1bGUnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAnaG9yaXpvbnRhbF9ydWxlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd0b2dnbGVSaWNoVGV4dE1vZGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUudG9nZ2xlUmljaFRleHRNb2RlKCksXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9kZSA9IG5neE1kZS5tZGUuY20uZ2V0T3B0aW9uKCdtb2RlJyk7XG4gICAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdnZm0nIHx8IG1vZGUubmFtZSA9PT0gJ2dmbSc7XG4gICAgICAgIH0sXG4gICAgICAgIHRvb2x0aXA6ICdUb2dnbGUgUmljaC1UZXh0IE1vZGUnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAnaGlnaGxpZ2h0JyxcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdmb3JtYXRDb250ZW50JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLmZvcm1hdENvbnRlbnQoKSxcbiAgICAgICAgdG9vbHRpcDogJ0Zvcm1hdCBDb250ZW50JyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2Zvcm1hdF9wYWludCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnZG93bmxvYWRBc0ZpbGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuZG93bmxvYWRBc0ZpbGUoKSxcbiAgICAgICAgdG9vbHRpcDogJ0Rvd25sb2FkIEFzIEZpbGUnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAnZ2V0X2FwcCcsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IHRydWUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnaW1wb3J0RnJvbUZpbGUnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUuaW1wb3J0RnJvbUZpbGUoKSxcbiAgICAgICAgdG9vbHRpcDogJ0ltcG9ydCBGcm9tIEZpbGUnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnc3ZnU3RyaW5nJyxcbiAgICAgICAgICBpY29uTmFtZTogJ3VwbG9hZCcsXG4gICAgICAgICAgc3ZnSHRtbFN0cmluZzogVVBMT0FELFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvZ2dsZVByZXZpZXcnLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS50b2dnbGVQcmV2aWV3KCksXG4gICAgICAgIHNob3J0Y3V0OiAnQWx0LVAnLFxuICAgICAgICBpc0FjdGl2ZTogKCkgPT4gbmd4TWRlLnNob3dQcmV2aWV3LFxuICAgICAgICB0b29sdGlwOiAnVG9nZ2xlIFByZXZpZXcnLFxuICAgICAgICBpY29uOiB7XG4gICAgICAgICAgZm9ybWF0OiAnbWF0ZXJpYWwnLFxuICAgICAgICAgIGljb25OYW1lOiAncHJldmlldycsXG4gICAgICAgIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3RvZ2dsZVNpZGVCeVNpZGVQcmV2aWV3JyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUudG9nZ2xlU2lkZUJ5U2lkZVByZXZpZXcoKSxcbiAgICAgICAgc2hvcnRjdXQ6ICdTaGlmdC1BbHQtUCcsXG4gICAgICAgIGlzQWN0aXZlOiAoKSA9PiBuZ3hNZGUuc2hvd1NpZGVCeVNpZGVQcmV2aWV3LFxuICAgICAgICB0b29sdGlwOiAnVG9nZ2xlIFNpZGUtYnktU2lkZSBQcmV2aWV3JyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ3N2Z1N0cmluZycsXG4gICAgICAgICAgaWNvbk5hbWU6ICdjb2x1bW4nLFxuICAgICAgICAgIHN2Z0h0bWxTdHJpbmc6IENPTFVNTixcbiAgICAgICAgfSxcbiAgICAgICAgZGlzYWJsZU9uUHJldmlldzogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAndW5kbycsXG4gICAgICAgIGFjdGlvbjogKCkgPT4gbmd4TWRlLm1kZS51bmRvKCksXG4gICAgICAgIHRvb2x0aXA6ICdVbmRvJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ3VuZG8nLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3JlZG8nLFxuICAgICAgICBhY3Rpb246ICgpID0+IG5neE1kZS5tZGUucmVkbygpLFxuICAgICAgICBzaG9ydGN1dDogJ0N0cmwtUycsXG4gICAgICAgIHRvb2x0aXA6ICdSZWRvJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ3JlZG8nLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29wZW5NYXJrZG93bkd1aWRlJyxcbiAgICAgICAgYWN0aW9uOiAoKSA9PiBuZ3hNZGUubWRlLm9wZW5NYXJrZG93bkd1aWRlKCksXG4gICAgICAgIHRvb2x0aXA6ICdPcGVuIE1hcmtkb3duIEd1aWRlJyxcbiAgICAgICAgaWNvbjoge1xuICAgICAgICAgIGZvcm1hdDogJ21hdGVyaWFsJyxcbiAgICAgICAgICBpY29uTmFtZTogJ2hlbHAnLFxuICAgICAgICB9LFxuICAgICAgICBkaXNhYmxlT25QcmV2aWV3OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICAvLyBOb3JtYWxpemUgc2VwYXJhdG9yIGl0ZW0gdG8gcmVkdWNlIHR5cGUgY29tcGxleGl0eSBpbiB0ZW1wbGF0ZS5cbiAgICAgIC8vIEVmZmVjdGl2ZWx5LCBvbmx5IHRoZSBgbmFtZWAgcHJvcGVydHkgaXMgbmVlZGVkLlxuICAgICAge1xuICAgICAgICBuYW1lOiAnfCcsXG4gICAgICAgIGFjdGlvbjogKCkgPT4ge30sXG4gICAgICAgIHRvb2x0aXA6ICcnLFxuICAgICAgICBpY29uOiB7IGZvcm1hdDogJ21hdGVyaWFsJywgaWNvbk5hbWU6ICcnIH0sXG4gICAgICAgIGRpc2FibGVPblByZXZpZXc6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgdGhpcy5fZGVmYXVsdEl0ZW1zID0gZGVmYXVsdEl0ZW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xpc3RUeXBlQWN0aXZlKFxuICAgIG5neE1kZTogTWFya2Rvd25FZGl0b3JDb21wb25lbnQsXG4gICAgbGlzdFR5cGU6IE5vbk51bGxhYmxlPFJldHVyblR5cGU8TWFya2Rvd25FZGl0b3JbJ2dldExpc3RUeXBlT2ZMaW5lJ10+PlxuICApIHtcbiAgICBjb25zdCBpc0xpc3QgPSBuZ3hNZGUubWRlLmhhc1Rva2VuQXRDdXJzb3JQb3MoJ2xpc3QnKTtcbiAgICBpZiAoIWlzTGlzdCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IG5neE1kZS5tZGUuY20ubGlzdFNlbGVjdGlvbnMoKTtcbiAgICBsZXQgaXNMaXN0VHlwZSA9IGZhbHNlO1xuICAgIGlmIChzZWxlY3Rpb25zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoIC0gMV0uZnJvbSgpLmxpbmU7XG4gICAgICBpc0xpc3RUeXBlID0gbmd4TWRlLm1kZS5nZXRMaXN0VHlwZU9mTGluZShsaW5lTnVtYmVyKSA9PT0gbGlzdFR5cGU7XG4gICAgfVxuICAgIHJldHVybiBpc0xpc3RUeXBlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NvZGVUeXBlQWN0aXZlKG5neE1kZTogTWFya2Rvd25FZGl0b3JDb21wb25lbnQsIGNvZGVUeXBlOiAnaW5saW5lJyB8ICdibG9jaycpIHtcbiAgICBjb25zdCBpc0NvZGUgPSBuZ3hNZGUubWRlLmhhc1Rva2VuQXRDdXJzb3JQb3MoJ2NvZGUnKTtcbiAgICBpZiAoIWlzQ29kZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgdG9rZW4gPSBuZ3hNZGUubWRlLmNtLmdldFRva2VuQXQobmd4TWRlLm1kZS5nZXRDdXJzb3JQb3MoKSk7XG4gICAgaWYgKGNvZGVUeXBlID09PSAnYmxvY2snKSB7XG4gICAgICByZXR1cm4gdG9rZW4uc3RhdGUub3ZlcmxheS5jb2RlQmxvY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b2tlbi5zdGF0ZS5vdmVybGF5LmNvZGU7XG4gICAgfVxuICB9XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbmNvbnN0IENPTFVNTiA9IGBcbiAgPCEtLSBJY29uIGZyb20gRm9udCBBd2Vzb21lOiBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9pY29ucy9jb2x1bW5zP3N0eWxlPXNvbGlkOyBMaWNlbnNlOiBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlIC0tPlxuICA8c3ZnXG4gICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICBmb2N1c2FibGU9XCJmYWxzZVwiXG4gICAgZGF0YS1wcmVmaXg9XCJmYXNcIlxuICAgIGRhdGEtaWNvbj1cImNvbHVtbnNcIlxuICAgIGNsYXNzPVwic3ZnLWlubGluZS0tZmEgZmEtY29sdW1ucyBmYS13LTE2XCJcbiAgICByb2xlPVwiaW1nXCJcbiAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICB2aWV3Qm94PVwiMCAwIDUxMiA1MTJcIlxuICAgIGxpY2Vuc2VVcmw9XCJodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlXCJcbiAgPlxuICAgIDxwYXRoXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAgIGQ9XCJNNDY0IDMySDQ4QzIxLjQ5IDMyIDAgNTMuNDkgMCA4MHYzNTJjMCAyNi41MSAyMS40OSA0OCA0OCA0OGg0MTZjMjY