ngx-firebase-cms
Version:
Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)
388 lines • 33.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, ViewChild, EventEmitter, Renderer2, Inject, forwardRef } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { EditorService } from '../../service/editor.service';
import { EditorToolbarComponent } from '../editor-toolbar/editor-toolbar.component';
import { angularEditorConfig } from '../../interface/editor';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
var EditorComponent = /** @class */ (function () {
function EditorComponent(_renderer, editorService, _document) {
this._renderer = _renderer;
this.editorService = editorService;
this._document = _document;
this.modeVisual = true;
this.showPlaceholder = false;
this.id = '';
this.config = angularEditorConfig;
this.viewMode = new EventEmitter();
this.blur = new EventEmitter();
this.focus = new EventEmitter();
}
/**
* @return {?}
*/
EditorComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.editorToolbar.id = this.id;
this.editorToolbar.fonts = this.config.fonts ? this.config.fonts : angularEditorConfig.fonts;
this.editorToolbar.customClasses = this.config.customClasses;
this.editorService.uploadUrl = this.config.uploadUrl;
if (this.config.showToolbar !== undefined) {
this.editorToolbar.showToolbar = this.config.showToolbar;
}
if (this.config.defaultParagraphSeparator) {
this.editorService.setDefaultParagraphSeparator(this.config.defaultParagraphSeparator);
}
};
/**
* @return {?}
*/
EditorComponent.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.config.defaultFontName) {
this.editorToolbar.defaultFontId = this.config.defaultFontName ? this.editorToolbar.fonts.findIndex((/**
* @param {?} x
* @return {?}
*/
function (x) {
return x.name === _this.config.defaultFontName;
})) : 0;
this.editorToolbar.fontId = this.editorToolbar.defaultFontId;
this.onEditorFocus();
this.editorService.setFontName(this.config.defaultFontName);
}
else {
this.editorToolbar.defaultFontId = 0;
this.editorToolbar.fontId = 0;
}
if (this.config.defaultFontSize) {
this.editorToolbar.fontSize = this.config.defaultFontSize;
this.onEditorFocus();
this.editorService.setFontSize(this.config.defaultFontSize);
}
};
/**
* @param {?} command
* @return {?}
*/
EditorComponent.prototype.executeCommand = /**
* @param {?} command
* @return {?}
*/
function (command) {
if (command === 'toggleEditorMode') {
this.toggleEditorMode(this.modeVisual);
}
else if (command !== '') {
this.editorService.executeCommand(command);
this.exec();
}
this.onEditorFocus();
};
/**
* @return {?}
*/
EditorComponent.prototype.onTextAreaFocus = /**
* @return {?}
*/
function () {
this.focus.emit('focus');
};
/**
* @param {?} event
* @return {?}
*/
EditorComponent.prototype.onTextAreaBlur = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.editorService.saveSelection();
if (typeof this.onTouched === 'function') {
this.onTouched();
}
if (event.relatedTarget != null && ((/** @type {?} */ (event.relatedTarget))).parentElement.className !== 'angular-editor-toolbar-set') {
this.blur.emit('blur');
}
};
/**
* @return {?}
*/
EditorComponent.prototype.onEditorFocus = /**
* @return {?}
*/
function () {
this.textArea.nativeElement.focus();
};
/**
* @param {?} html
* @return {?}
*/
EditorComponent.prototype.onContentChange = /**
* @param {?} html
* @return {?}
*/
function (html) {
if (typeof this.onChange === 'function') {
this.onChange(html);
if ((!html || html === '<br>' || html === '') !== this.showPlaceholder) {
this.togglePlaceholder(this.showPlaceholder);
}
}
};
/**
* @param {?} fn
* @return {?}
*/
EditorComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChange = fn;
};
/**
* @param {?} fn
* @return {?}
*/
EditorComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouched = fn;
};
/**
* @param {?} value
* @return {?}
*/
EditorComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if ((!value || value === '<br>' || value === '') !== this.showPlaceholder) {
this.togglePlaceholder(this.showPlaceholder);
}
if (value === null || value === undefined || value === '' || value === '<br>') {
value = null;
}
this.refreshView(value);
};
/**
* @param {?} value
* @return {?}
*/
EditorComponent.prototype.refreshView = /**
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var normalizedValue = value === null ? '' : value;
this._renderer.setProperty(this.textArea.nativeElement, 'innerHTML', normalizedValue);
return;
};
/**
* @param {?} value
* @return {?}
*/
EditorComponent.prototype.togglePlaceholder = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (!value) {
this._renderer.addClass(this.editorWrapper.nativeElement, 'show-placeholder');
this.showPlaceholder = true;
}
else {
this._renderer.removeClass(this.editorWrapper.nativeElement, 'show-placeholder');
this.showPlaceholder = false;
}
};
/**
* @param {?} isDisabled
* @return {?}
*/
EditorComponent.prototype.setDisabledState = /**
* @param {?} isDisabled
* @return {?}
*/
function (isDisabled) {
/** @type {?} */
var div = this.textArea.nativeElement;
/** @type {?} */
var action = isDisabled ? 'addClass' : 'removeClass';
this._renderer[action](div, 'disabled');
};
/**
* @param {?} bToSource
* @return {?}
*/
EditorComponent.prototype.toggleEditorMode = /**
* @param {?} bToSource
* @return {?}
*/
function (bToSource) {
/** @type {?} */
var oContent;
/** @type {?} */
var editableElement = this.textArea.nativeElement;
if (bToSource) {
oContent = this._document.createTextNode(editableElement.innerHTML);
editableElement.innerHTML = '';
/** @type {?} */
var oPre = this._document.createElement('pre');
oPre.setAttribute("style", "margin: 0; outline: none;");
/** @type {?} */
var oCode = this._document.createElement('code');
editableElement.contentEditable = false;
oCode.id = "sourceText";
oCode.setAttribute("style", "white-space: pre-wrap; word-break: keep-all; margin: 0; outline: none; background-color: #fff5b9;");
oCode.contentEditable = 'true';
oCode.appendChild(oContent);
oPre.appendChild(oCode);
editableElement.appendChild(oPre);
this._document.execCommand("defaultParagraphSeparator", false, "div");
this.modeVisual = false;
this.viewMode.emit(false);
oCode.focus();
}
else {
if (this._document.all) {
editableElement.innerHTML = editableElement.innerText;
}
else {
oContent = this._document.createRange();
oContent.selectNodeContents(editableElement.firstChild);
editableElement.innerHTML = oContent.toString();
}
editableElement.contentEditable = true;
this.modeVisual = true;
this.viewMode.emit(true);
this.onContentChange(editableElement.innerHTML);
editableElement.focus();
}
this.editorToolbar.setEditorMode(!this.modeVisual);
};
/**
* @return {?}
*/
EditorComponent.prototype.exec = /**
* @return {?}
*/
function () {
this.editorToolbar.triggerButtons();
/** @type {?} */
var userSelection;
if (window.getSelection) {
userSelection = window.getSelection();
}
/** @type {?} */
var a = userSelection.focusNode;
/** @type {?} */
var els = [];
while (a && a.id !== 'editor') {
els.unshift(a);
a = a.parentNode;
}
this.editorToolbar.triggerBlocks(els);
};
EditorComponent.decorators = [
{ type: Component, args: [{
selector: 'aq-editor',
template: "<div (focus)=\"onEditorFocus()\" class=\"angular-editor\" id=\"angularEditor\" [style.width]=\"config.width\" [style.minWidth]=\"config.minWidth\">\n <aq-editor-toolbar #editorToolbar (execute)=\"executeCommand($event)\"></aq-editor-toolbar>\n <div class=\"angular-editor-wrapper\" #editorWrapper>\n <div #editor id=\"editor\" class=\"angular-editor-textarea\" [attr.contenteditable]=\"config.editable\"\n [attr.translate]=\"config.translate\" [attr.spellcheck]=\"config.spellcheck\" [style.height]=\"config.height\"\n [style.minHeight]=\"config.minHeight\" [style.maxHeight]=\"config.maxHeight\"\n (input)=\"onContentChange($event.target.innerHTML)\" (focus)=\"onTextAreaFocus()\" (blur)=\"onTextAreaBlur($event)\"\n (click)=\"exec()\" (keyup)=\"exec()\">\n </div>\n <span class=\"angular-editor-placeholder\">{{ placeholder || config['placeholder'] }}</span>\n </div>\n</div>",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
function () { return EditorComponent; })),
multi: true
}
],
styles: [".angular-editor{position:relative}.angular-editor ::ng-deep [contenteditable=true]:empty:before{content:attr(placeholder);color:#868e96;opacity:1}.angular-editor .angular-editor-wrapper{position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea{min-height:5rem;padding:.5rem .8rem 1rem;border:1px solid #ddd;background-color:transparent;overflow-x:hidden;overflow-y:auto;z-index:2;position:relative}.angular-editor .angular-editor-wrapper .angular-editor-textarea.focus,.angular-editor .angular-editor-wrapper .angular-editor-textarea:focus{outline:0}.angular-editor .angular-editor-wrapper .angular-editor-textarea ::ng-deep blockquote{margin-left:1rem;border-left:.2em solid #dfe2e5;padding-left:.5rem}.angular-editor .angular-editor-wrapper ::ng-deep p{margin-bottom:0}.angular-editor .angular-editor-wrapper .angular-editor-placeholder{display:none;position:absolute;top:0;padding:.5rem .8rem 1rem .9rem;z-index:1;color:#6c757d;opacity:.75}.angular-editor .angular-editor-wrapper.show-placeholder .angular-editor-placeholder{display:block}.angular-editor .angular-editor-wrapper.disabled{cursor:not-allowed;opacity:.5;pointer-events:none}"]
}] }
];
/** @nocollapse */
EditorComponent.ctorParameters = function () { return [
{ type: Renderer2 },
{ type: EditorService },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
]; };
EditorComponent.propDecorators = {
id: [{ type: Input }],
config: [{ type: Input }],
textArea: [{ type: ViewChild, args: ['editor',] }],
editorWrapper: [{ type: ViewChild, args: ['editorWrapper',] }],
editorToolbar: [{ type: ViewChild, args: ['editorToolbar',] }],
html: [{ type: Output }],
viewMode: [{ type: Output }],
blur: [{ type: Output }],
focus: [{ type: Output }]
};
return EditorComponent;
}());
export { EditorComponent };
if (false) {
/**
* @type {?}
* @private
*/
EditorComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
EditorComponent.prototype.onTouched;
/** @type {?} */
EditorComponent.prototype.placeholder;
/** @type {?} */
EditorComponent.prototype.modeVisual;
/** @type {?} */
EditorComponent.prototype.showPlaceholder;
/** @type {?} */
EditorComponent.prototype.id;
/** @type {?} */
EditorComponent.prototype.config;
/** @type {?} */
EditorComponent.prototype.textArea;
/** @type {?} */
EditorComponent.prototype.editorWrapper;
/** @type {?} */
EditorComponent.prototype.editorToolbar;
/** @type {?} */
EditorComponent.prototype.html;
/** @type {?} */
EditorComponent.prototype.viewMode;
/** @type {?} */
EditorComponent.prototype.blur;
/** @type {?} */
EditorComponent.prototype.focus;
/**
* @type {?}
* @private
*/
EditorComponent.prototype._renderer;
/**
* @type {?}
* @private
*/
EditorComponent.prototype.editorService;
/**
* @type {?}
* @private
*/
EditorComponent.prototype._document;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1maXJlYmFzZS1jbXMvIiwic291cmNlcyI6WyJsaWIvZGlyZWN0aXZlL2VkaXRvci9lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDM0ksT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQXVCLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEYsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBRXpFO0lBOEJFLHlCQUNVLFNBQW9CLEVBQ3BCLGFBQTRCLEVBQ1YsU0FBYztRQUZoQyxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsY0FBUyxHQUFULFNBQVMsQ0FBSztRQWYxQyxlQUFVLEdBQUcsSUFBSSxDQUFBO1FBQ2pCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBQ2QsT0FBRSxHQUFHLEVBQUUsQ0FBQTtRQUNQLFdBQU0sR0FBd0IsbUJBQW1CLENBQUE7UUFLaEQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUE7UUFDdEMsU0FBSSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFBO1FBQ3ZELFVBQUssR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQTtJQU1sRSxDQUFDOzs7O0lBRUQsa0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEdB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QUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7O2dCQTFNRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLFdBQVc7b0JBQ3JCLHk1QkFBc0M7b0JBRXRDLFNBQVMsRUFBRTt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVTs7OzRCQUFDLGNBQU0sT0FBQSxlQUFlLEVBQWYsQ0FBZSxFQUFDOzRCQUM5QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjs7aUJBQ0Y7Ozs7Z0JBbEJtRSxTQUFTO2dCQUVwRSxhQUFhO2dEQXNDakIsTUFBTSxTQUFDLFFBQVE7OztxQkFiakIsS0FBSzt5QkFDTCxLQUFLOzJCQUNMLFNBQVMsU0FBQyxRQUFRO2dDQUNsQixTQUFTLFNBQUMsZUFBZTtnQ0FDekIsU0FBUyxTQUFDLGVBQWU7dUJBQ3pCLE1BQU07MkJBQ04sTUFBTTt1QkFDTixNQUFNO3dCQUNOLE1BQU07O0lBZ0xULHNCQUFDO0NBQUEsQUE1TUQsSUE0TUM7U0FoTVksZUFBZTs7Ozs7O0lBRTFCLG1DQUF5Qzs7Ozs7SUFDekMsb0NBQTZCOztJQUU3QixzQ0FBb0I7O0lBQ3BCLHFDQUFpQjs7SUFDakIsMENBQXVCOztJQUN2Qiw2QkFBZ0I7O0lBQ2hCLGlDQUEwRDs7SUFDMUQsbUNBQWtDOztJQUNsQyx3Q0FBOEM7O0lBQzlDLHdDQUFpRTs7SUFDakUsK0JBQWM7O0lBQ2QsbUNBQWdEOztJQUNoRCwrQkFBaUU7O0lBQ2pFLGdDQUFrRTs7Ozs7SUFHaEUsb0NBQTRCOzs7OztJQUM1Qix3Q0FBb0M7Ozs7O0lBQ3BDLG9DQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciwgUmVuZGVyZXIyLCBJbmplY3QsIGZvcndhcmRSZWYsIEFmdGVyQ29udGVudEluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEVkaXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL2VkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEVkaXRvclRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0b3ItdG9vbGJhci9lZGl0b3ItdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvckNvbmZpZywgYW5ndWxhckVkaXRvckNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZS9lZGl0b3InO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcS1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZWRpdG9yLmNvbXBvbmVudC5jc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgQWZ0ZXJDb250ZW50SW5pdCB7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWRcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWRcblxuICBwbGFjZWhvbGRlcjogYm9vbGVhblxuICBtb2RlVmlzdWFsID0gdHJ1ZVxuICBzaG93UGxhY2Vob2xkZXIgPSBmYWxzZVxuICBASW5wdXQoKSBpZCA9ICcnXG4gIEBJbnB1dCgpIGNvbmZpZzogQW5ndWxhckVkaXRvckNvbmZpZyA9IGFuZ3VsYXJFZGl0b3JDb25maWdcbiAgQFZpZXdDaGlsZCgnZWRpdG9yJykgdGV4dEFyZWE6IGFueVxuICBAVmlld0NoaWxkKCdlZGl0b3JXcmFwcGVyJykgZWRpdG9yV3JhcHBlcjogYW55XG4gIEBWaWV3Q2hpbGQoJ2VkaXRvclRvb2xiYXInKSBlZGl0b3JUb29sYmFyOiBFZGl0b3JUb29sYmFyQ29tcG9uZW50XG4gIEBPdXRwdXQoKSBodG1sXG4gIEBPdXRwdXQoKSB2aWV3TW9kZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKVxuICBAT3V0cHV0KCkgYmx1cjogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKVxuICBAT3V0cHV0KCkgZm9jdXM6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KClcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLCBcbiAgICBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsIFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnkpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZWRpdG9yVG9vbGJhci5pZCA9IHRoaXMuaWQ7XG4gICAgdGhpcy5lZGl0b3JUb29sYmFyLmZvbnRzID0gdGhpcy5jb25maWcuZm9udHMgPyB0aGlzLmNvbmZpZy5mb250cyA6IGFuZ3VsYXJFZGl0b3JDb25maWcuZm9udHM7XG4gICAgdGhpcy5lZGl0b3JUb29sYmFyLmN1c3RvbUNsYXNzZXMgPSB0aGlzLmNvbmZpZy5jdXN0b21DbGFzc2VzO1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS51cGxvYWRVcmwgPSB0aGlzLmNvbmZpZy51cGxvYWRVcmw7XG4gICAgaWYgKHRoaXMuY29uZmlnLnNob3dUb29sYmFyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVG9vbGJhci5zaG93VG9vbGJhciA9IHRoaXMuY29uZmlnLnNob3dUb29sYmFyO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcuZGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcikge1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldERlZmF1bHRQYXJhZ3JhcGhTZXBhcmF0b3IodGhpcy5jb25maWcuZGVmYXVsdFBhcmFncmFwaFNlcGFyYXRvcik7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udE5hbWUpIHtcbiAgICAgIHRoaXMuZWRpdG9yVG9vbGJhci5kZWZhdWx0Rm9udElkID0gdGhpcy5jb25maWcuZGVmYXVsdEZvbnROYW1lID8gdGhpcy5lZGl0b3JUb29sYmFyLmZvbnRzLmZpbmRJbmRleCh4ID0+IHtcbiAgICAgICAgcmV0dXJuIHgubmFtZSA9PT0gdGhpcy5jb25maWcuZGVmYXVsdEZvbnROYW1lO1xuICAgICAgfSkgOiAwO1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLmZvbnRJZCA9IHRoaXMuZWRpdG9yVG9vbGJhci5kZWZhdWx0Rm9udElkO1xuICAgICAgdGhpcy5vbkVkaXRvckZvY3VzKCk7XG4gICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0Rm9udE5hbWUodGhpcy5jb25maWcuZGVmYXVsdEZvbnROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLmRlZmF1bHRGb250SWQgPSAwO1xuICAgICAgdGhpcy5lZGl0b3JUb29sYmFyLmZvbnRJZCA9IDA7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5kZWZhdWx0Rm9udFNpemUpIHtcbiAgICAgIHRoaXMuZWRpdG9yVG9vbGJhci5mb250U2l6ZSA9IHRoaXMuY29uZmlnLmRlZmF1bHRGb250U2l6ZTtcbiAgICAgIHRoaXMub25FZGl0b3JGb2N1cygpO1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEZvbnRTaXplKHRoaXMuY29uZmlnLmRlZmF1bHRGb250U2l6ZSk7XG4gICAgfVxuICB9XG5cbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nKSB7XG4gICAgaWYgKGNvbW1hbmQgPT09ICd0b2dnbGVFZGl0b3JNb2RlJykge1xuICAgICAgdGhpcy50b2dnbGVFZGl0b3JNb2RlKHRoaXMubW9kZVZpc3VhbCk7XG4gICAgfSBlbHNlIGlmIChjb21tYW5kICE9PSAnJykge1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmV4ZWN1dGVDb21tYW5kKGNvbW1hbmQpO1xuICAgICAgdGhpcy5leGVjKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkVkaXRvckZvY3VzKCk7XG4gIH1cblxuICBvblRleHRBcmVhRm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cy5lbWl0KCdmb2N1cycpO1xuICB9XG5cbiAgb25UZXh0QXJlYUJsdXIoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2F2ZVNlbGVjdGlvbigpXG4gICAgaWYgKHR5cGVvZiB0aGlzLm9uVG91Y2hlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKVxuICAgIH1cbiAgICBpZiAoZXZlbnQucmVsYXRlZFRhcmdldCAhPSBudWxsICYmIChldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wYXJlbnRFbGVtZW50LmNsYXNzTmFtZSAhPT0gJ2FuZ3VsYXItZWRpdG9yLXRvb2xiYXItc2V0Jykge1xuICAgICAgdGhpcy5ibHVyLmVtaXQoJ2JsdXInKVxuICAgIH1cbiAgfVxuXG4gIG9uRWRpdG9yRm9jdXMoKSB7XG4gICAgdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50LmZvY3VzKClcbiAgfVxuXG4gIG9uQ29udGVudENoYW5nZShodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub25DaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UoaHRtbCk7XG4gICAgICBpZiAoKCFodG1sIHx8IGh0bWwgPT09ICc8YnI+JyB8fCBodG1sID09PSAnJykgIT09IHRoaXMuc2hvd1BsYWNlaG9sZGVyKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlUGxhY2Vob2xkZXIodGhpcy5zaG93UGxhY2Vob2xkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCghdmFsdWUgfHwgdmFsdWUgPT09ICc8YnI+JyB8fCB2YWx1ZSA9PT0gJycpICE9PSB0aGlzLnNob3dQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy50b2dnbGVQbGFjZWhvbGRlcih0aGlzLnNob3dQbGFjZWhvbGRlcik7XG4gICAgfVxuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gJzxicj4nKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFZpZXcodmFsdWUpO1xuICB9XG5cbiAgcmVmcmVzaFZpZXcodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09PSBudWxsID8gJycgOiB2YWx1ZVxuICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMudGV4dEFyZWEubmF0aXZlRWxlbWVudCwgJ2lubmVySFRNTCcsIG5vcm1hbGl6ZWRWYWx1ZSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIHRvZ2dsZVBsYWNlaG9sZGVyKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgdGhpcy5fcmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lZGl0b3JXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdzaG93LXBsYWNlaG9sZGVyJyk7XG4gICAgICB0aGlzLnNob3dQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZWRpdG9yV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnc2hvdy1wbGFjZWhvbGRlcicpO1xuICAgICAgdGhpcy5zaG93UGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLnRleHRBcmVhLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgYWN0aW9uID0gaXNEaXNhYmxlZCA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnO1xuICAgIHRoaXMuX3JlbmRlcmVyW2FjdGlvbl0oZGl2LCAnZGlzYWJsZWQnKTtcbiAgfVxuXG4gIHRvZ2dsZUVkaXRvck1vZGUoYlRvU291cmNlOiBib29sZWFuKSB7XG4gICAgbGV0IG9Db250ZW50OiBhbnk7XG4gICAgY29uc3QgZWRpdGFibGVFbGVtZW50ID0gdGhpcy50ZXh0QXJlYS5uYXRpdmVFbGVtZW50O1xuXG4gICAgaWYgKGJUb1NvdXJjZSkge1xuICAgICAgb0NvbnRlbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICAgIGVkaXRhYmxlRWxlbWVudC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgY29uc3Qgb1ByZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ByZScpO1xuICAgICAgb1ByZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcIm1hcmdpbjogMDsgb3V0bGluZTogbm9uZTtcIik7XG4gICAgICBjb25zdCBvQ29kZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICAgIGVkaXRhYmxlRWxlbWVudC5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICAgIG9Db2RlLmlkID0gXCJzb3VyY2VUZXh0XCI7XG4gICAgICBvQ29kZS5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBcIndoaXRlLXNwYWNlOiBwcmUtd3JhcDsgd29yZC1icmVhazoga2VlcC1hbGw7IG1hcmdpbjogMDsgb3V0bGluZTogbm9uZTsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjViOTtcIik7XG4gICAgICBvQ29kZS5jb250ZW50RWRpdGFibGUgPSAndHJ1ZSc7XG4gICAgICBvQ29kZS5hcHBlbmRDaGlsZChvQ29udGVudCk7XG4gICAgICBvUHJlLmFwcGVuZENoaWxkKG9Db2RlKTtcbiAgICAgIGVkaXRhYmxlRWxlbWVudC5hcHBlbmRDaGlsZChvUHJlKTtcblxuICAgICAgdGhpcy5fZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJkZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yXCIsIGZhbHNlLCBcImRpdlwiKTtcblxuICAgICAgdGhpcy5tb2RlVmlzdWFsID0gZmFsc2U7XG4gICAgICB0aGlzLnZpZXdNb2RlLmVtaXQoZmFsc2UpO1xuICAgICAgb0NvZGUuZm9jdXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX2RvY3VtZW50LmFsbCkge1xuICAgICAgICBlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MID0gZWRpdGFibGVFbGVtZW50LmlubmVyVGV4dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9Db250ZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgb0NvbnRlbnQuc2VsZWN0Tm9kZUNvbnRlbnRzKGVkaXRhYmxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICAgICAgZWRpdGFibGVFbGVtZW50LmlubmVySFRNTCA9IG9Db250ZW50LnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZUVsZW1lbnQuY29udGVudEVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMubW9kZVZpc3VhbCA9IHRydWU7XG4gICAgICB0aGlzLnZpZXdNb2RlLmVtaXQodHJ1ZSk7XG4gICAgICB0aGlzLm9uQ29udGVudENoYW5nZShlZGl0YWJsZUVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICAgIGVkaXRhYmxlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgICB0aGlzLmVkaXRvclRvb2xiYXIuc2V0RWRpdG9yTW9kZSghdGhpcy5tb2RlVmlzdWFsKTtcbiAgfVxuXG4gIGV4ZWMoKSB7XG4gICAgdGhpcy5lZGl0b3JUb29sYmFyLnRyaWdnZXJCdXR0b25zKCk7XG5cbiAgICBsZXQgdXNlclNlbGVjdGlvbjtcbiAgICBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgICAgdXNlclNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBsZXQgYSA9IHVzZXJTZWxlY3Rpb24uZm9jdXNOb2RlO1xuICAgIGNvbnN0IGVscyA9IFtdO1xuICAgIHdoaWxlIChhICYmIGEuaWQgIT09ICdlZGl0b3InKSB7XG4gICAgICBlbHMudW5zaGlmdChhKTtcbiAgICAgIGEgPSBhLnBhcmVudE5vZGU7XG4gICAgfVxuICAgIHRoaXMuZWRpdG9yVG9vbGJhci50cmlnZ2VyQmxvY2tzKGVscyk7XG4gIH1cblxufSJdfQ==