@hmcts/media-viewer 4.1.8-exui-2821-1 → 4.1.8-exui-2600

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.
Files changed (37) hide show
  1. package/assets/sass/box-highlight.scss +38 -0
  2. package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.mjs +74 -19
  3. package/esm2022/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.mjs +258 -0
  4. package/esm2022/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.mjs +4 -4
  5. package/esm2022/lib/annotations/annotation-set/annotation-view/annotation-view.component.mjs +37 -3
  6. package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.mjs +122 -0
  7. package/esm2022/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.mjs +39 -3
  8. package/esm2022/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.mjs +3 -3
  9. package/esm2022/lib/annotations/annotations.module.mjs +9 -3
  10. package/esm2022/lib/icp/confirm-exit/confirm-action-dialog.component.mjs +5 -13
  11. package/esm2022/lib/store/actions/annotation.actions.mjs +3 -2
  12. package/esm2022/lib/store/effects/annotation.effects.mjs +14 -3
  13. package/fesm2022/hmcts-media-viewer.mjs +547 -44
  14. package/fesm2022/hmcts-media-viewer.mjs.map +1 -1
  15. package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts +16 -2
  16. package/lib/annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component.d.ts.map +1 -1
  17. package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts +59 -0
  18. package/lib/annotations/annotation-set/annotation-create/box-highlight-create/keyboard-box-draw.directive.d.ts.map +1 -0
  19. package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts +1 -1
  20. package/lib/annotations/annotation-set/annotation-create/highlight-create/highlight-create.service.d.ts.map +1 -1
  21. package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts +8 -2
  22. package/lib/annotations/annotation-set/annotation-view/annotation-view.component.d.ts.map +1 -1
  23. package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts +27 -0
  24. package/lib/annotations/annotation-set/annotation-view/rectangle/keyboard-box-move.directive.d.ts.map +1 -0
  25. package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts +10 -1
  26. package/lib/annotations/annotation-set/annotation-view/rectangle/rectangle.component.d.ts.map +1 -1
  27. package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts +2 -1
  28. package/lib/annotations/annotation-set/metadata-layer/metadata-layer.component.d.ts.map +1 -1
  29. package/lib/annotations/annotations.module.d.ts +13 -11
  30. package/lib/annotations/annotations.module.d.ts.map +1 -1
  31. package/lib/icp/confirm-exit/confirm-action-dialog.component.d.ts +1 -4
  32. package/lib/icp/confirm-exit/confirm-action-dialog.component.d.ts.map +1 -1
  33. package/lib/store/actions/annotation.actions.d.ts +2 -1
  34. package/lib/store/actions/annotation.actions.d.ts.map +1 -1
  35. package/lib/store/effects/annotation.effects.d.ts +1 -0
  36. package/lib/store/effects/annotation.effects.d.ts.map +1 -1
  37. package/package.json +1 -1
@@ -7,4 +7,42 @@ mv-box-highlight-create {
7
7
  z-index: 10;
8
8
  opacity: 0.5;
9
9
  }
10
+
11
+ // for keyboard users
12
+ .drawing-cursor {
13
+ width: 14px;
14
+ height: 14px;
15
+ margin-left: -7px;
16
+ margin-top: -7px;
17
+ z-index: 15;
18
+ pointer-events: none;
19
+ position: relative;
20
+ background-color: #ffdd00;
21
+ border-radius: 50%;
22
+ border: 1px solid #ffdd00;
23
+
24
+ // vertical line
25
+ &::before {
26
+ content: '';
27
+ position: absolute;
28
+ top: 0;
29
+ left: 50%;
30
+ width: 1px;
31
+ height: 100%;
32
+ background-color: #0b0c0c;
33
+ transform: translateX(-0.5px);
34
+ }
35
+
36
+ // horizontal line
37
+ &::after {
38
+ content: '';
39
+ position: absolute;
40
+ top: 50%;
41
+ left: 0;
42
+ width: 100%;
43
+ height: 1px;
44
+ background-color: #0b0c0c;
45
+ transform: translateY(-0.5px);
46
+ }
47
+ }
10
48
  }
@@ -4,6 +4,8 @@ import { HtmlTemplatesHelper } from '../../../../shared/util/helpers/html-templa
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "../../../../toolbar/toolbar-event.service";
6
6
  import * as i2 from "../highlight-create/highlight-create.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "./keyboard-box-draw.directive";
7
9
  export class BoxHighlightCreateComponent {
8
10
  constructor(toolbarEvents, highlightService) {
9
11
  this.toolbarEvents = toolbarEvents;
@@ -12,6 +14,8 @@ export class BoxHighlightCreateComponent {
12
14
  this.drawStartX = -1;
13
15
  this.drawStartY = -1;
14
16
  this.backgroundColor = 'none';
17
+ this.keyboardDrawingMode = false;
18
+ this.showCursor = false;
15
19
  this.subscriptions = [];
16
20
  }
17
21
  ngOnInit() {
@@ -19,6 +23,14 @@ export class BoxHighlightCreateComponent {
19
23
  this.toolbarEvents.drawModeSubject.subscribe(drawMode => {
20
24
  this.defaultHeight = drawMode ? '100%' : '0px';
21
25
  this.defaultWidth = drawMode ? '100%' : '0px';
26
+ this.drawMode = drawMode;
27
+ if (drawMode) {
28
+ setTimeout(() => {
29
+ if (this.drawingContainer?.nativeElement && this.isElementInViewport(this.drawingContainer.nativeElement)) {
30
+ this.drawingContainer.nativeElement.focus();
31
+ }
32
+ }, 100);
33
+ }
22
34
  }),
23
35
  this.toolbarEvents.redactWholePage.subscribe(() => {
24
36
  this.wholePage = true;
@@ -30,13 +42,20 @@ export class BoxHighlightCreateComponent {
30
42
  subscription.unsubscribe();
31
43
  });
32
44
  }
45
+ isElementInViewport(el) {
46
+ const rect = el.getBoundingClientRect();
47
+ const windowHeight = (window.innerHeight || document.documentElement.clientHeight);
48
+ const windowWidth = (window.innerWidth || document.documentElement.clientWidth);
49
+ const verticallyVisible = rect.bottom > 0 && rect.top < windowHeight;
50
+ const horizontallyVisible = rect.right > 0 && rect.left < windowWidth;
51
+ return verticallyVisible && horizontallyVisible;
52
+ }
33
53
  initHighlight(event) {
34
54
  if (this.wholePage) {
35
55
  this.highlightPage();
36
56
  return;
37
57
  }
38
58
  const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
39
- console.log(`initHighlight: rect=${JSON.stringify(rect)}, clientX=${event.clientX}, clientY=${event.clientY}, offsetX=${offsetX}, offsetY=${offsetY}`);
40
59
  this.position = 'absolute';
41
60
  this.backgroundColor = 'yellow';
42
61
  this.drawStartX = offsetX;
@@ -46,18 +65,7 @@ export class BoxHighlightCreateComponent {
46
65
  this.width = 50;
47
66
  this.top = this.drawStartY;
48
67
  this.left = this.drawStartX;
49
- switch (this.rotate) {
50
- case 90:
51
- this.top = this.drawStartY - this.height;
52
- break;
53
- case 180:
54
- this.top = this.drawStartY - this.height;
55
- this.left = this.drawStartX - this.width;
56
- break;
57
- case 270:
58
- this.left = this.drawStartX - this.width;
59
- break;
60
- }
68
+ this.adjustForRotation();
61
69
  }
62
70
  updateHighlight(event) {
63
71
  const rect = HtmlTemplatesHelper.getAdjustedBoundingRect(event.target, false), offsetX = event.clientX - rect.left, offsetY = event.clientY - rect.top;
@@ -72,12 +80,56 @@ export class BoxHighlightCreateComponent {
72
80
  if (this.height / this.zoom > 5 || this.width / this.zoom > 5) {
73
81
  let rectangle = this.highlightService
74
82
  .applyRotation(this.pageHeight, this.pageWidth, this.height, this.width, this.top, this.left, this.rotate, this.zoom);
75
- rectangle = { id: uuid(), ...rectangle };
76
- console.log(`createHighlight: rectangle=${JSON.stringify(rectangle)}`);
77
- this.saveSelection.emit({ rectangles: [rectangle], page: this.page });
83
+ const annotationId = uuid();
84
+ rectangle = { id: annotationId, ...rectangle };
85
+ this.saveSelection.emit({ rectangles: [rectangle], page: this.page, annotationId });
78
86
  this.resetHighlight();
79
87
  }
80
88
  }
89
+ onCursorPositionChanged(position) {
90
+ this.cursorX = position.x;
91
+ this.cursorY = position.y;
92
+ this.showCursor = position.visible;
93
+ }
94
+ onDrawingStarted(event) {
95
+ this.keyboardDrawingMode = true;
96
+ this.position = 'absolute';
97
+ this.backgroundColor = 'yellow';
98
+ this.display = 'block';
99
+ this.drawStartX = event.startX;
100
+ this.drawStartY = event.startY;
101
+ this.width = event.width;
102
+ this.height = event.height;
103
+ this.top = this.drawStartY;
104
+ this.left = this.drawStartX;
105
+ this.adjustForRotation();
106
+ }
107
+ onDrawingUpdated(event) {
108
+ this.width = event.width;
109
+ this.height = event.height;
110
+ }
111
+ onDrawingConfirmed(event) {
112
+ this.keyboardDrawingMode = false;
113
+ this.createHighlight();
114
+ }
115
+ onDrawingCancelled() {
116
+ this.keyboardDrawingMode = false;
117
+ this.resetHighlight();
118
+ }
119
+ adjustForRotation() {
120
+ switch (this.rotate) {
121
+ case 90:
122
+ this.top = this.drawStartY - this.height;
123
+ break;
124
+ case 180:
125
+ this.top = this.drawStartY - this.height;
126
+ this.left = this.drawStartX - this.width;
127
+ break;
128
+ case 270:
129
+ this.left = this.drawStartX - this.width;
130
+ break;
131
+ }
132
+ }
81
133
  resetHighlight() {
82
134
  this.drawStartX = -1;
83
135
  this.drawStartY = -1;
@@ -96,11 +148,11 @@ export class BoxHighlightCreateComponent {
96
148
  this.createHighlight();
97
149
  }
98
150
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, deps: [{ token: i1.ToolbarEventService }, { token: i2.HighlightCreateService }], target: i0.ɵɵFactoryTarget.Component }); }
99
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }], ngImport: i0, template: "<div [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }); }
151
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: { page: "page", pageHeight: "pageHeight", pageWidth: "pageWidth", rotate: "rotate", zoom: "zoom", container: "container" }, outputs: { saveSelection: "saveSelection" }, viewQueries: [{ propertyName: "highlight", first: true, predicate: ["boxHighlight"], descendants: true }, { propertyName: "drawingContainer", first: true, predicate: ["drawingContainer"], descendants: true }], ngImport: i0, template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: ["enabled", "minBoxSize", "incrementSmall", "incrementMedium", "incrementLarge"], outputs: ["drawingStarted", "drawingUpdated", "drawingConfirmed", "drawingCancelled", "cursorPositionChanged"] }] }); }
100
152
  }
101
153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BoxHighlightCreateComponent, decorators: [{
102
154
  type: Component,
103
- args: [{ selector: 'mv-box-highlight-create', template: "<div [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }]
155
+ args: [{ selector: 'mv-box-highlight-create', template: "<div #drawingContainer\n [style.height]=\"defaultHeight\"\n [style.width]=\"defaultWidth\"\n [tabindex]=\"drawMode ? 0 : -1\"\n mvKeyboardBoxDraw\n [enabled]=\"drawMode\"\n (cursorPositionChanged)=\"onCursorPositionChanged($event)\"\n (drawingStarted)=\"onDrawingStarted($event)\"\n (drawingUpdated)=\"onDrawingUpdated($event)\"\n (drawingConfirmed)=\"onDrawingConfirmed($event)\"\n (drawingCancelled)=\"onDrawingCancelled()\"\n (mousedown)=\"initHighlight($event)\"\n (mousemove)=\"updateHighlight($event)\"\n (mouseup)=\"createHighlight()\">\n\n <div *ngIf=\"showCursor\"\n class=\"drawing-cursor\"\n [style.position]=\"'absolute'\"\n [style.top]=\"cursorY + 'px'\"\n [style.left]=\"cursorX + 'px'\">\n </div>\n\n <div #boxHighlight\n class=\"box-highlight\"\n [style.display]=\"display\"\n [style.position]=\"position\"\n [style.background-color]=\"backgroundColor\"\n [style.height]=\"height ? height + 'px' : '100%'\"\n [style.width]=\"width ? width + 'px' : '100%'\"\n [style.top]=\"top + 'px'\"\n [style.left]=\"left + 'px'\">\n </div>\n</div>\n" }]
104
156
  }], ctorParameters: () => [{ type: i1.ToolbarEventService }, { type: i2.HighlightCreateService }], propDecorators: { page: [{
105
157
  type: Input
106
158
  }], pageHeight: [{
@@ -118,5 +170,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
118
170
  }], highlight: [{
119
171
  type: ViewChild,
120
172
  args: ['boxHighlight', { static: false }]
173
+ }], drawingContainer: [{
174
+ type: ViewChild,
175
+ args: ['drawingContainer', { static: false }]
121
176
  }] } });
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7O0FBSzVGLE1BQU0sT0FBTywyQkFBMkI7SUE2QnRDLFlBQTZCLGFBQWtDLEVBQzVDLGdCQUF3QztRQUQ5QixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDNUMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF3QjtRQXJCakQsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBNkMsQ0FBQztRQUl4RixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBVWhCLG9CQUFlLEdBQUcsTUFBTSxDQUFDO1FBR2pCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUdvQixDQUFDO0lBRWhFLFFBQVE7UUFDTixJ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QUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUksYUFBYTtzQkFBdEIsTUFBTTtnQkFFdUMsU0FBUztzQkFBdEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUmVjdGFuZ2xlIH0gZnJvbSAnLi4vLi4vYW5ub3RhdGlvbi12aWV3L3JlY3RhbmdsZS9yZWN0YW5nbGUubW9kZWwnO1xuaW1wb3J0IHsgSGlnaGxpZ2h0Q3JlYXRlU2VydmljZSB9IGZyb20gJy4uL2hpZ2hsaWdodC1jcmVhdGUvaGlnaGxpZ2h0LWNyZWF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRvb2xiYXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi90b29sYmFyL3Rvb2xiYXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBIdG1sVGVtcGxhdGVzSGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2hhcmVkL3V0aWwvaGVscGVycy9odG1sLXRlbXBsYXRlcy5oZWxwZXInO1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYm94LWhpZ2hsaWdodC1jcmVhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBCb3hIaWdobGlnaHRDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSBjb250YWluZXI6IHsgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9O1xuXG4gIEBPdXRwdXQoKSBzYXZlU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdLCBwYWdlOiBudW1iZXIgfT4oKTtcblxuICBAVmlld0NoaWxkKCdib3hIaWdobGlnaHQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaGlnaGxpZ2h0OiBFbGVtZW50UmVmO1xuXG4gIGRyYXdTdGFydFggPSAtMTtcbiAgZHJhd1N0YXJ0WSA9IC0xO1xuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBkcmF3TW9kZTogYm9vbGVhbjtcbiAgZGVmYXVsdEhlaWdodDogc3RyaW5nO1xuICBkZWZhdWx0V2lkdGg6IHN0cmluZztcbiAgcG9zaXRpb246IHN0cmluZztcbiAgYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICB3aG9sZVBhZ2U6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3Quc3Vic2NyaWJlKGRyYXdNb2RlID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gZHJhd01vZGUgPyAnMTAwJScgOiAnMHB4JztcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBkcmF3TW9kZSA/ICcxMDAlJyA6ICcwcHgnO1xuICAgICAgfSksXG4gICAgICB0aGlzLnRvb2xiYXJFdmVudHMucmVkYWN0V2hvbGVQYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2hvbGVQYWdlID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy53aG9sZVBhZ2UpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0UGFnZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY3QgPSBIdG1sVGVtcGxhdGVzSGVscGVyLmdldEFkanVzdGVkQm91bmRpbmdSZWN0KChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpKSxcbiAgICBvZmZzZXRYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICBvZmZzZXRZID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGNvbnNvbGUubG9nKGBpbml0SGlnaGxpZ2h0OiByZWN0PSR7SlNPTi5zdHJpbmdpZnkocmVjdCl9LCBjbGllbnRYPSR7ZXZlbnQuY2xpZW50WH0sIGNsaWVudFk9JHtldmVudC5jbGllbnRZfSwgb2Zmc2V0WD0ke29mZnNldFh9LCBvZmZzZXRZPSR7b2Zmc2V0WX1gKTtcblxuICAgIHRoaXMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3llbGxvdyc7XG4gICAgdGhpcy5kcmF3U3RhcnRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBvZmZzZXRZO1xuXG4gICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmhlaWdodCA9IDUwO1xuICAgIHRoaXMud2lkdGggPSA1MDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICBzd2l0Y2ggKHRoaXMucm90YXRlKSB7XG4gICAgICBjYXNlIDkwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTgwOlxuICAgICAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WSAtIHRoaXMuaGVpZ2h0O1xuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjcwOlxuICAgICAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFggLSB0aGlzLndpZHRoO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB1cGRhdGVIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGZhbHNlKSxcbiAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcbiAgICBpZiAodGhpcy5kcmF3U3RhcnRYID4gMCAmJiB0aGlzLmRyYXdTdGFydFkgPiAwKSB7XG4gICAgICB0aGlzLmhlaWdodCA9IE1hdGguYWJzKG9mZnNldFkgLSB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy53aWR0aCA9IE1hdGguYWJzKG9mZnNldFggLSB0aGlzLmRyYXdTdGFydFgpO1xuICAgICAgdGhpcy50b3AgPSBNYXRoLm1pbihvZmZzZXRZLCB0aGlzLmRyYXdTdGFydFkpO1xuICAgICAgdGhpcy5sZWZ0ID0gTWF0aC5taW4ob2Zmc2V0WCwgdGhpcy5kcmF3U3RhcnRYKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVIaWdobGlnaHQoKSB7XG4gICAgaWYgKHRoaXMuaGVpZ2h0IC8gdGhpcy56b29tID4gNSB8fCB0aGlzLndpZHRoIC8gdGhpcy56b29tID4gNSkge1xuICAgICAgbGV0IHJlY3RhbmdsZSA9IHRoaXMuaGlnaGxpZ2h0U2VydmljZVxuICAgICAgICAuYXBwbHlSb3RhdGlvbih0aGlzLnBhZ2VIZWlnaHQsIHRoaXMucGFnZVdpZHRoLCB0aGlzLmhlaWdodCwgdGhpcy53aWR0aCwgdGhpcy50b3AsIHRoaXMubGVmdCwgdGhpcy5yb3RhdGUsIHRoaXMuem9vbSk7XG4gICAgICByZWN0YW5nbGUgPSB7IGlkOiB1dWlkKCksIC4uLnJlY3RhbmdsZSB9IGFzIGFueTtcbiAgICAgIGNvbnNvbGUubG9nKGBjcmVhdGVIaWdobGlnaHQ6IHJlY3RhbmdsZT0ke0pTT04uc3RyaW5naWZ5KHJlY3RhbmdsZSl9YCk7XG4gICAgICB0aGlzLnNhdmVTZWxlY3Rpb24uZW1pdCh7IHJlY3RhbmdsZXM6IFtyZWN0YW5nbGVdLCBwYWdlOiB0aGlzLnBhZ2UgfSk7XG4gICAgICB0aGlzLnJlc2V0SGlnaGxpZ2h0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmRyYXdTdGFydFggPSAtMTtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSAtMTtcbiAgICB0aGlzLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICAgIHRoaXMucG9zaXRpb24gPSAnaW5pdGlhbCc7XG4gICAgdGhpcy53aG9sZVBhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0UGFnZSgpIHtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMucGFnZUhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5wYWdlV2lkdGg7XG4gICAgdGhpcy50b3AgPSAwO1xuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy5jcmVhdGVIaWdobGlnaHQoKTtcbiAgfVxufVxuIiwiPGRpdiBbc3R5bGUuaGVpZ2h0XT1cImRlZmF1bHRIZWlnaHRcIlxuICAgICBbc3R5bGUud2lkdGhdPVwiZGVmYXVsdFdpZHRoXCJcbiAgICAgKG1vdXNlZG93bik9XCJpbml0SGlnaGxpZ2h0KCRldmVudClcIlxuICAgICAobW91c2Vtb3ZlKT1cInVwZGF0ZUhpZ2hsaWdodCgkZXZlbnQpXCJcbiAgICAgKG1vdXNldXApPVwiY3JlYXRlSGlnaGxpZ2h0KClcIj5cbiAgPGRpdiAjYm94SGlnaGxpZ2h0XG4gICAgIGNsYXNzPVwiYm94LWhpZ2hsaWdodFwiXG4gICAgIFtzdHlsZS5kaXNwbGF5XT1cImRpc3BsYXlcIlxuICAgICBbc3R5bGUucG9zaXRpb25dPVwicG9zaXRpb25cIlxuICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJiYWNrZ3JvdW5kQ29sb3JcIlxuICAgICBbc3R5bGUuaGVpZ2h0XT1cImhlaWdodCA/IGhlaWdodCArICdweCcgOiAnMTAwJSdcIlxuICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGggPyB3aWR0aCArICdweCcgOiAnMTAwJSdcIlxuICAgICBbc3R5bGUudG9wXT1cInRvcCArICdweCdcIlxuICAgICBbc3R5bGUubGVmdF09XCJsZWZ0ICsgJ3B4J1wiPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7Ozs7QUFPNUYsTUFBTSxPQUFPLDJCQUEyQjtJQXFDdEMsWUFBNkIsYUFBa0MsRUFDNUMsZ0JBQXdDO1FBRDlCLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUM1QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXdCO1FBN0JqRCxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFvRSxDQUFDO1FBSy9HLGVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNoQixlQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFRaEIsb0JBQWUsR0FBRyxNQUFNLENBQUM7UUFPekIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBRzVCLGVBQVUsR0FBRyxLQUFLLENBQUM7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RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ00sZ0JBQWdCO3NCQUFqRSxTQUFTO3VCQUFDLGtCQUFrQixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL2Fubm90YXRpb24tdmlldy9yZWN0YW5nbGUvcmVjdGFuZ2xlLm1vZGVsJztcbmltcG9ydCB7IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UgfSBmcm9tICcuLi9oaWdobGlnaHQtY3JlYXRlL2hpZ2hsaWdodC1jcmVhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUb29sYmFyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdG9vbGJhci90b29sYmFyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSHRtbFRlbXBsYXRlc0hlbHBlciB9IGZyb20gJy4uLy4uLy4uLy4uL3NoYXJlZC91dGlsL2hlbHBlcnMvaHRtbC10ZW1wbGF0ZXMuaGVscGVyJztcbmltcG9ydCB7IEtleWJvYXJkQm94RHJhd0V2ZW50LCBDdXJzb3JQb3NpdGlvbiB9IGZyb20gJy4va2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtYm94LWhpZ2hsaWdodC1jcmVhdGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYm94LWhpZ2hsaWdodC1jcmVhdGUuY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBCb3hIaWdobGlnaHRDcmVhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgQElucHV0KCkgcGFnZTogbnVtYmVyO1xuICBASW5wdXQoKSBwYWdlSGVpZ2h0OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZ2VXaWR0aDogbnVtYmVyO1xuICBASW5wdXQoKSByb3RhdGU6IG51bWJlcjtcbiAgQElucHV0KCkgem9vbTogbnVtYmVyO1xuICBASW5wdXQoKSBjb250YWluZXI6IHsgdG9wOiBudW1iZXIsIGxlZnQ6IG51bWJlciB9O1xuXG4gIEBPdXRwdXQoKSBzYXZlU2VsZWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY3RhbmdsZXM6IFJlY3RhbmdsZVtdLCBwYWdlOiBudW1iZXIsIGFubm90YXRpb25JZD86IHN0cmluZyB9PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2JveEhpZ2hsaWdodCcsIHsgc3RhdGljOiBmYWxzZSB9KSBoaWdobGlnaHQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2RyYXdpbmdDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgZHJhd2luZ0NvbnRhaW5lcjogRWxlbWVudFJlZjtcblxuICBkcmF3U3RhcnRYID0gLTE7XG4gIGRyYXdTdGFydFkgPSAtMTtcblxuICB0b3A6IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgZGlzcGxheTogc3RyaW5nO1xuICBwb3NpdGlvbjogc3RyaW5nO1xuICBiYWNrZ3JvdW5kQ29sb3IgPSAnbm9uZSc7XG5cbiAgZHJhd01vZGU6IGJvb2xlYW47XG4gIGRlZmF1bHRIZWlnaHQ6IHN0cmluZztcbiAgZGVmYXVsdFdpZHRoOiBzdHJpbmc7XG4gIHdob2xlUGFnZTogYm9vbGVhbjtcblxuICBrZXlib2FyZERyYXdpbmdNb2RlID0gZmFsc2U7XG4gIGN1cnNvclg6IG51bWJlcjtcbiAgY3Vyc29yWTogbnVtYmVyO1xuICBzaG93Q3Vyc29yID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhpZ2hsaWdodFNlcnZpY2U6IEhpZ2hsaWdodENyZWF0ZVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3Quc3Vic2NyaWJlKGRyYXdNb2RlID0+IHtcbiAgICAgICAgdGhpcy5kZWZhdWx0SGVpZ2h0ID0gZHJhd01vZGUgPyAnMTAwJScgOiAnMHB4JztcbiAgICAgICAgdGhpcy5kZWZhdWx0V2lkdGggPSBkcmF3TW9kZSA/ICcxMDAlJyA6ICcwcHgnO1xuICAgICAgICB0aGlzLmRyYXdNb2RlID0gZHJhd01vZGU7XG4gICAgICAgIGlmIChkcmF3TW9kZSkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZHJhd2luZ0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCAmJiB0aGlzLmlzRWxlbWVudEluVmlld3BvcnQodGhpcy5kcmF3aW5nQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZHJhd2luZ0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICB0aGlzLnRvb2xiYXJFdmVudHMucmVkYWN0V2hvbGVQYWdlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMud2hvbGVQYWdlID0gdHJ1ZTtcbiAgICAgIH0pXG4gICAgXTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNFbGVtZW50SW5WaWV3cG9ydChlbDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTtcbiAgICBjb25zdCB3aW5kb3dXaWR0aCA9ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpO1xuXG4gICAgY29uc3QgdmVydGljYWxseVZpc2libGUgPSByZWN0LmJvdHRvbSA+IDAgJiYgcmVjdC50b3AgPCB3aW5kb3dIZWlnaHQ7XG4gICAgY29uc3QgaG9yaXpvbnRhbGx5VmlzaWJsZSA9IHJlY3QucmlnaHQgPiAwICYmIHJlY3QubGVmdCA8IHdpbmRvd1dpZHRoO1xuXG4gICAgcmV0dXJuIHZlcnRpY2FsbHlWaXNpYmxlICYmIGhvcml6b250YWxseVZpc2libGU7XG4gIH1cblxuICBpbml0SGlnaGxpZ2h0KGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMud2hvbGVQYWdlKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodFBhZ2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSksXG4gICAgb2Zmc2V0WCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQsXG4gICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcblxuICAgIHRoaXMucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ3llbGxvdyc7XG4gICAgdGhpcy5kcmF3U3RhcnRYID0gb2Zmc2V0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBvZmZzZXRZO1xuXG4gICAgdGhpcy5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB0aGlzLmhlaWdodCA9IDUwO1xuICAgIHRoaXMud2lkdGggPSA1MDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICB0aGlzLmFkanVzdEZvclJvdGF0aW9uKCk7XG4gIH1cblxuICB1cGRhdGVIaWdobGlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCByZWN0ID0gSHRtbFRlbXBsYXRlc0hlbHBlci5nZXRBZGp1c3RlZEJvdW5kaW5nUmVjdChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGZhbHNlKSxcbiAgICAgIG9mZnNldFggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0LFxuICAgICAgb2Zmc2V0WSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcbiAgXG4gICAgaWYgKHRoaXMuZHJhd1N0YXJ0WCA+IDAgJiYgdGhpcy5kcmF3U3RhcnRZID4gMCkge1xuICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLmFicyhvZmZzZXRZIC0gdGhpcy5kcmF3U3RhcnRZKTtcbiAgICAgIHRoaXMud2lkdGggPSBNYXRoLmFicyhvZmZzZXRYIC0gdGhpcy5kcmF3U3RhcnRYKTtcbiAgICAgIHRoaXMudG9wID0gTWF0aC5taW4ob2Zmc2V0WSwgdGhpcy5kcmF3U3RhcnRZKTtcbiAgICAgIHRoaXMubGVmdCA9IE1hdGgubWluKG9mZnNldFgsIHRoaXMuZHJhd1N0YXJ0WCk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlSGlnaGxpZ2h0KCkge1xuICAgIGlmICh0aGlzLmhlaWdodCAvIHRoaXMuem9vbSA+IDUgfHwgdGhpcy53aWR0aCAvIHRoaXMuem9vbSA+IDUpIHtcbiAgICAgIGxldCByZWN0YW5nbGUgPSB0aGlzLmhpZ2hsaWdodFNlcnZpY2VcbiAgICAgICAgLmFwcGx5Um90YXRpb24odGhpcy5wYWdlSGVpZ2h0LCB0aGlzLnBhZ2VXaWR0aCwgdGhpcy5oZWlnaHQsIHRoaXMud2lkdGgsIHRoaXMudG9wLCB0aGlzLmxlZnQsIHRoaXMucm90YXRlLCB0aGlzLnpvb20pO1xuICAgICAgY29uc3QgYW5ub3RhdGlvbklkID0gdXVpZCgpO1xuICAgICAgcmVjdGFuZ2xlID0geyBpZDogYW5ub3RhdGlvbklkLCAuLi5yZWN0YW5nbGUgfSBhcyBhbnk7XG4gICAgICB0aGlzLnNhdmVTZWxlY3Rpb24uZW1pdCh7IHJlY3RhbmdsZXM6IFtyZWN0YW5nbGVdLCBwYWdlOiB0aGlzLnBhZ2UsIGFubm90YXRpb25JZCB9KTtcbiAgICAgIHRoaXMucmVzZXRIaWdobGlnaHQoKTtcbiAgICB9XG4gIH1cblxuICBvbkN1cnNvclBvc2l0aW9uQ2hhbmdlZChwb3NpdGlvbjogQ3Vyc29yUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmN1cnNvclggPSBwb3NpdGlvbi54O1xuICAgIHRoaXMuY3Vyc29yWSA9IHBvc2l0aW9uLnk7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gcG9zaXRpb24udmlzaWJsZTtcbiAgfVxuXG4gIG9uRHJhd2luZ1N0YXJ0ZWQoZXZlbnQ6IEtleWJvYXJkQm94RHJhd0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlib2FyZERyYXdpbmdNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICB0aGlzLmJhY2tncm91bmRDb2xvciA9ICd5ZWxsb3cnO1xuICAgIHRoaXMuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICB0aGlzLmRyYXdTdGFydFggPSBldmVudC5zdGFydFg7XG4gICAgdGhpcy5kcmF3U3RhcnRZID0gZXZlbnQuc3RhcnRZO1xuICAgIHRoaXMud2lkdGggPSBldmVudC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGV2ZW50LmhlaWdodDtcbiAgICB0aGlzLnRvcCA9IHRoaXMuZHJhd1N0YXJ0WTtcbiAgICB0aGlzLmxlZnQgPSB0aGlzLmRyYXdTdGFydFg7XG5cbiAgICB0aGlzLmFkanVzdEZvclJvdGF0aW9uKCk7XG4gIH1cblxuICBvbkRyYXdpbmdVcGRhdGVkKGV2ZW50OiBLZXlib2FyZEJveERyYXdFdmVudCk6IHZvaWQge1xuICAgIHRoaXMud2lkdGggPSBldmVudC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IGV2ZW50LmhlaWdodDtcbiAgfVxuXG4gIG9uRHJhd2luZ0NvbmZpcm1lZChldmVudDogS2V5Ym9hcmRCb3hEcmF3RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmtleWJvYXJkRHJhd2luZ01vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmNyZWF0ZUhpZ2hsaWdodCgpO1xuICB9XG5cbiAgb25EcmF3aW5nQ2FuY2VsbGVkKCk6IHZvaWQge1xuICAgIHRoaXMua2V5Ym9hcmREcmF3aW5nTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMucmVzZXRIaWdobGlnaHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRqdXN0Rm9yUm90YXRpb24oKTogdm9pZCB7XG4gICAgc3dpdGNoICh0aGlzLnJvdGF0ZSkge1xuICAgICAgY2FzZSA5MDpcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLmRyYXdTdGFydFkgLSB0aGlzLmhlaWdodDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE4MDpcbiAgICAgICAgdGhpcy50b3AgPSB0aGlzLmRyYXdTdGFydFkgLSB0aGlzLmhlaWdodDtcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5kcmF3U3RhcnRYIC0gdGhpcy53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI3MDpcbiAgICAgICAgdGhpcy5sZWZ0ID0gdGhpcy5kcmF3U3RhcnRYIC0gdGhpcy53aWR0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEhpZ2hsaWdodCgpIHtcbiAgICB0aGlzLmRyYXdTdGFydFggPSAtMTtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSAtMTtcbiAgICB0aGlzLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdGhpcy53aWR0aCA9IDA7XG4gICAgdGhpcy5oZWlnaHQgPSAwO1xuICAgIHRoaXMuYmFja2dyb3VuZENvbG9yID0gJ25vbmUnO1xuICAgIHRoaXMucG9zaXRpb24gPSAnaW5pdGlhbCc7XG4gICAgdGhpcy53aG9sZVBhZ2UgPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaGlnaGxpZ2h0UGFnZSgpIHtcbiAgICB0aGlzLmhlaWdodCA9IHRoaXMucGFnZUhlaWdodDtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5wYWdlV2lkdGg7XG4gICAgdGhpcy50b3AgPSAwO1xuICAgIHRoaXMubGVmdCA9IDA7XG4gICAgdGhpcy5jcmVhdGVIaWdobGlnaHQoKTtcbiAgfVxufVxuIiwiPGRpdiAjZHJhd2luZ0NvbnRhaW5lclxuICBbc3R5bGUuaGVpZ2h0XT1cImRlZmF1bHRIZWlnaHRcIlxuICBbc3R5bGUud2lkdGhdPVwiZGVmYXVsdFdpZHRoXCJcbiAgW3RhYmluZGV4XT1cImRyYXdNb2RlID8gMCA6IC0xXCJcbiAgbXZLZXlib2FyZEJveERyYXdcbiAgW2VuYWJsZWRdPVwiZHJhd01vZGVcIlxuICAoY3Vyc29yUG9zaXRpb25DaGFuZ2VkKT1cIm9uQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIlxuICAoZHJhd2luZ1N0YXJ0ZWQpPVwib25EcmF3aW5nU3RhcnRlZCgkZXZlbnQpXCJcbiAgKGRyYXdpbmdVcGRhdGVkKT1cIm9uRHJhd2luZ1VwZGF0ZWQoJGV2ZW50KVwiXG4gIChkcmF3aW5nQ29uZmlybWVkKT1cIm9uRHJhd2luZ0NvbmZpcm1lZCgkZXZlbnQpXCJcbiAgKGRyYXdpbmdDYW5jZWxsZWQpPVwib25EcmF3aW5nQ2FuY2VsbGVkKClcIlxuICAobW91c2Vkb3duKT1cImluaXRIaWdobGlnaHQoJGV2ZW50KVwiXG4gIChtb3VzZW1vdmUpPVwidXBkYXRlSGlnaGxpZ2h0KCRldmVudClcIlxuICAobW91c2V1cCk9XCJjcmVhdGVIaWdobGlnaHQoKVwiPlxuXG4gIDxkaXYgKm5nSWY9XCJzaG93Q3Vyc29yXCJcbiAgICBjbGFzcz1cImRyYXdpbmctY3Vyc29yXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLnRvcF09XCJjdXJzb3JZICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwiY3Vyc29yWCArICdweCdcIj5cbiAgPC9kaXY+XG5cbiAgPGRpdiAjYm94SGlnaGxpZ2h0XG4gICAgY2xhc3M9XCJib3gtaGlnaGxpZ2h0XCJcbiAgICBbc3R5bGUuZGlzcGxheV09XCJkaXNwbGF5XCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwicG9zaXRpb25cIlxuICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tncm91bmRDb2xvclwiXG4gICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHQgPyBoZWlnaHQgKyAncHgnIDogJzEwMCUnXCJcbiAgICBbc3R5bGUud2lkdGhdPVwid2lkdGggPyB3aWR0aCArICdweCcgOiAnMTAwJSdcIlxuICAgIFtzdHlsZS50b3BdPVwidG9wICsgJ3B4J1wiXG4gICAgW3N0eWxlLmxlZnRdPVwibGVmdCArICdweCdcIj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,258 @@
1
+ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class KeyboardBoxDrawDirective {
4
+ set enabled(value) {
5
+ const wasEnabled = this._enabled;
6
+ this._enabled = value;
7
+ if (value && !wasEnabled && KeyboardBoxDrawDirective.lastInteractionWasKeyboard && !this.showCursor) {
8
+ this.initializeCursorForKeyboard();
9
+ }
10
+ }
11
+ get enabled() {
12
+ return this._enabled;
13
+ }
14
+ static { this.lastInteractionWasKeyboard = false; }
15
+ constructor(elementRef) {
16
+ this.elementRef = elementRef;
17
+ this._enabled = false;
18
+ this.minBoxSize = 10;
19
+ this.incrementSmall = 1;
20
+ this.incrementMedium = 5;
21
+ this.incrementLarge = 10;
22
+ this.drawingStarted = new EventEmitter();
23
+ this.drawingUpdated = new EventEmitter();
24
+ this.drawingConfirmed = new EventEmitter();
25
+ this.drawingCancelled = new EventEmitter();
26
+ this.cursorPositionChanged = new EventEmitter();
27
+ this.isDrawing = false;
28
+ this.showCursor = false;
29
+ if (typeof window !== 'undefined') {
30
+ window.addEventListener('keydown', KeyboardBoxDrawDirective.onGlobalKeyDown, { capture: true });
31
+ window.addEventListener('mousedown', KeyboardBoxDrawDirective.onGlobalMouseDown, { capture: true });
32
+ }
33
+ }
34
+ static onGlobalKeyDown() {
35
+ KeyboardBoxDrawDirective.lastInteractionWasKeyboard = true;
36
+ }
37
+ static onGlobalMouseDown() {
38
+ KeyboardBoxDrawDirective.lastInteractionWasKeyboard = false;
39
+ }
40
+ ngOnDestroy() {
41
+ this.cleanup();
42
+ }
43
+ initializeCursorForKeyboard() {
44
+ if (this.enabled && !this.showCursor && !this.isDrawing) {
45
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
46
+ if (rect.width > 0 && rect.height > 0) {
47
+ this.cursorX = rect.width / 2;
48
+ this.cursorY = rect.height / 2;
49
+ this.showCursor = true;
50
+ this.emitCursorPosition();
51
+ }
52
+ }
53
+ }
54
+ onKeyDown(event) {
55
+ if (!this.enabled) {
56
+ return;
57
+ }
58
+ if (event.key === 'Enter') {
59
+ event.preventDefault();
60
+ event.stopPropagation();
61
+ if (!this.isDrawing) {
62
+ this.startDrawing();
63
+ }
64
+ else {
65
+ this.confirmDrawing();
66
+ }
67
+ return;
68
+ }
69
+ if (event.key === 'Escape') {
70
+ event.preventDefault();
71
+ event.stopPropagation();
72
+ if (this.isDrawing) {
73
+ this.cancelDrawing();
74
+ }
75
+ else if (this.showCursor) {
76
+ this.hideCursor();
77
+ }
78
+ return;
79
+ }
80
+ if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
81
+ event.preventDefault();
82
+ event.stopPropagation();
83
+ if (this.isDrawing) {
84
+ this.resizeBox(event);
85
+ }
86
+ else {
87
+ this.moveCursor(event);
88
+ }
89
+ }
90
+ }
91
+ onBlur() {
92
+ if (this.showCursor && !this.isDrawing) {
93
+ this.hideCursor();
94
+ }
95
+ }
96
+ moveCursor(event) {
97
+ const increment = event.shiftKey ? this.incrementLarge : this.incrementMedium;
98
+ if (!this.showCursor) {
99
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
100
+ this.cursorX = rect.width / 2;
101
+ this.cursorY = rect.height / 2;
102
+ this.showCursor = true;
103
+ this.emitCursorPosition();
104
+ return;
105
+ }
106
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
107
+ switch (event.key) {
108
+ case 'ArrowUp':
109
+ this.cursorY = Math.max(0, this.cursorY - increment);
110
+ break;
111
+ case 'ArrowDown':
112
+ this.cursorY = Math.min(rect.height, this.cursorY + increment);
113
+ break;
114
+ case 'ArrowLeft':
115
+ this.cursorX = Math.max(0, this.cursorX - increment);
116
+ break;
117
+ case 'ArrowRight':
118
+ this.cursorX = Math.min(rect.width, this.cursorX + increment);
119
+ break;
120
+ }
121
+ this.emitCursorPosition();
122
+ }
123
+ startDrawing() {
124
+ let startX;
125
+ let startY;
126
+ if (this.showCursor) {
127
+ startX = this.cursorX;
128
+ startY = this.cursorY;
129
+ this.showCursor = false;
130
+ this.emitCursorPosition();
131
+ }
132
+ else {
133
+ // default to center
134
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
135
+ startX = rect.width / 2;
136
+ startY = rect.height / 2;
137
+ }
138
+ this.isDrawing = true;
139
+ this.drawStartX = startX;
140
+ this.drawStartY = startY;
141
+ this.currentWidth = this.minBoxSize;
142
+ this.currentHeight = this.minBoxSize;
143
+ this.emitDrawingStarted();
144
+ }
145
+ resizeBox(event) {
146
+ const increment = event.shiftKey ? this.incrementLarge : this.incrementSmall;
147
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
148
+ switch (event.key) {
149
+ case 'ArrowRight':
150
+ const maxWidth = rect.width - this.drawStartX;
151
+ this.currentWidth = Math.min(maxWidth, this.currentWidth + increment);
152
+ break;
153
+ case 'ArrowLeft':
154
+ this.currentWidth = Math.max(this.minBoxSize, this.currentWidth - increment);
155
+ break;
156
+ case 'ArrowDown':
157
+ const maxHeight = rect.height - this.drawStartY;
158
+ this.currentHeight = Math.min(maxHeight, this.currentHeight + increment);
159
+ break;
160
+ case 'ArrowUp':
161
+ this.currentHeight = Math.max(this.minBoxSize, this.currentHeight - increment);
162
+ break;
163
+ }
164
+ this.emitDrawingUpdated();
165
+ }
166
+ confirmDrawing() {
167
+ this.emitDrawingConfirmed();
168
+ this.cleanup();
169
+ }
170
+ cancelDrawing() {
171
+ this.drawingCancelled.emit();
172
+ this.cleanup();
173
+ }
174
+ hideCursor() {
175
+ this.showCursor = false;
176
+ this.emitCursorPosition();
177
+ }
178
+ cleanup() {
179
+ this.isDrawing = false;
180
+ this.showCursor = false;
181
+ this.cursorX = undefined;
182
+ this.cursorY = undefined;
183
+ this.drawStartX = undefined;
184
+ this.drawStartY = undefined;
185
+ this.currentWidth = undefined;
186
+ this.currentHeight = undefined;
187
+ }
188
+ emitCursorPosition() {
189
+ this.cursorPositionChanged.emit({
190
+ x: this.cursorX,
191
+ y: this.cursorY,
192
+ visible: this.showCursor
193
+ });
194
+ }
195
+ emitDrawingStarted() {
196
+ this.drawingStarted.emit({
197
+ startX: this.drawStartX,
198
+ startY: this.drawStartY,
199
+ width: this.currentWidth,
200
+ height: this.currentHeight
201
+ });
202
+ }
203
+ emitDrawingUpdated() {
204
+ this.drawingUpdated.emit({
205
+ startX: this.drawStartX,
206
+ startY: this.drawStartY,
207
+ width: this.currentWidth,
208
+ height: this.currentHeight
209
+ });
210
+ }
211
+ emitDrawingConfirmed() {
212
+ this.drawingConfirmed.emit({
213
+ startX: this.drawStartX,
214
+ startY: this.drawStartY,
215
+ width: this.currentWidth,
216
+ height: this.currentHeight
217
+ });
218
+ }
219
+ reset() {
220
+ this.cleanup();
221
+ this.emitCursorPosition();
222
+ }
223
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
224
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: KeyboardBoxDrawDirective, selector: "[mvKeyboardBoxDraw]", inputs: { enabled: "enabled", minBoxSize: "minBoxSize", incrementSmall: "incrementSmall", incrementMedium: "incrementMedium", incrementLarge: "incrementLarge" }, outputs: { drawingStarted: "drawingStarted", drawingUpdated: "drawingUpdated", drawingConfirmed: "drawingConfirmed", drawingCancelled: "drawingCancelled", cursorPositionChanged: "cursorPositionChanged" }, host: { listeners: { "keydown": "onKeyDown($event)", "blur": "onBlur()" } }, ngImport: i0 }); }
225
+ }
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: KeyboardBoxDrawDirective, decorators: [{
227
+ type: Directive,
228
+ args: [{
229
+ selector: '[mvKeyboardBoxDraw]'
230
+ }]
231
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { enabled: [{
232
+ type: Input
233
+ }], minBoxSize: [{
234
+ type: Input
235
+ }], incrementSmall: [{
236
+ type: Input
237
+ }], incrementMedium: [{
238
+ type: Input
239
+ }], incrementLarge: [{
240
+ type: Input
241
+ }], drawingStarted: [{
242
+ type: Output
243
+ }], drawingUpdated: [{
244
+ type: Output
245
+ }], drawingConfirmed: [{
246
+ type: Output
247
+ }], drawingCancelled: [{
248
+ type: Output
249
+ }], cursorPositionChanged: [{
250
+ type: Output
251
+ }], onKeyDown: [{
252
+ type: HostListener,
253
+ args: ['keydown', ['$event']]
254
+ }], onBlur: [{
255
+ type: HostListener,
256
+ args: ['blur']
257
+ }] } });
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvYW5ub3RhdGlvbi1zZXQvYW5ub3RhdGlvbi1jcmVhdGUvYm94LWhpZ2hsaWdodC1jcmVhdGUva2V5Ym9hcmQtYm94LWRyYXcuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQWtCNUcsTUFBTSxPQUFPLHdCQUF3QjtJQUVuQyxJQUFhLE9BQU8sQ0FBQyxLQUFjO1FBQ2pDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxLQUFLLElBQUksQ0FBQyxVQUFVLElBQUksd0JBQXdCLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEcsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzthQXNCYywrQkFBMEIsR0FBRyxLQUFLLEFBQVIsQ0FBUztJQUVsRCxZQUFvQixVQUFtQztRQUFuQyxlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQXZCL0MsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLG1CQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBRW5CLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQXdCLENBQUM7UUFDMUQsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUMxRCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBd0IsQ0FBQztRQUM1RCxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRTdELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFHbEIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQVF6QixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsd0JBQXdCLENBQUMsZUFBZSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSx3QkFBd0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLENBQUM7SUFDSCxDQUFDO0lBRU8sTUFBTSxDQUFDLGVBQWU7UUFDNUIsd0JBQXdCLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNLENBQUMsaUJBQWlCO1FBQzlCLHdCQUF3QixDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztJQUM5RCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sMkJBQTJCO1FBQ2pDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFHRCxTQUFTLENBQUMsS0FBb0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMxQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXhCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3hCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBRXhCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV4QixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFHRCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUFvQjtRQUNyQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRTlFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFFdkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDMUIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBRW5FLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2xCLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDL0QsTUFBTTtZQUNSLEtBQUssV0FBVztnQkFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ3JELE1BQU07WUFDUixLQUFLLFlBQVk7Z0JBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDOUQsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLE1BQWMsQ0FBQztRQUVuQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLG9CQUFvQjtZQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ25FLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUN4QixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFFckMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLFNBQVMsQ0FBQyxLQUFvQjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzdFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFbkUsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbEIsS0FBSyxZQUFZO2dCQUNmLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RSxNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQzdFLE1BQU07WUFDUixLQUFLLFdBQVc7Z0JBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO2dCQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ3pFLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDL0UsTUFBTTtRQUNWLENBQUM7UUFFRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRU8sT0FBTztRQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQztZQUM5QixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDZixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDekIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWTtZQUN4QixNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWE7U0FDM0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pCLE1BQU0sRUFBRSxJQUFJLENBQUMsVUFBVTtZQUN2QixNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYTtTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7a0lBdFFVLHdCQUF3QjtzSEFBeEIsd0JBQXdCOzs0RkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxxQkFBcUI7aUJBQ2hDOytFQUdjLE9BQU87c0JBQW5CLEtBQUs7Z0JBYUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBNENQLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMkNuQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleWJvYXJkQm94RHJhd0V2ZW50IHtcbiAgc3RhcnRYOiBudW1iZXI7XG4gIHN0YXJ0WTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXJzb3JQb3NpdGlvbiB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB2aXNpYmxlOiBib29sZWFuO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbXZLZXlib2FyZEJveERyYXddJ1xufSlcbmV4cG9ydCBjbGFzcyBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3Qgd2FzRW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHZhbHVlO1xuXG4gICAgaWYgKHZhbHVlICYmICF3YXNFbmFibGVkICYmIEtleWJvYXJkQm94RHJhd0RpcmVjdGl2ZS5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCAmJiAhdGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVDdXJzb3JGb3JLZXlib2FyZCgpO1xuICAgIH1cbiAgfVxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuICBwcml2YXRlIF9lbmFibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgbWluQm94U2l6ZSA9IDEwO1xuICBASW5wdXQoKSBpbmNyZW1lbnRTbWFsbCA9IDE7XG4gIEBJbnB1dCgpIGluY3JlbWVudE1lZGl1bSA9IDU7XG4gIEBJbnB1dCgpIGluY3JlbWVudExhcmdlID0gMTA7IFxuXG4gIEBPdXRwdXQoKSBkcmF3aW5nU3RhcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRCb3hEcmF3RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmF3aW5nVXBkYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRCb3hEcmF3RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmF3aW5nQ29uZmlybWVkID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEJveERyYXdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYXdpbmdDYW5jZWxsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjdXJzb3JQb3NpdGlvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEN1cnNvclBvc2l0aW9uPigpO1xuXG4gIHByaXZhdGUgaXNEcmF3aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgY3Vyc29yWDogbnVtYmVyO1xuICBwcml2YXRlIGN1cnNvclk6IG51bWJlcjtcbiAgcHJpdmF0ZSBzaG93Q3Vyc29yID0gZmFsc2U7XG4gIHByaXZhdGUgZHJhd1N0YXJ0WDogbnVtYmVyO1xuICBwcml2YXRlIGRyYXdTdGFydFk6IG51bWJlcjtcbiAgcHJpdmF0ZSBjdXJyZW50V2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBjdXJyZW50SGVpZ2h0OiBudW1iZXI7XG4gIHByaXZhdGUgc3RhdGljIGxhc3RJbnRlcmFjdGlvbldhc0tleWJvYXJkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUub25HbG9iYWxLZXlEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgS2V5Ym9hcmRCb3hEcmF3RGlyZWN0aXZlLm9uR2xvYmFsTW91c2VEb3duLCB7IGNhcHR1cmU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgb25HbG9iYWxLZXlEb3duKCk6IHZvaWQge1xuICAgIEtleWJvYXJkQm94RHJhd0RpcmVjdGl2ZS5sYXN0SW50ZXJhY3Rpb25XYXNLZXlib2FyZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvbkdsb2JhbE1vdXNlRG93bigpOiB2b2lkIHtcbiAgICBLZXlib2FyZEJveERyYXdEaXJlY3RpdmUubGFzdEludGVyYWN0aW9uV2FzS2V5Ym9hcmQgPSBmYWxzZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ3Vyc29yRm9yS2V5Ym9hcmQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZW5hYmxlZCAmJiAhdGhpcy5zaG93Q3Vyc29yICYmICF0aGlzLmlzRHJhd2luZykge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJlY3Qud2lkdGggPiAwICYmIHJlY3QuaGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLmN1cnNvclggPSByZWN0LndpZHRoIC8gMjtcbiAgICAgICAgdGhpcy5jdXJzb3JZID0gcmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICB0aGlzLnNob3dDdXJzb3IgPSB0cnVlO1xuICAgICAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKCF0aGlzLmlzRHJhd2luZykge1xuICAgICAgICB0aGlzLnN0YXJ0RHJhd2luZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25maXJtRHJhd2luZygpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmlzRHJhd2luZykge1xuICAgICAgICB0aGlzLmNhbmNlbERyYXdpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnNvcigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ0Fycm93VXAnLCAnQXJyb3dEb3duJywgJ0Fycm93TGVmdCcsICdBcnJvd1JpZ2h0J10uaW5jbHVkZXMoZXZlbnQua2V5KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBpZiAodGhpcy5pc0RyYXdpbmcpIHtcbiAgICAgICAgdGhpcy5yZXNpemVCb3goZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5tb3ZlQ3Vyc29yKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdibHVyJylcbiAgb25CbHVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dDdXJzb3IgJiYgIXRoaXMuaXNEcmF3aW5nKSB7XG4gICAgICB0aGlzLmhpZGVDdXJzb3IoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1vdmVDdXJzb3IoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmNyZW1lbnQgPSBldmVudC5zaGlmdEtleSA/IHRoaXMuaW5jcmVtZW50TGFyZ2UgOiB0aGlzLmluY3JlbWVudE1lZGl1bTtcblxuICAgIGlmICghdGhpcy5zaG93Q3Vyc29yKSB7XG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLmN1cnNvclggPSByZWN0LndpZHRoIC8gMjtcbiAgICAgIHRoaXMuY3Vyc29yWSA9IHJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgIHRoaXMuc2hvd0N1cnNvciA9IHRydWU7XG5cbiAgICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLmN1cnNvclkgPSBNYXRoLm1heCgwLCB0aGlzLmN1cnNvclkgLSBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuY3Vyc29yWSA9IE1hdGgubWluKHJlY3QuaGVpZ2h0LCB0aGlzLmN1cnNvclkgKyBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWF4KDAsIHRoaXMuY3Vyc29yWCAtIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIHRoaXMuY3Vyc29yWCA9IE1hdGgubWluKHJlY3Qud2lkdGgsIHRoaXMuY3Vyc29yWCArIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhd2luZygpOiB2b2lkIHtcbiAgICBsZXQgc3RhcnRYOiBudW1iZXI7XG4gICAgbGV0IHN0YXJ0WTogbnVtYmVyO1xuXG4gICAgaWYgKHRoaXMuc2hvd0N1cnNvcikge1xuICAgICAgc3RhcnRYID0gdGhpcy5jdXJzb3JYO1xuICAgICAgc3RhcnRZID0gdGhpcy5jdXJzb3JZO1xuICAgICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIGNlbnRlclxuICAgICAgY29uc3QgcmVjdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgc3RhcnRYID0gcmVjdC53aWR0aCAvIDI7XG4gICAgICBzdGFydFkgPSByZWN0LmhlaWdodCAvIDI7XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYXdpbmcgPSB0cnVlO1xuICAgIHRoaXMuZHJhd1N0YXJ0WCA9IHN0YXJ0WDtcbiAgICB0aGlzLmRyYXdTdGFydFkgPSBzdGFydFk7XG4gICAgdGhpcy5jdXJyZW50V2lkdGggPSB0aGlzLm1pbkJveFNpemU7XG4gICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gdGhpcy5taW5Cb3hTaXplO1xuXG4gICAgdGhpcy5lbWl0RHJhd2luZ1N0YXJ0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplQm94KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5jcmVtZW50ID0gZXZlbnQuc2hpZnRLZXkgPyB0aGlzLmluY3JlbWVudExhcmdlIDogdGhpcy5pbmNyZW1lbnRTbWFsbDtcbiAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gcmVjdC53aWR0aCAtIHRoaXMuZHJhd1N0YXJ0WDtcbiAgICAgICAgdGhpcy5jdXJyZW50V2lkdGggPSBNYXRoLm1pbihtYXhXaWR0aCwgdGhpcy5jdXJyZW50V2lkdGggKyBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIHRoaXMuY3VycmVudFdpZHRoID0gTWF0aC5tYXgodGhpcy5taW5Cb3hTaXplLCB0aGlzLmN1cnJlbnRXaWR0aCAtIGluY3JlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgY29uc3QgbWF4SGVpZ2h0ID0gcmVjdC5oZWlnaHQgLSB0aGlzLmRyYXdTdGFydFk7XG4gICAgICAgIHRoaXMuY3VycmVudEhlaWdodCA9IE1hdGgubWluKG1heEhlaWdodCwgdGhpcy5jdXJyZW50SGVpZ2h0ICsgaW5jcmVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzpcbiAgICAgICAgdGhpcy5jdXJyZW50SGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5taW5Cb3hTaXplLCB0aGlzLmN1cnJlbnRIZWlnaHQgLSBpbmNyZW1lbnQpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLmVtaXREcmF3aW5nVXBkYXRlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25maXJtRHJhd2luZygpOiB2b2lkIHtcbiAgICB0aGlzLmVtaXREcmF3aW5nQ29uZmlybWVkKCk7XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbERyYXdpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3aW5nQ2FuY2VsbGVkLmVtaXQoKTtcbiAgICB0aGlzLmNsZWFudXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUN1cnNvcigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDdXJzb3IgPSBmYWxzZTtcbiAgICB0aGlzLmVtaXRDdXJzb3JQb3NpdGlvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMuaXNEcmF3aW5nID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Q3Vyc29yID0gZmFsc2U7XG4gICAgdGhpcy5jdXJzb3JYID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3Vyc29yWSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRyYXdTdGFydFggPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kcmF3U3RhcnRZID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudFdpZHRoID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3VycmVudEhlaWdodCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdEN1cnNvclBvc2l0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY3Vyc29yUG9zaXRpb25DaGFuZ2VkLmVtaXQoe1xuICAgICAgeDogdGhpcy5jdXJzb3JYLFxuICAgICAgeTogdGhpcy5jdXJzb3JZLFxuICAgICAgdmlzaWJsZTogdGhpcy5zaG93Q3Vyc29yXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nU3RhcnRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdpbmdTdGFydGVkLmVtaXQoe1xuICAgICAgc3RhcnRYOiB0aGlzLmRyYXdTdGFydFgsXG4gICAgICBzdGFydFk6IHRoaXMuZHJhd1N0YXJ0WSxcbiAgICAgIHdpZHRoOiB0aGlzLmN1cnJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nVXBkYXRlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyYXdpbmdVcGRhdGVkLmVtaXQoe1xuICAgICAgc3RhcnRYOiB0aGlzLmRyYXdTdGFydFgsXG4gICAgICBzdGFydFk6IHRoaXMuZHJhd1N0YXJ0WSxcbiAgICAgIHdpZHRoOiB0aGlzLmN1cnJlbnRXaWR0aCxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50SGVpZ2h0XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVtaXREcmF3aW5nQ29uZmlybWVkKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhd2luZ0NvbmZpcm1lZC5lbWl0KHtcbiAgICAgIHN0YXJ0WDogdGhpcy5kcmF3U3RhcnRYLFxuICAgICAgc3RhcnRZOiB0aGlzLmRyYXdTdGFydFksXG4gICAgICB3aWR0aDogdGhpcy5jdXJyZW50V2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuY3VycmVudEhlaWdodFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIHRoaXMuZW1pdEN1cnNvclBvc2l0aW9uKCk7XG4gIH1cbn0iXX0=