materialize-angular
Version:
Material UI Angular library
262 lines • 23.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/html-visualizer/html-visualizer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Component, Input } from '@angular/core';
import { DomSanitizer } from '@angular/platform-browser';
import { config } from '../../config';
export class HTMLVisualizerComponent {
/**
* @param {?} sanitizer
*/
constructor(sanitizer) {
this.sanitizer = sanitizer;
this.className = HTMLVisualizerComponent.defaultProps.className;
this.html = HTMLVisualizerComponent.defaultProps.html;
this.prefix = config.components.prefix;
}
/**
* @return {?}
*/
ngOnInit() {
this.htmlContent = this.render(this.html);
}
/**
* @param {?} html
* @return {?}
*/
render(html) {
/** @type {?} */
const tags = this.splitByTags(html);
/** @type {?} */
const lines = [];
/** @type {?} */
let depth = 0;
for (let i = 0; i < tags.length; i++) {
/** @type {?} */
const currentTag = tags[i];
/** @type {?} */
const nextTag = tags[i + 1];
/** @type {?} */
const lastTag = tags[i + 2];
/** @type {?} */
const result = this.createLineLogic(currentTag, nextTag, lastTag, depth, i);
depth = result.depth;
i = result.cycle;
lines.push(result.line);
}
return lines.join('<br />');
}
/**
* @param {?} content
* @param {?} className
* @return {?}
*/
createNode(content, className) {
/** @type {?} */
let escapedContent = content.replace(/&/g, '&');
escapedContent = escapedContent.trim();
escapedContent = escapedContent.replace(/\[\[/g, '{{');
escapedContent = escapedContent.replace(/\]\]/g, '}}');
escapedContent = escapedContent.replace(/</g, '<');
escapedContent = escapedContent.replace(/>/g, '>');
escapedContent = escapedContent.replace(/(\S+)="([^']*?)"/g, (/**
* @param {?} match
* @return {?}
*/
match => {
/** @type {?} */
const value = match.match(/"([^']*?)"/g);
/** @type {?} */
const attribute = match.match(/(\S+)=/g);
/** @type {?} */
const attributeValidated = (attribute && attribute[0]) || '';
/** @type {?} */
const valueValidated = (value && value[0]) || '';
/** @type {?} */
const attributeTag = `<span class="${HTMLVisualizerComponent.ATTRIBUTE_CLASS}">${attributeValidated}</span>`;
/** @type {?} */
const valueTag = `<span class="${HTMLVisualizerComponent.VALUE_CLASS}">${valueValidated}</span>`;
return attributeTag + valueTag;
}));
escapedContent = escapedContent.replace(/(<\/|<)/g, (/**
* @param {?} match
* @return {?}
*/
match => `<span class="${HTMLVisualizerComponent.SYMBOL_CLASS}"><${match.includes('/') ? '/' : ''}</span>`));
escapedContent = escapedContent.replace(/(\/>|>)/g, (/**
* @param {?} match
* @return {?}
*/
match => `<span class="${HTMLVisualizerComponent.SYMBOL_CLASS}">${match.includes('/') ? '/' : ''}></span>`));
return `<span class="${className}">${escapedContent}</span>`;
}
/**
* @param {?} depth
* @param {?} content
* @return {?}
*/
indentNode(depth, content) {
/** @type {?} */
const indentationBase = '  ';
/** @type {?} */
const indentation = indentationBase.repeat(depth);
return `${indentation}${content}`;
}
/**
* @param {?} xml
* @return {?}
*/
splitByTags(xml) {
/** @type {?} */
const tags = xml.split(/(<\/?[^>]+>)/g);
/** @type {?} */
const cleanedTags = tags.filter((/**
* @param {?} line
* @return {?}
*/
line => line.trim() !== ''));
return cleanedTags;
}
/**
* @param {?} contentNode
* @return {?}
*/
isTag(contentNode) {
return (/<[^>!]+>/).test(contentNode);
}
/**
* @param {?} contentNode
* @return {?}
*/
isOpeningTag(contentNode) {
if (this.isTag(contentNode) && !this.isClosingTag(contentNode) && !this.isSelfClosingTag(contentNode)) {
return true;
}
return false;
}
/**
* @param {?} contentNode
* @return {?}
*/
isClosingTag(contentNode) {
return (/<\/+[^>]+>/).test(contentNode);
}
/**
* @param {?} contentNode
* @return {?}
*/
isSelfClosingTag(contentNode) {
return (/<[^>]+\/>/).test(contentNode);
}
/**
* @param {?} firstTag
* @param {?} middleTag
* @param {?} lastTag
* @param {?} depth
* @param {?} cycle
* @return {?}
*/
createLineLogic(firstTag, middleTag, lastTag, depth, cycle) {
if (this.isOpeningTag(firstTag) && this.isClosingTag(middleTag)) {
/** @type {?} */
const openNode = this.createNode(firstTag, 'tag');
/** @type {?} */
const closeNode = this.createNode(middleTag, 'tag');
return {
cycle: cycle + 1,
depth: depth,
line: this.indentNode(depth, `${openNode}${closeNode}`)
};
}
if (this.isOpeningTag(firstTag) && !this.isTag(middleTag)) {
/** @type {?} */
const openNode = this.createNode(firstTag, 'tag');
/** @type {?} */
const contentNode = this.createNode(middleTag, 'string');
/** @type {?} */
const closeNode = this.createNode(lastTag, 'tag');
return {
cycle: cycle + 2,
depth: depth,
line: this.indentNode(depth, `${openNode}${contentNode}${closeNode}`)
};
}
if (this.isSelfClosingTag(firstTag)) {
/** @type {?} */
const selfClosingNode = this.createNode(firstTag, 'tag');
return {
cycle: cycle,
depth: depth,
line: this.indentNode(depth, selfClosingNode)
};
}
if (this.isClosingTag(firstTag)) {
/** @type {?} */
const closeNode = this.createNode(firstTag, 'tag');
return {
cycle: cycle,
depth: depth - 1,
line: this.indentNode(depth - 1, closeNode)
};
}
return {
cycle: cycle,
depth: depth + 1,
line: this.indentNode(depth, this.createNode(firstTag, 'text'))
};
}
}
HTMLVisualizerComponent.ATTRIBUTE_CLASS = `${config.components.prefix}-html-visualizer-attribute`;
HTMLVisualizerComponent.VALUE_CLASS = `${config.components.prefix}-html-visualizer-value`;
HTMLVisualizerComponent.SYMBOL_CLASS = `${config.components.prefix}-html-visualizer-symbol`;
HTMLVisualizerComponent.defaultProps = {
className: '',
html: ''
};
HTMLVisualizerComponent.decorators = [
{ type: Component, args: [{
selector: `${config.components.prefix}-html-visualizer`,
template: "<div [ngClass]=\"prefix + '-html-visualizer'\">\n <div [ngClass]=\"prefix + '-html-visualizer-content'\" [innerHTML]=\"htmlContent\" ngNonBindable></div>\n</div>\n"
}] }
];
/** @nocollapse */
HTMLVisualizerComponent.ctorParameters = () => [
{ type: DomSanitizer }
];
HTMLVisualizerComponent.propDecorators = {
className: [{ type: Input }],
html: [{ type: Input }]
};
if (false) {
/** @type {?} */
HTMLVisualizerComponent.ATTRIBUTE_CLASS;
/** @type {?} */
HTMLVisualizerComponent.VALUE_CLASS;
/** @type {?} */
HTMLVisualizerComponent.SYMBOL_CLASS;
/** @type {?} */
HTMLVisualizerComponent.defaultProps;
/** @type {?} */
HTMLVisualizerComponent.prototype.className;
/** @type {?} */
HTMLVisualizerComponent.prototype.html;
/** @type {?} */
HTMLVisualizerComponent.prototype.htmlContent;
/** @type {?} */
HTMLVisualizerComponent.prototype.prefix;
/**
* @type {?}
* @private
*/
HTMLVisualizerComponent.prototype.sanitizer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC12aXN1YWxpemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvaHRtbC12aXN1YWxpemVyL2h0bWwtdmlzdWFsaXplci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLDJCQUEyQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFPdEMsTUFBTSxPQUFPLHVCQUF1Qjs7OztJQWdCbEMsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQU5sQyxjQUFTLEdBQVcsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNuRSxTQUFJLEdBQVcsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUczRCxXQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFHekMsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRUQsTUFBTSxDQUFDLElBQVk7O2NBQ1gsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDOztjQUM3QixLQUFLLEdBQUcsRUFBRTs7WUFFWixLQUFLLEdBQUcsQ0FBQztRQUViLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFOztrQkFDOUIsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7O2tCQUNw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XG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IFdvcmt5bGFiLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS93b3JreWxhYi9tYXRlcmlhbGl6ZS1hbmd1bGFyL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHsgSFRNTFZpc3VhbGl6ZXJNb2RlbCB9IGZyb20gJy4vaHRtbC12aXN1YWxpemVyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBgJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH0taHRtbC12aXN1YWxpemVyYCxcbiAgdGVtcGxhdGVVcmw6ICcuL2h0bWwtdmlzdWFsaXplci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQgaW1wbGVtZW50cyBIVE1MVmlzdWFsaXplck1vZGVsLCBPbkluaXQge1xuICBzdGF0aWMgcmVhZG9ubHkgQVRUUklCVVRFX0NMQVNTID0gYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LWh0bWwtdmlzdWFsaXplci1hdHRyaWJ1dGVgO1xuICBzdGF0aWMgcmVhZG9ubHkgVkFMVUVfQ0xBU1MgPSBgJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH0taHRtbC12aXN1YWxpemVyLXZhbHVlYDtcbiAgc3RhdGljIHJlYWRvbmx5IFNZTUJPTF9DTEFTUyA9IGAkeyBjb25maWcuY29tcG9uZW50cy5wcmVmaXggfS1odG1sLXZpc3VhbGl6ZXItc3ltYm9sYDtcblxuICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByb3BzOiBIVE1MVmlzdWFsaXplck1vZGVsID0ge1xuICAgIGNsYXNzTmFtZTogJycsXG4gICAgaHRtbDogJydcbiAgfTtcblxuICBASW5wdXQoKSBjbGFzc05hbWU6IHN0cmluZyA9IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5jbGFzc05hbWU7XG4gIEBJbnB1dCgpIGh0bWw6IHN0cmluZyA9IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5odG1sO1xuXG4gIHB1YmxpYyBodG1sQ29udGVudDogU2FmZUh0bWw7XG4gIHB1YmxpYyBwcmVmaXggPSBjb25maWcuY29tcG9uZW50cy5wcmVmaXg7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5odG1sQ29udGVudCA9IHRoaXMucmVuZGVyKHRoaXMuaHRtbCk7XG4gIH1cblxuICByZW5kZXIoaHRtbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0YWdzID0gdGhpcy5zcGxpdEJ5VGFncyhodG1sKTtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuXG4gICAgbGV0IGRlcHRoID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY3VycmVudFRhZyA9IHRhZ3NbaV07XG4gICAgICBjb25zdCBuZXh0VGFnID0gdGFnc1tpICsgMV07XG4gICAgICBjb25zdCBsYXN0VGFnID0gdGFnc1tpICsgMl07XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY3JlYXRlTGluZUxvZ2ljKGN1cnJlbnRUYWcsIG5leHRUYWcsIGxhc3RUYWcsIGRlcHRoLCBpKTtcblxuICAgICAgZGVwdGggPSByZXN1bHQuZGVwdGg7XG4gICAgICBpID0gcmVzdWx0LmN5Y2xlO1xuICAgICAgbGluZXMucHVzaChyZXN1bHQubGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oJzxiciAvPicpO1xuICB9XG5cbiAgY3JlYXRlTm9kZShjb250ZW50OiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IGVzY2FwZWRDb250ZW50ID0gY29udGVudC5yZXBsYWNlKC8mL2csICcmYW1wOycpO1xuXG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC50cmltKCk7XG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC9cXFtcXFsvZywgJyYjMTIzJiMxMjM7Jyk7XG4gICAgZXNjYXBlZENvbnRlbnQgPSBlc2NhcGVkQ29udGVudC5yZXBsYWNlKC9cXF1cXF0vZywgJyYjMTI1JiMxMjU7Jyk7XG5cbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoLz4vZywgJyZndDsnKTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvKFxcUyspPVwiKFteJ10qPylcIi9nLCBtYXRjaCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG1hdGNoLm1hdGNoKC9cIihbXiddKj8pXCIvZyk7XG4gICAgICBjb25zdCBhdHRyaWJ1dGUgPSBtYXRjaC5tYXRjaCgvKFxcUyspPS9nKTtcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVZhbGlkYXRlZCA9IChhdHRyaWJ1dGUgJiYgYXR0cmlidXRlWzBdKSB8fCAnJztcbiAgICAgIGNvbnN0IHZhbHVlVmFsaWRhdGVkID0gKHZhbHVlICYmIHZhbHVlWzBdKSB8fCAnJztcblxuICAgICAgY29uc3QgYXR0cmlidXRlVGFnID0gYDxzcGFuIGNsYXNzPVwiJHsgSFRNTFZpc3VhbGl6ZXJDb21wb25lbnQuQVRUUklCVVRFX0NMQVNTIH1cIj4keyBhdHRyaWJ1dGVWYWxpZGF0ZWQgfTwvc3Bhbj5gO1xuICAgICAgY29uc3QgdmFsdWVUYWcgPSBgPHNwYW4gY2xhc3M9XCIkeyBIVE1MVmlzdWFsaXplckNvbXBvbmVudC5WQUxVRV9DTEFTUyB9XCI+JHsgdmFsdWVWYWxpZGF0ZWQgfTwvc3Bhbj5gO1xuXG4gICAgICByZXR1cm4gYXR0cmlidXRlVGFnICsgdmFsdWVUYWc7XG4gICAgfSk7XG5cbiAgICBlc2NhcGVkQ29udGVudCA9IGVzY2FwZWRDb250ZW50LnJlcGxhY2UoLygmbHQ7XFwvfCZsdDspL2csIG1hdGNoID0+XG4gICAgICBgPHNwYW4gY2xhc3M9XCIkeyBIVE1MVmlzdWFsaXplckNvbXBvbmVudC5TWU1CT0xfQ0xBU1MgfVwiPiZsdDskeyBtYXRjaC5pbmNsdWRlcygnLycpID8gJy8nIDogJycgfTwvc3Bhbj5gXG4gICAgKTtcblxuICAgIGVzY2FwZWRDb250ZW50ID0gZXNjYXBlZENvbnRlbnQucmVwbGFjZSgvKFxcLyZndDt8Jmd0OykvZywgbWF0Y2ggPT5cbiAgICAgIGA8c3BhbiBjbGFzcz1cIiR7IEhUTUxWaXN1YWxpemVyQ29tcG9uZW50LlNZTUJPTF9DTEFTUyB9XCI+JHsgbWF0Y2guaW5jbHVkZXMoJy8nKSA/ICcvJyA6ICcnIH0mZ3Q7PC9zcGFuPmBcbiAgICApO1xuXG4gICAgcmV0dXJuIGA8c3BhbiBjbGFzcz1cIiR7IGNsYXNzTmFtZSB9XCI+JHsgZXNjYXBlZENvbnRlbnQgfTwvc3Bhbj5gO1xuICB9XG5cbiAgaW5kZW50Tm9kZShkZXB0aDogbnVtYmVyLCBjb250ZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRlbnRhdGlvbkJhc2UgPSAnJmVtc3A7JmVtc3A7JztcbiAgICBjb25zdCBpbmRlbnRhdGlvbiA9IGluZGVudGF0aW9uQmFzZS5yZXBlYXQoZGVwdGgpO1xuXG4gICAgcmV0dXJuIGAkeyBpbmRlbnRhdGlvbiB9JHsgY29udGVudCB9YDtcbiAgfVxuXG4gIHNwbGl0QnlUYWdzKHhtbDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgdGFncyA9IHhtbC5zcGxpdCgvKDxcXC8/W14+XSs+KS9nKTtcbiAgICBjb25zdCBjbGVhbmVkVGFncyA9IHRhZ3MuZmlsdGVyKGxpbmUgPT4gbGluZS50cmltKCkgIT09ICcnKTtcblxuICAgIHJldHVybiBjbGVhbmVkVGFncztcbiAgfVxuXG4gIGlzVGFnKGNvbnRlbnROb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKC88W14+IV0rPi8pLnRlc3QoY29udGVudE5vZGUpO1xuICB9XG5cbiAgaXNPcGVuaW5nVGFnKGNvbnRlbnROb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc1RhZyhjb250ZW50Tm9kZSkgJiYgIXRoaXMuaXNDbG9zaW5nVGFnKGNvbnRlbnROb2RlKSAmJiAhdGhpcy5pc1NlbGZDbG9zaW5nVGFnKGNvbnRlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaXNDbG9zaW5nVGFnKGNvbnRlbnROb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKC88XFwvK1tePl0rPi8pLnRlc3QoY29udGVudE5vZGUpO1xuICB9XG5cbiAgaXNTZWxmQ2xvc2luZ1RhZyhjb250ZW50Tm9kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICgvPFtePl0rXFwvPi8pLnRlc3QoY29udGVudE5vZGUpO1xuICB9XG5cbiAgY3JlYXRlTGluZUxvZ2ljKGZpcnN0VGFnOiBzdHJpbmcsIG1pZGRsZVRhZzogc3RyaW5nLCBsYXN0VGFnOiBzdHJpbmcsIGRlcHRoOiBudW1iZXIsIGN5Y2xlOiBudW1iZXIpOiBhbnkge1xuICAgIGlmICh0aGlzLmlzT3BlbmluZ1RhZyhmaXJzdFRhZykgJiYgdGhpcy5pc0Nsb3NpbmdUYWcobWlkZGxlVGFnKSkge1xuICAgICAgY29uc3Qgb3Blbk5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0YWcnKTtcbiAgICAgIGNvbnN0IGNsb3NlTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShtaWRkbGVUYWcsICd0YWcnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3ljbGU6IGN5Y2xlICsgMSxcbiAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGgsIGAkeyBvcGVuTm9kZSB9JHsgY2xvc2VOb2RlIH1gKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc09wZW5pbmdUYWcoZmlyc3RUYWcpICYmICF0aGlzLmlzVGFnKG1pZGRsZVRhZykpIHtcbiAgICAgIGNvbnN0IG9wZW5Ob2RlID0gdGhpcy5jcmVhdGVOb2RlKGZpcnN0VGFnLCAndGFnJyk7XG4gICAgICBjb25zdCBjb250ZW50Tm9kZSA9IHRoaXMuY3JlYXRlTm9kZShtaWRkbGVUYWcsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNsb3NlTm9kZSA9IHRoaXMuY3JlYXRlTm9kZShsYXN0VGFnLCAndGFnJyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN5Y2xlOiBjeWNsZSArIDIsXG4gICAgICAgIGRlcHRoOiBkZXB0aCxcbiAgICAgICAgbGluZTogdGhpcy5pbmRlbnROb2RlKGRlcHRoLCBgJHsgb3Blbk5vZGUgfSR7IGNvbnRlbnROb2RlIH0keyBjbG9zZU5vZGUgfWApXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU2VsZkNsb3NpbmdUYWcoZmlyc3RUYWcpKSB7XG4gICAgICBjb25zdCBzZWxmQ2xvc2luZ05vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0YWcnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3ljbGU6IGN5Y2xlLFxuICAgICAgICBkZXB0aDogZGVwdGgsXG4gICAgICAgIGxpbmU6IHRoaXMuaW5kZW50Tm9kZShkZXB0aCwgc2VsZkNsb3NpbmdOb2RlKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0Nsb3NpbmdUYWcoZmlyc3RUYWcpKSB7XG4gICAgICBjb25zdCBjbG9zZU5vZGUgPSB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0YWcnKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3ljbGU6IGN5Y2xlLFxuICAgICAgICBkZXB0aDogZGVwdGggLSAxLFxuICAgICAgICBsaW5lOiB0aGlzLmluZGVudE5vZGUoZGVwdGggLSAxLCBjbG9zZU5vZGUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjeWNsZTogY3ljbGUsXG4gICAgICBkZXB0aDogZGVwdGggKyAxLFxuICAgICAgbGluZTogdGhpcy5pbmRlbnROb2RlKGRlcHRoLCB0aGlzLmNyZWF0ZU5vZGUoZmlyc3RUYWcsICd0ZXh0JykpXG4gICAgfTtcbiAgfVxufVxuIl19