com.phloxui
Version:
PhloxUI Ng2+ Framework
644 lines (643 loc) • 68 kB
JavaScript
/**
* @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';
var /** @type {?} */ DEFAULT_ACCEPT = '*';
var /** @type {?} */ DEFAULT_ALWAYS_FIRE_EVENT = false;
var /** @type {?} */ DEFAULT_AUTO_ADD_CLASS = true;
var /** @type {?} */ DEFAULT_DRAG_OVER_TIMEOUT = 10;
var /** @type {?} */ DEFAULT_DRAG_LEAVE_TIMEOUT = 10;
var /** @type {?} */ DEFAULT_DROP_CLASS_RESET_TIMEOUT = 400;
var /** @type {?} */ CLASS_NAME_DRAG_OVER = 'drag-over';
var /** @type {?} */ CLASS_NAME_DROP_ACCEPTED = 'drop-accepted';
var /** @type {?} */ CLASS_NAME_DROP_REJECTED = 'drop-rejected';
var Droppable = /** @class */ (function (_super) {
tslib_1.__extends(Droppable, _super);
function Droppable(elRef, viewConRef, ngZone) {
var _this = _super.call(this) || this;
_this.elementRef = elRef;
// Resolve component instance
try {
_this.component = (/** @type {?} */ (viewConRef))._data.componentView.component;
}
catch (/** @type {?} */ error) {
}
// Add drag event listeners
ngZone.runOutsideAngular(function () {
_this.bindEvents();
});
return _this;
}
/**
* @param {?} event
* @return {?}
*/
Droppable.getParsedData = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event === null || typeof event === 'undefined') {
return null;
}
if (event.dataTransfer === null || typeof event.dataTransfer === 'undefined') {
return null;
}
if (event.dataTransfer.types === null || !Array.isArray(event.dataTransfer.types)) {
return null;
}
var /** @type {?} */ result = [];
try {
for (var _a = tslib_1.__values(event.dataTransfer.types), _b = _a.next(); !_b.done; _b = _a.next()) {
var format = _b.value;
result.push(Droppable.parseData(format, event.dataTransfer.getData(format)));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
}
finally { if (e_1) throw e_1.error; }
}
if (result.length <= 0) {
return null;
}
else if (result.length === 1) {
return result[0];
}
return result;
var e_1, _c;
};
/**
* @param {?} format
* @param {?} eventData
* @return {?}
*/
Droppable.parseData = /**
* @param {?} format
* @param {?} eventData
* @return {?}
*/
function (format, eventData) {
if (format === null || typeof format !== 'string') {
return null;
}
var /** @type {?} */ result = eventData;
if (format.toLowerCase() === 'application/json') {
try {
result = JSON.parse(eventData);
}
catch (/** @type {?} */ e) {
}
}
return result;
};
/**
* @param {?} event
* @param {?} acceptFormats
* @param {?} target
* @param {?=} checkData
* @return {?}
*/
Droppable.isAccept = /**
* @param {?} event
* @param {?} acceptFormats
* @param {?} target
* @param {?=} checkData
* @return {?}
*/
function (event, acceptFormats, target, checkData) {
if (checkData === void 0) { checkData = true; }
var /** @type {?} */ accept = [];
if (Array.isArray(acceptFormats)) {
try {
for (var acceptFormats_1 = tslib_1.__values(acceptFormats), acceptFormats_1_1 = acceptFormats_1.next(); !acceptFormats_1_1.done; acceptFormats_1_1 = acceptFormats_1.next()) {
var format = acceptFormats_1_1.value;
if (format === null || typeof format !== 'string') {
continue;
}
accept.push(format.toLowerCase());
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (acceptFormats_1_1 && !acceptFormats_1_1.done && (_a = acceptFormats_1.return)) _a.call(acceptFormats_1);
}
finally { if (e_2) throw e_2.error; }
}
}
else if (typeof acceptFormats === 'string') {
accept.push(acceptFormats.toLowerCase());
}
var /** @type {?} */ acceptFormat = false;
try {
// If there is "any" (*) format, accept immediately.
for (var accept_1 = tslib_1.__values(accept), accept_1_1 = accept_1.next(); !accept_1_1.done; accept_1_1 = accept_1.next()) {
var format = accept_1_1.value;
if (format === '*') {
acceptFormat = true;
break;
}
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (accept_1_1 && !accept_1_1.done && (_b = accept_1.return)) _b.call(accept_1);
}
finally { if (e_3) throw e_3.error; }
}
// Check that the event.dataTransfer has accepted data format or not.
if (!acceptFormat) {
if (event !== null && typeof event !== 'undefined' && event.dataTransfer !== null && typeof event.dataTransfer !== 'undefined') {
if (Array.isArray(event.dataTransfer.types) && event.dataTransfer.types.length > 0) {
try {
for (var _c = tslib_1.__values(event.dataTransfer.types), _d = _c.next(); !_d.done; _d = _c.next()) {
var dataFormat = _d.value;
if (dataFormat === null || typeof dataFormat !== 'string') {
continue;
}
if (accept.indexOf(dataFormat.toLowerCase()) >= 0) {
acceptFormat = true;
break;
}
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (_d && !_d.done && (_e = _c.return)) _e.call(_c);
}
finally { if (e_4) throw e_4.error; }
}
}
else {
// If there is no data specified in dataTransfer, always accept it in this step.
// (We'll test it in isAcceptDragData(event, null, null) below)
acceptFormat = true;
}
}
}
if (!acceptFormat) {
return false;
}
if ((event !== null && typeof event !== 'undefined' && event.type !== 'drop') || !checkData) {
// According to browser sepc, the dataTransfer.data is available when 'drop' event
// occurs only (browser security). So, if the event.type is not 'drop', we'll not
// going to check isAcceptDragData(), then, return "true" immediately.
return true;
}
if (target !== null && typeof target !== 'undefined' && typeof target.isAcceptDragData === 'function') {
if (event !== null && typeof event !== 'undefined' && event.dataTransfer !== null && typeof event.dataTransfer !== 'undefined') {
if (Array.isArray(event.dataTransfer.types) && event.dataTransfer.types.length > 0) {
// Check that the component accepts dataTransfer.data or not.
acceptFormat = false;
try {
for (var _f = tslib_1.__values(event.dataTransfer.types), _g = _f.next(); !_g.done; _g = _f.next()) {
var dataFormat = _g.value;
var /** @type {?} */ parsedData = Droppable.parseData(dataFormat, event.dataTransfer.getData(dataFormat));
if (target.isAcceptDragData(event, dataFormat, parsedData)) {
acceptFormat = true;
break;
}
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (_g && !_g.done && (_h = _f.return)) _h.call(_f);
}
finally { if (e_5) throw e_5.error; }
}
return acceptFormat;
}
else {
// There is no "data" specified in dataTransfer.
return target.isAcceptDragData(event, null, null);
}
}
}
// Default value is "false" (not accept).
return false;
var e_2, _a, e_3, _b, e_4, _e, e_5, _h;
};
/**
* @return {?}
*/
Droppable.prototype.bindEvents = /**
* @return {?}
*/
function () {
var _this = this;
if (this.elementRef !== null && typeof this.elementRef !== 'undefined') {
$(this.elementRef.nativeElement).on('dragenter', function (event) {
_this.onDragEnter.call(_this, event.originalEvent);
});
$(this.elementRef.nativeElement).on('dragover', function (event) {
_this.onDragOver.call(_this, event.originalEvent);
});
$(this.elementRef.nativeElement).on('dragleave', function (event) {
_this.onDragLeave.call(_this, event.originalEvent);
});
$(this.elementRef.nativeElement).on('drop', function (event) {
_this.onDrop.call(_this, event.originalEvent);
});
}
};
/**
* @return {?}
*/
Droppable.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.accept === null || (typeof this.accept !== 'string' && !Array.isArray(this.accept))) {
this.accept = DEFAULT_ACCEPT;
}
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.isAcceptDragData === '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;
}
if (this.dragOverTimeout === null || typeof this.dragOverTimeout === 'undefined') {
this.dragOverTimeout = DEFAULT_DRAG_OVER_TIMEOUT;
}
if (this.dragLeaveTimeout === null || typeof this.dragLeaveTimeout === 'undefined') {
this.dragLeaveTimeout = DEFAULT_DRAG_LEAVE_TIMEOUT;
}
if (this.dropClassResetTimeout === null || typeof this.dropClassResetTimeout === 'undefined') {
this.dropClassResetTimeout = DEFAULT_DROP_CLASS_RESET_TIMEOUT;
}
};
/**
* @param {?} className
* @return {?}
*/
Droppable.prototype.addStyleClass = /**
* @param {?} className
* @return {?}
*/
function (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 {?}
*/
Droppable.prototype.removeStyleClass = /**
* @param {?} className
* @return {?}
*/
function (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
* @param {?=} checkData
* @return {?}
*/
Droppable.prototype.isAccept = /**
* @param {?} event
* @param {?=} checkData
* @return {?}
*/
function (event, checkData) {
if (checkData === void 0) { checkData = true; }
return Droppable.isAccept(event, this.accept, this.component, checkData);
};
/**
* @param {?} event
* @return {?}
*/
Droppable.prototype.onDragEnter = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.component === null || typeof this.component === 'undefined') {
return;
}
var /** @type {?} */ accept = this.isAccept(event, true);
if (accept) {
// Call event.preventDefault() to accept dataTransfer (see browser spec for more details).
event.preventDefault();
}
if (typeof this.component.onDragEnter === 'function') {
if (this.alwaysFireEvent || this.isAccept(event, true)) {
this.component.onDragEnter(event);
}
}
};
/**
* @param {?} event
* @return {?}
*/
Droppable.prototype.onDragOver = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.component === null || typeof this.component === 'undefined') {
return;
}
if (this.dragLeaveTimer !== null && typeof this.dragLeaveTimer !== 'undefined') {
clearTimeout(this.dragLeaveTimer);
this.dragLeaveTimer = null;
}
var /** @type {?} */ accept = this.isAccept(event, true);
if (accept) {
// Call event.preventDefault() to accept dataTransfer (see browser spec for more details).
event.preventDefault();
}
if (!this.alwaysFireEvent && !accept) {
return;
}
if (event !== null && typeof event !== 'undefined') {
if (typeof this.component.getDragOverDataTransfer === 'function') {
// Auto set data transfer properties if getDragOverDataTransfer() is available.
var /** @type {?} */ dataTransfer = this.component.getDragOverDataTransfer(event);
if (dataTransfer !== null && typeof dataTransfer !== 'undefined') {
// Set dataTransfer.dropEffect
if (typeof dataTransfer.dropEffect === 'function') {
// Auto resolve value from function's returned value if it is a function.
event.dataTransfer.dropEffect = dataTransfer.dropEffect(event);
}
else if (typeof dataTransfer.dropEffect !== 'undefined') {
event.dataTransfer.dropEffect = dataTransfer.dropEffect;
}
// The other properties in dataTransfer should be set in "dragstart" event.
}
}
}
if (this.dragOverTimer !== null && typeof this.dragOverTimer !== 'undefined') {
// Drag over timer is triggering
return;
}
this.dragOverTimer = setTimeout(function () {
_this.dragOverTimer = null;
if (_this.autoAddClass) {
_this.addStyleClass(CLASS_NAME_DRAG_OVER);
}
if (typeof _this.component.onDragOver === 'function') {
_this.component.onDragOver(event);
}
}, this.dragOverTimeout);
};
/**
* @param {?} event
* @return {?}
*/
Droppable.prototype.onDragLeave = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.component === null || typeof this.component === 'undefined') {
return;
}
if (this.dragOverTimer !== null && typeof this.dragOverTimer !== 'undefined') {
clearTimeout(this.dragOverTimer);
this.dragOverTimer = null;
}
if (this.dragLeaveTimer !== null && typeof this.dragLeaveTimer !== 'undefined') {
return;
}
this.dragLeaveTimer = setTimeout(function () {
_this.dragLeaveTimer = null;
if (_this.autoAddClass) {
_this.removeStyleClass(CLASS_NAME_DRAG_OVER);
}
if (typeof _this.component.onDragLeave === 'function') {
if (_this.alwaysFireEvent || _this.isAccept(event, true)) {
_this.component.onDragLeave(event);
}
}
}, this.dragLeaveTimeout);
};
/**
* @param {?} event
* @return {?}
*/
Droppable.prototype.onDrop = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
if (this.component === null || typeof this.component === 'undefined') {
return;
}
if (this.dragLeaveTimer !== null && typeof this.dragLeaveTimer !== 'undefined') {
clearTimeout(this.dragLeaveTimer);
this.dragLeaveTimer = null;
}
if (this.dragOverTimer !== null && typeof this.dragOverTimer !== 'undefined') {
clearTimeout(this.dragOverTimer);
this.dragOverTimer = null;
}
if (this.autoAddClass) {
this.removeStyleClass(CLASS_NAME_DRAG_OVER);
}
if (typeof this.component.onDrop === 'function') {
if (this.alwaysFireEvent || this.isAccept(event, false)) {
this.component.onDrop(event);
}
}
if (this.isAccept(event, true)) {
if (this.autoAddClass) {
// Add/remove style
this.removeStyleClass(CLASS_NAME_DROP_REJECTED);
this.addStyleClass(CLASS_NAME_DROP_ACCEPTED);
// Clear auto reset timers
if (this.dropAcceptedRemoveClassTimer !== null && typeof this.dropAcceptedRemoveClassTimer !== 'undefined') {
clearTimeout(this.dropAcceptedRemoveClassTimer);
this.dropAcceptedRemoveClassTimer = null;
}
if (this.dropRejectedRemoveClassTimer !== null && typeof this.dropRejectedRemoveClassTimer !== 'undefined') {
clearTimeout(this.dropRejectedRemoveClassTimer);
this.dropRejectedRemoveClassTimer = null;
}
// Set auto reset timer
this.dropAcceptedRemoveClassTimer = setTimeout(function () {
_this.dropAcceptedRemoveClassTimer = null;
_this.removeStyleClass(CLASS_NAME_DROP_ACCEPTED);
}, this.dropClassResetTimeout);
}
// Fire event handler
if (typeof this.component.onDropAccepted === 'function') {
this.component.onDropAccepted(event, Droppable.getParsedData(event));
}
}
else {
if (this.autoAddClass) {
// Add/remove style
this.removeStyleClass(CLASS_NAME_DROP_ACCEPTED);
this.addStyleClass(CLASS_NAME_DROP_REJECTED);
// Clear auto reset timers
if (this.dropAcceptedRemoveClassTimer !== null && typeof this.dropAcceptedRemoveClassTimer !== 'undefined') {
clearTimeout(this.dropAcceptedRemoveClassTimer);
this.dropAcceptedRemoveClassTimer = null;
}
if (this.dropRejectedRemoveClassTimer !== null && typeof this.dropRejectedRemoveClassTimer !== 'undefined') {
clearTimeout(this.dropRejectedRemoveClassTimer);
this.dropRejectedRemoveClassTimer = null;
}
// Set auto reset timer
this.dropRejectedRemoveClassTimer = setTimeout(function () {
_this.dropRejectedRemoveClassTimer = null;
_this.removeStyleClass(CLASS_NAME_DROP_REJECTED);
}, this.dropClassResetTimeout);
}
// Fire event handler
if (typeof this.component.onDropRejected === 'function') {
this.component.onDropRejected(event);
}
}
};
Droppable.DEFAULT_ACCEPT = DEFAULT_ACCEPT;
Droppable.DEFAULT_ALWAYS_FIRE_EVENT = DEFAULT_ALWAYS_FIRE_EVENT;
Droppable.DEFAULT_AUTO_ADD_CLASS = DEFAULT_AUTO_ADD_CLASS;
Droppable.CLASS_NAME_DRAG_OVER = CLASS_NAME_DRAG_OVER;
Droppable.CLASS_NAME_DROP_ACCEPTED = CLASS_NAME_DROP_ACCEPTED;
Droppable.CLASS_NAME_DROP_REJECTED = CLASS_NAME_DROP_REJECTED;
Droppable.DEFAULT_DRAG_OVER_TIMEOUT = DEFAULT_DRAG_OVER_TIMEOUT;
Droppable.DEFAULT_DRAG_LEAVE_TIMEOUT = DEFAULT_DRAG_LEAVE_TIMEOUT;
Droppable.DEFAULT_DROP_CLASS_RESET_TIMEOUT = DEFAULT_DROP_CLASS_RESET_TIMEOUT;
Droppable.decorators = [
{ type: Directive, args: [{
selector: '[phxDroppable]'
},] },
];
/** @nocollapse */
Droppable.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: ViewContainerRef, },
{ type: NgZone, },
]; };
Droppable.propDecorators = {
"options": [{ type: Input, args: ['phxDroppable',] },],
"accept": [{ type: Input, args: ['dropAccept',] },],
"component": [{ type: Input, args: ['dropTarget',] },],
"alwaysFireEvent": [{ type: Input, args: ['dropFireEvent',] },],
"autoAddClass": [{ type: Input, args: ['dropAddClass',] },],
"dragLeaveTimeout": [{ type: Input, args: ['dropDragLeaveTimeout',] },],
"dragOverTimeout": [{ type: Input, args: ['dropDragOverTimeout',] },],
"dropClassResetTimeout": [{ type: Input, args: ['dropClassResetTimeout',] },],
};
tslib_1.__decorate([
Option('accept'),
tslib_1.__metadata("design:type", Object)
], Droppable.prototype, "accept", void 0);
tslib_1.__decorate([
Option('target'),
tslib_1.__metadata("design:type", Object)
], Droppable.prototype, "component", void 0);
tslib_1.__decorate([
Option('fireEvent'),
tslib_1.__metadata("design:type", Boolean)
], Droppable.prototype, "alwaysFireEvent", void 0);
tslib_1.__decorate([
Option('addClass'),
tslib_1.__metadata("design:type", Boolean)
], Droppable.prototype, "autoAddClass", void 0);
tslib_1.__decorate([
Option('dragLeaveTimeout'),
tslib_1.__metadata("design:type", Number)
], Droppable.prototype, "dragLeaveTimeout", void 0);
tslib_1.__decorate([
Option('dragOverTimeout'),
tslib_1.__metadata("design:type", Number)
], Droppable.prototype, "dragOverTimeout", void 0);
tslib_1.__decorate([
Option('dropClassResetTimeout'),
tslib_1.__metadata("design:type", Number)
], Droppable.prototype, "dropClassResetTimeout", void 0);
return Droppable;
}(AbstractHasOptions));
export { Droppable };
function Droppable_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
Droppable.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
Droppable.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
Droppable.propDecorators;
/** @type {?} */
Droppable.DEFAULT_ACCEPT;
/** @type {?} */
Droppable.DEFAULT_ALWAYS_FIRE_EVENT;
/** @type {?} */
Droppable.DEFAULT_AUTO_ADD_CLASS;
/** @type {?} */
Droppable.CLASS_NAME_DRAG_OVER;
/** @type {?} */
Droppable.CLASS_NAME_DROP_ACCEPTED;
/** @type {?} */
Droppable.CLASS_NAME_DROP_REJECTED;
/** @type {?} */
Droppable.DEFAULT_DRAG_OVER_TIMEOUT;
/** @type {?} */
Droppable.DEFAULT_DRAG_LEAVE_TIMEOUT;
/** @type {?} */
Droppable.DEFAULT_DROP_CLASS_RESET_TIMEOUT;
/** @type {?} */
Droppable.prototype.options;
/** @type {?} */
Droppable.prototype.accept;
/** @type {?} */
Droppable.prototype.component;
/** @type {?} */
Droppable.prototype.alwaysFireEvent;
/** @type {?} */
Droppable.prototype.autoAddClass;
/** @type {?} */
Droppable.prototype.dragLeaveTimeout;
/** @type {?} */
Droppable.prototype.dragOverTimeout;
/** @type {?} */
Droppable.prototype.dropClassResetTimeout;
/** @type {?} */
Droppable.prototype.elementRef;
/** @type {?} */
Droppable.prototype.dragOverTimer;
/** @type {?} */
Droppable.prototype.dragLeaveTimer;
/** @type {?} */
Droppable.prototype.dropAcceptedRemoveClassTimer;
/** @type {?} */
Droppable.prototype.dropRejectedRemoveClassTimer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJvcHBhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZS9Ecm9wcGFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQU1qRCxxQkFBTSxjQUFjLEdBQVcsR0FBRyxDQUFDO0FBQ25DLHFCQUFNLHlCQUF5QixHQUFZLEtBQUssQ0FBQztBQUNqRCxxQkFBTSxzQkFBc0IsR0FBWSxJQUFJLENBQUM7QUFDN0MscUJBQU0seUJBQXlCLEdBQVcsRUFBRSxDQUFDO0FBQzdDLHFCQUFNLDBCQUEwQixHQUFXLEVBQUUsQ0FBQztBQUM5QyxxQkFBTSxnQ0FBZ0MsR0FBVyxHQUFHLENBQUM7QUFDckQscUJBQU0sb0JBQW9CLEdBQVcsV0FBVyxDQUFDO0FBQ2pELHFCQUFNLHdCQUF3QixHQUFXLGVBQWUsQ0FBQztBQUN6RCxxQkFBTSx3QkFBd0IsR0FBVyxlQUFlLENBQUM7O0lBTzFCLHFDQUFrQjtJQTRLL0MsbUJBQVksS0FBaUIsRUFBRSxVQUE0QixFQUFFLE1BQWM7UUFBM0UsWUFDRSxpQkFBTyxTQWNSO1FBWkMsS0FBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7O1FBR3hCLElBQUksQ0FBQztZQUNILEtBQUksQ0FBQyxTQUFTLEdBQUcsbUJBQU0sVUFBVSxFQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7U0FDbEU7UUFBQyxLQUFLLENBQUMsQ0FBQyxpQkFBQSxLQUFLLEVBQUUsQ0FBQztTQUNoQjs7UUFHRCxNQUFN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LGtCQUFrQixDQUFDOzs7O1FBSTFCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7OztRQUl6QixNQUFNLENBQUMsdUJBQXVCLENBQUM7OztvQkE1TGxDO0VBeUIrQixrQkFBa0I7U0FBcEMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFZpZXdDb250YWluZXJSZWYsIElucHV0LCBIb3N0TGlzdGVuZXIsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdEhhc09wdGlvbnMgfSBmcm9tICcuLi9zaGFyZS9BYnN0cmFjdEhhc09wdGlvbnMnO1xuXG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi9kZWNvcmF0b3IvZGVjb3JhdG9ycyc7XG5cbmltcG9ydCB7IERyYWdEYXRhVHJhbnNmZXIgfSBmcm9tICcuLi9jb21wb25lbnQvbW9kZWwvbW9kZWxzJztcblxuaW1wb3J0IHsgSURyb3BwYWJsZSB9IGZyb20gJy4uL2NvbXBvbmVudC9JRHJvcHBhYmxlJztcblxuY29uc3QgREVGQVVMVF9BQ0NFUFQ6IHN0cmluZyA9ICcqJztcbmNvbnN0IERFRkFVTFRfQUxXQVlTX0ZJUkVfRVZFTlQ6IGJvb2xlYW4gPSBmYWxzZTtcbmNvbnN0IERFRkFVTFRfQVVUT19BRERfQ0xBU1M6IGJvb2xlYW4gPSB0cnVlO1xuY29uc3QgREVGQVVMVF9EUkFHX09WRVJfVElNRU9VVDogbnVtYmVyID0gMTA7XG5jb25zdCBERUZBVUxUX0RSQUdfTEVBVkVfVElNRU9VVDogbnVtYmVyID0gMTA7XG5jb25zdCBERUZBVUxUX0RST1BfQ0xBU1NfUkVTRVRfVElNRU9VVDogbnVtYmVyID0gNDAwO1xuY29uc3QgQ0xBU1NfTkFNRV9EUkFHX09WRVI6IHN0cmluZyA9ICdkcmFnLW92ZXInO1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QX0FDQ0VQVEVEOiBzdHJpbmcgPSAnZHJvcC1hY2NlcHRlZCc7XG5jb25zdCBDTEFTU19OQU1FX0RST1BfUkVKRUNURUQ6IHN0cmluZyA9ICdkcm9wLXJlamVjdGVkJztcblxuZGVjbGFyZSB2YXIgJDogYW55O1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbcGh4RHJvcHBhYmxlXSdcbn0pXG5leHBvcnQgY2xhc3MgRHJvcHBhYmxlIGV4dGVuZHMgQWJzdHJhY3RIYXNPcHRpb25zIGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfQUNDRVBUOiBzdHJpbmcgPSBERUZBVUxUX0FDQ0VQVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0FMV0FZU19GSVJFX0VWRU5UOiBib29sZWFuID0gREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0FVVE9fQUREX0NMQVNTOiBib29sZWFuID0gREVGQVVMVF9BVVRPX0FERF9DTEFTUztcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDTEFTU19OQU1FX0RSQUdfT1ZFUjogc3RyaW5nID0gQ0xBU1NfTkFNRV9EUkFHX09WRVI7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfTkFNRV9EUk9QX0FDQ0VQVEVEOiBzdHJpbmcgPSBDTEFTU19OQU1FX0RST1BfQUNDRVBURUQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQ0xBU1NfTkFNRV9EUk9QX1JFSkVDVEVEOiBzdHJpbmcgPSBDTEFTU19OQU1FX0RST1BfUkVKRUNURUQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EUkFHX09WRVJfVElNRU9VVDogbnVtYmVyID0gREVGQVVMVF9EUkFHX09WRVJfVElNRU9VVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0RSQUdfTEVBVkVfVElNRU9VVDogbnVtYmVyID0gREVGQVVMVF9EUkFHX0xFQVZFX1RJTUVPVVQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9EUk9QX0NMQVNTX1JFU0VUX1RJTUVPVVQ6IG51bWJlciA9IERFRkFVTFRfRFJPUF9DTEFTU19SRVNFVF9USU1FT1VUO1xuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UGFyc2VkRGF0YShldmVudDogYW55KTogYW55IHtcbiAgICBpZiAoZXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIGV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChldmVudC5kYXRhVHJhbnNmZXIgPT09IG51bGwgfHwgdHlwZW9mIGV2ZW50LmRhdGFUcmFuc2ZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyLnR5cGVzID09PSBudWxsIHx8ICFBcnJheS5pc0FycmF5KGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCByZXN1bHQ6IGFueVtdID0gW107XG4gICAgZm9yIChsZXQgZm9ybWF0IG9mIGV2ZW50LmRhdGFUcmFuc2Zlci50eXBlcykge1xuICAgICAgcmVzdWx0LnB1c2goRHJvcHBhYmxlLnBhcnNlRGF0YShmb3JtYXQsIGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKGZvcm1hdCkpKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA8PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiByZXN1bHRbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2VEYXRhKGZvcm1hdDogc3RyaW5nLCBldmVudERhdGE6IGFueSk6IGFueSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gbnVsbCB8fCB0eXBlb2YgZm9ybWF0ICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogYW55ID0gZXZlbnREYXRhO1xuICAgIGlmIChmb3JtYXQudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKGV2ZW50RGF0YSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNBY2NlcHQoZXZlbnQ6IGFueSwgYWNjZXB0Rm9ybWF0czogYW55LCB0YXJnZXQ6IElEcm9wcGFibGUsIGNoZWNrRGF0YTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBsZXQgYWNjZXB0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGFjY2VwdEZvcm1hdHMpKSB7XG4gICAgICBmb3IgKGxldCBmb3JtYXQgb2YgYWNjZXB0Rm9ybWF0cykge1xuICAgICAgICBpZiAoZm9ybWF0ID09PSBudWxsIHx8IHR5cGVvZiBmb3JtYXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBhY2NlcHQucHVzaChmb3JtYXQudG9Mb3dlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYWNjZXB0Rm9ybWF0cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGFjY2VwdC5wdXNoKGFjY2VwdEZvcm1hdHMudG9Mb3dlckNhc2UoKSk7XG4gICAgfVxuXG4gICAgbGV0IGFjY2VwdEZvcm1hdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gSWYgdGhlcmUgaXMgXCJhbnlcIiAoKikgZm9ybWF0LCBhY2NlcHQgaW1tZWRpYXRlbHkuXG4gICAgZm9yIChsZXQgZm9ybWF0IG9mIGFjY2VwdCkge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gJyonKSB7XG4gICAgICAgIGFjY2VwdEZvcm1hdCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8v