@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.
114 lines • 20 kB
JavaScript
import { ChangeDetectionStrategy, Component, ContentChildren, inject, Input, numberAttribute, ViewChild } from "@angular/core";
import { CONNECTION_GRADIENT, CONNECTION_PATH, CONNECTION_TEXT, FConnectionDragHandleEndComponent, FConnectionSelectionComponent, } from '../common';
import { EFConnectionBehavior } from '../common';
import { EFConnectionType } from '../common';
import { FConnectionCenterDirective } from '../f-connection-center';
import { NotifyDataChangedRequest } from '../../f-storage';
import { F_CONNECTION } from '../common/f-connection.injection-token';
import { FConnectionBase } from '../common/f-connection-base';
import { castToEnum } from '@foblex/utils';
import { FMediator } from '@foblex/mediator';
import { AddSnapConnectionToStoreRequest, RemoveSnapConnectionFromStoreRequest } from '../../domain';
import * as i0 from "@angular/core";
import * as i1 from "../f-connection-builder";
import * as i2 from "@angular/common";
import * as i3 from "../common/f-connection-text/f-connection-text.component";
import * as i4 from "../common/f-drag-handle/f-connection-drag-handle-end.component";
import * as i5 from "../common/f-gradient/f-connection-gradient.component";
import * as i6 from "../common/f-path/f-connection-path.component";
import * as i7 from "../common/f-selection/f-connection-selection.component";
let uniqueId = 0;
export class FSnapConnectionComponent extends FConnectionBase {
fId = `f-snap-connection-${uniqueId++}`;
fText = '';
fTextStartOffset = '';
fStartColor = 'black';
fEndColor = 'black';
fSnapThreshold = 20;
fOutputId;
fInputId;
fRadius = 8;
fOffset = 12;
fBehavior = EFConnectionBehavior.FIXED;
fType = EFConnectionType.STRAIGHT;
fDraggingDisabled = false;
fSelectionDisabled = false;
fDefs;
fPath;
fGradient;
fDragHandle;
fSelection;
fTextComponent;
fConnectionCenter;
fConnectionCenters;
get boundingElement() {
return this.fPath.hostElement;
}
_fMediator = inject(FMediator);
constructor(elementReference, fConnectionFactory) {
super(elementReference, fConnectionFactory);
}
ngOnInit() {
this._fMediator.execute(new AddSnapConnectionToStoreRequest(this));
}
ngAfterViewInit() {
this.hide();
}
ngOnChanges() {
this._fMediator.execute(new NotifyDataChangedRequest());
}
ngOnDestroy() {
this._fMediator.execute(new RemoveSnapConnectionFromStoreRequest());
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSnapConnectionComponent, deps: [{ token: i0.ElementRef }, { token: i1.FConnectionFactory }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.13", type: FSnapConnectionComponent, selector: "f-snap-connection", inputs: { fStartColor: "fStartColor", fEndColor: "fEndColor", fSnapThreshold: ["fSnapThreshold", "fSnapThreshold", numberAttribute], fRadius: ["fRadius", "fRadius", numberAttribute], fOffset: ["fOffset", "fOffset", numberAttribute], fBehavior: ["fBehavior", "fBehavior", (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior)], fType: "fType" }, host: { classAttribute: "f-component f-connection f-snap-connection" }, providers: [{ provide: F_CONNECTION, useExisting: FSnapConnectionComponent }], queries: [{ propertyName: "fConnectionCenters", predicate: FConnectionCenterDirective, descendants: true }], viewQueries: [{ propertyName: "fDefs", first: true, predicate: ["defs"], descendants: true, static: true }, { propertyName: "fPath", first: true, predicate: CONNECTION_PATH, descendants: true, static: true }, { propertyName: "fGradient", first: true, predicate: CONNECTION_GRADIENT, descendants: true, static: true }, { propertyName: "fDragHandle", first: true, predicate: FConnectionDragHandleEndComponent, descendants: true, static: true }, { propertyName: "fSelection", first: true, predicate: FConnectionSelectionComponent, descendants: true, static: true }, { propertyName: "fTextComponent", first: true, predicate: CONNECTION_TEXT, descendants: true, static: true }, { propertyName: "fConnectionCenter", first: true, predicate: ["fConnectionCenter"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path\n [attr.d]=\"path\">\n </path>\n <circle f-connection-drag-handle-end></circle>\n </g>\n <text f-connection-text></text>\n </g>\n <ng-content></ng-content>\n</svg>\n<div #fConnectionCenter class=\"f-connection-center\" *ngIf=\"fConnectionCenters.length\">\n <ng-content select=\"[fConnectionCenter]\"></ng-content>\n</div>\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center{pointer-events:all}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.FConnectionTextComponent, selector: "text[f-connection-text]" }, { kind: "component", type: i4.FConnectionDragHandleEndComponent, selector: "circle[f-connection-drag-handle-end]" }, { kind: "component", type: i5.FConnectionGradientComponent, selector: "linearGradient[fConnectionGradient]" }, { kind: "component", type: i6.FConnectionPathComponent, selector: "path[f-connection-path]" }, { kind: "component", type: i7.FConnectionSelectionComponent, selector: "path[fConnectionSelection]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FSnapConnectionComponent, decorators: [{
type: Component,
args: [{ selector: "f-snap-connection", changeDetection: ChangeDetectionStrategy.OnPush, host: {
class: "f-component f-connection f-snap-connection"
}, providers: [{ provide: F_CONNECTION, useExisting: FSnapConnectionComponent }], template: "<svg xmlns=\"http://www.w3.org/2000/svg\">\n <defs #defs></defs>\n <g class=\"f-connection-group\">\n <linearGradient fConnectionGradient></linearGradient>\n <path fConnectionSelection [attr.d]=\"path\"></path>\n <g>\n <path f-connection-path\n [attr.d]=\"path\">\n </path>\n <circle f-connection-drag-handle-end></circle>\n </g>\n <text f-connection-text></text>\n </g>\n <ng-content></ng-content>\n</svg>\n<div #fConnectionCenter class=\"f-connection-center\" *ngIf=\"fConnectionCenters.length\">\n <ng-content select=\"[fConnectionCenter]\"></ng-content>\n</div>\n", styles: [":host{pointer-events:none;position:absolute}:host svg{overflow:visible}:host svg .f-connection-group{pointer-events:all}:host .f-connection-center{pointer-events:all}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FConnectionFactory }], propDecorators: { fStartColor: [{
type: Input
}], fEndColor: [{
type: Input
}], fSnapThreshold: [{
type: Input,
args: [{ transform: numberAttribute }]
}], fRadius: [{
type: Input,
args: [{ transform: numberAttribute }]
}], fOffset: [{
type: Input,
args: [{ transform: numberAttribute }]
}], fBehavior: [{
type: Input,
args: [{ transform: (value) => castToEnum(value, 'fBehavior', EFConnectionBehavior) }]
}], fType: [{
type: Input
}], fDefs: [{
type: ViewChild,
args: ['defs', { static: true }]
}], fPath: [{
type: ViewChild,
args: [CONNECTION_PATH, { static: true }]
}], fGradient: [{
type: ViewChild,
args: [CONNECTION_GRADIENT, { static: true }]
}], fDragHandle: [{
type: ViewChild,
args: [FConnectionDragHandleEndComponent, { static: true }]
}], fSelection: [{
type: ViewChild,
args: [FConnectionSelectionComponent, { static: true }]
}], fTextComponent: [{
type: ViewChild,
args: [CONNECTION_TEXT, { static: true }]
}], fConnectionCenter: [{
type: ViewChild,
args: ['fConnectionCenter', { static: false }]
}], fConnectionCenters: [{
type: ContentChildren,
args: [FConnectionCenterDirective, { descendants: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1zbmFwLWNvbm5lY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9mLWNvbm5lY3Rpb24vZi1zbmFwLWNvbm5lY3Rpb24vZi1zbmFwLWNvbm5lY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZi1mbG93L3NyYy9mLWNvbm5lY3Rpb24vZi1zbmFwLWNvbm5lY3Rpb24vZi1zbmFwLWNvbm5lY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUtmLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGVBQWUsRUFBRSxlQUFlLEVBQ2hDLGlDQUFpQyxFQUFFLDZCQUE2QixHQUVqRSxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzdDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLCtCQUErQixFQUFFLG9DQUFvQyxFQUFFLE1BQU0sY0FBYyxDQUFDOzs7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QyxFQUFFLFNBQVMsRUFBRSxDQUFDLEtBQWMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsb0JBQW9CLENBQUMsRUFBRTtnQkFJOUUsS0FBSztzQkFEcEIsS0FBSztnQkFRVSxLQUFLO3NCQURwQixTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSW5CLEtBQUs7c0JBRHBCLFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJNUIsU0FBUztzQkFEeEIsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSWhDLFdBQVc7c0JBRDFCLFNBQVM7dUJBQUMsaUNBQWlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk5QyxVQUFVO3NCQUR6QixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJMUMsY0FBYztzQkFEN0IsU0FBUzt1QkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk1QixpQkFBaUI7c0JBRGhDLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQUkxQyxrQkFBa0I7c0JBRHhCLGVBQWU7dUJBQUMsMEJBQTBCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBudW1iZXJBdHRyaWJ1dGUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBDT05ORUNUSU9OX0dSQURJRU5ULFxuICBDT05ORUNUSU9OX1BBVEgsIENPTk5FQ1RJT05fVEVYVCxcbiAgRkNvbm5lY3Rpb25EcmFnSGFuZGxlRW5kQ29tcG9uZW50LCBGQ29ubmVjdGlvblNlbGVjdGlvbkNvbXBvbmVudCwgSUNvbm5lY3Rpb25HcmFkaWVudCxcbiAgSUNvbm5lY3Rpb25QYXRoLCBJQ29ubmVjdGlvblRleHQsXG59IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBFRkNvbm5lY3Rpb25CZWhhdmlvciB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBFRkNvbm5lY3Rpb25UeXBlIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IEZDb25uZWN0aW9uQ2VudGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vZi1jb25uZWN0aW9uLWNlbnRlcic7XG5pbXBvcnQgeyBGQ29ubmVjdGlvbkZhY3RvcnkgfSBmcm9tICcuLi9mLWNvbm5lY3Rpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBOb3RpZnlEYXRhQ2hhbmdlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgRl9DT05ORUNUSU9OIH0gZnJvbSAnLi4vY29tbW9uL2YtY29ubmVjdGlvbi5pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgRkNvbm5lY3Rpb25CYXNlIH0gZnJvbSAnLi4vY29tbW9uL2YtY29ubmVjdGlvbi1iYXNlJztcbmltcG9ydCB7IGNhc3RUb0VudW0gfSBmcm9tICdAZm9ibGV4L3V0aWxzJztcbmltcG9ydCB7IEZNZWRpYXRvciB9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHsgQWRkU25hcENvbm5lY3Rpb25Ub1N0b3JlUmVxdWVzdCwgUmVtb3ZlU25hcENvbm5lY3Rpb25Gcm9tU3RvcmVSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vZG9tYWluJztcblxubGV0IHVuaXF1ZUlkOiBudW1iZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiZi1zbmFwLWNvbm5lY3Rpb25cIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9mLXNuYXAtY29ubmVjdGlvbi5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFsgXCIuL2Ytc25hcC1jb25uZWN0aW9uLmNvbXBvbmVudC5zY3NzXCIgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICBjbGFzczogXCJmLWNvbXBvbmVudCBmLWNvbm5lY3Rpb24gZi1zbmFwLWNvbm5lY3Rpb25cIlxuICB9LFxuICBwcm92aWRlcnM6IFsgeyBwcm92aWRlOiBGX0NPTk5FQ1RJT04sIHVzZUV4aXN0aW5nOiBGU25hcENvbm5lY3Rpb25Db21wb25lbnQgfSBdLFxufSlcbmV4cG9ydCBjbGFzcyBGU25hcENvbm5lY3Rpb25Db21wb25lbnRcbiAgZXh0ZW5kcyBGQ29ubmVjdGlvbkJhc2UgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwdWJsaWMgb3ZlcnJpZGUgZklkOiBzdHJpbmcgPSBgZi1zbmFwLWNvbm5lY3Rpb24tJHsgdW5pcXVlSWQrKyB9YDtcblxuICBwdWJsaWMgb3ZlcnJpZGUgZlRleHQ6IHN0cmluZyA9ICcnO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBmVGV4dFN0YXJ0T2Zmc2V0OiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb3ZlcnJpZGUgZlN0YXJ0Q29sb3I6IHN0cmluZyA9ICdibGFjayc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG92ZXJyaWRlIGZFbmRDb2xvcjogc3RyaW5nID0gJ2JsYWNrJztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgZlNuYXBUaHJlc2hvbGQ6IG51bWJlciA9IDIwO1xuXG4gIHB1YmxpYyBvdmVycmlkZSBmT3V0cHV0SWQhOiBzdHJpbmc7XG5cbiAgcHVibGljIG92ZXJyaWRlIGZJbnB1dElkITogc3RyaW5nO1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmUmFkaXVzOiBudW1iZXIgPSA4O1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmT2Zmc2V0OiBudW1iZXIgPSAxMjtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06ICh2YWx1ZTogdW5rbm93bikgPT4gY2FzdFRvRW51bSh2YWx1ZSwgJ2ZCZWhhdmlvcicsIEVGQ29ubmVjdGlvbkJlaGF2aW9yKSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkJlaGF2aW9yOiBFRkNvbm5lY3Rpb25CZWhhdmlvciA9IEVGQ29ubmVjdGlvbkJlaGF2aW9yLkZJWEVEO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvdmVycmlkZSBmVHlwZTogRUZDb25uZWN0aW9uVHlwZSB8IHN0cmluZyA9IEVGQ29ubmVjdGlvblR5cGUuU1RSQUlHSFQ7XG5cbiAgcHVibGljIG92ZXJyaWRlIGZEcmFnZ2luZ0Rpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIG92ZXJyaWRlIGZTZWxlY3Rpb25EaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2RlZnMnLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZkRlZnMhOiBFbGVtZW50UmVmPFNWR0RlZnNFbGVtZW50PjtcblxuICBAVmlld0NoaWxkKENPTk5FQ1RJT05fUEFUSCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGZQYXRoITogSUNvbm5lY3Rpb25QYXRoO1xuXG4gIEBWaWV3Q2hpbGQoQ09OTkVDVElPTl9HUkFESUVOVCwgeyBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIG92ZXJyaWRlIGZHcmFkaWVudCE6IElDb25uZWN0aW9uR3JhZGllbnQ7XG5cbiAgQFZpZXdDaGlsZChGQ29ubmVjdGlvbkRyYWdIYW5kbGVFbmRDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBmRHJhZ0hhbmRsZSE6IEZDb25uZWN0aW9uRHJhZ0hhbmRsZUVuZENvbXBvbmVudDtcblxuICBAVmlld0NoaWxkKEZDb25uZWN0aW9uU2VsZWN0aW9uQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZlNlbGVjdGlvbiE6IEZDb25uZWN0aW9uU2VsZWN0aW9uQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoQ09OTkVDVElPTl9URVhULCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgZlRleHRDb21wb25lbnQhOiBJQ29ubmVjdGlvblRleHQ7XG5cbiAgQFZpZXdDaGlsZCgnZkNvbm5lY3Rpb25DZW50ZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHVibGljIG92ZXJyaWRlIGZDb25uZWN0aW9uQ2VudGVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgQENvbnRlbnRDaGlsZHJlbihGQ29ubmVjdGlvbkNlbnRlckRpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwdWJsaWMgZkNvbm5lY3Rpb25DZW50ZXJzITogUXVlcnlMaXN0PEZDb25uZWN0aW9uQ2VudGVyRGlyZWN0aXZlPjtcblxuICBwdWJsaWMgb3ZlcnJpZGUgZ2V0IGJvdW5kaW5nRWxlbWVudCgpOiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmZQYXRoLmhvc3RFbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBfZk1lZGlhdG9yID0gaW5qZWN0KEZNZWRpYXRvcik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWxlbWVudFJlZmVyZW5jZTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgZkNvbm5lY3Rpb25GYWN0b3J5OiBGQ29ubmVjdGlvbkZhY3RvcnksXG4gICkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWZlcmVuY2UsIGZDb25uZWN0aW9uRmFjdG9yeSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IEFkZFNuYXBDb25uZWN0aW9uVG9TdG9yZVJlcXVlc3QodGhpcykpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZShuZXcgTm90aWZ5RGF0YUNoYW5nZWRSZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKG5ldyBSZW1vdmVTbmFwQ29ubmVjdGlvbkZyb21TdG9yZVJlcXVlc3QoKSk7XG4gIH1cbn1cbiIsIjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICA8ZGVmcyAjZGVmcz48L2RlZnM+XG4gIDxnIGNsYXNzPVwiZi1jb25uZWN0aW9uLWdyb3VwXCI+XG4gICAgPGxpbmVhckdyYWRpZW50IGZDb25uZWN0aW9uR3JhZGllbnQ+PC9saW5lYXJHcmFkaWVudD5cbiAgICA8cGF0aCBmQ29ubmVjdGlvblNlbGVjdGlvbiBbYXR0ci5kXT1cInBhdGhcIj48L3BhdGg+XG4gICAgPGc+XG4gICAgICA8cGF0aCBmLWNvbm5lY3Rpb24tcGF0aFxuICAgICAgICAgICAgW2F0dHIuZF09XCJwYXRoXCI+XG4gICAgICA8L3BhdGg+XG4gICAgICA8Y2lyY2xlIGYtY29ubmVjdGlvbi1kcmFnLWhhbmRsZS1lbmQ+PC9jaXJjbGU+XG4gICAgPC9nPlxuICAgIDx0ZXh0IGYtY29ubmVjdGlvbi10ZXh0PjwvdGV4dD5cbiAgPC9nPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L3N2Zz5cbjxkaXYgI2ZDb25uZWN0aW9uQ2VudGVyIGNsYXNzPVwiZi1jb25uZWN0aW9uLWNlbnRlclwiICpuZ0lmPVwiZkNvbm5lY3Rpb25DZW50ZXJzLmxlbmd0aFwiPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbZkNvbm5lY3Rpb25DZW50ZXJdXCI+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=