UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

314 lines (313 loc) 35.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, ViewContainerRef, Input, NgZone } from '@angular/core'; import { AbstractHasOptions } from '../share/AbstractHasOptions'; import { Option } from '../decorator/decorators'; const /** @type {?} */ DEFAULT_FORMAT = 'application/json'; const /** @type {?} */ DEFAULT_ALWAYS_FIRE_EVENT = false; const /** @type {?} */ DEFAULT_AUTO_ADD_CLASS = true; const /** @type {?} */ CLASS_NAME_DRAGGING = 'dragging'; export class Draggable extends AbstractHasOptions { /** * @param {?} elRef * @param {?} viewConRef * @param {?} ngZone */ constructor(elRef, viewConRef, ngZone) { super(); this.elementRef = elRef; if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { // Auto add "draggable" html attr into dom $(this.elementRef.nativeElement).attr('draggable', 'true'); } // Resolve component instance try { this.component = (/** @type {?} */ (viewConRef))._data.componentView.component; } catch (/** @type {?} */ error) { } // Add drag event listeners ngZone.runOutsideAngular(() => { this.bindEvents(); }); } /** * @return {?} */ bindEvents() { if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).on('dragstart', (event) => { this.onDragStart.call(this, event.originalEvent); }); $(this.elementRef.nativeElement).on('dragend', (event) => { this.onDragEnd.call(this, event.originalEvent); }); $(this.elementRef.nativeElement).on('drag', (event) => { this.onDrag.call(this, event.originalEvent); }); } } /** * @return {?} */ ngOnInit() { if (this.format === null || typeof this.format !== 'string') { this.format = DEFAULT_FORMAT; } if (this.component === null || typeof this.component === 'undefined') { // Try to resolve "component" from @Input() options; if (this.options !== null && typeof this.options !== 'undefined') { // Test that it is a component instance if (typeof this.options.getDragStartDataTransfer === 'function') { this.component = this.options; } } } if (this.alwaysFireEvent === null || typeof this.alwaysFireEvent === 'undefined') { this.alwaysFireEvent = DEFAULT_ALWAYS_FIRE_EVENT; } if (this.autoAddClass === null || typeof this.autoAddClass === 'undefined') { this.autoAddClass = DEFAULT_AUTO_ADD_CLASS; } } /** * @param {?} event * @return {?} */ isDraggable(event) { if (this.component === null || typeof this.component === 'undefined') { return true; } if (typeof this.component.isDraggable !== 'function') { return true; } return this.component.isDraggable(event); } /** * @param {?} className * @return {?} */ addStyleClass(className) { if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).addClass(className); } if (this.component !== null && typeof this.component !== 'undefined' && this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') { $(this.component.elementRef.nativeElement).addClass(className); } } /** * @param {?} className * @return {?} */ removeStyleClass(className) { if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).removeClass(className); } if (this.component !== null && typeof this.component !== 'undefined' && this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') { $(this.component.elementRef.nativeElement).removeClass(className); } } /** * @param {?} event * @return {?} */ onDragStart(event) { if (this.component === null || typeof this.component === 'undefined') { return; } let /** @type {?} */ draggable = this.isDraggable(event); if (!draggable) { if (event !== null && typeof event !== 'undefined') { event.preventDefault(); } if (!this.alwaysFireEvent) { return; } } if (event !== null && typeof event !== 'undefined') { if (typeof this.component.getDragStartDataTransfer === 'function') { // Auto set data transfer properties if getDragStartDataTransfer() is available. let /** @type {?} */ dataTransfer = this.component.getDragStartDataTransfer(event); if (dataTransfer !== null && typeof dataTransfer !== 'undefined') { // We're not going to set "dropEffect" here since it should be // set in "dragover" event. // Set dataTransfer.effectAllowed if (typeof dataTransfer.effectAllowed === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.effectAllowed = dataTransfer.effectAllowed(event); } else if (typeof dataTransfer.effectAllowed !== 'undefined') { event.dataTransfer.effectAllowed = dataTransfer.effectAllowed; } // Set dataTransfer.files if (typeof dataTransfer.files === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.files = dataTransfer.files(event); } else if (typeof dataTransfer.files !== 'undefined') { event.dataTransfer.files = dataTransfer.files; } // Set dataTransfer.image if (typeof dataTransfer.image === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.setDragImage(dataTransfer.image(event), 0, 0); } else if (typeof dataTransfer.image !== 'undefined') { event.dataTransfer.setDragImage(dataTransfer.image, 0, 0); } let /** @type {?} */ format = this.format; if (typeof dataTransfer.format === 'function') { // Auto resolve value from function's returned value if it is a function. format = dataTransfer.format(event); } else if (typeof dataTransfer.format !== 'undefined') { format = dataTransfer.format; } if (format === null || typeof format === 'undefined') { format = DEFAULT_FORMAT; } let /** @type {?} */ data = null; if (typeof dataTransfer.data === 'function') { // Auto resolve value from function's returned value if it is a function. data = dataTransfer.data(event); } else if (typeof dataTransfer.data !== 'undefined') { data = dataTransfer.data; } if (format.toLowerCase() === 'application/json') { // Auto serialize data into json if it is not json string. try { JSON.parse(data); } catch (/** @type {?} */ e) { // The given "data" is not json string try { data = JSON.stringify(data); } catch (/** @type {?} */ e) { // The data cannot be parsed to json string data = null; } } } if ((format !== null && typeof format !== 'undefined') || (data !== null && typeof data !== 'undefined')) { event.dataTransfer.setData(format, data); } } } } if (this.autoAddClass) { this.addStyleClass(CLASS_NAME_DRAGGING); } if (typeof this.component.onDragStart === 'function') { this.component.onDragStart(event); } } /** * @param {?} event * @return {?} */ onDragEnd(event) { if (this.component === null || typeof this.component === 'undefined') { return; } if (this.autoAddClass) { this.removeStyleClass(CLASS_NAME_DRAGGING); } if (typeof this.component.onDragEnd === 'function') { if (this.alwaysFireEvent || this.isDraggable(event)) { this.component.onDragEnd(event); } } } /** * @param {?} event * @return {?} */ onDrag(event) { if (this.component === null || typeof this.component === 'undefined') { return; } if (typeof this.component.onDrag === 'function') { if (this.alwaysFireEvent || this.isDraggable(event)) { this.component.onDrag(event); } } } } Draggable.DEFAULT_FORMAT = DEFAULT_FORMAT; Draggable.CLASS_NAME_DRAGGING = CLASS_NAME_DRAGGING; Draggable.DEFAULT_ALWAYS_FIRE_EVENT = DEFAULT_ALWAYS_FIRE_EVENT; Draggable.DEFAULT_AUTO_ADD_CLASS = DEFAULT_AUTO_ADD_CLASS; Draggable.decorators = [ { type: Directive, args: [{ selector: '[phxDraggable]' },] }, ]; /** @nocollapse */ Draggable.ctorParameters = () => [ { type: ElementRef, }, { type: ViewContainerRef, }, { type: NgZone, }, ]; Draggable.propDecorators = { "options": [{ type: Input, args: ['phxDraggable',] },], "format": [{ type: Input, args: ['dragFormat',] },], "component": [{ type: Input, args: ['dragTarget',] },], "alwaysFireEvent": [{ type: Input, args: ['dragFireEvent',] },], "autoAddClass": [{ type: Input, args: ['dragAddClass',] },], }; tslib_1.__decorate([ Option('format'), tslib_1.__metadata("design:type", String) ], Draggable.prototype, "format", void 0); tslib_1.__decorate([ Option('target'), tslib_1.__metadata("design:type", Object) ], Draggable.prototype, "component", void 0); tslib_1.__decorate([ Option('fireEvent'), tslib_1.__metadata("design:type", Boolean) ], Draggable.prototype, "alwaysFireEvent", void 0); tslib_1.__decorate([ Option('addClass'), tslib_1.__metadata("design:type", Boolean) ], Draggable.prototype, "autoAddClass", void 0); function Draggable_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ Draggable.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ Draggable.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ Draggable.propDecorators; /** @type {?} */ Draggable.DEFAULT_FORMAT; /** @type {?} */ Draggable.CLASS_NAME_DRAGGING; /** @type {?} */ Draggable.DEFAULT_ALWAYS_FIRE_EVENT; /** @type {?} */ Draggable.DEFAULT_AUTO_ADD_CLASS; /** @type {?} */ Draggable.prototype.options; /** @type {?} */ Draggable.prototype.format; /** @type {?} */ Draggable.prototype.component; /** @type {?} */ Draggable.prototype.alwaysFireEvent; /** @type {?} */ Draggable.prototype.autoAddClass; /** @type {?} */ Draggable.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZS9EcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUlqRCx1QkFBTSxjQUFjLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQsdUJBQU0seUJBQXlCLEdBQVksS0FBSyxDQUFDO0FBQ2pELHVCQUFNLHNCQUFzQixHQUFZLElBQUksQ0FBQztBQUM3Qyx1QkFBTSxtQkFBbUIsR0FBVyxVQUFVLENBQUM7QUFPL0MsTUFBTSxnQkFBaUIsU0FBUSxrQkFBa0I7Ozs7OztJQTRCL0MsWUFBWSxLQUFpQixFQUFFLFVBQTRCLEVBQUUsTUFBYztRQUN6RSxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDOztZQUV2RSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzVEOztRQUdELElBQUksQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsbUJBQU0sVUFBVSxFQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7U0FDbEU7UUFBQyxLQUFLLENBQUMsQ0FB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bWVudFJlZiwgVmlld0NvbnRhaW5lclJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0SGFzT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0SGFzT3B0aW9ucyc7XG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcblxuaW1wb3J0IHsgRHJhZ0RhdGFUcmFuc2ZlciB9IGZyb20gJy4uL2NvbXBvbmVudC9tb2RlbC9tb2RlbHMnO1xuXG5jb25zdCBERUZBVUxUX0ZPUk1BVDogc3RyaW5nID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuY29uc3QgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IHRydWU7XG5jb25zdCBDTEFTU19OQU1FX0RSQUdHSU5HOiBzdHJpbmcgPSAnZHJhZ2dpbmcnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twaHhEcmFnZ2FibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGUgZXh0ZW5kcyBBYnN0cmFjdEhhc09wdGlvbnMgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVQ6IHN0cmluZyA9IERFRkFVTFRfRk9STUFUO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENMQVNTX05BTUVfRFJBR0dJTkc6IHN0cmluZyA9IENMQVNTX05BTUVfRFJBR0dJTkc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IERFRkFVTFRfQUxXQVlTX0ZJUkVfRVZFTlQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IERFRkFVTFRfQVVUT19BRERfQ0xBU1M7XG5cbiAgQElucHV0KCdwaHhEcmFnZ2FibGUnKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuXG4gIEBJbnB1dCgnZHJhZ0Zvcm1hdCcpXG4gIEBPcHRpb24oJ2Zvcm1hdCcpXG4gIHByaXZhdGUgZm9ybWF0OiBzdHJpbmc7XG5cbiAgQElucHV0KCdkcmFnVGFyZ2V0JylcbiAgQE9wdGlvbigndGFyZ2V0JylcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IGFueTtcblxuICBASW5wdXQoJ2RyYWdGaXJlRXZlbnQnKVxuICBAT3B0aW9uKCdmaXJlRXZlbnQnKVxuICBwcml2YXRlIGFsd2F5c0ZpcmVFdmVudDogYm9vbGVhbjtcblxuICBASW5wdXQoJ2RyYWdBZGRDbGFzcycpXG4gIEBPcHRpb24oJ2FkZENsYXNzJylcbiAgcHJpdmF0ZSBhdXRvQWRkQ2xhc3M6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKGVsUmVmOiBFbGVtZW50UmVmLCB2aWV3Q29uUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbFJlZjtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBdXRvIGFkZCBcImRyYWdnYWJsZVwiIGh0bWwgYXR0ciBpbnRvIGRvbVxuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYXR0cignZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbXBvbmVudCA9ICg8YW55PnZpZXdDb25SZWYpLl9kYXRhLmNvbXBvbmVudFZpZXcuY29tcG9uZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuXG4gICAgLy8gQWRkIGRyYWcgZXZlbnQgbGlzdGVuZXJzXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnc3RhcnQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0LmNhbGwodGhpcywgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICB9KTtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQuY2FsbCh0aGlzLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub24oJ2RyYWcnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZy5jYWxsKHRoaXMsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5mb3JtYXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuY29tcG9uZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgXCJjb21wb25lbnRcIiBmcm9tIEBJbnB1dCgpIG9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFRlc3QgdGhhdCBpdCBpcyBhIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5nZXREcmFnU3RhcnREYXRhVHJhbnNmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hbHdheXNGaXJlRXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYWx3YXlzRmlyZUV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hbHdheXNGaXJlRXZlbnQgPSBERUZBVUxUX0FMV0FZU19GSVJFX0VWRU5UO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQWRkQ2xhc3MgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYXV0b0FkZENsYXNzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hdXRvQWRkQ2xhc3MgPSBERUZBVUxUX0FVVE9fQUREX0NMQVNTO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5pc0RyYWdnYWJsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmlzRHJhZ2dhYmxlKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3R5bGVDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb25lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVN0eWxlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhjbGFzc05hbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgJCh0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZHJhZ2dhYmxlOiBib29sZWFuID0gdGhpcy5pc0RyYWdnYWJsZShldmVudCk7XG4gICAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5hbHdheXNGaXJlRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50LmdldERyYWdTdGFydERhdGFUcmFuc2ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBBdXRvIHNldCBkYXRhIHRyYW5zZmVyIHByb3BlcnRpZXMgaWYgZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKCkgaXMgYXZhaWxhYmxlLlxuICAgICAgICBsZXQgZGF0YVRyYW5zZmVyOiBEcmFnRGF0YVRyYW5zZmVyID0gdGhpcy5jb21wb25lbnQuZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKGV2ZW50KTtcblxuICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICE9PSBudWxsICYmIHR5cGVvZiBkYXRhVHJhbnNmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHNldCBcImRyb3BFZmZlY3RcIiBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZVxuICAgICAgICAgIC8vIHNldCBpbiBcImRyYWdvdmVyXCIgZXZlbnQuXG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWRcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkKGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGRhdGFUcmFuc2Zlci5maWxlc1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZpbGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXMoZXZlbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5maWxlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyA9IGRhdGFUcmFuc2Zlci5maWxlcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmltYWdlXG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuaW1hZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZGF0YVRyYW5zZmVyLmltYWdlKGV2ZW50KSwgMCwgMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShkYXRhVHJhbnNmZXIuaW1hZ2UsIDAsIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IHRoaXMuZm9ybWF0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIHZhbHVlIGZyb20gZnVuY3Rpb24ncyByZXR1cm5lZCB2YWx1ZSBpZiBpdCBpcyBhIGZ1bmN0aW9uLlxuICAgICAgICAgICAgZm9ybWF0ID0gZGF0YVRyYW5zZmVyLmZvcm1hdChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGRhdGFUcmFuc2Zlci5mb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQgPT09IG51bGwgfHwgdHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhVHJhbnNmZXIuZGF0YShldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YVRyYW5zZmVyLmRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHNlcmlhbGl6ZSBkYXRhIGludG8ganNvbiBpZiBpdCBpcyBub3QganNvbiBzdHJpbmcuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBnaXZlbiBcImRhdGFcIiBpcyBub3QganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQgdG8ganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgICBkYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZm9ybWF0ICE9PSBudWxsICYmIHR5cGVvZiBmb3JtYXQgIT09ICd1bmRlZmluZWQnKSB8fFxuICAgICAgICAgICAgICAoZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShmb3JtYXQsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dG9BZGRDbGFzcykge1xuICAgICAgdGhpcy5hZGRTdHlsZUNsYXNzKENMQVNTX05BTUVfRFJBR0dJTkcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb25lbnQub25EcmFnU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZ1N0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBASG9zdExpc3RlbmVyKCdkcmFnZW5kJywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdFbmQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0b0FkZENsYXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZVN0eWxlQ2xhc3MoQ0xBU1NfTkFNRV9EUkFHR0lORyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh0aGlzLmFsd2F5c0ZpcmVFdmVudCB8fCB0aGlzLmlzRHJhZ2dhYmxlKGV2ZW50KSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RyYWcnLCBbJyRldmVudCddKVxuICBwcml2YXRlIG9uRHJhZyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50Lm9uRHJhZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRoaXMuYWx3YXlzRmlyZUV2ZW50IHx8IHRoaXMuaXNEcmFnZ2FibGUoZXZlbnQpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZyhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=