@aquera/ngx-smart-table 0.0.17-patch-0.5 → 0.0.17-patch-0.7

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.
@@ -1,4 +1,4 @@
1
- import { Component, Input, Output, EventEmitter, HostListener, ChangeDetectionStrategy } from '@angular/core';
1
+ import { Component, Input, Output, EventEmitter, HostListener, ChangeDetectionStrategy, ViewChild } from '@angular/core';
2
2
  import { TableZIndex } from '../../models/z-index.enum';
3
3
  import * as i0 from "@angular/core";
4
4
  import * as i1 from "@angular/common";
@@ -9,7 +9,7 @@ export class StRowActionsDropdownComponent {
9
9
  */
10
10
  this.isOpen = false;
11
11
  /**
12
- * Position of the dropdown (x, y coordinates)
12
+ * Position of the dropdown (x, y coordinates, triggerTop for flip positioning)
13
13
  */
14
14
  this.position = { x: 0, y: 0 };
15
15
  /**
@@ -64,35 +64,39 @@ export class StRowActionsDropdownComponent {
64
64
  this.dropdownStyle = {};
65
65
  return;
66
66
  }
67
- const DROPDOWN_WIDTH = 200; // Approximate width
68
- const DROPDOWN_HEIGHT = this.visibleActions.length * 40 + 16; // Approximate height
69
- const viewportWidth = window.innerWidth;
70
- const viewportHeight = window.innerHeight;
71
67
  let left = this.position.x;
72
68
  let top = this.position.y;
73
- // Check if dropdown would overflow right edge
74
- if (left + DROPDOWN_WIDTH > viewportWidth) {
75
- left = viewportWidth - DROPDOWN_WIDTH - 10;
76
- }
77
- // Check if dropdown would overflow bottom edge
78
- if (top + DROPDOWN_HEIGHT > viewportHeight) {
79
- // Position above the trigger
80
- top = this.position.y - DROPDOWN_HEIGHT;
81
- }
82
- // Ensure dropdown doesn't go off-screen on the left
83
- if (left < 10) {
84
- left = 10;
85
- }
86
- // Ensure dropdown doesn't go off-screen on the top
87
- if (top < 10) {
88
- top = 10;
89
- }
69
+ // Render at initial position first (hidden until measured)
90
70
  this.dropdownStyle = {
91
71
  position: 'fixed',
92
72
  left: `${left}px`,
93
73
  top: `${top}px`,
94
- zIndex: TableZIndex.ROW_ACTIONS_DROPDOWN
74
+ zIndex: TableZIndex.ROW_ACTIONS_DROPDOWN,
75
+ visibility: 'hidden'
95
76
  };
77
+ // After rendering, measure actual size and adjust position directly on the DOM
78
+ // (OnPush change detection won't pick up property changes inside requestAnimationFrame)
79
+ requestAnimationFrame(() => {
80
+ const el = this.dropdownPanel?.nativeElement;
81
+ if (!el)
82
+ return;
83
+ const viewportWidth = window.innerWidth;
84
+ const viewportHeight = window.innerHeight;
85
+ const dropdownWidth = el.offsetWidth || 200;
86
+ const dropdownHeight = el.offsetHeight || (this.visibleActions.length * 40 + 16);
87
+ if (left + dropdownWidth > viewportWidth) {
88
+ left = viewportWidth - dropdownWidth - 10;
89
+ }
90
+ if (top + dropdownHeight > viewportHeight) {
91
+ const triggerTop = this.position.triggerTop ?? this.position.y;
92
+ top = triggerTop - dropdownHeight - 4;
93
+ }
94
+ left = Math.max(10, left);
95
+ top = Math.max(10, top);
96
+ el.style.left = `${left}px`;
97
+ el.style.top = `${top}px`;
98
+ el.style.visibility = 'visible';
99
+ });
96
100
  }
97
101
  /**
98
102
  * Handle action click
@@ -146,10 +150,10 @@ export class StRowActionsDropdownComponent {
146
150
  }
147
151
  }
148
152
  StRowActionsDropdownComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StRowActionsDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
149
- StRowActionsDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: { isOpen: "isOpen", position: "position", context: "context" }, outputs: { actionClicked: "actionClicked", closed: "closed" }, host: { listeners: { "document:keydown.escape": "onEscapeKey($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\" class=\"dropdown-menu\" [style.left.px]=\"dropdownStyle.left\" [style.top.px]=\"dropdownStyle.top\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n\n </div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:transparent;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
153
+ StRowActionsDropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: StRowActionsDropdownComponent, selector: "st-row-actions-dropdown", inputs: { isOpen: "isOpen", position: "position", context: "context" }, outputs: { actionClicked: "actionClicked", closed: "closed" }, host: { listeners: { "document:keydown.escape": "onEscapeKey($event)" } }, viewQueries: [{ propertyName: "dropdownPanel", first: true, predicate: ["dropdownPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" #dropdownPanel [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n</div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:transparent;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
150
154
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: StRowActionsDropdownComponent, decorators: [{
151
155
  type: Component,
152
- args: [{ selector: 'st-row-actions-dropdown', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\" class=\"dropdown-menu\" [style.left.px]=\"dropdownStyle.left\" [style.top.px]=\"dropdownStyle.top\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n\n </div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:transparent;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"] }]
156
+ args: [{ selector: 'st-row-actions-dropdown', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"dropdown-container\" *ngIf=\"isOpen && context\">\n <!-- Backdrop -->\n <div class=\"dropdown-overlay\" (click)=\"closed.emit()\"></div>\n \n <!-- Dropdown menu -->\n <div class=\"dropdown-menu\" #dropdownPanel [ngStyle]=\"dropdownStyle\">\n <nile-menu *ngIf=\"isOpen\">\n <ng-container *ngFor=\"let action of visibleActions\">\n <nile-menu-item [class.disabled]=\"isActionDisabled(action)\" (click)=\"onActionClick(action)\" class=\"action-label\">\n <nile-icon *ngIf=\"action.icon\" size=\"14\" slot=\"prefix\" [name]=\"action.icon\"></nile-icon>\n {{ action.label }}\n </nile-menu-item>\n </ng-container>\n \n <nile-menu-item *ngIf=\"visibleActions.length === 0\">No actions available</nile-menu-item>\n </nile-menu>\n </div>\n</div>\n", styles: [".dropdown-container{position:fixed;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9998}.dropdown-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:transparent;pointer-events:auto;z-index:9998}.dropdown-menu{position:fixed;background-color:#fff;box-shadow:0 5px 15px #0000004d,0 0 0 1px #0000001a;overflow:hidden;pointer-events:auto;z-index:9999}.action-icon{display:flex;align-items:center;justify-content:center;font-size:16px;width:20px;flex-shrink:0}.action-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dropdown-empty{padding:16px;text-align:center;color:#a0aec0;font-size:14px;font-style:italic}nile-menu{height:fit-content}\n"] }]
153
157
  }], propDecorators: { isOpen: [{
154
158
  type: Input
155
159
  }], position: [{
@@ -160,8 +164,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
160
164
  type: Output
161
165
  }], closed: [{
162
166
  type: Output
167
+ }], dropdownPanel: [{
168
+ type: ViewChild,
169
+ args: ['dropdownPanel']
163
170
  }], onEscapeKey: [{
164
171
  type: HostListener,
165
172
  args: ['document:keydown.escape', ['$event']]
166
173
  }] } });
167
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUFReEQsTUFBTSxPQUFPLDZCQUE2QjtJQU4xQztRQU9FOztXQUVHO1FBQ00sV0FBTSxHQUFZLEtBQUssQ0FBQztRQUVqQzs7V0FFRztRQUNNLGFBQVEsR0FBNkIsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUU3RDs7V0FFRztRQUNNLFlBQU8sR0FBNEIsSUFBSSxDQUFDO1FBRWpEOztXQUVHO1FBQ08sa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUU3RDs7V0FFRztRQUNPLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDOztXQUVHO1FBQ0gsbUJBQWMsR0FBZ0IsRUFBRSxDQUFDO1FBRWpDOztXQUVHO1FBQ0gsa0JBQWEsR0FBUSxFQUFFLENBQUM7S0FxSXpCO0lBbklDLFdBQVcsQ0FBQyxPQUFzQjtR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QUtJLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNO2dCQWlJUCxXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3dBY3Rpb24sIFJvd0FjdGlvbkNvbnRleHQsIFJvd0FjdGlvbkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3Jvdy1hY3Rpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IFRhYmxlWkluZGV4IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3otaW5kZXguZW51bSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RSb3dBY3Rpb25zRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgZHJvcGRvd24gaXMgb3BlblxuICAgKi9cbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKipcbiAgICogUG9zaXRpb24gb2YgdGhlIGRyb3Bkb3duICh4LCB5IGNvb3JkaW5hdGVzKVxuICAgKi9cbiAgQElucHV0KCkgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMCB9O1xuICBcbiAgLyoqXG4gICAqIENvbnRleHQgY29udGFpbmluZyByb3cgZGF0YSwgaW5kZXgsIGFuZCBhY3Rpb25zXG4gICAqL1xuICBASW5wdXQoKSBjb250ZXh0OiBSb3dBY3Rpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIGFuIGFjdGlvbiBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aW9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Um93QWN0aW9uRXZlbnQ+KCk7XG4gIFxuICAvKipcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBkcm9wZG93biBzaG91bGQgY2xvc2VcbiAgICovXG4gIEBPdXRwdXQoKSBjbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIFxuICAvKipcbiAgICogVmlzaWJsZSBhY3Rpb25zIChmaWx0ZXJlZCBieSBoaWRkZW4gcHJvcGVydHkpXG4gICAqL1xuICB2aXNpYmxlQWN0aW9uczogUm93QWN0aW9uW10gPSBbXTtcbiAgXG4gIC8qKlxuICAgKiBEcm9wZG93biBwb3NpdGlvbmluZyBzdHlsZVxuICAgKi9cbiAgZHJvcGRvd25TdHlsZTogYW55ID0ge307XG4gIFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2NvbnRleHQnXSB8fCBjaGFuZ2VzWydpc09wZW4nXSkge1xuICAgICAgdGhpcy51cGRhdGVWaXNpYmxlQWN0aW9ucygpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoY2hhbmdlc1sncG9zaXRpb24nXSB8fCBjaGFuZ2VzWydpc09wZW4nXSkge1xuICAgICAgdGhpcy51cGRhdGVEcm9wZG93blBvc2l0aW9uKCk7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHZpc2libGUgYWN0aW9ucyBiYXNlZCBvbiBoaWRkZW4gcHJvcGVydHlcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlVmlzaWJsZUFjdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHtcbiAgICAgIHRoaXMudmlzaWJsZUFjdGlvbnMgPSBbXTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdGhpcy52aXNpYmxlQWN0aW9ucyA9IHRoaXMuY29udGV4dC5hY3Rpb25zLmZpbHRlcihhY3Rpb24gPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaGlkZGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAhYWN0aW9uLmhpZGRlbih0aGlzLmNvbnRleHQhLnJvd0RhdGEsIHRoaXMuY29udGV4dCEucm93SW5kZXgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuICFhY3Rpb24uaGlkZGVuO1xuICAgIH0pO1xuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIGRyb3Bkb3duIHBvc2l0aW9uIGJhc2VkIG9uIGF2YWlsYWJsZSB2aWV3cG9ydCBzcGFjZVxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wZG93blBvc2l0aW9uKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuZHJvcGRvd25TdHlsZSA9IHt9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBEUk9QRE9XTl9XSURUSCA9IDIwMDsgLy8gQXBwcm94aW1hdGUgd2lkdGhcbiAgICBjb25zdCBEUk9QRE9XTl9IRUlHSFQgPSB0aGlzLnZpc2libGVBY3Rpb25zLmxlbmd0aCAqIDQwICsgMTY7IC8vIEFwcHJveGltYXRlIGhlaWdodFxuICAgIFxuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBcbiAgICBsZXQgbGVmdCA9IHRoaXMucG9zaXRpb24ueDtcbiAgICBsZXQgdG9wID0gdGhpcy5wb3NpdGlvbi55O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIGRyb3Bkb3duIHdvdWxkIG92ZXJmbG93IHJpZ2h0IGVkZ2VcbiAgICBpZiAobGVmdCArIERST1BET1dOX1dJRFRIID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgbGVmdCA9IHZpZXdwb3J0V2lkdGggLSBEUk9QRE9XTl9XSURUSCAtIDEwO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBpZiBkcm9wZG93biB3b3VsZCBvdmVyZmxvdyBib3R0b20gZWRnZVxuICAgIGlmICh0b3AgKyBEUk9QRE9XTl9IRUlHSFQgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgLy8gUG9zaXRpb24gYWJvdmUgdGhlIHRyaWdnZXJcbiAgICAgIHRvcCA9IHRoaXMucG9zaXRpb24ueSAtIERST1BET1dOX0hFSUdIVDtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGRyb3Bkb3duIGRvZXNuJ3QgZ28gb2ZmLXNjcmVlbiBvbiB0aGUgbGVmdFxuICAgIGlmIChsZWZ0IDwgMTApIHtcbiAgICAgIGxlZnQgPSAxMDtcbiAgICB9XG4gICAgXG4gICAgLy8gRW5zdXJlIGRyb3Bkb3duIGRvZXNuJ3QgZ28gb2ZmLXNjcmVlbiBvbiB0aGUgdG9wXG4gICAgaWYgKHRvcCA8IDEwKSB7XG4gICAgICB0b3AgPSAxMDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5kcm9wZG93blN0eWxlID0ge1xuICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICBsZWZ0OiBgJHtsZWZ0fXB4YCxcbiAgICAgIHRvcDogYCR7dG9wfXB4YCxcbiAgICAgIHpJbmRleDogVGFibGVaSW5kZXguUk9XX0FDVElPTlNfRFJPUERPV05cbiAgICB9O1xuICB9XG4gIFxuICAvKipcbiAgICogSGFuZGxlIGFjdGlvbiBjbGlja1xuICAgKi9cbiAgb25BY3Rpb25DbGljayhhY3Rpb246IFJvd0FjdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250ZXh0KSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgYWN0aW9uIGlzIGRpc2FibGVkXG4gICAgaWYgKHRoaXMuaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IGV2ZW50OiBSb3dBY3Rpb25FdmVudCA9IHtcbiAgICAgIGFjdGlvbixcbiAgICAgIHJvd0RhdGE6IHRoaXMuY29udGV4dC5yb3dEYXRhLFxuICAgICAgcm93SW5kZXg6IHRoaXMuY29udGV4dC5yb3dJbmRleFxuICAgIH07XG4gICAgXG4gICAgdGhpcy5hY3Rpb25DbGlja2VkLmVtaXQoZXZlbnQpO1xuICB9XG4gIFxuICAvKipcbiAgICogQ2hlY2sgaWYgYW4gYWN0aW9uIGlzIGRpc2FibGVkXG4gICAqL1xuICBpc0FjdGlvbkRpc2FibGVkKGFjdGlvbjogUm93QWN0aW9uKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybiB0cnVlO1xuICAgIFxuICAgIGlmICh0eXBlb2YgYWN0aW9uLmRpc2FibGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gYWN0aW9uLmRpc2FibGVkKHRoaXMuY29udGV4dC5yb3dEYXRhLCB0aGlzLmNvbnRleHQucm93SW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gISFhY3Rpb24uZGlzYWJsZWQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgb3ZlcmxheSBjbGljayAoY2xvc2UgZHJvcGRvd24pXG4gICAqL1xuICBvbk92ZXJsYXlDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlZC5lbWl0KCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgRVNDIGtleSBwcmVzc1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnLCBbJyRldmVudCddKVxuICBvbkVzY2FwZUtleShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBQcmV2ZW50IGRyb3Bkb3duIGNsaWNrIGZyb20gY2xvc2luZ1xuICAgKi9cbiAgb25Ecm9wZG93bkNsaWNrKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZHJvcGRvd24tY29udGFpbmVyXCIgKm5nSWY9XCJpc09wZW4gJiYgY29udGV4dFwiPlxuICA8IS0tIEJhY2tkcm9wIC0tPlxuICA8ZGl2IGNsYXNzPVwiZHJvcGRvd24tb3ZlcmxheVwiIChjbGljayk9XCJjbG9zZWQuZW1pdCgpXCI+PC9kaXY+XG4gIFxuICA8IS0tIERyb3Bkb3duIG1lbnUgLS0+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgW25nU3R5bGVdPVwiZHJvcGRvd25TdHlsZVwiPlxuICAgIDxuaWxlLW1lbnUgKm5nSWY9XCJpc09wZW5cIiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBbc3R5bGUubGVmdC5weF09XCJkcm9wZG93blN0eWxlLmxlZnRcIiBbc3R5bGUudG9wLnB4XT1cImRyb3Bkb3duU3R5bGUudG9wXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgdmlzaWJsZUFjdGlvbnNcIj5cbiAgICAgICAgPG5pbGUtbWVudS1pdGVtIFtjbGFzcy5kaXNhYmxlZF09XCJpc0FjdGlvbkRpc2FibGVkKGFjdGlvbilcIiAoY2xpY2spPVwib25BY3Rpb25DbGljayhhY3Rpb24pXCIgY2xhc3M9XCJhY3Rpb24tbGFiZWxcIj5cbiAgICAgICAgICA8bmlsZS1pY29uICAqbmdJZj1cImFjdGlvbi5pY29uXCIgc2l6ZT1cIjE0XCIgc2xvdD1cInByZWZpeFwiIFtuYW1lXT1cImFjdGlvbi5pY29uXCI+PC9uaWxlLWljb24+XG4gICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgIDxuaWxlLW1lbnUtaXRlbSAqbmdJZj1cInZpc2libGVBY3Rpb25zLmxlbmd0aCA9PT0gMFwiPk5vIGFjdGlvbnMgYXZhaWxhYmxlPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cbiJdfQ==
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtdGFibGUvc3JjL2xpYi9yZW5kZXJlci9jb21wb25lbnRzL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duL3N0LXJvdy1hY3Rpb25zLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NtYXJ0LXRhYmxlL3NyYy9saWIvcmVuZGVyZXIvY29tcG9uZW50cy9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBNEIsdUJBQXVCLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRS9KLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBUXhELE1BQU0sT0FBTyw2QkFBNkI7SUFOMUM7UUFPRTs7V0FFRztRQUNNLFdBQU0sR0FBWSxLQUFLLENBQUM7UUFFakM7O1dBRUc7UUFDTSxhQUFRLEdBQWtELEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFFbEY7O1dBRUc7UUFDTSxZQUFPLEdBQTRCLElBQUksQ0FBQztRQUVqRDs7V0FFRztRQUNPLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFN0Q7O1dBRUc7UUFDTyxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUk1Qzs7V0FFRztRQUNILG1CQUFjLEdBQWdCLEVBQUUsQ0FBQztRQUVqQzs7V0FFRztRQUNILGtCQUFhLEdBQVEsRUFBRSxDQUFDO0tBd0l6QjtJQXRJQyxXQUFXLENB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Q3RCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxLQUFZO1FBQzFCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDOzswSEEzS1UsNkJBQTZCOzhHQUE3Qiw2QkFBNkIsc1pDVjFDLCt5QkFrQkE7MkZEUmEsNkJBQTZCO2tCQU56QyxTQUFTOytCQUNFLHlCQUF5QixtQkFHbEIsdUJBQXVCLENBQUMsTUFBTTs4QkFNdEMsTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUtJLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csTUFBTTtzQkFBZixNQUFNO2dCQUVxQixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBb0kxQixXQUFXO3NCQURWLFlBQVk7dUJBQUMseUJBQXlCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvd0FjdGlvbiwgUm93QWN0aW9uQ29udGV4dCwgUm93QWN0aW9uRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvcm93LWFjdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGFibGVaSW5kZXggfSBmcm9tICcuLi8uLi9tb2RlbHMvei1pbmRleC5lbnVtJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3Qtcm93LWFjdGlvbnMtZHJvcGRvd24nLFxuICB0ZW1wbGF0ZVVybDogJy4vc3Qtcm93LWFjdGlvbnMtZHJvcGRvd24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdC1yb3ctYWN0aW9ucy1kcm9wZG93bi5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBTdFJvd0FjdGlvbnNEcm9wZG93bkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkcm9wZG93biBpcyBvcGVuXG4gICAqL1xuICBASW5wdXQoKSBpc09wZW46IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8qKlxuICAgKiBQb3NpdGlvbiBvZiB0aGUgZHJvcGRvd24gKHgsIHkgY29vcmRpbmF0ZXMsIHRyaWdnZXJUb3AgZm9yIGZsaXAgcG9zaXRpb25pbmcpXG4gICAqL1xuICBASW5wdXQoKSBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgdHJpZ2dlclRvcD86IG51bWJlciB9ID0geyB4OiAwLCB5OiAwIH07XG4gIFxuICAvKipcbiAgICogQ29udGV4dCBjb250YWluaW5nIHJvdyBkYXRhLCBpbmRleCwgYW5kIGFjdGlvbnNcbiAgICovXG4gIEBJbnB1dCgpIGNvbnRleHQ6IFJvd0FjdGlvbkNvbnRleHQgfCBudWxsID0gbnVsbDtcbiAgXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gYW4gYWN0aW9uIGlzIGNsaWNrZWRcbiAgICovXG4gIEBPdXRwdXQoKSBhY3Rpb25DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dBY3Rpb25FdmVudD4oKTtcbiAgXG4gIC8qKlxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIGRyb3Bkb3duIHNob3VsZCBjbG9zZVxuICAgKi9cbiAgQE91dHB1dCgpIGNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIEBWaWV3Q2hpbGQoJ2Ryb3Bkb3duUGFuZWwnKSBkcm9wZG93blBhbmVsPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgLyoqXG4gICAqIFZpc2libGUgYWN0aW9ucyAoZmlsdGVyZWQgYnkgaGlkZGVuIHByb3BlcnR5KVxuICAgKi9cbiAgdmlzaWJsZUFjdGlvbnM6IFJvd0FjdGlvbltdID0gW107XG4gIFxuICAvKipcbiAgICogRHJvcGRvd24gcG9zaXRpb25pbmcgc3R5bGVcbiAgICovXG4gIGRyb3Bkb3duU3R5bGU6IGFueSA9IHt9O1xuICBcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydjb250ZXh0J10gfHwgY2hhbmdlc1snaXNPcGVuJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlVmlzaWJsZUFjdGlvbnMoKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ3Bvc2l0aW9uJ10gfHwgY2hhbmdlc1snaXNPcGVuJ10pIHtcbiAgICAgIHRoaXMudXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwZGF0ZSB2aXNpYmxlIGFjdGlvbnMgYmFzZWQgb24gaGlkZGVuIHByb3BlcnR5XG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVZpc2libGVBY3Rpb25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb250ZXh0KSB7XG4gICAgICB0aGlzLnZpc2libGVBY3Rpb25zID0gW107XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRoaXMudmlzaWJsZUFjdGlvbnMgPSB0aGlzLmNvbnRleHQuYWN0aW9ucy5maWx0ZXIoYWN0aW9uID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYWN0aW9uLmhpZGRlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gIWFjdGlvbi5oaWRkZW4odGhpcy5jb250ZXh0IS5yb3dEYXRhLCB0aGlzLmNvbnRleHQhLnJvd0luZGV4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhYWN0aW9uLmhpZGRlbjtcbiAgICB9KTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFVwZGF0ZSBkcm9wZG93biBwb3NpdGlvbiBiYXNlZCBvbiBhdmFpbGFibGUgdmlld3BvcnQgc3BhY2VcbiAgICovXG4gIHByaXZhdGUgdXBkYXRlRHJvcGRvd25Qb3NpdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuKSB7XG4gICAgICB0aGlzLmRyb3Bkb3duU3R5bGUgPSB7fTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgbGV0IGxlZnQgPSB0aGlzLnBvc2l0aW9uLng7XG4gICAgbGV0IHRvcCA9IHRoaXMucG9zaXRpb24ueTtcbiAgICBcbiAgICAvLyBSZW5kZXIgYXQgaW5pdGlhbCBwb3NpdGlvbiBmaXJzdCAoaGlkZGVuIHVudGlsIG1lYXN1cmVkKVxuICAgIHRoaXMuZHJvcGRvd25TdHlsZSA9IHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgbGVmdDogYCR7bGVmdH1weGAsXG4gICAgICB0b3A6IGAke3RvcH1weGAsXG4gICAgICB6SW5kZXg6IFRhYmxlWkluZGV4LlJPV19BQ1RJT05TX0RST1BET1dOLFxuICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbidcbiAgICB9O1xuICAgIFxuICAgIC8vIEFmdGVyIHJlbmRlcmluZywgbWVhc3VyZSBhY3R1YWwgc2l6ZSBhbmQgYWRqdXN0IHBvc2l0aW9uIGRpcmVjdGx5IG9uIHRoZSBET01cbiAgICAvLyAoT25QdXNoIGNoYW5nZSBkZXRlY3Rpb24gd29uJ3QgcGljayB1cCBwcm9wZXJ0eSBjaGFuZ2VzIGluc2lkZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUpXG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5kcm9wZG93blBhbmVsPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IGRyb3Bkb3duV2lkdGggPSBlbC5vZmZzZXRXaWR0aCB8fCAyMDA7XG4gICAgICBjb25zdCBkcm9wZG93bkhlaWdodCA9IGVsLm9mZnNldEhlaWdodCB8fCAodGhpcy52aXNpYmxlQWN0aW9ucy5sZW5ndGggKiA0MCArIDE2KTtcbiAgICAgIFxuICAgICAgaWYgKGxlZnQgKyBkcm9wZG93bldpZHRoID4gdmlld3BvcnRXaWR0aCkge1xuICAgICAgICBsZWZ0ID0gdmlld3BvcnRXaWR0aCAtIGRyb3Bkb3duV2lkdGggLSAxMDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgaWYgKHRvcCArIGRyb3Bkb3duSGVpZ2h0ID4gdmlld3BvcnRIZWlnaHQpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlclRvcCA9IHRoaXMucG9zaXRpb24udHJpZ2dlclRvcCA/PyB0aGlzLnBvc2l0aW9uLnk7XG4gICAgICAgIHRvcCA9IHRyaWdnZXJUb3AgLSBkcm9wZG93bkhlaWdodCAtIDQ7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGxlZnQgPSBNYXRoLm1heCgxMCwgbGVmdCk7XG4gICAgICB0b3AgPSBNYXRoLm1heCgxMCwgdG9wKTtcbiAgICAgIFxuICAgICAgZWwuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgO1xuICAgICAgZWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgfSk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIYW5kbGUgYWN0aW9uIGNsaWNrXG4gICAqL1xuICBvbkFjdGlvbkNsaWNrKGFjdGlvbjogUm93QWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbnRleHQpIHJldHVybjtcbiAgICBcbiAgICAvLyBDaGVjayBpZiBhY3Rpb24gaXMgZGlzYWJsZWRcbiAgICBpZiAodGhpcy5pc0FjdGlvbkRpc2FibGVkKGFjdGlvbikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgZXZlbnQ6IFJvd0FjdGlvbkV2ZW50ID0ge1xuICAgICAgYWN0aW9uLFxuICAgICAgcm93RGF0YTogdGhpcy5jb250ZXh0LnJvd0RhdGEsXG4gICAgICByb3dJbmRleDogdGhpcy5jb250ZXh0LnJvd0luZGV4XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLmFjdGlvbkNsaWNrZWQuZW1pdChldmVudCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhbiBhY3Rpb24gaXMgZGlzYWJsZWRcbiAgICovXG4gIGlzQWN0aW9uRGlzYWJsZWQoYWN0aW9uOiBSb3dBY3Rpb24pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY29udGV4dCkgcmV0dXJuIHRydWU7XG4gICAgXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24uZGlzYWJsZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBhY3Rpb24uZGlzYWJsZWQodGhpcy5jb250ZXh0LnJvd0RhdGEsIHRoaXMuY29udGV4dC5yb3dJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiAhIWFjdGlvbi5kaXNhYmxlZDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBvdmVybGF5IGNsaWNrIChjbG9zZSBkcm9wZG93bilcbiAgICovXG4gIG9uT3ZlcmxheUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2VkLmVtaXQoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEhhbmRsZSBFU0Mga2V5IHByZXNzXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duLmVzY2FwZScsIFsnJGV2ZW50J10pXG4gIG9uRXNjYXBlS2V5KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdGhpcy5jbG9zZWQuZW1pdCgpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFByZXZlbnQgZHJvcGRvd24gY2xpY2sgZnJvbSBjbG9zaW5nXG4gICAqL1xuICBvbkRyb3Bkb3duQ2xpY2soZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXJcIiAqbmdJZj1cImlzT3BlbiAmJiBjb250ZXh0XCI+XG4gIDwhLS0gQmFja2Ryb3AgLS0+XG4gIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1vdmVybGF5XCIgKGNsaWNrKT1cImNsb3NlZC5lbWl0KClcIj48L2Rpdj5cbiAgXG4gIDwhLS0gRHJvcGRvd24gbWVudSAtLT5cbiAgPGRpdiBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiAjZHJvcGRvd25QYW5lbCBbbmdTdHlsZV09XCJkcm9wZG93blN0eWxlXCI+XG4gICAgPG5pbGUtbWVudSAqbmdJZj1cImlzT3BlblwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIHZpc2libGVBY3Rpb25zXCI+XG4gICAgICAgIDxuaWxlLW1lbnUtaXRlbSBbY2xhc3MuZGlzYWJsZWRdPVwiaXNBY3Rpb25EaXNhYmxlZChhY3Rpb24pXCIgKGNsaWNrKT1cIm9uQWN0aW9uQ2xpY2soYWN0aW9uKVwiIGNsYXNzPVwiYWN0aW9uLWxhYmVsXCI+XG4gICAgICAgICAgPG5pbGUtaWNvbiAqbmdJZj1cImFjdGlvbi5pY29uXCIgc2l6ZT1cIjE0XCIgc2xvdD1cInByZWZpeFwiIFtuYW1lXT1cImFjdGlvbi5pY29uXCI+PC9uaWxlLWljb24+XG4gICAgICAgICAge3sgYWN0aW9uLmxhYmVsIH19XG4gICAgICAgIDwvbmlsZS1tZW51LWl0ZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICBcbiAgICAgIDxuaWxlLW1lbnUtaXRlbSAqbmdJZj1cInZpc2libGVBY3Rpb25zLmxlbmd0aCA9PT0gMFwiPk5vIGFjdGlvbnMgYXZhaWxhYmxlPC9uaWxlLW1lbnUtaXRlbT5cbiAgICA8L25pbGUtbWVudT5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==