@foblex/flow
Version:
An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.
107 lines • 20.9 kB
JavaScript
import { FDragHandlerResult } from '../../f-drag-handler';
import { CalculateClosestInputRequest, GetAllCanBeConnectedInputsAndRectsRequest, CalculateConnectionLineByBehaviorRequest, GetConnectorAndRectRequest, MarkAllCanBeConnectedInputsRequest, UnmarkAllCanBeConnectedInputsRequest } from '../../../domain';
import { RectExtensions, RoundedRect } from '@foblex/2d';
import { FMediator } from '@foblex/mediator';
import { FComponentsStore } from '../../../f-storage';
export class FReassignConnectionDragHandler {
_fConnection;
fEventType = 'reassign-connection';
fData;
_fResult;
_fMediator;
_fComponentsStore;
_toConnectorRect = new RoundedRect();
get _fSnapConnection() {
return this._fComponentsStore.fSnapConnection;
}
_fOutputWithRect;
_fInputWithRect;
_canBeConnectedInputs = [];
get _fOutput() {
const result = this._fComponentsStore.fOutputs.find((x) => x.fId === this._fConnection.fOutputId);
if (!result) {
throw new Error('Connection output not found');
}
return result;
}
get _fInput() {
const result = this._fComponentsStore.fInputs.find((x) => x.fId === this._fConnection.fInputId);
if (!result) {
throw new Error('Connection input not found');
}
return result;
}
constructor(_injector, _fConnection) {
this._fConnection = _fConnection;
this._fResult = _injector.get(FDragHandlerResult);
this._fMediator = _injector.get(FMediator);
this._fComponentsStore = _injector.get(FComponentsStore);
this._toConnectorRect = RoundedRect.fromRect(RectExtensions.initialize(this._fConnection.line.point2.x, this._fConnection.line.point2.y));
this.fData = {
fConnectionId: this._fConnection.fId
};
}
prepareDragSequence() {
this._getAndMarkCanBeConnectedInputs();
this._initializeSnapConnection();
this._fOutputWithRect = this._fMediator.execute(new GetConnectorAndRectRequest(this._fOutput));
this._fInputWithRect = this._fMediator.execute(new GetConnectorAndRectRequest(this._fInput));
this._fResult.setData({
toConnectorRect: this._toConnectorRect,
canBeConnectedInputs: this._canBeConnectedInputs,
fConnection: this._fConnection
});
}
_getAndMarkCanBeConnectedInputs() {
this._canBeConnectedInputs = this._fMediator.execute(new GetAllCanBeConnectedInputsAndRectsRequest(this._fOutput));
this._fMediator.execute(new MarkAllCanBeConnectedInputsRequest(this._canBeConnectedInputs.map((x) => x.fConnector)));
}
_initializeSnapConnection() {
if (!this._fSnapConnection) {
return;
}
this._fSnapConnection.fOutputId = this._fConnection.fOutputId;
this._fSnapConnection.initialize();
}
onPointerMove(difference) {
const fClosestInput = this._findClosestInput(difference);
this._drawConnection(this._toConnectorRect.addPoint(difference), fClosestInput?.fConnector.fConnectableSide || this._fInputWithRect.fConnector.fConnectableSide);
if (this._fSnapConnection) {
this._drawSnapConnection(this._getClosestInputForSnapConnection(fClosestInput));
}
}
_drawConnection(difference, fSide) {
const line = this._getLineToPointer(difference, fSide);
this._fConnection.setLine(line, this._fOutputWithRect.fConnector.fConnectableSide, fSide);
this._fConnection.redraw();
}
_getLineToPointer(difference, fSide) {
return this._fMediator.execute(new CalculateConnectionLineByBehaviorRequest(this._fOutputWithRect.fRect, RoundedRect.fromRect(RectExtensions.initialize(difference.x, difference.y)), this._fConnection.fBehavior, this._fOutputWithRect.fConnector.fConnectableSide, fSide));
}
_drawSnapConnection(fClosestInput) {
if (fClosestInput) {
const line = this._getLineToClosestInput(fClosestInput);
this._fSnapConnection.show();
this._fSnapConnection.setLine(line, this._fOutputWithRect.fConnector.fConnectableSide, fClosestInput.fConnector.fConnectableSide);
this._fSnapConnection.redraw();
}
else {
this._fSnapConnection?.hide();
}
}
_getLineToClosestInput(fClosestInput) {
return this._fMediator.execute(new CalculateConnectionLineByBehaviorRequest(this._fOutputWithRect.fRect, fClosestInput.fRect, this._fSnapConnection.fBehavior, this._fOutputWithRect.fConnector.fConnectableSide, fClosestInput.fConnector.fConnectableSide));
}
_findClosestInput(difference) {
return this._fMediator.execute(new CalculateClosestInputRequest(this._toConnectorRect.addPoint(difference), this._canBeConnectedInputs));
}
_getClosestInputForSnapConnection(fClosestInput) {
return fClosestInput && fClosestInput.distance < this._fSnapConnection.fSnapThreshold ? fClosestInput : undefined;
}
onPointerUp() {
this._drawConnection(this._toConnectorRect, this._fInputWithRect.fConnector.fConnectableSide);
this._fSnapConnection?.hide();
this._fMediator.execute(new UnmarkAllCanBeConnectedInputsRequest(this._canBeConnectedInputs.map((x) => x.fConnector)));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1yZWFzc2lnbi1jb25uZWN0aW9uLmRyYWctaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi1kcmFnZ2FibGUvZi1jb25uZWN0aW9uL2YtcmVhc3NpZ24tY29ubmVjdGlvbi9mLXJlYXNzaWduLWNvbm5lY3Rpb24uZHJhZy1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlDQUF5QyxFQUN6Qyx3Q0FBd0MsRUFBRSwwQkFBMEIsRUFDbEMsa0NBQWtDLEVBQUUsb0NBQW9DLEVBQzNHLE1BQU0saUJBQWlCLENBQUM7QUFHekIsT0FBTyxFQUFpQixjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUl0RCxNQUFNLE9BQU8sOEJBQThCO0lBc0MvQjtJQXBDSCxVQUFVLEdBQUcscUJBQXFCLENBQUM7SUFDbkMsS0FBSyxDQUFNO0lBRUQsUUFBUSxDQUFxRDtJQUM3RCxVQUFVLENBQVk7SUFDdEIsaUJBQWlCLENBQW1CO0lBRXBDLGdCQUFnQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFdEQsSUFBWSxnQkFBZ0I7UUFDMUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBMkMsQ0FBQztJQUM1RSxDQUFDO0lBRU8sZ0JBQWdCLENBQXFCO0lBQ3JDLGVBQWUsQ0FBcUI7SUFFcEMscUJBQXFCLEdBQXdCLEVBQUUsQ0FBQztJQUV4RCxJQUFZLFFBQVE7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJ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LENBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQzFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDM0IsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLGlDQUFpQyxDQUFDLGFBQXdDO1FBQ2hGLE9BQU8sYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFpQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckgsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM5RixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3JCLElBQUksb0NBQW9DLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQzlGLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGRHJhZ0hhbmRsZXJSZXN1bHQsIElGRHJhZ0hhbmRsZXIgfSBmcm9tICcuLi8uLi9mLWRyYWctaGFuZGxlcic7XG5pbXBvcnQge1xuICBDYWxjdWxhdGVDbG9zZXN0SW5wdXRSZXF1ZXN0LFxuICBHZXRBbGxDYW5CZUNvbm5lY3RlZElucHV0c0FuZFJlY3RzUmVxdWVzdCxcbiAgQ2FsY3VsYXRlQ29ubmVjdGlvbkxpbmVCeUJlaGF2aW9yUmVxdWVzdCwgR2V0Q29ubmVjdG9yQW5kUmVjdFJlcXVlc3QsXG4gIElDb25uZWN0b3JBbmRSZWN0LCBJQ2xvc2VzdElucHV0LCBNYXJrQWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNSZXF1ZXN0LCBVbm1hcmtBbGxDYW5CZUNvbm5lY3RlZElucHV0c1JlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vLi4vZG9tYWluJztcbmltcG9ydCB7IEZDb25uZWN0aW9uQmFzZSwgRlNuYXBDb25uZWN0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vZi1jb25uZWN0aW9uJztcbmltcG9ydCB7IEVGQ29ubmVjdGFibGVTaWRlLCBGQ29ubmVjdG9yQmFzZSwgRk5vZGVPdXRwdXREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi9mLWNvbm5lY3RvcnMnO1xuaW1wb3J0IHsgSUxpbmUsIElQb2ludCwgUmVjdEV4dGVuc2lvbnMsIFJvdW5kZWRSZWN0IH0gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQgeyBGTWVkaWF0b3IgfSBmcm9tICdAZm9ibGV4L21lZGlhdG9yJztcbmltcG9ydCB7IEZDb21wb25lbnRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgSUZSZWFzc2lnbkNvbm5lY3Rpb25EcmFnUmVzdWx0IH0gZnJvbSAnLi9pLWYtcmVhc3NpZ24tY29ubmVjdGlvbi1kcmFnLXJlc3VsdCc7XG5pbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgY2xhc3MgRlJlYXNzaWduQ29ubmVjdGlvbkRyYWdIYW5kbGVyIGltcGxlbWVudHMgSUZEcmFnSGFuZGxlciB7XG5cbiAgcHVibGljIGZFdmVudFR5cGUgPSAncmVhc3NpZ24tY29ubmVjdGlvbic7XG4gIHB1YmxpYyBmRGF0YTogYW55O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZSZXN1bHQ6IEZEcmFnSGFuZGxlclJlc3VsdDxJRlJlYXNzaWduQ29ubmVjdGlvbkRyYWdSZXN1bHQ+O1xuICBwcml2YXRlIHJlYWRvbmx5IF9mTWVkaWF0b3I6IEZNZWRpYXRvcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkNvbXBvbmVudHNTdG9yZTogRkNvbXBvbmVudHNTdG9yZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF90b0Nvbm5lY3RvclJlY3QgPSBuZXcgUm91bmRlZFJlY3QoKTtcblxuICBwcml2YXRlIGdldCBfZlNuYXBDb25uZWN0aW9uKCk6IEZTbmFwQ29ubmVjdGlvbkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDb21wb25lbnRzU3RvcmUuZlNuYXBDb25uZWN0aW9uIGFzIEZTbmFwQ29ubmVjdGlvbkNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZPdXRwdXRXaXRoUmVjdCE6IElDb25uZWN0b3JBbmRSZWN0O1xuICBwcml2YXRlIF9mSW5wdXRXaXRoUmVjdCE6IElDb25uZWN0b3JBbmRSZWN0O1xuXG4gIHByaXZhdGUgX2NhbkJlQ29ubmVjdGVkSW5wdXRzOiBJQ29ubmVjdG9yQW5kUmVjdFtdID0gW107XG5cbiAgcHJpdmF0ZSBnZXQgX2ZPdXRwdXQoKTogRkNvbm5lY3RvckJhc2Uge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2ZDb21wb25lbnRzU3RvcmUuZk91dHB1dHMuZmluZCgoeCkgPT4geC5mSWQgPT09IHRoaXMuX2ZDb25uZWN0aW9uLmZPdXRwdXRJZCk7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29ubmVjdGlvbiBvdXRwdXQgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZklucHV0KCk6IEZDb25uZWN0b3JCYXNlIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZJbnB1dHMuZmluZCgoeCkgPT4geC5mSWQgPT09IHRoaXMuX2ZDb25uZWN0aW9uLmZJbnB1dElkKTtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25uZWN0aW9uIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIF9mQ29ubmVjdGlvbjogRkNvbm5lY3Rpb25CYXNlLFxuICApIHtcbiAgICB0aGlzLl9mUmVzdWx0ID0gX2luamVjdG9yLmdldChGRHJhZ0hhbmRsZXJSZXN1bHQpO1xuICAgIHRoaXMuX2ZNZWRpYXRvciA9IF9pbmplY3Rvci5nZXQoRk1lZGlhdG9yKTtcbiAgICB0aGlzLl9mQ29tcG9uZW50c1N0b3JlID0gX2luamVjdG9yLmdldChGQ29tcG9uZW50c1N0b3JlKTtcblxuICAgIHRoaXMuX3RvQ29ubmVjdG9yUmVjdCA9IFJvdW5kZWRSZWN0LmZyb21SZWN0KFxuICAgICAgUmVjdEV4dGVuc2lvbnMuaW5pdGlhbGl6ZSh0aGlzLl9mQ29ubmVjdGlvbi5saW5lLnBvaW50Mi54LCB0aGlzLl9mQ29ubmVjdGlvbi5saW5lLnBvaW50Mi55KVxuICAgICk7XG4gICAgdGhpcy5mRGF0YSA9IHtcbiAgICAgIGZDb25uZWN0aW9uSWQ6IHRoaXMuX2ZDb25uZWN0aW9uLmZJZFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZURyYWdTZXF1ZW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRBbmRNYXJrQ2FuQmVDb25uZWN0ZWRJbnB1dHMoKTtcbiAgICB0aGlzLl9pbml0aWFsaXplU25hcENvbm5lY3Rpb24oKTtcblxuICAgIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdCA9IHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPElDb25uZWN0b3JBbmRSZWN0PihuZXcgR2V0Q29ubmVjdG9yQW5kUmVjdFJlcXVlc3QodGhpcy5fZk91dHB1dCkpO1xuICAgIHRoaXMuX2ZJbnB1dFdpdGhSZWN0ID0gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8SUNvbm5lY3RvckFuZFJlY3Q+KG5ldyBHZXRDb25uZWN0b3JBbmRSZWN0UmVxdWVzdCh0aGlzLl9mSW5wdXQpKTtcblxuICAgIHRoaXMuX2ZSZXN1bHQuc2V0RGF0YSh7XG4gICAgICB0b0Nvbm5lY3RvclJlY3Q6IHRoaXMuX3RvQ29ubmVjdG9yUmVjdCxcbiAgICAgIGNhbkJlQ29ubmVjdGVkSW5wdXRzOiB0aGlzLl9jYW5CZUNvbm5lY3RlZElucHV0cyxcbiAgICAgIGZDb25uZWN0aW9uOiB0aGlzLl9mQ29ubmVjdGlvblxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QW5kTWFya0NhbkJlQ29ubmVjdGVkSW5wdXRzKCk6IHZvaWQge1xuICAgIHRoaXMuX2NhbkJlQ29ubmVjdGVkSW5wdXRzID0gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8SUNvbm5lY3RvckFuZFJlY3RbXT4oXG4gICAgICBuZXcgR2V0QWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNBbmRSZWN0c1JlcXVlc3QodGhpcy5fZk91dHB1dCBhcyBGTm9kZU91dHB1dERpcmVjdGl2ZSlcbiAgICApO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUoXG4gICAgICBuZXcgTWFya0FsbENhbkJlQ29ubmVjdGVkSW5wdXRzUmVxdWVzdCh0aGlzLl9jYW5CZUNvbm5lY3RlZElucHV0cy5tYXAoKHgpID0+IHguZkNvbm5lY3RvcikpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVTbmFwQ29ubmVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2ZTbmFwQ29ubmVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9mU25hcENvbm5lY3Rpb24uZk91dHB1dElkID0gdGhpcy5fZkNvbm5lY3Rpb24uZk91dHB1dElkO1xuICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbi5pbml0aWFsaXplKCk7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyTW92ZShkaWZmZXJlbmNlOiBJUG9pbnQpOiB2b2lkIHtcbiAgICBjb25zdCBmQ2xvc2VzdElucHV0ID0gdGhpcy5fZmluZENsb3Nlc3RJbnB1dChkaWZmZXJlbmNlKTtcblxuICAgIHRoaXMuX2RyYXdDb25uZWN0aW9uKFxuICAgICAgdGhpcy5fdG9Db25uZWN0b3JSZWN0LmFkZFBvaW50KGRpZmZlcmVuY2UpLFxuICAgICAgZkNsb3Nlc3RJbnB1dD8uZkNvbm5lY3Rvci5mQ29ubmVjdGFibGVTaWRlIHx8IHRoaXMuX2ZJbnB1dFdpdGhSZWN0LmZDb25uZWN0b3IuZkNvbm5lY3RhYmxlU2lkZVxuICAgICk7XG4gICAgaWYgKHRoaXMuX2ZTbmFwQ29ubmVjdGlvbikge1xuICAgICAgdGhpcy5fZHJhd1NuYXBDb25uZWN0aW9uKHRoaXMuX2dldENsb3Nlc3RJbnB1dEZvclNuYXBDb25uZWN0aW9uKGZDbG9zZXN0SW5wdXQpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kcmF3Q29ubmVjdGlvbihkaWZmZXJlbmNlOiBJUG9pbnQsIGZTaWRlOiBFRkNvbm5lY3RhYmxlU2lkZSk6IHZvaWQge1xuICAgIGNvbnN0IGxpbmUgPSB0aGlzLl9nZXRMaW5lVG9Qb2ludGVyKGRpZmZlcmVuY2UsIGZTaWRlKTtcbiAgICB0aGlzLl9mQ29ubmVjdGlvbi5zZXRMaW5lKGxpbmUsIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGUsIGZTaWRlKTtcbiAgICB0aGlzLl9mQ29ubmVjdGlvbi5yZWRyYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldExpbmVUb1BvaW50ZXIoZGlmZmVyZW5jZTogSVBvaW50LCBmU2lkZTogRUZDb25uZWN0YWJsZVNpZGUpOiBJTGluZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPElMaW5lPihuZXcgQ2FsY3VsYXRlQ29ubmVjdGlvbkxpbmVCeUJlaGF2aW9yUmVxdWVzdChcbiAgICAgICAgdGhpcy5fZk91dHB1dFdpdGhSZWN0LmZSZWN0LFxuICAgICAgICBSb3VuZGVkUmVjdC5mcm9tUmVjdChSZWN0RXh0ZW5zaW9ucy5pbml0aWFsaXplKGRpZmZlcmVuY2UueCwgZGlmZmVyZW5jZS55KSksXG4gICAgICAgIHRoaXMuX2ZDb25uZWN0aW9uLmZCZWhhdmlvcixcbiAgICAgICAgdGhpcy5fZk91dHB1dFdpdGhSZWN0LmZDb25uZWN0b3IuZkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICAgZlNpZGVcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZHJhd1NuYXBDb25uZWN0aW9uKGZDbG9zZXN0SW5wdXQ6IElDbG9zZXN0SW5wdXQgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoZkNsb3Nlc3RJbnB1dCkge1xuICAgICAgY29uc3QgbGluZSA9IHRoaXMuX2dldExpbmVUb0Nsb3Nlc3RJbnB1dChmQ2xvc2VzdElucHV0KTtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbiEuc2hvdygpO1xuICAgICAgdGhpcy5fZlNuYXBDb25uZWN0aW9uIS5zZXRMaW5lKGxpbmUsIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGUsIGZDbG9zZXN0SW5wdXQuZkNvbm5lY3Rvci5mQ29ubmVjdGFibGVTaWRlKTtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbiEucmVkcmF3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbj8uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldExpbmVUb0Nsb3Nlc3RJbnB1dChmQ2xvc2VzdElucHV0OiBJQ2xvc2VzdElucHV0KTogSUxpbmUge1xuICAgIHJldHVybiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJTGluZT4obmV3IENhbGN1bGF0ZUNvbm5lY3Rpb25MaW5lQnlCZWhhdmlvclJlcXVlc3QoXG4gICAgICB0aGlzLl9mT3V0cHV0V2l0aFJlY3QuZlJlY3QsXG4gICAgICBmQ2xvc2VzdElucHV0LmZSZWN0LFxuICAgICAgdGhpcy5fZlNuYXBDb25uZWN0aW9uIS5mQmVoYXZpb3IsXG4gICAgICB0aGlzLl9mT3V0cHV0V2l0aFJlY3QuZkNvbm5lY3Rvci5mQ29ubmVjdGFibGVTaWRlLFxuICAgICAgZkNsb3Nlc3RJbnB1dC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGVcbiAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRDbG9zZXN0SW5wdXQoZGlmZmVyZW5jZTogSVBvaW50KTogSUNsb3Nlc3RJbnB1dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPElDbG9zZXN0SW5wdXQgfCB1bmRlZmluZWQ+KFxuICAgICAgbmV3IENhbGN1bGF0ZUNsb3Nlc3RJbnB1dFJlcXVlc3QoXG4gICAgICAgIHRoaXMuX3RvQ29ubmVjdG9yUmVjdC5hZGRQb2ludChkaWZmZXJlbmNlKSxcbiAgICAgICAgdGhpcy5fY2FuQmVDb25uZWN0ZWRJbnB1dHMsXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENsb3Nlc3RJbnB1dEZvclNuYXBDb25uZWN0aW9uKGZDbG9zZXN0SW5wdXQ6IElDbG9zZXN0SW5wdXQgfCB1bmRlZmluZWQpOiBJQ2xvc2VzdElucHV0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZkNsb3Nlc3RJbnB1dCAmJiBmQ2xvc2VzdElucHV0LmRpc3RhbmNlIDwgdGhpcy5fZlNuYXBDb25uZWN0aW9uIS5mU25hcFRocmVzaG9sZCA/IGZDbG9zZXN0SW5wdXQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyVXAoKTogdm9pZCB7XG4gICAgdGhpcy5fZHJhd0Nvbm5lY3Rpb24odGhpcy5fdG9Db25uZWN0b3JSZWN0LCB0aGlzLl9mSW5wdXRXaXRoUmVjdC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGUpO1xuICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbj8uaGlkZSgpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUoXG4gICAgICBuZXcgVW5tYXJrQWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNSZXF1ZXN0KHRoaXMuX2NhbkJlQ29ubmVjdGVkSW5wdXRzLm1hcCgoeCkgPT4geC5mQ29ubmVjdG9yKSlcbiAgICApO1xuICB9XG59XG4iXX0=