@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.
137 lines • 19 kB
JavaScript
import { __decorate } from "tslib";
import { inject, Injectable } from '@angular/core';
import { FExecutionRegister, FMediator } from '@foblex/mediator';
import { FSingleSelectRequest } from './f-single-select.request';
import { isValidEventTrigger, UpdateItemAndChildrenLayersRequest } from '../../domain';
import { FComponentsStore } from '../../f-storage';
import { FDraggableDataContext } from '../f-draggable-data-context';
import * as i0 from "@angular/core";
/**
* Implements the functionality for selecting elements in a graphical interface.
* This class handles both single and multi-selection, updating the selection state
* of elements and managing related data.
*
* Logic flow:
* 1. **Validate the selection event**:
* - The event is considered valid if it occurs within the flow boundaries
* and there are no active draggable data operations.
*
* 2. **Determine the target element to select**:
* - The target element is determined based on the event’s target.
* It can be a node, a group of nodes, or a connection.
* - If no element is found, the current selection state is cleared.
*
* 3. **Update element layers**:
* - If an element is found, its visual layer and the layers of its child elements are updated.
*
* 4. **Single or multi-selection**:
* - If the event meets the criteria for multi-selection (e.g., a modifier key is pressed),
* multi-selection logic is applied.
* - Otherwise, single-selection logic is used.
*
* 5. **Single-selection logic**:
* - If the element is not selected and can be selected:
* - Clear the selection of all other elements.
* - Mark the current element as selected.
* - If the element cannot be selected, the current selection is cleared.
*
* 6. **Multi-selection logic**:
* - If the element is already selected, it is removed from the selection.
* - If the element is not selected and can be selected, it is added to the selection.
*
* 7. **Manage selection state**:
* - Adding or removing an element from the selection triggers the corresponding methods.
* - Selection state is tracked in the shared context for future use.
*/
let FSingleSelectExecution = class FSingleSelectExecution {
_fMediator = inject(FMediator);
_fComponentsStore = inject(FComponentsStore);
_fDraggableDataContext = inject(FDraggableDataContext);
handle(request) {
if (!this._isValid(request)) {
return;
}
const fItem = this._getItemToSelect(request.event);
setTimeout(() => this._updateItemAndChildrenLayers(fItem));
this._isMultiSelect(request) ? this._multiSelect(fItem) : this._singleSelect(fItem);
}
_isValid(request) {
return this._isEventInFlowBounds(request.event) && this._fDraggableDataContext.isEmpty();
}
_isEventInFlowBounds(event) {
return this._fComponentsStore.fFlow.hostElement.contains(event.targetElement);
}
_getItemToSelect(event) {
return this._getNodeOrGroup(event.targetElement) || this._getConnection(event.targetElement);
}
_getNodeOrGroup(targetElement) {
return this._fComponentsStore.fNodes.find((x) => (x).isContains(targetElement));
}
_getConnection(element) {
return this._fComponentsStore.fConnections
.find(c => c.isContains(element) || c.fConnectionCenter?.nativeElement?.contains(element));
}
_updateItemAndChildrenLayers(fItem) {
if (fItem) {
this._fMediator.execute(new UpdateItemAndChildrenLayersRequest(fItem, fItem.hostElement.parentElement));
}
}
_isMultiSelect(request) {
return isValidEventTrigger(request.event.originalEvent, request.fMultiSelectTrigger);
}
_singleSelect(fItem) {
if (fItem) {
if (this._isItemNotSelectedAndSelectable(fItem)) {
this._clearSelection();
this._selectItem(fItem);
}
else if (fItem.fSelectionDisabled) {
this._clearSelection();
}
}
else {
this._clearSelection();
}
}
_isItemNotSelectedAndSelectable(item) {
return !item.isSelected() && !item.fSelectionDisabled;
}
_clearSelection() {
this._fDraggableDataContext.selectedItems.forEach((x) => {
x.unmarkAsSelected();
this._fDraggableDataContext.markSelectionAsChanged();
});
this._fDraggableDataContext.selectedItems = [];
}
_multiSelect(fItem) {
if (fItem && !fItem.fSelectionDisabled) {
fItem.isSelected() ? this._deselectItem(fItem) : this._selectItem(fItem);
}
}
_deselectItem(fItem) {
this._removeItemFromSelectedItems(fItem);
fItem.unmarkAsSelected();
this._fDraggableDataContext.markSelectionAsChanged();
}
_removeItemFromSelectedItems(fItem) {
const indexInSelection = this._fDraggableDataContext.selectedItems.indexOf(fItem);
if (indexInSelection > -1) {
this._fDraggableDataContext.selectedItems.splice(indexInSelection, 1);
}
}
_selectItem(fItem) {
this._fDraggableDataContext.selectedItems.push(fItem);
fItem.markAsSelected();
this._fDraggableDataContext.markSelectionAsChanged();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution });
};
FSingleSelectExecution = __decorate([
FExecutionRegister(FSingleSelectRequest)
], FSingleSelectExecution);
export { FSingleSelectExecution };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSingleSelectExecution, decorators: [{
type: Injectable
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1zaW5nbGUtc2VsZWN0LmV4ZWN1dGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi1kcmFnZ2FibGUvZi1zaW5nbGUtc2VsZWN0L2Ytc2luZ2xlLXNlbGVjdC5leGVjdXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxTQUFTLEVBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFdkYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBS3BFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ0c7QUFJSSxJQUFNLHNCQUFzQixHQUE1QixNQUFNLHNCQUFzQjtJQUVoQixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sQ0FBQyxPQUE2QjtRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVuRCxVQUFVLENBQUMsR0FBRyxFQUFFLENB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Qjs7QUFBdEIsc0JBQXNCO0lBRGxDLGtCQUFrQixDQUFDLG9CQUFvQixDQUFDO0dBQzVCLHNCQUFzQixDQW9HbEM7OzRGQXBHWSxzQkFBc0I7a0JBRmxDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZFeGVjdXRpb25SZWdpc3RlciwgRk1lZGlhdG9yLCBJRXhlY3V0aW9uIH0gZnJvbSAnQGZvYmxleC9tZWRpYXRvcic7XG5pbXBvcnQgeyBGU2luZ2xlU2VsZWN0UmVxdWVzdCB9IGZyb20gJy4vZi1zaW5nbGUtc2VsZWN0LnJlcXVlc3QnO1xuaW1wb3J0IHsgaXNWYWxpZEV2ZW50VHJpZ2dlciwgVXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzUmVxdWVzdCB9IGZyb20gJy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGQ29ubmVjdGlvbkJhc2UgfSBmcm9tICcuLi8uLi9mLWNvbm5lY3Rpb24nO1xuaW1wb3J0IHsgRkNvbXBvbmVudHNTdG9yZSB9IGZyb20gJy4uLy4uL2Ytc3RvcmFnZSc7XG5pbXBvcnQgeyBGRHJhZ2dhYmxlRGF0YUNvbnRleHQgfSBmcm9tICcuLi9mLWRyYWdnYWJsZS1kYXRhLWNvbnRleHQnO1xuaW1wb3J0IHsgSVNlbGVjdGFibGUgfSBmcm9tICcuLi8uLi9taXhpbnMnO1xuaW1wb3J0IHsgRk5vZGVCYXNlIH0gZnJvbSAnLi4vLi4vZi1ub2RlJztcbmltcG9ydCB7SVBvaW50ZXJFdmVudH0gZnJvbSBcIi4uLy4uL2RyYWctdG9vbGtpdFwiO1xuXG4vKipcbiAqIEltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHNlbGVjdGluZyBlbGVtZW50cyBpbiBhIGdyYXBoaWNhbCBpbnRlcmZhY2UuXG4gKiBUaGlzIGNsYXNzIGhhbmRsZXMgYm90aCBzaW5nbGUgYW5kIG11bHRpLXNlbGVjdGlvbiwgdXBkYXRpbmcgdGhlIHNlbGVjdGlvbiBzdGF0ZVxuICogb2YgZWxlbWVudHMgYW5kIG1hbmFnaW5nIHJlbGF0ZWQgZGF0YS5cbiAqXG4gKiBMb2dpYyBmbG93OlxuICogMS4gKipWYWxpZGF0ZSB0aGUgc2VsZWN0aW9uIGV2ZW50Kio6XG4gKiAgICAtIFRoZSBldmVudCBpcyBjb25zaWRlcmVkIHZhbGlkIGlmIGl0IG9jY3VycyB3aXRoaW4gdGhlIGZsb3cgYm91bmRhcmllc1xuICogICAgICBhbmQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBkcmFnZ2FibGUgZGF0YSBvcGVyYXRpb25zLlxuICpcbiAqIDIuICoqRGV0ZXJtaW5lIHRoZSB0YXJnZXQgZWxlbWVudCB0byBzZWxlY3QqKjpcbiAqICAgIC0gVGhlIHRhcmdldCBlbGVtZW50IGlzIGRldGVybWluZWQgYmFzZWQgb24gdGhlIGV2ZW504oCZcyB0YXJnZXQuXG4gKiAgICAgIEl0IGNhbiBiZSBhIG5vZGUsIGEgZ3JvdXAgb2Ygbm9kZXMsIG9yIGEgY29ubmVjdGlvbi5cbiAqICAgIC0gSWYgbm8gZWxlbWVudCBpcyBmb3VuZCwgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlIGlzIGNsZWFyZWQuXG4gKlxuICogMy4gKipVcGRhdGUgZWxlbWVudCBsYXllcnMqKjpcbiAqICAgIC0gSWYgYW4gZWxlbWVudCBpcyBmb3VuZCwgaXRzIHZpc3VhbCBsYXllciBhbmQgdGhlIGxheWVycyBvZiBpdHMgY2hpbGQgZWxlbWVudHMgYXJlIHVwZGF0ZWQuXG4gKlxuICogNC4gKipTaW5nbGUgb3IgbXVsdGktc2VsZWN0aW9uKio6XG4gKiAgICAtIElmIHRoZSBldmVudCBtZWV0cyB0aGUgY3JpdGVyaWEgZm9yIG11bHRpLXNlbGVjdGlvbiAoZS5nLiwgYSBtb2RpZmllciBrZXkgaXMgcHJlc3NlZCksXG4gKiAgICAgIG11bHRpLXNlbGVjdGlvbiBsb2dpYyBpcyBhcHBsaWVkLlxuICogICAgLSBPdGhlcndpc2UsIHNpbmdsZS1zZWxlY3Rpb24gbG9naWMgaXMgdXNlZC5cbiAqXG4gKiA1LiAqKlNpbmdsZS1zZWxlY3Rpb24gbG9naWMqKjpcbiAqICAgIC0gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHNlbGVjdGVkIGFuZCBjYW4gYmUgc2VsZWN0ZWQ6XG4gKiAgICAgIC0gQ2xlYXIgdGhlIHNlbGVjdGlvbiBvZiBhbGwgb3RoZXIgZWxlbWVudHMuXG4gKiAgICAgIC0gTWFyayB0aGUgY3VycmVudCBlbGVtZW50IGFzIHNlbGVjdGVkLlxuICogICAgLSBJZiB0aGUgZWxlbWVudCBjYW5ub3QgYmUgc2VsZWN0ZWQsIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcyBjbGVhcmVkLlxuICpcbiAqIDYuICoqTXVsdGktc2VsZWN0aW9uIGxvZ2ljKio6XG4gKiAgICAtIElmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgc2VsZWN0ZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2VsZWN0aW9uLlxuICogICAgLSBJZiB0aGUgZWxlbWVudCBpcyBub3Qgc2VsZWN0ZWQgYW5kIGNhbiBiZSBzZWxlY3RlZCwgaXQgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAqXG4gKiA3LiAqKk1hbmFnZSBzZWxlY3Rpb24gc3RhdGUqKjpcbiAqICAgIC0gQWRkaW5nIG9yIHJlbW92aW5nIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2VsZWN0aW9uIHRyaWdnZXJzIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZHMuXG4gKiAgICAtIFNlbGVjdGlvbiBzdGF0ZSBpcyB0cmFja2VkIGluIHRoZSBzaGFyZWQgY29udGV4dCBmb3IgZnV0dXJlIHVzZS5cbiAqL1xuXG5ASW5qZWN0YWJsZSgpXG5ARkV4ZWN1dGlvblJlZ2lzdGVyKEZTaW5nbGVTZWxlY3RSZXF1ZXN0KVxuZXhwb3J0IGNsYXNzIEZTaW5nbGVTZWxlY3RFeGVjdXRpb24gaW1wbGVtZW50cyBJRXhlY3V0aW9uPEZTaW5nbGVTZWxlY3RSZXF1ZXN0LCB2b2lkPiB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZk1lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZDb21wb25lbnRzU3RvcmUgPSBpbmplY3QoRkNvbXBvbmVudHNTdG9yZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZEcmFnZ2FibGVEYXRhQ29udGV4dCA9IGluamVjdChGRHJhZ2dhYmxlRGF0YUNvbnRleHQpO1xuXG4gIHB1YmxpYyBoYW5kbGUocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzVmFsaWQocmVxdWVzdCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmSXRlbSA9IHRoaXMuX2dldEl0ZW1Ub1NlbGVjdChyZXF1ZXN0LmV2ZW50KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fdXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzKGZJdGVtKSk7XG5cbiAgICB0aGlzLl9pc011bHRpU2VsZWN0KHJlcXVlc3QpID8gdGhpcy5fbXVsdGlTZWxlY3QoZkl0ZW0pIDogdGhpcy5fc2luZ2xlU2VsZWN0KGZJdGVtKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzVmFsaWQocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFdmVudEluRmxvd0JvdW5kcyhyZXF1ZXN0LmV2ZW50KSAmJiB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQuaXNFbXB0eSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNFdmVudEluRmxvd0JvdW5kcyhldmVudDogSVBvaW50ZXJFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZGbG93IS5ob3N0RWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEl0ZW1Ub1NlbGVjdChldmVudDogSVBvaW50ZXJFdmVudCk6IElTZWxlY3RhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Tm9kZU9yR3JvdXAoZXZlbnQudGFyZ2V0RWxlbWVudCkgfHwgdGhpcy5fZ2V0Q29ubmVjdGlvbihldmVudC50YXJnZXRFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldE5vZGVPckdyb3VwKHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50KTogRk5vZGVCYXNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudHNTdG9yZS5mTm9kZXMuZmluZCgoeCkgPT4gKHgpLmlzQ29udGFpbnModGFyZ2V0RWxlbWVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29ubmVjdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQpOiBGQ29ubmVjdGlvbkJhc2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZDb25uZWN0aW9uc1xuICAgICAgLmZpbmQoYyA9PiBjLmlzQ29udGFpbnMoZWxlbWVudCkgfHwgYy5mQ29ubmVjdGlvbkNlbnRlcj8ubmF0aXZlRWxlbWVudD8uY29udGFpbnMoZWxlbWVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzKGZJdGVtPzogSVNlbGVjdGFibGUpOiB2b2lkIHtcbiAgICBpZiAoZkl0ZW0pIHtcbiAgICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPHZvaWQ+KFxuICAgICAgICBuZXcgVXBkYXRlSXRlbUFuZENoaWxkcmVuTGF5ZXJzUmVxdWVzdChmSXRlbSwgZkl0ZW0uaG9zdEVsZW1lbnQucGFyZW50RWxlbWVudCEpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzTXVsdGlTZWxlY3QocmVxdWVzdDogRlNpbmdsZVNlbGVjdFJlcXVlc3QpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNWYWxpZEV2ZW50VHJpZ2dlcihyZXF1ZXN0LmV2ZW50Lm9yaWdpbmFsRXZlbnQsIHJlcXVlc3QuZk11bHRpU2VsZWN0VHJpZ2dlcik7XG4gIH1cblxuICBwcml2YXRlIF9zaW5nbGVTZWxlY3QoZkl0ZW0/OiBJU2VsZWN0YWJsZSk6IHZvaWQge1xuICAgIGlmIChmSXRlbSkge1xuICAgICAgaWYgKHRoaXMuX2lzSXRlbU5vdFNlbGVjdGVkQW5kU2VsZWN0YWJsZShmSXRlbSkpIHtcbiAgICAgICAgdGhpcy5fY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0SXRlbShmSXRlbSk7XG4gICAgICB9IGVsc2UgaWYgKGZJdGVtLmZTZWxlY3Rpb25EaXNhYmxlZCkge1xuICAgICAgICB0aGlzLl9jbGVhclNlbGVjdGlvbigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbGVhclNlbGVjdGlvbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2lzSXRlbU5vdFNlbGVjdGVkQW5kU2VsZWN0YWJsZShpdGVtOiBJU2VsZWN0YWJsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhaXRlbS5pc1NlbGVjdGVkKCkgJiYgIWl0ZW0uZlNlbGVjdGlvbkRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgoeCkgPT4ge1xuICAgICAgeC51bm1hcmtBc1NlbGVjdGVkKCk7XG4gICAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQubWFya1NlbGVjdGlvbkFzQ2hhbmdlZCgpO1xuICAgIH0pO1xuICAgIHRoaXMuX2ZEcmFnZ2FibGVEYXRhQ29udGV4dC5zZWxlY3RlZEl0ZW1zID0gW107XG4gIH1cblxuICBwcml2YXRlIF9tdWx0aVNlbGVjdChmSXRlbT86IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgaWYgKGZJdGVtICYmICFmSXRlbS5mU2VsZWN0aW9uRGlzYWJsZWQpIHtcbiAgICAgIGZJdGVtLmlzU2VsZWN0ZWQoKSA/IHRoaXMuX2Rlc2VsZWN0SXRlbShmSXRlbSkgOiB0aGlzLl9zZWxlY3RJdGVtKGZJdGVtKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZXNlbGVjdEl0ZW0oZkl0ZW06IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgdGhpcy5fcmVtb3ZlSXRlbUZyb21TZWxlY3RlZEl0ZW1zKGZJdGVtKTtcbiAgICBmSXRlbS51bm1hcmtBc1NlbGVjdGVkKCk7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0Lm1hcmtTZWxlY3Rpb25Bc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZUl0ZW1Gcm9tU2VsZWN0ZWRJdGVtcyhmSXRlbTogSVNlbGVjdGFibGUpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleEluU2VsZWN0aW9uID0gdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuaW5kZXhPZihmSXRlbSk7XG4gICAgaWYgKGluZGV4SW5TZWxlY3Rpb24gPiAtMSkge1xuICAgICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4SW5TZWxlY3Rpb24sIDEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdEl0ZW0oZkl0ZW06IElTZWxlY3RhYmxlKTogdm9pZCB7XG4gICAgdGhpcy5fZkRyYWdnYWJsZURhdGFDb250ZXh0LnNlbGVjdGVkSXRlbXMucHVzaChmSXRlbSk7XG4gICAgZkl0ZW0ubWFya0FzU2VsZWN0ZWQoKTtcbiAgICB0aGlzLl9mRHJhZ2dhYmxlRGF0YUNvbnRleHQubWFya1NlbGVjdGlvbkFzQ2hhbmdlZCgpO1xuICB9XG59XG4iXX0=