@limble/limble-tree 1.0.0-alpha.2 → 1.0.0-beta.1
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/README.md +4 -0
- package/esm2020/lib/components/branch/branch.component.mjs +1 -1
- package/esm2020/lib/components/dropzone/dropzone.component.mjs +2 -2
- package/esm2020/lib/core/configuration/configuration.mjs +1 -1
- package/esm2020/lib/core/configuration/tree-options.interface.mjs +1 -1
- package/esm2020/lib/core/index.mjs +1 -2
- package/esm2020/lib/core/tree-branch/tree-branch.mjs +181 -5
- package/esm2020/lib/core/tree-root/tree-root.mjs +97 -2
- package/esm2020/lib/core/tree-service/tree.service.mjs +7 -1
- package/esm2020/lib/events/drag/drag-end-event.mjs +9 -7
- package/esm2020/lib/events/drag/drag-start-event.mjs +2 -4
- package/esm2020/lib/events/drag/drop-event.mjs +2 -4
- package/esm2020/lib/events/general/destruction-event.mjs +2 -4
- package/esm2020/lib/events/relational/graft-event.mjs +2 -4
- package/esm2020/lib/events/relational/prune-event.mjs +2 -4
- package/esm2020/lib/events/relational/relational-tree-event.interface.mjs +1 -1
- package/esm2020/lib/extras/collapse/collapse.module.mjs +2 -1
- package/esm2020/lib/extras/collapse/collapse.service.mjs +26 -1
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.module.mjs +5 -1
- package/esm2020/lib/extras/drag-and-drop/drag-and-drop.service.mjs +21 -5
- package/esm2020/lib/extras/drag-and-drop/draggable.directive.mjs +7 -7
- package/esm2020/lib/extras/drag-and-drop/dragover-no-change-detect.mjs +10 -11
- package/esm2020/lib/legacy/legacy-component-obj.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree-data.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree-options.interface.mjs +1 -1
- package/esm2020/lib/legacy/legacy-tree.mjs +3 -2
- package/esm2020/lib/legacy/limble-tree-root/limble-tree-root.component.mjs +1 -1
- package/esm2020/lib/limble-tree.module.mjs +6 -2
- package/esm2020/lib/structure/component-container.interface.mjs +1 -1
- package/esm2020/lib/structure/index.mjs +1 -2
- package/esm2020/lib/structure/tree-branch-node.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-event.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-node.interface.mjs +1 -1
- package/esm2020/lib/structure/tree-relationship.interface.mjs +1 -1
- package/fesm2015/limble-limble-tree.mjs +511 -190
- package/fesm2015/limble-limble-tree.mjs.map +1 -1
- package/fesm2020/limble-limble-tree.mjs +510 -189
- package/fesm2020/limble-limble-tree.mjs.map +1 -1
- package/lib/core/configuration/configuration.d.ts +2 -2
- package/lib/core/configuration/tree-options.interface.d.ts +38 -16
- package/lib/core/index.d.ts +0 -1
- package/lib/core/tree-branch/tree-branch.d.ts +183 -8
- package/lib/core/tree-root/tree-root.d.ts +100 -7
- package/lib/core/tree-service/tree.service.d.ts +8 -2
- package/lib/events/drag/drag-end-event.d.ts +11 -8
- package/lib/events/drag/drag-start-event.d.ts +6 -5
- package/lib/events/drag/drop-event.d.ts +6 -6
- package/lib/events/general/destruction-event.d.ts +5 -5
- package/lib/events/relational/graft-event.d.ts +5 -6
- package/lib/events/relational/prune-event.d.ts +5 -6
- package/lib/events/relational/relational-tree-event.interface.d.ts +5 -1
- package/lib/extras/collapse/collapse.module.d.ts +1 -0
- package/lib/extras/collapse/collapse.service.d.ts +25 -0
- package/lib/extras/drag-and-drop/drag-and-drop.module.d.ts +4 -0
- package/lib/extras/drag-and-drop/drag-and-drop.service.d.ts +22 -3
- package/lib/extras/drag-and-drop/draggable.directive.d.ts +3 -4
- package/lib/extras/drag-and-drop/dragover-no-change-detect.d.ts +7 -3
- package/lib/legacy/legacy-component-obj.interface.d.ts +1 -1
- package/lib/legacy/legacy-tree-data.interface.d.ts +1 -1
- package/lib/legacy/legacy-tree-options.interface.d.ts +2 -2
- package/lib/legacy/legacy-tree.d.ts +4 -4
- package/lib/legacy/limble-tree-root/limble-tree-root.component.d.ts +4 -4
- package/lib/limble-tree.module.d.ts +4 -0
- package/lib/structure/component-container.interface.d.ts +1 -1
- package/lib/structure/index.d.ts +0 -1
- package/lib/structure/tree-branch-node.interface.d.ts +2 -2
- package/lib/structure/tree-event.interface.d.ts +3 -3
- package/lib/structure/tree-node.interface.d.ts +11 -8
- package/lib/structure/tree-relationship.interface.d.ts +2 -2
- package/package.json +1 -1
- package/esm2020/lib/structure/event-conduit.interface.mjs +0 -2
- package/lib/structure/event-conduit.interface.d.ts +0 -6
package/README.md
CHANGED
|
@@ -331,6 +331,10 @@ Drag and drop functionality is easy to use. Simply add the `[limbleTreeDraggable
|
|
|
331
331
|
|
|
332
332
|
As the user drags the branch over other branches of the tree, dropzones will appear to indicate where the dragged branch may be placed. Dropping into a dropzone will graft the dragged branch at that location.
|
|
333
333
|
|
|
334
|
+
### Dragging Into Empty Trees
|
|
335
|
+
|
|
336
|
+
Dropzones appear automatically as a branch is dragged over other branches. But what if the target tree has no other branches? In this case, a dropzone will not appear automatically. You will have to manually tell the tree when to render its dropzone using the `TreeDragAndDropService`.
|
|
337
|
+
|
|
334
338
|
### Configurable Restrictions For Drag-And-Drop
|
|
335
339
|
|
|
336
340
|
A tree can be configured to disallow certain branches from...
|
|
@@ -54,7 +54,7 @@ export class BranchComponent {
|
|
|
54
54
|
}
|
|
55
55
|
}
|
|
56
56
|
BranchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BranchComponent, deps: [{ token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
57
|
-
BranchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BranchComponent, isStandalone: true, selector: "branch", inputs: { contentToHost: "contentToHost" }, outputs: { contentCreated: "contentCreated", showDropzones: "showDropzones", dropped: "dropped" }, viewQueries: [{ propertyName: "branchesContainer", first: true, predicate: ["branchesContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dropzones", predicate: DropzoneComponent, descendants: true }], ngImport: i0, template: "<div class=\"content\" (dragoverNoChangeDetect)=\"dragoverHandler($event)\">\n <div #contentContainer></div>\n</div>\n<div class=\"branches-container\">\n <dropzone placement=\"inner\" [hidden]=\"!showInnerDropzone\"></dropzone>\n <div #branchesContainer></div>\n</div>\n<dropzone placement=\"lateral\" [hidden]=\"!showLateralDropzone\"></dropzone>\n", styles: [".branches-container{margin-left:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropzoneComponent, selector: "dropzone", inputs: ["placement"], outputs: ["dropped"] }, { kind: "directive", type: DragoverNoChangeDetectDirective, selector: "[dragoverNoChangeDetect]",
|
|
57
|
+
BranchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BranchComponent, isStandalone: true, selector: "branch", inputs: { contentToHost: "contentToHost" }, outputs: { contentCreated: "contentCreated", showDropzones: "showDropzones", dropped: "dropped" }, viewQueries: [{ propertyName: "branchesContainer", first: true, predicate: ["branchesContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "contentContainer", first: true, predicate: ["contentContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dropzones", predicate: DropzoneComponent, descendants: true }], ngImport: i0, template: "<div class=\"content\" (dragoverNoChangeDetect)=\"dragoverHandler($event)\">\n <div #contentContainer></div>\n</div>\n<div class=\"branches-container\">\n <dropzone placement=\"inner\" [hidden]=\"!showInnerDropzone\"></dropzone>\n <div #branchesContainer></div>\n</div>\n<dropzone placement=\"lateral\" [hidden]=\"!showLateralDropzone\"></dropzone>\n", styles: [".branches-container{margin-left:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropzoneComponent, selector: "dropzone", inputs: ["placement"], outputs: ["dropped"] }, { kind: "directive", type: DragoverNoChangeDetectDirective, selector: "[dragoverNoChangeDetect]", outputs: ["dragoverNoChangeDetect"] }] });
|
|
58
58
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BranchComponent, decorators: [{
|
|
59
59
|
type: Component,
|
|
60
60
|
args: [{ standalone: true, selector: "branch", imports: [CommonModule, DropzoneComponent, DragoverNoChangeDetectDirective], template: "<div class=\"content\" (dragoverNoChangeDetect)=\"dragoverHandler($event)\">\n <div #contentContainer></div>\n</div>\n<div class=\"branches-container\">\n <dropzone placement=\"inner\" [hidden]=\"!showInnerDropzone\"></dropzone>\n <div #branchesContainer></div>\n</div>\n<dropzone placement=\"lateral\" [hidden]=\"!showLateralDropzone\"></dropzone>\n", styles: [".branches-container{margin-left:16px}\n"] }]
|
|
@@ -23,10 +23,10 @@ export class DropzoneComponent {
|
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
25
|
DropzoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropzoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
26
|
-
DropzoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DropzoneComponent, isStandalone: true, selector: "dropzone", inputs: { placement: "placement" }, outputs: { dropped: "dropped" }, ngImport: i0, template: "<div\n class=\"dropzone\"\n [ngClass]=\"{ active: active }\"\n (dragenter)=\"dragenterHandler()\"\n (dragleave)=\"dragleaveHandler()\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n (drop)=\"dropHandler($event)\"\n></div>\n", styles: [".dropzone{border-radius:8px;border:1px dashed #727374;background-color:#ededed;height:
|
|
26
|
+
DropzoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DropzoneComponent, isStandalone: true, selector: "dropzone", inputs: { placement: "placement" }, outputs: { dropped: "dropped" }, ngImport: i0, template: "<div\n class=\"dropzone\"\n [ngClass]=\"{ active: active }\"\n (dragenter)=\"dragenterHandler()\"\n (dragleave)=\"dragleaveHandler()\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n (drop)=\"dropHandler($event)\"\n></div>\n", styles: [".dropzone{border-radius:8px;border:1px dashed #727374;background-color:#ededed;height:36px;margin:8px 0;transition:height .3s ease-out;animation:animation .3s ease-out}.dropzone.active{border-color:#289e49;border-width:2px;background-color:#d0e8d6;height:72px}@keyframes animation{0%{height:0px;opacity:0}to{height:36px;opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: DragoverNoChangeDetectDirective, selector: "[dragoverNoChangeDetect]", outputs: ["dragoverNoChangeDetect"] }] });
|
|
27
27
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropzoneComponent, decorators: [{
|
|
28
28
|
type: Component,
|
|
29
|
-
args: [{ standalone: true, selector: "dropzone", imports: [CommonModule, DragoverNoChangeDetectDirective], template: "<div\n class=\"dropzone\"\n [ngClass]=\"{ active: active }\"\n (dragenter)=\"dragenterHandler()\"\n (dragleave)=\"dragleaveHandler()\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n (drop)=\"dropHandler($event)\"\n></div>\n", styles: [".dropzone{border-radius:8px;border:1px dashed #727374;background-color:#ededed;height:
|
|
29
|
+
args: [{ standalone: true, selector: "dropzone", imports: [CommonModule, DragoverNoChangeDetectDirective], template: "<div\n class=\"dropzone\"\n [ngClass]=\"{ active: active }\"\n (dragenter)=\"dragenterHandler()\"\n (dragleave)=\"dragleaveHandler()\"\n (dragoverNoChangeDetect)=\"dragoverHandler($event)\"\n (drop)=\"dropHandler($event)\"\n></div>\n", styles: [".dropzone{border-radius:8px;border:1px dashed #727374;background-color:#ededed;height:36px;margin:8px 0;transition:height .3s ease-out;animation:animation .3s ease-out}.dropzone.active{border-color:#289e49;border-width:2px;background-color:#d0e8d6;height:72px}@keyframes animation{0%{height:0px;opacity:0}to{height:36px;opacity:1}}\n"] }]
|
|
30
30
|
}], propDecorators: { placement: [{
|
|
31
31
|
type: Input
|
|
32
32
|
}], dropped: [{
|
|
@@ -14,4 +14,4 @@ class Configuration {
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
export const config = new Configuration();
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbWJsZS10cmVlL3NyYy9saWIvY29yZS9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxhQUFhO0lBR2hCO1FBRmlCLGtCQUFhLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFHcEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFTSxTQUFTLENBQUksSUFBaUIsRUFBRSxPQUFvQjtRQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUFTO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLE1BQU0sQ0FBQyxJQUFTO1FBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FDSDtBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBUcmVlUm9vdCB9IGZyb20gXCIuLi90cmVlLXJvb3QvdHJlZS1yb290XCI7XG5pbXBvcnQgdHlwZSB7IFRyZWVPcHRpb25zIH0gZnJvbSBcIi4vdHJlZS1vcHRpb25zLmludGVyZmFjZVwiO1xuXG5jbGFzcyBDb25maWd1cmF0aW9uIHtcbiAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU3RvcmFnZSA9IG5ldyBNYXA8VHJlZVJvb3Q8YW55PiwgVHJlZU9wdGlvbnM+KCk7XG5cbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIHRoaXMuY29uZmlnU3RvcmFnZSA9IG5ldyBNYXAoKTtcbiAgIH1cblxuICAgcHVibGljIHNldENvbmZpZzxUPihyb290OiBUcmVlUm9vdDxUPiwgb3B0aW9uczogVHJlZU9wdGlvbnMpOiB2b2lkIHtcbiAgICAgIHRoaXMuY29uZmlnU3RvcmFnZS5zZXQocm9vdCwgb3B0aW9ucyk7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRDb25maWcocm9vdDogYW55KTogVHJlZU9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMuY29uZmlnU3RvcmFnZS5nZXQocm9vdCk7XG4gICB9XG5cbiAgIHB1YmxpYyBkZWxldGUocm9vdDogYW55KTogdm9pZCB7XG4gICAgICB0aGlzLmNvbmZpZ1N0b3JhZ2UuZGVsZXRlKHJvb3QpO1xuICAgfVxufVxuXG5leHBvcnQgY29uc3QgY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiJdfQ==
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1vcHRpb25zLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2xpbWJsZS10cmVlL3NyYy9saWIvY29yZS9jb25maWd1cmF0aW9uL3RyZWUtb3B0aW9ucy5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgVHJlZUJyYW5jaCB9IGZyb20gXCIuLi90cmVlLWJyYW5jaC90cmVlLWJyYW5jaFwiO1xuaW1wb3J0IHR5cGUgeyBUcmVlUm9vdCB9IGZyb20gXCIuLi90cmVlLXJvb3QvdHJlZS1yb290XCI7XG5cbi8qKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhIHRyZWUsIGFzIGlkZW50aWZpZWQgYnkgYSBUcmVlUm9vdCAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmVlT3B0aW9ucyB7XG4gICBkcmFnQW5kRHJvcD86IHtcbiAgICAgIC8qKlxuICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0byBhbGxvdyBhIG5vZGUgdG8gYmUgZHJhZ2dlZC5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrc1xuICAgICAgICogUnVucyB3aGVuIGEgZHJhZyBiZWdpbnMsIGJ1dCBiZWZvcmUgdGhlIGJyYW5jaCBpcyBwcnVuZWQgZnJvbSB0aGUgdHJlZS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gdHJlZUJyYW5jaCAtIFRoZSBub2RlIG9mIHRoZSB0cmVlIHRoYXQgaXMgYWJvdXQgdG8gYmUgZHJhZ2dlZC5cbiAgICAgICAqXG4gICAgICAgKiBAZGVmYXVsdFZhbHVlIEEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyB0cnVlLlxuICAgICAgICpcbiAgICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgbm9kZSBjYW4gYmUgZHJhZ2dlZDsgYGZhbHNlYCBpZiBpdCBjYW5ub3QuXG4gICAgICAgKi9cbiAgICAgIGFsbG93RHJhZ2dpbmc/OiA8VD4odHJlZUJyYW5jaDogVHJlZUJyYW5jaDxUPikgPT4gYm9vbGVhbjtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgc291cmNlTm9kZSBjYW4gYmUgZHJvcHBlZCBhdCBhXG4gICAgICAgKiBwYXJ0aWN1bGFyIGxvY2F0aW9uLlxuICAgICAgICpcbiAgICAgICAqIEByZW1hcmtzXG4gICAgICAgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMganVzdCBiZWZvcmUgZGlzcGxheWluZyBhIGZhbWlseSBvZiBkcm9wem9uZXMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHNvdXJjZUJyYW5jaCAtIFRoZSBicmFuY2ggdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICAgICAgICogQHBhcmFtIHByb3Bvc2VkUGFyZW50IC0gVGhlIHByb3Bvc2VkIG5ldyBwYXJlbnQgb2YgdGhlIHNvdXJjZUJyYW5jaC5cbiAgICAgICAqIEBwYXJhbSBwcm9wb3NlZEluZGV4IC0gVGhlIHByb3Bvc2VkIG5ldyBpbmRleCBvZiB0aGUgc291cmNlQnJhbmNoLlxuICAgICAgICpcbiAgICAgICAqIEBkZWZhdWx0VmFsdWUgQSBmdW5jdGlvbiB0aGF0IGFsd2F5cyByZXR1cm5zIHRydWUuXG4gICAgICAgKi9cbiAgICAgIGFsbG93RHJvcD86IDxUPihcbiAgICAgICAgIHNvdXJjZUJyYW5jaDogVHJlZUJyYW5jaDxUPixcbiAgICAgICAgIHByb3Bvc2VkUGFyZW50OiBUcmVlQnJhbmNoPFQ+IHwgVHJlZVJvb3Q8VD4sXG4gICAgICAgICBwcm9wb3NlZEluZGV4OiBudW1iZXJcbiAgICAgICkgPT4gYm9vbGVhbjtcblxuICAgICAgLyoqXG4gICAgICAgKiBBIGZ1bmN0aW9uIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gYWxsb3cgXCJuZXN0aW5nXCIgKHBsYWNpbmcgYSBicmFuY2ggYXNcbiAgICAgICAqIGEgY2hpbGQpIG9mIGEgcGFydGljdWxhciBicmFuY2guXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3NcbiAgICAgICAqIFRoaXMgZnVuY3Rpb24gcnVucyBqdXN0IGJlZm9yZSBkaXNwbGF5aW5nIGEgZmFtaWx5IG9mIGRyb3B6b25lcy5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0gdHJlZUJyYW5jaCAtIFRoZSBub2RlIG9mIHRoZSB0cmVlIHdob3NlIG5lc3RpbmcgY2FwYWJpbGl0eSBpcyBiZWluZ1xuICAgICAgICogY2hlY2tlZC5cbiAgICAgICAqXG4gICAgICAgKiBAZGVmYXVsdFZhbHVlIEEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyB0cnVlLlxuICAgICAgICovXG4gICAgICBhbGxvd05lc3Rpbmc/OiA8VD4odHJlZUJyYW5jaDogVHJlZUJyYW5jaDxUPikgPT4gYm9vbGVhbjtcbiAgIH07XG5cbiAgIC8qKlxuICAgICogVGhlIG51bWJlciBvZiBwaXhlbHMgZWFjaCBsZXZlbCBvZiB0aGUgdHJlZSB3aWxsIGJlIGluZGVudGVkIHJlbGF0aXZlIHRvXG4gICAgKiBpdHMgcGFyZW50LlxuICAgICpcbiAgICAqIEBkZWZhdWx0VmFsdWUgMTZcbiAgICAqL1xuICAgaW5kZW50YXRpb24/OiBudW1iZXI7XG59XG4iXX0=
|
|
@@ -2,5 +2,4 @@ export * from "./tree-service/tree.service";
|
|
|
2
2
|
export * from "./tree-root/tree-root";
|
|
3
3
|
export * from "./tree-branch/tree-branch";
|
|
4
4
|
export * from "./configuration/tree-options.interface";
|
|
5
|
-
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3Q0FBd0MsQ0FBQztBQUN2RCxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdHJlZS1zZXJ2aWNlL3RyZWUuc2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJlZS1yb290L3RyZWUtcm9vdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHJlZS1icmFuY2gvdHJlZS1icmFuY2hcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbmZpZ3VyYXRpb24vdHJlZS1vcHRpb25zLmludGVyZmFjZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uXCI7XG4iXX0=
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3Q0FBd0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3RyZWUtc2VydmljZS90cmVlLnNlcnZpY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyZWUtcm9vdC90cmVlLXJvb3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3RyZWUtYnJhbmNoL3RyZWUtYnJhbmNoXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25maWd1cmF0aW9uL3RyZWUtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbiJdfQ==
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import { assert } from "../../../shared/assert";
|
|
2
|
-
import { GraftEvent } from "../../events/relational/graft-event";
|
|
3
|
-
import { PruneEvent } from "../../events/relational/prune-event";
|
|
4
2
|
import { TreeNodeBase } from "../tree-node-base";
|
|
5
|
-
import { TreeError } from "../../errors
|
|
3
|
+
import { TreeError } from "../../errors";
|
|
6
4
|
import { dropzoneRenderer } from "../../extras/drag-and-drop/dropzone-renderer";
|
|
7
5
|
import { config } from "../configuration/configuration";
|
|
8
6
|
import { TreeRoot } from "..";
|
|
9
7
|
import { treeCollapser } from "../../extras/collapse/collapse";
|
|
10
|
-
import { DestructionEvent } from "../../events
|
|
8
|
+
import { DestructionEvent, GraftEvent, PruneEvent } from "../../events";
|
|
11
9
|
import { BranchController } from "./branch-controller";
|
|
10
|
+
/** Represents a standard node in a tree. Renders a BranchComponent.
|
|
11
|
+
*
|
|
12
|
+
* @remarks
|
|
13
|
+
* This class renders a branch component, which does the following:
|
|
14
|
+
* 1. Renders a component provided by the user
|
|
15
|
+
* 2. Provides a container in which child branches may be rendered
|
|
16
|
+
* 3. Contains two Dropzones: one for dropping branches below this branch (as a
|
|
17
|
+
* sibling), and one for dropping branches as a first child of this branch.
|
|
18
|
+
*/
|
|
12
19
|
export class TreeBranch {
|
|
13
20
|
constructor(parent, branchOptions) {
|
|
14
21
|
this.branchOptions = branchOptions;
|
|
@@ -34,9 +41,18 @@ export class TreeBranch {
|
|
|
34
41
|
}));
|
|
35
42
|
}
|
|
36
43
|
}
|
|
44
|
+
/** @returns All child branches as an array of TreeBranch instances, in order. */
|
|
37
45
|
branches() {
|
|
38
46
|
return this.treeNodeBase.branches();
|
|
39
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Recursively destroys all descendant branches, as well as itself. This
|
|
50
|
+
* releases all resources held or consumed by this branch and its descendants.
|
|
51
|
+
*
|
|
52
|
+
* @remarks
|
|
53
|
+
* It is important to call this method when a branch is discarded, otherwise
|
|
54
|
+
* the branch will remain in memory and continue to consume resources.
|
|
55
|
+
*/
|
|
40
56
|
destroy() {
|
|
41
57
|
if (this.isDestroyed()) {
|
|
42
58
|
throw new TreeError("Cannot destroy a destroyed tree branch");
|
|
@@ -49,49 +65,101 @@ export class TreeBranch {
|
|
|
49
65
|
this.branchController.destroy();
|
|
50
66
|
this.dispatch(new DestructionEvent(this));
|
|
51
67
|
}
|
|
68
|
+
/** Run Angular change detection on this branch */
|
|
52
69
|
detectChanges() {
|
|
53
70
|
this.branchController.detectChanges();
|
|
54
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Emits the specified TreeEvent.
|
|
74
|
+
*
|
|
75
|
+
* @remarks
|
|
76
|
+
* Caution: It is not recommended to manually emit TreeEvents that are already
|
|
77
|
+
* provided by the library. For example, it is not recommended to emit a
|
|
78
|
+
* `GraftEvent`, `DestructionEvent`, etc. These events may be used by the tree,
|
|
79
|
+
* and emitting them manually may cause unexpected behavior. Instead, we
|
|
80
|
+
* recommend implementing the TreeEvent interface with your own custom events
|
|
81
|
+
* and dispatching those.
|
|
82
|
+
*
|
|
83
|
+
* @param event - The TreeEvent that will be emitted.
|
|
84
|
+
*/
|
|
55
85
|
dispatch(event) {
|
|
56
86
|
this.treeNodeBase.dispatch(event);
|
|
57
87
|
this._parent?.dispatch(event);
|
|
58
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* @returns
|
|
91
|
+
* An observable that emits TreeEvents whenever an event is dispatched
|
|
92
|
+
* in this branch or any of its descendant branches.
|
|
93
|
+
*/
|
|
59
94
|
events() {
|
|
60
95
|
return this.treeNodeBase.events();
|
|
61
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* @param index - The index of the child branch to retrieve.
|
|
99
|
+
*
|
|
100
|
+
* @returns
|
|
101
|
+
* The child branch at the specified index, or undefined if there is
|
|
102
|
+
* no child branch at the specified index.
|
|
103
|
+
*/
|
|
62
104
|
getBranch(index) {
|
|
63
105
|
return this.treeNodeBase.getBranch(index);
|
|
64
106
|
}
|
|
107
|
+
/** @returns The ViewContainerRef in which child branches are rendered */
|
|
65
108
|
getBranchesContainer() {
|
|
66
109
|
if (this.isDestroyed()) {
|
|
67
110
|
throw new TreeError("Cannot get branches container from a destroyed tree branch");
|
|
68
111
|
}
|
|
69
112
|
return this.branchController.getBranchesContainer();
|
|
70
113
|
}
|
|
114
|
+
/** @returns The instance of BranchComponent that is rendered by this class. */
|
|
71
115
|
getComponentInstance() {
|
|
72
116
|
if (this.isDestroyed()) {
|
|
73
117
|
throw new TreeError("Cannot get component instance from a destroyed tree branch");
|
|
74
118
|
}
|
|
75
119
|
return this.branchController.getComponentInstance();
|
|
76
120
|
}
|
|
121
|
+
/** @returns The Host View in which the BranchComponent is rendered */
|
|
77
122
|
getHostView() {
|
|
78
123
|
if (this.isDestroyed()) {
|
|
79
124
|
throw new TreeError("Cannot get component host view from a destroyed tree branch");
|
|
80
125
|
}
|
|
81
126
|
return this.branchController.getHostView();
|
|
82
127
|
}
|
|
128
|
+
/** @returns The BranchComponent as a native HTML Element */
|
|
83
129
|
getNativeElement() {
|
|
84
130
|
if (this.isDestroyed()) {
|
|
85
131
|
throw new TreeError("Cannot get native element from a destroyed tree branch");
|
|
86
132
|
}
|
|
87
133
|
return this.branchController.getNativeElement();
|
|
88
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* @returns
|
|
137
|
+
* A ComponentRef containing the instance of the user-provided
|
|
138
|
+
* component which is rendered by this branch.
|
|
139
|
+
*/
|
|
89
140
|
getUserlandComponentRef() {
|
|
90
141
|
if (this.isDestroyed()) {
|
|
91
142
|
throw new TreeError("Cannot get userland component from a destroyed tree branch");
|
|
92
143
|
}
|
|
93
144
|
return this.branchController.getUserlandComponentRef();
|
|
94
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Attaches a branch to a new parent node.
|
|
148
|
+
*
|
|
149
|
+
* @remarks
|
|
150
|
+
* If not already pruned, this method prunes (removes) this branch from its
|
|
151
|
+
* current position in the tree; then grafts (reattaches) it as a child of the
|
|
152
|
+
* specified parent branch at the specified index. If no index is specified,
|
|
153
|
+
* the branch is appended as the last child of the parent. This causes this
|
|
154
|
+
* branch's associated BranchComponent to be re-rendered in the DOM at the
|
|
155
|
+
* new location.
|
|
156
|
+
*
|
|
157
|
+
* @param newParent - The new parent branch unto which this branch will be grafted.
|
|
158
|
+
* @param index - The index at which this branch will be grafted. If not specified,
|
|
159
|
+
* this branch will be appended as the last child of the new parent.
|
|
160
|
+
*
|
|
161
|
+
* @returns The index at which this branch was grafted.
|
|
162
|
+
*/
|
|
95
163
|
graftTo(newParent, index) {
|
|
96
164
|
this.checkGraftLocationValidity(newParent, index);
|
|
97
165
|
const ownIndex = this.index();
|
|
@@ -108,12 +176,35 @@ export class TreeBranch {
|
|
|
108
176
|
}));
|
|
109
177
|
return newIndex;
|
|
110
178
|
}
|
|
179
|
+
/**
|
|
180
|
+
* Appends a new child branch to this branch. The child branch will render
|
|
181
|
+
* the specified component according to the (optional) configuration parameter.
|
|
182
|
+
*
|
|
183
|
+
* @param component - The component to render in the new child branch.
|
|
184
|
+
* @param options - Configuration options for the new child branch.
|
|
185
|
+
*
|
|
186
|
+
* @returns
|
|
187
|
+
* The newly-created child branch.
|
|
188
|
+
*/
|
|
111
189
|
grow(component, options) {
|
|
112
190
|
if (this.isDestroyed()) {
|
|
113
191
|
throw new TreeError("Cannot grow a branch on a destroyed tree branch");
|
|
114
192
|
}
|
|
115
193
|
return new TreeBranch(this, { component, ...options });
|
|
116
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Determines this branch's index in relation to its sibling branches.
|
|
197
|
+
*
|
|
198
|
+
* @remarks
|
|
199
|
+
* For example, if it is the first child of its parent, this method will return
|
|
200
|
+
* 0. If it is the second child of its parent, this method will return 1.
|
|
201
|
+
*
|
|
202
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
203
|
+
* method will return undefined.
|
|
204
|
+
*
|
|
205
|
+
* @returns
|
|
206
|
+
* The index of this branch in relation to its sibling branches, or undefined.
|
|
207
|
+
*/
|
|
117
208
|
index() {
|
|
118
209
|
if (!this._parent) {
|
|
119
210
|
return undefined;
|
|
@@ -124,18 +215,76 @@ export class TreeBranch {
|
|
|
124
215
|
assert(index >= 0);
|
|
125
216
|
return index;
|
|
126
217
|
}
|
|
218
|
+
/** @returns `true` if the branch is destroyed, `false` otherwise */
|
|
127
219
|
isDestroyed() {
|
|
128
220
|
return this.treeNodeBase.isDestroyed();
|
|
129
221
|
}
|
|
222
|
+
/**
|
|
223
|
+
* @returns
|
|
224
|
+
* The data that was passed into the `branchOptions`' `meta` property
|
|
225
|
+
* at construction.
|
|
226
|
+
*/
|
|
130
227
|
meta() {
|
|
131
228
|
return this.branchOptions.meta ?? {};
|
|
132
229
|
}
|
|
230
|
+
/**
|
|
231
|
+
* @returns
|
|
232
|
+
* This branch's parent node (which may be a TreeBranch or TreeRoot).
|
|
233
|
+
* If this branch has no parent, (eg, if this branch has been pruned) this
|
|
234
|
+
* method will return undefined.
|
|
235
|
+
*/
|
|
133
236
|
parent() {
|
|
134
237
|
return this._parent;
|
|
135
238
|
}
|
|
239
|
+
/**
|
|
240
|
+
* Provides a model describing this branch's descendants.
|
|
241
|
+
*
|
|
242
|
+
* @returns
|
|
243
|
+
* A multi-dimensional Map which describes the shape of this branch's
|
|
244
|
+
* descendants.
|
|
245
|
+
*
|
|
246
|
+
* @example
|
|
247
|
+
* A branch with no children will return an empty Map. A branch with
|
|
248
|
+
* a single child will return a Map with a single entry, where the key is the index
|
|
249
|
+
* of the branch (zero) and the value is an empty Map. A Tree like this:
|
|
250
|
+
*
|
|
251
|
+
* ```
|
|
252
|
+
* ---Branch-------Branch
|
|
253
|
+
* /
|
|
254
|
+
* Branch-------Branch
|
|
255
|
+
* \
|
|
256
|
+
* ---Branch
|
|
257
|
+
* ```
|
|
258
|
+
* Will return a Map of matching shape:
|
|
259
|
+
* ```
|
|
260
|
+
* Map {
|
|
261
|
+
* 0: Map { 0: Map {}},
|
|
262
|
+
* 1: Map {},
|
|
263
|
+
* 2: Map {}
|
|
264
|
+
* }
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
136
267
|
plot() {
|
|
137
268
|
return this.treeNodeBase.plot();
|
|
138
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Calculates the branch's position in the tree relative to the Root.
|
|
272
|
+
*
|
|
273
|
+
* @remarks
|
|
274
|
+
* The position is described as an array of numbers, where each number
|
|
275
|
+
* represents the index of the branch at that level of the tree.
|
|
276
|
+
*
|
|
277
|
+
* For example, if this branch is the first child of the Root, this method
|
|
278
|
+
* will return [0]. If this branch is the second child of the first child
|
|
279
|
+
* of the Root, this method will return [0, 1].
|
|
280
|
+
*
|
|
281
|
+
* If the branch is not related to a TreeRoot, (such as when it has been
|
|
282
|
+
* pruned,) this method will throw an error.
|
|
283
|
+
*
|
|
284
|
+
* @returns
|
|
285
|
+
* An array of numbers which describe the branch's position in the tree
|
|
286
|
+
* relative to the Root.
|
|
287
|
+
*/
|
|
139
288
|
position() {
|
|
140
289
|
const index = this.index();
|
|
141
290
|
if (index === undefined) {
|
|
@@ -147,6 +296,19 @@ export class TreeBranch {
|
|
|
147
296
|
}
|
|
148
297
|
return [index];
|
|
149
298
|
}
|
|
299
|
+
/**
|
|
300
|
+
* Removes a branch from its tree without destroying it.
|
|
301
|
+
*
|
|
302
|
+
* @remarks
|
|
303
|
+
* Removes this branch from its parent and detaches its associated
|
|
304
|
+
* BranchComponent from the DOM. This puts the branch in a "pruned" state,
|
|
305
|
+
* which may affect the behavior of other methods.
|
|
306
|
+
*
|
|
307
|
+
* A pruned branch can be reattached to any other node using the `graftTo` method.
|
|
308
|
+
*
|
|
309
|
+
* @returns
|
|
310
|
+
* Itself, or undefined if it is already in a pruned state.
|
|
311
|
+
*/
|
|
150
312
|
prune() {
|
|
151
313
|
if (this.isDestroyed()) {
|
|
152
314
|
throw new TreeError("Cannot prune a destroyed tree branch");
|
|
@@ -168,6 +330,14 @@ export class TreeBranch {
|
|
|
168
330
|
this._parent = undefined;
|
|
169
331
|
return this;
|
|
170
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* Get the root of the tree to which this Branch is attached.
|
|
335
|
+
*
|
|
336
|
+
* @returns
|
|
337
|
+
* The TreeRoot of the tree this branch is in. If this branch is
|
|
338
|
+
* does not have a root (such as when it has been pruned) this method will
|
|
339
|
+
* return undefined.
|
|
340
|
+
*/
|
|
171
341
|
root() {
|
|
172
342
|
const parent = this.parent();
|
|
173
343
|
if (parent instanceof TreeBranch) {
|
|
@@ -176,6 +346,12 @@ export class TreeBranch {
|
|
|
176
346
|
assert(parent instanceof TreeRoot || parent === undefined);
|
|
177
347
|
return parent;
|
|
178
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* Traverses this branch's descendants in depth-first pre-order, executing
|
|
351
|
+
* the provided callback function on each node. Traversal includes this branch.
|
|
352
|
+
*
|
|
353
|
+
* @param callback - A function to execute on each node.
|
|
354
|
+
*/
|
|
179
355
|
traverse(callback) {
|
|
180
356
|
callback(this);
|
|
181
357
|
this.treeNodeBase.traverse(callback);
|
|
@@ -221,4 +397,4 @@ export class TreeBranch {
|
|
|
221
397
|
branchesContainerEl.style.marginLeft = `${options?.indentation ?? 16}px`;
|
|
222
398
|
}
|
|
223
399
|
}
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFNakUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQztBQUM5QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsTUFBTSxPQUFPLFVBQVU7SUFlcEIsWUFDRyxNQUE4RCxFQUM5QyxhQUFtRDtRQUFuRCxrQkFBYSxHQUFiLGFBQWEsQ0FBc0M7UUFSOUQsaUJBQVksR0FBbUIsSUFBSSxDQUFDO1FBVXpDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLHVCQUF1QixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlELE1BQU0sQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUM5QyxJQUFJ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ZXJ0XCI7XG5pbXBvcnQgeyBUcmVlUGxvdCB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmUvdHJlZS1wbG90XCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEdyYWZ0RXZlbnQgfSBmcm9tIFwiLi4vLi4vZXZlbnRzL3JlbGF0aW9uYWwvZ3JhZnQtZXZlbnRcIjtcbmltcG9ydCB7IFBydW5lRXZlbnQgfSBmcm9tIFwiLi4vLi4vZXZlbnRzL3JlbGF0aW9uYWwvcHJ1bmUtZXZlbnRcIjtcbmltcG9ydCB7IFRyZWVFdmVudCB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmUvdHJlZS1ldmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IFRyZWVCcmFuY2hOb2RlIH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZS90cmVlLWJyYW5jaC1ub2RlLmludGVyZmFjZVwiO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3UmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JyYW5jaC9icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOb2RlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvbm9kZS1jb21wb25lbnQuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBUcmVlTm9kZUJhc2UgfSBmcm9tIFwiLi4vdHJlZS1ub2RlLWJhc2VcIjtcbmltcG9ydCB7IFRyZWVFcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvcnMvdHJlZS1lcnJvclwiO1xuaW1wb3J0IHsgQnJhbmNoT3B0aW9ucywgRnVsbEJyYW5jaE9wdGlvbnMgfSBmcm9tIFwiLi4vYnJhbmNoLW9wdGlvbnMuaW50ZXJmYWNlXCI7XG5pbXBvcnQgeyBkcm9wem9uZVJlbmRlcmVyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9kcmFnLWFuZC1kcm9wL2Ryb3B6b25lLXJlbmRlcmVyXCI7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgeyBUcmVlUm9vdCB9IGZyb20gXCIuLlwiO1xuaW1wb3J0IHsgdHJlZUNvbGxhcHNlciB9IGZyb20gXCIuLi8uLi9leHRyYXMvY29sbGFwc2UvY29sbGFwc2VcIjtcbmltcG9ydCB7IERlc3RydWN0aW9uRXZlbnQgfSBmcm9tIFwiLi4vLi4vZXZlbnRzL2dlbmVyYWxcIjtcbmltcG9ydCB7IFRyZWVOb2RlIH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZVwiO1xuaW1wb3J0IHsgQnJhbmNoQ29udHJvbGxlciB9IGZyb20gXCIuL2JyYW5jaC1jb250cm9sbGVyXCI7XG5cbmV4cG9ydCBjbGFzcyBUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgaW1wbGVtZW50c1xuICAgICAgVHJlZUJyYW5jaE5vZGU8XG4gICAgICAgICBCcmFuY2hDb21wb25lbnQ8VXNlcmxhbmRDb21wb25lbnQ+LFxuICAgICAgICAgVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICAgICBOb2RlQ29tcG9uZW50XG4gICAgICA+XG57XG4gICBwcml2YXRlIHJlYWRvbmx5IGJyYW5jaENvbnRyb2xsZXI6IEJyYW5jaENvbnRyb2xsZXI8VXNlcmxhbmRDb21wb25lbnQ+O1xuICAgcHJpdmF0ZSBkZXRhY2hlZFZpZXc6IFZpZXdSZWYgfCBudWxsID0gbnVsbDtcbiAgIHByaXZhdGUgX3BhcmVudDpcbiAgICAgIHwgVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgIHByaXZhdGUgcmVhZG9ubHkgdHJlZU5vZGVCYXNlOiBUcmVlTm9kZUJhc2U8VXNlcmxhbmRDb21wb25lbnQ+O1xuXG4gICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICBwYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIHB1YmxpYyByZWFkb25seSBicmFuY2hPcHRpb25zOiBGdWxsQnJhbmNoT3B0aW9uczxVc2VybGFuZENvbXBvbmVudD5cbiAgICkge1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UgPSBuZXcgVHJlZU5vZGVCYXNlKCk7XG4gICAgICBjb25zdCBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lciA9IHBhcmVudC5nZXRCcmFuY2hlc0NvbnRhaW5lcigpO1xuICAgICAgYXNzZXJ0KHBhcmVudEJyYW5jaGVzQ29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyID0gbmV3IEJyYW5jaENvbnRyb2xsZXIoXG4gICAgICAgICB0aGlzLFxuICAgICAgICAgcGFyZW50QnJhbmNoZXNDb250YWluZXJcbiAgICAgICk7XG4gICAgICB0aGlzLnNldEluZGVudGF0aW9uKHBhcmVudCk7XG4gICAgICBpZiAoXG4gICAgICAgICBwYXJlbnQgaW5zdGFuY2VvZiBUcmVlQnJhbmNoICYmXG4gICAgICAgICBwYXJlbnQuYnJhbmNoT3B0aW9ucy5kZWZhdWx0Q29sbGFwc2VkID09PSB0cnVlXG4gICAgICApIHtcbiAgICAgICAgIHRyZWVDb2xsYXBzZXIuc3RvcmVQcmVjb2xsYXBzZWROb2RlKHBhcmVudCwgdGhpcyk7XG4gICAgICAgICB0aGlzLmRldGFjaGVkVmlldyA9IHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHBhcmVudEJyYW5jaGVzQ29udGFpbmVyLmluc2VydCh0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0SG9zdFZpZXcoKSk7XG4gICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICAgICBuZXcgR3JhZnRFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICAgICBwYXJlbnQ6IHRoaXMuX3BhcmVudCxcbiAgICAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgICAgaW5kZXg6IHRoaXMuX3BhcmVudC5icmFuY2hlcygpLmxlbmd0aFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICk7XG4gICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBicmFuY2hlcygpOiBBcnJheTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50Pj4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmJyYW5jaGVzKCk7XG4gICB9XG5cbiAgIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBkZXN0cm95IGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgdHJlZUNvbGxhcHNlci5leHBhbmQodGhpcyk7XG4gICAgICBkcm9wem9uZVJlbmRlcmVyLmNsZWFyVHJlZUZyb21SZWdpc3RyeSh0aGlzKTtcbiAgICAgIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMudHJlZU5vZGVCYXNlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuYnJhbmNoQ29udHJvbGxlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKG5ldyBEZXN0cnVjdGlvbkV2ZW50KHRoaXMpKTtcbiAgIH1cblxuICAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICBwdWJsaWMgZGlzcGF0Y2goZXZlbnQ6IFRyZWVFdmVudCk6IHZvaWQge1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UuZGlzcGF0Y2goZXZlbnQpO1xuICAgICAgdGhpcy5fcGFyZW50Py5kaXNwYXRjaChldmVudCk7XG4gICB9XG5cbiAgIHB1YmxpYyBldmVudHMoKTogT2JzZXJ2YWJsZTxUcmVlRXZlbnQ+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5ldmVudHMoKTtcbiAgIH1cblxuICAgcHVibGljIGdldEJyYW5jaChpbmRleDogbnVtYmVyKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmdldEJyYW5jaChpbmRleCk7XG4gICB9XG5cbiAgIHB1YmxpYyBnZXRCcmFuY2hlc0NvbnRhaW5lcigpOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgYnJhbmNoZXMgY29udGFpbmVyIGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgIH1cblxuICAgcHVibGljIGdldENvbXBvbmVudEluc3RhbmNlKCk6IEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCBjb21wb25lbnQgaW5zdGFuY2UgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IGNvbXBvbmVudCBob3N0IHZpZXcgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0TmF0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IG5hdGl2ZSBlbGVtZW50IGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0TmF0aXZlRWxlbWVudCgpO1xuICAgfVxuXG4gICBwdWJsaWMgZ2V0VXNlcmxhbmRDb21wb25lbnRSZWYoKTpcbiAgICAgIHwgQ29tcG9uZW50UmVmPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgICAgfCB1bmRlZmluZWQge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCB1c2VybGFuZCBjb21wb25lbnQgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRVc2VybGFuZENvbXBvbmVudFJlZigpO1xuICAgfVxuXG4gICBwdWJsaWMgZ3JhZnRUbyhcbiAgICAgIG5ld1BhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+LFxuICAgICAgaW5kZXg/OiBudW1iZXJcbiAgICk6IG51bWJlciB7XG4gICAgICB0aGlzLmNoZWNrR3JhZnRMb2NhdGlvblZhbGlkaXR5KG5ld1BhcmVudCwgaW5kZXgpO1xuICAgICAgY29uc3Qgb3duSW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAob3duSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhpcy5wcnVuZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fcGFyZW50ID0gbmV3UGFyZW50O1xuICAgICAgY29uc3QgbmV3SW5kZXggPSBpbmRleCA/PyBuZXdQYXJlbnQuYnJhbmNoZXMoKS5sZW5ndGg7XG4gICAgICB0aGlzLnJlYXR0YWNoVmlldyhuZXdJbmRleCk7XG4gICAgICB0aGlzLmRpc3BhdGNoKFxuICAgICAgICAgbmV3IEdyYWZ0RXZlbnQodGhpcywge1xuICAgICAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQsXG4gICAgICAgICAgICBjaGlsZDogdGhpcyxcbiAgICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3SW5kZXg7XG4gICB9XG5cbiAgIHB1YmxpYyBncm93KFxuICAgICAgY29tcG9uZW50OiBUeXBlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIG9wdGlvbnM/OiBCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncm93IGEgYnJhbmNoIG9uIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUcmVlQnJhbmNoKHRoaXMsIHsgY29tcG9uZW50LCAuLi5vcHRpb25zIH0pO1xuICAgfVxuXG4gICBwdWJsaWMgaW5kZXgoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICghdGhpcy5fcGFyZW50KSB7XG4gICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9wYXJlbnRcbiAgICAgICAgIC5icmFuY2hlcygpXG4gICAgICAgICAuZmluZEluZGV4KChicmFuY2gpID0+IGJyYW5jaCA9PT0gdGhpcyk7XG4gICAgICBhc3NlcnQoaW5kZXggPj0gMCk7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICB9XG5cbiAgIHB1YmxpYyBpc0Rlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5pc0Rlc3Ryb3llZCgpO1xuICAgfVxuXG4gICBwdWJsaWMgbWV0YSgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaE9wdGlvbnMubWV0YSA/PyB7fTtcbiAgIH1cblxuICAgcHVibGljIHBhcmVudCgpOlxuICAgICAgfCBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICB9XG5cbiAgIHB1YmxpYyBwbG90KCk6IFRyZWVQbG90IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5wbG90KCk7XG4gICB9XG5cbiAgIHB1YmxpYyBwb3NpdGlvbigpOiBBcnJheTxudW1iZXI+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcImJyYW5jaCBoYXMgbm8gcGFyZW50LiBQb3NpdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBUcmVlQnJhbmNoKSB7XG4gICAgICAgICBjb25zdCBwYXJlbnRQb3NpdGlvbiA9IHRoaXMuX3BhcmVudC5wb3NpdGlvbigpO1xuICAgICAgICAgcmV0dXJuIFsuLi5wYXJlbnRQb3NpdGlvbiwgaW5kZXhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtpbmRleF07XG4gICB9XG5cbiAgIHB1YmxpYyBwcnVuZSgpOiB0aGlzIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgcHJ1bmUgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgoKTtcbiAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgICBjb25zdCBjb250YWluZXIgPSBwYXJlbnQuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgICAgIGFzc2VydChjb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldyA9IGNvbnRhaW5lci5kZXRhY2goaW5kZXgpO1xuICAgICAgYXNzZXJ0KHRoaXMuZGV0YWNoZWRWaWV3ICE9PSBudWxsKTtcbiAgICAgIHRoaXMuZGV0YWNoZWRWaWV3LmRldGFjaCgpO1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgIG5ldyBQcnVuZUV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICBpbmRleDogaW5kZXhcbiAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgdGhpcy5fcGFyZW50ID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICB9XG5cbiAgIHB1YmxpYyByb290KCk6IFRyZWVSb290PFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQucm9vdCgpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHBhcmVudCBpbnN0YW5jZW9mIFRyZWVSb290IHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICB9XG5cbiAgIHB1YmxpYyB0cmF2ZXJzZShcbiAgICAgIGNhbGxiYWNrOiAoXG4gICAgICAgICBub2RlOiBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgICkgPT4gdm9pZFxuICAgKTogdm9pZCB7XG4gICAgICBjYWxsYmFjayh0aGlzKTtcbiAgICAgIHRoaXMudHJlZU5vZGVCYXNlLnRyYXZlcnNlKGNhbGxiYWNrKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBjaGVja0dyYWZ0TG9jYXRpb25WYWxpZGl0eShcbiAgICAgIG5ld1BhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+LFxuICAgICAgaW5kZXg/OiBudW1iZXJcbiAgICk6IHZvaWQge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncmFmdCBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdQYXJlbnQuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncmFmdCB0byBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIHR5cGVvZiBpbmRleCA9PT0gXCJudW1iZXJcIiAmJlxuICAgICAgICAgdGhpcy5pbmRleElzT3V0T2ZSYW5nZShuZXdQYXJlbnQsIGluZGV4KVxuICAgICAgKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBncmFmdCBicmFuY2ggYXQgaW5kZXggJHtpbmRleH0gb2YgdGhlIHBhcmVudC4gT3V0IG9mIHJhbmdlLmBcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLnRyYXZlcnNlKChub2RlKSA9PiB7XG4gICAgICAgICBpZiAobm9kZSA9PT0gbmV3UGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgICAgXCJDYW5ub3QgZ3JhZnQgYSBicmFuY2ggdG8gaXRzZWxmIG9yIGFueSBvZiBpdHMgb3duIGRlc2NlbmRhbnRzXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICB9XG4gICAgICB9KTtcbiAgIH1cblxuICAgcHJpdmF0ZSBpbmRleElzT3V0T2ZSYW5nZShcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+LFxuICAgICAgaW5kZXg6IG51bWJlclxuICAgKTogYm9vbGVhbiB7XG4gICAgICByZXR1cm4gaW5kZXggPCAwIHx8IGluZGV4ID4gcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoO1xuICAgfVxuXG4gICBwcml2YXRlIHJlYXR0YWNoVmlldyhpbmRleD86IG51bWJlcik6IHZvaWQge1xuICAgICAgYXNzZXJ0KHRoaXMuX3BhcmVudCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9wYXJlbnQuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgICAgIGFzc2VydChjb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5yZWF0dGFjaCgpO1xuICAgICAgY29udGFpbmVyLmluc2VydCh0aGlzLmRldGFjaGVkVmlldywgaW5kZXgpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBudWxsO1xuICAgfVxuXG4gICBwcml2YXRlIHNldEluZGVudGF0aW9uKFxuICAgICAgcGFyZW50OiBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICk6IHZvaWQge1xuICAgICAgY29uc3Qgcm9vdCA9IHBhcmVudC5yb290KCk7XG4gICAgICBhc3NlcnQocm9vdCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuZ2V0Q29uZmlnKHJvb3QpO1xuICAgICAgY29uc3QgYnJhbmNoZXNDb250YWluZXJFbCA9IHRoaXMuYnJhbmNoQ29udHJvbGxlclxuICAgICAgICAgLmdldE5hdGl2ZUVsZW1lbnQoKVxuICAgICAgICAgLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJicmFuY2hlcy1jb250YWluZXJcIilcbiAgICAgICAgIC5pdGVtKDApO1xuICAgICAgYXNzZXJ0KGJyYW5jaGVzQ29udGFpbmVyRWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCk7XG4gICAgICBicmFuY2hlc0NvbnRhaW5lckVsLnN0eWxlLm1hcmdpbkxlZnQgPSBgJHtvcHRpb25zPy5pbmRlbnRhdGlvbiA/PyAxNn1weGA7XG4gICB9XG59XG4iXX0=
|
|
400
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS1icmFuY2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9saW1ibGUtdHJlZS9zcmMvbGliL2NvcmUvdHJlZS1icmFuY2gvdHJlZS1icmFuY2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBVWhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBS3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQU94RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBZXBCLFlBQ0csTUFBOEQsRUFDOUMsYUFBbUQ7UUFBbkQsa0JBQWEsR0FBYixhQUFhLENBQXNDO1FBUjlELGlCQUFZLEdBQW1CLElBQUksQ0FBQztRQVV6QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDdkMsTUFBTSx1QkFBdUIsR0FBRyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsdUJBQXVCLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksZ0JBQWdCLENBQ3pDLElBQUksRUFDSix1QkFBdUIs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QUFDO1FBQ3ZDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjthQUM3QyxnQkFBZ0IsRUFBRTthQUNsQixzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQzthQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDWixNQUFNLENBQUMsbUJBQW1CLFlBQVksV0FBVyxDQUFDLENBQUM7UUFDbkQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksRUFBRSxJQUFJLENBQUM7SUFDNUUsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4uLy4uLy4uL3NoYXJlZC9hc3NlcnRcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gICBDb21wb25lbnRSZWYsXG4gICBUeXBlLFxuICAgVmlld0NvbnRhaW5lclJlZixcbiAgIFZpZXdSZWZcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEJyYW5jaENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL2JyYW5jaC9icmFuY2guY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9ub2RlLWNvbXBvbmVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IFRyZWVOb2RlQmFzZSB9IGZyb20gXCIuLi90cmVlLW5vZGUtYmFzZVwiO1xuaW1wb3J0IHsgVHJlZUVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUge1xuICAgQnJhbmNoT3B0aW9ucyxcbiAgIEZ1bGxCcmFuY2hPcHRpb25zXG59IGZyb20gXCIuLi9icmFuY2gtb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IGRyb3B6b25lUmVuZGVyZXIgfSBmcm9tIFwiLi4vLi4vZXh0cmFzL2RyYWctYW5kLWRyb3AvZHJvcHpvbmUtcmVuZGVyZXJcIjtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCIuLi9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCB7IFRyZWVSb290IH0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyB0cmVlQ29sbGFwc2VyIH0gZnJvbSBcIi4uLy4uL2V4dHJhcy9jb2xsYXBzZS9jb2xsYXBzZVwiO1xuaW1wb3J0IHsgRGVzdHJ1Y3Rpb25FdmVudCwgR3JhZnRFdmVudCwgUHJ1bmVFdmVudCB9IGZyb20gXCIuLi8uLi9ldmVudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgIFRyZWVOb2RlLFxuICAgVHJlZVBsb3QsXG4gICBUcmVlRXZlbnQsXG4gICBUcmVlQnJhbmNoTm9kZVxufSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlXCI7XG5pbXBvcnQgeyBCcmFuY2hDb250cm9sbGVyIH0gZnJvbSBcIi4vYnJhbmNoLWNvbnRyb2xsZXJcIjtcblxuLyoqIFJlcHJlc2VudHMgYSBzdGFuZGFyZCBub2RlIGluIGEgdHJlZS4gUmVuZGVycyBhIEJyYW5jaENvbXBvbmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBjbGFzcyByZW5kZXJzIGEgYnJhbmNoIGNvbXBvbmVudCwgd2hpY2ggZG9lcyB0aGUgZm9sbG93aW5nOlxuICogMS4gUmVuZGVycyBhIGNvbXBvbmVudCBwcm92aWRlZCBieSB0aGUgdXNlclxuICogMi4gUHJvdmlkZXMgYSBjb250YWluZXIgaW4gd2hpY2ggY2hpbGQgYnJhbmNoZXMgbWF5IGJlIHJlbmRlcmVkXG4gKiAzLiBDb250YWlucyB0d28gRHJvcHpvbmVzOiBvbmUgZm9yIGRyb3BwaW5nIGJyYW5jaGVzIGJlbG93IHRoaXMgYnJhbmNoIChhcyBhXG4gKiBzaWJsaW5nKSwgYW5kIG9uZSBmb3IgZHJvcHBpbmcgYnJhbmNoZXMgYXMgYSBmaXJzdCBjaGlsZCBvZiB0aGlzIGJyYW5jaC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+XG4gICBpbXBsZW1lbnRzXG4gICAgICBUcmVlQnJhbmNoTm9kZTxcbiAgICAgICAgIEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4sXG4gICAgICAgICBUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgICAgIE5vZGVDb21wb25lbnRcbiAgICAgID5cbntcbiAgIHByaXZhdGUgcmVhZG9ubHkgYnJhbmNoQ29udHJvbGxlcjogQnJhbmNoQ29udHJvbGxlcjxVc2VybGFuZENvbXBvbmVudD47XG4gICBwcml2YXRlIGRldGFjaGVkVmlldzogVmlld1JlZiB8IG51bGwgPSBudWxsO1xuICAgcHJpdmF0ZSBfcGFyZW50OlxuICAgICAgfCBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgcHJpdmF0ZSByZWFkb25seSB0cmVlTm9kZUJhc2U6IFRyZWVOb2RlQmFzZTxVc2VybGFuZENvbXBvbmVudD47XG5cbiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+LFxuICAgICAgcHVibGljIHJlYWRvbmx5IGJyYW5jaE9wdGlvbnM6IEZ1bGxCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKSB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZSA9IG5ldyBUcmVlTm9kZUJhc2UoKTtcbiAgICAgIGNvbnN0IHBhcmVudEJyYW5jaGVzQ29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQocGFyZW50QnJhbmNoZXNDb250YWluZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIgPSBuZXcgQnJhbmNoQ29udHJvbGxlcihcbiAgICAgICAgIHRoaXMsXG4gICAgICAgICBwYXJlbnRCcmFuY2hlc0NvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0SW5kZW50YXRpb24ocGFyZW50KTtcbiAgICAgIGlmIChcbiAgICAgICAgIHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2ggJiZcbiAgICAgICAgIHBhcmVudC5icmFuY2hPcHRpb25zLmRlZmF1bHRDb2xsYXBzZWQgPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICAgdHJlZUNvbGxhcHNlci5zdG9yZVByZWNvbGxhcHNlZE5vZGUocGFyZW50LCB0aGlzKTtcbiAgICAgICAgIHRoaXMuZGV0YWNoZWRWaWV3ID0gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEhvc3RWaWV3KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAgcGFyZW50QnJhbmNoZXNDb250YWluZXIuaW5zZXJ0KHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpKTtcbiAgICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50O1xuICAgICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgICAgIHBhcmVudDogdGhpcy5fcGFyZW50LFxuICAgICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICAgICBpbmRleDogdGhpcy5fcGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoXG4gICAgICAgICAgICB9KVxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIEFsbCBjaGlsZCBicmFuY2hlcyBhcyBhbiBhcnJheSBvZiBUcmVlQnJhbmNoIGluc3RhbmNlcywgaW4gb3JkZXIuICovXG4gICBwdWJsaWMgYnJhbmNoZXMoKTogQXJyYXk8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4+IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5icmFuY2hlcygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIFJlY3Vyc2l2ZWx5IGRlc3Ryb3lzIGFsbCBkZXNjZW5kYW50IGJyYW5jaGVzLCBhcyB3ZWxsIGFzIGl0c2VsZi4gVGhpc1xuICAgICogcmVsZWFzZXMgYWxsIHJlc291cmNlcyBoZWxkIG9yIGNvbnN1bWVkIGJ5IHRoaXMgYnJhbmNoIGFuZCBpdHMgZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIEl0IGlzIGltcG9ydGFudCB0byBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gYSBicmFuY2ggaXMgZGlzY2FyZGVkLCBvdGhlcndpc2VcbiAgICAqIHRoZSBicmFuY2ggd2lsbCByZW1haW4gaW4gbWVtb3J5IGFuZCBjb250aW51ZSB0byBjb25zdW1lIHJlc291cmNlcy5cbiAgICAqL1xuICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IGRlc3Ryb3kgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICB0aGlzLnBydW5lKCk7XG4gICAgICB0cmVlQ29sbGFwc2VyLmV4cGFuZCh0aGlzKTtcbiAgICAgIGRyb3B6b25lUmVuZGVyZXIuY2xlYXJUcmVlRnJvbVJlZ2lzdHJ5KHRoaXMpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyLmdldEhvc3RWaWV3KCkuZGVzdHJveSgpO1xuICAgICAgdGhpcy50cmVlTm9kZUJhc2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy5icmFuY2hDb250cm9sbGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2gobmV3IERlc3RydWN0aW9uRXZlbnQodGhpcykpO1xuICAgfVxuXG4gICAvKiogUnVuIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBvbiB0aGlzIGJyYW5jaCAqL1xuICAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gICAgICB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEVtaXRzIHRoZSBzcGVjaWZpZWQgVHJlZUV2ZW50LlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBDYXV0aW9uOiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gbWFudWFsbHkgZW1pdCBUcmVlRXZlbnRzIHRoYXQgYXJlIGFscmVhZHlcbiAgICAqIHByb3ZpZGVkIGJ5IHRoZSBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgaXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIGVtaXQgYVxuICAgICogYEdyYWZ0RXZlbnRgLCBgRGVzdHJ1Y3Rpb25FdmVudGAsIGV0Yy4gVGhlc2UgZXZlbnRzIG1heSBiZSB1c2VkIGJ5IHRoZSB0cmVlLFxuICAgICogYW5kIGVtaXR0aW5nIHRoZW0gbWFudWFsbHkgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEluc3RlYWQsIHdlXG4gICAgKiByZWNvbW1lbmQgaW1wbGVtZW50aW5nIHRoZSBUcmVlRXZlbnQgaW50ZXJmYWNlIHdpdGggeW91ciBvd24gY3VzdG9tIGV2ZW50c1xuICAgICogYW5kIGRpc3BhdGNoaW5nIHRob3NlLlxuICAgICpcbiAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBUcmVlRXZlbnQgdGhhdCB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgKi9cbiAgIHB1YmxpYyBkaXNwYXRjaChldmVudDogVHJlZUV2ZW50KTogdm9pZCB7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS5kaXNwYXRjaChldmVudCk7XG4gICAgICB0aGlzLl9wYXJlbnQ/LmRpc3BhdGNoKGV2ZW50KTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIFRyZWVFdmVudHMgd2hlbmV2ZXIgYW4gZXZlbnQgaXMgZGlzcGF0Y2hlZFxuICAgICogaW4gdGhpcyBicmFuY2ggb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50IGJyYW5jaGVzLlxuICAgICovXG4gICBwdWJsaWMgZXZlbnRzKCk6IE9ic2VydmFibGU8VHJlZUV2ZW50PiB7XG4gICAgICByZXR1cm4gdGhpcy50cmVlTm9kZUJhc2UuZXZlbnRzKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBjaGlsZCBicmFuY2ggdG8gcmV0cmlldmUuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGlzXG4gICAgKiBubyBjaGlsZCBicmFuY2ggYXQgdGhlIHNwZWNpZmllZCBpbmRleC5cbiAgICAqL1xuICAgcHVibGljIGdldEJyYW5jaChpbmRleDogbnVtYmVyKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4gfCB1bmRlZmluZWQge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmdldEJyYW5jaChpbmRleCk7XG4gICB9XG5cbiAgIC8qKiBAcmV0dXJucyBUaGUgVmlld0NvbnRhaW5lclJlZiBpbiB3aGljaCBjaGlsZCBicmFuY2hlcyBhcmUgcmVuZGVyZWQgKi9cbiAgIHB1YmxpYyBnZXRCcmFuY2hlc0NvbnRhaW5lcigpOiBWaWV3Q29udGFpbmVyUmVmIHwgdW5kZWZpbmVkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgYnJhbmNoZXMgY29udGFpbmVyIGZyb20gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIlxuICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaENvbnRyb2xsZXIuZ2V0QnJhbmNoZXNDb250YWluZXIoKTtcbiAgIH1cblxuICAgLyoqIEByZXR1cm5zIFRoZSBpbnN0YW5jZSBvZiBCcmFuY2hDb21wb25lbnQgdGhhdCBpcyByZW5kZXJlZCBieSB0aGlzIGNsYXNzLiAqL1xuICAgcHVibGljIGdldENvbXBvbmVudEluc3RhbmNlKCk6IEJyYW5jaENvbXBvbmVudDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGdldCBjb21wb25lbnQgaW5zdGFuY2UgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRDb21wb25lbnRJbnN0YW5jZSgpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEhvc3QgVmlldyBpbiB3aGljaCB0aGUgQnJhbmNoQ29tcG9uZW50IGlzIHJlbmRlcmVkICovXG4gICBwdWJsaWMgZ2V0SG9zdFZpZXcoKTogVmlld1JlZiB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IGNvbXBvbmVudCBob3N0IHZpZXcgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXRIb3N0VmlldygpO1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgVGhlIEJyYW5jaENvbXBvbmVudCBhcyBhIG5hdGl2ZSBIVE1MIEVsZW1lbnQgKi9cbiAgIHB1YmxpYyBnZXROYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXG4gICAgICAgICAgICBcIkNhbm5vdCBnZXQgbmF0aXZlIGVsZW1lbnQgZnJvbSBhIGRlc3Ryb3llZCB0cmVlIGJyYW5jaFwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuYnJhbmNoQ29udHJvbGxlci5nZXROYXRpdmVFbGVtZW50KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgQ29tcG9uZW50UmVmIGNvbnRhaW5pbmcgdGhlIGluc3RhbmNlIG9mIHRoZSB1c2VyLXByb3ZpZGVkXG4gICAgKiBjb21wb25lbnQgd2hpY2ggaXMgcmVuZGVyZWQgYnkgdGhpcyBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBnZXRVc2VybGFuZENvbXBvbmVudFJlZigpOlxuICAgICAgfCBDb21wb25lbnRSZWY8VXNlcmxhbmRDb21wb25lbnQ+XG4gICAgICB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgZ2V0IHVzZXJsYW5kIGNvbXBvbmVudCBmcm9tIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCJcbiAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5icmFuY2hDb250cm9sbGVyLmdldFVzZXJsYW5kQ29tcG9uZW50UmVmKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQXR0YWNoZXMgYSBicmFuY2ggdG8gYSBuZXcgcGFyZW50IG5vZGUuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIElmIG5vdCBhbHJlYWR5IHBydW5lZCwgdGhpcyBtZXRob2QgcHJ1bmVzIChyZW1vdmVzKSB0aGlzIGJyYW5jaCBmcm9tIGl0c1xuICAgICogY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgdHJlZTsgdGhlbiBncmFmdHMgKHJlYXR0YWNoZXMpIGl0IGFzIGEgY2hpbGQgb2YgdGhlXG4gICAgKiBzcGVjaWZpZWQgcGFyZW50IGJyYW5jaCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBubyBpbmRleCBpcyBzcGVjaWZpZWQsXG4gICAgKiB0aGUgYnJhbmNoIGlzIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBwYXJlbnQuIFRoaXMgY2F1c2VzIHRoaXNcbiAgICAqIGJyYW5jaCdzIGFzc29jaWF0ZWQgQnJhbmNoQ29tcG9uZW50IHRvIGJlIHJlLXJlbmRlcmVkIGluIHRoZSBET00gYXQgdGhlXG4gICAgKiBuZXcgbG9jYXRpb24uXG4gICAgKlxuICAgICogQHBhcmFtIG5ld1BhcmVudCAtIFRoZSBuZXcgcGFyZW50IGJyYW5jaCB1bnRvIHdoaWNoIHRoaXMgYnJhbmNoIHdpbGwgYmUgZ3JhZnRlZC5cbiAgICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3aWxsIGJlIGdyYWZ0ZWQuIElmIG5vdCBzcGVjaWZpZWQsXG4gICAgKiB0aGlzIGJyYW5jaCB3aWxsIGJlIGFwcGVuZGVkIGFzIHRoZSBsYXN0IGNoaWxkIG9mIHRoZSBuZXcgcGFyZW50LlxuICAgICpcbiAgICAqIEByZXR1cm5zIFRoZSBpbmRleCBhdCB3aGljaCB0aGlzIGJyYW5jaCB3YXMgZ3JhZnRlZC5cbiAgICAqL1xuICAgcHVibGljIGdyYWZ0VG8oXG4gICAgICBuZXdQYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiBudW1iZXIge1xuICAgICAgdGhpcy5jaGVja0dyYWZ0TG9jYXRpb25WYWxpZGl0eShuZXdQYXJlbnQsIGluZGV4KTtcbiAgICAgIGNvbnN0IG93bkluZGV4ID0gdGhpcy5pbmRleCgpO1xuICAgICAgaWYgKG93bkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgIHRoaXMucHJ1bmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3BhcmVudCA9IG5ld1BhcmVudDtcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gaW5kZXggPz8gbmV3UGFyZW50LmJyYW5jaGVzKCkubGVuZ3RoO1xuICAgICAgdGhpcy5yZWF0dGFjaFZpZXcobmV3SW5kZXgpO1xuICAgICAgdGhpcy5kaXNwYXRjaChcbiAgICAgICAgIG5ldyBHcmFmdEV2ZW50KHRoaXMsIHtcbiAgICAgICAgICAgIHBhcmVudDogbmV3UGFyZW50LFxuICAgICAgICAgICAgY2hpbGQ6IHRoaXMsXG4gICAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIG5ld0luZGV4O1xuICAgfVxuXG4gICAvKipcbiAgICAqIEFwcGVuZHMgYSBuZXcgY2hpbGQgYnJhbmNoIHRvIHRoaXMgYnJhbmNoLiBUaGUgY2hpbGQgYnJhbmNoIHdpbGwgcmVuZGVyXG4gICAgKiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIChvcHRpb25hbCkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIuXG4gICAgKlxuICAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgdG8gcmVuZGVyIGluIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBuZXcgY2hpbGQgYnJhbmNoLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgbmV3bHktY3JlYXRlZCBjaGlsZCBicmFuY2guXG4gICAgKi9cbiAgIHB1YmxpYyBncm93KFxuICAgICAgY29tcG9uZW50OiBUeXBlPFVzZXJsYW5kQ29tcG9uZW50PixcbiAgICAgIG9wdGlvbnM/OiBCcmFuY2hPcHRpb25zPFVzZXJsYW5kQ29tcG9uZW50PlxuICAgKTogVHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4ge1xuICAgICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQoKSkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcIkNhbm5vdCBncm93IGEgYnJhbmNoIG9uIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBUcmVlQnJhbmNoKHRoaXMsIHsgY29tcG9uZW50LCAuLi5vcHRpb25zIH0pO1xuICAgfVxuXG4gICAvKipcbiAgICAqIERldGVybWluZXMgdGhpcyBicmFuY2gncyBpbmRleCBpbiByZWxhdGlvbiB0byBpdHMgc2libGluZyBicmFuY2hlcy5cbiAgICAqXG4gICAgKiBAcmVtYXJrc1xuICAgICogRm9yIGV4YW1wbGUsIGlmIGl0IGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuICAgICogMC4gSWYgaXQgaXMgdGhlIHNlY29uZCBjaGlsZCBvZiBpdHMgcGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAxLlxuICAgICpcbiAgICAqIElmIHRoaXMgYnJhbmNoIGhhcyBubyBwYXJlbnQsIChlZywgaWYgdGhpcyBicmFuY2ggaGFzIGJlZW4gcHJ1bmVkKSB0aGlzXG4gICAgKiBtZXRob2Qgd2lsbCByZXR1cm4gdW5kZWZpbmVkLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBUaGUgaW5kZXggb2YgdGhpcyBicmFuY2ggaW4gcmVsYXRpb24gdG8gaXRzIHNpYmxpbmcgYnJhbmNoZXMsIG9yIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIGluZGV4KCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fcGFyZW50XG4gICAgICAgICAuYnJhbmNoZXMoKVxuICAgICAgICAgLmZpbmRJbmRleCgoYnJhbmNoKSA9PiBicmFuY2ggPT09IHRoaXMpO1xuICAgICAgYXNzZXJ0KGluZGV4ID49IDApO1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgfVxuXG4gICAvKiogQHJldHVybnMgYHRydWVgIGlmIHRoZSBicmFuY2ggaXMgZGVzdHJveWVkLCBgZmFsc2VgIG90aGVyd2lzZSAqL1xuICAgcHVibGljIGlzRGVzdHJveWVkKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMudHJlZU5vZGVCYXNlLmlzRGVzdHJveWVkKCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQHJldHVybnNcbiAgICAqIFRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbnRvIHRoZSBgYnJhbmNoT3B0aW9uc2AnIGBtZXRhYCBwcm9wZXJ0eVxuICAgICogYXQgY29uc3RydWN0aW9uLlxuICAgICovXG4gICBwdWJsaWMgbWV0YSgpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICAgIHJldHVybiB0aGlzLmJyYW5jaE9wdGlvbnMubWV0YSA/PyB7fTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhpcyBicmFuY2gncyBwYXJlbnQgbm9kZSAod2hpY2ggbWF5IGJlIGEgVHJlZUJyYW5jaCBvciBUcmVlUm9vdCkuXG4gICAgKiBJZiB0aGlzIGJyYW5jaCBoYXMgbm8gcGFyZW50LCAoZWcsIGlmIHRoaXMgYnJhbmNoIGhhcyBiZWVuIHBydW5lZCkgdGhpc1xuICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAqL1xuICAgcHVibGljIHBhcmVudCgpOlxuICAgICAgfCBUcmVlTm9kZTxUcmVlQnJhbmNoPFVzZXJsYW5kQ29tcG9uZW50PiwgTm9kZUNvbXBvbmVudD5cbiAgICAgIHwgdW5kZWZpbmVkIHtcbiAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogUHJvdmlkZXMgYSBtb2RlbCBkZXNjcmliaW5nIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEEgbXVsdGktZGltZW5zaW9uYWwgTWFwIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2hhcGUgb2YgdGhpcyBicmFuY2gnc1xuICAgICogZGVzY2VuZGFudHMuXG4gICAgKlxuICAgICogQGV4YW1wbGVcbiAgICAqIEEgYnJhbmNoIHdpdGggbm8gY2hpbGRyZW4gd2lsbCByZXR1cm4gYW4gZW1wdHkgTWFwLiBBIGJyYW5jaCB3aXRoXG4gICAgKiBhIHNpbmdsZSBjaGlsZCB3aWxsIHJldHVybiBhIE1hcCB3aXRoIGEgc2luZ2xlIGVudHJ5LCB3aGVyZSB0aGUga2V5IGlzIHRoZSBpbmRleFxuICAgICogb2YgdGhlIGJyYW5jaCAoemVybykgYW5kIHRoZSB2YWx1ZSBpcyBhbiBlbXB0eSBNYXAuIEEgVHJlZSBsaWtlIHRoaXM6XG4gICAgKlxuICAgICogYGBgXG4gICAgKiAgICAgICAgIC0tLUJyYW5jaC0tLS0tLS1CcmFuY2hcbiAgICAqICAgICAgICAvXG4gICAgKiBCcmFuY2gtLS0tLS0tQnJhbmNoXG4gICAgKiAgICAgICAgXFxcbiAgICAqICAgICAgICAgLS0tQnJhbmNoXG4gICAgKiBgYGBcbiAgICAqIFdpbGwgcmV0dXJuIGEgTWFwIG9mIG1hdGNoaW5nIHNoYXBlOlxuICAgICogYGBgXG4gICAgKiBNYXAge1xuICAgICogICAgMDogTWFwIHsgMDogTWFwIHt9fSxcbiAgICAqICAgIDE6IE1hcCB7fSxcbiAgICAqICAgIDI6IE1hcCB7fVxuICAgICogfVxuICAgICogYGBgXG4gICAgKi9cbiAgIHB1YmxpYyBwbG90KCk6IFRyZWVQbG90IHtcbiAgICAgIHJldHVybiB0aGlzLnRyZWVOb2RlQmFzZS5wbG90KCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogQ2FsY3VsYXRlcyB0aGUgYnJhbmNoJ3MgcG9zaXRpb24gaW4gdGhlIHRyZWUgcmVsYXRpdmUgdG8gdGhlIFJvb3QuXG4gICAgKlxuICAgICogQHJlbWFya3NcbiAgICAqIFRoZSBwb3NpdGlvbiBpcyBkZXNjcmliZWQgYXMgYW4gYXJyYXkgb2YgbnVtYmVycywgd2hlcmUgZWFjaCBudW1iZXJcbiAgICAqIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBicmFuY2ggYXQgdGhhdCBsZXZlbCBvZiB0aGUgdHJlZS5cbiAgICAqXG4gICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhpcyBicmFuY2ggaXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBSb290LCB0aGlzIG1ldGhvZFxuICAgICogd2lsbCByZXR1cm4gWzBdLiBJZiB0aGlzIGJyYW5jaCBpcyB0aGUgc2Vjb25kIGNoaWxkIG9mIHRoZSBmaXJzdCBjaGlsZFxuICAgICogb2YgdGhlIFJvb3QsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIFswLCAxXS5cbiAgICAqXG4gICAgKiBJZiB0aGUgYnJhbmNoIGlzIG5vdCByZWxhdGVkIHRvIGEgVHJlZVJvb3QsIChzdWNoIGFzIHdoZW4gaXQgaGFzIGJlZW5cbiAgICAqIHBydW5lZCwpIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAgKlxuICAgICogQHJldHVybnNcbiAgICAqIEFuIGFycmF5IG9mIG51bWJlcnMgd2hpY2ggZGVzY3JpYmUgdGhlIGJyYW5jaCdzIHBvc2l0aW9uIGluIHRoZSB0cmVlXG4gICAgKiByZWxhdGl2ZSB0byB0aGUgUm9vdC5cbiAgICAqL1xuICAgcHVibGljIHBvc2l0aW9uKCk6IEFycmF5PG51bWJlcj4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIFwiYnJhbmNoIGhhcyBubyBwYXJlbnQuIFBvc2l0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLlwiXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIGNvbnN0IHBhcmVudFBvc2l0aW9uID0gdGhpcy5fcGFyZW50LnBvc2l0aW9uKCk7XG4gICAgICAgICByZXR1cm4gWy4uLnBhcmVudFBvc2l0aW9uLCBpbmRleF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW2luZGV4XTtcbiAgIH1cblxuICAgLyoqXG4gICAgKiBSZW1vdmVzIGEgYnJhbmNoIGZyb20gaXRzIHRyZWUgd2l0aG91dCBkZXN0cm95aW5nIGl0LlxuICAgICpcbiAgICAqIEByZW1hcmtzXG4gICAgKiBSZW1vdmVzIHRoaXMgYnJhbmNoIGZyb20gaXRzIHBhcmVudCBhbmQgZGV0YWNoZXMgaXRzIGFzc29jaWF0ZWRcbiAgICAqIEJyYW5jaENvbXBvbmVudCBmcm9tIHRoZSBET00uIFRoaXMgcHV0cyB0aGUgYnJhbmNoIGluIGEgXCJwcnVuZWRcIiBzdGF0ZSxcbiAgICAqIHdoaWNoIG1heSBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIG90aGVyIG1ldGhvZHMuXG4gICAgKlxuICAgICogQSBwcnVuZWQgYnJhbmNoIGNhbiBiZSByZWF0dGFjaGVkIHRvIGFueSBvdGhlciBub2RlIHVzaW5nIHRoZSBgZ3JhZnRUb2AgbWV0aG9kLlxuICAgICpcbiAgICAqIEByZXR1cm5zXG4gICAgKiBJdHNlbGYsIG9yIHVuZGVmaW5lZCBpZiBpdCBpcyBhbHJlYWR5IGluIGEgcHJ1bmVkIHN0YXRlLlxuICAgICovXG4gICBwdWJsaWMgcHJ1bmUoKTogdGhpcyB8IHVuZGVmaW5lZCB7XG4gICAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCgpKSB7XG4gICAgICAgICB0aHJvdyBuZXcgVHJlZUVycm9yKFwiQ2Fubm90IHBydW5lIGEgZGVzdHJveWVkIHRyZWUgYnJhbmNoXCIpO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmluZGV4KCk7XG4gICAgICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCB8fCBwYXJlbnQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcgPSBjb250YWluZXIuZGV0YWNoKGluZGV4KTtcbiAgICAgIGFzc2VydCh0aGlzLmRldGFjaGVkVmlldyAhPT0gbnVsbCk7XG4gICAgICB0aGlzLmRldGFjaGVkVmlldy5kZXRhY2goKTtcbiAgICAgIHRoaXMuZGlzcGF0Y2goXG4gICAgICAgICBuZXcgUHJ1bmVFdmVudCh0aGlzLCB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudCxcbiAgICAgICAgICAgIGNoaWxkOiB0aGlzLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuX3BhcmVudCA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgfVxuXG4gICAvKipcbiAgICAqIEdldCB0aGUgcm9vdCBvZiB0aGUgdHJlZSB0byB3aGljaCB0aGlzIEJyYW5jaCBpcyBhdHRhY2hlZC5cbiAgICAqXG4gICAgKiBAcmV0dXJuc1xuICAgICogVGhlIFRyZWVSb290IG9mIHRoZSB0cmVlIHRoaXMgYnJhbmNoIGlzIGluLiBJZiB0aGlzIGJyYW5jaCBpc1xuICAgICogZG9lcyBub3QgaGF2ZSBhIHJvb3QgKHN1Y2ggYXMgd2hlbiBpdCBoYXMgYmVlbiBwcnVuZWQpIHRoaXMgbWV0aG9kIHdpbGxcbiAgICAqIHJldHVybiB1bmRlZmluZWQuXG4gICAgKi9cbiAgIHB1YmxpYyByb290KCk6IFRyZWVSb290PFVzZXJsYW5kQ29tcG9uZW50PiB8IHVuZGVmaW5lZCB7XG4gICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudCgpO1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFRyZWVCcmFuY2gpIHtcbiAgICAgICAgIHJldHVybiBwYXJlbnQucm9vdCgpO1xuICAgICAgfVxuICAgICAgYXNzZXJ0KHBhcmVudCBpbnN0YW5jZW9mIFRyZWVSb290IHx8IHBhcmVudCA9PT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICB9XG5cbiAgIC8qKlxuICAgICogVHJhdmVyc2VzIHRoaXMgYnJhbmNoJ3MgZGVzY2VuZGFudHMgaW4gZGVwdGgtZmlyc3QgcHJlLW9yZGVyLCBleGVjdXRpbmdcbiAgICAqIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBvbiBlYWNoIG5vZGUuIFRyYXZlcnNhbCBpbmNsdWRlcyB0aGlzIGJyYW5jaC5cbiAgICAqXG4gICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gZWFjaCBub2RlLlxuICAgICovXG4gICBwdWJsaWMgdHJhdmVyc2UoXG4gICAgICBjYWxsYmFjazogKFxuICAgICAgICAgbm9kZTogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+XG4gICAgICApID0+IHZvaWRcbiAgICk6IHZvaWQge1xuICAgICAgY2FsbGJhY2sodGhpcyk7XG4gICAgICB0aGlzLnRyZWVOb2RlQmFzZS50cmF2ZXJzZShjYWxsYmFjayk7XG4gICB9XG5cbiAgIHByaXZhdGUgY2hlY2tHcmFmdExvY2F0aW9uVmFsaWRpdHkoXG4gICAgICBuZXdQYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4PzogbnVtYmVyXG4gICApOiB2b2lkIHtcbiAgICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZ3JhZnQgYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBpZiAobmV3UGFyZW50LmlzRGVzdHJveWVkKCkpIHtcbiAgICAgICAgIHRocm93IG5ldyBUcmVlRXJyb3IoXCJDYW5ub3QgZ3JhZnQgdG8gYSBkZXN0cm95ZWQgdHJlZSBicmFuY2hcIik7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICB0eXBlb2YgaW5kZXggPT09IFwibnVtYmVyXCIgJiZcbiAgICAgICAgIHRoaXMuaW5kZXhJc091dE9mUmFuZ2UobmV3UGFyZW50LCBpbmRleClcbiAgICAgICkge1xuICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZ3JhZnQgYnJhbmNoIGF0IGluZGV4ICR7aW5kZXh9IG9mIHRoZSBwYXJlbnQuIE91dCBvZiByYW5nZS5gXG4gICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy50cmF2ZXJzZSgobm9kZSkgPT4ge1xuICAgICAgICAgaWYgKG5vZGUgPT09IG5ld1BhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRyZWVFcnJvcihcbiAgICAgICAgICAgICAgIFwiQ2Fubm90IGdyYWZ0IGEgYnJhbmNoIHRvIGl0c2VsZiBvciBhbnkgb2YgaXRzIG93biBkZXNjZW5kYW50c1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgfVxuICAgICAgfSk7XG4gICB9XG5cbiAgIHByaXZhdGUgaW5kZXhJc091dE9mUmFuZ2UoXG4gICAgICBwYXJlbnQ6IFRyZWVOb2RlPFRyZWVCcmFuY2g8VXNlcmxhbmRDb21wb25lbnQ+LCBOb2RlQ29tcG9uZW50PixcbiAgICAgIGluZGV4OiBudW1iZXJcbiAgICk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIGluZGV4IDwgMCB8fCBpbmRleCA+IHBhcmVudC5icmFuY2hlcygpLmxlbmd0aDtcbiAgIH1cblxuICAgcHJpdmF0ZSByZWF0dGFjaFZpZXcoaW5kZXg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgIGFzc2VydCh0aGlzLl9wYXJlbnQgIT09IHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQodGhpcy5kZXRhY2hlZFZpZXcgIT09IG51bGwpO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fcGFyZW50LmdldEJyYW5jaGVzQ29udGFpbmVyKCk7XG4gICAgICBhc3NlcnQoY29udGFpbmVyICE9PSB1bmRlZmluZWQpO1xuICAgICAgdGhpcy5kZXRhY2hlZFZpZXcucmVhdHRhY2goKTtcbiAgICAgIGNvbnRhaW5lci5pbnNlcnQodGhpcy5kZXRhY2hlZFZpZXcsIGluZGV4KTtcbiAgICAgIHRoaXMuZGV0YWNoZWRWaWV3ID0gbnVsbDtcbiAgIH1cblxuICAgcHJpdmF0ZSBzZXRJbmRlbnRhdGlvbihcbiAgICAgIHBhcmVudDogVHJlZU5vZGU8VHJlZUJyYW5jaDxVc2VybGFuZENvbXBvbmVudD4sIE5vZGVDb21wb25lbnQ+XG4gICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBwYXJlbnQucm9vdCgpO1xuICAgICAgYXNzZXJ0KHJvb3QgIT09IHVuZGVmaW5lZCk7XG4gICAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLmdldENvbmZpZyhyb290KTtcbiAgICAgIGNvbnN0IGJyYW5jaGVzQ29udGFpbmVyRWwgPSB0aGlzLmJyYW5jaENvbnRyb2xsZXJcbiAgICAgICAgIC5nZXROYXRpdmVFbGVtZW50KClcbiAgICAgICAgIC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYnJhbmNoZXMtY29udGFpbmVyXCIpXG4gICAgICAgICAuaXRlbSgwKTtcbiAgICAgIGFzc2VydChicmFuY2hlc0NvbnRhaW5lckVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpO1xuICAgICAgYnJhbmNoZXNDb250YWluZXJFbC5zdHlsZS5tYXJnaW5MZWZ0ID0gYCR7b3B0aW9ucz8uaW5kZW50YXRpb24gPz8gMTZ9cHhgO1xuICAgfVxufVxuIl19
|