@igo2/common 18.0.0-next.9 → 18.0.0
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.
- package/drag-drop/drag-drop.module.d.ts +2 -1
- package/drag-drop/public_api.d.ts +1 -0
- package/drag-drop/tree-drag-drop/index.d.ts +2 -0
- package/drag-drop/tree-drag-drop/tree-drag-drop.directive.d.ts +85 -0
- package/drag-drop/tree-drag-drop/tree-drag-drop.interface.d.ts +15 -0
- package/esm2022/drag-drop/drag-drop.module.mjs +5 -4
- package/esm2022/drag-drop/public_api.mjs +2 -1
- package/esm2022/drag-drop/tree-drag-drop/index.mjs +3 -0
- package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.directive.mjs +391 -0
- package/esm2022/drag-drop/tree-drag-drop/tree-drag-drop.interface.mjs +2 -0
- package/esm2022/form/form/form.component.mjs +4 -1
- package/esm2022/form/form-field/form-field-select.component.mjs +3 -3
- package/esm2022/form/form-field/form-field-text.component.mjs +3 -3
- package/esm2022/form/form-field/form-field-textarea.component.mjs +3 -3
- package/esm2022/form/shared/form.interfaces.mjs +1 -1
- package/esm2022/form/shared/form.service.mjs +2 -2
- package/esm2022/icon/shared/icons.mjs +9 -1
- package/fesm2022/igo2-common-drag-drop.mjs +394 -5
- package/fesm2022/igo2-common-drag-drop.mjs.map +1 -1
- package/fesm2022/igo2-common-form.mjs +10 -7
- package/fesm2022/igo2-common-form.mjs.map +1 -1
- package/fesm2022/igo2-common-icon.mjs +9 -1
- package/fesm2022/igo2-common-icon.mjs.map +1 -1
- package/form/shared/form.interfaces.d.ts +1 -0
- package/icon/shared/icons.d.ts +2 -0
- package/locale/en.common.json +6 -0
- package/locale/fr.common.json +6 -0
- package/package.json +3 -3
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { ModuleWithProviders } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "./drag-drop.directive";
|
|
4
|
+
import * as i2 from "./tree-drag-drop/tree-drag-drop.directive";
|
|
4
5
|
/**
|
|
5
6
|
* @deprecated import the DragAndDropDirective directly
|
|
6
7
|
*/
|
|
7
8
|
export declare class IgoDrapDropModule {
|
|
8
9
|
static forRoot(): ModuleWithProviders<IgoDrapDropModule>;
|
|
9
10
|
static ɵfac: i0.ɵɵFactoryDeclaration<IgoDrapDropModule, never>;
|
|
10
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<IgoDrapDropModule, never, [typeof i1.DragAndDropDirective], [typeof i1.DragAndDropDirective]>;
|
|
11
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<IgoDrapDropModule, never, [typeof i1.DragAndDropDirective, typeof i2.TreeDragDropDirective], [typeof i1.DragAndDropDirective, typeof i2.TreeDragDropDirective]>;
|
|
11
12
|
static ɵinj: i0.ɵɵInjectorDeclaration<IgoDrapDropModule>;
|
|
12
13
|
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
2
|
+
import { FlatTreeControl } from '@angular/cdk/tree';
|
|
3
|
+
import { AfterContentInit, ElementRef, EventEmitter, OnDestroy, QueryList, Renderer2 } from '@angular/core';
|
|
4
|
+
import { MatTreeNode } from '@angular/material/tree';
|
|
5
|
+
import { DropPositionType, TreeFlatNode } from './tree-drag-drop.interface';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export interface TreeDropEvent<T = any> {
|
|
8
|
+
node: TreeFlatNode<T>;
|
|
9
|
+
ref: TreeFlatNode<T>;
|
|
10
|
+
position: DropPositionType;
|
|
11
|
+
}
|
|
12
|
+
interface DragNodeListeners {
|
|
13
|
+
element: HTMLElement;
|
|
14
|
+
listeners: [string, EventListenerOrEventListenerObject][];
|
|
15
|
+
}
|
|
16
|
+
export interface DropPermission {
|
|
17
|
+
canDrop: boolean;
|
|
18
|
+
message?: string;
|
|
19
|
+
params?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* This directive should be use with a MatTree flatened
|
|
23
|
+
* It should add all logic to drag the MatTreeNode and connect the (onDrop) output
|
|
24
|
+
* Class added:
|
|
25
|
+
* Tree: --dragging
|
|
26
|
+
* Node: --drag-hover | --dragged
|
|
27
|
+
*/
|
|
28
|
+
export declare class TreeDragDropDirective implements AfterContentInit, OnDestroy {
|
|
29
|
+
private elementRef;
|
|
30
|
+
private renderer;
|
|
31
|
+
draggedNode: TreeFlatNode;
|
|
32
|
+
dropNodeTarget: TreeFlatNode;
|
|
33
|
+
expandTimeout: number;
|
|
34
|
+
nodesListeners: DragNodeListeners[] | undefined;
|
|
35
|
+
dropLineTarget: HTMLElement;
|
|
36
|
+
highlightedNode: SelectionModel<TreeFlatNode<any>>;
|
|
37
|
+
treeControl: FlatTreeControl<TreeFlatNode>;
|
|
38
|
+
/** The default is 5 */
|
|
39
|
+
maxLevel: number;
|
|
40
|
+
set treeDragDropIsDisabled(disabled: boolean);
|
|
41
|
+
private isDisabled;
|
|
42
|
+
dragStart: EventEmitter<TreeFlatNode<any>>;
|
|
43
|
+
onDrop: EventEmitter<TreeDropEvent<any>>;
|
|
44
|
+
onDropError: EventEmitter<DropPermission>;
|
|
45
|
+
hostDragOver(event: Event): void;
|
|
46
|
+
hostDrop(event: DragEvent): void;
|
|
47
|
+
dragging: boolean;
|
|
48
|
+
nodes: QueryList<MatTreeNode<TreeFlatNode>>;
|
|
49
|
+
constructor(elementRef: ElementRef, renderer: Renderer2);
|
|
50
|
+
ngAfterContentInit(): void;
|
|
51
|
+
ngOnDestroy(): void;
|
|
52
|
+
onDragStart(node: TreeFlatNode): void;
|
|
53
|
+
dragEnd(): void;
|
|
54
|
+
dragOver(node: TreeFlatNode, event: DragEvent): void;
|
|
55
|
+
dragLeave(): void;
|
|
56
|
+
drop(event: DragEvent): void;
|
|
57
|
+
private addNodeClass;
|
|
58
|
+
private removeNodeClass;
|
|
59
|
+
private addAllListener;
|
|
60
|
+
private addListener;
|
|
61
|
+
private removeAllListener;
|
|
62
|
+
private setHighlightedNode;
|
|
63
|
+
private addDropTargetLine;
|
|
64
|
+
private removeDropTargetLine;
|
|
65
|
+
private updateDropTargetLinePosition;
|
|
66
|
+
private handleGroupExpansion;
|
|
67
|
+
private getNodeElement;
|
|
68
|
+
private canDropNode;
|
|
69
|
+
private canDropGroup;
|
|
70
|
+
private validateMaxHierarchyLevel;
|
|
71
|
+
private isHoverDescendant;
|
|
72
|
+
private getPosition;
|
|
73
|
+
private getPositionY;
|
|
74
|
+
private getPositionType;
|
|
75
|
+
private getPositionLevel;
|
|
76
|
+
/**
|
|
77
|
+
* @param level if level is defined with go to the defined levle to find ancestor. Sinon on prend le current ancestor
|
|
78
|
+
*/
|
|
79
|
+
private getNodeAncestors;
|
|
80
|
+
private getDirectDescendants;
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TreeDragDropDirective, never>;
|
|
82
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TreeDragDropDirective, "[igoTreeDragDrop]", never, { "treeControl": { "alias": "treeControl"; "required": true; }; "maxLevel": { "alias": "maxLevel"; "required": false; }; "treeDragDropIsDisabled": { "alias": "treeDragDropIsDisabled"; "required": false; }; }, { "dragStart": "dragStart"; "onDrop": "onDrop"; "onDropError": "onDropError"; }, ["nodes"], never, true, never>;
|
|
83
|
+
static ngAcceptInputType_treeDragDropIsDisabled: unknown;
|
|
84
|
+
}
|
|
85
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface TreeFlatNode<T = any> {
|
|
2
|
+
id: string;
|
|
3
|
+
isGroup: boolean;
|
|
4
|
+
disabled: boolean;
|
|
5
|
+
level: number;
|
|
6
|
+
descendantLevels?: number;
|
|
7
|
+
data: T;
|
|
8
|
+
}
|
|
9
|
+
export interface DropPosition {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
level: number;
|
|
13
|
+
type: DropPositionType;
|
|
14
|
+
}
|
|
15
|
+
export type DropPositionType = 'above' | 'below' | 'inside';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NgModule } from '@angular/core';
|
|
2
2
|
import { DragAndDropDirective } from './drag-drop.directive';
|
|
3
|
+
import { TreeDragDropDirective } from './tree-drag-drop/tree-drag-drop.directive';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
/**
|
|
5
6
|
* @deprecated import the DragAndDropDirective directly
|
|
@@ -12,14 +13,14 @@ export class IgoDrapDropModule {
|
|
|
12
13
|
};
|
|
13
14
|
}
|
|
14
15
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
15
|
-
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, imports: [DragAndDropDirective], exports: [DragAndDropDirective] });
|
|
16
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, imports: [DragAndDropDirective, TreeDragDropDirective], exports: [DragAndDropDirective, TreeDragDropDirective] });
|
|
16
17
|
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule });
|
|
17
18
|
}
|
|
18
19
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: IgoDrapDropModule, decorators: [{
|
|
19
20
|
type: NgModule,
|
|
20
21
|
args: [{
|
|
21
|
-
imports: [DragAndDropDirective],
|
|
22
|
-
exports: [DragAndDropDirective]
|
|
22
|
+
imports: [DragAndDropDirective, TreeDragDropDirective],
|
|
23
|
+
exports: [DragAndDropDirective, TreeDragDropDirective]
|
|
23
24
|
}]
|
|
24
25
|
}] });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7O0FBRWxGOztHQUVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQUM1QixNQUFNLENBQUMsT0FBTztRQUNaLE9BQU87WUFDTCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQztJQUNKLENBQUM7d0dBTlUsaUJBQWlCO3lHQUFqQixpQkFBaUIsWUFIbEIsb0JBQW9CLEVBQUUscUJBQXFCLGFBQzNDLG9CQUFvQixFQUFFLHFCQUFxQjt5R0FFMUMsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUo3QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDO29CQUN0RCxPQUFPLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxxQkFBcUIsQ0FBQztpQkFDdkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEcmFnQW5kRHJvcERpcmVjdGl2ZSB9IGZyb20gJy4vZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUcmVlRHJhZ0Ryb3BEaXJlY3RpdmUgfSBmcm9tICcuL3RyZWUtZHJhZy1kcm9wL3RyZWUtZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW1wb3J0IHRoZSBEcmFnQW5kRHJvcERpcmVjdGl2ZSBkaXJlY3RseVxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbRHJhZ0FuZERyb3BEaXJlY3RpdmUsIFRyZWVEcmFnRHJvcERpcmVjdGl2ZV0sXG4gIGV4cG9ydHM6IFtEcmFnQW5kRHJvcERpcmVjdGl2ZSwgVHJlZURyYWdEcm9wRGlyZWN0aXZlXVxufSlcbmV4cG9ydCBjbGFzcyBJZ29EcmFwRHJvcE1vZHVsZSB7XG4gIHN0YXRpYyBmb3JSb290KCk6IE1vZHVsZVdpdGhQcm92aWRlcnM8SWdvRHJhcERyb3BNb2R1bGU+IHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IElnb0RyYXBEcm9wTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzOiBbXVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './drag-drop.module';
|
|
2
2
|
export * from './drag-drop.directive';
|
|
3
|
-
|
|
3
|
+
export * from './tree-drag-drop';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9kcmFnLWRyb3Avc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2RyYWctZHJvcC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9kcmFnLWRyb3AuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vdHJlZS1kcmFnLWRyb3AnO1xuIl19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './tree-drag-drop.directive';
|
|
2
|
+
export * from './tree-drag-drop.interface';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21tb24vZHJhZy1kcm9wL3NyYy90cmVlLWRyYWctZHJvcC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3RyZWUtZHJhZy1kcm9wLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3RyZWUtZHJhZy1kcm9wLmludGVyZmFjZSc7XG4iXX0=
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
2
|
+
import { FlatTreeControl } from '@angular/cdk/tree';
|
|
3
|
+
import { ContentChildren, Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, QueryList, Renderer2, booleanAttribute } from '@angular/core';
|
|
4
|
+
import { MatTreeNode } from '@angular/material/tree';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* This directive should be use with a MatTree flatened
|
|
8
|
+
* It should add all logic to drag the MatTreeNode and connect the (onDrop) output
|
|
9
|
+
* Class added:
|
|
10
|
+
* Tree: --dragging
|
|
11
|
+
* Node: --drag-hover | --dragged
|
|
12
|
+
*/
|
|
13
|
+
export class TreeDragDropDirective {
|
|
14
|
+
elementRef;
|
|
15
|
+
renderer;
|
|
16
|
+
draggedNode;
|
|
17
|
+
dropNodeTarget;
|
|
18
|
+
expandTimeout;
|
|
19
|
+
nodesListeners;
|
|
20
|
+
dropLineTarget;
|
|
21
|
+
highlightedNode = new SelectionModel();
|
|
22
|
+
treeControl;
|
|
23
|
+
/** The default is 5 */
|
|
24
|
+
maxLevel = 5;
|
|
25
|
+
set treeDragDropIsDisabled(disabled) {
|
|
26
|
+
this.isDisabled = disabled;
|
|
27
|
+
disabled ? this.removeAllListener() : this.addAllListener();
|
|
28
|
+
}
|
|
29
|
+
isDisabled = false;
|
|
30
|
+
dragStart = new EventEmitter();
|
|
31
|
+
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
|
|
32
|
+
onDrop = new EventEmitter(null);
|
|
33
|
+
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
|
|
34
|
+
onDropError = new EventEmitter();
|
|
35
|
+
hostDragOver(event) {
|
|
36
|
+
event.preventDefault();
|
|
37
|
+
}
|
|
38
|
+
hostDrop(event) {
|
|
39
|
+
this.drop(event);
|
|
40
|
+
}
|
|
41
|
+
dragging;
|
|
42
|
+
nodes;
|
|
43
|
+
constructor(elementRef, renderer) {
|
|
44
|
+
this.elementRef = elementRef;
|
|
45
|
+
this.renderer = renderer;
|
|
46
|
+
this.onDrop.subscribe(() => this.dragEnd());
|
|
47
|
+
this.highlightedNode.changed.subscribe((change) => {
|
|
48
|
+
if (change.removed.length) {
|
|
49
|
+
this.removeNodeClass(change.removed[0].id, '--drag-hover');
|
|
50
|
+
}
|
|
51
|
+
if (change.added.length) {
|
|
52
|
+
this.addNodeClass(change.added[0].id, '--drag-hover');
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
ngAfterContentInit() {
|
|
57
|
+
this.nodes.changes.subscribe(() => {
|
|
58
|
+
this.addAllListener();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
ngOnDestroy() {
|
|
62
|
+
this.removeAllListener();
|
|
63
|
+
}
|
|
64
|
+
onDragStart(node) {
|
|
65
|
+
this.dragging = true;
|
|
66
|
+
this.draggedNode = node;
|
|
67
|
+
this.addNodeClass(node.id, '--dragged');
|
|
68
|
+
this.dragStart.emit(node);
|
|
69
|
+
}
|
|
70
|
+
dragEnd() {
|
|
71
|
+
this.dragging = false;
|
|
72
|
+
if (this.draggedNode) {
|
|
73
|
+
this.removeNodeClass(this.draggedNode.id, '--dragged');
|
|
74
|
+
this.draggedNode = null;
|
|
75
|
+
}
|
|
76
|
+
this.dragLeave();
|
|
77
|
+
this.removeDropTargetLine();
|
|
78
|
+
}
|
|
79
|
+
dragOver(node, event) {
|
|
80
|
+
event.preventDefault();
|
|
81
|
+
event.stopPropagation();
|
|
82
|
+
this.dropNodeTarget = node;
|
|
83
|
+
const position = this.getPosition(event, node);
|
|
84
|
+
this.updateDropTargetLinePosition(position);
|
|
85
|
+
this.setHighlightedNode(node);
|
|
86
|
+
this.handleGroupExpansion(node, position.type === 'inside');
|
|
87
|
+
}
|
|
88
|
+
dragLeave() {
|
|
89
|
+
clearTimeout(this.expandTimeout);
|
|
90
|
+
this.expandTimeout = null;
|
|
91
|
+
this.highlightedNode.clear();
|
|
92
|
+
}
|
|
93
|
+
drop(event) {
|
|
94
|
+
if (!this.dropNodeTarget || this.isDisabled) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const dropPosition = this.getPosition(event, this.dropNodeTarget);
|
|
98
|
+
const validation = this.canDropNode(this.dropNodeTarget, dropPosition);
|
|
99
|
+
if (!validation.canDrop) {
|
|
100
|
+
this.onDropError.emit(validation);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// Allow to drop a last child outside is group. We refer to it's ancestor for the target
|
|
104
|
+
if (dropPosition.type === 'below' &&
|
|
105
|
+
dropPosition.level !== this.dropNodeTarget.level) {
|
|
106
|
+
this.dropNodeTarget = this.getNodeAncestors(this.dropNodeTarget.id, dropPosition.level);
|
|
107
|
+
}
|
|
108
|
+
if (this.dropNodeTarget.isGroup) {
|
|
109
|
+
if (dropPosition.type === 'inside') {
|
|
110
|
+
const isExpanded = this.treeControl.isExpanded(this.dropNodeTarget);
|
|
111
|
+
if (isExpanded) {
|
|
112
|
+
const children = this.getDirectDescendants(this.dropNodeTarget);
|
|
113
|
+
if (children[0]?.id === this.draggedNode.id) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
this.treeControl.expand(this.dropNodeTarget);
|
|
118
|
+
return this.onDrop.emit({
|
|
119
|
+
node: this.draggedNode,
|
|
120
|
+
ref: this.dropNodeTarget,
|
|
121
|
+
position: dropPosition.type
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (dropPosition.type === 'below' &&
|
|
126
|
+
dropPosition.level !== this.dropNodeTarget.level) {
|
|
127
|
+
const ancestor = this.getNodeAncestors(this.dropNodeTarget.id);
|
|
128
|
+
return this.onDrop.emit({
|
|
129
|
+
node: this.draggedNode,
|
|
130
|
+
ref: ancestor,
|
|
131
|
+
position: dropPosition.type
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
this.onDrop.emit({
|
|
135
|
+
node: this.draggedNode,
|
|
136
|
+
ref: this.dropNodeTarget,
|
|
137
|
+
position: dropPosition.type
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
addNodeClass(id, className) {
|
|
141
|
+
const node = this.nodes.find((node) => node.data.id === id);
|
|
142
|
+
this.renderer.addClass(node['_elementRef'].nativeElement, className);
|
|
143
|
+
}
|
|
144
|
+
removeNodeClass(id, className) {
|
|
145
|
+
const node = this.nodes.find((node) => node.data.id === id);
|
|
146
|
+
this.renderer.removeClass(node['_elementRef'].nativeElement, className);
|
|
147
|
+
}
|
|
148
|
+
addAllListener() {
|
|
149
|
+
if (this.isDisabled) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const nodes = this.nodes?.toArray();
|
|
153
|
+
if (this.nodesListeners) {
|
|
154
|
+
this.removeAllListener();
|
|
155
|
+
}
|
|
156
|
+
this.nodesListeners = nodes?.map((node) => this.addListener(node));
|
|
157
|
+
}
|
|
158
|
+
addListener(node) {
|
|
159
|
+
const element = node['_elementRef'].nativeElement;
|
|
160
|
+
const listeners = [
|
|
161
|
+
['dragstart', () => this.onDragStart(node.data)],
|
|
162
|
+
['dragend', () => this.dragEnd()],
|
|
163
|
+
['dragover', (event) => this.dragOver(node.data, event)],
|
|
164
|
+
['dragleave', () => this.dragLeave()]
|
|
165
|
+
];
|
|
166
|
+
element.setAttribute('draggable', 'true');
|
|
167
|
+
listeners.forEach(([type, listener]) => element.addEventListener(type, listener));
|
|
168
|
+
return { element, listeners };
|
|
169
|
+
}
|
|
170
|
+
removeAllListener() {
|
|
171
|
+
this.nodesListeners?.forEach(({ element, listeners }) => {
|
|
172
|
+
listeners.forEach(([type, listener]) => {
|
|
173
|
+
element.setAttribute('draggable', 'false');
|
|
174
|
+
element.removeEventListener(type, listener);
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
this.nodesListeners = null;
|
|
178
|
+
}
|
|
179
|
+
setHighlightedNode(node) {
|
|
180
|
+
const toHighlight = node.isGroup ? node : this.getNodeAncestors(node.id);
|
|
181
|
+
toHighlight
|
|
182
|
+
? this.highlightedNode.select(toHighlight)
|
|
183
|
+
: this.highlightedNode.clear();
|
|
184
|
+
}
|
|
185
|
+
addDropTargetLine() {
|
|
186
|
+
const target = this.renderer.createElement('div');
|
|
187
|
+
target.classList.add('drop-target-line');
|
|
188
|
+
target.setAttribute('style', `position: absolute; top: 0; width: 100%; pointer-events: none; z-index: 4; height: 2px; background-color: black; transition: margin-left 150ms;`);
|
|
189
|
+
this.dropLineTarget = target;
|
|
190
|
+
this.renderer.appendChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
|
|
191
|
+
}
|
|
192
|
+
removeDropTargetLine() {
|
|
193
|
+
if (!this.dropLineTarget) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
this.renderer.removeChild(this.elementRef.nativeElement.parentElement, this.dropLineTarget);
|
|
197
|
+
this.dropLineTarget = null;
|
|
198
|
+
}
|
|
199
|
+
updateDropTargetLinePosition(position) {
|
|
200
|
+
if (!this.dropLineTarget) {
|
|
201
|
+
this.addDropTargetLine();
|
|
202
|
+
}
|
|
203
|
+
if (position.type === 'inside') {
|
|
204
|
+
return this.removeDropTargetLine();
|
|
205
|
+
}
|
|
206
|
+
this.renderer.setStyle(this.dropLineTarget, 'margin-left', position.level * 24 + 20 + 'px');
|
|
207
|
+
this.renderer.setStyle(this.dropLineTarget, 'transform', 'translate3d(0,' + position.y + 'px, 0)');
|
|
208
|
+
}
|
|
209
|
+
handleGroupExpansion(node, isInside) {
|
|
210
|
+
if (!isInside) {
|
|
211
|
+
return this.dragLeave();
|
|
212
|
+
}
|
|
213
|
+
const isOpen = this.treeControl.isExpanded(node);
|
|
214
|
+
if (!isOpen && !this.expandTimeout) {
|
|
215
|
+
this.expandTimeout = window.setTimeout(() => {
|
|
216
|
+
this.treeControl.expand(node);
|
|
217
|
+
}, 1200);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
getNodeElement(node) {
|
|
221
|
+
const treeNode = this.nodes.find((n) => n.data.id === node.id);
|
|
222
|
+
return treeNode?.['_elementRef'].nativeElement;
|
|
223
|
+
}
|
|
224
|
+
canDropNode(hoveredNode, position) {
|
|
225
|
+
if (this.draggedNode.isGroup) {
|
|
226
|
+
return this.canDropGroup(hoveredNode, position);
|
|
227
|
+
}
|
|
228
|
+
const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
|
|
229
|
+
if (hasMaxLevelRestrictions) {
|
|
230
|
+
return hasMaxLevelRestrictions;
|
|
231
|
+
}
|
|
232
|
+
return { canDrop: true };
|
|
233
|
+
}
|
|
234
|
+
canDropGroup(hoveredNode, position) {
|
|
235
|
+
// On ne veut pas permettre le Drop pour un groupe qui s'auto référence
|
|
236
|
+
if (hoveredNode.id === this.draggedNode.id) {
|
|
237
|
+
return {
|
|
238
|
+
canDrop: false,
|
|
239
|
+
message: 'igo.common.dragDrop.cannot.dropInsideItself'
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const hasMaxLevelRestrictions = this.validateMaxHierarchyLevel(position);
|
|
243
|
+
if (hasMaxLevelRestrictions) {
|
|
244
|
+
return hasMaxLevelRestrictions;
|
|
245
|
+
}
|
|
246
|
+
const isHoverDescendant = this.isHoverDescendant(hoveredNode.id);
|
|
247
|
+
return {
|
|
248
|
+
canDrop: !isHoverDescendant,
|
|
249
|
+
message: isHoverDescendant && 'igo.common.dragDrop.cannot.dropInsideItself'
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
validateMaxHierarchyLevel(position) {
|
|
253
|
+
if (!this.maxLevel) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
let level = position.type === 'inside' ? position.level + 1 : position.level;
|
|
257
|
+
if (this.draggedNode.isGroup) {
|
|
258
|
+
// We add an extra level +1 to avoid empty group in group
|
|
259
|
+
level = level + (this.draggedNode.descendantLevels ?? 0) + 1;
|
|
260
|
+
}
|
|
261
|
+
if (level > this.maxLevel) {
|
|
262
|
+
return {
|
|
263
|
+
canDrop: false,
|
|
264
|
+
message: 'igo.common.dragDrop.cannot.maxLevel',
|
|
265
|
+
params: { value: this.maxLevel }
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
isHoverDescendant(id) {
|
|
270
|
+
return this.treeControl
|
|
271
|
+
.getDescendants(this.draggedNode)
|
|
272
|
+
.some((child) => child.id === id);
|
|
273
|
+
}
|
|
274
|
+
getPosition(event, hoveredNode) {
|
|
275
|
+
if (this.draggedNode.isGroup) {
|
|
276
|
+
if (this.isHoverDescendant(hoveredNode.id)) {
|
|
277
|
+
hoveredNode = this.draggedNode;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
let positionType = this.getPositionType(event, hoveredNode);
|
|
281
|
+
const bellowOpenedGroup = hoveredNode.isGroup &&
|
|
282
|
+
positionType === 'below' &&
|
|
283
|
+
this.treeControl.isExpanded(hoveredNode);
|
|
284
|
+
if (bellowOpenedGroup) {
|
|
285
|
+
positionType = 'inside';
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
x: event.x,
|
|
289
|
+
y: this.getPositionY(hoveredNode, positionType),
|
|
290
|
+
level: this.getPositionLevel(hoveredNode, positionType, event.x),
|
|
291
|
+
type: positionType
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
getPositionY(node, type) {
|
|
295
|
+
const element = this.getNodeElement(node);
|
|
296
|
+
const rect = element.getBoundingClientRect();
|
|
297
|
+
return type === 'below'
|
|
298
|
+
? element.offsetTop + rect.height - 1
|
|
299
|
+
: element.offsetTop + 1;
|
|
300
|
+
}
|
|
301
|
+
getPositionType(event, hoveredNode) {
|
|
302
|
+
const target = this.getNodeElement(hoveredNode);
|
|
303
|
+
const rect = target.getBoundingClientRect();
|
|
304
|
+
const middle = rect.top + rect.height / 2;
|
|
305
|
+
const y = event.y;
|
|
306
|
+
const selfReferencing = this.draggedNode.id === hoveredNode.id;
|
|
307
|
+
if (hoveredNode.isGroup && !selfReferencing) {
|
|
308
|
+
const tolerence = 5;
|
|
309
|
+
if (y <= middle + tolerence && y >= middle - tolerence) {
|
|
310
|
+
return 'inside';
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
const isBelow = y > middle;
|
|
314
|
+
return isBelow ? 'below' : 'above';
|
|
315
|
+
}
|
|
316
|
+
getPositionLevel(hoveredNode, type, x) {
|
|
317
|
+
if (hoveredNode.level === 0) {
|
|
318
|
+
return 0;
|
|
319
|
+
}
|
|
320
|
+
const ancestor = this.getNodeAncestors(hoveredNode.id);
|
|
321
|
+
const children = this.getDirectDescendants(ancestor);
|
|
322
|
+
const lastChild = [...children].pop();
|
|
323
|
+
if (type === 'below' && lastChild.id === hoveredNode.id) {
|
|
324
|
+
const target = this.getNodeElement(hoveredNode);
|
|
325
|
+
const rect = target.getBoundingClientRect();
|
|
326
|
+
const indentation = 24;
|
|
327
|
+
const xMin = rect.x + indentation;
|
|
328
|
+
const xMax = xMin + indentation * hoveredNode.level;
|
|
329
|
+
const isInsideSameGroup = x > xMax;
|
|
330
|
+
if (!isInsideSameGroup) {
|
|
331
|
+
const levelSubstracted = Math.round((xMax - x) / indentation);
|
|
332
|
+
return Math.max(0, hoveredNode.level - levelSubstracted);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return hoveredNode.level;
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* @param level if level is defined with go to the defined levle to find ancestor. Sinon on prend le current ancestor
|
|
339
|
+
*/
|
|
340
|
+
getNodeAncestors(id, level) {
|
|
341
|
+
const nodes = this.treeControl.dataNodes;
|
|
342
|
+
const index = nodes.findIndex((node) => node.id === id);
|
|
343
|
+
const targetLevel = level ?? Math.max(0, nodes[index].level - 1);
|
|
344
|
+
return nodes
|
|
345
|
+
.slice(0, index)
|
|
346
|
+
.reverse()
|
|
347
|
+
.find((node) => node.level === targetLevel);
|
|
348
|
+
}
|
|
349
|
+
getDirectDescendants(node) {
|
|
350
|
+
const level = node.level + 1;
|
|
351
|
+
return this.treeControl
|
|
352
|
+
.getDescendants(node)
|
|
353
|
+
.filter((child) => child.level === level);
|
|
354
|
+
}
|
|
355
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
|
|
356
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: TreeDragDropDirective, isStandalone: true, selector: "[igoTreeDragDrop]", inputs: { treeControl: "treeControl", maxLevel: "maxLevel", treeDragDropIsDisabled: ["treeDragDropIsDisabled", "treeDragDropIsDisabled", booleanAttribute] }, outputs: { dragStart: "dragStart", onDrop: "onDrop", onDropError: "onDropError" }, host: { listeners: { "dragover": "hostDragOver($event)", "drop": "hostDrop($event)" }, properties: { "class.--dragging": "this.dragging" } }, queries: [{ propertyName: "nodes", predicate: MatTreeNode, descendants: true }], ngImport: i0 });
|
|
357
|
+
}
|
|
358
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeDragDropDirective, decorators: [{
|
|
359
|
+
type: Directive,
|
|
360
|
+
args: [{
|
|
361
|
+
selector: '[igoTreeDragDrop]',
|
|
362
|
+
standalone: true
|
|
363
|
+
}]
|
|
364
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { treeControl: [{
|
|
365
|
+
type: Input,
|
|
366
|
+
args: [{ required: true }]
|
|
367
|
+
}], maxLevel: [{
|
|
368
|
+
type: Input
|
|
369
|
+
}], treeDragDropIsDisabled: [{
|
|
370
|
+
type: Input,
|
|
371
|
+
args: [{ transform: booleanAttribute }]
|
|
372
|
+
}], dragStart: [{
|
|
373
|
+
type: Output
|
|
374
|
+
}], onDrop: [{
|
|
375
|
+
type: Output
|
|
376
|
+
}], onDropError: [{
|
|
377
|
+
type: Output
|
|
378
|
+
}], hostDragOver: [{
|
|
379
|
+
type: HostListener,
|
|
380
|
+
args: ['dragover', ['$event']]
|
|
381
|
+
}], hostDrop: [{
|
|
382
|
+
type: HostListener,
|
|
383
|
+
args: ['drop', ['$event']]
|
|
384
|
+
}], dragging: [{
|
|
385
|
+
type: HostBinding,
|
|
386
|
+
args: ['class.--dragging']
|
|
387
|
+
}], nodes: [{
|
|
388
|
+
type: ContentChildren,
|
|
389
|
+
args: [MatTreeNode, { descendants: true }]
|
|
390
|
+
}] } });
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWRyb3AuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2RyYWctZHJvcC9zcmMvdHJlZS1kcmFnLWRyb3AvdHJlZS1kcmFnLWRyb3AuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQTBCckQ7Ozs7OztHQU1HO0FBS0gsTUFBTSxPQUFPLHFCQUFxQjtJQTBDdEI7SUFDQTtJQTFDVixXQUFXLENBQWU7SUFDMUIsY0FBYyxDQUFlO0lBQzdCLGFBQWEsQ0FBUztJQUN0QixjQUFjLENBQWtDO0lBQ2hELGNBQWMsQ0FBYztJQUM1QixlQUFlLEdBQUcsSUFBSSxjQUFjLEVBQWdCLENBQUM7SUFFMUIsV0FBVyxDQUFnQztJQUV0RSx1QkFBdUI7SUFDZCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXRCLElBQ0ksc0JBQXNCLENBQUMsUUFBaUI7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7UUFDM0IsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFDTyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBRWpCLFNBQVMsR0FBRyxJQUFJLFlB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QkFBQyxXQUFXLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHsgRmxhdFRyZWVDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RyZWUnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBRdWVyeUxpc3QsXG4gIFJlbmRlcmVyMixcbiAgYm9vbGVhbkF0dHJpYnV0ZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdFRyZWVOb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdHJlZSc7XG5cbmltcG9ydCB7XG4gIERyb3BQb3NpdGlvbixcbiAgRHJvcFBvc2l0aW9uVHlwZSxcbiAgVHJlZUZsYXROb2RlXG59IGZyb20gJy4vdHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBpbnRlcmZhY2UgVHJlZURyb3BFdmVudDxUID0gYW55PiB7XG4gIG5vZGU6IFRyZWVGbGF0Tm9kZTxUPjtcbiAgcmVmOiBUcmVlRmxhdE5vZGU8VD47XG4gIHBvc2l0aW9uOiBEcm9wUG9zaXRpb25UeXBlO1xufVxuXG5pbnRlcmZhY2UgRHJhZ05vZGVMaXN0ZW5lcnMge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgbGlzdGVuZXJzOiBbc3RyaW5nLCBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0XVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERyb3BQZXJtaXNzaW9uIHtcbiAgY2FuRHJvcDogYm9vbGVhbjtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogVGhpcyBkaXJlY3RpdmUgc2hvdWxkIGJlIHVzZSB3aXRoIGEgTWF0VHJlZSBmbGF0ZW5lZFxuICogSXQgc2hvdWxkIGFkZCBhbGwgbG9naWMgdG8gZHJhZyB0aGUgTWF0VHJlZU5vZGUgYW5kIGNvbm5lY3QgdGhlIChvbkRyb3ApIG91dHB1dFxuICogQ2xhc3MgYWRkZWQ6XG4gKiAgICBUcmVlOiAtLWRyYWdnaW5nXG4gKiAgICBOb2RlOiAtLWRyYWctaG92ZXIgfCAtLWRyYWdnZWRcbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2lnb1RyZWVEcmFnRHJvcF0nLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIFRyZWVEcmFnRHJvcERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIGRyYWdnZWROb2RlOiBUcmVlRmxhdE5vZGU7XG4gIGRyb3BOb2RlVGFyZ2V0OiBUcmVlRmxhdE5vZGU7XG4gIGV4cGFuZFRpbWVvdXQ6IG51bWJlcjtcbiAgbm9kZXNMaXN0ZW5lcnM6IERyYWdOb2RlTGlzdGVuZXJzW10gfCB1bmRlZmluZWQ7XG4gIGRyb3BMaW5lVGFyZ2V0OiBIVE1MRWxlbWVudDtcbiAgaGlnaGxpZ2h0ZWROb2RlID0gbmV3IFNlbGVjdGlvbk1vZGVsPFRyZWVGbGF0Tm9kZT4oKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSB0cmVlQ29udHJvbDogRmxhdFRyZWVDb250cm9sPFRyZWVGbGF0Tm9kZT47XG5cbiAgLyoqIFRoZSBkZWZhdWx0IGlzIDUgKi9cbiAgQElucHV0KCkgbWF4TGV2ZWwgPSA1O1xuXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBzZXQgdHJlZURyYWdEcm9wSXNEaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuaXNEaXNhYmxlZCA9IGRpc2FibGVkO1xuICAgIGRpc2FibGVkID8gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcigpIDogdGhpcy5hZGRBbGxMaXN0ZW5lcigpO1xuICB9XG4gIHByaXZhdGUgaXNEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKSBkcmFnU3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVGbGF0Tm9kZT4oKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1vbi1wcmVmaXhcbiAgQE91dHB1dCgpIG9uRHJvcCA9IG5ldyBFdmVudEVtaXR0ZXI8VHJlZURyb3BFdmVudD4obnVsbCk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gIEBPdXRwdXQoKSBvbkRyb3BFcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8RHJvcFBlcm1pc3Npb24+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ292ZXInLCBbJyRldmVudCddKSBob3N0RHJhZ092ZXIoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKSBob3N0RHJvcChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wKGV2ZW50KTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuLS1kcmFnZ2luZycpIGRyYWdnaW5nOiBib29sZWFuO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oTWF0VHJlZU5vZGUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgbm9kZXM6IFF1ZXJ5TGlzdDxNYXRUcmVlTm9kZTxUcmVlRmxhdE5vZGU+PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMub25Ecm9wLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRyYWdFbmQoKSk7XG5cbiAgICB0aGlzLmhpZ2hsaWdodGVkTm9kZS5jaGFuZ2VkLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICBpZiAoY2hhbmdlLnJlbW92ZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTm9kZUNsYXNzKGNoYW5nZS5yZW1vdmVkWzBdLmlkLCAnLS1kcmFnLWhvdmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGFuZ2UuYWRkZWQubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuYWRkTm9kZUNsYXNzKGNoYW5nZS5hZGRlZFswXS5pZCwgJy0tZHJhZy1ob3ZlcicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHRoaXMubm9kZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5hZGRBbGxMaXN0ZW5lcigpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcigpO1xuICB9XG5cbiAgb25EcmFnU3RhcnQobm9kZTogVHJlZUZsYXROb2RlKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5kcmFnZ2VkTm9kZSA9IG5vZGU7XG4gICAgdGhpcy5hZGROb2RlQ2xhc3Mobm9kZS5pZCwgJy0tZHJhZ2dlZCcpO1xuXG4gICAgdGhpcy5kcmFnU3RhcnQuZW1pdChub2RlKTtcbiAgfVxuXG4gIGRyYWdFbmQoKTogdm9pZCB7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRyYWdnZWROb2RlKSB7XG4gICAgICB0aGlzLnJlbW92ZU5vZGVDbGFzcyh0aGlzLmRyYWdnZWROb2RlLmlkLCAnLS1kcmFnZ2VkJyk7XG4gICAgICB0aGlzLmRyYWdnZWROb2RlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmRyYWdMZWF2ZSgpO1xuICAgIHRoaXMucmVtb3ZlRHJvcFRhcmdldExpbmUoKTtcbiAgfVxuXG4gIGRyYWdPdmVyKG5vZGU6IFRyZWVGbGF0Tm9kZSwgZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLmRyb3BOb2RlVGFyZ2V0ID0gbm9kZTtcblxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5nZXRQb3NpdGlvbihldmVudCwgbm9kZSk7XG5cbiAgICB0aGlzLnVwZGF0ZURyb3BUYXJnZXRMaW5lUG9zaXRpb24ocG9zaXRpb24pO1xuXG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZE5vZGUobm9kZSk7XG5cbiAgICB0aGlzLmhhbmRsZUdyb3VwRXhwYW5zaW9uKG5vZGUsIHBvc2l0aW9uLnR5cGUgPT09ICdpbnNpZGUnKTtcbiAgfVxuXG4gIGRyYWdMZWF2ZSgpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5leHBhbmRUaW1lb3V0KTtcbiAgICB0aGlzLmV4cGFuZFRpbWVvdXQgPSBudWxsO1xuICAgIHRoaXMuaGlnaGxpZ2h0ZWROb2RlLmNsZWFyKCk7XG4gIH1cblxuICBkcm9wKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcE5vZGVUYXJnZXQgfHwgdGhpcy5pc0Rpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZHJvcFBvc2l0aW9uOiBEcm9wUG9zaXRpb24gPSB0aGlzLmdldFBvc2l0aW9uKFxuICAgICAgZXZlbnQsXG4gICAgICB0aGlzLmRyb3BOb2RlVGFyZ2V0XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLmNhbkRyb3BOb2RlKHRoaXMuZHJvcE5vZGVUYXJnZXQsIGRyb3BQb3NpdGlvbik7XG4gICAgaWYgKCF2YWxpZGF0aW9uLmNhbkRyb3ApIHtcbiAgICAgIHRoaXMub25Ecm9wRXJyb3IuZW1pdCh2YWxpZGF0aW9uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0byBkcm9wIGEgbGFzdCBjaGlsZCBvdXRzaWRlIGlzIGdyb3VwLiBXZSByZWZlciB0byBpdCdzIGFuY2VzdG9yIGZvciB0aGUgdGFyZ2V0XG4gICAgaWYgKFxuICAgICAgZHJvcFBvc2l0aW9uLnR5cGUgPT09ICdiZWxvdycgJiZcbiAgICAgIGRyb3BQb3NpdGlvbi5sZXZlbCAhPT0gdGhpcy5kcm9wTm9kZVRhcmdldC5sZXZlbFxuICAgICkge1xuICAgICAgdGhpcy5kcm9wTm9kZVRhcmdldCA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhcbiAgICAgICAgdGhpcy5kcm9wTm9kZVRhcmdldC5pZCxcbiAgICAgICAgZHJvcFBvc2l0aW9uLmxldmVsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRyb3BOb2RlVGFyZ2V0LmlzR3JvdXApIHtcbiAgICAgIGlmIChkcm9wUG9zaXRpb24udHlwZSA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgY29uc3QgaXNFeHBhbmRlZCA9IHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZCh0aGlzLmRyb3BOb2RlVGFyZ2V0KTtcbiAgICAgICAgaWYgKGlzRXhwYW5kZWQpIHtcbiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZ2V0RGlyZWN0RGVzY2VuZGFudHModGhpcy5kcm9wTm9kZVRhcmdldCk7XG4gICAgICAgICAgaWYgKGNoaWxkcmVuWzBdPy5pZCA9PT0gdGhpcy5kcmFnZ2VkTm9kZS5pZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKHRoaXMuZHJvcE5vZGVUYXJnZXQpO1xuICAgICAgICByZXR1cm4gdGhpcy5vbkRyb3AuZW1pdCh7XG4gICAgICAgICAgbm9kZTogdGhpcy5kcmFnZ2VkTm9kZSxcbiAgICAgICAgICByZWY6IHRoaXMuZHJvcE5vZGVUYXJnZXQsXG4gICAgICAgICAgcG9zaXRpb246IGRyb3BQb3NpdGlvbi50eXBlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRyb3BQb3NpdGlvbi50eXBlID09PSAnYmVsb3cnICYmXG4gICAgICBkcm9wUG9zaXRpb24ubGV2ZWwgIT09IHRoaXMuZHJvcE5vZGVUYXJnZXQubGV2ZWxcbiAgICApIHtcbiAgICAgIGNvbnN0IGFuY2VzdG9yID0gdGhpcy5nZXROb2RlQW5jZXN0b3JzKHRoaXMuZHJvcE5vZGVUYXJnZXQuaWQpO1xuICAgICAgcmV0dXJuIHRoaXMub25Ecm9wLmVtaXQoe1xuICAgICAgICBub2RlOiB0aGlzLmRyYWdnZWROb2RlLFxuICAgICAgICByZWY6IGFuY2VzdG9yLFxuICAgICAgICBwb3NpdGlvbjogZHJvcFBvc2l0aW9uLnR5cGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMub25Ecm9wLmVtaXQoe1xuICAgICAgbm9kZTogdGhpcy5kcmFnZ2VkTm9kZSxcbiAgICAgIHJlZjogdGhpcy5kcm9wTm9kZVRhcmdldCxcbiAgICAgIHBvc2l0aW9uOiBkcm9wUG9zaXRpb24udHlwZVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGROb2RlQ2xhc3MoaWQ6IHN0cmluZywgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlcy5maW5kKChub2RlKSA9PiBub2RlLmRhdGEuaWQgPT09IGlkKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG5vZGVbJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTm9kZUNsYXNzKGlkOiBzdHJpbmcsIGNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXMuZmluZCgobm9kZSkgPT4gbm9kZS5kYXRhLmlkID09PSBpZCk7XG4gICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhub2RlWydfZWxlbWVudFJlZiddLm5hdGl2ZUVsZW1lbnQsIGNsYXNzTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGFkZEFsbExpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLm5vZGVzPy50b0FycmF5KCk7XG4gICAgaWYgKHRoaXMubm9kZXNMaXN0ZW5lcnMpIHtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzID0gbm9kZXM/Lm1hcCgobm9kZSkgPT4gdGhpcy5hZGRMaXN0ZW5lcihub2RlKSk7XG4gIH1cblxuICBwcml2YXRlIGFkZExpc3RlbmVyKG5vZGU6IE1hdFRyZWVOb2RlPFRyZWVGbGF0Tm9kZT4pOiBEcmFnTm9kZUxpc3RlbmVycyB7XG4gICAgY29uc3QgZWxlbWVudCA9IG5vZGVbJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBsaXN0ZW5lcnM6IFtzdHJpbmcsIEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3RdW10gPSBbXG4gICAgICBbJ2RyYWdzdGFydCcsICgpID0+IHRoaXMub25EcmFnU3RhcnQobm9kZS5kYXRhKV0sXG4gICAgICBbJ2RyYWdlbmQnLCAoKSA9PiB0aGlzLmRyYWdFbmQoKV0sXG4gICAgICBbJ2RyYWdvdmVyJywgKGV2ZW50OiBEcmFnRXZlbnQpID0+IHRoaXMuZHJhZ092ZXIobm9kZS5kYXRhLCBldmVudCldLFxuICAgICAgWydkcmFnbGVhdmUnLCAoKSA9PiB0aGlzLmRyYWdMZWF2ZSgpXVxuICAgIF07XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgbGlzdGVuZXJzLmZvckVhY2goKFt0eXBlLCBsaXN0ZW5lcl0pID0+XG4gICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpXG4gICAgKTtcblxuICAgIHJldHVybiB7IGVsZW1lbnQsIGxpc3RlbmVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBbGxMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzPy5mb3JFYWNoKCh7IGVsZW1lbnQsIGxpc3RlbmVycyB9KSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoW3R5cGUsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJhZ2dhYmxlJywgJ2ZhbHNlJyk7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLm5vZGVzTGlzdGVuZXJzID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SGlnaGxpZ2h0ZWROb2RlKG5vZGU6IFRyZWVGbGF0Tm9kZSk6IHZvaWQge1xuICAgIGNvbnN0IHRvSGlnaGxpZ2h0ID0gbm9kZS5pc0dyb3VwID8gbm9kZSA6IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhub2RlLmlkKTtcbiAgICB0b0hpZ2hsaWdodFxuICAgICAgPyB0aGlzLmhpZ2hsaWdodGVkTm9kZS5zZWxlY3QodG9IaWdobGlnaHQpXG4gICAgICA6IHRoaXMuaGlnaGxpZ2h0ZWROb2RlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGFkZERyb3BUYXJnZXRMaW5lKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKCdkcm9wLXRhcmdldC1saW5lJyk7XG4gICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcbiAgICAgICdzdHlsZScsXG4gICAgICBgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IHdpZHRoOiAxMDAlOyBwb2ludGVyLWV2ZW50czogbm9uZTsgei1pbmRleDogNDsgaGVpZ2h0OiAycHg7IGJhY2tncm91bmQtY29sb3I6IGJsYWNrOyB0cmFuc2l0aW9uOiBtYXJnaW4tbGVmdCAxNTBtcztgXG4gICAgKTtcbiAgICB0aGlzLmRyb3BMaW5lVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LFxuICAgICAgdGhpcy5kcm9wTGluZVRhcmdldFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZURyb3BUYXJnZXRMaW5lKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kcm9wTGluZVRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKFxuICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXRcbiAgICApO1xuICAgIHRoaXMuZHJvcExpbmVUYXJnZXQgPSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wVGFyZ2V0TGluZVBvc2l0aW9uKHBvc2l0aW9uOiBEcm9wUG9zaXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZHJvcExpbmVUYXJnZXQpIHtcbiAgICAgIHRoaXMuYWRkRHJvcFRhcmdldExpbmUoKTtcbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24udHlwZSA9PT0gJ2luc2lkZScpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbW92ZURyb3BUYXJnZXRMaW5lKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXQsXG4gICAgICAnbWFyZ2luLWxlZnQnLFxuICAgICAgcG9zaXRpb24ubGV2ZWwgKiAyNCArIDIwICsgJ3B4J1xuICAgICk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShcbiAgICAgIHRoaXMuZHJvcExpbmVUYXJnZXQsXG4gICAgICAndHJhbnNmb3JtJyxcbiAgICAgICd0cmFuc2xhdGUzZCgwLCcgKyBwb3NpdGlvbi55ICsgJ3B4LCAwKSdcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVHcm91cEV4cGFuc2lvbihub2RlOiBUcmVlRmxhdE5vZGUsIGlzSW5zaWRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCFpc0luc2lkZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZHJhZ0xlYXZlKCk7XG4gICAgfVxuICAgIGNvbnN0IGlzT3BlbiA9IHRoaXMudHJlZUNvbnRyb2wuaXNFeHBhbmRlZChub2RlKTtcbiAgICBpZiAoIWlzT3BlbiAmJiAhdGhpcy5leHBhbmRUaW1lb3V0KSB7XG4gICAgICB0aGlzLmV4cGFuZFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpO1xuICAgICAgfSwgMTIwMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXROb2RlRWxlbWVudChub2RlOiBUcmVlRmxhdE5vZGUpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdHJlZU5vZGUgPSB0aGlzLm5vZGVzLmZpbmQoKG4pID0+IG4uZGF0YS5pZCA9PT0gbm9kZS5pZCk7XG4gICAgcmV0dXJuIHRyZWVOb2RlPy5bJ19lbGVtZW50UmVmJ10ubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY2FuRHJvcE5vZGUoXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZSxcbiAgICBwb3NpdGlvbjogRHJvcFBvc2l0aW9uXG4gICk6IERyb3BQZXJtaXNzaW9uIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYW5Ecm9wR3JvdXAoaG92ZXJlZE5vZGUsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNNYXhMZXZlbFJlc3RyaWN0aW9ucyA9IHRoaXMudmFsaWRhdGVNYXhIaWVyYXJjaHlMZXZlbChwb3NpdGlvbik7XG4gICAgaWYgKGhhc01heExldmVsUmVzdHJpY3Rpb25zKSB7XG4gICAgICByZXR1cm4gaGFzTWF4TGV2ZWxSZXN0cmljdGlvbnM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY2FuRHJvcDogdHJ1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5Ecm9wR3JvdXAoXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZSxcbiAgICBwb3NpdGlvbjogRHJvcFBvc2l0aW9uXG4gICk6IERyb3BQZXJtaXNzaW9uIHtcbiAgICAvLyBPbiBuZSB2ZXV0IHBhcyBwZXJtZXR0cmUgbGUgRHJvcCBwb3VyIHVuIGdyb3VwZSBxdWkgcydhdXRvIHLDqWbDqXJlbmNlXG4gICAgaWYgKGhvdmVyZWROb2RlLmlkID09PSB0aGlzLmRyYWdnZWROb2RlLmlkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Ecm9wOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ2lnby5jb21tb24uZHJhZ0Ryb3AuY2Fubm90LmRyb3BJbnNpZGVJdHNlbGYnXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGhhc01heExldmVsUmVzdHJpY3Rpb25zID0gdGhpcy52YWxpZGF0ZU1heEhpZXJhcmNoeUxldmVsKHBvc2l0aW9uKTtcbiAgICBpZiAoaGFzTWF4TGV2ZWxSZXN0cmljdGlvbnMpIHtcbiAgICAgIHJldHVybiBoYXNNYXhMZXZlbFJlc3RyaWN0aW9ucztcbiAgICB9XG5cbiAgICBjb25zdCBpc0hvdmVyRGVzY2VuZGFudCA9IHRoaXMuaXNIb3ZlckRlc2NlbmRhbnQoaG92ZXJlZE5vZGUuaWQpO1xuICAgIHJldHVybiB7XG4gICAgICBjYW5Ecm9wOiAhaXNIb3ZlckRlc2NlbmRhbnQsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBpc0hvdmVyRGVzY2VuZGFudCAmJiAnaWdvLmNvbW1vbi5kcmFnRHJvcC5jYW5ub3QuZHJvcEluc2lkZUl0c2VsZidcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1heEhpZXJhcmNoeUxldmVsKHBvc2l0aW9uOiBEcm9wUG9zaXRpb24pOiBEcm9wUGVybWlzc2lvbiB7XG4gICAgaWYgKCF0aGlzLm1heExldmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGxldmVsID1cbiAgICAgIHBvc2l0aW9uLnR5cGUgPT09ICdpbnNpZGUnID8gcG9zaXRpb24ubGV2ZWwgKyAxIDogcG9zaXRpb24ubGV2ZWw7XG5cbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICAvLyBXZSBhZGQgYW4gZXh0cmEgbGV2ZWwgKzEgdG8gYXZvaWQgZW1wdHkgZ3JvdXAgaW4gZ3JvdXBcbiAgICAgIGxldmVsID0gbGV2ZWwgKyAodGhpcy5kcmFnZ2VkTm9kZS5kZXNjZW5kYW50TGV2ZWxzID8/IDApICsgMTtcbiAgICB9XG5cbiAgICBpZiAobGV2ZWwgPiB0aGlzLm1heExldmVsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYW5Ecm9wOiBmYWxzZSxcbiAgICAgICAgbWVzc2FnZTogJ2lnby5jb21tb24uZHJhZ0Ryb3AuY2Fubm90Lm1heExldmVsJyxcbiAgICAgICAgcGFyYW1zOiB7IHZhbHVlOiB0aGlzLm1heExldmVsIH1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0hvdmVyRGVzY2VuZGFudChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJlZUNvbnRyb2xcbiAgICAgIC5nZXREZXNjZW5kYW50cyh0aGlzLmRyYWdnZWROb2RlKVxuICAgICAgLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvbihcbiAgICBldmVudDogRHJhZ0V2ZW50LFxuICAgIGhvdmVyZWROb2RlOiBUcmVlRmxhdE5vZGVcbiAgKTogRHJvcFBvc2l0aW9uIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkTm9kZS5pc0dyb3VwKSB7XG4gICAgICBpZiAodGhpcy5pc0hvdmVyRGVzY2VuZGFudChob3ZlcmVkTm9kZS5pZCkpIHtcbiAgICAgICAgaG92ZXJlZE5vZGUgPSB0aGlzLmRyYWdnZWROb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBwb3NpdGlvblR5cGUgPSB0aGlzLmdldFBvc2l0aW9uVHlwZShldmVudCwgaG92ZXJlZE5vZGUpO1xuXG4gICAgY29uc3QgYmVsbG93T3BlbmVkR3JvdXAgPVxuICAgICAgaG92ZXJlZE5vZGUuaXNHcm91cCAmJlxuICAgICAgcG9zaXRpb25UeXBlID09PSAnYmVsb3cnICYmXG4gICAgICB0aGlzLnRyZWVDb250cm9sLmlzRXhwYW5kZWQoaG92ZXJlZE5vZGUpO1xuICAgIGlmIChiZWxsb3dPcGVuZWRHcm91cCkge1xuICAgICAgcG9zaXRpb25UeXBlID0gJ2luc2lkZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGV2ZW50LngsXG4gICAgICB5OiB0aGlzLmdldFBvc2l0aW9uWShob3ZlcmVkTm9kZSwgcG9zaXRpb25UeXBlKSxcbiAgICAgIGxldmVsOiB0aGlzLmdldFBvc2l0aW9uTGV2ZWwoaG92ZXJlZE5vZGUsIHBvc2l0aW9uVHlwZSwgZXZlbnQueCksXG4gICAgICB0eXBlOiBwb3NpdGlvblR5cGVcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQb3NpdGlvblkobm9kZTogVHJlZUZsYXROb2RlLCB0eXBlOiBEcm9wUG9zaXRpb25UeXBlKTogbnVtYmVyIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXROb2RlRWxlbWVudChub2RlKTtcbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJldHVybiB0eXBlID09PSAnYmVsb3cnXG4gICAgICA/IGVsZW1lbnQub2Zmc2V0VG9wICsgcmVjdC5oZWlnaHQgLSAxXG4gICAgICA6IGVsZW1lbnQub2Zmc2V0VG9wICsgMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25UeXBlKFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICAgaG92ZXJlZE5vZGU6IFRyZWVGbGF0Tm9kZVxuICApOiBEcm9wUG9zaXRpb25UeXBlIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldE5vZGVFbGVtZW50KGhvdmVyZWROb2RlKTtcbiAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IG1pZGRsZSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyAyO1xuICAgIGNvbnN0IHkgPSBldmVudC55O1xuXG4gICAgY29uc3Qgc2VsZlJlZmVyZW5jaW5nID0gdGhpcy5kcmFnZ2VkTm9kZS5pZCA9PT0gaG92ZXJlZE5vZGUuaWQ7XG4gICAgaWYgKGhvdmVyZWROb2RlLmlzR3JvdXAgJiYgIXNlbGZSZWZlcmVuY2luZykge1xuICAgICAgY29uc3QgdG9sZXJlbmNlID0gNTtcbiAgICAgIGlmICh5IDw9IG1pZGRsZSArIHRvbGVyZW5jZSAmJiB5ID49IG1pZGRsZSAtIHRvbGVyZW5jZSkge1xuICAgICAgICByZXR1cm4gJ2luc2lkZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNCZWxvdyA9IHkgPiBtaWRkbGU7XG4gICAgcmV0dXJuIGlzQmVsb3cgPyAnYmVsb3cnIDogJ2Fib3ZlJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UG9zaXRpb25MZXZlbChcbiAgICBob3ZlcmVkTm9kZTogVHJlZUZsYXROb2RlLFxuICAgIHR5cGU6IERyb3BQb3NpdGlvblR5cGUsXG4gICAgeDogbnVtYmVyXG4gICk6IG51bWJlciB7XG4gICAgaWYgKGhvdmVyZWROb2RlLmxldmVsID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBhbmNlc3RvciA9IHRoaXMuZ2V0Tm9kZUFuY2VzdG9ycyhob3ZlcmVkTm9kZS5pZCk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmdldERpcmVjdERlc2NlbmRhbnRzKGFuY2VzdG9yKTtcbiAgICBjb25zdCBsYXN0Q2hpbGQgPSBbLi4uY2hpbGRyZW5dLnBvcCgpO1xuXG4gICAgaWYgKHR5cGUgPT09ICdiZWxvdycgJiYgbGFzdENoaWxkLmlkID09PSBob3ZlcmVkTm9kZS5pZCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXROb2RlRWxlbWVudChob3ZlcmVkTm9kZSk7XG4gICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBjb25zdCBpbmRlbnRhdGlvbiA9IDI0O1xuICAgICAgY29uc3QgeE1pbiA9IHJlY3QueCArIGluZGVudGF0aW9uO1xuICAgICAgY29uc3QgeE1heCA9IHhNaW4gKyBpbmRlbnRhdGlvbiAqIGhvdmVyZWROb2RlLmxldmVsO1xuXG4gICAgICBjb25zdCBpc0luc2lkZVNhbWVHcm91cCA9IHggPiB4TWF4O1xuICAgICAgaWYgKCFpc0luc2lkZVNhbWVHcm91cCkge1xuICAgICAgICBjb25zdCBsZXZlbFN1YnN0cmFjdGVkID0gTWF0aC5yb3VuZCgoeE1heCAtIHgpIC8gaW5kZW50YXRpb24pO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgaG92ZXJlZE5vZGUubGV2ZWwgLSBsZXZlbFN1YnN0cmFjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaG92ZXJlZE5vZGUubGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGxldmVsIGlmIGxldmVsIGlzIGRlZmluZWQgd2l0aCBnbyB0byB0aGUgZGVmaW5lZCBsZXZsZSB0byBmaW5kIGFuY2VzdG9yLiBTaW5vbiBvbiBwcmVuZCBsZSBjdXJyZW50IGFuY2VzdG9yXG4gICAqL1xuICBwcml2YXRlIGdldE5vZGVBbmNlc3RvcnMoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBsZXZlbD86IG51bWJlclxuICApOiBUcmVlRmxhdE5vZGUgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG5vZGVzID0gdGhpcy50cmVlQ29udHJvbC5kYXRhTm9kZXM7XG4gICAgY29uc3QgaW5kZXggPSBub2Rlcy5maW5kSW5kZXgoKG5vZGUpID0+IG5vZGUuaWQgPT09IGlkKTtcblxuICAgIGNvbnN0IHRhcmdldExldmVsID0gbGV2ZWwgPz8gTWF0aC5tYXgoMCwgbm9kZXNbaW5kZXhdLmxldmVsIC0gMSk7XG4gICAgcmV0dXJuIG5vZGVzXG4gICAgICAuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAucmV2ZXJzZSgpXG4gICAgICAuZmluZCgobm9kZSkgPT4gbm9kZS5sZXZlbCA9PT0gdGFyZ2V0TGV2ZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREaXJlY3REZXNjZW5kYW50cyhub2RlOiBUcmVlRmxhdE5vZGUpOiBUcmVlRmxhdE5vZGVbXSB7XG4gICAgY29uc3QgbGV2ZWwgPSBub2RlLmxldmVsICsgMTtcbiAgICByZXR1cm4gdGhpcy50cmVlQ29udHJvbFxuICAgICAgLmdldERlc2NlbmRhbnRzKG5vZGUpXG4gICAgICAuZmlsdGVyKChjaGlsZCkgPT4gY2hpbGQubGV2ZWwgPT09IGxldmVsKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tbW9uL2RyYWctZHJvcC9zcmMvdHJlZS1kcmFnLWRyb3AvdHJlZS1kcmFnLWRyb3AuaW50ZXJmYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIFRyZWVGbGF0Tm9kZTxUID0gYW55PiB7XG4gIGlkOiBzdHJpbmc7XG4gIGlzR3JvdXA6IGJvb2xlYW47XG4gIGRpc2FibGVkOiBib29sZWFuO1xuICBsZXZlbDogbnVtYmVyO1xuICAvLyBHaXZlIHRoZSBudW1iZXIgb2YgbGV2ZWwgaW5zaWRlIGEgZ3JvdXA7XG4gIGRlc2NlbmRhbnRMZXZlbHM/OiBudW1iZXI7XG4gIGRhdGE6IFQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJvcFBvc2l0aW9uIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIGxldmVsOiBudW1iZXI7XG4gIHR5cGU6IERyb3BQb3NpdGlvblR5cGU7XG59XG5cbmV4cG9ydCB0eXBlIERyb3BQb3NpdGlvblR5cGUgPSAnYWJvdmUnIHwgJ2JlbG93JyB8ICdpbnNpZGUnO1xuIl19
|