UNPKG

@cisstech/nge

Version:

NG Essentials is a collection of libraries for Angular developers.

268 lines (262 loc) 39 kB
import { Injectable } from '@angular/core'; import { NGE_MARKDOWN_CONTRIBUTION } from '../nge-markdown-contribution'; import * as i0 from "@angular/core"; const OPEN = /^:::(\+?)\s+(\w+)(\s+.+)?/; const CLOSE = /^:::\s*$/; /** * Contribution to add collapsible styled block to markdown syntax. */ export class NgeMarkdownAdmonitions { contribute(transformer) { this.addStyles(); this.autoFixAdmonitionsSyntax(transformer); this.createAdmonitions(transformer); } addStyles() { const head = document.head; if (head.querySelector('[nge-markdown-admonitions]')) { return; } const admonitions = { note: { bg: 'rgba(68, 138, 255, 0.1)', border: '#448aff', }, abstract: { bg: 'rgba(0, 176, 255, 0.1)', border: '#00b0ff', }, info: { bg: 'rgba(0, 184, 212, 0.1)', border: '#00b8d4', }, tip: { bg: 'rgba(0, 191, 165, 0.1)', border: '#00bfa5', }, success: { bg: 'rgba(0, 200, 83, 0.1)', border: '#00c853', }, question: { bg: 'rgba(100, 221, 23, 0.1)', border: '#64dd17', }, warning: { bg: 'rgba(255, 145, 0, 0.1)', border: '#ff9100', }, failure: { bg: 'rgba(255, 82, 82, 0.1)', border: '#ff5252', }, danger: { bg: 'rgba(255, 23, 68, 0.1)', border: '#ff1744', }, bug: { bg: 'rgba(245, 0, 87, 0.1)', border: '#f50057', }, example: { bg: 'rgba(101, 31, 255, 0.1)', border: '#651fff', }, quote: { bg: 'rgba(158, 158, 158, 0.1)', border: '#9e9e9e', }, }; const stylesheet = [ ` /* CONTAINER */ .nge-md-admonition { margin: 1.5625em 0; overflow: hidden; font-size: 0.84rem; page-break-inside: avoid; border-radius: 0.1rem; box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.05rem rgba(0, 0, 0, 0.1); --admonition--note: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z"/></svg>'); --admonition--abstract: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4 5h16v2H4V5m0 4h16v2H4V9m0 4h16v2H4v-2m0 4h10v2H4v-2z"/></svg>'); --admonition--info: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 9h-2V7h2m0 10h-2v-6h2m-1-9A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10A10 10 0 0012 2z"/></svg>'); --admonition--tip: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17.55 11.2c-.23-.3-.5-.56-.76-.82-.65-.6-1.4-1.03-2.03-1.66C13.3 7.26 13 4.85 13.91 3c-.91.23-1.75.75-2.45 1.32-2.54 2.08-3.54 5.75-2.34 8.9.04.1.08.2.08.33 0 .22-.15.42-.35.5-.22.1-.46.04-.64-.12a.83.83 0 01-.15-.17c-1.1-1.43-1.28-3.48-.53-5.12C5.89 10 5 12.3 5.14 14.47c.04.5.1 1 .27 1.5.14.6.4 1.2.72 1.73 1.04 1.73 2.87 2.97 4.84 3.22 2.1.27 4.35-.12 5.96-1.6 1.8-1.66 2.45-4.32 1.5-6.6l-.13-.26c-.2-.46-.47-.87-.8-1.25l.05-.01m-3.1 6.3c-.28.24-.73.5-1.08.6-1.1.4-2.2-.16-2.87-.82 1.19-.28 1.89-1.16 2.09-2.05.17-.8-.14-1.46-.27-2.23-.12-.74-.1-1.37.18-2.06.17.38.37.76.6 1.06.76 1 1.95 1.44 2.2 2.8.04.14.06.28.06.43.03.82-.32 1.72-.92 2.27h.01z"/></svg>'); --admonition--success: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2m-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>'); --admonition--question: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.07 11.25l-.9.92C13.45 12.89 13 13.5 13 15h-2v-.5c0-1.11.45-2.11 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41a2 2 0 00-2-2 2 2 0 00-2 2H8a4 4 0 014-4 4 4 0 014 4 3.2 3.2 0 01-.93 2.25M13 19h-2v-2h2M12 2A10 10 0 002 12a10 10 0 0010 10 10 10 0 0010-10c0-5.53-4.5-10-10-10z"/></svg>'); --admonition--warning: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 14h-2v-4h2m0 8h-2v-2h2M1 21h22L12 2 1 21z"/></svg>'); --admonition--failure: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2c5.53 0 10 4.47 10 10s-4.47 10-10 10S2 17.53 2 12 6.47 2 12 2m3.59 5L12 10.59 8.41 7 7 8.41 10.59 12 7 15.59 8.41 17 12 13.41 15.59 17 17 15.59 13.41 12 17 8.41 15.59 7z"/></svg>'); --admonition--danger: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.5 20l4.86-9.73H13V4l-5 9.73h3.5V20M12 2c2.75 0 5.1 1 7.05 2.95C21 6.9 22 9.25 22 12s-1 5.1-2.95 7.05C17.1 21 14.75 22 12 22s-5.1-1-7.05-2.95C3 17.1 2 14.75 2 12s1-5.1 2.95-7.05C6.9 3 9.25 2 12 2z"/></svg>'); --admonition--bug: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 12h-4v-2h4m0 6h-4v-2h4m6-6h-2.81a5.985 5.985 0 00-1.82-1.96L17 4.41 15.59 3l-2.17 2.17a6.002 6.002 0 00-2.83 0L8.41 3 7 4.41l1.62 1.63C7.88 6.55 7.26 7.22 6.81 8H4v2h2.09c-.05.33-.09.66-.09 1v1H4v2h2v1c0 .34.04.67.09 1H4v2h2.81c1.04 1.79 2.97 3 5.19 3s4.15-1.21 5.19-3H20v-2h-2.09c.05-.33.09-.66.09-1v-1h2v-2h-2v-1c0-.34-.04-.67-.09-1H20V8z"/></svg>'); --admonition--example: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 13v-2h14v2H7m0 6v-2h14v2H7M7 7V5h14v2H7M3 8V5H2V4h2v4H3m-1 9v-1h3v4H2v-1h2v-.5H3v-1h1V17H2m2.25-7a.75.75 0 01.75.75c0 .2-.08.39-.21.52L3.12 13H5v1H2v-.92L4 11H2v-1h2.25z"/></svg>'); --admonition--quote: url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14 17h3l2-4V7h-6v6h3M6 17h3l2-4V7H5v6h3l-2 4z"/></svg>'); --admonition--chevron-right: url('data:image/svg+xml;:charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z"/></svg>'); --admonition--chevron-down: url('data:image/svg+xml;:charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"/></svg>'); } /* TITLE */ .nge-md-admonition-title { min-height: 24px; box-sizing: border-box; position: relative; display: flex; align-items: center; margin-top: 0 !important; margin-bottom: 0 !important; padding: 0.4rem 0.6rem 0.4rem 2rem; font-weight: 700; /*REMOVE DETAILS MARKER IN FIREFOX*/ list-style-type: none; } .nge-md-admonition-title:focus { outline: none; } /* DETAILS MARKER */ .nge-md-admonition-title::marker, .nge-md-admonition-title::-webkit-details-marker { display: none; } /* TITLE COLLAPSIBLE */ details .nge-md-admonition-title { cursor: pointer; } details .nge-md-admonition-title:after { position: absolute; right: 0.6rem; width: 1rem; height: 1rem; -o-mask-image: var(--admonition--chevron-right); -webkit-mask-image: var(--admonition--chevron-right); mask-image: var(--admonition--chevron-right); content: ""; } details[open] .nge-md-admonition-title:after { -o-mask-image: var(--admonition--chevron-down); -webkit-mask-image: var(--admonition--chevron-down); mask-image: var(--admonition--chevron-down); } /* CONTENT */ .nge-md-admonition-content { padding: 0 0.6rem; } `, ]; Object.keys(admonitions).forEach((type) => { const map = admonitions[type]; stylesheet.push(` .nge-md-admonition--${type} { border-left: 0.2rem solid ${map.border}; } .nge-md-admonition-title--${type} { background-color: ${map.bg}; } .nge-md-admonition-title--${type}:before, .nge-md-admonition-title--${type}:after { background-color: ${map.border}; } .nge-md-admonition-title--${type}:before { position: absolute; left: 0.6rem; width: 1rem; height: 1rem; -o-mask-image: var(--admonition--${type}); -webkit-mask-image: var(--admonition--${type}); mask-image: var(--admonition--${type}); content: ""; } `); }); const style = document.createElement('style'); style.setAttribute('nge-markdown-admonitions', ''); style.innerHTML = stylesheet.join('\n'); head.appendChild(style); } createAdmonitions(transformer) { transformer.addHtmlTransformer((element) => { const paragraphs = element.querySelectorAll('p'); paragraphs.forEach((p) => { const text = p.innerHTML; const match = text.match(OPEN); if (match) { const opener = match[1]; const type = match[2]; const title = (match[3] || '').trim(); const admonition = document.createElement('details'); if (opener.endsWith('+')) { admonition.open = true; } admonition.className = 'nge-md-admonition nge-md-admonition--' + type; const summary = document.createElement('summary'); summary.className = 'nge-md-admonition-title nge-md-admonition-title--' + type; summary.innerHTML = title; const content = []; admonition.appendChild(summary); let node = p.nextElementSibling; let opened = 1; while (node) { const innerHTML = node.innerHTML.trim(); if (innerHTML.match(OPEN)) { opened++; } else if (innerHTML.match(CLOSE)) { opened--; if (opened === 0) { node.remove(); break; } } content.push(node); node = node.nextElementSibling; } const div = document.createElement('div'); div.className = 'nge-md-admonition-content'; content.forEach((e) => div.appendChild(e)); admonition.appendChild(div); p.parentElement?.insertBefore(admonition, p); p.remove(); } }); }); } autoFixAdmonitionsSyntax(transformer) { transformer.addMarkdownTransformer((markdown) => { const lines = markdown.split('\n'); const length = lines.length; let insideCodeBlock = false; for (let i = 0; i < length; i++) { const curr = lines[i]; if (curr.startsWith('```')) { insideCodeBlock = !insideCodeBlock; } if (insideCodeBlock) { continue; } const prev = i > 0 ? lines[i - 1] : undefined; const next = i < length - 1 ? lines[i + 1] : undefined; if (curr.match(OPEN)) { if (next?.trim()) { lines[i] = curr + '\n'; } } else if (curr.match(CLOSE)) { if (prev?.trim()) { lines[i] = '\n' + curr; } } } return lines.join('\n'); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.1", ngImport: i0, type: NgeMarkdownAdmonitions, decorators: [{ type: Injectable }] }); /** * Injection token to register `NgeMarkdownAdmonitions` contribution. */ export const NgeMarkdownAdmonitionsProvider = { provide: NGE_MARKDOWN_CONTRIBUTION, multi: true, useClass: NgeMarkdownAdmonitions, }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdlLW1hcmtkb3duLWFkbW9uaXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmdlL21hcmtkb3duL3NyYy9jb250cmlidXRpb25zL25nZS1tYXJrZG93bi1hZG1vbml0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFBO0FBRXBELE9BQU8sRUFBMkIseUJBQXlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQTs7QUFFakcsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUE7QUFDeEMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFBO0FBRXhCOztHQUVHO0FBRUgsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxVQUFVLENBQUMsV0FBbUM7UUFDNUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ2hCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUMxQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUVPLFNBQVM7UUFDZixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFBO1FBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUM7WUFDckQsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBbUQ7WUFDbEUsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSx5QkFBeUI7Z0JBQzdCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLEVBQUUsRUFBRSx3QkFBd0I7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLEVBQUUsRUFBRSx3QkFBd0I7Z0JBQzVCLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILEVBQUUsRUFBRSx3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Q0FBQyxTQUFTLENBQUE7Z0JBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7Z0JBQ3RELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNyQixJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNqQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtvQkFDeEIsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM3QixJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO3dCQUNqQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQTtvQkFDeEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN6QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7OEdBL1BVLHNCQUFzQjtrSEFBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQURsQyxVQUFVOztBQW1RWDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFhO0lBQ3RELE9BQU8sRUFBRSx5QkFBeUI7SUFDbEMsS0FBSyxFQUFFLElBQUk7SUFDWCxRQUFRLEVBQUUsc0JBQXNCO0NBQ2pDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBOZ2VNYXJrZG93blRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vbmdlLW1hcmtkb3duLXRyYW5zZm9ybWVyJ1xuaW1wb3J0IHsgTmdlTWFya2Rvd25Db250cmlidXRpb24sIE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04gfSBmcm9tICcuLi9uZ2UtbWFya2Rvd24tY29udHJpYnV0aW9uJ1xuXG5jb25zdCBPUEVOID0gL146OjooXFwrPylcXHMrKFxcdyspKFxccysuKyk/L1xuY29uc3QgQ0xPU0UgPSAvXjo6OlxccyokL1xuXG4vKipcbiAqIENvbnRyaWJ1dGlvbiB0byBhZGQgY29sbGFwc2libGUgc3R5bGVkIGJsb2NrIHRvIG1hcmtkb3duIHN5bnRheC5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE5nZU1hcmtkb3duQWRtb25pdGlvbnMgaW1wbGVtZW50cyBOZ2VNYXJrZG93bkNvbnRyaWJ1dGlvbiB7XG4gIGNvbnRyaWJ1dGUodHJhbnNmb3JtZXI6IE5nZU1hcmtkb3duVHJhbnNmb3JtZXIpIHtcbiAgICB0aGlzLmFkZFN0eWxlcygpXG4gICAgdGhpcy5hdXRvRml4QWRtb25pdGlvbnNTeW50YXgodHJhbnNmb3JtZXIpXG4gICAgdGhpcy5jcmVhdGVBZG1vbml0aW9ucyh0cmFuc2Zvcm1lcilcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3R5bGVzKCkge1xuICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5oZWFkXG4gICAgaWYgKGhlYWQucXVlcnlTZWxlY3RvcignW25nZS1tYXJrZG93bi1hZG1vbml0aW9uc10nKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgYWRtb25pdGlvbnM6IFJlY29yZDxzdHJpbmcsIHsgYm9yZGVyOiBzdHJpbmc7IGJnOiBzdHJpbmcgfT4gPSB7XG4gICAgICBub3RlOiB7XG4gICAgICAgIGJnOiAncmdiYSg2OCwgMTM4LCAyNTUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjNDQ4YWZmJyxcbiAgICAgIH0sXG4gICAgICBhYnN0cmFjdDoge1xuICAgICAgICBiZzogJ3JnYmEoMCwgMTc2LCAyNTUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjMDBiMGZmJyxcbiAgICAgIH0sXG4gICAgICBpbmZvOiB7XG4gICAgICAgIGJnOiAncmdiYSgwLCAxODQsIDIxMiwgMC4xKScsXG4gICAgICAgIGJvcmRlcjogJyMwMGI4ZDQnLFxuICAgICAgfSxcbiAgICAgIHRpcDoge1xuICAgICAgICBiZzogJ3JnYmEoMCwgMTkxLCAxNjUsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjMDBiZmE1JyxcbiAgICAgIH0sXG4gICAgICBzdWNjZXNzOiB7XG4gICAgICAgIGJnOiAncmdiYSgwLCAyMDAsIDgzLCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnIzAwYzg1MycsXG4gICAgICB9LFxuICAgICAgcXVlc3Rpb246IHtcbiAgICAgICAgYmc6ICdyZ2JhKDEwMCwgMjIxLCAyMywgMC4xKScsXG4gICAgICAgIGJvcmRlcjogJyM2NGRkMTcnLFxuICAgICAgfSxcbiAgICAgIHdhcm5pbmc6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDI1NSwgMTQ1LCAwLCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2ZmOTEwMCcsXG4gICAgICB9LFxuICAgICAgZmFpbHVyZToge1xuICAgICAgICBiZzogJ3JnYmEoMjU1LCA4MiwgODIsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjZmY1MjUyJyxcbiAgICAgIH0sXG4gICAgICBkYW5nZXI6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDI1NSwgMjMsIDY4LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2ZmMTc0NCcsXG4gICAgICB9LFxuICAgICAgYnVnOiB7XG4gICAgICAgIGJnOiAncmdiYSgyNDUsIDAsIDg3LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnI2Y1MDA1NycsXG4gICAgICB9LFxuICAgICAgZXhhbXBsZToge1xuICAgICAgICBiZzogJ3JnYmEoMTAxLCAzMSwgMjU1LCAwLjEpJyxcbiAgICAgICAgYm9yZGVyOiAnIzY1MWZmZicsXG4gICAgICB9LFxuICAgICAgcXVvdGU6IHtcbiAgICAgICAgYmc6ICdyZ2JhKDE1OCwgMTU4LCAxNTgsIDAuMSknLFxuICAgICAgICBib3JkZXI6ICcjOWU5ZTllJyxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldCA9IFtcbiAgICAgIGBcbiAgICAgICAgICAgIC8qIENPTlRBSU5FUiAqL1xuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDEuNTYyNWVtIDA7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICBmb250LXNpemU6IDAuODRyZW07XG4gICAgICAgICAgICAgICAgcGFnZS1icmVhay1pbnNpZGU6IGF2b2lkO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuMXJlbTtcbiAgICAgICAgICAgICAgICBib3gtc2hhZG93OiAwIDAuMnJlbSAwLjVyZW0gcmdiYSgwLCAwLCAwLCAwLjA1KSwgMCAwIDAuMDVyZW0gcmdiYSgwLCAwLCAwLCAwLjEpO1xuXG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1ub3RlOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjA0IDAtMS40MWwtMi4zNC0yLjM0Yy0uMzctLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44NCAxLjgzIDMuNzUgMy43NU0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45M2wtMy43NS0zLjc1TDMgMTcuMjV6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tYWJzdHJhY3Q6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNCA1aDE2djJINFY1bTAgNGgxNnYySDRWOW0wIDRoMTZ2Mkg0di0ybTAgNGgxMHYySDR2LTJ6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0taW5mbzogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMyA5aC0yVjdoMm0wIDEwaC0ydi02aDJtLTEtOUExMCAxMCAwIDAwMiAxMmExMCAxMCAwIDAwMTAgMTAgMTAgMTAgMCAwMDEwLTEwQTEwIDEwIDAgMDAxMiAyelwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLXRpcDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNy41NSAxMS4yYy0uMjMtLjMtLjUtLjU2LS43Ni0uODItLjY1LS42LTEuNC0xLjAzLTIuMDMtMS42NkMxMy4zIDcuMjYgMTMgNC44NSAxMy45MSAzYy0uOTEuMjMtMS43NS43NS0yLjQ1IDEuMzItMi41NCAyLjA4LTMuNTQgNS43NS0yLjM0IDguOS4wNC4xLjA4LjIuMDguMzMgMCAuMjItLjE1LjQyLS4zNS41LS4yMi4xLS40Ni4wNC0uNjQtLjEyYS44My44MyAwIDAxLS4xNS0uMTdjLTEuMS0xLjQzLTEuMjgtMy40OC0uNTMtNS4xMkM1Ljg5IDEwIDUgMTIuMyA1LjE0IDE0LjQ3Yy4wNC41LjEgMSAuMjcgMS41LjE0LjYuNCAxLjIuNzIgMS43MyAxLjA0IDEuNzMgMi44NyAyLjk3IDQuODQgMy4yMiAyLjEuMjcgNC4zNS0uMTIgNS45Ni0xLjYgMS44LTEuNjYgMi40NS00LjMyIDEuNS02LjZsLS4xMy0uMjZjLS4yLS40Ni0uNDctLjg3LS44LTEuMjVsLjA1LS4wMW0tMy4xIDYuM2MtLjI4LjI0LS43My41LTEuMDguNi0xLjEuNC0yLjItLjE2LTIuODctLjgyIDEuMTktLjI4IDEuODktMS4xNiAyLjA5LTIuMDUuMTctLjgtLjE0LTEuNDYtLjI3LTIuMjMtLjEyLS43NC0uMS0xLjM3LjE4LTIuMDYuMTcuMzguMzcuNzYuNiAxLjA2Ljc2IDEgMS45NSAxLjQ0IDIuMiAyLjguMDQuMTQuMDYuMjguMDYuNDMuMDMuODItLjMyIDEuNzItLjkyIDIuMjdoLjAxelwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLXN1Y2Nlc3M6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJtLTIgMTVsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1xdWVzdGlvbjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xNS4wNyAxMS4yNWwtLjkuOTJDMTMuNDUgMTIuODkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjExLjQ1LTIuMTEgMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2LjU5LS44Ni41OS0xLjQxYTIgMiAwIDAwLTItMiAyIDIgMCAwMC0yIDJIOGE0IDQgMCAwMTQtNCA0IDQgMCAwMTQgNCAzLjIgMy4yIDAgMDEtLjkzIDIuMjVNMTMgMTloLTJ2LTJoMk0xMiAyQTEwIDEwIDAgMDAyIDEyYTEwIDEwIDAgMDAxMCAxMCAxMCAxMCAwIDAwMTAtMTBjMC01LjUzLTQuNS0xMC0xMC0xMHpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS13YXJuaW5nOiB1cmwoJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEzIDE0aC0ydi00aDJtMCA4aC0ydi0yaDJNMSAyMWgyMkwxMiAyIDEgMjF6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tZmFpbHVyZTogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMiAyYzUuNTMgMCAxMCA0LjQ3IDEwIDEwcy00LjQ3IDEwLTEwIDEwUzIgMTcuNTMgMiAxMiA2LjQ3IDIgMTIgMm0zLjU5IDVMMTIgMTAuNTkgOC40MSA3IDcgOC40MSAxMC41OSAxMiA3IDE1LjU5IDguNDEgMTcgMTIgMTMuNDEgMTUuNTkgMTcgMTcgMTUuNTkgMTMuNDEgMTIgMTcgOC40MSAxNS41OSA3elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWRhbmdlcjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCw8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xMS41IDIwbDQuODYtOS43M0gxM1Y0bC01IDkuNzNoMy41VjIwTTEyIDJjMi43NSAwIDUuMSAxIDcuMDUgMi45NUMyMSA2LjkgMjIgOS4yNSAyMiAxMnMtMSA1LjEtMi45NSA3LjA1QzE3LjEgMjEgMTQuNzUgMjIgMTIgMjJzLTUuMS0xLTcuMDUtMi45NUMzIDE3LjEgMiAxNC43NSAyIDEyczEtNS4xIDIuOTUtNy4wNUM2LjkgMyA5LjI1IDIgMTIgMnpcIi8+PC9zdmc+Jyk7XG4gICAgICAgICAgICAgICAgLS1hZG1vbml0aW9uLS1idWc6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTQgMTJoLTR2LTJoNG0wIDZoLTR2LTJoNG02LTZoLTIuODFhNS45ODUgNS45ODUgMCAwMC0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdhNi4wMDIgNi4wMDIgMCAwMC0yLjgzIDBMOC40MSAzIDcgNC40MWwxLjYyIDEuNjNDNy44OCA2LjU1IDcuMjYgNy4yMiA2LjgxIDhINHYyaDIuMDljLS4wNS4zMy0uMDkuNjYtLjA5IDF2MUg0djJoMnYxYzAgLjM0LjA0LjY3LjA5IDFINHYyaDIuODFjMS4wNCAxLjc5IDIuOTcgMyA1LjE5IDNzNC4xNS0xLjIxIDUuMTktM0gyMHYtMmgtMi4wOWMuMDUtLjMzLjA5LS42Ni4wOS0xdi0xaDJ2LTJoLTJ2LTFjMC0uMzQtLjA0LS42Ny0uMDktMUgyMFY4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWV4YW1wbGU6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNNyAxM3YtMmgxNHYySDdtMCA2di0yaDE0djJIN003IDdWNWgxNHYySDdNMyA4VjVIMlY0aDJ2NEgzbS0xIDl2LTFoM3Y0SDJ2LTFoMnYtLjVIM3YtMWgxVjE3SDJtMi4yNS03YS43NS43NSAwIDAxLjc1Ljc1YzAgLjItLjA4LjM5LS4yMS41MkwzLjEyIDEzSDV2MUgydi0uOTJMNCAxMUgydi0xaDIuMjV6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tcXVvdGU6IHVybCgnZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTQgMTdoM2wyLTRWN2gtNnY2aDNNNiAxN2gzbDItNFY3SDV2NmgzbC0yIDR6XCIvPjwvc3ZnPicpO1xuICAgICAgICAgICAgICAgIC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodDogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7OmNoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTQuNjQ2IDEuNjQ2YS41LjUgMCAwIDEgLjcwOCAwbDYgNmEuNS41IDAgMCAxIDAgLjcwOGwtNiA2YS41LjUgMCAwIDEtLjcwOC0uNzA4TDEwLjI5MyA4IDQuNjQ2IDIuMzU0YS41LjUgMCAwIDEgMC0uNzA4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgICAgICAtLWFkbW9uaXRpb24tLWNoZXZyb24tZG93bjogdXJsKCdkYXRhOmltYWdlL3N2Zyt4bWw7OmNoYXJzZXQ9dXRmLTgsPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAxNiAxNlwiPjxwYXRoIGZpbGwtcnVsZT1cImV2ZW5vZGRcIiBkPVwiTTEuNjQ2IDQuNjQ2YS41LjUgMCAwIDEgLjcwOCAwTDggMTAuMjkzbDUuNjQ2LTUuNjQ3YS41LjUgMCAwIDEgLjcwOC43MDhsLTYgNmEuNS41IDAgMCAxLS43MDggMGwtNi02YS41LjUgMCAwIDEgMC0uNzA4elwiLz48L3N2Zz4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogVElUTEUgKi9cbiAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZSB7XG4gICAgICAgICAgICAgICAgbWluLWhlaWdodDogMjRweDtcbiAgICAgICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgICAgICAgbWFyZ2luLXRvcDogMCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAgIWltcG9ydGFudDtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAwLjRyZW0gMC42cmVtIDAuNHJlbSAycmVtO1xuICAgICAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgICAgICAgICAgLypSRU1PVkUgREVUQUlMUyBNQVJLRVIgSU4gRklSRUZPWCovXG4gICAgICAgICAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOmZvY3VzIHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBERVRBSUxTIE1BUktFUiAqL1xuICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOjptYXJrZXIsXG4gICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tdGl0bGU6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXIge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFRJVExFIENPTExBUFNJQkxFICovXG5cbiAgICAgICAgICAgIGRldGFpbHMgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlIHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXRhaWxzIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZTphZnRlciB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHJpZ2h0OiAwLjZyZW07XG4gICAgICAgICAgICAgICAgd2lkdGg6IDFyZW07XG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAxcmVtO1xuICAgICAgICAgICAgICAgIC1vLW1hc2staW1hZ2U6IHZhcigtLWFkbW9uaXRpb24tLWNoZXZyb24tcmlnaHQpO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodCk7XG4gICAgICAgICAgICAgICAgbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1yaWdodCk7XG4gICAgICAgICAgICAgICAgY29udGVudDogXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRldGFpbHNbb3Blbl0gLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlOmFmdGVyIHtcbiAgICAgICAgICAgICAgICAtby1tYXNrLWltYWdlOiB2YXIoLS1hZG1vbml0aW9uLS1jaGV2cm9uLWRvd24pO1xuICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tY2hldnJvbi1kb3duKTtcbiAgICAgICAgICAgICAgICBtYXNrLWltYWdlOiB2YXIoLS1hZG1vbml0aW9uLS1jaGV2cm9uLWRvd24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBDT05URU5UICovXG4gICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tY29udGVudCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMCAwLjZyZW07XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXVxuXG4gICAgT2JqZWN0LmtleXMoYWRtb25pdGlvbnMpLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgIGNvbnN0IG1hcCA9IGFkbW9uaXRpb25zW3R5cGVdXG4gICAgICBzdHlsZXNoZWV0LnB1c2goYFxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi0tJHt0eXBlfSB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAwLjJyZW0gc29saWQgJHttYXAuYm9yZGVyfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLm5nZS1tZC1hZG1vbml0aW9uLXRpdGxlLS0ke3R5cGV9IHtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogJHttYXAuYmd9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAubmdlLW1kLWFkbW9uaXRpb24tdGl0bGUtLSR7dHlwZX06YmVmb3JlLFxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJHt0eXBlfTphZnRlciB7XG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICR7bWFwLmJvcmRlcn07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC5uZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJHt0eXBlfTpiZWZvcmUge1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IDAuNnJlbTtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDFyZW07XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMXJlbTtcbiAgICAgICAgICAgICAgICAgICAgLW8tbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tJHt0eXBlfSk7XG4gICAgICAgICAgICAgICAgICAgIC13ZWJraXQtbWFzay1pbWFnZTogdmFyKC0tYWRtb25pdGlvbi0tJHt0eXBlfSk7XG4gICAgICAgICAgICAgICAgICAgIG1hc2staW1hZ2U6IHZhcigtLWFkbW9uaXRpb24tLSR7dHlwZX0pO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGApXG4gICAgfSlcbiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoJ25nZS1tYXJrZG93bi1hZG1vbml0aW9ucycsICcnKVxuICAgIHN0eWxlLmlubmVySFRNTCA9IHN0eWxlc2hlZXQuam9pbignXFxuJylcblxuICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpXG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUFkbW9uaXRpb25zKHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgdHJhbnNmb3JtZXIuYWRkSHRtbFRyYW5zZm9ybWVyKChlbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBwYXJhZ3JhcGhzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdwJylcbiAgICAgIHBhcmFncmFwaHMuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gcC5pbm5lckhUTUxcbiAgICAgICAgY29uc3QgbWF0Y2ggPSB0ZXh0Lm1hdGNoKE9QRU4pXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnN0IG9wZW5lciA9IG1hdGNoWzFdXG4gICAgICAgICAgY29uc3QgdHlwZSA9IG1hdGNoWzJdXG4gICAgICAgICAgY29uc3QgdGl0bGUgPSAobWF0Y2hbM10gfHwgJycpLnRyaW0oKVxuXG4gICAgICAgICAgY29uc3QgYWRtb25pdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKVxuICAgICAgICAgIGlmIChvcGVuZXIuZW5kc1dpdGgoJysnKSkge1xuICAgICAgICAgICAgYWRtb25pdGlvbi5vcGVuID0gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBhZG1vbml0aW9uLmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbiBuZ2UtbWQtYWRtb25pdGlvbi0tJyArIHR5cGVcblxuICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5JylcbiAgICAgICAgICBzdW1tYXJ5LmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbi10aXRsZSBuZ2UtbWQtYWRtb25pdGlvbi10aXRsZS0tJyArIHR5cGVcbiAgICAgICAgICBzdW1tYXJ5LmlubmVySFRNTCA9IHRpdGxlXG5cbiAgICAgICAgICBjb25zdCBjb250ZW50OiBIVE1MRWxlbWVudFtdID0gW11cbiAgICAgICAgICBhZG1vbml0aW9uLmFwcGVuZENoaWxkKHN1bW1hcnkpXG5cbiAgICAgICAgICBsZXQgbm9kZSA9IHAubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgICAgICAgbGV0IG9wZW5lZCA9IDFcbiAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaW5uZXJIVE1MID0gbm9kZS5pbm5lckhUTUwudHJpbSgpXG4gICAgICAgICAgICBpZiAoaW5uZXJIVE1MLm1hdGNoKE9QRU4pKSB7XG4gICAgICAgICAgICAgIG9wZW5lZCsrXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlubmVySFRNTC5tYXRjaChDTE9TRSkpIHtcbiAgICAgICAgICAgICAgb3BlbmVkLS1cbiAgICAgICAgICAgICAgaWYgKG9wZW5lZCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlKClcbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50LnB1c2gobm9kZSBhcyBIVE1MRWxlbWVudClcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLm5leHRFbGVtZW50U2libGluZ1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG4gICAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICduZ2UtbWQtYWRtb25pdGlvbi1jb250ZW50J1xuICAgICAgICAgIGNvbnRlbnQuZm9yRWFjaCgoZSkgPT4gZGl2LmFwcGVuZENoaWxkKGUpKVxuICAgICAgICAgIGFkbW9uaXRpb24uYXBwZW5kQ2hpbGQoZGl2KVxuXG4gICAgICAgICAgcC5wYXJlbnRFbGVtZW50Py5pbnNlcnRCZWZvcmUoYWRtb25pdGlvbiwgcClcbiAgICAgICAgICBwLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXV0b0ZpeEFkbW9uaXRpb25zU3ludGF4KHRyYW5zZm9ybWVyOiBOZ2VNYXJrZG93blRyYW5zZm9ybWVyKSB7XG4gICAgdHJhbnNmb3JtZXIuYWRkTWFya2Rvd25UcmFuc2Zvcm1lcigobWFya2Rvd24pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVzID0gbWFya2Rvd24uc3BsaXQoJ1xcbicpXG4gICAgICBjb25zdCBsZW5ndGggPSBsaW5lcy5sZW5ndGhcbiAgICAgIGxldCBpbnNpZGVDb2RlQmxvY2sgPSBmYWxzZVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjdXJyID0gbGluZXNbaV1cbiAgICAgICAgaWYgKGN1cnIuc3RhcnRzV2l0aCgnYGBgJykpIHtcbiAgICAgICAgICBpbnNpZGVDb2RlQmxvY2sgPSAhaW5zaWRlQ29kZUJsb2NrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc2lkZUNvZGVCbG9jaykge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldiA9IGkgPiAwID8gbGluZXNbaSAtIDFdIDogdW5kZWZpbmVkXG4gICAgICAgIGNvbnN0IG5leHQgPSBpIDwgbGVuZ3RoIC0gMSA/IGxpbmVzW2kgKyAxXSA6IHVuZGVmaW5lZFxuICAgICAgICBpZiAoY3Vyci5tYXRjaChPUEVOKSkge1xuICAgICAgICAgIGlmIChuZXh0Py50cmltKCkpIHtcbiAgICAgICAgICAgIGxpbmVzW2ldID0gY3VyciArICdcXG4nXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGN1cnIubWF0Y2goQ0xPU0UpKSB7XG4gICAgICAgICAgaWYgKHByZXY/LnRyaW0oKSkge1xuICAgICAgICAgICAgbGluZXNbaV0gPSAnXFxuJyArIGN1cnJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gdG8gcmVnaXN0ZXIgYE5nZU1hcmtkb3duQWRtb25pdGlvbnNgIGNvbnRyaWJ1dGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE5nZU1hcmtkb3duQWRtb25pdGlvbnNQcm92aWRlcjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HRV9NQVJLRE9XTl9DT05UUklCVVRJT04sXG4gIG11bHRpOiB0cnVlLFxuICB1c2VDbGFzczogTmdlTWFya2Rvd25BZG1vbml0aW9ucyxcbn1cbiJdfQ==