import * as tslib_1 from "tslib";
// Imports
import { Component, Input, Output, ViewChild, EventEmitter, NgZone, forwardRef, QueryList, AfterViewInit, ContentChildren, SimpleChanges, OnChanges, } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { CKButtonDirective } from './ckbutton.directive';
import { CKGroupDirective } from './ckgroup.directive';
/**
* CKEditor component
* Usage :
*
*/
var CKEditorComponent = /** @class */ (function () {
/**
* Constructor
*/
function CKEditorComponent(zone) {
this.zone = zone;
this.change = new EventEmitter();
this.editorChange = new EventEmitter();
this.ready = new EventEmitter();
this.blur = new EventEmitter();
this.focus = new EventEmitter();
this.contentDom = new EventEmitter();
this.fileUploadRequest = new EventEmitter();
this.fileUploadResponse = new EventEmitter();
this.paste = new EventEmitter();
this.drop = new EventEmitter();
this._value = '';
}
CKEditorComponent_1 = CKEditorComponent;
Object.defineProperty(CKEditorComponent.prototype, "value", {
get: function () {
return this._value;
},
set: function (v) {
if (v !== this._value) {
this._value = v;
this.onChange(v);
}
},
enumerable: true,
configurable: true
});
CKEditorComponent.prototype.ngOnChanges = function (changes) {
if (changes.readonly && this.instance) {
this.instance.setReadOnly(changes.readonly.currentValue);
}
};
/**
* On component destroy
*/
CKEditorComponent.prototype.ngOnDestroy = function () {
if (this.instance) {
this.instance.removeAllListeners();
CKEDITOR.instances[this.instance.name].destroy();
this.instance.destroy();
this.instance = null;
}
};
/**
* On component view init
*/
CKEditorComponent.prototype.ngAfterViewInit = function () {
this.ckeditorInit(this.config || {});
};
/**
* On component view checked
*/
CKEditorComponent.prototype.ngAfterViewChecked = function () {
this.ckeditorInit(this.config || {});
};
/**
* Value update process
*/
CKEditorComponent.prototype.updateValue = function (value) {
var _this = this;
this.zone.run(function () {
_this.value = value;
_this.onChange(value);
_this.onTouched();
_this.change.emit(value);
});
};
/**
* CKEditor init
*/
CKEditorComponent.prototype.ckeditorInit = function (config) {
var _this = this;
if (typeof CKEDITOR === 'undefined') {
console.warn('CKEditor 4.x is missing (http://ckeditor.com/)');
}
else {
// Check textarea exists
if (this.instance || !this.documentContains(this.host.nativeElement)) {
return;
}
if (this.readonly) {
config.readOnly = this.readonly;
}
// CKEditor replace textarea
this.instance = CKEDITOR.replace(this.host.nativeElement, config);
// Set initial value
this.instance.setData(this.value);
// listen for instanceReady event
this.instance.on('instanceReady', function (evt) {
// if value has changed while instance loading
// update instance with current component value
if (_this.instance.getData() !== _this.value) {
_this.instance.setData(_this.value);
}
// send the evt to the EventEmitter
_this.ready.emit(evt);
});
// CKEditor change event
this.instance.on('change', function (evt) {
_this.onTouched();
var value = _this.instance.getData();
if (_this.value !== value) {
// Debounce update
if (_this.debounce) {
if (_this.debounceTimeout)
clearTimeout(_this.debounceTimeout);
_this.debounceTimeout = setTimeout(function () {
_this.updateValue(value);
_this.debounceTimeout = null;
}, parseInt(_this.debounce));
// Live update
}
else {
_this.updateValue(value);
}
}
// Original ckeditor event dispatch
_this.editorChange.emit(evt);
});
// CKEditor blur event
this.instance.on('blur', function (evt) {
_this.blur.emit(evt);
});
// CKEditor focus event
this.instance.on('focus', function (evt) {
_this.focus.emit(evt);
});
// CKEditor contentDom event
this.instance.on('contentDom', function (evt) {
_this.contentDom.emit(evt);
});
// CKEditor fileUploadRequest event
this.instance.on('fileUploadRequest', function (evt) {
_this.fileUploadRequest.emit(evt);
});
// CKEditor fileUploadResponse event
this.instance.on('fileUploadResponse', function (evt) {
_this.fileUploadResponse.emit(evt);
});
// CKEditor paste event
this.instance.on('paste', function (evt) {
_this.paste.emit(evt);
});
// CKEditor drop event
this.instance.on('drop', function (evt) {
_this.drop.emit(evt);
});
// Add Toolbar Groups to Editor. This will also add Buttons within groups.
this.toolbarGroups.forEach(function (group) {
group.initialize(_this);
});
// Add Toolbar Buttons to Editor.
this.toolbarButtons.forEach(function (button) {
button.initialize(_this);
});
}
};
/**
* Implements ControlValueAccessor
*/
CKEditorComponent.prototype.writeValue = function (value) {
this._value = value;
if (this.instance)
this.instance.setData(value);
};
CKEditorComponent.prototype.onChange = function (_) { };
CKEditorComponent.prototype.onTouched = function () { };
CKEditorComponent.prototype.registerOnChange = function (fn) {
this.onChange = fn;
};
CKEditorComponent.prototype.registerOnTouched = function (fn) {
this.onTouched = fn;
};
CKEditorComponent.prototype.documentContains = function (node) {
return document.contains ? document.contains(node) : document.body.contains(node);
};
var CKEditorComponent_1;
CKEditorComponent.ctorParameters = function () { return [
{ type: NgZone }
]; };
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "config", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Boolean)
], CKEditorComponent.prototype, "readonly", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", String)
], CKEditorComponent.prototype, "debounce", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "change", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "editorChange", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "ready", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "blur", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "focus", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "contentDom", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "fileUploadRequest", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "fileUploadResponse", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "paste", void 0);
tslib_1.__decorate([
Output(),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "drop", void 0);
tslib_1.__decorate([
ViewChild('host', { static: false }),
tslib_1.__metadata("design:type", Object)
], CKEditorComponent.prototype, "host", void 0);
tslib_1.__decorate([
ContentChildren(CKButtonDirective),
tslib_1.__metadata("design:type", QueryList)
], CKEditorComponent.prototype, "toolbarButtons", void 0);
tslib_1.__decorate([
ContentChildren(CKGroupDirective),
tslib_1.__metadata("design:type", QueryList)
], CKEditorComponent.prototype, "toolbarGroups", void 0);
tslib_1.__decorate([
Input(),
tslib_1.__metadata("design:type", Object),
tslib_1.__metadata("design:paramtypes", [Object])
], CKEditorComponent.prototype, "value", null);
CKEditorComponent = CKEditorComponent_1 = tslib_1.__decorate([
Component({
selector: 'ckeditor',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return CKEditorComponent_1; }),
multi: true,
},
],
template: "\n \n "
}),
tslib_1.__metadata("design:paramtypes", [NgZone])
], CKEditorComponent);
return CKEditorComponent;
}());
export { CKEditorComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2tlZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcyLWNrZWRpdG9yLyIsInNvdXJjZXMiOlsiY2tlZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1QsYUFBYSxFQUNiLGVBQWUsRUFDZixhQUFhLEVBQ2IsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBSXZEOzs7O0dBSUc7QUFjSDtJQXlCRTs7T0FFRztJQUNILDJCQUFvQixJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQXZCdEIsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDNUIsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2xDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzNCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2hDLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsdUJBQWtCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN4QyxVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQU9wQyxXQUFNLEdBQUcsRUFBRSxDQUFDO0lB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RUFBRTs7dURBQW1CO0lBQ2xCO1FBQVIsS0FBSyxFQUFFOzt1REFBa0I7SUFFaEI7UUFBVCxNQUFNLEVBQUU7O3FEQUE2QjtJQUM1QjtRQUFULE1BQU0sRUFBRTs7MkRBQW1DO0lBQ2xDO1FBQVQsTUFBTSxFQUFFOztvREFBNEI7SUFDM0I7UUFBVCxNQUFNLEVBQUU7O21EQUEyQjtJQUMxQjtRQUFULE1BQU0sRUFBRTs7b0RBQTRCO0lBQzNCO1FBQVQsTUFBTSxFQUFFOzt5REFBaUM7SUFDaEM7UUFBVCxNQUFNLEVBQUU7O2dFQUF3QztJQUN2QztRQUFULE1BQU0sRUFBRTs7aUVBQXlDO0lBQ3hDO1FBQVQsTUFBTSxFQUFFOztvREFBNEI7SUFDM0I7UUFBVCxNQUFNLEVBQUU7O21EQUEyQjtJQUVFO1FBQXJDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O21EQUFXO0lBRVo7UUFBbkMsZUFBZSxDQUFDLGlCQUFpQixDQUFDOzBDQUFpQixTQUFTOzZEQUFvQjtJQUM5QztRQUFsQyxlQUFlLENBQUMsZ0JBQWdCLENBQUM7MENBQWdCLFNBQVM7NERBQW1CO0lBZTlFO1FBREMsS0FBSyxFQUFFOzs7a0RBTVA7SUF2Q1UsaUJBQWlCO1FBYjdCLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFNBQVMsRUFBRTtnQkFDVDtvQkFDRSxPQUFPLEVBQUUsaUJBQWlCO29CQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLGNBQU0sT0FBQSxtQkFBaUIsRUFBakIsQ0FBaUIsQ0FBQztvQkFDaEQsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjtZQUNELFFBQVEsRUFBRSx1Q0FFVDtTQUNGLENBQUM7aURBNkIwQixNQUFNO09BNUJyQixpQkFBaUIsQ0FpTjdCO0lBQUQsd0JBQUM7Q0FBQSxBQWpORCxJQWlOQztTQWpOWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBOZ1pvbmUsXG4gIGZvcndhcmRSZWYsXG4gIFF1ZXJ5TGlzdCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBPbkNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDS0J1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4vY2tidXR0b24uZGlyZWN0aXZlJztcbmltcG9ydCB7IENLR3JvdXBEaXJlY3RpdmUgfSBmcm9tICcuL2NrZ3JvdXAuZGlyZWN0aXZlJztcblxuZGVjbGFyZSB2YXIgQ0tFRElUT1I6IGFueTtcblxuLyoqXG4gKiBDS0VkaXRvciBjb21wb25lbnRcbiAqIFVzYWdlIDpcbiAqICA8Y2tlZGl0b3IgWyhuZ01vZGVsKV09XCJkYXRhXCIgW2NvbmZpZ109XCJ7Li4ufVwiIGRlYm91bmNlPVwiNTAwXCI+PC9ja2VkaXRvcj5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2tlZGl0b3InLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENLRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRleHRhcmVhICNob3N0PjwvdGV4dGFyZWE+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIENLRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgY29uZmlnOiBhbnk7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuO1xuICBASW5wdXQoKSBkZWJvdW5jZTogc3RyaW5nO1xuXG4gIEBPdXRwdXQoKSBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBlZGl0b3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSByZWFkeSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmb2N1cyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGNvbnRlbnREb20gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBmaWxlVXBsb2FkUmVxdWVzdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIGZpbGVVcGxvYWRSZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgZHJvcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdob3N0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGhvc3Q6IGFueTtcblxuICBAQ29udGVudENoaWxkcmVuKENLQnV0dG9uRGlyZWN0aXZlKSB0b29sYmFyQnV0dG9uczogUXVlcnlMaXN0PENLQnV0dG9uRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihDS0dyb3VwRGlyZWN0aXZlKSB0b29sYmFyR3JvdXBzOiBRdWVyeUxpc3Q8Q0tHcm91cERpcmVjdGl2ZT47XG5cbiAgX3ZhbHVlID0gJyc7XG4gIGluc3RhbmNlOiBhbnk7XG4gIGRlYm91bmNlVGltZW91dDogYW55O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHt9XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5yZWFkb25seSAmJiB0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlLnNldFJlYWRPbmx5KGNoYW5nZXMucmVhZG9ubHkuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IGRlc3Ryb3lcbiAgICovXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XG4gICAgICB0aGlzLmluc3RhbmNlLnJlbW92ZUFsbExpc3RlbmVycygpO1xuICAgICAgQ0tFRElUT1IuaW5zdGFuY2VzW3RoaXMuaW5zdGFuY2UubmFtZV0uZGVzdHJveSgpO1xuICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IHZpZXcgaW5pdFxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY2tlZGl0b3JJbml0KHRoaXMuY29uZmlnIHx8IHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgdmlldyBjaGVja2VkXG4gICAqL1xuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgdGhpcy5ja2VkaXRvckluaXQodGhpcy5jb25maWcgfHwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbHVlIHVwZGF0ZSBwcm9jZXNzXG4gICAqL1xuICB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG5cbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuXG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ0tFZGl0b3IgaW5pdFxuICAgKi9cbiAgY2tlZGl0b3JJbml0KGNvbmZpZzogYW55KSB7XG4gICAgaWYgKHR5cGVvZiBDS0VESVRPUiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ0tFZGl0b3IgNC54IGlzIG1pc3NpbmcgKGh0dHA6Ly9ja2VkaXRvci5jb20vKScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayB0ZXh0YXJlYSBleGlzdHNcbiAgICAgIGlmICh0aGlzLmluc3RhbmNlIHx8ICF0aGlzLmRvY3VtZW50Q29udGFpbnModGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgY29uZmlnLnJlYWRPbmx5ID0gdGhpcy5yZWFkb25seTtcbiAgICAgIH1cbiAgICAgIC8vIENLRWRpdG9yIHJlcGxhY2UgdGV4dGFyZWFcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSBDS0VESVRPUi5yZXBsYWNlKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB2YWx1ZVxuICAgICAgdGhpcy5pbnN0YW5jZS5zZXREYXRhKHRoaXMudmFsdWUpO1xuXG4gICAgICAvLyBsaXN0ZW4gZm9yIGluc3RhbmNlUmVhZHkgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ2luc3RhbmNlUmVhZHknLCAoZXZ0OiBhbnkpID0+IHtcbiAgICAgICAgLy8gaWYgdmFsdWUgaGFzIGNoYW5nZWQgd2hpbGUgaW5zdGFuY2UgbG9hZGluZ1xuICAgICAgICAvLyB1cGRhdGUgaW5zdGFuY2Ugd2l0aCBjdXJyZW50IGNvbXBvbmVudCB2YWx1ZVxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZS5nZXREYXRhKCkgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlLnNldERhdGEodGhpcy52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzZW5kIHRoZSBldnQgdG8gdGhlIEV2ZW50RW1pdHRlclxuICAgICAgICB0aGlzLnJlYWR5LmVtaXQoZXZ0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDS0VkaXRvciBjaGFuZ2UgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ2NoYW5nZScsIChldnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmluc3RhbmNlLmdldERhdGEoKTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAvLyBEZWJvdW5jZSB1cGRhdGVcbiAgICAgICAgICBpZiAodGhpcy5kZWJvdW5jZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVib3VuY2VUaW1lb3V0KSBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZVRpbWVvdXQpO1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuZGVib3VuY2VUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgICAgIH0sIHBhcnNlSW50KHRoaXMuZGVib3VuY2UpKTtcblxuICAgICAgICAgICAgLy8gTGl2ZSB1cGRhdGVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3JpZ2luYWwgY2tlZGl0b3IgZXZlbnQgZGlzcGF0Y2hcbiAgICAgICAgdGhpcy5lZGl0b3JDaGFuZ2UuZW1pdChldnQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENLRWRpdG9yIGJsdXIgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ2JsdXInLCAoZXZ0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQoZXZ0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDS0VkaXRvciBmb2N1cyBldmVudFxuICAgICAgdGhpcy5pbnN0YW5jZS5vbignZm9jdXMnLCAoZXZ0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1cy5lbWl0KGV2dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ0tFZGl0b3IgY29udGVudERvbSBldmVudFxuICAgICAgdGhpcy5pbnN0YW5jZS5vbignY29udGVudERvbScsIChldnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRlbnREb20uZW1pdChldnQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENLRWRpdG9yIGZpbGVVcGxvYWRSZXF1ZXN0IGV2ZW50XG4gICAgICB0aGlzLmluc3RhbmNlLm9uKCdmaWxlVXBsb2FkUmVxdWVzdCcsIChldnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRSZXF1ZXN0LmVtaXQoZXZ0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDS0VkaXRvciBmaWxlVXBsb2FkUmVzcG9uc2UgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ2ZpbGVVcGxvYWRSZXNwb25zZScsIChldnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZpbGVVcGxvYWRSZXNwb25zZS5lbWl0KGV2dCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQ0tFZGl0b3IgcGFzdGUgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ3Bhc3RlJywgKGV2dDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucGFzdGUuZW1pdChldnQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENLRWRpdG9yIGRyb3AgZXZlbnRcbiAgICAgIHRoaXMuaW5zdGFuY2Uub24oJ2Ryb3AnLCAoZXZ0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5kcm9wLmVtaXQoZXZ0KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgVG9vbGJhciBHcm91cHMgdG8gRWRpdG9yLiBUaGlzIHdpbGwgYWxzbyBhZGQgQnV0dG9ucyB3aXRoaW4gZ3JvdXBzLlxuICAgICAgdGhpcy50b29sYmFyR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5pbml0aWFsaXplKHRoaXMpO1xuICAgICAgfSk7XG4gICAgICAvLyBBZGQgVG9vbGJhciBCdXR0b25zIHRvIEVkaXRvci5cbiAgICAgIHRoaXMudG9vbGJhckJ1dHRvbnMuZm9yRWFjaChidXR0b24gPT4ge1xuICAgICAgICBidXR0b24uaW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmluc3RhbmNlKSB0aGlzLmluc3RhbmNlLnNldERhdGEodmFsdWUpO1xuICB9XG4gIG9uQ2hhbmdlKF86IGFueSkge31cbiAgb25Ub3VjaGVkKCkge31cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBkb2N1bWVudENvbnRhaW5zKG5vZGU6IE5vZGUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY29udGFpbnMgPyBkb2N1bWVudC5jb250YWlucyhub2RlKSA6IGRvY3VtZW50LmJvZHkuY29udGFpbnMobm9kZSk7XG4gIH1cbn1cbiJdfQ==