ngx-vflow 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,6 +17,7 @@ import { HandleSizeControllerDirective } from '../../directives/handle-size-cont
17
17
  import { NgTemplateOutlet, NgComponentOutlet } from '@angular/common';
18
18
  import { DefaultNodeComponent } from '../default-node/default-node.component';
19
19
  import { PointerDirective } from '../../directives/pointer.directive';
20
+ // TODO: fix loading of these by @defer (should work in Angular 18+)
20
21
  // public components that uses in default node (loaded by defer)
21
22
  import { ResizableComponent } from '../../public-components/resizable/resizable.component';
22
23
  import { HandleComponent } from '../../public-components/handle/handle.component';
@@ -104,7 +105,7 @@ export class NodeComponent {
104
105
  }
105
106
  }
106
107
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
107
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { nodeModel: { classPropertyName: "nodeModel", publicName: "nodeModel", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n @defer {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n }\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n @defer {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n }\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
108
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { nodeModel: { classPropertyName: "nodeModel", publicName: "nodeModel", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
108
109
  }
109
110
  __decorate([
110
111
  InjectionContext
@@ -124,6 +125,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
124
125
  NgComponentOutlet,
125
126
  ResizableComponent,
126
127
  HandleSizeControllerDirective,
127
- ], template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n @defer {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n }\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n @defer {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n }\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
128
+ ], template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
128
129
  }], propDecorators: { ngOnInit: [], ngAfterViewInit: [] } });
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFJTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FB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QkFDaEIsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLDZCQUE2QjtxQkFDOUI7OEJBdUNNLFFBQVEsTUFrQ1IsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBUZW1wbGF0ZVJlZixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IERyYWdnYWJsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kcmFnZ2FibGUuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvbm9kZS5tb2RlbCc7XG5pbXBvcnQgeyBGbG93U3RhdHVzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc3RhdHVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2hhbmRsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEhhbmRsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2hhbmRsZS5tb2RlbCc7XG5pbXBvcnQgeyByZXNpemFibGUgfSBmcm9tICcuLi8uLi91dGlscy9yZXNpemFibGUnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEluamVjdGlvbkNvbnRleHQsXG4gIFdpdGhJbmplY3Rvcixcbn0gZnJvbSAnLi4vLi4vZGVjb3JhdG9ycy9ydW4taW4taW5qZWN0aW9uLWNvbnRleHQuZGVjb3JhdG9yJztcbmltcG9ydCB7IE5vZGVSZW5kZXJpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1yZW5kZXJpbmcuc2VydmljZSc7XG5pbXBvcnQgeyBGbG93U2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDb25uZWN0aW9uQ29udHJvbGxlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvY29ubmVjdGlvbi1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOb2RlQWNjZXNzb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm9kZS1hY2Nlc3Nvci5zZXJ2aWNlJztcbmltcG9ydCB7IE92ZXJsYXlzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL292ZXJsYXlzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSGFuZGxlU2l6ZUNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2hhbmRsZS1zaXplLWNvbnRyb2xsZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQsIE5nQ29tcG9uZW50T3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERlZmF1bHROb2RlQ29tcG9uZW50IH0gZnJvbSAnLi4vZGVmYXVsdC1ub2RlL2RlZmF1bHQtbm9kZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9pbnRlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvcG9pbnRlci5kaXJlY3RpdmUnO1xuLy8gcHVibGljIGNvbXBvbmVudHMgdGhhdCB1c2VzIGluIGRlZmF1bHQgbm9kZSAobG9hZGVkIGJ5IGRlZmVyKVxuaW1wb3J0IHsgUmVzaXphYmxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvcmVzaXphYmxlL3Jlc2l6YWJsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vcHVibGljLWNvbXBvbmVudHMvaGFuZGxlL2hhbmRsZS5jb21wb25lbnQnO1xuXG5leHBvcnQgdHlwZSBIYW5kbGVTdGF0ZSA9ICd2YWxpZCcgfCAnaW52YWxpZCcgfCAnaWRsZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2dbbm9kZV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vbm9kZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHByb3ZpZGVyczogW0hhbmRsZVNlcnZpY2UsIE5vZGVBY2Nlc3NvclNlcnZpY2VdLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICd2Zmxvdy1ub2RlJyxcbiAgfSxcbiAgaW1wb3J0czogW1xuICAgIFBvaW50ZXJEaXJlY3RpdmUsXG4gICAgRGVmYXVsdE5vZGVDb21wb25lbnQsXG4gICAgSGFuZGxlQ29tcG9uZW50LFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgTmdDb21wb25lbnRPdXRsZXQsXG4gICAgUmVzaXphYmxlQ29tcG9uZW50LFxuICAgIEhhbmRsZVNpemVDb250cm9sbGVyRGlyZWN0aXZlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBOb2RlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIFdpdGhJbmplY3RvciB7XG4gIHB1YmxpYyBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgaGFuZGxlU2VydmljZSA9IGluamVjdChIYW5kbGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBkcmFnZ2FibGVTZXJ2aWNlID0gaW5qZWN0KERyYWdnYWJsZVNlcnZpY2UpO1xuICBwcml2YXRlIGZsb3dTdGF0dXNTZXJ2aWNlID0gaW5qZWN0KEZsb3dTdGF0dXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBub2RlUmVuZGVyaW5nU2VydmljZSA9IGluamVjdChOb2RlUmVuZGVyaW5nU2VydmljZSk7XG4gIHByaXZhdGUgZmxvd1NldHRpbmdzU2VydmljZSA9IGluamVjdChGbG93U2V0dGluZ3NTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIGhvc3RSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxTVkdFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgY29ubmVjdGlvbkNvbnRyb2xsZXIgPSBpbmplY3QoQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUpO1xuICBwcml2YXRlIG5vZGVBY2Nlc3NvciA9IGluamVjdChOb2RlQWNjZXNzb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBvdmVybGF5c1NlcnZpY2UgPSBpbmplY3QoT3ZlcmxheXNTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB6b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgcHVibGljIG5vZGVNb2RlbCA9IGlucHV0LnJlcXVpcmVkPE5vZGVNb2RlbD4oKTtcblxuICBwdWJsaWMgbm9kZVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgZ3JvdXBOb2RlVGVtcGxhdGUgPSBpbnB1dDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xuXG4gIHB1YmxpYyBodG1sV3JhcHBlclJlZiA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2h0bWxXcmFwcGVyJyk7XG5cbiAgcHJvdGVjdGVkIHNob3dNYWduZXQgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ2Nvbm5lY3Rpb24tc3RhcnQnIHx8XG4gICAgICB0aGlzLmZsb3dTdGF0dXNTZXJ2aWNlLnN0YXR1cygpLnN0YXRlID09PSAnY29ubmVjdGlvbi12YWxpZGF0aW9uJyxcbiAgKTtcblxuICBwcm90ZWN0ZWQgc3R5bGVXaWR0aCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMubm9kZU1vZGVsKCkuc2l6ZSgpLndpZHRofXB4YCk7XG4gIHByb3RlY3RlZCBzdHlsZUhlaWdodCA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMubm9kZU1vZGVsKCkuc2l6ZSgpLmhlaWdodH1weGApO1xuXG4gIHByb3RlY3RlZCB0b29sYmFyID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLm92ZXJsYXlzU2VydmljZS5ub2RlVG9vbGJhcnMoKS5nZXQodGhpcy5ub2RlTW9kZWwoKSksXG4gICk7XG5cbiAgQEluamVjdGlvbkNvbnRleHRcbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMubm9kZUFjY2Vzc29yLm1vZGVsLnNldCh0aGlzLm5vZGVNb2RlbCgpKTtcblxuICAgIHRoaXMuaGFuZGxlU2VydmljZS5ub2RlLnNldCh0aGlzLm5vZGVNb2RlbCgpKTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5ub2RlTW9kZWwoKS5kcmFnZ2FibGUoKSkge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZW5hYmxlKFxuICAgICAgICAgIHRoaXMuaG9zdFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMubm9kZU1vZGVsKCksXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGlzYWJsZSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5vZGVNb2RlbCgpXG4gICAgICAuaGFuZGxlcyQucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChoYW5kbGVzKSA9PlxuICAgICAgICAgIHJlc2l6YWJsZShcbiAgICAgICAgICAgIGhhbmRsZXMubWFwKChoKSA9PiBoLnBhcmVudFJlZmVyZW5jZSEpLFxuICAgICAgICAgICAgdGhpcy56b25lLFxuICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gaGFuZGxlcykpLFxuICAgICAgICApLFxuICAgICAgICB0YXAoKGhhbmRsZXMpID0+IHtcbiAgICAgICAgICAvLyBUT0RPIChwZXJmb3JtYW5jZSkgaW5zcGVjdCBob3cgdG8gYXZvaWQgY2FsbHMgb2YgdGhpcyB3aGVuIGZsb3cgaW5pdGlhbGx5IHJlbmRlcmVkXG4gICAgICAgICAgaGFuZGxlcy5mb3JFYWNoKChoKSA9PiBoLnVwZGF0ZVBhcmVudCgpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgQEluamVjdGlvbkNvbnRleHRcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVNb2RlbCgpLmxpbmtEZWZhdWx0Tm9kZVNpemVXaXRoTW9kZWxTaXplKCk7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLm5vZGVNb2RlbCgpLm5vZGUudHlwZSA9PT0gJ2h0bWwtdGVtcGxhdGUnIHx8XG4gICAgICB0aGlzLm5vZGVNb2RlbCgpLmlzQ29tcG9uZW50VHlwZVxuICAgICkge1xuICAgICAgcmVzaXphYmxlKFt0aGlzLmh0bWxXcmFwcGVyUmVmKCkubmF0aXZlRWxlbWVudF0sIHRoaXMuem9uZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgIHRhcCgoKSA9PlxuICAgICAgICAgICAgdGhpcy5ub2RlTW9kZWwoKVxuICAgICAgICAgICAgICAuaGFuZGxlcygpXG4gICAgICAgICAgICAgIC5mb3JFYWNoKChoKSA9PiBoLnVwZGF0ZVBhcmVudCgpKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGZpbHRlcigoKSA9PiAhdGhpcy5ub2RlTW9kZWwoKS5yZXNpemluZygpKSxcbiAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmh0bWxXcmFwcGVyUmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuaHRtbFdyYXBwZXJSZWYoKS5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgICAgICAgICAgdGhpcy5ub2RlTW9kZWwoKS5zaXplLnNldCh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYWdnYWJsZVNlcnZpY2UuZGVzdHJveSh0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhcnRDb25uZWN0aW9uKGV2ZW50OiBFdmVudCwgaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIC8vIGlnbm9yZSBkcmFnIGJ5IHN0b3BwaW5nIHByb3BhZ2F0aW9uXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyLnN0YXJ0Q29ubmVjdGlvbihoYW5kbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci52YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGU6IEhhbmRsZU1vZGVsKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci5yZXNldFZhbGlkYXRlQ29ubmVjdGlvbih0YXJnZXRIYW5kbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVuZENvbm5lY3Rpb24oaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXIuZW5kQ29ubmVjdGlvbihoYW5kbGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHB1bGxOb2RlKCkge1xuICAgIHRoaXMubm9kZVJlbmRlcmluZ1NlcnZpY2UucHVsbE5vZGUodGhpcy5ub2RlTW9kZWwoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2VsZWN0Tm9kZSgpIHtcbiAgICBpZiAodGhpcy5mbG93U2V0dGluZ3NTZXJ2aWNlLmVudGl0aWVzU2VsZWN0YWJsZSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvblNlcnZpY2Uuc2VsZWN0KHRoaXMubm9kZU1vZGVsKCkpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLSBEZWZhdWx0IG5vZGUgLS0+XG5AaWYgKG5vZGVNb2RlbCgpLm5vZGUudHlwZSA9PT0gXCJkZWZhdWx0XCIpIHtcbiAgQGRlZmVyIHtcbiAgICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICAgIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGVNb2RlbCgpLnNpemUoKS5oZWlnaHRcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJwdWxsTm9kZSgpOyBzZWxlY3ROb2RlKClcIlxuICAgID5cbiAgICAgIDxkZWZhdWx0LW5vZGVcbiAgICAgICAgI2h0bWxXcmFwcGVyXG4gICAgICAgIFtzZWxlY3RlZF09XCJub2RlTW9kZWwoKS5zZWxlY3RlZCgpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoXT1cInN0eWxlV2lkdGgoKVwiXG4gICAgICAgIFtzdHlsZS5oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwic3R5bGVXaWR0aCgpXCJcbiAgICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgW291dGVySFRNTF09XCJub2RlTW9kZWwoKS50ZXh0KClcIj48L2Rpdj5cblxuICAgICAgICA8aGFuZGxlIHR5cGU9XCJzb3VyY2VcIiBwb3NpdGlvbj1cInJpZ2h0XCIvPlxuICAgICAgICA8aGFuZGxlIHR5cGU9XCJ0YXJnZXRcIiBwb3NpdGlvbj1cImxlZnRcIiAvPlxuICAgICAgPC9kZWZhdWx0LW5vZGU+XG4gICAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbiAgfVxufVxuXG48IS0tIFRlbXBsYXRlIG5vZGUgLS0+XG5AaWYgKG5vZGVNb2RlbCgpLm5vZGUudHlwZSA9PT0gXCJodG1sLXRlbXBsYXRlXCIgJiYgbm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJub2RlTW9kZWwoKS5zaXplKCkuaGVpZ2h0XCJcbiAgICAocG9pbnRlclN0YXJ0KT1cInB1bGxOb2RlKClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgI2h0bWxXcmFwcGVyXG4gICAgICBjbGFzcz1cIndyYXBwZXJcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cInN0eWxlV2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwibm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgJGltcGxpY2l0OiB7IG5vZGU6IG5vZGVNb2RlbCgpLm5vZGUsIHNlbGVjdGVkOiBub2RlTW9kZWwoKS5zZWxlY3RlZCB9LFxuICAgICAgICB9XCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICA8L3N2Zzpmb3JlaWduT2JqZWN0PlxufVxuXG48IS0tIENvbXBvbmVudCBub2RlIC0tPlxuQGlmIChub2RlTW9kZWwoKS5pc0NvbXBvbmVudFR5cGUpIHtcbiAgPHN2Zzpmb3JlaWduT2JqZWN0XG4gICAgY2xhc3M9XCJzZWxlY3RhYmxlXCJcbiAgICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJub2RlTW9kZWwoKS5zaXplKCkuaGVpZ2h0XCJcbiAgICAocG9pbnRlclN0YXJ0KT1cInB1bGxOb2RlKClcIlxuICA+XG4gICAgPGRpdlxuICAgICAgI2h0bWxXcmFwcGVyXG4gICAgICBjbGFzcz1cIndyYXBwZXJcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cInN0eWxlV2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nQ29tcG9uZW50T3V0bGV0XT1cIiRhbnkobm9kZU1vZGVsKCkubm9kZS50eXBlKVwiXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldElucHV0c109XCJub2RlTW9kZWwoKS5jb21wb25lbnRUeXBlSW5wdXRzXCJcbiAgICAgICAgW25nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBEZWZhdWx0IGdyb3VwIG5vZGUgLS0+XG5AaWYgKG5vZGVNb2RlbCgpLm5vZGUudHlwZSA9PT0gXCJkZWZhdWx0LWdyb3VwXCIpIHtcbiAgQGRlZmVyIHtcbiAgICA8c3ZnOnJlY3RcbiAgICAgIFtyZXNpemFibGVdPVwibm9kZU1vZGVsKCkucmVzaXphYmxlKClcIlxuICAgICAgW2dhcF09XCIzXCJcbiAgICAgIFtyZXNpemVyQ29sb3JdPVwibm9kZU1vZGVsKCkuY29sb3IoKVwiXG4gICAgICBjbGFzcz1cImRlZmF1bHQtZ3JvdXAtbm9kZVwiXG4gICAgICByeD1cIjVcIlxuICAgICAgcnk9XCI1XCJcbiAgICAgIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibm9kZU1vZGVsKCkuc2VsZWN0ZWQoKVwiXG4gICAgICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cIm5vZGVNb2RlbCgpLnNpemUoKS5oZWlnaHRcIlxuICAgICAgW3N0eWxlLnN0cm9rZV09XCJub2RlTW9kZWwoKS5jb2xvcigpXCJcbiAgICAgIFtzdHlsZS5maWxsXT1cIm5vZGVNb2RlbCgpLmNvbG9yKClcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJwdWxsTm9kZSgpOyBzZWxlY3ROb2RlKClcIlxuICAgIC8+XG4gIH1cbn1cblxuPCEtLSBUZW1wbGF0ZSBncm91cCBub2RlICAtLT5cbkBpZiAobm9kZU1vZGVsKCkubm9kZS50eXBlID09PSBcInRlbXBsYXRlLWdyb3VwXCIgJiYgZ3JvdXBOb2RlVGVtcGxhdGUoKSkge1xuICA8c3ZnOmcgY2xhc3M9XCJzZWxlY3RhYmxlXCIgKHBvaW50ZXJTdGFydCk9XCJwdWxsTm9kZSgpXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBOb2RlVGVtcGxhdGUoKSA/PyBudWxsXCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICRpbXBsaWNpdDoge1xuICAgICAgICAgIG5vZGU6IG5vZGVNb2RlbCgpLm5vZGUsXG4gICAgICAgICAgc2VsZWN0ZWQ6IG5vZGVNb2RlbCgpLnNlbGVjdGVkLFxuICAgICAgICAgIHdpZHRoOiBub2RlTW9kZWwoKS53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IG5vZGVNb2RlbCgpLmhlaWdodCxcbiAgICAgICAgfSxcbiAgICAgIH1cIlxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gICAgLz5cbiAgPC9zdmc6Zz5cbn1cblxuPCEtLSBSZXNpemVyIC0tPlxuQGlmIChub2RlTW9kZWwoKS5yZXNpemVyVGVtcGxhdGUoKTsgYXMgdGVtcGxhdGUpIHtcbiAgQGlmIChub2RlTW9kZWwoKS5yZXNpemFibGUoKSkge1xuICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gIH1cbn1cblxuPCEtLSBIYW5kbGVzIC0tPlxuQGZvciAoaGFuZGxlIG9mIG5vZGVNb2RlbCgpLmhhbmRsZXMoKTsgdHJhY2sgaGFuZGxlKSB7XG4gIEBpZiAoIWhhbmRsZS50ZW1wbGF0ZSkge1xuICAgIDxzdmc6Y2lyY2xlXG4gICAgICBjbGFzcz1cImRlZmF1bHQtaGFuZGxlXCJcbiAgICAgIFthdHRyLmN4XT1cImhhbmRsZS5vZmZzZXQoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cImhhbmRsZS5vZmZzZXQoKS55XCJcbiAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJoYW5kbGUuc3Ryb2tlV2lkdGhcIlxuICAgICAgcj1cIjVcIlxuICAgICAgKHBvaW50ZXJTdGFydCk9XCJzdGFydENvbm5lY3Rpb24oJGV2ZW50LCBoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgLz5cbiAgfVxuXG4gIEBpZiAoaGFuZGxlLnRlbXBsYXRlKSB7XG4gICAgPHN2ZzpnXG4gICAgICBbaGFuZGxlU2l6ZUNvbnRyb2xsZXJdPVwiaGFuZGxlXCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoYW5kbGUudGVtcGxhdGU7IGNvbnRleHQ6IGhhbmRsZS50ZW1wbGF0ZUNvbnRleHRcIlxuICAgICAgLz5cbiAgICA8L3N2ZzpnPlxuICB9XG5cbiAgQGlmIChzaG93TWFnbmV0KCkpIHtcbiAgICA8c3ZnOmNpcmNsZVxuICAgICAgY2xhc3M9XCJtYWduZXRcIlxuICAgICAgW2F0dHIucl09XCJub2RlTW9kZWwoKS5tYWduZXRSYWRpdXNcIlxuICAgICAgW2F0dHIuY3hdPVwiaGFuZGxlLm9mZnNldCgpLnhcIlxuICAgICAgW2F0dHIuY3ldPVwiaGFuZGxlLm9mZnNldCgpLnlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbihoYW5kbGUpOyByZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAgIChwb2ludGVyT3Zlcik9XCJ2YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgICAocG9pbnRlck91dCk9XCJyZXNldFZhbGlkYXRlQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICAvPlxuICB9XG59XG5cbjwhLS0gVG9vbGJhciAtLT5cbkBpZiAodG9vbGJhcigpOyBhcyB0b29sYmFyKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICAgIFthdHRyLndpZHRoXT1cInRvb2xiYXIuc2l6ZSgpLndpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwidG9vbGJhci5zaXplKCkuaGVpZ2h0XCJcbiAgICBbYXR0ci50cmFuc2Zvcm1dPVwidG9vbGJhci50cmFuc2Zvcm0oKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2xiYXIudGVtcGxhdGUoKVwiIC8+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG4iXX0=
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdmZsb3ctbGliL3NyYy9saWIvdmZsb3cvY29tcG9uZW50cy9ub2RlL25vZGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXZmbG93LWxpYi9zcmMvbGliL3ZmbG93L2NvbXBvbmVudHMvbm9kZS9ub2RlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE1BQU0sRUFJTixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRXBFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixHQUVqQixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FB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QkFDUCxnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQiw2QkFBNkI7cUJBQzlCOzhCQXVDTSxRQUFRLE1Ba0NSLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIGNvbXB1dGVkLFxuICBlZmZlY3QsXG4gIGluamVjdCxcbiAgaW5wdXQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEcmFnZ2FibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZHJhZ2dhYmxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL25vZGUubW9kZWwnO1xuaW1wb3J0IHsgRmxvd1N0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LXN0YXR1cy5zZXJ2aWNlJztcbmltcG9ydCB7IEhhbmRsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9oYW5kbGUuc2VydmljZSc7XG5pbXBvcnQgeyBIYW5kbGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9oYW5kbGUubW9kZWwnO1xuaW1wb3J0IHsgcmVzaXphYmxlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVzaXphYmxlJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzdGFydFdpdGgsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJbmplY3Rpb25Db250ZXh0LFxuICBXaXRoSW5qZWN0b3IsXG59IGZyb20gJy4uLy4uL2RlY29yYXRvcnMvcnVuLWluLWluamVjdGlvbi1jb250ZXh0LmRlY29yYXRvcic7XG5pbXBvcnQgeyBOb2RlUmVuZGVyaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtcmVuZGVyaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmxvd1NldHRpbmdzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zsb3ctc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkNvbnRyb2xsZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2Nvbm5lY3Rpb24tY29udHJvbGxlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTm9kZUFjY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vZGUtYWNjZXNzb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBPdmVybGF5c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9vdmVybGF5cy5zZXJ2aWNlJztcbmltcG9ydCB7IEhhbmRsZVNpemVDb250cm9sbGVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9oYW5kbGUtc2l6ZS1jb250cm9sbGVyLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0LCBOZ0NvbXBvbmVudE91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBEZWZhdWx0Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4uL2RlZmF1bHQtbm9kZS9kZWZhdWx0LW5vZGUuY29tcG9uZW50JztcbmltcG9ydCB7IFBvaW50ZXJEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3BvaW50ZXIuZGlyZWN0aXZlJztcblxuLy8gVE9ETzogZml4IGxvYWRpbmcgb2YgdGhlc2UgYnkgQGRlZmVyIChzaG91bGQgd29yayBpbiBBbmd1bGFyIDE4Kylcbi8vIHB1YmxpYyBjb21wb25lbnRzIHRoYXQgdXNlcyBpbiBkZWZhdWx0IG5vZGUgKGxvYWRlZCBieSBkZWZlcilcbmltcG9ydCB7IFJlc2l6YWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B1YmxpYy1jb21wb25lbnRzL3Jlc2l6YWJsZS9yZXNpemFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEhhbmRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL3B1YmxpYy1jb21wb25lbnRzL2hhbmRsZS9oYW5kbGUuY29tcG9uZW50JztcblxuZXhwb3J0IHR5cGUgSGFuZGxlU3RhdGUgPSAndmFsaWQnIHwgJ2ludmFsaWQnIHwgJ2lkbGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdnW25vZGVdJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9ub2RlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtIYW5kbGVTZXJ2aWNlLCBOb2RlQWNjZXNzb3JTZXJ2aWNlXSxcbiAgaG9zdDoge1xuICAgIGNsYXNzOiAndmZsb3ctbm9kZScsXG4gIH0sXG4gIGltcG9ydHM6IFtcbiAgICBQb2ludGVyRGlyZWN0aXZlLFxuICAgIERlZmF1bHROb2RlQ29tcG9uZW50LFxuICAgIEhhbmRsZUNvbXBvbmVudCxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIE5nQ29tcG9uZW50T3V0bGV0LFxuICAgIFJlc2l6YWJsZUNvbXBvbmVudCxcbiAgICBIYW5kbGVTaXplQ29udHJvbGxlckRpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTm9kZUNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBXaXRoSW5qZWN0b3Ige1xuICBwdWJsaWMgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuICBwcml2YXRlIGhhbmRsZVNlcnZpY2UgPSBpbmplY3QoSGFuZGxlU2VydmljZSk7XG4gIHByaXZhdGUgZHJhZ2dhYmxlU2VydmljZSA9IGluamVjdChEcmFnZ2FibGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmbG93U3RhdHVzU2VydmljZSA9IGluamVjdChGbG93U3RhdHVzU2VydmljZSk7XG4gIHByaXZhdGUgbm9kZVJlbmRlcmluZ1NlcnZpY2UgPSBpbmplY3QoTm9kZVJlbmRlcmluZ1NlcnZpY2UpO1xuICBwcml2YXRlIGZsb3dTZXR0aW5nc1NlcnZpY2UgPSBpbmplY3QoRmxvd1NldHRpbmdzU2VydmljZSk7XG4gIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZSA9IGluamVjdChTZWxlY3Rpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8U1ZHRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIGNvbm5lY3Rpb25Db250cm9sbGVyID0gaW5qZWN0KENvbm5lY3Rpb25Db250cm9sbGVyRGlyZWN0aXZlKTtcbiAgcHJpdmF0ZSBub2RlQWNjZXNzb3IgPSBpbmplY3QoTm9kZUFjY2Vzc29yU2VydmljZSk7XG4gIHByaXZhdGUgb3ZlcmxheXNTZXJ2aWNlID0gaW5qZWN0KE92ZXJsYXlzU2VydmljZSk7XG4gIHByaXZhdGUgem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIHB1YmxpYyBub2RlTW9kZWwgPSBpbnB1dC5yZXF1aXJlZDxOb2RlTW9kZWw+KCk7XG5cbiAgcHVibGljIG5vZGVUZW1wbGF0ZSA9IGlucHV0PFRlbXBsYXRlUmVmPGFueT4+KCk7XG5cbiAgcHVibGljIGdyb3VwTm9kZVRlbXBsYXRlID0gaW5wdXQ8VGVtcGxhdGVSZWY8YW55Pj4oKTtcblxuICBwdWJsaWMgaHRtbFdyYXBwZXJSZWYgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdodG1sV3JhcHBlcicpO1xuXG4gIHByb3RlY3RlZCBzaG93TWFnbmV0ID0gY29tcHV0ZWQoXG4gICAgKCkgPT5cbiAgICAgIHRoaXMuZmxvd1N0YXR1c1NlcnZpY2Uuc3RhdHVzKCkuc3RhdGUgPT09ICdjb25uZWN0aW9uLXN0YXJ0JyB8fFxuICAgICAgdGhpcy5mbG93U3RhdHVzU2VydmljZS5zdGF0dXMoKS5zdGF0ZSA9PT0gJ2Nvbm5lY3Rpb24tdmFsaWRhdGlvbicsXG4gICk7XG5cbiAgcHJvdGVjdGVkIHN0eWxlV2lkdGggPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLm5vZGVNb2RlbCgpLnNpemUoKS53aWR0aH1weGApO1xuICBwcm90ZWN0ZWQgc3R5bGVIZWlnaHQgPSBjb21wdXRlZCgoKSA9PiBgJHt0aGlzLm5vZGVNb2RlbCgpLnNpemUoKS5oZWlnaHR9cHhgKTtcblxuICBwcm90ZWN0ZWQgdG9vbGJhciA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5vdmVybGF5c1NlcnZpY2Uubm9kZVRvb2xiYXJzKCkuZ2V0KHRoaXMubm9kZU1vZGVsKCkpLFxuICApO1xuXG4gIEBJbmplY3Rpb25Db250ZXh0XG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm5vZGVBY2Nlc3Nvci5tb2RlbC5zZXQodGhpcy5ub2RlTW9kZWwoKSk7XG5cbiAgICB0aGlzLmhhbmRsZVNlcnZpY2Uubm9kZS5zZXQodGhpcy5ub2RlTW9kZWwoKSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubm9kZU1vZGVsKCkuZHJhZ2dhYmxlKCkpIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmVuYWJsZShcbiAgICAgICAgICB0aGlzLmhvc3RSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICB0aGlzLm5vZGVNb2RlbCgpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRpc2FibGUodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5ub2RlTW9kZWwoKVxuICAgICAgLmhhbmRsZXMkLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoaGFuZGxlcykgPT5cbiAgICAgICAgICByZXNpemFibGUoXG4gICAgICAgICAgICBoYW5kbGVzLm1hcCgoaCkgPT4gaC5wYXJlbnRSZWZlcmVuY2UhKSxcbiAgICAgICAgICAgIHRoaXMuem9uZSxcbiAgICAgICAgICApLnBpcGUobWFwKCgpID0+IGhhbmRsZXMpKSxcbiAgICAgICAgKSxcbiAgICAgICAgdGFwKChoYW5kbGVzKSA9PiB7XG4gICAgICAgICAgLy8gVE9ETyAocGVyZm9ybWFuY2UpIGluc3BlY3QgaG93IHRvIGF2b2lkIGNhbGxzIG9mIHRoaXMgd2hlbiBmbG93IGluaXRpYWxseSByZW5kZXJlZFxuICAgICAgICAgIGhhbmRsZXMuZm9yRWFjaCgoaCkgPT4gaC51cGRhdGVQYXJlbnQoKSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIEBJbmplY3Rpb25Db250ZXh0XG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlTW9kZWwoKS5saW5rRGVmYXVsdE5vZGVTaXplV2l0aE1vZGVsU2l6ZSgpO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5ub2RlTW9kZWwoKS5ub2RlLnR5cGUgPT09ICdodG1sLXRlbXBsYXRlJyB8fFxuICAgICAgdGhpcy5ub2RlTW9kZWwoKS5pc0NvbXBvbmVudFR5cGVcbiAgICApIHtcbiAgICAgIHJlc2l6YWJsZShbdGhpcy5odG1sV3JhcHBlclJlZigpLm5hdGl2ZUVsZW1lbnRdLCB0aGlzLnpvbmUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICB0YXAoKCkgPT5cbiAgICAgICAgICAgIHRoaXMubm9kZU1vZGVsKClcbiAgICAgICAgICAgICAgLmhhbmRsZXMoKVxuICAgICAgICAgICAgICAuZm9yRWFjaCgoaCkgPT4gaC51cGRhdGVQYXJlbnQoKSksXG4gICAgICAgICAgKSxcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMubm9kZU1vZGVsKCkucmVzaXppbmcoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gdGhpcy5odG1sV3JhcHBlclJlZigpLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmh0bWxXcmFwcGVyUmVmKCkubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgICAgIHRoaXMubm9kZU1vZGVsKCkuc2l6ZS5zZXQoeyB3aWR0aCwgaGVpZ2h0IH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2FibGVTZXJ2aWNlLmRlc3Ryb3kodGhpcy5ob3N0UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXJ0Q29ubmVjdGlvbihldmVudDogRXZlbnQsIGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICAvLyBpZ25vcmUgZHJhZyBieSBzdG9wcGluZyBwcm9wYWdhdGlvblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5jb25uZWN0aW9uQ29udHJvbGxlci5zdGFydENvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXIudmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24odGFyZ2V0SGFuZGxlOiBIYW5kbGVNb2RlbCkge1xuICAgIHRoaXMuY29ubmVjdGlvbkNvbnRyb2xsZXIucmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24odGFyZ2V0SGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBlbmRDb25uZWN0aW9uKGhhbmRsZTogSGFuZGxlTW9kZWwpIHtcbiAgICB0aGlzLmNvbm5lY3Rpb25Db250cm9sbGVyLmVuZENvbm5lY3Rpb24oaGFuZGxlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwdWxsTm9kZSgpIHtcbiAgICB0aGlzLm5vZGVSZW5kZXJpbmdTZXJ2aWNlLnB1bGxOb2RlKHRoaXMubm9kZU1vZGVsKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdE5vZGUoKSB7XG4gICAgaWYgKHRoaXMuZmxvd1NldHRpbmdzU2VydmljZS5lbnRpdGllc1NlbGVjdGFibGUoKSkge1xuICAgICAgdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdCh0aGlzLm5vZGVNb2RlbCgpKTtcbiAgICB9XG4gIH1cbn1cbiIsIjwhLS0gRGVmYXVsdCBub2RlIC0tPlxuQGlmIChub2RlTW9kZWwoKS5ub2RlLnR5cGUgPT09IFwiZGVmYXVsdFwiKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICBjbGFzcz1cInNlbGVjdGFibGVcIlxuICBbYXR0ci53aWR0aF09XCJub2RlTW9kZWwoKS5zaXplKCkud2lkdGhcIlxuICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gIChwb2ludGVyU3RhcnQpPVwicHVsbE5vZGUoKTsgc2VsZWN0Tm9kZSgpXCJcbiAgPlxuICAgIDxkZWZhdWx0LW5vZGVcbiAgICAgICNodG1sV3JhcHBlclxuICAgICAgW3NlbGVjdGVkXT1cIm5vZGVNb2RlbCgpLnNlbGVjdGVkKClcIlxuICAgICAgW3N0eWxlLndpZHRoXT1cInN0eWxlV2lkdGgoKVwiXG4gICAgICBbc3R5bGUuaGVpZ2h0XT1cInN0eWxlSGVpZ2h0KClcIlxuICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLm1heC1oZWlnaHRdPVwic3R5bGVIZWlnaHQoKVwiXG4gICAgPlxuICAgICAgPGRpdiBbb3V0ZXJIVE1MXT1cIm5vZGVNb2RlbCgpLnRleHQoKVwiPjwvZGl2PlxuXG4gICAgICA8aGFuZGxlIHR5cGU9XCJzb3VyY2VcIiBwb3NpdGlvbj1cInJpZ2h0XCIvPlxuICAgICAgPGhhbmRsZSB0eXBlPVwidGFyZ2V0XCIgcG9zaXRpb249XCJsZWZ0XCIgLz5cbiAgICA8L2RlZmF1bHQtbm9kZT5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBUZW1wbGF0ZSBub2RlIC0tPlxuQGlmIChub2RlTW9kZWwoKS5ub2RlLnR5cGUgPT09IFwiaHRtbC10ZW1wbGF0ZVwiICYmIG5vZGVUZW1wbGF0ZSgpKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICAgIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gICAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLndpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gICAgKHBvaW50ZXJTdGFydCk9XCJwdWxsTm9kZSgpXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgICNodG1sV3JhcHBlclxuICAgICAgY2xhc3M9XCJ3cmFwcGVyXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLmhlaWdodF09XCJzdHlsZUhlaWdodCgpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5vZGVUZW1wbGF0ZSgpID8/IG51bGxcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICRpbXBsaWNpdDogeyBub2RlOiBub2RlTW9kZWwoKS5ub2RlLCBzZWxlY3RlZDogbm9kZU1vZGVsKCkuc2VsZWN0ZWQgfSxcbiAgICAgICAgfVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgPC9zdmc6Zm9yZWlnbk9iamVjdD5cbn1cblxuPCEtLSBDb21wb25lbnQgbm9kZSAtLT5cbkBpZiAobm9kZU1vZGVsKCkuaXNDb21wb25lbnRUeXBlKSB7XG4gIDxzdmc6Zm9yZWlnbk9iamVjdFxuICAgIGNsYXNzPVwic2VsZWN0YWJsZVwiXG4gICAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLndpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gICAgKHBvaW50ZXJTdGFydCk9XCJwdWxsTm9kZSgpXCJcbiAgPlxuICAgIDxkaXZcbiAgICAgICNodG1sV3JhcHBlclxuICAgICAgY2xhc3M9XCJ3cmFwcGVyXCJcbiAgICAgIFtzdHlsZS53aWR0aF09XCJzdHlsZVdpZHRoKClcIlxuICAgICAgW3N0eWxlLmhlaWdodF09XCJzdHlsZUhlaWdodCgpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldF09XCIkYW55KG5vZGVNb2RlbCgpLm5vZGUudHlwZSlcIlxuICAgICAgICBbbmdDb21wb25lbnRPdXRsZXRJbnB1dHNdPVwibm9kZU1vZGVsKCkuY29tcG9uZW50VHlwZUlucHV0c1wiXG4gICAgICAgIFtuZ0NvbXBvbmVudE91dGxldEluamVjdG9yXT1cImluamVjdG9yXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIDwvc3ZnOmZvcmVpZ25PYmplY3Q+XG59XG5cbjwhLS0gRGVmYXVsdCBncm91cCBub2RlIC0tPlxuQGlmIChub2RlTW9kZWwoKS5ub2RlLnR5cGUgPT09IFwiZGVmYXVsdC1ncm91cFwiKSB7XG4gIDxzdmc6cmVjdFxuICAgIFtyZXNpemFibGVdPVwibm9kZU1vZGVsKCkucmVzaXphYmxlKClcIlxuICAgIFtnYXBdPVwiM1wiXG4gICAgW3Jlc2l6ZXJDb2xvcl09XCJub2RlTW9kZWwoKS5jb2xvcigpXCJcbiAgICBjbGFzcz1cImRlZmF1bHQtZ3JvdXAtbm9kZVwiXG4gICAgcng9XCI1XCJcbiAgICByeT1cIjVcIlxuICAgIFtjbGFzcy5kZWZhdWx0LWdyb3VwLW5vZGVfc2VsZWN0ZWRdPVwibm9kZU1vZGVsKCkuc2VsZWN0ZWQoKVwiXG4gICAgW2F0dHIud2lkdGhdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLndpZHRoXCJcbiAgICBbYXR0ci5oZWlnaHRdPVwibm9kZU1vZGVsKCkuc2l6ZSgpLmhlaWdodFwiXG4gICAgW3N0eWxlLnN0cm9rZV09XCJub2RlTW9kZWwoKS5jb2xvcigpXCJcbiAgICBbc3R5bGUuZmlsbF09XCJub2RlTW9kZWwoKS5jb2xvcigpXCJcbiAgICAocG9pbnRlclN0YXJ0KT1cInB1bGxOb2RlKCk7IHNlbGVjdE5vZGUoKVwiXG4gIC8+XG59XG5cbjwhLS0gVGVtcGxhdGUgZ3JvdXAgbm9kZSAgLS0+XG5AaWYgKG5vZGVNb2RlbCgpLm5vZGUudHlwZSA9PT0gXCJ0ZW1wbGF0ZS1ncm91cFwiICYmIGdyb3VwTm9kZVRlbXBsYXRlKCkpIHtcbiAgPHN2ZzpnIGNsYXNzPVwic2VsZWN0YWJsZVwiIChwb2ludGVyU3RhcnQpPVwicHVsbE5vZGUoKVwiPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImdyb3VwTm9kZVRlbXBsYXRlKCkgPz8gbnVsbFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAkaW1wbGljaXQ6IHtcbiAgICAgICAgICBub2RlOiBub2RlTW9kZWwoKS5ub2RlLFxuICAgICAgICAgIHNlbGVjdGVkOiBub2RlTW9kZWwoKS5zZWxlY3RlZCxcbiAgICAgICAgICB3aWR0aDogbm9kZU1vZGVsKCkud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBub2RlTW9kZWwoKS5oZWlnaHQsXG4gICAgICAgIH0sXG4gICAgICB9XCJcbiAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiaW5qZWN0b3JcIlxuICAgIC8+XG4gIDwvc3ZnOmc+XG59XG5cbjwhLS0gUmVzaXplciAtLT5cbkBpZiAobm9kZU1vZGVsKCkucmVzaXplclRlbXBsYXRlKCk7IGFzIHRlbXBsYXRlKSB7XG4gIEBpZiAobm9kZU1vZGVsKCkucmVzaXphYmxlKCkpIHtcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVcIiAvPlxuICB9XG59XG5cbjwhLS0gSGFuZGxlcyAtLT5cbkBmb3IgKGhhbmRsZSBvZiBub2RlTW9kZWwoKS5oYW5kbGVzKCk7IHRyYWNrIGhhbmRsZSkge1xuICBAaWYgKCFoYW5kbGUudGVtcGxhdGUpIHtcbiAgICA8c3ZnOmNpcmNsZVxuICAgICAgY2xhc3M9XCJkZWZhdWx0LWhhbmRsZVwiXG4gICAgICBbYXR0ci5jeF09XCJoYW5kbGUub2Zmc2V0KCkueFwiXG4gICAgICBbYXR0ci5jeV09XCJoYW5kbGUub2Zmc2V0KCkueVwiXG4gICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiaGFuZGxlLnN0cm9rZVdpZHRoXCJcbiAgICAgIHI9XCI1XCJcbiAgICAgIChwb2ludGVyU3RhcnQpPVwic3RhcnRDb25uZWN0aW9uKCRldmVudCwgaGFuZGxlKVwiXG4gICAgICAocG9pbnRlckVuZCk9XCJlbmRDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgIC8+XG4gIH1cblxuICBAaWYgKGhhbmRsZS50ZW1wbGF0ZSkge1xuICAgIDxzdmc6Z1xuICAgICAgW2hhbmRsZVNpemVDb250cm9sbGVyXT1cImhhbmRsZVwiXG4gICAgICAocG9pbnRlclN0YXJ0KT1cInN0YXJ0Q29ubmVjdGlvbigkZXZlbnQsIGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJFbmQpPVwiZW5kQ29ubmVjdGlvbihoYW5kbGUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGFuZGxlLnRlbXBsYXRlOyBjb250ZXh0OiBoYW5kbGUudGVtcGxhdGVDb250ZXh0XCJcbiAgICAgIC8+XG4gICAgPC9zdmc6Zz5cbiAgfVxuXG4gIEBpZiAoc2hvd01hZ25ldCgpKSB7XG4gICAgPHN2ZzpjaXJjbGVcbiAgICAgIGNsYXNzPVwibWFnbmV0XCJcbiAgICAgIFthdHRyLnJdPVwibm9kZU1vZGVsKCkubWFnbmV0UmFkaXVzXCJcbiAgICAgIFthdHRyLmN4XT1cImhhbmRsZS5vZmZzZXQoKS54XCJcbiAgICAgIFthdHRyLmN5XT1cImhhbmRsZS5vZmZzZXQoKS55XCJcbiAgICAgIChwb2ludGVyRW5kKT1cImVuZENvbm5lY3Rpb24oaGFuZGxlKTsgcmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgICAocG9pbnRlck92ZXIpPVwidmFsaWRhdGVDb25uZWN0aW9uKGhhbmRsZSlcIlxuICAgICAgKHBvaW50ZXJPdXQpPVwicmVzZXRWYWxpZGF0ZUNvbm5lY3Rpb24oaGFuZGxlKVwiXG4gICAgLz5cbiAgfVxufVxuXG48IS0tIFRvb2xiYXIgLS0+XG5AaWYgKHRvb2xiYXIoKTsgYXMgdG9vbGJhcikge1xuICA8c3ZnOmZvcmVpZ25PYmplY3RcbiAgICBbYXR0ci53aWR0aF09XCJ0b29sYmFyLnNpemUoKS53aWR0aFwiXG4gICAgW2F0dHIuaGVpZ2h0XT1cInRvb2xiYXIuc2l6ZSgpLmhlaWdodFwiXG4gICAgW2F0dHIudHJhbnNmb3JtXT1cInRvb2xiYXIudHJhbnNmb3JtKClcIlxuICA+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0b29sYmFyLnRlbXBsYXRlKClcIiAvPlxuICA8L3N2Zzpmb3JlaWduT2JqZWN0PlxufVxuIl19
@@ -2576,7 +2576,7 @@ class NodeComponent {
2576
2576
  }
2577
2577
  }
2578
2578
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NodeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2579
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { nodeModel: { classPropertyName: "nodeModel", publicName: "nodeModel", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n @defer {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n }\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n @defer {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n }\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2579
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: NodeComponent, isStandalone: true, selector: "g[node]", inputs: { nodeModel: { classPropertyName: "nodeModel", publicName: "nodeModel", isSignal: true, isRequired: true, transformFunction: null }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", isSignal: true, isRequired: false, transformFunction: null }, groupNodeTemplate: { classPropertyName: "groupNodeTemplate", publicName: "groupNodeTemplate", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "vflow-node" }, providers: [HandleService, NodeAccessorService], viewQueries: [{ propertyName: "htmlWrapperRef", first: true, predicate: ["htmlWrapper"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"], dependencies: [{ kind: "directive", type: PointerDirective, selector: "[pointerStart], [pointerEnd], [pointerOver], [pointerOut]", outputs: ["pointerOver", "pointerOut", "pointerStart", "pointerEnd"] }, { kind: "component", type: DefaultNodeComponent, selector: "default-node", inputs: ["selected"] }, { kind: "component", type: HandleComponent, selector: "handle", inputs: ["position", "type", "id", "template"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "component", type: ResizableComponent, selector: "[resizable]", inputs: ["resizable", "resizerColor", "gap"] }, { kind: "directive", type: HandleSizeControllerDirective, selector: "[handleSizeController]", inputs: ["handleSizeController"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2580
2580
  }
2581
2581
  __decorate([
2582
2582
  InjectionContext
@@ -2596,7 +2596,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
2596
2596
  NgComponentOutlet,
2597
2597
  ResizableComponent,
2598
2598
  HandleSizeControllerDirective,
2599
- ], template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n @defer {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n }\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n @defer {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n }\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
2599
+ ], template: "<!-- Default node -->\n@if (nodeModel().node.type === \"default\") {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode(); selectNode()\"\n >\n <default-node\n #htmlWrapper\n [selected]=\"nodeModel().selected()\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n [style.max-width]=\"styleWidth()\"\n [style.max-height]=\"styleHeight()\"\n >\n <div [outerHTML]=\"nodeModel().text()\"></div>\n\n <handle type=\"source\" position=\"right\"/>\n <handle type=\"target\" position=\"left\" />\n </default-node>\n </svg:foreignObject>\n}\n\n<!-- Template node -->\n@if (nodeModel().node.type === \"html-template\" && nodeTemplate()) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngTemplateOutlet]=\"nodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: { node: nodeModel().node, selected: nodeModel().selected },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Component node -->\n@if (nodeModel().isComponentType) {\n <svg:foreignObject\n class=\"selectable\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n (pointerStart)=\"pullNode()\"\n >\n <div\n #htmlWrapper\n class=\"wrapper\"\n [style.width]=\"styleWidth()\"\n [style.height]=\"styleHeight()\"\n >\n <ng-container\n [ngComponentOutlet]=\"$any(nodeModel().node.type)\"\n [ngComponentOutletInputs]=\"nodeModel().componentTypeInputs\"\n [ngComponentOutletInjector]=\"injector\"\n />\n </div>\n </svg:foreignObject>\n}\n\n<!-- Default group node -->\n@if (nodeModel().node.type === \"default-group\") {\n <svg:rect\n [resizable]=\"nodeModel().resizable()\"\n [gap]=\"3\"\n [resizerColor]=\"nodeModel().color()\"\n class=\"default-group-node\"\n rx=\"5\"\n ry=\"5\"\n [class.default-group-node_selected]=\"nodeModel().selected()\"\n [attr.width]=\"nodeModel().size().width\"\n [attr.height]=\"nodeModel().size().height\"\n [style.stroke]=\"nodeModel().color()\"\n [style.fill]=\"nodeModel().color()\"\n (pointerStart)=\"pullNode(); selectNode()\"\n />\n}\n\n<!-- Template group node -->\n@if (nodeModel().node.type === \"template-group\" && groupNodeTemplate()) {\n <svg:g class=\"selectable\" (pointerStart)=\"pullNode()\">\n <ng-container\n [ngTemplateOutlet]=\"groupNodeTemplate() ?? null\"\n [ngTemplateOutletContext]=\"{\n $implicit: {\n node: nodeModel().node,\n selected: nodeModel().selected,\n width: nodeModel().width,\n height: nodeModel().height,\n },\n }\"\n [ngTemplateOutletInjector]=\"injector\"\n />\n </svg:g>\n}\n\n<!-- Resizer -->\n@if (nodeModel().resizerTemplate(); as template) {\n @if (nodeModel().resizable()) {\n <ng-template [ngTemplateOutlet]=\"template\" />\n }\n}\n\n<!-- Handles -->\n@for (handle of nodeModel().handles(); track handle) {\n @if (!handle.template) {\n <svg:circle\n class=\"default-handle\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n [attr.stroke-width]=\"handle.strokeWidth\"\n r=\"5\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n />\n }\n\n @if (handle.template) {\n <svg:g\n [handleSizeController]=\"handle\"\n (pointerStart)=\"startConnection($event, handle)\"\n (pointerEnd)=\"endConnection(handle)\"\n >\n <ng-container\n *ngTemplateOutlet=\"handle.template; context: handle.templateContext\"\n />\n </svg:g>\n }\n\n @if (showMagnet()) {\n <svg:circle\n class=\"magnet\"\n [attr.r]=\"nodeModel().magnetRadius\"\n [attr.cx]=\"handle.offset().x\"\n [attr.cy]=\"handle.offset().y\"\n (pointerEnd)=\"endConnection(handle); resetValidateConnection(handle)\"\n (pointerOver)=\"validateConnection(handle)\"\n (pointerOut)=\"resetValidateConnection(handle)\"\n />\n }\n}\n\n<!-- Toolbar -->\n@if (toolbar(); as toolbar) {\n <svg:foreignObject\n [attr.width]=\"toolbar.size().width\"\n [attr.height]=\"toolbar.size().height\"\n [attr.transform]=\"toolbar.transform()\"\n >\n <ng-container [ngTemplateOutlet]=\"toolbar.template()\" />\n </svg:foreignObject>\n}\n", styles: [".magnet{opacity:0}.wrapper{display:table-cell}.default-group-node{stroke-width:1.5px;fill-opacity:.05}.default-group-node_selected{stroke-width:2px}.default-handle{stroke:#fff;fill:#1b262c}\n"] }]
2600
2600
  }], propDecorators: { ngOnInit: [], ngAfterViewInit: [] } });
2601
2601
 
2602
2602
  class ConnectionComponent {